読者です 読者をやめる 読者になる 読者になる

sekaie engineers' blog

セカイエ株式会社が主催するエンジニア勉強会について

GCP の Natural Language API が公開されましたね

おはようございます。こんにちは。こんばんわ。佐々木です

今日 GCP の Natural Language API が公開されましたね。

早速使ってみたデモを載せておこうと思います

APIを有効にする

GCP の Console で Natural Language API を有効にしましょう

API キーを取得する

同じく GCP の Console で API キーを取得しましょう

demo script

さくっとこんな感じで API に POST するだけのスクリプトです。

require 'json'
require 'optparse'
require 'faraday'

require 'optparse'
opts = ARGV.getopts('', 'input:')
input = opts['input']

conn = Faraday::Connection.new(:url => 'https://language.googleapis.com') do |builder|
  builder.use Faraday::Request::UrlEncoded
  builder.use Faraday::Adapter::NetHttp
end


res = conn.post do |req|
  req.url '/v1beta1/documents:analyzeEntities?key=API_KEY'
  req.headers['Accept'] = 'application/json'
  req.headers['Content-Type'] = 'application/json'
  req.body = {
      document: {
        type: 'PLAIN_TEXT',
        language: 'ja',
        content: input
      }
  }.to_json
end

body = JSON.parse(res.body)
puts body['entities'].map{|m| "#{m["name"]}: #{m["type"]}"}.join("\n")

試す

こんな感じで input してあげれば返事が返ってきます。

まだ、ちょっと認識出来る単語が少ない気もしますけどとりあえずOKでしょう

$ bundle exec ruby nl.rb -i '田中さんはゴルフが下手くそです。'
田中: PERSON

終わりに

Speech API も出て Natural Language API と連携して音声解析とかも出来そうですね

GCPバンザイ!!!

ほな

UXデザインを意識しよう PART1

どうも!デザイナーの寺田です。最近初めてハッカソンに参加してとても楽しい思い出となりました。 最近UXデザインに関して少しずつ知識を深めていこうとしておりますので、ブログにまとめていきます。


f:id:sekaie:20160719101959j:plain

UXデザインとは

私たちはやりたいことを達成する為に製品やサービスを利用します。 そこで今までやれなかったことができたり、今までやっていたことがさらに便利になってテンションあがったり、 そういった嬉しい体験をするとさらに利用したいという気持ちになったりしますよね。

簡単にいうとそのうれしい体験のことがUX(利用のユーザー体験)であり、 それをいかに実現していくかを追求することがUXデザインです。

具体的にいうと、UXを目標にして、作り手とユーザーが共に嬉しくなる企画、設計、開発、デザインの過程のことです。

現在ますますこのUXデザインがインターネット業界で重要視されてきています。 理由としてはやはりインターネットの普及や、情報端末の高度化、多様化ですね。

引き金はiPhone

2007年1月にAppleiPhoneを発表してから現在まで、 凄まじいスピードで全世界に普及して、なくてはならないものになりました。

それと並行してスマートフォンは様々な形で進化を続け、 ユーザーそれぞれの利用目的に応じたアプリ等の機能を簡単に即入手することが可能となり、 インターネットを経由して世界中の優れたサービスを誰でも体験できるのが当たり前になってきています。

いわばiPhoneは優れたUXデザインの代表みたいなものですね。 これが世界中に普及していることで、より一層UXデザインのニーズも深まっているわけです。

ユーザビリティーを超えろ

私は業界で働き出してから今までユーザビリティという言葉は嫌という程耳にしてきました。 ユーザビリティーとはユーザーが目的を達成するまでのユーザーの目的を達成するまでのわかりやすさ、操作性の良し悪し等を重視して評価する考え方です。 私も業務をする中でそういった事に対して常に意識をかたむけてきました。

しかし、実際のユーザーの利用環境は物凄く多様化してきていて、比較的短期の視点で考えられているユーザビリティ評価では 製品とユーザーとの関係性を完全に捉えられないという気づきや新たな動きがが2000年代の前半頃から始まっていたようです。

