2015年1月5日月曜日

LEDアレイを波打たたせた



上の動画、音量注意っす。調節する方法がわからんw

各色LEDが一列に並んだモジュールを電子工作仲間のOさんから頂戴しました。どうもありがとうございます。

LEDとデジタル時計が三度の飯より好きな私なので、さっそくLチカしてみました。ただ、普通に点滅させても面白くないので、ウェーブしてみます。でもウェーブさせるにはPWMが必要ですが、いただいたのは12bit分、Arduino unoのPWMは6chしかありません。

ので、ソフト的に処理しました。一番内側のループphaseの値を0〜31まで変化させ、sinテーブルの値がその値よりも大きければ点灯、小さければ消灯させます。sinテーブルから拾ってくる位置をピンごと(i*3)に、また時間の経過(offset)ごとにずらしていけば、こんな具合いにうねうね動きます。モジュールの端にGND端子があり、1枚はArduino unoの13ピン隣にあるGNDに、もう1枚のGNDは7ピンに接続してLOWを出力しています。

だいたいPWMとしての基本クロックは70hzぐらい、肉眼で見ている分にはあまりフリッカは感じないですが、目をすっと動かすと点滅が軌跡となって見えますねぇ。


以下ソースです。
const int p01 = 13;
const int p02 = 12;
const int p03 = 11;
const int p04 = 10;
const int p05 =  9;
const int p06 =  8;
const int p07 =  6;
const int p08 =  5;
const int p09 =  4;
const int p10 =  3;
const int p11 =  2;
const int p12 =  1;
 
const int pGnd = 7; 
const int pins[] = {p01, p02, p03, p04, p05, p06, p07, p08, p09, p10, p11, p12};
const int nPins = sizeof(pins) / sizeof(int);
const int nSin = 32;
 
int iSin[nSin]; 
void setup() {
  pinMode(pGnd, OUTPUT);
  digitalWrite(pGnd, LOW);

  for (int i = 0; i < nPins; i++) {
    pinMode(pins[i], OUTPUT);
    digitalWrite(pins[i], LOW);
  }

  int half = nSin / 2;
  for (int i = 0; i< nSin; i++) {
    float d = (float)i / (float)nSin * 2.0 * 3.14159265;
    iSin[i] = sin(d) * half + half + 2;
  }
}

int phase = 0;
int outer = 0;
int offset = 0;

void loop() {

  for (int i = 0; i < nPins; i++) {
    int output = iSin[(i*3 + offset) % nSin] /2;
    int lowHigh = (output > phase) ? 1 : 0;
    digitalWrite(pins[i], lowHigh);
  }

  phase++;
  if (phase >= nSin) {
    phase = 0;
 
    outer++;
    if (outer > 2) {
      outer = 0;
   
      offset++;
      if (offset >= nSin) {
        offset = 0;
      }
    }
  }
}

2015年1月4日日曜日

PlayとD3とBeaglebone



会社でのお仕事として年明けからPlay+Spring+Emberを使ってサイトを1つ立ち上げることになっているのですが、どれもチュートリアルをなぞった程度で本格的に使ったことありません。しかし:

  • 休み中はしっかり休みたい。
  • でも勉強しておかないと死ぬのは確実。
  • でも休み中は電子工作方面に浸りきりたい

ので、この3つを満たすために「Beagleboneで収集したデータをPlay! frameworkで書いたHeroku鯖へ送り、グラフ化して表示」ってやつを作ろうと思います。visualizeには同僚さんに教えてもらったD3jsというフレームワークのグラフがあまりにもきれいなので、それ使います。EmberとSpringのことはとりあえず忘れます。

■動作フロー■

基本的にこんな動き。まずセンサ〜収集系:
  1. Beaglebone Black Rev.c上でPIRセンサーを読み取り人の動きを検出
  2. 検出した結果は1分あたり動いた秒数として出力し、Heroku鯖へ送る
  3. Heroku上で動くアプリはWeb APIとしてデータを受信する。
  4. 受信したデータはHerokuのPostgreSQL上にリングバッファ的に保存(Herokuのポスグレは10k行まで無料で使えるので)。
続いてデータ表示系:
  1. ブラウザからのリクエストを受けてHTMLを返す
  2. HTML上でD3.jsがHerokuへデータをリクエスト、Jsonで返す
  3. D3.jsがグラフを描画
