デジカメのシャッター音。
よからぬこと(盗撮とか盗撮とか盗撮とか)に使えないようにということでシャッター音が
あれだけでかくなっているんだろうけど、
もうちょっとなんとかならんのかと思うことしばし。
まあメーカーとかモデルによってはごにょごにょするとシャッター音が
でなくなるようにすることもできる場合があるとか聞いたことがあるけど。
あ、それは携帯電話のカメラ機能の話だったカナ?
カメラといえば、一眼レフ(銀塩の方ね)のフィルムを巻き上げるときのあの音が好きなんだけど
もう聞く機会なんてないだろうなあ。一応某社製の一眼レフを持ってたりしますが、
フィルムの巻上げはモーターがやってくれちゃいますので(笑)
二週間てのは大概だと思うけど、DELLって全世界からパーツ引っかき集めてシンガポールあたりで
組み立ててるんじゃなかったでしたっけ?
まあ全世界つーても、ある程度固まってるでしょうけど。
マザボは台湾で、RAMが韓国で、とか。
何ヶ月か前に、Win16時代のMFCはマクロを酷使しているとなかんとか書いたなあと
梶本裕介の日記
を読んでふとそんなことを思い出したり。
最近はどーなんだかねーと思い調べようとしたら、
あららVS2008はまだインストールされてない(そもそも買ってません)し、
VS2005も今使ってるマシンに入ってるのはEEだからMFCないぢゃんw
つーことで2003とかで見てみました。
/////////////////////////////////////////////////////////////////////////////
// Message map
#define BEGIN_MSG_MAP(theClass) \
public: \
BOOL ProcessWindowMessage(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT& lResult, DWORD dwMsgMapID = 0) \
{ \
BOOL bHandled = TRUE; \
(hWnd); \
(uMsg); \
(wParam); \
(lParam); \
(lResult); \
(bHandled); \
switch(dwMsgMapID) \
{ \
case 0:
(ry
#define END_MSG_MAP() \
break; \
default: \
ATLTRACE(ATL::atlTraceWindowing, 0, _T("Invalid message map ID (%i)\n"), dwMsgMapID); \
ATLASSERT(FALSE); \
break; \
} \
return FALSE; \
}
#define ON_WM_CREATE() \
{ WM_CREATE, 0, 0, 0, AfxSig_is, \
(AFX_PMSG) (AFX_PMSGW) \
(static_cast< int (AFX_MSG_CALL CWnd::*)(LPCREATESTRUCT) > (OnCreate)) },
#define ON_WM_COPYDATA() \
{ WM_COPYDATA, 0, 0, 0, AfxSig_bWCDS, \
(AFX_PMSG)(AFX_PMSGW) \
(static_cast< BOOL (AFX_MSG_CALL CWnd::*)(CWnd*, COPYDATASTRUCT*) > (OnCopyData)) },
#define ON_WM_DESTROY() \
{ WM_DESTROY, 0, 0, 0, AfxSig_vv, \
(AFX_PMSG)(AFX_PMSGW) \
(static_cast< void (AFX_MSG_CALL CWnd::*)(void) > (OnDestroy)) },
あー、ちょっと思い出してきたぞ。
Win16での定義は思い出せないけど、上の例でいうと AfxSig_ほげほげ というのが
引数のパターン(WPARAMがint だとかポインタだとか、LPARAMはどうだとか
そういうのを表すシグネチャ)を表していて、それによって莫迦正直にメッセージマップを
定義しないですむようにして空間を節約してたんじゃなかったっけか
(昔は64kの壁ってがあったのですよん♪)。
あ、解説があるな
// Naming scheme:
// <signature> -> AfxSig_<ReturnType>_<WPARAMType>_<LPARAMType>
// <ReturnType> -> b (BOOL)
// h (HANDLE)
// v (void)
// i (int)
// l (LRESULT)
で、実際にハンドリングしているところがこう。
BOOL CWnd::OnWndMsg(UINT message, WPARAM wParam, LPARAM lParam, LRESULT* pResult)
{
LRESULT lResult = 0;
union MessageMapFunctions mmf;
mmf.pfn = 0;
// special case for commands
if (message == WM_COMMAND)
{
(ry
const AFX_MSGMAP* pMessageMap; pMessageMap = GetMessageMap();
UINT iHash; iHash = (LOWORD((DWORD_PTR)pMessageMap) ^ message) & (iHashMax-1);
AfxLockGlobals(CRIT_WINMSGCACHE);
AFX_MSG_CACHE* pMsgCache; pMsgCache = &_afxMsgCache[iHash];
const AFX_MSGMAP_ENTRY* lpEntry;
if (message == pMsgCache->nMsg && pMessageMap == pMsgCache->pMessageMap)
{
// cache hit
lpEntry = pMsgCache->lpEntry;
AfxUnlockGlobals(CRIT_WINMSGCACHE);
if (lpEntry == NULL)
return FALSE;
// cache hit, and it needs to be handled
if (message < 0xC000)
goto LDispatch;
else
goto LDispatchRegistered;
}
else
{
(ry
LDispatch:
ASSERT(message < 0xC000);
mmf.pfn = lpEntry->pfn;
switch (lpEntry->nSig)
{
default:
ASSERT(FALSE);
break;
case AfxSig_b_D_v:
lResult = (this->*mmf.pfn_b_D)(CDC::FromHandle(reinterpret_cast<HDC>(wParam)));
break;
case AfxSig_b_b_v:
lResult = (this->*mmf.pfn_b_b)(static_cast<BOOL>(wParam));
break;
case AfxSig_b_u_v:
lResult = (this->*mmf.pfn_b_u)(static_cast<UINT>(wParam));
break;
以下略
つまり、APIの引数のパターンが同一であれば一つにまとめる(同じ case を通る)ので
全体の分岐の数は減るけれども、きちんと型チェックはしているというわけです。
まあ良い子は忘れて良いテクニックですね(笑)
…いやまあ頭の片隅にでもとどめておけば、
いつかどこかで応用できる日がくるかもしんないけどさ。
Objective-Cならこんなワザを駆使しないでも良かったのにねw
(にーさんそれは云わないヤクソクです)
BorlandのOWL(ってのがあったのですよ)だとどういうやりかたしてんだろうか。
ありゃあコンパイラを拡張してて
virtual void hogehoge(...) = [WM_COMMAND]
virtual void mogera(...) = [WM_HSCROLL + WM_VSCROLL]
なんてな指定ができるタノシイ芸を持ってたんだけど
(ただし後でこの拡張を使わないように書き直されました)。
CB Magazine – ボーランドが送り出したC/C++の歴史
About OWLNext
■_
THE LONGEST DAY
ぐち0x19 ~上司が馬鹿で困る~
694 仕様書無しさん [sage] Date:2008/06/03(火) 09:28:00 ID: Be:
ヘルプという名の召集令状が来た。
他チームからもガンガン徴兵されてる。
納期は6/6、現時点での進捗は限りなく0%(詳細設計まで完了とか言ってたが何もやってねーじゃん)
ノルマンディー上陸作戦かよ。
しかも、本業とヘルプのダブルジョブ。
それでは征ってきます・・・
695 仕様書無しさん [sage] Date:2008/06/03(火) 10:02:49 ID: Be:
>>694
生きて帰って来い。ネタじゃなくてマジで。
698 仕様書無しさん [sage] Date:2008/06/03(火) 20:18:54 ID: Be:
>>694
あと3日で進捗0なんてもう無理じゃん。
骨を蘇生させようとしてるようなもんじゃん。
699 仕様書無しさん [sage] Date:2008/06/03(火) 20:42:36 ID: Be:
そういえば 1944-6-6 はマジでノルマンディー上陸作戦の日だw
しかし、あと 3 日で進捗 NULL って戦況はノルマンディーどころかは硫黄島並みだぞ。
700 仕様書無しさん [] Date:2008/06/03(火) 21:00:35 ID: Be:
進捗フフフフフフフフフフフフフフフフフフフフフフフ
701 仕様書無しさん [sage] Date:2008/06/03(火) 21:50:35 ID: Be:
>>694
で、上層部は講和への道(納期交渉とか)を探ってるの?
それとも、ほっかむりして玉砕前提なの?
702 仕様書無しさん [sage] Date:2008/06/03(火) 22:13:20 ID: Be:
何も考えてないとおもうけど
694のいくところが、せめてオマハビーチでありませんように…
オマハビーチ → 上陸作戦において最大の激戦区となった海岸。
映画「プライベート・ライアン」冒頭のシーンの舞台もここ。
http://www.nicovideo.jp/watch/sm45078
http://www.nicovideo.jp/watch/sm45145
オマハ・ビーチ - Wikipedia
計算結果の誤差
で引用されている部分。
計算結果の誤差
ちなみに、MSDNでは以下のようなことが書かれています。
--------------------------------------------------------------------------------
Decimal 値型は、多数の有効な整数桁と小数桁を必要とし、丸め誤差を使用しない財務計算に適しています。
Decimal 型では、丸めの必要性はなくなっていません。その代わりに、丸め誤差が最小限に抑えられています。
--------------------------------------------------------------------------------
つまり、Decimal型は誤差がないわけではなく、最小限に抑えられているだけなのですね。
びみょーに誤訳の匂いがするんですが気のせいでしょうか?
まあMSDNは基本的に機械翻訳だったと記憶しているので、そういうものなのかもしれないけど。
たとえば、
丸めの必要性はなくなっていません。その代わりに、丸め誤差が最小限に抑えられています
ってなんかへんな感じしません?
たとえばこれが、~なくなっていませんが、~抑えられています。
って繋ぎ方ならしっくり来るんですが。
原文はこの辺りかな?
Decimal Structure (System)
The Decimal value type represents decimal numbers ranging from positive
79,228,162,514,264,337,593,543,950,335 to negative 79,228,162,514,264,337,593,543,950,335.
The Decimal value type is appropriate for financial calculations requiring large numbers of
significant integral and fractional digits and no round-off errors. The Decimal type does not
eliminate the need for rounding. Rather, it minimizes errors due to rounding. For example,
the following code produces a result of 0.9999999999999999999999999999 rather than 1.
うーーーーーん。Rather → その代わりに になっちゃってるのね。
no round-off errors が丸め誤差を「使用しない」ってのもアブナイ気がするなあ。
金融計算だから丸め誤差が「あってはいけない」んじゃないの?
■_
やり方は(ry
CitrusByte Ruby TMTOWTDI, Episode 1
CitrusByte Ruby TMTOWTDI, Episode 1
This is the inaugural post in a series that we’ll be calling Ruby TMTOWTDI (There’s
more than one way to do it). Usually the TMTOWTDI acronym is used as a disparaging
term towards flexible languages, which offer a myriad ways of solving most given
problems. This series, however, aims to use this property of Ruby as an educational
tool.
The format is as follows: we’ll present a problem, then everyone will try and write
the most idiomatic, concise code that solves the problem in a readable fashion. This
is not meant to be a golfing competition, nor an optimization one. However, we will
benchmark the solutions for a rough idea on how different styles affect performance.
For every installment we’ll have a performance winner for fastest time and a ‘style’
winner for the most elegant code.
This gives us at CitrusByte a better understanding of each other’s coding styles, and
stimulates discussions about little tricks we may not be aware of. Best of all, it’s
fun as heck to be a part of.
You can get involved too! Leave a comment with your solution if you think you can best
the ones listed here. We also encourage you to propose a simple problem (less than 20
lines of code to solve) for the next instalment in the series.
Since this is the first time we’re doing it, we’ve picked a very simple problem to
solve as a quick warm-up.
Problem: given a string ‘str’ of the format
"a10 b20 c25 d40"
convert it to a hash
{'a' => 10, 'b' => 20, 'c' => 25, 'd' => 40 }
Note that the values of this hash are integers, not strings. If the string is
"a10 a20"
the output should be
{'a' => 20}
.
"a10 b20 c25 d40" のような、アルファベットに続く数字、空白を置いてそのパターンの繰り返し
という文字列から、アルファベット部分をキーに、数字の部分を値に持つような
ハッシュを作れというお題。
さまざまな解答が寄せられていますが、あなたならどう解きますか?
エピソード1ということなので、次もあるんでしょうね。
PHP、Python、Sambaにセキュリティ向上のお墨付き - builder by ZDNet Japan
オープンソースプロジェクトのうちAmanda、NTP、OpenPAM、OpenVPN、Overdose、Perl、PHP、
Postfix、Python、SambaおよびTCLは、開発者が「複数クラスの潜在的なセキュリティ脆弱性」
をコードから取り除いたとして同レポートの中で賞賛されている。
発見されたもっとも一般的なセキュリティホールは「Null Pointer Deference」の脆弱性で、
検出された脆弱性全体の28%を占めた。
RubyForge: 1-click-rails-installer-2.1.0
1-Click Rails Installer 2.1.0 has been released.
1-Click Rails Installer is a simple installer that includes Ruby,few necessary
extensions, SQLite, and Ruby on Rails.
For more information, please see release notes.
2008年 6月 (1)。
とりあえず、どうしても低水準のコードを書かなきゃいけないときは、 新山は次のような原則
でやっている:
1. とにかく愚直な、泥臭いコードにする。(ようするに djb風)
2. 可能なかぎり文字列処理を避ける。
3. マクロやテンプレートのようなものが必要だと感じたら、それは自分の設計が根本的に間
違っているのだ。
とくに 3. は重要で、新山は Python でもアクロバティックな技法を避ける傾向があるし、 も
っといえば、日本語に対してさえ似たような原則を持っている。つまり、常識的に考えれば、
人間界の物事は必ずつねに「平易な言い回し」で説明が可能なはずだ、という信念である。 平
易な言い回しができないのは、自分の頭が悪いからだ。 しかし一方で、世の中には難解な言い
回しを使ったほうが「賢そうに見える」と信じている人々も沢山いる。 物事をわざわざ晦渋な
やり方で言う人々は、C++ で必要もないのにテンプレートを使おうとする人々と 同じくらい罪
深い。まあ、晦渋な評論家も、難解なコードを喜ぶプログラマも、根は同じところにありそうだ
が。
C++のような言語をいまだにリキんで学習しようとしている人々がいることは 全世界的にみて、
ひどい損失だと思う。少なくとも、こいつのせいで計算機科学の進歩が 20年は遅れたね。
Ruby on Rails 2.1.0公開で、2.0系は切り捨てか (山本隆の開発日誌)
安定している1.2系はもう古いし、2.0系はバグが放置されたまま。
2.1系は安定するまで、まだ時間がかかるだろう。
どのバージョンを使うのか、難しい選択に迫られる。
ぬるぽの種は尽きまじ。
one-click rails というのは instant railsとは別物?
■
再帰的な
弾さんのところのコメントにあった
404 Blog Not Found:regexp - にはネストした表現は出来ない
Perl5.10のperldeltaによると5.10からは"(??{})"なし
(変数なし)でRecursive Patternが書けるようになった
らしいですよ。(自分はまだいじってないけど)
は、たぶんこれのことでしょう。
以下ドキュメントから。
=item (?PARNO) (?-PARNO) (?+PARNO) (?R) (?0) (?PARNO) (?1) (?R) (?0) (?-1) (?+1) (?-PARNO) (?+PARNO)
regex, recursive regexp, recursive regular expression, recursive regex, relative recursion
Similar to (??{ code }) except it does not involve compiling any code, instead it
treats the contents of a capture buffer as an independent pattern that must match at
the current position. Capture buffers contained by the pattern will have the value as
determined by the outermost recursion.
(??{ code }) と同様のものですが、こちらはなんらかのコードをコンパイルしたりはしないと
いう点が異なります。こちらではコンパイルはせずに、この構造体が置かれたまさにその場所で
マッチしなければならない独立したパターンとして捕獲バッファの内容を扱います。捕獲バッフ
ァの内容はoutermost rerusion (再帰の最も外側ということ?)により決定される値を反映したも
のとなるでしょう。
PARNO is a sequence of digits (not starting with 0) whose value reflects the
paren-number of the capture buffer to recurse to. (?R) recurses to the beginning of
the whole pattern. (?0) is an alternate syntax for (?R). If PARNO is preceded by a
plus or minus sign then it is assumed to be relative, with negative numbers indicating
preceding capture buffers and positive ones following. Thus (?-1) refers to the most
recently declared buffer, and (?+1) indicates the next buffer to be declared. Note
that the counting for relative recursion differs from that of relative backreferences,
in that with recursion unclosed buffersare included.
PARNO は再帰するために捕獲されたバッファのカッコ番号(paren-number)を反映する値を表す数
字の並び(ただし0から始まることはありません)です。この数字は再帰を行う対象の捕獲バッフ
ァの番号を指定します(?R)は パターン全体に対する再帰的なパターンです。(?0) は(?R)と同じ
意味です。PARNOには+や-の記号を前置することができます。これらは相対的な位置を指定する
ことになり、負の数であった場合には現在注目している位置より前にある捕獲バッファを指示す
るもので、正の数の場合は現在位置より後ろの捕獲バッファになります。したがって、(?-1) は
直前に宣言されたバッファを参照し、(?+1)は現在位置の次に宣言が現れるバッファを参照しま
す。ここで再帰時の相対指定は後方参照の相対指定と異なるということに注意してください。再
帰の場合には、その時点で閉じられていないバッファは数に含まれません。
The following pattern matches a function foo() which may contain balanced parentheses
as the argument.
次のパターンは引数にバランスの取れたカッコ対をとるかもしれない関数 foo() にマッチする
ものです。
$re = qr{ ( # カッコグループ1 (full function)
foo
( # カッコグループ2 (parens)
\(
( # カッコグループ3 (カッコの中身)
(?:
(?> [^()]+ ) # カッコ以外のもの(バックトラックをしない)
|
(?2) # グループについて再帰 Recurse to start of paren group 2
)*
)
\)
)
)
}x;
If the pattern was used as follows
これを以下のような状況で使った場合
'foo(bar(baz)+baz(bop))'=~/$re/
and print "\$1 = $1\n",
"\$2 = $2\n",
"\$3 = $3\n";
the output produced should be the following:
その出力は以下のようになります:
$1 = foo(bar(baz)+baz(bop))
$2 = (bar(baz)+baz(bop))
$3 = bar(baz)+baz(bop)