sakaki のすべての投稿

Golangで実行可能なパッケージ(main)とライブラリ(main以外)を混在させる方法

ちゃんと理解できていない可能性もありますが、備忘録としてメモ。

Goでeasy_ntpdateという時刻を合わせるだけのちょっとしたプログラムを作ったのですが、これを別のプログラムからも使いたくなったのが発端です。

もともとバイナリにして実行するだけの想定だったので、main関数に処理を書いていました。

package main

func main() {
  (処理など)
}

これを、バイナリとしてコンパイルできるようにしつつ、ライブラリとしても使えるようにするのが目的です。

そのままだと利用先でmainパッケージが重複してしまいますので、main関数を残しつつプログラムの内容だけを別パッケージに移します。

goは同一ディレクトリに複数のパッケージは置けないので、ディレクトリを分けて配置します。

今回はeasy_ntpdateというパッケージ名で作成しました。

rootdir
│  main.go(mainパッケージ)
│
└─easy_ntpdate
        easy_ntpdate.go(easy_ntpdateパッケージ)

main.goではライブラリをimportして叩く処理のみを記述します。

package main

import "./easy_ntpdate"

func main() {
    easy_ntpdate.SetDate()
}
package easy_ntpdate

func SetDate() {
  (処理など)
}

これでimportすればeasy_ntpdateとして利用できます。

最初は戸惑いましたが、goのパッケージ管理はgithubとの相性も良く作りやすいですね。

rivarunが404になる時

結論だけ言うと、チャンネルのオートスキャンで治る時がありますよって事なのですが・・・

ちなみに、オートスキャンは次のコマンドで実行できます(参考:公式サイト)。

$ curl -X PUT "http://localhost:40772/api/config/channels/scan"

localhostは適宜変えてください。

これで地上波のみですがチャンネルが自動でスキャンされて設定が保存されます。

経緯

ChinachuのDockerレポジトリからセットアップを試していたのですが、Mirakurunがうまく動いていないようでChinachu側で番組表が取れませんでした。

rivarunを叩くと接続はできるものの404になってしまいます。そこで、

$ mirakurun log

でログを出したところ、次のようなエラー文を発見。

stream has closed before get network

調べてみるとチャンネル設定がうまくいっていない時に出るエラーのようです。

さらに調べると、mirakurunにはチャンネルスキャンという便利機能もあるようなので、

$ curl -X PUT "http://mirakurun-host:40772/api/config/channels/scan"

を実行したところ番組表が取れるようになっていました。

オートスキャン便利ですね。次から自動で実行するようにしておこう・・・

aptでDocker更新時にエラー

自宅サーバーのメンテナンス作業をしていたら、以下のエラーに遭遇しました。

# apt upgrade
(中略)
docker-ce (17.09.0~ce-0~ubuntu) を設定しています ...
Job for docker.service failed because the control process exited with error code. See "systemctl status docker.service" and "journalctl -xe" for details.
invoke-rc.d: initscript docker, action "start" failed.
● docker.service - Docker Application Container Engine
   Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
   Active: activating (auto-restart) (Result: exit-code) since 日 2017-10-15 15:27:25 JST; 31ms ago
     Docs: https://docs.docker.com
  Process: 15537 ExecStart=/usr/bin/dockerd -H fd:// (code=exited, status=1/FAILURE)
 Main PID: 15537 (code=exited, status=1/FAILURE)

10月 15 15:27:25 luka.home systemd[1]: Failed to start Docker Application Container Engine.
10月 15 15:27:25 luka.home systemd[1]: docker.service: Unit entered failed state.
10月 15 15:27:25 luka.home systemd[1]: docker.service: Failed with result 'exit-code'.
dpkg: パッケージ docker-ce の処理中にエラーが発生しました (--configure):
 サブプロセス インストール済みの post-installation スクリプト はエラー終了ステータス 1 を返しました
処理中にエラーが発生しました:

どうやら、Docker起動時にホストを指定する項目が/etc/docker/daemon.jsonと/lib/systemd/system/docker.serviceの両方で指定されていたため、重複してエラーになっていたようです。

私の環境ではswarm modeでクラスタを組んでいるため、エラー文にもある ExecStart=/usr/bin/dockerd -H fd:// の部分は必要ありません。

/lib/systemd/system/docker.service を編集して、

ExecStart=/usr/bin/dockerd -H fd://

ExecStart=/usr/bin/dockerd

