SlideShare a Scribd company logo
1 of 41
Download to read offline
Hack/HHVM 入門
2014/05/02 社内勉強会資料 1
はじめに
Hack とは?
◦ プログラミング言語である
◦ Facebook が作った
HHVM とは?
◦ Hack プログラムを実行する VM である
$ /usr/bin/hhvm hello.hh
Hello, world!
2014/05/02 社内勉強会資料 2
Hack はどんな言語?
PHP の言語拡張
◦ 型アノテーション
◦ ジェネリクス
◦ Null許容型
◦ コンテナ型
◦ etc.
したがって PHP のプログラムは Hack のプログラムでもある
$ /usr/bin/hhvm hello.php
Hello, world!
2014/05/02 社内勉強会資料 3
今日の話
HHVM を使う
◦ Yet another PHP interpreter として
プログラミング言語 Hack
2014/05/02 社内勉強会資料 4
HHVM を使う
2014/05/02 社内勉強会資料 5
メリットは?
2014/05/02 社内勉強会資料 6
速い
ベンチマーク
2014/05/02 社内勉強会資料 7
17.93
14.00
20.19
15.81
15.10
12.54
13.77
10.64
2.16
14.13
1.92
2.21
9.37
7.72
2.81
5.45
#N/A
10.53
5.70
2.48
0
5
10
15
20
25
PHP と HHVM の実行時間の比較 [秒]
PHP HHVM
The Computer Language Benchmarks Game
http://benchmarksgame.alioth.debian.org/
各問題の PHP 最速コードを利用
インストール手順
Ubuntu Server 13.10
◦ Hack のウェブサイトの情報どおり
◦ 現時点では素直に Ubuntu を使うのがオススメ
◦ Debian でも大丈夫だろうと思うが試していない
CentOS 6.5
◦ 試したが上手くいかなかった
◦ CentOS のパッケージが古すぎる
◦ 公式から入れようとしたら binutils のバージョン違いを解決できなかった
◦ hop5 という野良リポジトリから一応は入ったが Apache と連携できず
Windows / Macintosh / その他
◦ 試していない
2014/05/02 社内勉強会資料 8
Ubuntu Server 13.10
ウェブサイトの手順どおり
◦ http://hhvm.com/blog/3203/nightly-packages
2014/05/02 社内勉強会資料 9
$ wget -O - http://dl.hhvm.com/conf/hhvm.gpg.key | sudo
apt-key add -
$ echo deb http://dl.hhvm.com/ubuntu saucy main | sudo tee
/etc/apt/sources.list.d/hhvm.list
$ sudo apt-get update
$ sudo apt-get install hhvm-nightly
動かす
Hello, world!
2014/05/02 社内勉強会資料 10
$ vi hello.hh
<?hh
print "Hello, world!¥n";
$ hhvm hello.hh
Hello, world!
$ vi hello.php
<?php
print "Hello, world!¥n";
$ hhvm hello.php
Hello, world!
Apache との連携
FastCGI (mod_fcgi) を使う
◦ 電子書籍が参考になった
◦ 米林正明, Facebook発 新プログラミング言語「Hack」スタートアップガイド
◦ https://gihyo.jp/dp/ebook/2014/978-4-7741-6445-8
◦ 400 円
2014/05/02 社内勉強会資料 11
$ sudo apt-get install libapache2-mod-fcgid
$ cd /etc/apache2/mods-enabled
$ sudo ln -s ../mods-available/proxy.load
$ sudo ln -s ../mods-available/proxy_fcgi.load
$ sudo ln -s ../mods-available/hhvm_proxy_fcgi.conf
$ sudo service hhvm start
$ sudo service apache2 restart
確認する
phpinfo()
◦ HHVM では単に HipHop と表示されるだけ
2014/05/02 社内勉強会資料 12
$ sudo vi /var/www/phpinfo.php
<?php
phpinfo();
$ curl http://localhost/phpinfo.php
HipHop
詳細: HHVM サーバ
こんなプロセスが動いている
2014/05/02 社内勉強会資料 13
$ ps –ef | grep hhvm | 見やすいように切り貼り
/usr/bin/hhvm
--config /etc/hhvm/server.ini
--user www-data
--mode daemon -vPidFile=/var/run/hhvm/pid
詳細: サーバ設定
2014/05/02 社内勉強会資料 14
$ cat /etc/hhvm/server.ini
; php options
pid = /var/run/hhvm/pid
; hhvm specific
hhvm.server.port = 9000
hhvm.server.type = fastcgi
hhvm.server.default_document = index.php
hhvm.log.level = Warning
hhvm.log.always_log_unhandled_exceptions = true
hhvm.log.runtime_error_reporting_level = 8191
hhvm.log.use_log_file = true
hhvm.log.file = /var/log/hhvm/error.log
hhvm.repo.central.path = /var/run/hhvm/hhvm.hhbc
hhvm.mysql.typed_results = false
詳細: Apache の Proxy 設定
2014/05/02 社内勉強会資料 15
$ cat /etc/apache2/mods-enabled/hhvm_proxy_fcgi.conf
ProxyPassMatch
^/(.*¥.(hh|php)(/.*)?)$ fcgi://127.0.0.1:9000/var/www/$1
Symfony を乗せてみる
ウェブサイトの説明どおりにインストール
◦ http://symfony.com/doc/current/quick_tour/the_big_picture.html
2014/05/02 社内勉強会資料 16
$ curl -sS https://getcomposer.org/installer | php
$ ./composer.phar create-project symfony/framework-
standard-edition /var/www/symfony/ ~2.4
いつもの設定
$ chmod 777 /var/www/symfony/app/{cache,logs}
$ sudo vi /etc/hhvm/server.ini
; php options
pid = /var/run/hhvm/pid
date.timezone = Asia/Tokyo
確認する
http://localhost/symfony/web/app_dev.php/demo/hello/World
2014/05/02 社内勉強会資料 17
PHP との互換性
ウェブサイトの PHP 関数リファレンスを参照
◦ http://docs.hhvm.com/manual/en/phpfuncref.php
◦ 関数ごとに HHVM の対応状況が記載されている
2014/05/02 社内勉強会資料 18
高速化のための約束
トップレベルに処理を書かないこと
◦ おそらく JIT の対象外
2014/05/02 社内勉強会資料 19
$ cat test1.hh
<?hh
for($i=0;$i<10000000;++$i);
$ time hhvm test1.hh
real 0m1.410s
user 0m1.371s
sys 0m0.036s
$ cat test2.hh
<?hh
function test() {
for($i=0;$i<10000000;++$i);
}
test();
$ time hhvm test2.hh
real 0m0.186s
user 0m0.147s
sys 0m0.036s
実は最初のベンチマーク結果には嘘があります
ベンチマーク (真実)
2014/05/02 社内勉強会資料 20
17.93
14.00
20.19
15.81
15.10
12.54
13.77
10.64
2.16
14.13
1.84
26.67
9.40
7.44
60.45
24.17
#N/A
10.67
7.86
2.45
1.92
2.21
9.37
7.72
2.81
5.45
#N/A
10.53
5.70
2.48
0
10
20
30
40
50
60
70
PHP と HHVM の実行時間の比較 [秒]
PHP PHP on HHVM HHVM
プログラミング言語 Hack
2014/05/02 社内勉強会資料 21
メリットは?
2014/05/02 社内勉強会資料 22
静的な型検査
すぐ炎上するので小さな声で言います
Hack の言語機能
ウェブサイトのリファレンス
◦ http://docs.hhvm.com/manual/en/hacklangref.php
◦ これを読めばだいたいわかる
2014/05/02 社内勉強会資料 23
独習 Hack
ウェブサイトのチュートリアル
◦ http://hacklang.org/tutorial
◦ これをやればだいたいわかる
2014/05/02 社内勉強会資料 24
◦ エディタになっていて自由にコードを書ける
独断と偏見による分類
静的型に関する機能
◦ Type Annotation
◦ Generics
◦ Nullable
◦ Type Aliasing
さまざまな複合データ型
◦ Collections
◦ Vector, Map, Set, Pair
◦ Shapes
◦ Tuples
その他 (わりとどーでもいい)
◦ Hack Modes
◦ Async
◦ Continuations
◦ Traits / Trait Requirements
◦ Lambda Expressions
2014/05/02 社内勉強会資料 25
以下のスライドでは下線を引いた機能をピックアップして紹介
Type Annotation
型を書くのは・・・
◦ 関数定義の引数と戻り値
◦ クラスのメンバ変数
関数内部のローカル変数には型を書かない
◦ 型を書かない != 型が付かない
◦ 書かなくても自動的に推論して型エラーを検出する
2014/05/02 社内勉強会資料 26
$ vi test.hh
<?hh
function add(int $a, int $b): int {
$c = $a + $b;
return $c;
}
型検査の実行
hh_client を使う
2014/05/02 社内勉強会資料 27
$ touch .hhconfig
$ hh_client check
No errors!
$ hh_client stop
◦ 裏側で hh_server プロセスが起動し .hhconfig 以下を監視するらしい
◦ hh_client stop で hh_server プロセスを停止する
型エラーの検出
◦ 関数の戻り値の型は int でなければいけない
◦ ところが、引数の $b が float なので $c は int + float = float である
◦ というわけで、戻り値の型が正しくないと文句を言っている
2014/05/02 社内勉強会資料 28
$ vi test.hh
<?hh
function add_error(int $a, float $b): int {
$c = $a + $b;
return $c;
}
$ hh_client check
/.../test.hh:4:10,11: Invalid return type
/.../test.hh:2:39,41: This is an int
/.../test.hh:2:28,32: It is incompatible with a float
型エラーの修正
◦ intval 関数を入れることで $c の型が int になった
◦ 単に int にキャストする方法でも同じ
2014/05/02 社内勉強会資料 29
$ vi test.hh
<?hh
function add_error_fixed(int $a, float $b): int {
$c = intval($a + $b);
return $c;
}
$ hh_client check
No errors!
Nullable
◦ 型の先頭に ? を書くと null 許容型になる
このプログラムには型エラーがあります (次のスライドで説明)
2014/05/02 社内勉強会資料 30
$ vi test.hh
<?hh
function add_null(?int $a, int $b): int {
$c = $a + $b;
return $c;
}
Nullable (型エラーの検出)
◦ $a は算術演算子 “+” で使われるので int か float でなければいけない
◦ ところが $a は null 許容型である
◦ というわけで、型のエラーだと文句を言っている
2014/05/02 社内勉強会資料 31
<?hh
function add_null(?int $a, int $b): int {
$c = $a + $b;
return $c;
}
$ hh_client check
/.../test.hh:3:8,9: Typing error
/.../test.hh:3:8,9: This is a num (int/float) because
this is used in an arithmetic operation
/.../test.hh:2:19,22: It is incompatible with a nullable
type
Nullable (型エラーの修正)
◦ null のときは 0 を代入することで、演算の箇所での $a は int になった
◦ 三項演算子を使って書いても同じ
2014/05/02 社内勉強会資料 32
$ vi test.hh
<?hh
function add_null(?int $a, int $b): int {
if ($a == null) {
$a = 0;
}
$c = $a + $b;
return $c;
}
$ hh_client check
No errors!
Shape
2014/05/02 社内勉強会資料 33
$ vi test.hh
<?hh
type person = shape('name' => string, 'age' => int);
function is_adult(person $p) : bool {
return $p['age'] >= 20;
}
function test() {
$taro = shape('name' => 'Taro', 'age' => 25);
echo is_adult($taro) . "¥n";
}
◦ Key の値が固定された配列
◦ 右辺の型に person という名前を付けている (type aliasing; 後述)
Shape (型エラーの検出)
◦ $no_name には “name” フィールドが無い
◦ is_adult 関数の引数 $p は person 型で “name” フィールドが定義済み
◦ というわけで、引数の型が正しくないと文句を言っている
2014/05/02 社内勉強会資料 34
function is_adult(person $p) : bool { ... }
function test() {
$no_name = shape('age' => 25); // name が無い
echo is_adult($no_name) . "¥n";
}
$ hh_client check
/.../test.hh:10:17,24: Invalid argument
/.../test.hh:9:14,18: The field 'name' is missing
/.../test.hh:4:19,24: The field 'name' is defined
Shape (初期化後の代入)
◦ 左は OK, 右は NG
◦ Shape のキーには定数文字列しか使えない
2014/05/02 社内勉強会資料 35
function test() {
$taro = shape();
$taro['name'] = 'Taro';
$taro['age'] = 25;
echo is_adult($taro)."¥n";
}
function test() {
$taro = shape();
$taro['na'.'me'] = 'Taro';
$taro['age'] = 25;
echo is_adult($taro)."¥n";
}
$ hh_client check
/.../test.hh:10:9,19: Was expecting a constant string (for
shape access)
Type Aliasing
◦ 右辺のデータ型に左辺の別名を付ける
◦ プログラムが分かりやすくなる
2014/05/02 社内勉強会資料 36
$ vi test.hh
<?hh
type point = shape('x' => int, 'y' => int);
function new_point(int $x, int $y) : point {
return shape('x' => $x, 'y' => $y);
}
function get_x(point $p) : int { return $p['x']; }
function get_y(point $p) : int { return $p['y']; }
Type Aliasing (newtype)
◦ newtype を使うと、ファイルの外側からは右辺が見えなくなる
◦ プログラムのモジュール化に役立つ
2014/05/02 社内勉強会資料 37
$ vi test.hh
<?hh
newtype point = shape('x' => int, 'y' => int);
function new_point(int $x, int $y) : point {
return shape('x' => $x, 'y' => $y);
}
function get_x(point $p) : int { return $p['x']; }
function get_y(point $p) : int { return $p['y']; }
Type Aliasing (型エラーの検出)
◦ point の実体が shape(‘x’ => int, …) だということは隠されている
◦ というわけで、$p はコンテナではなく point だと文句を言っている
2014/05/02 社内勉強会資料 38
<?hh
require 'test.hh';
function main() : void {
$p = new_point(1, 2);
$p['x'] = 3;
}
$ hh_client check
/.../main.hh:6:3,9: This is not a container, this is an
object of type point
/.../main.hh:5:38,42: You might want to check this out
補足
2014/05/02 社内勉強会資料 39
hh_client と HHVM
HHVM では実行開始時に型検査するわけではない
◦ 関数の先頭で仮引数と実引数の型が合致しているか検査
◦ 関数を抜けるときに戻り値の型が合致しているか検査
hh_client がエラーにするコードも HHVM では実行できる
2014/05/02 社内勉強会資料 40
$ cat type_error.hh
<?hh
function test($cond): int { return $cond ? 1 : 'foo'; }
print test($argv[1]) . "¥n";
$ hhvm type_error.hh 1
1
$ hhvm type_error.hh 0
Fatal error: Value returned from test() must be of type
int, string given in /.../type_error.hh on line 3
おわり
2014/05/02 社内勉強会資料 41

