osa2's memo

自分の記憶のために・・・。

自宅のリモコンのリメイク(1)

冬に作った部屋の照明&エアコンのリモコンを作りなおすことに。冬に作ったから暖房のデータしかサンプリングしてないのですよ(笑)

まぁせっかく作り直すので、アーキテクチャから見直しをかけて、将来のために、無駄に(今は)要らないツールも使っているのでなかなか肝心の冷房機能が実装できてないのですけど・・。

1. ハードウェアアーキテクチャの変更

これまではESP-WROOM-02(以下ESPrIR)という3cm✕4cmくらいのWiFi+IR(赤外線LED)のみで、リモコンを作っていた。WEBページで利用可能にしたが、何のことはない、80番ポートでソケット開いて、処理結果をHTMLで(HTMLで!)返していたのだった。

1つで家の中全体に赤外線を飛ばせるならこれでも不自由はない。が、小さな部屋と言えど、1つでは無理。2つは要る。他に赤外線でなくてもコントロールしたいものが増えるかもしれない。

なので司令塔として、部屋に転がっていたRaspberry Pi 2 B+(以下RPi)を使うことにして、WEBのレンダリングもRPiにやらせる。まずRPiがUIからのリクエストを受けて、各子機(今回はまだESPrIR1機のみ)にリクエストを投げる。親機と子機の間もHTTPだが、ここはJSONかCSONでやり取りすることにして、まぁ、RESTful風にする。

2. ソフトウェアの変更

WEBのUIレンダリングには(別の案件で使いたいと思っている)Vue.jsを使用した。RPiのWEBサーバーはNginxにしたが、単に好み。実際に子機との通信部分をCGIでやらせても良いのですが(笑)、せっかくなので、これも別案件で使いたいと思っていたPython、その軽量フレームワークのFlaskを使ってみることにした。

というわけで、UI(HTML,CSS,JS,Vue.js)、サーバー(Nginx+Python+Flask)という、、実はindex.html1枚とCGIで済むところに、無駄にふんだんに仕掛けを投入(笑)。ちなみに別案件はビジネス向けのWEBシステム(のプロトタイプ)で、MySQLという名のMariaDBとMroonga、MongoDB辺りを使うのと、Rや,Cともバインドがあるのではと思われるので、ららべるに後ろ髪引かれながらもPHPではなく、グルー言語の誉れ高いPython、なのでした。

3. しかし、この組み合わせは・・・(笑)

なんと、Flaskのテンプレートエンジン(Jinja2)でのサーバーサイドレンダリングと、Vue.jsでのHTMLへのデータインジェクションの「ノテーションが同じ」という軽いワナがあることが判り。やってみるもんですね。超ざっくり書くと、

<h1>{{ greeting }}</h1>

と書いて、これがVue.jsのため、と思っていても、Flask側でこのHTMLファイルをtemplatesフォルダに入れて、render_template(xxxx.html)とすると、greetingが定義されとらん! とTrace吐かれるのデス。

ま、SPAで行くならサーバーサイドレンダリングなどせずに、staticから諸々ファイルをまんま読み込んで、あとはAJAXでのリクエスト処理だけ Flaskにやらす、でいいや、というところで今日は終わり。

4. ちなみに

つまらないものですが、UIイメージだけ出来とります。ペタっ。

f:id:osa2:20180415232809j:plain

== END ==

 

 

 

リパーティション、REPARTITION♪

久々にスマホのリパーティションしたのですが、以前やったのにすっかりやり方忘れてましたので、メモです。

ご注意:やり方にもよりますが、基本的に、データが吹っ飛びます。パーティションを再構成するのだから当然ですよね?ということで、何が起きるのか、何をしたいのか分からない人は、真似しないでくださいね(リンク先やダンロード先の安全性も自己責任でお願いします)。

1. パーティション書き換えツール "parted"

旧型AndroidではARM(32bit)のバイナリが必要です。自分でクロスコンパイルしてもいいけど、ここから落としました。

iwf1.com

2. 潰し方と作り方

ココが参考になります。

forum.xda-developers.com

基本的には、fdiskとpartedで確認しながら潰し、確認しながら作って、お名前つけていきます。

パーティション一覧の見方

 # fdisk -l /dev/block/mmcblk0

パーティションの潰し方

 # ./parted /dev/block/mmcblk0 rm <パーティション番号>

パーティションの作り方

 # ./parted /dev/block/mmcblk0 mkpart primary <開始セクタ>s <終了セクタ>s

パーティションへの名前付け

 # ./parted /dev/block/mmcblk0 name <パーティション番号> <名前>

3.気をつけること

