やまごや

皆で Minecraft か Diablo3 (PC版) をやろう

PHPカンファレンス2015にいってきた

先週の土曜日に、PHPカンファレンス2015に午前の途中から参加してきた。 だいぶ遅くなったけど、参加して聞いた発表ごとの感想を自分なりに纏める。

岸田さん - Composerではじめるアプリケーション開発

資料

https://speakerdeck.com/player/6747f5a70f5444188f8db70b4492736a?#

きいてみて

普段何気なく使用しているcomposerだが、未だまだ解っていない箇所が多いと感じた。 あと、途中から参加したため前席へ座りづらく後ろの席に座ってしまい、せっかくのライブコーディングが殆ど見えなかった。遅刻はよくない。

composer を使うとインストールが遅いのが悩みだったので、発表が終わったあとに岸田さんにcomposerのインストールを早くする方法が無いかお尋ねしたところ、資料のアップロード等でお忙しい中色々と教えていただきました。 有難う御座います。

まずは、composerのconfigにgithub oauth token を設定した。 また、vv オプションでボトルネックになっている箇所を見極めてから、 --prefere-dist や --prefere-sourceを指定してみて、packagist.jp の利用や自社ミラーサーバーを建てるかなど検討したいと思う。

Rasmus さん - 基調講演

資料

見当たらなかった。

きいてみて

PHP7の話だった。通訳があって本当に良かった。 また、事前にuzullaさんのYAPC2015での発表を視聴していたので理解できる箇所が増えてよかった。 それでも良く分からないものが多かった。

とりあえず間違っているかもだけどメモで残しとく。

  • opcache(メモリにキャッシュ) のための cache をディスク上にもつことでさらに早くなるとか。
  • composer の動作が 4 倍早くなるとか
  • 抽象構文木の実装(Rasmusさん自体はこの導入が一番気に入ってるとのこと)
  • java のように fucntion が return する型を指定できるようになった
  • スカラ値でも指定ができる
  • ストリクトタイプの指定により厳密な型判断をおこなえる
  • null corabless operatorの追加 ??
  • spaceship operatorの追加 <=>
  • Fatalをtry-catchできるようになった
  • 多くの互換性のためのコードを削除した
  • 新しい予約後の追加
  • 数値の扱いについて色々と酒精
  • コードを左から右へ評価するように統一した
  • Unicode Code point syntax
  • php7 には今jitはない
  • Drupal8, wordpress 4.1.1 など色々なソフトウェアに対してベンチしていた
  • zendとhhvm。どちらの陣営もwordpressをベンチの軸として争っている
  • GCC Feedback-Directed Optomozatoo (FDO)
  • コードの最適化を行なうもの
  • wordpressのコードで、PHP-FDO 100回したものとHHVMだと同等のスコアになったらしい
  • php7の正式なリリースの前に、今から皆にしてほしい
  • vagrant や docker イメージも準備しているとのこと
  • その環境では php 5.3 - php7 の20までのプリコンパイルされたバージョンが入っているらしい

php7のvagrantは今日のお昼休みにでも試したいと思う。 環境構築が終わったら、演算子や細かい挙動を実際に自分で試そう。

arimoさん - DMMのハイパーメディアオタサーの姫 arimoが語る Phalcon

資料

https://speakerdeck.com/player/9a1cde2289bb434d81425d4c85f46ba0?#

きいてみて

冒頭の10分間はPhalconと全く関係のない痔の話とか色々と愉快な雑談で楽しかった...w でも、もう少しPhalconの話を聞きたかった気持ちもある。

Phalcon を選んだ理由は、インフラから覆るような大きな仕様変更が発生。 より速度を重視した結果 FuelPHP から Phalcon に乗り換えたらしい。 経験者が居たことも採用理由の一つとしてあげられていた。

途中でPHP脆弱性のためにPHPを5.6にしたことで、 Phalconのバージョンも1から2に上げないといけなくなり大変だった。

大変な理由は Phalcon 1 系は C で。 2 系は Zephar で出来ているらしい。 Zephar はビルド時に C言語コンパイルされるものらしい。Zephar自体を知らなかった。。。

あと、Zephairでエラーがでると .zep ファイルがサーバー上に出力されるらしく、エラーの確認が凄く大変そうだと思った。 正直、自身の技量では保守するのがとても難しいフレームワークだと感じた。

質問出来なかったが、個人的に気になったことはphp7を使うとなった場合、 特に問題動作するのかというところと、エラーの確認もう少し簡単に行なう方法ないのかというところだった。

市川さん - 脆弱性もバグ、だからテストしよう PHPカンファンレス2015

