2014/12/31

2014年の"勉強会ライフ"(のみ)を振り返り

なにすんのん?

人生で「年の振り返り」とかやったことなかったのですが、今年めでたくアジャイルのプレイヤーになれたので、やってみたいと思います。

ただし、「全体的に」とかやるとgdgdなるし「死ぬか…」みたいになりかねないので「参加した(公の)勉強会」のみについて、です。

どんなもん?

こんなもんです。

No. 日付 タイトル ジャンル 備考
1 2014-01-10 京都アジャイル勉強会 Light 第3回 プロセス,アジャイル
2 2014-01-18 KnockoutJS勉強会 in Kansai #1 技術,プログラミング
3 2014-01-19 関西検証コレクション 第五回
4 2014-01-25 第1回 クソコラ画像勉強会 技術 LT
5 2014-01-31 京都アジャイル勉強会 Light 第4回 プロセス,アジャイル
6 2014-02-08 第3回 Scala関西ビギナーズ 技術,プログラミング
7 2014-02-22 京都アジャイル勉強会 Light 第5回 プロセス,アジャイル
8 2014-02-23 関西検証コレクション 第六回
9 2014-02-25 顧客を理解する!インタビューの基本 プロセス,要件定義
10 2014-03-09 第2回ドメイン駆動設計読書会@大阪 技術,設計
11 2014-03-17 再演「DevLOVE関西 ~Decision~」 エンジニアライフ
12 2014-03-23 第3回ドメイン駆動設計読書会@大阪 技術,設計
13 2014-03-25 レガシーコードと対峙する方法を考える 技術,プログラミング
14 2014-03-29 プログラマ35歳定年説勉強会 エンジニアライフ
15 2014-04-05 R と Ruby によるデータ解析入門 読書会 第1回 技術,プログラミング
16 2014-04-06 第4回ドメイン駆動設計読書会@大阪 技術,設計
17 2014-04-12 第6回関西LibreOffice勉強会 技術,ツール
18 2014-04-16 関西PostgreSQL勉強会 with AWS 技術,ツール
19 2014-04-19 自動テストの誤解とアンチパターン 技術,テスト
20 2014-04-20 関西検証コレクション 第八回
21 2014-04-24 Vagrant体験入門 技術,ツール
22 2014-05-06 第6回ドメイン駆動設計読書会@大阪 技術,設計
23 2014-05-10 非同期勉強会 技術,プログラミング
24 2014-05-11 関西検証コレクション 第九回
25 2014-05-11 ゆかむ勉強会 エンジニアライフ 最後15分だけくらい
26 2014-05-21 継続的デリバリーの話を聞いてみよう プロセス,CI 発表
27 2014-05-29 ユーザテストLive! 見学会 in KYOTO 技術,テスト 最後一時間だけくらい
28 2014-05-31 今日から始めるGit & GitHub入門(リバイバル+α) 技術,ツール
29 2014-06-01 第7回ドメイン駆動設計読書会@大阪 技術,設計
30 2014-06-08 AngularJS 勉強会 技術,プログラミング
31 2014-06-11 第3回 Chef Casual Talks Kansai 技術,ツール
32 2014-06-12 テスト自動化の様々な道具を使ってみた四方山話 技術,テスト
33 2014-06-14 うらがみがJavaまわりのORMを知りたい会 技術,ツール 汚物の様なLTして迷惑かけた
34 2014-06-28 Asian Automation Alliance ~自動化を語り合おう! エンジニアライフ 発表
35 2014-07-05 暇をもてあましたアヌビス神の遊び 技術,プログラミング
36 2014-07-07 AWSスタートアップ 技術,ツール
37 2014-07-08 リモートワークを実際にやってみてどう? プロセス,リモートワーク
38 2014-07-11 Selenium 2 WebDriverハンズオン 技術,ツール PC整備ゴミクソで何もできず
39 2014-07-12 関西ソーシャルゲーム勉強会・2014夏 技術,プログラミング
40 2014-07-13 第9回ドメイン駆動設計(DDD)読書会@大阪 技術,設計
41 2014-07-19 ASP.NET勉強会 技術,プログラミング Win機所持せずペアプロ
42 2014-07-26 暇をもてあましたアヌビス神の遊び 技術,プログラミング
43 2014-08-02 関西検証コレクション 第11回(最終回?)
44 2014-08-03 基本情報技術勉強会 技術,ハードウェア
45 2014-08-23 DevLOVE甲子園2014 西日本大会 エンジニアライフ
46 2014-08-31 .reviewrc 第1回 #reviewrc
47 2014-09-06 関西関数型道場 – 第01回 技術,プログラミング スタッフ?
48 2014-09-12 第2回 ゆかむ勉強会 エンジニアライフ 発表
49 2014-09-13 関西Kotlin勉強会 技術,プログラミング
50 2014-09-20 第4回 Scala関西ビギナーズ 技術,プログラミング
51 2014-10-01 京都アジャイル勉強会 エッセンシャルスクラム読書会 プロセス,アジャイル
52 2014-10-03 運用現場の話を聞いてみる 技術,運用
53 2014-10-04 .reviewrc 第2回 #reviewrc 発表
54 2014-10-11 AgileTour2014 プロセス,アジャイル
55 2014-10-17 それぞれのリモートワークの軌跡とこれから プロセス,リモートワーク 後半1時間だけ
56 2014-10-20 NoSQLの1つ「MongoDB」を知ろう 技術,ツール 30分くらい遅刻
57 2014-10-29 京都アジャイル勉強会 エッセンシャルスクラム読書会 #3 プロセス,アジャイル
58 2014-11-01 「CakePHPで学ぶ継続的インテグレーション」ハンズオン 技術,ツール PC整備ゴミクソで何もできず
59 2014-11-12 京都アジャイル勉強会 エッセンシャルスクラム読書会 #4 プロセス,アジャイル
60 2014-11-21 おいしがLinux勉強会(読書会) 技術,ツール 読んでおらず何も出来ず
61 2014-11-22 第1回 Hubot×ChatOps勉強会 技術,ツール
62 2014-11-23 .reviewrc 第3回 #reviewrc
63 2014-12-06 関西関数型道場 – 第02回 技術,プログラミング スタッフ?
64 2014-12-14 システムテスト自動化カンファレンス 技術,テスト 発表(10分程度)
65 2014-12-19 Dockerを現場に取り入れてみよう! 技術,ツール 汚物の様な発表して迷惑かけた
66 2014-12-28 Hoge駆動忘年会(昼の部は勉強会) エンジニアライフ 汚物の様な発表して迷惑かけた