D3.jsはデータ形式も多彩でcsv, tsv, json, xmlなど思いつくものはだいたい入ってます。

■予備実験■

BBB+PIRセンサーは現在絶賛安定稼働中なので、未体験要素としてD3jsでのグラフ生成を試してみます。棒グラフを出すだけならChart.jsの方が圧倒的に簡単なのですが、もうね、表現力が圧倒的すぎるのですよD3様は(そこまで使いこなせるかどうかは別の話)。

ということで、まずチュートリアルからサンプルソースをコピペ。こんな立派なグラフがこれだけで?と思うぐらいソース短い。

■Play 2.3.7■

しばらく自宅MacでPlayをいじっていなかったら、ターミナルでactivatorとタイプしてもエラーになってしまう。のでbrewでアンインストール&インストール(安易だ)。
brew uninstall typesafe-activator
brew install typesafe-activator
で、プロジェクトを作る:
activator new ShowSensors
起動後、play-java templateを選択。戻ってきたらactivator uiを起動
cd ShowSensors
activator ui
しばらくしてブラウザ上にIDEが開く。最近ブラウザIDEが流行ってますねぇ。ただ、エディタがタブ対応でないならviの方がマシだし、何よりcompile/runがうまくいかないので今回も利用を見合わせます。Play2の場合、Eclipseを使うメリットがあんまり感じられないのでsublime text2使います。ctrl+cで終了し、
activator run
ビルドその他のメッセージがおとなしくなったところでブラウザで localhost:9000 を開けばいつものページ、緑色の「Your new application is ready」のメッセージがお出迎えしてくれます。

■ヘンなエラー■

ひと通り実装をしたところで試すとこんなエラーが:

[error] play - Cannot invoke the action, eventually got an error: java.lang.RuntimeException: Error getting BeanDescriptor for path User from models.User
ググってもどうもピンと来ない。何となくEbean系の間違いのようなので、
  • とりあえず@OneToMany / @ManyToOneなどを消して見る
  • とりあえずactivator clean / activator updateなどを試す

などやってみたのですが、ダメ。その後、トレースしてみると、
User user = find.fetch("user").where() .eq("email", inEmail) .findUnique();
ここで落ちてました。そりゃそうだ。ここを
User user = User.fetch().where() .eq("email", inEmail) .findUnique();
に変えたら通りました。先にUserの生成と検索についてのtestを書いてりゃ容易に切り分けが出来ていたケースですね…反省(@元日)。

■で、Web API■

フツーにRoutesにURIとコントローラを書いて、
GET /fetchFromHours controllers.Application.fetchFromHoursGet()
コントローラでdbからデータをfetchし(仮にarrayDataとする)、最後に return ok(Json.toJson(arrayData)); と書けばOKです。以下は過去24時間の計測データを返すAPIの処理:
// curl --header "Content-type: application/json" --request GET http://localhost:9000/fetchFromHours
public static Result fetchFromHoursGet(String inEmail) {
User owner = User.findByEmail(inEmail);
Calendar calFrom = Calendar.getInstance();
calFrom.setTime(new Date());
calFrom.add(Calendar.HOUR_OF_DAY, -24);
calFrom.set(Calendar.MILLISECOND, 0);
Integer hours = 24;
List<SensorData> sds = SensorData
                       .findByUserSinceDateForHours(owner, calFrom, hours);
if (sds == null || sds.size() == 0) {
return badRequest("no data found");
}
List<SensorDataRest> sdr = new ArrayList<SensorDataRest>();
for (SensorData sd : sds) {
sdr.add(new SensorDataRest(sd));
}
return ok(Json.toJson(sdr));
}

■Macにポスグレをインストールして起動■

brew install postgresql
initdb /usr/local/var/postgres -E utf8
postgres -D /usr/local/var/postgres &
これで
psql -l
とやってデータベース一覧(初期状態の設定テーブルが2-3個あるはず)が見えればOK

■Web APIでURLパラメータを渡すには■

