2017年12月8日金曜日

Blogger でブログカードを使う方法

概要

ブログカードとは簡単に言えばかっこいいリンクのことです
こんな感じです

環境

  • Blogger 2017/12/07 時点
  • ShareHtml も同様

ShareHtml を使う

ShareHtml というサービスを使います
ここにブログカード化したい URL を入力しましょう

すると HTML と CSS が吐かれます
まずは CSS を Blogger に登録する必要があります

CSS を登録する

Blogger の管理画面から

テーマ -> カスタマイズ

と選択します
するとテンプレートをカスタマイズできる画面になるので

上級者向け -> CSS を追加

と選択します
そこに先ほど ShareHtml から取得した CSS 情報をペーストすれば OK です
blogger_blogcard1.png

「ブログに適用」選択して戻りましょう

あとは HTML を貼り付けるだけ

新規投稿画面にそのまま HTMl を貼り付ければ OK です
ちなみに自分は StackEdit から投稿していますが、StackEdit でそのまま HTML を貼り付けて投稿してもうまく表示されなかったので、StackEdit の場合は投稿後に直接管理画面から HTML を貼り付けるしかなさそうです

最後に

ShareHtml を使って Blogger でブログカードを作成する方法を紹介しました
他にもブログカードを作れるサービスはあるのでデザインが気に食わないなら変えてみるのもいいと思います
はてなブログなどがあるみたいです

というかそもそも Blogger 自体でブログカード機能をホスティングしてほしいものです

2017年12月7日木曜日

slack-ruby-bot で作成したボットを heroku にデプロイしてみる

概要

前回まででイベント API と普通のボットの開発を行いました
これまでは localhost で動作させていましたが永続的に稼働させたい場合はサーバが必要になります
Heroku 上で動かすことができたので今回はその方法を紹介したいと思います

環境

  • macOS X 10.13.1
  • ruby 2.4.1p111
  • slack-ruby-bot 0.10.5

ボットスクリプト

前回から少し改良だけ完了しましょう
トークン情報を環境変数で設定できるように修正します

require 'slack-ruby-bot'

server = SlackRubyBot::Server.new(
  token: ENV["TOKEN"],
  hook_handlers: {
    message: [->(client, data) { puts "メッセージを受信しました" }]
  }
)
server.run

Gemfile の作成は前回通り行っておきましょう
これで OK です

heroku 上にアプリを作成する

コマンドでも画面からでも OK です
アプリを作成しましょう

  • git init
  • git commit -m "first commit"
  • heroku login
  • heroku git:remote -a test-bot

今回は test-bot というアプリを作成しました
とりあえず git リモートに heroku を追加するところまでやりましましょう

Procfile を作成する

今回の肝です
Procfile に heroku 上でボットを動作させるためのコマンドを記述します

  • vim Procfile
bot: bundle exec ruby bot.rb

作成したらコミットしましょう

  • git commit -m "add Procfile"

デプロイする

では heroku 上にコードや設定ファイルをデプロイしましょう

  • git push heroku master

で push したらトークン用の環境変数を設定します

  • heroku config set TOKEN=xoxb-111111111111-xxxxxxxxxxxxxxxxxxxxxxxx

web アプリではないので push しただけではデプロイされません
scale コマンドがあるのでそれでデプロイします

  • heroku ps:scale bot=1

これでボットが起動するはずです
チャネルに話かけて heroku 上にデプロイしたボットから返事があるか確認してみましょう

最後に

slack-ruby-bot で作成したボットを heroku 上で起動させてみました
他にもコンテナを使うなどいろいろと方法はありますが今回は Procfile を使った方法を紹介しました

2017年12月6日水曜日

slack-ruby-bot でイベント API を使う方法

概要

過去に Ruby + slack-api というライブラリを使ってリアルタイム API を試しました
それと同じことが slack-ruby-bot でもできるので試してみました
基本はイベントに応じて反応するボットを作成すれば OK です
Slack のイベント API で使えるイベントの一覧はこちらです

