2017年01月03日

プログラミング書き初めを行う「kakizome」リポジトリというアイディア

新年明けまして御目出度う御座います。今年は、もうちょっと、頻繁にblog更新できると良いなあ。

プログラミング書き初めというのを思いついた。既に誰かやってそうではあるが。

一先ず思いついたルールは以下の通り。

  1. 「kakizome」リポジトリをGithub等で公開し、毎年新しい書き初めを追加する。
  2. 毎年、初めて触る 言語 or ライブラリ or パラダイム を使う。
    どうせなら新しい物に触ってワクワクしようぜ!という趣旨。
    「条件分岐なしにFizzBuzzを書く」みたいな、トリッキーな記法に挑戦するでも良いかもしれない。初めて書く方法であれば。
  3. 出来れば3が日以内に行う。
  4. 推奨は「 『A Happy New Year (西暦年数)!』 というテキストを出力する」プログラム。
    理由は、 「hello world」 系のプログラムであれば、様々な環境で書ける事が期待できるから。
    ネットワークライブラリであれば「サーバーから取得した 「A Happy New Year (西暦年数)!」 という文字列をクライアント側で表示」とか、グラフィック系であれば「直線や曲線で、お題の文字列を描画」などでも良い。

という訳で、書き初め。TypeScriptでやってみた。

kakizome/2017 at master ・ AmaiSaeta/kakizome

何も、後ちょっとで3が日が終わる今、公開しなくても良いじゃんとも思うが、思いついたのが今日の昼過ぎで、他の用事も片付ける必要があったからね。仕方ないね。

他の人も同じように書き初めプログラムを公開して、ああこんな 言語 or ライブラリ or パラダイム があったのねみたいに影響を与えあえれば良いなぁと。 「hello world」 系のプログラムであれば、そう長い物にはならないだろうし。来週は土曜から月曜(成人の日)まで3連休の人も多いだろうし、いろんな人が取り組んでみてくれると嬉しいな。

まぁ、この試みが続くかは神のみぞ知る。何せ次は1年後だから……

posted by 天井冴太 at 23:39 | Comment(0) | TrackBack(0) | Other | このブログの読者になる | 更新情報をチェックする
投票お願いします 人気blogランキング - 投票する
2015年11月29日

気になる Advent Calendar 2015年版

何時の間にか、この季節になってしまった。とりあえず気になる Advent Calendar のリストアップ。

大量にリストアップしているが、全てのcalendarの全ての記事を読むつもりという訳ではなく、とりあえずフィードリーダーに突っ込んでおいて、琴線に触れるタイトルの記事のみを読んでいく予定。

本当は、何処かの奴に参加したい所だが、仕事がクソみたいな忙しさの所為で執筆時間取れないので、参加は出来なそう……

続きを読む
posted by 天井冴太 at 01:08 | Comment(0) | TrackBack(0) | Other | このブログの読者になる | 更新情報をチェックする
投票お願いします 人気blogランキング - 投票する
2015年03月08日

ラムダ関数/無名関数禁止令を出したい

今仕事で関わっている某アプリ開発の話。次のように書かれているコードの、まぁ、多い事、多い事。言語はC#ね。

class Foo
{
	// 略

	void Bar()
	{
		var someObj = new SomeObject();

		// 例1
		Action<int> lambda = x =>
		{
			// 略。なんかすげー長いラムダ関数

			someObj.SetHoge();    // 引数のオブジェクトの破壊的メソッド呼び出してたりする。

			// この先も長い
		}
	}
}

いや、うん、分かるよ? そう書きたくなる気持ちは。だが死ね。

要は、メソッド内でだけ有効なメソッドが欲しいって話だよね。意味ある処理の纏まり毎に別のメソッドにしたいけれど、そうやって切り出したメソッドが或る特定のメソッド内でしか呼ばれない時とか、しかも1度だけしか呼ばれない時とか、そう書きたくなるよね。でも死ね。

C#のラムダ関数/無名関数(以下、まとめて「無名関数」と呼ぶ)は、そのすぐ外のスコープのオブジェクトをキャプチャするようになっている(恐ろしい事に、他の大部分の言語でも、そういう仕様になっているようだ)。別のメソッドに分けられているように見えるが、完全なスコープの分離がなされていない。なので、ローカル変数が、それと同じスコープの無名関数内で書き換えられている可能性が捨てきれない。事実上、複数のメソッドに分けられる筈のクソ長いメソッドを作ったのとそう変わらない。

