ハイテクゴミ袋は本当にハイテクだった

イヤホンだが特に壊れてなかった。延長ケーブルの元の差し具合が悪かったらしい。
というわけで一件落着。なんともなくてよかった。
さて、ここのところゴミの収集にも金が取られるようになったのはまぁいいんですが、
その支払いには例によってゴミ袋を買うことで行います。
で、袋の大きさは45L,30L,20Lなどあるんですけどね。
まぁどうも最近の調子を見ていると週2回の燃やすゴミの回収で30Lと45Lを交互に使うのがよさそうだということらしい。
それでもいっぱいいっぱいになるわけではないけど、多いときだとちょうどそんなもんでしょうねぇ。
極端にゴミの量が減ったわけではないんだけど、まぁちょっとは減ってる気はする。
まぁそれ以前に容器包装プラスチックの分別で減ったのは恐ろしい量だったけど。
資料により値が違うからなんともいえんが、そもそもこの辺は個人のゴミの減量は進んでるはず。
どうもこれ以上は口で言ってもしょうがないと思ったらしく金を取ると言ったはず。
来年の統計が楽しみだ。量はともかく、リサイクル率が恐ろしく上がってそうな気がする。
ところで、そのゴミ袋、10枚くっついたのが丸めて売ってるんですけど、それを見るとバーコードが書いてある。
見ると、インストアバーコードじゃなくてきちんとしたJANコードっぽい。
でJANのメーカーコードを調べてみると、きちんと出てきた。
このためだけに取ったのかねぇ。驚いた。
JANコードあるからPOSで普通に取り扱えるようにできるんだろうなぁ。
そういえばコンビニでもいくらか取り扱ってる店あるしなぁ。
農村の方に行くと、ひどいところでは農協もなくなって、取り扱い店が公民館だけというひどいところもある。
まぁそれはそれで仕方ないのだけど、いろいろ見てると幹線道路沿いのコンビニが入ってて、
見ると取り扱い店のまばらなところで、ああなるほどと思ったり。
そういえば、リットルというのを小学校のころ、lの筆記体で書くと散々言われてきたが、
実際そんなのをPCで打ち出すのは難しい。
それでどうしてるか見てみるとLで書くことが多いな。なるほどね。
そんなわけでこの記事でもLで書いたけど、結構定着しそうな感じだな。
ただし、物理の計算などではLはあまり使わずにm3で書くよね。
1000cm3とか書く方が普通かな。まぁどっちにしてもLは微妙な単位ですわな。
Lを直接置換するdm3あるけど流行ってるのかね。僕は本でしか見たことがない。

ボードメーカーに割り振るMACアドレス

イヤホンで音楽を聴いてたら急に片方だけ音が切れて驚いた。まぁ断線だろうなぁ。
しかし今回のイヤホンはさほど過酷な状況で使ってないんだよねぇ。
だというのに6ヶ月で切れたとなるとちょっとまずいよなぁ。
買ったのは日本橋のSofmapなんだけど、まぁタイミングが悪いというか…
電話で相談してみて、交換してくれたらラッキー、無理なら余ってるルピーで買うなりしよう。
Panasonicのだから筒井の工場に持って行くという手もあるのだが、なんか話がややこしくなりそうだからねぇ…
さて、MACアドレスというやつは結構重要で、部ではこれを用いてDHCPで固定IPを割り当ててる。
簡易な認証にも使えて何かといい。
偽装もできるから一概には言えないが、MACアドレスは唯一のもののはず。
さて、このMACアドレスだが、
Windowsにおいては

ipconfig /all

