2012年12月31日月曜日

WaveToneのテンポ解析

なんとなく興味を持って耳コピー支援ソフトWaveToneを使ってみました。

適当な曲を解析して、気になるところをクリック。 「へぇ、この音はCなんだねぇ。Cってドレミ表記でなんだっけ?」みたいな風にポチポチさわりながらヘルプに書いてあることを確認していきました。

中国の漁船を海上保安庁が拿捕したらしいが?

英語も読めないのにyahoo.comのニュースを眺めてました。 ロイターの北京支社からのニュース、でいいのかな?

中国の漁船を海上保安庁が拿捕したらしいです。 日時はDecember 29, 2012のSunday eveningとあります。 日本のニュースサイトでそれっぽい記事は...これか

C# : ワイルドカードを使用して文字列検索をするコードを作成

C#ではワイルドカードを使用して文字列検索をするためのクラスが無いようなので作ってみました。 次のようにして使うことができます。

var m = new WildCardMatcher("test_*.html");
if(m.IsMatch(filename) )
{
    なんたら
}

使用できるワイルドカードの記号は次の2つです。

  • ? : 何でもいいので1文字。
  • * : 長さ不問の文字列。長さ0でもよい。

コードはこんな風になりました。

2012年12月29日土曜日

皿洗いが少なくて済む料理

少し前にこういう本が出てたようですね。

  • 油を使わずヘルシー調理! ポリ袋レシピ (ISBN-13: 978-4803003765)

私は料理はしないんですが、それは後片付けが面倒だからなんですよね。 料理自体は楽しいんで時間がかかってもかまいません。 でも後片付けが面倒でテンションが下がるので結局料理しないという...

「5分で誰でもできる簡単料理」みたいなのでも調理器具をたくさん使っているとやってみる気にはなりません。 その点ポリ袋料理なら後片付けが楽なレシピも有りそうだし、やってみてもいいかな? やっぱり皿洗いが少ないのが重要です。

ってことで↑の本は読まずに適当にやってみようと思いました。 まずはポリ袋の調達。

2012年12月28日金曜日

アメリカで「リアルな殺戮ゲームは捨てよう」というキャンペーン

小学校での銃の乱射事件があったアメリカで「暴力的なシーンのあるゲームを捨てよう!」と呼び掛けている子供がいるそうです。

日本では、そのニュースを見て「ゲームより先に銃を捨てろ」などと言っている人が多いです。 中には米ライフル協会が「残虐な事件はゲームのせい」と言ったのと混ぜて考えている人もいるようです。

「残虐なゲームを捨てる人」と「銃を所持する人」を同じカテゴリーで考えるのはちょっと乱暴ですね。 全てのアメリカ人が残虐なゲームを捨てて銃は手元に残しているとかっていうのは不自然でしょう。 中にはそういう人も居るかもしれませんが、アメリカ人全体を一括りにするのは間違いです。 その子がそういう事を呼びかけるのは間違ってないのでしょうから、変なケチの付け方にならないような配慮が必要ですね。

でもまぁ、自分だったら銃を回収してゲームを渡すキャンペーンとかを提案するかな。 「暴力は架空の世界の中だけにしよう!」とか「ゲームをしながら強盗はできない!」とかっていうキャッチコピーで。

2012年12月17日月曜日

データURIスキームを使ってbloggerに大きな画像を投稿すると?

以前のbloggerは画像のリンクのurlを変えるとサムネイルのサイズを変えられました。 それで原寸表示とかもできたんですよね。 しかし、今は仕様変更でできなくなっています。

今は画像のサムネイルをクリックしないと原寸表示されません。 それはちょっとした手間になってしまいます。 データURIスキームを使って画像を投稿したらそれが回避できるかもしれません。 自由にレイアウトできるかも?

とりあえず、確かめるために画像を1つ貼ってみましょう。 ファイルサイズが大きいものを貼っても誰も幸せになれないので、サンプル画像は白黒2階調の幅だけ大きいものにします。

2012年12月16日日曜日

色んなデータをデータURIスキームで埋め込んでみる

色んなデータをデータURIスキームで埋め込んでみました。 データURIスキームというのは「htmlやcssでuriの変わりにデータを埋め込む」というアレです。

データURIスキームの書式は、

data:[<MIME-type>][;charset=<encoding>][;base64],<data>

<a href="uri">説明</a>や<img src="uri"/>などのuriの代わりにコレを書きます。 <data>に書ける文字は通常のuriと同じです。 uriで使用できない文字を書くときにはエンコードが必要になります。 ファイルの種類に合ったMIME-typeを指定して、バイナリファイルならcharsetなしでbase64エンコードで記述。 テキストファイルならcharsetを指定して、必要に応じてURLエンコードまたはbase64エンコードをして記述します。

ここで試したデータのエンコードにはこちらのプログラムを使用しています。

java : URLエンコード

URLエンコードをする小さなプログラムです。 どこにでも載ってそうなモノですが、次のネタ(データURIスキーム)で使うので一応掲載。 リダイレクトして使う事を想定しています。

java SimpleUrlEncoder utf8.txt > res.txt

以下、コードです。

2012年12月14日金曜日

C# : ネットワークバイトオーダのバイト列からushort型の値を取り出す

udpのパケットなど、ネットに流れているデータはネットワークバイトオーダ(ビックエンディアン)になっています。 それに対してx86系のシステムはリトルエンディアンです。 相互にやり取りするにはビックエンディアン⇔リトルエンディアンの変換が必要になります。

ネットワークバイトオーダ → クライアントマシンのバイトオーダの変換にはBitConverter.ToInt16などとIPAddress.NetworkToHostOrderを組み合わせるようです。 (BitConverterの代わりにMemoryStream+BinaryReaderを使うやり方もあり。) まず、エンディアンがあっていようがいまいがBitConverterで得たい型の変数に読み込み、その後NetworkToHostOrderで変換という流れです。

エアロストリームの吸気口に換気扇フィルタを付けた

1年半前に買ったPC(ツクモのエアロストリーム)からまた異音が発生するようになりました。 前の異音と同じもののようです。

「面倒だけど仕方がない」ってことで前と同じように掃除。

...ってあまり汚れてないぞ?

電源ファンとグラフィックカードまわりを念入りに掃除してからPC起動。 音は変わりません。 「静音がウリ」ってのも買った理由の1つなんだけどなぁ。

まぁ、なっちゃったものは仕方がないかな。 遅きに失した感はありますが、少しでも悪化を防ぐために対策をしましょう。

2012年12月11日火曜日

生ゴミはゴミ缶へ

生ゴミをただビニール袋に捨てただけだと、小バエが寄って来る事があります。 そういう事態にならないようにするには、ビニール袋の口をしっかり密封すると良いでしょう。 いちいち縛ったり空けたりなんてできないので、100円ショップで保存用クリップを買ってくるのがお勧め。

ちなみに、保存用クリップというのはこんなヤツです。

間違って生ゴミ袋に使ったクリップを開封したポテチとかに使わないように「生ゴミ用」と明記しておきましょう。

で、それだけだとちょっと心配もあります。 もし袋に穴が開いていたら?

firefox : ピン止めされたタブのタイトルを表示

firefox17でのお話。 firefoxでタブをピン留めすると、タブからタイトルが消えてアイコンだけになります。 これだと意外に不便です。 例えば、Yahooの天気予報とニューストピックをピン留めした場合、両方同じアイコンになって判別できません。 最初の何文字かは表示したい。

そんなときは、userChrome.cssやアドオンのstylishなどでこう書きます。

java : Base64でのエンコード

Base64でエンコードするコードです。 どこにでも載ってそうなモノですが、次のネタ(データURIスキームがちょっと出てくる)で使うので一応掲載。 リダイレクトして使う事を想定。

java SimpleBase64Encoder pin.png > res.txt

お約束的なことですが、sun.misc.BASE64Encoderはいつ消えるか分からないので注意。 そういうわけでコンパイル時に警告も出ます。

2012年12月8日土曜日

C# : DNSのポートの扱い概要

DNSについて、漠然と「port53を使うんだなぁ」くらいしか知らなかったのでちょっとだけ調べてみました。 通信プログラム自体あまり触らない方だとはいえ、udpのサワリとか全然知りませんでした。 ちょっと反省。

まずはDNSサーバの種類から。 wikipediaなどの定番の解説を読んだ後、こんなページを発見。

これを全部実感コミで飲み込むのは、運用している人でないと無理ですね。 端末でコードを書く人はとりあえずリゾルバ(スタブリゾルバ)⇔キャッシュサーバ、キャッシュサーバ⇔コンテンツサーバの通信の概要を知っていれば良さそうです。 まぁ、上澄みをサラッと理解したくらいで次へ。

2012年12月7日金曜日

C# : Visual C#のコンソールプロジェクトでエントリーポイントを変更

Visual C#のコンソールプロジェクトはエントリーポイントの変更が簡単にできました。 適当なcsファイルに「static void Main(string[] args) 」メソッドを作って、プロジェクトのプロパティ、アプリケーションタブでスタートアップオブジェクトを選択するだけです。

コンソールプロジェクトをあんまり作らなかったとはいえ、今更感。

2012年11月28日水曜日

店舗内から先は光ファイバー回線でいろいろなネットにインターネット接続する

