2010年
10月
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31

setup diary

2007|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|06|08|11|
2015|01|02|03|04|05|06|07|08|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|09|10|11|

2010-10-05 ubuntu 10.04 LTS

_ windowsからlinuxへ

少し調子の悪いPCがあるということで、様子をみてみた。メモリやHDDをいじっていたら、少し調子は良くなったが、原因はよく分からなかった。まあ、Windowsで使いつづけるのもなんなので、Linuxをインストールすることにした。どのlinuxにしようかと思ったが、素人向けのubuntuにすることにした。リカバリ領域を消さずにインストールしようとしたが、リカバリ領域が邪魔してなかなかうまくいかない。Cドライブを縮めて、その後のパーティションを消して、あいたところにlinuxを入れたらうまくいった。

標準のGNOMEの他にLXDEを入れたが、なんだかとろとろしている。Pen4の3GHzでメモリは512Mbyteなのだが、それにしては遅い。何もしていないようなときにディスクにアクセスをしているのでswapを疑ったが、freeでメモリの状況を見てみても、足りてないわけではない。いろいろといじっていると、余分なディスクアクセスが無くなって、きびきびと動くようになった。なんだったのだろう。

GNOMEだともっと遅いと思ったが、使っていてほとんどストレスを感じない。GNOMEの最適化が進んできたのか、PCの性能が上がって来たのか分からない。個人的にはLXDEを好んで使っているが、この環境は素人向けでは無い気がする。しかし、私はGNOMEだと何をしているのか分かりにくいのであまり好きではない。isoなどもクリックするだけでマウントしてくれたりして驚いたが、どこにマウントされているか分からなくて、ターミナルからコマンドを実行することができなかった。何も知らなくても使えるということと、使いやすいということは必ずしも一致しない。まあ、linuxが素人でも簡単に使えるようになってきたことは、素直にうれしく感じる。もっと普及すると良いが。


2010-10-11 ubuntu 9.04

_ mini9のOS

もうそろそろubuntu 9.04のサポートが切れるだろう。現在使用しているPCのほとんどはDebianLennyのLXDEにしているが、例外としてdellのmini9はubuntu9.04で動かしている。これは、インストールした当時、debianでは、SDを指したままにしておくと、udevが立ち上げのときにハングるようでうまくいかなかったので、ubuntuにしたためだ。念のために、versionを確認してみると、やはり9.04だった。

$ cat /etc/lsb-release 
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=9.04
DISTRIB_CODENAME=jaunty
DISTRIB_DESCRIPTION="Ubuntu 9.04"

サポート切れしたOSを使い続けるのも嫌なので、どうしようか迷っている。ubuntuのより新しいものに乗り換えるのが無難なのだろうが、最近のubuntuにはいくつか気に入らない点がある。

まず、ログイン画面でユーザー名が選択できてしまうことである。ユーザー名は入力すべきだと思う。

それから、起動時や終了時には、不要な画像を表示して何を裏でやっているのかが分からない。debianは、ターミナル画面になって、いろいろと表示してくれるので、意味はよく分からなくても安心できる。

さらに問題なのが、ctrl+alt+fnでx無しのモードに切り替わらないことである。debianベースなのだから、同じようにできても良いものなのだが。linuxでもプログラムがハングるときはある。それがwindowで動いていれば、ターミナルを立ち上げて殺すこともできるだろうが、全画面のときには、何も受け付けなくなるときがある。そのような場合、debianなら別にログインしてkillすれば問題ない。しかし、ubuntuではこれができないのである。何か別の手法があるのかも知れないけど。

結局、私にはubuntuよりもdebianの方があっているように感じられる。Debian sqeezeもrelease-critical bugsが300個ぐらいになってきているので、そろそろリリースされそうだ。これを待って入れ換えるのも良いのかも知れない。SD問題がどうなっているかが課題だが。


2010-10-13 動画を使ったプレゼン

_ impressiveで動画

以前はプレゼンテーションはacroreadを使って行っていたが、今はimpressiveを使っている。Ubuntu Weekly Recipeによると、0.10.2からは、動画再生機能が使えるらしいので、つかってみた。
PageProps = {
  12: { 'video': "embedded.ogv" }
}
という内容を、例えばmovie.infoという名前で作って、--script movie.infoオプションをつけて実行すればよい。すると、12ページ目が表示されたときにmovieが再生される。しかし、一度再生すると、二度目には再生できなかったり、再生中にキーボードで何か操作したら固まってしまったりと、まだ改良の余地があるように思われる。

2010-10-14 京都の秋葉

_ 寺町通りを歩いてみた

