Перейти к основному содержимому

Iron Lady

· 2 мин. чтения

среда, 11 апреля 2012 г. в 21:06:01

Очень тронул фильм про Маргарет Тетчер. Он не простой и не для развлечения. Он путеводный, подобно словам произносимым в первой части фильма:

Следите за своими мыслями, что-бы они стали словами. Следите за своими словами, что-бы они стали действиями. Следите за своими действиями, что-бы они стали привычками. Следите за своими привычками, что-бы они стали характером. Следите за своим характером, что-бы он стал судьбой

Сюжет довольно типичный для биографичных фильмов - железная леди уже пожилая и побыв на важнейшем посту премьер-министра столпообразующей страны западного мира, она может быть подвержена нападанию просто как символ, поэтому её как и всех людей силы, охраняют.

Eclipse

· 5 мин. чтения

Поиграли в финскую настольную игру Eclipse, эдакую смесь Cosmic Encounter, Twilight Imperium и Endeavor. Играть могут до шести человек и в зависимости от опыта, занимает от 30 до 60 минут на человека. Мы играли впятером с двумя новичками четыре часа.

Все играют за одну из 7 видов космическую цивилизацию (впрочем за людей могут играть несколько человек). Цель игры - к концу девятого хода набрать максимальное количество победных очков, т.е. найти свою оптимальную стратегию в сложившихся обстоятельствах. 

Cosmic Encounter

· 10 мин. чтения

Прибыла заказанная мною на амазоне настольная игра Cosmic encounter и дополнение к ней Cosmic incursion. Я играл в неё три раза, всякий раз проигрывал и тем не менее очень нравился процесс, поэтому объясню основы..

В оригинальную версию могут играть 3-5 человек, 1-3 часа. Существуют 3 дополнения, которые позволяют уместиться восьмерым игрокам за одним столом с некоторыми дополненными правилами. Игра с 1977 года пережила несколько издателей и изменений правил, что о чём-то должно говорить. У меня последняя версия от Fantasy Flight games.

Оптимальные структуры данных в PHP

· 3 мин. чтения

Как известно, родных типов данных в php немного. На самом деле в программировании, типов данных конечно же неограниченное множество, особенно когда дело касается деревьев (AAMk-d и прочая)

Стандартная библиотека php кроме интерфейсов итераторов и автоподгрузки классов предоставляет и более оптимальные типы данных.

Массивы

Что случается когда вы пытаетесь сделать универсальное и "простое" решение? Overhead с памятью. Дело в том что массивы в php на самом деле не массивы. Это сбивает немного с толку, но настоящий массив должен быть таким:

В php же массивы могут расти и итерироваться. Это реализуется списком с двойными ссылками (на следующий и предыдущий элементы). И конечно же массивы ассоциативные - ключи не обязаны быть упорядоченными int'ами - может и строка быть. А это всё усложняет - нужна хэш-таблица, хэш функция, система коллизий. И как следствие дополнительная инфраструктура...

Именно поэтому такой код выдаст не упорядоченный по индексу текст..

$bar = array();
for ($i = 7; $i >= 0; --$i) {
$bar[$i] = $i;
}
echo implode(' ', $bar);

... а то как данные инициализировались: 7 6 5 4 3 2 1 0

Из-за того что новичка не заставляют думать о структуре данных, как то делают в Java, выходит неоптимальное использование памяти. Для поддержки таких низкоуровневых массивов есть SplFixedArray который на 25-40% быстрей массивов, а также SplStack с SplQueue. 

Структуры

Из-за своей простоты и лёгкой инициализации, массивы стали типичными контейнерами данных - их возвращает какой-нибудь адаптер БД как результат, его передают между собой методы где одним параметром не обойтись, он же итерируется или распаковывается в шаблонизаторах. 

Но я в своём движке использую объекты. Начиная с 5.4, объекты легче чем массивы. Из-за фиксации параметров классов и большей строгости, возможны подсказки при работе в IDE. Я умолчу об ООП - дополнительный методы у контейнеров могут добавить больше сложности чем решить.

Множества

Когда порядок не имеет особого значения, можно использовать множества. Конечно с массивами можно проводить такие же операции сложения (array_merge), вычитания (array_diff), пересечения (array_intersect) и проверки на присутствие (in_array), но как вы уже поняли, поиск по значению довольно медленный и вместо этого следует использовать поиск по ключу. Особенно если вы храните объекты:

$mySet = array();
$mySet(spl_object_hash($obj1)) = $obj1;
$mySet(spl_object_hash($obj2)) = $obj2;
isset($mySet(spl_object_hash($obj1))); //проверка вместо in_array
$mySet + $yourSet; //сложение работает потому что нет коллизий ключей
array_intersect_key($mySet, $yourSet); // пересечение по ключу
array_diff_key($mySet, $yourSet); // вычитание

Куча

Heap это просто такое дерево, ключи элементов которого распределяются по старшинству. Кучи часто используются в алгоритмах с графами. В php для этого есть SplHeap, SplMaxHeap и SplMinHeap, которые в сотни раз быстрей массивов.

Обобщение кучи это очередь с приоритетом - SplPriorityQueue, где порядок не FIFO/LIFO, а как вы догадались, согласно заданной важности

$priorityQueue = new SplPriorityQueue();
$priorityQueue->insert("Putin", 60);
$priorityQueue->insert("Zjuganov", 15);

Интеграционное тестирование почтовых зависимостей c Postfix

· 2 мин. чтения

Я фанатею тестированием, в последнее время - интеграционным. И всегда хочется покрыть различные области приложения - сначала простые функции юнит тестами.. потом контроллеры моками, потом API интеграционными, наконец UI системными.. но почта для меня всегда оставалась недоступным горизонтом - а ведь хочется автоматизировать и то что почта приходит правильная.. и что вообще отсылается.

Под никсы есть два основных почтовых сервера - sendmail и postfix. Я работаю с последним. 

Моки в юнит-тестах

· 2 мин. чтения

Моки это такие классы-заглушки (и соответсвенно объекты), которые позволяют избавиться от внешних зависимостей при модульном (unit) тестировании — ибо тестирование с зависимостями уже интеграционное или системное и требует больших ресурсов, состояния данных и как следствие - большей сложности.

С моками же можно тестировать контроллеры, где код с большей ответсвенностью, который вызывает тяжёлые модели, у которых вся тяжёлая логика веб-сервисов, баз данных, парсеров.. но которые уже покрыты тестами.

В PHPUnit моки встроены в PHPUnit_Framework_TestCase и легко получаются от метода getMock(класс, методы, ...). Сам по себе он не только даёт объект, но и определяет класс. Так что на случай использования статического метода, мок должен сработать.

$myMock = $this->getMock('MyParser', array('parseXLS'));

Проектирование сайтов для людей с ограниченными возможностями

· 5 мин. чтения

Выживает не самый сильный и не самый умный, а тот, кто лучше всех откликается на происходящие изменения Леон Меггинсон, перефразируя Чарльза Дарвина

Универсальная доступность это свойство инфосистемы учитывать различный спектр аудитории и устройств при взаимодействии. В частности это может быть оптимизация для мобильной версии сайта, для печати или Siri, но не стоит ограничивается только этим.