Yahooニュースを見ていたらこんな記事がありました。

その中で?となった文言。

「店舗内から先は光ファイバー回線でいろいろなネットにインターネット接続する。」

意味が分かりません。

普通は「店舗内から先は光ファイバー回線を通してインターネット上の様々なサービスに接続できる」とかって表現じゃないですかね? もしくは、「通常のインターネット端末からは接続できない専用サービスに接続できる」とか?

ともかく、「いろいろなネット」という表現が曖昧すぎます。

...つっこんだら負けなのか? 普段の日本語がおかしい私の言うことでもないですしねぇ。

svgの文字列表示が崩れないようにパスに変換

svg画像にはtextタグで文字列を書く事ができます。 でもこれって環境によって意外と見え方が違うんですよね。 吹き出しに収まるようにセリフを入れたつもりでも、別の環境で見たらはみ出したり、変な余白が空いてたり...

この問題は、文字をパスに変換すればある程度解決できます。 例えば、inkscapeならtextを選んでメインメニューから「パス/オブジェクトをパスへ」を選択すればok。 これで環境で見え方が変わる問題は軽減されます。 (svgのどの要素でも、レンダリングエンジンによって多少は描画が変わるので完璧ではないです。 見え方の差は誤差の範囲ですが。)

ただ、このやり方は万能薬ではありません。 次のような欠点があります。

2012年11月27日火曜日

ustreamなどの広告抑制対象の調べ方

ustreamの配信を見ていると動画の下の方に広告が表示されることがあります。 字幕とかぶったりして非常に邪魔です。 視聴者のストレスになりそうな所を選んで表示しているような気がしてなりません。 広告が溢れているネットでイチイチ広告を気にしてたらやってられませんが、これは我慢不可。 消すことにします。

ネットで検索したところ、hostsファイルの書き換えをするのが定石のようです。 で、hostsの内容をそのまま表示しているページばかりで、そこに書く内容の調べ方は書いてませんでした。 仕方がないので自分で広告抑制対象の調べ方を模索してみました。

調べた結果とネット検索で得た情報を元にhostsファイルを作りました。 投稿の最後に載せておきます。 自分で調べるのが面倒な人はそれを使ってください。

  • 注)

    インターネット広告業は新しい業種であり、日々変化しています。 この手法で調べた広告抑制対象も当然変化しており、いつまで通用するかは不明です。 この手法が通用する間は、ブロックしたはずの広告が表示されるようになったなら、また抑制対象を調べ直せば対応できます。 この手法が使えなくなったら別の手法を考える必要があります。

お決まりの注釈を書いたところで、以下説明。

2012年11月22日木曜日

空き容量無しでMSを訴える「これが常識でいいのか?」という問題提起?

アメリカでMicrosoftのタブレット端末「Surface RT」を買い、虚偽広告の訴訟を起こした人がいるようです。

「Surfaceの32GBモデルを買ったが、そのストレージの半分がOSとプリインストールソフトで使われていてユーザーが使える容量が少ない。 仕様に32GBモデルって書くのは虚偽広告だ。」

との訴え。 損害賠償を求めてはいるわけではないそうな。

2012年11月17日土曜日

Greasemonkeyで広告を消去できないケースの再現例

前の投稿で書いた「Greasemonkeyで広告を消去できないケース」を再現する例です。 広告消去のアドオンを作りたい人にとっては、簡易サーバとかログの確認とかがテストの参考になるかもしれません。

次の環境で確認。

  • Windows 7 home 64bit
  • Firefox 16.0.2
  • Greasemonkey 1.4
  • jdk 1.7

まずはGreasemonkeyでimgタグを消すコードを書きます。 このコードはlocalhostでのみ有効です。

Greasemonkeyでは広告を消去できないケースがある

とりあえず、次の環境ではそういうケースがあるようです。

  • Windows 7 home 64bit
  • Firefox 16.0.2
  • Greasemonkey 1.4

firefoxのアドオン「Greasemonkey」を使うと、ウェブページを表示した直後にユーザーの記述したjavascriptを動かすことができます。 その用途でありがちなのが「広告の非表示」です。 これは多くの場合ちゃんと動作しますが、回線次第で上手く動かないケースがあります。

動かないケースとは、「閲覧対象のhtmlファイルの転送が途中で止まった場合」です。 多くのブラウザはページを表示するとき、受信中のhtmlファイルをパースしながら、リソース(css,外部javascript,画像など)を並行してダウンロードします。 通常ですと次のような手順になるでしょう。

2012年11月13日火曜日

「温泉県」はいいけど「おんせん県」はダメ

ネットニュースの見出しを適当に眺めていると、おんせん県の文字がありました。

「大分県がおんせん県の名称の商標登録を特許庁に申請した」との事。

私は大分県民ではないし、大分に観光に行く予定もないのでどうでもいいんです。 でも、今は平仮名で「おんせん県」って書くのは止めた方がよいでしょう。 温泉県っていうキャッチフレーズの是非はともかく、漢字で書くべきです。 10年後ならどっちでもいいかもしれないけど、今は漢字で書かないとダメ。

2012年11月10日土曜日

使い捨てのアルミ皿が店から無くなった

気が付くと、自宅近くの店に使い捨てのアルミ皿が並ばなくなりました。 いつも使っているスーパー、100円ショップ、ドラッグストアなどの店から皿消失。 何ででしょうね?

それっぽい理由を想像してみました。

  • アルミが高くなったから?
  • 製品を加工している中国からの輸入が滞ったから?
  • 消費が紙皿にシフトしてアルミ皿が売れなくなったから?
  • 季節的に、外の行楽がないシーズンになったから?

アルミの輸入についてそれっぽい数字を探してみました。 とりあえず検索でこんなページを発見。

2012年11月9日金曜日

ベルトの長さを調節

適当にベルトを買ってきました。 ちょっと長いです。 長さを調節しなければ使えません。

え~と。 長さの調節って自分でできましたっけ? ベルトなんてそう頻繁に買うものじゃないから忘れてしまいました。

「なんかの店にやってもらった記憶も無いんで自分で切るんだろうなぁ」と思いつつ検索。 いっぱい出てきました。 バックルの方を外してハサミで切れ、と。

そうでしたっけ? なんかそんな事したかなぁと思いつつ金具にドライバーを差し込んでみました。

テレビショッピングの日本直販が民事再生法を申請

テレビショッピングの日本直販が民事再生法を申請したそうです。

ネット通販との競争に飲み込まれたんでしょうか? 家電量販店で価格.comを見るとかよくあるらしいですよね。

家でもそういう傾向はあって当然かと。 TV通販のメインターゲットは高齢者などネットに弱い人で影響は少なそうに思えるかもしれませんが、少なくとも高齢者で普通にネットを使う人は増えているようです。

高齢者以外ならいくらネットに弱い人でも携帯くらいは使うでしょうし、パイを食われるのは順当な流れに見えます。

病院の丸ごと輸出で労働条件まで輸出できるのか?

なんか、yahooニュースに「病院の丸ごと輸出」って記事がありました。

「日本のサービスを売りにしよう!」ってネタらしいですけど、不安ですよね。 なにしろ日本の病院って労働条件が悪そうなイメージがあります。 最近はこんな記事まで出てきたり。

日本の医療関係者の労働条件を外国に輸出するのって不可能な気がします。

3DS版どうぶつの森のダウンロード版は「いつも一緒でなくさない」?

ちょっとCMを見ていて気になった物がありました。 3DS版のゲーム「とびだせ どうぶつの森」です。 気になったのはCM最後の1フレーズ。

「いつも一緒でなくさないダウンロード版もあります」

目から鱗っていうのとはちょっと違うかな? でもまぁ、効果がありそうな一言に思えました。

ゲームのダウンロード販売って、当たり前になった今でも敬遠する人は居ますよね。 なぜかっていうと、ゲームを買った人はこんな懸念を持つからです。

2012年10月31日水曜日

まんべくんに寄生虫の卵?

なんかITmediaを見たら「まんべくんTwitterが終了」などというニュースがありました。

私はゆるキャラも興味ないしツイッターもやってません。 まんべくんもたまにネットニュースで出たら見るくらい。 「そんなんいたなぁ」って感じです。

でもまぁ過去のニュースで興味なくてもなぜか覚えているものってありますよね? まんべくんのニュースもそれでして、なぜか懐かしくなって過去読んだ記事にアクセスしてしまいました。

2012年10月30日火曜日

最近のPC遠隔操作冤罪事件の報道で「裁判官」が出てこない

自分のPCに個人情報が入っていなかったとしても、セキュリティには気を使わなければなりません。 でないと、あなたのPCが犯罪者の踏み台にされ、犯行の片棒を担ぐことになる可能性があります。

PCに興味がある人なら10年以上前からちょくちょく見かける文面ですね。 IT系の雑誌やネットニュースは定期的にセキュリティの特集が組まれることが多く、ITに興味がある人なら何度も読んだことでしょう。 そういう雑誌などを見ない人だとしても、こんなときに目にしているかもしれません。

  • パソコンなどの入門書
  • 会社などの組織の新人教育・定期的な全社教育
  • (もしかしたら)中学高校の情報の授業

2012年10月24日水曜日

