技術書典6出展レポート

みなさんこんにちは!虎の穴ラボのM.U.です。 4月14日(日)に開催された、技術書典6にスポンサー出展しましたので、ブースでの様子をご紹介します。
また、虎の穴では技術同人誌の委託も積極的に募集しており、技術書典6当日もダイレクト入庫サービスを実施しました。

技術書典 6 とは

技術同人誌の即売会イベントです。
会場は池袋サンシャインシティ2F 展示ホールD、11:00〜17:00の間に来場者が1万人以上になるほどの大規模なイベントです。

ブースの様子

当日ブースの様子です。今回は以下のノベルティを配布しました。

  • エンジニアメンバー執筆の技術同人誌「虎の穴ラボの薄い本。vol.2」
  • Gopherくんや園児キャラのシール
  • Gopherくんを描いたオリジナル缶バッチ

f:id:toranoana-lab:20190418175933j:plain

新刊「虎の穴ラボの薄い本。vol.2」

今回も新刊書きました。
前回の「虎の穴ラボの薄い本。vol.1」と比較して2倍以上のボリュームで無料配布しました。 しかも、今回の表紙デザインは大人気イラストレーター Aちき先生が担当して頂きました!

今回も無料配布ということもありましたが、15時前にはすでに配布は終了しました。
皆さんお手に取っていただき、誠に有難うございます。

来場者様向けアンケート

虎の穴では、毎回ブース出展の際には来場者様にアンケートを実施しています。イベント毎にテーマを選定していますが、今回のお題は「プログラマーが見るべきアニメ」!!
Twitterにもたくさんの方々に取り上げて頂きました。 皆様ありがとうございます!!

アンケート結果

さて、最終結果ですが…、以下のようになりました。

ツイートの写真のとおり接戦でした。
シールを貼った後もなぜそのアニメを選んだのか理由を聞かせてくれる方もいらっしゃいました。
現場のリアルな問題の描写があるとか、単純にプログラマーなら見てほしいって選んでいく方と選ぶ基準も人それぞれになっているようです。

ダイレクト入庫

技術書典では、委託販売業者にイベント会場の場で委託手続きが出来るダイレクト入庫サービスがあります。 虎の穴でもダイレクト入庫サービスを受け付けブースを設けさせていただきました。

https://pbs.twimg.com/media/D4GGe-cU4AA8e0v.jpg:large

通販、店舗で販売中です。

技術書典6のダイレクト入庫サービスで委託された作品は翌日の15日(月)からすでに秋葉原店Aの3Fにて販売を開始しました。 同時に通販サイトでも特集ページを設けております。是非ご覧ください。

とらのあなインフォメーションで特集ページを設置しました!

現在、とらのあなインフォメーションページでは技術書典6の委託同人誌の特集ページを組ませていただいています。 是非ご覧ください。

news.toranoana.jp

虎の穴エンジニアがPOPを書かせて頂いています。

実は技術書典で委託された技術同人誌はすべて虎の穴エンジニアがPOPを作成しました!同人誌一つ一つ拝読頂き、コメントを付けさせていただきました。 すでに店舗の棚に飾ってあります。よろしければ、是非こちらもご覧ください。

虎の穴ではいつでも技術同人誌を委託受付中です! 詳しくはサークル委託案内ページをご覧ください。

P.S.

最後に、弊社サービスを一緒に作り上げていくエンジニアを募集しています。 4月23日(火)に会社説明会を実施致します。ご興味のある方は是非ご参加ください。

yumenosora.connpass.com

【とらのあな主催】オタクがKotlinを追うライトニングトークイベントを開催しました!!

こんにちは!虎の穴ラボのY.Fです。

先週3月19日(火)に「【とらのあな主催】オタクがKotlinを追うライトニングトークイベント」を実施しました。 ご参加頂いた方、誠にありがとうございました!

yumenosora.connpass.com

イベント概要

日時: 2019年3月19日(火) 19:30〜22:00
場所:東京都千代田区外神田4-7-3 (秋葉原虎ビル4F)

