以前紹介したzsh auto_pushd のシェルスクリプトで
gd.shというの書いたのですが、少し改良しました。
改良した点はdirs -v -l で表示される重複したディレクトリは表示しないよう
にしたのと、逆順ソートにして最新のディレクトリが一番下に表示されるように
しました。改良時間は1時間くらいなのでうまく動かない場合があるかもしれませんが
その時はコメントお願いします。
では プログラムです。
ここから————–
#!/bin/sh
dirs -v -l | awk '{
a[$1]=$2;
b[$1]=$2;
}
END{
for( i=0; i<NR; i++){
work=a[i];
checknum=0;
for( j=i+1; j<NR; j++){
if( work == a[j] ){
b[j] = "skip";
}
}
}
for ( i=NR-1; i>-1; i--){
if ( b[i] != "skip"){
printf("%d %s\n",i,b[i]);
}
}
}'
echo 移動したい番号を選んでください。
read newdir
# 入力値に1をプラスし、その終了ステータスを判定する。
expr 1 + $newdir >/dev/null 2>&1
case $? in
0 | 1 )var=`dirs -v -l |grep -w $newdir |awk '{printf("%s\n",$2)}'`
cd $var;;
* ) echo " 数字以外が入力されました >$newdir" ;;
esac
ここまで————–
よくJavaにはポインタがないのでC言語よりもわかりやすい
という人をよく見かける。
確かに明示的なポインタの宣言はJavaにはない。
だがポインタという概念がなくなったわけではないと私は思う。
例えば以下プログラムはどうだろう?
class test{
public static void main(String[] args){
tmp a =new tmp();
tmp b =new tmp();
a.data=10;
b.data=20;
a = b;
b.data=100;
System.out.println(”a= ” +a.data);
System.out.println(”b= ” +b.data);
}
}
class tmp{
int data;
}
実行結果は以下の通りである。
a= 100
b= 100
どうだろう?
a=10
b=100
と想像してしまった人はいないだろうか?
どこでa.dataに100という数字が入ってきてしまったんだろう?
問題は
a = b;
の箇所だ。
そうクラスは参照型なのである。
つまりclass tmp aにはクラスのアドレスが格納されている。
これはC言語でいうポインタとほぼ一緒ではないだろうか?
クラスのアドレスが格納されているので
a=b;
でアドレスの参照先が一緒になってしまう。
参照先が一緒なので
b.data=100;
でa.dataも100になってしまうというわけだ。
ポインタという概念がない人にとっては
戸惑ってしまうだろう。
みなさんLinuxやUnixでバックアップや毎日定期的に動かしたい
プログラムなどはシェルで作ってそれをcronなどで登録してると
思うのですが、シェルの中身はテキストなので、パスワードもそのまま丸見えの状態ではないでしょうか?
セキュリティ上パスワードが丸見えというのは、危険だと思うので
どうにかなかならないものかと思っていたら
シェルスクリプトをバイナリの実行形式にコンパイルするツールを発見しました。
その名もshc です。
これでコンパイルしたら一緒にC言語ファイル(中身はたぶんよくわからない用になっている)も作成されるので、シェルスクリプトを配布したいが、ソースは公開したくないと時にも使える。
もちろんシェルの暗号化にも使える。
一度試してみてはいかがでしょうか?
千葉 真人
日経BP社
売り上げランキング: 96255
志田 智 川井 義治 田淵 貴昭 米田 聡
翔泳社
売り上げランキング: 290733
おすすめ度の平均:

よみやすい
LinuxやUnixを使っている人はシェルというものにこだわりがあるものだ。
solarisやBSD系の人はだいたいcsh tcsh。Linuxの人はbashが定番なのだが、
zshはご存知だろうか?アルファベットのzがついているので最後のシェルという
意味らしいのだが、その名にふさわしく最強のシェルだそうだ。
どんな感じかは漢のzshというコラムに
zshの魅力が紹介されている。
この中のsetopt auto_pushd というオプションが便利だな~と私は使ってみて思った。
ということで、シェルスクリプトで似たような感じができないかなと思ったので、作ってみました。
けっこうzshが入ってる環境は少ないもので(笑)
とりあえず下記のプログラムをファイルに保存し実行権限をつけてください。
ここではgd.shという名前に保存したとする。
ここから————–
#!/bin/sh
dirs -v
echo 移動したい番号を選んでください。
read newdir
# 入力値に1をプラスし、その終了ステータスを判定する。
expr 1 + $newdir >/dev/null 2>&1
case $? in
0 | 1 )var=`dirs -v -l | grep -w $newdir | awk '{printf("%s\n",$2)}'`
cd $var;;
* ) echo " 数字以外が入力されました >$newdir" ;;
esac
ここまで————–
そして、pathが通っているとこに持っていってください。
次にaliasに下記を設定してください。
alias gd=’. gd.sh’
alias cd=’pushd > /dev/null’
これで終了です。
# gd
で起動できると思います。
あとはお好きにしてください。
また便利なシェルスクリプトを作ったら載せてみたいと思います。
パフォーマンスを考えているコーディングしているだろうか?
私もできれば速く効率のよいコードが良いと
考えていたのだが、必ずしもそれが良いコードではないということを知った。
Donald Knutは「An Empirical Study of Fortan Programs」という論文の中
で、プログラムの4%未満が実行時間の50%以上を占めているとしている。
つまりプログラムのほんの4%が実行時間の大半を占めているので、プログラムを
コーディングする際にパフォーマンスを考慮してコーディングするのではなく
読みやすさメンテナンスを最優先コーディングすべきだと思う。
実際にプログラムが完成したところで実行して遅いと感じたらパフォーマンスの
ことを考えても遅くないと思う。実際にプロファイラなどを使ってどこの
箇所が実行を遅くしているのかを調べる必要がある。まあその箇所も全体の4%
を探しあててそこ改善すればだいたいOKになるはずだ。
なので最初からコーディングする際にパフォーマンスを意識して
全体を速くしても意味がないし効率が悪いし、パフォーマンスを意識して
読みやすさメンテナスが悪くなっては元も子ないのである。
コードチューニングのテクニックで「行数が少ない方が速い」という定説があるがこれは嘘である。
下の例
rei1:
for i =1 to 10
a[i] = i
end for
rei2:
a[1]=1
a[2]=2
a[3]=3
a[4]=4
a{5]=5
a[6]=6
a[7]=7
a{8]=8
a[9]=9
a[10]=10
行数が少ない方が速いのというならrei1のほうが速いと考えるだろうが
実際には
| 言語 |
rei1の所要時間 |
rei2の所要時間 |
| Visual Basic |
8.47 |
3.16 |
| Java |
12.6 |
3.23 |
である。驚きだろうがコードの行数を減らしたからといって速度には関係ないのである。
またコンパイラにもよって速度というのは変わってくるので、以前この方法で速くなったという
経験則はまったく通じないのである。
またこの続きはいつか書きたいと思う。
ジャン‐パオロ・D. ムズメキ マイク ルキダス Gian‐Paolo D. Musumeci Mike Loukides 砂原 秀樹 高橋 敏明 岡島 順治郎
オライリージャパン
売り上げランキング: 190235
おすすめ度の平均:

チューニングの初歩
第2版はすごい SolarisとLinux対応
ジャック シラジ Jack Shirazi 今野 睦 福与 直也 杉野 博史
オライリージャパン
売り上げランキング: 218786
おすすめ度の平均:

内容は良いんですが...
コードレベルのパフォーマンスチューニング
Accessにテーブル追加するサンプルです。
private void button1_Click(object sender, System.EventArgs e)
{
System.Data.OleDb.OleDbConnection cn =
new System.Data.OleDb.OleDbConnection();
System.Data.OleDb.OleDbCommand cmd;
// 接続文字列を設定してデータベースに接続する
cn.ConnectionString = “Provider=Microsoft.Jet.OLEDB.4.0;”
+ “Data Source=C:¥tmp¥DBSample.mdb;”;
cn.Open();
// 追加するテーブルが存在していたら削除しておく
try
{
cmd = new System.Data.OleDb.OleDbCommand(
”DROP TABLE 社員”, cn);
cmd.ExecuteNonQuery();
}
catch{}
try
{
// 社員 テーブルを追加する
cmd = new System.Data.OleDb.OleDbCommand(
”CREATE TABLE 社員(社員番号 INT, 氏名 TEXT(30))”, cn);
cmd.ExecuteNonQuery();
}
catch( Exception ex)
{
MessageBox.Show(ex.Message.ToString());
}
// データベースへの接続を切断する
cn.Close();
MessageBox.Show(”[社員]テーブルを追加しました。”, “結果通知”);
}

速効解決!逆引きハンドブックVisual C#
posted with amazlet on 07.01.22
日向 俊二
ソシム
売り上げランキング: 9460
おすすめ度の平均: 
手許においておくと便利
Amazon.co.jp で詳細を見る
たまにはプログラム的なことも書こうかなと思いまして
リファレンス的なものを作っていこうかなと。
なにかの役に立つかもしれなので(なんの役に立つかはわからないが・・)
環境はVisual C# 2005 Express Editionです。
ということで、Accessのファイルのテーブル一覧取得です。
private void button1_Click(object sender, System.EventArgs e){
System.Data.OleDb.OleDbConnection cn =
new System.Data.OleDb.OleDbConnection();
DataTable dt;
// 接続文字列を設定してデータベースに接続する
cn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;"
+ "Data Source=C:¥tmp¥DBSample.mdb;";
cn.Open();
// テーブル一覧を取得する
dt = cn.GetOleDbSchemaTable(
System.Data.OleDb.OleDbSchemaGuid.Tables
, new object[] {null, null, null, "TABLE"});
// データベースへの接続を切断する
cn.Close();
// 結果を表示する
foreach(DataRow dtRow in dt.Rows)
System.Diagnostics.Debug.WriteLine(dtRow[2].ToString());
}
結果は出力ウィンドウに表示されます。
ハーバート シルト Herbert Schildt スリーエーシステムズ 矢嶋 聡
翔泳社
売り上げランキング: 43705