Title

投稿者のアーカイブ

WindowsでのUnicode合成文字問題

Unicodeでは同じ文字を表すのに複数のコードが存在します。
具体的には合成文字(precomposed character)があります。
例えば「が」のような文字を「か」+「゛」で表す方法と「が」そのものとして表す方法があります。
よって、等価な文字列でもコードは異なるという事があり得ます。

Windowsでは基本的に合成文字は使われないようです。
一方iOSでは合成文字が使われます。

iOSではファイル名を扱おうとすると、自動的にUnicodeの正規化が行われますので、あまり意識しなくても等価な文字列は等価なコードになります。
一方でWindowsではそれが行われないようです。

つまり、Windows上では「こんばんは.txt」という全く同じファイル名のファイルが同じフォルダに複数同時に存在出来ます。
(表示上は全く同じだが、実はコードが違う)
プログラムをする上でこの問題は非常にやっかいです。

MultiByteToWideChar等のAPIで正規化が出来ればいいのですが、何故か出来ません。
(dwFlagsの説明を見るとすごく出来そうなのにやってみると何故かできない)

iOSのファイル名をなんとかWindows側に持ってこれないかと、色々捏ねくりまわしていたら以下の方法で出来たので貼っておきます。

非常に回りくどい事をしていて正しいのかどうかは不明です。。もっと良い方法やご意見ありましたら是非コメントを。

(14/03/21追記)
Windows Vista以降では、NormalizeStringというそのままズバリのAPIがあるようです。
(追記ここまで)

//MultiByte(主にUTF-8)をNFC正規化したワイド文字列に変換する
int MultiByteToWideCharNFC(
  UINT CodePage,         // コードページ = CP_UTF8を指定
  DWORD dwFlags,         // 文字の種類を指定するフラグ = NULL を指定
  LPCSTR lpMultiByteStr, // 変換する文字列
  int cchMultiByte,      // 変換する文字列のバイト数。-1で省略可
  LPWSTR lpWideCharStr,  // 変換先のバッファ
  int cchWideChar        // バッファのサイズ(バイト数でなく文字数)
  )
{

	//一旦WideCharに変換
	int lengthWideChar = MultiByteToWideChar(CodePage,dwFlags,lpMultiByteStr,cchMultiByte,NULL,0);
	if(!lengthWideChar){
		return 0;
	}
	TCHAR* wideTemp = new TCHAR[lengthWideChar];

	//TCHAR wBufferTemp[_MAX_PATH*10];
	if(MultiByteToWideChar(CodePage,dwFlags,lpMultiByteStr,cchMultiByte,wideTemp,lengthWideChar) ==0){
		delete[] wideTemp;
		return 0;
	}

	//一度MultiByteに戻す、同時に合成文字をNFC正規化
	int lengthMultiByte = WideCharToMultiByte(CP_ACP,WC_COMPOSITECHECK,wideTemp,-1,NULL,0,NULL,NULL);
	if(!lengthMultiByte){
		delete[] wideTemp;
		return MultiByteToWideChar(CodePage,dwFlags,lpMultiByteStr,cchMultiByte,lpWideCharStr,cchWideChar);
	}

	char* multibyteTemp = new char[lengthMultiByte];


	if(WideCharToMultiByte(CP_ACP,WC_COMPOSITECHECK,wideTemp,-1,multibyteTemp,lengthMultiByte,NULL,NULL) ==0){
		delete[] wideTemp;
		delete[] multibyteTemp;
		return MultiByteToWideChar(CodePage,dwFlags,lpMultiByteStr,cchMultiByte,lpWideCharStr,cchWideChar);
	}


	//WideCharに戻す
	int result = MultiByteToWideChar(CP_ACP,0,multibyteTemp,-1,lpWideCharStr,cchWideChar);
	delete[] wideTemp;
	delete[] multibyteTemp;
	return result;
}

若者は離れていない

「若者の〇〇離れ」が次々に新発明されています。

当たり前ですが、何かに興味のあったハズの人がしばらくして興味を失ってしまった。〇〇離れだ。というのとは違います。
若者は生まれたときから興味が無くて、今も継続して興味がないだけです。
だから離れたんじゃなくて、そもそも近づいて(?)ない。

例えば「若者の車離れ」。
車に興味を持ち、欲しいという若者が減ったという社会の変化です。
この車に興味の無い若者は、一度も車に興味を持ったことがないはずです。

他にも「若者の活字離れ」、「若者のテレビ離れ」、「若者の恋愛離れ」などなどなど色々言われます。

