Rubellum fly light

ほぼPHP日記

お試し GitOps

GitOps を試すために Kubernetes のクラスタと ArgoCD をVPS(VM4台)に構築し、自前サイトをのっけてみた。 そもそも k8s を触ったことなかったので、AWSやGCPのマネジメントクラスタを利用せず、自前で小さいクラスタを構築した。

ひとまず GitOps できる環境構築までは完了。 git リポジトリにプッシュすると k8s クラスタにデプロイできるようになった。 git リポジトリの中身はまだ素のnginx+HTMLファイルみたいな静的サイトなので、次はPHPアプリケーションあたりを試したい。

git リポジトリは GitLab.com (Saas) を利用。Private Container Registry が無料で使えたので。 GitLab.com は yaml をgitに入れておくだけで、プッシュのタイミングでイメージをビルドしてくれて神だった。 kojole.hatenablog.com はじめ registry への認証ができず、どうやら2段階認証がONになっていると docker login が通らないっぽかったのでOFFにした。 ちゃんと認証する方法はありそうなもののサボった。

type: LoadBalancer をこの環境でも使えるように MetaLB(L2), Nginx Ingress Controller を追加でセットアップした。なお type: LoadBalancer が何者かはよくわかっていない。

Nginx Ingress Controller のインストールはかなり詰まって、ここが一番大変だった。 最初はずっとエラーが出て解決しなかったので NodePort でお茶を濁していたものの、マニュアルの Bare-Metal の手順でなく helm でインストールしたらうまく行った。なんでだろう。

エラー内容を保存し忘れたが、たしかこんな感じのやつ(github issueから引っ張ってきた)。

Error from server (InternalError): error when creating "〜": Internal error occurred: failed calling webhook "validate.nginx.ingress.kubernetes.io": Post https://ingress-nginx-controller-admission.ingress-nginx.svc:443/extensions/v1beta1/ingresses?timeout=30s: context deadline exceeded

↓の手順を見て、 helm インストールした。Install nginx-ingress controller with Helm の見出しの部分(upgradeとなっているが初回だったのでinstallで実行) www.brightbox.com

外部IPをセットしていないので、今は k8s クラスタの前段に素の nginx をリバースプロキシとして置いている。

Kubernets が内部で何をやっているかまったくわからないのがかなり印象的だった。 これをオンプレで管理するの、なかなか難しそう。

PHPで雑にカラーコードを生成する

適当な文字列のmd5ハッシュから6文字だけ切り出し、頭に#をつけることで雑にカラーコードを生成できる。

PHPでの例。

<?php

$s = 'OK';
echo '#' . substr(md5($s), 0, 6);

大量のデータを表示するときに、グルーピングしたい単位(IDや日時など)でカラーコードを生成するとパッと見でわかりやすくなる。

Android アプリ開発をはじめた

Androidアプリ開発をはじめた。
ひとまずニュースアプリみたいなやつをつくっている。

f:id:rubellum:20170505141017p:plain

Android Studio

普段 IntelliJ IDEA を使っているので、Xcodeより使い勝手に慣れててスムーズに開発に着手できてる。

ライブラリ

OSSのライブラリが大量にあるので、PHPとかRubyの人でも簡単に開発できるんじゃなかろうか。
ライブラリのインストールはgradleにパッケージ名書くだけでいいので楽だし、開発環境も無料だし。

Squareの圧倒的存在感を知る。
retrofit / okhttp / picasso etc...

デザイン

XMLでデザインを作っていくのどうなのと思っていたけど、GUIでポチポチやるより早い。
レイアウトの作り方に慣れると、途端に自由になれる。

Kotlin

Javaのコードをコピペすると、自動でKotlinに変換してくれるのちょっと感動。
モダンなプログラミング言語なので、書いてて楽しい。

画面づくりがメインだったので、ロジックはほぼ未着手でこれから。
APIと連携すると、ビューどスレッドがうんぬんで大変と聞いているので、山はまだ先らしい。

ボーン・コレクター/コフィン・ダンサーを読んだ

「ボーン・コレクター」は映画にもなっていて、地上波でも放映されていて、子供のころに何度かみた記憶がある。
アンジェリーナ・ジョリーと黒人のおじさん(いま調べたらデンゼル・ワシントンという俳優らしい)が出ていて、寝たきりのおじさんが探偵役っぽいことをしていたのをうっすらと覚えているくらいだったが。