今回は使いませんでしたが、http://.........../apiName?name=kura&email=foo@bar.comという処理をしたい場合には、routesに
GET /apiName  controllers.Application.api(name:String, email:String)
と書き、ソースに
public static Results api(String inName, String inEmail) {
....
}
と書けばOKです。routesにはパラメータが省略された時の値を指定することも可能で
GET /apiName controllers.Application.api(name:String ?="kura", email:String ?="tare@panda.com")
と書きます。RESTfulな書き方については簡単に見つかるんですが?と&でパラメータを渡す方法がなかなか見つからなかったのでメモしておきます。

■Heroku上のpostgreSQLへ接続■

まずHeroku上のpostgreSQLを有効にします。

すると、URLやid, passwordなどが通知されますので、それに基づいてapplication.confを書き換えてdatabaseをH2からpostgreSQLに変更し

build.sbtにpostgreSQLのドライバを追加します。
libraryDependencies ++= Seq(
  javaJdbc,
  javaEbean,
  cache,
  javaWs,
  "com.fasterxml.jackson.core" % "jackson-databind" % "2.4.4",
  "com.fasterxml.jackson.core" % "jackson-annotations" % "2.4.4"
,
  "postgresql" % "postgresql" % "9.1-901-1.jdbc4"

)
ま、上の設定が決まるまで一発では動いてはくれなかったんですが…その辺は末尾の「ハマりリスト」をご笑覧くださいorz

■Herokuへdeploy■

これはもうここに書いてあるそのまんまです。
  Heroku へのデプロイ(playframework.com)
便利になったものです…初回はdependencyのチェックでエラい時間かかるけど、待ってりゃ終わります。終わったところで

で、以下の様な表示が出ればOK
koichi$ heroku ps
=== web (1X): `target/universal/stage/bin/showsensors -Dhttp.port=$PORT`
web.1:
up 2015/01/04 08:36:10 (~ 2s ago)

大事なのはここのupってところ。これがcrushedだとデプロイor起動に失敗したということ。もう見飽きるほど見ましたよ…ええ…。

■BoneScript変更■

テストではcsvに書き出すだけでしたが、コードを追加しました。まずpayloadを作って
var body = JSON.stringify({
    date:  sDate,
    count: sCount,
    email: "kkurahashi@me.com"
});
POSTします。
var request = new http.ClientRequest({
    hostname: "ホスト名",
    port: 80,
    path: "/receive",
    method: "POST",
    headers: {
        "Content-Type": "application/json",
        "Content-Length": Buffer.byteLength(body)
    }
});
request.write(body);
request.end();
通常のPlayアプリだとポートは9000ですが、Herokuにデプロイすると特に設定しなくても80でつながります。他にエラー処理もあるけど、あとでGithubに上げるのでそっちをご覧くださいませ。

■できあがり■

8:48はトイレに行ってた

■今後■

上記は生データ表示なので24時間収集すると表示が細かすぎます。これを5分か15分にサマライズします。あとはローカルとリモートのPostgresをdev/deployで自動的に切り替わるような設定も組み込まないといけません。ぽすぐれと接続できないでウロウロしてた時にその辺の設定は全部後回しにしてしまい、現状はapplication.confを手動で切り替えておりますw

それからソースを掃除してからGithubでプロジェクトを公開します。まぁ今度の週末にでも。

そして以下は今回の作業でハマった箇所です。改めて見直すと…我ながら…アホです。でも失敗して覚える…というか失敗しないと学習しないタイプなので、とっても勉強になりました。正月休みはウォーキングにも行かないでこればっかりやってたせいで3kg太ってけども。

餅は危険です。

