半角円記号を含むパスワード

クラブ会員になっている某サービスにiPhoneアプリからログインしたいのですが、パスワードがどうにも入力できません。

忘れたとか、誤入力したとか、そういうことではなく、入力したい文字がキーボードに見当たらないのです。

 

以下、

半角円記号を含むパスワードを入力したいが、iPhoneのキーボードに半角円記号がなくて困った話。

と、そのそもそもの原因を調べたら根が深かった話。

 

ということで、実は某サービスから自動発行されたパスワードは半角円記号を含む文字列だったわけですが、このiPhoneアプリのキーボードでは半角円記号がなく、ログインできませんでした。

それはサービスとしてどうなの、という点はとりあえず置いておいて、半角円記号がない理由を調べてみると、いろいろなことがわかりました。

 

円記号 - Wikipedia

によると、半角円記号はJIS X 0201では、0x5C番地に割り当てられているが、

ISO-8859-1では、0x5C番地はバックスラッシュが割り当てられている、とのこと。

そこで、先のiPhoneアプリにおいて、パスワード内の半角円記号の文字の代わりに

バックスラッシュを入力してみると、あっさりとログインできてしまいました。

MAC OSからの入力も同様です。

  

WindowsのPCのキーボード(109日本語)には半角円記号のキーがあります。

が、その下の方にはバックスラッシュのキーもあります。

もし、Windowsでバックスラッシュを含むパスワードを入力していた場合はどうなるのか?

試してみたところ、iPhoneでもバックスラッシュの入力で認証されました。

Wiresharkで確認してみると、Windowsで入力した半角円記号とバックスラッシュは

どちらもURLエンコードされると %5C になっており、同じ文字と認識されているようです。

と、ここまでやってようやく気づきました。。Windowsでバックスラッシュを入力できるわけない。

バックスラッシュのキーを打っても半角円記号が入力されるべきところを、

パスワードフィールドだったのでマスクされてバックスラッシュを入力できていると思い込んでいたのですね。

 

なぜ、OS、キーボード、などの間で、このようなややこしい違いが生まれてしまったのか?

YEN SIGN問題縁起 | yasuokaの日記 | スラッシュドット・ジャパン

ここにその経緯がまとめられていました。

なんとも根が深く、そして、厄介ですね。

アプリケーションレベルでは極力考慮したくない類いの内容です。

 

日本では多くの人が、PCはWindowsかつ日本語環境、モバイルは非Windowsという環境にあり、

私と同じようにこの問題に遭遇している人も多いのでは?とも思いましたが、

調べた限りではそのようなドンピシャな記事は見当たりません。

これは某サービスのサーバーサイド処理が特殊ということでしょうか。

サーバーサイド処理の符号化方式など、気になるところです。(もしやWindowsServer?)

 

C#ジェネリックメソッドを作成して気づいたことなど

同一クラスを継承したいくつかのクラスにおいて共通の処理を実行したい場合、通常は素直に基底クラスにその処理を書きます。が、諸事情により、別の方法で解決したということがありましたので、その経緯と気付きを記します。

結論から言うと、ジェネリックメソッドC#)を使いました。

Aクラスという基底クラスを継承したaクラス、bクラス、cクラスがあったときに、これら3クラスで共通の処理を実行させるには、基底クラスであるAクラスにその処理を書きます。通常は。それが継承のメリットかと。

ただ、諸事情により、それが許されないケースがあり(設計方針の違いですね、、)、別の方法で解決する必要がありました。とはいえ、aクラス、bクラス、cクラスに馬鹿みたいに同じコードを書きたくはない。と、調べているうちにジェネリックメソッドに行き着きました。

ジェネリックメソッドで興味深かったのは制約。引数の型を制約できるが、その制約に基底クラスを定義できるという。まさに今回のAクラス。これでaクラス、bクラス、cクラスのいずれも型として指定できる。しかもrefで参照渡しもOK。密結合には注意が必要ですが、これはこれで柔軟性が高い。継承とジェネリックは対の関係にあるようなものなのですね。