О недоступности веб-шрифтов при подгрузке

· 1 мин. чтения

Лет пять назад я писал про типографию для web через @font-face. С того времени прошло достаточно времени, браузеры уже стали полноценно поддерживать шрифты. Для простоты и единства, вышел конструктор Google Fonts и Typekit. По всей истории этого дела хорошо прошёлся Вадим Макеев, поэтому я сфокусируюсь на основном баге.

Аж с 2009 года (а то и раньше) был известен баг многих браузеров об отображении текста без символов из-за того что css подгрузился, указал что должен использоваться какой-то шрифт, а сам шрифт (который может нехило весить) ещё грузится. В зависимости от скорости соединения возникает эффект "моргания". Проблема в том что это до сих пор не исправлено в Webkit (Safari, Chrome), поэтому вот мой уродливый хак (да, избавьтесь как только пофиксят)..

Прежде всего  через jquery заставим загружаться файл шрифтов, добавив пустой элемент.

$('body').append('<span style="font-family: \'CustomFontYouWantToUse\';"></span>');

Поймать событие когда шрифт загрузится получается только таким способом.

document.onreadystatechange = function() { if (document.readyState && document.readyState=="complete"){ $('body').addClass('font_loaded'); } };

Теперь в css к стандартному шрифту прийдётся добавить дубликат..

