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

Bye Bye Moore

猫マンション建築の野望を胸に零細事業主として資本主義の荒波に漕ぎ出したアラサー男の技術メモ

FlashAir内蔵Luaを使ってWEBブラウザからLEDをチカチカさせる

組み込み

FlashAirにはLuaという軽量言語が内蔵されています。
RubyPythonのような文字列、配列を軽く操作できる便利関数が揃っています。
それに加えて、極めて高速。
どれほどかと言えば、ゲームエンジンの開発初期段階でパラメータ調整なんかに使われる程。
フットプリントも軽いのでSDカードのような非力な実行環境でもサクサク動きます。

FlashAirではデフォからos系の機能を削り、代わりにWEBやSDカードIOまわりを強化した独自パターンのものを採用しています。
今回はこの独自Luaを使ってLチカさせる方法を考えてみます。

実際のところ

作業環境

  • FlashAir W-03 32Gbyte
  • OS X Yosemite(10.10)

部材

初期設定

まずは設定。
SDカードをスロットに

$ nano /Volumes/NO\ NAME/SD_WLAN/CONFIG 

キモは

  • APPNAME
  • IFMODE

です。
前の記事で紹介したツールを使うと、これら値の設定は空白で出てませんでした。

最終的に私のは、こんな感じに

[Vendor]

CIPATH=/DCIM/100__TSB/FA000001.JPG
VERSION=FA9CAW3AW3.00.00
CID=02544d535733324731ea8ec97900f701
PRODUCT=FlashAir
VENDOR=TOSHIBA
APPMODE=5
APPAUTOTIME=300000
DNSMODE=1
APPNAME=flashair
APPSSID=YOURSSID
APPNETWORKKEY=*********
LOCK=1
WEBDAV=1
TIMEZONE=36
IFMODE=1

index.html

設定が終わったら、いよいよファイルです。
場所は"/Volumes/NO\ NAME/index.index"のように、SDカード直下でよいです。

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>Test</title>
  </head>
  <body>
    <form action="index.lua" method="GET">
      <button type="submit" name="light" value="on">ON</button>
      <button type="submit" name="light" value="off">OFF</button>
    </form>
  </body>
</html>

index.lua

-- /Volumes/NO\ NAME/index.lua

print[[
HTTP/1.1 303 See Other
Location: index.html

]]
local arg = ...
local light = arg:match("light=(%a+)")
local LED_PIN = 0x01 -- CMD

if light == "on" then
  fa.pio(LED_PIN, 0x01)
  print "ON"
else
  fa.pio(LED_PIN, 0x00)
  print "OFF"
end

配線

電源はUSBシリアル変換器の5Vから、信号はSDIから出力。

動作確認

http://flashair.local/index.htmlを見ると、ブラウザに簡単なボタンが二個表示されている筈です。
indexはsubmitからluaスクリプトを呼び出しています。
呼び出されたluaは303を返すので、そのままindex.htmlに返します。
が、バックでは動いているのでLEDがボタン通りに動きます。

FlashAirの設定ツールを使う

FlashAirにはWIn/OS X用のGUI形式の設定ツールが用意されています。
直接設定ファイル書き換えもできるのですが、楽な方がいいですよね。

実際のところ

導入

下記サイトからツールをダウンロード。
私はMacBookProなので、OS X用のdmgです。
www.toshiba.co.jp
起動すると二つのアプリがあります。
FlashAirをSDカードスロットに差し込んだ状態で右側のFlashAirがあるアイコンの方をクリック。
f:id:shuzo_kino:20160925234604p:plain
完全に新規な状態で読み込むと、当然デフォ値なので初期化プロセスで環境を
まずはネットワーク設定。接続先のWiFiの情報を書き込みます。
f:id:shuzo_kino:20160925234644p:plain
疎通の確認。
f:id:shuzo_kino:20160925234651p:plain

一旦引っこ抜いて、電源付きのガジェットに接続。
普通はカメラ、僕らだと電源付きのSDカードリーダ子機でしょうか?
全ての設定が終わると、以降ローカルネットワーク内でSDカードに保存されたデータが確認できます。
f:id:shuzo_kino:20160925234700p:plain


一連の設定が終わると、次回以降はこんな感じの画面が出てきます
f:id:shuzo_kino:20160925235846p:plain

その後の展開

たとえばRasbianを書き込んでいる場合、リモートでRasbianの中身を書き換えたりリブートできたりするみたいです。
flashair-developers.com

pythonで使えるORMapper「peewee」

python sql

今回はpythonで使えるORMapperの「peewee」を試してみます。

実際のところ

今回は既存のDBを流用するパターン。

from peewee import *
from playhouse.sqlite_ext import SqliteExtData

db = SqliteExtDatabase('blogtest.sqlite')
db.connect()

で、このpeeweeは利用のため自前でちゃんとクラスを設定してあげる必要が

class BaseModel(Model):
  class Meta:
    database = db

class Blog(BaseModel):
  body = TextField()
  date = DateTimeField(default=datetime.datetime.now)

Blog.select().order_by(Blog.body).count()
#>> 6
from datetime import date

newblog.save()
#>> 1

