まっしろけっけ

めもてきなやーつ

GMOペパボに入社しました

はじめに

タイトルの通りGMOペパボに入社しました。
7月1日から働き始めてるので実際には約10日程たってます。
なんで転職したかとか周りの人にあまり説明+お知らせをしていないので
それ用の記事と現在の自分の考えをメモっておくように記事を書いてます。

転職しようと思った訳

前職もweb系のエンジニアとしてRuby書いていたわけですが、
今年(2015年)の初め頃から、
社内でRubyRailsを使用したサービス開発で学びや技術的な刺激を受ける機会が激減したと感じ始めた。
激減した理由としては当時1年半くらいRuby書いていて、
社内でRubyをメインで使用して開発しているエンジニアとしては経験年数が長くなり知識が増えたことが
原因だと思っている。

その為、技術的な刺激を求め社外のRuby系の勉強会などに参加したりしていたが
普段自分が何気なく書いているコードに関しても、もっと良い方法があるんじゃないか?
とか色々考えるようになり、転職をしようかと考えた。

ただ、すぐに転職活動を行わなかったのはまだ当時の会社でやりたいことがあったこと
担当していたサービスを任せられるエンジニアを育成すること
その他色々な理由で2015年後半に転職活動をしようと思っていたのです。

2015年後半…?

「え、おまえ後半入って速攻で転職してるやん」ってなると思うのですが
理由は色々あるのです。
タイミング的なあれだったり、ゴールデンウィークからの社会復帰に失敗したからとか
大人の事情とか、そういうものだと思ってください。
悪いことはしてません

なんでペパボ?

転職する一番の理由がRubyの凄いエンジニアのいる会社で働いて自分の技術力をもっと磨きたいなので
とりあえず頭に浮かんだ会社が2社ありその片方がペパボでした。

pepabo.com

とりあえず話聞きたいと思い上記の制度を利用しお話を聞きに行くことに
@kentaro,@hsbtのお二人を指名させていただきました。
現状抱えている課題や今後人が増えていく上で起こりえるであろう課題等、本当に細かいことまでお答えしていただき
当時はそれなりに人数の多い会社で働いていたのでRubyでの開発以外のそういう部分の課題の解決にも携われたら面白いだろうなと思い受けてみたら、ありがたいことに採用して頂いたという経緯です。
頭に浮かんだもう一社についてはお祈…

実際どうなの?

1,2週間働いただけなのでまだまだわからないこと多めですが、
3日目くらいからSlackで@udzuraさんと技術的な会話が出来たり、
技術的な刺激を受ける機会は多いなと感じている。
やらなければいけないことや技術的な課題も多々あるのでやり甲斐も凄く感じていて
楽しくなりそうな気配はしている。

さいごに

こんな経緯で今回GMOペパボで働くことになりました。
今後に関して当分はRubyでサービスの開発を行っていくとのがメインになるかと思いますが、
解決したい課題も多々あるので、
インフラや基盤の方でサービスを作るエンジニアを支えるという立場を経験するのも面白そうだなという思いがあります。

ペパボに興味がある方はペパランチョンで話を聞きに来るも良し下記から申し込むのも良しかと思います。

pepabo.com


このエントリーはもし誰かに怒られたら消します

PHPでmemcachedに保存されたセッション情報をRubyで扱う

経緯

PHPで作成されたシステムで発行されたsession idを元に
Rubyからそのセッションに格納されている情報を知りたいかもしれないという状況が
あるかもしれない。
無事社会復帰を果たした会社で話題になったので調べてみた。
前々職の際にPHPmemcachedに関して結構調査してたりしたので大分行けそうな気はしていた。
途中経過をメモ

環境

php.iniにて下記のように設定

session.save_handler = memcached
session.save_path = "localhost:11211"

memcachedlocalhostのport11211で動かしています。

PHPにてsessionに何かを保存する

今回は適当なデータを格納するスクリプトを作成
session.phpというファイル名で保存

#!/usr/bin/php
<?php
session_start();

echo $_SESSION['count'] = rand(1, 100);
$_SESSION['testkey'] = 'hoge';

echo session_id();
echo "\n"
?>

実行してsession idを確認してみる

$ php session.php
66
f1sk3iprn07l2vu6a5e09dqd86 # これがデータを格納したsession id

memcachedにどのようなデータが格納されているか確認する

memcached-toolっていうコマンドを使ってmemcachedをいじれたりする

$ memcached-tool localhost:11211 dump
Dumping memcache contents
  Number of buckets: 1
  Number of items  : 1