注意事項を書く部分のcss

次のような注意事項を書く部分のためのcssを考えました。

  • 注1)

    とてもとても重要な注意事項。とてもとても重要な注意事項。とてもとても重要な注意事項。とてもとても重要な注意事項。とてもとても重要な注意事項。とてもとても重要な注意事項。

  • 注1024)

    たいして重要でもない注意事項。たいして重要でもない注意事項。たいして重要でもない注意事項。たいして重要でもない注意事項。たいして重要でもない注意事項。たいして重要でもない注意事項。

  • [注意事項]

    注意事項のフリをして注意事項ではない。注意事項のフリをして注意事項ではない。注意事項のフリをして注意事項ではない。注意事項のフリをして注意事項ではない。注意事項のフリをして注意事項ではない。

ポイントは

  • 各項目はul liで書く。
  • 「 注1) 」などの文字列の下にp要素の中身が回り込まないようにする。
  • 「 注1) 」などの文字列は書き換え可能。

2012年10月14日日曜日

PCファンの自己主張を直してスリープ復帰で焦る

久しぶりにPCのファンが自己主張を始めました。 前回の自己主張はこんな感じ。

そのときは電源ファンが原因でした。 今回も同様に車のアイドリングのような音が。 「まぁ同じ音だし。今回もそれだろう。」と思ってガワを開けたら違いました。 原因はコイツ。

2012年10月7日日曜日

バイオハザード6の体験版をプレイ → 3D酔い

バイオハザード6は全世界で450万本売れたそうですね。

バイオハザード1をビビッて途中で止めた私としては、6も全く買う気はないんですが、絵がどれくらいキレイなのか気になって体験版をやってみました。 バイオ1以来のバイオです。 すごく酔いました。 3D酔いです。

2012年9月27日木曜日

ゲームアーカイブスに『海腹川背・旬 セカンドエディション』

Play Station Storeを見て、ゲームアーカイブスに『海腹川背・旬 セカンドエディション』があるのを発見しました。 昔よくやったゲームです。

以前ゲームをあまりしなくなった時に持っているゲーム数十本を売り払った事があるんですが、面白いゲームは何本かとって置いたんですよね。 このゲームもそのうちの1本です。

というわけで手元にあるので「すぐにゲームアーカイブスから買おう」みたいにはなりません。 でも、CDの寿命の問題もあります。 ディスクの当たりハズレと保存状態の悪さが重なると10年程度で読めなくなってしまうとか。 私の場合、ゲームは普通に本棚に置いているだけなので、場合によってはそういう可能性もありそうなんですよね。

だからといって厳重に保管する気も無く。 まぁ、「好きなゲームがゲームアーカイブスに並んでてくれるのは安心かな?」ってことです。

2012年9月7日金曜日

地熱発電の空想

誰しも手持ちの簡単な理科の知識だけで「発明っぽい空想」をしたことはあると思います。 「磁石と重力で永久機関ができそう」みたいなネタです。 地熱発電でそういうのを思いつきました。

wikipediaで地熱発電の項目を見たら類似するものは無さそう。 そして、誰でも思いつきそうなネタではあるけど、現実的でも無さそうですね。 でもまぁそれなりに整理したので投稿。

2012年8月31日金曜日

ネットニュースは読まざるを得ない

スマホが普及し、タブレットが流通してからだいぶ経ちました。 新聞の記事がそのまま読める公式サイトとか公式アプリとかが増えてますよね。

それに応じて紙新聞の信者のお話をあまり聞かなくなりました。 そもそも紙新聞の信者ってのは新聞社と仲がいい人達です。 新聞社がネットを敵視しているときはそれに迎合してネット上のニュースサイトを叩き、紙の方がいいと騒いでいました。 しかし、新聞社が「紙だけじゃダメだ、ネットでも集客しなければ」と方向転換するとそういう騒ぎができなくなります。 お友達の商売を邪魔することになりますからね。

まぁそんなこんなで、ずいぶん前からネットで紙と同じ新聞記事を読めるようになっています。 が、それだけ読んでいてはダメです。 ネットニュースは読まざるを得ません。

これは「読むニュースは偏っちゃダメだ」みたいなお話ではありません。 ITセキュリティのお話です。

2012年8月30日木曜日

PS3の「ジョジョの奇妙な冒険 未来への遺産 HD Ver.」体験版をやった

play station storeに体験版があったのでPS3の「ジョジョの奇妙な冒険 未来への遺産 HD Ver.」をやりました。 ゲーム内容は、オンライン対戦が付いた以外は10年以上前のオリジナル版と同じです。 う~ん、買う気が起きない。

まず絵について、「HD ver.」となっているのに画質は良くありません。 対戦時以外の場面で使われている絵はオリジナル版を流用しただけのようですね。 リマスターされておらずガッカリ画質です。 肝心の対戦時の絵はジャギーがあるドット絵を引き伸ばしたような粗悪感。 スト3 3rdよりはだいぶマシですけど、わざわざ「HD ver.」って付けたんならそれなりの絵にすべきじゃないかなぁ?

2012年8月23日木曜日

java : 今のjavaはシューティングゲーム製作に使えるらしい

ずいぶん前、多分Windows98SEのころだと思うんですが、javaで簡単なシューティングゲームを作ろうとして取っ掛かりで躓いた苦い思い出があります。 躓いた理由はFULL GCです。 当時のjavaはシューティングゲームやアクションゲームを動かす事を全く想定されていませんでした。 けっこうな頻度でFULL GCが動き、そのたびにガクッと止まってゲームになりませんでした。 シューティングゲームを作るのは絶望的な状況。 それ以来自分の中に「javaでゲームを作るのは無理」という固定観念がありました。

その後javaでゲームを作ろうなどとは考えることも無かったのでそのままの知識を持って今まで来ました。 しかし、ちょっと思い立って「当時と今とは当然状況は違うはず」ということで、簡単なサンプルコードを作って「今でも邪魔なFULL GCはあるのか?」についてのみ調べてみました。

結論から言えば、無茶な弾幕シューティングですら普通に作れそうです。

2012年8月21日火曜日

Java7 Update6を適用

Internet Watchの記事を見てJava7 Update6がリリースされたのを知りました。 いわく、「米Oracleは15日、Javaの最新版のアップデートとなる「Java7 Update6」と、「Java6 Update34」の提供を開始した。」

ん? 15日提供開始? 記事のURLは20120820になってるけど?

ああ、お盆休みか。 セキュリティに関わる記事でこういうのは恐ろしいですね。

まぁ、javaは自作ツールを動かすときしか使ってないんで多少アップデートが遅れても大丈夫なんですけどね。 一応気付いちゃったらアップデートしないと。

ソフトウェア・ダウンロードのJava SEのページから入手できます。

それにしても、最後にアプレットを触ったのっていつだったかなぁ...

2012年8月14日火曜日

電気カミソリを分解してニカド電池を取り出す

電気カミソリが古くなって外刃が破れてしまったので買い換えました。 電気カミソリの替え刃の高さはなんとかならないものなんでしょうかね? 買い換えた方がマシって言う、ねぇ?

替え刃の高さを嘆いてもどうしようもないか? とりあえず、「ニカド電池のリサイクルなんてのがあったなぁ」というのを思い出して、電池を取り出すために古いヤツを分解してみました。 分解したのはコレ。

2012年8月11日土曜日

java : 今更ながらImageIO.readの不具合を踏んだ

今更ながらImageIO.readの不具合を踏みました。 「jpgファイルのフォーマットによっては正常に読み込めない場合がある」というアレです。 ずいぶん前からあるネタのようですが、ぜんぜん知らなかったのでビックリ。 直らないもんなんですかね?

きっかけは、サムネイルを作るコードを書こうとしたことでした。 まずは検索でサラッと

  • 縮小画像を作るときはGraphics2D.drawImage(x,y,width,height,ImageObserver)を使う。
  • そのときの画質はRenderingHintsで調整できる。

というのを確認。

で、RenderingHintsの設定でどの程度違いが出るのかを確認したくて簡単なテストコードを書きました。 たいして時間もかからずに完成。 「楽でいいなぁ」などと思いつつサンプル画像を変えて試してみたら出力画像が真っ赤 → ナンダコレハという流れです。

2012年8月7日火曜日

close文が欲しくなってきた

C#のusingやjavaのtry-with-resourcesなど、closeを省略できる構文はあります。 その場で使ってその場でcloseするときには大変便利です。 しかし、そんなオブジェクトばかりではありませんよね? 「ファイルを開いてユーザーが編集→アプリ終了時にclose」とかの場合、↑の構文でのcloseの省略は使えません。 closeのときに毎回決まったコードを書かなくてはなりません。

java : 連番ファイル名のソート

ありがちなコードのはずなのにネットで検索してもすぐ出てこなかったのでComparatorを作って見ました。 車輪の再発明ですな。

仕様は、

  • ファイル名の比較。絶対パスでの比較はしない。
  • 数字は1塊に付き「全桁がLong型に変換可能な18文字」まで比較可能。 18文字以上の数字の塊があった場合、比較結果は未定義。
  • 数字として認識するのは半角のみ。
  • 大文字と小文字を区別なく比較する。全く同じ文字列だったときのみ大文字と小文字を区別して比較しなおす。

