SeedCollectorをiOS9に対応(2)

HTTP通信の許可設定

iPad上で通信時に以下のエラーが発生

App Transport Security has blocked a cleartext HTTP (http://) resource load 
since it is insecure. 

iOS9よりHTTPで通信するにはATSを無効にするか、例外対象のドメインを設定する必要がある。

(1)例外対象のドメインを設定

info.plistのキー「App Transport Security Settings」に「Exception Domains」以下を追加

※設定したがなぜか正しく機能しない

(2)ATSを無効にする

info.plistのキー「App Transport Security Settings」に「Allow Arbitrary Loads」を追加しYESに設定

こちらは期待通りに機能した

iOS9でHTTP通信ができない時の解決法を参考

カメラ利用の設定

カメラ利用時にエラーが発生し、以下のログを出力

カメラを使用するアプリはinfo.plistに記載

これでカメラ使用時に確認メッセージが表示される。

カメラの変更

iOS7対応時にカメラをUImagePickerControllerに変更しViewControllerとして使用していたが、正しく画像が保存されていなかった。

よってpopoverで表示するように変更。

変更前

//----------------------------------------------------------------------
// 写真撮影View表示
//----------------------------------------------------------------------
-(void)showInputPhoto:(Query*)query AnchorButton:(UIButton*)button Value:(NSString*)value{
    if([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]==YES){
        showing_modal = YES;
        if(ip2){
            [ip2 release];
        }
        ip2 = [[vInputPhoto2 alloc]initWithAppConf:appconf Query:query Value:value];
        ip2.imagepicker = imagepicker;
        [ip2 setDelegate:self];
        //[self showPopOver: ip2.imagepicker AnchorButton:button];
        [CmnLib showViewController:self Child:ip2.imagepicker];
    }
}

変更後

//----------------------------------------------------------------------
// 写真撮影View表示
//----------------------------------------------------------------------
-(void)showInputPhoto:(Query*)query AnchorButton:(UIButton*)button Value:(NSString*)value{
    if([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]==YES){
        showing_modal = YES;
        if(ip2){
            [ip2 release];
        }
        ip2 = [[vInputPhoto2 alloc]initWithAppConf:appconf Query:query Value:value];
        ip2.imagepicker = imagepicker;
        [ip2 setDelegate:self];
        [self showPopOver: ip2.imagepicker AnchorButton:button];
        //[CmnLib showViewController:self Child:ip2.imagepicker];
    }
}

以上を「201707appstore更新SeedCollector」の候補として検証を開始

カテゴリー: iOS

SeeddCollectorをiOS9に対応(1)

株式会社カーネルが提供しているアプリ SeedCollectorは前回に対応してAppStore上でリリース。
今回はiOS10及びiOS9に対応してAppStoreにアップする。
更新対象は201407にリリースしたモジュール。「201407_開発者ライセンス更新_app_store_更新」

予めOSとXcodeは以下のバージョンにアップデート

Xcodeを起動すると証明書エラーが表示された。
最近はProvisioning ProfilesなどはXcodeで自動作成するが、その設定がされていない。
※逆にProvisioning Profilesをサイトで作成してXcodeにインポートする方法がよくわからない。

「Automatically manage signing」チェックをONにする。

変更前

変更後

確認メッセージに同意すると署名の対象を選択可能となるとので今回はTeamを指定。

以下に従って署名等を設定。

上記でエラーが発生しなくなったのでエミュレーターで実行。

するとスプラッシュ画面が間延びして表示されたのでLunchImageの設定

images.xcassetsを選択すると確かにLunchImageが設定されていない。(LunchImage-2はよく分からない)

1Xには768×1024のイメージを2Xには1536×2048のイメージを設定(ドラッグドロップ)

SeedCollectorは縦方向での利用のみを対象とするのでPortraitのみを設定

Lunch Image Sourceは「LunchImage」と「LunchImage-2」から選択が可能なので設定した「LunchImage」を選択。

以上でSplashが正しく設定されたので再度エミュレータで起動すると今度は起動時にハングアップしログに「Application windows are expected to have a root view controller at the end of application launch」が出力されている。

アプリ起動時に呼ばれる関数「didFinishLaunchingWithOptions」でself.window.rootViewControllerが設定されていないのが原因なのでいかに従って修正。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    省略
    navi = [[UINavigationController alloc]initWithRootViewController:splash];

    self.window.rootViewController = navi;
    省略
}

iOS9でアプリが起動直後にクラッシュする場合の回避方法を参考とする

カテゴリー: iOS

iTunes Connect