原作小説の著者はジェフリー・ディーヴァーという人で、どこかのブログで「ジェフリー・ディーヴァー作品はどれから読むべきか」というのがとりあげられており、そのときあがっていたのが「ボーン・コレクター」だった。
(このときはじめて映画に原作があったことを知った)

Amazonで著者検索してみると、本屋で表紙を見たことがある作品がちらほらあって、「青い虚空」は学生のときに読んでいた。
そういえば、一時期”ハッカー”小説にはまりそうな時期があったのをふと思い出した。懐かしい。
「ボーン・コレクター」が「リンカーン・ライム」シリーズの1作目というのもこのとき知った(リンカーン・ライムはメインキャラ名)。

シリーズものは常に一作品目からたどって読むべき!という信条を持っているので、すでに映画を見たことがあるものの、一作目の「ボーン・コレクター」から読むことに。

「天才のリンカーン・ライム(と仲間たち) VS 天才の犯罪者」と、とにかく対決ものっぽい。
鑑識技術を駆使して証拠物件から犯人を追うリンカーン・ライムと警察(リンカーン・ライムは警察でなくコンサル(?)的な立場)、警察の行動を読み、裏をかいて自分の犯罪を実行していく犯罪者。
いまは2作目は「コフィン・ダンサー」を読み終わったところなので、すべての作品がこう進むかはわからないが。。

いま3作目以降の作品をまとめて注文して届くのを待っている。
リンカーン・ライムシリーズから派生した、キャサリン・ダンスシリーズも気になるところ。

データ構造を着飾るアプリケーション

最近、文章を書いてないのでリハビリがてら。

Google の"検索"

Google 検索のすごいところは、「検索」でなく「ソート」なのだとどこかで見た。
検索結果を"どのような順"で表示するかが、むしろ重要なのだと。

例えば、検索キーワードがページ内に多く含まれているWebサイトが検索結果のより上位に表示される、と考えてみる。
そうすれば、望まない検索結果が出てくるのは明らかだと直感的にわかるはずである。

つまり、Google 検索は、検索結果をユーザーが望む(であろう)順番にソートしている、といえる。

何を当たり前なことをと思うかもしれないが、
そのときは「検索」と「ソート」で受ける印象がだいぶ違う!と感じたのである。(アハ体験1)

Excel の"表"とTrelloの”リストのリスト”

話は変わるが、ジョエルオンソフトウェアで有名なジョエル先生が、Trelloについてのエントリを書いている。

matope.hatenablog.com

ここにExcelが広まった理由について考察が書かれている。

Excelを実際に「計算」と呼べるもののために使っている人間はどこにもいなかった。

ほとんどの人々がExcelをリストを作るために使ってたということだ。突如として私たちは、Excelを時代遅れにせんとした、上等な未来的スプレッドシートであるLotus Improvがなぜ完全に失敗したのかを完全に理解した。あれは計算が大得意だったが、表の作成はひどく下手で、そしてみんなはExcelを計算ではなく表のために使っていたからだ。

大部分のExcelユーザーが”表計算”でなく、ただの"表作成"に使っているのだという。
自分も思い返してみると、確かにただのそのような使い方をしていることが多いように思える。

どれだけ優秀な表計算シートも、表作成ソフトにはかなわなかったのである。
表計算のユーザーは少なく、表作成のユーザーは多かった。

ところでジョエル先生はこのエントリの中で、

素晴らしい水平的キラーアプリケーションとは、実際には着飾ったデータ構造に過ぎないのだ。

とおっしゃっている。つまり、Excelは”表”というデータ構造を着飾ってたアプリケーションなのだと。
そして、Trelloは「リストのリスト」を着飾っている。(アハ体験2)

表やリスト(またはリストのリスト)といったデータ構造は、多くの人が業務等で普通に使っているものである。
必然的にそれらの”データ構造”が(おそらく無意識的にだが)必要とされる機会も多くなる。

したがって、それらを着飾ったアプリケーションは広く使われる資質を持っているのである。
(もちろん多くの人に実際に使ってもらうのは大変だと思うけど。)