ちょいと謎な仕様もありますが、まぁ自分用コードということでこんな感じです。

2012年7月25日水曜日

明日の「NHK高校講座」に荒木飛呂彦が出る

明日の「NHK高校講座」に漫画家の荒木飛呂彦さんが出るようです。

美術(8)の枠で講師をされるそうです。

放送されるのは7月26日昼の14時20分から。 でも、NHK高校講座ってネットで無料で視聴できるんですよね。 ネットに接続ができれば、昼に見れなくても録画とかする必要はありません。 放送直後に見れるかどうかは分かりませんが、少なくともその日の夜には見れるはず。 いつでも見れるしアカウントとかも必要ありません。

明日の晩、見ようかな? 明日だけNHKのサイト混んでたりして?

まぁ、今年度の講座は全部公式サイトに載っているようですし、すぐに見なくてもいいかも。 今週中には見るかなぁ?

---------------- 7/28追記

見ました。 ここのページから「映像を見る」を選べば見れます。

20分ならこんなもんかな?

2012年7月9日月曜日

引き出し付きのベッドに後悔

引き出し付きのベッドを10年以上使っています。 ベッドの下を掃除するたびに、面倒なのを思い知らされますね。 普段の掃除のときはベッドの下まではやらないんですが、たまに掃除するときは大変です。

ベッドの引き出しにはけっこうな量の衣類が入ります。 それなりの重さ。 衣類が入ったままの引き出しを取り出して、下を掃除して、戻してというのは困難です。 引き出しの衣類を全部出してから掃除することになります。 そして、掃除が大変なのでたまにしか掃除しない → たまにベッドの下をのぞくと...

ってことで、下に何も無いパイプベッド+キャスター付きの収納ケースの組み合わせが一番いいのかも? コロコロさえ入れば酷いことにはならないでしょう。 次、もしベッドを買い換えることになったらそれで。

ちなみに、背の高いベッド(ロフトベッドなど)はお勧めしません。 風邪を引いたときに上り下りとかカンベンです。 省スペースのためにとロフトベッドを買うくらいなら折り畳みで。

ハンドソープの詰め替えで間違い

ハンドソープの詰め替えを買うとき、2つほど間違いをしたことがあります。

まずは良くある間違い。 使っているハンドソープは泡で出るタイプなんですが、間違って泡タイプではなく通常の液体タイプの詰め替えを買ってしまいました。 詰め替えるときに気付きました。

泡タイプのハンドソープはサラッとした石鹸水です。 それに対して液体タイプのハンドソープはドロッとしていて、泡用のポンプを通ってくれないんですよね。 で、「泡タイプと同じくらいサラッとするまで水で薄めたらどうだろう?」と考えてやってみました。

2012年7月6日金曜日

イベントキューに登録して後で実行したらwpfの行く末が気になりだした

ここしばらくjavaとC#+wpfを使っています。 どちらもGUIはメインスレッドで動いており、

  • 別スレッドからGUIに指示を出す場合。
  • これから重い処理をやるところで、それが落ち着いてからやる次の処理をあらかじめ登録しておく場合。

などにはイベントキューに処理を登録します。

javaとwpfのイベントキューを扱うメソッドは次の通りです。

  • java : SwingUtilities.invokeLater
  • wpf : Dispatcher.BeginInvoke

似てるっていえば、似てるんでしょうか?

そういえば、win32sdkのときはPostMessageとか使ってましたっけ。 そしてWindowsの次期開発環境WinRTは非同期がどうたらこうたら...

java : 暗号化のポリシーファイルをコピーし忘れてハマる

簡単なコードで遊んでいてハマりました。 AESの暗号/復号コードです。 前にやったのと同じように組んだはずなのに動きません。

前のコードと今回のコードを順番に比べていってもやってることは同じ。 前のコードをコピー&ペーストしても動かない。

アレ? なんだろ?

とかちょっと戸惑って、前のコードを動かしてこちらにも例外メッセージが表示されるのを見てやっと気がつきました。

ずーっと前にjdkをアップデートしたときに、暗号化のポリシーファイルをコピーし忘れてたんですね。 ポリシーファイルをコピーしたらアッサリ動きました。 こんな事でハマるなんて...

私の30分を返せ。

ブロックノイズを利用した動画のエフェクトとかを空想

地上波のアナログ放送が停止された今でも、たま~に劣化したアナログテープを思わせるようなノイズが演出で使われているのを見ますよね? コレを見て、デジタル動画のノイズもエフェクトとして使えそうだと考えてみました。

PVとか動物の動画とかでチラッ、チラッとブロックノイズが出てくるんですよ。 見てる人がそれを認識して「回線が悪いのかなぁ?」と思い始めるようなタイミングで、ブロックノイズが登場人物の視線の先やネコパンチの先に出始めるんですね。 気付いて「アレッ」ってなったところで、ブロックノイズが集まってきてブロックノイズを使った文字やドット絵を表示。 そこで「あ、最初のブロックノイズも演出だったんだ」と分かるんです。 あとはノイズと動画がよく合うように散りばめていけばOK。

2012年6月19日火曜日

東電のアクセント

最近良くニュースで聞く「東電」という単語、アクセントに違和感を持つ人が多いようです。 「灯台」と同じように読むか「当代」と同じように読むかがニュースによって違います。 私は「灯台」の読みかたの方がしっくりしますね。 「当代」の方だと違和感。

略称なので「どっちの方が正しい」ってこともないんでしょうけど、灯台派の人がこんなことを言っているのを聞きました。

曰く、「東電を灯台読みすると盗電と同じアクセントになる。それではイメージが悪くなるので、東電に配慮して当代読みをする。あ゛~っ!」

それなりの説得力がありました。

2012年6月16日土曜日

ゲームアーカイブスのランキング

最近PS3を立ち上げていないんですよね。 たま~に体験版をやるくらいにしか使っていません。 今日もちょっとだけ体験版でもやろうかとPlay Station Storeにアクセスしてみました。 で、普段は気にも留めていないゲームアーカイブスのランキングが目に入りました。

どういう基準のランキングかは未確認ですが、偏ったラインナップですね。 スクウェア製品と、ちょっとバイオハザード。

コレを見て閉塞感を感じるのは私のとらえ方なんでしょうね。 ゲームを1番やっていた時期からゲームをやる時間が減り始めた頃にかけて「リメイク作品ばかりで食傷気味」みたいな言葉をよく耳にしてました。 多分そのせいでしょう。 「過去の名作ゲーム」みたいなのを見るとやや距離を置いてしまいます。

新しいゲームのランキングに目を向ければ良いだけなんですけど、他にやることがあるしなぁ。

とか言いながら、タマタマ目に入ったゲームアーカイブスのランキングを見て閉塞感って表現するのも変な話ですよね。

firefoxのタイトルバーにアクティブなタブのタイトルを表示する

デフォルトでは「firefoxボタン」の右側は空白です。 そこにページのタイトルを表示したいというだけのお話。 ホント「何を今更」なお話。

まずはちょこっと検索。 アドオンで実現する方法はすぐに見つかりました。 でも、firefoxはアドオンが増えると起動が遅くなるらしいんですよね。 そこまでして表示したいわけでもないなぁ。

検索した情報とか実際に試すとかで分かったことは、

  • メニューバーを表示したらfirefoxボタンが消えてタイトルが表示される。
  • メニューバーの表示とタイトルの表示はセット。

ということ。 firefoxボタンが消えるのは問題ありません。 メニューバーはたまーに要るけどたまにしか使わない。 メニューバーとタイトルが別々に切り替えられればいいんですけどね。 なんでセットにするかな?

2012年6月2日土曜日

歯茎がやせて下がっていた原因は?

この前歯科医院に行ってきました。 そのときの治療のついでになんですが、歯茎がやせて下がっているのが気になっていたのでどうすればいいか聞いてみました。

歯医者さんのお話だと、歯並びが悪くて1本の歯に負担が集中していると、その歯の根元にある歯茎がやせていくのだそうです。 歯並びを矯正して噛むときの圧力を正しく分散すれば進行は防げるけど、やせた歯茎が戻ることはないとか。 意外と取り返しはつかないみたいですね。 そして、適当な話の流れで聞いたので矯正以外の対処法は聞けませんでした。

歯磨きのブラシ圧が強すぎたのかと心配してたんですが、私の場合はそれは関係無さそうだと言われました。

チャットの語尾の注意

昔からあるちょっとしたマナーのようなものです。 チャットやメールなどを書くときには語尾に注意しなければなりません。 「~だしね」とか「~ですしね」とかって言うのは避けた方が良いです。 微妙にニュアンスが変わったとしても「~だよね」とか「~ですよね」とか、別の語尾にしましょう。

  • × : 缶コーヒーより緑茶の方がいいよね。ヘルシーだしね。
  • ○ : 缶コーヒーより緑茶の方がいいよね。ヘルシーだよね。
  • × : 今日はもうお開きにしましょう。明日は早いですしね。
  • ○ : 今日はもうお開きにしましょう。明日は早いですからね。

その理由は、伏字にしてみれば明らかです。

  • あいつはマニアだ○ね。

