2013/06/27

大ざっぱすぎる西暦→和暦変換。

適当ですが、西暦→和暦変換プログラムをPythonででっち上げました。

  • 明治、大正、昭和、平成のみ
  • 年号が変わる年の月の考慮なし
    (例:1989年途中まで 昭和64年 ですが、平成1年 と表示)

厳密な用途(誕生日計算など)には使えないです。

とりあえず平成があれば十分なのと、なんしか今は時間ないので。

2013/06/26

MacPorts で Python3.3を入れる

そろそろ重い腰を上げて、 Python 3.xx に移行することしました。

しかし、いっぺんに切り替えるのは怖いので、 virtualenv を使って Python2系 と Python3系 を同時に使えるようにしてみたいと思います。

また、今までメインで使っていた 2.7系は Python.org のインストーラ(.dmg)から入れたものでしたが、この際 MacPorts に統一したいと思います。

まずは、ココを参考に、今まで入っていた Python2.7系を消します。これは、 /Library/Frameworks/Python.framework/Versions/2.x に入っています。

次に port で Python を探します。

$sudo port -d
$port search python*
  :
python26 @2.6.8 (lang)
    An interpreted, object-oriented programming language

python27 @2.7.5 (lang)
    An interpreted, object-oriented programming language

python31 @3.1.5 (lang)
    An interpreted, object-oriented programming language

python32 @3.2.5 (lang)
    An interpreted, object-oriented programming language

python33 @3.3.2 (lang)
    An interpreted, object-oriented programming language
  :

たくさんありますが、今回は3.3と2.7を入れてみます。

$sudo port install python33 python27

$which python
/opt/local/bin/python

$python --version
Python 2.7.5

この状態では、2.7系が有効になっているようです。

つぎに virtualenv を入れます。

$sudo pip install virtualenv

では早速、3.3環境と2.7環境を作ってみます。

$cd ~/test/python
$mkdir env
$cd env
$virtualenv -p /opt/local/bin/python3.3 33
$virtualenv -p /opt/local/bin/python2.7 27

これで、~/test/python/env/ の中に 3.3環境と2.7環境ができました。

まずは 3.3環境を使ってみます。その環境のPythonを使うには、そのディレクトリのなかにある bin/activate を source します(って日本語?)。

$. ~/test/python/env/33/bin/activate
(33)~$python --version
Python 3.3.2

activateすると、プロンプトが変わります。

次に、もうひとつターミナルを開いて、2.7環境を使ってみます。

$. ~/test/python/env/27/bin/activate
(27)~$python --version
Python 2.7.5

このように、異なる環境のPythonを同時に走らせることができるので、バージョンやインストールされているパッケージの違いによる挙動の違いを比較する場合などは手軽に試すことができます。

Emacs で JSON を Flymake する

コマンドラインで使える JSON Lintのつづきです。

どうせなら Emacs で Flymake したいなぁという話しです。

JSON Lint 以外に必要な物は下記3つです。

それぞれダウンロードして、load-path の通ったところに置き、下記を .emacs に追加します。