計66回か…ま「10分だけ参加」とか微妙なものも含んでいますがw

なんでこんなことしたん?

やってみたかった…から?

どやった?

いや、別に。 まー、人と話するときに「この勉強会で会いましたよね?」とか言える資料になる…くらいかな?

ダメ出し

  • 表にちょっと嘘あるかも?

  • 回数について

    うーん、勉強会行きだした年(2012)が確か40くらいだったと思うので、思ったより行けたかな?

    でも、全体的に「集中力を欠いて」いるのは、自分の中でそう。

  • 発表

    正規の発表5回、LT4回は別に悪く無い。

    しかし、最後2回と、中盤に2回ほど「クズみたいな」発表した。アレはアカン。

    それもあり「もっと減らしても良い」と思う。

  • シリーズもの、Devlove関西など「老舗」ばかり

    新しいものを摂取する事を怠った

  • 反面、シリーズもので一回しか行ってない

    これはアカン…。(自他ともの心情的にもね)

  • 仕事の関係上8月から激減

    もう少し分散できんものか。

全体的には?

勉強会というものに行きだしたのが3年前の2012年。

「"勉強会"というものを浴び続けたら、きっと俺も世のプログラマーみたいになれるかも?」って夢みて、手当たりしだい行ってた一年目。

「参加しよう、登壇しよう!」と試みた二年目。