特に、動画の生配信のチャットに参加しているときとか、読み上げソフトの音声しか聞いてない人とかがいる場合に注意です。 もちろんみんな分かっている状態でわざとやってる人もたくさんいますが...

wpf : マウスドラッグで並び替えができるTabControlを作成

標準のTabControlを継承してマウスドラッグで並び替えができるTabControlを作成しました。

移動先は三角形の移動先カーソル(コード内ではMoveCursor)で表現しています。 ドラッグでつかんだTabItemのヘッダの半透明コピー(以下ゴースト)をマウスに追従させて、移動中であることを分かりやすくしています。 ゴーストはVisualBrushで塗っています。 なのでImageやShapeが含まれていてもOK。

2012年5月26日土曜日

NUnitをインストール

今までVisual C# 2010 Expressを使用していて単体テストツールは入っていませんでした。 「ちょっとは触っておいた方がいいかなぁ」と思ったので試しにVisual Studioで外部ツールとして使えるNUnitを入れてみました。

環境は、

  • Windows 7 home 64bit
  • Visual C# 2010 Express
  • NUnit 2.6.0.12051

まずはNUnitをオフィシャルサイトから落としてきて普通にインストール。 次に、Visual Studioのツールメニューから「外部ツール」をクリック。 NUnitを登録します。 取りあえずx86版だけ使えればいいのでこんな感じで登録。

  • タイトル : NUnit(x86)
  • コマンド : インストール先フォルダ\NUnit 2.6\bin\nunit-x86.exe
  • 引数 : /run $(ProjectDir)$(ProjectFileName)
  • 初期ディレクトリ ; $(ProjectDir)

2012年5月22日火曜日

wpf : TemplateからNameを元にコントロールを探す

ちょっとした覚書。 TemplateからNameを元にコントロールを探すにはControlTemplate.FindNameメソッドまたはFrameworkElement.GetTemplateChildメソッドを使うようです。 FrameworkElement.FindNameメソッドはTemplateの中までは探してくれないらしい。 参考サイトはこちら。

1つのTemplateが複数のコントロールに適用された場合、同じNameのコントロールがその数だけ作成されます。 なのでNameでコントロールを探すときはVisualTreeHelperを使うのではなく、名前スコープを考慮したこれらのメソッドを使うものなんだそうです。 気付くのに遅れて無駄足を踏んでしまった...

メソッドということでxamlからは使用できません。

2012年5月19日土曜日

wpf : AdornerにAssertを埋め込んだらVisual Studioごと落ちた

Adornerを継承したクラスを作りました。

public class TabMoveCursor : Adorner
{
    protected override int VisualChildrenCount
    {get{return _cursorCanvas == null ? 0 : 1;}}
    
    protected override Visual GetVisualChild(int index)
    {
        if (_cursorCanvas == null)
            throw new IndexOutOfRangeException("子要素はない");
        if (index != 0)
            throw new IndexOutOfRangeException("子要素は1つのみ");
        return _cursorCanvas;
    }

    ~色々略~

    private Canvas _cursorCanvas = null;

    protected override Size ArrangeOverride(Size finalSize)
    {
        Debug.Assert(_cursorCanvas != null);
        _cursorCanvas.Arrange(new Rect());

        return finalSize;
    }
}

2012年5月15日火曜日

wpf : リソースをC#で読み込んでxamlで使う

ちょっと前にカスタムコントロール.Resourcesが使えないという状況を発見したので、リソースをC#で読み込んでxamlで使う方法について調べてみました。 カスタムコントロール.Resourcesが使えない状況というのはこちらのネタでのお話です。

普通にやってたら気にしなくてもいいような内容ですね。 まぁ、カスタムコントロールの方は置いとくとして、リソースの読み込み方は他に役に立つこともあるかもしれないので投稿します。

xamlでResourcesプロパティに書くことができるリソースは、

  • FrameworkElement.Resources ... イミディエイト リソース
  • Application.Resources ... アプリケーション リソース

と呼ぶのだそうです。

2012年5月8日火曜日

wpf : ItemsControl系のカスタムコントロールでStyleを使わずにコンテナ作成を検出

ItemsControl系のカスタムコントロールにイベントを登録するため、コンテナ作成を検出する方法を調べてみました。 ItemsControlというのはListBox、TabControl、TreeViewなどです。 コンテナというのはそれぞれの項目を表示するための、???Itemという名前が付いたコントロール(ListBoxItem、TabItem、TreeViewItemなど)です。 wpfではItemsControlに様々な型のコンテンツを登録できます。 例えばListBoxに対して、

listBox.ItemsSource = new ObservableCollection<string>()
{
    "文字列1",
    "文字列2",
    "文字列3"
};

という風に文字列のコンテンツを登録できます。 その場合、登録したコンテンツは当然GUIコントロールではありません。 コンテンツを表示するためのコントロールが別に必要になります。 それがコンテナ(ItemContainer)です。

2012年5月3日木曜日

wpf : TabItemのヘッダにClickイベントを登録

前の投稿の続きです。 前の投稿では「TabItemのヘッダで使えるマウスイベントはPreviewが付くトンネルイベントだけ」ということを書きました。 それだけ使えれば十分だとは思いますが、今回はなぜか、TabItemのヘッダにClickイベントを登録する方法を試してみました。

やり方は簡単で、TabItemのTemplateにButtonを登録するだけです。 ヘッダーに関するTemplateはTabItem.Template(ControlTemplate)とTabItem.HeaderTemplate(DataTemplate)の2種類あります。 TabItem.Templateの方には枠線などタブの外観を設定します。 TabItem.HeaderTemplateは、DataTemplate型とあるとおり、関連付けられたデータのGUI表現を設定します。 例えば「アイコンとテキストで表現するデータ」があった場合、それをどういう構成にするかの設定がDataTemplateです。 まず、タブの外観がTabItem.Templateを元に作られ、その中にHeaderTemplateを元に作ったデータが収められます。 わざわざ2つに分かれているのは、DataTemplateをメニューやリストボックスなど様々なコントロールで共有できるようにするためでしょう。

2012年5月2日水曜日

wpf : TabItemのヘッダにマウスイベントを登録

TabItemのヘッダにマウスイベントを登録する場合について考えます。 xamlで全部のTabItemにイベントを書く場合には特に考える必要はありません。 普通にこんなふうに書きます。

<TabItem
        Header="ささ"
        PreviewMouseLeftButtonDown="OnPreviewMouseLeftButtonDown"
>
    パンダ
</TabItem>

でも、全部のTabItemに同じイベントを登録するときはイチイチ書くのは面倒ですよね? そして、ItemsSourceを使う場合はイベントを直書きすることもできません。 こういう場合はItemContainerStyleでイベントを登録します。

このItemContainerStyleの「ItemContainer」というのはTabItemのことです。 「TabControlに登録された各項目(Item)をTabControl上で表示するためのコンテナ」のことを表しています。 TabControlに限らず、ItemsControl系のコントロールにはこの様なItemContainerが用意されています。 ListBoxならListBoxItem、TreeViewにはTreeViewItemといった具合です。

2012年4月29日日曜日

wpf : カスタムコントロールを追加するもう1つの方法

普通、カスタムコントロールを作成するときはソリューションエクスプローラーから新しい項目を追加しますよね? その方法で追加すると「Themes/Generic.xaml」と「カスタムコントロール名.cs」のファイルが追加されます。 これを編集していくのが普通のやり方です。

ですが、コレだとやりたい事ができないケースもあるようです。 今回は、Generic.xamlのStyleにEventSetterを追加したらx:Classが無いとダメだと怒られてしまいました。 それをキッカケに「x:Classの設定ってどう書くの?」と色々検索して試してみたらカスタムコントロールを追加するもう1つの方法が見つかりました。 この方法なら問題なくEventSetterも使えます。

その方法はこんな感じ。

2012年4月28日土曜日

wpf : 添付ビヘイビアでTextBoxにフォーカスが移った時全選択にするプロパティを作成

タイトルどおりのものを作りました。 リソースのスタイルに書いておけばいっぺんに適用できます。 アプリケーション全体で使うリソースディクショナリとかを用意しておけば楽。

2012年4月25日水曜日

wpf : msdnのExpanderテンプレートのサンプルにあるDesiredHeightとは何者か?

Expanderのカスタムコントロールを作りたくて検索してみたら次のページが見つかりました。

これを元にシンプルなカスタムExpanderを作るとこうなります。 Themes/Generic.xamlは、

2012年4月22日日曜日

C# : 動作中のプロセスのコマンドライン引数を一覧表示

VBでコレをやる方法は検索で見つかりました。

C#でのやり方が書いてなかったので書き換えてみました。 System.Managementの参照を追加して、

2012年4月19日木曜日

wpf : 色選択コントロールを作成

wpfには色選択ダイアログがないようです。 参照を追加してwpfじゃない方の色選択ダイアログ(System.Windows.Forms.ColorDialog)を使えばいいのかもしれませんが、ちょっと欲しいのと違ったので自作してみました。

2012年4月18日水曜日

wpf : ListBoxItemが右クリックで選択されないようにする

ちょっとだけ特殊な用途ですが、ListBoxItemにContextMenuを登録して、左クリックで選択の変更、右クリックでは選択を変更せずにContextMenuを表示という振る舞いにしたくなりました。 ListBox.ItemTemplateでMouseRightButtonDownイベントを登録し、握りつぶすだけで実現できました。