(require 'json-mode)
(add-to-list 'auto-mode-alist '("\\.json$" . json-mode))

(require 'flymake-json)
(add-hook 'json-mode-hook 'flymake-json-load)

これで *.json を開くと、エラー行に色がつくようになります。

次のエラー行に飛ぶには M-x flymake-goto-next-error とします。

コマンドラインで使える JSON Lint

JSONの構文チェックツールとして JSON の Lint があります。

ウェブ上で簡単に検査できる JSONLint - The JSON Validator もありますが、機密製の高いデータの場合は使いたくありません。

JSONはプログラムではなくデータなので、出来ればこういう類のものはローカル環境で使いたいものです。

ローカル環境のコマンドラインで使えるものとして、その名もズバリ JSON Lint があります。

インストールは npm で一発です。

$sudo npm install jsonlint -g

下記は使用例です。

$cat test.json 
[{ "name":"吉田", "age":20, "drink":["ファンタ", "ビール"]},
 { "name":"田中", "age":21, "drink":["コーヒー" "コーラ"]},
 { "name":"佐野", "age":50, "drink":["日本酒", "焼酎"]}]

$jsonlint test.json
[Error: Parse error on line 2:
...21, "drink":["コーヒー" "コーラ"]}, { "name":"
-----------------------^
Expecting 'EOF', '}', ':', ',', ']', got 'STRING']

データに2バイト文字が含まれていると少し指摘箇所の桁がずれますが、エラー行は分かります。

2013/06/25

ちょこっと確認するとき用の shell モード

Emacs を使っている時にシェルを使いたいときは M-x shell とするのですが、今ひとつ使い勝手がよくありません。

少し億劫に感じてきたので、最近はこんなものを使っています。

ちょこっと確認したいときなどは、

  1. M-x term とたたく
  2. 下部に rebuilder っぽく小さいシェルウィンドウが開く
  3. ちょろっとコマンド入れて確認
  4. C-x k で抜ける

としています。抜けるときはシェルバッファとプロセスは毎回消します。

termというコマンド名には別のコマンドが割り付けられていますが、とりあえず気にしないということで…。

2013/06/21

一番簡単な Raspberry Pi 用SDカードの作り方

以前はRAWイメージをddコマンドで書き込んだり、専用のツールでSDカードを作っていましたが、今はもっと簡単な方法があるようです。

この方法は NOOB(New Out Of Box Software )という、初心者(newbie)向けのやり方のようですが、

  • 書き込みのためのツールは不要(ふつうのファイル操作でOK)
  • SDカードには複数のディストリのイメージが書き込まれる
  • Raspberry Pi を起動した後で、好みのディストリを選択してインストール

という特徴があります。4GB以上のSDカードならこちらのほうが早くて簡単かもしれません。

やり方は Windows / Mac / Linux どれも似たようなものですが、下記に Mac の例を書きます。

  1. 買ったばかりのSDカードはあらかじめ SD Formatter でフォーマットしておく
  2. ココ から NOOBS**.zip をダウンロード
    (torrentが使える場合はそっちの方が速い)
  3. zip を解凍
  4. 解凍したフォルダをFinderで開き、フォルダの中身を全て選択して、コピー
  5. SDカードのルートに貼り付け
  6. SDカードをイジェクトして、Raspberry Pi に挿し込む
  7. Raspberry Pi に HDMIケーブル と USBマウス か USBキーボードを挿して、電源を入れる
  8. インストールしたいディストリをマウスかキーボードで選ぶ
    (とくに好みがなければ、とりあえず Raspbian で)
  9. OSのインストールが始まるので数分待つ
  10. 確認ダイアログで OK を押す

この後、Raspberry Pi のオプション設定画面になりますが、起動確認だけなら何もせずに Finish を選ぶといいです。

するとコンソールに落ちるので、ここで

$startx

とでもすると X が起動します。

再起動するとインストールしたディストリで起動しますが、これ以降のログインは(ユーザを作っていない場合は)下記のデフォルトユーザが使えます。

  • Raspbian: User: pi, Pass: raspberry
  • Arch Linux: User: root, Pass: root
  • Pidora: User: root, Pass: raspberrypi

2013/06/19

メジャーモードごとに eval-region を切り替える

Python でもスクラッチバッファで対話したい のつづきです。

メジャーモードごとに eval-region を切り替えるようにしてみました。簡単な割に便利です。

これで、スクラッチバッファでもそうでなくても M-x eval-region すると、そのメジャーモードにふさわしい eval-region が呼び出され、リージョンの評価結果をプリントするようになります。…といっても、今のところ Python, Ruby, ELispだけですが。

各モード用の eval-region-xxx の関数定義は共通化すればシンプルになりそうですが、早すぎる最適化を招きそうなのでこのまま放置です。

Emacs Lisp の関数のすげ替え テスト

fset / setf と、とてもまぎらわしいので、備忘録的においておきます。

テストとして、挨拶文を表示するgreetingという関数を朝用と夜用にすげ替えてみます。

これでいいのか、今ひとつ自信ないです…。

摂氏 [°C] と 華氏 [°F] の変換グラフ

摂氏(Celsius) と 華氏(Fahrenheit) をグラフで表してみました。

グラフ作成ソフトの gnuplot で下記を実行するだけです。

$gnuplot
gnuplot> c2f(x)=(((9 / 5.0) * x) + 32)
gnuplot> plot c2f(x)
gnuplot> set grid
gnuplot> set xr[0:100]
gnuplot> set xl "Celsius [°C]"
gnuplot> set yl "Fahrenheit [°F]"
gnuplot> set xtics 5
gnuplot> set ytics 20
gnuplot> replot
gnuplot> set terminal png
Terminal type set to 'png'
Options are 'nocrop font "arial,12" fontscale 1.0 size 640,480 '
gnuplot> set out "c-f.png"
gnuplot> replot
gnuplot> quit

参考にさせてもらったサイト

2013/06/11

あるXtalをボーレート設定に使ったときの誤差を求める

部品屋でボーレート設定用の Xtal を探すときはこの式で事足ります。

しかし、手持ちのジャンク箱から適当なクリスタルやセラロックを引っ張りだしてボーレート設定に使いたいときなどは、できるだけ誤差の小さいものを選びたいものです。

手前味噌ですが、クリスタルの周波数と目的のボーレートをキーボードで入力して、誤差を求めるPythonプログラムを書きました。

$baud.py 
Xtal frequency [MHz]:1
baud rate [bps]:9600
--> err:0.16[%]

上の例では 1MHz のクリスタルを 9600pbs で使った場合の誤差を求めています。

ボーレート設定用クリスタルの周波数の見分け方

UARTのボーレート設定に使う Xtal の周波数は

周波数[Hz] / ボーレート[bps] = 整数

となるものを選ぶと、理論上の誤差が0となり精度が最も高くなります。

つまり Xtal の周波数を Hz に直してボーレートで割り切れたら、それは UART用のXtalと思っていいでしょう。

ただしマイコンの多くは分周比が固定されているので、その場合は更にその分周比(8, 16 など)でさらに割ってやります。

例えば、AVRで 7.3728MHz を 115200bps で使うとすると、AVRの分周比が16の場合では、

7372800 / 115200 / 16 = 4

と割り切れて整数となります。ですので、この周波数 7.3728MHz はUARTのボーレート設定用に使えるとわかります。

ボーレート設定用としてよく使われるものは、

 1.8432MHz
 3.6864MHz *
 7.3728MHz *
11.0593MHz *
14.7456MHz

などがあり、いずれも端数つきの周波数となります。

ノイズマージンやマイコンの動作スピードを考えると、5〜10MHz のものが使いやすいので、このリストの*印のあたりがいいかもしれません。

ちなみに、よく見かける端数つきの周波数 3.58MHz(3.579594MHz) はボーレート設定用ではなく、NTSC等のビデオ信号用として使われます。

2013/06/07

CSSのセレクタまとめ

基本形

まずは基本形、セレクタ1つです。例として p 要素の文字を赤にしたい場合を考えます。

p {color:red}         // <p> すべてに適用
p.menu {color:red}    // <p class="menu"> に適用
p#ss0 {color:red}     // <p id="ss0"> に適用

さて、このセレクタをスペースかカンマで区切って、2つ以上指定した場合はどうなるかを見てみます。

結論から言うと、

  • スペース区切り:HTMLの階層
  • カンマ区切り:複数指定

となります。それぞれ例を示します。

スペース区切り:HTMLの階層

スペースで区切ると、HTML階層の下(内側)にある要素を示します。たとえば、

<div class="subj">
  <p>驚愕の真実</p>
</div>
<p>コメント</p>

上記のHTMLで 驚愕の真実の部分だけ文字色を赤にするには、p 要素の前にスペースで区切ってクラスを置き、

.subj p {color:red}    // クラスが subj の親要素の内側にある p 要素に適用

とします。コメントの部分の p 要素の文字は黒のままです。

親要素の id で指定する場合は同様に id を前に置きます。

#ss2 p {color:red}    // id が ss2 の親要素の内側にある p 要素に適用

すべての div 要素の内側にある p を指定したいなら、下記のようにします。

div p {color:red}    // div の内側にあるすべての p 要素に適用

要するに、クラスでも id でも要素名でもなんでも可です。

カンマ区切り:複数指定

カンマで区切ると、列挙したセレクタすべてに適用します。たとえば、

<p id="ss0">驚愕の真実</p>
<p id="ss1">関連URL</p>
<p>コメント</p>

上記のHTMLで 驚愕の真実関連URLの文字色を赤にするには、セレクタをカンマで区切り、

#ss0,#ss1 {color:red}      // id が ss0 もしくは ss1 であるすべての要素に適用
  or
p#ss0,p#ss1 {color:red}    // id が ss0 もしくは ss1 の p 要素に適用

とします。

2013/06/05

C言語のビット演算子 まとめ

ビット演算子のおさらい

         例 16進数              2進数
NOT '~'  ~0x04        => 0xFB  (~0000_0100             => 1111_1011)
OR  '|'   0x26 | 0x14 => 0x36  ( 0010_0110 | 0001_0100 => 0011_0110)
AND '&'   0x26 & 0x14 => 0x04  ( 0010_0110 & 0001_0100 => 0000_0100)
XOR '^'   0x26 ^ 0x14 => 0x32  ( 0010_0110 ^ 0001_0100 => 0011_0010)

実践編

実際にはビットマスクを使って下記のようにすることが多いです。

あるビットを立てたい(1にしたい)→ OR
mask = 0x04;      // 0000_0100
PORTB |= mask;    // bit2 を立てる
あるビットを寝かせたい(0にしたい)→ AND
mask = 0x04;      // 0000_0100
PORTB &= ~mask;   // bit2 を寝かす

マスクを一旦 NOT して、それを AND するという2段階が必要
あるビットを反転させたい → XOR
mask = 0x04;      // 0000_0100
PORTB ^= mask;    // bit2 を反転させる

XOR についての注意

元のビットが 1 のときに XOR を使うとビットを寝かせることができるので、AND の代わりに使えそうです。AND が2段階必要なのに比べるとシンプルにも思えます。

しかしこの方法は、元のビットが想定外に0に変化してしまうと、XOR の結果は 1 になる(立ってしまう)ため、下手をすればバグの元となります。

特に割り込み許可フラグや状態遷移のフラグなどにこの手の操作をしてしまうと、盛大にバグる上に発見が難しいです。

なので、XOR のそういう使い方は避け、純粋にビット反転の用途のみに使うべきです。

AVR Dragon 接続できない件

なぜか、ときどき AVR Dragon が使えなくなります。

PCの電源は落とさずにスリープしながら使っているのが原因かもしれないのですが、再現性100%というわけでもなく、今ひとつはっきりしません。その度にUSBケーブルをつなぎ直したりするのですが、いつも手間取ってしまうので、うまくいく手順の一例を下記に書いておきます。

AVR Dragon の ISPコネクタをターゲット基板に接続している状態で、次のとおりに行います。

  1. Atmel Studio (AVR Studio) を一旦閉じる
  2. Atmel Studio 起動
  3. ターゲットの電源 ON
  4. AVR Dragon と USBケーブルを接続

これでいつものように、F5 を押せばステップ実行できるようになるはず。

2013/06/04

ウェブ上のインタープリタ codepad

ウェブ上の言語処理系(インタープリタ or コンパイラ)codepad です。

左のリストから言語を選び、右のテキストボックスにプログラムを書いて Submit ボタンを押せば、下のように実行結果を出力してくれます。

コンパイラをインストールしていない環境や、ちょっとしたサンプルコードの確認など、地味に出番があります。

選択できる言語には C や C++ に紛れて、なにげに関数型言語や Lisp があるのが面白いです。