yuchimiriのブログ

ぺちぱーです。

『Facebook発 新プログラミング言語「Hack」スタートアップガイド』でHackをはじめてみた

ご無沙汰してます。@yuchimiriです。元気です。

先日、技術評論社からプログラミング言語 Hack のスタートアップガイドが発売されました。

世界初の解説書となるこちらを大変ありがたいことにご恵贈いただいたので、簡単にですが感想など書いてみたいと思います。ブログってものすごく久しぶりなんだけど、どういうふうに書いてたっけ〜ドキドキするなー!

Hackとは?

Hackは、PHPと互換性のあるHHVMFacebookが開発しているPHP用のJITコンパイラ)向けのプログラミング言語です。
2014年3月20日にオープンソースとして公開されました。

こちらの本はHackの公開後、なんと1週間足らずで執筆されたらしいです。感服の一言。

全体を通しての感想

約90ページに渡り、Hack言語についての簡単な紹介と、インストール手順(Ubuntu環境)からPHP→HHVMへの移行手順まで、幅広い内容がコンパクトに纏められていて非常にわかりやすかったです。
中身は主にシンプルなサンプルコードを用いた説明で構成されていて、実際に手を動かしながら自然に覚えることができました。
また、普段PHPを触っているとあまり馴染みのないGenericsや、Collection、Override Attributeなどの機能についての解説も盛り込まれていてHackの特徴がつかめる一冊になっています。

Hackを触ってみての感想

PHPとほぼ変わらない構文で組むことができるので、かなりとっつきやすい印象です。
一方で、エラーチェックのための静的な型付けなどの機能を兼ね備えていて、PHPぽいのになんだか安心感のある不思議な言語だなと思いました。

ためしてみた

紹介されているサンプルコードは半日で試せるくらいの量になってます。入門にはぴったりですね。
以下は色々触ってみたログになりますのでおまけ的に。

まず1章を参考に、HHVMを動かしてみます。
手元の環境がDebian7だったので公式wikiを参考にDebian7の手順でインストールしました。
Debian7だとビルド済みのパッケージでインストールできたので、震えるほど楽ちんです。

wget -O - http://dl.hhvm.com/conf/hhvm.gpg.key | sudo apt-key add -
echo deb http://dl.hhvm.com/debian wheezy main | sudo tee /etc/apt/sources.list.d/hhvm.list
sudo apt-get update
sudo apt-get install hhvm

インストールが環境したら hhvm --version コマンドを叩いてバージョンをチェックします。

yuchimiri@xxxxx:~$ hhvm --version
HipHop VM 3.0.1 (rel)
Compiler: tags/HHVM-3.0.1-0-g97c0ac06000e060376fdac4a7970e954e77900d6
Repo schema: a1146d49c5ba0d6db903beb3a4ed8a3766fef182

現在のバージョンは3.0.1になってました。

HHVMの実行方法はCLIでファイル指定デーモンモードで起動する2種類があるらしいですが、とりあえず簡単そうなのでCLIで試してみます。
ちなみに実行時に -m debug という引数を指定するとhphpdというデバッガが起動して、ステップ実行とか出来ました。便利。

yuchimiri@xxxxx:~/work/hack$ hhvm -m debug test.hh
Welcome to HipHop Debugger!
Type "help" or "?" for a complete list of commands.

Program test.hh loaded. Type '[r]un' or '[c]ontinue' to go.
hphpd> break test()
break test()
Breakpoint 1 set upon entering test()
But wont break until function test has been loaded.
hphpd> step
step
Break on line 7 of /home/yuchimiri/work/hack/test.hh
   6
   7*test();
   8 (END)

hphpd> step
step
Breakpoint 1 reached at test() on line 3 of /home/yuchimiri/work/hack/test.hh
   2 function test(): void {
   3*    $hoge = 'hoge';
   4     echo $hoge;

hphpd> step
step
Break at test() on line 4 of /home/yuchimiri/work/hack/test.hh
   3     $hoge = 'hoge';
   4*    echo $hoge;
   5 }

hphpd> step
step
hogeBreak at test() on line 5 of /home/yuchimiri/work/hack/test.hh
   4     echo $hoge;
   5*}
   6

hphpd> step
step
Break on line 7 of /home/yuchimiri/work/hack/test.hh
   6
   7*test();
   8 (END)

hphpd> quit
quit

2章はHack言語で特徴的な構文について紹介されていて、静的型付け、null許容、Generics、Collection等について理解を深めることが出来ました。

3章はHackで書いた簡単なプログラムをブラウザで出力するという内容でした。
Webサーバはnginx使ったけど、これも簡単に設定できて試せたので楽しかった!
f:id:yuchimiri:20140403000126p:plain
HHVMで動作してると、phpinfo();HipHopって出力されるんだって。

実際に動いているPHPコードをHHVMで動かしてみるのもやってみたいなー。

[Symfony]カスタムバリデータで特定のフィールドに対してエラーメッセージを設定する

カスタムバリデータ作った時、エラーメッセージが特定のフィールドじゃなくてフォーム全体に対して設定されて困った。


特定のフィールドに対して設定するにはPropertyPathを書き換えてaddViolationでエラーを追加すればばよいらしい...