で確認できる。
Physical Addressの値を見ればいい、00-1A-92-75-14-XXとあった。(XXは伏せ字)
このうち頭3つがベンダーの番号だと。でこれは調べられる。
http://standards.ieee.org/regauth/oui/index.shtml
00-1A-92やら001A92でOUIを検索。
するとASUSTek COMPUTER INC.と書いてある。
なるほど、ボードのメーカーが書かれるのか。
他にも知っているMACアドレスを調べたのですが、ほとんどオンボードだしなぁ。
ASUSTek COMPUTER INC.とMICRO-STAR INT’L CO.,LTD.ばっかりだ。
なんというかねぇ。
だいたいここに登録されてるのでわかるでしょう。
まぁここで調べて何のメリットがあるんだというとあまりないのだけど、おもしろいもんです。
どうも見てると1社でたくさん割り当て受けてるみたいだな。
そういえば変わったところではXenが割り当てをうけてるな。00:16:3eなんだが。
Xenというと仮想化技術なのだが、ここで仮想のネットワークインターフェースを作るからと。
Xensource, Inc.と書いてある。
こんな風に会社に割って、そこからは重ならないようにしなさいと。
よくある仕組みですね。
一度MACアドレスを調べてみるとおもしろそうですね。

Visual Studioで視覚的に好きなソースコードを書く

さて、今日は日本橋に行ってきたわけだが、それでいろいろ見てましたと。
で追加用のDDR2のメモリ、1GBのを買ってきました。
すごく安かったんでねぇ。
その成果は起動してすぐは見えなかったが使ってたらすぐ気付いた。HDDの動作音が少ない。
いままではSWAPしまくってたんですよ。それがほぼ消滅。
おかげで静かで、サクサクと動いてくれる。
まぁそんなわけで非常にいい結果が出たとおもいます。
ただ相変わらず起動時はSWAPしまくるけど。まぁしゃあないね。
さて、普段プログラムはTerapadで書いているのですが、C#についてはVisual Studioを使っています。
やはり便利です。特に大規模なものを作るときは。
自分でもこのメソッドはなんだということになるので、sammaryだけは書いておくと便利です。
まぁそんな、Visual Studioですが好みに合わない点がいくつか。
テキストの自動整形絡みなんですけどね。
そこでオプション・テキストエディタ・C#をこのように変更
タブサイズ・インデントサイズ : 2
書式設定・改行 : 全部OFF
書式設定・行間・バイナリ演算子 : スペースを削除する
行番号表示 : ON
行番号ONを除くと全部窮屈になりそうな設定の変更だな。
で、どういうことなのかというと、標準設定では

    private void foo(int i)
{
bar(i - 1);
}

となるのが、

  private void foo(int i) {
bar(i-1);
}