Dumping bucket 3 - 1 total items
add memc.sess.key.f1sk3iprn07l2vu6a5e09dqd86 0 1435838226 30
count|i:66;testkey|s:4:"hoge";

先ほどのphpスクリプトを実行して表示されたsession idの前に
「memc.sess.key.」が付いている。
ここをみるとPHPが勝手に付ける仕様のようだ。

セッションに格納していたデータは「count|i:66;testkey|s:4:"hoge";」このようにシリアライズ
されて保存されている。
phpの標準のserialize関数ではなくmemcachedの独自のシリアライズっぽい?

Rubyで取得してみる

memcachedのデータを扱うgemはそのままevan/memcached · GitHubを使ってみたのですが、ここでエラーが出たので断念。
phpで独自のシリアライズ保存されたデータだからそりゃそうなのだが…

ということでmperham/dalli · GitHubこちらを試してみた。

$ gem install dalli
$ irb
irb(main)> require 'dalli'
irb(main)> dalli_client = Dalli::Client.new('localhost:11211')
irb(main)> dalli_client.get "memc.sess.key.f1sk3iprn07l2vu6a5e09dqd86"
=> "count|i:66;testkey|s:4:\"hoge\";"

これでシリアライズされたデータが取得出来た。

まとめ

PHPで生成されたsession idを元にsessionに格納されたデータ(シリアライズされたデータ)を
取得することに成功した。

とりあえず今日はここまで
TODOは以下

しかし久しぶりにPHP書いたな

技術書をまとめ買いしたよ

ネタがあまりないので雑談
なぜか2週間くらい暇になり、
なぜか会社でRubyを教えたm君にAmazonギフト券を貰ったので
3冊ほどまとめ買いしたものと最近読んだ1冊をまとめておく。
本当はkindleのセールの際に買おうと思ったのだがセールが終わってしまい買えなかったので
このタイミングで買った

買った本

自分はインフラエンジニアではないが、いろいろやったりしているので
一般的なインフラエンジニアと認識の違いがないかを知りたかったので基本的な本を選んでみた。
大きな認識の違いがなかったが、細かい部分を知れたことと幾つかのコマンドやオプションを新しく知れたのでよかった。

インフラ/ネットワークエンジニアのためのネットワーク技術&設計入門

インフラ/ネットワークエンジニアのためのネットワーク技術&設計入門

ネットワーク関連があまり得意ではないので
勉強したくて読んでいる(もう少しで読み終わる)
図解が多くイメージがしやすい。

Amazon Web Services パターン別構築・運用ガイド

Amazon Web Services パターン別構築・運用ガイド

AWSを知らないで許されるのは小学生までだよねー」と最近思っている(危機感を感じている)ので
買った上記のネットワーク本が終わったら読む予定

クラウドつながりでOpenStackも面白そうなので買った。

まとめ

インフラの本ばかりになってしまいましたが、
インフラエンジニアに転向する訳ではありません。
(いずれそっち方向に進むのは結構ありだと思っているけど)
Serverspec本を書い忘れていたので、
上記の本を読み終わったらServerspec本を購入する予定

golangのフレームワークkochaを使ってみた その2

shiro-16.hatenablog.com
こちらの続き

modelを作成する

今回はmysqlを使用します。
今回作成したtableは下記です。

CREATE TABLE `user` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `name` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB;

modelを自動生成する。

$ kocha g model user
    create directory app/model
              create app/model/user.go
    create directory db
              create db/config.go

dbのconfigの変更
デフォルトではsqlite3の設定が記述してあるようです。

$ vi db/config.go
- Driver: kocha.Getenv("KOCHA_DB_DRIVER", "sqlite3"),
- DSN:    kocha.Getenv("KOCHA_DB_DSN", filepath.Join("db", "db.sqlite3"))
+ Driver: kocha.Getenv("KOCHA_DB_DRIVER", "mysql"),
+ DSN:    DSN:    kocha.Getenv("KOCHA_DB_DSN", "user:password@/kocha"), // 各時の環境に合わせてuser名とpassword,db名を設定

modelを変更

$ vi app/model/user.go
- Id int64 `db:"pk" json:"id"`
+ Id   int64
+ Name string

controllerを作成

$ kocha g controller users
              create app/controller/users.go
              create app/view/users.html

controllerを変更

$ vi app/controller/users.go
func (us *Users) GET(c *kocha.Context) error {
        var users []model.User
        err := db.Get("default").Select(&users)
        if err != nil {
                return c.RenderError(500, nil, nil)
        }

        return c.Render(map[string]interface{}{
                "ControllerName": "Users",
                "users": users,
        })
}