に書き換えを行い apt upgrade を実行したところ、エラーは解消されました。

fd:// オプションを保持したい場合は、 /etc/docker/daemon.json に設定を行う形になりそうです。

ElectronでMarkdownビュワーを作ってみた

最近Electronを触っているのですが、サクサク作れるのでどんどんアプリを作りたくなってしまいます。

ということで、Markdownの表示専用のアプリを作ってみました。

githubはこちらとなります。

バイナリはこちらで配布しています。

動作画面はこんな感じです。

タブ表示ができるので複数ファイルも快適に表示できます。

ファイルのオープンはダイアログとドラッグアンドドロップに対応し、複数ファイルもすべて開くことができます。

また、ローカルの画像も読み込むことができます。

今後もちょっとずつ機能を追加しようと思うので、よければ使ってみてください。

けものフレンズ、たつき監督の降板騒動について

追記情報

2017年10月14日

  • KADOKAWAの川上氏のマストドンのTootについて追記しました。
  • KADOKAWAの井上氏のツイートについて追記しました。
  • ヤオヨロズの福原氏のツイートについて追記しました。
  • けものフレンズの発起人である梶井氏について追記を行いました。

憶測が飛び交っているようなので、私が知っている限りの情報のまとめとして書いておきます。

公式からの発表が少ないのでかなり私見が入っています。破綻している点などありましたらコメントで指摘いただけると助かります。

何が起こったのか

アニメ「けものフレンズ」を成功に導いた「たつき監督」が2期の制作から降りることになったのが発端です。

アニメの監督が替わることは珍しい話ではありませんが、けものフレンズのたつき監督はファンから絶大な支持を受けており、2期制作の期待が高かったためこのような騒ぎに至ったと考えられます。

公式からの発表

(追記 10/14)公式から発表された文章は当初2つのみでしたが、現在各方面から何かしらの発表がされています。

以下、時系列順に記述します。

  1. たつき監督のツイート
    「カドカワのお達しで2期制作から外れることになった」
  2. けものフレンズ公式(カドカワ)発表
    「ヤオヨロズ(たつき監督が所属するアニメ制作会社)と条件が合わずヤオヨロズが2期制作から降りた」
  3. けものフレンズとコラボ中だったJRAおよび日清のホームページにて発表
    コラボはヤオヨロズがアニメ制作を降りる前に決まっており、一連の騒動については認識していなかった
  4. ドワンゴの川上氏が自身のマストドンで発言
    「たつき監督のことを心配している。大きな騒ぎになっているので、ドワンゴでもKADOKAWAでも議論されない事はないだろう。」
  5. KADOKAWAの代表取締役専務執行役員である井上氏のツイート
    「たつき監督の功績は大いに認めている。ヤオヨロズと大きな溝があるので、今後どうするか話し合いに入った。」
  6. ヤオヨロズの取締役員である福原氏のツイート
    「川上氏、井上氏からヒアリングを受けている。これから話し合いを始める」

以下、たつき監督のツイートです。

また、けものフレンズ公式からの発表はこちらです。

念のため、私のスクショツイートも貼っておきます。

ドワンゴの川上氏のマストドンに関するツイートです。

KADOKAWAの川上氏は4度のツイートに分けて経緯を説明しています。

最後に、ヤオヨロズ唯一の発表である福原氏のツイートを載せておきます。

公式発表から読み取れること

ここでは3つの個人・団体が登場しています。(追記 10/14:ヤオヨロズおよびカドカワ・KADOKAWAについて、それぞれ登場人物が増えました)

  1. けものフレンズを成功に導いた「たつき監督」
  2. たつき監督が所属するアニメ制作会社「ヤオヨロズ」および取締役の福原氏
  3. けものフレンズの版権を持っている「カドカワ」
  4. カドカワの親会社であるKADOKAWAと、その代表取締役の井上氏
  5. KADOKAWAの系列会社であるドワンゴおよび、社長の川上氏

注意したいのは、ヤオヨロズは未だに公式発表を行っていない点です。

(追記 10/14:ヤオヨロズの取締役員である福原氏が10月3日にツイートを行っています)

まず、たつき監督の発表から「カドカワが原因でけもフレ2期から降ろされた」旨が伺えます。

カドカワ側の発表にもたつき監督が所属するヤオヨロズが制作から降りた事が明記されているので、たつき監督が2期から降ろされた点は間違いないようです。

