tag:blogger.com,1999:blog-59145349257175545192024-03-14T17:57:57.432+09:00琴線探査感動するもの、気になるものをどこまでも探索するブログjunkorohttp://www.blogger.com/profile/15432737623834607140noreply@blogger.comBlogger3862125tag:blogger.com,1999:blog-5914534925717554519.post-90921196132494522092019-02-28T18:18:00.000+09:002019-02-28T18:18:29.693+09:00macOS MojaveでGoogle Play Musicの制御にメディアキーが使えない場合の対処macOS MojaveでGoogle Play Musicの制御にメディアキーが使えない場合は、
システム環境設定>セキュリティとプライバシー>プライバシー>アクセシビリティ
でChromeにコンピュータの制御の許可を与えてやると動くようになるよ。junkorohttp://www.blogger.com/profile/15432737623834607140noreply@blogger.com0tag:blogger.com,1999:blog-5914534925717554519.post-32731560586351350852017-11-04T15:13:00.000+09:002017-11-07T12:33:40.033+09:00iPhoneXかどうかをJavaScriptで判断するには?まずUserAgentで判別できないかと考えた。しかし、
mozilla/5.0 (iphone; cpu iphone os 11_1 like mac os x) applewebkit/604.3.5 (khtml, like gecko) mobile/15b93
という感じなので無理。
cordova-plugin-deviceでもダメ。
で、世間ではどのような議論が行われているかというと、
ios - Detect if the device is iPhone X - Stack Overflow
画面の幅高さで判別しろとか、ネイティブ側で
struct utsname systemInfo;
uname(&systemInfo);
的なことをしろとか、safe-area-inset-*があるかどうかで判別しろとか、そういった議論が行われている。
junkorohttp://www.blogger.com/profile/15432737623834607140noreply@blogger.com0tag:blogger.com,1999:blog-5914534925717554519.post-88451862786948091262016-08-18T12:47:00.000+09:002016-08-18T12:47:53.017+09:00CordovaアプリでAppStoreのストア情報の「言語」に「日本語」を追加するには?CordovaアプリをAppStoreに提出すると、何もしなければストア情報の「言語」が英語になる。
気づいてはいた。実際のアプリは日本語のみ対応なので、せめて「日本語、英語」と表示されるようにすべきだ。しかし、そんなところを気にするユーザーはいないだろうと思って解決を先送りにしていたら、ユーザーから指摘を受けた。
やっぱりちゃんと解決しないとダメだと思い直したが、どうすればいいのか?色々と調べたけど、ぴったりな情報は無かったのでログしておこうと思う。
XcodeでFile>New>File...
ダイアログが出るので iOS>Resource>Strings File>Next
ファイル保存ダイアログが出るので「Localizable.strings」という名前でResources配下に保存する。
ファイルインスペクター(Xcodeのプロジェクトナビゲーターでファイルを選択junkorohttp://www.blogger.com/profile/15432737623834607140noreply@blogger.com0tag:blogger.com,1999:blog-5914534925717554519.post-1433702167224104822016-03-17T13:23:00.000+09:002016-03-17T13:27:53.517+09:00AppleのAppStoreにCordovaアプリを提出してリジェクトされたら…これをチェック!AppleのAppStoreにCordovaアプリを審査に提出したらリジェクトを食らった。曰く。
During review, your app failed to launch on iPad running iOS 9.2.1 and iPhone running iOS 9.2.1 on both Wi-Fi and cellular networks. Specifically, when we selected the application on the Home screen, the app displayed a launch image then quit unexpectedly. This may be because iOS 9 uses a watchdog timer for applications; if an application takes junkorohttp://www.blogger.com/profile/15432737623834607140noreply@blogger.com0tag:blogger.com,1999:blog-5914534925717554519.post-31265177665913460492016-03-15T15:53:00.000+09:002016-03-16T10:52:19.463+09:00iOSアプリ申請・公開手順まとめ 〜2016年3月版〜iOSアプリの申請・公開手順については、すでに様々な人々がブログ等でまとめてくれているが、代表的な記事でもすでに少々古くなっていることを否めない。
そこで、2016年3月版として改めて書いておくことにはそれなりの意味があると思うのでログを残しておこうと思う。
記事を書くにあたり、こちらのサイトを大いに参考にさせて頂いた。
よく分かる!iOS アプリのリリース手順のまとめ | Developers.IO
前提として、アプリの開発が済んでいることとする。
1. Production用のCertificateファイルの作成
iOS Certificates - Apple Developer
にアクセス。作業は全てSafariで行った方が良い。
「+」ボタンをクリック。
「App Store and Ad Hoc」を選択してスクロールして「Continue」をクリックjunkorohttp://www.blogger.com/profile/15432737623834607140noreply@blogger.com0tag:blogger.com,1999:blog-5914534925717554519.post-19795984563547435742016-02-26T17:28:00.000+09:002016-03-08T16:39:13.750+09:00【Ionic(Cordova)】Telerik版WKWebViewのpluginでLocal Storageにデータを保存できるようにするには?Ionic(Cordova)でWKWebViewを使う時にハマるのがLocal Storageの扱い。アプリを起動するたびにLocal Storageに保存したデータがリセットされるという問題だ。
<!--
---- 16.03.07追記
iOSのplatformを ionic platform add ios@4.1.0 で作りなおした上、cordova-plugin-wkwebview-engine 1.0.2をインストールしたところ、Local Storageの問題は解決されたようだ\(^o^)/
----- ここまで
-->
公式のApache版 はこのように解決できる。
iPhoneアプリ開発メモ: WKWebViewでの環境構築がついに発表される
iPhoneアプリ開発メモ: RPGツクールMVでiPhoenアプリビルド最新のcordovaでWKWebViewを使うjunkorohttp://www.blogger.com/profile/15432737623834607140noreply@blogger.com0tag:blogger.com,1999:blog-5914534925717554519.post-67669733422569547182016-02-19T12:11:00.002+09:002016-02-19T12:22:29.517+09:00AmazonのAppStoreで位置情報を使うアプリの対応端末を増やす方法最近AmazonのAppStoreはパーミッションに関する制約が厳しくなり、これまで何も言われなかったアプリが警告扱いになり、ついに非対応ということになってしまった。
問題のアプリは位置情報を扱うアプリなのだが、Amazonの端末はGPSを搭載している端末が少ないので、このままでは対応端末が非常に限られてしまう。
改善すべきはAndroidManifest.xmlに設定しているパーミッションの指定。現在、位置情報関連のパーミッションは次の2つ。
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />junkorohttp://www.blogger.com/profile/15432737623834607140noreply@blogger.com0tag:blogger.com,1999:blog-5914534925717554519.post-52580526777873457662015-10-08T12:40:00.000+09:002015-10-08T12:40:18.228+09:00Swift2で二地点の緯度・経度からその距離を計算するには?二地点の緯度・経度からその距離を計算する(日本は山だらけ〜)
のJava版をSwift2に移植しました。数学は分かりません。理論も分かりません。でもSwiftとJavaは分かるので移植はできるのです(^^);
オリジナルがMITライセンスなので、このコードもリスペクトを込めてMITライセンスとします。
//
// GeoUtil.swift
//
import Foundation
/**
* 二地点の緯度・経度からその距離を計算する(日本は山だらけ〜) - http://yamadarake.jp/trdi/report000001.html
*/
@objc(GeoUtil) class GeoUtil: NSObject {
static let BESSEL_A: Double = 6377397.155;
static junkorohttp://www.blogger.com/profile/15432737623834607140noreply@blogger.com0tag:blogger.com,1999:blog-5914534925717554519.post-75895283223787907592015-10-08T12:11:00.000+09:002015-10-08T12:25:22.840+09:00iOS9で位置情報を使う定期バックグラウンド処理をする場合のバッテリー消費を抑えるには?iOSでのバックグラウンド処理の制限
iOSでのバックグラウンド処理は非常に制限されているが、いくつか方法はある。しかし、「定期的にバックグラウンド処理をする」という条件になるとかなり限られる。
どのような方法を選択できるかはアプリのタイプや目的によるが、アプリによらず選択できるであろう方法は少なくとも2つある。
Background fetch
iOSがアプリの利用頻度などから「非定期に」バックグラウンド処理を動作させるので使えない。
Remote Notifications
サーバーからのNotificationが届くタイミングでバックグラウンド処理を起動する方法だが、サーバーサイドの実装が必要な上、Notificationが届くタイミングはまちまちで、最悪の場合は届かないこともあるので、苦労の割に確実性に欠ける。
AndroidのAlarmManagerの代替は無いjunkorohttp://www.blogger.com/profile/15432737623834607140noreply@blogger.com0tag:blogger.com,1999:blog-5914534925717554519.post-49619407876146781662015-09-15T13:56:00.001+09:002015-09-16T13:36:48.432+09:00SwiftでCordova(ionic)のpluginを開発するには?Swiftでcordovaのプラグインを開発することはできるのだろうか?
このあたりを見ると開発できそうだ。
Chris Dell - Software Developer :: Writing an iOS Cordova plugin in pure Swift
How to write Cordova plugin in Swift? - Stack Overflow
やってみよう。
今回はChrisさんのコードを参考に、HTMLからネイティブに小文字のメッセージを送って大文字変換されたメッセージを受信するというサンプルを作る。これが完成形。
ビルドシステムはionicを使うが、プラグイン部分の開発はcordovaでも通用するはず。
まずはblankプロジェクトを作ろう。
$ ionic start CDVEchoPlugin blank
junkorohttp://www.blogger.com/profile/15432737623834607140noreply@blogger.com0tag:blogger.com,1999:blog-5914534925717554519.post-11093323808689841282015-08-26T17:06:00.000+09:002015-08-26T17:06:17.096+09:00これがAngularJSの$apply()や$digest()が低速な理由のひとつか?昨日書いた記事 「琴線探査: Dr. GlebのAngularアプリ最適化TIPSまとめ」 に、try-catchがあるとV8では最適化されないため処理が遅くなると書いた。
今日は自分で書いたアプリをプロファイルしてみた。このように、$apply()や$digest()に相当な時間がかかっていることが分かった。
これは予想通りだったが、驚いたのは$apply()や$digest()でtry-catchを使っているらしいことだ。
「Not optimized: TryCatch Statement」とツールチップが出ている。ひょっとすると、これが$apply()や$digest()が低速な理由のひとつなのかもしれない。
だとすると、かなり根本的なレベルで高速化できていないことになる…内部的にtry-catchを使わないようにできないのかなぁ(´・ω・`)junkorohttp://www.blogger.com/profile/15432737623834607140noreply@blogger.com0tag:blogger.com,1999:blog-5914534925717554519.post-54762144157112179732015-08-25T16:49:00.000+09:002015-08-26T17:11:27.184+09:00Dr. GlebのAngularアプリ最適化TIPSまとめDr. Glebのブログ記事 Improving Angular web app performance example. | Better world by better software を簡単にまとめておこうと思う。
try-catchはできるだけ使わない
V8ではtry-catchを使った処理は最適化されないので、特にループ処理ではできるだけ使わないようにする。Primesの例ではtry-catchを無くしただけで全体の処理は2倍以上、メソッド単体では200倍近く高速化している。
追記15.08.26:$apply()や$digest()でtry-catchが使われていることが判明(ノ∀`)
琴線探査: これがAngularJSの$apply()や$digest()が低速な理由のひとつか?
ダイジェストサイクルをできるだけ速くする
$scope.$apply()junkorohttp://www.blogger.com/profile/15432737623834607140noreply@blogger.com0tag:blogger.com,1999:blog-5914534925717554519.post-32441496516977332015-08-13T17:48:00.000+09:002015-08-13T17:56:35.404+09:00AngularMaterial VS Polymer - UI部分だけそれぞれで実装・比較して分かったことあるWEBアプリをAngularMaterialを使って実装しているが、最近Polymerが1.0になったので、実験的にUI部分をPolymerで実装し直して比較してみることにした。
ここに分かったことをまとめておこうと思う。
UIコンポーネントの数
AngularMaterialの方がベーシックに使えるものが多い。最近ではFAB Speed Dialなどのコンポーネントが増え、益々充実してきている。Polymerにもgoogle-mapなどのコンポーネントが増えてはいる。
UIの動作速度
Polymerの方が速い。PolymerはアニメーションにWebAnimationを使用しているが、AngularMaterialはngAnimateに依存しているからだと思われ。
レイアウトのしやすさ
Polymerの方が分かりやすい。Polymerではvertical, junkorohttp://www.blogger.com/profile/15432737623834607140noreply@blogger.com0tag:blogger.com,1999:blog-5914534925717554519.post-62668117999487075292015-08-06T14:53:00.000+09:002015-08-06T14:53:27.788+09:00CSSのtranslate3dをパースして数字の配列にするには?CSSのtranslate3dは例えば translate3d(5, -10, 0) のような文字列になっているが、このままでは計算するのに使いにくい。
そこで、これをパースして数字の配列にするにはどうすればいいだろう。例えば、このような正規表現を使うというのはどうでしょう?
/**
* CSSのtranslate3d文字列を数字の配列に変換して返す
*/
function parseTranslate3d(string) {
var array = string.replace('translate3d', '').match(/-?[\d\.]+/g);
for (var i = 0; i < array.length; i++) {
array[i] = Number(array[i]);
}
return array;
}
junkorohttp://www.blogger.com/profile/15432737623834607140noreply@blogger.com0tag:blogger.com,1999:blog-5914534925717554519.post-19090707293535085332015-07-11T08:15:00.001+09:002015-07-11T08:15:06.352+09:00ionicでcrosswalkのビルド後のapkがarmv7とx86に分かれた件最新版のionicでは、crosswalkのビルド後のapkがarmv7とx86に分かれるようになった。
これによって、armv7とx86両対応のために40MB以上になっていたアプリサイズが20MB程度まで軽量化された。
喜ばしい事ではあるけれど、リリース時にとても混乱してしまった。
リリーススクリプトを書いているのだけど、これまでは一つのapkにサインすればよかったものが二つのapkにサインする必要がでてきて、スクリプトがまともに動かなくなってしまったからだ。
しかし、このことに気づいた後は特に問題は無かった。
Google Playでは、すでに一つのリリースで複数のapkをアップロードできるようになっているので全く心配は無い。junkorohttp://www.blogger.com/profile/15432737623834607140noreply@blogger.com0tag:blogger.com,1999:blog-5914534925717554519.post-42782019000759995302015-07-08T13:53:00.000+09:002015-07-08T13:53:44.854+09:00ionicで最新版のcrosswalkをインストールする方法ionicで最新版のcrosswalkをインストールする方法について。
Crosswalkのstableな最新版はここでチェックできる。
現在「14.43.343.17」が最新版だが、「ionic browser ls」すると
ionicでは14.x系はcanaryになっていることがわかる。
ここに最新版を追加するにはionicのbrowser.jsというスクリプトを編集する。
$ sudo vi /usr/local/lib/node_modules/ionic/node_modules/ionic-app-lib/lib/browser.js
Browser.crosswalkVersions = [
・・・・
{
version: '12.41.296.5',
publish_date: '2015-03-05 13:19'
},
{
//独自に追加
junkorohttp://www.blogger.com/profile/15432737623834607140noreply@blogger.com0tag:blogger.com,1999:blog-5914534925717554519.post-63759134583128435172015-06-27T11:04:00.000+09:002015-06-27T11:04:32.887+09:00Angular2.x系が出るまで1.x系でES6やTypeScriptと共存させる方法についてのビデオAngular2.x系が出るまで1.x系でES6やTypeScriptと共存させるにはどうしたらよいのか?
この疑問に、このビデオ「Getting Ready for Angular 2.0」がある程度答えてくれていたのでメモ。
55:34あたりからThe question is…「But What Do We Do Now?」と始まる。そう。そこが聞きたかった!
ES6って何となく全く違う言語のような気がしていて、一体どんな風に書くの?と思っていた。
しかし、よくよく考えてみるとES6はES5の機能を受け継いでいるので、ES6で書いてもAngular1.x系は動くのである。というか、「ES5でES6の拡張機能が使えるようになったと考えた方がいい」ということに気づかされた。
例えば、これがおなじみの1.x系でのコントローラーの書き方だ。
そして、ES6と共存させて書くjunkorohttp://www.blogger.com/profile/15432737623834607140noreply@blogger.com0tag:blogger.com,1999:blog-5914534925717554519.post-64806967384239043522015-06-12T16:40:00.001+09:002015-07-11T08:04:11.784+09:00ionicでインストールするcrosswalkを選択できない件追記15.07.11:最新版のionic(1.6.1)では「ionic browser add crosswalk@バージョン」で指定通りインストールできるようになった。この記事も合わせて読むとionicの更新に依存することなくcrosswalkの最新版をインストールできるようになる。
琴線探査: ionicで最新版のcrosswalkをインストールする方法
----
最近ionicのCLIが1.5.0にバージョンアップしたのだが、その後platform/androidを削除してcrosswalkを再インストールしたら、localStorageに保存したはずの値がアプリの再起動時に保存前の状態に戻っているという動作になってしまった。
ChromeのDevToolsでは、crosswalkのバージョンは42.0.2311.135となっている。以前のバージョンが何だったのかは覚えていjunkorohttp://www.blogger.com/profile/15432737623834607140noreply@blogger.com0tag:blogger.com,1999:blog-5914534925717554519.post-78068793291020577942015-06-11T17:44:00.000+09:002015-06-11T17:44:12.532+09:00ionic(cordova)のカスタムプラグイン開発のワークフローを構築するカスタムプラグイン開発のワークフローが必要だ!
ionic(cordova)のカスタムプラグインを開発するのはそれほど難しいことではない。しかし当然の事ながら、プラグインの開発は試行錯誤を重ねる必要がある。そのための円滑なワークフローを構築するのにかなり苦労したので、まとめておきたいと思う。
ここでは、ionic側からカスタムプラグインを叩いてネイティブのノーティフィケーションを表示するサンプルを作ろうと思う。とりあえずAndroid用を開発することにする。
ionicプロジェクトの作成
まず、ionicプロジェクトを作り、CordovaLib-debug.aarを作るため一度ビルドする。
AndroidStudioプロジェクトの作成
AndroidStudioで~/Documents/git/customplugin-androidに、パッケージ名junkorohttp://www.blogger.com/profile/15432737623834607140noreply@blogger.com0tag:blogger.com,1999:blog-5914534925717554519.post-89530057857605849672015-06-02T11:03:00.001+09:002015-06-11T10:59:06.910+09:00コンテンツのレーティング(IARC)が理由でアプリが不承認(リジェクト)される件 @ Google PlayGoogle Playにて、コンテンツのレーティング(IARC)が理由でアプリが不承認(リジェクト)された!不承認を通知するメールにはこんな文言が…
不承認の理由: Google Play コンテンツ レーティング ポリシーへの違反。
提出したアプリの性質からして、どう考えてもリジェクトされる理由が分からなかった。こんなことは初めてだ。しかし、しばらくすると自動的に承認された(^^);
原因は、「IARC認定」(Certificate ID)が得られる前にアプリを提出したことだと分かった。
IARCのコンテンツレーティング認定アンケートなど、アプリの掲載情報を入力すると提出可能になる。
しかし、実際問題としてはアンケートに答えるだけではダメで、IARCからCertificate IDのメールが来て、Google Play Developer Consoleが次のような状態junkorohttp://www.blogger.com/profile/15432737623834607140noreply@blogger.com0tag:blogger.com,1999:blog-5914534925717554519.post-40216444860420666642015-05-13T11:10:00.003+09:002015-05-13T11:10:33.678+09:00脱jQueryするにはdocument.querySelector()もあるけど状況どう?AngularJS内蔵のjqLiteを使うことにしたが、DOMElementを取得するのにdocument.getElementById()というのは使いにくい場合もある。
ところで、jQueryライクなものとしてdocument.querySelector()もあるけど、状況はどうなのか?と。
Can I use... Support tables for HTML5, CSS3, etc
な〜んだ。全然大丈夫じゃん!なら、もはやjQueryも必須ではないし、getElementById()も要らないじゃん!と思ったが…
document.querySelector - Web API インターフェイス | MDN
【訳注: 上記ではクラスセレクタを用いた検索を例示していますが、この様な単発のクラス名の場合は getElementsByClassName() メソッドを用いたjunkorohttp://www.blogger.com/profile/15432737623834607140noreply@blogger.com0tag:blogger.com,1999:blog-5914534925717554519.post-80090444596332274322015-05-13T10:37:00.000+09:002015-05-13T10:37:41.833+09:00angular.element()のjQueryを読み込んだ場合とそうでない場合(jqLite)の動作の違いできるだけページを軽量化するためにjQueryを読み込まないようにしようと思った。しかし、jQueryは便利なので捨てがたいなと思っていた。そんな時、angular.element()というメソッドがあることに気がついた。
AngularJS: API: angular.element
AngularJSは内部でjqLiteというjQueryのサブセット版を持っていて、angular.element()はそれを使ってjQueryのオブジェクトを返してくれるらしい。
ただ実際に使ってみると、jQueryを読み込んだ場合とそうでない場合で動作が違うのでハマった。
jQueryを読み込んでいる場合はこのように#targetを取得できるが、そうでない場合、つまりjqLiteのみの場合は取得できない。
var $elm = angular.element('#target');
junkorohttp://www.blogger.com/profile/15432737623834607140noreply@blogger.com0tag:blogger.com,1999:blog-5914534925717554519.post-72464612015759949372015-05-05T16:14:00.000+09:002015-05-05T16:19:50.932+09:00ionicプロジェクトのsplash.pngを自動でリサイズしながら9-patchする「make-9patched-splash-ionic」先日、nodejsで9-patch画像を自動生成する方法について書いた。
琴線探査: nodejsで9-patch画像を自動生成する「FourSide1px9patcher」
その後、このコードを使いやすいようにnodeモジュール化した。
junkoro/four-sides-1px-9patcher
ここからが本番。ionicプロジェクトでsplash.pngを自動的にリサイズしつつ9-patchするコードを書くときがキタ(・∀・)!!
すでにnodeモジュール化して公開済み。
junkoro/make-9patched-splash-ionic
インストール方法やコード内容についてはgithubに譲るとして、ここでは開発時に困ったことについて書いておきたいと思う。
9-patchについては開発済みだったので何の問題も無かったが、画像のリサイズが困った。junkorohttp://www.blogger.com/profile/15432737623834607140noreply@blogger.com0tag:blogger.com,1999:blog-5914534925717554519.post-42132310711805551072015-05-03T17:25:00.000+09:002015-05-05T16:20:58.457+09:00nodejsで9-patch画像を自動生成する「FourSide1px9patcher」
h2 {
font-size: 20px;
font-weight: bold;
}
追記15.05.05:使いやすいようにnodeモジュール化した。
junkoro/four-sides-1px-9patcher
9-patchツールの現状 〜 開発意図前から9-patchを作るのは面倒だし問題だと思っていた。そこで改めて現状を調べてみたが、やはり9-patchを作るには
・Android SDKのdraw9patch
・Android Asset Studio - Simple Nine-patch Generator
・Eclipseプラグイン「Draw 9-patch Tool」
・Fireworksなど汎用の画像編集ソフトを使う
という感じ。nodejsで、特にgulpで9-patchを自動化できるツールが無いか探したが、これくらい。
gulp-9-patchjunkorohttp://www.blogger.com/profile/15432737623834607140noreply@blogger.com0tag:blogger.com,1999:blog-5914534925717554519.post-54227660491783531342015-04-05T18:42:00.001+09:002015-04-05T18:42:54.356+09:00迫り来る電子の声と人形に宿った凄まじい情念 〜 映画「ボーカロイドオペラ葵上with文楽人形」@アミューあつぎ映画.comシネマ映画「ボーカロイドオペラ葵上with文楽人形」 を地元の映画館「アミューあつぎ映画.comシネマ」に見に行ってきた。
動機
一つの理由は、アミューあつぎ映画.comシネマの副支配人でおられる杉本穂高さんのこの記事を見たから。
「ボーカロイド™ オペラ 葵上 with 文楽人形」人ならざるものの魂の躍動 | 杉本穂高
もう一つの理由は、なぜか分からないけれど以前からアンドロイド的なものが気になっているから。
古くはbjörkの「all is full of love」。
近年では、冨田勲×初音ミク「イーハトーヴ交響曲」とか、オリエント工業のラブドール展とか、平田オリザ・石黒浩のアンドロイド演劇。
これらの作品には根源的に共通する何かがあるはずだと思うのだけど、いまだにそれが一体何なのか分からないので、今度こそハッキリさせよう!と。
「葵上」とjunkorohttp://www.blogger.com/profile/15432737623834607140noreply@blogger.com0