その影響により、「プレジャラブルデザイン」(楽しみのためのデザイン)、「エモーショナルデザイン」(感情的なデザイン) といったキーワードが出現し、ユーザビリティ(操作性)だけにとらわれずに、 感性的側面にも視点を置き、製品やサービスをデザインしていく事が重要であるという流れが発生してきています。

当時は「Beyond usability」(ユーザビリティを超えろ)というスローガンもあったそうです。

そこから本格的にUXの研究がスタートしたと言われています。

うれしい体験

最近でこそ、スマホWebサービスが非常に注目されてきていてUXデザインはそれに属する内容だと思われがちですが、 実際はそういったソフトウェアに限ったことではありません。

UXデザインはどんな分野であっても共通して重要視されるべきものです。そして、いつの時代でも変わらない基準であるものだと思います。

技術というものは、ユーザーから見れば嬉しい体験を得るための必要な手段でしかないということです。 ユーザーからすると、別に技術や機能が欲しいわけではなく、技術の延長線上にある体験に関心があります。

UXデザインはそいういった体験をいかに生み出すかにフォーカスしたものです。

IoT(Internet of Things)

情報通信技術の進化は現在も留まる事を知りません。 みなさんも実感のあるものだとは思いますが、現在ありとあらゆるモノとインターネットとを組み合わせることで、 それらと相互に通信をしたり、制御できるように今後はなっていきます。

そして、そういった流れと共に「人工知能」も驚くほどのスピードで高度化して行っている為、 人が今までやっていた仕事や行動がコンピュータで事足りるようになってくる時代が来ます。

こういった技術発展によって、近い将来に産業構造や生活の変化が凄まじいものになることが予想されています。

ですが、やはり中心となるのはユーザーであり、技術が優れているだけではそのモノは開発する価値はないと思います。 どんな時代になろうと、ユーザーが心から必要とするものを目指して作っていく必要があるんです。

その為に様々な技術を束ね、きちんとユーザーに必要となる内容を統合していく方法として、 UXデザインを学習することは今後ますます必須となってくるのではないでしょうか。


今後ますます注目を集めてくるであろう「UXデザイン」 奥が深いことこの上なしですね。

ほな!

GCP の DataProc で MLlib を使う

はじめに

おはようございます。こんにちは。こんばんわ。

佐々木です。

Google Cloud Platform の DataProc で MLlib を使ってみたのでメモ書きします。

ちなみに機械学習とかは全然疎いです。

DataProc と MLLib

DataProc は Google Cloud Platform にある Spark / Hadoop が使えるマネージサービスです

cloud.google.com

MLLib は Spark に載ってる機械学習用のライブラリです

spark.apache.org

前提

  • Google Cloud Platform の DataProc API を有効にしておく
  • Google Cloud Storage も使っているので有効にしておく
  • gcloud command はインストール済

MLlib の学習用データを作成する

今回 MLlib で扱うデータは BigQuery のデータから抽出します。

今回は MLlib の決定木を使ってみます。

学習用データは csv で入力することにします。

SQLは擬似的なもので、アクセス数と購入の有無を取れるようなイメージです

SELECT
 IF(orders.user_id IS NOT NULL, 1, 0) AS result,
 COUNT(access_logs.user_id) AS cnt
FROM access_logs.access_20160711 access_logs
LEFT OUTER JOIN test.order_log_20160711 orders
  ON access_logs.user_id = orders.user_id
GROUP BY access_logs.user_id

こんな感じの SQL を書いてこれを Google Cloud Storage に export します

MLLib 用の python script を書く

DataProc で用意されていた Python Script をちょっと改修して書きました

#!/usr/bin/python
import pyspark
from pyspark.mllib.regression import LabeledPoint
from pyspark.mllib.tree import DecisionTree, DecisionTreeModel
from pyspark.mllib.util import MLUtils

def parseRow(row):
    tokens = row.split(',')
    label = tokens[0]
    features = tokens[1:]
    return LabeledPoint(label, features)

sc = pyspark.SparkContext()

data = sc.textFile("gs://test/orders.csv")
labeled_points = data.map(parseRow)

