uzullaがブログ

uzullaがブログです。

LINE DEV DAYに参加し、ヒャッ!っとLine Notifyを試した

本日LINE DEVELOPER DAY 2016に参加しまして、その中でLINE Notifyという機能が発表されていました。

notify-bot.line.me

IFTTTやGitHub、MackerelなどのLINEとは違う外部からの通知をLINE受け取る事ができるものと紹介されていますが、自前のウェブアプリ等でも同様に外部アプリとして登録することでLINEに通知を飛ばす事ができます。

すぐに実装できそうだなと思いましたので、11Fでコーヒーを飲みながらヒュッ!と実装してみました、そのメモです。

平たく言ってなにができるのか

特定のHTTPSアクセスをLINEに送ると、あなたのスマホ(LINE)に通知がとどきます。

こういったプログラムから利用しやすいプッシュ通知サービスはすでに多数存在します。くらべてLINE Notifyの優位性はどこにあるのかは詳しい人に譲りますが、とにかく以下のような特徴がありますね。

  • 別途のアプリが不要なので、「詳しくない人」のLINEにもプッシュできる
  • 即座にサムネイル画像を表示させる事ができ、タップで拡大もできる(添付ではなく、Jpeg画像のリンクを付与できる)
  • 送信できるテキストは1000文字
  • RateLimitもあんがいゆるい

欠点?としては、「LINE Notifyのアカウントから」の送信に見える事でしょうか。メッセージ本文先頭に自分のアプリ名が掲載されますが。

f:id:uzulla:20160930051625p:plain

まあ、そこらへんまでカスタムしたいなら、Bot作りましょうということなのでしょう。

とりあえずアプリを登録

https://notify-bot.line.me/my/services/new

ここから新しくアプリを追加できます*1

色々入れさせられますので色々入れましょう。特に審査はないようですが、やはりそれなりにちゃんと入れましょう。

ただ、この登録時にサービスが出来ている必要は無いようです*2

(こういうのを入力しているといつも思うんですが、フリーの人間や個人の人は「企業名」になんといれればいいんでしょうね)

重要なのはCallback URLだけでしょうか。なお、localhostも通りました。

資料をみます

ログインした後、PDFで資料が配付されてますので、そちらを見ます。*3

英語ですが、シンプルな仕様なのでそこまでこまらないかなとおもいます。

一箇所だけ私がわかりづらかったのは、AuthorizationヘッダのBearerプリフィクスは、実際に書いてある通りに必要です。

(なお、資料がログインしないと読めないところにあるので、もしかしてNDA的な何かがあるかと思いましたが、直接LINEの開発者の方に確認したところ「資料の再配布は不可だが、ブログなどでその資料を元にした補足やサンプルコードの公開程度は問題ない」との回答をいただきました)

追記、ドキュメントが日本語化され、普通にアクセスできるところにおかれたようです

https://notify-bot.line.me/static/pdf/line-notify-api_ja.pdf

ということで

凄く単純なのでこれくらいならライブラリもなかろうとヒネリもなく、Tokenを取得したり、フォームからLINEに通知をおくったりするサンプルを実装してみました。

github.com

すごい古くさい書き方をしていますが、多分そういう方がよろこばれるかなと思ってのことです!!*4

TokenのRevokeとかは実装してません。

まとめ

簡単ですね、とてもよいとおもいます!

こちらからは以上です。

*1:当然ですが、LINEアカウントは必要です

*2:審査とかはなかった

*3:まずアプリをつくらないと資料がみれないw

*4:ホントだよ!ホントだよ!

Azure App Serviceで快適にログをtail -fしたい話

Azure App Service関係のネタ三つ目です、ログをtail -fする話、あるいはコンソール(シェル)についての話です。

過去二つはこちら。

uzulla.hateblo.jp

uzulla.hateblo.jp

前々回「エラーログがみづらい!」と書きました、エラーログが見づらいのは実用上厳しいので、見やすい方法を探した結果です。

もっと良い方法があれば是非教えて下さい。

ログといいつつ、コンソール(シェル)についての話でもあります。

DISCLAIMER

このエントリの内容は多分王道ではないと思います(あるいは、そう願います)。しかし、現時点までにドキュメントにある手法では(私は)やってられなかった。

私が道を見つけられていないだけだと思いますので、これが正解だとおもわずに本当の正しい道をさがしてみてください。

ログストリーム

標準的にある機能です、前々回を見て下さい。PHP開発ではほぼ無用だとおもいます。