次にカドカワの文章を見てみると、”(ヤオヨロズ株式会社には)次回の制作を引き続きお願いしたかったため、(中略)正常化を図る申し入れをさせていただきましたが、(中略)(2期の制作を)辞退したい、とのお返事でございました”ということですので、カドカワとヤオヨロズの間に何らかのトラブルがあったと推測できます。

まとめると、版権を持つカドカワとアニメを作ったヤオヨロズでトラブルが起き、その結果たつき監督が2期の製作をできなくなったというのが大まかな流れでしょうか。

(追記 10/14)また、KADOKAWAおよびヤオヨロズのツイッターでの発表により、現在両者で解決に向けて何らかの話し合いが行われている事が伺えます。

しかし、井上氏と福原氏のツイートからしばらく経っていますがこれといった動きはありません。

けものフレンズはアニメの2期および年内のスマホアプリ化が決定していますので、その際に何らかの発表があるかもしれません。

ヤオヨロズとカドカワのトラブルはなぜ起こったのか

では、なぜカドカワとヤオヨロズはトラブルになったのでしょうか。

ヤオヨロズの具体的な発表がありませんのでここからの話は全て憶測となります。

カドカワの公式発表で、トラブルの原因に言及している部分があります。

アニメーション制作を担当していただきましたヤオヨロズ株式会社には、関係各所への情報共有や連絡がないままでの作品利用がありました。映像化プロジェクトとしては次回の制作を引き続きお願いしたかったため、情報は事前に共有してほしい旨の正常化を図る申し入れをさせていただきましたが、ヤオヨロズ株式会社からは、その条件は受け入れられないので辞退したい、とのお返事でございました。

つまり、ヤオヨロズ側がけものフレンズのコンテンツをカドカワに無断で利用したため、トラブルになったと言っているわけです。

ヤオヨロズの”無断利用”については具体的な言及はありませんでしたが、

  1. たつき監督が個人で制作したけものフレンズ関連のコンテンツ
  2. Mステなどのメディアへの関係声優の露出

の2つの可能性が指摘されています。

たつき監督が個人で制作したけものフレンズ関連のコンテンツについて

たつき監督は個人製作でけものフレンズコンテンツを出しています。主には

  1. ツイッターやニコニコ動画に上がっている動画や画像
  2. コミケでの頒布物

があり、1については12話公開後に無料で配信された後日談のアニメ「ばすてき」が有名です。

ただ、これらの配布物は全て「けものフレンズガイドライン」に則って制作されています。

けものフレンズガイドラインは公式ページの右上に表示された「けものフレンズって?」というボタンを押すと表示されます。

それによると、

趣味の範疇における、個人または同人サークル等で、以下のガイドラインに沿って活動いただく際には、利用についてのご連絡は不要です。
1.二次創作(自作物のみ)の許可範囲
(1)イラスト、同人誌、マンガ、小説などの作成、各種運用
(2)コスプレ衣装の作成、およびコスプレによる各種活動、その各種運用

という事らしく、このガイドラインはもちろんたつき監督にも当てはまるので、2次創作の制作についてカドカワがどうこう言う権利はありません。

なので、この件についてはカドカワがよっぽど常識はずれでない限り筋違いの憶測であると言えそうです。

Mステなどのメディアへの関係声優の露出について

おそらく問題の本質はこちらだと思うのですが、ヤオヨロズはカドカワに正式な許諾を取らずにけものフレンズの声優をMステなどのメディアに出した可能性があります。

けものフレンズにはヤオヨロズの関連会社に所属している声優が多く出ており、そのグループ内で結成したけものフレンズの名を冠したユニットで活動を行っていました。

その活動で出た利益について、カドカワが良く思わなかった可能性が考えられます。

ただ、この点についてはヤオヨロズの声明がありませんので、内部でどのような手続きが行われ、どのような経緯で問題に至ったかが全く分かりません。

さらにカドカワの声明については不自然な点がいくつもあり、信用に足るものではないという意見もあります。

それゆえ、どちらが原因かという判断は現時点では難しいと考えています。

カドカワが叩かれる理由

今のところ経緯の説明が十分でなく、関係者からの声明も不足している状態ですが、SNSではカドカワやその系列であるドワンゴが大々的に叩かれる傾向にあります。

その理由としては、

  • たつき監督が降ろされた原因としてカドカワが名指しされている
  • カドカワの声明がなかなかの怪文書である(不自然な点が多い)
  • けものフレンズというコンテンツに致命的な悪影響を与えた
  • 提携先であるヤオヨロズに責任を転嫁した可能性がる

