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

漆黒な技術メモ

管理人が必要に応じて自分のメモを好き勝手に投下するたまり場的ブログ

Android向けpahoライブラリを使えるようにしてみた

最近MQTTというプロトコルが注目されており、市場が伸びるといわれているIoTの世界で特に期待されている。
というわけで、管理人もちょっと手を出してみた。

MQTTを用いてプログラムを実装する際、クライアントサイドではpahoというEclipseプロジェクトのライブラリを用いることが一般的っぽい。今回はAndroidを相手に実装したかったのでそれのインストールメモをここに書く

はっきり言おう。すごく厄介だったと

ちなみに管理人はWindowsを使っていて、開発環境もWindowsなのだが、面倒になって一部にLinuxを併用した…

ライブラリそのものを持ってくる

Gitコマンドで持ってくる
管理人はWindowsコマンドプロンプトにGitを入れていなかったため、SourceTreeのターミナルを使った(たぶん本来の使い方ではない)

git clone http://git.eclipse.org/gitroot/paho/org.eclipse.paho.mqtt.java.git

これでインストールしてくると、多数のソースファイルがインストールされる。
で、これをビルドしてjar(org.eclipse.paho.client.mqttv3-1.0.1.jar , org.eclipse.paho.android.service.jar)を生成し使っていくのが本来の使い方なのだが…
ビルドできなかった

まあ自分の技術力のなさもあるのだろうが…
というわけで別の手を使う。

jarの一部はネットにあるらしい

ここでLinuxの出番。
org.eclipse.paho.client.mqttv3-1.0.1.jarはどうやら落とせるらしいので、コマンドをターミナルにぶち込む

sudo apt-get install curl
curl -O https://repo.eclipse.org/content/repositories/paho-releases/org/eclipse/paho/org.eclipse.paho.client.mqttv3/1.0.1/org.eclipse.paho.client.mqttv3-1.0.1.jar

で落としたjarを必要なところに持ってこればよし

問題のもう一つのjar

なんとかEclipseでビルドができる…かもしれないということで、
EclipseにADTを追加し、org.eclipse.paho.android.serviceプロジェクトをインポートする
このプロジェクトにlibsフォルダを作り、先ほどのorg.….mqttv3-1.0.1.jarと、support-v4-r7.jarというものを持ってくる。
ちなみにsupport-v4-r7.jarはここにあるっぽい
http://mvnrepository.com/artifact/com.google.android/support-v4/r7

で、あとはexportjar.xmlを書き換える必要があるのだが、ここが本当に曲者

まずは、androidjarのプロパティを

 <property name="androidjar" value="ADTのディレクトリ/android-tools/sources/android-19" />

に変更し、
javacの設定(真ん中1行)のclasspathの部分を

<target name="buildFiles" depends="init">
    <!--省略-->
        <javac deprecation="on" debug="on" encoding="${classes.encode}" srcdir="${src}" destdir="${classes}" classpath="(android.jarまでの絶対パス)\android.jar;(support-v4-r7.jarまでの絶対パス)\support-v4-r7.jar;(org.eclipse.paho.client.mqttv3-1.0.1.jarまでの絶対パス)\org.eclipse.paho.client.mqttv3-1.0.1.jar;" includeantruntime="false"/>
    <!--省略-->
    </target>

とゆー風に絶対パス3つに書き換える
はっきり言おう。
めっちゃ頭悪い書き換えだ
ただ、とりあえずこれ以外で成功しなかった。誰かいい方法あったれ教えてくれ。

とりあえず、これでプロジェクト内distフォルダにorg.eclipse.paho.android.service.jarが作成される。

MQTTのプログラムをこれらを使って動かしてみる

今回はgitで落としたソースについてきたorg.eclipse.paho.android.service.sampleプロジェクトを使う。

例によってlibsフォルダに目的のjar2つをいれ、起動f:id:igbt3116redtrain:20150512012945p:plain
動いた。よかった…

今日はここまで

お世話になったサイト様

minor.hatenablog.com

流行りの技術を体験してみた~How-Old.net ~

はいこれ。

How Old Do I Look?

How-Old.netという顔画像から年齢を推定するサイトだ。
実はこれ、適当な人がやっているのではなく、マイクロソフトの中の人が「お遊び」で作ったサイトらしい。

どーゆー技術か

簡潔に言うと、機械学習による推定である。
誤解を恐れずに言うと、機械学習とは『「説明変数(入力)」と「目的変数(出力)」のペアをいくつか学習させておくことで、説明変数を入力した際に目的変数を予測する』という技術である。

マイクロソフトクラウドサービス「Azure」の中で機械学習コンポーネントを提供してて、その中に「Face API」なる顔検出のAPIがあり、その宣伝を兼ねて作ったものらしい。