京都に出張に来たついでに、寺町を歩いてみた。秋葉や日本橋に比べると、当然見劣りしてしまう。秋月やデジットに相当する店は無い。マルツーがあるだけでも有難いと考えるべきだろう。マルツーの中を一通り見てみたが、一つ興味を引かれるものを見つけた。microchipのMCP3551という22bitのDelta-Sigma型A-Dコンバーターだ。精度の高いADコンバーターを探しているのだが、Delta-Sigma型だと精度の高いものがつくれるようだ。原理はいまいち理解できていないが。値段も手ごろだ。インターフェースはSPIなのだが、マイコンで扱うので、問題はない。今後使うADコンバーターの候補に入れておこう。


2010-10-15 昔はできたのだが

_ Windows NTのIOポート

WindowsのIOポートをたたく必要が出てきそうになったので、調べてみた。よく知られているように、NT系ではIOポートを直接操作することはできない。

昔はDriverLINXのdiportio.dllを使うと、NTからIOを扱うことができた。しかし、今ではリンクが切れている。いろいろと探してみると、Software Informerというところには、あるようだが、それを作っていたScientific Software Tools, Inc.のサイトからはdownloadできない。これはまだ使えるのかな。

ほかには、WinIo.dllというものを使っている人もいるようだ。しかし、それを使うためのbinderを書くのも面倒だな。このくらい自分で書けるようになればよいのだが、windowsのプログラム手法を勉強する気にはなかなかならない。


2010-10-18 plot for python

_ matplotlib

rubyでグラフを書けないかと思っていた。そのために、rsrubyをつかったり、tkのcanvasを使って簡易のグラフを書くツールをつくったこともある。一方、pythonにはグラフを書くツールがあるようだ。matplotlibというものだ。debianでは、python-matplotlibをaptで入れればインストールは終了する。使い方は、いろいろとあって覚えるのは難しそうだ。例えば、こんな感じで使うらしい。
import matplotlib.pyplot as plt
import numpy as np
x=np.arange(0,1,0.01)
y=np.exp(x)
plt.plot(x,y+0,'r-',label='first')
plt.plot(x,y+1,'b:',label='second')
plt.plot(x,y+2,'g--',label='third')
plt.grid(True)
plt.legend()
plt.xlabel('x')
plt.ylabel('y')
plt.show()
細かいグラフの調節の仕方を覚えないといけないが、python上から簡単にグラフを扱えるのは便利かも知れない。

2010-10-19 linux死亡

_ 計測用のPCの不調

Linuxのwineをいじっていて、なんだか挙動がおかしい。初めはwineとの相性の問題かと思っていたが、ファイルシステムが変な気がしたので、再起動した。すると、起動できない。grubとかは動いているのだが、fsckが起動して、途中で沢山エラーが出る。おそらく、HDDの一部がクラッシュしたらしい。まだ、多少は必要なデータが入っているので、後でknoppixでCDROMブートして、取り出せるか試してみよう。

これまでに、Linuxで不調になったことがあるが、その大部分がHDDの不調によるものだった気がする。HDDが壊れたのでは仕方がない。


2010-10-20 液晶の活用

_ ワンチップ磁気センサー

この間、デジットで買ったOPTREXのPWB842Bという液晶をようやく動かすことができた。いろいろとバグがあって発見に手間取ってしまった。まずwaitをかなり入れないとuPD7225がうまく応答しない。ICの説明書は一応読んだが、数マイクロ秒待てば良いような感じだったと思うが、100マイクロ秒ぐらいのwaitをいろいろなところに入れた。次に発見に手間取ったのが、i++のようなつもりで、i>>1としていたが、当然のことながらi>>=1としなければいけなかった。

さて、この液晶を何に使うかを考えていたのだが、磁気センサーを作ることにした。ホール素子の電圧をattiny261のADコンバーターを使って読んで、さらに液晶と通信して表示すれば、ワンチップの磁気センサーができあがるはずである。というわけで、プログラムを書いてみた。そのままだと精度が出ないようだったので、256回測定してその平均を取ったが、数値が安定して良い感じになった。磁場の絶対値に関しては、換算がまだ間違っているかも知れないが、1-1000ガウスぐらいは測定できるようになった。100以上では増幅をしないようにプログラムすれば、3Tぐらいまでは測れるようになつはずだろうが、面倒なので組み込んでいない。本当は、超伝導磁石の漏れ磁場を測定したかったのだが、どうやら感度の問題で難しいようだ。

