まだプログラマーですが何か?

プログラマーネタ中心。たまに作成したウェブサービス関連の話も https://twitter.com/dotnsf

2016/05

Ubuntu の標準形式でありながら、CentOS や RHEL(RedHat Enterprise Linux) ではそのままでは扱えない deb パッケージを rpm パッケージに変換する方法があります。

具体的には alien コマンドを利用します。 まずこの alien コマンドを CentOS や RHEL 環境上でビルドします:
# yum install rpm-build
# cd /tmp
# wget http://ftp.debian.org/debian/pool/main/a/alien/alien_8.92.tar.gz
# rpmbuild -ta alien_8.92.tar.gz
  :
  :
書き込み完了: /root/rpmbuild/RPMS/noarch/alien-8.92-1.noarch.rpm
  :
  :
# rpm -ivh /root/rpmbuild/RPMS/noarch/alien-8.92-1.noarch.rpm

ここまでの作業で alien コマンドがインストールできているので、このコマンドを使って deb パッケージを rpm パッケージへ変換します:
# alien --to-rpm --scripts xxx.deb
xxx.rpm generated

こうして出来上がった rpm ファイルは rpm コマンドや yum コマンドで導入可能です。
 

祝 IBM Watson サミット 2016 開催記念!

本当は政治家相手のを作ってましたが、こっちの総選挙が近いので急遽AKB版を作りました。「自分と性格の近い/遠い総選挙メンバーを調べる」というサービスです:


僕個人のプロフィールを知っている人であればなんとなく想像しているかもしれませんが、このサービスは IBM WatsonPersonality Insights という、個人の性格分析 API を使って開発しています。