となるということです。
まず、2字下げにしたのは、他のソースもほぼ全部そうなってるから。
昔は手動のは全部tabだったんだが、viでの扱いが悪いので、スペースにすることにした。
そのとき、tabの表示はだいたい8字下げなんだが、それでは長いと思ってたので、
2字にしたということ。2字ぐらいなら下げるのもほとんど手間にならなくていい。
昔のソースを掘り出してくるとtabで下げてるな。
なおC#のやつの標準設定は4字下げで、下げる方法はスペース。
{と改行ですが、僕は基本的に、改めて改行せずに{をつけるというやり方をします。
{だけはあまりに寂しいのでね。前にあるif()やらあっての{だと思ってるので。
バイナリ演算子の空白のは窮屈になりすぎる気はするけど。
i-1とかをi – 1のようにいちいち空白を入れるのはちょっとなぁと思ってたので。
ただ、その一方、i-jなどのような変数同士の計算では空白欲しいけどね。
けど、まぁこの程度はいいと思うので、全削除にしました。
行番号はあまり気にしなくていいけど、一応。
こんな風にしてVisual Studioの標準を変えれますよ。
特に{のやつは人によって随分好き嫌いがあるからね。
僕もこうやって変えれることを知ったのは最近だからなぁ。
まぁそんなわけで自分好みのソースを簡単にかければそれでいいねというのはあるわな。

実体をコピーしたいとき、参照だけほしいとき

ベクトル使っていろいろ書いてたわけですが、まぁ完成したよと。
けど計算が随分重い。曲がる回数の多い図面は嫌うらしい。
さて、これはC#のソースです。

string[] str1 = new string[1];
string[] str2 = new string[1];
str1[0]= "foo";
str2 = str1;
str1[0] = "bar";
Console.WriteLine(str2[0]);

大きさ1の配列だが、別にclassならなんでもいいはずなんだが、stringはうまくいかん。
これを見ると、str1[0]に"foo"を入れて、これをstr2=str1としたので、この時点ではstr2[0]は"foo"だ。
しかし次を見る、str1[0]を書き換えた。するとstr2[0]も変わっているという話。
うん、これを動かすと"bar"と返ってくるよ。
ここでした代入では、実体のコピーは伴ってないということ。参照だけコピーしているということ。
もともとstr1の実体が甲地点にあったとすると、str1もstr2も実体は甲地点にあると指しているだけ。
ここで、その中身を書き換えると、甲地点の実体を書き換えるだけだから、str1もstr2も書き換えられたものを参照していることになると。
一方、メソッドの引数は値渡しなので、実体のコピーを用意して渡していますよ。
まぁ前者はあまり気にしなくてもいいような気はするのだが、後者は少し気にしないといけない。
けど実際はあまり気にしなくていいプログラムばっかり書いてる気がするけど。
たとえばmypointなるインスタンスをなんか動かすメソッドを作ると。
まぁオブジェクト指向らしいメソッドの動かしかたは、

mypoint.move(v);

だな、まぁこれでいいでしょう。インスタンス自体が勝手に動いてくれる。非常に楽ですね。
けど、ここでこのメソッドをstaticにしたと考えよう。するとこんな風になるかな。

mypoint = move(mypoint,v);

これが1つの選択肢だろう。
で、こういう風に動作させたとき、実体はどう動くかという話なんだが。
たとえば、mypointの実体がもともと甲地点にいたとすると、moveメソッドに渡すときに実体は乙地点にコピーされて、乙地点への参照をメソッドに渡すと。
そして、moveメソッドは乙地点の実体をごにょごにょいじって、多分最後には乙地点の参照を返すでしょう。
そして、mypointには乙地点の参照が入って終了。
その後暇なときに、GCが一生使われることがなくなった甲地点の実体を掃除してくれる。
GCが掃除してくれるのは.net Frameworkのしわざですよ。これがあるおかげでいちいちメモリの開放をしなくていいんだよ。
ただ、なんか無駄が多い。そこでC#ではこんな取り扱いができる。

move(ref mypoint,v);

refというの付けるようにするところは、参照渡しを使うということ。
この場合、同様にmypointの実体がもともと甲地点にいたとすると、
moveメソッドには甲地点への参照を渡す。ここが通常の値渡しとの違い。
ここでmoveメソッドで、甲地点の実体をいじって、終わり。
すると、mypointの中身がひとりでに変わってくれてる。
まぁCなんかじゃよく見るやり方だな。僕は、ひとりでに値が変わるあたりが嫌いだが。
だから、インスタンス自体が動いているように見える一番目のようなやり方をよくするわけだが。
そんな調子でいろいろ書いていってたのだが、ここで、二番目のやり方ならば、

movedpoint= move(mypoint,v);

のようなことをやりたかった。
そこでこんなソースを書きました。

point movedpoint = mypoint;
movedpoint.move(v);

結論から言えば大失敗。ここでの代入は参照しか代入できてないから。冒頭で書いたとおりです。
movedpointの実体はmypointの実体と同じ。movedpoint.move(v);の動作でmypointまでやられた。
調べてたのだが、Classのコンストラクタに、与えられたインスタンスのコピーのインスタンスを作るようなものを作ればいいと。

point movedpoint = new point(mypoint);
movedpoint.move(v);

これでいい。コピーのインスタンスは完璧なコピーを作ったわけではないのだが、まぁいいでしょう。
さて、そんな具合にソースコードを書いてたら、まぁ完成しました。
なんかいろいろ調整してたら動作もよくなってきました。
人より速く求められるのが目標だな。簡単なものならすでに実現できてるけどね。

C#を使うのは楽というよりスマートに書けるから?

回路で相互インダクタンスが出てきていろいろやってたりする。
まぁしかし、T型等価回路に変換すると-M[H]のインダクタンスが出てきたりするけど、
そんなものは現実にはないわな。
計算の世界ではこれが便利でも、実際に見れないのは残念な話だ。
さて、C#で何かとプログラムを書いています。
最近はC・PHP・Perl・C#といろいろ使いますけど、やっぱり役割は違いますね。
Web以外でPHPは使わないし、Cで書くのは実用的というより実験的なものばっかりだな。
まぁ実用的なものは、PerlかC#ということです。
ここでC#はオブジェクト指向というのが根底にあるんだから、やっぱりオブジェクトを扱いやすいね。
そんなわけでClassの大量製造だ。
さて、今回やってるのは障害物の置かれた座標上で、任意の2点の移動方法を調べるやつ。
ただし移動はX軸方向かY軸方向だけ。
まぁこういうことを考えるのに用意したClassはmapとvectorだ。
vectorというのは非常に重要だ。
C#には標準ではこの手のClassがないのは非常に残念。あったら継承して使うんだけどなぁ…
というわけでxとyに使う変数を用意して、プロパティーを作って、
+,-,*の演算子を定義して、IFormattableを実装しつつToStringを作っておいた。
もし標準でこの手のクラスがあったらここまでは省略できたな。
で、作業を簡単にするためにこんなStaticなメソッドを作った。
(0,5)という移動があったとき、この先に障害物がないか確かめないといけない。
そのためには(0,0)…(0.5)進んだところを確かめないといけない。(0,0)はいらん気もするけど。
移動のベクトルを渡したらその進んで確かめないといけない先を並べた配列をもらえるというもの。
こんなのforループ回せばいいじゃないかと言うかもしれないけど結構な手間だ。
そこでここからもらってこればこれだけでいい。

foreach(vector vc in autoarr(v)){
if(!mymap.check(p+vc)) return false;
}

なんかPerlのforeachの使い方みたいな気もするが、これはこれでありでしょう。
実際(2.3)に対して、(0,0)…(0,3),(1,0)…(2,3)というのを返せるようになってたりと、
有用な点はいろいろある。
まぁこんな道具を用意しておいて、mapのClassに、ルート探索のメソッドを考えながら作っている。
座標も移動も何もかもvectorで混乱しそうになるのは厄介だな。
再帰的にメソッドを呼び出すべきかとかいろいろ考えてるけどな。
最終的にはmapのそのメソッドを動かすだけで、ルートがvector[]でもらえるというのを予想している。
もしかするとファイル読み込みでmapを作成するときに自動的に算出して、結果を保存しておくようにするかもしれんが。
まぁどちらにしてもmapのことを知らない人でも、少しの操作でルートを得ることができる。
いくら苦労して作っても、これを見ないで使えると言うことです。いやはや、カプセル化って恐ろしいですね。
しかし今いろいろ書いてるが、オブジェクトの相互関係でプログラムを表してる気はしないな。
うーん…現在位置のClassでも作ろうかなぁ…そうすればスマートになるか?

UA・IPが一致する人は同じ人かもしれない

さて、ここでも使ってるカウンターですが、
PHPでカウントして、Ajaxでカウントを見にいくというものです。
しかし、アクセスのたびにカウンターが回るのは都合が悪いのでCookieを食わせています。
Cookieの特徴はあるCookieを持っていれば、それはあるCookieを食わせた人と同じということ。
もっともCookieを勝手に作成されると問題があるから、Cookieの値だけで信用しないのが普通ですが。
たとえば、SessionIDをCookie食わせて、そのSessionにUAを記録しておいて変化していないか確認するとか。
まぁけど基本的にはCookieはユニークなユーザーでないか確かめる有力な方法だ。
ただし、Cookieを食わない人もいる。そんな場合はうまく判別できない。
で、ある程度信用できる方法としてUA・IPアドレスを比較するという方法がある。
IPアドレスだけではNATを使われると、区別が付かなくなりやすい。
UAだけでは、Fxユーザーが軒並み弾かれたりということが起きる。
そこで両方確認する。これでかなり確実になる。これでも弾きすぎる気がするけど。
さて、実際の手法を考えたのだが、カウンターのログファイルは非常に容量が多くてこれを見るのは現実的じゃない。
以前はこれの行数を数えてカウンターを表示させてたが、他にカウントのファイルを用意していますよ。
で、軽く処理できることが大切だと考えたので、カウントのファイルの後ろに3行記録を書き足すことにしました。
具体的な方法は、カウントファイルを配列に読み込んで、
Cookieを確認して、なければ2〜4行目のUA・IPと一致しないか確認、一致しなければ1行目のカウントを回して表示、
カウントファイルを、1行目に1増やしたカウント、2〜3行目に3〜4行目をコピー、4行目にこのユーザーのUA・IPを記録。
そしてログファイルに追加。
CookieかUA・IPが一致した場合は1行目のカウントを表示して終わり。
というわけで、意外とスマートに収まりました。
まぁしかし、違う人でもUA・IPが一致する場合というのは十分あり得るので、ちょっとひどいかなとも思っています。
その配慮で最近3回と比較するという方法をとっているんですけどね。
ただ、これを導入したのは部のだけで、fdiaryのは入れ替えてない。
まぁ今度整理して導入しようと思う。
ここのカウンターは過去の無駄な機能が多いので…まぁいらんなら消せばいいのだがJavaScript周りも確認しないといかんのでね。
しかし、Cookie切ってる人ってどれぐらいいるのかねぇ。

今DDR2の買い時なのは間違えないことなのか

さて、今度大阪の方に行くので、せっかくだからPCのメモリーを増築するために買い足そうかなと。
というのも最近Photoshopをはじめメモリを食うアプリケーションばっかり動かしてる。重いんだ。
CPU負荷が小さいことから考えてもSwap食いまくってるんだな。
そこから類推するにメモリの容量が増えればスムーズに動いてCPUの有効活用にもつながると。
このPCを構築するとき、DDR2の512MBを2枚買って5千円切るぐらいだったと記録してある。
しかし、現在は1GBでも2千円を切る程度。2GBもツクモで3180円とあるからかなり安いな。
ツクモの表示金額は市場をよく表していると思う。
まぁといってもこの件に関してはどこもこんなもんです。
というわけで、せっかく行く用事があるのだから、ぐるぐる見て回りながら探そうかなと。
部のマシンを新造するという話があって、その加減で日本橋に行くかという話になりましてね。
今、非常に部品の価格が安いんですよ。
理由はいろいろあると思います。円の価値が他に比べて最近高かったりするとか。
AMDの工場は大きいのがドイツにあるはずなんだが、
ユーロでの価格が一定だったとしても、最近円に換算すると安くなってると。
まぁこういう考えで行くと、CPUの生産コストが変わらなかったとしても円で言えばは下がってるように見えると。
結構大きいと思うよ。
あと、競争が厳しいから恐ろしい値下げをしたり、まぁいろいろ。
そんな訳で、買いとも言えるし、買いではないとも言えるわけだけど、
少なくともメモリの容量に関して言えば時代が変わったのは間違えないな。
ここでメモリの容量を増やすに考えるとすれば、
1GB、1GB×2、2GBといったところだろうか。まぁ既存の512MB×2は残すということにしよう。
1GBを一枚用意してつけるだけで2GBあるんだからかなり便利になるわな。
しかし今の値段が底と考えると2GBを買うのもありとは言える。
ただ、1GBを2枚乗せてデュアルチャネルで使えるかは疑問なんだよな。
今の512MBの2枚も本当にデュアルチャネルかわからん。そうなのかもしれないけど。
それならわざわざ高い2枚載せを選ぶ理由はないかなとか。
まぁ幸いなことにメモリスロットは4つあるから、2GB搭載するには1GB以上のものを使わないといけないとそんなことはない。
まぁそんなわけで1GBだけあればいいんだけどね。
だいたい512MBのメモリなんて余ってもどうしようもないし。DDR2を使う人がいればともかく。
売ることを想定したが、買い取り価格が300円とあるからなぁ…まぁ微妙。
まぁそんなわけで多分1GB、調子がよければ2GB買ってきますよと。
今回も例によって、お金を下ろすのを省くためにVISAデビットで切符をあらかじめ買った。
今回はJTB、さすがにKNTよりは小さかった。けど普通の乗車券よりむちゃくちゃ大きいけどね。自動改札不可だよ。

省略が行き過ぎたPerlはfor(‘P’,’e’,’r’,’l’){print;}で終わり

スクリプト言語では最強勢力ではないかと思っている、Perl、
なんかことあるごとにPerl言ってる割にはPerlをいままで使ったことがなくてねぇ。
Perlでできることというといろいろあるけど、やはり文字列処理に強いです。
それとやっぱりスクリプト言語らしく、変数の書き方なんかがおもしろい。
特に省略の仕方が怖すぎる。

#!/usr/bin/perl
open (IF,"<$ARGV[0]");
open (OF,"|terapad");
while(<IF>){
$_ =~ s/\s+$//;
s/^\s+//;
print OF "$_\n";
}
close (IF);
close (OF);

1行目はインタプリンタのパス。だいたい/usr/bin/perlみたいだね。
さて、ファイルの読み込み方がすごくて、リダイレクトとかみたいな書き方をする。<だから読み込み専用。
>foo.txtなら白紙にして書き込み(w)、>>foo.txtなら追加(a)てな感じ。
さらに不思議なのはパイプからもらったり、パイプに渡したり出来る。今回はTerapadに渡すことを考える。
@ARGVは引数。0から引数本体。
Perlの配列は@fooとか表すのだが、$n番目の内容は$foo[$n]と表す。
連想配列もあって、%barと表すのだが、キーが$hogeの内容は$bar{$hoge}となるわけだな。
ところで連想配列って、いろいろ訳があって、ハッシュテーブルとかいろいろだな。まぁここではもっぱら連想配列と言うが。
次のwhileなのだが、どうも慣れない。
イメージ的にはこんな感じ。

while(!eof(IF)){
$_ = <IF>;
#中身
}

という感じ。この<IF>というやつはファイルポインタを囲んでるだけなのだが、
$foo=<IF>;とすると1行読み込み、@foo=<IF>とすると配列にファイルを読み込み、
if(<IF>)とするとEOFに到達してないかという非常にマルチなやつで、
whileでは1行読み込みと同時にEOFにならないか確認している。while($foo=<IF>)のようにかくと$fooに読み込まれるのだが、
これも省略すると、$_に読み込まれる。なでしこに「それ」というのがあるが、これはきっと$_を模したものだろう。
=~という演算子は、置換やらそういうことをするための演算子で、置換はs/(正規表現)/(置換後)/の要領で書く。
まぁこの置き換えはおもしろくなくて、行の最後の1つ以上の連続した空白、最初の1つ以上の連続した空白をそれぞれ無に置換するというもの。
しかし、$_ =~ s/^\s+//;とあれば、単にs/^\s+//;とかくだけでいい。
ファイルへの書き込みはprint OF "$_\n";のように、ファイルポインタと書きたいものを空白でつなぐだけ。
ファイルポインタがSTDOUTなら省略できる、書きたいことが$_ならば、省略できる。
こんな風な省略というものはやまほどあって、
ファイルポインタ関係なら、<>と書けば<STDIN>のことだし、さっき言ったとおりprint "hoge";と書けば、書き出し先はSTDOUT。

#!/usr/bin/perl
open(IF,"<$ARGV[0]");
@foo = <IF>;
$len=@foo;
print "$len\n";
foreach(@foo){
s/\s+$//;
foreach( split(/,/) ){ print "$_ | "; }
print "\n";
}
close(FP);

さっき言ったとおり、@foo=<IF>とすると配列に読み込めると。
さて、ここで$len=@fooと代入して、それを表示させたが2と出る。配列の要素の数だな。
これを使ってforでループを作って配列を回すのもありなのだが、今回はforeachを使った。
foreach(@foo)とすると、@fooの中身を1つづつ$_に出して、処理できる。
$_じゃなくて$barにしたければforeach $bar(@foo)と書く。
foreachは建前上順序は不定だが、まぁこの際いいことにしよう。だいたい順序通りだし。
まず、行の最後の空白を取り除いて、sprit(/,/,$_)を考える。$_はあえて省略した。
これは配列だから、@barに代入してもいいんだが、これをそのままforeachで回してもらう。
で、"$_ | "を表示すると。こんな風に変数が展開されるのはPerlのいいところです。PHPも同様だが。
ダブルクオーテーションで囲めばこんな風に取り扱われる。
$fooの後にooという文字をつけるとき、"$foooo"とすると問題があるのは自明だから、"${foo}oo"と書ける。
あと、Perlはifなどの後が1文でも{ }で囲まないといけない。
ところでforeachの()内に入れるのは、配列、連想配列。
その一方、配列を自動作成するすばらしいものがあって(0..$len-1)と書くと、0,1,…,$len-1という配列をつくってくれると。
だから、増分が1のforループはforeachで連続した配列を回してやればできると。

foreach(0..9) {print "$_\n";}

もちろんforループはCなどで見慣れたあの形式だから、普通に使える。
あと、比較演算子なんだが、文字とそれ以外で異なる。

foreach(0..9){
if($_ < 3) {print "小\n";} elsif($_==3) {print "等\n"; } else {print "大\n"; }
}
foreach("山内","山田","山本"){
if($_ eq "山本") {print "一致\n";} else {print "異\n"; }
}

文字の比較演算子はアルファベットというわけです。なかなかおもしろいな。
なかなか強力だ。
しかし、残念なのは、Windowsマシンには標準で入ってないことだ。
本当に残念。Linuxでは間違えなく入ってて、sh並みに間違えなく使える物なのに。
家のマシンではCygwinのPerlで、部のマシンではActivePerlでやってます。
Perlを使って具体的に何ができるんだというと、それはちょっと答えにくいけど、
テキストファイルを大量に処理するには非常にいい。
ファイルリストをSTDINから読み込んで、それぞれ開いて、置換などを施して、保存してということとかね。
さっきのような狂った省略を使うことで、ずいぶんと作りやすくなるだろうね。
あと、タイトルにもあるような短いスクリプトはもっと簡単に、

$ perl -e "for('P','e','r','l'){print;}"

とすれば動くよ。
この気楽さもPerlの売りです。
あ、そうそう、foreachの代わりにforを使ってもいいらしいよ。文字数減らすためにタイトルはfor使ってる。
けどわかりにくくなるのでforeachを使おうな。

無限大に増幅するOPアンプはこれいかに

今度の実験がOPアンプの実験なもので、説明を聞いてたのだが、
増幅率無限大なんてもので増幅するとわけわからないものになるな。
まぁ実際は増幅率は無限大ではなくて、106 〜 107程度なわけだけど。
それでもとんでもない増幅なのは事実だな。
そんなのは直接使えないから、他の回路と組み合わせていろいろすることになるんだろうけどねぇ。
しかし、ようわからんので、以前シミュレーション実験で使ったPSIMでどうなるのか確かめてみることに。
体験版ならタダだし、GUIで操作しやすいもんだからね。
まぁこんな感じでしょう。
Figure
なんか無駄に電流計が挟んであるけど、シミュレータの世界の電流計は内部抵抗がないので問題ない。
あと、1つ足の謎の電圧計があるが、これはグランドとの電位差を測る。
さて、それで動かしてみると、理論通りおよそ-10倍に電圧が増幅された。
V2=-(R2/R1)V1ということね。電源の起電力は1[V]だったから、V2は-10[V]ぐらいになると。
OPアンプというのは無限に増幅するんだから、この+と-の間に電位差があると、その電位差を増幅して出力電圧をとんでもないことにしてしまう。
というわけで、電位差が0になるように勝手に調整してくれると。
まぁそういうのがここでのOPアンプの仕事じゃないのかな。性能をもてあましてるに違いないな。
それで電流なんだが、-と+は同じになるように調整されてるんだから、-のところもグランドと電位が同じなんだから、
R1のところには、およそ1/(1×10[sup]3[sup])=0.001[A]流れてた。
それで、I1のところはさっき言ったとおり電位差がないはずなので0[A]、残り全部はR2を流れるもので、ここもおよそ0.001[A]。
それでここでオームの法則を適用すると、R2の両端の電位差は10[V]、
電流の方向の加減でV2のところは0-10=-10[V]となるわけだな。
じゃあR3には、オームの法則を適用すると、10/100=0.1[A]がグランドからV2に向かって流れるでしょう。
R2からは0.001[A]・R3からは0.1[A]、あわせて0.101[A]の電流がOPアンプの出力に流れ込んで行ってた。
ありゃ?まぁようわからんけど、電流を融通してくれる便利な回路のようです。
というようなもんらしい。
こんな話を授業でやってないというのに、実験の説明言うて1時間ぐらい聞くことになったわけだが、ちんぷんかんぷん。
途中から、どうもこういうことらしいというのがわかったぐらいだ。
それで確かめてみたら、確かにそうらしいとわかった。
というわけで、これを使ってちゃんと増幅できるかとか、そういう実験、来週ですね。
どうもこのOPアンプというやつは、電圧の足し算とか、電圧の微分積分が出来る代物らしい。
動作はどれもこんな感じで、実にOPアンプにしてみれば力をもてあますようなもんですわ。
というか、誰が無限大に増幅する回路を作ろうなんて考えたんだ?

道路の余白は距離感を減らすのかな

さて、今日、自転車でちょっと出かけたんですが、
どうやって行こうかなと思って、2ルート思い浮かびました。
一長一短ありそうだったので、行きと帰りで違うルートを通ってみました。
まぁ、結論から言えば、行きのルートの方が短いし、坂も急なわけではない。
ただし坂の距離が長いので疲れますが。
帰りに通ったルートは通行量が少し少ないし、田舎の道の割には整備されてて走りやすかった。
ただ、一部、太い国道を通らないといけないのだけど、車が容赦ないので、歩道可を使わせてもらった。
こちらは坂の距離は短くて、実際標高グラフを見るとスパイク状の坂ばっかり。
坂を抑えるためにメイン通りじゃなくて、区画街路をぐねぐね走っていたりもしたけどね。
というわけで、何ルートか選択肢があるのはなかなかおもしろいもんです。
まぁさっきのは結論から言えば、行きのルートのほうがよかったわけだけど。
あと、新しい道路というのは、幅が広くて自転車でも走りよいですからね。
路側帯とか、車道の余白とか。車との干渉をあまり気にしなくていいからね。
ほんまかいなと思う話ですけど、遠回りしてるようでも、実際は半分ぐらいの時間で着くことありますからね。
僕は自転車でも幹線道路を使って突き進むことが多いわけだけど、車が多いのでなかなか難儀なもんです。
実際は車道の余白を利用しているわけですが。
そこで、車道の余白と歩道から一部いただいて、自転車専用レーンを作るというのが最近行われてますね。
それはそれでおもしろいのだが、逆走自転車がいると困るな。
歩道とか路側帯で逆走するのはOKなんだけどね。だから歩道と車道で棲み分けてたりもするよな。
けどそれは車道上だから逆走不可だよ。