資料

http://www.slideshare.net/ichikaway/php2015-53484885?ref=https://techstars.jp/blog/php2015-1/

きいてみて

会場には、自身が携わっているプロダクトに対して、セキュリティテストを実施されている人が自分が思っていたよりも多かった。

今後のトレンドとしては、CIにセキュリティテストも組み込んでいくのが理想とのこと。

市川さんが携わられているVaddyは、セキュリティテスト用のWEBサービスで、 FreePlanで使い続けることが可能。ただし、スキャン時間の上限が5分なため、 大規模なプロダクトで使用する場合は課金する必要がある。

デモでは、XSS脆弱性が含まれるログイン画面をベースに行われていた。 Vaddyの画面自体は各種CIの画面と似ている形で見やすい感じがした。

スキャン時に送信したリクエストが確認できるので、手動での再現も簡単そうに見えた。

質問タイムでは、プロダクトへVaddyを導入する際に、お客様へ信頼してもらいやすくなるような資料等は用意されていたりするのか?や、検査結果をWEB上だけでなく出力するこは出来ないか?と言った質問が出た。 検査結果の件については結構要望多いらしく検討されているとのことだった。

LT 大会

資料

https://speakerdeck.com/player/3eea01f6480c4c5996cc0c988435a63a?#

きていみて

岸田さんとマスクドPHPさんの話を聞いたところで退場した。 岸田さんが上げられていたFakerは自分も知っていたが、Fabricateについては知らなかったので利用してみようと思う。マスクドPHPさんのRubyだと力出せないからPHPに作り変えて、PHPで解くというのは凄く聞いていて面白かったwロシア語に対応したり、ついでに日本語にも対応するところがサービス精神旺盛で良いな〜と思った。

全体を通して

質問タイムが設けられていないトラックもあったので、次回もし可能であれば質問タイムを設けて欲しい。 中々、自分から突撃して質問しにいくのは初対面だとしづらい。。。

最後になりましたが、スタッフの皆様、カンファレンスのネットワークを支えてくれた CONBU の皆様。 こんなに楽しい会を本当に有難う御座いました!

開発部で「ごみすて」をはじめてみた

1 週間前からごみすてという取り組みを開発部内で個人的にはじめてみたので、今日はそれについて書こうと思う。

ごみすて?

日々の技術的負債をチョコチョコと返していく取り組み。

下記のことを出来る限り意識してごみすてをしている。

意識していること

  • 注力しない

利用しているユーザーが喜んでくれるものを作ることが自分の仕事で、技術的負債を返すことが自分の仕事ではない。リファクタリングをしてコードが綺麗になっていくのはとても気持ちが良くて没頭しそうになるが、そうならないように注意している。昼飯食べたあとや帰る前とかにチョコっとヤるだけにしている。

  • コンフリクトさせない

規模の大小に関係なく、他の技術者が改修作業を行っているファイルに対してのごみすては控える。どうしてもやりたい時や、気付かないうちにそうなっていたら相談したり謝ったりなどするようにしている。

  • 大きな変更にしない

ごみすてにもレビューは必須にしているので、確認者の確認コストが膨らまないように出来るだけ小さなごみすてになるように意識している。もちろんコミットメッセージも丁寧に書く。

なぜやっているの?

開発業務でリリースの期限に追われていると、不要な処理や意図の伝わりにくいコードが有ったとしても、「後で片付ける!」と言ってそのままリリースをしてしまうことがある。そして、本当に後から片付けが行われたことは自分の知る限りではなく、次に何をしているのかと言うと新たな機能を作ってたりして、ごみが溜まっていくという負のループを繰り返していた。

常日頃から、「少しだけリファクタリングに時間をとりませんか?」と CTO や他のメンバーに対して言っている自分がこんなのでは「お前色々言ってるけど駄目じゃんw」と笑われ、余計にリファクタリングとは疎遠な組織になってしまうと思い行動している。

どんな感じでやってるの?

ガチガチにやるのが自分としては好きではないので、最近一押しのキャラクター 「うまるちゃん」の布教を兼ねて、下の画像のようなゆるい感じでやっている。

f:id:ken880guchi:20150528001716p:plain

1 週間続けてみて

取り組みについてメンバーが賛同してくれて「自分もごみすてやろっかな?」みたいなことをいってくれたのが嬉しかった。やっぱり、何かを発言する時はまず自分がやって見せることが大切なんだなー。

gem install knife-solo で Error

Chef 実践入門を読み始めた。

Chef実践入門――コードによるインフラ構成の自動化:書籍案内|技術評論社