(trainingData, testData) = labeled_points.randomSplit([0.7, 0.3])
model = DecisionTree.trainClassifier(trainingData, numClasses=2, categoricalFeaturesInfo={}, impurity='gini', maxDepth=5, maxBins=32)
predictions = model.predict(testData.map(lambda x: x.features))
labelsAndPredictions = testData.map(lambda lp: lp.label).zip(predictions)
testErr = labelsAndPredictions.filter(lambda (v, p): v != p).count() / float(testData.count())
print('Test Error = ' + str(testErr))
print('Learned classification tree model:')
print(model.toDebugString())

DataProc のクラスタを作成する

これは GCP Console でも gcloud command でもどちらでもいいですが、クラスタを作成します

特に何も困らず作成出来ると思います

DataProc に JOB を投げる

作成したクラスタに上記の python script を投げます

$ gcloud dataproc jobs submit pyspark --cluster cluster-1 order.py

DecisionTreeModel classifier of depth 5 with 23 nodes
  If (feature 0 <= 18.0)
   If (feature 0 <= 10.0)
    If (feature 0 <= 4.0)
     If (feature 0 <= 3.0)
      Predict: 0.0
     Else (feature 0 > 3.0)
      Predict: 1.0
    Else (feature 0 > 4.0)
     Predict: 0.0
   Else (feature 0 > 10.0)
    If (feature 0 <= 11.0)
     Predict: 1.0
    Else (feature 0 > 11.0)
     If (feature 0 <= 16.0)
      Predict: 0.0
     Else (feature 0 > 16.0)
      If (feature 0 <= 17.0)
       Predict: 1.0
      Else (feature 0 > 17.0)
       Predict: 0.0
  Else (feature 0 > 18.0)
   If (feature 0 <= 68.0)
    If (feature 0 <= 44.0)
     If (feature 0 <= 37.0)
      If (feature 0 <= 20.0)
       Predict: 0.0
      Else (feature 0 > 20.0)
       Predict: 1.0
     Else (feature 0 > 37.0)
      Predict: 0.0
    Else (feature 0 > 44.0)
     Predict: 1.0
   Else (feature 0 > 68.0)
    Predict: 0.0

うーん。学習用データが少なくてちょっと残念な感じになってしまいました。

もうちょっとデータを増やしてやる必要があるみたいですね。

しかし、今回の目的の DataProc で MLlib を利用して決定木を作成することはできました。

おわりに

DataProc をつかってデータを処理するのは楽しいですね。

DataProc と Bigquery あたりを連携して定常的にデータ分析ができる仕組みを作りたいなと思います。

また何か進捗があったらこのブログで報告させていただければと思います。

ほな!

GCP の StackDriver Logging を使ってエラーログを集める

おはようございます。こんにちは。こんばんわ。

佐々木です。体重は怖くて測ってません。

最近は、暑かったり寒かったり暑かったりと体調を崩しやすい時期ですね。

健康は、日頃のモニタリングが大事です。異常を検知したらすぐに診察をうけるのが一番です。

WEBサービスも一緒です。日々のモニタリングから異常を検知して、早急に対応できる体制を整えましょう。

というわけで(どういうわけ)、最近リリースした WEB API だけのサービスがあるので、ここでエラーのモニタリングを行いましょう。

最初は AWS の CloudWatch を使っていたのですが、いかんせん使いづらいです。

Google Cloud Platform (以下 GCP) で StackDriver Logging のベータ版がリリースされていたので今回はこちらを使ってみます。

StackDriver Logging とは

僕が紹介することではないのでページを御覧ください。

cloud.google.com

ザクッというと、ログをばこっと投げておけばあとは StackDriver の UI とかと連携して見たりすることが出来るようなものっぽいです。

StackDriver は各サービスと連携できるので PagerDuty のようなものとも連携していくことが出来ますね。

便利な予感がします

StackDriver Logging にログを送るために

fluent plugin

今回対象のサービスは AWS の EC2 で動いています。GAE じゃないのが残念。ですが

fluent の plugin で StackDriver Logging にログを送れるプラグインが有りますのでこちらを利用します