などが挙げられそうですが、私個人としては「カドカワとヤオヨロズという上層で発生したトラブルを、ファンとコンテンツを裏切る形で解決しようとした」点が最大の問題だと思っています。

たつき監督はけものフレンズ最大の功労者であり、たつき監督の降板はけものフレンズというコンテンツにとって絶対的な悪影響を与えることは少し考えれば誰でもわかりそうなものです。

そのような最悪の状況を(結果的にであれ)作り出し、なおかつ連携先のヤオヨロズに責任をすべて転嫁するというのは、取れる手段の中でもこれ以上ないくらいの最悪手ではないでしょうか。

個人的には、けものフレンズがこのようなどうしようもない利権争いのせいで終わってしまうのがただただ残念でなりません。

この状況が少しでも改善されればと切に願います。

(追記: 10/14)KADOKAWAとヤオヨロズが現在話し合いをしているようです。成果が出るかは分かりませんが、両者とファンができるだけ納得できる形での解決(願わくはたつき監督の復帰)を期待して見守るしかなさそうです。

カドカワ側の声明の違和感

カドカワがけものフレンズプロジェクトとして発表した声明には、いくつか不自然な点があります。

  • 文章内に謝罪やたつき監督への言及は無く、結局何が言いたいのか不明
  • 「ヤオヨロズが8月に辞退したいと言った」とあるが、9月にコラボ映像が発表(後述)
  • 突然流れと何の関係もない「動物ファースト」なる標語を出す
  • けものフレンズを「誰のものでもないプロジェクト」と表した直後に無断での作品利用について言及
  • 「関係各所への情報共有や連絡がないままでの作品利用」について、具体的な言及無し

(追記: 10/14)コメントにてカドカワの内情が変わったのではという情報をいただきました。ありがとうございます。

けものフレンズの発起人カドカワ出版部門梶井斉編集長が外されてカドカワアニメ事業部が仕切ったせいって説が有力視されてるが。
出版ルートでヒットしたのが気に入らない。書籍形式が気に入らない。
梶井氏のインタビューを見るとわかるが二次創作をされるほうがコンテンツの寿命が延びると答えてます。公式発表と間逆ですよね。梶井氏を更迭しないとこうならないと思うのです。

梶井氏について少し調べてみましたが、KADOKAWAのコミックス編集部の編集長であり、けものフレンズプロジェクトの発起人の1人という立ち位置のようです。

インタビューを読ませていただきましたが、確かに二次創作を強く推奨しており、けものフレンズプロジェクトをオープンなものにしていた事が書かれていました。

梶井氏がプロジェクトから外れたかどうかに関しては取り急ぎ有用な情報が見当たりませんでしたが、梶井氏がいなくなったと考えると上記のような方針転換も納得できます。

ヤオヨロズの辞退の意思表明の時期について

カドカワによると、ヤオヨロズが辞退の意思を表明したのは8月頃となっています。

しかし、それ以降にもどん兵衛やJRAとコラボが行われており、映像が制作されています。

ただ、これについてどん兵衛とJRAは「(8月より)以前からコラボが決定していた」という発表を行っているので、コラボ映像の制作は辞退する8月より前から決まっており、契約上制作を行ったのではないでしょうか。

いずれにせよ、たつき監督の降板でけものフレンズというコンテンツに対するイメージの下落は避けられません。

そんな状態でコラボさせられ、問題に巻き込まれて声明まで発表しなければならなくなった企業は、カドカワに対して嫌悪感を抱かずにいられるでしょうか。

「8月に辞退したいと言われた」という発表は、コラボ企業へのマイナスイメージを与え、事態を悪化させる結果となりそうです。

突然「動物ファースト」なる標語を出す

けものフレンズのファンとしてはこれが一番頭に来るのですが、カドカワの声明では以下の文章が掲載されています。

「けものフレンズ」は動物ファーストの理念のもと、関わってくださったすべての方々の手によってゲーム、コミック、アニメ、舞台と展開して参りました。

まず、動物ファーストとたつき監督の降板と、いったい何の関係があるのでしょう。

そもそも動物ファーストとは何でしょうか。

頭の悪い人が考えたアホみたいな標語にしか聞こえません。

だいたい動物のことを一番に考えるなら、どう考えてもアニメを作らず適当な基金に募金をしたりするほうが早いと思います。

また、声明には次の文章も含まれています。

