воскресенье, 26 февраля 2012 г.

Шутка про UDP, TCP, ARP

Я знаю две шутки: про UDP и про TCP.
Не могу гарантировать, что до вас дойдёт первая.
Но пока не дойдёт вторая, я буду повторять её снова и снова.
Дошла ли шутка про TCP? Ок, ничего страшного, сейчас повторю чуть медленнее.
Была ещё третья - про ARP. Кто-нибудь знает у кого сейчас она? Скажите мне.
(C) не мой.
Я, лишь скомпилировал и оттранслировал из разных исходников (собрал в одну кучу и перевёл на русский)

В оригинале шутки звучат так:
I know a joke about UDP but I can't guarantee you'll get it.
I know a TCP joke and I'll keep telling it until you get it.
You didn't get my joke about TCP? It's okay, I'll tell it to you again slower.
Anyone know who has an ARP joke? Tell me

понедельник, 30 января 2012 г.

Скрипт Ruby для вычисления SHA1 по аналогии с Git



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

Следующий скрипт должен помочь.


Выполните:
$ git-sha1.rb filename1 filename2 ... filenameN

На выходе получите список хешей:
sha1_1
sha1_2
...
sha1_N

Теперь можно попробовать найти нужный блоб.
$ git show sha1_N

Так же исходный код этого срипта можно взять на гитхабе.

пятница, 20 января 2012 г.

Cygwin: Starting Gerrit Code Review: Error: Unable to access jarfile


When you encountered this error then you should search in the file "bin/gerrit.sh" for string Если вы встретили такую ошибку, то необходимо в файле "bin/gerrit.sh" найти строку 

GERRIT_SITE=`pwd`

and replace it to the next string и заменить на следующее

GERRIT_SITE=`cygpath -am \`pwd\``





четверг, 12 января 2012 г.

MacOSX: Unicode в названиях файлов в HFS


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

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

Кириллица не стала исключением.

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

Для меня это стало сюрпризом, т.к. хотя по спецификации всё верно: буква "Й" является композицией следующих двух:

Тем не менее, буква имеет и единичный код

Аналогично и для "Ё".

Если невооружённым взглядом такое поведение или сложно или невозможно, то оно прекрасно наблюдается во время SSH-сессии.

Локально из терминала проблему можно воспроизвести если создать какой-либо файл, например:
$ touch Ё-моё.txt
И попровать затем выполнить автодополение клавишей [TAB].
$ ./Ё[TAB]
не срабатывает.

Но если ввести
$ ./Е[TAB]
то мы увидим нашу многострадальную "Ё".

Некоторые программы (в моём случае GIT и SVN) не могут корректно обработать такую ситуацию.
Файл, по-мнению алгоритмов, просто не существует.
То есть один и тот же файл в репозитории (попавший туда из других файловых систем) и хранящийся локально (в HFS) считается двумя разными файлами.

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


Далее, можно почитать про проблему длинных имён в HFS+

вторник, 13 декабря 2011 г.

Автоматическая выгрузка SMS в Google Docs


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

Поиски в Android Market вывели на две программы.

My Archives


и SMS to Google Docs Archiver

Обе программы имеют минималистичный интерфейс и предельно схожий функционал.

SMS to Google Docs Archiver мне не понравился разделением смс на входящие и исходящие (хотя для кого-то это возможно и плюс), а так же запросом пароля от почты.

MyArchives же для доступа к документам и авторизации использует Android AccountManager, а в качестве приятного бонуса, по тому же принципу что смс, сохраняет ещё и историю звонков.
Имеется недостаток, MMS не выгружаются, но при этом удаляются. То есть мы их теряем. Но у меня их мало и все бесполезные, потому не жалко.
Если вам ММС необходимы, то либо делайте предварительный бэкап другой программой, либо удаляйте смс вручную.




пятница, 25 ноября 2011 г.

Как в Git игнорировать изменение прав у файлов

Работая в среде Cygwin или MSysGit, часто бывает так что права файлов изменяются, либо внешней средой, либо внутренними процессами.
У меня наиболее часто меняется признак исполнимости. И, к сожалению, пока отсутствует время чтобы разобраться в причинах.

Загадочным, для меня, образом некоторым файлам добавляется +x, некоторым -x. И Git уже начинает считает эти файлы изменёнными, которые обязательно надо закоммитить.
Т.к. происходит такое довольно часто, то это вызывает раздражение и пустую трату времени на починку с помощью chmod и/или git reset --hard.

Так, вот, если в вашем проекте не используются системные права, то можно заставить git игнорировать изменение прав у файлов.

Отключением/включением проверки управляет ключ filemode из секции core.
Его значение необходимо установить в false.

Либо прямым редактированием .gitconfig:
[core]
        filemode = false

Либо командой:
$ git config core.filemode false

Приятной разработки!

суббота, 3 сентября 2011 г.

Детерминанты - Тайна Cognos Framework Manager раскрыта


Перевод-пересказ статьи за авторством RALPH BAKER.

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

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


Ситуация

Например, имеется размерность времени, с гранулярностью до дня. Если все факты присоединяются к самому детальному уровню Day, тогда детерминанты не нужны. Но, как показывает практика, идеал бывает редко достижим. По множеству разных причин, факты в таблицах частенько агрегированы или хранят данные на разных уровня гранулированности.