ま、これをやりたいのはsystem(factoryfs)パーティションが足りないとき。よく隣にuserdataパーティションがあるので境目をずらす感じですね。

== END ==

 

AndroidにErlang/OTPとElixirを仕込んでみた

忘れないうちに作業メモ。

Erlang/OTPのビルドと配置

基本的にはこの手順が正だとは思う。

otp/INSTALL-ANDROID.md at master · erlang/otp · GitHub

一番参考になったのは、この手順。

Building Erlang for Android

あとでこの2つの手順をベースに書き直すつもり。ソースのバージョンは20.2.2を使用した。

Elixirのビルドと配置

2つ目の手順で概ね問題なかったが、Elixirの導入でハマる。原因は、ソースをビルドしないまま配置していた!elixir.beamがなかったので、elixirやiexを使っても、呼ばれたerl(Erlang/OTP)が中でcrashしていた。

Elixirのソースはここから。

GitHub - elixir-lang/elixir: Elixir is a dynamic, functional language designed for building scalable and maintainable applications

手順はほとんどなく、git cloneした後、チェックアウト(v1.5のHEAD。v1.6はまだRC1だったので)。

で、make clean test をする。これをしてなかった。

あとはAndroidに突っ込んでパス通すくらい。スクリプトの先頭行(#!/bin/sh)がAndroidでは微妙に違う。

余談

Erlang/OTPはあまりビルドで手こずらなかった(node.jaの方が難しかった気がする)。

CordovaとElmでのapk作成はできたので、あとはElmからどーやってElixir/Erlangを叩くか。全部通ると、Androidアプリを最新のリアクティブな言語で作れるのでは?まぁ、WebViewでできる範囲のことだけですけどね。

で、Erlang/OTPからLinuxをコールできれば・・というようなことをすると、Googleが圧力をかけてくるのかこないのか、この辺りの話はとにかく情報の量が少ない。

== END ==

LPC1768からHelloを打ち込んでみた

明けました。特に何もないです。何がめでたいのかもよくわからない。

で、人とは楽な方へと流れるもので(笑)最初に手を付けたのはLPC1768(以下mbed)。といっても昨日、珍しくハンダ付けが調子よく(決め手は老眼鏡!)、転がっていたmbed用のEthernetパーツを作り上げて接続。

f:id:osa2:20180101090027p:plain

しかし、シリアルをつないでないので、つながったかどうかがわからない。それならと、つないだついでにHTTPサーバーにPOSTを投げるところまでやってみた。途中、諸々、省略(笑)最後の方に参考にしたサイトをメモっておく。

mbedのコード。

// main.cpp
#include "mbed.h"
#include "EthernetInterface.h"

EthernetInterface net;

int main() {
    net.set_dhcp(false);
    net.set_network("192.168.1.101","255.255.255.0","192.168.10.1");
    net.connect();

    TCPSocket socket;
    socket.open(&net);
    socket.connect("192.168.1.100", 80);

    char sbuffer[] = "POST /cgi-bin/hello.py HTTP/1.1\r\nHost: 192.168.1.100\r\nContent-Type: application/x-www-form-urlencoded\r\nContent-Length: 19\r\n\r\nurname=Mbed_LPC1768\r\n\r\n";
    int scount = socket.send(sbuffer, sizeof sbuffer);

    socket.close();
    net.disconnect();
}

結果(mbedをリセットすると接続→POSTリクエスト送信となる)。

f:id:osa2:20180101090345p:plain

 ま、これであとはセンサでも付けて情報をPOSTすればいいのかな、と。たぶん、Mbed Device Connectorのような、コントロール用のホストを中に立てた方が良さそう。手許には可視光の光センサがある(何故あるのかが不明。)のだが、いかんせんこの子、Wiredなので何処にも連れていけない。いまそこで引っかかっている。なんかWiFiっぽい部品も転がってるんだけど・・・めんどうい。

参考にさせていただいたサイト:

まだ、Hello! の世界。いつもこればっかり(笑)

冬休みの自由研究(笑)

7日間の休みのうち、既に2日過ぎましたが。(^-^;

ようやく、あと5日で何しようかなんとなくまとまってきたのでメモ。

  1. Elm(+Cordova?)でのAndroidプリプロトづくり
  2. Elixir(&Erlang VM)のARMビルドでのアプリサーバーサイドのPOC
  3. mbed OS 5.2のトライアル(LPC1768があるので)。

まぁ1,2で時間切れな気がする。(^-^;

Elm : http://elm-lang.org/

Elixir : http://elixir-lang.github.io/

 

やっとフォントを変えることができた(2018/1/7更新)

Elephone C1max の中華フォントを国産フォントにやっと置き換えられました。

自分のメモですので、以下のリンクで再実行可能。

2018/1/7更新:
別筐体で試したら、SuperSUの導入で「空振り」があったので、その部分を再確認、以下の記述も更新。

以下、十分ご理解いただいた方以外は、絶対に真似しないでください。けっこうザックリ書いてますので、立ち往生すると端末が使えなくなります。また順調に行ったとしても既存のデータは全て消えてしまいます。

Stock ROMの用意:

以下がElephoneの公式サイトとなる。Support → Downloadsで、いくつかの機種が表示される中に、C1maxもある。焼き込みのツール(FlashTool)とVCOMのドライバーもある(なんて親切)。試行錯誤で失敗してもこれでリカバリ可能。カスタムRecoveryの修正にも必要。

www.elephone.hk

ImageKitchenの準備:

カスタムのTWRPイメージをそのまま焼いても簡単にはTWRPが立ち上がらない。このため、ImageKitchenというツールでrecovery.imgをunpack, 修正, repackする。

forum.xda-developers.com

TWRPの準備:

公式のTWRPサイトからはC1max用のイメージは提供されていない。C1MaxはMediatekのMT6737TというSoCで動作している。また、C1maxは初期の出荷時からNougatであり、上述のStock ROMもNougatのため、TWRPはバージョン3.1が必要(とWEBのどっかに書いてあった)。このため「TWRP MT6737T 3.1」で検索。今回は以下を利用している(他も試したらロシア語のTWRPが出来てしまい、操作に苦労した)。

forum.xda-developers.com

C1max用のrecovery.imgの作成:

上記のTWRP3.1はそのままfastbootで焼いても起動しない。以下の手順にて、Stock ROMの中にあるrecovery.imgの一部分をTWRPのrecovery.imgに取り込む(双方のrecovery.imgをunpackして、TWRP側を修正してrepack)。unpackするとMT6735とかあるが、Stock側も6735とあるので、気にしないで進める。

www.stupdroid.com

FastbootでのTWRP焼き込み:

C1maxの設定で開発者モードの中にOEM UnlockをEnableにするトグルがあるのでこれをEnabledにしておく。また、ファームウェアの自動更新も一応オフにしておく。fastbootモードには、adb reboot bootloaderでもいいし、電源オフ状態から電源ボタン+Volume UPで選択モードに入る(V-Upで選択肢変更、V-Downで選択可能)でもよい。oem unlock → flash recovery → oem lock で、reboot

注意点:flashした後、必ずlockし直すこと。unlockのままではブートループとなる

TWRPでのSuperSU焼き込み:

chainfire氏謹製の、SuperSUを焼き込む(直近では2.82がstableで2.85がbeta。SuperSU焼き込みは大きく2段階の処理。もし1段階のみだと「空振り」。2.82の方が確実な様子)。

また、焼き込む前に dataパーティションext4でフォーマットしておく。焼き込んだ後にcache, Dalvik cacheもクリアする。SuperSUの処理が2段階通ったようなら、RebootReboot Systemで再起動。

forum.xda-developers.com

フォントの変更:

起動後にSuperSUのアイコンがあるのを確認して、adb shell , suを行いシェルでrootで作業できることを確認する。Recoveryモードに戻り、/systemをrwでマウントして(TWRPでマウントするだけ)、以下のサイトの手順で、自分が使いたいフォントの配置と、fonts.xmlの書き換えを行う。Recoveryモードだと、/systemをRWでマウントできるから作業は楽。グループとパーミッションの変更を行う。

blog.hogehoge.com

TWRPからReboot Systemで、完了!

Stockが提供されたので、やっと気合い入れて調査、変更することができました。

== END ==

 

 

コンテナオブジェクトのgetter/setter

Kotlinを初歩の初歩から勉強中。

値の出し入れだけの getter, setterは書かなくて良い

(カスタムも書こうと思えば書ける)。

fun main(args: Array<String>) {
val bob = Person("Bob", false)
println(bob.name)
println(bob.isMarried)
bob.isMarried = true
println(bob.isMarried)
}

class Person (
val name: String,
var isMarried: Boolean
)

これね。Javaの世界では長らく(もしかすると今も)タブーですよね。勝手にフィールドの値を外から書き換えるな。「カプセル化」しているのだから。でも、データ運ぶだけのオブジェクトなんて、凝ったことしないから getter / setter なんてぜ~んぶパラメータの値のセットと取り出しのreturnだけ。Eclipseとかで自動生成でズラズラとgetter / setter 書けるけどバカバカしくて、最近はもうコンテナだと思えばフィールドは public にしていた。

どこの世界も、一度ドグマ的シキタリができあがっちゃうと、クロフネが来るまで駄目なんだろうな。。