h1 {font-family:serif;} body.font_loaded h1{font-family:CustomFontYOuWantToUse, serif;}На просторах интернета было замечено интересное решение, подгружать содержание шрифта сразу в css файле, используя data:URL src:url(data:font/opentype;base64

Тестирование внутренних методов с PHPUnit и runkit

· 2 мин. чтения

PHPUnit хороший инструмент для тестирования PHP-кода. Но у него есть существенные ограничения влияющие его использование рядовыми программистами. Я даже не говорю об установке. Дело в том что юнит-тесты подразумевают

public function methodIWantToTest(){
$s='';
for($i=1;$i<10;$i++){
$s.=$this->innerMethodIWantToAvoidCalling($i);
}
return $s;
}

Kohana

· 1 мин. чтения

Kohana - один из десятка php-фреймворков, имеющий в том числе и модуль для юнит-тестирования написанного кода. Про тестирование в общем я уже писал, про настройку phpunit тоже. Упростив статью одного безымянного товарища, в сторону использования PHPStorm IDE вот к чему я пришёл..

Skyrim

· 9 мин. чтения

Skyrim это уже пятая ролевая игра из эпичной серии TES от Bethesda. Для незнакомых с серией, напомню что дело происходит на планете Нирн c основным континентом Тамриэль с множеством животных, рас, языков; во время, по духу очень напоминающему распад Римской империи и начало раннего средневековья. Но прежде, немного космологии..

Backbone.js

· 4 мин. чтения

Backbone это javascript-библиотека для тяжёлых frontend javascript приложений, как например gmail или twitter. В таких приложениях вся логика интерфейса ложится на браузер, что впрочем даёт очень значительное преимущество в скорости интерфейса. А как организовать код, для таких достаточно больших проектов? Который не просто набор глобальных переменных и jquery—DOM связей. Для меня перенос бэкэнда вперёд был довольно непривычен.

Backbone близок по духу еще одной библиотеке для богатого фронта - knockout, но как можно судить по названиям, они отличаются по замыслу. Нокаут занимается активной Позвоночни же отвечает только за достаточную многослойность архитектуры, которую надо программисту унаследовать.

Основные классы

В качестве ядра используются наследуемые "классы"

  • Router и History - принимают url и говорят какой view надо запустить
  • View - привязывается к dom-элементам и в зависимости от их вложённости отвечает за их данные. Именно View вызываются из Route что-бы открыть прошлое состояние. И именно View реагирует на пользователя через подписку на события ( поле events)
  • Collection - массив моделей (не обязательно одинаковых), привязывается к View и может оповещать его об изменениях
  • Model - основные классы сущностей, имеют url для получения и изменения данных по RESTful http с backend

View, будучи конечным результатом и наиболее нагруженным классом, напрямую зависит от js-шаблонизатора из underscore библиотеки. Шаблонизатор ничем практически не отличается - только тем что все шаблоны подгружаются сразу в script-тэгах и переменные выделяются <%=foobar%> тэгами с мини-логикой. Начало выглядит примерно так..

MyApp.EditableSpanView = Backbone.View.extend({
template: _.template($('#span_wrapper').html()),

initialize: function(){
this.render();
},

render:function(){
$(this.el).html(this.template(this.model.toJSON()));
}
});

Это объявление View с 1-1 зависимостью с DOM элементом #span_wrapper откуда мы возьмём html конструкцию и модель this.model с данными, которая ещё не задана. Документация backbone не блещет деталями, о том присвоить < model или collection если он не общий. Как-то так:

realSpanView = new MyApp.EditableSpanView({model: ItemModel, id:'output' });

Это реализация View. Тут выполнится унаследованные конструктор initialize и рисование в render. Результат будет в элементе с id output — если он уже на странице имеется то в нем, если нет то появится.

События

Backbone имеет своё представление о том как должны распространятся события. Я когда-то писал о сложности этого в DOM. Тут же всё проще. События распространяются двумя путями

  1. От DOM-элемента через View.events в соответствующий написанный вами View-метод

  2. От модели или коллекции через подписанные на неё объекты выше (см. диаграмму выше), в т.ч. View

Насчёт первого пункта можно добавить что имеет смысл делать вложенные View-объекты (как группы DOM-деревьев). Например MyBodyView для глобально позиционируемых слоёв, MyListView с коллекцией и MyItemView для конкретного элемента.

По второму пункту - есть магический метод this.bind, который связывает два типа объектов, обычно в initialize. Например MyListView.initialize имеет смысл связать view с коллекцией, что-бы изменение коллекции вызывало изменение view. 

this.collection.bind('add', this.add, this); 
this.collection.bind('remove', this.remove, this);

Кажется таким очевидным и простым, но этого нет нигде по умолчанию, вы сами должны определить что должно кого оповещать. И хуже всего то, что порой не понимаешь механизма работы платформы. Модели не должны ничего знать о своём отображении, управление идёт наверху - view должен привязать себя к уничтожению и всякому изменению модели

Столкнулся с проблемами

Получение данных на бэкэнде из модели приходят вовсе не в POST, а экзотически

$params = (array)json_decode(file_get_contents('php://input'));

Например вам необходимо постоянно поддерживать свежесть коллекции. Коллекция загружается по url параметру из fetch и дальше вызывается reset где обычно коллекция наполняется опять моделями. 

Так вот для того что-бы сделать преобработку данных без перезаписи собственно reset метода, я вешаю bind на reset, вот только аргумент результатов - не json-список и не список переконвертированных моделей у которых распечатать свойства можно только через .get(), а непонятный формат в котором впрочем есть models параметр по которому можной пройтись.

И такого непривычного поведения достаточно что-бы выбить из колеи. То же ключевое слово this - при bind теряется и на самом деле используется связанный объект (коллекция), для этого есть третий параметр или же bindAll из underscore.

Вывод

Библиотека интересная, ограничивающая программистов привыкших к расхлябанному jquery-подходу подвешивания событий на DOM и принуждающая frontend писать едва ли не так же качественно как и backend. Поэтому использовать её стоит в ограниченных условиях, когда надо написать больше JS-кода чем обычно. Альтернативы Backbone — Spine.jsSproutcoreCappuccinoEJS. Из "почитать по теме" советую подкаст sitepoint 145bbtutorialsхабр, а для особо одарённых — про тестирование с Jasmine.

О целостности

· 5 мин. чтения

Целостность, она же Интеграция (отсюда integrity - честность), это такая знакомая политикам программистам, математикам сущность, без которой невозможна мысль и жизнь. Ведь что такое ассоциация как не обобщение, абстрагирование от квадрата и треугольника до Формы. Убери обобщение, которое и ведёт к целостности, и мысль будет бегать на низком уровне рефлексов.

Так же не может существовать живая клетка без соответсвующего взаимодействия в той сложности органелл. При этом сама клетка тоже часть новой физической иерархии — тканей, и так всё выше до а человека, который уже часть народа, который часть страны, евросоюза, человечества

Но обобщение происходит не ради самого себя. В основе лежит... 

Мини-шпаргалка по Unix

· 6 мин. чтения

С  юниксом я до некоторых пор был в достаточно прохладных отношениях - мы встречались довольно редко, каждый раз у него были новые дистрибутивы и формы. То в университете Солярис удивлял своим UI, то на хостинге каком-то надо покопаться через ssh. В какой-то момент я стал пристальней посматривать за его возможностями, удивляясь популярности. Наконец я поставил все основные дистрибутивы на виртуальные машины. Ленивый Slackware сопротивлялся больше всех. На этом казалось можно было бы и поставить точку в нашем романе. Но теперь я работаю на маке и приходится разбираться основательней. Основное преимущество *никсов это конечно консоль и гибкая обработка файлов и текста из неё.

Итак, есть много основанных на unix систем - Solaris, MacOSX, FreeBSD и в частности Linux, у которого основные дистрибутивы: Debian - Ubuntu, Fedora - Red Hat, Slackware - Suse, Gentoo, Mandriva

Первое с чем столкнётся пользователь терминала это его интерфейс, hotkeys для быстрой работы

TabАвтодополнение пути (для папок и файлов) при навигации
Предыдущая комманда
CtrlCУбить исполняемую программу (Cancel)
CtrlZПереключить вид из программы. Комманды fg, jobs, bg помогают управлять контекстом
QВыход из некоторых программ (как например man - помощи)

Навигация

Теперь основная часть - ходить по файловой системе, будь то локальной или удалённой.

lsсписок файлов и папок
cdперейти в папку
pwdузнать в какой папке я нахожусь
tailбыстрый просмотр конца файла (полезно для логов)
catбыстрый просмотр содержимого файла
tree -d -L 2двух уровневое дерево папок
find . -name *txtпоиск файла по имени
grep "needle" file.txtпоиск по паттерну
whoamiузнать какой я пользователь
uname -aузнать что за ядро (и может дистрибутив)

Файловая структура

Что-бы ходить по файловой системе, надо понимать по какому принципу дерево построено, и хотя в разных дистрибутивах оно немного отличается, стандарт FSSTND такой..

FSSTND СтандартSuse 11Mac OS 10.7Описание
bootmach_kernelФайлы загрузчика. Lilo и образ ядра
tmpprivate/tmpВременные фейлы для бута. Остальным - в /var/tmp
sbinСистемные комманды нужные при буте
binПользовательские комманды нужные при буте
procВиртуальная папка настроек и процессов ядра
devПодключённые устройства
mntVolumesДоступные через файловую систему устройства
libОбщедоступные библиотеки root-уровня
etcprivate/etcКонфигурационные файлы, зависящие от машины
rootprivate/var/rootДомашняя папка главного пользователя
homeДомашние папки остальных пользователей, в том числе ftp, httpd, samba-сервисов
usrCтатичные файлы программ, библиотек, игр, документации, утилит не используемых при загрузке
varprivate/varЧасто меняющиеся файлы - почтовые сообщения, логи, временные файлы
cdrom
opt+
image
lost+found
media
selinux
srvПапка для апача, корень документов вместо htdocs
netмаунт для NFS дисков
privateсюда сгруппированы разные папки для ограничения доступа
coresместо для сохранения дампов памяти при падении.. можно почистить при недостатке места
ApplicationsВсе установленные пользователем приложения
Developer
LibraryОбщедоступные файлы (например шрифты) межпрограммного уровя
Network
System
Usersдомашние папки настоящих пользователей, расширение home

Комбинирование

Удобство синтаксиса юникса как я уже сказал в гибкости, а именно в символах управления, которые используются с несколькими коммандами

|труба - передача данных от одной комманды в другую, например ls -F | grep /
;последовательный запуск комманд, например date;cal
>перенаправление стандартного вывода в файл с перезаписью, например ls / -F > list.txt
>>перенаправление вывода в файл с добавлением в конец

Обработка файлов

mvпереименовывание
rmудаление
rm -rfрекурсивное удаление
catобъединить файлы и выдать в поток
pasteобъекдинить строки файла(-ов)
lnссылка на файл или папку
splitбинарное разделение файла
joinпострочно объединяет два файла по общему слову
cutпострочно (и/или) поколоночное вырезание текста из файла как из матрицы символов
catпоследовательное объединение двух файлов и вывод в терминал (или файл)
sortотсортировать строчки по алфавиту
uniqоставить уникальные строчки

Установка программ

Поскольку *никсы занимаются целым спектром разных задач, следовательно разные дистрибутивы, со своими установщиками. 

ДистрибутивУстановщик пакетов
Gentooemerge
Debianapt-get update
apt-get install ...
dpkg --install
Fedorarpm -ivh ...
yum -y install ...Гляньте также на возможные репозитории
Mandrivaurpm
Slackwareyast, zypper
gzip, lzma

Кроме системных общих установщиков, есть и специфичные под конкретные нужды установщики

  • port install mongodb -  Установщик macports 

  • pear install phpunit/PHPUnit

  • pecl install mongo

  • gem

Текстовые редакторы

ViVimNanoGeditMatePicoEmacs
Ubuntu+++-
Mac OS Lion++-+++
Debian 5+++-+-
Suse 11+-----

vi readme.txt
i - режим редактирования
esc - выход в общий режим
ZZ - сохранить и выйти
" - режим консоли
!q - выход без сохранения
wq - выход с записью

Архиваторы

gunzipраспаковать .gz
bunzip2распаковать .bz2
tar -jxvfраспаковать .tar

Процессы и диагностика

topзапущенные процессы. См. также htop, pstree
netstatоткрытые соединения
например открытые порты в линуксе: netstat -atp | grep -i "listen" или netstat -tupl
на маке: lsof -n -i4TCP | grep LISTEN
lsofоткрытые файлы (например открытые порты в маке: sudo lsof -i -P|grep -i "listen")
killallубить процесс по имени. Иногда приходится убивать точечно (например подвисший mysql) по PID:
kill -9 1566
whereisподсказка где находятся файлы процесса
df -hотчёт о свободной HDD-памяти (в читаемой форме). Что-бы найти большие файлы на сервере:
find . -type f -size +50000k -exec ls -lh {} ; \| awk '{ print $9 ": " $5 }'

| |w|список пользователей в данный момент| |opensnoop|слежка за доступом к файловым указателям|

Работа с серверами

Практически все постоянно работающие программы - демоны находятся в /etc/init.d/ и имеют комманды start, stop, restart. Необходимы права рута для их управления. В некоторых случаях (Fedora) может прийдётся использовать /sbin/service для доступа к ним

sshУдалённое соединение
scpБезопасное сетевое копирование через SSH с одного сервера на другой. Флаг -r делает рекурсивное копирование папок. Например:
scp -r root@example.com:/srv/htdocs/ /home/html_sources/
ab(Apache Bench) - нагрузочное тестирование (например с параметрами -r -c 100 -n 1000)
nc(netcat) - прямое сокет-соединение
rsyncСинхронизация файлов rsync -av -e ssh --progress /local/source user@example.com:remote/target
Apache

На маке апач2 встроен (включается в настройках sharing) и в нём имеет смысл включить .htaccess (см. директиву AllowOverride)

LinuxMac OSX
Запуск/etc/init.d/httpd restart/etc/init.d/apache2 restart/etc/apache2/
/usr/sbin/apachectl restart
/private/etc/apache2/httpd.conf/private/var/log/httpd/access_log
Логи/private/var/log/apache2/access_log
/private/var/log/httpd/access_log
PHP
Suse 11Mac OSX
/etc/php5/apache2/php.ini
/usr/share/php5/
/usr/lib64/php5//private/etc/php.ini
/usr/local/php5/lib/php/extensions/
MySQL

Настройки MySQL по умолчанию используются зашитые (их можно спросить у mysqladmin посмотреть), для перезаписи на свои, надо в /etc положить my.cnf файлик (образец есть в папке support-files). Самые полезные утилиты в bin папке это mysql (прямой консольный доступ к серверу) и mysqldump (для миграции больших баз).

Если вы сидите на маке, но хочется через виртуалку использовать sqlyog, можно расшарить соединение..

CREATE USER 'your_user_id'@'localhost' IDENTIFIED BY 'your_password'; GRANT ALL ON your_database_name.* TO your_user_id@'%' IDENTIFIED BY 'your_password';

При быстрой работе с самим сервером наиболее востребованы комманды

SHOW PROCESSLIST;
SHOW DATABASES;
CHECK TABLE;
REPAIR TABLE;

Управление демоном

LinuxMac OSX
/etc/init.d/mysql restart/usr/local/mysql/bin/mysqld_safe
/usr/local/mysql/bin/mysqladmin shutdown

См. также

Сборка php-проекта с selenium и jenkins

· 5 мин. чтения

В этой статье я теперь попытаюсь описать как собирать php-проект вместе и как проводить deployment так, что-бы разработчики видели прогресс и состояние здоровья проекта с помощью инструментов статического анализа кода, что-бы были видны результаты запуска unit- и selenium- тестов с результатом покрытия, что-бы проверялся принятый стиль кода. В качестве груши для битья я возьму Drupal 7.8 для анализа.

Статический и динамический анализ php-кода

· 4 мин. чтения

Автоматический анализ кода (static code analysis) очень полезен на больших проектах и он часто встраивается в серверы непрерывной интеграции. Некоторые IDE уже поставляются с простыми аналитическими инструментами, но первые всё-таки предпочтительней, потому что туда смотрит вся комманда. Всё что этот софт делает это периодически смотрит в систему версионирования (SVN) и строит график качества (и например запускает юнит-тесты). По сути это аналог комплекса упражнений для человека, поддерживающих хорошее здоровье и бъющих тревогу если возникает рак спагетти-кода.

Самые известные CI-серверы:

Статический анализ кода и его метрики

В целом, статический анализ кода сводится к оценке метрик кода с поиском потенциальных проблем. Начиная с банальных необъявленных или не использующихся переменных и заканчивая поиском дубликатов. Метрики позволяют оценить цену и сложность проекта для планирования дальнейших работ, позволяют оценить влияние от новых методологий и инструментов, уменьшают время поиска проблемных мест как по пакетам так и по разработчикам.

Метрик очень много и каждый аналитический инструмент по разному их формулирует и сокращает, поэтому единой картинки добиться сложно, хотя и есть закономерность в шагании по стопам java

Размерные метрики

  • NOP - число пакетов
  • NOC - число классов → Число классов в пакете (Java =17, C++=19)
  • NOM - число методов → Число методов в классе (Java = 7, C++ = 9)
  • LOC - число строк → Ошибок/KLOC, Документации/KLOC
  • IOp - число параметров входа/выхода
  • IOg - число переменных вызываемых методом (классовых и глобальных, не локальных)
  • IOvar = IOp + IOg
  • CS - число атрибутов и методов. Может указывать на слишком большую ответственность одного класса
  • NOO - число переписанных родительских методов в дочерних классах. Указывает на высокую или низкую абстракцию
  • NOA - число новых методов в зависимости от глубины наследования

Метрики наследования

  • ANDC - среднее число наследующих классов (Java = 0.41, C++ = 0.28)
  • AHH - средняя высота иерархии (Java = 0.21, C++ = 0.13)
  • MIF = число унаследованных но не перезаписанных методов / общее число методов, указывает на степень абстракции или специализации класса (значение от 0 до 1)
  • PF - фактор наследования = число наследуемых методов / (число новых методов * число дочерних классов ), показывает насколько используются наследуемые методы (значение от 0 до 1)

Метрики сложности

  • CF - фактор связанности двух классов (т.е. один класс вызывает или использует методы/свойства другого класса) = число вызовов / максимальное число вызовов (значение от 0 до 1)
  • CALLS - число вызовов методов
  • FANOUT- число (вызываемых ) классов → (fin+fout)2 * len
  • Структурная сложность = CALLS 2
  • Сложность данных SC = IOvar / (CALLS +1)
  • Цикломатическая сложность CC = число решений / число строк (Java = 0.2, C++ = 0.25). Разные научные определения (Halstead, McCabe, McClure)
  • Системная сложность: SYSC = SC + SD

Некоторые программы ещё измеряют степень безопасности через число точек прямого входа, т.е. использования параметров GET, POST, SESSION, FILE. 

Инструменты

Для php таких аналитических программ относительно мало — есть консольные узкоспециализированные программки:

  • Depend - использует некоторые приведённые выше метрики для анализа сложности pdepend --overview-pyramid=out.svg my_project_namepdepend --jdepend-chart=out2.svg my_project_name pdepend --jdepend-xml=out.xml my_project_namedependencies.php out.xml -o out3.svg

  • Mess detector - ищет неиспользуемый код и сложные выражения phpmd my_project_name text phpmd.xml

  • Code sniffer - проверяет названия методов и переменных согласно правилам из XML-файла настроек phpcs --standard=CodeREview --report-source my_project_name

  • Dead code detector ищет невызываемый код

  • Copy-paste detector

  • phploc - оценивает размер
    phploc my_project_name

  • PHPLint - проверяет синтаксис и генерирует документацию

  • Analzer for Type Mismatches - ищет возможные ошибки с несовместимостью типов

Ещё есть чуть более общие PMD (на java) и phpsatспециализированные RIPSRATS (как вариант Fortify360 + Jenkins), YascaPixy и агрегаторы всего что только можно - PHPUnit,  PHPLintSonar

Динамический анализ кода

В отличие от статического анализа, здесь система должна работать. Причём нас на этом этапе заботят - скорость работы всей системы (и узкие места) и логическая безошибочность. Соответсвенно решается это

  • Покрытие кода тестами (Statement, Branch, Path coverage)
  • Граф скорости загрузки и использования памяти в зависимости от методов

Инструменты

Универсальная аптечка

· 6 мин. чтения

Лечение своими руками дело опасное, но хуже когда лечиться нечем, поэтому полезно всегда иметь наготове такую аптечку, собранной народным мнением (авторство не моё, собирайте на свой страх и риск)

Прячем лишнюю информацию в Gmail с Greasemonkey

· 1 мин. чтения

Greasemonkey - отличный плагин для Firefox, позволяющий выполнять произвольный javascript на стороне пользователя. Тем самым это универсальный плагин заточенный под конкретный сайт, хоть и не дающий браузерного UI как другие плагины, но дающий возможность менять DOM существующих сайтов.

Мне вот надоело что в GMail постоянно показывается блок текста со всякой статистикой и ссылками - поставил Greasemonkey, нашёл XPath адрес этого блока с firebug, добавил его устранение, обернул в таймаут для загрузки страницы и вуаля.. чистота.

Это элементарный пример (проще только по ID элемент найти) скриптов, огромное количество которых можно найти на userscripts.org

// ==UserScript==
// @author Artjom Kurapov <artkurapov@gmail.com>
// @name gmail_modifier
// @namespace gmail_modifier
// @include https://mail.google.com/mail/?shva=1#inbox
// ==/UserScript==

var aWindow = (typeof unsafeWindow != 'undefined')? unsafeWindow: window;

aWindow.setTimeout(function(){

var xpathResult = window.frames[3].document.evaluate('/html/body/div/div[2]/div/div[2]/div/div[2]/div[2]', window.frames[3].document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);

for (var i=0; i<xpathResult.snapshotLength; i++) {
var nodeToHide = xpathResult.snapshotItem(i);
nodeToHide.style.display='none';
}

},6000);

Установка виртуальной Mac OS 10.4

· 2 мин. чтения

Как я уже писал, к тестированию веб-приложений надо подходить основательно и учитывание разнообразия платформ немаловажный фактор. Selenium Grid работает на разных ОС, но не всегда есть возможность под каждую ОС иметь отдельную тестовую машину. Выручают программы виртуализации - всевозможные Virtual PC, Parallels и в частности, VMware Workstation 7 (кстати покупка этой компании принесла кое-кому прибыль в 9 млрд).

Десятая Mac OS выпускалась как и Андроид с кодовыми названиями у микроверсий, только если у последнего были сладости, то у первого - гепарды, пумы, ягуары, пантеры, тигры, леопарды, барсы и к лету ожидается лев. Установка на интеловский процессор производится с помощью модифицированного бут-загрузчика, поэтому в целом вам понадобятся

  • Дистрибутив оси (iso, можно dmg переконвертировать с помощью PowerISO)
  • 17-мегабайтовый darwin_snow.iso файлик
  • VMware Workstation 7

Управление pivotaltracker задачами в PHPStorm

· 1 мин. чтения

Продолжаем изучать среду разработки PHPStorm. На этот раз поговорим о задачах. В общем идея в том, что при разработке проекта управляющие в вашейкомпании где-то создают список того что надо сделать или исправить — это всякие инструменты типа Jira, Mantis, Redmine.. Каждая со своими особенностями в том какзадачи описываются и дальше текут в компании.

PivotalTracker — один из таких инструментов, созданный специально для любителей scrum, соответсвенно он оперирует кучками задач (backlog, icebox и тд.). Но суть не в этом..

Основная идея интеграции IDE и task-tracking инструмента в том что-бы

  1. Не приходилось постоянно ходить в последнюю для просмотра описания и изменения статуса
  2. Открытые табы (файлы) зависели бы от контекста, т.е. от решаемой в данный момент задачи
  3. Сохранять список изменённых файлов в рамках задачи (на случай поиска дальнейшего дебага)

Системное тестирование с Selenium и PHPStorm

· 4 мин. чтения

Все в округе говорят про юнит-тестирование и TDD, но основательно менять парадигму мышления и мегабайты строк кода нехватает воли, денег и времени? Временное решение — системное black-box тестирование с Selenium Server (RC). Это значит что мы тестируем не каждый класс изнутри как то делает unit-тест (т.н. whitebox-тестирование), а только UI который виден пользователю.

Помоему лучше начинать внедрять тестирование в существующие проекты в компании именно с этого, потому что это может стать первой ласточкой о том работает ли ещё навигация в проекте с вашими изменениями или что-то упало (сравните с результатом unit-тестов которые говорят работает ли всё правильно)

Если вы уже видели плагин для Mozilla Firefox который позволял записывать ваши действия и воспроизводить как макрос, то вы уже в теме, потому что это был Selenium IDE, который к нынешнему времени может макро-комманды превращать в ruby, python, java, perl, c# и PHP код. А делается это вот для чего..

Анализ ошибок с XDebug и PHPStorm 2.0

· 2 мин. чтения

XDebug это отличный php-модуль для правильного дебага приложения, который в «старших» языках (читай - не интерпретируемых) уже сразу был встроен в компилятор. Необходимость в полноценном дебаге очевидная в сложных приложениях, где воспроизведение ошибки занимает относительно много времени, а объём данных не позволяет копаться в мегабайтах от print_r(), хотя этот модуль позволяет и такие отчёты

Посколько xdebug это модуль, то не на всяком shared-хостинге он имеется и поэтому подразумевается что разработчик подымет у себя php+xdebug сам. После этого в php.ini включается модуль и его настройки по умолчанию. Заметьте что remote_host по IP ограничивает число работающих с дебагерром.

extension=C:\Program Files\php\ext\php\xdebug-2.1.0-5.3-vc9.dll
xdebug.profiler_enable = 1
xdebug.remote_host=127.0.0.1
xdebug.remote_port=9000
xdebug.remote_handler=dbgp
xdebug.idekey=

Для правильного дебага надо соединить IDE и модуль Xdebug, что-бы последний остановил работу php и передал данные всех переменных в PHPStorm:

  1. Включить прослушивание 9000 порта в PHPStorm и режим дебага в IDE через Shift+F9 или из меню Run/Debug.

  2. Прописать в куки режим дебага что-бы X-debug на удалённом сервере понял когда ему стоит работать. Jetbrains сделали генератор букмарков для простой работой с печеньками. Второй вариант - специальные плагины для браузеров. Параметр Ide key вводится такой же как и в настройках IDE и в php.ini

Теперь можно поставить breakpoint на любой строке. Проблемы начинаются когда данные таки начинают бегать -  если удалённый сервер на линуксе, а у вас винда то естественно пути которые на линуксе не совсем соответсвуют той иерархии кода которую видет PHPStorm. Благо эта проблема решается маппингом папок на нужное место. Вторая проблема - закрытый код. XDebug как ни в чём не бывало выдаёт все пути что запускалось.. а IDE ведь не может этого проверить.

Наконец главная проблема - как выкидывать trace автоматически при возникновении ошибки, без установки breakpoint? Я частично решил для себя эту проблему используя свой регистратор ошибок вместе с xdebug_break(), проблема в том что фатальные ошибки не до конца показывают stack trace.

function ErrorHandler($errno, $errstr, $errfile, $errline) {
if (!in_array($errno,array(E_NOTICE,2048))) {
xdebug_break();
restore_error_handler();
trigger_error($errno.$errstr." in ".$errfile." on line ".$errline."; showed by error handler ");
}
}

function shutDownFunction() {
if(!is_null($e = error_get_last())){
xdebug_break();
}
}

function exceptionHandler($exception) {
xdebug_break();
restore_exception_handler();
}

set_error_handler('ErrorHandler');
register_shutdown_function('shutdownFunction');
set_exception_handler('exceptionHandler');

Интеграция бухгалтерии с E-conomic

· 2 мин. чтения

E-conomic это датская бухгалтерская (accounting) система. Нам то может и дела нет до неё, но всё-таки попробую описать её возможности и интеграцию, поскольку она активно расширяется (уже охватывает 9 стран) и полезна для деловых людей так или иначе связанных с продажами, счетами, юридическими лицами и налогами. Кроме того она уже интегрирована с некоторыми платёжными системами, например с датской epay.

Создание компьютерной игры

· 3 мин. чтения

Фильм на русский перевели как «В компании мужчин» и хотя буквально правильней было бы «Люди корпораций». Корпорации это такие современные государства — они рождаются из ярких монархий с харизматическими лидерами и когда последние решают отпустить власть из частных рук (IPO) то случаются проблемы демократии. Как известно «демократия» ни разу не встречается в декларации независимости США — просто потому, что то, чего хочет тело сейчас, не всегда выгодно в долгосрочной перспективе. Так и с межнациональными корпорациями которые имеют свой парламент (совет директоров), местную власть (региональные отделы) и которые живут побогаче чем настоящие чиновники которым не положены миллионные премии.

В общем то фильм о надежде и духе работы — главный герой Bobby Walker, вполне успешный управляющий (и далеко не бедный) оказывается внезапно уволенным с хорошо оплачиваемого места в некоей GTX корпорации. И он не один - сотни людей оказываются такими же рвущимися на рынке за любое предложение и речи о похожем положении уже быть не может. Знакомые страхи? Сюда типично можно было бы добавить цепочку разорения - развода - спивания - самоубийства, но это фильм позитивный. Мрачный, но позитивный — в отличие от «Социальной сети» которая лишь заводит зрителя тем что деньги можно получать так легко из воздуха и достаточно лишь идеи, этот фильм подводит зрителя под холодный душ реальности.

Узоры в масштабируемых системах

· 2 мин. чтения

Это вольный перевод и дополнения статьи Ricky Ho на англицком об алгоритмах используемых в масштабировании систем и распределённом вычислении. Обратите внимание что эти модели применимы не только в программировании, но и в управлении.

Авторизация в Google с OAuth 1.0

· 3 мин. чтения

Google как и Твиттер, предоставляет разработчикам возможность использовать OAuth 1.0 для авторизации пользователя стороннему приложению предоставлению конкретных данных по API, причём поскольку Google не централизованный Facebook и у него много полноценных сервисов типа Youtube и Picasa, то для каждого из них выборка данных своя. В общем эта авторизация (ключевые слова - OpenID, AuthSub, Federated Login) и доступ к данным (ключевые слова - JSON, XML, REST, Atom) называется Google Data Protocol.

DeathSpank

· 2 мин. чтения

DeathSpank или же "Смертельный Шлепок" это уморительная игра и сатира на rpg-мочилово вышедшая под креативным руководством Рона Гилберта, в своё время работавшего над квестами Monkey Island и Grim Fandango и если вы в них играли и помните сюрреализм и сногсшибающую фантазию, то вам понравится и это творение.

Главный протагонист - глупый но целеустремлённый воин который хочет заполучить Артефакт (что именно это такое и с чего вдруг такое стремление нам как и самому герою неизвестно), но обстоятельства так развиваются что ему приходится пройти много сторонних квестов что-бы прокачаться и пройти всю карту.

Тихий компьютер к началу 2011 года

· 9 мин. чтения

Мой комп потихоньку устаревает с прошлого обновления и я решил потратить пару дней и изучить рынок на случай апгрейда, заодно узнать что нового есть и куда движется железо.

Требования

Это центральный многофункциональный комп в доме — хранилище и просмотра фильмов на телевизоре, игровая станция,

рабочая станция

и сервер для торрентов (т.е. постоянно включен). В связи с этим необходимо что-бы он был

  • Тихий, т.е. не мешал работать, смотреть кино или даже ночью спать — уровень шума ниже 30 дб на расстоянии 1 м

  • Производительный — что-бы можно было играть в последние игры хотя бы с DirectX 10, желательно с возможностью апгрейда до двух видеокарт, пятиканальный звук, USB3

  • Без оптических дисководов (5¼") но с большим числом жёстких дисков (3½")

  • Эстетически красивый и небольшой (с поддержкой ATX материнки)

  • По возможности дёшево (до 1200 € за корпус и 500 € за монитор) и качественно

Компоненты

Модульность созданной в IBM архитектуры ПК играет такую же роль как и модульность в программном обеспечении — выбор огромен но ещё больше комбинаций всех компонентов. Решаешь взять одно - оказывается что нельзя выбрать другое. Всевозможные несовмести сокетов и частот ограничивают все возможные вариации, но неискушённый пользователь в своём максимализме может просто переплатить и не получить то что хочется. В этом плане очень хочется вслепую взять Apple Mac Pro и надеяться что там железо топовое, но переплачивать в два раза нет возможности (~2000€) так же как и за HP Z800, где два Xeon процессора, водяное охлаждение, поддержка до 192 гб оперативки, красивый корпус (~4615€)

Корпус

Корпуса делают из стали (прочней) или алюминия (легче) с отделкой из полированного алюминия, пластика, резины. Задача корпуса — удобно крепить компоненты и провода, изолировать шум, поддерживать вентиляцию и охлаждение компонентов. Естественно одно другому противоречит — чем больше элементов корпуса и вентиляторов с сеткой и фильтрами тем больше шума.

Отличные корпуса в порядке убывания производят следующие компании — Silverstone, Antec, Nexus, Lian Li, Thermaltake. Мне не нужен дорогой корпус типа Thermaltake Level10 а так же я немогу достать только вышедшие типа Nexus Prominent 9. и немогу взять красивый SilverStone Fortress FT02 из-за 5 мест под жёсткие диски. Поэтому наиболее подходят:

Zalman MS1000-HS1Thermaltake Element GFractal Design Define R3, Black Pearl
  • Отличный внешний вид
  • Звукоизоляция
  • 7 отсеков под жёсткие диски
  • Hot swap жёстких дисков
  • внутренность не окрашена

~146€ + 7 отсеков под жесткие диски с доставаемым контейнером

  • Три огромных 200 мм вентилятора
  • Закрываемый на замок корпус
  • 4 USB розетки
  • Уплотнители на дверцах
  • Сбоку вентилятор без фильтра и отверстие не круглое
  • Шумный
  • Нет USB3

~117 €
Обзор Горизонтальная вентиляция

  • Звукоизоляция и чёрный интерьер
  • 8 отсеков под жёсткие диски
  • Съёмная передняя панель с проводами и дверцей
  • Из Эстонии трудно достать
    Теперь высокие (full tower) корпуса..
BitFenix CollosusAntec Dark Fleet 85Zalman GS1000

 

 

  • 7 отсеков под жёсткие диски
  • Резиновая отделка снаружи
  • Внешняя панель с USB3 и замком
  • Большие 230мм вентиляторы
  • 5 отсеков под оптические диски
  • Рифлёная поверхность для подсветки
  • Пластиковая дверца
  • USB3
  • 9 Жестких дисков
  • Некрасивые и мешающие дверцы
  • Слишком игровой (7 кулеров), конкурирует с CoolerMaster HAF-X
  • Hotswap SATA диск наверху

~125 

6 отсеков под жёсткие диски
-вертикально откидывающиеся дверцы

~150 €
 Блок питания — SeaSonic 750w, 143€

Взял корпус Zalman HS1 + HDD модуль, фактически HS2 версия с 6 быстро сменяемыми дисками. Блок питания Seasonic 600w


Охлаждение

Теперь когда выбран корпус, надо продумать какое будет использоваться охлаждение процессора и видеокарты. Их три типа и я выбираю пассивное, надеясь на внутренний обдув корпуса - это самое тихое решение, но рассеивание тепла радиатора должно быть больше чем нагрев того же процессора.

Я выбрал Scythe Ninja в надежде что его радиатор справится с Intel i7, но как оказалось, без движения воздуха температура растёт чуть ли не на 1 градус каждые 30 сек и спокойно доходит до 60-70 градусов Цельсия. Поэтому поставляемый с ним же вентилятор я поставил на минимальные обороты.

Радиатор + вентиляторВодяноеПассивное
Типичное и относительно дешёвое решение, хотя и шумное. Например медный Zalman CNPS9700
  • Swiftech + Koolance для охлаждения всех компонентов

  • внешний Zalman Reserator 1 V2

  • внутренние Corsair Hydro Series H50

  • Scythe Ninja 3 - 44 EUR

  • Arctic Freezer 7

  • Coolermaster Z600 - до 89W

  • Thermalright HR-01

Процессор

Как показывают тесты, сейчас самые топовые модели у Intel это серия Core i7 и Xeon X56** и если равняться на сборку от Apple Mac Pro, то они используют 4х ядерный Intel Xeon X3460 или же двухпроцессорную сборку из E5620. Более топовые модели практически сразу приближаются к 1000$ и мне не по карману. Из приведённых ниже вариантов видно что 800 серия быстрей работает с памятью, но максимальная пропускная способность при полной загрузке ниже учитывая трёхканальность 900 серии.

НазваниеЧастотаПунктыЦенаРабота с памятью
Intel Core i7 875K2.93ГГц6,443300 €Двухканальная до 16ГБ на 1333МГц
Intel Core i7 9503.07ГГц6,307256 €Трёхканальная до 24ГБ на 1033МГц
Intel Xeon X34602.80ГГц6,239$348.99Двухканальная до 32ГБ на 1333МГц

Разница невелика, я возьму 950 что подешевле. Отличия от предыдущего поколения Intel Core 2 в целом - улучшение пропускных способностей внутренних шин между 4 ядрами, их модульность, виртуализация и улучшение энергопотребления. Если хочется использовать более быструю (1333MHz и выше) память, то прийдётся ускорять процессор, благо он разгоняется до 4 ГГц без проблем, иначе же смысла брать быструю память без поддержки её процессором смысла нет.

Материнская плата

В выбранном процессоре используется LGA1366 сокет и сразу надо ограничить себя в желании удариться в геймеров-максималистов с GA-X58A-UD9. Материнка должна поддерживать кроме выбранного процессора и трёхканальной памяти минимум 6 жёстких дисков, желательно с дополнительным SATA3 диском под SSD, минимум 6 USB2 портов сзади и два USB3

MSI X58 Pro-EGIGABYTE GA-X58A-UD3RASUS P6T

+Трёхканальная память до 24 ГБ

  • 8 канальный звук
  • до 7 SATA жёстких дисков
    +3 PCI слота
  • Crossfire есть
  • SLI нет
  • Есть старая IDE шина
  • Нет USB3

150 €

  • Трёхканальная память до 24 ГБ
  • 7.1 канальный звук
  • гигабитный ethernet
  • Crossfire/SLI поддержка для видеокарт
  • до 10 жёстких дисков (!), из них
  • два SATA3 (!)
  • два USB3
  • возможный писк конденсаторов
  • мало USB2 сзади (4 шт.)
  • радиатор перегораживает некоторые интерфейсы

182 €

  • 8 SATA интерфейсов

173€

Оперативка

Kingston PC3-10600 1333MHz 6GB (3 штуки по 2GB) - 77**€**

Жесткие диски

Некоторая память у меня осталась от старого компа которая пойдёт на 3-терабайтовое хранилище. Из новых хочется один SSD под операционную систему для тишины и быстрой загрузки с последующим апгрейдом дисков из хранилища в два в RAID0-режимном диска под критические данные (фото и документы) + те же 3 терабайта под мультимедиа. 

Cогласно тестам на первом месте стоит продукт компании Crucial. Можно заметить что у всех SSD дисков на запись скорость всегда ниже чтения, а у лидера она ещё и нестабильная. Кроме того из Эстонии его не просто достать, а SATA3 на выбранной материнке у меня тоже нет.

  • Crucial 128GB RealSSD C300 2.5-inch SATA 6GB/s CTFDDAC128MAG-1G1 (~300MB/s при чтении 192MB/s при записи).

  • Kingston SSDNow V Series 128GB D/Kit (250MB/s, 182MB/s) ~206€

  • OCZ Vertex Series 120GB (203MB/s при записи, 82 MB/s при чтении)

upd. Взял Crucial M4 128 GB SSD. Если вы хотите хороший диск, то не смотрите на скорость, а смотрите на IOPS. Мой, согласно спецификации достигает 40 тыс IOPS, за 190€.

upd2. Через 2 года работы, SSD начал пахать носом - внезапно каждые пол часа работы останавливались подвисанием ОСи. Как оказалось, это из-за бага ранних версий (в моём случае версии 0002). Решается обновлением firmware, просто запустив exe файлик с офф сайта. Сначала у меня не работало, надо было перевести в режим IDE + кабель HDD поставить в гнездо master.

Видеокарты

Играть я буду редко но хочется что-бы последние игры работали без проблем. Поэтому желательны DirectX 11 и возможность расширения с Crossfire, в то же время желательно пассивное охлаждение и несколько выходов на разные мониторы.

Что-бы разобраться в нумерации продуктов Nvidia надо вспомнить что моя предыдущая видеокарта была 7900GS. После 7* серии нумерация пошла дальше - 8,9,200, 400. На данный момент в среднебюджетном варианте Nvidia предлагает например N460 чип с 1 ГБ памятью, DirectX 11, с 150 Вт потреблением, 675 Мгц, 907 Гигафлопс. За ~192 €. Более мощные 480 примерно в полтора раза мощней, более дешёвые 430 так же более слабые. . 

У поглощённой AMD ATI в такой же ситуации находится Radeon R800 серия и из неё например чип HD 5850 - 725 Мгц, 150 Вт, 1 ГБ памяти, 2088 Гигафлопс. За ~241 €.

Gigabyte Radeon HD 5770 GV-R577SL-1GDMSI Nvidia N460GTX CycloneSapphire ATI HD5670 ULTIMATE
  • Пассивное охлаждение
  • 1GB DDR5
  • DirectX 11
  • Достаточно длинная и может не поместиться в корпус
    150 €
  • 1GB GDDR5
  • Мощнее
  • DirectX 11
  • Вентилятор, хоть и тихий

+1GB DDR5

  • Пассивное охлаждение
  • Crossfire
  • DirectX 11

Итого

В качестве монитора я выбрал дорогой но качественный Dell 2209WA U2711 из-за IPS-матрицы за 247 ~600 €. С поворачиваемым дисплеем код будет удобней писаться, да и сайты читать лучше. В перспективе — поставить второй.

В сумме - тихий но очень быстрый комп за 1640€.

Читайте по теме:

You try to install Windows 8 (CP), and encountered the following error:

"We couldn't create a new partition or locate an existing one. For more information, see the Setup log files."

Resolution:

Try to following methods:

1)Check if you have an SD Card in the system. If you do, you remove it and run setup again ( you may have to remove a drive if u have more than one drive)

  1. Once the setup fails to find the partition, just close the setup window (the top-right-hand side red X does the job).