#include <avr/io.h>
#include <avr/interrupt.h>
#define F_CPU 1000000 /* 1MHz */
#include <util/delay.h>
#include <avr/pgmspace.h>
/* lcd controller for OPTREX PWB842B */
/* 7seg 10digit */
// pin connection
// 1 /RESET
// 2 /SCK
// 3 SI
// 4 /BUSY
// 5 C,/D
// 6 /CS
// 7 Vdd 5V
// 8 Vss GND
#define LCD_PORT PORTB
#define LCD_PIN PINB
#define LCD_DDR DDRB
#define LCD_RESET 6
#define LCD_SCK 5
#define LCD_SI 4
#define LCD_BUSY 3
#define LCD_CD 2
#define LCD_CS 1
#define setbit(PORT,BIT) PORT|=_BV(BIT)
#define clearbit(PORT,BIT) PORT&=~_BV(BIT)
#define checkbit(PORT,BIT) (PORT&_BV(BIT))
#define SIZE_BUF 10
#define SIZE_CHAR 10
volatile uint8_t buf[SIZE_BUF]; // data to send LCD
static volatile uint8_t chars[SIZE_CHAR]; // charactor data
static volatile int32_t ave=0;
static volatile uint16_t cnt=0;
#define SIZE_AVE 256
#define ZERO_ADJ 6
const prog_uint8_t number[0x40]={
//   76543210
  0b000000000, //  0x20
  0b0, //! 0x21
  0b001000001, //" 0x22
  0b0, //# 0x23
  0b0, //$ 0x24
  0b0, //% 0x25
  0b0, //& 0x26
  0b001000000, //' 0x27
  0b011001000, //( 0x28
  0b000001011, //) 0x29
  0b0, //* 0x2a
  0b0, //+ 0x2b
  0b0, //, 0x2c
  0b000010000, //- 0x2d
  0b000000100, //. 0x2e
  0b010010001, /// 0x2f
//   76543210
  0b011101011, //0 0x30
  0b000000011, //1 0x31
  0b010111001, //2 0x32
  0b000111011, //3 0x33
  0b001010011, //4 0x34
  0b001111010, //5 0x35
  0b011111010, //6 0x36
  0b000001011, //7 0x37
  0b011111011, //8 0x38
  0b001111011, //9 0x38
  0b0, //: 0x3a
  0b0, //; 0x3b
  0b001011000, //< 0x3c
  0b000011000, //= 0x3d
  0b000011001, //> 0x3e
  0b000111001, //? 0x3f
//   76543210
  0b010111011, //@ 0x40
  0b011011011, //A 0x41
  0b011110010, //B 0x42
  0b010110000, //C 0x43
  0b010110011, //D 0x44
  0b011111000, //E 0x45
  0b011011000, //F 0x46
  0b011101010, //G 0x47
  0b011010010, //H 0x48
  0b000000010, //I 0x49
  0b010100011, //J 0x4a
  0b011010001, //K 0x4b
  0b011100000, //L 0x4c
  0b010011010, //M 0x4d
  0b010010010, //N 0x4e
  0b010110010, //0 0x4f
//   76543210
  0b011011001, //P 0x50
  0b001011011, //Q 0x51
  0b010010000, //R 0x52
  0b001010010, //S 0x53
  0b011110000, //T 0x54
  0b010100010, //U 0x55
  //0b011100011, //V 0x56
  0b011110011, //V 0x56
  //0b001110001, //W 0x57
  0b010101010, //W 0x57
  0b011010011, //X 0x58
  0b001110011, //Y 0x59
  0b010010001, //Z 0x5a
  0b011101000, //[ 0x5b
  0b0, //\ 0x5c
  0b000101011, //] 0x5d
  0b001001001, //^ 0x5e
  0b000100000 //_ 0x5f
};
void lcd_write(uint8_t *s,char n){
  unsigned char i,c;
  _delay_us(50);
  clearbit(LCD_PORT,LCD_CS);
  _delay_us(100);  // wait at least 1.5us
  do{
    c=*(s++);
    while(checkbit(LCD_PIN,LCD_BUSY)==0){}
    _delay_us(100);
    for(i=1<<7;i!=0;i>>=1){
      clearbit(LCD_PORT,LCD_SCK);
      _delay_us(50);
      if((c&i)!=0){setbit(LCD_PORT,LCD_SI);}
        else{clearbit(LCD_PORT,LCD_SI);}
      _delay_us(50);
      setbit(LCD_PORT,LCD_SCK);
      _delay_us(50);
    }
    _delay_us(50);  // wait at least 3us in total
  }while((--n)>0);
  while(checkbit(LCD_PIN,LCD_BUSY)==0){}
  setbit(LCD_PORT,LCD_CS);
  _delay_us(50);
}
void lcd_init(){
  uint8_t commands[6]={
    0b01001000, // mode_set
    0b00110001, // synchronized transfer
    0b00100000, // clear data memory
    0b00011000, // blinking off
    0b00010001, // display on
    0b00010100, // without segment decoder
  };
  LCD_DDR|=(1<<LCD_RESET)|(1<<LCD_SCK)|(1<<LCD_SI)|(1<<LCD_CD)|(1<<LCD_CS);
  LCD_DDR&= ~(1<<LCD_BUSY);
  LCD_PORT|=(1<<LCD_RESET)|(1<<LCD_SCK)|(1<<LCD_SI)|(1<<LCD_CD)|(1<<LCD_CS);
  //  LCD_PORT|=(1<<LCD_BUSY);
  _delay_us(100);
  clearbit(LCD_PORT,LCD_RESET);
  _delay_us(100);
  setbit(LCD_PORT,LCD_RESET);
  _delay_us(200);
  setbit(LCD_PORT,LCD_CD);
  _delay_us(100);
  lcd_write(commands,6);
}
void buf_clear(){
  unsigned char i;
  for(i=0;i<SIZE_BUF;i++){buf[i]=0x00;}
}
void buf_display(){
  clearbit(LCD_PORT,LCD_CD);
  _delay_us(100);
  lcd_write((uint8_t*)buf,SIZE_BUF);
}
void char_set(char n,unsigned char c){
  chars[n]=c;
  if(c<0x20 || c>0x7f){c=0x20;}
  buf[n]=pgm_read_byte(&number[c-0x20]);
}
void char_shift(char s){
  unsigned char n;
  for(n=SIZE_CHAR-1;n>0;){ char_set(n,chars[--n]); }
  char_set(0,s);
}
void string_set(char *s){
  unsigned char c;
  for(c=SIZE_CHAR;c>0;){
    char_set(--c,*(s++));
  }
  buf_display();
}
void string_shift(char *s,char l){
  for(;l>0;l--){
    char_shift(*(s++));
    buf_display();
    _delay_ms(500);
  }
}
void disp_num(unsigned char c){
  unsigned char i;
  i=c>>4;
  char_shift(i+((i<10)?0x30:0x37));
  i=c&0x0f;
  char_shift(i+((i<10)?0x30:0x37));
  buf_display();
}
// AD converter
void ad_init(){
  clearbit(ADCSRB,REFS2); // 1.1V
  setbit(ADMUX,REFS1);  // 1.1V
  clearbit(ADMUX,REFS0); // 1.1V
  setbit(ADMUX,ADLAR); // bit6-15
  setbit(ADCSRB,MUX5); // 
  clearbit(ADMUX,MUX4); // 
  clearbit(ADMUX,MUX3); // 
  clearbit(ADMUX,MUX2); // 
  clearbit(ADMUX,MUX1); // 
  clearbit(ADMUX,MUX0); // 
  setbit(ADCSRA,ADPS2); // CK/128 
  setbit(ADCSRA,ADPS1); // CK/128
  setbit(ADCSRA,ADPS0); // CK/128
  setbit(ADCSRA,ADEN); // enable
  setbit(ADCSRA,ADIE); // interupt enable
  setbit(ADCSRB,BIN); // bipolar
  setbit(ADCSRB,GSEL); // gain 32/20
}
ISR(ADC_vect){
  int16_t v;
  uint8_t s[10];
  v=ADCL;
  v|=ADCH<<8;
  v-=ZERO_ADJ<<6; // zero adjust
  if(ave<0){v=-v;ave-=v>>6;}
  else{ave+=v>>6;}
  if(++cnt>=SIZE_AVE){
    if(ave<0){ave=-ave;s[0]='-';}
    else{s[0]=' ';}
    ave/=(SIZE_AVE/2);
    s[9]=' ';
    s[8]='E';
    s[7]='0';
    s[6]=' ';
    s[5]=ave%10+0x30;
    ave/=10;
    s[4]=ave%10+0x30;
    ave/=10;
    s[3]=ave%10+0x30;
    ave/=10;
    s[2]=ave%10+0x30;
    ave/=10;
    s[1]=ave%10+0x30;
    string_set(s);
    ave=0;
    cnt=0;
  }
}
int main(){
  _delay_ms(500);
  lcd_init();
  buf_clear();
  buf_display();
  ad_init();
  sei();
  for(;;){
    setbit(ADCSRA,ADSC); // enable
    while(checkbit(ADCSRA,ADSC)!=0){_delay_us(1);}
    _delay_us(10);
  }
}