具体的には、今回の総選挙に立候補を表明したメンバー(http://sousenkyo.akb48.co.jp/member.php)の中で、ツイッターアカウントを持っている人を対象に上記 Watson API を使って性格を分析しています。この分析済みのデータと、利用する人(あなた)のツイッターデータから分析した性格を比較します。性格分析には Big 5 と呼ばれる5つの視点からの性格分析を行い、それぞれの項目ごとと全体とで利用者に似た性格のメンバーと、性格の遠いメンバーとを調べて図示します。

インプットデータにツイッターのツイートを使うため、ツイッターのアカウントを持っていること(そしてある程度の量をツイートしていること)が前提になります。ただツイッターアカウントを持っていなくても、各メンバーの性格を参照することは可能です(その場合、自分との比較はできません):
2016052203


実際に比較する場合は画面右上のツイッターアイコンをクリック(タップ)してツイッターにログイン、するだけで、結果を表示してくれます。スマホから利用する場合は結果のチャートが潰れてしまうのを避けるため、画面を横向き(横長)にして実行してください。


性格は客観的な分析が難しく、本人でもわかっていない部分があったりしますが、このサービスではツイッターというツールを使い、その中で使われている語彙や単語の傾向などから性格を分析します。なお、インプットデータは直近400件のツイートデータです。AKB メンバーの性格分析には2016/05/20時点での直近400データを使いました。利用者の性格はリアルタイムに直近400データを使います(なので、一度調査した後にいくつかツイートして、再度調べると結果が変わる可能性があります)。自分の推しメンと性格が近いのか遠いのか、そして自分の知らない一面に気付くと同時に、新たな増しメンの可能性を追求していますw

※400件ツイートしてないとダメ、というわけではないのですが、あまりにデータが少ないと性格分析ができないため、目安として400件を意識してください。


あとはまあ普通の同様のサービスのように、結果をシェアする、といった機能も含めました。ちなみに「フレッシュレモン推し」の僕の(2016/05/22 時点での)結果はこんな感じでした:
http://akb-finder.mybluemix.net/result.jsp?id=dotnsf

(全体的に似てるのは入山さん)
2016052201


(Big 5 個別だと東さんと森田さんが近そう。確かにレーダーチャート的にはそっくり)
2016052202


正直、まだ画面構成やデバッグなど不十分な点は自覚していますが、できれば総選挙前に(自分の票をどこに入れるのかの参考にするために)リリースしたかったので、この段階でリリースすることにしました。特に見栄えの未熟な点はご容赦ください。



以下はこのサービスで使っている技術についての解説です。こういう人工知能的なテクノロジーに興味がある人向けです。

まずこのサービスで使っている性格分析 API である IBM Watson Personality Insights について日本語で紹介している資料はまだあまり多くないのですが、以下の PDF はその技術解説や日本語化の裏話、将来的な可能性についての読み物として公開されているものです。興味ある方はご一読いただくことをオススメします:
http://www-01.ibm.com/common/ssi/cgi-bin/ssialias?htmlfid=CO113416JPJA

技術的な視点では、このような人の性格分析がウェブの API として、それも(日本語の)テキストをインプットするだけで性格をアウトプットしてくれる、という簡易さが今後のユーザー向けサービスを大きく変える可能性を秘めていると思っています。

PDF の中でも触れられていますが、人の性格を分析するのは決して簡単なことではありません。にも関わらず、多くのベータユーザーの皆さんの協力や、研究の成果によって、「一人の人が書いたテキスト」から性格の傾向を分析することに成功し、ある程度の実証ができるようになりました。そしてその機能が誰でも(ウェブ上に公開された API として)利用できるようになりました。まずこの点で画期的なブレイクスルーが実現しています。

「一人の人が書いたテキスト」をどのようにして集めるか、という問題もあります。ただウェブであれば、このサービスで実現したようなツイッターや facebook といった SNS のデータを使うことができます。企業内利用であればユーザーの送信メールや社内掲示板や電子報告書などからもデータを取得することが可能です(プライバシーポリシーにもよりますけど、技術的には簡単ですよね)。またサービス利用者からの問い合わせ内容を再利用することも可能です。

そして性格が分析できると、「似た人」や「遠い人」、「何が似ているのか?」といった要素がわかってきます。そして似た人の行動を(個人情報を開示しない形で)提供する、という新しいリコメンドの可能性も見えてきます。それらが(充分な量の)テキストから取得できるようになる、という可能性を秘めていることになります。

ただし、「性格分析結果のどこまでを個人情報として扱うべきか?」などの新しい問題も出てきます。「個人を特定可能なのか?」、「性格分析の精度は?」、「法の整備は?」、「会社としてのポリシーをどうすべきか?」などなど。 人工知能技術の発展によって、どこまでロボットの人格を認めるべきかという議論の必要性が考えられますが、同時にそのロボットの判断結果をどこまでセキュアに保護すべきか?という議論も必要になってくるわけです。

私も API を使ってアプリやサービスを作っている立場として、色々な意味で新しい世界に踏み込みつつあることを実感しています。


というわけで、言い出しっぺの役割もあると思い、今年はフレッシュレモンこと市川美織さんに加えて入山杏奈さんの2名に票を投じることを宣言します!



IBM Bluemix からは(Swift 互換の)Object Storage サービスが提供されています:
2016051701


このオブジェクトストレージのサービスインスタンスは他の(外部の)システムにマウントして使うことができます。その一例として、Linux(CentOS) から CloudFuse を使ってマウントする方法を紹介します(2016/May/17 時点での情報です)。

まずは Bluemix にログインし、Object Storage サービスを1つ作成するために、カタログのサービス一覧から "Object Storage" を選択します(現在は「ストレージ」カテゴリ内にありました):
2016051702


Object Storage サービスに関する説明が紹介されるので内容を確認してください:
2016051701


このタイミングで利用する Object Storage サービスの料金プランを選択する必要があります。無料プランでは 5GB まで、標準プランでは使用量の上限はなく 1GB あたりで 4.2 円と、アウトバウンド転送 1GB につき 9.45 円がかかります。好きな方を選んでインスタンスを「作成」します:
2016051703


Object Storage サービスが作成できたらダッシュボードからそのサービスインスタンスを選択します:
2016051704


Object Storage サービスの画面が表示されたら、左ペインで「サービス資格情報」を選択します。すると右ペインにサービス資格情報として、JSON フォーマットのテキストが表示されます:
2016051705


おそらく以下のようなフォーマットのテキスト情報になっているはずです。このうち青字で記述した auth_url, userId, password の内容が後で必要になるのでメモしておきます:
{
  "credentials": {
    "auth_url": "https://identity.open.softlayer.com",
    "project": "object_storage_XXXXXXXX_XXXX_XXXX_XXXX_XXXXXXXXXXXX",
    "projectId": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
    "region": "dallas",
    "userId": "(userId)",
    "username": "Admin_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
    "password": "(password)",
    "domainId": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
    "domainName": "NNNNNN"
  }
}


Object Storage のインスタンスは用意できました。ではこれを Linux のファイルシステムとして(リモート)マウントしてみましょう。

マウント元になる Linux システムを用意します。今回は CentOS 6(64bit) で試しました。また Object Storage をマウントするためのツールとして CloudFuse を用いました。CentOS 上に CloudFuse を導入する手順は以前のブログで紹介したことがあるのでこちらを参照ください:
SoftLayer の Object Storage をサーバーインスタンスにマウントする

CloudFuse が準備できたら、ログインユーザーのホームディレクトリ直下に以下の3行の内容で .cloudfuse というテキストファイルを作成します(赤字はコメント):
username=(userId)  # 上記の userId の値
api_key=(password) # 上記の password の値
authurl=https://identity.open.softlayer.com/v3/  # 上記の auth_url の値に '/v3/' を追加

これで準備完了です。実際に Object Storage をマウントする前に、df コマンドで現在のファイルシステム状況を確認しておきましょう:
# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/vg_centos-lv_root
                      8.3G  3.5G  4.5G  44% /
tmpfs                 499M  144K  499M   1% /dev/shm
/dev/vda1             477M  152M  301M  34% /boot

では以下のコマンドを実行して、Bluemix の Object Storage を(この例では /mnt 以下に)マウントしてみます:
# cloudfuse /mnt

正しくマウントできているか、再度 df コマンドで確認します。ちゃんと /mnt 以下にマウントできているようです。この状態になれば Object Storage の中身を /mnt ディレクトリ以下と見なして直接読み書きすることが可能になります:
# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/vg_centos-lv_root
                      8.3G  3.5G  4.5G  44% /
tmpfs                 499M  144K  499M   1% /dev/shm
/dev/vda1             477M  152M  301M  34% /boot
cloudfuse             8.0T  7.5M  8.0T   1% /mnt

マウント状態を解除するには umount コマンドを実行します:
# umount /mnt

Bluemix の Object Storage の有用な使いみちが実現できそうです。なお、Object Storage サービスに関してはこちらのドキュメントも参照ください:
https://console.ng.bluemix.net/docs/services/ObjectStorage/index.html



最近は少なくなりましたが、一部のウェブアプリではまだ Java アプレットが使われていることもあります。で、現在は作成当時のセキュリティとは違う要素を考慮する必要があったりして、アプレットがそのままでは動かない、ということが出てきます。

例えばこんな感じ。Java アプレットを実行しようとしてこのような警告メッセージが出てブロックされてしまう、というものです:
20160517


このブロックを回避するには Java のセキュリティ設定でこのサイトを例外として扱うよう指定する必要があります。コントロールパネルの Java を選び、そのセキュリティタブにおいて「サイトリストの編集」をクリックし、この警告メッセージが表示されるサイトの URL(のホスト名部分まで)を登録します。これでこのサイトに関してはセキュリティ上の例外として処理されるようになります:
2016051701


(参考)
https://www.java.com/ja/download/help/jcp_security.xml

IBM Bluemix では様々な API がサービスとして提供されていますが、その中の1つでメモリキャッシュの機能を提供する Memcached Cloud があります:
2016051501


同サービスは IBM のビジネスパートナーである Redis Labs から提供されているものです。同社からは他にも Redis のサービスである Redis Cloud も提供されています。

この Memcached Cloud サービスを使ってみようと試みた時に、自分が躓いた点がありました。これまで自分が memcached を使う時はユーザーやパスワードの認証を使ったことがなく、そのため認証を前提としない JAR ライブラリを用意して使っていたのですが、Memcached Cloud ではユーザー&パスワードの認証が必要になります。というわけで、認証に対応したライブラリを用意する必要がありました。その手順を見つけるのに苦労したり、ドキュメントに書かれている通りには動かなかったりしたので、備忘録として手順をここに記録しておくことにします。


まず、認証に対応した Java の Memcached ライブラリとしては spymemcached を使うことにします:
2016051502


spymemcached は上記のように github からソースコードが提供されています。どこかからバイナリを探してダウンロードしてもいいのですが、自分は(最新版で試したいという意味もあったので)このソースからビルドしました。

ビルドの手順はこんな感じです。Linux(自分の場合は CentOS 6)のコマンドラインから以下のように入力して、ソースコードをダウンロードし、ant でビルドしました:
# cd /usr/local/src
# git clone https://github.com/dustin/java-memcached-client
# cd java-memcached-client
# ant

ant のビルドが成功すると、build/jars 以下に spymemcached のバイナリ jar ファイルが作られます(この例ではバージョンは 2.11.4 です。以下のコードはこのバージョンでの動作を確認しています。またファイル名に test が付いている方はこの後では不要です)。このファイルを使って Java のコードを記述します:
# cd build/jars
# ls
spymemcached-2.11.4.jar  spymemcached-test-2.11.4.jar

実際の Java コードはこのような感じになります。例えば memcached クライアントである MemcachedClient インスタンスを取得するには以下のように記述します(赤字の部分がユーザー名、パスワード、サーバー名です):
  :
  :
import net.spy.memcached.*;
import net.spy.memcached.auth.*;
  :
  :

  MemcachedClient mc = null;
		
  try{
    PlainCallbackHandler ph = new PlainCallbackHandler( "username", "password" );
    AuthDescriptor ad = new AuthDescriptor( new String[] { "PLAIN" }, ph );
    mc = new MemcachedClient(
      new ConnectionFactoryBuilder()
        .setProtocol(ConnectionFactoryBuilder.Protocol.BINARY)
        .setAuthDescriptor( ad ).build(),
      AddrUtil.getAddresses( "server.test.com:19606" ) );
    if( mc != null ){
      :
      :
    }
  }catch( Exception e ){
    e.printStackTrace();
  }

ドキュメントとの差異としては、AuthDescriptor のコンストラクタへ渡す第一引数の型は String ではなく String 配列にする必要があるようです。というわけで上記青字のような感じにしました。








 

このページのトップヘ