2012年03月19日

C++のthrowは式だった

送出式

throw expression

送出式が実行されると例外を送出する。送出式はvoid型である。

以上、送出式 - 標準C++辞典 - livedoor Wiki(ウィキ)より。

えっ、送出って事は、これ式だったのか?

という事は……


#include <iostream>
using namespace std;

int main() {
	try {
		true ? throw 1 : throw 2;
	} catch(int i) {
		cout << "throw : " << i << endl;
	}
}

……というコードを書いて実行してみると……

throw : 1

本当だ……条件演算内にthrow書いても問題ない。

これは知らなかった。しかしどういう時に役に立つんだろうこれ?

ラベル:C++
posted by 天井冴太 at 03:04| Comment(0) | TrackBack(0) | Study | 更新情報をチェックする

2012年02月10日

忍者バリアーなんて死ねばいいのに

忍者バリアーは「荒らし」、スパムなどからのアクセスを簡単に拒否、制限できるサービスです。

……というのが、忍者バリアーの趣旨らしいのだが……

『許可したドメインのJavaScriptのみ実行を許可する』アドオンのNoScriptを導入したFirefoxで、忍者バリアーを導入しているwebページを閲覧しようとすると……

[忍者バリアーで飛ばされるページ]問答無用で閲覧がブロックされる。

閲覧出来なかったページのソースコードを覗いてみる。

<script type="text/javascript" src="http://bar1.shinobi.jp/hash.js"></script>
<script type="text/javascript" src="http://bar1.shinobi.jp/s/40/00381.js"></script>
<noscript><a href="http://www.ninja.co.jp/barrier/" target="_blank">アクセス制御</a></noscript>
<noscript><meta http-equiv="refresh" content="0;URL=http://bar1.shinobi.jp/hoge/NoScript?0038140" />
<div style="background-color: #000000;text-align: center;vertical-align: middle;width:100%;height: 100%;margin: -10px;padding: 0px;z-index: 10;position: absolute;">
<div style="color: #ffffff;margin: 0px;padding: 0px;position: absolute;top:50%;left:47%;"><a href="http://www.ninja.co.jp/">NINJA TOOLS</a></div></div></noscript>

スクリプトを実行出来ない環境下で適用する内容を記述するnoscript要素の下で、<meta http-equiv="refresh" />を使い、忍者バリアーが用意したページにリダイレクトしている。

強制的に忍者バリアーの用意したページに移動してしまうので、元のサイトのスクリプト実行を許可する暇もない。

つまり、NoScript(或いは類似機能を導入したwebブラウザ)では、忍者バリアーを導入したページは閲覧出来ない。荒らしやスパマーか否かに拘わらず。

荒らしやスパマーか否かに拘わらず』。
はい、大事な事なので2回言いました。

そもそも、

このホームページはJavaScriptを使っています。
ブラウザの設定でJavaScriptを有効に設定してから
アクセスしてください。

とか言っているが、JavaScriptが必要なのは忍者バリアー自身じゃないか。

また、世の中にはJavaScript使えないwebブラウザだって存在するのだ。そういったブラウザの利用者はどうしろと?

大体、忍者バリアーなんて簡単に通過できてしまうのだ。忍者バリアーで本当に防ぎたい荒らしやスパマーは、これくらいの対策はしてくるだろう。バリアー()

結局、
忍者バリアーは、荒らしやスパマーに対しての効果が殆ど程めず、且つ、悪意の無い閲覧者にとってはページ閲覧の邪魔になりかねないという、全くのクソッタレなのだ。

敢えて言おう。
忍者バリアーは役立たずであると!

posted by 天井冴太 at 22:43| Comment(0) | TrackBack(0) | Tool | 更新情報をチェックする

2012年02月07日

Cygwin←→Windowsのファイルパス相互変換

備忘録ともいう。

CygwinのパスをWindowsのパスに
cygpath -w filepath
CygwinのパスをWindowsのパス(ショートファイルネーム)に
cygpath -d filepath
WindowsのパスをCygwinのパスに
cygpath -u filepath

-uデフォの挙動のようで、省略しても動作する。