■ハマりリスト■

  • テストが作動しない
    • せっかくテストコードを書いたのに activator test を実行しても新しいテストコードが認識されないことがある。そういう場合には、activator cleanを実行すると直る。もしダメなら一度activatorからexitして(もし起動していれば)Eclipseを終了させ、activator cleanを実行してから再度activatorに戻ってtestを試してみる。
    • 全般的にソースを追加した場合にはcleanするかactivatorを一度終了した方がいいかもしれない。また、application.confやsbt関連ファイルを弄った場合にはactivatorを終了/再起動しないとダメっぽい。
    • あと、activatorを起動しっぱなしで半日作業したら「メモリが足りない」ってエラーが出たことがありました。Eclipseばかりではなく、たまにはコンソールも見ましょう。
  • @Constraints.Requiredが機能しない
    • Ebeanでは @NotNull を使うorz
  • @ManyToOne(fetch=FetchType.EAGER)が効かない
    • objをfetchしてきた時、obj.toOneには値が入っているけどobj.toOne.someとやるとnullになってしまう。toOneをprivateに変更し、getter/setterを設けることで解決。
    • StackOverflowには「Play!のバグじゃね?」って意見もあるけど、どーなんでしょうね。
  • 複数項目を対象にしたunique属性
    • @Entityの後に @Table(uniqueConstraints = @UniqueConstraint(name="制約につける名前", columnNames = { "attr1", "attr2" })) ...とカラム名を列挙する。
    • なお、java上のattribute名ではなくdb上のカラム名なので、対象となるattributeには@Columnでカラム名を指定するか、Evolution表示で出てくるカラム名を使うこと。
  • PostgreSQLと接続できない
    • application.confでのURI書式が違ってたorz
      db.default.driver=org.postgresql.Driver
      db.default.url="jdbc:postgresql://localhost:5432/データベース名"
      db.default.user=ユーザ名
      db.default.password=パスワード
  • PostgreSQLでテーブルができない
    • userというテーブル名は予約語なので作れませんorz
    • クラス名を変更するか、@Table(name="users")を追加してテーブル名を変更する。
  • その後、UserをUsersに変更したけど、evolutionで生成されるSQLが古いままでcleanなどをやってもcreate userのまま
    • 中途半端なところでevolutionが止まったため、管理テーブルplay_evolutionsだけがpostgreSQL上に出来ていたのが原因っぽい。
    • ので、drop databaseでまるごと削除したら動いた。
  • 以下、Herokuへデプロイできた後の話
  • コンソールやpsqlで見るとデータがあるのにAPIでfetchできない
    • Herokuがアメリカ時間だったため。以下の記事を参考にして、JSTに変更したら治った。インスタンスの再起動も不要でした。
    • http://blog.ruedap.com/2011/02/10/heroku-timezone-japan-jst
    • コマンドラインで heroku config:add TZ=Asia/Tokyo

2014年12月31日水曜日

「勉強のあかり」のLEDスタンド

8x8 スペクトルアナライザw

節電でシーリングライトを電球形蛍光灯一個に交換して生きてきましたが、どうにも手元が暗いのでパナソニックの「勉強のあかり」仕様LEDスタンドを買ってみました。スタンドの土台がデカいと邪魔なのでクランプ式、発光部分が小さいと影ができやすいので大きいのを選んだのですが…組み立ててみたら想像以上にデカかったw クランプと本体は分離できるので、先にクランプを机に取り付けるだけ。昔使ってたクランプ式は一体型で重心が上にあったので苦労したっけなぁ…。





このところ本が読みにくいし頭に入らなくて、まぁ老眼だし脳ミソもダメだからしょうがないなと思っていたのですが…このLEDスタンドだとやたら読みやすい。今までページ上のコントラストが低くて文字認識で精一杯だったのが、読みやすくなったことで学習とか記憶に脳ミソを回せるようになったのでせうかw

もちろんハンダ付け作業も楽。発光部分が横に長く拡散板を使っているので、いわゆる多重影ができないし、演色性も高いので透明ブレッドボードとスズメッキ線が見分けにくいとか、溶けたハンダがキラっと光る瞬間を見逃すこともない。

と、読書用作業用でも十分満足してたんですが、写真も何だかスッキリ写ります。やっぱ演色性って大事だな…としみじみ思う。

まぁ…Macの汚れもくっきり写っちゃっているんですけどね…。

2014年12月29日月曜日

Play javaでjson-simpleを使う

休み中にずっしり伸し掛かる課題

今お勉強を兼ねて、趣味でHeroku+Play+D3.jsでアプリを書いているのですが、プロジェクトにjson-simpleを組み込めなくてハマりました。

最初にplugins.sbtに
    addSbtPlugin("com.googlecode.json-simple" % "json-simple" % "1.1.1")
を追加して not found。次に同じくplugins.sbtの上記行の前に
    resolvers += "maven repository" at "http://central.maven.org/maven2/"
を追加してもダメ。URLを色々変えてもダメ。

一晩寝て、間違いに気がついた。plugins.sbtじゃなくてbuild.sbtのLibraryDependenciesに追加してみたら、ようやく動きました。