管理人はAzure全然さっぱりなのでこれ以上の説明は避けておく←

実際に推定してみた。

管理人(21歳)を測定した結果
f:id:igbt3116redtrain:20150502005639p:plain
かなり老け顔と判定されました
つらい


ちなみにこのページについて詳しく知りたい人は、マイクロソフト公式リリース文を一応出してはいるので読んでみてはいかがだろうか(英語だけど)

webページでAndroidのマテリアルデザインを作れる「Polymer」について

このご時世は「モバイルファースト」とか叫ばれており、スマホタブレットでネットに接続するのはもはや当たり前の時代になってきている。

また、HTML5,css3,jsの発展で「webアプリ」なる、webページ上でアプリケーションを動かしてサービスを提供する形態も増えてきている。

…つまりモバイル対応webアプリを作ろう!!という流れは多分に想像できるが、一方で
そんなデザインちゃっちゃと作って実装できるわけないだろ
という心の叫びを出したくなる人がいる*1のも事実である。

そんな人たちの助けとなるのが、Polymerである。

What's Polymer?

Polymerは、およそ1年前のGoogleI/Oで発表されたマテリアルデザイン*2と共に出てきたwebページのフロントエンドフレームワークである。

つまり、Android5.x系の「マテリアルデザイン」をwebページ上で実現できるフレームワークなのである。
これを使えばデザインセンスダメダメの管理人でも、今風デザインのモバイル対応webアプリを作れるということである。

Let's Polymer!!

このサイトに結構Polymerの使い方が書いてある。dev.classmethod.jp

