Столкнулся с тем, что Bash-скрипт не хочет преобразовывать символ "\n" в символ перевода строки. Команда
rettpop@host$ echo "Line1\nLine2"
Line1\nLine2
так и выводится.
Оказалось, что в заголовке скрипта исполнителем прописан имеено Bash:
#!/bin/bash
Заменил эту строку на
#!/bin/sh
и все стало на свои места.
rettpop@host$ echo "Line1\nLine2"
Line1
Line2
Вообще, рекомендуется в шелл-скриптах *x-систем указывать исполнителем именно /bin/sh, т.к. это в основном символическая ссылка на оболочку по-умолчанию. Пруф-линк не приведу, но мои предпочтения подтверждались в старинных манускриптах по Юниксу.
25 июл. 2012 г.
17 июл. 2012 г.
Mac OS: встроенный словарь
Открыл для себя встроенный в Mac OS словарь. Словари - вообще очень полезное изобретение человечества. А встроенные в оконный менеджер - вообще архиполезная вещь. В условиях изучения инородного языка с постоянным чтением статей на нем я предпочитаю пользовать толкователь. Только в крайних случаях пользую перевод слов. Сабж в этом очень помогает.
Словарь позволяет настраивать себя, добавлять и отключать словари. По умолчанию используются 3 словаря: Новый оксфордский толковый словарь, Оксфордский американский тезаурус и словарь от Википедии. Но есть варианты добавления словарей.
3 июл. 2012 г.
Программистский боян
Сказка старая, но от этого не менее актуальная (взято на просторах ФИДО):
Русский, Китайцы, Канадец и индус
Любой русский программист, после пары минут чтения кода, обязательно вскочит и произнесет, обращаясь к себе: переписать это все нафиг. Потом в нем шевельнется сомнение в том, сколько времени это займет, и остаток дня русский программист потратит на то, что будет доказывать самому себе, что это только кажется, что переписать это много работы. А если взяться и посидеть немного, то все получится. Зато код будет красивый и правильный. Hа следующее утро русский программист свеж, доволен собой и без единой запинки докладывает начальству, что переписать этот кусок займет один день, не больше. Да, не больше. Hу, в крайнем случае, два, если учесть все риски. В итоге начальство даст ему неделю и через полгода процесс будет успешно завершен. До той поры, пока этот код не увидит другой русский программист.
А в это время, в соседних четырех кубиках, будет ни на секунду не утихать работа китайских программистов, непостижимым образом умудряющихся прийти раньше русского программиста, уйти позже, и при этом сделать примерно втрое меньше. Эта четверка давно не пишет ничего нового, а только поддерживает код, написанный в свое время индусом, и дважды переписанный двумя разными русскими. В этом коде не просто живут баги. Здесь их гнездо. Это гнездо постоянно воспроизводит себя при помощи любимой китайской технологии реиспользования кода - copy/paste. Отсюда баги расползаются в разные стороны посредством статических переменных и переменных, переданных по ссылке (ведь, китайский программист не может смириться с неудобствами вызванными тем, что он не может изменить значение внешнего параметра). Вспоминая об этих переменных и ссылках, русский программист, как правило, на время теряет дар английской речи, и переходит к какой-то помеси русского и китайского. Он давно мечтает переписать весь кусок, над которым работают китайцы, но у него нет времени. Он уже переписывает два больших куска, и доказал начальству необходимость переписать третий. Кроме того, русский программист боится обидеть китайцев. Они могут решить, что он пытается вытеснить их с работы. К слову сказать, напрасно боится, поскольку китайцы уже так решили.
Hа китайцах висят серьезные баги, о которых знает начальство и постоянно их торопит. Китайцы уважают начальство и потому перевешивают баги друг на друга очень торопливо. Они знают, что все попытки починить приведут к появлению новых багов, еще худших. И в этом они правы. Разобраться в том, в каком порядке меняются статические переменные, и как приобретают свои значения, способен только один человек на фирме - индус. Hо он пребывает в медитации. Поэтому, когда всю четверку уволят во время сокращения... А кого еще увольнять? Русский - еще не переписал свой кусок, а индус - главная ценность фирмы - он редко обращает внимание на проект, но когда обращает, все понимают, что так как он, архитектуру никто не знает. Так вот, когда китайцев увольняют, у их кода возможны две основные судьбы. Первая - он попадет к русским, и его перепишут. Вторая - он попадет к местному, канадскому программисту.
О, канадский программист это особый тип. Он, ни на минуту не задумываясь, как рыцарь без страха и упрека, бросится фиксить самый свирепый баг китайского кода. Этот Баг живет там уже три года, и китайцы уже четырежды (каждый по разу) сообщали начальству, что он пофиксен. Hо Баг каждый раз возвращался, как Бетмен в свой Готхем. Итак, канадский программист, воспитанный на героической патетике американского футбола - бросаться в бой головой вперед, сделает то, чего китайцы не рисковали делать в течении трех долгих лет. Он, при помощи дебагера, отследит место, где статическая переменная приняла значение -1 вместо правильного 0, и решительным движением заведет рядом вторую переменную с правильным значением. Баг погибнет в неравной схватке с героем. Hо победа будет достигнута тяжелой ценой. Работать перестанет все, включая только что переписанный русским программистом код. Это повергнет русского программиста в задумчивость на целых два дня, после чего он сделает, в общем-то, предсказуемый вывод о том, что дизайн с самого начала был неправильным, и все надо переписать. Hа это нам нужна неделя. Да, неделя, не больше. Канадский программист смело бросится налаживать все, и станет еще хуже, хотя казалось бы... Эта суета выведет из медитации индуса, который придумает и вовсе гениальное решение - отбранчить код. Согласно его плану, мы теперь будем поддерживать две версии одного и того же кода - одну работающую, но с Багом, другую без Бага, но не работающую. Русский программист, услышав об этом плане, сломает линейку об стол и обзовет жену дурой, но на митинге возразить не решится.
К счастью, все это не сильно влияет на дела фирмы, поскольку продукт продается и так. Поэтому менеджмент ходит в целом довольный и не устает напоминать всем, что они отобраны как лучшие среди лучших. И что мы давно доказали свою способность выпускать продукт тем, что выпускаем его иногда.
Русский, Китайцы, Канадец и индус
Любой русский программист, после пары минут чтения кода, обязательно вскочит и произнесет, обращаясь к себе: переписать это все нафиг. Потом в нем шевельнется сомнение в том, сколько времени это займет, и остаток дня русский программист потратит на то, что будет доказывать самому себе, что это только кажется, что переписать это много работы. А если взяться и посидеть немного, то все получится. Зато код будет красивый и правильный. Hа следующее утро русский программист свеж, доволен собой и без единой запинки докладывает начальству, что переписать этот кусок займет один день, не больше. Да, не больше. Hу, в крайнем случае, два, если учесть все риски. В итоге начальство даст ему неделю и через полгода процесс будет успешно завершен. До той поры, пока этот код не увидит другой русский программист.
А в это время, в соседних четырех кубиках, будет ни на секунду не утихать работа китайских программистов, непостижимым образом умудряющихся прийти раньше русского программиста, уйти позже, и при этом сделать примерно втрое меньше. Эта четверка давно не пишет ничего нового, а только поддерживает код, написанный в свое время индусом, и дважды переписанный двумя разными русскими. В этом коде не просто живут баги. Здесь их гнездо. Это гнездо постоянно воспроизводит себя при помощи любимой китайской технологии реиспользования кода - copy/paste. Отсюда баги расползаются в разные стороны посредством статических переменных и переменных, переданных по ссылке (ведь, китайский программист не может смириться с неудобствами вызванными тем, что он не может изменить значение внешнего параметра). Вспоминая об этих переменных и ссылках, русский программист, как правило, на время теряет дар английской речи, и переходит к какой-то помеси русского и китайского. Он давно мечтает переписать весь кусок, над которым работают китайцы, но у него нет времени. Он уже переписывает два больших куска, и доказал начальству необходимость переписать третий. Кроме того, русский программист боится обидеть китайцев. Они могут решить, что он пытается вытеснить их с работы. К слову сказать, напрасно боится, поскольку китайцы уже так решили.
Hа китайцах висят серьезные баги, о которых знает начальство и постоянно их торопит. Китайцы уважают начальство и потому перевешивают баги друг на друга очень торопливо. Они знают, что все попытки починить приведут к появлению новых багов, еще худших. И в этом они правы. Разобраться в том, в каком порядке меняются статические переменные, и как приобретают свои значения, способен только один человек на фирме - индус. Hо он пребывает в медитации. Поэтому, когда всю четверку уволят во время сокращения... А кого еще увольнять? Русский - еще не переписал свой кусок, а индус - главная ценность фирмы - он редко обращает внимание на проект, но когда обращает, все понимают, что так как он, архитектуру никто не знает. Так вот, когда китайцев увольняют, у их кода возможны две основные судьбы. Первая - он попадет к русским, и его перепишут. Вторая - он попадет к местному, канадскому программисту.
О, канадский программист это особый тип. Он, ни на минуту не задумываясь, как рыцарь без страха и упрека, бросится фиксить самый свирепый баг китайского кода. Этот Баг живет там уже три года, и китайцы уже четырежды (каждый по разу) сообщали начальству, что он пофиксен. Hо Баг каждый раз возвращался, как Бетмен в свой Готхем. Итак, канадский программист, воспитанный на героической патетике американского футбола - бросаться в бой головой вперед, сделает то, чего китайцы не рисковали делать в течении трех долгих лет. Он, при помощи дебагера, отследит место, где статическая переменная приняла значение -1 вместо правильного 0, и решительным движением заведет рядом вторую переменную с правильным значением. Баг погибнет в неравной схватке с героем. Hо победа будет достигнута тяжелой ценой. Работать перестанет все, включая только что переписанный русским программистом код. Это повергнет русского программиста в задумчивость на целых два дня, после чего он сделает, в общем-то, предсказуемый вывод о том, что дизайн с самого начала был неправильным, и все надо переписать. Hа это нам нужна неделя. Да, неделя, не больше. Канадский программист смело бросится налаживать все, и станет еще хуже, хотя казалось бы... Эта суета выведет из медитации индуса, который придумает и вовсе гениальное решение - отбранчить код. Согласно его плану, мы теперь будем поддерживать две версии одного и того же кода - одну работающую, но с Багом, другую без Бага, но не работающую. Русский программист, услышав об этом плане, сломает линейку об стол и обзовет жену дурой, но на митинге возразить не решится.
К счастью, все это не сильно влияет на дела фирмы, поскольку продукт продается и так. Поэтому менеджмент ходит в целом довольный и не устает напоминать всем, что они отобраны как лучшие среди лучших. И что мы давно доказали свою способность выпускать продукт тем, что выпускаем его иногда.
29 июн. 2012 г.
Tips and tricks in Xcode.
Дорвался до видео с WWDC 2012. Видео бесплатны, в хорошем качестве, с субтитрами. Но и без субтитров все понятно - язык технический. Первое из-за чего проспал на работу - сессия по советам работы с Xcode (про Delphi и Visual Studio умолчали).
Выступали три инженера. Лиц на видео не показывали, поэтому выдержана ли была политкорректность - не знаю. Но два голоса были мужские и один, кажется, женский. Описывались три схемы работы с IDE: однооконная, с несколькими закладками и многооконная. Хинты, показанные на сессии удобны для всех схем работы. Главный тезис, звучавший сквозь всю сессию, - хоткеи, хоткеи и еще раз автоматизация!
ИтаГ, какие хоткеи я вынес для себя из просмотра видео:
На другом видео рассказывали про навороченность работы Xcode с системами контроля версий - SVN и Git. Работа с репозиториями находится в соответствующем разделе Organizer. Commit, Add и проче команды находятся в меню File/Source Control. Режимы просмотра логов, конфликтов и merging-а переключаются в правом верхнем наборе пиктограмок. Внизу навигатора проекта имеется пиктограммка с хинтом "Show only files with source-control status". Она заставляет навигатор показывать только те файлы, которые каким-то образом отмечены в рабочей версии - A, M, C и т.д. Инструменты для работы с контролем версий довольно стандартны и ничего нового про них рассказать не получится. Но сделаны они с умом. Таймлайн для SVN я первый раз увидел тут. До сих пор видел его только в перфорсе.
Очень понравился трик, не относящийся, однако, напрямую к Xcode. Это вариант использования Automator. Xcode, как любое Cocoa-приложение работает с ним, как с родным. Точнее, он с Xcode. Записал видюшку с примером.
ИтаГ, какие хоткеи я вынес для себя из просмотра видео:
- Cmd+Shift+{ напару с Cmd+Shift+} - переключение между закладками приложения (я и раньше эти хоткеи пользовал, но пришлись к столу)
- Ctrl-Cmd-E - позволяет редактировать идентификатор, на котором установлен текстовый курсор, одновременно со всеми его упоминания в его области видимости (функция, цикл, блок...).
- Cmd-J - открывает декоративное окошко выбора панели IDE, в которое нужно поместить фокус ввода. В принципе, есть комбинация Cmd-Opt-., которая переключает циклично этот фокус по панелям окна, но про нее почему-то скромно умолчали

