bar_1

contents_map

2008年11月25日火曜日

[Seesaa]CSSを微修正[ソースコード]

前々から、どうもソースコードを記事に載せるときに、見にくいなぁと思っていたので、修正してみました。

等幅フォントのほうが、どう考えてもいい。
デザイン>デザイン一覧>下のほうに出てくる一覧から、使用しているデザインをクリック
で、スタイルシートの編集画面になる。

そこから、blockquoteクラスの属性に、font-family: monotype; を追加した。


ぐぐると、ソースコード中のキーワードを、色付けしたりするJavaScriptなどが、存在するみたいだ。
今のところは、これは保留。

2008年10月14日火曜日

[EXCEL][VBA] COUNTIF関数で複数条件を扱うには?(OR条件編)



2011年3月24日追記:このエントリは、より一般化された方法によって 改善された

COUNTIF関数は、次のような形式で範囲で指定されたセルの中から、条件を満たすセルの個数をカウントするものである:

=COUNTIF(範囲,検索条件)


ここで、「検索条件」とは

計算の対象となるセルを定義する条件を数値、式、セル参照、または文字列で指定します。
たとえば、検索条件は 32、"32"、">32"、"Windows"、または B4 のようになります
(式および文字列を指定する場合は半角の二重引用符 (") で囲む必要があります)。

[Microsoft Excel ヘルプより]


ところで、この検索条件が複数(OR条件)である場合は、どうしたらよいのだろうか?
単純に、次のようにすればいい:

=COUNTIF(範囲1, 検索条件1)+COUNTIF(範囲2, 検索条件2)





2008年7月21日月曜日

【使用レポート】ケータイの通話の録音機器

2つの製品を使用する機会を得たので、ここにその使用感について、レポートする。


メーカ名:ラスタバナナ社


製品名:【平型タイプ】音声出力プラグ付きイヤホンマイク RBEMRC1型番:RBEMRC1
メーカー希望小売価格:1,290円(税込)

使用後結論:はっきり言って、お話にならない。買ってはいけない。
使用感:
セットアップ
通話音声を録音するために、ケータイのおしりのインタフェースと、ICレコーダの音声入力の、2箇所に接続する。

使用方法
通話相手からの音声は、製品のイヤホンから聞こえる。(ケータイからは聞こえない)
こちらの発話は、製品のマイクから集音される。

難点
実際に録音を試したところ、相手の発話がエコーされてしまうようだ。これは、相手側にしか分からない。
また、途中で録音が切れてしまう現象が確認された。


メーカ名:SONY
製品名:エレクトレットコンデンサーマイクロホン
型番:ECM-TL1希望小売価格2,625円


使用後結論:
文句なし。おススメ。

使用感:
セットアップ
ICレコーダの音声入力に接続する。

使用
通話相手の音声は、製品のイヤホンに内蔵のマイクから聞こえる。
自分の音声は、製品のイヤホンに内蔵の骨伝導マイクから集音される。
ケータイでの通話は、通常使用するのと同様に使えばいい。

その他雑感
直感的に使用でき、通話を録音する上で、音質にもまったく問題を感じない。
また、上記ラスタバナナ社の製品であったような難点も、一切存在しない。



2008年5月28日水曜日

Excel VBA: シート名から目次を自動生成する

Excelで仕様書・設計書を書いているエンジニアは、相当数にのぼると考えられます。タイトルページ、変更履歴、目次、インタフェース、アーキテクチャ、機能一覧、、、。目次なんて、勝手に作ってほしいですよね。ねっ。WORDなら、できるんだし。


今回はそんなとき役に立つ以下のトピックについて、書いてみたいと思います:


  1. 各シートに、ページ・タイトルを設定する

  2. ページ・タイトルの一覧をリスト・アップし、目次を自動生成する

  3. このとき、目次のページ・タイトルをクリックすると、当該ページにジャンプする





1. 各シートにページ・タイトルを設定する



今回は、以下のような仕様でいこうと思います:
  • ページ・タイトルは、シート名と同一とする
  • 各シートのA1セルに、ページ・タイトルを表示する
    当然、シート名を変えたときは自動的に追随するものとします。
  • また各シートへのタイトル設定は、自動でできる



これらは、以下のようなコードで、実現できます:
'name: insert_titles
'date: May 28th, 2008
'author: http://voidptr.seesaa.net/
'desc: 各シートにタイトルを設定する
'
'
Public Sub insert_titles()
Dim ii As Integer

For ii = 1 To ThisWorkbook.Sheets.Count
ThisWorkbook.Sheets(ii).Range("A1").Value _
= "=RIGHT(CELL(" & """" _
& "filename" & """" _
& ",A1), LEN(CELL(" & """" _
& "filename" & """" _
& ",A1))-FIND(" & """" _
& "]" & """" _
& ", CELL(" & """" _
& "filename" & """" _
& ",A1)))"
Next ii
End Sub



シートごとに、A1セルの値を設定しているだけです。

シート名は、Excelの関数cell()から得ています。

ただしcell("filename",A1)だけでは、
フルパス+[xlsファイル名]+シート名

のかたちであるため、シート名の部分だけRIGHT()、LEN()、FIND() で切り取っています。

cell関数を使用しているため、シート名を変更したときは、自動的にタイトルも変わります。


ちょっとわかりにくい点として、ダブル・クォート(”)が4つ、連続して書かれている箇所があります。
これは、文字列としてのダブル・クォートです。

  

2. 目次を自動生成する

ここでは、以下のような仕様で行こうと思います。
  • 目次のページのシート名は、「目次」または「Contents」とする
  • 目次ページより左側にあるシート、および目次ページ自体は、目次に含めない
  • 目次ページには、名前付セル:TITLE_LISTNIG を用意し、このセルから下に向かってページ・タイトルを羅列していく
  • 羅列されたページ・タイトルをクリックすると、そのシートにとぶ



これらは、以下のようなコードで実現されます。
'name: make_contents
'date: May 28th, 2008
'author: http://voidptr.seesaa.net/
'desc: 目次をつくる
'
Public Sub make_contents()
'
Const PAGE_TITLE = "A1"
Const START_LISTING = "TITLE_LISTING"

'
Dim is_after_contents As Boolean
Dim num_sheets As Integer
Dim num_skips As Integer
Dim ii As Integer

is_after_contents = False
num_sheets = ThisWorkbook.Sheets.Count
num_skips = 1

''' list the title pages.
For ii = 1 To num_sheets
'clear old list item.
Range(START_LISTING).Offset(ii).Value = ""


'count the pages before contents.
If is_after_contents = False Then
num_skips = num_skips + 1
End If


'list a item.
If ThisWorkbook.Sheets(ii).Name = "目次" _
Or ThisWorkbook.Sheets(ii).Name = "Contents" _
Then

is_after_contents = True

Else
If is_after_contents Then
Range(START_LISTING).Offset(ii - num_skips).Value _
= "=hyperlink(" _
& """" & "#" _
& "'" _
& ThisWorkbook.Sheets(ii).Range(PAGE_TITLE).Value _
& "'" _
& "!A1" _
& """" _
& "," _
& """" _
& ThisWorkbook.Sheets(ii).Range(PAGE_TITLE).Value _
& """" _
& ")"
End If
End If

Next ii

End Sub



注意としては、セルの名前:TITLE_LISTINGは自分で定義すること。


このマクロを実行すると、目次シートのTITLE_LISTINGセルから下に向かって、ページ・タイトルがずらっと表示されると思います。
各ページ・タイトルは、HYPERLINK関数を利用して表示されているので、クリックすると、実際のページに飛びます。



わかりにくい点として、ダブル・クォートでかこまれたシングルクォートがあると思います。これはなぜ必要か?

シート名によっては、参照がうまくできなくなる場合があるからです。(ハイフンを含んだシート名=ページ・タイトルで試してみて。)
HYPERLINK関数の仕様です。



お好みで、この目次ページに「更新」ボタンなどを定義し、押下したらmake_contents()が実行されるようにしたらよいでしょう。





2008年5月20日火曜日

Excel2003: vbaUnitを使うためのExcelの設定

[Sep. 27th, 2010]追記:2種類のパッケージを混同していたので、記述を修正。
Excel2003の場合、とくに、Visual Basic Applications Extensibility の設定は、いらないのだね。


SourceForgeから、vbaUnit のアドイン・ファイルをダウンロードして来ればいい:
  • http://sourceforge.jp/projects/vbaunit/
  • http://sourceforge.net/projects/vbaunit/

前者は、アドイン(.xla)ファイルが、
後者なら、ReadMeとサンプルもついているよ。(英語だけどね。)

sourceforge.jp版の場合、
ダウンロードしたら解凍して、アドインを組み込めば使えるみたいよ。
ツール>アドイン...>参照...
から、組み込めるよ。
sourceforge.net版の場合、
ダウンロードしたら解凍して、.cls, .basをインポートする。Visual Basic Editorで
ファイル>インポート...
から、インポートできる。

sourceforge.net版のサンプルを試したかったら、Visual Basic Editorから、VBAProject::標準モジュールのVbaUnitMain をまず開いてみて。
それから、イミディエイト・ウィンドウで
prep
run
と、タイプしてみて。

イミディエイト・ウィンドウは、Visual Basic Editorのメニューの
表示>イミディエイト・ウィンドウ
で表示できるよ。

2008年5月14日水曜日

親指シフト練習法

下記の練習法によって、だいたい2~3週間ほどで親指シフトで用いられる文字配列を覚えることができた(2008/3月時点の話)ので、ご紹介します。

ローマ字入力と比較しての効能として現時点で感じていることは、ローマ字入力よりは指が疲れないし、慣れてくれば速度もより早いということです。

親指シフトドライバとしては、やまぶきを使用いたしました。
(著名なソフトとして、もうひとつ親指ひゅんQがありますが、アプリをいろい
ろ試したところ、当方の環境(XP HE)ではどうもうまく動きませんでした。)


まずは、設定から。
■設定
●OS・IME関連
‐地域と言語のオプション
コントロールパネル>地域と言語のオプション>
テキストサービスと入力言語>詳細設定>詳細なテキストサービス
→「詳細なテキストサービスをオフにする」をチェックする。

‐IMEの入力モード
→「ひらがな」をチェック

‐IMEの入力設定
・プロパティ>全般>入力設定ペイン
→「ローマ字入力/かな入力」で、かな入力を選択する。
→おこのみで「スペースの入力」で、常に半角を選択する。

●やまぶき関連
  1. やまぶきを起動する。
  2. タスクトレイのやまぶきのアイコンを右クリック>設定...を選択。
    ‐設定ウィンドウ中の項目:配列定義ファイル
    → おこのみの配列を選択。自分の場合飛鳥[21-290](数字除く).ini を使用している。
    ‐設定ウィンドウ中の項目:右シフトキー
    → 設定を「スペース」から「変換」キーにする。
  3. タスクトレイのやまぶきのアイコンを右クリック>終了を選択。
    → これで、設定がyamabuki.iniファイルに保存される
■親指シフト入力の練習方法
1)「ひだり」、「みぎ」、「む」の入力を練習する。

2)50音表を自作する
下記のような表を作成します。配置を覚える意味で、ていねいに手打ちしていきます。
+-------+-------+-------+
|あ 左d|ぁ 左r|
|い 無k|ぃ 左u|
|う 無d|ぅ 左t|
|え 左e|ぇ 左y|
|お 右s|ぉ 左g|
+-------+-------+-------
|か 無l|が 左m|
|き 無a|ぎ 無g|
|く 右j|ぐ 右x|
|け 無:|げ 左:|
|こ 右o|ご 右@|
+-------+-------+-------
|さ 左s|ざ 左q|
|し 無s|じ 無e|
|す 左k|ず 左h|
|せ 無x|ぜ 左z|
|そ 右i|ぞ 右p|
+-------+-------+-------
|た 無;| |だ 左a
|ち 左c| |ぢ 右y
|つ 右l|っ 無m|づ 右v
|て 無f| |で 左;
|と 無i| |ど 右,
+-------+-------+-------
|な 右d|
|に 右;|
|ぬ 右g|
|ね 左w|
|の 右k|
+-------+-------+-------+
|は 無o|ぱ 右c|ば 左v
|ひ 左x|ぴ 無r|び 無b
|ふ 左o|ぷ 右z|ぶ 無v
|へ 無p|ぺ 右r|べ 右w
|ほ 無z|ぽ 右/|ぼ 右h
+-------+-------+-------+
|ま 左l
|み 無c
|む 右n
|め 無/
|も 右.
+-------+-------+-------+
|や 左n|ゃ 無n
|ゆ 無h|ゅ 無.
|よ 左i|ょ 無,
+-------+-------+-------+
|ら 右f
|り 左f
|る 左j
|れ 右e
|ろ 右:
+-------+-------+-------+
|わ 右a
|を 右m
|ん 無j
+-------+-------+-------+
|「 無q
|」 無@
|( 右q
|) 左@
|{ 左1
|} 左4
|[ 左2
|] 左3
|< 右0
|> 右9
+-------+-------+-------+
|+ 左-
|* 左8
|& 右t
|& 左6
|/ 左0
|/ 右\
|= 右-
|% 無t
|¥ 無[
+-------+-------+-------+
|・ 無u
|. 無-
|, 無^
|’ 左7
|* 無\
|、 左,
|。 左.
|! 左p
|! 右1
|? 左/
|ー 無w
|| 左\
|- 無y
|~ 右u
|_ 左[
|
+----



3)句読点の入力を練習する。
、。?!

4)助詞・助動詞の入力を練習する。
てをには

がで
です
ます

である

5)自分の名前の入力を練習する。

6)普段使用しているアプリで、親指シフトのみで日本語入力する
これは、2)で作成した50音表を見ながらでよい。
ただし慣れるにしたがって、だんだん見る量を減らしていくこと。


2008年5月1日木曜日

Excel VBA: マクロをテキストファイルに落とす

今日の今日まで知らなかったのだが、EXCEL マクロのソース・コード記述って、テキスト・ファイルに落とせるんだね。いつも、コピペで対応していたよ。

方法は、簡単。

ブラウザ内で、各モジュール配下のオブジェクトを選択>右クリック>ファイルにエクスポート...

で、出力される。

オブジェクトの種類によって、拡張子はいろいろ:.bas, .cls, {.frm, frx} だけどね。
フォームの場合は、ソース・コードそのものとバイナリ・ファイルのペアが出力されるね。
バイナリ・ファイルのほうは、ジオメトリックな情報なんだろうね。

Ruby: rconv

TODO

2008年4月29日火曜日

iTunesのバージョン・アップをしたらSafari

のインストールも促されたので、入れてみた。for Windows

ページのレンダリングは、IE, FireFoxと比較して、一番きれいだな。
少し使い込んで、いろいろ機能を見たいところ。

FireFoxのように、プラグインがいろいろそろっているとよいのだが。
あと、終了したあとも、前回のタブ・セットが残るとよいのだが。

と思っていたところ、どうやら以下のような情報がみつかった:


Safari for プラグインhttp://developer.apple.com/jp/internet/safari/faq.html#anchor11 によると、以下のようらしい:

11. Safariがサポートしているプラグインの種類を教えてください。

Safariのすべてのバージョンで、Netscapeスタイルのプラグインをサポートしています。Safari 1.3以降では、NetscapeスタイルのプラグインとCocoaプラグインをサポートしています。クロスプラットフォームではありませんが、Cocoaプラグインは簡単に作成でき、お使いのプラグインはCocoaのフレームワークのすべてを活用できます。
Cocoaプラグインの作成に関する詳細については、「Web Kit Plug-In Programming Topic」を参照し、Xcodeに含まれているWeb Kitサンプルのディレクトリにあるサンプルプラグインを試してみてください。



タブの復元
メニュー>履歴>最後のセッションの全ウィンドウを開く、を選択。
すると、前回セッションで使っていたタブ・セットであたらしいSafariが起動するようだ。
→これは、自動でやってほしいところだなぁ

2008年4月14日月曜日

CString (MFC)

CString (MFC)


A common lament seen in various newsgroups deals with the Standard string class as opposed to the Microsoft Foundation Class called CString. Often programmers realize that a standard portable answer is better than a proprietary nonportable one, but in porting their application from a Win32 platform, they discover that they are relying on special functions offered by the CString class.
いろんなニュース・グループで、同じような慷慨が見られる。Microsoft Foundation Class のCStringのかわりに、標準文字列クラスをつかったときの話題だ。 プログラマはよく、プロプラエタリ・ノンポータブルな解よりもスタンダード・ポータブルな解のほうがよいものとする。 しかし、アプリケーションをWin32プラットフォームからポーティングするにあたって、 CStringクラスの特殊な関数を使ってしまっていることに気づくのだ。

Things are not as bad as they seem. In this message, Joe Buck points out a few very important things:
このことは彼らが思っているほど悪くない。 このメッセージ では、Joe Buck がいくつか重要なことを明らかにしている:

  • The Standard string supports all the operations that CString does, with three exceptions.
    標準 string は、3つの例外を除いてCStringのすべての操作をサポートしている。

  • Two of those exceptions (whitespace trimming and case conversion) are trivial to implement. In fact, we do so on this page.
    ��つの例外のうち2つ(ホワイト・スペースのトリミングとケース・コンバージョン)は、造作もなく実装できる。実際、このページでも扱っている。
  • The third is CString::Format, which allows formatting in the style of sprintf. This deserves some mention:
    ��つめは CString::Format で、これはsprintf タイプのフォーマットを可能にする。これはいくつか注意を要する:

The old libg++ library had a function called form(), which did much the same thing. But for a Standard solution, you should use the stringstream classes. These are the bridge between the iostream hierarchy and the string class, and they operate with regular streams seamlessly because they inherit from the iostream hierarchy. An quick example:
古い libg++ ライブラリは、form()とよばれる関数を持っていた。これは同じことをするものだった。しかし現在の標準の解としては、stringstreamクラスを使えばいい。これらはiostream階層とstringクラスのブリッジであり、通常のstreamをシームレスに操作する。なぜならstringstreamは、iostreamクラス階層から継承されているからである。単純な例:

#include <iostream>
#include <string>
#include <sstream>

string f (string& incoming) // incoming は "foo N"
{
istringstream incoming_stream(incoming);
string the_word;
int the_number;

incoming_stream >> the_word // "foo" を抽出
>> the_number; // "N" を抽出

ostringstream output_stream;
output_stream << "The word was " << the_word
<< " and 3*N was " << (3*the_number);

return output_stream.str();
}

A serious problem with CString is a design bug in its memory allocation. Specifically, quoting from that same message:
CStringの深刻な問題は、メモリ・アロケーションの設計バグである。正確には、同メッセージから引用する:

CString suffers from a common programming error that results in
poor performance. Consider the following code:
CString は、プアなパフォーマンスとなる一般的なプログラミング・エラー
の影響をうける。以下のコード例をかんがえよう:


CString n_copies_of (const CString& foo, unsigned n)
{
CString tmp;
for (unsigned i = 0; i < n; i++)
tmp += foo;
return tmp;
}

This function is O(n^2), not O(n). The reason is that each +=
causes a reallocation and copy of the existing string. Microsoft
applications are full of this kind of thing (quadratic performance
on tasks that can be done in linear time) -- on the other hand,
we should be thankful, as it's created such a big market for high-end
ix86 hardware. :-)
この関数は O(n^2)であって、O(n)ではない。理由は、ループ中毎回+=演算子が
メモリの再アロケーションと既存の文字列のコピーをおこなうからだ。Microsoftの
アプリケーションはこの類の問題に満ちている(線形時間で解ける問題が
��乗オーダの性能)--ただ一方でこれは感謝すべきなんだ。ハイ・エンドのix86
ハードウェアの巨大市場を創出しているんだからね(笑)。

If you replace CString with string in the above function, the
performance is O(n).
上記関数で CString を string に置き換えれば、パフォーマンスは O(n) だ。


Joe Buck also pointed out some other things to keep in mind when comparing CString and the Standard string class:
Joe Buck はまた、 CString と 標準stringクラスを比較するにあたり、他にもいくつか気に止めておくべきことを明らかにしている。

  • CString permits access to its internal representation; coders who exploited that may have problems moving to string.
    CString は内部表現へのアクセスを許している;それを利用するコーダーは、string に変換するときに問題となるかもしれない。
  • Microsoft ships the source to CString (in the files MFC\SRC\Str{core,ex}.cpp), so you could fix the allocation bug and rebuild your MFC libraries. Note: It looks like the CString shipped with VC++6.0 has fixed this, although it may in fact have been one of the VC++ SPs that did it.
    Microsoft は CString のソース・コードを配布している(ファイルはMFC\SRC\Str{core,ex}.cpp)。だから自前でアロケーション・バグを修正し、リビルドすることができる。 注意: VC++6.0のCStringは、バグが修正されているように見える。サービス・パックでかもしれないが。
  • string operations like this have O(n) complexity if the implementors do it correctly. The libstdc++ implementors did it correctly. Other vendors might not.
    このような string のメソッドは、O(n) の複雑度を持つ。 実装者が正しくやれば。 libstdc++ の実装者は、これを正しく実装している。他のベンダは、そうでないかもしれない。

  • While parts of the SGI STL are used in libstdc++, their string class is not. The SGI string is essentially vector<char> and does not do any reference counting like libstdc++'s does. (It is O(n), though.) So if you're thinking about SGI's string or rope classes, you're now looking at four possibilities: CString, the libstdc++ string, the SGI string, and the SGI rope, and this is all before any allocator or traits customizations! (More choices than you can shake a stick at -- want fries with that?)
    SGI STLの複数の部分は libstdc++ に使われているが、stringクラスはそうではない。 SGI stringは本質的に vector<char> であり、かつ一切リファレンス・カウントをしていない。libstdc++ はしているが。(O(n)だけれども )。だからもしSGIのstring かまたは ropeクラスを考えているのなら、4つの選択肢がある:CString, libstdc++, SGI string, SGI rope である。そしてこれは一切、アロケータ、トレーツのカスタム化以前である!
    (いろいろ取り揃えてございます。ご一緒にポテトもいかがですか?)

Prev Up Next
縮めてフィット Home パート VI. ローカライゼーション


g++: GNU C++ ライブラリ パートV チャプター 13. 文字列クラスString Classes

チャプター 13. 文字列クラスString Classes

Table of Contents

シンプルな変換Simple Transformations
ケース・センシティビティCase Sensivitity
任意の文字型Arbitrary Character Types
トークン化するTokenizing
縮めてフィットShrink to Fit
CString (MFC)

シンプルな変換Simple Transformations

Here are Standard, simple, and portable ways to perform common transformations on a string instance, such as "convert to all upper case." The word transformations is especially apt, because the standard template function transform<> is used.
ここに string のインスタンスにおける、標準的でシンプルで、かつポータブルな共通の変換を実施するための方法を、示します。たとえば、「すべて大文字に変換する」といったものです。 単語の変換は、とくに適してます。なぜなら、標準テンプレート関数 transform<> が、使用されるからです。

This code will go through some iterations. Here's a simiple version:
これは、イテレーションをいくつか使用したコードです。シンプルなバージョンです:

#include <string>
#include <algorithm>
#include <cctype> // 古い <ctype.h>

struct ToLower
{
char operator() (char c) const { return std::tolower(c); }
};

struct ToUpper
{
char operator() (char c) const { return std::toupper(c); }
};

int main()
{
std::string s ("Some Kind Of Initial Input Goes Here");

// すべてを大文字に変える
std::transform (s.begin(), s.end(), s.begin(), ToUpper());

// すべてを小文字に変える
std::transform (s.begin(), s.end(), s.begin(), ToLower());

// すべてを大文字に変えるが、変換結果を
// 別の文字列変数に格納
std::string capital_s;
capital_s.resize(s.size());
std::transform (s.begin(), s.end(), capital_s.begin(), ToUpper());
}


Note that these calls all involve the global C locale through the use of the C functions toupper/tolower. This is absolutely guaranteed to work -- but only if the string contains only characters from the basic source character set, and there are only 96 of those. Which means that not even all English text can be represented (certain British spellings, proper names, and so forth). So, if all your input forevermore consists of only those 96 characters (hahahahahaha), then you're done.
気をつけること は、これらの呼び出しはすべてグローバル Cロケールを含むことだ。これは、C関数の toupper/tolower の使用していることによる。 これは絶対的に動くとみなされるが、-- 文字列を構成する文字がベーシック・ソース・文字セット のみ であり、かつそれらの内の96種類の文字 のみ からなる場合 だけ、である。つまり、すべての英語テキストが表示できるわけではない (正式なブリティシュ・スペルや固有名詞など)。 だからもし入力文字列が、かならず96種類の文字だけからなるのであれば、変換される。

Note that the ToUpper and ToLower function objects are needed because toupper and tolower are overloaded names (declared in <cctype> and <locale>) so the template-arguments for transform<> cannot be deduced, as explained in this message. At minimum, you can write short wrappers like
また他に 気をつけることは、 ToUpper と ToLower の関数オブジェクトが必要だということ。なぜなら、 toupper と tolower は、オーバー・ロードされた名前だ( <cctype>と<locale> に宣言)。だから このメッセージ で説明されているように、 transform<> へのテンプレート引数は省略できない。 最小限では、下記のような短いラッパーが書ける

char toLower (char c)
{
return std::tolower(c);
}

The correct method is to use a facet for a particular locale and call its conversion functions. These are discussed more in Chapter 22; the specific part is Correct Transformations, which shows the final version of this code. (Thanks to James Kanze for assistance and suggestions on all of this.)
正しいメソッドは、特定のロケールのファセットを使い、そのロケールで決められた変換関数を使うことだ。この問題は、チャプター22でより詳細に議論される; パートの 正しい変換 に、このコードの最終版を示す。(これに助言と提案をしてくれたJames Kanzeに感謝。)

Another common operation is trimming off excess whitespace. Much like transformations, this task is trivial with the use of string's find family. These examples are broken into multiple statements for readability:
そのほかの一般にある操作は、不必要なホワイト・スペースのトリミングだ。変換のとき以上に、このタスクはトリビアである。stringの find ファミリを使用する。以下の例では、可読性を考慮して複数のステートメントに分割している。

std::string str (" \t blah blah blah \n ");

// 先頭のホワイト・スペースをトリム
string::size_type notwhite = str.find_first_not_of(" \t\n");
str.erase(0,notwhite);

// 末尾のホワイト・スペースをトリム
notwhite = str.find_last_not_of(" \t\n");
str.erase(notwhite+1);

Obviously, the calls to find could be inserted directly into the calls to erase, in case your compiler does not optimize named temporaries out of existence.
明らかに、コンパイラが存在しない名前つき一時変数を最適化しなければ、 find の呼び出しは、 eraseの呼び出しへと、直接的に挿入できる。


Prev Up Next
パート V. 文字列Strings Home ケース・センシティビティ


2008年3月18日火曜日

Ruby: Mechanize GUIDE.txt 日本語訳

追記2010/12/7:本内容は古くなったので、バージョン1.0.0のものに更新予定である。
追記2014-10-13: ここに最新版をおいた: http://voidptrjp.blogspot.jp/2014/10/mechanize-guide.html



http://mechanize.rubyforge.org/mechanize/ にある GUIDE.txt を訳してみた。
チュートリアルとしてよくできていると思う(原文的な意味で)。




  • ルー語っぽい箇所などを、若干修正[2008/3/31]

  • 訳微修正。SyntaxHighlighterでコード部分を整理[2010/8/5]








GUIDE.txt


Path:     GUIDE.txt
Last Update:     Tue Dec 04 19:36:28 -0800 2007







WWW::Mechanizeをはじめよう



このガイドは、Mechanize を使い始めるためのものです。このガイドを読み終わるまでに、ページをフェッチしたり、リンクをクリックしたり、フォームをうめてサブミットしたり、Webページ内から必要なデータを取り出したり、、と、お望みのいろいろな便利なことができるようになるとよいです。このガイドは、Mechanize を使ってできることの、表面的なほんとにちょっとしたスクラッチです。だけども、はじめるには十分な情報となるとよいです!

   


ページをフェッチしよう!



最初のことを最初に。mechanize を require して、新しい mechanizeオブジェクトを生成しましょう:

require 'rubygems'
require 'mechanize'

agent = WWW::Mechanize.new




さて、ページをフェッチするためのエージェントが使えます。グーグルをエージェントでフェッチしてみよう:

page = agent.get('http://google.com/')




なにがおこった? 我々は mechanize に対して、グーグルのメインページを取ってくるようにたのみました。Mechanize は、任意のセットされたクッキーを格納し、そしてグーグルが送ってきた任意のリダイレクトをたどりました。エージェントは、ページを我々に返しました。このページからデータを取り出したり、クリックするためのリンクを探したり、うめるためのフォームを見つけることができます。



つぎに、クリックするためのいくつかのリンクを探してみましょう。

   



リンクを見つける





Mechanize は、ページをGETしたり、POSTしたり、またはフォームをSUBMITしたとき、ページ・オブジェクトをひとつ返します。ページがフェッチされたら、エージェントはページをパースして、リンクの一覧表をページ・オブジェクト内に作ります。


それでは、グーグルのホームページをフェッチしたので、すべてのリンクを表示してみよう:

page.links.each do |link|
   puts link.text
end




リンクの一覧を表示できます。だけど、Mechanize はクリックするリンクを見つけるのに役立つ、いくつかショート・カットを用意してます。たとえば、テキストが ‘News’ であるようなリンクをクリックしたい、としましょう。ふつうは、このようにしなければなりません:

page = agent.click page.links.find { |l| l.text == 'News' }




でもMechanize には、ショートカットがあります。上記の代わりに、このようにできるのです:

page = agent.click page.links.text('News')




このショートカットは、「名前が ‘News’ であるような全てのリンクを探せ」という意味です。もしかしたら読者は「そのテキストのリンクは、複数ありうるのに!」と考えているかもしれません。そしてそれは正しい!もしクリック・メソッドに、リンクの一覧を渡した場合、Mechanize は最初のひとつをクリックします。もし二つ目のリンクをクリックしたいのなら、このようにやりましょう:

agent.click page.links.text('News')[1]




適切なリンクを以下のように探すこともできます:

page.links.href('/something')




もしくはそれらを一緒につなげて、適切なテキストと適切なhrefのリンクを探すこともできます:

page.links.text('News').href('/something')




これらのショートカットは、frame, iframe, formのようなものをフェッチしたときの任意のリストに対して、使えます。さて我々はリンクのクリックの仕方を知りました。つぎに、フォームをうめるようなもっと複雑なことをやってみましょう。

   


フォームをうめる




グーグルの例の続きをやりましょう。以下がコードです:

require 'rubygems'
require 'mechanize'

agent = WWW::Mechanize.new
page = agent.get('http://google.com/')




もしページが表示できれば、ひとつのfという名前のフォームがあり、2組のボタンと2,3のフィールドがあります:

pp page




いまフォームの名前がわかりましたので、ページをフェッチしてみましょう:

google_form = page.form('f')




Mechanize で、フォーム・インプット・フィールドにアクセスする方法はいくつかありますが、一番便利な方法は、オブジェクトのアクセッサを利用する方法です。では、フォーム上の ‘q’ という名前のフォーム・フィールドに、‘ruby mechanize’と入力して見ましょう:

google_form.q = 'ruby mechanize'




値をセットして、フォームを表示し、以下のような行が見えることを確認してください:

#<WWW::Mechanize::Field:0x1403488 @name="q", @value="ruby mechanize">




名前 ‘q’ に対応する値が変わっていた場合は、成功です!つぎにフォームをサブミットしてボタンを押し、結果を見てみましょう:

page = agent.submit(google_form, google_form.buttons.first)
pp page




今やったことは、検索フィールドに文字をいれて「検索」ボタンを押したのと同じことです。ボタンなしでフォームをサブミットした場合、テキスト・フィールドに入力してリターン・キーを打ったのと同じです。



コードを全部見てみましょう:

require 'rubygems'
require 'mechanize'

agent = WWW::Mechanize.new
page = agent.get('http://google.com/')
google_form = page.form('f')
google_form.q = 'ruby mechanize'
page = agent.submit(google_form)
pp page




ここまでで、スクリーン・スクレーピングをやってみました。フォームについて、もう少し深く見てみましょう。スキップしたくなる前に!

   





フォーム・テクニック応用編



このセクションでは、フォームで可能な入力フォームで違ったタイプの使用法について、触れたいと思う。パスワードやテキストエリア・フィールドは、テキスト・フィールドと同じように扱われ得る。セレクト・フィールドは、テキスト・フィールドにとても似ているが、関連するオプションがたくさんある。ひとつのオプションを選んだとき、mechanize はそれ以外のオプションを非選択にする (マルチセレクトでなければ!)




たとえばリスト上のひとつのオプションを選択しよう:

form.fields.name('list').options[0].select




今、チェック・ボックスとラジオ・ボタンを見てみよう。チェックボックスを選択するには、ただこのようにすればいい:

form.checkboxes.name('box').check




ラジオ・ボタンは、チェック・ボックスによく似ているが、同じ名前のその他のラジオ・ボタンをアンチェックする方法を知っている。チェック・ボタンと同じように、ラジオ・ボタンをチェックしてみよう:

form.radiobuttons.name('box')[1].check




Mechanize はまた、ファイルのアップロードも簡単にできる!ファイル・アップロード・フィールドを探し、ファイル名を教えてやるのだ:

  form.file_uploads.file_name = "somefile.jpg"


   



データをいじる





Mechanize は、HTMLをパースするために hpricot を使っている。これはなにを意味するか? mechanize で得たページを、hpricotオブジェクトのように扱えるということだ。 Mechanize をデータを取り出したいページのナビゲートに使った後、hpricotのメソッドで取り出せる:

agent.get('http://someurl.com/').search("//p[@class='posted']")


このパワフル・スクレーパに関するさらなる情報については、 HpricotBasics を参照してほしい。




2008年3月16日日曜日

Ruby: OptionParser (optparse.rb) の使い方

2014-05-13追記: 最新の OptionParser の網羅的機能については、「Ruby OptionParser クラスのリファレンス」 を参照してください。

OptionParser: コマンドライン・オプション解析のためのクラス

コマンドライン・オプションを解析するための方法として、従来からGNU の getopt 系のAPIが使われてきた (Getopt,GetoptLong)。Ruby ではこれらに加えて、optparse.rb の OptionParser クラスを利用する方法があるようだ。
ドキュメントは、たとえば http://stdlib.rubyonrails.org/ などに見つけることができる。
ここでこの OptionParser クラスは、従来の getopt 系クラスと使い勝手がだいぶ違うため、使いにくいという意見が散見される。実際、私も使ってみてその感があった。そこで、リファレンス・ドキュメントから主要な機能を抜き出して、使い方をまとめてみた。

OptionParserクラスの主要な機能および記述の方法

OptionParser は、コマンドラインの配列 ARGV を与えられると、その配列を解析しオプションのタイプに応じた処理を行う。ここで、「オプションのタイプに応じた処理」とは、実際には実装者が作りこむものである。
具体的には以下の3点を記述することになる:
  • オプションの定義
  • 定義されたオプションを指定したときの処理の定義
  • ヘルプ・メッセージの定義
以下にサンプルコードを示す。
#! /usr/bin/ruby
#filename: test-optparse.rb
#author: http://voidptr.seesaa.net
#date: Mar. 11th, 2008
#desc:
#ref.: http://stdlib.rubyonrails.org
#
####
require 'optparse';
require 'ostruct';
require 'pp';
#### Option Parse Method.
def option_parse( args )
#Prepare.
ost         = OpenStruct.new;
#default option values.
#
#
ost.help    = "";
ost.file    = "";
ost.kind    = "";
ost.logfile = "test.log";
ost.verbose = false;
ost.arr     = [];
#
op = OptionParser.new do |opars|
opars.banner = "NAME "+" #{$0} [options]";
opars.separator "";
opars.separator "";
#display -h description at tail of the help message.
#
#
#on_headだと、help表示のとき他のオプションとの間に改行される。
#お好みで。
#opars.on_head( "--version", "show the version." ) do
opars.on( "--version", "show the version." ) do
puts "green 1.0.0";
exit 1;
end
#オペランドありオプション(基本形; オペランドFILEは、必須)
#
#
opars.on( "-f FILE", "specify a file" ) do |f|
ost.file = f;
end
#オペランドありオプション(基本形+; オペランドKINDは必須で、値は選択式・短縮形も可)
#-k a で、-k afterと同じ。-k b で、-k before と同じ意味。
#
#
opars.on( "-k KIND", [:before, :after], "select a kind {before, after}" ) do |k|
ost.kind = k;
end
#オペランドありオプション(基本形++; オペランドは、省略可)
#
#
#
opars.on( "-l [LOGFILE]", "specify the logfile." ) do |l|
if ( l != nil ) then
ost.logfile = l;
end
end
#フラグタイプのオプション (オプションは長い形式もあり; offの形式も同時に定義)
#
#
opars.on( "-v", "--[no-]verbose", "verbose mode switch." ) do |v|
ost.verbose = v;
end
#フラグタイプのオプション
#  on_tail で、オプション定義の〆
#
opars.on_tail( "-t", "--tasukete", "show this message." ) do
puts opars;
exit 1;
end
end  #endof do |opars|.
####
#オプションなしの場合.
#
#
if ( args == [] ) then
#ヘルプを表示。
puts op;
exit 1;
end
#
op.parse!( args );
#必須オプションのチェック
#
#
if ( ost.file == "" ) then
e = OptionParser::ParseError.new;
e.reason = "file was NOT specified (#{ost.file}).";
throw e;
exit 1;
end
#
ost;
end  #endof option_parse
#### Do.
options = option_parse(ARGV)
#### Result.
pp ARGV;
puts "";
pp "Dumper #{options}"
puts "name: #{$0}";
####endof filename: test-optparse.rb

コードについて

OptionParser を newする際に、コード・ブロックを渡している。このコード・ブロック内でオプションの定義、処理、ヘルプメッセージの定義を記述する。
これら3要素は、このコード・ブロック内にすべてまとめて記述することになる —-つまり、ロジックとデータは煮込みすぎたスープのようにどろどろに熔けてしまっている。これは、OptionParserの特徴だ。
一般的には、このようなかたちはプログラミング・ポリシーとしてもオブジェクト指向的にもよろしからざることと思われる。グット・デザイン教会からは破門されるかもしれない。
ただ、ことコマンドライン・オプション処理に限っていえば、この方式はとても楽なのだ; 各オプションとそれらの説明を、一元管理できる。

2008年3月11日火曜日

g++: GNU C++ ライブラリ パート V (目次)

パート V. 文字列Strings

Table of Contents

13. 文字列クラスString Classes

シンプルな変換Simple Transformations
ケース・センシティビティCase Sensivitity
任意の文字型Arbitrary Character Types
トークン化Tokenizing
縮めてフィットShrink to Fit
CString (MFC)

g++: GNU C++ ライブラリ パート II チャプター 4. 型

チャプター 4. 型

Table of Contents

基本型Fundamental Types
数値的プロパティNumeric Properties
NULL

基本型Fundamental Types

C++は、下記の組込み型を持ちます:

  • char
  • signed char
  • unsigned char
  • signed short
  • signed int
  • signed long
  • unsigned short
  • unsigned int
  • unsigned long
  • bool
  • wchar_t
  • float
  • double
  • long double

これらの基本型は、ヘッダファイルのインクルードなしでいつでも使用可能です。これらの型は、C++またはCでまったく同じです。

これらの型のライブラリの部分を特定することは、禁止されます:その代わりPODを使います。

g++: GNU C++ ライブラリ パートI チャプター 2. セットアップ

とちゅう

2008年3月5日水曜日

xyzzy: 空白・空行無視した比較のための設定

初期設定ファイル:$XYZZY_HOME/.xyzzy に、下記を追加すればよいよ。

(setq ed::*diff-command-option* "-aBw")

※diffコマンドは、Cygwinのやつを使ってます。

2008年2月29日金曜日

Ruby: irb, ruby console で日本語入力ができない?

いつのまにか、そうなっていたのでいじってみた。


解決法
Step 1. ナチュラルインプットを無効にする

(1) コントロールパネル>地域と言語のオプション>テキストサービスと入力言語
で、Natural Input を選択。

(2) プロパティ>詳細設定>「詳細なテキストサービスをオフにする」を、チェック

再起動を促される。

これをおこなうと、なぜか言語バーがデスクトップに表示されなくなった。
また、コンパネの地域と言語のオプション>テキストサービスと入力言語にも、Microsoft Natural Input が消えた。


Step 2. IME使用の設定を行う

IME の詳細設定>システムの構成ペイン内>「詳細なテキストサービスをオフにする」を、チェック

IMEのバー(これも言語バー?)が、デスクトップ右下に表示される。
また、irb・ruby console ともに、Alt+漢字で日本語入力可能に。ウマー

2008年2月16日土曜日

g++: GNU C++ ライブラリ 日本語訳(目次)

探してたのだがどうにも見つからなかったので、やってみた(まだ目次のみ)。
原書は、"The GNU C++ Library" (http://gcc.gnu.org/onlinedocs/libstdc++/manual/spine.html)
まだ途中です。適宜アップデート予定。
長すぎる、とSeeSaa様に怒られてしまったので、付録以降はとりあえず本稿では省きました。



GNU C++ ライブラリ

Copyright (c) 2008 FSF

Japanese Translation Copyright (c) 2008 もふもふ

ライセンス

Table of Contents

I. イントロダクション

1. ステータス

実装ステータスImplementation Status

C++ 1998
C++ TR1
C++ 200x

ライセンス

コード: GPL
ドキュメンテーション: GPL, FDL

バグ

実装のバグ
標準ライブラリのバグStandard Bugs

2. セットアップ

ビルド構成の設定Configure
ビルド

必要なお膳立てPrerequisites
Make

テスト

構成Organization
命名規則
ユーティリティ
テスト・スイートの実行
新しいテスト・ケース
テスト・ハーネス詳細
これから

3. つかい方

ライブラリ・バイナリ・ファイルのリンク
ヘッダ

ヘッダ・ファイル
ヘッダの混載Mixing Headers
C ヘッダと std名前空間
コンパイル済みヘッダ

名前空間

使用可能な名前空間
std名前空間
名前空間を組み合わせて使うUsing Namespace Composition

マクロ
同時性Concurrency

必要なお膳立てPrerequisites
スレッド安全性
アトミック
IO
コンテナ

「例外」安全性Exception Safety
デバッギング・サポート

g++ の使用
デバッグバージョンのライブラリ・バイナリ・ファイルDebug Versions of Library Binary Files
メモリ・リーク狩りMemory Leak Hunting
gdb をつかう
捕らえなかった例外を追う
デバッグ・モード
コンパイル時間のチェックCompile Time Checking

II. サポート

prefaceTODO:
4. 型Types

基本の型Fundamental Types
数値プロパティNumeric Properties
NULL

5. 動的メモリ
6. 停止Termination

停止ハンドラTermination Handlers
くどくどしい停止ハンドラVerbose Terminate Handler

III. 診断

7. 例外

例外クラス
例外にデータを追加する
打ち消しCancellation

8. コンセプト・チェッキング

IV. ユーティリティ

9. ファンクタ
10. ペア
11. メモリ

アロケータ

要求仕様Requirements
設計上の問題点Design Issues
実装
スペシフィック・アロケータをつかう
カスタム・アロケータCustom Allocators
エクステンション・アロケータ

auto_ptr

制限
コンテナ中での使用

shared_ptr

要求仕様Requirements
設計上の問題点Design Issues
実装Implementation
使用法Use
謝辞

12. Traits

V. 文字列Strings

13. String クラス関連Classes

シンプルな変換Simple Transformations
大文字小文字の区別Case Sensivitity
任意の文字型Arbitrary Character Types
トークナイジングTokenizing
縮めてフィットShrink to Fit
CStringクラス (MFC)

VI. ローカライゼーション

14. ロケール関連

ロケールlocale

要求仕様Requirements
設計Design
実装Implementation
これからFuture

15. ファセット aka カテゴリFacets aka Categories

ctype

実装
これから

codecvt

要求仕様Requirements
設計Design
実装Implementation
使用法Use
これからFuture

messages

要求仕様Requirements
設計Design
実装Implementation
使用法Use
これからFuture

VII. コンテナ関連

16. シーケンスSequences

リストlist

list::size() は 計算量O(n)

ベクタvector

空間オーバヘッドの管理

17. 連想配列Associative

挿入のヒントInsertion Hints
ビットセットbitset

サイズ変数Size Variable
Type String

18. Cとの連携Interacting with C

コンテナ vs. アレイContainers vs. Arrays

VIII. イテレータIterators

19. 定義済みPredefined

イテレータ vs. ポインタIterators vs. Pointers
ひとつ越えたらOne Past the End

IX. アルゴリズムAlgorithms

prefaceTODO:
20. ミューテイティイングMutating

スワップswap

特殊化Specializations

X. 数値型Numerics

21. 複素数型Complex

complex の処理

22. 一般化した操作Generalized Operations
23. Cとの連携Interacting with C

数値型 vs. アレイNumerics vs. Arrays
C99

XI. 入力と出力

24. Iostream オブジェクト
25. Stream バッファ

streambuf 派生クラス関連
バッファリング

26. メモリ・ベースのストリーム

strstream との互換性

27. ファイル・ベースのストリーム

ファイルをコピーする
バイナリ入力と出力
さらなるバイナリ入力と出力

28. Cとの連携

ファイルポインタFILE* とファイルディスクリプタを使うFILE* and file descriptors
パフォーマンス

XII. 拡張Extensions

prefaceTODO:
29. コンパイル時間のチェックCompile Time Checks
30. デバッグ・モードDebug Mode

Intro
セマンティクスSemantics
つかい方Using

デバッグ・モードを使う
Using a Specific Debug Container

設計

目的Goals
方法
他の実装Other Implementations

31. 並列モードParallel Mode

Intro
セマンティクスSemantics
つかい方Using

並列モードを使うUsing Parallel Mode
特殊並列コンポーネントを使うUsing Specific Parallel Components

設計Design

基本インタフェースInterface Basics
構成とチューニングConfiguration and Tuning
名前空間の実装Implementation Namespaces

テスティングTesting
Bibliography

32. アロケータ

mt_allocator

Intro
設計上の問題点Design Issues
実装
単一スレッドの例
複数スレッドの例

bitmap_allocator

設計
実装

33. コンテナ

ポリシーベースのデータ構造Policy Based Data Structures
HP/SGI
Deprecated HP/SGI

34. ユーティリティ
35. アルゴリズムAlgorithms
36. 数値型Numerics
37. イテレータIterators
38. 入力と出力

filebufs の派生

39. 曖昧性除去Demangling
40. 同時性Concurrency

設計

ロックとミューテックスへのインタフェースInterface to Locks and Mutexes
アトミック・ファンクションへのインタフェースInterface to Atomic Functions

実装

ビルトインのアトミック・ファンクションをつかうUsing Builitin Atomic Functions
スレッド抽象化

使用法

2008年2月8日金曜日

[書籍メモ] 本日購入分

  1. Alberto Palacios Pawlovsky/アズウィ著;『考えるコンピュータのアルゴリズム』,SoftBank Creative,¥2,400
  2. Bruce A. Tate著,角谷 信太郎訳;『JavaからRubyへ マネージャのための実践以降ガイド』,オライリー・ジャパン,¥2,200
  3. Digital Travesia管理人,うさぴょん著;『デバッガによるx86プログラム解析入門』,秀和システム,¥2,400


  • 目的
    やわらかいアルゴリズムの情報収集、ERプロジェクトへの活用(1)
    社内力学研究、変革に必要とされるものは何か?その他RubyとJavaの相違点等情報収集(2)
    プリミティブ技術、ツールの情報収集、実践(3)

  • 要約・分析・考察など
    別途


2008年1月30日水曜日

FireFoxプラグイン:マクロ機能を組み込むiMacros

これは便利かも。
 iMacrosはFirefoxの操作を記録し自動再実行するツールだ。Firefoxのエンジンを利用してFirefox上で行った操作を追跡しスク
リプトとして記録する。このスクリプトを保存しておけば、あとでロードして実行したり、コピーして別のコンピューター上で実行したりすることができる。(http://opentechpress.jp/developer/article.pl?sid=08/01/16/019223&tid=194
)
スクリプトをみんなで共有する仕組みもあるらしい(Social Scripting)。

Select "Share Macro" on the Edit tab to embed the complete iMacro in a link that you can share with others.
PerlのCPANみたいなものか?


・FireFoxを自動運転するツール、iMacros
http://opentechpress.jp/developer/article.pl?sid=08/01/16/019223&tid=194

・iMacros for FireFox
http://www.iopus.com/imacros/firefox/

2008年1月29日火曜日

Ruby: 数字に桁区切りを入れたい(その2)

前回 は、数字を区切るためのインスタンス・メソッドを作成した。
今回はこのクラス Price に、コンストラクタと比較演算メソッドを、追加しよう。
Price.new の引数として、文字列、または、整数をとるものとする。
オープンクラス を使って、クラスに機能を追加した。
class Price
  public

  include Comparable

  #Constructer
  #
  def initialize( p_ )
    @val_orig = p_.to_s;
    @val_s_wo_d = del_digit_delimiter( "#{@val_orig}" );
    @val_s_w_d = add_digit_delimiter( @val_s_wo_d );
    @val_i = @val_s_wo_d.to_i;
  end

  def <=>(other)
    self.val_i <=> other.val_i;
  end

end
コンストラクタ: initialize では、4種類のインスタンス変数: val_orig, val_s_wo_d, val_s_w_d, val_i; が生成される。
それぞれ、オリジナルの値、桁区切りなしの値、桁区切りありの値、数値変換時の値、となる。
インスタンス・メソッド: <=> は、クラス Price のオブジェクト同士の大小比較を行うために、定義した[1]。

References:

  • [1] 『プログラミングRuby 第2版 言語編』; ‘Mixin’, p.101

2008年1月24日木曜日

Ruby: 数字に桁区切りを入れたい (その1)

数字に桁区切りを入れたい。

クラスPriceをつくってみよう。
内部で文字列と数字で値を保存する。
class Price

protected

def add_digit_delimiter( v_ )

#remove comma from v_.

v_.gsub(/[,]/){ |c| "" };



#adding commas from lower, each 3-digits.

v_.reverse.gsub(/[[:digit:]]{3}(?=\d)/){|d| "#{d},"}.reverse;

end



[追記]2013-04-13 3の倍数桁のときに、左端にカンマが付いてしまうため修正: (?=\d)を追加した。
def del_digit_delimiter( v_ )

v_.gsub(/,/){|d| ""};

end

��

��

これで、メインとなる処理はできた。

2008年1月10日木曜日

FireFox:ページのリダイレクト設定が正しくありません

近頃FireFoxとそのプラグインをいくつかバージョンアップをおこなったら、mixiのニュースをクリックしても、
ページのリダイレクト設定が正しくありません
このアドレスへのリクエストに対するサーバのリダイレクト設定がループしています。
Cookie を無効化したり拒否していることにより、この問題が発生している可能性もあります。
などとでて、ページが表示されなくなってしまった。

以下のような環境で、当該現象が発生した:
NoScript 1.2.6
FireFox 2.0.0.11


WA:FireFox(NoScript)の設定でWhite listから当該ドメインを削除する
これは下記のように、いったんwhite listから当該ドメイン(ここではmixi.jp)を削除することで、現象を解消されることを確認できた。

NoScriptのアイコン右クリ>オプション...>Whitelistタブを選択
そして、問題の生じているドメイン名を、いったん削除。
(削除の影響:Javascriptなどは、削除したドメインで無効となる)
これで、リンク先にいけるはず。
より詳細なソースについては、こちら:
"Q: Looks like the Anti-XSS feature causes problems with URLs containing diacritics or other non-ASCII characters, e.g. with queries
to search engines (other than Google and Yahoo) containing Japanese or Chinese terms.
"
http://noscript.net/faq#qa4_2
[2008/1/18追記]NoScript 1.2.9で、本エントリの症状は改善された模様。忘備のために残す。