読者です 読者をやめる 読者になる 読者になる

Rubellum fly light

ほぼPHP日記

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

雑記

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

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でリッチメニューと新メッセージタイプのカルーセルタイプを使ってみる

PHP LINEBOT 自作

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も試さないとナ…。

 

 

Kitematic (Beta) 2.app は壊れているため開けません。

Kitematic Docker

Docker for Mac をインストール後、メニューにkitematicの文字が。

早速、kitematicをダウンロード&起動すると、以下のエラーが発生。

f:id:rubellum:20160915194508p:plain

Kitematic (Beta) 2.app は壊れているため開けません。 ゴミ箱に入れる必要があります。

どうやらAppの形式が古いかららしい。

以下のコマンドを実行ファイルに適用すると開けるようになる。

$ xattr -rc Kitematic\ \(Beta\).app

f:id:rubellum:20160915194505p:plain

このコマンドがなにをするものかは調べていない。

参考

http://qiita.com/quattro_4/items/f5b56c1897c0cc235c0f

http://apple.stackexchange.com/questions/58050/damaged-and-cant-be-open-app-error-message

なお、kitematicの画面が文字化けしていて、結局使えなかった。かなc。

「PHP RFC」でググってPHPの未来に思いを馳せる

RFCで公開されていた「pipe-operator」がF#っぽくて素敵でした。 見た目が奇抜すぎるので、仮に実装されたとしてもなかなか使えないような気も…。

PHP: rfc:pipe-operator

# PSR7 Example

 $request = getGlobals()
   |> parseRequest($$)
   |> buildPsr7Request($$);

PHPの開発がどういう風に進められているのかよく知らないのですが、 いつの日か実装されるんですかね…?

自分はPHPが大好きなので、 たくさんの機能が実装されるととても嬉しいです。

OpenShiftのVagrantfileはParallelsには対応してないようだ

OpenShift

環境: OSX Yosemite, Parallels, Vagrant(v1.6.5)

Vagrantのparallelsプラグインはインストール済み。

OpenShiftを引っ張ってくる。

$ mkdir -p $GOPATH/src/github.com/openshift        
$ cd $GOPATH/src/github.com/openshift              
$ git clone git://github.com/openshift/origin
$ cd origin

Parallelsだとエラーが出る。

$ vagrant up --provider=parallels
Bringing machine 'openshiftdev' up with 'parallels' provider...
There are errors in the configuration of this machine. Please fix
the following errors and try again:

vm:
* A box must be specified.

Virtualboxだと大丈夫。

$ vagrant up --provider=virtualbox
Bringing machine 'openshiftdev' up with 'virtualbox' provider...
==> openshiftdev: Box 'fedora_inst' could not be found. Attempting to find and install...
(略)

Vagrantfileを見ると、それっぽい記述がある。

vagrant_openshift_config = {
      "instance_name"     => "origin-dev",
      "os"                => "fedora",
      "dev_cluster"       => false,
      "insert_key"        => true,
      "num_minions"       => ENV['OPENSHIFT_NUM_MINIONS'] || 2,
      "rebuild_yum_cache" => false,
      "cpus"              => 2,
      "memory"            => 1024,
      "virtualbox"        => {
        "box_name" => "fedora_inst",
        "box_url" => "https://mirror.openshift.com/pub/vagrant/boxes/openshift3/fedora_virtualbox_inst.box"
      },
      "vmware"            => {
        "box_name" => "fedora_inst",
        "box_url"  => "http://opscode-vm-bento.s3.amazonaws.com/vagrant/vmware/opscode_fedora-20_chef-provisionerless.box"
      },
      "libvirt"           => {
        "box_name" => "fedora_inst",
        "box_url"  => "https://mirror.openshift.com/pub/vagrant/boxes/openshift3/fedora_libvirt_inst.box"
      },
      "aws"               => {
        "_see_also_"   => AWS_CRED_FILE,
        "box_name"     => "aws-dummy-box",
        "box_url"      => AWS_BOX_URL,
        "ami"          => "<AMI>",
        "ami_region"   => "<AMI_REGION>",
        "ssh_user"     => "<SSH_USER>",
      },
      "openstack" => {
        '_see_also_'  => OPENSTACK_CRED_FILE,
        'box_name'    => "openstack-dummy-box",
        'box_url'     => OPENSTACK_BOX_URL,
        'flavor'      => "m1.tiny",
        'image'       => "Fedora",
        'ssh_user'    => "root",
      },

所感

OpenShiftをいじってみているが、よくわからん。

v3 からDocker, Kubernetes ベースに変更されたらしい。

参考リンク

Usage - Vagrant Parallels Provider Documentation

origin/CONTRIBUTING.adoc at master · openshift/origin · GitHub

Niche Readerをユーザー登録しなくても使えるようにした

Niche Reader - http://reader.nicheantenna.com/

個人のWebサービスにメールアドレスを要求するのはよくない気がしてきたので、 URLにランダムなトークンを割り当てて、そのURL(トークン)を知っている人だけがアクセス出来る形にしてみた。

Gistのプライベート、GoogleMapのリンク共有と同じ方式。

・1クリック登録画面

f:id:rubellum:20150215132315p:plain

・URL

f:id:rubellum:20150215132319p:plain

パスワードでの非公開機能はまたいずれ。

あと、RSSの一括インポート機能が欲しい。これもまたいずれ。