More Related Content

What's hot

PHPの今とこれから2019
PHPの今とこれから2019PHPの今とこれから2019
PHPの今とこれから2019Rui Hirokawa
 
PHP Now and Then 2012 at PHP Conference 2012, Tokyo Japan (in japanese)
PHP Now and Then 2012 at PHP Conference 2012, Tokyo Japan (in japanese)PHP Now and Then 2012 at PHP Conference 2012, Tokyo Japan (in japanese)
PHP Now and Then 2012 at PHP Conference 2012, Tokyo Japan (in japanese)Rui Hirokawa
 
Good Parts of PHP and the UNIX Philosophy
Good Parts of PHP and the UNIX PhilosophyGood Parts of PHP and the UNIX Philosophy
Good Parts of PHP and the UNIX PhilosophyYuya Takeyama
 
PHPの今とこれから2020
PHPの今とこれから2020PHPの今とこれから2020
PHPの今とこれから2020Rui Hirokawa
 
Perl logging
Perl loggingPerl logging
Perl loggingkeroyonn
 
PHP AST 徹底解説
PHP AST 徹底解説PHP AST 徹底解説
PHP AST 徹底解説do_aki
 
15分でCakePHPを始める方法(Nseg 2013-11-09 )
15分でCakePHPを始める方法(Nseg 2013-11-09 )15分でCakePHPを始める方法(Nseg 2013-11-09 )
15分でCakePHPを始める方法(Nseg 2013-11-09 )hiro345
 