C++のラムダ関数みたいに、キャプチャする変数を明示的に指定する仕様ならまだマシなんだろうけどね。

void foo()
{
	auto i = 1;

	// C++のラムダ関数。デフォルトでは何もキャプチャしない
	auto lambda1 = []() {
		i = 10; // エラー
	};

	// iをキャプチャ。ただし値のコピーなので、foo()のiには影響しない。
	auto lambda2 = [i]() {
		i = 10; // OK
	};

	// iをキャプチャ。参照のキャプチャなので、foo()のiを書き換える。
	auto lambda3 = [&i]() {
		i = 10; // OK
	};
}

変数のキャプチャというよりも、無名関数が糞長い事が根本的な原因かもしれないけれど。無条件の変数のキャプチャと、糞長い無名関数が合わさると、ホント凶器になるので、そういうコード書いてるプログラマは今すぐ死んで欲しい。死ぬのがダメだというならば、もういっそ禁止令出したい。俺が死ぬ前に。

タグ:lambda_function
posted by 天井冴太 at 22:02 | Comment(0) | TrackBack(0) | Other | このブログの読者になる | 更新情報をチェックする
投票お願いします 人気blogランキング - 投票する
2014年12月07日

オープンソースカンファレンス 2014 Fukuoka に行ってきた話

オープンソースカンファレンス 2014 Fukuokaに行ってきた。言わずと知れた、オープンソース・ソフトウェアの一大祭典。展示ありーの、セミナーありーのである。今回は初の二日間開催という話だが、私が行ったのは22日土曜日、2日目の方である。いや社会人に金曜とか無理だろ。業務の一環でこういうのに参加するタイプの企業ならともかく。

セミナーは、複数の物が同時開催され、受講者が好きな物を選ぶ形になる。以下、私が受けたセミナーに関して簡単なメモ。「blogにまとめるまでなんで2週間かかってんだよ」ってのは、うん、まぁ、お察し下さい……

続きを読む
posted by 天井冴太 at 15:37 | Comment(0) | TrackBack(0) | Other | このブログの読者になる | 更新情報をチェックする
投票お願いします 人気blogランキング - 投票する
2014年05月21日

CSSでローディング表示

CSSのローディング・アイコンのコスト - Weblog - Hail2u.net

hail2uの長嶋さんによる、「ローディング表示する時はJSDOM操作するけど、コスト高いからCSSで何とかしようよ」という提案。

デモでは、対象となる要素に、ローディングアイコンを描画する為の要素(「spinner」クラスのdiv要素)を含ませておいて、「:only-child」擬似クラスで表示非表示を切り替えるという手法。

しかし、これだとロード対象を読み込んだ後もローディング表示用の要素が無駄に残ってしまうのでイマイチ美しくないように思える。

続きを読む
タグ:CSS_3 CSS UI
posted by 天井冴太 at 21:00 | Comment(0) | TrackBack(0) | Other | このブログの読者になる | 更新情報をチェックする
投票お願いします 人気blogランキング - 投票する
2014年02月10日

PowerShell でコマンドレットの履歴を保存する (TB: このコマンドレット、この前実行した、ような・・・・・・)

どうも、PowerShellと出会ってからというもの、オブジェクト指向型でないコマンドラインシェルが時代遅れに見えて仕方ない天井冴太です。

Zshだと、ターミナルを開き直しても以前やったコマンドの履歴が参照出来て地味に便利。確かBashもそうだった気がする。PowerShellでは出来ないのか?とググって、以下の記事に辿り着いた。

PowerShell - このコマンドレット、この前実行した、ような・・・・・・ - Qiita

ふむふむ成る程。prompt関数内でGet-Historyした結果をExport-Csvして、それをImport-Csvするコードを自分のプロファイルのファイルに書き込めば可能と。

で、上記記事中のコードには、記事自体でも明記されているが、幾つかの問題点が残されている。

上2つは解決出来そうだ。3つ目もある程度は緩和出来そう。という訳でチャレンジ……出来た!

$historyFilePath = "~/.posh_history.csv"