github.com

aggregator に install

install

$ sudo td-agent-gem install fluent-plugin-google-cloud

td-agent.conf / aggregator

<match log.error>
  type google_cloud
</match>

forwarder

td-agent.conf / forwarder

<source>
  type tail
  format json
  path /var/log/XXXX.log
  pos_file /tmp/td-agent/XXXX.pos
  tag log.error
</source>

<match log.error>
  type forward

  <server>
    host XXXXXXXXX
    port 24224
  </server>

  heartbeat_type tcp
  flush_interval 10s
  num_threads 8
  expire_dns_cache 600
  buffer_type file
  buffer_path /var/log/td-agent/buffer/log.error
</match>

log format は plugin を見て metadata になりそうな部分を required params として用意しています

{
  time: datetime.to_i,
  path: path,
  severity: severity,
  message: message
}

用意するのはこれだけでOKです

あとは fluentd を restart して設定を反映させましょう

td-agent.log

2016-07-05 09:45:51 +0000 [info]: Successfully sent to Google Cloud Logging API.

こんな感じの info が出てくれば成功です。

それでは StackDriver Logging の画面を見てみましょう

StackDriver Logging UI

↑までやればログが送られてきています

↓は一行のエラーログです。

time, severity, message は metadata として扱われ、

path は structPayload のデータとして扱うことが出来ます。

f:id:sekaie:20160705201245p:plain

まだ全然見てないですがフィルタとかを設定して指定のログだけを見るとかそういうのも出来るみたいです

https://cloud.google.com/logging/docs/view/advanced_filters

さらに他の GCP サービスと連携

せっかくの GCP サービスですし、 BigQuery とかと連携してみましょう

Logging には BigQuery に Streaming Insert する機能があるようです

f:id:sekaie:20160705201831p:plain

ちょこちょこと必要な情報を入れてエクスポートしてみます。

するとこんな感じに BigQuery にテーブルが作成されています

f:id:sekaie:20160705201949p:plain

後はこのテーブルを焼くなり煮るなりしてデータを好きに扱えます。

とても便利ですね。

おわりに

今回は StackDriver Logging にログを貯めるところを中心にご紹介しました。

GCPはデータ分析のためのサービスが豊富にそろっていて、Logとデータベースのデータを連携したりとかが容易にできるようになります。

まだ、GCP を使ったことない人はぜひ使ってみてはいかがでしょうか(営業じゃないです)

ほな!

Vimに移行しようかなって話

f:id:sekaie:20160518181157p:plain

ひよっこデザイナーの寺田です。最近カラオケで歌いすぎて喉をつぶしました。

今日はエディタをVimにしようか迷っていますので(たぶんしない)、 私のようにVimに興味を持たれた方にわかりやすいようにVimの特徴に対して簡単にまとめました。


開発者向けソフトウェアVimとは

Vimは非常に昔からあるソフトウェアで、高機能なことで有名です。 しかしながら、特殊な動作環境の為、使いこなすまでは非常に時間がかかあります。

使いこなしたらもう離れられないらしい。

省エネで高速動作!

CUI(command line interface)で動くので、とにかく軽い!早い! VIMは非常に軽量なソフトウェアである為、少ない資源(CPU/メモリー)で高速に動作するため快適です。

CUIとは簡単に説明するとコマンドラインだけで動く環境のこと。つまりVimにはマウスという概念が存在しません。普段あまり意識をしていないマウス操作も実は結構時間を取られているものです。キーボードだけの操作に乗り換えることで、倍以上の時間短縮も可能といっても過言ではないでしょう。キーボードだけで操作を完結させるのってなんかかっこいいですね。

自由にカスタム!

プラグインがなくても、インデントや改行、タブの設定など、自分で細かな設定を自由にすることが可能。 非常に便利な小技も多数あり。

多機能!

Vimの歴史は非常に長いため、開発コミュニティーが充実しており、 日々新たな追加機能(プラグイン)がアップされており、様々な機能を簡単に拡張することが可能になっています。

Vimプラグインに関してはこういった記事を参考にしてみてください。↓↓↓↓↓