きっと答えはアリキタリで、”その人にとってもっと優れた娯楽ができたから”なんだと思います。
よく言われる「娯楽の選択肢が増えた」とうことです。
それは人の好みの多様化の結果です。
好みが多様化したということは、色々な価値観を受け入れられるようになったと考えることも出来ます。

みんながみんなボーリングしたり、インベーダーゲームしたり、スポーツカー買ったりする方が今の世代から見れば異常に映ります。
それによる良いこともありますが、当然ながら悪いこともあります。

若者が離れてしまって直接困る人が多いので問題視されがちですが、「若者の〇〇離れ」別に悪いことばかりじゃないですよね。良いこともたくさんあるのです。
悪い面にばかり注目し、それに対処するために昔に戻ろうとするのは不可能ですし、それは良い面を再び捨てることでもあります。

古きよき時代をお手本にそれを目指してもダメで、新しいやり方を考えなければならないのです。

除湿機で洗濯を部屋干し

我が家では洗濯は夜します。(朝時間がない&毎日洗濯物が多いので)

狭い洗面室に所狭しと干して除湿機をつけっぱなしにするのですが、最初は湿度がかなり高くなるので、換気だけでも十分乾くんじゃないのか? という疑問に対して実験してみます。

仮説としては、最初は除湿機の能力がおいつかず湿度が高い状態が維持されるので、その間は換気によって湿度下げたほうが効率よく洗濯が乾くということです。
湿度だけでなく温度もあるので難しいのですが・・・。

とりあえずまだ結論は出ませんが、湿度と温度をモニタリングする仕組みだけ作りました。

データをグラフにするとこんな感じになります。

本当は外気温なども必要ですね。

ComicGlass v3.60審査提出

時間が開いてしまいましたが、新バージョンを審査に出しています。

かねてから、フォルダにサムネイルを、本棚のデザインを、というご要望を頂いておりました。
しかしながら従来のデザインのままフォルダにサムネイルを付けるとどうにも不自然だったためアイコンデザインの変更を行い、フォルダにサムネイルが表示されるようにしました。
また、デザインの変更をすると「前の方が良かった」ということも起こり得ますので設定で前のものも選べるようにしました。

せっかくなのでもっとデザインを増やしたいところですが、本棚のデザインを1セット追加すると1MB以上の容量増加になるため「テーマ」機能を導入し、後からインストールが出来る仕組みも追加しました。
ユーザの方が作ったテーマもインストール可能ですので、我こそはという方は是非ハイセンスなテーマを作ってみてください!

iPhoneアプリプログラミング最初の1歩

iOSのプログラミングはObjectie-Cで行います。
C言語や他の環境のGUIプログラミングの経験があるという前提で最初に一番理解し難いのはメモリの管理だと思います。

最新のObjective-Cではガーベジコレクションといった便利な機能が利用できますがiOSでは利用できません。
よって設計者が自前でメモリ管理をしないといけません。

retain,release,alloc,deallocの使い分けが最初さっぱりわからないんですよね。

最初疑問が解決しにくかった思い出を元にヒントを箇条書きにしています。

・allocすると実体が確保され、参照カウントが1になる。
・retainすると参照カウントが1上がり、releaseすると1下がる
・参照カウントが0になると解放される

(ここまでは良くある説明で分かりやすいが、さらに初心者を苦しめるのが以下の機能)

・autorelease poolの中でautoreleaseをすると、autorelease poolが解放されるときに自動的にreleaseが呼ばれる
・autorelease poolはイベントサイクルごとに自動的に処理されているので、イベントの処理の中でautoreleaseしておけばとりあえずその処理が終わった後にreleaseされると思っていい。
・OSのAPIの中には実体を確保した上でautoreleaseされてオブジェクトが返されるものがある。
 見分け方はオブジェクトっぽい名前で始まっていてクラスメソッド(+で始まるやつ)になっているもの。
・よって、イベント処理後も残したいならばretainしておかないと自動的に解放されてしまう。
・逆にautoreleaseされている状態なのにreleaseで参照カウントを0にしてしまうとイベント処理後にクラッシュする。

国土地理院への旧版地図の謄本交付郵送申し込み先

とある場所の昔の状況を知りたい時は、地名から類推したりと色々知恵があるそうですが、大正時代くらいまででしたら地図をみるのが簡単かもしれません。

国土地理院には過去の地形図が保管されており、しかも誰でも閲覧できることになっています。
また謄本交付を申しこめば複製を入手することも可能です。
しかも郵送でも依頼できます。

