色んなサイトを見て回ったけど、情報があちこち散らばっていて
探すのが大変だったのでまとめておきます。
【プログラムから行う場合】
パイプエラーから回復する方法
https://docs.microsoft.com/ja-jp/windows-hardware/drivers/usbcon/how-to-recover-from-usb-pipe-errors
【DevCon.exeを使った場合】
コマンド集
https://serverfault.com/questions/117898/is-it-possible-to-reset-ftdi-virtual-com-ports-enumeration-we-easily-get-hundre
devcon findall =usb
devcon findall =ports
【TIPS】
デバイスドライバーをリセットする方法
1.管理者権限でCmd「コマンドプロンプト」を起動する。
2.再起動したいデバイスインスタンスパスに対してrestartコマンドを送信する。
例:devcon restart USB\VID_0403*
これで通信エラーで復旧できないポートを復活させることができるかもしれません。
インターネット上にある断片化された情報を切り取って、リブログする。 主にソフトウェア、Ubuntu関連、CPUなど気になったニュース、また、日々の面白い出来事やニュースもリブログします。
2019年7月3日水曜日
2016年5月4日水曜日
ソフトウェア設計の最適化方法
ソフトウェア設計の最適化方法
ソースコードとは
まず、ソースコードで求められているものはなんだろう。というテーマから入って説明したいと思います。
世の中には
・ウォーターフロー開発モデル
・アジャイル開発モデル
・アスペクト開発モデル
・プロトタイプ開発モデル
などいろんな手法が考案されて、様々な現場で利用されているのではないでしょうか。
運用する時は、組織体系に合わせて世の中一般の開発モデルをカスタマイズされているので
A社、B社が同じ開発モデルを利用していて、あるプロジェクトで情報を共有して共同開発しようなんて場面に出くわした時は
必ずといって情報の一元化を行いましょう、という合言葉とともに本来不要なプロセスが発生する。
(同じ開発モデルだから相性はいいが、完全一致させることは不可能と思われる)
情報とは
熱力学のエントロピーという言葉を耳にしたことがあると思う。
これは、
集約されている状態は秩序が保たれていてエントロピーは小さく、
散っていて無秩序な状態のことをエントロピーが大きいと表現している。
この考え方は情報分野にも当てはめることができる。
圧縮アルゴリズムを勉強した人はハフマン符号化を学ぶときに情報エントロピーという言葉が出てくる。
情報エントロピーとは、これ以上圧縮できないデータ量の事で、冗長性が非常に小さい状態のことを意味する。
前の話で組織間で出てきた「情報の一元化」とは、
お互い同じ情報を扱っているのに散ってしまう情報を打破するために行われる手法だという事を意味している事が分かる。
もう少しわかりやすい表現に変化させてみよう。
「情報の一元化」を別の言い方で表すと、「枠組みの中で情報の整理整頓を行う」となる。
ここで出てきた枠組みの中でというのが社間を意味し、そこで得られた情報を整理整頓を行うことである。
つまり社間では情報の中身ではなく、情報の出入りの話であって、これは仕様書などのドキュメントを台帳管理しようという事を示している。
ソフトウェア仕様とエントロピー
少しずつ現場レベルに考え方をシフトしていく。
ハフマン符号化に出てくる情報エントロピーの考え方でいくと、
「冗長性をなくす」事でエントロピーが小さく、秩序が保たれているとこである事を意味している。
この考えは同じものが無ければまとまっているように思えるが、ソフトウェアの場合は時間軸があり仕様変更があるので、情報エントロピーという考えで情報をまとめることは難しい。
そこで原点に戻って、熱力学のエントロピーには「エントロピーの増大の法則」というものがあり、時間が経過していくとエントロピーは増加するというものである。
この考えを当てはめると、ソフトウェアは時間と共に仕様変更が行われ、エントロピーが増大していく。
と言える。
つまりソフトウェアの性質上、仕様変更が発生して、追加・変更・削除が設計・コードに反映される。
ソフトウェアの変化を管理する事でエントロピーの増大を記録することができる。(減少はしない)
裏返しにするとエントロピーが減るような仕様書は無い、仕様変更は工数が発生して費用が発生するという事が言える。
ソフトウェア設計とエントロピー
仕様変化することでエントロピーが増大するという事を説明した。
次に仕様と設計について述べていこうと思う。
熱力学でいうと 熱エネルギーは 高いものから低いものへ移動していくというものがある。
これを仕様=熱いもの 設計=低いもの に例えると、
仕様書から設計書へ情報を移すと散らばる(千差万別)と表現してみると分かりやすいのではないだろうか。
設計書を書くとエントロピーが増大していくのは自ら苦しめていくようなものなので、
よくある事例を出すと書き方の統一である。
最近ではUMLで図の書き方を統一しようという動きはあるが、
設計書に適用する場合は運用ルールを決めて、書き方のテンプレートとガイドラインを用意しておくと良い。
また仕様変更で変化した場合は新たにドキュメントを作成しバージョン管理して
変化内容と以前の仕様、最終仕様を明確化しておく事とトレーサビリティが保たれる。
ソースコードとエントロピー
現場でよくあることは、
・Aさんのコードはまとまっていて見やすいコードを書く
・Bさんのコードは乱雑なコードを書く
というように人によって書き方が変わって秩序が乱れエントロピー増大に繋がっていることがある。
これも設計と同じように、書き方のテンプレートやガイドライン、フレームワークを利用する事で
書き方が統一できるようになる。
もう少し細かく書くと、
仕様とは、構造と機能の2つに分類され、
構造はフレームワーク
機能はユースケース、ステートマシン、外部通信仕様などに分類して表せることができて、それぞれに追加・変更・削除
がある。
機能の追加や変更、削除はオブザーバブルなものであって、
ある機能を
使う(Main)
動かす(Sub)
評価(Test)
に分けることで分担作業が可能になって機能を分割しやすくなる。
より具体的に説明すると、
Mainクラス(上位:使う側)
Subクラス(下位:実働側)
Test(Mainクラスで使い方サンプル集みたいなもの)
の3つに分けて実装し、
機能の管理はMainで行われて、機能の実装はSubクラスで行う
TestクラスでSubクラスの品質評価を行い、
Mainクラス側でビジネスフローを実装する。
こんな具合になる。
これでエントロピーが減らせるのか?と思うだろうが、
仕様変更が起こると 仕様変更(Main)、機能変更(Sub)、変更に伴う評価(Test)
それぞれに作用が行われ、どの規模の変更が起きたのかが現場レベルで実感しやすくなり、
対費用効果の算出などに有用であることが分かる。
例えば、
・仕様追加ならMain・Sub・Testに影響
・仕様変更ならMainに影響(ビジネスフローは人力で評価を想定)
・機能変更ならSub・Testに影響
ざっくりまとめると、
・仕様書のバージョン管理
・WBSによる機能対応表
・ソースコードの実装を分担化
となる。
より精度の高い最適化を行うのであれば、エントロピーの増大について学んで
エントロピーを減らすことはできない事を理解して、いかにして増大するを抑止するかを考えてみると良いと思います。
ソースコードとは
まず、ソースコードで求められているものはなんだろう。というテーマから入って説明したいと思います。
世の中には
・ウォーターフロー開発モデル
・アジャイル開発モデル
・アスペクト開発モデル
・プロトタイプ開発モデル
などいろんな手法が考案されて、様々な現場で利用されているのではないでしょうか。
運用する時は、組織体系に合わせて世の中一般の開発モデルをカスタマイズされているので
A社、B社が同じ開発モデルを利用していて、あるプロジェクトで情報を共有して共同開発しようなんて場面に出くわした時は
必ずといって情報の一元化を行いましょう、という合言葉とともに本来不要なプロセスが発生する。
(同じ開発モデルだから相性はいいが、完全一致させることは不可能と思われる)
情報とは
熱力学のエントロピーという言葉を耳にしたことがあると思う。
これは、
集約されている状態は秩序が保たれていてエントロピーは小さく、
散っていて無秩序な状態のことをエントロピーが大きいと表現している。
この考え方は情報分野にも当てはめることができる。
圧縮アルゴリズムを勉強した人はハフマン符号化を学ぶときに情報エントロピーという言葉が出てくる。
情報エントロピーとは、これ以上圧縮できないデータ量の事で、冗長性が非常に小さい状態のことを意味する。
前の話で組織間で出てきた「情報の一元化」とは、
お互い同じ情報を扱っているのに散ってしまう情報を打破するために行われる手法だという事を意味している事が分かる。
もう少しわかりやすい表現に変化させてみよう。
「情報の一元化」を別の言い方で表すと、「枠組みの中で情報の整理整頓を行う」となる。
ここで出てきた枠組みの中でというのが社間を意味し、そこで得られた情報を整理整頓を行うことである。
つまり社間では情報の中身ではなく、情報の出入りの話であって、これは仕様書などのドキュメントを台帳管理しようという事を示している。
ソフトウェア仕様とエントロピー
少しずつ現場レベルに考え方をシフトしていく。
ハフマン符号化に出てくる情報エントロピーの考え方でいくと、
「冗長性をなくす」事でエントロピーが小さく、秩序が保たれているとこである事を意味している。
この考えは同じものが無ければまとまっているように思えるが、ソフトウェアの場合は時間軸があり仕様変更があるので、情報エントロピーという考えで情報をまとめることは難しい。
そこで原点に戻って、熱力学のエントロピーには「エントロピーの増大の法則」というものがあり、時間が経過していくとエントロピーは増加するというものである。
この考えを当てはめると、ソフトウェアは時間と共に仕様変更が行われ、エントロピーが増大していく。
と言える。
つまりソフトウェアの性質上、仕様変更が発生して、追加・変更・削除が設計・コードに反映される。
ソフトウェアの変化を管理する事でエントロピーの増大を記録することができる。(減少はしない)
裏返しにするとエントロピーが減るような仕様書は無い、仕様変更は工数が発生して費用が発生するという事が言える。
ソフトウェア設計とエントロピー
仕様変化することでエントロピーが増大するという事を説明した。
次に仕様と設計について述べていこうと思う。
熱力学でいうと 熱エネルギーは 高いものから低いものへ移動していくというものがある。
これを仕様=熱いもの 設計=低いもの に例えると、
仕様書から設計書へ情報を移すと散らばる(千差万別)と表現してみると分かりやすいのではないだろうか。
設計書を書くとエントロピーが増大していくのは自ら苦しめていくようなものなので、
よくある事例を出すと書き方の統一である。
最近ではUMLで図の書き方を統一しようという動きはあるが、
設計書に適用する場合は運用ルールを決めて、書き方のテンプレートとガイドラインを用意しておくと良い。
また仕様変更で変化した場合は新たにドキュメントを作成しバージョン管理して
変化内容と以前の仕様、最終仕様を明確化しておく事とトレーサビリティが保たれる。
ソースコードとエントロピー
現場でよくあることは、
・Aさんのコードはまとまっていて見やすいコードを書く
・Bさんのコードは乱雑なコードを書く
というように人によって書き方が変わって秩序が乱れエントロピー増大に繋がっていることがある。
これも設計と同じように、書き方のテンプレートやガイドライン、フレームワークを利用する事で
書き方が統一できるようになる。
もう少し細かく書くと、
仕様とは、構造と機能の2つに分類され、
構造はフレームワーク
機能はユースケース、ステートマシン、外部通信仕様などに分類して表せることができて、それぞれに追加・変更・削除
がある。
機能の追加や変更、削除はオブザーバブルなものであって、
ある機能を
使う(Main)
動かす(Sub)
評価(Test)
に分けることで分担作業が可能になって機能を分割しやすくなる。
より具体的に説明すると、
Mainクラス(上位:使う側)
Subクラス(下位:実働側)
Test(Mainクラスで使い方サンプル集みたいなもの)
の3つに分けて実装し、
機能の管理はMainで行われて、機能の実装はSubクラスで行う
TestクラスでSubクラスの品質評価を行い、
Mainクラス側でビジネスフローを実装する。
こんな具合になる。
これでエントロピーが減らせるのか?と思うだろうが、
仕様変更が起こると 仕様変更(Main)、機能変更(Sub)、変更に伴う評価(Test)
それぞれに作用が行われ、どの規模の変更が起きたのかが現場レベルで実感しやすくなり、
対費用効果の算出などに有用であることが分かる。
例えば、
・仕様追加ならMain・Sub・Testに影響
・仕様変更ならMainに影響(ビジネスフローは人力で評価を想定)
・機能変更ならSub・Testに影響
ざっくりまとめると、
・仕様書のバージョン管理
・WBSによる機能対応表
・ソースコードの実装を分担化
となる。
より精度の高い最適化を行うのであれば、エントロピーの増大について学んで
エントロピーを減らすことはできない事を理解して、いかにして増大するを抑止するかを考えてみると良いと思います。
2016年2月15日月曜日
ロボットアームのXYZ座標の計算式
去年からやっているロボットアームの位置制御でX,Y,Z座標からモーターの角度を計算する式で一番シンプルなものができたのでメモ。
条件:水平方向に動くモータが1つ、垂直方向に動くモーターが2個あるロボットアームのとき
それぞれの部位の名称を
・付け根を肩(垂直軸Base、水平軸Shoulder)、
・中間を肘(Elbow)、
・先端を手首(Wrist)
かつ腕の長さが等分であると定義する。
上記条件において、手首WristのX、Y、Z座標を与えた時それぞれの角度を求める式。(決定版)
///
/// ShoulderとElbowの長さが一緒なら二等辺三角形で計算式を解く
///
///
///
///
public void Calc(double x, double y, double z)
{
var h = Math.Sqrt(x * x + y * y);
var k = Math.Sqrt(h * h + z * z);
var pa = Math.Atan(z / h);
var pb = Math.Acos(k / 2.0);
X = x;
Y = y;
Z = z;
ThetaBase = Math.Atan(y / x);
ThetaShoulder = pa + pb;
ThetaElbow = -2.0 * pb;
}
腕の関節の長さが一緒なら二等辺三角形になる。
そうすることで何が嬉しいかというと、2等辺三角形の公式が使えるので
辺の長さを無視する事が出来る。
つまり、XYZ座標から斜辺kを求めれば全ての角度が計算できる事を意味している。
ロボットをこれからやろうと思った人はぜひ、参考にしてください。
2016年1月19日火曜日
NON GENUINE DEVICE FOUND! エラーが出る
USBシリアル変換ケーブルにFTDI製互換チップが使われているのが原因。
対処方法は古いドライバを使えば解決する。
1つ目はバージョンダウンするだけで良いが、
2つ目はVIDとPIDが写真通りになっていないといけない。
もし異なっている場合は、FTDI製のドライバをインストールした時に一緒に入ってくる「FT-PROG」というツールで書き換えができる。
書き換えたらドライバーをバージョンダウンする事。
対処方法は古いドライバを使えば解決する。
1つ目
2つ目
1つ目はバージョンダウンするだけで良いが、
2つ目はVIDとPIDが写真通りになっていないといけない。
もし異なっている場合は、FTDI製のドライバをインストールした時に一緒に入ってくる「FT-PROG」というツールで書き換えができる。
書き換えたらドライバーをバージョンダウンする事。
2016年1月8日金曜日
2015年8月5日水曜日
[RaspberryPi]デスクトップでログイン画面を表示せず自動ログインさせる方法
探したけど最初の/etc/inittabの記事ばかりでこちらが無かったのでメモ。
sudo vim /etc/lightdm/lightdm.conf
下の方に
#autologin-user = ...
となっている部分があるのでコメントを外してログインユーザ名を入れて保存。
autologin-user = pi
これでログイン画面がなくなった。
sudo vim /etc/lightdm/lightdm.conf
下の方に
#autologin-user = ...
となっている部分があるのでコメントを外してログインユーザ名を入れて保存。
autologin-user = pi
これでログイン画面がなくなった。
ラベル:
Raspberry_Pi,
tips
2015年7月1日水曜日
オブジェクト指向の間違いを正す
オブジェクト指向がしっくりこないと思ってたいたのがようやく構造設計でオブジェクト指向を設計したらようやく答えが見えたので書き留めておこうと思う。
私はIT業界に就業して、まず初めに構造設計から入り、1ソース数万行のソースコードに仕様追加などを経て、今まで対岸の存在であったオブジェクト指向だったはずが
「オブジェクト指向はいいよ」って布教活動する人が周りに増えてしまい、しぶしぶオブジェクト指向の世界に入信している。
しかしオブジェクト指向の世界はどうも無駄が多く、同じ名前の関数を複数のクラスにまたがって呼び合ったりする構造、ネストが深くなり逆に分かりにくいんじゃないの?ってさえ思った。
色んな本やネット、同僚からの話を聞いてもしっくりこない。
大規模なソースコードこそ悪とされる風習の中で1ソース数万行とかざらだった現場上がりの人間からすると、Grepだけで問題の個所に辿りつけたのに今じゃ小さなオブジェクトが無数にあって綱渡りして進まないと答えにたどり着けない。
その話をすると何を言ってるんだ、オブジェクト同士は互いに協調しあって動いているから回りに影響を与えない為にそうなっている。と説教されたとしても自分のイメージ空間には
「宇宙空間に漂う惑星が互いに協調しあっているんだ!」
と、目に見えないがそこにはあると言われても、オカルト的な宗教の勧誘を受けている感覚に襲われる。
自分の中にあるオブジェクト指向に対するモヤモヤとした感情はずっと片付かないものであったが、ようやく構造設計で学んだ知識を基にオブジェクト指向の概念を自分で構築してみてようやく答えが見つかったのだ。
何がしっくり来なかったのか説明する前に、まず生みの親も現在のオブジェクト指向は良いように見ていないのでそこから読みほどきたいと思う。
-------------------------------------------------------------
本来オブジェクト指向が重視すべきは「オブジェクト」ではなく「メッセージング」であるにもかかわらず「メッセージング」がおろそかにされているためである。特に言語の進歩において「オブジェクト」や「クラス」の側面ばかり強調される傾向にあり、Alan Kay博士は「Smalltalkが最高に好きという訳ではないが、他の言語に比べればマシである。」と述べている。
1つ目「オブジェクト指向という言葉は失敗」
これはネット上や書籍の文献を読んでもわかる通り、漠然とした内容かつニュアンスがまちまち変わる。それはオブジェクト指向の多態性とも言える皮肉な事が挙げられると思っている。
つまり、
アーキテクチャが正しく世に広まらなかったので、オブジェクト指向という言葉が失敗だった、と言える。
2つ目「重視すべきは「オブジェクト」ではなく「メッセージング」」
1つ目の言い分だろう。
オブジェクト指向とは、から始まると必ず「カプセル化」、「多態性」、「再利用性」などがずらっと出てくる。この言葉を指すものが「クラス図」「オブジェクト図」となってしまう。誰がこれらをメリットだと言い放ったんだが知らないけど、きっとUMLの売り込み文句とオブジェクト指向を抱き合わせて普及させたからだと思う。
3つ目「特に言語の進歩において「オブジェクト」や「クラス」の側面ばかり強調される傾向」
多重継承、インターフェイス、MixInなどなど、その辺りの事を指していて「理想のオブジェクト指向」とは別の進化を広がっているを受け取れる。
4つ目「Smalltalkが最高に好きという訳ではないが、他の言語に比べればマシである。」
これを語るにはSmalltalkを学ばないと分からない。
ざっくり見てみると、
オブジェクトビュアーなるものがあって、そこでオブジェクトを構築するそうだ。
つまりオブジェクトがメイン。クラスは存在しない?
-------------------------------------------------------------
オブジェクト指向と向き合って、書籍を読んでからこれがオブジェクト指向だと学びしっくりこなくて
理解しようと色々やってみてようやく分かった事がある。
それはオブジェクト指向の書籍やネットを見るモデリング手法で描かれる
オブジェクト図、クラス図の考えがごっちゃになっている。
よくある例は、汎化の説明で
「飛行機」←{「ジェット機」「オスプレイ」「グライダー」}
をクラス図で表現しているが間違い。
この図はオブジェクト図で表現すべき項目である。
プログラム化すると
インターフェイスを定義してインターフェイスを持つ実体クラスを定義する。
これは正しい。オブジェクト指向において基本的なやり方である。
が、違う点は1つある。
これはクラス図で表現するのではなく、オブジェクト図で表現すべき事象であるからだ。
オブジェクトの表現はクラス図ではなく、オブジェクト図。
クラス図は
「パソコン」←コンポジット―{CPU、メモリ、HDD、ヒートシンク}
といったように、
クラスは箱であり、その中にオブジェクトを入れる。
ここでピンと理解できた人は意識の高い人だ。
分からなかったら基本的な事が基本的すぎて目の前にあるのに気付かない、そんな状態だろう。
・オブジェクトはオブジェクト(実体)
・クラスはクラス(箱)
というように意味が全く違う。
実体を表す為、プログラムの制約上
クラス(設計図) → インスタンス生成 → オブジェクト(実体)
この流儀に沿ってプログラム化しないといけないので
オブジェクトを作るのみクラスを書く。これを利便性よくモデルクラスと呼ぶ。
モデルクラスには表現したいオブジェクトの要素を書き表す作業となるはずだ。
ここには振る舞いは存在しない、オブジェクトは置物みたいなものだから。
もしあなたが100円ショップに買物に来てフライパンを買ったとしよう。
そのフライパンは通常のフライパンとして扱う人もいれば、DIYで別の部品として使う人もいるだろう。
オブジェクトとはそんなものだ。
そのように理解してもらえれば振る舞いなんて後から使う人が決めればいいじゃんってなり、オブジェクト自体に振る舞いはいらない。
ここでプログラム要素を交えてまとめると、
モデルクラスのインスタンスから特定の振る舞いを行う(コントローラクラスの)オブジェクトを生成する。
これに尽きる。
最初に決めるのはモデルクラスであって振る舞いは後付でも構わない。
こうする事で
クラス図には動きのあるオブジェクトをどう組み合わせていくか
という視点で図が描かれていく。
もちろんオブジェクトを表現するモデルクラスも出てくる。
出てくるものは汎化した最上位クラスが登場する。インターフェイスではない。
文頭で書いたようにクラス図もオブジェクト図もごっちゃになってクラス設計をすると
出来上がるソフトもごっちゃになって、無用なネストが多発しやすくなる。
さらに新しいモデルを作る時に回りに与える影響が大きくなってしまう。
つまり、本当に理解した人以外はオブジェクト指向を語ると混乱の元になって
汎化・特化・集約などを意識してやってみたがどうもうまくいかない。
なぜなら似たオブジェクトなのに別クラスで定義されているからなんて事が発生する。
こういう事が言いたかった。
長くなったので、今回はクラス図とオブジェクト図についての説明で終えようと思う。
2015年3月26日木曜日
CMOSイメージセンサーのノイズ除去テクニック(2)
前回はノイズの種類に2つあることを記事にした。
今回は固定パターンノイズを除去してランダムノイズはどういうものかについて考察してみる。
![]() |
| ランダムノイズを累積した画像(左)、原画(右) |
左側は時間軸で見て動いた値を累積した画像です。
すでに固定パターンノイズは除去済みで左右共に64枚画像を合成・平均化したものになります。
右側は合成しただけあってノイズが全然みえないです。iphoneアプリと同じ効果がでてますね。
ノイズ画像側を見るとヘッドホンが文字までハッキリと写っているのが分かる。
つまりランダムノイズって輪郭となるエッジに吸い寄せられるように集まってくるのか?と思って時間軸フィルタを作ってみたり色々ノイズ除去のアイデアを実施してみたがうまくいかない。
なぜだと原点に立ち戻ってみると、
Y(出力値) = A(CMOS特性) * (Xランダムノイズ + K理論値) + B(固定パターンノイズ)
もうここの時点で間違いだったという事に気づいた。
固定パターンノイズは蚊帳の外だと思って 固定パターンノイズ と ランダムノイズを分けて考えるにはちょっと早くて
Y(出力値) = A(CMOS特性) * {(X理論値 + ランダムノイズ) + B(固定パターンノイズ)}
なので、まず最初にやるべきことは出力値をCMOS特性で割って {理論値+ノイズ}の値を求めなくてはいけなかったことだ。
A(CMOS特性)はカメラで黒と白の画像を撮影して検量線{入力値ー出力値}の1次間数が求めておいて次の計算式を解く。
値{(Y/A) - B} = Xランダムノイズ + K理論値
ここまで来てやっと固定パターンノイズを無視してランダムノイズのみを対処できるようになる。
何を間違っていたかというと
{(Y - B) / A} = X理論値 + Zランダムノイズ
最初に出力値から固定パターンノイズを引いていた所である。
これだと何がいいかというと Aを求めるときにBを含める事ができるので
Y / A = X理論値 + Zランダムノイズ
というようにできる点。
結果の違いは微々たるものだけど、間違いは正しておく必要があるので書き残しておく。
ここから前回と今回の成果をまとめると
●検量線作成
・ダーク撮影 =暗電流測定
・白背景撮影 =ホワイト =何枚か撮影して最小値を測定して、ランダムノイズ=0の白画像を取得したら平均値Mを計算する。
●画素単位のCMOS特性Aを求める
1画素単位にAを求める。該当画素をWとするとW/M
(入力値、出力値)(0, 0)(M, W)を通る線がAとなることから、Aの値は
A=W/M
以降の計算で逆数になるので、計算しやすいように逆数にする
A'=M/W
●得た値から本来の色を求める式を導出
この時点でY=AX+Bを計算式で求まるようになっていることから
式を変形させ
X=(Y-B)/A
X=(Y-B)*A'
本来はランダムノイズZがあるので付加する。
X+Z=(Y-B)*A'
K=X+Zとしたとき
固定パターンノイズ除去画像K=(取得した画像Y - 黒画像B) * (CMOS特性画像A')
となる。
ランダムノイズの手がかりは画像Kしかないのでそこからランダム・ノイズ画像を作成して
X = K - Z(ランダムノイズZ)
を求めると答えになる。
ランダムノイズはNLMeanフィルタやBilateralフィルタでノイズ除去でZを消す手法が一般的だけど
もう少し画素単位でランダムノイズを除去する手法がないか模索してみる。
CMOSイメージセンサーのノイズ除去テクニック
2014年7月30日水曜日
テキストで作れるUML「PlantUML」
テキストで書けるUMLを見つけた。
http://plantuml.sourceforge.net/
最終的にはdoxygenなどに埋め込んでドキュメント化ができるみたいだけど、
書き方になれるまでは専用エディタを使ってからのがよさそうだ。
https://code.google.com/p/plantumleditor/
こういうツールってソースコードを最初に書いて、
最後にできたものが設計書になるという便利なものだが
忘れがちになるのが設計フェーズを飛ばしてコーディングからスタートして
作り直しが発生して最終成果物がアウトプットされるまでにかかる時間コストが
増えてしまいがちになるので、設計はコーディングとは別作業にすべきと思う。
2013年11月8日金曜日
IIS環境設定のバックアップとリストア
IIS構成マネージャーの設定をバックアップ・リストアしたい場合のメモ。
・バックアップ
管理者権限でコマンドプロンプトを起動して、
%systemroot%\system32\inetsrv\APPCMD backup "バックアップファイル名"
・リストア
%systemroot%\system32\inetsrv\APPCMD restore backup "バックアップファイル名"
・バックアップデータが保存されているフォルダ
%systemroot%\system32\inetsrv\backup\
バッチ処理で
バックアップフォルダにバックアップファイルをコピーして、
リストア処理を実行すれば、
インストーラーによるIIS設定の自動化が可能になる。
・バックアップ
管理者権限でコマンドプロンプトを起動して、
%systemroot%\system32\inetsrv\APPCMD backup "バックアップファイル名"
・リストア
%systemroot%\system32\inetsrv\APPCMD restore backup "バックアップファイル名"
・バックアップデータが保存されているフォルダ
%systemroot%\system32\inetsrv\backup\
バッチ処理で
バックアップフォルダにバックアップファイルをコピーして、
リストア処理を実行すれば、
インストーラーによるIIS設定の自動化が可能になる。
ラベル:
tips
2013年11月4日月曜日
buffalo WHR-G300でDD-WRT化メモ
この機種は海外モデルのWHR-G300N V2に該当するらしく、
DD-WRTのサイトに置かれているファームで動作OKという情報を見つけたので試してみた。
これは自分用メモ。
ファーム書き換えはルーターの設定画面の開発者用ページを開くことで行う事ができる。
やり方は、
1.URLを開く。
http://192.168.11.1/cgi-bin/cgi?req=frm&frm=py-db/55debug.html
2.ユーザー名:bufpy
3.パスワード:otdpopy +『設定しているパスワード』
~(これはやらなくても大丈夫だった) ~
4.コマンドラインに『ubootenv set region US』を入れて実行
5.ルーターを再起動
~~~
ログインしたら、下記URLにアクセスして、ダウンロードしてきた「WHR-G300N V2」ファームウェアを指定してアップデート開始する。
/cgi-bin/cgi?req=frm&frm=py-db/firmup.html
完了。
初期のIPアドレスは、192.168.1.1になっているのでここは注意しておくこと。
それと、eaccessのADSLでブリッジ化を行っているので、pppoeの設定を行った。
アカウント名は、モデムとPCを繋げて
PCのIPアドレスを192.168.0.2に固定してから
http://192.168.0.1/にアクセス。
ログイン名:root、パスワード:root
アカウント名を取得したらpppoeの設定に入れ、パスワードは適当なものを入れておく。
これでOK。
あとは電波出力を20→10に変更くらいでひとまずまとめ終了。
DD-WRTのサイトに置かれているファームで動作OKという情報を見つけたので試してみた。
これは自分用メモ。
ファーム書き換えはルーターの設定画面の開発者用ページを開くことで行う事ができる。
やり方は、
1.URLを開く。
http://192.168.11.1/cgi-bin/cgi?req=frm&frm=py-db/55debug.html
2.ユーザー名:bufpy
3.パスワード:otdpopy +『設定しているパスワード』
~(これはやらなくても大丈夫だった) ~
4.コマンドラインに『ubootenv set region US』を入れて実行
5.ルーターを再起動
~~~
ログインしたら、下記URLにアクセスして、ダウンロードしてきた「WHR-G300N V2」ファームウェアを指定してアップデート開始する。
/cgi-bin/cgi?req=frm&frm=py-db/firmup.html
完了。
初期のIPアドレスは、192.168.1.1になっているのでここは注意しておくこと。
それと、eaccessのADSLでブリッジ化を行っているので、pppoeの設定を行った。
アカウント名は、モデムとPCを繋げて
PCのIPアドレスを192.168.0.2に固定してから
http://192.168.0.1/にアクセス。
ログイン名:root、パスワード:root
アカウント名を取得したらpppoeの設定に入れ、パスワードは適当なものを入れておく。
これでOK。
あとは電波出力を20→10に変更くらいでひとまずまとめ終了。
ラベル:
tips
2013年9月24日火曜日
海外旅行するときの注意メモ
海外旅行にいってきて、思った事
10つメモを書いてみた。
・基本編
○目覚ましを用意する
→時計と目覚ましは自分が用意したものを使うこと。
ホテルにアラーム付き時計はあるが、使い方が分からない事が多い。
○海外で知らない人から話しかけられたときは警戒しておくこと。
→トラブルの元は最初から作らない。
○安全な格好でいること
→あまり派手な格好をしない。
○表情を見て会話する
→母国語で無い分、ボディーランゲージ的なものはとても重要。
○譲り合いはしなくて良い
→マナーやルールが違うので、日本と違うという意識をもつこと。
○警戒心をもつ
→町並みや人相を見てここは安全かなどを判断すべし。
もし襲われたらどう対処するかなど考えて行動しておくとよい。
・外食編
○言葉が分かんなくて、何でもイエスといってしまうのは絶対にしてはいけない。
→人がよさそうな感じに接してくるが、全部は値段の高いものを頼ませる為。
○注文の仕方などは事前に下調べしておく。
→言葉が分からないならなおさら、注文方法だけは覚えておくこと。
○
・ホテル編
○セーフティーボックスは使うな。
→金庫はホテルスタッフからすれば自在に取り出しが可能なので、本当の貴重品は入れないようにする事。
貴重品は常に携帯しておいて、分散して持っておくと良いかも。
10つメモを書いてみた。
・基本編
○目覚ましを用意する
→時計と目覚ましは自分が用意したものを使うこと。
ホテルにアラーム付き時計はあるが、使い方が分からない事が多い。
○海外で知らない人から話しかけられたときは警戒しておくこと。
→トラブルの元は最初から作らない。
○安全な格好でいること
→あまり派手な格好をしない。
○表情を見て会話する
→母国語で無い分、ボディーランゲージ的なものはとても重要。
○譲り合いはしなくて良い
→マナーやルールが違うので、日本と違うという意識をもつこと。
○警戒心をもつ
→町並みや人相を見てここは安全かなどを判断すべし。
もし襲われたらどう対処するかなど考えて行動しておくとよい。
・外食編
○言葉が分かんなくて、何でもイエスといってしまうのは絶対にしてはいけない。
→人がよさそうな感じに接してくるが、全部は値段の高いものを頼ませる為。
○注文の仕方などは事前に下調べしておく。
→言葉が分からないならなおさら、注文方法だけは覚えておくこと。
○
・ホテル編
○セーフティーボックスは使うな。
→金庫はホテルスタッフからすれば自在に取り出しが可能なので、本当の貴重品は入れないようにする事。
貴重品は常に携帯しておいて、分散して持っておくと良いかも。
2013年4月2日火曜日
haar wavelet変換
以前に画像処理でhaar wavelet変換を書いたのだが行方不明になって
再実装することになったのでここに残しておく。
メモ:
waveletは、平均値と差分のペアになっていて可逆である。
再実装することになったのでここに残しておく。
メモ:
waveletは、平均値と差分のペアになっていて可逆である。
Class MainWindow
Private Sub Button_Click_1(sender As Object, e As RoutedEventArgs)
'--- Haar wavelet変換 ---
Dim A = CInt(tbA.Text)
Dim B = CInt(tbB.Text)
Dim C = CInt(tbC.Text)
Dim D = CInt(tbD.Text)
Dim AB0 = A + B
Dim AB1 = A - B
Dim CD0 = C + D
Dim CD1 = C - D
Dim HH = (AB0 + CD0) / 4
Dim LH = (AB0 - CD0) / 2
Dim HL = (AB1 + CD1) / 2
Dim LL = (AB1 - CD1)
'--- Haar wavelet逆変換 ---
Dim _HH = HH
Dim _LH = LH / 2
Dim _HL = HL / 2
Dim _LL = LL / 4
Dim _00 = (_HH + _LL)
Dim _01 = (_HH - _LL)
Dim _10 = (_LH + _HL)
Dim _11 = (_LH - _HL)
Dim _A = _00 + _10
Dim _B = _01 + _11
Dim _C = _01 - _11
Dim _D = _00 - _10
End Sub
End Class
2013年2月8日金曜日
逆ポーランド記法による演算
.NETならReflectionなどを使って解決する方法もあるけど、
もっと軽量なものがほしいなと思って、逆ポーランド記法による演算をやってみた。
どのようなものができたかというと、基本的な四則演算と、括弧による優先度、変数を扱えるようなもの。
ポイントは3つ。
・括弧内演算は、再帰処理によって実現した。
・四則演算は、優先度を設けて「+-」は最後、「*/」は最初に演算するようにした。
・変数は、逆ポーランドで演算前に、デコード処理を行うようにした。
どっちがいいかは不明。
もっと軽量なものがほしいなと思って、逆ポーランド記法による演算をやってみた。
どのようなものができたかというと、基本的な四則演算と、括弧による優先度、変数を扱えるようなもの。
ポイントは3つ。
・括弧内演算は、再帰処理によって実現した。
・四則演算は、優先度を設けて「+-」は最後、「*/」は最初に演算するようにした。
・変数は、逆ポーランドで演算前に、デコード処理を行うようにした。
Public Sub New()
Console.WriteLine(Calc("1+2-3"))
Console.WriteLine(Calc("1+2*3"))
Console.WriteLine(Calc("(1+2)*3"))
Console.WriteLine(Calc("(1+2)/3"))
End Sub
Module ReversePolishNotation
Private param As New Dictionary(Of String, Integer) '変数
Private dat As String = "" '計算する文字データ
Private idx As Integer = 0 '解析インデックス
Private stk As New Queue(Of String) '後置記法バッファ
Public Function Calc(ByVal data As String) As Integer
dat = data
idx = 0
stk.Clear()
INtoPN() '中置記法→後置記法へ変換
Return RPN() '逆ポーランド記法による演算
End Function
Private Sub INtoPN()
'中置記法→後置記法へ変換
Dim L1 As New Queue(Of String) '後置記法確定バッファ
Dim R1 As New Stack(Of String) '符号格納バッファ
Dim wrd As String = "" '切り出した文字列
Dim hugo As String = "" '優先される符号格納(「*、/」)
While dat.Length > idx
Dim tmp As String = CStr(dat(idx)) 'データ読み出し
idx += 1
Select Case tmp
Case "("
INtoPN() '括弧内優先で演算する
Case ")"
Exit While
Case "+", "-"
'優先度の低い演算子は最後に計算
If wrd <> "" Then L1.Enqueue(wrd)
If hugo <> "" Then L1.Enqueue(hugo)
R1.Push(tmp)
hugo = ""
wrd = ""
Case "*", "/"
'優先度の高い演算子は最初に計算
If wrd <> "" Then L1.Enqueue(wrd)
If hugo <> "" Then L1.Enqueue(hugo)
hugo = tmp
wrd = ""
Case " ", "\t"
'無視するキーワード
Case Else
'演算する文字列
wrd += tmp
End Select
End While
If wrd <> "" Then L1.Enqueue(wrd)
If hugo <> "" Then L1.Enqueue(hugo)
While 0 < L1.Count : stk.Enqueue(L1.Dequeue()) : End While
While 0 < R1.Count : stk.Enqueue(R1.Pop()) : End While
End Sub
Private Function RPN() As Integer
'逆ポーランド記法による演算
Dim dat As New Stack(Of Integer)
While 0 < stk.Count
Dim tmp As String = stk.Dequeue()
Dim R As Integer = stk.Pop()
Dim L As Integer = stk.Pop()
Select Case data
Case "+" : stk.Push(L + R)
Case "-" : stk.Push(L - R)
Case "*" : stk.Push(L * R)
Case "/" : stk.Push(L \ R)
Case Else : dat.Push(Decoder(tmp))
End Select
End While
Return dat.Pop()
End Function
Private Function Decoder(ByVal data As String) As Integer
'変数→数字変換
Dim ret As Integer = 0
If Int32.TryParse(data, ret) Then Return ret
Return param(data)
End Function
End Module
無駄なバッファが多いので、後値記法へ変換しながら演算するようにしてみた。Module ReversePolishNotation
Private param As New Dictionary(Of String, Integer) '変数
Private dat As String = "" '計算する文字データ
Private idx As Integer = 0 '解析インデックス
Private stk As New Stack(Of Integer) '演算バッファ
Public Function Calc(ByVal data As String) As Integer
dat = data
idx = 0
stk.Clear()
RPN() '演算
Return stk.Pop() '結果を返す
End Function
Private Sub RPN()
'中置記法→後置記法へ変換しながら演算を行う
Dim R1 As New Stack(Of String) '符号格納バッファ
Dim wrd As String = "" '切り出した文字列
Dim hugo As String = "" '優先される符号格納(「*、/」)
While dat.Length > idx
Dim tmp As String = CStr(dat(idx)) 'データ読み出し
idx += 1
Select Case tmp
Case "(" : RPN() '括弧内優先で演算する
Case ")" : Exit While
Case "+", "-" '優先度の低い演算子は最後に計算
If wrd <> "" Then stk.Push(Decoder(wrd))
If hugo <> "" Then enzan(hugo)
R1.Push(tmp)
hugo = ""
wrd = ""
Case "*", "/" '優先度の高い演算子は最初に計算
If wrd <> "" Then stk.Push(Decoder(wrd))
If hugo <> "" Then enzan(hugo)
hugo = tmp
wrd = ""
Case " ", "\t" '無視するキーワード
Case Else '演算する文字列
wrd += tmp
End Select
End While
If wrd <> "" Then stk.Push(Decoder(wrd))
If hugo <> "" Then enzan(hugo)
While 0 < R1.Count : enzan(R1.Pop()) : End While
End Sub
Private Sub enzan(ByVal data As String)
Dim R As Integer = stk.Pop()
Dim L As Integer = stk.Pop()
Select Case data
Case "+" : stk.Push(L + R)
Case "-" : stk.Push(L - R)
Case "*" : stk.Push(L * R)
Case "/" : stk.Push(L \ R)
End Select
End Sub
Private Function Decoder(ByVal data As String) As Integer
Dim ret As Integer = 0
If Int32.TryParse(data, ret) Then Return ret
Return param(data)
End Function
End Module
どっちがいいかは不明。
2013年1月23日水曜日
.NET 軽量ORマッパー
.NETでORマッパー関連が充実していなくて困った。
.NET標準のADO.net Entity frameworkを使えばモデリングからある程度自動生成してくれるが、
pythonのdjangoのORマッパーを味わってしまうとめんどくさい。。
Ironpythonを使って、メイン言語をPythonにして画面だけWPFにしようとも考えたけど、これもめんどくさい。。
MySQLなど大規模なファイルでない、ちょっとしたパラメータをファイルに保存しておきたいだけなのに、どうしたものか。
探しても無いから自分でJson形式なORマッパーを作ってみた。
仕様は、
・データ保存形式は、 jsonを使用。
・ORマッパーでModelクラス経由でアクセス。
・検索機能は、Linqを使う。
これだけで十分と思う人向け。
Imports Newtonsoft.Json.Linq
Imports Newtonsoft.Json
Imports System.ComponentModel
Imports System.IO
Public Class BookModel
<displayname("書籍名")>
Public Property Name As String = ""
<displayname("バーコード")>
Public Property BCode As String = ""
<displayname("ページ数")>
Public Property Pages As Integer = 0
<displayname("価格")>
Public Property Price As Integer = 0
Public Sub New(ByVal name As String, ByVal bcode As String, ByVal pages As Integer, ByVal price As Integer)
With Me
.Name = name
.BCode = bcode
.Pages = pages
.Price = price
End With
End Sub
End Class
Class BookCollection : Implements IListSource
Public Property models As New List(Of BookModel)
#Region "IListSource"
Private bindsrc As New BindingSource
Public ReadOnly Property ContainsListCollection As Boolean Implements IListSource.ContainsListCollection
Get
Return False
End Get
End Property
Public Function GetList() As IList Implements IListSource.GetList
bindsrc.DataSource = models
Return bindsrc
End Function
#End Region
#Region "ファイル操作"
Public Sub Save(ByVal fname As String)
Dim json As String = JsonConvert.SerializeObject(models)
File.WriteAllText(fname, json)
End Sub
Public Sub Load(ByVal fname As String, typ As Type)
Dim json As String = File.ReadAllText(fname)
json = json.Replace(vbTab, "").Replace("\", "\\")
models = JsonConvert.DeserializeObject(Of List(Of BookModel))(json)
bindsrc.ResetBindings(False)
End Sub
#End Region
End Class
使い方例:
'データ定義
Dim bc As New BookCollection()
bc.models.Add(New BookModel("書籍1", "4987185712345", 100, 100))
bc.models.Add(New BookModel("書籍2", "4987185712346", 110, 200))
bc.models.Add(New BookModel("書籍3", "4987185712347", 120, 300))
'保尊
co.Save("d:\test.json")
'読込
co.Load("d:\test.json", rack.GetType())
'条件検索
Dim filter = From x In bc.models Where x.Price >= 200 Select x
For Each model As BookModel In filter
Console.WriteLine(model.Name)
Next
'DataGridViewで表示する
DataGridView1.DataSource = co.models
DataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill
DataGridView1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells
機能拡張など、こうしたら良いなどアイデアがあれば教えてください。
2013年1月21日月曜日
つるとんたん新宿店
つるとんたん
http://www.tsurutontan.co.jp/
坂本龍の番組だったか
カトープレジャー グループの社長が出演していた回の放送をみて知ったお店である。
番組内で「わざわざ来てくれるお店」を作るのがやり方のようで、
どんなお店か行ってみた。
行ってきた場所は、つるとんたん新宿店。
歌舞伎町方面、元コマ劇場があった所から1本奥の通りを右方向に進むと、地下1階にお店があった。
内装はまるで、キャバクラをうどん店へ改装した感じの作りになっていて、
カウンター席は、ディズニーのホンデットマンションの椅子みたいなでっかい椅子で二人が座れる席。
テーブル席もいくつかあるが、席に座ってる人達を見てみると器が通常の2倍サイズくらいあって迫力満点。
15時頃に入ったときは空いていたのか、20分くらい待って、さっそく案内されて注文したのはコレ。
釜揚げうどん。これにアナゴとネギトロ丼を頼んでみた。
注文した時に聞いたのだが、替え玉が3回まで無料でOKみたい。
さっそく食べてみた感想。
麺はつるつるで太麺の讃岐うどん。
味はシンプルかなー。一緒に行った人のも食べてみたけど同じ感想。
でもお店の内装や器、いろんな所は他のうどん屋に無いね。かなり個性的。
夜はライブもやるみたいなので、行列間違いなしだと思う。
個人的にうどんなら三国一!
http://www.tsurutontan.co.jp/
坂本龍の番組だったか
カトープレジャー グループの社長が出演していた回の放送をみて知ったお店である。
番組内で「わざわざ来てくれるお店」を作るのがやり方のようで、
どんなお店か行ってみた。
行ってきた場所は、つるとんたん新宿店。
歌舞伎町方面、元コマ劇場があった所から1本奥の通りを右方向に進むと、地下1階にお店があった。
内装はまるで、キャバクラをうどん店へ改装した感じの作りになっていて、
カウンター席は、ディズニーのホンデットマンションの椅子みたいなでっかい椅子で二人が座れる席。
テーブル席もいくつかあるが、席に座ってる人達を見てみると器が通常の2倍サイズくらいあって迫力満点。
15時頃に入ったときは空いていたのか、20分くらい待って、さっそく案内されて注文したのはコレ。
釜揚げうどん。これにアナゴとネギトロ丼を頼んでみた。
注文した時に聞いたのだが、替え玉が3回まで無料でOKみたい。
さっそく食べてみた感想。
麺はつるつるで太麺の讃岐うどん。
味はシンプルかなー。一緒に行った人のも食べてみたけど同じ感想。
でもお店の内装や器、いろんな所は他のうどん屋に無いね。かなり個性的。
夜はライブもやるみたいなので、行列間違いなしだと思う。
個人的にうどんなら三国一!
2012年8月17日金曜日
スマホの活用方法
最近、「白ロム」という言葉を良く聞くけど、これは一体何?
SIMカードの色が白いから「白ロム」っていうの?って思ってる人もいるだろうw
ちなみにそれ、間違ってます!
正しくは、SIMロックフリーという意味です。
SIMロックフリーだと何ができるの?という質問については、
まず、
・海外SIMが使える
・別のSIMが使える
というメリットがある。
通常は、SIMロックされているので、解除するにはキャリアの店舗に持っていって3150円の手数料を払うとやってくれるそうです。
しかし白ロムを手に入れたからといって、全部のSIMは使えないので注意が必要。
電話というのは周波数と通信方式が決められていて、900MHz帯とか1.8GHz帯、3G、CDMA、Xiなど聞いた事があると単語がそれにあたります。
つまり、AU端末は3G対応してないので、AUのスマホでDocomoやソフトバンクのSIMは使えないって事である。
最近の流行っているMVNOなSIMはDocomo回線使っているので、docomoのスマホ使えばまず間違いないです。
あと1つ良い点はSIMを入れなくてもワンセグ見れたりWifiが使えるので、
へたな中華パッドを買うより、中古のスマホのほうが性能もいいってことである。
もし、古いケータイ使ってるけど、スマホアプリが使いたいって方には中古スマホで遊んでみてはどうだろう。
SIMカードの色が白いから「白ロム」っていうの?って思ってる人もいるだろうw
ちなみにそれ、間違ってます!
正しくは、SIMロックフリーという意味です。
SIMロックフリーだと何ができるの?という質問については、
まず、
・海外SIMが使える
・別のSIMが使える
というメリットがある。
通常は、SIMロックされているので、解除するにはキャリアの店舗に持っていって3150円の手数料を払うとやってくれるそうです。
しかし白ロムを手に入れたからといって、全部のSIMは使えないので注意が必要。
電話というのは周波数と通信方式が決められていて、900MHz帯とか1.8GHz帯、3G、CDMA、Xiなど聞いた事があると単語がそれにあたります。
つまり、AU端末は3G対応してないので、AUのスマホでDocomoやソフトバンクのSIMは使えないって事である。
最近の流行っているMVNOなSIMはDocomo回線使っているので、docomoのスマホ使えばまず間違いないです。
あと1つ良い点はSIMを入れなくてもワンセグ見れたりWifiが使えるので、
へたな中華パッドを買うより、中古のスマホのほうが性能もいいってことである。
もし、古いケータイ使ってるけど、スマホアプリが使いたいって方には中古スマホで遊んでみてはどうだろう。
2012年6月7日木曜日
dhcpクライアントのタイムアウトするのは待ちたくない人向け
久しぶりの投稿になります。
mini2440を久しぶりに使い出す用事ができたので、LANケーブルをつなげないで起動したら2分くらいブート画面で固まっていらいらしてしまった。
そんな時にタイムアウト時間を短くしようかと思ったけど、もっといい方法を探したら
ifplugd
というものがあることを知った。
さっそく
aptitude install ifplugd
いつもなら動作確認して終わりといきたいところだけど、
今回はサイズミスマッチエラーになって使えなかった。
今日はここまで。
登録:
投稿 (Atom)