2010-10-21 磁気センサーの改良

_ C言語の整数

AVRを使った磁気センサーのプログラムをいろいろと改良していたのだが、ときどき変な挙動をする。この原因を調べていたが、いくつか原因があったが、絶対値を計算するときにうまくいっていなかったのが、一番大きな原因だった。例えば、絶対値を求めるには次のような関数を書いたとする。
char abs(char v){
  if(v<0){v=-v;}
  return v;
}
しばらく機械語から遠ざかっていたので、気がつくのが遅れたが、これではうまくいかない場合がある。charでは、-128から127までの整数を表現することができる。そして、マイナスをつけるときには、0x100-vという計算がされる。-128は0b10000000と表現されるが、これにマイナスをつけると、0b10000000となり、128ではなく-128となってしまう。つまり、-128以外はうまく働くが、-128だけはダメなのだ。まあ、少しずつCを思い出していこう。

2010-10-22 CDROM boot ubuntu

_ ubuntuのsamba

立ち上がらなくなったLinuxからdataを吸い出すために、knoppixで立ち上げようとしたが、なぜか途中で止まってしまう。CDが壊れたのかなと思って、次はubuntuを試してみることにした。ubuntuのinstall diskを使うと、installしないで使ってみることができる。こっちは無事に立ち上がった。

