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

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

2015/06

東芝の(いい意味で)変態な SD カード "FlashAir" 。実は以前のブログエントリでは以前のバージョンの FlashAir のこんなハックを紹介したことがありました:


比較的最近のモデルでは lua 言語によるスクリプト処理が可能になったり、「ファイルが FlashAir カードに追加された」などのイベントをハンドリングして処理を実行したり、といったことも可能になり、ますます変態チックな度合いが上がっているようです:



で、せっかく lua スクリプトが使えるようになったのであれば、このカードの中のファイルを(例えば FlashAir カードにファイルが追加されたタイミングなどで)サーバーにアップロードして、サーバー側ではアップロードされた画像ファイルになんらかの(例えば「保存する」などの)処理を実行する、という一連のスクリプトも記述できるのではないか、と考えました。

サーバー側の処理はアップロードされたファイルを取り出して・・・という内容になると思うので、一般的なファイルアップロード処理を行うことになります。

一方、クライアント(FlashAir カード)側の処理は、やることは簡単なのですが、何しろ普段名前を聞くくらいでしか知らなかった lua という軽量言語を触ったことがありませんでした。加えて、ちょっと特殊な言語のようで結局、未だにデバッグ方法を理解していません(苦笑)。 FlashAir も変態でしたが、lua は lua でまたどM向けプログラミング言語というか・・・ 「変態」とか「どM」とか、IT とは異なる世界の話をしている気分になってきます。 (^^;

まあ、でもなんとかファイルアップロードができることを確認したスクリプトが作れました。もしかしたら私以外の変態な皆様の役に立つかもしれないと思って公開することにします(赤字はコメントなので実際には不要、というか残したままだと正しく動きません):
boundary = "1234567890" 適当な文字列
contenttype = "multipart/form-data; boundary=" .. boundary
fname = "sample.png" 転送するファイル名
fpath = "/DCIM/100__TSB/" .. fname 転送するファイルのフルパス
mes = "--" ..  boundary .. "\r\n"
  .."Content-Disposition: form-data; name=\"file\"; filename=\""..fname.."\"\r\n"
  .."Content-Type: image/png\r\n\r\n"
  .."\r\n"
  .."--" .. boundary .. "--\r\n"

blen = lfs.attributes(fpath,"size") + string.len(mes) - 17
b, c, h = fa.request{url = "http://xx.xx.xx.xx/up.php", http://xx.xx.xx.xx/up.php というアップローダーに転送
  method = "POST",
  headers = {["Content-Length"] = tostring(blen),
  ["Content-Type"] = contenttype},
  file = fpath,
  body = mes
}

#だいたい lua のコメントってどう書くのかと??

この例では FlashAir 内の /DCIM/100__TSB/sample.png というファイルを http://xx.xx.xx.xx/up.php というアップローダーに転送することを想定した、マルチパートにすらしていないシンプルなスクリプトです。固定の同じファイルだけを送信するような内容になっていますが、これは実際にはファイル名のパラメータ渡しなどで対応できないかな、と思ってます。

受け取る側の up.php は例えばこんな感じで:
<?php
$name = $_FILES["file"]["name"]; // ファイル名
$mimetype = $_FILES["file"]["type"]; // Content-Type
$filesize = $_FILES["file"]["size"]; // ファイルサイズ
$tmpname = $_FILES["file"]["tmp_name"]; // 一時ファイル名(ここに実体がある)

$filename = "/var/www/html/imgs/" . $name; $result = @move_uploaded_file( $tmpname, $filename ); // 一時ファイルを Document Root 以下に移動するだけ echo( $result ); ?>

こちらはある意味で「一般的な」 PHP アップローダーの中身です。 $_FILES 変数に入った情報を元にファイル名やサイズ、そしてファイルの実体を取り出しています。この例では単純にアップロードされたファイルをドキュメントルート以下に移動するだけの内容です。これが http://xx.xx.xx.xx/up.php という URL でアクセスできる PHP サーバー上に用意されている、という想定です。
2015062401


この PHP では単純にアップロードされたファイルをドキュメントルート以下に置き直しているだけですが、その画像を使って PHP で更に別の処理を行う、なんてことももちろんできます。また PHP である必要もなく、ごく一般的な HTTP ファイルアップローダーの仕組みが用意されていればよい、という認識で大丈夫です。


これら2つのファイルを FlashAir および PHP サーバー側にそれぞれ用意しておくことで FlashAir からのファイルアップロードが実現できました。後はこれを HTTP 経由で呼び出すか、あるいは FlashAir の SD カードにファイルが追加されたタイミングで実行する、などの方法で lua を動かして使うことになります。



参考にしたのはこの辺りです:
- FlashAir Developers : チュートリアル
- FlashAir Developers : API ガイド
おまけ程度のツール置き場 - FlashAirをいじってわかったこと。


#いやあ、しかし lua は難しいというか、、、資料が少ないのも原因なんだろうけど・・・
 

マウスコンピュータから販売された「格安 Windows スマホ」MADOSMA。とりあえず初回版の入手が出来て、1日弱使ってみたので、その感想を書きます。



まず「軽い」と感じました。日本のスマホには少ないのですが、東南アジアなどでたまに見る「背面がプラスチック」製です。悪くいえば「安っぽい」のですが、軽量化と加えてコスト削減には適していると思ってます。個人的にはこういう安いスマホをもっと日本でも買えるようにしてほしい。

コスパはまあいいと思います。SIM フリースマホ本体に 16GB の MicroSD カードまでついて3万円台前半。「3万円ちょっとで SIM フリースマホが(24ヶ月縛りとか関係なく)買える」という事実だけでもそこそこ需要があると思います。

冷静に考えると当たり前なのですが、標準ブラウザがモバイル版の IE なんですよね。そのせいなのか、自分の作ったウェブアプリも非対応でうまく表示されないものがあったりしました。そういうケースが想定されているのでこんなのも需要があるんでしょうね。

そして(正式アナウンスがあったわけではないですが)Windows Phone 10 のアップデートが予定されている、という情報も気になる所。現時点で日本で入手できる端末の中では唯一の Windows Phone 10 対応(予定)機なんじゃないかな?


そもそも Windows Phone にあまり興味のない人が買ってしまうと孤独感に苛まれる可能性が高い端末ではありますが、Windows Phone 目当てで買うとしたら悪くないんじゃないかと思います。




 

IBM がビジネスパートナー企業様向けに無料で Power アーキテクチャのサーバーの試用を提供しています。1回につき2週間程度なので、長期利用を前提とする使い方はできませんが、アプリケーションの Power 上(RedHat Enterprise Linux や Ubuntu の Power 版、AIX, i/OS など)の動作確認や互換性チェックなどを行うには充分だと思っています。利用前に企業登録などの手続きの必要はありますが、料金が発生することはありません。 この PDP(Power Development Platform) と呼ばれるサービスの利用方法については過去にこのブログでも何度かとりあげています。RHEL での紹介ですが、興味ある方はこちらも参照ください:
Power 版 RHEL(RedHat Enterprise Linux) を無料で2週間借りる

実はこの PDP 上の RHEL 環境を使っていて、少し気になることがありました。サーバーリソースがアクティブになり、VPN も張り、いざ SSH でリモートログイン! ・・・しようとすると、結論としてログインできるのですが、SSH コマンドを実行してからパスワードを聞かれるまでに、やけに時間がかかるのです:
2015061001

結論としてはログインできるんだけど、SSH を実行してからパスワードプロンプトが表示されるまでに1分くらいかかってしまいます。それまではパスワードを入力したくてもできない。 で、待ってる間に別の作業でも・・・と思ってメールとか見ていると、いつの間にか夢中になって5分くらい過ぎて、パスワード入力もタイムアウトになってログインに失敗しているという(苦笑)。

RHEL 以外の環境で同様のことが発生するかは試していないのですが、どうやらこれは sshd の認証設定によるものなので設定を変えれば回避できそうです。具体的にはこちらで紹介している対処方法でいけます:

↑こちらで紹介している手法にしたがって、最後に sshd をリスタートしておけば、それ以降の SSH アクセスではすぐにパスワードを聞いてくるようになりました。 PDP 上の RHEL を使っていて気になる方は参考にしてください。



特殊なクラスタの人しか興味ないネタで恐縮ですが・・・

コンパスと定規だけで円を中心角で14等分する」という課題、皆さん解けますか? コンパスと定規だけ、つまり分度器の使用はNG、という条件です。またここでの「定規」は「目盛りの振られたもの(ある程度の細かさで長さを測ることができるもの)」いう意味で使います。

2等分は中心を通る直線を書けば必ず2等分されるので簡単ですよね。「角の2等分線」の書き方を知っていれば4等分、8等分、16等分、・・・もできます:
2015060701


ちょっとややこしい話になりますが、実は3等分、5等分も可能です。この辺りについて、詳しくはウィキペディアを参照してください:
定規とコンパスによる作図

さて14等分です。上記のウィキペディアを参照いただけるとわかるのですが、実は「一般的には作図できない」ことがわかっています。意外と難問なのです。ただ「一般的でなければ作図できる」とも言えます。要するに「作図できそうな条件をある程度整えてしまえば作れる」のです。というわけで、その条件を考えながら実際に作ってみましょう。

まず、円を中心角で14等分するということは、その時の中心角 θ は θ =  2 * π / 14 = π / 7 となります。仮に、円の半径を r とすると、この時の図の(弧ではなく)直線 x の長さを求めます:
2015060702


なぜ x を求めるかというと、この x の長さが分かれば、円周上の任意の一点を中心に長さ x 円との交点を求めれば、その任意の点と交点の両方が14等分した時の円周との交点になります。そして更にその交点を中心とした長さ x の円との交点も14等分した時の円周との交点になります。つまりこの x の長ささえ分かってしまえば、定規とコンパスだけで14等分できる、ということになるのです。

で、この x の値がどうなるかを三平方の定理と三角関数を使って求めると(途中式略)このような値になります: x = r * √(2(1-cosθ))

今 θ = π / 7 とわかっているので、cosθ = 0.90096886790.. となり、したがって x = r * 0.4450418679.. ということになります。後はこの x が定規で図れるような長さになるように r を調整してあげればよい、ということになります。

例えば r = 5cm であれば、x = 2.2252093.. ≒ 2.2(cm) 。つまり半径 5cm の円を描いて、その円周上の任意の点から 2.2 cm の距離にある点を順次 14 個求めていくと、その点と中心角を結んだ14本の線は円を(ほぼ)14等分する線になる」わけです。

論より証拠、やってみましょう。まずは半径 5cm の円をコンパスで書きます:
写真 1


円周上の任意の点に印を付け、ここからコンパスで 2.2cm の距離にある円周上の点にも印を付けます:
写真 2


新たに印を付けた点から再度 2.2cm の距離にある円周上の点を求めていきます。この作業を繰り返します:
写真 3


この 2.2cm というのが近似値なので最後に少しズレが生じる可能性もありますが、これでほぼ14等分する点が求められるはずです:
写真 4


最後に求めた点と中心とを直線で結ぶと円の14等分が完成するはず! です。「一般的には描けない」図を「描けるような条件を与える」ことで描けるようになりました:
写真 5


円を14等分する方法が分かってしまえば後はこれを応用して、2重円を作り、外側を14等分、内側を(普通に)8等分すると、本来描きたかった(?)こんな図も描けるようになります:
写真


これでコンパスと定規だけで JIS マンホール蓋が描けるようになりました!



 

IDCフロンティア様主催の MariaDB ミートアップに参加してきました。

MariaDB は MySQL 互換の RDB です。自分自身が作って運営しているマンホールマップねっぴツイートマッパーなど多くのサービスで MariaDB を採用しています。

このミートアップの中で現 Chief Evangelist の Colin さんから「MariaDB は IBM の Power8 プラットフォーム上で非常に高いパフォーマンスを発揮している」という紹介がありました。おそらくこの記事で紹介されていることだと思います:

MariaDB on Power8

ほー、そうなのか(知らなかったw)。ただ、実は以前に自分もこのようなブログエントリを書いたことがありました:
Power Linux 上で MariaDB をビルドして使う

これを書いた頃はまだ(後述の)PDP 環境で提供される RedHat のバージョンが 6 でした。RHEL 6 では標準 RDB が MySQL でしたが、RHEL 7 になって標準 RDB は MariaDB に変更になっているはずです。つまり「もうわざわざビルドしなくても Power Linux 上で MariaDB が使えるようになっているはず」です。

さっそく試してみます。環境としては IBM がビジネスパートナー様向けに無料で提供しているクラウドの Power 環境である PDP を使って Power8 + RedHat 7 環境を予約して使います。この辺りの詳しい手順はこちらを参照ください:
Power 版 RHEL(RedHat Enterprise Linux) を無料で2週間借りる(1/2)
Power 版 RHEL(RedHat Enterprise Linux) を無料で2週間借りる(2/2)


上記の (1/2) の手順でマシンリソースの予約を行い、(2/2) の手順で SSH でリモートアクセスして Power8 のリモート環境にログインします:
2015060907


念のため環境を確認します。まごうことなき Power 8 アーキテクチャ上の RedHat Enterprise Linux 7.1 です。:
2015060909


ではさっそくというか、いきなり MariaDB のインストールにとりかかります。リポジトリなどの準備なしでいきなり yum install を実行すると・・・
[root@sys-74413 ~]# yum install mariadb-server mariadb-client mariadb-devel
Loaded plugins: product-id, subscription-manager
This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register.
No package mariadb-client available.
Resolving Dependencies
--> Running transaction check
---> Package mariadb-devel.ppc64le 1:5.5.41-2.ael7b will be installed
--> Processing Dependency: openssl-devel(ppc-64) for package: 1:mariadb-devel-5.5.41-2.ael7b.ppc64le
---> Package mariadb-server.ppc64le 1:5.5.41-2.ael7b will be installed
--> Processing Dependency: mariadb(ppc-64) = 1:5.5.41-2.ael7b for package: 1:mariadb-server-5.5.41-2.ael7b.ppc64le
--> Processing Dependency: perl-DBI for package: 1:mariadb-server-5.5.41-2.ael7b.ppc64le
--> Processing Dependency: perl-DBD-MySQL for package: 1:mariadb-server-5.5.41-2.ael7b.ppc64le
--> Processing Dependency: perl(DBI) for package: 1:mariadb-server-5.5.41-2.ael7b.ppc64le
--> Processing Dependency: libaio.so.1(LIBAIO_0.4)(64bit) for package: 1:mariadb-server-5.5.41-2.ael7b.ppc64le
--> Processing Dependency: libaio.so.1(LIBAIO_0.1)(64bit) for package: 1:mariadb-server-5.5.41-2.ael7b.ppc64le
--> Processing Dependency: libaio.so.1()(64bit) for package: 1:mariadb-server-5.5.41-2.ael7b.ppc64le
--> Running transaction check
---> Package libaio.ppc64le 0:0.3.109-12.ael7b will be installed
---> Package mariadb.ppc64le 1:5.5.41-2.ael7b will be installed
---> Package openssl-devel.ppc64le 1:1.0.1e-42.ael7b will be installed
--> Processing Dependency: zlib-devel(ppc-64) for package: 1:openssl-devel-1.0.1e-42.ael7b.ppc64le
--> Processing Dependency: krb5-devel(ppc-64) for package: 1:openssl-devel-1.0.1e-42.ael7b.ppc64le
---> Package perl-DBD-MySQL.ppc64le 0:4.023-5.ael7b will be installed
---> Package perl-DBI.ppc64le 0:1.627-4.ael7b will be installed
--> Processing Dependency: perl(RPC::PlServer) >= 0.2001 for package: perl-DBI-1.627-4.ael7b.ppc64le
--> Processing Dependency: perl(RPC::PlClient) >= 0.2000 for package: perl-DBI-1.627-4.ael7b.ppc64le
--> Running transaction check
---> Package krb5-devel.ppc64le 0:1.12.2-14.ael7b will be installed
--> Processing Dependency: libverto-devel for package: krb5-devel-1.12.2-14.ael7b.ppc64le
--> Processing Dependency: libselinux-devel for package: krb5-devel-1.12.2-14.ael7b.ppc64le
--> Processing Dependency: libcom_err-devel for package: krb5-devel-1.12.2-14.ael7b.ppc64le
--> Processing Dependency: keyutils-libs-devel for package: krb5-devel-1.12.2-14.ael7b.ppc64le
---> Package perl-PlRPC.noarch 0:0.2020-14.ael7b will be installed
--> Processing Dependency: perl(Net::Daemon) >= 0.13 for package: perl-PlRPC-0.2020-14.ael7b.noarch
--> Processing Dependency: perl(Net::Daemon::Test) for package: perl-PlRPC-0.2020-14.ael7b.noarch
--> Processing Dependency: perl(Net::Daemon::Log) for package: perl-PlRPC-0.2020-14.ael7b.noarch
--> Processing Dependency: perl(Compress::Zlib) for package: perl-PlRPC-0.2020-14.ael7b.noarch
---> Package zlib-devel.ppc64le 0:1.2.7-14.ael7b will be installed
--> Running transaction check
---> Package keyutils-libs-devel.ppc64le 0:1.5.8-3.ael7b will be installed
---> Package libcom_err-devel.ppc64le 0:1.42.9-7.ael7b will be installed
---> Package libselinux-devel.ppc64le 0:2.2.2-6.ael7b will be installed
--> Processing Dependency: libsepol-devel >= 2.1.9-1 for package: libselinux-devel-2.2.2-6.ael7b.ppc64le
--> Processing Dependency: pkgconfig(libsepol) for package: libselinux-devel-2.2.2-6.ael7b.ppc64le
--> Processing Dependency: pkgconfig(libpcre) for package: libselinux-devel-2.2.2-6.ael7b.ppc64le
---> Package libverto-devel.ppc64le 0:0.2.5-4.ael7b will be installed
---> Package perl-IO-Compress.noarch 0:2.061-2.ael7b will be installed
--> Processing Dependency: perl(Compress::Raw::Zlib) >= 2.061 for package: perl-IO-Compress-2.061-2.ael7b.noarch
--> Processing Dependency: perl(Compress::Raw::Bzip2) >= 2.061 for package: perl-IO-Compress-2.061-2.ael7b.noarch
---> Package perl-Net-Daemon.noarch 0:0.48-5.ael7b will be installed
--> Running transaction check
---> Package libsepol-devel.ppc64le 0:2.1.9-3.ael7b will be installed
---> Package pcre-devel.ppc64le 0:8.32-14.ael7b will be installed
---> Package perl-Compress-Raw-Bzip2.ppc64le 0:2.061-3.ael7b will be installed
---> Package perl-Compress-Raw-Zlib.ppc64le 1:2.061-4.ael7b will be installed
--> Finished Dependency Resolution

Dependencies Resolved

================================================================================
 Package                     Arch        Version               Repository  Size
================================================================================
Installing:
 mariadb-devel               ppc64le     1:5.5.41-2.ael7b      server     747 k
 mariadb-server              ppc64le     1:5.5.41-2.ael7b      server      11 M
Installing for dependencies:
 keyutils-libs-devel         ppc64le     1.5.8-3.ael7b         server      37 k
 krb5-devel                  ppc64le     1.12.2-14.ael7b       server     640 k
 libaio                      ppc64le     0.3.109-12.ael7b      server      24 k
 libcom_err-devel            ppc64le     1.42.9-7.ael7b        server      30 k
 libselinux-devel            ppc64le     2.2.2-6.ael7b         server     174 k
 libsepol-devel              ppc64le     2.1.9-3.ael7b         server      71 k
 libverto-devel              ppc64le     0.2.5-4.ael7b         server      12 k
 mariadb                     ppc64le     1:5.5.41-2.ael7b      server     9.1 M
 openssl-devel               ppc64le     1:1.0.1e-42.ael7b     server     1.2 M
 pcre-devel                  ppc64le     8.32-14.ael7b         server     477 k
 perl-Compress-Raw-Bzip2     ppc64le     2.061-3.ael7b         server      33 k
 perl-Compress-Raw-Zlib      ppc64le     1:2.061-4.ael7b       server      58 k
 perl-DBD-MySQL              ppc64le     4.023-5.ael7b         server     140 k
 perl-DBI                    ppc64le     1.627-4.ael7b         server     802 k
 perl-IO-Compress            noarch      2.061-2.ael7b         server     260 k
 perl-Net-Daemon             noarch      0.48-5.ael7b          server      51 k
 perl-PlRPC                  noarch      0.2020-14.ael7b       server      36 k
 zlib-devel                  ppc64le     1.2.7-14.ael7b        server      50 k

Transaction Summary
================================================================================
Install  2 Packages (+18 Dependent packages)

Total download size: 24 M
Installed size: 124 M
Is this ok [y/d/N]: 

Power 用の RHEL7 でも、ちゃんと MariaDB が標準で使えるようになってました。これで "y" を指定すればインストールできちゃいます。

ただし、このコマンドで導入できるのは MariaDB 5.5 のようですね。MariaDB 10.x を使いたい場合はまだソースからビルドする必要がありそうです。その手順はこちらのエントリを参照してください:
Power Linux 上で MariaDB をビルドして使う

 

このページのトップヘ