viewを変更

$ vi app/view/users.html
<h1>This is Users</h1>

<ul>
  {{ range $.users }}
    <li>{{ .Name }}</li>
  {{ end }}
</ul>

動作確認

$ kocha run
kocha: you can be setting for your app by the following environment variables at the time of launching the app:

    KOCHA_ADDR="127.0.0.1:9100"
    KOCHA_DB_DRIVER="mysql"
    KOCHA_DB_DSN="user:password@/kocha"

Starting...

Listening on 127.0.0.1:9100
Server PID: xxxx

上記が表示されたら前回同様http://127.0.0.1:9100/で「Welcome to Kocha」が表示され
http://localhost:9100/usersで「This is Users」 + 「user.nameのリスト」が表示されます。

Routingに関しての補足

routingに関してはcontrollerを作成したときに自動で追記されていました。

var routes = RouteTable{
        {
                Name:       "root",
                Path:       "/",
                Controller: &controller.Root{},
        }, {
                Name:       "users",
                Path:       "/users",
                Controller: &controller.Users{},
        },
}

疑問 + その3に関して

1.Railsのshowとかその他get methodを追加したい場合とかは
各controllerのGETで処理を分岐させたりするのだろうか?

2.Migrationの機能もあるようなのでその辺の使い方

上記2点をその3で書ければいいかなと思っていますが、
その3に関しては未定です...mm

golangのフレームワークkochaを使ってみた その1

経緯

golangを学習し始めて2週間〜3週間くらい、
ちょっとわかってきたので
そろそろフレームワーク使ってみたいなと思い調べ始めた。
ちなみにgolangの学習は下記のページや書籍など

A Tour of Go
web上でさくっと出来る

Effective Go — プログラミング言語 Go ドキュメント v0.1 documentation
ドキュメントてきな

Go For Perl Mongers
すごくためになった

taizo - Qiita
会社の先輩のqiita初心者がつまずく点がいっぱいまとまってあった

Amazon.co.jp: 基礎からわかる Go言語: 古川 昇: 本
基本的なことはこれ読めばわかる気がする

kochaを選択した理由

Kocha web application framework for Go

サンプルをチラっと見た感じだとRailsっぽいじゃんという理由で要はなんとなくです。
強いて言うならRails好きだからです。ちなみに和製らしいです。

ほかにもmartini,revelあたりは使ってみようと思っているので後々記事を書くかもしれない。

serverを立ち上げる

$ go get github.com/naoina/kocha

これでkochaを取得してくる

$ go get github.com/naoina/kocha/cmd/...

これでkochaコマンドが使える

今回はアプリケーション名をexample-kochaで作成します。
※GOPATH部分は各自の環境によってかわります。

$ kocha new example-kocha
    create directory /GOPATH/src/example-kocha/app/controller
              create /GOPATH/src/example-kocha/app/controller/root.go
    create directory /GOPATH/src/example-kocha/app/view/error
              create /GOPATH/src/example-kocha/app/view/error/404.html.tmpl
              create /GOPATH/src/example-kocha/app/view/error/500.html.tmpl
    create directory /GOPATH/src/example-kocha/app/view/layout
              create /GOPATH/src/example-kocha/app/view/layout/app.html.tmpl
              create /GOPATH/src/example-kocha/app/view/root.html.tmpl
    create directory /GOPATH/src/example-kocha/config
              create /GOPATH/src/example-kocha/config/app.go
              create /GOPATH/src/example-kocha/config/routes.go
              create /GOPATH/src/example-kocha/main.go
    create directory /GOPATH/src/example-kocha/public
              create /GOPATH/src/example-kocha/public/robots.txt

初めてrails newした時と同じ気持ちを味わえましたね!

serverを立ち上げる

$ cd /GOPATH/src/example-kocha
$ kocha run
kocha: you can be setting for your app by the following environment variables at the time of launching the app:

    KOCHA_ADDR="127.0.0.1:9100"

Starting...

Listening on 127.0.0.1:9100
Server PID: xxxxx

これでhttp://127.0.0.1:9100/にアクセスすると
「Welcome to Kocha」が表示されると思います。

処理の流れをざっくりと追う

config/routes.go内で下記のようにrouting周りの記述されている。
routingを追加する場合はここに追記する感じになるっぽい

var routes = RouteTable{
        {
                Name:       "root",
                Path:       "/",
                Controller: &controller.Root{},
        },
}

