CodingFirst

C言語、Perl、JavaScript、最近はPythonも。出来上がったものより、プログラムを書くことが好き。あと、スイーツ。

スポンサーサイト

  • このエントリーをはてなブックマークに追加
  • web拍手 by FC2
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

WinXPでログイン・ログオフの時間を記録する

  • このエントリーをはてなブックマークに追加
  • web拍手 by FC2

Windows XP で ログイン・ログオフの時間を記録してみる。

Windowsで「昨日のログオフ時間はいつだっけ?」というときは、
[コントロールパネル]→[管理ツール]→[イベントビューア]を立ち上げて
イベントを漁れば出てくるけども、それが面倒なときには役立つかも。

やることは簡単で、時間を記録するスクリプトを書き、ログイン・ログオフ時に実行するようにした。

書いたスクリプト(lastlog.js)は gist に置いた。

スクリプトも単純で、JScriptで時間を記録と、コマンドライン引数でコメントを付加できるようにしただけ。
ひとまず、 lastlog.js を C:\ に置いたとして、実行してみる。


C:\>cscript //nologo lastlog.js login

C:\>type lastlog.txt
2012年8月17日 23:45:29 login

期待通り。
あとは、ログイン・ログオフに登録すればいい。

  • [スタートメニュー]→[ファイル名を指定して実行]→[gpedit.msc]で、グループポリシーのエディタを起動する。
  • [ローカルコンピュータポリシー]→[ユーザーの構成]→[Windowsの設定]→[スクリプト(ログオン/ログオフ)]に行く。
  • ログオンのプロパティから[追加]で、入力スクリプト名「C:\lastlog.js」、スクリプトのパラメータに「login」と書く。
  • 同様にログオフの方も設定する。

ここまでできたら、Windowsをログインしなおして、作成されたはずの C:\lastlog.txt をメモ帳とかで確認する。
例えば、私の場合は

2012年8月17日 23:45:29 login
2012年8月17日 23:47:46 logoff
2012年8月17日 23:47:55 login

となった。期待どおり。

おまけ: Windows 7 以降は試してないけど、同じ感じでできるみたい。

参考)

スポンサーサイト

コメントアウトにありがちな笑えない話

  • このエントリーをはてなブックマークに追加
  • web拍手 by FC2

C言語のコメントアウトのありがちな話だけど、
「可能」とか「表」の笑えない話を書いておく。

i に 1 を代入するコードを書いたとする。

#include <stdio.h>
int main(int argc,char*argv){
  int i=0;
  //i=1:使用可能
  i=1;
  printf("i=%d¥n",i);
  return 0;
}

これを gcc で実行すると、

$ gcc a.c && ./a.out
i=0

なぜか i=1 でなく、 i=0 と出力されてしまった。

知ってればありがちな罠なんだけど、
a.c が Shift_JIS だった場合に、「能」が 0x94,0x5C で、
0x5c は asciicode で \ なので、継続行とみなされ、次行の i = 1 がコメント扱いになってしまった。

なので、文字コードを変えれば、ちゃんと動く。

$ nkf -w a.c | gcc -x c - && ./a.out
i=1

この罠、いまだに笑っていられない話で、
たとえば、windows の gcc では動いたけど、 linux の gcc では動かなくて、
その原因が svn / git のチェックアウト時に文字コードを自動変換させてたがため
この問題に引っかかったとか起こりそうな話だったりする。


PerlMagickで複数の画像を1枚にまとめる

  • このエントリーをはてなブックマークに追加
  • web拍手 by FC2

PerlMagickで複数の画像を1枚にまとめた。

ImageMagickのmontageコマンドでもできて、それは前に書いた。
ImageMagickで撮った月食を1枚にまとめる CodingFirst

PerlMagick は、cpanでなく apt-get で入手した。

$ sudo apt-get install perlmagick

で、作ったコードは下記。
引数に 4つの画像ファイルを指定すると、2x2に結合した out.jpg が出力される。
ちょっといい加減なコードなので、ファイル数に応じて 2x2 を変更したり、 フィルタかけたり、文字描いたり..改造して使うといいでしょう。

