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

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

IBM Notes の起動時に表示されるスプラッシュスクリーンをカスタマイズする方法を紹介します:
2015091801
 (↑これがスプラッシュスクリーン)


やり方は色々あって、「きちんと」対応しようとすると結構面倒なこともあるんですが、てっとり早く作るにはこれかなあ、という方法を紹介します。

まずはビットマップ(Windows BMP)形式のスクリーン画像を用意します。今回はこれを使います:
2015091802
(注 この画像↑自体は PNG 形式なので、保存してもそのままでは使えません。お手元の環境で BMP 形式に変換してから使ってください)

なお、ここで用意する画像のサイズがあまり小さすぎると、パスワードプロンプトメッセージがうまく表示できなかったりするので、適宜調整してください。ちなみに↑上記の画像のサイズは 640x480 です。

この BMP 画像ファイルを適当なフォルダに保存します(C:\IBM\Notes\shojoji.bmp に保存したとします)。そしていったんノーツを閉じて、notes.ini ファイルをテキストエディタで開き、最後に以下の2行を追加します:
  :
  :
SESPlashPath=C:\IBM\Notes\shojoji.bmp
HasNotesOverlay=1

この状態で notes.ini を保存して、改めてノーツを起動するとこんな感じになります。指定した画像がスプラッシュスクリーンになって、パスワード入力待ちになっていることが確認できます:
2015091803


スプラッシュスクリーンをよく見ると分かるのですが、画像左下にパスワードプロンプトメッセージが表示されていたりします。画像サイズによってはここが崩れてしまったり、(今回のように)見難い位置に表示されてしまったりする可能性があるので、そのあたり上手く調整する必要があります。


業務でノーツをお使いの皆様、仕事中の気分転換にどうぞ。

なお、「ちゃんとした方法」はこちらをどうぞ:
http://www-01.ibm.com/support/docview.wss?uid=swg21962056


以前に東芝 FlashAir 内の特定ファイルをウェブサーバーにアップロードする、という lua スクリプトを作って紹介したことがありました:

一応、このスクリプトは動くのですが、残念なことに固定ファイルしかアップロードできませんでした。理想を言えば「FlashAir に最後に作成されたファイル」を調べることができれば、LUA_SD_EVENT イベントをフックして、「新しいファイルが追加されたら、そのファイルをアップロードする」ということができるようになるのですが、このブログエントリを記述した頃はまだそこまで lua を分かっていませんでした。

で、今乗ってる電車の目的地までしばらく時間がある時間と気持ちに余裕ができたので、FlashAir の特定ディレクトリ内で最も最近作成されたファイルを調べるスクリプトを作ってみました(赤字はコメントです):
last_filepath = ""
max_mod = 0
fpath = "/DCIM/100__TSB" 目的のフォルダ
for filename in lfs.dir(fpath) do 目的フォルダ内の全ファイルを探す
  filepath = fpath .. "/" .. filename
  mod = lfs.attributes( filepath, "modification" ) ファイルの最終更新日時
  if mod > max_mod then 更新日時が最新(最大)のファイルを探す
    max_mod = mod
    last_filepath = filepath
  end
end

   :
(この時点で last_filepath に最新ファイルのパスが格納されている) :

このスクリプトは FlashAir 内の \DCIM\100__TSB というフォルダの中を調べて最も作成日時(実際には更新日時)が新しいファイルを探して last_filepath という変数にそのファイルのファイルパスを代入する、という処理を実行しています。

というわけで、このスクリプトを使って上述リンク先の前回作成した lua スクリプトを改良して、「FlashAir の \DCIM\100__TSB フォルダ内に新しいファイルが作られたらウェブサーバーにアップロードする」という lua スクリプトを作ってみました:
last_fname = ""
last_fpath = ""
max_mod = 0
fpath = "/DCIM/100__TSB"
for filename in lfs.dir(fpath) do
  filepath = fpath .. "/" .. filename
  mod = lfs.attributes( filepath, "modification" )
  if mod > max_mod then
    max_mod = mod
    last_fname = filename
    last_fpath = filepath
  end
end

boundary = "1234567890"
contenttype = "multipart/form-data; boundary=" .. boundary
mes = "--" ..  boundary .. "\r\n"
  .."Content-Disposition: form-data; name=\"file\"; filename=\""..last_fname.."\"\r\n"
  .."Content-Type: image/png\r\n\r\n"
  .."\r\n"
  .."--" .. boundary .. "--\r\n"

blen = lfs.attributes(last_fpath,"size") + string.len(mes) - 17
b, c, h = fa.request{url = "http://XX.XX.XX.XX/up.php",
  method = "POST",
  headers = {["Content-Length"] = tostring(blen),
  ["Content-Type"] = contenttype},
  file = fpath,
  body = mes
}


これを FlashAir の \lua\upload.lua という名前で作成し、\SD_WLAN\config ファイルに以下の1行を追加すると、FlashAir の \DCIM\100__TSB フォルダに新しいファイルができる度にそのファイルはウェブサーバーにアップロードされる、という処理が実現できるようになります:
LUA_SD_EVENT=/lua/upload.lua


そしてウェブサーバー(XX.XX.XX.XX)側のドキュメントルートに up.php というアップロードの受け口となるモジュールが用意されていればこれでアップロードできます。こちらのサンプルは上述の前回リンクの中で紹介しているサンプルのようなものになります(サンプルは PHP です)。


Lua のファイルシステム API についてはこちらのリファレンスを参照してください:
http://keplerproject.github.io/luafilesystem/manual.html#reference
 

IoT アプリ開発をする上で避けて通れないのが MQTT(Message Queuing Telemetry Transport) プロトコルです。デバイスやセンサーなどのマシン間接続(いわゆる "M2M")用に IBM を中心に提唱された軽量プロトコルで、Node-RED や IBM IoT Foundation Quickstart などでも使われています。

そして、この MQTT をアプリケーション実装する上で便利なライブラリPaho です。これも元々は IBM が開発したものをオープンソースとして Eclipse Foundation に寄贈し、現在は Eclipse プロジェクトの1つとして公開されています:

http://www.eclipse.org/paho/
paho_logo_400


この Paho ライブラリを使うことで MQTT の詳しいプロトコル仕様を理解することなく、MQTT アプリケーションを開発することが可能になります。プログラミング言語としても C/Java/Java Script/Python など、多くの言語に対応しており、PC やスマホ、組込機器など、多くのデバイスで利用することができるようになっています。

そして、この Paho の Java ライブラリを使って、実際に IBM IoT Foundation Quickstart の MQTT ブローカー( quickstart.messaging.internetofthings.ibmcloud.com:1883 )に接続して、MQTT パブリッシュ処理を行うサンプルを作ってみた時の様子をこちらで紹介しています:
QuickStart MQTT ブローカーに Java からパブリッシュする

QuickStart は IBM が公開している MQTT ブローカー(サーバー)で、認証なしであれば誰でも使うことができます。また上記リンク先でも紹介していますが、ここにパブリッシュされたメッセージは IBM BluemixNodeRED アプリケーションを使って簡単に取得したり、データベースに格納したり、データフローを定義することができるようになります。


IoT アプリ開発者にとって、この Paho は慣れておくことが必須のライブラリだと思いました。


このページのトップヘ