<Window x:Class="ListBoxItemEventTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="ListBoxItemEventTest" Height="128" Width="256">
    <Window.Resources>
        <ContextMenu x:Key="contextMenu">
            <MenuItem Header="テストメニュー" Click="OnMenuItemClick"/>
        </ContextMenu>
    </Window.Resources>
    <ListBox Name="listBox">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <Label
                        Content="{Binding}"
                        ContextMenu="{DynamicResource contextMenu}"
                        MouseRightButtonDown="OnListBoxMouseRightButtonDown"
                />
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
</Window>

2012年4月16日月曜日

wpf : ユーザーコントロールでDataContextを使うときの定石

wpfで独自のコントロールを作るには3通りのやり方があります。

  • カスタムコントロール ... 既存のコントロールを改造(継承)する。
  • ユーザーコントロール ... 複数の既存のコントロールを組み合わせて作る。
  • 自作 ... Controlクラスを継承して1から作る。

今回はユーザーコントロールについてのお話。

ユーザーコントロールでDataContextを使うとき、

public partial class TestControl : UserControl
{
    public TestControl()
    {
        InitializeComponent();

        this.DataContext = new TestData();
    }
}

というようにthis.DataContextにインスタンスを設定してはいけません。 ユーザーコントロールを使う側にDataContextを変更されると挙動が変わってしまいます。

上に書いたとおり、ユーザーコントロールは複数のコントロールを組み合わせて作ります。 そのため必ずGridやStackPanelのようなコンテナとなるコントロールが含まれます。

2012年4月8日日曜日

wpf : スライダーとスピナー付きの整数しか入力できないTextBox

UserControlを継承してスライダーとスピナー付きの整数しか入力できないTextBoxを作りました。

とりあえずNumericBoxというクラス名にしました。 スライダーが付いている時点でBoxではないような気もしますが、名前を考えるのが面倒だったのでそんな感じで。 勢いで作ってちょっとだけ動作チェックして勢いで公開です。 そんな品質です。

まずはコードを載せます。 NumericBox.xamlから。

2012年4月6日金曜日

wpf : ValidationRuleをC#のコードから追加

TextBoxなどの入力値検証でValidationRuleを継承したクラスを作ることが多いですよね。 たいていの場合はxamlで追加します。

<TextBox>
    <TextBox.Text>
        <Binding>
            <Binding.ValidationRules>
                <local:なんたらValidationRule/>
            </Binding.ValidationRules>
        </Binding>
    </TextBox.Text>
</TextBox>

xamlでValidationRuleを追加するコードを書いた場合、自作ValidationRuleはどこかで勝手にインスタンス化されます。 このインスタンスにアクセスできれば、次のようなことが可能になります。

  • 検証の閾値を動的に設定。
  • 他のクラスに持たせた値を検証に使用。

2012年3月23日金曜日

wpf : TabControlのタブの左右にパネルを配置

タブを扱うアプリケーションで、タブの左右にコントロールを置きたいケースは多々あります。 例えば、タブの操作をするボタンを付けたり、省スペースのためタブの右側にツールバーを置いたりです。

実際にそういうレイアウトのアプリケーションは多くありますが、wpfのデフォルトのTabControlではそういうふうにはできません。 ですがstyleを書けば簡単に実現可能です。 というわけで試しに作ってみました。 こんな見た目になります。

MainWindow全体にstyle設定をしたTabControlを載せています。 そしてデフォルトではタブしか表示されない場所にボタン1~4を追加してみました。 タブの左右にパネルを追加できるように改造し、左側にはDockPanelとボタン1を、右側にはStackPanelとボタン2~4を追加しています。

2012年3月19日月曜日

wpf : ListBox.ItemsPanelにWrapPanelを設定して幅を調整

ListBoxのItemsPanelにテンプレートを設定すれば、項目のレイアウトを大きく変えることができます。 ItemsPanelにはPanel系のコンテナを指定することが可能です。 当然、WrapPanelも使えます。

本来、WrapPanelは子コントロールを左から右へ順に配置し、ボックスの端で折り返します。 (javaでいうところのFlowLayoutですね。) しかし、ListBox.ItemsPanelにWrapPanelを使うとちょっと表示がおかしくなってしまいます。 スクロールバーが表示されて折り返しが効かなくなるのです。

2012年3月18日日曜日

wpf : ContextMenuの項目クリックイベントからオーナーのコントロールItemを探す

次のような場合に、どのコントロールItemがクリックされてContextMenuが表示されたかを探す方法です。

  • TabControlやListBoxなどにItemsSourceを設定。
  • 各項目(TabItemやListBoxItemなど)のレイアウトはテンプレートで指定。
  • 各項目をクリックするとContextMenuが表示される。

ちなみに、TabControlの場合はアクティブなタブがクリックされたとは限らないし、ListBoxの場合は複数選択されているかもしれません。 よってTabControl.SelectedItemは使用不可。

とりあえずxamlのサンプルコードを載せます。 MainWindow.xamlです。

2012年3月17日土曜日

「うま味」はそのまま英語になっていた

以前投稿した英語のインターネットラジオをBGMにするやつ、今もたま~にやっています。 相変わらず何を言っているのか全く分かりません。 「ちょっとは聞ける様にならないかなぁ」と思っていなかったといえば嘘になりますが、やっぱりと言うか当然と言うか、分からないものは分からないままですね。 まぁ、他に英語の勉強を全くやってないので当然ですが。

そんなこんなで、今日も聞いてたんですが、たまたま「寿司」をテーマに話していたらしく、その単語は聞き取れました。 そして「umami」なる単語も聞こえてきます。

え? 旨み?

そんな訳ないよなぁ。 なんの聞き間違いでしょう? あれ? そういえば、「旨み」を発見したのは日本人だって言うのは美味しんぼで読んだような...

半信半疑で検索したら、英和辞典にも英語版wikipediaにも「umami」が載っていました。

一般的な単語かどうかは分かりませんが、どうやら「うま味」はそのまま英語になっていたようですね。

2012年3月16日金曜日

java : JTableの列幅変更で最終列だけに調整を適用する

ユーザーがJTableの列をドラッグしてサイズ変更するときの振る舞いについて。 最終列だけに調整を適用するにはAutoResizeModeプロパティにAUTO_RESIZE_LAST_COLUMNを設定すればOK。 ただ、これだけではこちらの望んだ振る舞いにはなりませんでした。 JTableのサイズが変更された場合、全部の列が拡大縮小されてしまうんですよね。 なんでこんな仕様になっているのやら...

仕方がないのでJTableを継承してホントにAUTO_RESIZE_LAST_COLUMNになるコンポーネントを作成しました。 基本方針は、

  • TableHeader上にマウスカーソルがあるとき列幅が変更可。
  • それ以外の場合は列幅は固定。
  • テーブルの幅が縮められたときは列幅の自動調整だけでは吸収できず、テーブルがコンテナからはみ出してしまうことがあるけど、それは仕様。

列幅の固定は、TableColumnのMinWidthとMaxWidthを現在の幅にすることで実現です。 で、↑の様なコードだけだとTableHeaderからマウスが離れた瞬間に列幅が変更できなくなってしまいました。 ドラッグ中のマウスの扱いについても考えなくてはならないようですね。

2012年3月3日土曜日

wpf : テキスト編集可のComboBoxでポップアップのクリックを検出

wpfでテキスト編集可のComboBoxを使っていて次の2通りのタイミングで処理がしたくなりました。

  • ComboBoxについているTextBoxでエンターキーが押された。
  • ComboBoxについているポップアップメニューのクリックで項目が選択された。

エンターキーはKeyBindingで検出するとして、問題はポップアップメニューの方です。 最初はSelectionChangedイベントを使えばいいのかと思ってたんですが、このイベント、けっこう色んなタイミングで発行されるんですよね。 具体的には次のタイミングで発行されるのを確認しました。

  • TextBoxの内容がComboBoxItemの内容と一致。
  • TextBoxの内容とComboBoxItemの内容とが一致した状態からTextBoxが書き換えられる。
  • TextBoxにフォーカスをあわせ上下キーでComboBoxItemを選択。
  • ポップアップメニューでComboBoxItemを選択。

TextBoxの書き換えのときはスルーして、エンターキーとポップアップメニュークリックにだけ反応させたかったのですが、そのようなイベントは用意されていませんでした。 自分で実装です。

インスタント麺の替え玉にゆで焼きそば

以前に書いたとおり、インスタント麺の替え玉にゆで蕎麦をよく使っています。 ゆで蕎麦は日持ちしないので「そろそろインスタント麺が食べたいなぁ」と思ったときにスーパーで買います。

で、そんな気分だったのでスーパーの蕎麦コーナーをのぞいてみたら、ゆで蕎麦が売り切れてました。 普段は山になって置いてあるのに、珍しい。

2012年2月25日土曜日

java : ジェネリクス型の引数を持つメソッドをinvoke

例えば、javaで「public void testMethod(List arg)」をリフレクションで呼ぶときどうすればいいのでしょう? それなりに検索したけど出てきませんでした。 C#のリフレクションならすぐに見つかるんですけどねぇ。 で、適当にやったら「定義したクラス.getMethod("testMethod", List.class)」で呼べることが判明。 ジェネリクスの部分を省略すればいいようです。