最近、iTunes Connectを開いていなかったので久しぶりに開くと

契約に関するお知らせが表示された。

The updated Apple Developer Program License Agreement needs to be reviewed.
In order to update your existing apps and submit new apps to the App Store, the user with the Legal role (Team Agent) must review and accept the updated agreement in their account on the developer website.

updated agreementをクリックして表示

Review Agreementをクリック

同意して終了

カテゴリー: iOS

mysqlを5.7にしたらsql_modeにonly_full_group_byが追加されてエラー

MySQL5.1環境下で作成したシステムをMySQl5.7の環境で実行したら以下のエラーが発生した。

SELECT list is not in GROUP BY clause and contains nonaggregated column ・・・ with sql_mode=only_full_group_by

MySQl5.7からはデフォルトでsql_modeにONLY_FULL_GROUP_BYが設定されるため、SELECTしてよい項目はgroup byの対象項目だけだよということ。
至極当たり前なんだけど、既に動作しているシステムでもあり、修正は考えたくない。
よってONLY_FULL_GROUP_BYをsql_modeから外すことを考える。
最初に現在のsql_modeを確認

mysql> show variables like 'sql_mode';
+---------------+-------------------------------------------------------------------------------------------------------------------------------------------+
| Variable_name | Value                                                                                                                                     |
+---------------+-------------------------------------------------------------------------------------------------------------------------------------------+
| sql_mode      | ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+---------------+-------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql>

※my.cnfにはsql_modeについての記載はない。

よって以下をmy.cnfに記述

[mysqld]
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

mySQLを再起動して終了

カテゴリー: MySQL

iOS Developerサイトの設定とxcode8.3.2で最小アプリの作成

Mac OS XのバージョンアップとXcodeのバージョンアップに伴い再度iOS developerサイトの設定とxcodeでのアプリの作成を確認

Mac OS Xのバージョン 
10.12.3

Xcodeのバージョン
8.3.2

証明書の作成

キーチェーンアクセス 環境設定を開きOCSP、CRLが切になっていることを確認

証明書アシスタント 認証局に証明書を要求を選択

メールアドレスにはApple IDのメールアドレスを設定、
通称には任意の文字を設定続けるボタンを押す。

証明書の保存先を指定後、キーペア情報を設定

キーチェーンアクセスを確認すると秘密キーと公開キーが追加されている


証明書のインポート

Developerサイトを開き、Certificatesの追加ボタンを押す

今回はDeveloper用の証明書をインポート

先ほど作成した証明書を指定してインポートし、証明書をダウンロード

ダウンロードした証明書をダブルクリックしてログインのキーチェーンに追加されていることを確認

簡単なアプリを作成

xcodeのウィザードに従ってSingle New Application 「KnlAp01」を作成

Display NameにKnlAp01、Bundle Identifierにjp.ne.kernel-net.KnlAp01

コンパイルしてエラーが出ないことを確認

iOS DeveloperサイトにApp IDを登録

再度、iOS DeveloperサイトにログインしてApp IDsの追加ボタンを選択

App ID Descriptionにはアプリの説明を記載「KnlAp01」
App ID PrefixにはTeam IDと記載されているIDを選択
※自分が使っているのが法人向けのApple Developer ProgramだからTeam IDと表示されるのか不明?
App ID SuffixはExplicit App IDを選択してアプリに設定したBundle IDを設定

以上で登録完了

今まではProvisioning Profilesも作成していたが、今はXcodeで自動作成させるのが主流?

Xcodeにapple IDを設定

xcodeを起動してxcodeメニューのpreferencesを選択
画面したの+ボタンを押して使用するAplle ID を登録し、Download All Profilesを実行

以前はここからProvisioning Profilesを見ることができたが今はできないらしい。

xcodeに戻ってSigningのteamを選択するとProfilesが勝手似設定される

以上

Javascriptでファイルダウンロード

JavaScript+WebAPIでシステム構築をしていると意外と悩むのがファイルダウンロード、アップロード。
多くの場合はWebAPIでダウンロードファイルの情報を照会して別途ダウンロードを行ったり
サーバー上にファイルをアップロードしてからWebAPIを呼び出して更新処理を行う方法が
一般的だったが、最近はWbAPIを使って直接ファイルのアップロード、ダウンロードを行うことができる。(疑似的だが)

