適当ですが、西暦→和暦変換プログラムをPythonででっち上げました。
- 明治、大正、昭和、平成のみ
- 年号が変わる年の月の考慮なし
(例:1989年途中まで 昭和64年 ですが、平成1年 と表示)
厳密な用途(誕生日計算など)には使えないです。
とりあえず平成があれば十分なのと、なんしか今は時間ないので。
さあ、今日も毛を刈ろう。
適当ですが、西暦→和暦変換プログラムをPythonででっち上げました。
厳密な用途(誕生日計算など)には使えないです。
とりあえず平成があれば十分なのと、なんしか今は時間ないので。
そろそろ重い腰を上げて、 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を同時に走らせることができるので、バージョンやインストールされているパッケージの違いによる挙動の違いを比較する場合などは手軽に試すことができます。
コマンドラインで使える 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の構文チェックツールとして 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バイト文字が含まれていると少し指摘箇所の桁がずれますが、エラー行は分かります。
Emacs を使っている時にシェルを使いたいときは M-x shell
とするのですが、今ひとつ使い勝手がよくありません。
少し億劫に感じてきたので、最近はこんなものを使っています。
ちょこっと確認したいときなどは、
M-x term
とたたくC-x k
で抜けるとしています。抜けるときはシェルバッファとプロセスは毎回消します。
term
というコマンド名には別のコマンドが割り付けられていますが、とりあえず気にしないということで…。
以前はRAWイメージをdd
コマンドで書き込んだり、専用のツールでSDカードを作っていましたが、今はもっと簡単な方法があるようです。
この方法は NOOB(New Out Of Box Software )という、初心者(newbie)向けのやり方のようですが、
という特徴があります。4GB以上のSDカードならこちらのほうが早くて簡単かもしれません。
やり方は Windows / Mac / Linux どれも似たようなものですが、下記に Mac の例を書きます。
この後、Raspberry Pi のオプション設定画面になりますが、起動確認だけなら何もせずに Finish
を選ぶといいです。
するとコンソールに落ちるので、ここで
$startx
とでもすると X が起動します。
再起動するとインストールしたディストリで起動しますが、これ以降のログインは(ユーザを作っていない場合は)下記のデフォルトユーザが使えます。
Python でもスクラッチバッファで対話したい のつづきです。
メジャーモードごとに eval-region を切り替えるようにしてみました。簡単な割に便利です。
これで、スクラッチバッファでもそうでなくても M-x eval-region
すると、そのメジャーモードにふさわしい eval-region が呼び出され、リージョンの評価結果をプリントするようになります。…といっても、今のところ Python, Ruby, ELispだけですが。
各モード用の eval-region-xxx
の関数定義は共通化すればシンプルになりそうですが、早すぎる最適化を招きそうなのでこのまま放置です。
fset / setf と、とてもまぎらわしいので、備忘録的においておきます。
テストとして、挨拶文を表示するgreeting
という関数を朝用と夜用にすげ替えてみます。
これでいいのか、今ひとつ自信ないです…。
摂氏(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
部品屋でボーレート設定用の 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等のビデオ信号用として使われます。
まずは基本形、セレクタ1つです。例として p
要素の文字を赤にしたい場合を考えます。
p {color:red} // <p> すべてに適用
p.menu {color:red} // <p class="menu"> に適用
p#ss0 {color:red} // <p id="ss0"> に適用
さて、このセレクタをスペースかカンマで区切って、2つ以上指定した場合はどうなるかを見てみます。
結論から言うと、
となります。それぞれ例を示します。
スペースで区切ると、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 要素に適用
とします。
例 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)
実際にはビットマスクを使って下記のようにすることが多いです。
mask = 0x04; // 0000_0100
PORTB |= mask; // bit2 を立てる
mask = 0x04; // 0000_0100
PORTB &= ~mask; // bit2 を寝かす
マスクを一旦 NOT して、それを AND するという2段階が必要
mask = 0x04; // 0000_0100
PORTB ^= mask; // bit2 を反転させる
元のビットが 1 のときに XOR を使うとビットを寝かせることができるので、AND の代わりに使えそうです。AND が2段階必要なのに比べるとシンプルにも思えます。
しかしこの方法は、元のビットが想定外に0に変化してしまうと、XOR の結果は 1 になる(立ってしまう)ため、下手をすればバグの元となります。
特に割り込み許可フラグや状態遷移のフラグなどにこの手の操作をしてしまうと、盛大にバグる上に発見が難しいです。
なので、XOR のそういう使い方は避け、純粋にビット反転の用途のみに使うべきです。
なぜか、ときどき AVR Dragon が使えなくなります。
PCの電源は落とさずにスリープしながら使っているのが原因かもしれないのですが、再現性100%というわけでもなく、今ひとつはっきりしません。その度にUSBケーブルをつなぎ直したりするのですが、いつも手間取ってしまうので、うまくいく手順の一例を下記に書いておきます。
AVR Dragon の ISPコネクタをターゲット基板に接続している状態で、次のとおりに行います。
これでいつものように、F5 を押せばステップ実行できるようになるはず。
ウェブ上の言語処理系(インタープリタ or コンパイラ)codepad です。
左のリストから言語を選び、右のテキストボックスにプログラムを書いて Submit ボタンを押せば、下のように実行結果を出力してくれます。
コンパイラをインストールしていない環境や、ちょっとしたサンプルコードの確認など、地味に出番があります。
選択できる言語には C や C++ に紛れて、なにげに関数型言語や Lisp があるのが面白いです。