試したコードはこちら。

2012年2月17日金曜日

java : Look&feelの設定でGUI全体のフォントサイズを変更

だいぶ前のコードを漁っていたら、Look&feelの設定を変えてGUI全体のフォントサイズを指定する方法が見つかりました。

import java.awt.Component;
import javax.swing.JComponent;
import javax.swing.UIDefaults;
import javax.swing.UIManager;
import javax.swing.plaf.FontUIResource;

public class UiCustomizer
{
    public static void setFontSize(final int fontSize)
    {
        UIDefaults defaultTable = UIManager.getLookAndFeelDefaults();
        for(Object o: defaultTable.keySet() )
        {
            if(o.toString().toLowerCase().endsWith("font") )
            {
                FontUIResource font = (FontUIResource)UIManager.get(o);
                font = new FontUIResource(font.getName(), font.getStyle(), fontSize);
                UIManager.put(o, font);
            }
        }
    }

    public static void setScrollBarWidth(final int width)
    {
        UIManager.put("ScrollBar.width", width);
    }

    public static void updateUiAll(JComponent component)
    {
        for(Component child : component.getComponents() )
        {
            if(child instanceof JComponent)
            {
                JComponent updateComp = (JComponent)child;
                updateComp.updateUI();
                updateUiAll(updateComp);
            }
        }
    }
}

2012年2月13日月曜日

RLtrapは防がれているようだけど?

恥ずかしながら、この記事を見て初めてRLtrapの存在を知りました。

アダルトサイト詐欺6億円 エスカレートする手口

RLtrapの説明はこちら。

INTERNET Watch - Unicodeの制御文字を使いファイル名偽装、ウイルス「RLTrap」検出報告5万件

防ぎ方はこちらにあります。

float32の日記: これで安心してXPHomeが使えるのでAC

う~ん、これを見ると、ずいぶん前からあったもののようですね。

2012年2月12日日曜日

java : SQLiteJDBCのSQLException

javaで次のSQLiteJDBCを使ったときの話。

このSQLiteJDBCを使っていて発生したSQLExceptionは次のようになります。

  • getErrorCode → 0
  • getSQLState → null
  • getMessage → [例外の種類] 種類ごとの文 (詳細)

「例外の種類」というのはSQLiteJDBCのorg.sqlite.SQLiteErrorCode列挙体の文字列表現が入るようです。 SQLiteErrorCodeについてはSQLiteJDBCのjavadocに書いてあります。

ErrorCodeやSQLStateはないのでMessageの文字列を見てふるい分けをしなければなりません。

java : SQLiteのselectを途中で止める

前のネタでSQLite + SQLiteJDBCでは重いselect文を実行してしまったときにStatement.cancelメソッドが効かず、途中で止められないことが判明しました。

しかし今回使っているSQLiteJDBCではユーザー定義関数を作ることができます。

これをうまく使えばselectの途中で例外を投げてクエリーを止めることができます。 というわけでこんなクラスを作ってみました。

2012年2月11日土曜日

java : SQLiteではStatement.cancelが効かない

jdkのドキュメントを見ると、Statement.cancelメソッドで実行中のSQL文を停止できるようです。 ただし、apiリファレンスには「DBMSおよびドライバの両方がSQL文の終了をサポートする場合に、このStatementオブジェクトを取り消します。」との記述があります。 サポートしていない場合はSQLFeatureNotSupportedExceptionが投げられる模様。

SQLite + SQLiteJDBCでcancelができるか試してみました。 SQLiteJDBCの入手先は、

試したコードはこんな感じです。 まずはデータベースを扱うクラス。 Statement.cancelメソッドは別スレッドから停止させるためのものなので、Runnableを実装しています。 メインスレッド以外にデータベース処理用のスレッドを作り、selectが動いたらメインスレッドから停止させます。

2012年2月10日金曜日

java : SQLiteのユーザー定義関数の例(order by用の乱数)

前回の投稿でSQLiteにjdbcで接続したときにユーザー定義関数を使う方法について書きました。 今回はユーザー定義関数の簡単な例を投稿します。 ネタはorder byで使うことを念頭に置いた、乱数を返す関数です。

2012年2月9日木曜日

java : SQLiteにjdbcで接続してユーザー定義関数を使う

SQLiteにはsqlite3_create_functionなどの関数があり、ユーザー定義関数が登録できるようになっています。 ユーザー定義関数というのは、

select count(id) from テーブル

のcountに当たるようなsql文で使う関数を自作したものです。 count等の元からある関数の置き換えもできるとか。

これは↓のjdbcドライバを使えばjavaでも可能です。

SQLiteJDBCはネイティブで書かれた各環境向けのSQLite本体をjarファイル内に持っていて、それに対してjniでアクセス、jdbcドライバとして動作するようにしたものです。 sqlite3_create_functionの部分もラッピングされています。

最近PCのファンが自己主張を始める

最近、昨年7月に買ったPCから変な音が出るようになりました。 音量は「PCから出る」って事でそれなりですが、車のアイドリングのような音です。 どっかのファンの軸がホコリでズレたとかかな?

起動後しばらくはアイドリング音。 気がついたころにはおさまって、「え? なんかの弾みで直った?」と思ったら次の起動時もアイドリング音。

「ガワを開けて掃除するのは年に1度で言いかなぁ?」とかって思ってたんですが、今ちゃんと確認しといた方が良さそうですね。 ってことで電源コードを外してガワオープン。

...ホコリが。

2012年2月6日月曜日

Virtual Boxで仮想HDDイメージサイズの拡張とUbuntuディストリビューションのアップデート

久しぶりにVirtualBoxを立ち上げたらアップデートが出てました。 VirtualBox本体のアップデートをした後、バーチャルのUbuntuを立ち上げたらこちらはディストリビューションのアップデートがあるとか。 面倒くさいと思いつつ、この機会にアップデートしてみました。 するとHDDの空き容量が足りないとのメッセージが。 「最近Ubuntu使ってないんだよなぁ」とちょっと迷って、惰性で仮想HDDイメージサイズの拡張 → ディストリビューションのアップデートをやりました。

手順は間違っていたっぽいけど最終的にOKな状況になりました。 そしてやはり面倒くさかった...

java : sqliteに登録した画像をHttpServerで送信

sqliteに画像を登録して、com.sun.net.httpserver.HttpServerで送信、ブラウザで画像を見る簡単なサンプルプログラムを作りました。 sqliteにはjdbcで接続。 jdbcはこちらで配布しているものを使いました。

以前の投稿をふまえて、

作ったら大体こんな感じになりました。

「test0~2.png」の画像ファイルをclassと同じディレクトリに用意してコマンドプロンプトで実行。 sqliteに画像を登録した後、HttpServerが動きます。 コマンドプロンプトの表示は「なんたらかんたら ... Push enter to stop.」となって待機。 ブラウザで「http://localhost/」にアクセスすると「画像選択アンカー」のついたhtmlが表示されます。 アンカークリックで画像の切り替え。 画像はsqliteからselectして送信です。 uriの受け取り方が適当なので、適当なコンテキストにアクセスすると表示が崩れます。 雑なサンプルコードということでlocalhostから接続されたときしか反応しないようにしました。 コマンドプロンプトでenterキーを押したらサーバの停止です。

コードはこんな感じ。

2012年2月3日金曜日

wpf : 画像ファイルをロックせずにBitmapSourceを読み込む

wpfでローカルの画像ファイルを読み込むときの話。 BitmapFrameを使うと次のようになります。

try
{
    // xamlでImageを記述 → imgLock
    imgLock.Source = BitmapFrame.Create(new Uri(path, UriKind.Absolute));
}
catch (Exception exc)
{
    // thisはMainWindow
    MessageBox.Show(this, "[" + exc.Message + "]\n" + exc.StackTrace, this.Title);
}

このやり方だと画像ファイルはロックされてしまい、更新、移動、削除ができません。 ロックされないようにするには次のように書きます。

2012年2月1日水曜日

java : 実行ファイルのディレクトリ

実行ファイルのディレクトリってC#(.net framework)なら

FileInfo fileInfo = new FileInfo(Environment.GetCommandLineArgs()[0]);
string dir = fileInfo.Directory.FullName;

で簡単に取れますよね。

javaだと「OSの違い」とか「jarパッケージかclassか」とかでもう少し長いコードが必要なようです。

java : sqlite + jdbcでテータベースアタッチのサンプル

前の投稿で「アタッチがアトミックでどうこう」って書いたので、一応アタッチの小さなサンプルコードを書きました。 アトミックかどうかはノータッチで。

jdbcはこちらで配布しているものを使いました。

以下コード。

2012年1月30日月曜日

SQLiteでアタッチした複数のデータベースに対してアトミックなトランザクションができるらしい

SQLiteについてチマチマ勉強中。 ホントに遅々として進まないですがね。 で、1データベースにつき1ファイルのSQLiteなんですが、ATTACH DATABASEで複数のデータベースを1度に扱えるらしい。 でもその場合アトミックなトランザクションではないよとの記述がありました。