P.30 に記載されている gem knife-solo install を行った際に、
自身の環境(Max OS X 10.9.5)だと Error が発生したので内容、原因、対応をメモ。

Error 内容

$ gem install knife-solo

Building native extensions.  This could take a while...
ERROR:  Error installing knife-solo:
ERROR: Failed to build gem native extension.

/Users/kenya/.rbenv/versions/2.1.1/bin/ruby extconf.rb
creating Makefile
/Users/kenya/.rbenv/versions/2.1.1/lib/ruby/gems/2.1.0/gems/libyajl2-1.1.0/ext/libyajl2
extconf.rb:104:in `makemakefiles': unhandled exception
from extconf.rb:138:in `<main>'

extconf failed, exit code 1

Gem files will remain installed in /Users/kenya/.rbenv/versions/2.1.1/lib/ruby/gems/2.1.0/gems/libyajl2-1.1.0 for inspection.
Results logged to /Users/kenya/.rbenv/versions/2.1.1/lib/ruby/gems/2.1.0/extensions/x86_64-darwin-13/2.1.0-static/libyajl2-1.1.0/gem_make.out

Error 原因

Error が発生している extconf.rb ファイルを開いてみる。

# extconf.rb

require 'rbconfig'
require 'fileutils'

if ENV["USE_SYSTEM_LIBYAJL2"]
  File.open("Makefile", "w+") do |f|
    f.write <<EOF
# dummy Makefile when we're not really installing
all:
\ttrue

install:
\ttrue
EOF
  end
  exit(0)
end

module Libyajl2Build
  class BuildError < StandardError; end

  LIBYAJL2_VENDOR_DIR = File.expand_path("../vendor/yajl", __FILE__).freeze

  PREFIX = File.expand_path("../../../lib/libyajl2/vendored-libyajl2", __FILE__).freeze

  def self.windows?
    !!(RUBY_PLATFORM =~ /mswin|mingw|windows/)
  end

  def self.libyajl2_vendor_dir
    LIBYAJL2_VENDOR_DIR
  end

  def self.prefix
    PREFIX
  end

  def self.deps
    require 'mkmf'
  end

  def self.setup_env
    RbConfig::MAKEFILE_CONFIG['CC'] = ENV['CC'] if ENV['CC']

    # set some sane defaults
    if RbConfig::MAKEFILE_CONFIG['CC'] =~ /gcc|clang/
      # magic flags copied from upstream yajl build system (-std=c99 is necessary for older gcc)
      $CFLAGS << " -std=c99 -pedantic -Wpointer-arith -Wno-format-y2k -Wstrict-prototypes -Wmissing-declarations -Wnested-externs -Wextra  -Wundef -Wwrite-strings -Wold-style-definition -Wredundant-decls -Wno-unused-parameter -Wno-sign-compare -Wmissing-prototypes"
      $CFLAGS << " -O2"  # match what the upstream uses for optimization

      # create the implib on windows
      if windows?
        $LDFLAGS << " -Wl,--export-all-symbols -Wl,--enable-auto-import -Wl,--out-implib=libyajldll.a -Wl,--output-def,libyajl.def"
      end
    end

    $CFLAGS << " -DNDEBUG"
  end

  def self.makemakefiles
    if RUBY_PLATFORM == "java"
      File.open("Makefile", "w+") do |f|
        f.write <<EOF
CC = gcc
TARGET = libyajl
DLLIB = $(TARGET).so
CFLAGS =  -I. -I../../../../ext/libyajl2 -fPIC -O3 -fno-fast-math -ggdb3 -Wall -Wextra -Wno-unused-parameter -Wno-parentheses -Wno-long-long -Wno-missing-field-initializers -Wunused-variable -Wpointer-arith -Wwrite-strings -Wdeclaration-after-statement -Wimplicit-function-declaration  -fPIC -std=c99 -pedantic -Wpointer-arith -Wno-format-y2k -Wstrict-prototypes -Wmissing-declarations -Wnested-externs -Wextra  -Wundef -Wwrite-strings -Wold-style-definition -Wredundant-decls -Wno-unused-parameter -Wno-sign-compare -Wmissing-prototypes -O2 -DNDEBUG
LDFLAGS = -L. -fstack-protector -rdynamic
#LIBS = -lpthread -ldl -lcrypt -lm -lc
LIBS = -lpthread -ldl -lm -lc
OBJS = yajl_alloc.o yajl_tree.o yajl_gen.o yajl_buf.o yajl.o yajl_encode.o yajl_lex.o yajl_parser.o yajl_version.o

all: $(DLLIB)