とらのあなのエンジニア部署である「虎の穴ラボ」が主催するライトニングトーク会です。 ライトニングトークの練習をしながらKotlinについて勉強していく会となります。

ライトニングトーク

No. テーマ スピーカー
1 社内ツールをKotlin化してみた オーバツール(虎の穴ラボ)
2 Kotlinで雑に作るLispインタープリタ YF(虎の穴ラボ)
3 Ktorを試してみた YMD(虎の穴ラボ)
4 Javaの重力に魂を縛られている人々へ〜10年モノのJavaエンジニアがkotlinを1ヶ月ほど学んでみた〜 FORTE 様
5 Kotlin/JSと格闘しながらKotlinのイケてる文法を学ぶ subroh_0508 様
6 私にKotlinが舞い降りた -AndroidでのKotlin移行を見てきた視点からのKotlin- きりみん 様
続きを読む

【とらのあな主催】オタクが最新技術を追うライトニングトークイベント4回目を開催しました!!

こんにちは!虎の穴ラボのJUNE-JUNEです。

先週3月7日(木)に「【とらのあな主催】オタクが最新技術を追うライトニングトークイベント」の4回目を実施しました。 ご参加頂いた方、誠にありがとうございました!

yumenosora.connpass.com

1回目のレポート記事はこちら

【とらのあな主催】オタクが最新技術を追うライトニングトークイベントを開催しました!! - 虎の穴 開発室ブログ

2回目のレポート記事はこちら

【とらのあな主催】オタクが最新技術を追うライトニングトークイベント2回目を開催しました!! - 虎の穴 開発室ブログ

3回目のレポート記事はこちら

【とらのあな主催】オタクが最新技術を追うライトニングトークイベント3回目を開催しました!! - 虎の穴 開発室ブログ

イベント概要

日時: 2019年3月7日(火) 20:00〜22:00
場所:東京都千代田区外神田4-7-3 (秋葉原虎ビル4F)

とらのあなのエンジニア部署である「虎の穴ラボ」が主催するライトニングトーク会です。 ライトニングトークの練習をしながら最新技術への導入・入門として一緒に勉強していく会となります。

ライトニングトーク

No. テーマ スピーカー
1 Ruby & Railsアップデートの戦い JUNE-JUNE(虎の穴ラボ)
2 ionicを使ってスマホアプリを作ってみた SS(虎の穴ラボ)
3 Pythonの勉強がてら死活監視ツールを作った話 HIRAYAMA(虎の穴ラボ)
4 Dive into BuildKit by reading Go source code po3rin 様
5 雑に理解するKubernetes(Kubernetes超入門) まさちゃこ 様
6 ゲームループ clown_kage 様
続きを読む

RubyでLambdaからDynamoDBにデータ登録する

こんにちは!虎の穴ラボのNSSです。
最近はAlexaスキルやサーバーレスアプリケーションについて勉強しています。
今回はAWS LambdaからDynamoDBを利用する方法を紹介したいと思います。

1. ローカル開発環境構築

AWS サーバーレスアプリケーションモデル(AWS SAM)の開発環境を構築します。
AWS SAMはAWSでサーバーレスアプリケーションを構築するためのオープンソースフレームワークです。
ローカルでのサーバーレスアプリケーションの開発・テスト・デプロイをサポートしてくれます。
今回は、macOS上にAWS SAMの開発環境を構築していることを前提とします。

下記の公式にしたがって構築します。 python、pip、Dockerのインストールはご自身のPCの環境に応じて実施してください。

2. 処理の実装

処理を実装していきます。

2-1. サンプルアプリケーションの作成

sam init コマンドを実行するだけで、サンプルアプリケーションを作成することができます。

sam init -n ruby-sample -r ruby2.5

-nオプションは、サンプルアプリケーションを作成するディレクトリ名を設定できます。
-rオプションは使用するランタイムを設定します。
コマンドを実行すると以下のような一連のファイルが作成されます。

