blog
Android とりあえずlog
[新規アンドロイドプロジェクト] - [Phone and tablet] - [Empty Activity] でActivity のコードに下記を貼り付け。 先頭のpackage を削除しないように Activity名はダイアログで設定したものに置き換える。 |
[iOS XCode] Info.plist のローカライズ(多言語化)
iOS 10 から カレンダーデータのアクセスには Info.plist に理由を明記しなければ リリースできなくなっています。 他のプライバシーの設定も同じだと思います。 カレンダーの場合は "Privacy - Calendars Usage Description" というキーを Info.plist に追加して、 Value フィールドに "予定を表示したいので" みたいに理由を記入するのですが 多言語対応していると言語に応じて表示する文字列を変えたくなると思います。 Info.plist は他のリソースのようにローカライズできないと思いますが、Info.plist 内で使用する文字列は別ファイルに書くことができます。 InfoPlist.strings というファイルをリソースに追加します。 そしてこのファイルをLocalizeします。 Info.plistのファイル名が別の名前になっていてもこのファイル名は固定のようです。(どこかで指定あるのかな?) 例えば、MonCalでは MonthViewCalendar-Info.plist という名前で .plist を使用して、Build Settings で MonCaliteと別ファイルにして 切り替えていますがその場合でも .plist のローカライズファイル名は InfoPlist.strings です。ちなみにローカライズした時に自動的に作成されていたようです。 Info.plist の一覧画面で右クリックして「Show Raw Keys/Values」を選択すると Info.plist 上のキー名に切り替わるので、"Privacy - Calendars Usage Description" は そのキー名に対してValueの値を各言語に対応した InfoPlist.strings に書けば 言語対応できます。 ja.lproj 以下の InfoPlist.strings には "NSCalendarsUsageDescription" = "予定を表示したいので" en.lproj 以下の InfoPlist.strings には "NSCalendarsUsageDescription" = "To display the schedule" という感じです。 また、プライバシー関連のテストは初回の起動時のみしか出ないのでシミュレータでやる方が便利です。 シミュレータのホーム画面で設定アプリを立ち上げて 「一般」→「リセット」→→「位置情報とプライバシーをリセット」 を行うとプライバシー設定がリセットされるので何度でも動作を確認できます。 |
Windows とりあえずログ
C++ Win32コンソールアプリケーション #include "stdafx.h" #include <Windows.h> #include <iostream> #include <fstream> #include <stdarg.h> std::ofstream g_ost; void LogOpen(void) { g_ost.open("c:\\vcplog.txt", std::ios::out); g_ost.write("------------- start ------------------\n", 40); } void LogClose(void) { g_ost.write("------------- end ------------------\n", 40); g_ost.close(); } // // Output a debug string // void Log( __in LPSTR pszFormat, ...) { char buff[2048]; va_list argList; va_start(argList, pszFormat); int count = vsnprintf_s(buff, 2048, pszFormat, argList); g_ost.write(buff, count); g_ost.write("\n", 2); va_end(argList); } // // Output a debug string // void Log( __in LPCWSTR pwszFormat, ...) { WCHAR wbuff[2048]; CHAR buff[2048]; va_list argList; va_start(argList, pwszFormat); int count; count = _vsnwprintf_s(wbuff, 2048, pwszFormat, argList); count = WideCharToMultiByte(CP_ACP, 0, wbuff, -1, buff, 2047, NULL, NULL); g_ost.write(buff, count); g_ost.write("\n", 2); va_end(argList); } int main() { LogOpen(); Log("aaaa"); Log(L"abc%d%s", 5, L"xyz"); LogClose(); return 0; } |
iOS7 UITableViewCellを継承したカスタムセルで drawInRect drawRect の内容が表示されない。
何度もハマるのでメモ。 セルを継承したカスタムセルでは、背景を透明にしないと drawRect で描画した内容が表示されない。 iOS8やiOS9では大丈夫。 |
Objective-C WebDAVでファイルを取得する(NSURLConnection, NSURLRequest)
box.net のファイルをWebDAVで取得する。 下記でフォルダを指定して取得したXMLを解析し、<href>のURL を別途 HTTP で GET すればファイル取得できる。 <参考にしたサイト( ありがとうございます)> ・リクエストの生成
http://oasynnoum.hatenablog.com/entry/2013/06/18/234351 ・Basic認証 ユーザー名とパスワードをBase64 エンコーディングする
http://d.hatena.ne.jp/white_silhouette/20080916/1221566535 ・RFC-2518 http://webdav.todo.gr.jp/download/rfc2518j.txt |
UIColor を archive して unarchive すると少し変化している。(isEqal: でNO)
32bit ビルドでは変化がないけど、64bit ビルドでは少し誤差が出るみたい。 とりあえずargbに分解して、0-255に変換して比較するようにして回避した |
NSKeyedUnarchiver unarchiveObjectWithFile が nil を返す(ARC)
あんまりハマることは無いかもしれませんが NSKeyedUnarchiver unarchiveObjectWithFile で nil が返ってくる場合に気をつけること。 1) 初歩的ですが、意外に多い archivePath の値がアーカイブしたときと同じになっているか [NSKeyedArchiver archiveRootObject:unarchveObj toFile:archivePath] 2) unarchveObj がクラス変数の場合の宣言が weak になっていないか @property(nonatomic, weak) UserClass *unarchveObj; //× unarchiveObjectWithFile を受け取る変数は、所有権を持たないといけないので strong である必要があります。 @property(nonatomic, strong) UserClass *unarchveObj; //◯ |
iOS WebView 実機で画像が表示されない。
シミュレータでは問題なく表示するのに 実機で画像が出ない場合。 ファイルの大文字小文字(特に拡張子)が実際のファイルと一致しているかを疑う。 <img src="image.png" /> と <img src="image.PNG" /> という違い。 意外にハマる。 |
iOS SDK Version のdefine (iOS 7, XCode5でのみビルド)
MonCal/MonCalite の iOS 7 対応のためソースコードを修正していますが、 iOS 7 独自の修正を加えるとXCode5 でしかビルドが通りません。 しかしXCode 5 は現在(2013/7/6時点)は、β版なのでリリース用には使えません。 ということで、現在の正規版 XCode4.6ではiOS 7のソースをビルドしないように コンパイルオプションで切り替えたくなります。 べつにこれはiOS 7 に限ったことではないのですが。。。 iOS 7 のSDKでは usr/include Availability.h に #define __IPHONE_7_0 70000 という定義がありますので #ifdef __IPHONE_7_0 // XCode 5 以降でビルドされるコード #endif とすれば良いみたいです。 |