そして、さらなる飛躍の…とするはずだったのに、まさかの弛んだ三年目。

せっかく時間と足を使って行ってる勉強会なのに、思い返してみれば「印象が薄」かったり「得たもの、学んだものが希薄」だったり、実生活に活かす以前の問題で「姿勢に問題あり」な過去の記憶です。

そして、三年通して考えても成長というものは…まだ実感できず。

少し「意識の入れ替え」というか、そういうものが必要に感じます。

来年は?

ある方に助言頂いた「選択と集中だよ?」。

そのとおり、数は減らすとして

  • 一回一回の勉強会に集中して何か学ぶ
  • 読書会ならキチンと読む
  • 発表なら数減らしてクオリティ上げる(その状態でしか発表しない)
  • ハンズオンなら「当日教えて頂くことを予測して一度トレースしとく」くらいの準備をする

を実践したいと思います。

…世の人がやってる「当たり前」にやっと追いつけ!みたいな話ですが。


以上、自分のためなので読み手の事は考えてないすけど…。

来年も勉強会でお会いしましたら、宜しくしてやって下さい。

2014/12/10

しょぼちむも”ふんいきbot"にして「条件反射」機能をつけた

この記事は しょぼちむ Advent Calendar 2014 10日目の記事です。

昨日は @cocoatomo さんの「Syobochim and Kotlin Advent Calendar 12/09」でした。


俺としょぼちむ

俺はこの「しょぼちむ」という人をこれっぽっちも知りませんが、そのしょぼちむ嬢、いや姫? いやベムラーだったか…敬称はなにかも忘れましたけっども、確か出会ったのは「すっげー寒い冬の日」だった気がします。

なんか、たんご( @tan_go238 )さんから「おおさかじょうでぷろじぇくしょんまっぴんぐやるからYouきちゃいなYO!」って言われて、「あ、若いお嬢さんも来るから」みたいなって、しばらくすると「ビール瓶を背中に背負ったコザケ( @s_kozake )さんが現れて「呑もやw」みたいなって、その後「すごく美人っちゃあ美人なんだけど、俺に執拗にダチョウ倶楽部のネタ振りをしてくる女性」が居て、その女性にお肉買って貰って餌付けされて、「怪獣、かわいいっしょ!かわいいっしょ!!」みたいなって、ほいでその女性と俺両方とも「人の名前を間違える」つー失礼ぶっこいて、梅田でスイーツ食って…

あ、この話すごくどうでもいいですね。

しょぼちむさんは素敵な方です

例により、前回「某氏アドベント」で作った「ふんいきbot」を活用(べ、別に手抜きじゃないんだからねッ!)して、「しょぼちむbot」作ろうってんで…。

ま、ネタかぶりは、始まる前から鉄板予想されてたんで、全然キニシナイとしまして。

ふんいきbot」ってのは、簡単に言いますと…

「ストーキング対象といくつかの「コメントテンプレート」を設定すると、頻出名詞を交えて"それっぽいツイート”してくれる」bot

でして、その名前は俺が勝手に提唱しているだけです。

※ちなみに「ご当人もbot作ってる」のを後で知るのですが…色々かぶってる上に「そっちのが高度かつカオス」ですので…「こちとら雰囲気重視!」と虚勢を張っておきましょう。

実際見てみると…

まずは、「ふんいきbot」を しょぼちむアカウントに向けて、仕込みます。

こんな感じ になります。

ちなみに「常時つぶやくテンプレートのラインナップ」は…。

DEL comment_template
RPUSH comment_template '#{noun}〜'
RPUSH comment_template '#{noun}だっ!'
RPUSH comment_template '#{noun}だぜっ!'
RPUSH comment_template '#{noun} それですw'
RPUSH comment_template 'うわあああああああ!!!!!!!!!'
RPUSH comment_template 'おいやめろー!'
RPUSH comment_template '#{noun}!!??!!!?!!??!!!?!!??!!!'
RPUSH comment_template '#{noun}に嫉妬!'
RPUSH comment_template '#{noun}!!!'
RPUSH comment_template "('ω'≡'ω'≡'ω'≡'ω')"
RPUSH comment_template '#{noun} ちゃうで!!!'
RPUSH comment_template 'その話、#{noun}感ある。'

