А ещё про сериализацию

И третий пост подряд (сразу видно что я мало того что появился на работе, а даже открыл редактор!)

Сериализация в пхп работет быстро, но нечестно — при ансериализации сеттеры повторно не срабатывают.

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 г. Владивосток. Идея заключается в использовании элементов фасада и силуэта здания и включении этих элементов в композицию. Окна, трубы, пристройки, дверные проемы и тротуарные фонари стали частью небольшой европейской деревни.Визуальная структура работы базируется на воспроизведении единства градостроительных решений таких городов как Прага,Брюгге, Старый Дубровник.

Я в шоке. Смотреть смотреть смотреть.

1_Custom

2_Custom

3_Custom

2013.01.24 01:18

Про стим и доту 2

Мне тут стим сделал приятное и дал 10 (десять!!!) копий второй доты, говорит чтобы я дарил друзьям и нёс радость. Никому не надо? Не знаю что с ними теперь делать.

Только, говорит, в Китай дарить эти копии нельзя, так что извините мои дорогие китайские товарищи, вам не смогу подарить :(.

2013.01.21 00:24

Про пхп и тяжёлые наркотики

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

Например, можно присвоить некой переменной анонимную функцию, положить её в массив и вызвать. А вот положить её в свойство объекта её положить уже нельзя:

$f = function($a) { return 5 + $a; }; // Не забываем везде ставить ; !!!!!11
var_dump(gettype($f)); // string(6) "object"
var_dump($f(5)); // int(10)

$a = array($f);
var_dump(gettype($a)); // string(5) "array"
var_dump(gettype($a[0])); // string(6) "object"
var_dump($a[0](5)); // int(10)

$o = new stdClass();
$o->f = $f;
var_dump(gettype($o)); // string(6) "object"
var_dump(gettype($o->f)); // string(6) "object"
var_dump($o->f(5)); // Fatal error: Call to undefined method stdClass::f()

Но данное ограничение легко обходится простым, прости-боже за такие слова, снипплетом:

var_dump(call_user_func(function($object_vars, $var_name, $param) { return $object_vars[$var_name]($param); }, get_object_vars($o), 'f', 5)); // int(10)

2013.01.21 00:04

Про ручки

Одно из больших разочарований связанных с моей текущей жизнью — полное отсутствие необходимости писать. 99,9(9)% текста я набираю на клавиатуре и практически не пишу. Нет, я не люблю писать, мне не очень нравится, но я безумно люблю чернильные ручки. Но чернильной ручкой нельзя пользоваться раз в месяц.

Нашёл прекрасное в этом блоге (и вообще могу его порекомендовать):

1000w

1000w_1

1000w_2

1000w_3

2013.01.20 15:06

Про прекрасный шрифт

Нашёл прекрасный, чудесный, божественный шрифт. Одним богам понятно как мне нравится, но они (боги) злы — в шрифте, конечно же, нет (внимание, глубокие познания в предмете) киррилической гарнитуры. Печаль.

1350012363-chrome-os_x

2013.01.16 08:54

Испытание аналоговой параметрики

Я, правда, не понимаю что хотели донести до меня и что я доношу до вас, мои глубокоуважаемые читатели (все полтора), но это прекрасно.

Испытание аналоговой параметрики. Делается моментально, смысловые показатели зашкаливают. Участники и тьюторы в восторге. Опыта вагон.

GIP_azgur1

Отсюда вот: http://monogroup.by/archives/11412

2013.01.14 18:32

Про гуглотранслейт

Внезапно узнал что с гуглотранслейтом можно общаться через жаббер, а жаббер нынче есть у каждого приличного человека. Это нынче и в фейсбуке, и в гуглотолке, и, прости боже, даже в контакте есть. Так что если добавить к себе в ростер контакт типа en2ru@bot.talk.google.com и написать ему “hello”, то он ответит “привет”. Не добавит, конечно, еще 27 вариантов перевода, но тоже очень приятный функционал.

Языков понимает много:

You can send a chat to these bots to get your messages translated:

Languages
Bots
Arabic – English ar2en en2ar
Bulgarian – English bg2en en2bg
Czech – English cs2en en2cs
Danish – English da2en en2da
German – English de2en en2de
German – French de2fr fr2de
Greek – English el2en en2el
Spanish – English es2en en2es
Finnish – English fi2en en2fi
French – English fr2en en2fr
Hindi – English hi2en en2hi
Croatian – English hr2en en2hr
Italian – English it2en en2it
Japanese – English ja2en en2ja
Korean – English ko2en en2ko
Dutch – English nl2en en2nl
Norwegian – English no2en en2no
Polish – English pl2en en2pl
Portuguese – English pt2en en2pt
Romanian – English ro2en en2ro
Russian – English ru2en en2ru
Swedish – English sv2en en2sv
Chinese – English zh2en en2zh
Traditional Chinese – English zh-hant2en en2zh-hant
Traditional Chinese – Chinese zh-hant2zh> zh2zh-hant

* don’t forget to add @bot.talk.google.com.

Ссылка один и ссылка два

2013.01.14 01:22

Про забавное

Самое забавное что я видел за эту неделю это как пользователь макбука запускает midnight commander и пользуется им как файл менеджером. Так мило :).

2013.01.10 00:47

Про время

Где-то примерно в эти дни пять лет назад я устроился работать пхп-программистом. Пять лет. ПЯТЬ ЛЕТ! Ох.

2013.01.03 22:09

Про переименование файлов

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

Вот сегодняшнего дня, кхм, купил на одном известном ресурсе сериал. Чтобы покупать сериал было удобнее каждая серия лежит в .rar архиве, а он в свою очередь разбит на 50 частей. То есть структура такая:

serial-name -> season number -> episod number -> .rar

По понятной причине ходить и распаковывать мне лень поэтому замест меня это делает такая команда:

find . -name '*rar' -exec unrar x {} \;

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

Когда оно всё же соберётся в видеофайлы я начинаю понимать что надо всё переименовывать, для этого мне пришлось поставить пакет под названием “dev-perl/rename”. Это известный в интернетах скрипт для переименовывания по регэкспу и кое где он идёт как просто rename, у меня же была какая-то дрянь по умолчанию. Переименовал все эпизоды первого сезона так:

perl-rename 's/(serial-name.s01\d{2}).*/$1.avi/g' *avi
perl-rename 's/(serial-name.s01\d{2}).*/$1.srt/g' *srt

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

2013.01.02 04:24