「けものフレンズプロジェクト」は今後も御協力をいただく皆様と共に作品を守り、ファンを守り、動物たちのことをもっと知ってもらう活動をこれからも初志貫徹、続けていく所存です。

実際は、「けものフレンズプロジェクト」は社外の協力者に責任を押し付け、たつき監督の降板で作品を壊し、ファンの期待を裏切り、動物たちを盾にする「動物ファースト」という謎の単語を生み出しています。

その姿はまさに自社の利権と利益を追求する初志貫徹。

正直、コンテンツを受ける側としては害悪でしかありません。

(この項はさすがにカドカワを非難しすぎている気がしてきたので、後で修正するかもしれません。でも非難したい、したくない?)

追記予定

何か不明な点や追記すべき点がありましたら、コメントでご連絡いただけると助かります。

  • ヤオヨロズのコンテンツ戦略について
  • たつき監督のけものフレンズとの関係について

ディスプレイの性能について備忘録

ディスプレイの性能について、知らないことが多そうだったので、自分が知らなかった事を中心にまとめておきます。

手元のディスプレイ自体はちょっと前に買い替えてしまったのですが、自分のディスプレイがどれほど高機能なのか知っておくことは大切です。

ちなみに私が買ったのはDell SE2717Hというモデルです。

Dell SE2717H

少し前に2万円ほどで購入したのですが、これを基準にディスプレイの性能を見ていきましょう。

もくじ

  • 中間階調について
  • ディスプレイのタイプごとの応答速度について
  • FreeSyncについて
  • フリッカーフリーについて
  • コントラスト比について
  • HDRについて
  • ガンマ特性とガンマ補正について

中間階調(GtoG)について

応答速度はかつて黒から白に切り替わるまでの速度が示されることが多かったのですが、現在は中間の色から中間の色まで切り替わるまでの速度が示されていることが多いようで、それを表す際にGtoG(Gray to Gray)という表記が使われています。

実際に私のディスプレイの応答速度も6ms(GtoG)という事で、中間色の切り替え速度が表記されていました。

この速度は平均値か最短値を示しているのですが、残念ながら私のディスプレイにはそこまで明記されていませんでした。

ディスプレイのタイプごとの応答速度について

最近のディスプレイは液晶が主流なので、液晶画面について書いておきます。

なお、ブラウン管とブラズマディスプレイは液晶に対して応答速度が非常に早く、表記する必要がないそうです。

液晶画面にはTN型、IPS型、VA型の3種類がありますが、中間色に対して早い応答速度を持つのはIPS型だそうです。

ただし、黒から白への切り替えが速いのはVA型、TN型となっています。

TN型、IPS型、VA型について

最近の廉価な液晶はだいたいIPS型かTN型な気がします。

個人的にはTN型はあまりよくないイメージがあり、VA型は高級品というイメージがあったのですが、ちゃんとした知識は無かったのでまとめておきます。

ただ、調べたところ少し情報が古いようなので、現状をちゃんと示しているかはわかりません。

方式 視野角 応答速度 GtoG コントラスト比 価格 Amazon商品数
TN 狭い 速い 遅い 高い 安い 241
IPS 広い 遅い 速い 低い 普通 1029
VA 普通 速い 遅い 非常に高い 高い 42

Amazonの商品数を見る限り、IPS以外の液晶はあまり数がありません。

もしかすると液晶画面はIPS液晶が主流になりつつあり、VAやTNは廃れつつあるのかもしれません。

ただしVA型は高価な製品も多くあったので、高性能ディスプレイでは用いられていそうです。

FreeSyncについて

私のディスプレイが対応しているようなのでメモ。

FreeSyncはAMDのグラフィックボードで使える機能で、「プロセッサーとモニター間の通信障害を解決し、画像のティアリングのない、安定した滑らかなゲ​ームプレイを簡単に楽しむことができる」らしいです。(公式サイトから引用)

ティアリングとは、モニターの書き換え時に起きる表示画像のズレが見えてしまう事です。

ゲームの際に用いられる機能のようなので、普段の作業にはあまり関係ないようですね。

フリッカーフリーについて

こちらも私のディスプレイが対応しているようなのでメモ。

フリッカーとは、バックライトの輝度を調節する際の方式が原因で発生するちらつきのことです。

フリッカーは目に負担をかけるので、それを発生させないような輝度の調整方式をフリッカーフリーといいます。

