PHP OpenID libraryをのbeginでNULLが返って来てはまった話し


 

仕事で、「OpenID」を使うことになり「PHP OpenID library. 」をダウンロードしてサンプルを動かしたのですが動作しない

OpneIDのサーバに接続に行ってNULLが戻ってくる???

なんでだろって調べた結果、結論としては

「dom」「domxml」

のライブラリがインストールされていなかったのが原因でした。

CentOSを使用しているので
sudo yum install php-domxml-php4-php5 -y

または、
sudo yum install php-xml -y

これで、無事動作するようになりました。

くだらない事で、時間とってしまった多分ドキュメントには記述されているのでちゃんと読みましょうということですね。

Railsの起動時に、「Could not find a JavaScript runtime.」と出た場合の対処方法


 

Railsをインストールして「rails server」を実行してサーバー起動する

Could not find a JavaScript runtime.

と表示されサーバが起動しない場合があると思います。

この原因はJavaScriptのRuntimeがないからです。

ということで、解決方法は2つ

1.Node.jsをインストールする

これは、「Node.jsのサイト」を参考にしてください。

2.gemで「therubyracer」をインストールする

「$RAILS_ROOT/Gemfile」に以下の記述を追加して、bundle installをする

gem 'therubyracer'

これで、「rails server」で起動するようになります。

ショートURLの実装についての考察


 

ちょっとフレームワークや、言語の勉強がてら巷に広がっているショートURLのサービスを作ってみようかと思っています。

まずは、その考察です。

ショートURLというと、

「googleの検索結果URLのように長いURL」を短くしてやろうぜ

っていうサービスです。

有名どころでは、

  1. googleさんが作っている「Google Url Shortener
  2. twitterの「t.co
  3. 老舗で一番有名だと思う「bit.ly

などがあります。
方法としては、URLと、短くしたURLをDBに紐付けて保存しておけばいいというのは分かります。

じゃあ、この短いURLを実現するにはどうしたらいいのでしょうか?

 

1.URLに対してmd5などのハッシュ関数で求められた値を使用する。

これでもいいのですが、

  1. ハッシュ関数のハッシュ値も以外と長い
  2. シノニムが発生する可能性があるのでどうする?

という問題があります。

なので簡単ではありますがちょっと避けたいと思います。

 

2.英数字の中からランダムで、指定桁数の文字列を生成してURLを作成

これも簡単でいいですが、

  1. 重複チェックが必要
  2. 登録件数が多くなると重複が発生する可能性が増えるのでどうにかしたい。

サービスの最初はいいかもと思うのですが、登録件数が増えるにつれて6桁などにすると重複が増える

じゃあ7桁に増やすかということなのですが、このタイミングの判断が難しいのでどうしよう。

問題ですね。

じゃあこの解決方法はないのか?

 

3.ショートURLの候補となるURLを先にDBに登録しておいてリクエスト毎に1つずつ振り出していく

この方法が一番ベストではないかと思います。

リクエストがきたタイミングでの、

  1. 重複チェックも必要なし
  2. 桁数を変更するタイミングも6桁を使いっきったら7桁のように処理すればいい

おお中々便利じゃないですかと思います。

じゃあ、問題点はないのか?

最初に登録するデータ量はどうなんだろうか?

英語小文字(26) + 英語大文字(26) + 数字(10) ^ 6桁 = 95428956661682176000000

となりました。???何バイトだ?・・・とてつもない量ではないか・・・非現実的w

 

結論

方法としては、3番目の方式を取りたいと思っています。

データ量の解決策は、最初から全てのデータを登録する必要ないだろうと言う事で必要になったら振り出す元のデータを増やしていく方式でいいのではないかなと考えています。

でも単純な文字列でもデータ量が貯まると、意外とデータ量っておおいんですね。。。

 

と言う事で考察終わり。

 

MacにCofeeScriptの実行環境をインストールする方法


 