他に、Windowsの各種特殊フォルダ(デスクトップとかSystemフォルダとか)を出力させる事も出来たり、結構多機能。

Try `cygpath --help' for more information.

ラベル:Windows cygwin tool CUI
posted by 天井冴太 at 21:24| Comment(0) | TrackBack(0) | Tool | 更新情報をチェックする

2011年12月10日

BOOST_TEST_DONT_PRINT_LOG_VALUE()が効くBOOST_CHECK_EQUAL_COLLECTIONS()を作る

この記事は……

Boost Advent Calendar 2011の一環として書かれた。ボレロ村上さんから引き継いだ、10日目である。

Advent Calendarとは何か? については、例えば師走を楽しもう。技術系アドベントカレンダーの魅力とは - @ITを参照の事。

参加者を見回すと、STAR WARSに出てくるシスの暗黒卿ばりに黒のローブを引きずったC++闇の軍団ばっかりで非常に恐ろしい。しかし、話を振られてしまったら、参加するしかないじゃない! あなたも、私も……!

なお、当記事中で言及するBoostのバージョンは、記事執筆時点での最新バージョンであるVersion 1.48.0を前提としている。

BOOST_CHECK_EQUAL_COLLECTIONS()マクロ

Boost.Testにおいて、コンテナに格納されている値を検証するにはBOOST_CHECK_EQUAL_COLLECTIONS()マクロを利用する。他のマクロと同様、BOOST_WARN_EQUAL_COLLECTIONS(), BOOST_REQUIRE_EQUAL_COLLECTIONS()という、異なるlevelのマクロも存在する。この記事では便宜上、これら3つをひっくるめてBOOST_CHECK_EQUAL_COLLECTIONSと呼ぶ事にする。

詳細な使用法は、The UTF testing tools referenceBOOST_<level>_EQUAL_COLLECTION項を参照。

BOOST_TEST_DONT_PRINT_LOG_VALUE()マクロ

BOOST_TEST_DONT_PRINT_LOG_VALUE()マクロは、BOOST_CHECK_EQUAL()等で検証した値をログに出力しない事を指定する物だ。BOOST_CHECK_EQUAL()等で検証するオブジェクトは出力ストリームへのoperator<<をサポートしている必要が有る。が、全ての型がそれをサポートしているという事はあり得ない。例えばstd::pairがそれに当たる。そういった型をこのマクロで指定すると、テスト結果のログに、その型のオブジェクトの値は出力されなくなる。

詳細はTest log outputを参照。

BOOST_TEST_DONT_PRINT_LOG_VALUE()対応BOOST_CHECK_EQUAL_COLLECTIONS

さて、BOOST_TEST_DONT_PRINT_LOG_VALUE()マクロだが、困った事にBOOST_CHECK_EQUAL_COLLECTIONS()マクロでのログ出力においては適応されない。これは困る。

という訳で、BOOST_TEST_DONT_PRINT_LOG_VALUE()に対応したBOOST_CHECK_EQUAL_COLLECTIONS()を作ってみる。

続きを読む
posted by 天井冴太 at 21:52| Comment(7) | TrackBack(0) | Other | 更新情報をチェックする

2011年11月19日

CSS3で表現力が高くなったからと言って、span等でボタンを作るのはやめて下さい。いえ、やめなさい。もう少し真っ当なHTMLを作ることを心がけましょう。むしろ今すぐwebの仕事辞めて腹を切って死ぬべきである!

CSS3で表現力が高くなったからと言って、span等でボタンを作るのはやめて下さい。いえ、やめなさい。もう少し真っ当なHTMLを作ることを心がけましょう。 - Vimple Star Sprites - vimperatorグループ

で、

で、

もう禿げ上がるぐらいに同意。teramakoさんはアクセサビリティの観点で言及した訳ではないみたいだけど、アクセサビリティの観点からも、spandivでボタン作るwebデベロッパは死ぬべきだと思う。恐ろしい事に、Googleなんかもこの過ちを犯している。

これが、Vimperatorのような『利用者が敢えてポインティングデバイス以外での操作を好んでいる』という場合だけ問題になるのならば兎も角、例えば音声ブラウザを利用せざるを得ない、視力に問題を抱える閲覧者にも影響が有るというのはどうなのか。そんな奴らは知ったこっちゃないって?ふーん?

せめて、WAI-ARIArole属性を付けるとかして欲しい。role="button"とか。それならば、ある程度問題は小さく出来る筈だ。

取り敢えずteramakoさん始めVimperator使いな人達は、.vimperatorrcで'hinttags'WAI-ARIAの属性を拾うよう設定したらどうかと思う。数は少ないが、これらの属性を導入しているwebサイトも在るので。

私は以下のように設定している。上でえらそうに言っておきながら、WAI-ARIAについてきちんと理解している訳ではないので、何処か変な所があるかも知れないが。

set hinttags+="|//*[@role='button' or @role='checkbox' or @role='combobox' or @role='listbox' or @role='listitem' or @role='menuitem' or @role='menuitemcheckbox' or @role='menuitemradio' or @role='option' or @role='radio' or @role='scrollbar' or @role='slider' or @role='spinbutton' or @role='tab' or @role='textbox' or @role='treeitem']"
set hinttags+="|//*[@tabindex]"

追記

はい、変な所在りましたね……
という訳で、上記コードの'extendedhinttags'の行消して、'hinttags'の中から"@role='link' or "消しました。
THX @teramako!

更に追記

2011年12月2日、teramakoさんに唆されてから提案されてVimperatorにパッチ投げて採用された。なので、現在のVimperatorには上記設定はしなくて良い。

ラベル:web WAI-ARIA UI
posted by 天井冴太 at 04:25| Comment(0) | TrackBack(0) | Other | 更新情報をチェックする

2011年09月30日

Visual C++ 2010でQt使おうとして挫折した話

此処で出てくる"Visual C++ 2010"は正確には"Visual C++ 2010 Express SP1"の事ですはい。

以下やった事箇条書き。

  1. Qt のダウンロード ? Qt - A cross-platform application and UI frameworkからQt SDK version 1.1.3のオンラインインストーラーをダウンロード。
  2. インストーラー起動。デフォルト設定でインストールを行おうとするも、あまりのダウンロード所要時間に音を上げ中止。
  3. 再びインストーラー起動。適当に必要不必要そうなモジュールのチェックを付けたり外したり。この時、VC++のサポート対象が2008だと知って少々不安になるも、インストール成功。
  4. スタートメニューからQt 4.7.4 for Desktop (MSVC 2008)を起動。VC++2010のvcvarsall.batを起動。
  5. Qt 4.7: Getting Started Programming with Qt のHello Notepadサンプルと同じコードを入力し、qmake -project & qmake & nmake。成功。

実行すると……

D:\Documents and Settings\AmaiSaeta\qttest.vc>debug\qttest.exe
指定されたプログラムは実行できません。

アルェー?
まぁVC++2010でVC++2008用のバイナリを使ったわけだから、変な事になるのも致し方なし……

仕方無いので、Qtをソースからビルド。

  1. Qt のダウンロード ? Qt - A cross-platform application and UI frameworkからqt-everywhere-opensource-src-4.7.4.tar.gzをダウンロード、適当な場所に展開。
  2. Qt 4.6: General Qt Requirements及びQt 4.6: Qt for Windows Requirementsに有る通り、DirectX SDKとWindows Platform SDK、OpenSSLを導入する。
    今回はそれぞれ、現時点で最新と思われる以下の物を採用。
  3. Qt 4.7: Installing Qt for Windowsを参考にQtをbuild。configureのオプションはconfigure -helpを見つつ適当に決めた。
    "%VS100COMNTOOLS%\..\..\VC\vcvarsall.bat"
    PATH C:\OpenSSL-Win32\bin\;%PATH%
    SET INCLUDE=C:\OpenSSL-Win32\include;%INCLUDE%
    SET LIB=C:\OpenSSL-Win32\lib;%LIB%
    PATH (Qtソース展開先)\bin;%PATH%
    CD (Qtソース展開先)
    configure -debug-and-release -opensource -shared -static -no-qt3support -platform win32-msvc2010 
    nmake
    当方の環境で2時間半というウンザリするような時間かけてbuild完了。
  4. バイナリ版導入と同じくQt 4.7: Getting Started Programming with QtのHello Notepadを作ってみる。今度は正常に動作。
  5. 続いてAdding a Quit Buttonを作ってみる。buildは成功するが、Quitボタンを押すと……
    [Qtサンプルプログラムを実行すると表示されたAssertion Failedダイアログ]

アルェー?
assertion failedしたf:\dd\vctools\ctr_bld\self_x86\crt\dbgdel.cppというファイルはこちらの環境には存在しない。というかf:ドライブなんて無い。という事は、Qtのbuildで使った(C++標準含む)ライブラリの何れかで発生していると思われるが、それを調査する気力は既に残っていないのであった……

ラベル:QT Visual_C++ C++ library
posted by 天井冴太 at 18:54| Comment(0) | TrackBack(0) | Tool | 更新情報をチェックする

2011年09月07日

DOMで既存スタイルシートにルールを追加してはいけない

JavaScriptでスタイルシートを操作するには?

JavaScriptで既存HTMLページにCSSを追加する必要が出て来たのでちょっと調べた。
基本的に、document.styleSheetslink要素やstyle要素で読み込まれるスタイルシートが配列風(実際は配列ではない)に参照出来、insertRuleで新規にルールを追加出来るようだ(ただし例によってInternet Explorer以外。IE死ね!)。

const styleSheets = document.styleSheets;
// これで、
//  styleSheets[0] = 1つ目のlink或いはstyleで導入されているスタイルシート
//  styleSheets[1] = 2つ目のlink或いはstyleで導入されているスタイルシート
// ……といった感じでアクセス出来る。
const styleSheetsNum = styleSheets.length;	// スタイルシートの数

styleSheets[0].insertRule(	// ルールの追加;一番最初のスタイルシートに……
	"a { font-weight: bold; }",	 // ←のルールを……
	0);	// 0番目(対象スタイルシート先頭)に挿入。
const ruleNum = styleSheets[0].cssRules.length;	// ルールの数
styleSheets[0].insertRule("h1 { color: #000; }", ruleNum);	// ←で、スタイルシートの最後にルールを追加出来る。

で、こういった事を解説している、

なんかでは、document.styleSheetsの一番最後にルールを追加するようなコードを載せてる。

でもこれっておかしくない?

続きを読む
posted by 天井冴太 at 12:51| Comment(2) | TrackBack(0) | Study | 更新情報をチェックする

2011年08月29日

JavaScriptからチェックボックスのON/OFFを制御する

var elem = document.getElementById('checkbox_element');

みたいな感じで変数elemが操作対象のチェックボックス要素指してるとして、

  • elem.setAttribute()elem.removeAttribute()で操作 ←まちがい
  • elem.checkedで操作 ←せいかい!

以下テストコード

詳細はXHTMLソース自体を見て欲しいが、"change"ボタンを押す毎にその直前のチェックボックスのON/OFFを切り替える(事を意図している)。

Firefox 6.0、Opera 11.11、Chrome 13.0.782.112mで確認。例によってInternet Explorerはまともに動作しない。IE死ね!

なんか納得いかねぇ!

ラベル:HTML XHTML javascript DOM
posted by 天井冴太 at 20:22| Comment(0) | TrackBack(0) | Study | 更新情報をチェックする

2011年07月28日

C++でchar[][]に対するalgorithmを実装する

この記事は以下の続きです

  1. C/C++で多次元配列を引数に取るには
  2. C/C++で多次元配列を戻り値にするには

char[][]に対するalgorithmが欲しい

C++はその標準ライブラリの一部であるSTLにて、ジェネリックプログラミングで各種処理を抽象化した関数群(algorithm)が用意されている。sortとかcountとか、for eachまで。
そして、C++(そのベースとなったC言語由来だが)で文字列は文字の配列(char[])として表現する都合上、『文字列の配列』は文字の二次元配列(char[][])として表現する事になる(std::string[]については此処では触れない)。

……じゃあ、『文字列の配列』用に特殊化したalgorithmが欲しくなるよね?

char[][]に対するstd::find()を実装する

……という訳で、char[][]用のstd::find()を実装してみた。同じようにして、wchar_t[][]用や、他のalgorithmも実装出来る筈。

#include <algorithm>
#include <functional>
#include <cstddef>
#include <cstring>

#define NS aslib
// #define NS std
// ↑ユーザー定義型用の完全特殊化以外をstd名前空間に記述するのは本当は×

namespace {
	template<typename Itr>
	Itr find_detail_for_char2darray(Itr begin, Itr end, const char *target) {
		return std::find_if(begin, end, 
			std::not1(std::bind2nd(std::ptr_fun(std::strcmp), target))
		);
	}
}

namespace NS {
	template<std::size_t N>
	const char (*find(const char (*begin)[N], const char (*end)[N], const char *target))[N] {
		return ::find_detail_for_char2darray(begin, end, target);
	}

#if NS==std
	// std下に置く場合は、以下の特殊化の定義も必要となる

	template<std::size_t N>
	char (*find(char (*begin)[N], char (*end)[N], const char *target))[N] {
		return find_detail_for_char2darray(begin, end, target);
	}

	template<std::size_t N>
	const char (*find(const char (*begin)[N], const char (*end)[N], char *target))[N] {
		return find_detail_for_char2darray(begin, end, target);
	}

	template<std::size_t N>
	char (*find(char (*begin)[N], char (*end)[N], char *target))[N] {
		return find_detail_for_char2darray(begin, end, target);
	}
#endif
}

ソースはこちら。おまけで確認用のmain()も記述している。Ideone.comにもUPしているので、そちらの方が手軽かも知れない。

ソース中でも言及しているが、本来、std名前空間下には、ユーザー定義型用に完全特殊化したもの以外は追加してはいけない事になっている(らしい)。
char[][]と同じ名前空間(上記の場合はaslib)下に、std::find()を呼び出すだけの汎用版を用意し、同じインタフェイスで使えるようにするのがスマートかも知れない。

ラベル:C++
posted by 天井冴太 at 00:38| Comment(0) | TrackBack(0) | Other | 更新情報をチェックする

2011年07月22日

C/C++で多次元配列を戻り値にするには

前回はC/C++で多次元配列を引数にとる方法を記した。引数があるなら戻り値はどうだ?というのか今回の趣旨。正確には『多次元配列を指すポインタ』な訳であるが。

結論から言うと、以下のようになる。

/* int[x][3]を指すポインタを返す関数 */
int (*function(int))[3];
int (*function(int))[3] {
	/* ... snip ... */
}

これは『配列を指すポインタ』の変数宣言とよく似ている。
また、前回挙げた引数の書き方(の1つ)ともよく似ている。

/* int[x][3]を指すポインタ */
int (*pointer)[3];
/* int[x][3]を指すポインタを引数とする関数 */
int function(int (*arg)[3]);

ただし、引数の場合と異なり、以下のような書き方は出来ない。

/* int[x][2](を指すポインタ)を返す関数……のつもり */
int functionX(int)[][2];	/* だがエラーだ */

引数の場合と同様、C++であればtemplateを用いて、一番右の次元の要素数を限定せずに書く事が出来る。

template<std::size_t N> int (*function(void))[N];
int (*ret1)[1] = function<1>();
int (*ret2)[2] = function<2>();

さらに次回に続く。

参考

ラベル:C C++
posted by 天井冴太 at 22:10| Comment(0) | TrackBack(1) | Study | 更新情報をチェックする

広告


この広告は60日以上更新がないブログに表示がされております。

以下のいずれかの方法で非表示にすることが可能です。

・記事の投稿、編集をおこなう
・マイブログの【設定】 > 【広告設定】 より、「60日間更新が無い場合」 の 「広告を表示しない」にチェックを入れて保存する。


×

この広告は90日以上新しい記事の投稿がないブログに表示されております。