詳しくはわかりませんが、最近は対応しているディスプレイも多いのではないでしょうか。

コントラスト比について

コントラスト比については、輝度と深くかかわっています。

私のディスプレイはコントラスト比が1000:1で輝度が $300cd/m^2$ となっています。

コントラスト比は最大輝度(白):最小輝度(黒)を表しているので、私のディスプレイの最小輝度は $0.3cd/m^2$ となります。

ただし、コントラスト比はあくまで比率なので、最大輝度:最小輝度が $400cd/m^2 : 0.4cd/m^2$ でもコントラスト比は1000:1となります。

コントラスト比は高いに越したことはありませんが、同じコントラスト比の場合は明るいディスプレイが欲しいか、黒がより黒いディスプレイが欲しいかで輝度を見てから選ぶ必要があります。

また、ダイナミックコントラスト比はあまりあてにならないので、標準コントラスト比と輝度からディスプレイを選ぶといいと思います。

HDRについて

HDRは高級ディスプレイで使える機能なので、現状はあまり気にする必要はないかもしれません。

HDRはHigh Dynamic Rangeの略で、ディスプレイに表示できない高コントラスト比の映像を映そうという試みの元誕生した手法です。

HDR自体には規格がいろいろとあるので、コントラスト比がどこまで上がるかはものによりますが、 $1000cd/m^2 : 0.1cd/m^2$ くらいのHDR対応ディスプレイは存在しているようで、ディスプレイによって映り方が大きく異なるようです。

正直HDR自体はまだまだ過渡期のようで、昔の規格とのすり合わせだったり、色の合成手法だったりでメーカーはかなり苦戦しているようです。

もしHDR対応ディスプレイを買うのであれば、なるべく信頼できるメーカーの製品を買うことをお勧めします。

DVIのデュアルリンクについて

あまり意識していなかったので知りませんでしたが、DVIにもシングルリンクトデュアルリンクという端子があるようです。

シングルリンクだとUXGA(1600×1200)までしか対応していないので、デュアルリンクを使うのが良さそうです。

手元の端子を確認したところ全てデュアルリンクだったので、気にすることでもないのかもしれませんね。。

ガンマ特性とガンマ補正について

ガンマ特性とは色と明るさの関係のことで、ディスプレイを明るくすると色が薄くなり、暗くすると色が濃くなることです。

これを補正するのがガンマ補正であり、色にムラが出ないよううまく調節する機能となります。

性能表にはあまり書いていませんが、製品を見分けるうえで重要なので、店頭でディスプレイの輝度を変えて確認するのがいいかもしれません。

AzureでSlackのOutgoing Webhooksを使って特定のキーワードに反応するbotをサクッと作る

Slackには外部のアプリと連携する強力なAPIが多数用意されています。

その一つであるOutgoing Webhooksを使って、特定キーワードに反応するbotを作ってみました。

こんな感じで、ラーメンに反応してランダムにラーメン画像を投げてくれます。

Outgoing Webhooks

Outgoing Webhooksは、Slackの投稿内容を外部のサーバーにPOSTできる機能です。

また、サーバーの応答内容によって、botからSlackに自動的に投稿を行うこともできます。

今回はAzure App Serviceを使ってサーバーを用意し、Slackから呼び出すような形にします。

なお、サーバーにはこんな感じのPOSTが飛ぶようです。

token=XXXXXXXXXXXXXXXXXX
team_id=T0001
team_domain=example
channel_id=C2147483705
channel_name=test
timestamp=1355517523.000005
user_id=U2147483697
user_name=Steve
text=googlebot: What is the air-speed velocity of an unladen swallow?
trigger_word=googlebot:

今回は、textキーの内容を使って投稿内容を制御したいと思います。

Azureを使う意味

  • サーバー建てるのが楽
  • メンテが楽
  • Visual Studioから簡単にデプロイできる
  • Microsoft Imagineなら無料!(重要)

とは言いつつ使いこなせてない感があり、この記事でも無理やり動かしている箇所がいくつかあります。

用意するもの

  • Visual Studio 2015
  • Python Tools for Visual Studio (PTVS)
  • 適当なMicrosoft Azure サブスクリプション

Djangoプロジェクトを作成

Visual StudioにPTVSをインストールして、Django Web Projectからプロジェクトを新規作成します。

作成したら、Python環境としてInstall in a virtual environment…を選択してください。

Azure App ServiceへアップロードするにはPython2.7か3.4が必要なため、今回はPython3.4に作成しています。