こんな感じにしました。

…単文系が多いな…。

でもしょぼちむさん、気難しい一面もあって…

どうも、俺こと @kazuhito_m からのツイートはお気に召さないらしく、。

と返してきます。

きっと前世で、俺に親でも殺されたのでしょう。致し方ありません。

そしてもちろん! うらがみさんには最高の笑顔で返します。

うらがみさん ////

と言うのをよく見かけますね。

きっと前世でも、うらがみさんがイケメンだったのしょう。致し方ありません。

他にも"女子力","ことりん"という言葉にも敏感なようで…。

仕様上「確実に決まるInとOut」なので、実装していきます。

条件反射(パブロフの犬)機能の実装

というわけで、「特定の人や特定の言葉(あるいは両方が揃う時)に無条件である文字をつぶやく」という「条件反射機能」を付けたいと思います。

"ふんいきbot"の永続化層はRadisです。

そのデータをネタ元にしたいのですが、この"ふんいきbot"の永続化層は"Redis"にしてしまいました。

Redisは「かなりKeyValue感ある」ので、単純には「値一つのデータの羅列」しか持てません。

そこで…

RPUSH dog_of_pavlov '<TwitterID>,<引っ掛けたい本文の正規表現>,<返信の文字>'

出、出〜wwww 「一つのフィールドにカンマ区切りでデータ入れ」奴wwwww

「イケてないSIer根性丸出し」の実装で行きます。。o O (ええねんもう今日は動いたら!)

こんな感じで

「Bot宛のメンションで、TwitterID(全一致)か、正規表現か、どちらかに引っかかったやつだけ、特定のコメントを返す」

という条件で行こうかと思います。

で、出来た定義データが…

RPUSH dog_of_pavlov 'kazuhito_m,,みうみううるせー!!'
RPUSH dog_of_pavlov 'backpaper0,,うらがみさん////'
RPUSH dog_of_pavlov ',.*ことりん.*,やめろー!ことりんのことは…みうみううるせー!!'
RPUSH dog_of_pavlov ',.*女子力.*,女子力?わたしそのものですよね!!'

お、俺…いったい何やってんだろうなぁ…。

(只今深夜の4時を回ったところです。)

実装してみる

やっつけ仕事ですが…付け焼刃のCoffeeなんちゃらーで書きます。

 # 相手のメンションが、Radisで設定したキーワードに合致した場合に条件反射でメンションを返す。

 # 定数

 TEMPLATE_KEY='dog_of_pavlov'

 # 前準備、Redisクライアント用意
 client = require('redis').createClient()

 # Redisから条件のLISTを配列で一撃で持ってくる
 key = TEMPLATE_KEY
 templates = null
 client.llen key , (err,count) ->
   client.lrange key , 0 , count-1 , (err,value) ->
     templates = value

 # 本処理
 module.exports = (robot) ->
  # とりあえず「何が投げられても」拾って、自力で正規表現で判定する。
  robot.hear /.*/i, (msg) ->
    twitterId = msg.envelope.user.name
    menthion = msg.message

    # 予め取得したテンプレート(CSV)を全件回しながら
    for i in templates
      [id , regex , comment] = i.split(",")
      # id未指定 or 一致したら
      hitId = id.trim().length == 0 || twitterId == id
      # もしくは、regex未指定 or 正規表現にひっかかったら
      hitRgx = regex.trim().length == 0 || ///#{regex}///.test(menthion)

      # 指定されていた条件に、どちらかにあてはまってたら、条件反射してしまうコメントをつぶやく
      if hitId && hitRgx
        msg.send "@#{twitterId} #{comment}"
        break

