レジストリの参照/更新
2010-02-01-1 / カテゴリ: [programming][win][perl] / [permlink]

Win32::Registryを使う
use Win32::Registry;

my $tips;
$::HKEY_CURRENT_USER->Open('Software\\zzz', $tips)
  or die "cannot open registry";

サブキーの取得
regeditで言えば、左部ツリーの'HKEY_CURRENT_USER/Software/zzz'以下のサブキーのリストが取れる
my @subkeys;
$tips->GetKeys(\@subkeys);

キーの名前・データの取得
my %vals;
$tips->GetValues(\%vals);
%vals にはarrayrefのハッシュが入る。
キーの名前 => [ キーの名前, 型, キーのデータ]

キーの更新(なければ新しく作られる)
$tips->SetValueEx(キーの名前, 0, 型, キーのデータ);

終了
$tips->Close();

型は、見た感じ
文字列1
バイナリ3
DWORD4
複数行テキスト7
みたい。

ActivePerlなら、html/lib/Win32/Registry.html あたりにドキュメントあるのでそっち参考。
ちょっと情報量少ないけど…。
よくわからなければ、Dumper で見れば問題ない :p

今更だけどFizzBuzz問題(正規表現で)
2010-01-06-1 / カテゴリ: [programming][正規表現][perl] / [permlink]

更にPerlネタ

昨日([2010-01-05-1])に引き続き他人の日記をこっそり覗き見しているとFizzBuzz問題のPerlのコードを発見
2年位前に結構盛り上がってたみたいだけど、何故かリアルタイム参戦してなかったので、ちょっとやってみた。

が、何のヒネリも入らなかった。
perl -le 'print (($_%15==0)?"FizzBuzz":($_%3==0)?"Fizz":($_%5==0)?"Buzz":$_) for (1..100)'

んで、件のエントリに
剰余を使うな

とかありました
とあったし、ワンライナーは出尽くしてるっぽいので、剰余禁止(ついでに乗除算禁止、変換テーブル禁止)で、Perl使いらしく正規表現(キャプチャ禁止)でマニアックに実装してみた。
(ググったらそのものズバリな正規表現でFizzBuzzは見つかったけど、手持ちスキルはPerl5.8止まりなのでよくわからんかったorz <- 何がPerl使いだ>自分)