Path(今回の場合は/)へのアクセスの際にControllerに格納された各controllerを呼ぶ。

Controllerのinterfaceがどのようになっているのかは下記を参照
https://github.com/naoina/kocha/blob/master/controller.go#L27-L64

HTTPの各methodでcontroller側のどのmethodを呼ぶかを解決しているのが下記
https://github.com/naoina/kocha/blob/master/router.go#L93-L121

今回の場合はapp/controller/root.goが対象のcontrollerになり
GETでアクセスしているので下記のmethodが呼ばれる。

func (r *Root) GET(c *kocha.Context) error {
        return c.Render(map[string]interface{}{
                "ControllerName": "Root",
        })
}

表示されているviewはapp/view/root.html.tmpl

ざっくりしすぎですがこんな感じ

今後

controller, model周りの実装もあるのですが
長くなりそうなのでその2にて書いていきます。

kochaのソースを読むと構成とかとても勉強になる
間違いがあればご指摘いただけますと幸いです。

画像の色解析を行うrmagick-image_colorsというgemを作った

経緯

shiro-16.hatenablog.com

こちら経緯にもある通りデザイナーさんに言われたことを実現するため。

rmagickというgemがあるのでそれの拡張的な感じで書ければいいなー
と思い設計してみた。

概要

rmagick-image_colors | RubyGems.org | your community gem host

github.com

画像のURLもしくはpathを指定し、
その画像で使われている画像の色を解析し
多い色の順番に配列としてカラーコードとpointを返してくれる

install

gemなのでgemコマンドでinstallできます。
Gemfileに追記でもおk

$ gem install rmagick-image_colors

※RMagickを使っているのでImageMagickが必要になります。

使い方
image_colors = Magick::ImageColors.new('spec/fixtures/test.jpg')
image_colors.colors
=> [["#9AAEC9", 5], ["#9DAEC8", 4], ["#FDFDFD", 4].......

test.jpgの猫は同僚の実家で買っているとら様です

まとめ

RMagickはCで実装されている部分が多いのでRuby読むよりつらい・・・
大きい画像だとパフォーマンスがひどいことになる・・・
作成した後にMagick::Image#colorsをC言語で実装して
issue作成して本体にpull request送ってあわよくば取り込んで貰うとかやった方が良かったのかもと思った。時間があればやってみたい。

色を扱うColorCodeというgemを作った

経緯

デザイナーさんに「こんなことやりたいんですけど・・?できます・・?」と聞かれ
ちょっと調べたら出来そうだったので「出来そうですよ!」と返事したらやることになった。

実装方法を考えてたら今回作成したようなロジックを思いつき
gemとして作ればいいんじゃね?ってなった。

設計も終わり作り始める直前に、もしかしたら同じようなgemあるのでは?と思いつき調べたら
colorというgemがあった。軽く見ただけだが同じような設計になっている気がした。
がしかしメンテされてない + 自分と他人のRubyのコードを比較する機会が
今の仕事てきな環境だと少ないので作ってからcolorの方のソースも読んで比較すれば
勉強になるかなと思って作ることにした。

※デザイナーさんがやりたいことはこのColorCodeと
これから作るもう一つのgemを使って行う予定

概要

color_code | RubyGems.org | your community gem host

github.com

RGBとHSL色空間を相互に変換出来るClassです。

install

gemなのでgemコマンドでinstallできます。
Gemfileに追記でもおk

$ gem install color_code
使い方

RGB class

rgb = ColorCode::RGB.new(r: 255, g: 0, b: 0)
rgb.to_s # => '#ff0000'
rbg.to_hash # => { r: 255, g: 0, b: 0 }
rgb.to_hsl # => #<ColorCode::HSL>

HSL class

hsl = ColorCode::HSL.new(h: 0, s: 100, l: 50)
hsl.to_s # => '#ff0000'
hsl.to_hash # => { h: 0, s: 100, l: 50 }
hsl.to_rgb # => #<ColorCode::RGB>

その他に関して後々examplesとかを追加しようと思います。
コード量が少ないのでコードを読んだ方が早い気もしますが・・・

まとめ

RGBはもちろん知っていましたが
HSL色空間に関して知識が乏しかったのでこの機会に学べたのはよかった。
たぶんcolorのgemを使っていたらそこまでHSL色空間を理解せずに使ってしまった気がする。
gemのcolorがどのように実装しているのかはこれから見るので実装の違いを見つけて
楽しもうと思いますw