これまで自分にとって一番なじみのあるジェネリックは、List<T>クラスの名前空間System.Collections.Genericで、「ああ、List<T>を使うときに追加しないといけないやつね」という程度でした。つまり、あまりジェネリックを意識したことはありませんでした。そのため、List<T>クラスを筆頭にジェネリッククラスをよく使うわりに、ジェネリッククラスやジェネリックメソッドを自分で実装したことがなかったという事実に今回初めて気付きました。便利だなと思って自分で使っているものがどのような仕組みでできているのかを理解することは、その便利なものを自分が作るということにもつながるので、とても大事だなと改めて気づかされました。

今回の設計方針自体が良いとは思えませんが、いつもと違うことをやってみるのもたまにはいいですね。

AngularJSのポイント

自分用メモ

・モジュールと呼ばれる構造の一部としてコントローラを定義する

・{{ }} は初期表示には向かない、ng-bindがよい(初期のみ)

・ng-changeはユーザーによる変更のみ、同じプロパティに関連付けされている別のフィールドが変更された場合や、サーバーからデータを取得する場合は対応できない、$watchがよい

・ng-submitはブラウザによる通常のフォーム送信をしない(フォームタグでも)

・ブラウザ間の差異はAngularJSが吸収する

・Angular式は対象コントローラ内のみアクセス可能、グローバルでない

・アプリケーションロジックのユニットテストをDOMを使わずに書く

・表示/非表示はng-showやng-hideを使う

CSS系はng-classやng-styleを使う

・src属性やhref属性は読み込みが早いため、単純に {{ }} で埋め込んでも×、ng-srcやng-hrefを使う

・コントローラを小さく、かつ、管理の容易なものにするためにビューの中で機能を持った単位ごとに1つずつコントローラを用意する、例えば、メニュー用コントローラ、パンくずリスト用コントローラなど

・$watchの第3引数は対象の配列やオブジェクトが大きい場合、処理の負荷が高くなる。

・$watchは関数を戻り値として返す。(監視解除関数)

・モデルへの変更が完了しているかどうか確認ためにAngularJSは10回までチェックを繰り返す。ただし、Object.observe()というネイティブ実装が取り込まれれば気にする必要ない。

・BatarangはChrome拡張、負荷の高いデータバインディングを自動ハイライトする。

・$watchでwatchFnだけ指定して高速化

・モジュールを使うと、アプリケーションの機能ごとに依存関係をグループ化でき、その依存先を自動的に取得できる。

・サービスはシングルトン($location、$http、$routeなど)

・サービスを生成するための関数3つ

・$routeサービスはURLに応じて異なるテンプレートを読み込む。

・ng-viewで切替場所(DOM)を指定する。

・URL変更でビューが切り替わる、ブラウザの進む戻るが効く、実際にはHTMLのページは1つだけだが、ユーザーは各ビューをブックマークしたり、リンク共有したりできる。

・$http、サーバーとの通信を行うコードは、コントローラ間で共有できるようにサービスとして定義するのがよい。

・ディレクティブを自分で作成、定義できる。

HTML5の属性等を書いたとき、HTML5に対応していないブラウザにも同等の機能を追加することをポリフィル(polyfill)と呼ぶ。

Mac OS X に Rails 開発環境を構築する

Mac Book Air (Mac OS X Lion) で Rails 開発環境を構築しました。

AppStore から XCode をインストールします。

Rails をインストールします。
$ gem install rails 

Homebrew をインストールします。
$ ruby -e "$(curl -fsSL https://gist.github.com/raw/323731/install_homebrew.rb)"

MySQL をインストールします。
$ brew install mysql
$ cd /usr/local
mysql_install_db --verbose -user='whoami' --basedir="$(brew --prefix mysql)" --datadir=/usr/local/var/mysql --tmpdir=/tmp

Installing MySQL system tables...
OK
Filling help tables...
OK

To start mysqld at boot time you have to copy support-files/mysql.server to the right place for your system

PLEASE REMEMBER TO SET A PASSWORD FOR THE MySQL root USER !
To do so, start the server, then issue the following commands:

./bin/mysqladmin -u root password 'new-password'
./bin/mysqladmin -u root -h xxxx.local password 'new-password' 