From that point, you should be brought back at the initial setup screen.Choose "Repair" then go to the advanced tools and start the command line.

Type Start DISKPART.

Type LIST DISK and identify your SSD disk number (from 0 to n disks).

Type SELECT DISK where is your SSD disk number.

Once u have selected the disk you have to type the selected disk in front of each command ie "DISK 0 CLEAN, DISK 0 CREATE PARTITION PRIMARY " etc.

Type CLEAN

Type CREATE PARTITION PRIMARY

Type ACTIVE

Type FORMAT FS=NTFS QUICK

Type ASSIGN

Type EXIT twice ( U end up with two command boxes) one EXIT to get out of DiskPart, the other EXIT to get out of the command line tool)

Google AI challenge - стратегии ботов

· 2 мин. чтения

Университет Ватерлоо при поддержке Google организовал состязание по спортивному программированию ботов для игры стратегии реального времени Galcon. С виду игра очень простая - есть планеты и корабли (на планетах или в полёте) надо захватить или преобладать на всей карте. Бот можно написать на большинстве популярных языков - C#, Java, Python, C++, Scala, PHP - для этого надо скачать "starter package", запустить у себя из консоли эмулятор и тренироваться покуда не будет Совершенство которое можно залить на сайт.

Особенности мобильной версии сайта