「コンソール」

開くとブラウザ内にcmdっぽい何かが立ち上がります、補完もカーソル移動もできないので結構きびしい。

f:id:uzulla:20160925232351p:plain

ここからログをtailする方法はみつけられませんでした。type(cat)をつかえば頭から見れますが、moreはちゃんとうごかなかったので現実的ではないですね。

コンソールをシェルとしてみたとき

いや、シェルではあるのですが…helpコマンドでコマンド一覧がでますが、これは別に有用な全機能を網羅しているわけではなく、歴史的経緯のある一覧だとおもいます、現代ではつかい所の無いコマンドばかりです。 (私もDOSをつかってきた世代ですので、一部コマンドをみるとなぜか涙がでてきますが)

f:id:uzulla:20160925232405p:plain

このコンソールでも、流石にdir(ls)とcdは使えるので、ファイルがどうデプロイされているかの確認には使えます。

しかし今のWindows標準ではCLIのエディタがないんですよね?DOSのころはeがあったんですけど*1EDLINもないしcopy con技もできなかったです。

f:id:uzulla:20160925232423p:plain

(懐古エントリになりそうなので以上)

Advanced tool (Kudu)

何と比較してのアドヴァンスドなのかいまいちわかりませんが、ひらくとえらいさっぱりした別サービスみたいな画面がひらきます、このKuduの中のWeb UIは軽快に動くので最高です。その中の一機能として、コンソールよりアドバンスドなコンソールが使えます。

トップページには魅力的な単語がならんでいますが(APIで色々叩けるみたいな)、とりあえず今回無視してヘッダーのDebug Consoleをクリックすると、CMDPowerShellが表示されます。とりあえずCMDをえらぶと、さっきのコンソールより断然再現性の高いcmdが表示されますw

f:id:uzulla:20160925232440p:plain

このcmdはかなり出来がよい上に、なんとtailがあります!しかもGNUの!これによって誰もが望んでいた tail -f php_errors.logがつかえます!

なんと(これまたGNUの)catもあります!、lessもあります!

「これが約束の地か…!」

これでまともなPHP開発ができそうです、最高!

最高といいつつ実際には欠点?もあります、いまのところ気付いている唯一の欠点は、C-c(Ctrl+C)がおかしいことでしょうか…。 tail -fをはじめた後、終了することができないのです…。

実は他のキーコンビネーションなのかもしれないのですが、C-dとかもダメでした。なにかブラウザの依存だろうか。

まあ、止めたかったらリロードすればいいんじゃないですかね(雑)。

シェルとして見たとき

上にもかいちゃいましたが、このシェルのすごいところはcatとかtailが使える事ですねw*2さらにカーソル移動もできて、補完も効くし、凄いぞまるでシェルみたいだ!()

シェルの上部にはファイル一覧があります。こちらはカレントディレクトリのファイルが一覧されており、これをつかうことでマウスポチポチでのディレクトリの移動ができます。勿論cdすると一覧も追従します、これは結構便利ですね。

なんと、そこからファイルのダウンロードやそして簡易的な編集、削除なども行えるなど、簡易ファイルマネージャ機能もついています。

「これが約束の地か…!」(二度目)

余談

  • このシェルであちこち移動すれば、mysql.exeをたたいたりとかもできます、大分勇気づけられましたね。
  • 裏でリアルタイム通信のやりとりがあるからか、突然ささる(リロードもきかなくなる)ことがあります。そういう時はリロードせずに一度閉じたり、通信を停止をしてからリロードしたりすると動きます。
  • コンソール右上にoldとかnewとかとかありますが、oldだとC-cでコマンドをキャンセルできるようになるかわりに、補完が変になったりtail -fがうごかなくなる(ので無用)

まあ、C-cができないとか、刺さるとかはログをtailできるメリットにくらべれば些細なことこの上ありません。運用でカバーします。

なお、個人的にはCMDで十分だったので、PowerShellの方は「さすがPS、画面が青いぜ」と確認して終わりましたので省略します、各位お試しください。

f:id:uzulla:20160925232552p:plain

App Service Editor(プレビュー)

これはブラウザでつかえるエディタというかIDEというかですね。あまり詳しくないのですが、Visual Studio Online "Monaco"の流れをくむ物なんでしょうか。

