2014年7月26日土曜日
CodeIgniterのActiveRecord(where句の動的生成)。
7月 26, 2014
オフィス狛 技術部です。
前々回に引き続き、今回もCodeIgniterのActiveRecordで苦労した事を備忘録として残しておきます。
CodeIgniterのActiveRecordでは、
ただし、複雑なSQL文の事を考慮し、動的にwhere句を作成する事もできます。
実はエラーになってしまいます。(正しく解析されない)
原因は、whereStringの先頭に半角スペースが設定されている為です。
先頭の半角スペースを削除すれば、正常に動作します。
修正したものは以下になります。
(半角スペースだけの問題なので、パッと見は変わりませんが)
前々回に引き続き、今回もCodeIgniterのActiveRecordで苦労した事を備忘録として残しておきます。
CodeIgniterのActiveRecordでは、
$this->db->where('item1', '1');
$this->db->where('item2', '2');
上記のように、カラムと検索値を指定するだけで、簡単にwhere句が作成できます。ただし、複雑なSQL文の事を考慮し、動的にwhere句を作成する事もできます。
// 検索条件の作成
$whereString = ' ( item1 = ' . $value1;
$whereString.= ' or item1 = ' . $value2 . ')';
$whereString.= ' and del_flg = ' . $delFlg;
$whereString.= ' and proc_date < ' . $nowDate;
$updateData = array(
'del_flg' => self::NOT_DEL_DATA,
'last_updated_user' => self::PRG_ID,
'updated_at' => $updateTime,
);
$this->db->where($whereString);
$this->db->update('sample_table', $updateData);
上記は、変数whereStringにwhere句を動的作成して格納していますが、実はエラーになってしまいます。(正しく解析されない)
原因は、whereStringの先頭に半角スペースが設定されている為です。
先頭の半角スペースを削除すれば、正常に動作します。
修正したものは以下になります。
(半角スペースだけの問題なので、パッと見は変わりませんが)
// 検索条件の作成
$whereString = '( item1 = ' . $value1;
$whereString.= ' or item1 = ' . $value2 . ')';
$whereString.= ' and del_flg = ' . $delFlg;
$whereString.= ' and proc_date < ' . $nowDate;
$updateData = array(
'del_flg' => self::NOT_DEL_DATA,
'last_updated_user' => self::PRG_ID,
'updated_at' => $updateTime,
);
$this->db->where($whereString);
$this->db->update('sample_table', $updateData);
これは、原因を突き止めるのに、本当に時間が掛かりました。2014年7月6日日曜日
Unity で Internal compiler error。
7月 06, 2014
オフィス狛 技術部です。
社内でUnity開発用の端末を追加して、環境設定した後、
プロジェクトをコピーしてビルドしたら以下のメッセージが出ました。
(OSはWindows7 64bit、Unityのバージョンは4.3.4)
他の端末では、何の問題もなくビルド出来ています。
メッセージからすると、何か権限絡みエラーな気がしますが・・・
他の端末とのは違いは、アンチウィルスソフトぐらいしか・・・って、調べてみたら、これが原因でした。
今回の設定した端末のみ、アンチウィルスソフトはMcAfeeをインストールしているのですが、
McAfeeのリアルタイムスキャンがビルドの邪魔をしているようです。
検索したら、同じような現象で困っている人が。
とりあえず、リアルタイムスキャンを止めたら、エラーは解消し、ビルド出来ました。
・・・が、毎回リアルタイムスキャン止めるのも面倒なので、結局アンチウィルスソフト変える事にしました。
社内でUnity開発用の端末を追加して、環境設定した後、
プロジェクトをコピーしてビルドしたら以下のメッセージが出ました。
(OSはWindows7 64bit、Unityのバージョンは4.3.4)
Internal compiler error. See the console log for more information. output was: Unhandled Exception: System.UnauthorizedAccessException: Access to the path "C:\xxxx\yyyy\zzzz\Temp\Assembly-CSharp.dll.mdb" is denied.
他の端末では、何の問題もなくビルド出来ています。
メッセージからすると、何か権限絡みエラーな気がしますが・・・
他の端末とのは違いは、アンチウィルスソフトぐらいしか・・・って、調べてみたら、これが原因でした。
今回の設定した端末のみ、アンチウィルスソフトはMcAfeeをインストールしているのですが、
McAfeeのリアルタイムスキャンがビルドの邪魔をしているようです。
検索したら、同じような現象で困っている人が。
- How to solve "Internal compiler error."?
- Giving me a "System.UnauthorizedAccessException" every time I change a script.
とりあえず、リアルタイムスキャンを止めたら、エラーは解消し、ビルド出来ました。
・・・が、毎回リアルタイムスキャン止めるのも面倒なので、結局アンチウィルスソフト変える事にしました。
2014年6月11日水曜日
CodeIgniterのActiveRecord(SQL関数利用時の別名について)。
6月 11, 2014
オフィス狛 技術部です。
オフィス狛では、PHP開発を行う際は規模によって使用するフレームワークを変えています。
中・大規模の場合は、Symfony2を主に利用し、
Web APIや、簡単なメンテナンス系画面を作成する際は、
軽量フレームワークのCodeIgniterを利用しています。
今回は、CodeIgniterのActiveRecordで、苦労した問題を備忘録として残しておきます。
CodeIgniterのActiveRecordには、関数がいくつか用意されています。
例えば、select_maxの使い方は以下の通りです。
1加算して値を返却する処理ですが、
実は、上記だと実行時エラーになってしまいます。
原因は「select_maxの第2引数のalias(別名)」にあります。
関数の第2引数のalias(別名)は『全て小文字』で設定しないといけません。
上記例で言うと、「maxId」ではなく、「maxid」と記載するのが正解です。
こういった細かいミスは気付き難いです・・・・。
オフィス狛では、PHP開発を行う際は規模によって使用するフレームワークを変えています。
中・大規模の場合は、Symfony2を主に利用し、
Web APIや、簡単なメンテナンス系画面を作成する際は、
軽量フレームワークのCodeIgniterを利用しています。
今回は、CodeIgniterのActiveRecordで、苦労した問題を備忘録として残しておきます。
CodeIgniterのActiveRecordには、関数がいくつか用意されています。
- select_max(field, alias)
- クエリの "SELECT MAX(field)" の部分を書き出します。 結果フィールドをリネームするために、追加で第2引数を指定できます。
- select_min(field, alias)
- クエリの "SELECT MIN(field)" の部分を書き出します。select_max() と同様に、結果フィールドをリネームするために、追加で第2引数を指定できます。
- select_avg(field, alias)
- クエリの"SELECT AVG(field)" の部分を書き出します。 select_max() と同様に、結果フィールドをリネームするために、追加で第2引数を指定できます。
- select_sum(field, alias)
- クエリの"SELECT SUM(field)"の部分を書き出します。select_max() と同様に、結果フィールドをリネームするために、追加で第2引数を指定できます。
例えば、select_maxの使い方は以下の通りです。
$keyMaxId = 0;
$selectmax = array(
'key_id',
'item_div',
);
$this->db->select_max('key_id', 'maxId');;
$this->db->from('sample_table');
$this->db->where('item_div', $this->config->item('item_div'));
$querymax = $this->db->get();
$productmax = $querymax->row(0, 'object');
if (count($productmax) > 0) {
$keyMaxId = $productmax->maxId;
$keyMaxId++
}
return $keyMaxId;
上記は、テーブル(sample_table)のキー(key_id)のMAX値を取得して、1加算して値を返却する処理ですが、
実は、上記だと実行時エラーになってしまいます。
原因は「select_maxの第2引数のalias(別名)」にあります。
関数の第2引数のalias(別名)は『全て小文字』で設定しないといけません。
上記例で言うと、「maxId」ではなく、「maxid」と記載するのが正解です。
こういった細かいミスは気付き難いです・・・・。
2014年6月10日火曜日
Entity Framework 5におけるデータバインド。
6月 10, 2014
オフィス狛 技術部です。
Entity Framework 4.xを利用しているシステムをリニューアルする事になり、
.NET Frameworkのバージョンを上げ、Entity Framework も 5 にバージョンアップさせました。
その状態で実行すると、
Data binding directly to a store query (DbSet, DbQuery, DbSqlQuery) is not supported Entity Framework 5
というエラーメッセージが表示されました。
日本語環境だと、
ストア クエリ (DbSet、DbQuery、DbSqlQuery) への直接のデータ バインドはサポートされていません。代わりに、DbSet で Load を呼び出すなどして DbSet にデータを設定し、ローカル データにバインドしてください。WPF の場合は DbSet.Local に、WinForms の場合は DbSet.Local.ToBindingList() にバインドします
と表示されました。
元々のプログラムは単純で、
テーブルから取得したデータをドッロプダウンリストにバインドしているだけです。
要は「クエリを直接データソースに設定するな」という事だとだと思い、
dropDownList.DataSource = testObject;
上記部分を
dropDownList.DataSource = testObject.ToList();
と変更する事で、エラーメッセージが表示されなくなりました。
ヒントとなる情報は国内サイトでは見つかりませんでしたが、
Stack Overflowで発見しました。
(プログラムでハマってしまった時に検索すると、大抵「Stack Overflow」に行き着きますよね・・・)
修正後のプログラムは以下に記載しておきます。
Entity Framework の歴史を振り返る
Entity Framework 4.xを利用しているシステムをリニューアルする事になり、
.NET Frameworkのバージョンを上げ、Entity Framework も 5 にバージョンアップさせました。
その状態で実行すると、
Data binding directly to a store query (DbSet, DbQuery, DbSqlQuery) is not supported Entity Framework 5
というエラーメッセージが表示されました。
日本語環境だと、
ストア クエリ (DbSet、DbQuery、DbSqlQuery) への直接のデータ バインドはサポートされていません。代わりに、DbSet で Load を呼び出すなどして DbSet にデータを設定し、ローカル データにバインドしてください。WPF の場合は DbSet.Local に、WinForms の場合は DbSet.Local.ToBindingList() にバインドします
と表示されました。
元々のプログラムは単純で、
テーブルから取得したデータをドッロプダウンリストにバインドしているだけです。
using (var context = new DeomDbEntities())
{
var testObject =
from master in context.code_name
where master.code_type == '1' &&
master.delete_flg == '0'
orderby master.display_order
select new { code_value = master.code_value, code_text = master.code_text };
if (testObject != null)
{
dropDownList.DataSource = testObject;
dropDownList.DataValueField = "code_value";
dropDownList.DataTextField = "code_text";
dropDownList.DataBind();
}
}
日本語のエラーメッセージが分かり難かったのですが、要は「クエリを直接データソースに設定するな」という事だとだと思い、
dropDownList.DataSource = testObject;
上記部分を
dropDownList.DataSource = testObject.ToList();
と変更する事で、エラーメッセージが表示されなくなりました。
ヒントとなる情報は国内サイトでは見つかりませんでしたが、
Stack Overflowで発見しました。
(プログラムでハマってしまった時に検索すると、大抵「Stack Overflow」に行き着きますよね・・・)
修正後のプログラムは以下に記載しておきます。
using (var context = new DeomDbEntities())
{
var testObject =
from master in context.code_name
where master.code_type == '1' &&
master.delete_flg == '0'
orderby master.display_order
select new { code_value = master.code_value, code_text = master.code_text };
if (testObject != null)
{
dropDownList.DataSource = testObject.ToList();
dropDownList.DataValueField = "code_value";
dropDownList.DataTextField = "code_text";
dropDownList.DataBind();
}
}
余談ですが、Entity Frameworkのバージョンに関する情報は下記サイトが参考になりました。Entity Framework の歴史を振り返る
2014年5月18日日曜日
StyleCopの設定 SA1650。
5月 18, 2014
オフィス狛 技術部です。
弊社では、C#でプログラミングする際は、必ず StyleCop を利用しています。
StyleCop は、C#のコーディング内容をチェックするツールです。
インストールはNuGetのパッケージ管理で行っているので、下記などを参照下さい。
StyleCopインストール手順メモ
今回は、使い方の説明ではなく、日本語特有の問題についての解決方法です。
「StyleCopのインストール」というサイトにもある通り、
SA16xx系は、日本語環境では実用的では無いので、無効にする事がほとんどです。
ところが、SA1650だけ、設定画面で無効に出来ない。
(SA1650がない!?)
そのままビルドすると、大量に警告が出ます。
こんな感じで、初期設定は色々と面倒ですが、StyleCopを導入すると、
プロジェクトのメンバーそれぞれのプログラムに統一性が出て、
後々見直しても、プログラムの中身が理解し易いのでお勧めです。
※追記
今回使用していたのは、NuGetからインストールしたバージョン「4.7.46.0」ですが、
NuGetを使用せずに、本家サイトから直接インストーラーをダウンロードして、
インストールした「4.7.49.0」だと、SA1650は設定画面にも表示されました。
弊社では、C#でプログラミングする際は、必ず StyleCop を利用しています。
StyleCop は、C#のコーディング内容をチェックするツールです。
インストールはNuGetのパッケージ管理で行っているので、下記などを参照下さい。
StyleCopインストール手順メモ
今回は、使い方の説明ではなく、日本語特有の問題についての解決方法です。
「StyleCopのインストール」というサイトにもある通り、
SA16xx系は、日本語環境では実用的では無いので、無効にする事がほとんどです。
ところが、SA1650だけ、設定画面で無効に出来ない。
(SA1650がない!?)
そのままビルドすると、大量に警告が出ます。
警告 xxxx SA1650 : CSharp.Documentation : The documentation text within the summary tag contains incorrectly spelled wordsというわけで、SA1650を無効にする為には、クラス属性を指定する必要があります。
[SuppressMessage("StyleCop.CSharp.DocumentationRules", "SA1650:ElementDocumentationMustBeSpelledCorrectly",Justification = "For Japanese support")]
class SampleClass
{
}
こんな感じで、初期設定は色々と面倒ですが、StyleCopを導入すると、
プロジェクトのメンバーそれぞれのプログラムに統一性が出て、
後々見直しても、プログラムの中身が理解し易いのでお勧めです。
※追記
今回使用していたのは、NuGetからインストールしたバージョン「4.7.46.0」ですが、
NuGetを使用せずに、本家サイトから直接インストーラーをダウンロードして、
インストールした「4.7.49.0」だと、SA1650は設定画面にも表示されました。
2014年5月9日金曜日
Webクリップの設定 Windows8用。
5月 09, 2014
オフィス狛 技術部です。
前回、androidとiosのWebクリップ設定を行いましたが、
今回はWindows8のピン留めについてです。
弊社ホームページで、試しにWebクリップの設定をしていない状態でピン留めしてみました。
すると、Webサーバのエラーログに、
ちなみに、ピン留めした時の状態は、
タイルの真ん中の画像はどうやらfaviconのようです。
タイルの色も、faviconの色が基調になっているようです。
タイルのサイズは、2種類(中と小)しか選ぶ事が出来ませんでした。
では、Webクリップの設定をしていきましょう。
と言うものの、実際は、下記URLで画像とXMLファイルを自動生成できます。
Web サイトを Windows 8.1 のタイルにしよう - Web サイトをピン留めする
基本は手順に沿って進めていけば問題ありません。
画像は、アップロードした画像を元に、4サイズ分(*1)作成されるので、
アップロードした画像のトリミングを4サイズ分行います。
*1 128×128、270×270、270×558、558×558
RSSフィードの設定する事で、ライブタイルのプッシュ通知が可能になります。
最終的に自動生成された(ダウンロードしたパッケージの)browserconfig.xmlと画像を
ドキュメントルートに置いて、htmlのmetaタグに下記を追加すれば完了です。
(画像のパスなど、その他の設定は全てbrowserconfig.xmlに記載してあります。)
ピン留めした画像サイズの変更も、4種類から選ぶ事が可能になっています。
前回と今回で、Webクリップの設定を行いました。
余談ですが、Windows8.1タブレットでスクリーンショット(画面キャプチャ)は、
タブレット本体にあるWindowsボタンを押しながら、音量のマイナスを押すと取れます。
前回、androidとiosのWebクリップ設定を行いましたが、
今回はWindows8のピン留めについてです。
弊社ホームページで、試しにWebクリップの設定をしていない状態でピン留めしてみました。
すると、Webサーバのエラーログに、
File does not exist: xxxxxx/xxxxxx/browserconfig.xmlという内容が出力されていました。
ちなみに、ピン留めした時の状態は、
タイルの真ん中の画像はどうやらfaviconのようです。
タイルの色も、faviconの色が基調になっているようです。
タイルのサイズは、2種類(中と小)しか選ぶ事が出来ませんでした。
では、Webクリップの設定をしていきましょう。
と言うものの、実際は、下記URLで画像とXMLファイルを自動生成できます。
Web サイトを Windows 8.1 のタイルにしよう - Web サイトをピン留めする
基本は手順に沿って進めていけば問題ありません。
画像は、アップロードした画像を元に、4サイズ分(*1)作成されるので、
アップロードした画像のトリミングを4サイズ分行います。
*1 128×128、270×270、270×558、558×558
RSSフィードの設定する事で、ライブタイルのプッシュ通知が可能になります。
最終的に自動生成された(ダウンロードしたパッケージの)browserconfig.xmlと画像を
ドキュメントルートに置いて、htmlのmetaタグに下記を追加すれば完了です。
(画像のパスなど、その他の設定は全てbrowserconfig.xmlに記載してあります。)
<meta name="application-name" content="オフィス狛"/>設定した後にピン留めした結果は以下の通りです。
ピン留めした画像サイズの変更も、4種類から選ぶ事が可能になっています。
前回と今回で、Webクリップの設定を行いました。
余談ですが、Windows8.1タブレットでスクリーンショット(画面キャプチャ)は、
タブレット本体にあるWindowsボタンを押しながら、音量のマイナスを押すと取れます。
2014年5月2日金曜日
Webクリップの設定。
5月 02, 2014
オフィス狛 技術部です。
今回は、Webクリップ(apple-touch-icon.png)についてです。
先日、社内Webシステムのエラーログに、
"apple-touch-icon.png" はWebクリップといって、
スマホやタブレットでホーム画面にブックマークを表示する際のアイコンの事です。
社内システムではPCのみを対象としていたので、特に用意していませんでした。
オフィス狛のホームページではWebクリップは用意してあります。
上記はAndroid端末で見た場合ですが、左側がWebクリップを用意した場合で、
右側が用意していない場合です。
上記はios7の場合です。画像なしの場合は、サイトのキャプチャがアイコンになります。
設定方法ですが、Androidの事を考えないのであれば、
ドキュメントルートに "apple-touch-icon.png" という名前のファイルを置けばOKです。
Androidでは、以下の記述をhtmlファイルに追加する必要があります。(iosでも指定する事は可能)
rel の "apple-touch-icon" を "apple-touch-icon-precomposed" にすると、光沢無しの画像になりますが、
ios7からはフラットデザインになっている為、"apple-touch-icon"としても光沢処理は付かないようです。
ちなみに、
日本語表記だと6文字が省略せずに表示されます。
Webクリップの画像サイズですが、
iOSヒューマンインターフェイスガイドラインによると、
iPhoneおよびiPod touchでは、次のサイズのアイコンを作成します。
iPadでは、次のサイズのアイコンを作成します。
との事です。
(昔は144pxとか114pxと言われていたけど変わった?)
画面サイズごとにリサイズされるので、一番大きい152pxで作成しておけば良いかと思います。
今回は、Webクリップ(apple-touch-icon.png)についてです。
先日、社内Webシステムのエラーログに、
File does not exist: apple-touch-icon.pngという内容が出力されていました。
"apple-touch-icon.png" はWebクリップといって、
スマホやタブレットでホーム画面にブックマークを表示する際のアイコンの事です。
社内システムではPCのみを対象としていたので、特に用意していませんでした。
オフィス狛のホームページではWebクリップは用意してあります。
上記はAndroid端末で見た場合ですが、左側がWebクリップを用意した場合で、
右側が用意していない場合です。
上記はios7の場合です。画像なしの場合は、サイトのキャプチャがアイコンになります。
設定方法ですが、Androidの事を考えないのであれば、
ドキュメントルートに "apple-touch-icon.png" という名前のファイルを置けばOKです。
Androidでは、以下の記述をhtmlファイルに追加する必要があります。(iosでも指定する事は可能)
<link href="apple-touch-icon.png" rel="apple-touch-icon"></link>角丸処理は自動で行ってくれます。
rel の "apple-touch-icon" を "apple-touch-icon-precomposed" にすると、光沢無しの画像になりますが、
ios7からはフラットデザインになっている為、"apple-touch-icon"としても光沢処理は付かないようです。
ちなみに、
<meta name="apple-mobile-web-app-title" content="オフィス狛">上記メタタグを追加する事で、アイコンの名称も設定する事ができます。(iosのみ)
日本語表記だと6文字が省略せずに表示されます。
Webクリップの画像サイズですが、
iOSヒューマンインターフェイスガイドラインによると、
iPhoneおよびiPod touchでは、次のサイズのアイコンを作成します。
- 120×120ピクセル
- 60×60ピクセル(標準解像度)
iPadでは、次のサイズのアイコンを作成します。
- 152×152ピクセル
- 76×76ピクセル(標準解像度)
との事です。
(昔は144pxとか114pxと言われていたけど変わった?)
画面サイズごとにリサイズされるので、一番大きい152pxで作成しておけば良いかと思います。
登録:
投稿 (Atom)




