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」の設定ページを表示

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

メモリを設定

以上

座標を可視化

ポリゴンを表す緯度、経度のCSVファイルを空間データとして可視化するには、
WellknownText形式に変換してQGISで開くのがとっても簡単!

緯度、経度のCSVを

34.2225148615066,135.164278680816
34.2222647892155,135.164253691228
34.2209399347514,135.164065751247
34.2208400011058,135.166490542546
省略
34.2190481285219,135.163178891017
34.219082076719,135.161066074617
34.2202399699249,135.162128943605
34.220981886875,135.162165915966
34.2225148615066,135.164278680816

以下のフォーマットに変換

POLYGON((135.164278680816 34.2225148615066,135.164253691228 34.2222647892155,135.164065751247 34.2209399347514,135.166490542546 34.2208400011058,135.167490488286 34.2198321377673,135.167478515946 34.2190232289557,135.166240626338 34.2189572083141,135.16444085933 34.2166574274783,135.164740868754 34.2155735568347,135.165003879174 34.2145576776619,135.163853988215 34.214298680841,135.162641134789 34.2130657927005,135.162741137292 34.2127238336321,135.162841140057 34.2123738754678,135.162904142211 34.2121409032373,135.162616135067 34.2131237855764,135.162354128904 34.2140076796957,135.163191050544 34.2141656808295,135.164365856843 34.2169323946867,135.163178891017 34.2190481285219,135.161066074617 34.219082076719,135.162128943605 34.2202399699249,135.162165915966 34.220981886875,135.164278680816 34.2225148615066))

更に以下のCSVに変換

NAME,GEOM
店舗,"POLYGON((135.164278680816 34.2225148615066,135.164253691228 34.2222647892155,135.164065751247 34.2209399347514,135.166490542546 34.2208400011058,135.167490488286 34.2198321377673,135.167478515946 34.2190232289557,135.166240626338 34.2189572083141,135.16444085933 34.2166574274783,135.164740868754 34.2155735568347,135.165003879174 34.2145576776619,135.163853988215 34.214298680841,135.162641134789 34.2130657927005,135.162741137292 34.2127238336321,135.162841140057 34.2123738754678,135.162904142211 34.2121409032373,135.162616135067 34.2131237855764,135.162354128904 34.2140076796957,135.163191050544 34.2141656808295,135.164365856843 34.2169323946867,135.163178891017 34.2190481285219,135.161066074617 34.219082076719,135.162128943605 34.2202399699249,135.162165915966 34.220981886875,135.164278680816 34.2225148615066))"

QGISを開き「レイヤ」-「レイヤの追加」-「デリミテッドテキストレイヤの追加」を選択し作成したCSVを開く

座標系を聞かれるので旧日本測地ならばEPSG:4301を選択、世界測地ならばEPSG:4326を選択

以上でQGIS上で確認