ちゃんと寝ないとダメよねorz

libraryDependencies ++= Seq(
  javaJdbc,
  javaEbean,
  cache,
  javaWs,
  "com.googlecode.json-simple" % "json-simple" % "1.1.1"
)

さて、あと2日出社して冬休みだ(1月6日まで…ジャンケンで負けて後半組)。

2014年12月5日金曜日

Play! Framework 2.0 -> 2.3

というわけで、担当プロジェクトはPlay! Framework 2.3(Java)を使うことに決まりました。どうせならScalaの方が良かったんですが、「社内リソースがない」ということで。そりゃそうだ。

で、自分の知識をScala->Javaに切り替えなければならないので、適当な記事を参考にひと通り学習しなおして見ることに。いやー…びっくりするほど忘れてた…。

記事はコレ。Play 2.0ベースで書かれています。手元の最新は2.3.4、1.2->2.0ほどではないものの、かなりの変更があって大変でした。連載開始2012年4月か…途中長い中断があって、待ち遠しかったのを覚えてます。


■EBean関連で右往左往■

ま、一言でいえば、コレです。中の人が「EBeanは開発止まってるから、やっぱ2.3からJPAに戻るわw」と言ったとか。

しかし記事はEBean前提だし、とりあえず「EBeanかJPAか」を自分なりに評価しないといかんので、とりあえずPlay 2.3でEBeanを使ってみることにしました。

で、最初から記事にそってサンプルを動かしていくと、まず連載第1回の2/3で止まります。コマンドがplayからactivatorに変わったからです。playとタイプする代わりにactivatorとタイプし、メニューで表示されるテンプレートで「5) play-java」を選びます。


次のハマりポイントは連載第2回の1/3、Parent.java。念のため、ものすごく蛇足ですが、app/modelsというフォルダを自分で作り、その下にParent.javaを作る必要があります。

で、Parent.javaを保存して実行するとcom.avaje.ebean.validationがないというエラーが出ます。で、「com.avaje.ebean.validation not found」なんてキーワードでググると、
ってのがヒットします。でも

  1. project/Build.scalaではなくplugins.sbtに変わっている
  2. plugins.sbtに追加しても変わらない→activator runをやり直さないと反映されない
  3. 「"org.avaje.ebeanorm" % "avaje-ebeanorm-api" % "3.1.1"」を追加してactivator runするとエラー

です。結果からいえば、エラーの出る
    import com.avaje.ebean.validation.NotNull;
をコメントアウトして、替わりに
    import play.data.validation.*;
とします。さらに、@NotNullアノテーションを@Constraints.Requiredにします。これで先に進めます。


そして(2/3)でChild.javaを作りParent.javaを修正しますが、Child.javaでは例によって
    //  import com.avaje.ebean.validation.NotNull;
をコメントアウトして
    import play.data.validation.*;
に変更し、Parent.javaには
    import java.util.List;

    import java.util.ArrayList;
    import javax.persistence.CascadeType;
    import javax.persistence.OneToMany;
を追加する必要があります(上2行はEBeanとは関係ないですが)。これでブラウザをリフレッシュするとコンパイルエラーはなくなるはずですが、実行時エラーが出ます。


これは正常です…まだApplication.javaを書き換えていないので。(3/3)の指示にしたがってapp/controllers/Application.javaを書き換え、ブラウザをリフレッシュすると:


はい、出来上がりです。ここまでをPlay 2.0で試した時は確か小一時間ぐらいだったと思うんですが、今回は試行錯誤の山に阻まれて半日潰れました。いやはや。

この後PostgreSQLへの対応についての記述がありますが、そこだけ飛ばして連載の最後まで試しましたが、特に問題はなかったはずです。

■フレームワークを修得する場合■

なお、頭いいヒトはそんなことしなくても覚えられると思うのですが…私は本気でフレームワークを覚えるときには、記事を見なくてもチュートリアルと同じものが作れるようになるまでを第一段階としています。さすがにサンプルデータまでは再現しないですが、記事を見ないでうろ覚えで試している段階では当然ミスをします。ミスを修正するためには原因を調べなくてはならず、これが基本的な操作を修得する上で大変役に立ちます。