で、「ちょっと古いドキュメントだな~」と思ってオフィシャルの方に行ったら自身ありげに「When multiple database files are modified within a single transaction, all files are updated atomically.」と書いてました。

斜め読みと言うか、そこしか読んでないですが、多分バージョンアップが繰り返される中で改善されたんでしょうねぇ。

検索結果の上位サイトに「アトミックなトランザクションではない」という記述がでてきたので、一応の投稿でした。 ちなみに、そのサイトの情報が古いままなのは、中の人が他のデータベースに興味を持ったからっぽいです。 よく読んでないけど多分そんな感じで。

java : 鍵の長さ256bitのAESを使う

2017年11月追記)

この投稿の内容は古い情報となっています。最新のjava9だとデフォルトのままでもAESの鍵の長さに制限はありません。 このページのサンプルコードもデフォルトのまま実行することができました。

また、java8の場合は古いバージョンはこの投稿の通りにjceが必要になります。 新しいバージョンのjava8の場合、jceに当たるファイルはインストール済みのようです。 設定ファイルの書き換えのみで鍵の長さの制限を撤廃できるのだそうです。

もし鍵の長さに制限がかかっていたのなら、java.securityというファイルで『crypto.policy』という項目を検索してみてください。 『crypto.policy=limited』と書かれていたのなら limited を unlimitedに変更、項目自体が無い場合は『crypto.policy=unlimited』と追加してみてください。 この辺かな?

  • java9 jre : ~\jre-9.?.?\conf\security\java.security
  • java9 jdk : ~\jdk-9.?.?\conf\security\java.security
  • java8 jre : ~\jre1.8.?_?\lib\security\java.security
  • java8 jdk : ~\jdk1.8.?_?\jre\lib\security\java.security

ただし、日米以外の国は場合によっては暗号化技術が違法になることがあるようです。 そのような国向けの環境では関連ファイルがインストールされない事でしょう。 一通り試してみて動かない場合は法律のチェックなども必要になるかもしれません。

以下、以前の投稿内容です。 そちらについては特に修正していません。


javax.crypto.Cipherを使ってAESの暗号/複合化をするにあたり、デフォルトのままだとAESの鍵の長さは128bitしか使えません。 256bitの鍵を使うとInvalidKeyExceptionで怒られてしまいます。

java.security.InvalidKeyException: Invalid AES key length: 32 bytes

256bitの鍵を使うにはポリシーファイルが必要になります。

java7の場合は下の方にある「Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files 7」をダウンロード。 ファイル名は「UnlimitedJCEPolicyJDK7.zip」でした。 これを解凍すると「local_policy.jar」と「US_export_policy.jar」が出てきます。 jreのフォルダ(jre7\lib\security)に同じ名前のファイルがあるので置き換えます。

2012年1月29日日曜日

firefoxの不具合、ハードウェアアクセラレーションをOFFにしたら再発せず

以前、「Firefoxを使用中にモニタが数秒間真っ暗になる不具合がある」と嘆いてfirefoxを敬遠していました。

で、よく考えたら「不具合の原因がハードウェアアクセラレーションにある」と当たりが付いてるんだし、OFFにすればよかったんですよね。 何で気付かなかったんでしょう?

とりあえず「about:config」で「gfx.direct2d.disabled」と「webgl.disabled」をtrueにして様子見中。 それで全部のハードウェアアクセラレーションがOFFになったのか確認はしていませんが、今のところ不具合は再発していません。 「about:support」で「グラフィックス/GPU描画支援のウィンドウ」も(0/1)になってるし、これでいいのかな?

まぁ不具合と言ってもクラッシュするわけではないので、再発したらそれから考えましょう。 って「不具合の原因はGPUの電圧がどうこう」って記述もどっかで見たし、PCの寿命を延ばすためにも「再発、絶対ダメ」って考えた方がいいのかなぁ?

...とりあえず不具合回避で使っていたChromeは若干肌に合わなかったのでfirefoxに戻れてちょっと落ち着きました。 そしてなんだかんだ言って「グラフィックドライバやFirefoxの新バージョンが出たときにまた試して、またガッカリ」というパターンは繰り返す気がします。

ちなみに、「about:support/グラフィックス/GPU描画支援のウィンドウ」の意味は(ハードウェアアクセラレーションが効いているウィンドウ数/firefoxのウィンドウ総数)だそうです。 私の場合はウィンドウ1つでタブだけ増やす使い方なので(1/1)になったら要注意。

java : HttpServerでimgを出したりpostを読んだり

私のPCの中には色んなデータが入っています。 APNGとかSVGとかに手を出してるんで、まぁ色々です。 全部簡単にチェックできればいいんですが、まず全部表示できるようなヴューアが少ないです。 全部表示して整理できるようなソフトとかって、あるんでしょうかね? 作るわけには行かないしなぁ。

で、ふと気付いたのがブラウザ、これは万能ビューアですよね。 APNGでもSVGでも見れますし、音でも動画でもOK。 しかしローカルのファイルをチェックするには使い勝手が良くありません。 「何とか使えないかなぁ」と適当に検索してみたら、ちょっと気になるネタがありました。 「http 簡易サーバ」で検索するとC#でもjavaでもけっこう簡単にhttpのサーバが作れるようなんですよ。 もちろんインターネットに公開するようなサーバーを作るのは簡単ではないでしょうけど、ヴューアの部分をブラウザに頼った「ローカルファイル整理ツール」を作るハードルはかなり下がりそうです。

C#だと「System.Net.HttpListener」が、javaだと「com.sun.net.httpserver.HttpServer」が使えるようですね。 「データ整理ツールを作るんなら環境依存は少ない方がいいだろう」ってことでjavaの方を試してみました。 とりあえず考えながら作ったら、

2012年1月22日日曜日

フリーソフトウェア「オイラは意思が弱いから」を公開

フリーソフトウェアの「オイラは意思が弱いから」を公開しました。

ソフトの説明は、

『「オイラは意思が弱いから」は「この時間帯にこれはやらないでおこう」というあなたの決意をサポートする注意喚起ソフトです。 このソフトは動作中、指定した時間帯に対象プログラム(ゲームとか)が動いているのを発見したら全画面、最前面で「注意画像」を表示します。 あくまでも注意喚起をするだけのソフトなので注意画像はボタンクリックですぐに消えます。 注意画像が表示されたら、あなたの意思で遊ぶのを止めましょう。』

自分の夜更かし防止に作ったジャンクソフトです。 自分が使う部分だけならパラメータ即値固定で2日くらいで出来たんですが、「フリーソフトにしよう!」と思い立ってからGUIとか設定ファイルのIO記述とかやってたら1週間くらいの作業になってしまいました。 まぁそれでもまともにデバッグしてないんですけどね。

注意画像は好きに描き換えられます。 wpf(Visual studio 2010 Express)のソースファイルも付いているのでカスタマイズとかデバッグとかでより使いやすくできますよ? 気が向いた人はどうぞ。

...何気にこのブログに書いたTipsをチマチマ使っていたりします。 作業時間が1週間で済んだのは実は僥倖かも?

2012年1月18日水曜日

wpf : ToolTipの改行

xamlでToolTipの改行をする場合はLineBreakを使います。

<Button>
    <Button.ToolTip>
        <TextBlock>
            test。<LineBreak/>
            test。<LineBreak/>
            test
        </TextBlock>
    </Button.ToolTip>
</Button>

C#のコードから設定する場合は\nでいいみたいです。

Button btn = なんたら;
btn.ToolTip = "test。\ntest。\ntest";

ついでに、ToolTipの表示時間は各コントロールのToolTipService.ShowDurationで設定します。

<Button ToolTipService.ShowDuration="50000"/>

単位はミリ秒、既定値は5000ミリ秒(5秒)です。 ToolTipのテキスト量で自動で変わるとかっていうんだったら楽だったんですけどね。 現状は長いToolTipを付けてしまったら自前で表示時間を設定しなければなりません。

=======

2013/05/19 追記) 幅の上限を設定して自動で折り返す方法を投稿しました。

wpf : タスクマネージャで表示される「プロセスの説明」を設定

wpfプロジェクトで、タスクマネージャで表示される「プロセスの説明」にあたる項目を設定するにはAssemblyInfo.csのAssemblyTitleを書き換えます。 AssemblyDescriptionではないので注意。 AssemblyInfo.csはPropertiesフォルダの中にあります。

2012年1月12日木曜日

Windows7 64bitではIntel製のCPUを使っていてもAMD用のDevConを使う

私のPCは起動時にUSBマウスが正常に動かないことがあります。 ボタンは認識しているけどカーソルが動かない状態。 USBケーブルを抜き差しすれば直ります。 今までそうしてました。 しかし、PC本体を机の下に置いてるので「PC起動→マウス不具合→抜き差し」が微妙に面倒でした。

「何とかならんかなぁ」と色々やってみたらデバイスマネージャで「無効→有効」とすれば直るのを発見。 さらにコマンドラインでデバイスマネージャの一部機能を扱えるDevConというソフトも発見しました。

「これでバッチファイル1発でマウスの誤認識を直せる」と喜んでたらこのアーカイブにはi386版とIA-64版しか入っていない模様。 Core i7などのx64 CPUを積んだPCでこの2つの実行ファイルは正常に動きません。