Import-Csv $historyFilePath | Add-History

function prompt {
	$latestHistory = Get-History -Count 1
	if($script:lastHistory -ne $latestHistory) {
		$csv = ConvertTo-Csv $latestHistory

		if( -not(Test-Path $historyFilePath)) {
			Out-File $historyFilePath -InputObject $csv[0] -Encoding UTF8
			Out-File $historyFilePath -InputObject $csv[1] -Encoding UTF8 -Append
		}
		Out-File $historyFilePath -InputObject $csv[-1] -Encoding UTF8 -Append

		$script:lastHistory = $latestHistory
	}

	return "$pwd >"
}
  • 入力無しEnterで重複する履歴が保存されるのは、その時には履歴情報の更新が行われないから。毎回、直前の履歴を$script:lastHistoryに格納しておき、それと現在の最新の履歴を比較する事で、履歴の更新の有無を判断している。
  • 元のコードでは、追記するレコードをマニュアルで構築してる。故にエスケープ処理の抜けが発生しているのだが、CVSへの変換だけであればConvertTo-Csvが使える。ConvertTo-Csvの結果の最終行を取り出せば、それが求めるレコードの内容となる。
  • 同様に、元のコードではマニュアルで構築しているCSVファイルのヘッダ(シリアライズした型の名前、各フィールドに対応するメンバの名前)2行も、ConvertTo-Csvの結果の先頭2行が使える。

後は、現状prompt関数に直書きしているのを別の関数に独立させれば、なおシンプルになるだろう。

しかし、そもそも履歴のファイルへの保存が追記でないといけないのかは疑問。PowerShellで記憶出来る履歴の最大件数は$MaximumHistoryCountに設定された値(デフォルトは64)で、それを超えると古いものから捨てられる。ファイルに保存されている履歴の件数が$MaximumHistoryCount以下であれば問題ないが、それを超えると、古い情報は無意味になり、しかもファイルは際限なく太っていく。情報を追加するだけのAdd-Historyではなく、実行も行うInvoke-Historyを使うというならば話は別だが、毎回上書きした方が良いのではないかと思う。エクスポートの為のコードも、「Get-History | Export-Csv -Path $historyFilePath」だけで済むしね。

オブジェクト指向型でないコマンドラインシェルが時代遅れに見えて仕方ない
えーマジテキスト出力型コマンドラインシェルー? テキスト出力型コマンドラインシェルが許されるのは2009年までだよねー!
Bashもそうだった気がする
Bash使ってたの昔過ぎて憶えてない。
Export-Csv
勿論Export-Clixmlでも良い筈である。以降のCVS読み書き周りについても同じ事が言えるが、特に断りは入れない。
exit以外の方法でPowerShellを終了させると、直前の履歴が保存されない。
これは、どういう意味かよく分かってない。
ConvertTo-Csv

CSVに限った話ではないが、ConvertTo-Csvが在るのに何故Export-Csvなんて物があるんだろう。要はExport-Csvの内容をファイルにリダイレクトすればいい訳で、専用のコマンドレットが必要とは思えない。

(そういう意味では、Out-Fileの存在も謎だ。)

タグ:PowerShell CLI CUI
posted by 天井冴太 at 20:47 | Comment(6) | TrackBack(0) | Other | このブログの読者になる | 更新情報をチェックする
投票お願いします 人気blogランキング - 投票する
2013年11月09日

2013年版気になる Advent Calendar リスト

ついにこの季節か……という訳で、個人的に気になった Advent Calendar をリストアップする試み。

続きを読む
タグ:advent_calendar
posted by 天井冴太 at 01:56 | Comment(0) | TrackBack(0) | Other | このブログの読者になる | 更新情報をチェックする
投票お願いします 人気blogランキング - 投票する
2013年02月11日

TB: check_xxx がなんでダメなのか

check_xxx がなんでダメなのか - Yamashiro0217の日記

"check_xxx"みたいなメソッド名は避けようという意見には賛成。

だけど、流石にそれは例が悪い。

はてブのコメントでid:r-westが指摘しているように、いろいろな問題を詰め込んでしまってるから、「なぜその命名が拙いのか」という本題がかすんでしまっている印象。
"check_xxx の理由最初のだけ"ならば、それに絞って書くべき。例え、"check_xxx 書くやつ、絶対他のこともそのメソッドでやるんだ"としても。