さて、問題はHDDの中身をどうやって取り出すかだ。HDDは物理的には壊れていないようで、データ領域は問題無く読める。次は、それを別のPCに移すために、sambaで共有する。しかし、ubuntuのsambaの使い方はいまいちよく理解できていない。GUIで共有することはできたようだが、CDROM bootなのでパスワードがどうなっているのか分からない。ユーザー名はubuntuになっているようなので、いろいろと試したが、うまくいかない。

仕方がないのでターミナルから行うことにした。smbpasswd -a ubuntuとしてsambaにユーザーを登録する。そして、sambaを再起動する。しかし、ubuntu 10.04はこれまでとはやり方が違うようだ。これまでは、sudo /etc/init.d/samba restartとしていたが、sudo service smbd restartとする。しかし、これでもうまく共有ができない。最終的には、/etc/samba/smb.confの設定がhome directoryを共有するようになっていたので、その部分のコメントアウトをはずすと、やっと共有ができた。defaultの設定がdebianとは違っているようだ。

無事、データを取り出すことができたので、時間ができたときに再インストールしよう。


2010-10-25 ipod nanoを分解

_ ipod nanoの液晶

知り合いから壊れたipod nano(第二世代)をもらったので、分解してみた。コネクタの部分から徐々に爪を外していったら無事に開いた。液晶部分とスイッチ部分へはコネクタを介してリボンケーブルでつながっている。そのコネクタの爪を立てると、ケーブルははずれて、粘着テープで固定されている部分を外すと、うまく分解できた。

部品を眺めてみて使えそうなものとしては、フラッシュと液晶に目が止まった。フラッシュの石は何かのときに使えるかもしれないが、はがすのは大変そうだ。一方、液晶はうまく外せると、いろいろと楽しそうだ。しかし、世の中そんなに甘くはなかった。液晶ユニットは粘着テープで固定されているのだが、前面のガラスが外れて壊れてしまった。

液晶は24pinのコネクタにつながっており、信号線の数が少ないので、どのように制御しているのだろう。バックライトは横からLEDで光を出して、それを適宜拡散させていた。陰極管を使わなくてよいので、マイコンなどで使うのにはうってつけに思われるのだが、壊してしまったのでは諦めるしかない。

修理用の部品としては、液晶だけが売られているようだが、数千円するようなので、少し高価である。ipodの原価は四千円ぐらいという噂もあるので、液晶の原価は千円もしないのだろう。いつか安価で入手できたら、制御を試みてみよう。


2010-10-31 virus発見

_ 二台のPCがvirusに感染

身の回りのPCのいずれかに、autorunを利用したvirusが居るようだとは思っていたが、ようやく発見した。研究室内では、測定用のPCの一台に感染していた。

測定用のWindows PCは、不用意にupdateすると、測定が動かなくなってしまう可能性があるし、networkからvirusを吸い込むことがあるので、networkから切り離して使用している。数年前までは、これでvirusに感染することはほとんど無かったのだろうが、近年はUSBメモリを介してデータを移動するので、MAL_OTORUNには感染しやすい情況にあった。

今回感染したvirusは、それほど悪質なものではなかったので、safe modeから立ち上げて、virus本体を消去して、レジストリも適宜消したら、除去が終了した。

しかし、今後も似たようなvirusで、さらに悪質なものが感染する可能性もあるので、USBメモリを使ったデータの移動をどうするか考える必要があるだろう。