Windows で拡張モジュールをビルドしてみた
Windows で拡張モジュールをビルドしてみたWindows で拡張モジュールをビルドしてみた
Windows で拡張モジュールをビルドしてみたy-uti
 
Modern PHP Programming @ PFI Seminar
Modern PHP Programming @ PFI SeminarModern PHP Programming @ PFI Seminar
Modern PHP Programming @ PFI SeminarSotaro Karasawa
 
PHPの今とこれから2016
PHPの今とこれから2016PHPの今とこれから2016
PHPの今とこれから2016Rui Hirokawa
 
omoon.org の裏側 〜FuelPHP の task 活用例〜
omoon.org の裏側 〜FuelPHP の task 活用例〜omoon.org の裏側 〜FuelPHP の task 活用例〜
omoon.org の裏側 〜FuelPHP の task 活用例〜Sotaro Omura
 
Perl Hobby Programming - Games::BeLike::EightBIT ターミナルで8ビット風ゲームをつくろう
Perl Hobby Programming - Games::BeLike::EightBIT ターミナルで8ビット風ゲームをつくろうPerl Hobby Programming - Games::BeLike::EightBIT ターミナルで8ビット風ゲームをつくろう
Perl Hobby Programming - Games::BeLike::EightBIT ターミナルで8ビット風ゲームをつくろうkeroyonn
 
php-src の歩き方
php-src の歩き方php-src の歩き方
php-src の歩き方do_aki
 
PHP と SAPI と ZendEngine3 と
PHP と SAPI と ZendEngine3 とPHP と SAPI と ZendEngine3 と
PHP と SAPI と ZendEngine3 とdo_aki
 
PECL を数えてみた
PECL を数えてみたPECL を数えてみた
PECL を数えてみたy-uti
 
知ってるようで意外と知らないPHPの便利関数
知ってるようで意外と知らないPHPの便利関数知ってるようで意外と知らないPHPの便利関数
知ってるようで意外と知らないPHPの便利関数Wataru Terada
 
Open Source System Administration Framework - Func
Open Source System Administration Framework - FuncOpen Source System Administration Framework - Func
Open Source System Administration Framework - FuncGosuke Miyashita
 

What's hot (20)

PHPの今とこれから2019
PHPの今とこれから2019PHPの今とこれから2019
PHPの今とこれから2019
 
PHP Now and Then 2012 at PHP Conference 2012, Tokyo Japan (in japanese)
PHP Now and Then 2012 at PHP Conference 2012, Tokyo Japan (in japanese)PHP Now and Then 2012 at PHP Conference 2012, Tokyo Japan (in japanese)
PHP Now and Then 2012 at PHP Conference 2012, Tokyo Japan (in japanese)
 
PHPコアから読み解くPHP5.5
PHPコアから読み解くPHP5.5PHPコアから読み解くPHP5.5
PHPコアから読み解くPHP5.5
 
PHPにおけるI/O多重化とyield
PHPにおけるI/O多重化とyieldPHPにおけるI/O多重化とyield
PHPにおけるI/O多重化とyield
 
Good Parts of PHP and the UNIX Philosophy
Good Parts of PHP and the UNIX PhilosophyGood Parts of PHP and the UNIX Philosophy
Good Parts of PHP and the UNIX Philosophy
 
PHPの今とこれから2020
PHPの今とこれから2020PHPの今とこれから2020
PHPの今とこれから2020
 
Perl logging
Perl loggingPerl logging
Perl logging
 
PHP AST 徹底解説
PHP AST 徹底解説PHP AST 徹底解説
PHP AST 徹底解説
 
15分でCakePHPを始める方法(Nseg 2013-11-09 )
15分でCakePHPを始める方法(Nseg 2013-11-09 )15分でCakePHPを始める方法(Nseg 2013-11-09 )
15分でCakePHPを始める方法(Nseg 2013-11-09 )
 
Windows で拡張モジュールをビルドしてみた
Windows で拡張モジュールをビルドしてみたWindows で拡張モジュールをビルドしてみた
Windows で拡張モジュールをビルドしてみた
 
Modern PHP Programming @ PFI Seminar
Modern PHP Programming @ PFI SeminarModern PHP Programming @ PFI Seminar
Modern PHP Programming @ PFI Seminar
 
実"戦"CakePHP Plugin
実"戦"CakePHP Plugin実"戦"CakePHP Plugin
実"戦"CakePHP Plugin
 
PHPの今とこれから2016
PHPの今とこれから2016PHPの今とこれから2016
PHPの今とこれから2016
 
omoon.org の裏側 〜FuelPHP の task 活用例〜
omoon.org の裏側 〜FuelPHP の task 活用例〜omoon.org の裏側 〜FuelPHP の task 活用例〜
omoon.org の裏側 〜FuelPHP の task 活用例〜
 
Perl Hobby Programming - Games::BeLike::EightBIT ターミナルで8ビット風ゲームをつくろう
Perl Hobby Programming - Games::BeLike::EightBIT ターミナルで8ビット風ゲームをつくろうPerl Hobby Programming - Games::BeLike::EightBIT ターミナルで8ビット風ゲームをつくろう
Perl Hobby Programming - Games::BeLike::EightBIT ターミナルで8ビット風ゲームをつくろう
 
php-src の歩き方
php-src の歩き方php-src の歩き方
php-src の歩き方
 
PHP と SAPI と ZendEngine3 と
PHP と SAPI と ZendEngine3 とPHP と SAPI と ZendEngine3 と
PHP と SAPI と ZendEngine3 と
 
PECL を数えてみた
PECL を数えてみたPECL を数えてみた
PECL を数えてみた
 
知ってるようで意外と知らないPHPの便利関数
知ってるようで意外と知らないPHPの便利関数知ってるようで意外と知らないPHPの便利関数
知ってるようで意外と知らないPHPの便利関数
 
Open Source System Administration Framework - Func
Open Source System Administration Framework - FuncOpen Source System Administration Framework - Func
Open Source System Administration Framework - Func
 

Viewers also liked

導入に困っているあなたに贈る スクラム導入コミュニケーション術
導入に困っているあなたに贈る スクラム導入コミュニケーション術導入に困っているあなたに贈る スクラム導入コミュニケーション術
導入に困っているあなたに贈る スクラム導入コミュニケーション術Kouki Kawagoi
 
なんたって”DevQA” アジャイル開発とQAの合体が改善を生む - 永田 敦 氏 #postudy
なんたって”DevQA” アジャイル開発とQAの合体が改善を生む - 永田 敦 氏 #postudyなんたって”DevQA” アジャイル開発とQAの合体が改善を生む - 永田 敦 氏 #postudy
なんたって”DevQA” アジャイル開発とQAの合体が改善を生む - 永田 敦 氏 #postudyPOStudy
 
