- パッケージ
- インターナル
- 組み込み
- ゲーム
- 使い捨て
- Windows と UN*X
- クライアントとサーバー
- アプリとバッチ
- ブラウザとネイティブ
- プログラミング言語を地図の上に置く
- Ruby
- JavaScript
- Perl
- Python
- PHP
- Java
- Haskell
- C
- C++
- Lua
- Objective-C
- C#
- VisualBasic
- プログラミングでできることは果てしなく広い
- 何のためにプログラミングをするかが重要、目的がはっきりしていればそれに向いた言語を学べ、学習が効率的になる
- どのプログラミング言語でも使えるような基本中の基本を学ぶ
- なるべく短い時間でSUGEEE経験をする
- なるべく身近な役立つツールを作る
- 「スクリプト言語」
- JavaScriptに変換できる言語
- JavaScriptなので、サーバ(node.js)、クライアント(ブラウザやTitanium)、バッチ(Grunt)に使えて便利
- たとえば
- JavaScript、Ruby、Pythonにステップアップできる(と思う
- 「Bot」のための「フレームワーク」
- 「フレームワーク」は雑な言い方をすれば、ソフトウェアを作るためのソフトウェア
- 皆さんが今後毎日使うIRCのBotを簡単に作る
- IRC以外にも、HipchatなどAPIの公開されたチャットサービスの多くで使えるようになっている(skypeはもうすぐ使えなくなる、残念!)
- まず、JavaScriptを入れる
- 同じ言語でも、いろいろな実装があることを覚えておく。今回はnode.js
- 次にnpmをインストール
$ npm install -g coffee-script hubot
- ファイルの編集
- Vim, Emacs, 別にいいけど...今日教えること何もありません
- 秀丸、TeraPad、さくらエディタ、たぶんJavaScriptなんで使えるけど...
- それっぽいのなら Sublime Text 評価版だが、永遠に使える...
$ hubot -c yawaraka-hubot
- shellアダプター
- デフォルトの機能(pingとかyoutubeとか)
$ cd yawaraka-hubot
$ npm install
$ echo "[]" > hubot-scripts.json
["redis-brain.coffee", "shipit.coffee"] -> []
$ ./bin/hubot
Hubot>
Hubot> hubot, ping
Hubot> PONG
$ npm install --save hubot-irc
#!/bin/sh
export PATH="node_modules/.bin:node_modules/hubot/node_modules/.bin:$PATH"
npm install
export HUBOT_IRC_SERVER="irc.paperboy.co.jp" # サーバ名
export HUBOT_IRC_PORT=6668 # ポート
export HUBOT_IRC_ROOMS="#bot_test" # channel
export HUBOT_IRC_NICK="hubot-udzura" # ニックネーム
export HUBOT_IRC_PASSWORD="paperb0y" # パスワード
export HUBOT_IRC_USESSL="true" # SSLを使う
export HUBOT_IRC_SERVER_FAKE_SSL="true" # SSLが社内独自なので
export HUBOT_IRC_SEND_NOTICE_MODE="true" # 全発言をNotice
export HUBOT_IRC_DEBUG="true" # デバッグ
exec node_modules/.bin/hubot "$@"
@echo off
SET HUBOT_IRC_SERVER=irc.paperboy.co.jp
SET HUBOT_IRC_PORT=6668
SET HUBOT_IRC_ROOMS=#bot_test
SET HUBOT_IRC_NICK=hubot-udzura
SET HUBOT_IRC_PASSWORD=paperb0y
SET HUBOT_IRC_USESSL=true
SET HUBOT_IRC_SERVER_FAKE_SSL=true
SET HUBOT_IRC_SEND_NOTICE_MODE=true
SET HUBOT_IRC_DEBUG=true
npm install && node_modules\.bin\hubot.cmd %*
$ coffee
coffee> 1 + 2
coffee> 3 * 9
coffee> Math.power 3, 2
coffee> process.exit()
power2 = (num) ->
num * num
is_odd_even = (num) ->
if num % 2 == 0
'even'
else
'odd'
for i in [1 .. 10]
console.log "Hello! #{i}"
1, 2, 3 #=> 整数
1.2, 3.45 #=> 小数
"Coffee" #=> 文字列
(val) -> console.log(val)
#=> 関数、手続き
fib = [1, 1, 2, 3, 5, 8]
branches = ["Tokyo", "Fukuoka", "Kyoto"]
{
"lolipop": "Fukuoka",
"minne": ["Fukuoka", "Tokyo", "Kyoto"],
"suzuri": "Tokyo"
}
$ open scripts/yawaraka.coffee
# Description:
# 説明を書く
#
# Commands:
# コマンドの説明を書く
# hubot hello, I am <名前> - <名前> に挨拶をする
#
module.exports = (robot) ->
robot.respond /hello, I am (.*)/i, (msg) ->
# この中で処理を書く
name = msg.match[1] # () の中が取れる
msg.send "Test" # 発言をする
msg.send "ちょりーっす、 #{name}"
robot.respond /goodbye (.*)/i, (msg) ->
# いくつでもコマンドを追加できる
$ ./bin/hubot
Hubot> hubot, hello ...
# ローカルで試してからIRCでも試す!
module.exports = (robot) ->
robot.respond /hello, I am (.*)/i, (msg) ->
name = msg.match[1]
if name == "horaotoko"
msg.send "べ、別にあんたに挨拶なんかしたくないんだからねっ!"
else
msg.send "ちょりーっす、 #{name}"
module.exports = (robot) ->
robot.respond /hello, I am (.*)/i, (msg) ->
name = msg.match[1]
if name == "kyokutyo"
for i in [1 .. 3]
msg.send "ちょりーっす、 #{name}"
else
msg.send "ちょりーっす、 #{name}"
random = (n) -> Math.floor(Math.random() * n)
module.exports = (robot) ->
robot.respond /今日の運勢/i, (msg) ->
fortunes = [
'大吉',
'末吉',
'大凶'
]
result = fortunes[random(3)]
msg.send "今日の運勢: #{result}"
module.exports = (robot) ->
robot.respond /about (.*)/i, (msg) ->
name = msg.match[1]
profiles = {
'udzura' : '基盤ティーム',
'horaotoko' : '3.5期生',
'kyokutyo' : '隠れ変態'
}
result = profiles[name]
if result
msg.send "#{name}さんのプロフィール: #{result}"
else
msg.send "#{name}さんのことなんて知りません"
- (1) 電卓ボット(記号を見て四則計算する)
- (2) 現在時刻を教えてくれるボット
now = new Date
now.toString()
now.getFullYear(), now.getFullYear(), now.getDay() #...
- 外部サービスと連携する!!
- あたらしいnpmモジュールを入れる
$ npm install --save request
module.exports = (robot) ->
robot.respond /tiqav (.*)/i, (msg) ->
request = require('request');
request.get("http://api.tiqav.com/search.json?q=#{msg.match[1]}", (error, response, body) ->
if error or response.statusCode != 200
return msg.send('画像検索に失敗しました...')
data = JSON.parse(body)[0]
# robot.logger.info data
msg.send "画像の様子です: http://img.tiqav.com/#{data.id}.#{data.ext}" )
- 皆さんの使うプログラムは、人間が立ち上げ、人間が終了させる(アプリケーション)
- 今回は、ボットなので、ずっと立ち上がっていなければいけない
- ずっと立ち上がっているプログラムをサーバとかデーモンと呼ぶ
Host dokku001.tokyo.pb
HostName dokku001.tokyo.pb
User dokku
IdentityFile ~/.ssh/id_dsa.pb
web: bin/hubot-irc -a irc
$ git init .
$ git add .
$ git commit
$ git remote add dokku dokku@dokku001.tokyo.pb:udzura-hubot
$ git push dokku master