ruby-sample/
├── Gemfile
├── README.md
├── event.json
├── hello_world
│   ├── Gemfile
│   └── app.rb
├── template.yaml
└── tests
    └── unit
        └── test_handler.rb

2-2. Gemのインストール

Gemfileが2種類ありますが、"hello_world/Gemfile"に"aws-record"を追加します。

gem 'aws-record', '~> 2'

LambdaのRubyランタイムのバージョンは2.5なので、ローカルのRubyバージョンを2.5.0に変更します。

rbenv install 2.5.0 #インストールしていない場合
rbenv local 2.5.0

bundle installします。

bundle install --path vendor/bundle

2-2. ロジックの実装

手順1で生成された"hello_world/app.rb"の名称を変更します。 今回は"users/register_users.rb"とします。

ruby-sample/
└── users
    ├── Gemfile
    ├── Gemfile.lock
    ├── register_users.rb

Lambdaで受け取ったイベントを登録する処理を実装します。 DynamoDBにユーザーデータ登録を行い、正常終了したら200、失敗したら500を返します。

▼register_users.rb

require 'json'
require 'aws-record'

class User
  include Aws::Record
  set_table_name ENV['DDB_TABLE']
  string_attr :id, hash_key: true
  string_attr :name
  string_attr :sex
  string_attr :address
  string_attr :tel
end

def register(event:, context:)
  users = event["users"]
  begin
    users.each do |u|
      name = u["name"]
      sex = u["sex"]
      address = u["address"]
      tel = u["tel"]
      user = User.new(id: SecureRandom.uuid, name: name, sex: sex, address: address, tel: tel)
      user.save!
    end
  rescue => exception
    puts(exception.message)
    return create_response(500, "ユーザー登録が異常終了しました")
  end
  return create_response(200, "ユーザー登録が正常に終了しました")
end

def create_response(status, message)
  return {
    statusCode: status,
    body: {
      message: message,
    }.to_json
  }
end

2-3. テンプレートファイルの設定

テンプレートファイルはサーバーレスアプリケーションのトリガーとなるイベントや環境変数などを設定するファイルです。sam init で作成されたtemplate.yamlがテンプレートファイルにあたります。 DynamoDBの設定もここで行います。

▼template.yaml

AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: >
  AWS Lambda DynamoDB for Ruby

# More info about Globals: https://github.com/awslabs/serverless-application-model/blob/master/docs/globals.rst
Globals:
  Function:
    Timeout: 3


Resources:

  RegisterUserFunction:
    Type: AWS::Serverless::Function # More info about Function Resource: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction
    Properties:
      CodeUri: users/
      Handler: register_users.register
      Runtime: ruby2.5
      Policies:
      # DynamoDBへCreate/Read/Update/Deleteする権限を付与
      - DynamoDBCrudPolicy:
          TableName: !Ref UserDDBTable 
      # 環境変数の設定
      Environment:
        Variables:
          DDB_TABLE: !Ref UserDDBTable
  # DynamoDBテーブル設定
  UserDDBTable:
    Type: AWS::Serverless::SimpleTable
    Properties:
      PrimaryKey:
        Name: id
        Type: String
Outputs:
  RegisterUserFunction:
    Description: "RubyAWSLambdaDynamoDB"
    Value: !GetAtt RegisterUserFunction.Arn

  RegisterUserFunctionIamRole:
    Description: "RegisterUserFunctionIAM Role"
    Value: !GetAtt RegisterUserFunctionRole.Arn

3. デプロイ

3-1. sam package

AWS SAMアプリケーションをパッケージ化します。

sam package --template-file template.yaml \
--output-template-file packaged-template.yaml \
--s3-bucket nss-lambda-sample
オプション 説明
template-file テンプレートファイルのパスを指定します
output-template-file パッケージ化後のテンプレートファイルのパスを指定します
s3-bucket パッケージをアップロードするS3バケットを指定します。

3-2. sam deploy

AWS SAMアプリケーションをデプロイします。