// isValid()の中で
$propertyPath = $this->context->getPropertyPath();                                  
$this->context->setPropertyPath($propertyPath .'.'. $constraint->field);
$this->context->addViolation($constraint->message, $params, $invalidValue);

あとこのあとreturn false;とかするとフォーム全体に対してエラー判定がかかってしまって、空エラーみたいのが入ったりするので注意

Symfony2でカスタムバリデータを作る3ステップ

こんにちはyuchimiriです。

このブログはSymfony Advent Calendar JP 2011 8日目の記事です。
昨日の担当はmadapajaさんでした。


去年のAdvent Calendarでは「SymfonyEventDispatcher→Symfony2(PR4)EventDispatcherの変更点」という記事を書いたのですが、今年はもう少し実践的なものを書きたいな…ということでSymfony2でのカスタムバリデータの作成方法についてご紹介します。


Symfony2では、Symfony\Component\Validator\ConstraintクラスとSymfony\Component\Validator\ConstraintValidatorクラスを拡張して独自のバリデータを作ることができます。


今回は簡単な例として、テキストエリアに改行区切りで入力された文字列がすべて日付であることをチェックするバリデータを4ステップで作ってみます。
(フォームなどは既に用意してある前提です。)


1. 任意のディレクトリ内に、Symfony\Component\Validator\Constraintクラスを継承した制約クラスを作成
vi src/Acme/DemoBundle/Validator/DatesCollection.php

<?php

namespace Acme\DemoBundle\Validator;

use Symfony\Component\Validator\Constraint;

/**
 * Date collection.
 *
 */
class DateCollection extends Constraint
{
    public $emptyMessage = '入力は必須です';
    public $message = '日付でないものが含まれています';
}


3. Symfony\Component\Validator\ConstraintValidatorクラスを継承したバリデーションクラスを作成

vi src/Acme/DemoBundle/Validator/DatesCollectionValidator.php

<?php

namespace Acme\DemoBundle\Validator;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
use Symfony\Component\Validator\Constraints\Date;
use Symfony\Component\Validator\Constraints\DateValidator;
use Symfony\Component\Validator\Exception\UnexpectedTypeException;

/**
 * Date collection validator.
 *
 */
class DateCollectionValidator extends ConstraintValidator
{
    /**
     * {@inheritDoc}
     */
    public function isValid($value, Constraint $constraint)
    {

        $dates = array_filter(array_map('trim', explode("\n", $value)));

        if (count($dates) < 1) {
            $this->setMessage($constraint->emptyMessage);

            return false;
        }

        $dateConstraint = new Date(array('message' => $constraint->message));
        $dateValidator = new DateValidator($this->context);

        foreach ($dates as $date) {
            if (false === $dateValidator->isValid(str_replace('/', '-', $date), $dateConstraint)) {
                $this->setMessage($dateValidator->getMessageTemplate(), $dateValidator->getMessageParameters());

                return false;
            }
        }

        return true;
    }
}


3. 作成した制約クラスを使うように、validation.ymlに設定
vi src/Acme/DemoBundle/Resources/config/validation.yml

namespaces:
    Demo: Acme\DemoBundle\Validator\

Acme\DemoBundle\Data\Dates:
    properties:
        dates:
            - Demo:DateCollection: ~

Symfonyはここで設定した制約クラス(DateCollection)を見て、「制約クラス名+Validator」という名前のクラスを探し、その中のisValid()メソッドを使ってバリデーションを行います。


ちょっと複雑なバリデーションをしたいときでも簡単に作れそうですね。


明日のAdventCallendarは@Kiskeさんです。

ハンドルネームの決め方

みなさんは自分のハンドルネーム、どうやって決めましたか?

最近「yuchimiri(ゆちみり)」というハンドルネームの由来についてよく聞かれます。


私が最初にこの名前を使ったのは確か高校生の頃...


友だちに誘われて某携帯ゲームのサイトに登録することにしたんですが、そこで使うニックネームが必要になりました。

最初は本名の「ゆき」をもじって「ゆち」にしようとしたんですが、そこでふと「ここに機種依存文字入れたらどうなるんだろう」と思って名前の後に「㍉」という文字を入れてみることにしました。(無事登録できました)


「ゆち」+「㍉」=「ゆち㍉」


こうして「ゆちみり」という名前が生まれました(どーん
一歩間違えてたら「ゆち㍍」とか「ゆち㌭」になっていたかもしれないですね!


当時はこの名前で呼ばれる日が来るなんて考えもしなかったのですが、今となってはインターネット上で「私」を表す唯一の名前なので大切にしていきたいなと思っています(*^_^*)


ちなみに人からは「ゆち」とか「ゆちみり(ちゃん)」とか「ゆっち」とか呼ばれることが多いです。好きに呼んでください(^Q^)


それにしても当時の私は、その携帯ゲームを実際に作ってる人と数年後友達になってるとか思いもしなかっただろうなー。
そう考えると感慨深いものがありますね。


みんなのHNの由来も知りたいな〜!



余談ですが一般の人にハンドルネームって言っても通じないので「はんどるねーむって何?」って聞かれたら「源氏名のことだよ!」って教えてあげることにしてます。