なお、実を言うとAzure App Serviceに入っているPython3.4には問題があるため、後でPython3.6をAzureのダッシュボードから入れます。

しかしAzureにデプロイするためには実行できる環境が必要なため、とりあえずインストールしておいてください。

インストールが完了したら、virtualenvにrequestsモジュールを入れます。

ソリューションエクスプローラーからPython Environmentsで先ほど作成した環境を右クリックして、「Install Python package」を選択します。

入力画面が出るので、requestsと入力してOKをクリック。

インストール出来たら、いよいよソースコードを変更していきます。

ソースの編集

編集するファイルは、以下の5つとなります。

  • app/views.py
  • app/get_keyword_image.py (新規作成)
  • your_project_name/urls.py
  • your_project_name/settings.py
  • web.config

app/views.py

以下を追加します。

from django.http.response import JsonResponse
from app.get_keyword_image import get_image_url
from django.views.decorators.csrf import csrf_exempt


@csrf_exempt
def get_image(request):
    keyword = request.POST["text"]
    if "ラーメン" in keyword and "ラーメンを検知した" not in keyword:
        if len(keyword) > 10:
            keyword = "ラーメン"
        url = get_image_url(keyword)
        return JsonResponse({"text": "ラーメンを検知した {0}".format(url)})
    else:
        return JsonResponse({})

ラーメン画像のURLを含むテキストをJSONで返すviewを定義しています。

(後でちゃんとトークンでの認証を実装しなければと思いつつ、まだやってない・・・)

app/get_keyword_image.py

import requests
import random

api_key = "your_api_key"
search_engine_id = "your_search_engine_id"
search_format = "https://www.googleapis.com/customsearch/v1" \
                "?key={0}&cx={1}&num=10&start={2}&q={3}&searchType=image"


def get_image_url(keyword):
    start_from = random.choice(range(20))
    res = requests.get(search_format.format(api_key, search_engine_id, start_from, keyword), verify=False)
    if res.status_code != 200:
        return None
    res_json = res.json()
    url = random.choice(res_json["items"])["link"]
    return url

if __name__ == "__main__":
    print(get_image_url("ラーメン"))

ちょっと雑過ぎで申し訳ないですが、ランダムに指定されたキーワードから検索して画像URLを取ってくるプログラムです。

api_keyとsearch_engine_idはこのページこのページを参考に取得してください。

your_project_name/urls.py

urlpatternsに以下のように追加してください。

urlpatterns = [
    ~中略~
    url(r'^get_image$', app.views.get_image, name='get_image'),
]

your_project_name/settings.py

以下の部分を変更してください。(ALLOWED_HOSTSにはデプロイ時のURLを指定してください)

DEBUG = False

ALLOWED_HOSTS = ["yoursite.azurewebsites.net"]

LANGUAGE_CODE = 'ja'

TIME_ZONE = 'Asia/Tokyo'

念のためSSLに強制的にリダイレクトする設定を追加します。

SECURE_SSL_REDIRECT = True

web.config

ソリューションエクスプローラーからプロジェクト名を右クリックして、「追加」→「既存の項目を追加」を選択し、web.configを追加してください。

web.configのhandersディレクティブを以下のように編集します。

    <handlers>
      <add name="PythonHandler" path="*" verb="*" modules="FastCgiModule" scriptProcessor="D:\home\python362x86\python.exe|D:\home\python362x86\wfastcgi.py" resourceType="Unspecified" requireAccess="Script"/>
    </handlers>

デプロイ

ソリューションエクスプローラーからプロジェクト名を右クリックして、「公開」を選択してください。

発行先をMicrosoft Azure App Serviceに設定し、適当なサブスクリプションを選択し、App Serviceを新規作成してください。

発行が終わるとブラウザが立ち上がりますが、Python3.6がインストールされていないためエラーになっています。

Python3.6のインストール

最後にPython3.6をApp Serviceにインストールします。

AzureダッシュボードからApp Serviceを選択し、拡張機能タブから「追加」を選択します。

その中からPython 3.6.2 x86を選択し、「追加」をクリックしてください。

完了したら、App Serviceのコンソールタブに移動して、以下のコマンドを実行してください。

> cd D:\home\python362x86
> python -m pip install django requests

成功すれば、サイトにアクセスできるようになっているはずです。

curlなどで https://yourapp.azurewebsites.net/get_image にPOSTしてみて、成功するか確認してください。

Slackでの設定