素のVimだと限界がある!絶対に入れておきたいVimプラグイン25個

迅速対応!

新しい形式のフォーマットにもすぐに対応します。

爆速編集!

特殊な操作方法を覚えるのには時間を要するものの、覚えちゃえばこっちのもの。 すさまじいスピードで正確なコーディングをを行うことが可能になります。

みんなが使える!

OSなど環境に左右されない(マルチプラットフォーム)ですので、 Windows, Mac OS X, Linux 様々なプラットフォームで利用可能です。  

デメリットは!?

こんな素晴らしいVimですが、 やはりデメリットといえば、コマンドの難しさでしょう。 最初はマウスが使えないことや、よく使われるショートカットも割り当てがなく、慣れるまで非常に大変です。 使いこなすまでに労力を必要とするので、始めるには勇気が必要ですね。


勇気のある方はぜひVimにトライして快適なコーディングライフを満喫してください。

ほな!

爽快!分析基盤の紹介 #6 : batch の cron を azkaban に移行した話

はじめに

おはようございますこんにちはこんばんわ。

健康診断で身長が 1cm 伸びてました。佐々木です(体重は 10kg 増えてました)

今日は cron を azkaban に移行した話をしようかと思います。

今までの batch 管理

弊社の分析基盤の batch の管理は crontab で管理していました。

というのも、分析基盤が出来立てということもあって batch の数も依存も少なく crontab で特に問題がなかったからです。

しかし最近は社内利用者も増えてきて batch がコケてて、見えるべき数字が見えなかったりとか影響もそれなりに出てきたのでちゃんと batch を管理しようと思い立ったのが最近の話です。

そこでジョブ管理ツールを導入しようと試みました。

選定

ジョブ管理ツールもたくさんあるのでどのツールを使うか選ぶところから始まりました。

今回の選定基準は以下のとおりです。

  • OSS
  • ruby script が動作可能
  • 導入が楽
  • batch の依存管理
  • 長引いてたらアラート投げる
  • こけてもアラート投げる
  • Web UI がついてて誰でもやり直しが簡単にできる

インターネットで調べていたら下記の記事とかがすごくわかりやすくまとめられていたので参考にしました。

qiita.com

で、 Luigi か Azkaban の二択くらいまで絞って吟味していたんですが、以前 Azkaban をいじっていた経験があったので導入面を踏まえ Azkaban を導入することに決めました。

導入

今まで batch が動いていた AWS EC2 のサーバがあったのでそこに azkaban をインストールしました。

導入中は

  • 要件スペックのメモリが足りなかった
  • AWSのセキュリティグループのせいでアクセスできなかった

みたいなところでちょこちょこコケましたが、すんなり導入することができました。

導入後

Azkaban は WebUI も綺麗ですごく見やすいです。

f:id:sekaie:20160430172900p:plain

Job のマッピングもされて、わかりやすいです。 f:id:sekaie:20160430173646p:plain

おわりに

今回はジョブ管理ツール Azkaban を導入したはなしでした。

cron が増えて依存が管理しづらくなって導入を考えている人のためになればとおもいます。

ほな!

SEKAIE Tech Talk #1 を開催しました

こんにちは。エンジニアの中島です。
4月20(水) に SEKAIE Tech Talk #1を開催させていただきました。

去年の夏から開催していたセカイエ勉強会ですが、今回初の他企業(2社)に ご協力いただき、合同開催となりました。

今回のテーマは、「ぼくのわたしの開発環境」ということで、各社で役立っている開発ツールやフローの紹介や技術相談がメインの内容になりました。

セカイエの発表は、口頭で説明するところが多く、スライドだけでは伝わりづらいかもしれませんが、公開しておきます。

OSAKAのTech業界は、TOKYOと比べても、勉強会や交流の場などが極端に少ないと感じています。そんな状況を打破し、OSAKAのTech業界が盛り上っていけるような場がSekaie Tech Talk で創れたらなと思いました。
もちろん #2 も開催予定です!

ほな!

あわせて読みたい

sekaie.hatenablog.com

www.wantedly.com