- Мышинный Opt-Click или клавиатурный Cmd-Ctrl-Shift-/ - отобразить всплывающую подсказку по объекту клика. Причем не просто тип, а довольно объемный талмуд
- Cmd-Option-[ - переместить текущую строку текста вниз
- Cmd-Option-] - переместить текущую строку текста вверх (этих двух я сам нашел - иногда полезно)
- Cmd-Shift-O - удобная фича (почти мега-) быстрый поиск идентификатора сквозняком по проекту во всплывающем окошке. После выбора подходящей строки Return открывает соответствующий файл в текущем окне редактора, Opt-Return открывает декоративное окошко, в котором можно выбрать куда поместить файл, Opt-Shift-Return открывает файл во второстепенном редакторе (вертикальное окно рядом с основным).

- Cmd-Opt-Return - открывает файл объявления идентификатора над текстовом курсором во второстепенном редакторе
- Cmd-Return - закрывает окно второстепенного редактора.
- Cmd+Opt+Click (Cmd-Ctrl-Opt-J) - открывает объявление идентификатора в главном редакторе
- Cmd+Opt+2Click - открывает объявление идентификатора в новом окне. Вообще, двойной клик в Xcode в основном приводит к открытию нового окна
- Cmd-T - дублирует текущую закладку в новую со всеми текущими настройками
- Cmd-E - поместить выделенный текст в поле поиска (и в окне редактора, и в окне навигатора проекта). При этом выделенный текст уже считается результатом поиска и можно использовать следующую комбинацию:
- Cmd-G - перемещаться между результатами поиска в текущем окне
- Opt-Return в форме поиска в окне редактора - замена в выделенном тексте
- Двойной клик по скобке выделяет содержимое всего блока внотри пары скобок
- Комментарии, предваренные текстом TODO: и FIXME: работают так же, как #pragma mark, то бишь отображаются в списке методов вверху окна редактора
- При открытом списке этих самых методов можно вводить текст, который будет фильтровать список.
- Cmd-Ctrl-D - отобразить словарную карточку слова над текстовым курсором. Имена сущностей должны соответствовать их назначению и писаться орфографически правильно. Фишка эта общекокошная, но и в Xcode ее игнорировать не стоит.
- Cmd-Ctrl-Down - открыть counterpart (связанный с текущим файл - заголовок или имплементацию)
- Cmd-Shift-J - отбразить текущий файл в Project Navigator.
На другом видео рассказывали про навороченность работы Xcode с системами контроля версий - SVN и Git. Работа с репозиториями находится в соответствующем разделе Organizer. Commit, Add и проче команды находятся в меню File/Source Control. Режимы просмотра логов, конфликтов и merging-а переключаются в правом верхнем наборе пиктограмок. Внизу навигатора проекта имеется пиктограммка с хинтом "Show only files with source-control status". Она заставляет навигатор показывать только те файлы, которые каким-то образом отмечены в рабочей версии - A, M, C и т.д. Инструменты для работы с контролем версий довольно стандартны и ничего нового про них рассказать не получится. Но сделаны они с умом. Таймлайн для SVN я первый раз увидел тут. До сих пор видел его только в перфорсе.
Очень понравился трик, не относящийся, однако, напрямую к Xcode. Это вариант использования Automator. Xcode, как любое Cocoa-приложение работает с ним, как с родным. Точнее, он с Xcode. Записал видюшку с примером.
28 июн. 2012 г.
Менеджер буфера обмена для Mac OS
Недавно нашел и начал успешную эксплуатацию на маке бесплатной программки ClipMenu. Функционал примерно соответствует упоминавшейся ранее утилите для MS Windows Clip Cache. Есть средства автоматизации, отображение списка сохраненных блоков в виде меню с подменюшками, настройка горячих клавиш для отображения меню, кастомизация действий по сохранению, запоминанию и прочим нужным событиям. В общем, программа достаточно удобна и настраиваема. Учитывая функционал и бесплатность - рекомендую.
Кадр из фильма "My Cousin Vinny"
Пересматривал на днях один из своих любимых фильмов "Мой кузен Винни". Обратил внимание на номер автомобиля этого самого Винни. Возникла мысль, что и здесь без русских не обошлось :)
26 июн. 2012 г.
22 июн. 2012 г.
Команды vimdiff
Логичным продолжением поста о связке svn diff с vimdiff стало использование автором самого vimdiff :) Так как vimdiff - это просто алиас для запуска vim в режиме сверки (ключ -d), то и команды работают все те же, что и в обычном режиме vim. Но несколько есть дополнительных (схема именования команд соответствует общей схеме, принятой в vim):
Список не полон. Но для начала и вполне комфортной работы его хватает. Но и не стоит забывать про .vimrc, в котором можно перенастроить все под себя.
- ctrl+w ctrl+w - switch windows (переключениями между окнами/буферами)
- do - diff obtain (принять вариант текущего блока отличий из соседнего окна)
- dp - diff put (перенести вариант блока отличий из текущего окна в соседнее)
- [c - previous difference (перейти к предыдущему блоку отличий)
- ]c - next difference (перейти к следующему блоку отличий)
- :diffu[pdate] - diff update (произвести повторное сравнение файлов - если вдруг в ходе сложных изменений вывод отличий пополз)
- zo - open ZAfolded text (развернуть блок текста)
- zc - close ZAfolded text (свернуть блок текста)
Список не полон. Но для начала и вполне комфортной работы его хватает. Но и не стоит забывать про .vimrc, в котором можно перенастроить все под себя.
17 июн. 2012 г.
SVN + Apache + Nginx. Ошибка коммита изображений
После переезда на новый хостинг столкнулся с тем, что SVN не хочет коммитить файлы изображений (jpg, png, etc). Выдает примерно такие ошибки:
Adding (bin) icon57x57.jpg svn: Commit failed (details follow): svn: Server sent unexpected return value (405 Not Allowed) in response to PROPFIND request for '/svn/!svn/wrk/6ec81701-d224-4232-851b-23f6d87b9e06/Bzzzer2/icon57x57.jpg' svn: Server sent unexpected return value (405 Not Allowed) in response to PROPFIND request for '/svn/Bzzzer2/icon57x57.jpg'Оказалось, что на сервере установлен Nginx, который и мешает загрузке картинок на сервер. Остальные файлы он игнорирует, ибо они не относятся к вебу - проекты Objective-C и C++. Для исправления этого положения нужно внести директорию репозитория в список игнорируемых Nginx-ом путей. Делается это в разделе
location ~* ^/(awstats/|webmail/|phpmyadmin/|server-status/|backups/|svn/) {^M
proxy_pass http://80.91.191.246:8080;^M
proxy_redirect http://sapisoft.com:8080/ /;^M
proxy_set_header Host $host;^M
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;^M
proxy_set_header X-Real-IP $remote_addr;^M
}^M
соответствующего файла конфигурации соответствующего хоста, например
/etc/nginx/vhosts/yourhost.com.cfg
Кодоперлы.
И такое бывает %)
function TRePolSng.Event_On(ticks: cardinal): boolean; begin ... // ACHTUNG!!! не сломайте моск =) FNRZ_EKVIVAL := ( not Power )and( Power ); ... end;
8 июн. 2012 г.
Простая шифровка коротких чисел
Что обычный сознательный анонимус делает, когда у него появляется кредитка с 4-х символьным пин-кодом? Запоминает код. Что он делает, когда появляется вторая кредитка? Пытается запомнить код и не спутать его с предыдущим. А когда пятая кредитка? И 2 сим-карты с пинкодами. Записывает! Имхо, это нормально. В жизни много вещей, которые нужно запомнить. И с десяток-другой вариаций чисел запомнить можно. Но не сразу, а после нескольких раз использования. А ежели забудешь через час? Лучше все-таки записать.
Но записанное может попасть другому анонимусу на глаза. Блокнот останется на столе, потеряется, смартфон с записями украдут, файло с компа стырят... Полно вариантов распространения этих записей. Есть решение - использовать сервисы или программки для хранения паролей и, в том числе, ПИН-кодов. Программки ровно так же подвержены пропаже с кражей/потерей гаджета. Онлайн-сервисы находятся в сети под пристальным надзором гипотетических взломщиков. То бишь, шансов на публикацию записей тоже немало.
Есть вариант чуть-чуть облегчить напряжение в своей нервной системе. Записывать коды там, где хочется (желательно, конечно, подальше от чужих глаз и рук), но используя при этом хотя бы примитивную схему шифроввания записей. Хорошо, ежели схема придумана самим владельцем записей. Но и готовые варианты подойдут.
Случайным образом формируем последовательность цифр:
3654388932
Каждая 2-я цифра будет соответствовать каждой следующей цифре пинкода:
3151318132
В этом случае нужно запомнить только 1 число - периодичность цифр пинкода.
Например, случайным образом формируем последовательность цифр - чем длинее, тем лучше:
6781324590
С позиции 3 каждая 2-я цифра будет соответствовать каждой следующей цифре пинкода:
6781314191
Сложность шифровки можно наращивать. Например, использовать многострочный шифр:
запоминаем те же цифры 3 и 2, которые означают, что в строке 3 следующего массива на 2-й позиции будет указана позиция, начиная с которой в следующей строке каждая третья цифра будет соответствовать каждой следующей цифре пинкода
315657862154614
115648769321475
245467987321332 - 3-я строка, содержащая в позиции 2 номер символа в следующей строке, начиная с которой каждая третья цифра соответствует цифре пинкода
15449176154125145
Приведенные методы довольно ограничены в применении и не являются вселенски-устойчивыми к дешифровке. Однако для хранения пин-кодов они вполне подойдут. Вариант брутфорса не подойдет, ибо обычно на третьей-четвертой попытке объект взлома заблокируется. И для хранения в голове двух цифр и алгоритма расшифровки не нужно ни IQ > 50, ни специального программно-аппаратного обеспечения. А при определенном уровне овладения алгоритмом его можно использовать и для записи паролей.
Но записанное может попасть другому анонимусу на глаза. Блокнот останется на столе, потеряется, смартфон с записями украдут, файло с компа стырят... Полно вариантов распространения этих записей. Есть решение - использовать сервисы или программки для хранения паролей и, в том числе, ПИН-кодов. Программки ровно так же подвержены пропаже с кражей/потерей гаджета. Онлайн-сервисы находятся в сети под пристальным надзором гипотетических взломщиков. То бишь, шансов на публикацию записей тоже немало.
Есть вариант чуть-чуть облегчить напряжение в своей нервной системе. Записывать коды там, где хочется (желательно, конечно, подальше от чужих глаз и рук), но используя при этом хотя бы примитивную схему шифроввания записей. Хорошо, ежели схема придумана самим владельцем записей. Но и готовые варианты подойдут.
Один из вариантов
Записывать случайный набор цифр любой длины. В этом наборе с определенной периодичностью записывать цифры сохраняемого кода. Например, имеем пинкод 1111.Случайным образом формируем последовательность цифр:
3654388932
Каждая 2-я цифра будет соответствовать каждой следующей цифре пинкода:
3151318132
В этом случае нужно запомнить только 1 число - периодичность цифр пинкода.
Чуть более сложный вариант
К предыдущему варианту добавляем запомненную позицию, с которой начинаются цифры пинкода.Например, случайным образом формируем последовательность цифр - чем длинее, тем лучше:
6781324590
С позиции 3 каждая 2-я цифра будет соответствовать каждой следующей цифре пинкода:
6781314191
Сложность шифровки можно наращивать. Например, использовать многострочный шифр:
запоминаем те же цифры 3 и 2, которые означают, что в строке 3 следующего массива на 2-й позиции будет указана позиция, начиная с которой в следующей строке каждая третья цифра будет соответствовать каждой следующей цифре пинкода
315657862154614
115648769321475
245467987321332 - 3-я строка, содержащая в позиции 2 номер символа в следующей строке, начиная с которой каждая третья цифра соответствует цифре пинкода
15449176154125145
Приведенные методы довольно ограничены в применении и не являются вселенски-устойчивыми к дешифровке. Однако для хранения пин-кодов они вполне подойдут. Вариант брутфорса не подойдет, ибо обычно на третьей-четвертой попытке объект взлома заблокируется. И для хранения в голове двух цифр и алгоритма расшифровки не нужно ни IQ > 50, ни специального программно-аппаратного обеспечения. А при определенном уровне овладения алгоритмом его можно использовать и для записи паролей.
6 июн. 2012 г.
*x. svn + vimdiff = тру!
Небольшое описание настройки SVN с тем, чтобы дефолтным менеджером сравнения использовался трушный vimdiff (специальный режим работы vim). У SVN есть команда diff, которая сравнивает указанный файл с его предыдущими ревизиями - по умолчанию с предыдущей. И, опять-таки по умолчанию, она выводит список различий в довольно таки неудобочитаемом формате. Для использования внешнего менеджера различий нужно указать в командной строке модификатор --diff-cmd <команда запуска менеджера>, либо прописать <команда запуска менеджера> в файле ~/.subversion/config в параметре diff-cmd. Но не все так просто. SVN в дополнение к именам файлов передает менеджеру еще 5 параметров. При брутальном указании vimdiff он начинает ругаться на несуществующие файлы и отсутствующие команды. Для обхода этого используем unix-way - скрипты. Итаг:
1. создаем следующий файл bash-скрипта:
2. Далее в файле ~/.subversion/config добавляем/заменяем строку:
Ну и в принципе все. Делаем
1. создаем следующий файл bash-скрипта:
#!/bin/sh
# Configure your favorite diff program here.
VIMDIFFCMD="/usr/bin/vimdiff"
# Subversion provides the paths we need as the sixth and seventh
# parameters.
LEFT=${6}
RIGHT=${7}
# Call the diff command (change the following line to make sense for your merge program).
$VIMDIFFCMD "$LEFT" "$RIGHT"
называем его как-то типа svndiff.sh, устанавливаем права доступа для выполнения
chmod +x svndiff.shи кладем где-то в $PATH - можно в домашней директории, можно в /usr/local/bin - куда руки дотянутся.
2. Далее в файле ~/.subversion/config добавляем/заменяем строку:
diff-cmd = svndiff.sh
Ну и в принципе все. Делаем
svn diff <filename>и пользуемся правильными инструментами.
4 июн. 2012 г.
23 мая 2012 г.
15 мая 2012 г.
Captcha выходит на улицы? :)
Известно, что широко используемый сервис reCaptcha помимо своей прямой функции - проверки принадлежности пользователя к марке Хомо модели Сапиенс - используется для корректировки неразборчивых мест оцифровываемой бумажной литературы (как по мне, идея гениальная - утилизация пары мозговых сигналов пользователя на распознавание 5-6 букв при заявленном выхлопе в 100 млн показов в сутки является прямо таки атомной электростанцией рядом с ручным фонариком). А вот сегодня мне попалась капча с, насколько я понимаю, снимком номера дома. Оказывается, Google решил не ограничиваться печатной прессой, но и напрячь пользователя распознаванием снимков улиц. Согласно заметки с Софтпедии (которая, кстати, [заметка] появилась на многх новостных сайтах одновременно 30-го марта сего года) получаемая информация должна будет использоваться для улучшения сервиса карт - уточнение номеров домов, дорожных знаков, надписей на заборах и т.д. Пока фича работает в тестовом режиме и возникает на голубых экранах только изредка. После отладки фичи наступит скайнет.
10 мая 2012 г.
Linux. Многопоточный консольный download-клиент. Part 2.
В продолжение поста Linux. Многопоточный консольный download-клиент. Наткнулся на фриварный консольный менеджер закачек aria2. Утилита проста в использовании, но очень мощна. Поддерживаются http/https, ftp, torrent, magnet, etc. Поддерживается многопоточность, разнообразная детализация отображения процесса, докачка. В принципе - все, что нужно.
8 мая 2012 г.
Mac OS. Смена IP-адреса и других свойств принтера
В Mac OS интуитивно сделано только добавление принтера. Как ни странно. Замена IP-адреса и других свойств принтеров делается только через их удаление. Но можно обойтись и Unix-way :). Достаточно отредактировать любимым vim файлик /etc/cups/printers.conf.
4 мая 2012 г.
25 апр. 2012 г.
Продолжение облаков
В продолжение поста про Google Drive и иже с ним. Свалилась сегодня в спам реклама Comodo Online Storage. Предлагают те же 5GB, тот же клиент, криптование файлов и вселенское счастье. Увеличение объема - за деньги. Или за счет рефералов - но до 10GB. Напомню, что у Comodo основная сфера деятельности - безопасность, сертификаты безопасности, шифрование и прочие параноидальноориентированные продукты. Поэтому хочется верить, что безопасность сервиса достаточно велика.
Интересная история с самим письмецом. Письмо прислано с адреса comodogroup.info. Клик на картинке ведет на адрес домена http://securespecialty.com (заметьте - http, не https). Это сразу насторожило. Головной страницы сайта нету. https сайт не поддерживает. robtex.com показал, что сайт хостится рядом с кучей (около сотни) других сайтов, к Comodo никакого отношения не имеющих. Начал копать далее. comodogroup.info вообще открывает дефолтную страницу Apache под CentOs.
На всякий случай отписался в саппорт ccloud.com (Comodo Cloud). Ответа пока не получил - их это самодеятельность или нигерийских облаководов.
Очередные облачные 5GB - теперь от Google Drive
Вчера стартанул долгожданный сервис Гугла Google Drive. Долго его как-то ждали, много говорили... Уже успели появиться DropBox, Box.Com, SkyDrive. На днях стартовал Яндекс.Диск. А его все небыло и небыло. Прям как Duke Nukem Forever, аднака. И вот его зарелизили. У Яндекса, кстати, я так заметил, появилась тенденция опережать своего коллегу. До этого все яндексовские сервисы выходили после появления аналогичных у Гугла. А маршруты и пробки на своих картах они таки сделали раньше. И вот Яндекс.Диск успели на пару дней раньше открыть. Что мешало Гуглу запустить сервис раньше - загадка. Хотя может это связано с вылизыванием облаков? И Амазон, и Майкрософт в погоне за первенство запуска своих облачных серверов допускали критичные промахи в архитектуре и падали из-за каких-то глупостей. Возможно Гугловцы учитывали опыт коллег и спешно вносили изменения.
Немного о самом сервисе. Ничего сверхнового в нем я не увидел. Толчка от бомбы, которая взорвалась в свое время с помощью GMail и Google Maps, я не ощутил. До этого успели сдетонировать Dropbox с его 2GB, прокачиваемыми до 16GB; а за ним - Box.Com (в девичестве Box.Net) с его 50GB (ежели залогиниться в свою учетку с яблочного девайса :) ); а за ними и SkyDrive с 25GB.
Логично, что диск объединен с Google Docs и все документы автоматически перенесены в область этого диска. Сразу предлагают скачать нативную утилиту а-ля Dropbox для синхронизации файлов на локальном диске и на сервере. Я сперва поставил, но посмотрел, что оно будет тянуть все мои документы на диск и стопорнул ее. Благо, имеется возможность указать из какой конкретно ветки дерева документов будет вестись синхронизация. Решил сделать отдельную папочку Disk в вебинтерфейсе. Потом подумал, что для локальной синхронизации мне пока достаточно и Dropbox и выгрузил утилиту. Хотя польза от этой схемы (синхронизация локальных и облачных данных) конечно есть. Несмотря на все технологии, интернеты и 21-е века на дворе все может рухнуть в один момент из-за маски-шоу, пьяного тракториста, изменения сетки тарифных планов провайдера услуги и т.д. Но в подобных случаях у пользователя останутся его локальные файлы, которые можно будет (и нужно) залить на болвань, как в старые добрые времена, и поставить храниться в облако в шкафу.
В отличие от остальных сервисов Google Drive дает только одну бесплатную плюшку - 5GB. Увеличение объема - только за деньги. Возможности увеличить лимит за счет рефералов или каких-то других манипуляций не декларируется.
Один из плюсов сервиса - Google API для сторонних приложений. Теперь для них появилась возможность манипуляции с относительно большими объемами данных.
В общем, поздравим себя! Жить стало легче, жить стало веселей!
Открытым остается вопрос надежности и долговечности всего этого облачного хозяйства. Точек отказа становится гораздо больше. Все равно более или менее важные данные нужно хранить на твердом носителе. А еще лучше на двух. Про приватность тут говорить уже как-то и не приходится - ежели только самоорганизовать себя и пихать в облака только закриптованные файлы. И в связи с этим, прихожу к выводу, что хранить в облках можно не самые секретные и жизненно важные данные. Обязательно иметь резервную твердую копию. Использовать сервисы для кратковременной передачи данных не рассчитывая на их надежное сохранение.
Немного о самом сервисе. Ничего сверхнового в нем я не увидел. Толчка от бомбы, которая взорвалась в свое время с помощью GMail и Google Maps, я не ощутил. До этого успели сдетонировать Dropbox с его 2GB, прокачиваемыми до 16GB; а за ним - Box.Com (в девичестве Box.Net) с его 50GB (ежели залогиниться в свою учетку с яблочного девайса :) ); а за ними и SkyDrive с 25GB.
Логично, что диск объединен с Google Docs и все документы автоматически перенесены в область этого диска. Сразу предлагают скачать нативную утилиту а-ля Dropbox для синхронизации файлов на локальном диске и на сервере. Я сперва поставил, но посмотрел, что оно будет тянуть все мои документы на диск и стопорнул ее. Благо, имеется возможность указать из какой конкретно ветки дерева документов будет вестись синхронизация. Решил сделать отдельную папочку Disk в вебинтерфейсе. Потом подумал, что для локальной синхронизации мне пока достаточно и Dropbox и выгрузил утилиту. Хотя польза от этой схемы (синхронизация локальных и облачных данных) конечно есть. Несмотря на все технологии, интернеты и 21-е века на дворе все может рухнуть в один момент из-за маски-шоу, пьяного тракториста, изменения сетки тарифных планов провайдера услуги и т.д. Но в подобных случаях у пользователя останутся его локальные файлы, которые можно будет (и нужно) залить на болвань, как в старые добрые времена, и поставить храниться в облако в шкафу.
В отличие от остальных сервисов Google Drive дает только одну бесплатную плюшку - 5GB. Увеличение объема - только за деньги. Возможности увеличить лимит за счет рефералов или каких-то других манипуляций не декларируется.
Один из плюсов сервиса - Google API для сторонних приложений. Теперь для них появилась возможность манипуляции с относительно большими объемами данных.
В общем, поздравим себя! Жить стало легче, жить стало веселей!
Открытым остается вопрос надежности и долговечности всего этого облачного хозяйства. Точек отказа становится гораздо больше. Все равно более или менее важные данные нужно хранить на твердом носителе. А еще лучше на двух. Про приватность тут говорить уже как-то и не приходится - ежели только самоорганизовать себя и пихать в облака только закриптованные файлы. И в связи с этим, прихожу к выводу, что хранить в облках можно не самые секретные и жизненно важные данные. Обязательно иметь резервную твердую копию. Использовать сервисы для кратковременной передачи данных не рассчитывая на их надежное сохранение.
19 апр. 2012 г.
C++. Объявление метода класса с указанием имени класса
Наткнулся вот на такое объявление класса, из-за которого gcc не захотел собирать проект:
То бишь, при объявлении метода указывается квалификатор класса. Расследование показало, что старые и некоторые новые компиляторы поддерживают такую устаревшую нотацию (кстати, ни разу не встречал упоминания про такой метод объявления -- откуда он взялся -- пока не выяснил). Поэтому этот же код собирается в MS Visual Studio вплоть до 2010 версии. Сановский cc: Sun C 5.9 2010/08/11 тоже код пропустил. Однако имеющийся gcc v4.1.2 отказался собирать код со следующей ошибкой:
Четкого объяснения я не нашел. На форумах пишут только про то, что где-то оно компилится, где-то нет. В пункте "Extra qualification of members" этой страницы есть небольшое описание этой ошибки. Но никаких ссылок на документацию. Ежели есть какая-то информация по этому поводу, поделитесь, плз.
class A
{
public:
void A::B();
}
void A::B()
{
return;
}
То бишь, при объявлении метода указывается квалификатор класса. Расследование показало, что старые и некоторые новые компиляторы поддерживают такую устаревшую нотацию (кстати, ни разу не встречал упоминания про такой метод объявления -- откуда он взялся -- пока не выяснил). Поэтому этот же код собирается в MS Visual Studio вплоть до 2010 версии. Сановский cc: Sun C 5.9 2010/08/11 тоже код пропустил. Однако имеющийся gcc v4.1.2 отказался собирать код со следующей ошибкой:
error: extra qualification ‘A::’ on member ‘B’
Четкого объяснения я не нашел. На форумах пишут только про то, что где-то оно компилится, где-то нет. В пункте "Extra qualification of members" этой страницы есть небольшое описание этой ошибки. Но никаких ссылок на документацию. Ежели есть какая-то информация по этому поводу, поделитесь, плз.
13 апр. 2012 г.
Перлы форматирования кода. Продолжение.
Субж. В продолжение поста "Перл форматирвоания кода"