[RSGT2017] つらい問題に出会ったら
[RSGT2017] つらい問題に出会ったら[RSGT2017] つらい問題に出会ったら
[RSGT2017] つらい問題に出会ったらTakahiro Kaihara
 
市場価値で給料が決まるサイボウズの社員だけど、転職ドラフトに参加して給与交渉に挑戦してみました
市場価値で給料が決まるサイボウズの社員だけど、転職ドラフトに参加して給与交渉に挑戦してみました市場価値で給料が決まるサイボウズの社員だけど、転職ドラフトに参加して給与交渉に挑戦してみました
市場価値で給料が決まるサイボウズの社員だけど、転職ドラフトに参加して給与交渉に挑戦してみましたYusuke Amano
 
Secured API Acceleration with Engineers from Amazon CloudFront and Slack
Secured API Acceleration with Engineers from Amazon CloudFront and SlackSecured API Acceleration with Engineers from Amazon CloudFront and Slack
Secured API Acceleration with Engineers from Amazon CloudFront and SlackAmazon Web Services
 
フロー効率性とリソース効率性について #xpjug
フロー効率性とリソース効率性について #xpjugフロー効率性とリソース効率性について #xpjug
フロー効率性とリソース効率性について #xpjugItsuki Kuroda
 
アジャイルメトリクス実践ガイド
アジャイルメトリクス実践ガイドアジャイルメトリクス実践ガイド
アジャイルメトリクス実践ガイドHiroyuki Ito
 
あなたの開発チームには、チームワークがあふれていますか?
 あなたの開発チームには、チームワークがあふれていますか? あなたの開発チームには、チームワークがあふれていますか?
あなたの開発チームには、チームワークがあふれていますか?Yusuke Amano
 
Kubernetes in 30 minutes (2017/03/10)
Kubernetes in 30 minutes (2017/03/10)Kubernetes in 30 minutes (2017/03/10)
Kubernetes in 30 minutes (2017/03/10)lestrrat
 
Kubernetesにまつわるエトセトラ(主に苦労話)
Kubernetesにまつわるエトセトラ(主に苦労話)Kubernetesにまつわるエトセトラ(主に苦労話)
Kubernetesにまつわるエトセトラ(主に苦労話)Works Applications
 
離れた場所でも最高のチームワークを実現する方法 ーサイボウズ開発チームのリモートワーク事例ー
離れた場所でも最高のチームワークを実現する方法 ーサイボウズ開発チームのリモートワーク事例ー離れた場所でも最高のチームワークを実現する方法 ーサイボウズ開発チームのリモートワーク事例ー
離れた場所でも最高のチームワークを実現する方法 ーサイボウズ開発チームのリモートワーク事例ーTeppei Sato
 
PHP7がリリースされたいま、 改めてHackについて考える。
PHP7がリリースされたいま、 改めてHackについて考える。PHP7がリリースされたいま、 改めてHackについて考える。
PHP7がリリースされたいま、 改めてHackについて考える。Yuji Otani
 
Hack言語に賭けたチームの話
Hack言語に賭けたチームの話Hack言語に賭けたチームの話
Hack言語に賭けたチームの話Yuji Otani
 
【PR】エンジニアがkintoneを試すべき3つの理由
【PR】エンジニアがkintoneを試すべき3つの理由【PR】エンジニアがkintoneを試すべき3つの理由
【PR】エンジニアがkintoneを試すべき3つの理由Jumpei Miyata
 
PHP7ではなくHack/HHVMを選ぶ理由
PHP7ではなくHack/HHVMを選ぶ理由PHP7ではなくHack/HHVMを選ぶ理由
PHP7ではなくHack/HHVMを選ぶ理由Yuji Otani
 
3000社の業務データ絞り込みを支える技術
3000社の業務データ絞り込みを支える技術3000社の業務データ絞り込みを支える技術
3000社の業務データ絞り込みを支える技術Ryo Mitoma
 
WalB: Real-time and Incremental Backup System for Block Devices
WalB: Real-time and Incremental Backup System for Block DevicesWalB: Real-time and Incremental Backup System for Block Devices
WalB: Real-time and Incremental Backup System for Block Devicesuchan_nos
 
小さく始める大規模スクラム
小さく始める大規模スクラム小さく始める大規模スクラム
小さく始める大規模スクラムKeisuke Tsukagoshi
 

Viewers also liked (20)

形態素解析
形態素解析形態素解析
形態素解析
 
導入に困っているあなたに贈る スクラム導入コミュニケーション術
導入に困っているあなたに贈る スクラム導入コミュニケーション術導入に困っているあなたに贈る スクラム導入コミュニケーション術
導入に困っているあなたに贈る スクラム導入コミュニケーション術
 
なんたって”DevQA” アジャイル開発とQAの合体が改善を生む - 永田 敦 氏 #postudy
なんたって”DevQA” アジャイル開発とQAの合体が改善を生む - 永田 敦 氏 #postudyなんたって”DevQA” アジャイル開発とQAの合体が改善を生む - 永田 敦 氏 #postudy
なんたって”DevQA” アジャイル開発とQAの合体が改善を生む - 永田 敦 氏 #postudy
 
[RSGT2017] つらい問題に出会ったら
[RSGT2017] つらい問題に出会ったら[RSGT2017] つらい問題に出会ったら
[RSGT2017] つらい問題に出会ったら
 
市場価値で給料が決まるサイボウズの社員だけど、転職ドラフトに参加して給与交渉に挑戦してみました
市場価値で給料が決まるサイボウズの社員だけど、転職ドラフトに参加して給与交渉に挑戦してみました市場価値で給料が決まるサイボウズの社員だけど、転職ドラフトに参加して給与交渉に挑戦してみました
市場価値で給料が決まるサイボウズの社員だけど、転職ドラフトに参加して給与交渉に挑戦してみました
 
Secured API Acceleration with Engineers from Amazon CloudFront and Slack
Secured API Acceleration with Engineers from Amazon CloudFront and SlackSecured API Acceleration with Engineers from Amazon CloudFront and Slack
Secured API Acceleration with Engineers from Amazon CloudFront and Slack
 
フロー効率性とリソース効率性について #xpjug
フロー効率性とリソース効率性について #xpjugフロー効率性とリソース効率性について #xpjug
フロー効率性とリソース効率性について #xpjug
 
アジャイルメトリクス実践ガイド
アジャイルメトリクス実践ガイドアジャイルメトリクス実践ガイド
アジャイルメトリクス実践ガイド
 
あなたの開発チームには、チームワークがあふれていますか?
 あなたの開発チームには、チームワークがあふれていますか? あなたの開発チームには、チームワークがあふれていますか?
あなたの開発チームには、チームワークがあふれていますか?
 
Kubernetes in 30 minutes (2017/03/10)
Kubernetes in 30 minutes (2017/03/10)Kubernetes in 30 minutes (2017/03/10)
Kubernetes in 30 minutes (2017/03/10)
 
Atlassian Summit US 2017 #augj
Atlassian Summit US 2017 #augjAtlassian Summit US 2017 #augj
Atlassian Summit US 2017 #augj
 
Kubernetesにまつわるエトセトラ(主に苦労話)
Kubernetesにまつわるエトセトラ(主に苦労話)Kubernetesにまつわるエトセトラ(主に苦労話)
Kubernetesにまつわるエトセトラ(主に苦労話)
 