· 3 мин. чтения

Сделал себе мобильную версию блога, просто потому что надо — даже на андроиде с умным форматированием текста (который изобрела Опера) читать сайт не оптимизированный под мобильники неудобно. Для разработчиков это значит два варианта — либо сделать css файл который будет переделывать некоторые вещи и прятать ненужные блоки, либо же использовать отдельные шаблоны и в лучшем случае использовать параметр в том же контроллере что и основное приложение.

Устройство определяется через параметр user-agent в заголовке запроса - это можно использовать дальше в бизнес логике, например через php функцию. Знание устройства может влиять на то какую функциональность стоит подгружать, но это вовсе не обязательно потому что ..


Игра в прятки со стилями

Мобильная версия в лучшем случае заключается лишь в одном css-файле, таком же как и версия для печати где вначале прячутся ненужные блоки, реклама которая слишком мелкая что-бы её даже заметили, всякие виджеты "самого популярного", статистика... Код подгрузки стилей в шапке выглядит следовательно так..

<link rel="stylesheet" type="text/css" href="screen.css"media="screen" /> <link rel="stylesheet" type="text/css" href="print.css"media="print" /> <link rel="stylesheet" type="text/css" href="mobile.css"media="handheld" />

.. и просматриваются в Firefox благодаря Webdeveloper-плагину:

