воскресенье, 13 мая 2012 г.

Как установить Java Development Kit (JDK) 7 Update 4 на MacOS 10.6 Snow Leopard

Идём на официальный сайт Oracle и качаем jdk-7u4-macosx-x64.dmg.
Монтируем. Пока всё стандартно.



Пытаемся открыть...

OS X Lion required
This Installer is supported only on OS X Lion (10.7.0)

И тихо сквозь зубы материмся: "Ну, не настолько мы ещё устарели, чтобы нас так игнорировать".
Да и, по слухам, проблемы со стабильностью есть у Льва.

Но на каждую драную кошку у нас найдётся свой кобель.


Сейчас эту роль сыграет PackageMaker.


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


Дальше должно быть очевидно.
Required либо превращается в Optional, либо исчезает. Я шел по первому пути.

Далее необходимо исправить Destination в пакете установки, дописав "/System" вначале.


Должно получиться "/System/Library/Java/JavaVirtualMachines".


Иначе потом придётся переносить руками с помощью "sudo mv".
Если этого не сделать, то новая версия не появится в настройках Java ( Java Preferences ).

Опцию "Restart Action" можно выставить в "None", если по какой-то причине нельзя прерывать текущую сессию.

Далее жмём Build и выбираем место сохранения нового пакета.


"Save" и чуть-чуть ждём.


Готово.


Открываем новый пакет и следуем инструкциям.
По завершении установки, необходимо открыть Настройки Java ( Java Preferences ).

open "/Applications/Utilities/Java Preferences.app"


либо


и перетащить Java SE 7 наверх списка.


И последний шаг


$ java -version

java version "1.7.0_04"
Java(TM) SE Runtime Environment (build 1.7.0_04-b21)
Java HotSpot(TM) 64-Bit Server VM (build 23.0-b21, mixed mode)





понедельник, 7 мая 2012 г.

Кроссплатформная проблема длинных имен файлов (Crossplatform long file name problem)


Хотя я демонстрирую ошибку на примере работы с системами контроля версий для MacOsX и Windows - это проблема более глобальная и поймать её вы можете в любой другой комбинации софта (да хоть в той же Samba).
Используемый подход решения проблемы наверняка не единственный, но, при этом, довольно универсален.

Различные файловые системы по разному хранят информацию об имени файла.
Из-за чего возникают коллизии если разработка ведётся многими людьми и у всех разные ОС.
В моём случае получилось так, что другой разработчик закоммитил в репозиторий файл длиной 180 русских букв.

$ echo "яяяяяяяяя яя яяяя яя яяяяяяяяяя яяяяяяяяя я яяяяяя я яяя яяяяяяяяя яяяяяяяяяяяяя яяяяяяяя я яяяяяяяяяяяяяяяяяя яяяяяя яя яяяяяя яяяяяяяяяяяяя яяяяяяяя яяяяя яяяяяя я яяя яяяяя яяя" | wc -m

180


Но

$ echo "яяяяяяяяя яя яяяя яя яяяяяяяяяя яяяяяяяяя я яяяяяя я яяя яяяяяяяяя яяяяяяяяяяяяя яяяяяяяя я яяяяяяяяяяяяяяяяяя яяяяяя яя яяяяяя яяяяяяяяяяяяя яяяяяяяя яяяяя яяяяяя я яяя яяяяя яяя" | wc -c

334

Русские буквы занимают два байта вместо одного.
При попытке создать такой файл под MacOsX на диске со стандартной файловой системой HFS+

$ touch "яяяяяяяяя яя яяяя яя яяяяяяяяяя яяяяяяяяя я яяяяяя я яяя яяяяяяяяя яяяяяяяяяяяяя яяяяяяяя я яяяяяяяяяяяяяяяяяя яяяяяя яя яяяяяя яяяяяяяяяяяяя яяяяяяяя яяяяя яяяяяя я яяя яяяяя яяя"

Получим странное

$ ls я*

яяяяяяяяя яя яяяя яя яяяяяяяяяя яяяяяяяяя я яяяяяя я яяя яяяяяяяяя яяяяяяяяяяяяя яяяяяяяя я яяяяяяяяяяяяяяяяяя яяяяяя яя яяяяяя яяяя#299CD031

Несмотря на заявляемые 255 знаков в кодировке UTF-16 (точно также в NTFS).
А если такой файл попробовать отредактировать, например с помощью vim, то после сохранения и выхода
:wq
файл исчезает.

Кстати, несмотря на то, что некоторые ФС поддерживают ещё более длинные имена, штатные утилиты linux, по всей вероятности, всё равно оперируют байтами и поэтому комманда touch мне стабильно выдавала ошибку: “File name too long”
Я, например, пробовал ReiserfFS под Ubuntu 12.04 LTS.

Возвращаясь к MacOs. Именно эту ошибку я поймал при попытке получить последние изменения из репозитория.
$ git svn rebase
First, rewinding head to replay your work on top of it...
error: cannot stat '$73_chars_4_deep_levels_path_with_spaces/$180_chars_file_name_with_spaces_too': File name too long
error: cannot stat '$73_chars_4_deep_levels_path_with_spaces/$180_chars_file_name_with_spaces_too': File name too long
error: cannot stat '$73_chars_4_deep_levels_path_with_spaces/$180_chars_file_name_with_spaces_too': File name too long
could not detach HEAD
rebase refs/remotes/git-svn: command returned error: 1

Первой моей идеей стало установить Windows внутри VirtualBox и там настроить Cygwin, т.к. в этой экосистеме файлы с длинными именами чувствуют себя вольготно.
Но, всё-таки, ОС внутри виртуальной машины - это довольно тяжелая штука в плане потребления ресурсов.
К тому же, Cygwin/MSysGit имеют и другие проблемы, с которыми приходится периодически бороться.

И, вот, после неудачи с Windows и Ubuntu, ко мне пришла идея попробовать создать образ диска с подходящей ФС средствами MacOS.

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

В комплекте с макосью идёт инструмент DiskUtility.
Где я для начала попробовал создать DMG-образы с NTFS.
Но, вероятно, имеющиеся у меня драйверы NTFS-3G и Tuxero, содержат ошибку.
В обоих случаях я получал до боли знакомый “File name too long”.

Удача меня ждала с ФС ExFat.



$ touch "яяяяяяяяя яя яяяя яя яяяяяяяяяя яяяяяяяяя я яяяяяя я яяя яяяяяяяяя яяяяяяяяяяяяя яяяяяяяя я яяяяяяяяяяяяяяяяяя яяяяяя яя яяяяяя яяяяяяяяяяяяя яяяяяяяя яяяяя яяяяяя я яяя яяяяя яяя"

И, ву-а-ля

$ ls я*

яяяяяяяяя яя яяяя яя яяяяяяяяяя яяяяяяяяя я яяяяяя я яяя яяяяяяяяя яяяяяяяяяяяяя яяяяяяяя я яяяяяяяяяяяяяяяяяя яяяяяя яя яяяяяя яяяяяяяяяяяяя яяяяяяяя яяяяя яяяяяя я яяя яяяяя яяя


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

Далее, можно почитать про Unicode в названиях файлов в HFS.

воскресенье, 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 не выгружаются, но при этом удаляются. То есть мы их теряем. Но у меня их мало и все бесполезные, потому не жалко.
Если вам ММС необходимы, то либо делайте предварительный бэкап другой программой, либо удаляйте смс вручную.