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

Статический и динамический анализ 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 версии для мобильников.

См по теме

Backend-авторизация в facebook через OAuth 2.0

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

Facebook Graph API - новая версия программного интерфейса фейсбука где данные пользователя передаются в JSON формате, а список связанных объектов и привилегий значительно понятней (друзья, фото, видео, события, группы, посещения, события и тп. ). Например так выглядит информация обо мне (я чуток урезал).

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

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

Твиттер (а также Yahoo, Google, Facebook и LinkedIn ) штоб-его-заногу перешёл на безопасный OAuth и я вспомнил как в своё время с матюгами несколько дней ставил серверную часть OpenID на сайт. А они ведь похожи (авторам нравится буковка О, ага). Вобщем - как это работает? Если раньше был пользователь и твиттер, а мы со своим приложением притворялись пользователем используя его логин-пароль, то теперь чётко выделяются три лица

Агрегирование выборки в MongoDB + PHP

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

MongoDB - очередное веяние моды в веб-разработке, когда хранение данных заранее планируется таким огромным, что необходимо их распределение на несколько серверов с помощью шардирования. Поизучаем же непростой синтаксис агрегирования данных в mongo + php

Уникальное поле

Итак допустим есть коллекция объектов с повторяющимися полями, а нам хочется вытянуть только уникальные поля. В MySQL это делает DISTINCT(поле), здесь же надо запустить комманду которая вернёт только поле person_id.

$aObjects = $Mongo->command(array(
'distinct'=>'my_userlog_collection',
'key'=>'person_id',
'query'=>array(
'$or'=>array(
array('person_id' => new MongoRegex('/'.$sSearch.'.*/i')),
array('firstname' => new MongoRegex('/.*'.$sSearch.'.*/i')),
array('lastname' => new MongoRegex('/.*'.$sSearch.'.*/i')),
)
),
));

Как можно заметить одного лишь поля порой недостаточно - зачастую хочется сделать GROUP BY, т.е. повторяющиеся по заданным полям ряды склеиваются (а в случае различия других полей берётся первый из подходящих). В mongo такую пост-обработку результатов производят запускаемые пользовательские функции map, reduce и finalize. Я сначала было подумал что в адаптер Mongo надо передавать имя php-функции и даже начал смотреть синтаксис анонимных функций, но потом оказалось что передаются вовсе не функции а банально текст с javascript-функцией

Нанести на карту и уменьшить

Функция map() это своего рода SELECT - надо вызвать функцию emit() у которой первый параметр - ключ, а второй - собственно нужные поля. Конечно можно вместо полей поставить this, по аналогии со звёздочкой в SQL, но мы же знаем что это плохая практика. Но я как плохой, возьму все данные.

Теперь когда mongos, будет получать от mongod данные, он будет группировать их по первому ключу и передавать в reduce() функцию. Очень много примеров зачем-то делают там циклы и переменные.. Мне достаточно взять самый первый подходящий объект.

В коде выше я для полноты картины добавил регулярный поиск для имитации LIKE %, так что тут не буду повторяться. Поскольку возвращаемый адаптером результат вовсе не список, а какая-то левая статистика, то приходится делать что-то типа под-запроса. Вот тут уже реальные данные, но они в формате array (id, value), что помоему тоже извращение, а поскольку в map я сделал SELECT *, то тут я для наглядности показываю ещё и пост-фильтрацию. В итоге что-бы сгруппировать по person_id надо создать такого монстра..

$aMyCollectionResult = $Mongo->command(array(
"mapreduce" => 'my_userlog_collection',
"map" => new MongoCode("function() { emit(this.person_id,this); }"), //SELECT
"reduce" => new MongoCode("function(k, vals) { return vals[0]; }"), //GROUP
"query" => array() //сами поставьте сюда WHERE
));

$aList = $Mongo->oMongo->selectCollection($aMyCollectionResult['result'])->find(
array(),array("value.person_id",'value.first_name','value.last_name','value.country_code')
); //

print_r(iterator_to_array($aList)); //распечатаем что-бы посмотреть

По теме читайте..

Основы Android приложения в 2010

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

Android - основанная на linux платформа для мобильных устройств использующая изменённую виртуальную машину Java построенную для учёта компактности файлов и энергоэффективности Dalvik. Из-за этого используется не Mobile Edition и тем более не Java SE, а свои библиотеки.

Приложения соответсвенно пишутся на Java, либо же через обходные пути — TitaniumAppInventorAdobe AIR. Интересно что из библиотек есть SQLite и OpenGL - не прийдётся изобретать велосипеды. Кроме того в системе есть менеджеры для обмена данными между приложениями, сенсорами и тп.

Обзор PHPStorm 1.0

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

Профессия обязывает каждый день писать на php и поэтому первый важнейший инструмент после головы для меня является среда разработки (IDE). До сих пор я сидел на Zend 5.5, но столкнувшись с PhpStorm 1.0 от чехов русских с JetBrains сразу перешёл на него.

Понятно что редактор - дело субъективное и многое зависит от проектов с которыми вы работаете. Zend 5.5 мне нравился удовлетворительной скоростью и простым доступом к ftp. Я знал что там ещё были всякие дебаги, интеграция с SVN и sql-серверами но практически их не смог применить. Я пробовал NetbeansAptana и PDTZend 6 но во все они медленные особенно при индексации файлов и монстроидальный интерфейс с кучами кнопочек. Поэтому и начну сразу с недостатков.