先程の簡易編集とちがって、ちゃんとSyntax Highlightや極簡易なSyntax checkなどもできるようです。キーボードショートカットについてもCmd+/コメントアウトできたり、なかなかの機能があるように見えます。ソースコード全文検索なども搭載されており、これだけでもなかなかのことができるのでは…。

後、gitもここから叩けるようです。ただ、App ServiceのGitデプロイって.gitを抜いてデプロイされるので特につかえない…しかもrepoにpushする秘密鍵も入れられるわけでもなし。ここでgit initする作業フローも想像しづらいし、cloneしたら全部きえちゃいそうだし、なかなか使い所が…?

さておき、なんとこれでもログが見れるのです。

f:id:uzulla:20160925232621p:plain

二つ前の記事の通りにphp_errors.logが出力されるようにした上で、左側の再生ぽい三角形ボタンをおすとOutputと言うペインがひらきます。ここにphp_errors.logをtailしたようなログが書き込みがある度に?ぞろぞろとでてくるのです。(なお、同時にひらいたウインドウはとじてもかまいません)

遅延も小さく(1秒くらい?)、画面の幅的にもAdvanced toolのコンソールよりも見やすいです。*3

ただ、このOutputはどこのファイルがどう監視されて出力されるのかイマイチよくわかりません…php_error.log以外も見たい時はどうすればいいのだろうか、LogFiles以下にかきだせば勝手にでてくるっぽいが…。*4

なお、シェル機能もついており、Advanced Toolとちがって複数のシェルをひらいておけますが、欠点はchrootされてしまっていることでD:\home\site\wwwrootより上のディレクトリにいけません。mysql.exeとたわむれるのにはつかえなさそうです。

実はエディタも同様にwwwrootにchrootされています。Document Rootにchrootにしてしまうレンサバ的世界観は個人的には微妙だと思います*5、ですがAzure App ServiceはDocument rootを自由に変更できるので設定次第ですね。

まとめ

  • デフォルトのログストリームやコンソールのことはとりあえず忘れよう
  • Advanced toolのコンソールは微妙な挙動もあるが実用に足りる、あとはtail -fが終了できれば言う事はない
  • App Service Editor(プレビュー)は多機能っぽいけど、取ってつけた感や、謎が多いのがどうしても気になる。その辺りを解説したドキュメントもみつからなかった

ということで、php_errors.logのtailが気軽にみれるようになりました。これで個人的な支障はなくなったかもしれませんね、すばらしい。

この勢いでsshもできないかな…というのが私の感想です。

こちらからは以上です。

*1:私はPC-DOSだったので、MSDOSの方はeditでしょうか

*2:多分、純正の(純正とは??)コンソールもPATHを通せばtail,cat,lessがつかえるとおもうんですが、ではPATHをどうやって通すのか?と言う話になる

*3:そして、これならそもそも終了もないので、C-cがどうとか悩まずに済みます

*4:適当にFTPhoge.logとかファイルをULして、App Service Editorをリロードして、hoge.logを上書き保存したら出力されたので、多分そうなのだが、ドキュメントがない。

*5:しかし、他人様にはこれで渡す事も多い

Azure App ServiceのMysql In Appが自由でよかったメモ

昨日AzureのApp ServiceというPaaSがレンサバみたいにつかえて便利!というある意味怒られそうなエントリを書きました

uzulla.hateblo.jp

しかし、レンサバにはFTP以外にもう一つ重要なものがあります。そう、DBですよね。

PHPerとしてはMysqlがつかいたい、そしてApp ServiceにもMysqlはあるのです!

App ServiceでつかえるDB

まず、Azureには「SQL データベース」という機能があります、AWSで言う所のRDSです。本来これをつかうのが正しい道だとおもいますね。ただ、SQL Serverなんですよね…。後、高くはないんですけど、月500円くらいからです。

この他に「Clear DB」というものが「あった」っぽいんですけど、いまはどこにあるのかよくわからないです。

あとはVMのテンプレートにMysqlもありますが、せっかくのPaaSだと思うと、ちょっと面倒ですよね…。

さて、ここまでもったいつけましたけど、タイトルの通りMysql In Appのお話です。

DISCLAIMER

このエントリでは、AzureとそのAppServiceが提供する拡張性や可用性をほとんど活用してません。このエントリは単純にセコいエンジニアがAzureで遊びでApp Serviceにトライしてみた感想です。つまり、試用や遊びの割り切った範囲で活用する方法の紹介で、(おそらく)「正しいプロダクション環境の運用」とは方向性がちがいます。(そもそも、mysql in appがそういうものじゃないしね)