#!/usr/bin/perl -l
for (1..100) {
  s/(?<=[50])$/Buzz/;
  for (($a = $_) =~ s/\D*//g; $a !~ /^.$/; $a =~ s/(\d)(\d)/$1+$2/eg){}
  s/(?=$|\D)/Fizz/ if $a =~ /[369]/;
  s/\d+(?=\D)//;
  print;
}

とりあえず解説。
処理の流れ: 5倍数時は"数字Buzz"に置換、3倍数時は"数字Fizz"に置換、最後に数字以外が付加されていれば数字を削除して出力する。先に5を処理してるのは "5か0 + (非数字があるか空)" のパターンでキャプチャ不使用で末尾にBuzzを付加するパターン置換がどうしてもできなかったからorz

  • 1行目: シェバングは -l 付き。print; 単体で手抜き出力させるため:p
  • 2-8行目: 1から100までループ
  • 3行目: 「5の倍数は1桁目が0か5」なので、末尾($)が5or0([50])の場合に、数字部分を残して((?<=))末尾のみをBuzzに置換。数字は3の倍数判定に使用するので消さない。
  • 4行目: 「3の倍数は各桁の数字の和が3で割り切れる」ので、各桁の和を求める処理を1桁になるまで繰り返して3or6or9なら3の倍数ってことで、4行目のfor()の初期処理で倍数判定処理用に一時変数に一旦コピー(これがかなり気に入らん)、ただし既に5の倍数時はBuzzが付加されているので、数字以外(\D*)はコピー後($a = $_)に消去(s///g)、継続条件式で1桁判定(length($a)!=1に置換え可)、更新式で"数数"を((\d)(\d))数+数($1+$2/e)に全部(g)置換(s///)する。
  • 5行目: 「元のループ変数($_)」を1桁になるまで求めた各桁の和($a)が3or6or9(/[369]/)だった場合のみ(if修飾子)置換。ただし5の処理で既にBuzzが付いてる場合があるので、次の文字((?=))が末尾か非数字($|\D)の位置を置換。
  • 6行目: この時点で、数字のみ or 数字+Fizz or 数字+Buzz or 数字+FizzBuzz になってるので、次の文字((?=))が非数字(\D)の数字全て(\d+)を消去(s///);
  • 7行目: 出力
てか、Perlって空処理の制御構文でもブレース省略できないのね。
Cだと
for (...);
ってできるけど。


あ、多分当時はCに毒されてPerlを忘れつつあったから、面倒がって流行に乗らなかったのかも。(2007年のprogrammingカテがCばっか…)

世界のナベアツ問題をワンライナーで
2010-01-05-1 / カテゴリ: [programming][perl] / [permlink]

ネタがないと言いつつ見つかってしまった。というか、2年ぶりくらいの戯術ネタ。

前の部署の同期がブログで「perlで世界のナベアツ問題」と題してコードを書いてたのをたまたま発見したけど、最後に、単に改行とインデントを削っただけのワンライナーを載せてるのでちょっと添削してみた

元(http://d.hatena.ne.jp/bata64/20080410/1207801849から引用)
perl -e 'foreach(1..40){if($_%8==0){print"$_ぅぅういえぇえあ\n";}elsif($_%3==0||$_=~/3/){print"$_っ!!\n";}else{print"$_\n";}}'

アレンジ後
perl -le 'print !($_%8)?"$_ぅぅういえぇえあ":(!($_%3) or /3/)?"$_っ!!":$_ for(1..40);'

一応解説
  • -lは、printなどで自動改行するためのオプションスイッチ(ぺるりめも書いてねぇ…)。
  • foreach でなく for なのは単にタイプ数の削減(Perlでは、forとforeachは同じ働きをする)、更に、ループブロックとして使用せず、文の修飾子として記述することで、ブレースを削除( expr if cond; の要領)。
  • 出力部分を print の引数に三項演算子を使用することで、1文に圧縮。
  • 剰余0の検知を比較演算子でなく、否定を使うことでなんとなくスマートに。(多分見にくくなってる)
  • 3のマッチングの $_ =~ の削除はセオリー通り
やっぱ1文で書いてこそのワンライナーだよねっ :D
ちなみに元の要件はチェックしてないのでアルゴリズム自体は知らん:p


chalowってリスト表記どうすんだっけ…


リスト対応したぜ [2011-06-13-1]
Referrer (Inside): [2010-01-06-1]

Text::Diff で差分抽出
2008-02-28-1 / カテゴリ: [programming][perl] / [permlink]

ファイル単位の比較なら/usr/bin/diffで済むけど、比較前にフィルタ通してごにょごにょした結果を比較したりして追加行・削除行・変更行を一覧にしてサクっと出したい、とか
続きを読む

Text::CHMでHTMLヘルプファイル(.chm)を展開する
2008-02-27-1 / カテゴリ: [programming][perl] / [permlink]

とあるSDKのマニュアルがchmファイルでのみ提供されていて、エディタのキーワード色変更設定用([2005-12-12-1])にAPIだけ抜き出したいとき、とか
続きを読む

ActivePerlのppmがGUIになってる
2008-02-26-1 / カテゴリ: [programming][perl] / [permlink]

ActivePerl 5.8.8の場合
ppmコマンドを使い慣れない私にはわかりやすい:)
続きを読む

Perl TK(2) プルダウンメニュー
2008-01-09-1 / カテゴリ: [programming][perl] / [permlink]

検索しても全然ないなぁと思ったら、別名の同機能(?)だった。
プルダウンメニュー(?)
my $mw = MainWindow->new;

$opt = $mw->Optionmenu(-variable=>\$val)->pack();
$opt->addOptions("item1","item2","item3");
これで、選択した項目が $val にセットされる。
リストに表示する文字列と値を別にしたい場合は
$opt = $mw->Optionmenu(-variable=>\$val,-textvariable=>\$txt)->pack();
$opt->addOptions([item1=>1],[item2=>2],[item3=>3]);
で、選択した項目名(item1,item2,item3)が $txt に、値(1,2,3)が $val にセットされる。

Perl TK
2007-12-20-1 / カテゴリ: [programming][perl] / [permlink]

VC連携用に小物をいろいろ作ったのでメモ
cygwin perl だと X が必要なので、ActivePerl の方が楽かも。5.8 で確認。標準モジュールのみでOK

ラベル・テキスト入力・ボタンを持つウィンドウの作成
PerlTk
続きを読む

キーコードの送信
2007-07-18-2 / カテゴリ: [programming][win][c] / [permlink]

キーボードエミュレーション、とでも言うのかな。
キーボードの入力をプログラムで行う。
winuser.h を include する。
続きを読む

cygwin/MinGW で Windows GUIアプリ
2007-03-14-1 / カテゴリ: [programming][win][cygwin][c] / [permlink]

朝、目覚まし時計に反応できるようになった今日この頃。2度寝しないように「うりゃ!」と叫んでなんとか頑張ってる。

cygwin の gcc でも、WinMain 関数で普通にコンパイルできるのね。
-mno-cygwin オプションで、cygwin1.dll をリンクしないネイティブアプリ、
-mwindows オプションで、GUIアプリができる。
(-mwindows がないと、exe実行時にコマンドプロンプトも表示されてしまう)

関連:bcc でWindowsプログラミングのコンパイル[2005-08-01-1]
続きを読む

強制make
2007-03-13-1 / カテゴリ: [programming][command] / [permlink]

% make -B
いわゆるリビルド
JMのManpage of MAKEにはないから、新しいオプションなのかな。

GNU Make 3.81
Copyright (C) 2006  Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.

This program built for i686-pc-cygwin

外部プログラムの標準出力を取得する
2007-03-07-1 / カテゴリ: [programming][c] / [permlink]

popen(3) を使う。
#include <stdio.h>

int main() {
	FILE *fp = NULL;
	char buf[1024];

	fp = popen("ls", "r");
	if (fp == NULL) {
		printf("fp == NULL\n");
		return 1;
	}
	while (fgets(buf, sizeof(buf), fp)) {
		printf("[%s]", buf);
	}
	pclose(fp);
	return 0;
}
↑この場合、ls の出力の各行末の改行は付いたまま。

簡単なツールチップ作成までの道のり
2007-03-05-2 / カテゴリ: [programming][html][JavaScript] / [permlink]

ちょっと使いたくなっていろいろ探してみた。
…が、でて来るのは汎用的で高機能なものが沢山で、コード例や作成のTipsみたいなのはさっぱり。(使用に関してはライセンス上は特に問題ないみたいだけど)
つーわけで作ってみた。

やりたい事は、フォームの入力において、フォーカスしている項目の説明みたいな感じ。んで、できればブラウザごとの処理振分はやりたくない(わがまま)
※ 動作確認は IE6.0(winXP) / Firefox 2.0.0.2(winXP) のみ

続きを読む

対応する括弧へジャンプ(VC2003.net)
2007-03-05-1 / カテゴリ: [win][programming][VC++] / [permlink]

Ctrl-]
VC6.0と同じだけど、6.0はCtrl-Eばっか使ってたからわからなかった。
[2005-11-30-1]

カスタムウィザードで作成するプロジェクトのリンクファイルのデフォルト設定を追加(VC2003.net)
2007-02-23-2 / カテゴリ: [win][programming][c][VC++] / [permlink]

Vc7/VCWizards/[ウィザード名]/Script/1033/default.js
:
var LinkTool = config.Tools('VCLinkerTool');
:
// これを追加
LinkTool.AdditionalDependencies="netapi32.lib";
Debug用とRelease用みたいに複数ある場合は全部追加する。

参考
VC++6.0のカスタムウィザードをVC++.NETに移行する(の日本語訳)
(タイトルの日本語がおかしいので訳した)


追記
1033(英語) じゃなくて 1041(日本語)のウィザードもあった。
複数言語へのウィザードのローカライズ

MACアドレスの取得
2007-02-21-2 / カテゴリ: [programming][win][c] / [permlink]

イーサネット アダプタのMACアドレスを取得する
アプリケーションが一意に判断できる値を得る方法
Netbios というAPIを使用して取得できる。
netapi32.lib をリンクする必要アリ

ただ、ケーブルの刺さっていない非アクティブなNICのアドレスは取れないっぽいなぁ。
Referrer (Inside): [2007-02-26-1]

関数ポインタのtypedef
2007-02-20-1 / カテゴリ: [programming][c] / [permlink]

// 型
typedef int (*TYPENAME)(char *arg1, char arg2);
// int は対象関数の戻り値の型
// TYPENAME は typedef で付けたい型名

// 変数宣言 (funcはポインタ/*はつけない)
TYPENAME pfunc;

// 代入 (関数名のみ)
pfunc = functioin;

// 関数定義
int function(char *arg1, char arg2)
{
  :
  :
}

// コール
n = pfunc(str, ch);
// pfuncに代入されている function() がコールされる。
// 関数に渡す引数は普通に記述

C++では構造体とクラスは一緒
2006-12-21-2 / カテゴリ: [programming][c++] / [permlink]

C++構造体
メンバ関数まで作成できるのね。

というか、[2006-04-23-1]は、構造体でデストラクタを書いてないから(そこでメンバをdeleteしてないから)、メンバになっているクラスのデストラクタが動かないってことか。

C++で、ポインタや特にクラスをメンバに含む構造体を使うときは注意。
というかクラスにしたほうが良い、のか。

ActivePerlはワイルドカード&<>が使えん
2006-12-14-2 / カテゴリ: [win][programming][perl] / [permlink]

解析用使い捨てコードを書くときにいつもtypeするテンプレート↓
while (<>) {
}
普段 cygwin only だから気付かなかったけど、(配布用にコード書いた時に気付いたけど)ActivePerl だとこの構文を使ったソース&次の使い方
> test.pl *.cpp
が無効ね。
Can't open *.cpp: Invalid argument at C:\Documents and Settings\hmiyazaki\My Documents\prog\perl\test.pl line 4.

面倒だけど、引数に正規表現を指定してもらって、内部は opendir/readdir で代替。
と思ったけど、@ARGV をループさせて glob/open すればよさげ。
foreach my $file (map { glob } @ARGV) {
  open F, $file
    or die;
  while (<F>) {
    # ここにコード
  }
  close F;
}

案外これのほうが、<> の $. で行数が得られない(ひたすら加算される)とこが回避されていいかも。
カテゴリ: programming / 1 2 3 4 5 6 7 次ページ

最終更新時間: 2013-05-02 16:12