環境

  • macOS X 10.13.1
  • ruby 2.4.1p111
  • slack-ruby-bot 0.10.5

事前準備

前回の記事を参考にボットをチャネルに追加するところまで完了してください
今回作成するボットも同じチャネルでテストします
ちがうチャネルでボットをテストする場合はちゃんと invite してからメッセージを送ったりして試しましょう

メッセージのイベントに反応してみる

まずはメッセージ送信時にボット側のサーバに適当にロギングする処理を書いてみましょう

  • vim message_event.rb
# coding: utf-8
require 'slack-ruby-bot'

server = SlackRubyBot::Server.new(
  token: 'xoxb-111111111111-xxxxxxxxxxxxxxxxxxxxxxxx',
  hook_handlers: {
    message: [->(client, data) { puts "メッセージを受信しました" }]
  }
)
server.run

SlackRubyBot::Server クラスのインスタンスを作成します
その際に Bots インテグレーションで取得した API Token を指定します
また、hook_handlers を使って各イベント時に処理する内容を記載することもできる
今回は message イベントが発生したときにメッセージを出力しています
では実行してみましょう

  • bundle exec ruby message_event.rb

起動してボットがいるチャネルで何でもいいので発言してみましょう
するとプロンプトに puts のメッセージが表示されるのが確認できると思います