先程のGoogle 検索の例に戻って考えてみると、
Google 検索はソートというアルゴリズムを着飾っているといえる。

「データ構造とアルゴリズム」を着飾ったアプリケーション(Webサービス)

多くの人に使われるWebサービスを作りたいならば、
データ構造やアルゴリズムといった観点からサービスをみてみると何かヒントを得られるかもしれない。

LINE BOTでリッチメニューと新メッセージタイプのカルーセルタイプを使ってみる

LINE DEVELOPER DAYで知った「リッチメニュー」と新しいメッセージタイプ「カルーセル」を試したかったので、LINE BOTを作成してみた。

いわゆるチャットBOTで最初に作るものといえば、出退勤BOTか近隣レストラン検索かと思うので、今回は近隣レストラン検索を行うことにしました。

(BOT自体は未公開です)

利用例

f:id:rubellum:20161107121034p:plain

図1:池袋でラーメンを探すの巻

 

最初に位置情報を送ってもらい、次に検索キーワード(例:ラーメン)と送ると、ぐるなびの検索結果が返ってきます(お店の精度は……泣)

「ラーメン」とメッセージを送ったあとの、「画像+タイトル+説明」の部分がカルーセルタイプです。

 

カルーセルタイプ以外にも、Yes or Noの「Confirm Type」や「Button Type」があります。

LINE、chatbotの開発・普及に向けて新たな展開を発表 | LINE Business Center

 

カルーセルタイプはスワイプで横に移動でき、今回は3件分の結果を横並びで見ることができます。

 

リッチメニュー

最下部の「検索メニュー」というところが「リッチメニュー」と呼ばれるもので、ここをタップするとシュッとメニューが表示されます。メニュー名は管理画面から設定できます。

 

f:id:rubellum:20161107120021p:plain

図2:アイコン(イラスト)のせいでリッチに見えないリッチメニュー

 

ラーメン検索、とんかつ検索となっているところがボタンになっており、このボタンを押すと「ラーメン」や「とんかつ」といった特定のメッセージを送信することができます。

そのため、ユーザーにいちいちメッセージを入力してもらわなくても、ボタンひとつで定型のメッセージを送ってもらうことができます。

 

↓のようにきちんとグリッドで表示するとリッチになります。

image.itmedia.co.jp

 

リッチメニュー自体は、LINE@の管理画面から設定することができます(左メニューのリッチコンテンツ作成)。

今回のケースでは、左半分・右半分で2つのボタンが設定されていますが、さまざまな形式で表示方法を設定することができます。

下記は画像を分割するタイプの種類です。他にも「アイコン+テキスト」による表示形式も選択できます。

 

f:id:rubellum:20161107145806p:plain

 

リッチメニューはUIの第一印象がとてもよかったので、LINEやチャットBOTという用途に限らず、アプリに組み込んで何かするサードパーティ向けのUIとして広く使えるのではないかと思いました。

(その検証のため、わざわざこのBOTを作ったのでした)

開発環境メモ

サーバー:Vultr ( ← なぜか東京リージョンを持っている海外のVPS )

OS:Ubuntu 14.04

言語:PHP 7(Slim Framework 3)

レストラン検索API:ぐるなび http://api.gnavi.co.jp/api/

 ソース:https://github.com/rubellum/hirudoki ごちゃごちゃしてます。

 

LAMP環境です。

SSLが必要なので、新たにドメインを取りつつ、Let's Encryptで証明書を取得。

今回初めてLet's Encryptを使用してみましたが、certbotの使い方がいまいちわからず、正直なところBOT作成よりも手こずりました。

certbotのコマンド実行時、Apacheを立ち上げていたよくなかったらしく、停止して上記の手順を踏んだらうまく行きました。

certbotが証明書生成のための確認用サーバーとやりとりするときにapacheとポートが被って自身のhttpサーバーを立ち上げられないとかそんなところじゃないかと予想してますが、正直なところ原因不明です。

参考)

How To Secure Apache with Let's Encrypt on Ubuntu 14.04 | DigitalOcean

最後に

LINE BOTを作成してみました。

世間はチャットBOTが流行る流行ると言っていますが、意外にみんなアイデアが思いつかなくて悩ましい感じがしてますね。

LINE DEVELOPER DAYでもらったBeaconも試さないとナ…。