Alternatively you can run:
./bin/mysql_secure_installation

which will also give you the option of removing the test databases and anonymous user created by default.
This is strongly recommended for production servers.

See the manual for more instructions.

You can start the MySQL daemon with:
cd . ; ./bin/mysqld_safe &

You can test the MySQL daemon with mysql-test-run.pl
cd ./mysql-test ; perl mysql-test-run.pl

Please report any problems with the ./bin/mysqlbug script!

$ sudo cp Cellar/mysql/5.5.19/support-files/mysql.server bin/my.cnf

mysql.server start

.. SUCCESS! 

動作確認します。

$ rails ~/Code/Ruby/testhoge

$ cd ~/Code/Ruby/testhoge

$ rails server

ブラウザで http://localhost:3000/ にアクセスして、Welcome Aboard が表示されることを確認して完了。

 

Linux標準教科書


LPI-JAPAN提供のLinux標準教科書を今日から読み始めました。


これまでバラバラに身につけてきた知識を、改めてLinuxの基礎を勉強することで、互いに結び付けて、より体系的に理解することが目的です。


最初のあたりは既知の内容も多いですが、由来や経緯など豆知識的な情報も盛り込まれていて、読み物としても面白いところがあります。


今後は、以下の順番で読み進めていこうと思います。

  1. Linux標準教科書
  2. Linuxサーバー構築標準教科書
  3. 高信頼システム構築標準教科書−仮想化と高可用性−

iPadの復元

iPadが急に起動しなくなりました。

前日までは普通に使えていたのですが、今日はどのボタンを押しても黒い画面まま何も映りません。
普段利用するソフトウェアはSafariYouTube程度で、落下などの衝撃は特になかったと思います。

仕方がないので、Appleのサイトで対応方法を調べると、スリープ/スリープ解除ボタンとホームボタンを同時に10秒以上押すようにとあったので、早速試したところ、iTunesに接続するように図が表示されました。PCにUSB接続して、PCでiTunesを起動したところ、iPadを復元しようとしているようでした。この復元は工場出荷時の状態に戻すということです。幸い、データを蓄積しないような使い方をしていたので、復元することにして、復元処理を進めました。すると、以下のようなダイアログが表示されてしまいました。

iPad"(iPad名)"を復元できませんでした。不明なエラーが発生しました(1604)。

調べると、Appleのサイトに1604エラーの原因や対応方法が記載されていました。原因の多くはUSBのタイミングに関連しているとのこと。まさかタイミングとは。。iTunesを起動しなおして再トライするように記載されているので、再トライしてみると、また1604エラー。。

上記の手順で問題が解決されない場合は、別の動作確認済み USB ケーブル、コンピュータ、ネットワーク接続で復元してみてください。

別って、そんなに持ってません。。原因の多くがタイミングとのことなので、別の機器等でなくとも、成功する場合もあるのでは、というわずかな望みをもって再トライすること五度目、ついに復元に成功しました。本当にタイミングだったようです。。

Firefoxを3.6.21から6.0.1にバージョンアップする

Firefoxのリリースサイクルが短縮されて、6週間でメジャーアップデートするようになりました。進化の速いWebに対応するためということですが、高速リリース、見習いたいですね。

さておき、これまでFirefoxは3.6.21を利用していましたが、このバージョンも今月(2011年9月)にはサポートを終了するということだし、高速化などを図った最新バージョンも試したいなということで、2011年9月3日現時点で最新製品版である6.0.1にバージョンアップすることにしました。

手順としては、Firefox 3.6.21 では、

程度しか利用していないせいなのか、アップグレードパスのせいなのか、

  1. 3.6.21のアンインストール
  2. 6.0.1のインストール

だけで十分でした。あと、以前はタブがナビゲーションツールバーとブックマークツールバーより下に表示されていたのに、バージョンアップ後は上に表示されるようになっていたので、そこだけ表示位置を変更しました。アドオンも自分が利用していたものは既に6.0.1に対応済みでした。Chromeみたいに起動が速くていいです。ページ表示は若干高速化したような気がしますが、分かりにくいのでもう少しスループットが出る環境で試してみたいですね。