以下、"check_xxx がなんでダメなのか"を自分流に解説し直してみる。
元記事に則って、"check_user"というメソッド名を例に説明する。
元記事のコードは……Perl? PHP? どっちにしろ忘却の彼方なので、以下Cのコードという事で。

例えば、以下のコード片、一体何をやっているのだろうか?

enum User_Kind {
	USER_KIND_UNKNOWN,
	USER_KIND_NORMAL,
	USER_KIND_SUPER,
	USER_KIND_ADMINISTRATOR
};

struct User {
	char *name;
	unsigned int age;
	enum User_Kind kind;
} user;

/*
 * なんかいろいろ
 * ながったるい処理が
 * 在ったり無かったり
 */

if(check_user(&user)) {
	/*
	 * なんかいろいろ
	 * ながったるい処理が
	 * 在ったり無かったり
	 */

	 // (1)
} else {
	/*
	 * なんかいろいろ
	 * ながったるい処理が
	 * 在ったり無かったり
	 */
}

うん、User型オブジェクトの「何か」をチェックして、それで処理を切り分けている……でも、何をチェックしてるの?

パッと思いつくのは次の2つか。

  • userの各メンバが「正しい形式に基づいているか」をチェックする。
    (nameに使われている文字種や最大長、ageの値が想定内の範囲か、kindの値が不正ではないか、等)
  • userの各メンバに設定した値に合致するユーザーが居るかどうかを(DB等から)チェックする。

他にも考えられる処理があるかも知れない。

仮に(1)の位置に"removeUser(&user)"とでも書かれていれば、後者の意味だったのだろうと予想(あくまで予想)出来るけれど、そこまで読み進めないと意味が読み取れないというのは、どうよ。可読性高いだろうか?
更に、1つだけならばまだしも二重三重と"check_xxx"な条件分岐がネストされていたらと考えたら……

え? 定義元を読めばいいじゃんって?

確かに定義元を読めばその関数が何やってるのかは分かる。理屈の上では。

でもさ、その定義元(この例の場合では"check_user")内に、更に"check_xxx"が在ったら? その定義も読むの? 更に更に"check_xxx"が在ったら? そうすると、どんどん読む必要が有る場所が増えていくよ?

で、読み終わって何やるメソッドか把握出来たら元の場所に戻って続きを……あれ?元の場所って何処だっけ?


// (各関数プロトタイプは省略)

// 略
	if(check_user(&user)) {	// 今読んでいる場所
		// 略
	}
// 略

_Bool check_user(const User *user) {
	// 略
	check_puyo(user);
	// 略
}

Something check_puyo(const User *user) {
	// 略
	check_piyo(something);
	// 略
}

Something check_piyo(const Something something) {
	// 略
	check_huga(something);
	// 略
}

Something check_huga(const Something something) {
	// 略
	check_hoge(something);
	// 略
}

Something check_hoge(const Something something) {
	// 略
	// ここまで読んで、やっとcheck_userが何やってたか分かる
}

え? コメント書けばいいじゃんって?