Недостатки

  • Невозможно сразу начать работать при медленных (>5 сек) сетевых соединениях (VPN) и обращению к файловой системе

  • Синхронизация файлов при deployment'е удалённого проекта не совмещает различия, а просто перезаписывает удалённые файлы, что делает невозможным изменение файлов двумя пользователями. Есть возможность ручной проверки одиночного файла, но сверять каждый раз самому неудобно.

  • Подвисание процесса при долгой индексации дополнительных папок к проекту и отсутсвие полоски прогресса этого процесса. При обычной индексации всё-таки прогресс показывается и может уходить на задний план.

  • Р****едактирования по FTP нету. Можно файлы читать, но для полноценного редактирования надо делать локальную копию проекта с настройкой синхронизации и deployment'а, а при переходе с одного IDE на другой и большом количестве проектов ждать скачивание каждого - жуть

  • Автосохранение файлов сразу во время редактирования, хотя и компенсируется "локальной версией изменений файла", однако многим может быть непривычно при переходе из других IDE.

  • Глупое автодополнение тэгов в html режиме (вечно мне добавляет comment тэг!). В редактировании php кода методы не подсказываются автоматически а только с нажатием Ctrl+Space, видимо из-за погони за скоростью.

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

  • Пугающие настройки. Их просто много. Разве что они понятней чем в Эклипсе - сразу разбиение на настройки проекта и настройки IDE.

  • Непривычность клавишных связок (hotkey binding) - например у меня несколько раз возникала ситуация когда я двигался назад по истории изменений (Undo), а потом хотел вернуться нажимая Ctrl+Y и вместо этого терял Redo-историю потому что Ctrl-Y на самом деле удаляет строку

  • Мало плагинов. Из серверов управления задачами только Jira и собственній youtrack. То же касается систем версионирования (Есть CVS, SVN, git, perforce). В основном они пишутся для общего редактора IntelliJ idea, а php-просто как частный случай

Как у всех..

Редактор визуально очень похож на все существующие IDE - динамические панели как у eclipse но с меньшим визуальным шумом иконок. Тут собственно меню, панель дерева файлов, панель структуры класса, внизу дополнительные панельки для todo, версионирования, иерархий и удалённого редактирования (появляются по мере необходимости).

Очевидно что редактор не компилятор и не настолько умён что-бы понимать переменные при использовании extract() или при переменных с динамическими именами через $$var — анализ этого на лету просто нереально ожидать и соответсвенно в проектах такие дела подсвечиваются как ошибки деклараций переменных. То же касается закриптованных частей через Ioncube или Zend guard.

Про автодополнение с Ctrl+Space я уже говорил, так же тут и Ctrl+click работает для перехода к собственно декларации метода или класса. И Ctrl+D дублирует строку. Тут есть и закладки строчек через Ctrl+Shift+цифра. Есть тут и поддержка PHPdoc и @todo синтаксиса.

Основные фишки

Главные прелести редактора - хорошая скорость в обычном редактировании текста - ничего не прыгает, не задумывается на три секунды покуда я печатаю.. Вобщем есть "основа" которая дополнена мелочами в которых и кроется секрет хорошего блюда:

  • Поиск классов Ctrl+N и файлов Ctrl+Shift+N в том числе и со звёздочками (wildcard). Очень полезно и быстро, потому что файлы как правило разбросаны в разных ветках дерева и консоль всегда оперативна

  • Скролл при поиске или при навигации по своим закладкам строк через Ctrl + цифра. Очень помогает не потеряться и интуитивно понимаешь в какую сторону файла ты прыгаешь.

  • Рефакторинг имён файлов, классов и методов во всём проекте и/или поиск их использования. Потому что часто просто боишься поменять старое название на более информативное потому что не помнишь где это используется, а искать как фразу через Ctrl+F запаришься

  • Подключение внешних папок. Скажем если у вас 10 проектов в которых используется повторяемый фреймворк (PEAR к примеру) или закриптованный код, то можно подключить внешнюю папку чтобы IDE понимала пространство имён

  • Версионирование. Как встроенная история изменений, так и отлично встраиваемый SVN со всякими диффами, определённо лучше TortoiseSVN.

Приятно удивили и некоторые мелочи

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

  • Иерархия вызовов метода и вызываемых методов в hierarchy блоке

  • Статус и ручная чистка памяти в статус-баре - сразу говорит о заботе

  • Локальная история изменений файла

  • Перетаскивание строки или целого выделенного блока с сохранением табуляции через Ctrl+Shift+Up/Down вместо того что-бы делать Copy-Delete-Paste с ручным форматированием

  • Вернуться к последнему месту редактирования Сtrl+Shift+Backspace

Кроме этого в редакторе есть простор для изучения до которого я ещё не дорос:

  1. XDebug для профилирования скриптов.. Для удалённого проекта надо что-бы расширение на сервере было установлено, поэтому всюду использовать нельзя.
  2. PHPUnit для автоматического тестирования кода
  3. SASS для более гибкого написания css