稚拙だから見ないで、見ないでよ〜。(チラッチラッ

しょぼちむ(bot)に挨拶してみる

無事出来たことですし、しょぼちむ(偽)にメンション送ってみましょう。

(俺に対しては「うるせー!」しか言ってくれないので、他の方の力も借りましょう)

…なんでしょうか、完成したのにちっとも嬉しくありません。

ああ、ウラガミさんの場合の返事のテスト? まあいつか見れるんじゃないすかー? (投げやり

感想・所管

  • 簡単なことなのに結構時間がかかりました
  • 雰囲気出すには「人間の設定」が大事だし、タイムリー性と運営考えたら「自動収集」が望ましいし…考えは尽きないですね
  • 固定のコメントは別にいいとして、その中にも通常コメントみたいにランダムワード使えるようにしたいですね
  • 果ては「そのコメントテンプレート」すらも「頻出類似文章」から作れる…とかならもっと本物っぽくて、できたらいーなー。

結論

しょぼちむは、みうみうに厳しい。(笑いの師匠的な意味で)

PS:

うらがみさん、話しかけたようです。

よかったね syobochirn ♪ ※これ…編集してありますが、返信になってないので修正しました。


明日は @uemmra3: さんの「扶養~とは」です。


Write time : 4h

2014/12/06

いろふさんの"ふんいきbot"、作って動かしてみた #irof_history

この記事は、いろふ Advent Calendar 2014 その6日目の記事です。

昨日は、@yy_yank さんの 「マジ感謝ないろふさんに俺のライムを送る」でした。


ザ・ワールド イズ ワンダフろふ 、ども、毎年お馴染み @kazuhito_m こと"みうみう"です。

これを見てるってことは、みなさま今年も"いろふェンシブ"な年末をお送りのことかと存じます。

さーて、今年はどうすっかねー

いろふアドベントカレンダーも今年で三年目。

3年前ちょうどその初めてのアドカレを書いていた前後、その頃から勉強会などに行き始めた三浦としては、

と、「アドベントカレンダーなんて何か知らない」とこから、手法問わず様々な形で"いろふさん"というモノを表現し、 順調に「いろふの階段」を駆け上がってきた訳ですが…。

今年は「いろふの本丸」とも言うべき、"Twitter上のいろふさん" を攻めて見ようかな?と思い立ったのです。

そう…

"ふんいきbot"

を作ろうとね。

その、"ふんいきbot" って何さ!?

説明しよう、"ふんいきbot" とは…

厳密には違うけど、よくよく見てみると

「あー、言いそうかも?…いや、言わんかな…やっぱ、でも…」

くらいな雰囲気の言葉を醸し出す、TwitterBotである。

…いや、厳密にやろうとおもうと「強大な叡智と莫大な労力」が掛かると思うのよw

なので「まあ…見えなくもないよ」くらいのものを作ろっかなと。

(溢れ出るコザケ臭)

作るにあたっての「コンセプト」

  1. 人のフンドシでヨコズナ相撲
  2. 自力で頑張らない(他力本願)
  3. 何事も"雰囲気"大事

という「全力で世の中に甘えていくスタイルで」考えてみました。

「ところでTwitter見てくれ、コイツをどう思う?」

まずは、どんなもんになったのか、手っ取り早く見てもらいましょうかね…。

(当人の中で)割とタイムリーな話題を言うてきます。 一時間に二回くらい。(今までツイート数当たりの時間が大体それくらい)

「なんか言え!」みたいな無意味な煽りにも「全力で返していく」スタイルですw

「もーまた遅刻して…(当人が遅れないとは言っていない)」と俺に良く言うのざき氏、時間は重要のようで…。

時刻を聞いても、わりとざっくばらんに教えてくれますw

謎単語が行き交う会話も…。

いったいどういうことだってばよ!

大したことはしていませんw

予め「ああ、言いそう…言いそう…かなぁ?」くらいのテンプレートを一定間隔でランダムに喋らせています。

例:

  • '本当の#{first_person}なら、そういうことは言わないな。'
  • '本日は#{noun}関係でアレ。'
  • '#{noun}とはなんだったのか。' …

ただ、それだけだと、全然"ふんいきbot"ではないので、

  1. 過去ツイート1000件を形態素解析にかける
  2. 有名詞と一般名詞で頻出100位以下のものを束で持っておく
  3. テンプレの名詞部分をランダムに置き換え

しています。

(昨年のいろふアドベントでの「ぽざうねさんのアイディア」丸パクリですね。わかりますw)

また、その「解析かけて100件にして保存してくれる」という、いわゆる"クローラ"も設けており、一日一回定期実行するとともに「クロールし」というメンションを送れば実行、という風にもしてあります。

作ったもの

…ということをしてくれるのに必要な一式を、Dockerにくるんで「キット化」しましたw

funiki-bot-kit(Dockerfile と ファイル群)

  • Dockerfileと自作スクリプトが2丁、計3テキストファイル群
  • ビルドするための設計図
  • 1Docker:1Bot(1アカウント)に対応
  • (後述の)自作の道具はビルド時に同梱され、プロダクト(Node.js,Redisとか)含めその時の最新が入る

funiki-hubot

  • しゃべってるbotの本体
  • タイマーorメンションでRedisからデータ読んで仕事してる
  • Hubot + Redis + 自作shell + 自作Coffeeスクリプト、という構成

funiki-crawler

  • 過去ツイートを取得・集計・解析するクロウラー
  • Twilogサイトをスクレイプし、Redisにデータを蓄える
  • Kuromoji(形態素解析) + JSorp + Redisclient + consclipt + 自作Scalaプログラム、という構成
  • consclipt のおかげで「実行するたび最新」に

…もういろふさん関係ねえなw

必要要件

  • 入れるサーバにDockerとgitクライアントがある
  • 入れるサーバがインターネットに繋がる
  • 入れる人がLinuxコマンド打てる
  • ターゲット(まあいろふさんでしょう)が、Twilogサイトに登録してる
  • ターゲット(まあいろふさんでしょう)に、入れる人が嫌われていない

(おそらく誰も必要無い)インストール方法

こちら に書いておきます。

みうみうなんでやったん?

  • OSSと自作の組み合わせの「全量見通せて自分でも手を入れられる」ような「botキット」が自分の手に一つ欲しかったから

おそらく「類似のサービス」も「それより高度なボットキット」もあるとは思うんです。

でも、そういうのって「中に手を入れ」たり「どこかに何かを挟ん」だりとかはできにくそうだなっと。

「自分が全て知って」て「ノウハウ蓄え」れて「増築出来る」"土台"が欲しかったんです。で稚拙ながら今回車輪の再開発してみました。

  • あとは「自分のすきなようにしゃべらせられるいろふさん」がいれば

ま、一週間で仕事の片手間じゃこんな程度のもんしかできませんでしたですはい。

TODO

どっか外でホスティング

「自力で頑張らない(他力本願)」って言うたのに!Docker回すサーバは自宅でしてしまいました。

できればHerokuとか外のやつにやらせておきたいなと。

メンション飛ばした時のリアクション

今は「ある単語の場合反応する」で、ココは作りこんでいない。 まー某「別のアドベントカレンダー」でやるとか…ゴニョゴニョ

参考資料

こことか こことかスクラップ.

所感・感想

  • Redisが超便利(今回のような条件なら)

  • 不得意な言語の上、行き来したので辛かった

  • いろふさんの「雰囲気醸す」ってのが、途中でゲシュタルト崩壊してよくわからんようになった

  • 「夢想」から「実現」までの時間が遠すぎて…もっと幅とスピードが欲しいなと思った

これで皆さんも、ご自宅に「Dockerコンテナ一つ」あれば、1いろふさんを招き入れられますね♪

皆様も「思い思いのいろふさんbot」を作ってみてはいかがでしょうか。

PS:

ん? ネタかぶり ? ご冗談をw


明日は、きつねさん( @bitter_fox )の「きつねとJava!」です。(一度会ってみたい方ですね…)


Write time : 6h