離れた場所でも最高のチームワークを実現する方法 ーサイボウズ開発チームのリモートワーク事例ー
離れた場所でも最高のチームワークを実現する方法 ーサイボウズ開発チームのリモートワーク事例ー離れた場所でも最高のチームワークを実現する方法 ーサイボウズ開発チームのリモートワーク事例ー
離れた場所でも最高のチームワークを実現する方法 ーサイボウズ開発チームのリモートワーク事例ー
 
PHP7がリリースされたいま、 改めてHackについて考える。
PHP7がリリースされたいま、 改めてHackについて考える。PHP7がリリースされたいま、 改めてHackについて考える。
PHP7がリリースされたいま、 改めてHackについて考える。
 
Hack言語に賭けたチームの話
Hack言語に賭けたチームの話Hack言語に賭けたチームの話
Hack言語に賭けたチームの話
 
【PR】エンジニアがkintoneを試すべき3つの理由
【PR】エンジニアがkintoneを試すべき3つの理由【PR】エンジニアがkintoneを試すべき3つの理由
【PR】エンジニアがkintoneを試すべき3つの理由
 
PHP7ではなくHack/HHVMを選ぶ理由
PHP7ではなくHack/HHVMを選ぶ理由PHP7ではなくHack/HHVMを選ぶ理由
PHP7ではなくHack/HHVMを選ぶ理由
 
3000社の業務データ絞り込みを支える技術
3000社の業務データ絞り込みを支える技術3000社の業務データ絞り込みを支える技術
3000社の業務データ絞り込みを支える技術
 
WalB: Real-time and Incremental Backup System for Block Devices
WalB: Real-time and Incremental Backup System for Block DevicesWalB: Real-time and Incremental Backup System for Block Devices
WalB: Real-time and Incremental Backup System for Block Devices
 
小さく始める大規模スクラム
小さく始める大規模スクラム小さく始める大規模スクラム
小さく始める大規模スクラム
 

Similar to Hack/HHVM 入門

PHPの今とこれから2023
PHPの今とこれから2023PHPの今とこれから2023
PHPの今とこれから2023Rui Hirokawa
 
Php5 4勉強会
Php5 4勉強会Php5 4勉強会
Php5 4勉強会Yuji Otani
 
Perl 非同期プログラミング
Perl 非同期プログラミングPerl 非同期プログラミング
Perl 非同期プログラミングlestrrat
 
PHPBLT#6 PHPの未来に入るかもしれない機能の紹介
PHPBLT#6 PHPの未来に入るかもしれない機能の紹介PHPBLT#6 PHPの未来に入るかもしれない機能の紹介
PHPBLT#6 PHPの未来に入るかもしれない機能の紹介sters
 
PHPの関数実行とその計測
PHPの関数実行とその計測PHPの関数実行とその計測
PHPの関数実行とその計測shinjiigarashi
 
よいことも悪いこともぜんぶPHPが教えてくれた
よいことも悪いこともぜんぶPHPが教えてくれたよいことも悪いこともぜんぶPHPが教えてくれた
よいことも悪いこともぜんぶPHPが教えてくれたMoriyoshi Koizumi
 
PHP5.5新機能「ジェネレータ」初心者入門
PHP5.5新機能「ジェネレータ」初心者入門PHP5.5新機能「ジェネレータ」初心者入門
PHP5.5新機能「ジェネレータ」初心者入門kwatch
 
第21回Creators MeetUp
第21回Creators MeetUp第21回Creators MeetUp
第21回Creators MeetUpKenichi Mukai
 
Mojoliciousをウェブ制作現場で使ってみてる
Mojoliciousをウェブ制作現場で使ってみてるMojoliciousをウェブ制作現場で使ってみてる
Mojoliciousをウェブ制作現場で使ってみてるjamadam
 
仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)
仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)
仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)Hiroaki KOBAYASHI
 
Phpcon tokyo 20120_bigginer
Phpcon tokyo 20120_bigginerPhpcon tokyo 20120_bigginer
Phpcon tokyo 20120_bigginerHideo Kashioka
 
WTM53 phpフレームワーク いまさらcodeigniter
WTM53 phpフレームワーク いまさらcodeigniterWTM53 phpフレームワーク いまさらcodeigniter
WTM53 phpフレームワーク いまさらcodeigniterMasanori Oobayashi
 
知って得する標準関数の使い方
知って得する標準関数の使い方知って得する標準関数の使い方
知って得する標準関数の使い方Soudai Sone
 
PHP初心者セッション2023 〜ChatGPT時代の簡単な始め方〜
PHP初心者セッション2023 〜ChatGPT時代の簡単な始め方〜PHP初心者セッション2023 〜ChatGPT時代の簡単な始め方〜
PHP初心者セッション2023 〜ChatGPT時代の簡単な始め方〜Hideo Kashioka
 
PHPCON_TOKYO_2022_Bigginer.pptx
PHPCON_TOKYO_2022_Bigginer.pptxPHPCON_TOKYO_2022_Bigginer.pptx
PHPCON_TOKYO_2022_Bigginer.pptxHideo Kashioka
 
FukuokaPHP 3
FukuokaPHP 3FukuokaPHP 3
FukuokaPHP 3ichikaway
 
「スピード」と「品質」を実現するPHP開発チームの取り組み~AngularJS+FuelPHP+AspectMock~
「スピード」と「品質」を実現するPHP開発チームの取り組み~AngularJS+FuelPHP+AspectMock~「スピード」と「品質」を実現するPHP開発チームの取り組み~AngularJS+FuelPHP+AspectMock~
「スピード」と「品質」を実現するPHP開発チームの取り組み~AngularJS+FuelPHP+AspectMock~leverages_event
 

Similar to Hack/HHVM 入門 (20)

PHPの今とこれから2023
PHPの今とこれから2023PHPの今とこれから2023
PHPの今とこれから2023
 
Php5 4勉強会
Php5 4勉強会Php5 4勉強会
Php5 4勉強会
 
Perl 非同期プログラミング
Perl 非同期プログラミングPerl 非同期プログラミング
Perl 非同期プログラミング
 
PHPBLT#6 PHPの未来に入るかもしれない機能の紹介
PHPBLT#6 PHPの未来に入るかもしれない機能の紹介PHPBLT#6 PHPの未来に入るかもしれない機能の紹介
PHPBLT#6 PHPの未来に入るかもしれない機能の紹介
 
PHPの関数実行とその計測
PHPの関数実行とその計測PHPの関数実行とその計測
PHPの関数実行とその計測
 
よいことも悪いこともぜんぶPHPが教えてくれた
よいことも悪いこともぜんぶPHPが教えてくれたよいことも悪いこともぜんぶPHPが教えてくれた
よいことも悪いこともぜんぶPHPが教えてくれた
 
PHP5.5新機能「ジェネレータ」初心者入門
PHP5.5新機能「ジェネレータ」初心者入門PHP5.5新機能「ジェネレータ」初心者入門
PHP5.5新機能「ジェネレータ」初心者入門
 
第21回Creators MeetUp
第21回Creators MeetUp第21回Creators MeetUp
第21回Creators MeetUp
 
Mojoliciousをウェブ制作現場で使ってみてる
Mojoliciousをウェブ制作現場で使ってみてるMojoliciousをウェブ制作現場で使ってみてる
Mojoliciousをウェブ制作現場で使ってみてる
 
仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)
仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)
仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)
 
Phpcon tokyo 20120_bigginer
Phpcon tokyo 20120_bigginerPhpcon tokyo 20120_bigginer
Phpcon tokyo 20120_bigginer
 
PHP 入門
PHP 入門PHP 入門
PHP 入門
 
WTM53 phpフレームワーク いまさらcodeigniter
WTM53 phpフレームワーク いまさらcodeigniterWTM53 phpフレームワーク いまさらcodeigniter
WTM53 phpフレームワーク いまさらcodeigniter
 