Западня

Неприятности всплывают вместе с желанием впихнуть невпихуемое AKA присоединиться к размерности времени не по самому нижнему уровню. Рассмотрим таблицу фактов с месячными прогнозами (monthly forecast fact table); с детализацией "одна строка - один месяц". Связь через month_id будет каждый раз, в зависимости от месяца, возвращать от 28 до 31 записи, и таким образом, портить расчёты и настроение. Детерминанты решают эту проблему.


Запрос SQL

Часто, при моделировании, полезно думать о том, какой код SQL хотелось бы получить на выходе. Без детерминантов день рожденья на праздник непохож, и неправильный SQL выглядит примерно так:
SELECT
F.FORCAST_VALUE,
D.MONTH_ID,
D.MONTH_NAME
FROM SALES_FORECAST F INNER JOIN DATE_DIM D ON
F.MONTH_ID = D.MONTH_ID

Этот код, на каждую запись из прогноза, получит примерно в 30 раз больше записей, чем нужно. Математические функции, вроде Sum и Count, вернут неверный результат. Правильный же запрос, должен сначала вытащить все уникальные месяцы, каждого по одной штуке, и ТОЛЬКО ПОСЛЕ ЭТОГО присоединить факт:
SELECT
F.FORCAST_VALUE,
D1.MONTH_ID,
D1.MONTH_NAME
FROM SALES_FORECAST F INNER JOIN
( SELECT DISTINCT
D.MONTH_ID,
D.MONTH_NAME
FROM DATE_DIM D ) AS D1
ON F.MONTH_ID = D1.MONTH_ID

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


Разоблачение тайны Framework Manager

Следуя лучшим практикам Cognos, детерминанты необходимо указывать в слое модели, где происходит связывание таблиц.
Ниже приведена размерность времени с 4 уровнями: Year, Quarter, Month и day.





Это означает, что, в зависимости от гранулированности таблиц фактов, представленных в модели, в тематическом запросе можно определить до 4-х детерминантов. Первые три уровня: Year, Quarter, Month должны быть группирующими, т.к. не описывают уникальную строку в таблице; и установка флага "group-by" объясняет Cognos'у, что данные по этому уровню необходимо "схлопнуть" (оставить только одно значение). Другими словами, здесь описываются правила для формирования секции "group by" в запросе SQL (такого как Год или Месяц). Уровень Day - это конечный (Leaf) уровень детализации. С целью однозначного определения любых строк внутри размерности, необходимо установить флаг “Uniquely Identified”. Детерминантов "group by" может быть множество, но детерминант по уникальному ключу, как правило, только один единственный. Детерминант "uniquely identified" по определению содержит все неключевые столбцы как атрибуты, и автоматически создаётся во время импорта таблицы, если получается его обнаружить (т.е. в таблице БД имеется первичный ключ или индексы).
Секция Key содержит колонки, которые однозначно определяют уровень. В идеале, это одна колонка, но иногда требуется больше; например, если Год и Месяц (1-12) находятся в отдельных колонках. Итак, ключ - это любые колонки, которые нужны чтобы однозначно обозначить уровень.
Исходя из размышлений выше, настройки будут выглядеть следующим образом:

Секция Attributes описывает все остальные колонки, которые относятся к уровню. Например на уровне month_id, такими являются: название месяца, дата начала месяца, количество дней в месяце (month name, month starting date, number of days). И, очевидно, что здесь отсутствуют элементы с более низкого уровня, такие как Дата или День недели (date, day-of-week).
Вообще говоря, порядок расположения детерминантов не соотносится с уровнями измерения. Однако, для понимания как строится запрос SQL, очень важно знать, что поиск колонок ведётся сверху-вниз. Если в отчёте используется Год, Квартал и Месяц, то группировка будет сделана по колонкам Year-key, Quarter-key и Month-key. Но если для отчёта нужны только Год и Месяц (без Квартала), то в секции "group by" ключ Quarter-key будет пропущен.


Сколько уровней требуется?

Насколько необходимы все четыре уровня детерминантов? Имейте в виду, что детерминанты используются для присоединения ко всем уровням измерения, кроме самого нижнего. В примере выше, присоединяемся на уровне месяц (по ключу month_id). Пока отсутствуют дополнительные связи на уровнях года и квартала, строго говоря, указывать эти детерминанты необходимости нет. Помните, что год и квартал однозначно определяются ключом month_id, поэтому их необходимо добавить на уровень месяца как атрибуты:


Заключение

Следуя этим простым правилам, Cognos создаст следующий запрос SQL. Выделенный кусок кода создан на основе настроек детерминантов. Обратите внимание, каким образом "схлапывается" Month_ID; для обеспечения уникальности значения уровня используется функция min. Cognos-параноик и недостотачно доверяет чистоте входящих данных, чтобы делать просто SELECT DISTINCT. Второе выражение 'group by' это обычное агрегирование, необходимое для отчёта. Так как связь теперь происходит корректно (каждый факт соединён только с одной записью размерности), в отчёт попадают правильные цифры.