Blog.select().order_by(Blog.body).count()
#>> 7

【ネタ】"echo f o{,,} b a r"ってやったら、どうなると思います?

bash
$ echo f o{,,} b a r
f o o o b a r

中括弧の中身を数値に変えると

$ echo f o{2} b a r
f o{2} b a r


奇妙な事に、man echoしてもこの構文に関する話は一切でてきません。

参考もと

【読書メモ】とろける鉄工所

読書メモ

たまには漫画を。
とろける鉄工所」は自身も鉄工所勤務をされていた野村宗弘先生による、緩めなお仕事漫画です。

元ミュージシャンの北さんを主人公に、鉄工所の仕事っぷりを描くのが主なコンテンツ。
あとは、たまに登場人物の恋模様や家庭事情が出てきたり。
(プロジェクトX的な展開は)ないです。

個人的に好きな話数

97話

鉄面皮な社長の過去エピソード。
自分で作ったもので生計立てたいと思っていたら、
いつのまにか経営・営業担当になっていたっていう。
ある意味、今の私に通じる所がありますね。
たまにヘルプで仕事に入るとイキイキする辺りも何だか……自分の将来はこんな感じなのかも……

230話

チームリーダーに抜擢された石井さんの思い出話。
もとは自分の鉄工所を持っていたものの、不況とアジア勢の進出で看板を畳んだ件がしんみりきます。
各種薀蓄からも技術力があるのは間違い 無いのでしょう。
が、それだけじゃぁ喰っていけないんですねぇ……悲しいなぁ。

Rubyのクラスを作る際に可変長の変数をもたせたい場合

ruby

久々にRubyのお話です。
クラスを作る際に可変長の変数をもたせたい場合は、空Hashのデフォ値を持った引数を設定しておきます。
こうすれば、Hashを渡してあげれば内容を参照できますし、駄目な値なら弾く事ができます。

実際のところ

デバッグ情報なんかを付加したいときには使えますね。

class Sample
  attr_accessor :val
  attr_reader :flag
  def initialize(val, params = {})
    @val = val
    if params[:flag]
      @flag = true
    end
  end
end

a = Sample.new(42)
b = Sample.new(12, {flag: true})
p a.flag
#=> nil
p b.flag
#=> true

Hash以外の値を渡せばエラーで止まります。

c = Sample.new(42, 11)
#2> class.rb:6:in `[]': no implicit conversion of Symbol into Integer (TypeError)

参考もと

stackoverflow.com

bottleとsqlite3を連携させて簡単なメモ表示ツール その4:フロントエンド・フレームワークを使う

python jade

前回はJadeを導入しました。

今回はCSSやJS、画像やフォントがテンコ盛りのフロントエンド・フレームワークをbottleで使う方法を考えます。

実際のところ

導入

designmodo.github.io
上記サイトから、twitter-bootstrapの拡張版「Flat UI」を頂いてきます。
展開すると「dist」というディレクトリが確認できるので、こいつの中身をbottleプロジェクトのtemplatesディレクトリに追加。
index.htmlは好みで。私は消しました。
終わると、こんな構成になってるはずです。

$ tree -l 2
.
├── app.py
├── blogtest.sqlite
├── static
│   ├── css
│   ├── fonts
│   ├── img
│   └── js
└── templates
    ├── blog.jade
    ├── hello.jade
    └── index.jade

ディレクトリ構成

app.py

bottleのstaticは必須です。
あとはstaticフォルダにパスを通してあげます。

from bottle import route, run, static_file
from os import path as op

templates = op.dirname(op.abspath(__file__)) + '/templates/'

@route('/static/:path#.+#', name='static')
def static(path):
    return static_file(path, root='static')

blog.jade

blog.jadeのテンプレも付属のdist/index.htmlを基準に大幅に記述量を増やしました。

doctype html(lang='jp')
head
    meta(charset='utf-8')  
    title Blog Post test
    meta(name='viewport', content='width=device-width, initial-scale=1.0')
    // Loading Bootstrap
    link(href='/static/css/vendor/bootstrap/css/bootstrap.min.css', rel='stylesheet')
    // Loading Flat UI
    link(href='/static/css/flat-ui.min.css', rel='stylesheet')
    link(rel='shortcut icon', href='img/favicon.ico')
    // HTML5 shim, for IE6-8 support of HTML5 elements. All other JS at the end of file.
    //if lt IE 9
      script(src='/staic/js/vendor/html5shiv.js')
      script(src='/static/js/vendor/respond.min.js')
  body
    .container
      h1 blog posts
      p #{body[0]}
      hr
      
      form(action="/blog" method="post")   
        .form-group
          input.form-control(type='text',name='body', placeholder="Input your blog contents")
        .form-group
          input(type="submit" class="btn btn-primary")
          
    // jQuery (necessary for Flat UI's JavaScript plugins)
    script(src='/static/js/vendor/jquery.min.js')
    // Include all compiled plugins (below), or include individual files as needed
    script(src='/static/js/flat-ui.min.js')

見え方

前の殺風景な奴から大幅に見栄えがするようになりました。やったぜ。
f:id:shuzo_kino:20160920195012p:plain