D, [2017-12-06T14:46:55.363616 #33653] DEBUG -- SlackRubyBot::Client#dispatch: channel=C1QD3RVNZ, source_team=T1QDA7KG9, team=T1QDA7KG9, text=a, ts=1512539214.000227, type=message, user=U1QDESGLS
メッセージを受信しました

イベントの反応時に独自クラスを使用する

先ほどのサンプルではイベント発生時にクロージャを使って処理を実装しました
複雑な処理をさせたいときには独自のクラスを作成してそのクラス内に処理を記載することができます

  • vim message_event.rb
# coding: utf-8
require 'slack-ruby-bot'

class Bot
  def call(client, data)
    puts data
  end
end

server = SlackRubyBot::Server.new(
  token: 'xoxb-111111111111-xxxxxxxxxxxxxxxxxxxxxxxx',
  hook_handlers: {
    message: Bot.new
  }
)
server.run

クラスを作成し call というメソッドを実装するとそれを勝手にコールバックメソッドとして実行してくれます
そしてそのクラスのインスタンスを先ほどクロージャで指定した部分に置き換えれば OK です
実行してチャネルにメッセージを送信する以下のようにメッセージのデバッグ情報が出力されると思います

channel=C1QD3RVNZ, source_team=T1QDA7KG9, team=T1QDA7KG9, text=b, ts=1512539887.000130, type=message, user=U1QDESGLS

ボットにチャネルへ返信させる

今度は puts デバッグではなくオウム返しでメッセージを返信させたいと思います

vim message_event.rb

# coding: utf-8
require 'slack-ruby-bot'
SlackRubyBot::Client.logger.level = Logger::WARN

class Bot
  def call(client, data)
    client.say(text: data.text, channel: data.channel)
  end
end

server = SlackRubyBot::Server.new(
  token: 'xoxb-111111111111-xxxxxxxxxxxxxxxxxxxxxxxx',
  hook_handlers: {
    message: Bot.new
  }
)
server.run

client.say を使います
引数に送信するメッセージとメッセージを送信するチャネル情報を設定します
ちなみに data は Slack::Messages::Message というクラスのオブジェクトになっています
text フィールドにメッセージが入っているのでそれを使ってオウム返しします

これで実行してメッセージを送ってみると送ったメッセージがそのまま返ってくるようになると思います
slack_ruby_bot_rtm1.png

最後に

slack-ruby-bot を使ってイベント API を使って見ました
SlackRubyBot::Server を使うのがポイントかなと思います
他にもいろんなイベントがあるので自分がやりたいことに合わせてイベントを選択してください

2017年12月5日火曜日

Ruby で Slack の bot を作成してみた

概要

Slack で Bot を開発するのは Hubot が有名ですが Ruby を使って Bot を作成することも可能です
設定から簡単な使い方まで紹介したいと思います

環境

  • CentOS 7.3.1611
  • ruby 2.3.3p222
  • gem 2.6.11
  • slack-ruby-bot 0.10.5

Bots のインテグレーションを追加する

まずはインテグレーションを追加しましょう
Bots を登録するページに移動して「Add Configuration」を選択します
slack_with_ruby_bot1.jpg

Bot の名前を設定する画面になるので好きなボット名を設定し「Add bot integration」を選択します
slack_with_ruby_bot2.jpg

これで Bots インテグレーションの追加が完了です
表示されている API Token をあとで使うのでメモしておきましょう
slack_with_ruby_bot3.jpg

slack-ruby-bot を使って Bot を作成する

今回は Ruby で Bot を作成します
公式が出しているライブラリがあるので素直に使いましょう

  • bundle init
  • vim Gemfile
gem "slack-ruby-bot"
gem "celluloid-io"
  • bundle install --path vendor

でライブラリのインストールは完了です

Bot を作成する

まずは簡単なピンポンを行うだけの Bot を作成しましょう

  • vim bot.rb
require 'slack-ruby-bot'

class PongBot < SlackRubyBot::Bot
  command 'ping' do |client, data, match|
    client.say(text: 'pong', channel: data.channel)
  end
end

PongBot.run

こんな感じです
command 関数の引数で Bot が反応するコマンドと実際に Bot が処理する内容をブロック内で実装するだけです
Bot が返事をするときは client.say を使います
返事の内容と返事をするチャネルを指定します

ではサーバ上で実行までしてみましょう
先程取得した API Token はここで使います

  • export SLACK_API_TOKEN=”xoxb-111111111111-xxxxxxxxxxxxxxxxxxxxxxxx”
  • bundle exec ruby bot.rb

ずらずらーっとログが流れると思います
エラーが出なければ OK です
起動したら動作確認してみましょう
Bot を追加したいチャネルに invite して話かけてみましょう

slack_with_ruby_bot4.jpg
こんな感じで動作すると思います

画像を投稿するように修正してみる

以下のような感じに修正してみましょう
画像は自分の Twitter のアイコンなので好きな画像の URL に変更してください

  • vim bot.rb
require 'slack-ruby-bot'

class PongBot < SlackRubyBot::Bot
  command 'ping' do |client, data, match|
    client.say(text: 'pong', channel: data.channel)
  end
  command 'logo' do |client, data, match|
    url = 'https://pbs.twimg.com/profile_images/712848447569661952/ayfI9-77.jpg'
    client.say(text: url, channel: data.channel)
  end
end

PongBot.run

一旦停止して再度 Bot を起動しましょう
今後は「logo」というコマンドが通るようになります
slack_with_ruby_bot5.jpg

最後に

Slack の Bot を Ruby で作成してみました
かなり簡単に作成することができました

今回は Getting Started 的な内容しか紹介していません
他にもエイリアスを張ったりオペレータオーバライド的なことをして計算機などを作ったりもできるようなので興味があれば以下のサイトを見てください

Slack で Bot を作るのは Hubot が有名ですが Ruby でも簡単に作成できるので今後は Ruby で Bot を作成しようかなと思います

参考サイト

2017年11月27日月曜日

Mac 版の Minecraft を購入してみた

概要

今更ながら Mac 版の Minecraft を購入してみました
スクリーンショット付きで紹介したいと思います

環境

  • macOS X 10.13.1

購入する

まずは Minecraft の公式ページにアクセスしましょう
ここで「MINECRAFT を購入する」を選択します
minecraft1.png

すると MOJANG のアカウントを作成する画面になるので登録しましょう
すでにある場合はログインすれば OK です
入力できたらアカウントを作成します
minecraft2.png

すると登録したメールアドレスに認証用のコードが届くのそれを入力してアカウントをアクティベートします

次にプロファイルとクレジットカード情報を登録しましょう
登録が完了し情報が問題なければ購入完了画面に移動します
minecraft4.png

ちなみにメールにも受領書メールが来ます
そのまま「MACOS を獲得するためダウンロードする」ボタンを押して Minecraft をダウンロードしましょう
すると「Minecraft.dmg」というファイルがダウンロードできます

インストールする

ダウンロードできた dmg ファイルを展開してインストールしましょう
インストールは簡単で dmg ファイルを展開したら Minecraft.app を Applications フォルダに移動するだけです
minecraft5.png

起動してみる

LaunchPad やらアプリケーション一覧からインストールした Minecraft を起動しましょう
ランタイムのダウンロードが始まると思います
minecraft6.png

完了するとログイン画面になるので登録したメールアドレスとパスワードでログインしましょう
minecraft7.png

ログインが完了すると本体の jar ファイルをダウンロードできるボタンが表示されるのでクリックしてダウンロードしましょう (ダウンロードするものが多いですね、、、)
ついでに大量のメディアファイル (ogg ファイル) もダウンロードします (おそらくゲームに必要なファイルでしょう)
minecraft8.png

起動完了

すべてのダウンロードが完了し以下の画面になればゲームを開始することができます
minecraft9.png

とりあえず設定したほうが良さそうなこと

  • 設定 -> 言語設定 -> 日本語
  • 設定 -> 操作設定 -> で操作のキーバインドを設定
  • 設定 -> 操作設定 -> マウスの感度を 70% (3D 酔い防止)
  • 設定 -> ビデオ設定 -> 画面の揺れオフ (3D 酔い防止)
  • シングルプレイ -> ワールド新規作成 -> ワールド名を決定

あたりかなと思います
あとはプレイしながら好きなところを設定していきましょう

最後に

Mac で Minecraft を購入してインストールし起動するところまでやってみました
Runtime はどうやら Java らしいので Java がインストールされていない場合はインストールが必要かなと思います

これでマイクラデビューです
いろいろと試していきたいと思います
mod でプログラミングもしてみようと思います

2017年11月25日土曜日

LPIC202 4.5 に合格しました

概要

昨年 LPIC 201 に合格しました
今年は 202 を受験したので勉強方法などを紹介したいと思います

申し込みから受験までの流れ

前回と全く同じなので申込み方法などは前回の記事を参考にしてください
ピアソン VUE から申し込みを行う感じです

勉強方法

一点前回より大きく変わった点があります
それは LPIC の 202 のバージョンが 4.5 に変わりました

前回の 201 は 4.0 というバージョンだったのですが、今回は 4.5 というバージョンに変わりました
簡単に言うと出題される範囲が変わっています

で勉強方法ですが大きくは前回と変わりません
過去問をガンガン解いて 100% になるまで繰り返します
あとは実際にコマンドを叩いたりネットで調べて情報を補っていきました

まず参考書ですが前回使用した 4.0 のバージョンの参考書が手元にあるのでまずはこれで学習を進めました

これに出題範囲の問題集+模擬試験が付いているのでそれを 100% になるまで繰り返しました

個人的には「4.5 になったと言ってもマイナーバージョンアップだからそんなに変わらないだろ」と思っていました
とは言え「4.5 も少しはカバーしておきたい、でも 201 は合格しているので参考書を新しく買うのもなー」と思い探してみたら差分だけ紹介している本が手軽な値段で売っていたのでこれを購入して追加で勉強しました

こも模擬試験があったので模擬試験を 100% になるまで解きました

この 2 冊の参考書を完璧に覚えたたらあとはネットや help コマンドを使って知識を補いました

で実際はどうだったか

LPIC はご存知の通り回答の詳細や問題の持ち帰りはできないので記憶を辿ることしかできないのですが、一番感じたのは「勉強不足」だったなと思いました

特に以下の分野については紹介した参考書だけでは完全に知識不足だったなと思いました

  • IPv6 について
  • 電子メールの知識

前者や分野に関係なくすべての分野で IPv6 に関する知識が出題された記憶があります
後者に関しては参考書で得られる知識では完全に足りず実際に構築しないとわからなかったり運用してみないとわからない問題もあったなという印象です

もしかしたら 4.5 の参考書を素直に買っていたらそれらもカバーできていたかもしれないです
前回受験した 201 に比べ 202 は過去問から出題される内容が少ないなと思いました (まだ 4.5 になってから日が経っていないというのもあると思います)
なので、202 の方がより実践的な知識が必要になるなと思いました

成績表

点数配分は一応こんな感じでした
メールがダメダメでした
lpic202_ret.jpg

最後に

LPIC 202 4.5 に合格したので勉強方法について紹介しました
個人的には 201 よりも難しかった印象です

今になって思いますが 202 は DHCP や DNS, nfs, nginx などサーバとして構築できる技術が多いので実際に構築して挙動を確かめる方法が取れればそれが一番良いと思いました

次は下位ですが 101, 102 を一気に取得しようかなと思います

2017年11月17日金曜日

SpriteKit でカウントダウンする画面を作ってみた

概要

ゲームなどをスタートする場合に 5 からカウントダウンする場合があると思います
自分が作っているゲームアプリでも必要になりそうだったので試しに作ってみました

環境

  • macOS X 10.13.1
  • Xcode Version 9.1 (9B55)

GameScene.sks

こんな感じで背景とカウントする用のノードを追加します
背景は SKSpriteNode ですがカウントするのは SKLabelNode を使っています
カウントダウンするのに画像を使いたい場合はカウントダウン用のノードも SKSpriteNode にしたほうが良いかなと思います
spritekit_countdown1.png

Scene の設定で CustomClass に「GameScene」を設定しておきましょう

GameScene.swift

sks ファイル上に配置したノードを使って Swift 側でカウントダウン処理を実装します
で全容は以下の通りです
初めに言っておきますがとりあえず動けば良いと思って作ったのでソースコードはかなり適当です

import SpriteKit

class GameScene: SKScene {

    var background = SKSpriteNode()
    var count = SKLabelNode()

    override func didMove(to view: SKView) {
        // 各種ノードを初期化
        background = childNode(withName: "background") as! SKSpriteNode
        count = childNode(withName: "count") as! SKLabelNode
        // wait するアクションを定義
        let wait = SKAction.wait(forDuration: 1.0)
        // 5 から 1 までカウントダウンするアクションを定義
        let five = SKAction.run({
            self.count.text = "5"
        })
        let four = SKAction.run({
            self.count.text = "4"
        })
        let three = SKAction.run({
            self.count.text = "3"
        })
        let two = SKAction.run({
            self.count.text = "2"
        })
        let one = SKAction.run({
            self.count.text = "1"
        })
        // 背景とカウントダウンのラベルを非表示にするアクションを定義
        let hidden = SKAction.run({
            self.background.isHidden = true
            self.count.isHidden = true
        })
        // アクションを実行
        self.run(SKAction.sequence([wait, five, wait, four, wait, three, wait, two, wait, one, wait, hidden]))
    }
}

説明はコード内にコメントを記載してあります
基本はカウントダウンする SKAction を作成してそれを SKAction.sequence でつなぎ合わせて run するだけです

かなりコードが冗長なのでカウントダウンするアクションの部分はループなので書き直せると思います

もしカウントダウンするラベルが SKSpriteNode なのであれば .texture でカウントダウンごとに画像を変更すれば OK かなと思います

あと今回背景用のノードを一つ追加しています
カウントダウンが終了するまでゲームを始めたくない場合に背景用のノードを最前面に置いておくことでタップなどをさせないように制御することができます
背景用のノードを非表示にすることで実際にゲームする画面にタップすることができるようになるという感じです

動作確認

こんな感じで動きます
うーん、それっぽい

spritekit_countdown2.gif

最後に

SpriteKit でカウントダウンする画面を作成してみました
もしかするともっとかっこいい画面を簡単に作成できるライブラリがあるかもしれません
とりあえず簡単にかつ自作したいという場合に参考にしてみてはいかがでしょうか

参考サイト