このページの「Slackでの設定」セクションなどを参考にして、Outgoing Webhooksを追加します。

URLには作成したサイトのURLを指定し、Trigger Wordは空にしておきます。

これでいちおうbotが動くようになります。

所感

「サクッと」という肩書きで記事を書きましたが、けっこう手順が煩雑ですね。本当に申し訳ない(

やはりサーバーを用意するのは敷居が高いですよね・・・

最後の方は力尽きてあまり丁寧に書けなかったので、適時追記をしていこうと思います。

pyniconicoの使い方

以前Python3で作り直したpyniconicoですが、GUI化もしてしまったので使い方を書いておこうと思います。

まずはgitでcloneします。

$ git clone https://github.com/Sakaki/pyniconico.git

次に依存関係をインストールします。

$ pip install -r requirements.txt

最後にGUIを起動します。

$ python gui.py

以上で起動します。

nicovideo_dl

初回起動はユーザー名とパスワードを入力してください。

動画をダウンロードしたい場合は、「URL・動画ID」にsm~のような動画IDか、視聴ページのURLを入力して「ダウンロード」を押してください。

マイリストを一括でダウンロードしたい場合は、「マイリスト一括ダウンロード」の下の「選択」ボタンを押して、ダウンロードするマイリストを選択した上で「ダウンロード」を押してください。

何か問題がありましたら、Twitterまで連絡していただけると助かります。

Python kivyで日本語かつListViewを含むkvファイルの使用時にUnicodeDecodeError

最近PythonのGUIフレームワークであるkivyを知ったので、昔作ったCLIスクリプトをデスクトップアプリ化してみています。

その過程で少し特殊なエラーが起きたので、その状況と解決策を書いておきます。

状況

  • kvファイル中にListViewを定義してコードから呼び出し
  • kvファイルはshift-jisで保存(Windowsで動かすため)

その状況で以下のエラーが発生しました。

UnicodeDecodeError: 'utf-8' codec can't decode byte 0x81 in position 448: invalid start byte

ListViewを取り除くと普通に動くため、ListView中で何か問題が起きているようです。

(むしろなぜListViewがある時だけエラーが起きるのか・・・)

解決策

日本語を含むアプリを作成するため、kvファイルの文字コードがshift-jisで保存されていました。

エラー内容と合わせて考えると、ListViewが文字のデコードに失敗しているようです。

そこでkvファイルのエンコーディングを明示的に指定してあげます。

kvファイルの先頭に、

# -*- coding:Shift_JIS -*-

と記述することで解決できました。

ぐぐっても解決法がなかなか見当たらないあたり、まだ日本語でのkivy利用例は少ないのかもしれませんね・・・

Pythonでニコニコ動画ダウンロードするスクリプトを作った

実は以前からPythonでニコニコ動画をダウンロードするスクリプトは作っていたのですが、Python2系でしか動かなかったためリファクタリングついでにPython3に移行してしまいました。

実際に動くものは https://github.com/Sakaki/pyniconico に置いてあります。

githubにも同じような説明を置きましたが、以下のような感じでサクッとダウンロードできます。

$ python download.py -u someone@mail.com -p password sm31606995
ハチ MV「砂の惑星 feat.初音ミク」 ハチ
Downloading: 100%|#######################################################################################|Time: 0:00:09
Saved as ./ハチ_MV「砂の惑星_feat.初音ミク」.mp4

けっこうたくさんのモジュールが必要なので、Virtualenvなどで動かしてあげるといいかもしれません。

また、マイリスト一括ダウンロードもできます。

$ python ../repo/pyniconico/download.py -m ボカロ
【波音リツキレ音源】心做し 【UTAUカバー】 cillia
Downloading: 100%|#######################################################################################|Time: 0:00:03
Saved as ./ボカロ5/【波音リツキレ音源】心做し_【UTAUカバー】.mp4
【初音ミク】 声 【オリジナルPV】 はりー
Downloading: 100%|#######################################################################################|Time: 0:00:16
Saved as ./ボカロ5/【初音ミク】_声_【オリジナルPV】.mp4
【初音ミク】 Initial Song 【オリジナルMV】 40mP
Downloading: 100%|#######################################################################################|Time: 0:00:14
Saved as ./ボカロ5/【初音ミク】_Initial_Song_【オリジナルMV】.mp4

この手のスクリプトはサーバーに負荷をかけるので、利用する量や時間帯などを考えたうえで使ってください。