記事にはミスった時の対応まで書いてないことが多い(というよりも一度最後までサンプルプロジェクトを作ってうまくいくことを確認し、記事を書きながら再度新しく作ったりします)のですが、実際に使うようになって一番困るのはソコですし、どうしても分からない場合には記事を辿っていけるので「こういう現象が出た時の原因は、コレ」というのが比較的短期間で身につけられます。実際の開発で使うような大きなプロジェクトで環境設定に起因するエラーが出るとホント突き止めるのが大変ですからねぇ。

で、基本的な操作が身についていると、その後はAPIを虱潰しに調べていく際などにも推測が効くようになります。

これに気づいたのは、WebObjectsのセミナーで何度も「Movies」というサンプルを作った経験からです。自分はさすがにミスをしないのですが、受講生のみなさんのミスを潰しているうちに、自然にトラブルシューティングが身につきます。

当時は「朝のウォームアップ」と称して、さすがに毎日ではないですが、朝一で「Movies」を作っていました。当時は意識していませんでしたが、これが私にとってはGTDでいうところの「朝一に消化できるタスクを用意する」ことだったのかな、と思ったり。

まぁ、それに気づいたので、最近朝一に簡単なタスクを片付けるようにしてウォームアップしてます。

もっとも、それでせっかく上がった調子も、朝礼が長いとしぼみきってしまうんですけどね…ホント、何とかならんかな…。他の部署の連絡事項を聞いている時間があったら、スクラムミーティングの方が良いと思うの。

2014年12月3日水曜日

赤外線LED/受光素子発見@部品沼

他に電解コンデンサ,CDS,タクトスイッチ

Arduinoとセットになったパーツセットに入っていたはずで、部品沼のどこかに沈んでいるのは間違いない。

ちょっと時間ができたので本気で探したら…プリント基板箱の底に沈んでいました。まぁ買っても数百円なんだけど、使ってあげないと可哀相だし(その発想がすでに廃人)。

これで今週末はBBB+Lircで遊べる。

Bitnamiわからん:SVN->GITへの移行


おにぎりケース。コンビニのは塩辛いのでヨメに作ってもらってます

以前、Amazon EC2 Linuxにインストールした環境で試した時には、アトラシアンさんの記事通り特に問題なく終わりました(ありがとうございました)。

で、今回、同僚さんから「どうもうまくいかない」と相談を受けました。聞いてみるとBitnami / GitLabとのこと。上に「問題なく終わった」と書きましたけど、その前には私も簡単さに惹かれてBitnamiを使っていて、その時は結局Migrationがうまく行かなくて諦めたんですよね。

ということで、今回、MacのParalles上でCentOSを走らせて、そこで同僚氏のSVNリポジトリを吸い上げて変換することに。

■うまく行った方法■

例によって先に成功した方法を書きます。

参考になった記事はこれ「git-svnでSVN→Gitへの移行をやってみたログ」。こちらの環境はCentOS、事前にGitは同僚氏と同じ19.0.0に、Svnは同僚氏より新しい17.x.xにしました。yum install gitで入ってた18.x.xがなかなか消えてくれなくて苦労したのはまた別の話。

作業用ディレクトリを作り、その中で記事の通り:

git svn clone -s --prefix=svn/ https://<サーバ>/<リポジトリ>/<プロジェクト>

ここでテストの時間を短縮しようと<プロジェクト>に "trunk"より下の階層を指定してみましたが、ダメでした。かなり時間がかかりましたが、作業用ディレクトリの下にリポジトリの複製が出来上がりました。もしエラーで途中で止まってしまう場合の注意は元記事に書いてあります(ここでは言及しません)。

続いて記事同様:

git branch -r

で、ブランチができていることを確認します。なお、git tagを使ってもタグは一個もできていません。次にブランチを移行します。記事に書いてあるスクリプトをそのままコピペして実行します。

# svn/trunk, svn/tags/*, svn/*@xxx を除いたリモートブランチを checkout
for BRANCH_NAME in $(git branch -r | grep -ve 'svn/tags\|svn/trunk\|.*@\d*' | sed -e 's:svn/::'); do
    git checkout -b "$BRANCH_NAME" "svn/$BRANCH_NAME"
done;

# この時点でループの最後のブランチになっているので一応 master に戻しておく
git checkout master