...
3169 {
3170 if ( m_signSymbol == MINUSSIGN ) sNum.insert( 0, "-" ) ;
3171 else if ( m_signSymbol == CREDIT ) sNum.insert( 0, "CR" ) ;
3172 else AddParentheses( sNum ) ;
3173 return true ;
3174 }
...
13 мар. 2012 г.
iPad-макет
Набросал себе макет (mockup) iPad-а для планирования интерфейса программ. SVG-файл сделан в InkScape и прилагается. Мелкая сетка соответствует 8 пикселям, большая — 64-м. Download here.6 мар. 2012 г.
Перл форматирвоания кода
26 февр. 2012 г.
Wilhelm Richard Wagner – Der Weg in Walghal
Наткнулся в интернете, что основная музыкальная тема к небезызвестному (и я считаю обязательному к просмотру всем начиная с 10 лет) фильму "Реквием по мечте" пренадлежит Вагнеру нашему Ричарду под названием "Путь в Вальхаллу" из якобы оперы "Валькирия". Наткнулся во ВКонтакте, в YouTube, и еще на нескольких музыкальных ресурсах. Рванул было найти оригинал. Но оказалось, что Вагнер к этому произведению не прикасался. А композитором сего, по нонешним меркам мощного произведения, является наш современник, автор музыкальных тем для нескольких довольно известных и местами даже культовых фильмов, Клинт Мэнселл.
25 февр. 2012 г.
Шутка Apple