WordPress on HHVM + Hack
WordPress on HHVM + HackWordPress on HHVM + Hack
WordPress on HHVM + Hack
 
WCO2012「PHP教室」
WCO2012「PHP教室」WCO2012「PHP教室」
WCO2012「PHP教室」
 
知って得する標準関数の使い方
知って得する標準関数の使い方知って得する標準関数の使い方
知って得する標準関数の使い方
 
PHP初心者セッション2023 〜ChatGPT時代の簡単な始め方〜
PHP初心者セッション2023 〜ChatGPT時代の簡単な始め方〜PHP初心者セッション2023 〜ChatGPT時代の簡単な始め方〜
PHP初心者セッション2023 〜ChatGPT時代の簡単な始め方〜
 
PHPCON_TOKYO_2022_Bigginer.pptx
PHPCON_TOKYO_2022_Bigginer.pptxPHPCON_TOKYO_2022_Bigginer.pptx
PHPCON_TOKYO_2022_Bigginer.pptx
 
FukuokaPHP 3
FukuokaPHP 3FukuokaPHP 3
FukuokaPHP 3
 
「スピード」と「品質」を実現するPHP開発チームの取り組み~AngularJS+FuelPHP+AspectMock~
「スピード」と「品質」を実現するPHP開発チームの取り組み~AngularJS+FuelPHP+AspectMock~「スピード」と「品質」を実現するPHP開発チームの取り組み~AngularJS+FuelPHP+AspectMock~
「スピード」と「品質」を実現するPHP開発チームの取り組み~AngularJS+FuelPHP+AspectMock~
 

More from y-uti

潜在ディリクレ配分法
潜在ディリクレ配分法潜在ディリクレ配分法
潜在ディリクレ配分法y-uti
 
Active Object
Active ObjectActive Object
Active Objecty-uti
 
目で見る過学習と正則化
目で見る過学習と正則化目で見る過学習と正則化
目で見る過学習と正則化y-uti
 
ロジスティック回帰入門
ロジスティック回帰入門ロジスティック回帰入門
ロジスティック回帰入門y-uti
 
論文紹介 Identifying Implementation Bugs in Machine Learning based Image Classifi...
論文紹介 Identifying Implementation Bugs in Machine Learning based Image Classifi...論文紹介 Identifying Implementation Bugs in Machine Learning based Image Classifi...
論文紹介 Identifying Implementation Bugs in Machine Learning based Image Classifi...y-uti
 
PECL operator で演算子オーバーロード
PECL operator で演算子オーバーロードPECL operator で演算子オーバーロード
PECL operator で演算子オーバーロードy-uti
 
PHP-ML で手書き数字認識
PHP-ML で手書き数字認識PHP-ML で手書き数字認識
PHP-ML で手書き数字認識y-uti
 
OPcache の最適化器の今
OPcache の最適化器の今OPcache の最適化器の今
OPcache の最適化器の今y-uti
 
スパース推定
スパース推定スパース推定
スパース推定y-uti
 
Kaggle の Titanic チュートリアルに挑戦した話
Kaggle の Titanic チュートリアルに挑戦した話Kaggle の Titanic チュートリアルに挑戦した話
Kaggle の Titanic チュートリアルに挑戦した話y-uti
 
PHP カンファレンス福岡 2017 参加報告
PHP カンファレンス福岡 2017 参加報告PHP カンファレンス福岡 2017 参加報告
PHP カンファレンス福岡 2017 参加報告y-uti
 
分類問題 - 機械学習ライブラリ scikit-learn の活用
分類問題 - 機械学習ライブラリ scikit-learn の活用分類問題 - 機械学習ライブラリ scikit-learn の活用
分類問題 - 機械学習ライブラリ scikit-learn の活用y-uti
 
JIT のコードを読んでみた
JIT のコードを読んでみたJIT のコードを読んでみた
JIT のコードを読んでみたy-uti
 
JIT for PHP を試した
JIT for PHP を試したJIT for PHP を試した
JIT for PHP を試したy-uti
 
Task Spooler を試した
Task Spooler を試したTask Spooler を試した
Task Spooler を試したy-uti
 
anyenv + phpenv + php-build が便利すぎる件
anyenv + phpenv + php-build が便利すぎる件anyenv + phpenv + php-build が便利すぎる件
anyenv + phpenv + php-build が便利すぎる件y-uti
 
PHP カンファレンス福岡 参加報告
PHP カンファレンス福岡 参加報告PHP カンファレンス福岡 参加報告
PHP カンファレンス福岡 参加報告y-uti
 
RFC: "var" Deprecation
RFC: "var" DeprecationRFC: "var" Deprecation
RFC: "var" Deprecationy-uti
 
Windows で PHP をビルドしてみた
Windows で PHP をビルドしてみたWindows で PHP をビルドしてみた
Windows で PHP をビルドしてみたy-uti
 
逐次ベイズ学習 - サンプリング近似法の場合 -
逐次ベイズ学習 - サンプリング近似法の場合 -逐次ベイズ学習 - サンプリング近似法の場合 -
逐次ベイズ学習 - サンプリング近似法の場合 -y-uti
 

More from y-uti (20)

潜在ディリクレ配分法
潜在ディリクレ配分法潜在ディリクレ配分法
潜在ディリクレ配分法
 
Active Object
Active ObjectActive Object
Active Object
 
目で見る過学習と正則化
目で見る過学習と正則化目で見る過学習と正則化
目で見る過学習と正則化
 
ロジスティック回帰入門
ロジスティック回帰入門ロジスティック回帰入門
ロジスティック回帰入門
 
論文紹介 Identifying Implementation Bugs in Machine Learning based Image Classifi...
論文紹介 Identifying Implementation Bugs in Machine Learning based Image Classifi...論文紹介 Identifying Implementation Bugs in Machine Learning based Image Classifi...
論文紹介 Identifying Implementation Bugs in Machine Learning based Image Classifi...
 
PECL operator で演算子オーバーロード
PECL operator で演算子オーバーロードPECL operator で演算子オーバーロード
PECL operator で演算子オーバーロード
 
PHP-ML で手書き数字認識
PHP-ML で手書き数字認識PHP-ML で手書き数字認識
PHP-ML で手書き数字認識
 
OPcache の最適化器の今
OPcache の最適化器の今OPcache の最適化器の今
OPcache の最適化器の今
 
スパース推定
スパース推定スパース推定
スパース推定
 
Kaggle の Titanic チュートリアルに挑戦した話
Kaggle の Titanic チュートリアルに挑戦した話Kaggle の Titanic チュートリアルに挑戦した話
Kaggle の Titanic チュートリアルに挑戦した話
 
PHP カンファレンス福岡 2017 参加報告
PHP カンファレンス福岡 2017 参加報告PHP カンファレンス福岡 2017 参加報告
PHP カンファレンス福岡 2017 参加報告
 
分類問題 - 機械学習ライブラリ scikit-learn の活用
分類問題 - 機械学習ライブラリ scikit-learn の活用分類問題 - 機械学習ライブラリ scikit-learn の活用
分類問題 - 機械学習ライブラリ scikit-learn の活用
 
JIT のコードを読んでみた
JIT のコードを読んでみたJIT のコードを読んでみた
JIT のコードを読んでみた
 
JIT for PHP を試した
JIT for PHP を試したJIT for PHP を試した
JIT for PHP を試した
 
Task Spooler を試した
Task Spooler を試したTask Spooler を試した
Task Spooler を試した
 
anyenv + phpenv + php-build が便利すぎる件
anyenv + phpenv + php-build が便利すぎる件anyenv + phpenv + php-build が便利すぎる件
anyenv + phpenv + php-build が便利すぎる件
 