// 各メンバと同じ値を持つユーザーデータが有るか調べる
if(check_user(&user)) {
	// 以下略

それってつまりは、以下の「明らかな事をわざわざコメントに書く」のと一緒だよね。

// fooが0未満の時
if(foo < 0) {
	// 以下略

明らかに無駄。
そんな無駄なコメント書くぐらいならば、分かり易い名前付けようよ、と。

if(exists_user(&user)) {
	// 以下略

これならば、「ユーザーの何について調べたいのか」は自明だよね(もっと良い名前はあるかも知れないけれど)。

posted by 天井冴太 at 02:19 | Comment(0) | TrackBack(0) | Other | このブログの読者になる | 更新情報をチェックする
投票お願いします 人気blogランキング - 投票する
2013年01月23日

共通部分でなくとも抽象化

読みやすいコードってどんなものか考えてみた -抽象化と名前重要- - 馬鹿と天才は紙一重読んでその2。その1はRubyの「範囲」は分かりづらいを。

"共通部分でなくとも抽象化"項の補足。

共通部分(コード中で繰り返し出てくる記述)でなくても抽象化すべき例として、件の記事ではneed_to_pay_postageメソッドを例として挙げている。

Product.where(:price => 0..5)

このコードでは"productモデルの中で、priceカラムの値が0から5までを取得している"という「処理」は分かっても、それが何を「意図」しているのかは読み取れない。だから以下のようにして「意図」が読み取れるようにしましょうと。

class Product < ActiveRecord::Base
  scope :need_to_pay_postage, lambda {
	where(:price => 0..5)
  }
end

「別にコメント書いとけば良くね?」とも言われそうだけれど、そうでも無いよなぁと。

仕様変更なんていくらでも起こりうる事で、今は「5ドル以下の物には一律送料がかかる」だったとしても、将来それが別の条件に変わる事も有り得るわけで。先日Amazonが仕様を変えたのは記憶に新しいところ。その仕様だって、最初からそうだった訳ではないのだしね。

このコードだって、将来、shim0muraさんが書いているような"書籍については10ドル以下の商品が、また衣類については30ドル以下の商品が送料がかかり、それら以外のカテゴリの商品で5ドル以下のものであれば送料がかかる"なんて複雑な仕様へ変更される可能性はいくらでも有る。その為にも抽象化はしておくべきなのだろうなと思う。変更が必要な部分を探すのも容易になるし、その影響が及ぶ範囲を必要最低限にする事も出来る訳だ。

タグ:Technique
posted by 天井冴太 at 01:47 | Comment(0) | TrackBack(0) | Other | このブログの読者になる | 更新情報をチェックする
投票お願いします 人気blogランキング - 投票する
2012年12月09日

プログラミング言語なんてアセンブリ言語だけで良かった

ネタ元: プログラミング言語なんてCだけで良かった


なぜ、使い捨てみたいな技術が乱立しているのか。

プログラマの学習コストがひとつの言語に集中された世界ならば
その世界の底辺PGでもいまの最高クラスのPGを超えているだろう。

プログラミング=アセンブリ言語という世界ならば
教える側のノウハウもずっと集約されているに違いない
教材もずっと洗練されたモノになっていたに違いない。

プログラマの仕事=アセンブリ言語ならば、学生も将来のために安心して何の迷いもなく学習に集中できる。

最近の使い捨てクソ言語は効率が良いとか言ってるが
アセンブリ言語で作られたシステムの何倍も遅いので結局効率が悪いのだ。

遅いシステムは電力の無駄遣い。

世の中は脱原発に向かっているのにトチ狂っている。


以下蛇足という名の無粋なツッコミ

  • 学習コストを集約するというのであれば、世界初以降は全て無駄だという話になるけど……
  • C言語よりアセンブリ言語の方が歴史が古い。C言語誕生は1972年、アセンブリ言語は1949年である。
  • え?アセンブリ言語は高級言語じゃないって? 贅沢だなぁ。じゃあFORTRANはいかが? 1957年生まれ。C言語より古い。
  • この増田が言うC言語は、勿論K&R Cの事なんだよね? ISO Cじゃなくて。K&RとISOのそれは文法に相違点があるし。
  • 個人的にはオブジェクト指向もジェネリックプログラミングもダックタイピングもガーベジコレクション(スマートポインタ含む)もアレもコレも、つまりC言語にない概念は何も要らんという様は、「あーこの人ちょっと可哀想だな」と思った。
  • 更に言うと、アセンブリ言語には型もスコープもへったくれもないね。ステキナセカイデスネー(棒
  • 開発効率の事も思い出してあげて下さい。
  • ところで、高度な抽象化概念を持つ言語の方がシンプルな言語より効率が悪いという考えは完全に誤りである。例えばC++で書いたプログラムがCで書いたプログラムより非効率だという事はない。……という話がC++関係の文献に載ってたな。何だったっけ……C++の設計と進化だったかな……?

  • mattnさんが同じネタ既に書いてそうだなと思いつつ書いた(投稿直前に調べてみたが書いてなかった)。てか何で「プログラミング系改変ネタ==mattnさん」のイメージがあるんだろう。我ながら分からん。mattnさんごめんなさい。
posted by 天井冴太 at 01:34 | Comment(0) | TrackBack(0) | Other | このブログの読者になる | 更新情報をチェックする
投票お願いします 人気blogランキング - 投票する
2012年11月01日

2012年度のAdvent Calendarメモ

もうそんな時期か……目について気になるAdvent Calendarのメモ。

何処かにメモしとかないとすぐ忘れちゃうからね。

随時追加予定。

あと、JavaScriptとRubyあたりのAdvent Calendarが欲しい所。

勿論こんなに読める訳無いので、タイトル見て気になったものだけ読む方向で。そうして考えるとタイトル重要だな(今更)。

昨年はBoost Advent Calendarに参加して以下の記事を書いた。

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

今年は……どうしようかな。ネタがないなぁ……

posted by 天井冴太 at 22:17 | Comment(0) | TrackBack(0) | Other | このブログの読者になる | 更新情報をチェックする
投票お願いします 人気blogランキング - 投票する
2012年08月14日

Cygwinの読みに「シグウィン」と書かれてあるのを見ていやアレはCygnus SolutionsのCygでCygnusはキグナスだから「キグウィン」だろとWikipedia見てみたら「シグナス」って書かれていたので車田正美に騙されたような気分になっている

T/O

参考

posted by 天井冴太 at 00:22 | Comment(0) | TrackBack(0) | Other | このブログの読者になる | 更新情報をチェックする
投票お願いします 人気blogランキング - 投票する
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 | このブログの読者になる | 更新情報をチェックする
投票お願いします 人気blogランキング - 投票する
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 | このブログの読者になる | 更新情報をチェックする
投票お願いします 人気blogランキング - 投票する
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 | このブログの読者になる | 更新情報をチェックする
投票お願いします 人気blogランキング - 投票する
2010年07月11日

ECHO OFFはONされない

WindowsのCLIであるcmd.exeのお話。

Visual C++インストールして必要なライブラリも入れて、コマンドプロンプト上でも簡単にコンパイル出来るように環境変数を設定するBATファイルを作ろうと思い立った。

特に難しい何かがある訳じゃないので、さらさらさらっと……


REM @ECHO OFF
CALL "%VS100COMNTOOLS%\..\..\VC\vcvarsall.bat" %*

REM Boost...
SET INCLUDE=C:\lib\Boost\boost-1_43;%INCLUDE%
SET LIB=C:\lib\Boost\lib;%LIB%

REM OpenSSL...
PATH C:\OpenSSL-Win32\bin\;%PATH%
SET INCLUDE=C:\OpenSSL-Win32\include;%INCLUDE%
SET LIB=C:\OpenSSL-Win32\lib;%LIB%

REM libcurl...
SET INCLUDE=C:\lib\curl-7.21.0-devel-mingw32\include;%INCLUDE%
SET LIB=C:\lib\curl-7.21.0-devel-mingw32\lib;%LIB%

VC++まわりの環境変数は、VC++が用意してくれているBATに一任。1行目の@ECHO OFFをコメントにしているのは動作確認の為である。

で、実行してみると……(以下分かりやすいようプロンプトも記述)


C:\WINDOWS>REM @ECHO OFF

C:\WINDOWS>CALL "C:\Program Files\Microsoft Visual Studio 10.0\Common7\Tools\\..\..\VC\vcvarsall.bat"
Setting environment for using Microsoft Visual Studio 2010 x86 tools.

え?あれ?vcvarsall.batのCALLした後に書いてたSET群は……?なんで呼び出されないの……?

という訳で、vcvarsall.batからそれから呼び出されている各種BATファイルまで延々調べる結果に。
やれEXIT/B無しで呼び出されているんじゃないかとか、:EOFってじつは呼び出し元に戻らないんじゃないかとか、いろいろ調べて頭ひねった。捻れた。ぐにょ。

で、さんざん悩んだあげく、vcvarsall.batの頭の@echo offの所為だという結論に。CALL先で@ECHO OFFされたら、CALL元で元に戻されたりしないのね。いや、環境変数の中身ちゃんと確認しないでうんうん唸ってた俺も悪いんだけどさ。

結論。
こういったBATファイル配る人は、ちゃんとケツで@ECHO ONしてください

タグ:Windows CMD BAT
posted by 天井冴太 at 01:28 | Comment(0) | TrackBack(0) | Other | このブログの読者になる | 更新情報をチェックする
投票お願いします 人気blogランキング - 投票する
2010年05月18日

Userscripts.orgの利点って何?

簡単なGreasemonkeyスクリプトを書いた。

特に秘匿する理由もないし、ならば公開しちゃえと思った。

さて、何処に公開したら良いんだろう?
グリモンのスクリプトが沢山登録されているUserscripts.orgだろうか?
でもわざわざ新規にアカウント取るのもメンドクサイな。
公開するだけなら、githubでも、メインのblogでも良いし、そっちの方がムダに公開場所が分散しないし良いかなぁ。

……あれ?そもそもUserscripts.orgの利点って何だろう?

Userscripts.orgのトップページ見ても、特にこのサイトの特徴(長所)についての説明が無い。ような気がする。でもかなりの量のスクリプトが登録されているという事は、わざわざアカウント作る手間をかける利点が何か在る筈。さてそれは何なんだろう。ググってみたが、そこら辺の解説ページは見つけられなかった。誰か教えて!

github
その内アカウントを取る予定。
メインのblog
天井冴太的つれづれblog [天井の染み]の事。幾つか簡単な作品を公開している。このblogをホスティングしているSeesaa ブログは、どんな種類のファイルでもアップロード出来る。
posted by 天井冴太 at 03:16 | Comment(0) | TrackBack(0) | Other | このブログの読者になる | 更新情報をチェックする
投票お願いします 人気blogランキング - 投票する
2009年11月13日

MSDNの誤謬に思いっきりだまされた件

ポインタとハンドルの取得には、この関数に代わる関数として GetClassLongPtr 関数があります(ポインタとハンドルは、32 ビット Windows では 32 ビット、64 ビット Windows では 64 ビットです)。32 ビット Windows と 64 ビット Windows の両方と互換性のあるコードを記述するには、GetClassLongPtr 関数を使ってください。

以上、GetWindowLong 関数より。

Windows APIに明るい人は気付いているかもしれないが、この文章内のGetClassLongPtr、正しくはGetWindowLongPtrである。ご丁寧にリンク先もGetClassLongPtrなお陰で、ものの見事に引っかかって長い事悩んでしまった。Microsoftめ……時間返せ……

そもそも、MSDN ライブラリの文章、誤謬や脱字の類が多すぎないか?

タグ:MSDN Windows API
posted by 天井冴太 at 02:45 | Comment(0) | TrackBack(0) | Other | このブログの読者になる | 更新情報をチェックする
投票お願いします 人気blogランキング - 投票する
2008年11月04日

結城浩さんの『新版暗号技術入門――秘密の国のアリス』無料プレゼントに応募してみる

『新版暗号技術入門――秘密の国のアリス』無料プレゼント応募はあと約二時間で〆切です。 http://d.hatena.ne.jp/hyuki...

という事なので、申し込んでみる。

結城浩さんの書籍、新版暗号技術入門 秘密の国のアリスのプレゼント企画。Twitter覗いてたら偶然見かけて、これは応募せざるを得ない、と。

しかし暗号っていいね。こう、ワクワクするね。

しかし、2008-10-29 - 結城浩のはてな日記によると、当選人数:7人2008-11-04 21:54 現在の応募数108名とのこと。あ……当たるのか……?

ワクワクする
実は、私のこの『天井冴太』というHNも本名を一種の『暗号化』した結果生まれたものと言える。
posted by 天井冴太 at 23:53 | Comment(0) | TrackBack(0) | Other | このブログの読者になる | 更新情報をチェックする
投票お願いします 人気blogランキング - 投票する
2007年12月09日

URNスキームについて

本家blogこの記事書いてて思ったんだけど、音楽CDってURNでどう表記するんだろう。軽くググッたが解らんかった。書籍はurn:isbn:xxxxxxxxてな感じでいけるのは知ってるんだけど。

何がしたいかと言うと、私のblogではurn:isbn:で始まるURIのリンクはAmazonへのリンクになるようJavaScriptを仕込んでいる。これをCD(出来たらDVDや、他のものにも)拡張したいな、と。イヤ出来るのか知らんが。

タグ:web urn Uri
posted by 天井冴太 at 20:55 | Comment(0) | TrackBack(0) | Other | このブログの読者になる | 更新情報をチェックする
投票お願いします 人気blogランキング - 投票する

広告


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

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

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