(記事より引用)。

viなどで上記テキストを checkout.sh のような名前のファイルとし、chmod +x checkout.shで実行可能にしてから ./checkout.sh で実行します。

続いて記事と同様

git remote add origin YOUR_GIT_REPOS_URL
git push -u origin --all

なのですが、その前に自分のhomeでリモートリポジトリのための鍵ペアを作り、リモートリポジトリに送ってやらなければなりません。

cd ~/.ssh
ssh-keygen -t rsa -C "mail@address"

ssh-keygenを実行するとパスフレーズを効いてきますが、省略します。また、ここで指定するメールアドレスは、リモートリポジトリのアカウントに使っているものを使います。

そうすると id_rsa と id_rsa.pub という2つのファイルが出来ます。このうち、id_rsaは秘密鍵なのでそのまま大切にしまっておきます。id_rsa.pubは英数字などから構成されるテキストファイルですが、これをコピペして、GitHubやGitLabのアカウント情報のProfile / SSH Keysに登録してやります。

話は戻って、git remoteなんたらを実行してもすぐにプロンプトに戻って来ます。ここで焦ってはいけません(私はいつも「あ、失敗した?」って焦ってしまうorz)。続く git push が本体です。しばらくしたら、例によって記事に書いてある通りに「タグの移行」を実行して作業のために付けた /svn/ プリフィックスを取ります。記事のスクリプト

for TAG_NAME in $(git branch -r | grep -e 'svn/tags' | grep -ve '.*@\d*' | sed -e 's:svn/tags/::'); do
    git tag "$TAG_NAME" "svn/tags/$TAG_NAME"
done
(記事より引用)。

を gittag.sh てな名前のテキストファイルにして実行権限を付けて(chmod +x gittag.sh)から実行(./gittag.sh)。最後に記事の通り:

git push origin --tags

これでリモートに終了後にリモートリポジトリを見るとめでたく移行が済んでいました。めでたしめでたし。

■失敗編■

当初、リモートのリソースが逼迫してたこともあって、

  1. ローカルにもSVN / GITを立てる。
  2. リモートのSVNからsvndumpしてローカルにコピーし、svnadmin load
  3. ローカルでSVNからGITに変換
  4. リモートGITにpush

…と思っていたのですが、何せデータが数十GBもあるためにdumpで挫折。

こんな面倒くさい方法を使ったのは、前回Bitnami環境でgit-svnがうまくいかなかったせいなのですが…念のため正攻法の git svn clone を試してみたら、動いてしまいました。

当たり前といえば当たり前なんですが…あつものに懲りてなますを吹くのはいけない、というお話でした。

■余談な失敗■

この記事冒頭のおにぎりケース、どこかに書いたけど「食洗機可」と書いてあることを確認して買ってきたのに、開けてみたらオカズとオニギリを仕切るゴムシートに「食洗機使わないでね♡」と書いてあった。詐欺だよな。でも梱包捨てちゃって返品できないし、ってんで外装だけ使ってます。おかず持っていくのも面倒くさいしね。

生協の味噌汁とご飯120gのヨメ製オニギリが最近の昼食、オヤツはソイ20g+Whey20gのプロテインっす。押忍。

2014年11月30日日曜日

小ねた

ウォーキング用ライト、自分で使ってみた。

小さなじわじわネタってことで最初「小じわ」にしたんだけど、とある年齢層の女性から不評を買いそうなので改題。

■Arduinoデジタル時計改良■

「夜中は時計なんか気にしないで寝ろ」ってことで、23-4時まではLEDの輝度を1/10に下げて時計と温度の表示も時計2秒+温度1秒の繰り返しに変更。

高齢者たる私は夜中にふと目覚めた時に時計を見て「ああ2時か。もうひと寝入りしよう」と考えただけで目が覚めてしまうので、「時計を見る→暗い→寝直す」というフローにすれば改善するのではないかと。

■リチウムポリマーバッテリーの端子を固定■

某デバイスのリチウムポリマーバッテリー端子は1.27mmしか離れておらず、もし断線してショートしようものなら大炎上を免れない。ソレが怖くて今までまじめに使っていなかったんだけど…大掃除の準備をしていたらホットグルーガンが出てきたので、早速端子を固めてみた。まぁ絶対大丈夫ってことはないけれど、とりあえず取り回し→金属疲労→断線→短絡→炎上…という路線は防げるかな。

