Salesforceで気を付けたい全角/半角の扱い

閲覧ありがとうございます。Armadaです。
今回はSalesforceネタです。

クライアントアプリからSalesfoceにデータを登録する際、キー重複を避けるために事前にSOQL(Salesforce独自のクエリ言語)でデータを抽出→重複キーの存在チェックという流れでアプリ側でチェックを行うわけですが、ここで全角/半角問題が出てきます。

どんな問題かというと、文字によってSOQLとデータ登録時では全角/半角の区別が異なるため、SOQLでは重複なしとなってもデータ登録時に重複ありでエラーとなるのです。

文字による全角/半角の扱いをまとめると以下のとおりです。

文字 SOQL 登録時
アルファベット 区別なし 区別なし
数字 区別なし 区別なし
カタカナ 区別あり 区別なし
記号
※文字により異なる
区別なし 区別なし

アルファベット、数字は全て同じで「区別なし」、カタカナはSOQLでは「区別あり」、登録時は「区別なし」となります。

記号は、というと文字によって異なります。
基本的には上記の表のとおりですが、一部の記号は区別ありだったり、なしだったり。
扱いが異なる記号について調査した結果は以下のとおりでした。

文字コード 記号 SOQL 登録時
0x22 区別あり 区別あり
0x27 区別なし 区別あり
0x5c \ 区別あり 区別あり
0x5e ^ 区別あり 区別なし
0x60 ` 区別なし 区別あり
0x7e ~ 区別あり 区別なし
0xa1 区別あり 区別なし
0xa2 区別あり 区別なし
0xa3 区別あり 区別なし
0xa4 区別あり 区別なし
0xa5 区別あり 区別なし
0xb0 区別あり 区別なし
0xde 区別あり 区別あり
0xdf 区別あり 区別なし

これらの記号やカタカナは基本的にキー項目の値としては利用しないため、登録時の入力チェックでエラーとするなど、登録しない仕組みを考えた方が良さそうです。
是非、参考にしてください。

mPDFで作成したPDFのファイル名がおかしい

PHPで簡単にPDFが作成できる「mPDF」では、作成したPDFをAcrobat readerまたはFirefox等のビューアでブラウザ上に表示させることもできるが、ダウンロードダイアログを表示してPDFファイルをダウンロードさせることもできる。
もちろんPDFファイルのファイル名は指定できるが、場合によってはおかしくなる。

基本的な使い方と問題

mPDFを使用するには、mPDFを任意のディレクトリに設置し、呼び出し元でincludeして下記の様に処理する。

include('./MPDF57/mpdf.php'); // パスは環境に応じて変える

$mpdf = new mPDF('ja', 'A4'); // 出力ファイル設定
$mpdf->writeHTML($data);      // pdf内容をhtmlで突っ込む

// 'sample.pdf'というファイル名でダウンロードさせる
$mpdf->Output('sample.pdf', 'D');

このとき、$mpdf->Output();で指定するファイル名が一時ファイルのパスとなる為、同一ディレクトリのpermissionによって上手くいかないことがある(特に何らかのフレームワークを使用している場合)。
その為フルパス指定で任意のディレクトリに書き出すと安全だが・・・

$mpdf->Output('/var/www/html/pdf/sample.pdf', 'D');

などとした場合、ダウンロードされるpdfのファイル名は、
_var_www_html_pdf_sample.pdf
の様にパスを含んだものになってしまう。

原因

mpdf.phpの7480行付近(※バージョンによる)に、ファイル名の設定(レスポンスヘッダ)がある。

			if (!isset($_SERVER['HTTP_ACCEPT_ENCODING']) OR empty($_SERVER['HTTP_ACCEPT_ENCODING'])) {
				// don't use length if server using compression
				header('Content-Length: '.strlen($this->buffer));
			}
			header('Content-disposition: attachment; filename="'.$name.'"');
 			echo $this->buffer;
			break;

この$nameは$mpdf->Output();の第一引数をそのまま使用している為、ファイル名にパスが含まれてしまう。
ファイル名に関するオプションなどは無さそうなので、この部分の処理を変更するしかない。

パスを含まないように修正する

ヘッダのfilenameに期待するファイル名を記述すればいいので、次のようにした。

			if (!isset($_SERVER['HTTP_ACCEPT_ENCODING']) OR empty($_SERVER['HTTP_ACCEPT_ENCODING'])) {
				// don't use length if server using compression
				header('Content-Length: '.strlen($this->buffer));
			}
			/* --- ここから --- */
			$wk_name = explode('/', $name);
			if (count($wk_name) > 1) {
				$name = $wk_name[count($wk_name) - 1];
			}
			/* --- ここまで --- */
			header('Content-disposition: attachment; filename="'.$name.'"');
 			echo $this->buffer;
			break;

入力されたパスを’/’でexplodeし、末尾の文字列をファイル名としている。
これでどの階層にあってもフルパス指定でダウンロードできる。

東京メトロオープンデータ活用コンテスト

こんにちは、jkです。
妻の分娩予定日が決まり、とうとう再来月には人の親になってしまいます。
いろいろと大変そうですが、楽しみながら子育てに取り組みたいと思います。

さて、今回のブログ記事のテーマですが、
東京メトロオープンデータ活用コンテスト
について取り上げてみたいと思います。

オープンデータ活用コンテスト___未来とメトロ___東京メトロ 10th anniversary

これって何のコンテスト?

簡単にいえば、東京メトロさんが『東京メトロ全線』の『列車位置や遅延時間』といった今までクローズに扱ってきたデータをオープン化し、それを使ったアプリケーション開発コンテストを開催しているということです。
グランプリを取ると100万円!ですので、お小遣い制のお父さんは是非参加したくなる企画だと思います。

具体的にどのようなデータが公開されているかというと、
オープンデータ活用コンテスト___未来とメトロ___東京メトロ 10th anniversary
のように、
・1分毎の列車の運行情報
に加えて、
・列車情報(列車時刻表、運賃表、駅間所要時間、各駅の乗降人員数、女性専用車両)
・施設情報(バリアフリー情報、駅出入口情報、車両ごとの最寄り施設・出入口案内)
といった、何やら面白そうなデータまで取得することができます。

どうやって参加するの?

公式の開発者用サイトがありますので、簡単なユーザ登録をすればすぐに使用できます…

といいたいところですが、登録完了まで最大2営業日かかるようです。
しかし登録完了後は発行されるconsumerKeyを使用して、すぐに東京メトロのオープンデータにアクセスすることができます。

どうやってデータを取得するの?

リクルートWEBサービスや楽天WEBサービスのように、
登録後に発行されるconsumerKeyをURLに付与し、RESTful APIのエンドポイントにアクセスすることによってデータを取得できます。

Web APIのデータ形式として『JSON-LD(Linked Data)』をとっています。
JSON-LDはw3cによって今年の1月に標準仕様として承認されたようですが、
私はLinked Dataの利点や仕様を全然理解していないので、これを期に勉強して理解したいと思います。

さあ早速アクセスしてみよう!

と思いましたが、私も登録がまだ完了していないので、実際にWeb APIでオープンデータにアクセスできるようになってから改めてご報告します。

今後の方針

何やら私の友人界隈でコンテストへの参加熱が強まっているようなので、土日や帰宅後の時間を利用して少し取り組んで見たいと思います。

勉強すべきことなど

・JSON-LD
・どんなアプリケーションにするか