今住んでいる地域(名古屋市)の大正時代の地形図の謄本を取ってみましたが、名古屋駅や東海道周辺を除いてほぼ田んぼ、
ところどころに集落(村)が存在するといった感じでなかなか興味深かったです。

詳しくは国土交通相のWebサイトをご覧ください。

なお、郵送での依頼先が分かりづらいのですが、
関東地方測量部 測量課 成果閲覧室 謄本交付窓口 宛  が正解です。

収入と保育料の関係を計算してみました(名古屋市)

認可保育園(保育所)の保育料は世帯の収入によって決まります。
税金を多く収めたほど、税金で運営されているはずの保育料が高くなるわけですが、みんなお金が無いし、負担できる人に負担してもらうしかないのでこのような仕組みになっています。

保育料一覧はここ

さて、これを見ると収入が低ければほとんど保育料を払わなくて良いように見えます。
逆に高い方を見てみると最大値が64,000円/月で、その1つ下の階層が63,900円/月です。
たった100円のためにわざわざ階層が分かれているのも不思議な感じがします。

この表、何故分かりにくいかというと保育料の階層が所得税額によって決まるためです。
分かりやすいようにグラフをつくってみることにします。
(3歳未満、第1子の保育料)

まず所得税額から所得を逆算すれば良いのですが、所得税は累進課税なので簡単ではありません。
とりあえず単純に所得と所得税額の関係を求めます。

累進課税なので年収が上がるほど税率がグッと上がります。
最大では40%にもなりますので、10%の人と比べたら実に4倍です。
(控除額も増えるので単純にいきなり4倍になったりはしません)

10%というのは課税所得が(196万円~)330万円以下の人です。
課税所得は色々な控除がついた後の額なので、実際には年収500~600万円くらいだと思います。ほとんどの人はこのグラフの左の方に納めってしまうわけですね。。

では、今度はこれを使って保育料の階層を逆算します。

課税所得の欄が計算結果です。
これで所得と保育料の関係が求められました。
グラフにすると以下のような感じです。

不思議なことに歪んでますね。
理由は分かりませんが、僕が計算を間違えたのか、名古屋市の人が何か意図を持って、(もしくは適当に? 計算間違い??)決めた??のでしょうか。
D9階層の設定が間違ってるような気がするんですよね・・・。
「202,500円から310,000円未満」くらいにすると綺麗なグラフになるのですが、、謎です。

また、上の方を細かく階層に分けている意味はやはりほとんどありませんね。
なんで分けたのか疑問ですが、心理的に「あなたは一番高いわけじゃないですよ」のような士農工商的アイデアでしょうか?
(それとも、最初に階層が決まっていてそれに対して保育料を設定したか)

ただし、途中まではほぼ直線的に上がっています。
夫婦合算の額なので、パートなどではなく正社員でフルタイムで働いていれば上限に近いところ(グラフがほぼ水平になっている領域)になる可能性が高いですね。

そういう意味ではけっこう公平な仕組みなのかもしれません。

Command /usr/bin/codesign failed with exit code 1

多くの方がハマってるこの問題。

僕の場合、複数のMacで開発していたせいでさらに問題を複雑にしていました。
結局何が決定打で悪いのかわかりませんでしたが、キーワードとしては古い証明書などが残っているとダメということ。
何故かデフォルト以外のキーチェインやシステムに残っていてもダメな感じがした(もうわけわからなくて確証持てません)

まずキーチェインは検索機能があるので、そこでiPhoneで検索しましょう。
出てきた証明書を諦めて全部消しましょう。
そして、全て作り直しましょう。

とりあえずこれで解決しました。

iPhoneのUDIDの調べ方

iOSデバイスのUDIDを調べるためにはiTunesを使います。
USBでデバイスを接続しiTunesを起動します。
iTunesに表示される概要画面の「シリアル番号」の部分をクリックするとUDID表示に切り替わります。
このテキストは選択できませんが、UDIDを表示した状態で編集メニューからコピーを選択するとクリップボードにUDIDがコピーされます。

アプリのバックグラウンド実行を無効にする(iOS)

よく忘れるのでメモです。
iOS4.0からバックグラウンドでアプリが動くようになりましたが、これを無効にするには以下のようにします。

.plistに、
UIApplicationExitsOnSuspend (Application does not run in background)
を追加し、trueにします。

カレンダー

2024年12月
 1
2345678
9101112131415
16171819202122
23242526272829
3031  

▲Pagetop