Однако если в печати элементы форм прячутся, то в мобильной версии практически всё, и кнопки в особенности увеличивается. В этот момент вы вероятно задумываетесь над порядком HTML схемы — можно ли просто так спрятать пару блоков и при этом ничего не сломать. В простом блоге как у меня в общем то да, потому что общая структура осталось той же - шапка с поиском, меню и поток статей, а вот в более сложных сайтах хочется какую-то табуляцию взамен меню.

Теперь что-бы браузер в смартфоне не начинал сразу показывать страницу с птичьего полёта вставим немножко кода

    <meta name="viewport" content="width=device-width; initial-scale=1.0; maximum-scale=1.0; user-scalable=0;" />     <meta name="HandheldFriendly" content="True" />

Первая строчка говорит фактически что ширина такая как задана у устройства, а zoom-out делать нельзя. Впрочем Андроидный webkit ограничения проигнорировал и бегунки по прежнему видны. А всё из-за фиксированных в пикселях размерах. Злоо.. Переопределям все блоки в ширину 100%, а все размеры шрифтов в em единицах. Таблицы, картинки и флеш-объекты всё ещё лезут за экран? Overflow:hidden на них. На картинки можно даже повесить уменьшение браузером с соблюдением пропорций

-webkit-transform: scale(0.5);-moz-transform:scale(0.5);

Но чудится мне что более качественные решения требуют более сложных решений с ресайзом.. я пока что повесил 100% ширину. С объектами (youtube) полегче - тоже вешается 100% ширина и минимальная высота в 200px.

Всякие важные мелочи

Но самое главное естественно повесить самое нужное. В моём случае это личные контакты — телефон и email. Телефон можно сделать ссылкой которую поддерживают Android и iOS

<a href="tel:112">Телефон спасения</a>

В случае магазинов это наверняка будут времена работы и местоположение на карте (которые тоже нужно ссылками делать).

  • В iOS у полей ввода <input> на html5-сайтах надо указывать параметр type (email, url, tel) что-бы виртуальная клавиатура менялась на соответсвующий вид

  • Mobile Best Practices рекомендует короткие ссылки, как например поддомен "m" m.flickr.com и m.facebook.com

  • Единые стили есть разве что для iPhone в виде плагина jQTouch

Создание полноценной мобильной версии (а не просто css слоя) - сложная задача поскольку может ориентирована и на разные устройства (ipad, iphone, android, tv, старые мобильники) и соответсвенно может нуждаться в изменении кода (если скажем ajax не поддерживается). У Gmail к примеру 4 версии для мобильников.

См по теме