CoffeeScriptをMacにインストールして動作させるまでの方法です。

1.WebサイトからNode.jsをダウンロードする

  1. Node.jsのホームページに遷移する。
  2. 「DOWNLOAD」ボタンを押下する。
  3. 「Macintosh Installer」リンクをクリックする
  4. 「node-vX.X.XX.pkg」ファイルがダウンロードされるので、ダウンロード完了したらダブルクリックする。
  5. インストーラが開くので「次へ」ボタンを押していく、利用規約はちゃんと理解してから押すようにしましょう。
  6. インストールが完了するとこのような画面になるので、書いてある通りに「/usr/local/bin」にPATHを通す。

 

2.動作確認

  1. 「node -v」とコマンドを打ってみて、nodeコマンドが有効か確認する。
  2. 「npm -v」とコマンドを打ってみて、npmコマンドが有効か確認する。

3.CoffeeScriptのインストール

  1. 「sudo npm install -g coffee-script」コマンド打つ
  2. インストールが完了する。

4.CoffeeScriptの動作確認

  1. hello.coffeeファイルを以下の内容で作成する。
    console.log 'Hello World'
  2. コンソールに「coffee hello.coffee」と打ち込みます。動作が上手くいくと「Hello World」と表示されます。

これでとりあえず「CoffeeScript」のインストールが完了しました。

Androidでカメラで撮った写真の向きを自動で補正する方法


 

Androidで撮った写真をアプリで表示すると横に傾いて表示される場合があると思います。

そういう時に写真のExif情報を元に正しい向きに回転する方法です。

まず、以下のようにして正しい回転角度を取得します。

	private int getRotateDegree(String filePath)
	{
		int degree = 0;
		try {
			ExifInterface exifInterface = new ExifInterface(filePath);
			int orientation = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_UNDEFINED);
			if (orientation == ExifInterface.ORIENTATION_ROTATE_90) {
				degree = 90;
			} else if (orientation == ExifInterface.ORIENTATION_ROTATE_180) {
				degree = 180;
			} else if (orientation == ExifInterface.ORIENTATION_ROTATE_270) {
				degree = 270;
			}
			if (degree != 0) {
				exifInterface.setAttribute(ExifInterface.TAG_ORIENTATION, "0");
				exifInterface.saveAttributes();
			}
		} catch (IOException e) {
			degree = -1;
			e.printStackTrace();
		}

		return degree;
	}

Exif情報から正しい角度が取得できたので、

取得した角度を写真に反映する

	public int rotateImage(String filePath)
	{
		filePath = filePath.replace("file://", "");
		int degree = getRotateDegreeFromExif(filePath);
		if (degree > 0) {
			OutputStream out = null;
			Bitmap bitmap = null;
			Bitmap rotatedImage = null;
			try {
				Matrix mat = new Matrix();
				mat.postRotate(degree);
				BitmapFactory.Options opts = new BitmapFactory.Options();
				opts.inJustDecodeBounds = true;
				BitmapFactory.decodeFile(filePath, opts);
				int width = 480;
				int scale = 1;
				if (opts.outWidth > width) {
					scale = opts.outWidth / width + 2;
				}
				opts.inJustDecodeBounds = false;
				opts.inSampleSize = scale;
				bitmap = BitmapFactory.decodeFile(filePath, opts);
				rotatedImage = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), mat, true);
				out = new FileOutputStream(filePath);
				rotatedImage.compress(Bitmap.CompressFormat.JPEG, 100, out);
			} catch (Exception ex) {
				ex.printStackTrace();
			} finally {
				if (out != null) try { out.close(); } catch (IOException e) {}
				if (bitmap != null) bitmap.recycle();
				if (rotatedImage != null) rotatedImage.recycle();
			}
		}
		return degree;
	}

これで、画像はExif情報通りの角度で表示されるようになります。

今回は保存しましたが、表示にのみ使用することも可能です。

return top