sam deploy  --template-file packaged-template.yaml \
--stack-name SampleStack \
--capabilities CAPABILITY_IAM
オプション 説明
template-file 3-1で作成したパッケージ化後のテンプレートファイルのパスを指定します
stack-name デプロイ先のAWS CloudFormationスタック名を指定します。新しいスタックを指定すると新規に作成されます。既存のスタックを指定した場合、スタックを更新します。
capabilities AWS Cloudformationが特定のスタックを作成する前に指定しなければならない機能のリストです。固定でCAPABILITY_IAMを設定します。

デプロイに成功するとAWS CloudFormationにスタックが登録されます。 AWS CloudFormationの詳しい説明は今回は省きます。 f:id:toranoana-lab:20190227171719p:plain

Lambdaコンソールを登録するとアプリケーションにスタックが登録されています。 f:id:toranoana-lab:20190227172116p:plain

4. 動作確認

Lambda コンソールを開き、テストを作成します。 以下のようなJSONオブジェクトを作成します。

{
  "users": [
    {
      "name": "田中太郎",
      "sex": "",
      "address": "埼玉県"
    },
    {
      "name": "山田一子",
      "sex": "",
      "address": "千葉県",
      "tel": "000-0000-0000"
    }
  ]
}

テストボタンを押して正常終了することを確認します。 f:id:toranoana-lab:20190227184118p:plain

DynamoDBのコンソールを開いてデータが登録されていることを確認します。 f:id:toranoana-lab:20190227184239p:plain

5. まとめ

今回はRuby環境でLambdaからDynamoDBにデータを登録する方法を紹介しました。
面倒なサーバーの設定や管理が一切必要なく、手軽にアプリケーションを作成できるので、
今後もAWS SAMを使用したサーバーレスアプリケーションを作成して、紹介していこうと思います。

P.S.

虎の穴ではRubyエンジニアをはじめとして一緒に働く仲間を絶賛募集中です! この記事を読んで、興味を持っていただけた方はぜひ弊社の採用情報をご覧下さい。

yumenosora.co.jp

Ruby2.6の機能を使ってみる〜関数合成でRailsのscope合成〜

皆さんこんにちは。虎の穴ラボのY.Fです。
今回は昨年のクリスマスにリリースされたRuby2.6ではProcオブジェクトやMethodオブジェクトに関数を合成する >> オペレターが追加されたので、
Railsで使える部分が無いか探ってみたいと思います。

関数合成とは

高校で数学が得意だった方は習った覚えがあるかもしれませんが、数学的な定義から見ていきたいと思います。

以下のような2つの関数を合成することを考えます。

 \begin{align} f(x) = x + 1 \end{align}
 \begin{align} g(x) = x ^ 2 \end{align}

この時、 x = 2に対して関数 fを適用した結果に、 gを適用すると以下のような感じになります。

 \begin{align} f(2) = 2 + 1 = 3\end{align}
 \begin{align} g(3) = x ^ 2 = 9
\end{align}

このことから、2つの関数を合成した新しい関数を考えることができ、それを以下のように定義します。 ※ 以下の式は  g(f(x)) (g \circ f)(x) は同じ意味であることを示しています。

 \begin{align} f'(x) = g(f(x)) = (g \circ f)(x) \end{align}

ただし、 適用順を変えると結果も変わることに注意です。 (  (g \circ f)(x) \neq  (f \circ g)(x))

 \begin{align} g(2) = 2 ^ 2 = 4 \end{align}
 \begin{align} f(4) = 4 + 1 = 5
\end{align}

Ruby2.6での関数合成

Ruby2.6から導入された関数合成オペレーターも基本的には同じように考えれば理解は簡単かと思います。

def f(x)
  x + 1
end

def g(x)
  x * x
end

# Procオブジェクトに変換して関数合成オペレーターを適用 g(f(x))
f_dash = method(:f).to_proc >> method(:g).to_proc
p f_dash[2] # => 9

# << オペレーターを使えばf(g(x))も簡単
f_dash = method(:f).to_proc << method(:g).to_proc
p f_dash[2] # => 5
続きを読む