また、後半にmy.cnfとかの事をかいていますが、マネージドのサービスで公式に用意されていない手段を模索するのは(一般的に)お行儀が悪い行為です、こういったことを推奨するものではありません。ただ、お行儀がよくないと理解しつつ、App ServiceとMysql In Appの理解にはつながると思いますので掲載させていただきます。

Mysql in app(プレビュー)とは?

App Serviceのコンテナ内に、専用のmysqldをつくる事ができます。

説明文をコピペしますと、「MySQL In App (プレビュー) では、アプリでローカル MySQL インスタンスを実行しつつ、App Service プランのリソースを共有できます。MySQL In App を使ったアプリは、運用環境での使用を意図したものではありません。また、単一のインスタンスの範囲を超えてスケールすることもありません。」だそうです。

ということで、やはり肝心の所は良く解らないのですが、まあ極小規模な主に開発用なんだと言いたいのは伝わります。

使い方

MySQL In App (プレビュー)」のスイッチをオンにするだけ!(?)

f:id:uzulla:20160925155205p:plain

「お作法」

次は管理ですね、テーブルとか作りたい。すぐさまその画面上の「管理」をおしましょう!すると我々に馴染み深いphpMyAdminが立ち上がります!

…が、実は地味にわかりづらい作法があるようです。もし以下のようなログイン画面が表示されたら、一見さんお断りで失敗です。

f:id:uzulla:20160925155230p:plain

この画面をみたら人はかけずり回ってID/PASSを探すでしょうが、実はどこにもID/PASSは書いていません…。*1

なにいってるのかわからないでしょうが、兎に角この後の手順を踏んでみて下さい。

  • 一旦閉じて、概要にいってアプリを再起動(これは大抵不要)
  • なんでもいいのでアプリ内のphpのURLを開きます(phpinfo()だけとかでもよい)(これは必要)
  • プロセスエクスプローラーをひらき、最新の情報に更新を押します(これは任意)
    • うまくいけば、php-cgiとmysqldというプロセスが上がっているはずです(ツリーが折りたたまれているので、開いて下さいね)
    • あがっていなかったら、本当に上で触ったのがphpのURLであったか確認してください
  • あらためてMysql in Appの中の管理をひらいてみてください

うまくいけば「ログインした後のphpMyAdminが開けるはずです!やりましたね!!

(「なにいってんの」って思われるかもしれませんけど、本当にこれ気付くまで地味にハマったので)

うまくいった場合のプロセスエクスプローラーの表示は(個人差あるでしょうが)こんな感じです*2

f:id:uzulla:20160925155444p:plain

あと、この画面もダメですが。これも上記の手順をおこなったり、phpのURLをなにかひらけばもどってくると思います(多分mysqlプロセスが終了してしまっている)

f:id:uzulla:20160925155329p:plain

phpMyAdminについて

説明いらないじゃろ?

mysqlの状態や、渡される権限について

phpMyAdminで接続してみると、azureというアカウントがわりあてされ、azuredbというDBが最初から作成されているのがわかります。なるほど、これをつかえばええんじゃな…と思うのは早計だ!(いや、これでも十分なんですけど)

User Accountを確認すると、なんとazureには「ALL PRIVILEGES」が付与されているのだ!すごい!!つまりDBをドンドンつくれます!(GRANT権限はないけどね)

f:id:uzulla:20160925155410p:plain

共有サーバーなのにどういうことなのと思われることでしょうが、先程のプロセスビューザーでみた通り、自分専用のmysqldが立ち上がっているのでこういう感じなんでしょうね。富豪的だ。

となれば、勿論mysqlのdata dirも見える所にあります。data/mysql以下にあります。my.cnf(いや、Windowsだから、my.iniでもいいか)も、その中に置けば読んでくれるはずです。(残念なら後述)

ちなみに、Mysqlのバージョンは5.7.9でした。

PHPからの使い方

phpMyAdminがさわれれば、初期のスキーマ流し込みとかは問題無くできたとおもいます。次はアプリからの接続ですね。

詳しくは以下のURLをみていただきたいのですが、(一部の人には残念)英語です。

https://blogs.msdn.microsoft.com/appserviceteam/2016/08/18/announcing-mysql-in-app-preview-for-web-apps/

端折って言えば、Mysql In Appの接続情報は環境変数経由で渡されます。$_SERVER["MYSQLCONNSTR_localdb"]にはいっています。(このキー名は固定ではないかもしれない。Mysql In Appの画面にありますので、そこからコピペしましょう)