#!/usr/local/bin/perl
use strict;
use warnings;
use Image::Magick;
print <<USAGE if $#ARGV==-1;
Usage: montage.pl file..`
USAGE
my $img = new Image::Magick;
$img->Read(@ARGV);
my $mon=$img->Montage(geometry=>'160',tile=>'2x2');
$mon->Write(filename=>'out.jpg');

gistにも貼った。
https://gist.github.com/2621784

実際に作った出力例。

$ perl montage.pl a.jpg b.jpg c.jpg d.jpg

out.jpg:
out_20120506.jpg

最近、コージーコーナーの濃厚レアチーズケーキにはまってる。うまい。。


C言語でmd5

  • このエントリーをはてなブックマークに追加
  • web拍手 by FC2

C言語でmd5を計算する。

MD5は、ファイルの指紋(フィンガープリント)としてよく使われてる。
用語的にはMD5チェックサムの方が一般的かも。

MD5 - Wikipedia

あやまって一致する事はまず無いので、
ダウンロードしたデータの正当性とか、Jenkinsのようにビルドの追跡とか、
要するに、テストの期待値を圧縮する手段としてよく利用される。

MD5は linux だと簡単に下のように計算できる。

$ openssl dgst -md5 fox.jpg 
MD5(fox.jpg)= c7880ecd95d8dcf0efe82f465aa41e3f

$ md5sum fox.jpg 
c7880ecd95d8dcf0efe82f465aa41e3f  fox.jpg

C言語でも使いたい事がある。
簡単に使いたいので openssl を利用する。まず、環境入手。

$ sudo apt-get install libssl-dev

MD5を計算する Cコードは以下。

$ tcc "-lssl" -run md5sum-1.c fox.jpg 
c7880ecd95d8dcf0efe82f465aa41e3f	fox.jpg
$ tcc "-lssl" -run md5sum-2.c fox.jpg 
c7880ecd95d8dcf0efe82f465aa41e3f	fox.jpg

2番目の方、後で文字列を追加する(ループする)には、
どうすればいいかよくわからんかった。まぁマジックナンバーが必要だし、 1番目のケースしか使わなけりゃいいか。

参考)
チェックサム - Wikipedia
巡回冗長検査 - Wikipedia(CRC)
MD5 - Wikipedia

Cソースを見ながら学ぶなら、やっぱアルゴリズム辞典。


C言語による最新アルゴリズム事典 (ソフトウェアテクノロジー)C言語による最新アルゴリズム事典 (ソフトウェアテクノロジー)
(1991/03)
奥村 晴彦

商品詳細を見る

[C]クイックソートをする

  • このエントリーをはてなブックマークに追加
  • web拍手 by FC2

C言語でクイックソート。
標準でqsortがあるけど、筋トレ的に書いてみよう。

その前に、アルゴリズムを復習しよう。
クイックソート - Wikipedia
C言語による最新アルゴリズム事典 (ソフトウェアテクノロジー)

一言で言うと、配列を中間値で大小に分割して再起するソートか。
実装方法に悩むけど、思いつきで書いてみた。
gist に書いたコードを以下に。

中間値は一番左の要素にして、左のバケツを決めていく方法にした。
これはこれでいいけど、奥村先生本の手法をみたら愕然。こんなコードになる頭が欲しい!

では、
コンペアとスワップを基準に前に書いたソートも含めて性能比較。

$ git clone git://gist.github.com/1476722.git sort-eg
Cloning into sort-eg...
remote: Counting objects: 26, done.
remote: Compressing objects: 100% (22/22), done.
remote: Total 26 (delta 15), reused 5 (delta 3)
Receiving objects: 100% (26/26), done.
Resolving deltas: 100% (15/15), done.
$ cd sort-eg
$ for i in *.c ; do tcc -run $i ; done
         bblsort: cmp=4950.0, swp=2472.6, xor=197DFD2F
        bblsort2: cmp=4768.0, swp=2472.6, xor=197DFD2F
           qsort: cmp= 541.8, swp=??????, xor=197DFD2F
          qsort2: cmp= 890.6, swp= 158.9, xor=197DFD2F
          qsort3: cmp= 944.1, swp= 155.1, xor=197DFD2F
         selsort: cmp=4950.0, swp=  94.8, xor=197DFD2F

安定的では無いとはいうけど、バブルソートや選択ソートに比べりゃ、やっぱり早いな。
cのqsortはかなり早そうだけど、実装がイントロソートとかなのだろう。

クイックソートは、アルゴリズムが単純で早いけど、再起を使うのが難点かな。
C言語だとスタックまで気を使う事も多いし。
もちろん、実装次第の話でもあって、例えば奥村先生本に再起を使わないコードがある。
ご利用は計画的にってとこか。

いい勉強になった。


C言語による最新アルゴリズム事典 (ソフトウェアテクノロジー)C言語による最新アルゴリズム事典 (ソフトウェアテクノロジー)
(1991/03)
奥村 晴彦

商品詳細を見る

 | HOME |  »

Search

Recent Entries

Foot Print



Categories

Monthly

Recent Comments

Recent Trackbacks

Profile

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。