しかし、まだ、使い道を思いつかない。組み込まれているファームが条件設定などのできない単なるBLE中継ソフトで、例えば「離れたらLEDを点灯する」という当初目論んでいた処理に使えないため。ファームを消して「リチウムポリマーバッテリー付属切手サイズのnRFボード」として使おうにも端子が小さすぎて私には無理orz

さて、どうしたもんか。

■乱視用時計を再設計■

以前も書きましたが、私は「プロトタイプが機能を満たしてしまうと、そのまま使い続けてしまって製品化(笑)へ進まない」という悪癖がありまして。

乱視用時計もその1つなんですが…さすがに年が開けてしまうのはイカンと思うので、プリント基板の設計始めました。いやー、部品ライブラリが揃っているとEagleってホント快適に作業が進みますw まぁ「コマンドを選んでから操作する」というイカニモCADっていうUIへの違和感は未だ消えないのですが、とりあえず慣れた。

このまま1週間ほど寝かせておいて、来週あたりElecrowに発注しようと思います。

■読書灯ボードの変更■

ボードを設計した時、「LEDを2セットつなげられれば、電球色と昼白色LEDを組み合わせて色温度を調節できるな」と考えていたんですが、結局昼白色しか使ってません。本が読みやすいので。

ただ、よーく考えたら3本あればRGBが可能になり色の調整がものすごく幅広くなります。

ということでドライブをもう1系統増やそう…と思ったのですが:


…見事に隙間がありません。前回発注したボードはスカスカだったんですが、その後、RTCとバックアップ用の電池スペースを追加したもんで。左上のスペースはバッテリ、右下はDCジャック用です。RTCとDCジャックは秋月の変換基板対応。RTCはSMDチップが小さすぎてハンダ付けする自信ないっす。

となれば、あとはDCジャックを何とかしないといけないですね。先日、「電子工作部」で普通の丸穴で使えるDCジャックを教えていただいたので、ソレを手に入れて何とかしないと。

というわけで、今度はこれが先送りの言い訳に…あああああ。

少しはアンジェリカたんの豪腕っぷりを見習わないといかん。

楽園追放、面白かった。

いや、無理だけど。

2014年11月28日金曜日

転職して二ヶ月経過

ようやく落ち着いてきたので、ぼちぼちブログ再開します。

とりあえず、やりたいことが溜まりすぎてどこから手を付けて良いのかわからないですが、何よりも先に部品沼の整理と某Salesforce Chatter対応アプリのSwift版を早いとこリリースしないと。

タイムテーブル的には、審査があるから先にiPhoneアプリを仕上げて、それから部品沼かな。

そんなこんなで、よろしくお願いします。

2014年10月26日日曜日

読書灯:ミスった 組み立てた 動いた

しかし、デカいな>28pin 600mil幅

先日オーダーした基板、設計のミスで一部のグラウンドが配線されておりませんでした。部品をハンダ付けした後のチェックで発覚。三端子レギュレータから電圧出てなくて調べてみたら三端子は正常、外部センサー用のGNDが宙ぶらりんになっていました。

うーん、GNDクラスに設定してあるし、チェックでもエラー出なかったんですが…とEagleの自動配線頼りきりなのがバレバレな話。ジャンパ一本で済む話ですが、良い教訓になりました…。

元はこんな状態(この他にCL6807用のサブ基盤)だったのですが、だいぶすっきりしました。
下にあるのは「カンパチ」

ブレッドボード上でいろいろ改良していこうと思って作ったものなんですが、一発目でかなりいい感じに動いてしまい、いつもの「動いてるんだから、いーんじゃねーのーw」病が出てしまいました。UIとしてPIRと距離センサを付けて、当初シリーズの定電流回路だったものをCL6807に変えたりはしましたが。

さて、「製品」が出来上がればブレッドボードはお役御免です。どうもモノに思い入れしてしまうタチなので、バラす前につい手を合わせてしまったり。

短い間だったけど、お疲れ様。


余談ですが、一度使った抵抗、1個1円なので、作業に要する時間を考えたら捨てた方が効率良いのはわかってます。でも、もったいなよね。