二年越し

AVRでデジットの液晶 二年以上前に、日本橋のデジットで買った規格の分からない液晶を動かすことに成功した。と言っても、私が解析したわけではなく、先人の解析を元にプログラムを書いただけである。液晶は裏にIN50175Hという刻印のあるもので、買った当時検索したが、何も分からなかった。最近検索すると、解析結果が分かったので、動かしてみた。 14セグメントの文字が8文字と9個の記号が表示できる。信号は三本で、各セグメントのon/offをクロックに合わせて送って、その後で表示を指示する。難しいのは、セグメントの順番が、一つの文字で連続していないことだ。いろいろと試行錯誤の結果できあがったattiny2313をつかって表示させるプログラムがこれ。 #include <avr/io.h> #include <avr/interrupt.h> #define F_CPU 1000000 /* 1MHz */ #include <util/delay.h> #include <avr/pgmspace.h> /* lcd controller for IN50175H */ // PORTB #define LATCH 3 #define DATA 4 #define CLOCK 5 // 1 Vcc // 2 NCC? // 3 NCC? // 4 latch // 5 data // 6 clock // 7 GND #define setbit(PORT,BIT) PORT|=_BV(BIT) #define clearbit(PORT,BIT) PORT&=~_BV(BIT) #define checkbit(PORT,BIT) (PORT&_BV(BIT)) static volatile unsigned char buf[20]; //static char segsign[14]={1,1,1,1,0,0,0,1,1,1,1,0,0,0}; /* 1:+,:-*/ static unsigned char offset[14]={1,2,3,4,72,71,70,81,82,83,84,152,151,150}; //static unsigned char chars[9]={36,78,79,80,116,117,118,119,120}; unsigned char seg(char c,char s){ /*c:0-7, s:0-13*/ // return c*4*((segsign[s]==0)?
Read more...

液晶の修理

また壊れた
久々に秋葉に行って、部品を買ってきた。以前修理した液晶のディスプレイを修理するために、トランジスタを買ってきた。以前と同様に、2SC5707が壊れたので、その代わりに2SC3709Aを買って、入れ替えると、一応うまくバックライトが点灯した。しかし、直ったと思って組み立て終わって、もう一度チェックすると、また同じ症状になってしまった。一度取り替えた2SC5707がもう一度壊れているので、その原因が別にあるのだろう。トランジスタを取り替えると、しばらくはうまくいくが、また壊れる。今回もそれを再現したのだと思う。その原因を見つけないと、根本的な修理にはならないのだが、どうやってみつけようか。部品取り用の基板もあるので、あやしい部品を総とっかえしてみようかな。

2010/6/15追記 昨晩、もう一度動かしてみたら、普通にバックライトが点灯した。おかしいな、また壊れたはずなのに。どこかに浮いた半田でもあるのかな。もうしばらく様子を見ることにしよう。

Read more...

impressiveでプレゼン

netbookで
これまで、プレゼンテーションが必要なときには、prosperで準備して、pdfに変換してacroreadで表示していた。知人がimpressiveというプレゼンテーションツールを使っていて、興味を持ったので試してみた。インストールはaptitude impressiveでできるが、日本語が表示できない。poppler-dataを入れると、表示できるようになる。しかし、非力なPCの場合には変換に時間がかかってしまう。ubuntuのレシピで工夫の仕方が紹介されていた。まず、

impressive --geometry 1024x768 -o presen presen.pdf

とすると、presenというフォルダに各ページがpngとして展開される。そして、実行するときには、

impressive -t none -c memory -g 1024x768 presen

とすると、変換に時間がかからなくなるので、快適に使うことができるようになる。しばらく使ってみることにしようかな。

Read more...

引数の最後のカンマ

methodの引数と配列
rubyの引数を取るmethodでは、引数をカンマで区切って、丸括弧で囲む。

def test(*a)
  puts a.class
end

などとすると、引数の数が可変になり、それが配列として受け取ることができる。このような場合に、引数を一行ごとに書いて、

test(
1,
2,
3,
)

などとしたくなるのだが、これだと最後のカンマの後に引数が無いのでエラーが起きてしまう。仕方がないので、これまでは

test(
1,
2,
3 )

と書いていたが、多少不便な点があった。例えば、2を除く時には行ごとコメントアウトすれば良いのだが、3を除くときには、少し書き換えなければいけない。これを回避する方法を見つけた。

test(*[
1,
2,
3,
])

と書くと、3を消すときも、一行コメントアウトすれば良いことになる。配列だと、最後のカンマは無視してくれることを利用している。しかし、引数を配列にしてから、もう一度展開するのは二度手間な気がする。そうするならば、初めから配列を引数にすれば良いのだが、必ず配列を渡すのも面倒な時もある。しばらくはこの書き方でいくことにしよう。

Read more...

引越し完了

! tdiaryの更新

本日、Webサーバーの更新が行われた。rubyは1.8.5になったので、新しいtdiaryにした。見た目はほとんど変えていないが。ようやく基本的な設定が終わって、昔のデータも移し終えた。ユーザー権限では、apacheが作成したデータを書き換えられないので、細かい設定がうまくいかずに苦労した。新しいプラグインも使えると思うので、何か面白いものがないか探してみようと思う。少しずつスタイルを調整していこう。