Вот только что обратил внимание на пиктограмку, которой Finder (обозреватель локального диска) в OS Lion в сетевом окружении отмечает компьютеры с установленной OS Windows. На ней отображается ЭЛТ-монитор с BSOD-экраном сообщения о критической ошибке Windows'9x. Шутка над конкурентами, надо полагать.
13 февр. 2012 г.
12 февр. 2012 г.
iOS. Objective-C. Удаление содержимого вьюшки
Однострочник для удаления всех дочерних представлений (view) из родительского.
[[parentView subviews] makeObjectsPerformSelector:@selector(removeFromSuperview)];
10 февр. 2012 г.
Linux. Многопоточный консольный download-клиент
Стандартным дефакто ftp/http download-клиентом для *x систем является wget. Но у него отсутствует одна важная фича (которая, впрочем, с утолщением клиентских интернет-каналов постепенно нивелируется) - многопоточная загрузка файлов. Если толщина клиентского канала больше, чем отдает сервер, можно попробовать ускорить закачку используя несколько потоков. Тут на выручку приходит Axel Download Accelerator - последователь идеологии KISS и продолжатель функций wget. Он умеет создавать указанное количество потоков закачки (ежели, конечно, сервер такое позволяет). И дополнительные плюшки в виде индикации процесса, поиска зеркал, и прочих.
В Ubuntu он ставится через apt. Предполагаю, что для rpm-репозиториев тоже есть сборки. Ну, и сборку из сорцов еще тоже никто не отменял.
В Ubuntu он ставится через apt. Предполагаю, что для rpm-репозиториев тоже есть сборки. Ну, и сборку из сорцов еще тоже никто не отменял.
6 февр. 2012 г.
И снова я миллионер :)
3 февр. 2012 г.
Linux. Однострочники
Сделать что-то с файлами в текущей директории:
for f in *; do {do_any_command_with_} $f; {do_one_more_command_with_} $f; {do_one_extra_command_with_} $f; done
И вариант с циклом по конечной последовательности индексов:
for ((i=1;i<=10;++i)); do echo $i; done
28 янв. 2012 г.
Mac OS. AC3 модуль для QuickTime
Столкнулся под макосью с отказом в воспроизведении avi-файлов со звуковым треком в формате Dolby AC3 8192. Ситуацию спас модуль Perian для QuickTime.
27 янв. 2012 г.
Баг на гугле
23 янв. 2012 г.
6 янв. 2012 г.
WinScreener 1.0.0.7 released
Обновил граббер окон WinScreener до версии 1.0.0.7. Изменения:1. Добавился ключ /debug, по которому программа ведет простой отладочный лог.
2. Добавилась дефолтная горячая комбинация клавиш для открытия/сокрытия окна программы Win-Alt-Space.
2. Добавился ключ /nohotkey для отключения дефолтной горячей комбинации клавиш.
Напомню, что WinScreener представляет из себя простой граббер указанного окна, позволяющий наблюдать за содержимым окна даже когда оно перекрыто другими окнами. Очень удобно в условиях отсутствия второго монитора (а может и при его наличии) для наблюдения за каким-то долгим процессом.
26 дек. 2011 г.
Очередные перлы работодателей
23 дек. 2011 г.
Перлы из спама
Пришло сегодня рекламное письмецо. Правда гугель его не отфильтровал, но предполагаю для того лишь, чтобы читатель улыбнулся лишний раз. Сообщение от АН "Альфа Нерухом" ("Альфа Недвижим" по-русски). Предлагают заглянуть на свой сайт an-alfa.at.ua. Зашел на их сайт только из любопытства - что же там за АНАЛфа творится!? Сайт более напоминает содержимое того же АНАЛфа, но домен порадовал.
13 дек. 2011 г.
GIMP. Продолжение
С удивлением узнал, что GIMP имеет версии старше 2.6. Но на сайте ссылку для скачивания так и не нашел. Точнее, там есть ссылка на версию 2.7.4 в исходниках. Но для Windows есть только 2.6 stable. Ан оказывается, что энтузиасты собирают новые версии GIMP и для Windows. Они не официальные, но по внешнему виду и не отличишь. Вот тут имеется свежая - 2.7.4 - версия для Windows. Там же есть и portable-сборка.Главные ожидаемые изменения - группировка слоев и однооконный интерфейс. Наверняка их больше, но я пользую не очень активно, поэтому всех не знаю.
26 нояб. 2011 г.
4 нояб. 2011 г.
3 нояб. 2011 г.
Мысль
При рассмотрении предложений работодателей (в частности айтишных компаний) у нас, как у рядовых сотрудников есть довольно уникальный шанс получения обьективной информации о возможном работодателе - прошедший (верю и надеюсь) кризис показал кто как себя повел в критической ситуации. Кто-то сокращал рабочие места, кто-то урезал зарплату. Кто-то пытался компенсировать трудности какими-то бонусами. И эта информация дает нам возможность строить свои ожидания и планировать взаимоотношение с работодателем.
Еще одно докозательство того, что чем больше инь, тем бльше ян. Если судьба приподносит тебе лимон, сделай из него лимонад!
Еще одно докозательство того, что чем больше инь, тем бльше ян. Если судьба приподносит тебе лимон, сделай из него лимонад!
24 окт. 2011 г.
Апплет управления Java отсутствует в Control Panel Windows x64
После установки Java 1.6 решил проконтролировать процесс установки автообновлений. На сайте написано, что корректировка свойств Java должна производиться через апплет панели управения системы. Но в Control Panel я этого апплета не нашел. Поиск по инету сазал, что не я один задался этим вопросом. Бага была замечена еще в 2008 году и до сих пор не пофикшена. Воспроизводится на 64-разрядных Windows-системах.
Однако решение есть. Панель управления Java открывается с помощью файлика
"c:\Program Files (x86)\Java\jre6\bin\javacpl.exe"
Однако решение есть. Панель управления Java открывается с помощью файлика
"c:\Program Files (x86)\Java\jre6\bin\javacpl.exe"
14 окт. 2011 г.
5 окт. 2011 г.
Очередной online-конвертер документации
Возникла необходимость сконвертировать под макосью DJVU в PDF. Ставить ради двух файликов отдельную софтину для просмотра DJVU не хотелось. Недолгие поиски привели к онлайн-конвертору всего-во-всё DocsPal. Сервис прост, удобен и кросплатформенен. Рекомендую.UPD: Сегодня конвертнул через этот сервис доковский файл со вставленными уравнениями от MS Equation. Сконвертировал!
17 сент. 2011 г.
Objectice C. iOS. Cчитать содержимое текстового файла из ресурсов
Понадобилось считать содержимое текстового файла из ресурсов в проекта для iOS. 2 дня потратил. Весь интернет полон примерами типа
И, блин, ни одна свол... ни один автор не додумывается написать, что это не то, что XCode пишет в свойствах файла, помещенного в ресурсы. А на самом деле это расширение файла. То бишь, = @"readme", а = @"txt"! Ну кто бы мог подумать, что XCode не может сама разложить (хотя зачем ей это нужно?! - ума не приложу) имя файла на, собсна, имя и расширение.
Я зол.
NSString* filePath = [[NSBundle mainBundle] pathForResource:ofType: ];
NSString *str = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:NULL];
[someView setText:str];
И, блин, ни одна свол... ни один автор не додумывается написать, что
Я зол.
25 авг. 2011 г.
Ловушка в C++
Вот, наткнулся на такую ловушку:
Такая конструкция в отличие от
позволяет не "дергать" постоянно массив на предмет его размера. Оптимизатор возможно запомнит это значение при первом обращении, но не факт.
Однако ежели вместо int i = 0; по неосмотрительности возникнет uint i = 0;, то цикл превратится в вечный. i никогда не станет меньше 0.
for (int i = array.getSize()-1; i >= 0; --i)
{
//do something
}
Такая конструкция в отличие от
for (int i = 0; i < array.getSize()-1; ++i)
позволяет не "дергать" постоянно массив на предмет его размера. Оптимизатор возможно запомнит это значение при первом обращении, но не факт.
Однако ежели вместо int i = 0; по неосмотрительности возникнет uint i = 0;, то цикл превратится в вечный. i никогда не станет меньше 0.
19 авг. 2011 г.
Подписаться на:
Сообщения (Atom)



