というわけで管理人も実装…しようと思ったが例によってこの辺で力尽きたので、GWにでも持ち越そうと思う。(意識低い

*1:俺とか俺とか俺とか

*2:わからん人はこの辺でも http://gigazine.net/news/20150316-best-of-material-design/

【更新】記事カテゴリの自動更新とかいう頭おかしいことをやってみる(その2)

【4/26更新】ソースコードを貼り付け

ありえないぐらい久々の更新なのだが、途中で終わるのも何なのでとりあえず続きを書いてみる。

前回は「カスタムフィールドの値が今日と一緒の日付だった記事idを取り出す」的なことをした。

今回は「自動更新前と自動更新後に使うカテゴリのidを取り出す」ということをやる。


今回自分が使うカテゴリは二つ。

  • 開催予定のイベント
  • 過去のイベント

見てもらえばわかると思うが、上が更新前のカテゴリ、下が更新後のカテゴリである。

普通idを取り出す場合だったら「カテゴリ名が入っているテーブルから、上記二つのカテゴリ名で検索して引っかかったidが答え」というくそ単純な話で終わるのだが、WordPressではそうもいかない。
それはなぜかというと、WordPressのDB構造にある。

WordPressのDB構造

これを見ていただこう。
f:id:igbt3116redtrain:20141027043420p:plain
(http://wpdocs.sourceforge.jp/%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E6%A7%8B%E9%80%A0より抜粋して引用)

テーブルがやたら多い。
一応各テーブルについてざっくり説明を

  1. wp_posts…投稿データそのものが入ってるテーブル
  2. wp_term_relationships…投稿データとタクシノミーを関連付けるテーブル
  3. wp_term_taxnomy…各タクシノミーと語句を関連付けるテーブル
  4. wp_terms…タクシノミーで使用する語句を格納しておくテーブル

まず、「タクシノミー」とはカテゴリやタグなど、記事を分類するための概念をひっくるめて言うものらしい。
なのでWordPressではwp_terms内にカテゴリの語句もタグの語句もひっくるめて格納される。この際に同じ語句であればカラムを一つ増やす必要がなくなるため、このような構造が採用されていると思われる。

そのため、実際に記事と各タクシノミーを関連づけてるのは wp_term_relationshipsテーブルということがわかる。
ということは、「自動更新前と自動更新後に使うカテゴリのidを取り出す」ということを行いたい場合は、

  1. wp_termsテーブルからカテゴリ名が一致するterm_idを取り出す
  2. wp_term_taxnomyテーブルからterm_idが一致し、かつtaxonomyが"category"のterm_taxonomy_idを取り出す

という複雑な手順を踏まなければならない。
これをSQL(文を記述したwordpress向けPHP)になおすと…

<?php
//開催予定のイベント のterm_idを取得し、それに紐付けされたterm_taxonomy_idを取得する
$sql=$wpdb->prepare('SELECT * FROM '.$table_prefix.'terms WHERE slug=%s','future_event');
$future_id_temp=$wpdb->get_results($sql);
$sql=$wpdb->prepare('SELECT * FROM '.$table_prefix.'term_taxonomy WHERE term_id=%d AND taxonomy=%s',$future_id_temp[0]->term_id,'category');
$future_id=$wpdb->get_results($sql);
?>

これであとはいよいよ更新するだけ…なのだが、これにも1手間必要である。
それはまた次回へ続く(本当に書くのだろうか…)

某社の学内会社説明会に行ってきた

管理人の研究室やそのお隣の研究室は、おそらく一般の方々から見たら「すげえ」と思うような会社に行った卒業生の方たちが結構多い(管理人もそうなりたいがなれる気がしない)。
そういう関係で、研究室OBの方々がちょこちょこ会社説明会を開いてくれる。

というわけで、今日は某SIer企業の研究職の方々がお話をしてくださった。
最初はごく普通の会社説明会だったのだが、特にこの会社説明会で選考の何かが決まるというわけでもなかったので、途中の座談会からかなりぶっちゃけた話になった。

内容はというと

  • 企業での研究≒特許を書くこと。
  • 日本の大手企業はやはりスピードが遅い
  • 研究と言っても半分弱は事業化研究。つまるところ開発で、アカデミックな研究はあまりしない
  • システムエンジニアはエンジニアリングする仕事ではない。システムインテグレータはインテグレートする仕事ではない。
  • 大手企業はこれから全部衰退していくのではないか。
  • 車をはじめとした手で動かす嗜好品はだんだんコンピュータにとってかわられる
  • そっけない世の中になっていくけれどもビジネスチャンスは身近になっていく、そういう意味では面白い世の中になるかも

まあ日本企業の事実、SEの事実は想像通りっちゃ想像どおりだった。
それよりも、数年後はお金儲けしか面白いことがなくなるとか、めちゃめちゃな世の中に進んでいきまく感じがすごいする。別にお金を儲けるのを趣味として生きたくない。僕は。

記事カテゴリの自動更新とかいう頭おかしいことをやってみる(その1)

某用事でwordpressを使ってサイト制作をしているわけですが、設計上
「記事カテゴリを設定した日付になったら別の記事カテゴリに変更する」
というトンデモ仕様を組み込まなきゃいけなくなったので、メモ。

wordpress素人がこんな謎な行為していいのか…

さて、今回は記事の中身を「いじっていく」ので
WordPressのテンプレートファイルとかいうPHPファイルをいじるわけではなく、DBをいじることになる。

やりたいこと

f:id:igbt3116redtrain:20141005034330p:plain

対象記事にはこんな感じのカスタムフィールドが入っているので

「カスタムフィールドの値が今日と一緒の日付だったら、その記事のカテゴリを変更する。」

というプログラムを作ればいいことになる。

WordPressDBへのPHPからのアクセス

そもそも今回作るようなプログラムはテンプレートファイルでないので、単純にwordpressのwpdbクラスは使えない。
そこで、WordPressのデータベースに素のPHPからアクセスする方法 | com4tis Blogを見ると、wp-load.phpをインクルードすることで解決できるらしい。

これを基に、とりあえず「カスタムフィールドの値が今日と一緒の日付だったら」のみやってみた。

<?php
//wpdbクラスのインクルード
require_once('wp/wp-load.php');
global $wpdb;

//日付を取得
$searchDate=date('n/j');

//SQL文の定義、インジェクション対策
$sql=$wpdb->prepare('SELECT * FROM wp_postmeta WHERE meta_key=%s AND meta_value=%s','応募締切',$searchDate);
//SQLの実行、結果取得
$results=$wpdb->get_results($sql);

//結果からidを取り出し、そのカテゴリを更新
/*
*	まだ書けてない・・・
*/

?>

ただ、カテゴリはデータベース構造のかなり奥深くにはいつぁれていて、SQL文がすごく複雑になりそう
そのため次回へ持越し…今日は疲れた。

さくらレンタルサーバでwordpress用のCRONを設定してみる。(前座編)

さくらレンタルサーバではご親切に、

f:id:igbt3116redtrain:20140930015109p:plain

こんなGUIっぽくなってる。

 

さあ、どうすればいいのやら、

そもそもCRONなど使ったことがないわたくしにはどーしろと…

 

(ちなみにCRONはこんなものっぽい…http://ja.wikipedia.org/wiki/Crontab)

 

で、実際のコマンドでは

 

45 04 * * * /var/test/cron.autoexec.sh

 

こんな感じにすれば、「毎日4:45に/var/test/cron.autoexec.shを実行する」って言うことが指定できるらしい

 

これをさくらの設定画面に移すと…

 

f:id:igbt3116redtrain:20140930020527p:plain

(毎日実行する場合)

 

こんな感じになるのか?

 

まあ、そもそも実行するスクリプトを作っていないので、どう考えてもそっちが先決だな…