こいつは(ここにサンプルは貼りませんけど、なかなか「なんでやねん」「マジか」感のある)文字列ですので、これを切った貼ったしましょう。上のURLの中にサンプルコードがあります。

私は「なんでやねん!」と言ってしまったので、自分で書きました。一応以下に置いておきますが、公式のコードをつかうのが一番でしょう。

<?php
if(!isset($_SERVER["MYSQLCONNSTR_localdb"])) throw new Exception('MYSQLCONNSTR ENV is not defined');

$azure_mysql_connstr = $_SERVER["MYSQLCONNSTR_localdb"];
$azure_mysql_connstr_match = preg_match(
  "/".
    "Database=(?<database>.+);".
    "Data Source=(?<datasource>.+):".
    "(?<port>.+);".
    "User Id=(?<userid>.+);".
    "Password=(?<password>.+)".
  "/u",
  $azure_mysql_connstr,
  $_);

if($azure_mysql_connstr_match === false) throw new Exception('Could not parse for MYSQLCONNSTR ENV');

$db_settings = [
    'host'      => $_['datasource'],
    'port'      => $_['port'],
    'database'  => $_['database'],
    'username'  => $_['userid'],
    'password'  => $_['password'],
];

var_dump($db_settings);

さあ、これで無事にmysqlがつかえるようになりましたね!(?)

まとめ

良い点

  • 本物のmysqldである
  • 自由度が高い
  • mysqlのバージョンも新しくて最高
  • 基本無料である()
  • 「(慣れ親しんだ)phpMyAdmin最高!」

悪い(悪かった)点

  • 正直気軽に(sshポートフォワード等で)手元からDBにつなげたい
  • 「謎のお作法見つけるまでハマった…」

本物のmysqldを管理者権限で渡してもらえるみたいなので、そこらのレンサバより断然自由度が高い。これは遊びや開発だと最高ですね。(まあ、コンテナのクオータにかからないように注意する必要はあるでしょうが)

とはいえ、最初からユーザーもDBもつくってはあるわけで、初心者でmysqlよくわからんという人も、そこらのレンサバと大差無く使えるのではないか(ユーザー名とかを環境変数から引いてくる、というのに慣れないかもしれませんけど、まあ慣れるやろ)。壊してもすぐに作り直せるし、mysqlの練習にも最高ではないでしょうかね。

これをそのままプロダクションには使えないとおもいますけど、まあ中々面白いですね〜。 PHPMysqlがあれば、8割くらいのPHPerの雑な遊びは満足するのではないかなとおもいます。 是非みなさん試して見てはいかがでしょうか。

こちらからは以上です。(多分、続きます)

(ところで、Mysql一つで200Mbyteくらい食うので、省メモリなmy.cnf設定というあまり考えた事がないことをやらないとな…)

追記

プロの着眼点による指摘

select @@default_password_lifetimeで確認したところ、5.7.9の有名な時限爆弾があるようです。(詳細は後述の参考リンク)

さっそくmy.cnfに修正をいれてみようとしました…が。どうもmy.cnfが反映されない。

んんん?とおもいつつ、いろいろやった結果以下の出力を得ました。

f:id:uzulla:20160925162732p:plain

んんん〜〜〜〜(;´Д`)

D:¥home以外は共有されない気がする…

まあ、360日経過するよりも前に5.7.9が5.7.11以降になるんじゃないですかね!?

(参考リンク) yoku0825.blogspot.jp

(この作業でAdvanced Toolsの使い方になれてきましたので、またエントリ書きます…)

追記 my.cnf(あるいはmy.ini)の設置について

調べた結果、以下のmy.ini(cnf)を読むようなのですが、どれもデバッグコンソールからいじる権限がない。

Default options are read from the following files in the given order:
D:\Windows\my.ini D:\Windows\my.cnf C:\my.ini C:\my.cnf D:\Program Files (x86)\mysql\5.7.9.0\my.ini D:\Program Files (x86)\mysql\5.7.9.0\my.cnf 

f:id:uzulla:20160925172044p:plain

ウーム、ダメかー。

*1:たとえ、後で「なんてこった!固定か!(?)」と叫ぶ事になったとしてもです。なお、残念ながら固定のはずのID/PASSをいれても多分はいれないです。

*2:しかしメモリ消費厳しい、調整しないとクオータが不安になる