И ещё фотографии. Очень много фотографий. Очень много и все нравятся.















































































2013.02.26 02:34
Скажу страшное — сходил всего на полдня из пяти возможных. И то взял крайне неудачный объектив для этого дела и испортил всё что можно было испортить и не сфотографировал и пятой части того что был обязан. Обидно. Очень.
И тем не менее получилось много одинаковых прекрасных фотографий из которых нельзя выбрать те что хорошие так что тут будут просто фотографии (малая часть).
PS — какие же они все крутые! Завтра же пойду покупать себе фикс.
Но, сначала, моя лучшая фотография:

Ну и все остальные:















































































2013.02.26 02:34
У вас есть канон марк2 и вы не знаете как снимать плохо? Приходите, за небольшую плату я научу вас пользоваться советским мануальным объективом.
Сходил на чемпионат мира по велоспорту, ага.
2013.02.23 19:51
Истина один:
Когда меняешь sshd_config надо надо всегда держать +1 открытую сессию на сервер на всякий случай.
Истина два:
Когда пересобираешь генту надо всегда держать +1 открытую концоль под рутом на всякий случай.
2013.02.19 16:57
Телефон n9 он странный местами. Например, если выключить интернет то работает до трех дней от батарейки, а если включить — не всегда хватает на день. Ну, это логично и всё такое.
Вот некогда я рассказывал как мне рассказывали как сделать нормальный jabber в n9. Ну и всем хороший способ, но в какой-то момент, если много в жаббере общаться, телефон начинал сильно тупить и выедать батарейку за полдня. И греться при этом. И что самое смешное даже микрофон не всегда успевал принимать голос и было плохо слышно. Смешно :). Но если почистить хистори — всё становилось на свои места.
И вот, спустя год, свершилось страшное — перестала работать камера. А заметки перестали сохранять заметки. А хистори в браузере перестала работать. А между тем как телефон начинал звонить и звонок был на самом деле проходило секунд 40. Помер телефон.
Сначала грешил на почту. Удалил и не помогло. Потом грешил на жаббер. Удалил аккаунт и не помогло.
Потом снял бекап через встроенное стредство, плюнул и очистил телефон от скверны.
Итак весь бекап весли 243M, из них контакты занимали 179M. Интересно. В распакованном виде контакты занимали 505M что ещё интереснее. А дирректория “Root/home/user/.cache/telepathy/avatars/gabble/jabber/” 475M. Неплохо. Видно телефон пытался всё это честно загрузить в память.
Конечно можно было просто почистить эту дирректорию, но мне было интересно как же на самом деле работает этот бекап и вот работает он как-то плохо. А контакты так вообще синкаются через аккаунт в нокии. Но только телефоны, а вот контакты из скайпа и жаббера пропали. Они, конечно, легко восстанавливаются, но блин, их же опять все мержить прийдется. Ненависть x_x
После восстановления из бекапа пропала половина стандартных программ. Создал первую папку — а они все там сидят, ждут :).
В общем надо добавлять крон который будет читстиь кеш и не париться больше по этому поводу.
2013.02.18 22:54
И вот чудо пришло, в линуксах появилась возможность ИГРАТЬ! Магия просто, срочно ставить стим.
Сначала нужно добавить оверлей, для этого надо поставить пакет layman и в нем написать следущее: layman -a steam, после чего emerge steam-meta
Тут я сделаю отступление и скажу что оверлеи в генте это нечто божественное по своей красоте: кто-то создаёт просто svn/git/mercurial репозиторий, кидает туда файлы и это становится оверлеем. Никаких серверов для поддержания серверов которые будут поддерживать оверлеи, магически красиво сделано.
Так вот, есть оверлей со стимом от автора по имени Anyc. Несмотря на имя всё работает.
Но есть одна загвоздка: стим хочет pulseaudio, а гента, дай ей бог здоровья, не хочет ни pulseaudio, ни systemd поэтому стим пересобирает алсу с флагом pulse и, парам-пам-пам, у вас пропадает звук.
Для того чтобы его вернуть надо в /etc/pulse/system.pa вот такое:
### Automatically load driver modules depending on the hardware available .ifexists module-udev-detect.so load-module module-udev-detect .else ### Use the static hardware detection module (for systems that lack udev support) load-module module-detect .endif
Заменить на такое:
load-module module-alsa-sink
И потом под пользователем выполнить pulseaudio -k и всё, ваш любимый alsamixer снова будет показывать нормальный микшер, а звук вернется в плеер, и в стим, и вообще всё будет хорошо. Ну, кроме того что прийдётся теперь играть в игры. УИИИИИ.
2013.02.17 03:12
Внезапно вспомнил про игру Urban Dead, нашёл там свой аккаунт и удивился что я 35 уровень и даже состоял в клане. И, оказывается, двое из этого клана до сих пор играют. Но, пока я зомби, решил что буду убивать до тех пор пока меня не оживят, а там попробую в родной клан затесаться. Или буду ходить зомбёй убивать всех подряд. Пока не решил. Нерешителен. Сложно же решить.
Посмотрел ролики про игру DayZ, много смеялся, еле удержался от покупки:
2013.02.13 22:59
Есть у меня две переменные:
$a_error = array();
$a_neerror = array();
И есть у меня сложная логика, например есть некие “события”, у неких “событий” есть некий “тип” и мне надо учитывать сколько типов этих событий было успешно или нет. Страшной силы код:
if ( $status == 'ok' ) {
if ( !isset($a_neerror[$event->type]) ) {
$a_neerror[$event->type] = 0;
}
$a_neerror[$event->type]++;
}
И потом его ещё продублировать для ошибочного варианта. Сильно печалит меня дублирование кода и тут на помощь приходит “variable variable” (с таким названием и на помощь, ага), ну смысл в том что можно делать так:
$postfix = $status == 'ok' ? 'neerror' : 'error';
$var = "a_{$status}";
var_dump($$var);
И всё прекрасно работает, но стоит переписать предыдущий пример как:
$postfix = $status == 'ok' ? 'neerror' : 'error';
$var = "a_{$status}";
if ( !isset($$var[$event->type]) ) {
$$var[$event->type] = 0;
}
$$var[$event->type]++;
Как всё перестаёт работать потому что пхп считает что это я пытаюсь забрать символа под номером “$event->type” из строки $var и потом уже этот символ подставить как имя переменной. Но есть решение, Даже два:
$postfix = $status == 'ok' ? 'neerror' : 'error';
$var_temp = "a_{$postfix}";
$var = &$var_temp;
if ( !isset($var[$event->type]) ) {
$var[$event->type] = 0;
}
$var[$event->type]++;
Но ведь это некрасиво, лишняя переменная всё такое. Есть красивое решение:
$postfix = $status == 'ok' ? 'neerror' : 'error';
$var = "a_{$postfix}";
if ( !isset(${$var}[$event->type]) ) {
${$var}[$event->type] = 0;
}
${$var}[$event->type]++;
Или совсем красивое решение без введения лишних переменных:
$postfix = $status == 'ok' ? 'neerror' : 'error';
if ( !isset(${"a_{$postfix}"}[$event->type]) ) {
${"a_{$postfix}"}[$event->type] = 0;
}
${"a_{$postfix}"}[$event->type]++;
А вот сказать почему надо делать такую красоту? Потому что или так, ну чтобы красиво, или многострочный switch()/if() для выбора переменной, а вот так написать нельзя:
$postfix = $status == 'ok' ? &$a_neerror : &$a_error;
$postfix =& $status == 'ok' ? $a_neerror : $a_error;
Как после такого можно не любить пхп? А вот его надо любить потому что решение есть! Красиво и элегантное!!!
$postfix = $status == 'ok' ? 'neerror' : 'error';
$var = "a_{$postfix}";
$var = &$$var; // ЭТО ОНО!!!!
if ( !isset($var[$event->type]) ) {
$var[$event->type] = 0;
}
$var[$event->type]++;
И, внимание, я считаю это победа, но один благодарный читатель мне посоветовал не страдать хернёй и воспользоваться проверенным решением:
$stats = array('neerror'=>array(), 'error'=>array());
$var = &$stats[$status == 'ok' ? 'neerror' : 'error'];
if ( !isset($var[$event->type]) ) {
$var[$event->type] = 0;
}
$var[$event->type]++;
Тот же благодарный читатель сказал мне что я плохой неопытный недопрограммист и мой элегантный пример можно переписать короче:
$postfix = $status == 'ok' ? 'neerror' : 'error';
$var = &${"a_{$postfix}"}; // Вот так
if ( !isset($var[$event->type]) ) {
$var[$event->type] = 0;
}
$var[$event->type]++;
Но я не знаю, мне так не хочется терять красивую конструкцию “$var = &$$var;”… Как же быть?
2013.02.13 20:25
Некоторое время назад я начал задуматься о смене ноутбука. Ну, чтобы быстрее, легче, меньше и лучше (по некоторым из параметров, конечно же), но ведь, буду честен, и мой текущий ноутбук не слишком тяжёл, достаточно быстр и, по некоторым из параметров, даже лучше чем потенциальный приемник. Учитывая же его принадлежность к славному роду ThinkPad’ов он счёл недостойным на меня обижаться и продолжает работать так будто бы я прямо с него не искал ему замену. Как будто ничего не произошло.
Но, совсем недавно, он начал бить меня током из firewire порта. Я этим портом никогда не пользовался и знать не знаю зачем он нужен, но током он меня бить начал исправно. Несильно, но зато часто. Терпел я недели две и сегодня, наконец, заклеил порт куском изоленты.
Удар я, получается, успешно парировал. Что же будет дальше?
2013.01.30 15:11
И третий пост подряд (сразу видно что я мало того что появился на работе, а даже открыл редактор!)
Сериализация в пхп работет быстро, но нечестно — при ансериализации сеттеры повторно не срабатывают.
class FRIENDSHIP_IS_MAGIC
{
private $Applejack;
public function __set ( $key, $value )
{
if ( $key != 'Applejack' ) {
die ("Only Applejack you bastard!\n");
}
if ( $value != '<3' ) {
die ("No love -- no runtime!\n");
}
$this->Applejack = $value;
}
public function __get ( $key )
{
if ( $key != 'Applejack' ) {
die ("Only Applejack you bastard!\n");
}
return $this->Applejack;
}
}
$pony = new FRIENDSHIP_IS_MAGIC();
$pony->Applejack = '<3'; // I LOVE YOU!
var_dump($pony->Applejack); // string(2) "<3"
$packed_pony = serialize($pony);
$packed_pony = str_replace('s:2:"<3"', 'b:0', $packed_pony); // BLACK MAGIC
$pony = unserialize($packed_pony);
var_dump($pony->Applejack); // bool(false) -- WHERE IS MY LOVE ???
Конечно же тут я делают str_replace(), но в реальной жизни оно вполне себе может быть так что сначала засериализовали объект, сохранили в базу, а потом сеттер изменили и он уже валидирует иначе. Это беда на самом деле, прийдётся прикручивать какой-нибудь костыль.
2013.01.29 00:47
Вот в прошлом посте я осуждал сериализацию в пхп. Зачем я это делал? А вот я сейчас расскажу.
По науке если у класса есть некая переменная то она должна быть приватной, а обращаться к ней нужно через сеттер и геттер. Ну, чтобы там проверочьки, пыщ-пыщ, всё такое. А я вот такой волшебный человек и хочу заиспользовать магические методы __set() и __get() для этого:
class FRIENDSHIP_IS_MAGIC
{
public $PinkiePie;
private $Applejack;
public function __set ( $key, $value )
{
if ( strlen($value) == 0 ) {
return 42;
}
$this->$key = $value;
}
public function __get ( $key )
{
return $this->$key;
}
}
$pony = new FRIENDSHIP_IS_MAGIC();
var_dump($pony->Applejack = ''); // string(0) ""
var_dump($pony->Applejack); // NULL
var_dump($pony->Applejack = '<3'); // string(2) "<3"
var_dump($pony->Applejack); // string(2)
var_dump($pony->PinkiePie); // NULL
var_dump($pony->PinkiePie = ''); // string(0) ""
var_dump($pony->PinkiePie); // string(0) ""
Нет, ну это, конечно, очевидно что не каждый будет любить Applejack, а Pinky Pie личность сомнительного карактера. Но несмотря на то что в документации написано “__set() is run when writing data to inaccessible properties.” меня это раздражает. Какого чёрта. Не нравится мне такая логика.
Так вот почему я осуждал: чтобы сеттер срабатывал мне надо было сделать область видимости отличной от публичной и вполне логично было бы сделать её приватной, но не всё так просто %).
PS: я тут перечитал и ничего не понял. Смысл поста в том что если переменная публичная, то сеттер не сработает.
2013.01.28 21:26
Иногда бывает так что длина сериализованных данных не безразлична. Например, когда надо сохранить много объектов, но не хочется терять удобство всяких там сеттеров и геттеров сохраняя просто в stdClass или массив. И уж тем более не хочется мутить костыли с сохранением в массив, сериализацией, а потом обратным восстановлением и проходом по всем ключам массива с воссозданием нужного объекта. Но пхп не перестаёт удивлять :(.
Сериализуем объект с публичными переменными:
class C_PUBLIC
{
public $var1 = 1;
public $var2 = 2;
public $var3 = 3;
}
var_dump(serialize(new C_PUBLIC()));
// string(64) "O:8:"C_PUBLIC":3:{s:4:"var1";i:1;s:4:"var2";i:2;s:4:"var3";i:3;}"
64 символа, по сути тот же массив, только что имя класса указывается. Ок.
Сериализуем с защищёнными переменными:
class C_PROTECTED
{
protected $var1 = 1;
protected $var2 = 2;
protected $var3 = 3;
}
var_dump(serialize(new C_PROTECTED()));
// string(77) "O:11:"C_PROTECTED":3:{s:7:"*var1";i:1;s:7:"*var2";i:2;s:7:"*var3";i:3;}"
77 символов. Добавилось три звёздочки (по одной на переменную) и изменилось имя класса. Ну и почему-то внутри уже s:7 а не s:4. Ну да ладно.
Сериализуем с приватными переменными:
class C_PRIVATE
{
private $var1 = 1;
private $var2 = 2;
private $var3 = 3;
}
var_dump(serialize(new C_PRIVATE()));
//string(101) "O:9:"C_PRIVATE":3:{s:15:"C_PRIVATEvar1";i:1;s:15:"C_PRIVATEvar2";i:2;s:15:"C_PRIVATEvar3";i:3;}"
101 символ. LOLWUT?
Очень удивился когда вместо 193 символов с protected я получил 432 с private. Неожиданно. Поленились ребята немного доработать сериализацию.
2013.01.28 20:38
Голоса в моим интернетах порассказали мне про то что некоторые вещи бывают идеальными. Например, оказывается, я отказывался в это верить, существует идеальная собака.
Такого пса приручить — уже жизнь прожита не зря. А обнять такую тушу так вообще задохнуться можно от радости. Хороший пёс, красивый.
2013.01.26 14:11
hshhhhh@blog % whoami hshhhhh hshhhhh@blog % blog post list 1. Окно в европу 2. Про стим и доту 2 3. Про пхп и тяжёлые наркотики 4. Про ручки 5. Про прекрасный шрифт 6. Испытание аналоговой параметрики 7. Про гуглотранслейт 8. Про забавное 9 . Про время 10. Про переименование файлов 11. Про велосипед и зиму 12. yeahconsole 13. Cassandra DB 14. Про работу и ещё про ненависть hshhhhh@blog % blog post new Title: Пост консоль, рекурсию и мечту Text: Есть некоторые вещи которые в хроме, всё же, сделаны плохо из-за их стремления следовать стандартам, например они убрали поддержку
2013.01.24 01:57
Работа находится по адр. ул Светланская 72 г. Владивосток. Идея заключается в использовании элементов фасада и силуэта здания и включении этих элементов в композицию. Окна, трубы, пристройки, дверные проемы и тротуарные фонари стали частью небольшой европейской деревни.Визуальная структура работы базируется на воспроизведении единства градостроительных решений таких городов как Прага,Брюгге, Старый Дубровник.
Я в шоке. Смотреть смотреть смотреть.
2013.01.24 01:18