■ダウンロード

    var data = {
				"layer_no": layer_no,
				"point_no": point_no,
				"crc": crc
				};

    m_web_service.call("exportPtaPolygon",
		function (data, textStatus, xhr) {
			if(!cmn_is_null(data.d)){
				if(cmn_is_null(data.d.lats)){
					m_common.MsgBox("エクスポート", "エクスポート対象のデータはありません", 0, 0);
					m_window.Close("600");
					return;
				}

				var csv = "";
				for(var i = 0 ; i < data.d.lats.length ; i++){
					csv = csv + data.d.lats[i] + "," + data.d.lons[i] + "\r\n";
				}

				let downloadData = new Blob([csv], {type: 'text/csv'});
				let filename = 'PTA.csv'

				if (window.navigator.msSaveBlob) {
					window.navigator.msSaveBlob(downloadData, filename); // IE用
				} else {
					let downloadUrl  = (window.URL || window.webkitURL).createObjectURL(downloadData);
					let link = document.createElement('a');
					link.href = downloadUrl;
					link.download = filename;
					link.click();
					(window.URL || window.webkitURL).revokeObjectURL(downloadUrl);
				}
				m_window.Close("600");
			}
			else{
			}
		},
		m_common.dummy_function,
		data);

■アップロード

	var fileref = document.getElementById(id);

	var reader = new FileReader();
	reader.onload = function(theFile){
		var outhtml = theFile.target.result;
		var recs = outhtml.split("\r\n");
		if(recs.length < 4){
			m_common.MsgBox("インポート", "正しいファイルを指定してください", 400, 200);
			return;
		}
		var xs = [];
		var ys = [];
		for(var n = 0 ; n < recs.length ; n++){
			let yx = recs[n].split(",");
			if(yx.length == 2){
				ys.push(parseFloat(yx[0]));
				xs.push(parseFloat(yx[1]));
			}
		}
		var data = {
					"layer_no": layer_no,
					"point_no": point_no,
					"crc": crc,
					"xs" : xs,
					"ys" : ys,
					"user_no" : String(m_master.user_no)
					};

		m_common.waitmsg_on();

	    m_web_service.call("importPtaPolygon",
			function (data, textStatus, xhr) {
				m_common.waitmsg_off();
				if(data.d){
					m_common.MsgBox("インポート", "インポートしました", 400, 200);
				}
				else{
					m_common.MsgBox("インポート", "インポートできません", 400, 200);
				}
				m_window.Close("600");
			},
			m_common.dummy_function,
			data);
	}
	reader.readAsText(fileref.files[0], "shift-jis");

pg_dumpのパスワード省略

pg_dumpのパスワードの省略方法(Windows編)

%APPDATA%\postgresql\pgpass.confを作成して接続情報を記載。

*:*:*:ユーザー名:パスワード

%APPDATA%は環境変数
テスト環境では

C:\Users\Administrator\AppData\Roaming

これで引数に-wを与えればパスワードの省略が可能

pg_dump -U ユーザー名 -t areas -w -h localhost smapdb > areass

C++で作成したDLLをC#のEXEから呼び出しデバック

以前C++(vs2008)で作成したDLLをC#のexeからデバックしようとしたら、

vs2008のブレークポイントが無効になりデバックができなくなった。

この対応はネットにはいろいろと記載されているが、その時々でうまくいかないこともある。

今回うまくいった方法を記載。

基本

多くのサイトに記載されているのはVisualStudioのメニュー「ツール」-「オプション」-「デバッグ」の「元のバージョンと完全に一致するソースファイルを必要とする」をOFFにする。

今回うまくいった方法

コマンドにはc#のEXEをフルパスで設定。

アタッチははいに設定。

アタッチを設定すると予めC#のEXEを起動しておく。

次にデバックのタイプを混合に設定。

以上

カテゴリー: C#

GeoServer org.geoserver.platform.ServiceException: Rendering request would use 96531KB, whilst the maximum memory allowed is 65536KB

GeoServerでWMS配信をタイルから全画面に変更したら以下のエラーが出力された。

明らかにメモリ不足だが、JVMのメモリ設定も合わせて再確認のために記載。
※OSはWindowsサーバー、GeoServerのコンテナにはTomcatを使用。

(1)Tomcatのメモリ設定

Tomcatのbinフォルダにある「tomcat7w.exe」を起動

初期メモリと最大メモリを設定

初期メモリと最大メモリは同一の値にしたほうがよいらしい。

※この設定がJVMのメモリ設定に反映されると思われる

GeoServerのメモリ設定

Tomcatのメモリ設定はGeoServerにも反映される。

WMSのメモリ設定

メニューのWMSを選択して「Web Map Service」の設定ページを表示

必ずワークスペースを指定して

メモリを設定

以上