Read more...

tdiaryの引越し

webサーバーの更新
もうすぐ、このblogを動かしているサーバーが更新される。rubyも1.6から1.8になるようなので、新しいtdiaryを入れようと計画している。しかし問題なのは、データの移行である。まだtdiaryのデータ構造を理解していなので、この記事を投稿したときに、どのファイルのサイズが変化するか調べてみよう。

2010/5/30追記 201005.td2のサイズが変わったので、このバイナリが本文を記録しているファイルらしい。

Read more...

Wineのfont

ttf-mscorefonts-installer
久しぶりにWindows用のソフトを使わざるを得なくなったので、仕方なくwineでインストールした。いざソフトを起動すると、いくつかのフォントが無いと言われた。aptitude searchでfontとmsで検索すると、ttf-mscorefonts-installerというものが見つかったので、インストールしてみたら、フォントが無いというエラーは無くなった。これでwineでうまく動くと良いな。

Read more...

AVRのwait

ループは無視か
久々にAVRをいじって、制御用の装置を作っている。tiny2313をつかっているのだが、waitをかけるのに苦労した。昔はひたすらループを作っておいて、適当な時間になるように調整したら、うまくいった気がするのだが、なぜか数マイクロ秒しかかからない。コンパイラが最適化してしまってうまくいかないのかな。仕方が無いのでタイマーを使おうとしたが、割り込みを禁止していたので、うまく動かない。いろいろと調べていたら、ウェイトをかけるルーチンがあるようだ。

#define F_CPU 1000000 /* 1MHz */
#include <util/delay.h>

と宣言しておくと、_delay_us(100)とすると、マイクロ秒単位でwaitが指定できる。_delay_msも使えるようだ。これを使ったら、思ったとおりの挙動をしたが、装置の完成にはもう少し調整が必要なようだ。

Read more...

rubyとpythonのnumeric

数値に関するコマンドの違い
数値に関するpythonとrubyコマンドをまとめてみた。通常の演算を除くと、意外に少ないが、これ以外にもいろいろとあると思う。

pythonruby
n=9999999999Ln=9999999999
01770177
0xff0xff
3+4JComplex(3,4) (require "complex")
oct(314)314.to_s(8)
hex(314)314.to_s(16)
int('111',8)'111'.to_i(8) or '111'.oct
int('111',16)'111'.to_i(16) or '111'.hex
これで、もっともよく使う四つのオブジェクトの概要がなんとなく分かったので、あとはフロー制御を覚えれば、pythonで簡単なプログラムを書けるようになるかな。それとファイル操作も必須かな。
Read more...

rubyとpythonのstring

文字列に関するコマンドの違い
文字列に関するpythonとrubyコマンドをまとめてみたが、文字列操作はややこしく、表では表しきれていない部分も多い。

pythonruby 1.8 and 1.9
s="2010's"s="2010's" or %Q(2010's)
s='"2010"'s=%Q'"2010"'
s=r'c:\user's='c:\user' or %q(c:\user)
s=u'\u9300's="\u9300"(1.9)
s=u'\U00028b46's="\u{028b46}"(1.9)
s="%dK,%fPa"%(273,1024)s="%dK,%fPa"%[273,1024]
s="""firsts="first
second""""second"
s[2]s[2,1] or s[2].chr(1.8) and s[2](1.9)
s[1:3]s[1...3] or slice(1...3)
len(s)s.size or s.length
int("1")"1".to_i
float("3.14")"3.14".to_f
s.count('0')s.count('0')
s.capitalize()s.capitalize
s.swapcase()s.swapcase
s.upper()s.upcase
s.lower()s.downcase
s.center(10)s.center(10)
s.ljust(10)s.ljust(10)
s.rjust(10)s.rjust(10)
s.strip()s.strip
s.lstrip()s.lstrip
s.rstrip()s.rstrip
s.find('1')s.index('1')
s.rfind('1')s.rindex('1')
s.split(',')s.split(/,/)
",".join(["a","b"])["a","b"].join(",")
s.replace('a','A')s.gsub!(/a/){'A'}
s.replace('a','A',1)s.sub!(/a/){'A'}
pythonでは、シングルクォートとダブルクォートの違いはほとんど無いが、rubyではダブルクォートではバックスラッシュ記法や文字列展開を行うという大きな違いがある。pythonのraw文字列は便利であるが、rubyではシングルクォートに対応するのだろう。しかし、いずれも最後の文字がバックスラッシュだとうまく動かない。pythonのトリプルクォートは、rubyのhere documentに対応するのかも知れないが、rubyのダブルクォートでも改行ができる。rubyのユニコード対応は実質1.9からのようだ。ちなみに、上の例はある元素の中国語です。また、文字列をindexで指定して取り出す場合には、ruby1.8とruby1.9でまったく動作が異なる。1.8は数値になるのでCと同じ感じで、1.9では文字なのでpythonと同じと言えるのだろう。それから、pythonはバッククォートが無いようだ。
Read more...