$(DLLIB): $(OBJS)
\t$(CC) -shared -o $(DLLIB) $(OBJS) $(LDFLAGS) $(LIBS)

%.o: ../../../../ext/libyajl2/%.c
\t$(COMPILE.c) $(OUTPUT_OPTION) $<

install:
\tmkdir -p #{prefix}/lib
\tcp $(DLLIB) #{prefix}/lib/$(DLLIB)
\tmkdir -p #{prefix}/include/yajl
\tcp yajl/*.h #{prefix}/include/yajl
EOF
      end
    else
      deps
      setup_env
      dir_config("libyajl")
      create_makefile("libyajl")

      # on windows the Makefile will try to export Init_libyajl which is wrong because we aren't a ruby lib.
      # i could not figure out how to tell mkmf.rb to stop being so helpful, so instead will just patch it here.
      if windows?
        makefile = IO.read("Makefile")
        makefile.gsub!(/\$\(DEFFILE\)/, '')
        File.open("Makefile", 'w+') {|f| f.write(makefile) }
      end

      system("pwd")
      # we cheat and build it right away...
      system("make >make.out 2>&1") || raise # rubinius doesn't like the output this generates
      # ...so we can hack up what install does later and copy over the include files

      File.open("Makefile", "w+") do |f|
        f.write <<EOF
TARGET = libyajl
DLLIB = $(TARGET).#{RbConfig::MAKEFILE_CONFIG['DLEXT']}
all:

EOF
        if windows?
          f.write <<EOF
install:
\tmkdir -p #{prefix}/lib
\tcp libyajl.so #{prefix}/lib/libyajl.so
\tcp libyajldll.a #{prefix}/lib/libyajldll.a
\tcp libyajl.def #{prefix}/lib/libyajl.def
\tmkdir -p #{prefix}/include/yajl
\tcp yajl/*.h #{prefix}/include/yajl
EOF
        else
          f.write <<EOF
install:
\tmkdir -p #{prefix}/lib
\tcp $(DLLIB) #{prefix}/lib/$(DLLIB)
\tmkdir -p #{prefix}/include/yajl
\tcp yajl/*.h #{prefix}/include/yajl
EOF
        end
end
    end
  end
end

Libyajl2Build.makemakefiles

該当の 104 行目を見てみると ruby から make コマンドを叩いていた。
周辺のコードも読めないなりに読んでみる。

makefile を作成時に C プログラムをコンパイルするプログラムに gcc を設定していることが解る。
エラーメッセージは unhandled exception。

そもそもの事前準備が整ってないのでは?と思いだす。
gcc コマンド使えるのかなと思って、gcc の version 確認をしてみることに。

Error 対応

sudo gcc --version

You have not agreed to the Xcode license agreements. You must agree to both license agreements below in order to use Xcode.

Hit the Enter key to view the license agreements at '/Applications/Xcode.app/Contents/Resources/English.lproj/License.rtf'

~ 長いので途中を省略 ~

By typing 'agree' you are agreeing to the terms of the software license agreements. Type 'print' to print them or anything else to cancel, [agree, print, cancel]

Xcode のライセンスに同意してなかったようだ。間抜けだなー。
あとは、言われた通りに Enter key を押下して英語の同意書を確認していく。
最後まで確認していくと、同意をするのなら agree と入力して下さいとあるので agree と入力。

gcc のバージョンを確認後、再度 gem knife-solo install を実行。
今度は無事にインストールされた。

# gcc のバージョン確認
$ sudo gcc --version

Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 6.0 (clang-600.0.51) (based on LLVM 3.5svn)
Target: x86_64-apple-darwin13.4.0
Thread model: posix

# knife-solo のインストール
$ gem install knife-solo
Thanks for installing knife-solo!

If you run into any issues please let us know at:
  https://github.com/matschaffer/knife-solo/issues

If you are upgrading knife-solo please uninstall any old versions by
running `gem clean knife-solo` to avoid any errors.

See http://bit.ly/CHEF-3255 for more information on the knife bug
that causes this.
Successfully installed knife-solo-0.4.2
Parsing documentation for knife-solo-0.4.2
Installing ri documentation for knife-solo-0.4.2
Done installing documentation for knife-solo after 1 seconds
1 gem installed

# knife が正常にインストールされているか確認
$ gem list | grep knife

knife-solo (0.4.2)

rbenv を使用している場合は rbenv rehash を忘れずに。
rbenv rehash を忘れがちな場合は、下記をインストールするのもありかと思った。

Ruby - rbenv を使っているなら rbenv-gem-rehash を使おう - Qiita