PHP カンファレンス福岡 参加報告
PHP カンファレンス福岡 参加報告PHP カンファレンス福岡 参加報告
PHP カンファレンス福岡 参加報告
 
RFC: "var" Deprecation
RFC: "var" DeprecationRFC: "var" Deprecation
RFC: "var" Deprecation
 
Windows で PHP をビルドしてみた
Windows で PHP をビルドしてみたWindows で PHP をビルドしてみた
Windows で PHP をビルドしてみた
 
逐次ベイズ学習 - サンプリング近似法の場合 -
逐次ベイズ学習 - サンプリング近似法の場合 -逐次ベイズ学習 - サンプリング近似法の場合 -
逐次ベイズ学習 - サンプリング近似法の場合 -
 

Recently uploaded

業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)Hiroshi Tomioka
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfFumieNakayama
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?akihisamiyanaga1
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...博三 太田
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NTT DATA Technology & Innovation
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineerYuki Kikuchi
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)UEHARA, Tetsutaro
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfFumieNakayama
 

Recently uploaded (8)

業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
 

Hack/HHVM 入門

  • 2. はじめに Hack とは? ◦ プログラミング言語である ◦ Facebook が作った HHVM とは? ◦ Hack プログラムを実行する VM である $ /usr/bin/hhvm hello.hh Hello, world! 2014/05/02 社内勉強会資料 2
  • 3. Hack はどんな言語? PHP の言語拡張 ◦ 型アノテーション ◦ ジェネリクス ◦ Null許容型 ◦ コンテナ型 ◦ etc. したがって PHP のプログラムは Hack のプログラムでもある $ /usr/bin/hhvm hello.php Hello, world! 2014/05/02 社内勉強会資料 3
  • 4. 今日の話 HHVM を使う ◦ Yet another PHP interpreter として プログラミング言語 Hack 2014/05/02 社内勉強会資料 4
  • 7. ベンチマーク 2014/05/02 社内勉強会資料 7 17.93 14.00 20.19 15.81 15.10 12.54 13.77 10.64 2.16 14.13 1.92 2.21 9.37 7.72 2.81 5.45 #N/A 10.53 5.70 2.48 0 5 10 15 20 25 PHP と HHVM の実行時間の比較 [秒] PHP HHVM The Computer Language Benchmarks Game http://benchmarksgame.alioth.debian.org/ 各問題の PHP 最速コードを利用
  • 8. インストール手順 Ubuntu Server 13.10 ◦ Hack のウェブサイトの情報どおり ◦ 現時点では素直に Ubuntu を使うのがオススメ ◦ Debian でも大丈夫だろうと思うが試していない CentOS 6.5 ◦ 試したが上手くいかなかった ◦ CentOS のパッケージが古すぎる ◦ 公式から入れようとしたら binutils のバージョン違いを解決できなかった ◦ hop5 という野良リポジトリから一応は入ったが Apache と連携できず Windows / Macintosh / その他 ◦ 試していない 2014/05/02 社内勉強会資料 8
  • 9. Ubuntu Server 13.10 ウェブサイトの手順どおり ◦ http://hhvm.com/blog/3203/nightly-packages 2014/05/02 社内勉強会資料 9 $ wget -O - http://dl.hhvm.com/conf/hhvm.gpg.key | sudo apt-key add - $ echo deb http://dl.hhvm.com/ubuntu saucy main | sudo tee /etc/apt/sources.list.d/hhvm.list $ sudo apt-get update $ sudo apt-get install hhvm-nightly
  • 10. 動かす Hello, world! 2014/05/02 社内勉強会資料 10 $ vi hello.hh <?hh print "Hello, world!¥n"; $ hhvm hello.hh Hello, world! $ vi hello.php <?php print "Hello, world!¥n"; $ hhvm hello.php Hello, world!
  • 11. Apache との連携 FastCGI (mod_fcgi) を使う ◦ 電子書籍が参考になった ◦ 米林正明, Facebook発 新プログラミング言語「Hack」スタートアップガイド ◦ https://gihyo.jp/dp/ebook/2014/978-4-7741-6445-8 ◦ 400 円 2014/05/02 社内勉強会資料 11 $ sudo apt-get install libapache2-mod-fcgid $ cd /etc/apache2/mods-enabled $ sudo ln -s ../mods-available/proxy.load $ sudo ln -s ../mods-available/proxy_fcgi.load $ sudo ln -s ../mods-available/hhvm_proxy_fcgi.conf $ sudo service hhvm start $ sudo service apache2 restart
  • 12. 確認する phpinfo() ◦ HHVM では単に HipHop と表示されるだけ 2014/05/02 社内勉強会資料 12 $ sudo vi /var/www/phpinfo.php <?php phpinfo(); $ curl http://localhost/phpinfo.php HipHop
  • 13. 詳細: HHVM サーバ こんなプロセスが動いている 2014/05/02 社内勉強会資料 13 $ ps –ef | grep hhvm | 見やすいように切り貼り /usr/bin/hhvm --config /etc/hhvm/server.ini --user www-data --mode daemon -vPidFile=/var/run/hhvm/pid
  • 14. 詳細: サーバ設定 2014/05/02 社内勉強会資料 14 $ cat /etc/hhvm/server.ini ; php options pid = /var/run/hhvm/pid ; hhvm specific hhvm.server.port = 9000 hhvm.server.type = fastcgi hhvm.server.default_document = index.php hhvm.log.level = Warning hhvm.log.always_log_unhandled_exceptions = true hhvm.log.runtime_error_reporting_level = 8191 hhvm.log.use_log_file = true hhvm.log.file = /var/log/hhvm/error.log hhvm.repo.central.path = /var/run/hhvm/hhvm.hhbc hhvm.mysql.typed_results = false
  • 15. 詳細: Apache の Proxy 設定 2014/05/02 社内勉強会資料 15 $ cat /etc/apache2/mods-enabled/hhvm_proxy_fcgi.conf ProxyPassMatch ^/(.*¥.(hh|php)(/.*)?)$ fcgi://127.0.0.1:9000/var/www/$1
  • 16. Symfony を乗せてみる ウェブサイトの説明どおりにインストール ◦ http://symfony.com/doc/current/quick_tour/the_big_picture.html 2014/05/02 社内勉強会資料 16 $ curl -sS https://getcomposer.org/installer | php $ ./composer.phar create-project symfony/framework- standard-edition /var/www/symfony/ ~2.4 いつもの設定 $ chmod 777 /var/www/symfony/app/{cache,logs} $ sudo vi /etc/hhvm/server.ini ; php options pid = /var/run/hhvm/pid date.timezone = Asia/Tokyo
  • 18. PHP との互換性 ウェブサイトの PHP 関数リファレンスを参照 ◦ http://docs.hhvm.com/manual/en/phpfuncref.php ◦ 関数ごとに HHVM の対応状況が記載されている 2014/05/02 社内勉強会資料 18
  • 19. 高速化のための約束 トップレベルに処理を書かないこと ◦ おそらく JIT の対象外 2014/05/02 社内勉強会資料 19 $ cat test1.hh <?hh for($i=0;$i<10000000;++$i); $ time hhvm test1.hh real 0m1.410s user 0m1.371s sys 0m0.036s $ cat test2.hh <?hh function test() { for($i=0;$i<10000000;++$i); } test(); $ time hhvm test2.hh real 0m0.186s user 0m0.147s sys 0m0.036s 実は最初のベンチマーク結果には嘘があります
  • 20. ベンチマーク (真実) 2014/05/02 社内勉強会資料 20 17.93 14.00 20.19 15.81 15.10 12.54 13.77 10.64 2.16 14.13 1.84 26.67 9.40 7.44 60.45 24.17 #N/A 10.67 7.86 2.45 1.92 2.21 9.37 7.72 2.81 5.45 #N/A 10.53 5.70 2.48 0 10 20 30 40 50 60 70 PHP と HHVM の実行時間の比較 [秒] PHP PHP on HHVM HHVM
  • 23. Hack の言語機能 ウェブサイトのリファレンス ◦ http://docs.hhvm.com/manual/en/hacklangref.php ◦ これを読めばだいたいわかる 2014/05/02 社内勉強会資料 23
  • 24. 独習 Hack ウェブサイトのチュートリアル ◦ http://hacklang.org/tutorial ◦ これをやればだいたいわかる 2014/05/02 社内勉強会資料 24 ◦ エディタになっていて自由にコードを書ける
  • 25. 独断と偏見による分類 静的型に関する機能 ◦ Type Annotation ◦ Generics ◦ Nullable ◦ Type Aliasing さまざまな複合データ型 ◦ Collections ◦ Vector, Map, Set, Pair ◦ Shapes ◦ Tuples その他 (わりとどーでもいい) ◦ Hack Modes ◦ Async ◦ Continuations ◦ Traits / Trait Requirements ◦ Lambda Expressions 2014/05/02 社内勉強会資料 25 以下のスライドでは下線を引いた機能をピックアップして紹介
  • 26. Type Annotation 型を書くのは・・・ ◦ 関数定義の引数と戻り値 ◦ クラスのメンバ変数 関数内部のローカル変数には型を書かない ◦ 型を書かない != 型が付かない ◦ 書かなくても自動的に推論して型エラーを検出する 2014/05/02 社内勉強会資料 26 $ vi test.hh <?hh function add(int $a, int $b): int { $c = $a + $b; return $c; }
  • 27. 型検査の実行 hh_client を使う 2014/05/02 社内勉強会資料 27 $ touch .hhconfig $ hh_client check No errors! $ hh_client stop ◦ 裏側で hh_server プロセスが起動し .hhconfig 以下を監視するらしい ◦ hh_client stop で hh_server プロセスを停止する
  • 28. 型エラーの検出 ◦ 関数の戻り値の型は int でなければいけない ◦ ところが、引数の $b が float なので $c は int + float = float である ◦ というわけで、戻り値の型が正しくないと文句を言っている 2014/05/02 社内勉強会資料 28 $ vi test.hh <?hh function add_error(int $a, float $b): int { $c = $a + $b; return $c; } $ hh_client check /.../test.hh:4:10,11: Invalid return type /.../test.hh:2:39,41: This is an int /.../test.hh:2:28,32: It is incompatible with a float
  • 29. 型エラーの修正 ◦ intval 関数を入れることで $c の型が int になった ◦ 単に int にキャストする方法でも同じ 2014/05/02 社内勉強会資料 29 $ vi test.hh <?hh function add_error_fixed(int $a, float $b): int { $c = intval($a + $b); return $c; } $ hh_client check No errors!
  • 30. Nullable ◦ 型の先頭に ? を書くと null 許容型になる このプログラムには型エラーがあります (次のスライドで説明) 2014/05/02 社内勉強会資料 30 $ vi test.hh <?hh function add_null(?int $a, int $b): int { $c = $a + $b; return $c; }
  • 31. Nullable (型エラーの検出) ◦ $a は算術演算子 “+” で使われるので int か float でなければいけない ◦ ところが $a は null 許容型である ◦ というわけで、型のエラーだと文句を言っている 2014/05/02 社内勉強会資料 31 <?hh function add_null(?int $a, int $b): int { $c = $a + $b; return $c; } $ hh_client check /.../test.hh:3:8,9: Typing error /.../test.hh:3:8,9: This is a num (int/float) because this is used in an arithmetic operation /.../test.hh:2:19,22: It is incompatible with a nullable type
  • 32. Nullable (型エラーの修正) ◦ null のときは 0 を代入することで、演算の箇所での $a は int になった ◦ 三項演算子を使って書いても同じ 2014/05/02 社内勉強会資料 32 $ vi test.hh <?hh function add_null(?int $a, int $b): int { if ($a == null) { $a = 0; } $c = $a + $b; return $c; } $ hh_client check No errors!
  • 33. Shape 2014/05/02 社内勉強会資料 33 $ vi test.hh <?hh type person = shape('name' => string, 'age' => int); function is_adult(person $p) : bool { return $p['age'] >= 20; } function test() { $taro = shape('name' => 'Taro', 'age' => 25); echo is_adult($taro) . "¥n"; } ◦ Key の値が固定された配列 ◦ 右辺の型に person という名前を付けている (type aliasing; 後述)
  • 34. Shape (型エラーの検出) ◦ $no_name には “name” フィールドが無い ◦ is_adult 関数の引数 $p は person 型で “name” フィールドが定義済み ◦ というわけで、引数の型が正しくないと文句を言っている 2014/05/02 社内勉強会資料 34 function is_adult(person $p) : bool { ... } function test() { $no_name = shape('age' => 25); // name が無い echo is_adult($no_name) . "¥n"; } $ hh_client check /.../test.hh:10:17,24: Invalid argument /.../test.hh:9:14,18: The field 'name' is missing /.../test.hh:4:19,24: The field 'name' is defined
  • 35. Shape (初期化後の代入) ◦ 左は OK, 右は NG ◦ Shape のキーには定数文字列しか使えない 2014/05/02 社内勉強会資料 35 function test() { $taro = shape(); $taro['name'] = 'Taro'; $taro['age'] = 25; echo is_adult($taro)."¥n"; } function test() { $taro = shape(); $taro['na'.'me'] = 'Taro'; $taro['age'] = 25; echo is_adult($taro)."¥n"; } $ hh_client check /.../test.hh:10:9,19: Was expecting a constant string (for shape access)
  • 36. Type Aliasing ◦ 右辺のデータ型に左辺の別名を付ける ◦ プログラムが分かりやすくなる 2014/05/02 社内勉強会資料 36 $ vi test.hh <?hh type point = shape('x' => int, 'y' => int); function new_point(int $x, int $y) : point { return shape('x' => $x, 'y' => $y); } function get_x(point $p) : int { return $p['x']; } function get_y(point $p) : int { return $p['y']; }
  • 37. Type Aliasing (newtype) ◦ newtype を使うと、ファイルの外側からは右辺が見えなくなる ◦ プログラムのモジュール化に役立つ 2014/05/02 社内勉強会資料 37 $ vi test.hh <?hh newtype point = shape('x' => int, 'y' => int); function new_point(int $x, int $y) : point { return shape('x' => $x, 'y' => $y); } function get_x(point $p) : int { return $p['x']; } function get_y(point $p) : int { return $p['y']; }
  • 38. Type Aliasing (型エラーの検出) ◦ point の実体が shape(‘x’ => int, …) だということは隠されている ◦ というわけで、$p はコンテナではなく point だと文句を言っている 2014/05/02 社内勉強会資料 38 <?hh require 'test.hh'; function main() : void { $p = new_point(1, 2); $p['x'] = 3; } $ hh_client check /.../main.hh:6:3,9: This is not a container, this is an object of type point /.../main.hh:5:38,42: You might want to check this out
  • 40. hh_client と HHVM HHVM では実行開始時に型検査するわけではない ◦ 関数の先頭で仮引数と実引数の型が合致しているか検査 ◦ 関数を抜けるときに戻り値の型が合致しているか検査 hh_client がエラーにするコードも HHVM では実行できる 2014/05/02 社内勉強会資料 40 $ cat type_error.hh <?hh function test($cond): int { return $cond ? 1 : 'foo'; } print test($argv[1]) . "¥n"; $ hhvm type_error.hh 1 1 $ hhvm type_error.hh 0 Fatal error: Value returned from test() must be of type int, string given in /.../type_error.hh on line 3