「Windows」と一致するもの

開発環境の都合上、クロスドメインに対応しなければ行けませんでした。
Google Chromeの設定で「--disable-web-security」オプションを利用していましたが、2016年3月になってから利用できなくなりました。
これが利用できないと開発が進まないので調査したところ、Chrome 49に更新されたことが原因というオチでした…

Stack Overflow - cors - Disable-web-security in Chrome 48 and 49 beta
Issue 575690 - chromium - `--disable-web-security` works with an empty value for `--user-data-dir` - Monorail

上記サイトを確認する限り、--disable-web-security」を使用する場合、「--user-data-dir」オプションを併用する必要があるようです。
「--user-data-dir」はChromeのキャッシュやブックマーク等、ユーザデータフォルダを指定するオプションです。
仕事用Chromeとプライベート用Chromeを使い分けたい場合等に便利です。

ITmediaエンタープライズ - 3分LifeHacking:“遊び用ちょろめ”と“仕事用Chrome”を使い分ける

それで実際の設定ですが、Windows 7、8、8.1等であれば以下のような設定にすれば以前と同じ動きになります。
chrome.exe --user-data-dir="%UserProfile%\AppData\Local\Google\Chrome\User Data" --disable-web-security
※「%UserProfile%\AppData\Local\Google\Chrome\User Data」が元々のユーザデータディレクトリです。

Chrome 49以降で--disable-web-security」を利用する場合に、「--user-data-dir」オプションの指定を必須にしたのがバグなのか仕様なのかは定かではありませんが、セキュリティ強化の一環と考えると仕方ないのかなと説明が付きそうです。。

--disable-web-security」オプションはクロスドメイン対策の機能を無効にするので、本来ならば発生しないクロスサイトスクリプティングやクロスサイトリクエストフォージェリが発生する穴を空けることになります。
--disable-web-security」オプションを付ける場合、「--user-data-dir」オプションによりユーザデータディレクトリを別の場所に指定することで、悪意のあるユーザの仕掛けにより情報を窃取される可能性が減るのではないかなと思いました。

しかしながら、突然のセキュリティ対策オプションの予告ない変更は困りますね。
開発が大詰めになってるときに、今回の事象が発生し、大慌てでした。
そんなときリアルタイムでつぶやきがされ、情報が展開されるTwitterは便利だと思った次第です。

他の慌ててる人たちのご参考になれば幸いです。

前の記事の続きとして。

iPhoneとAndroidのスマホ2台持ちで悩むのが、電話帳の同期です。
以前は、auデータお預かりアプリを利用して、Googleコンタクト→Android本体連絡先→Androidデータお預かりアプリバックアップ→iPhoneデータお預かりアプリリストアの順でデータを移行させてました。
しかし、auデータお預かりアプリの仕様の為、メールアドレスが5件以上存在する連絡先は最初の5件のみに限定されて移行される為、その条件の連絡先は個別にデータ移行(QRコードやvCard)が必要でした。
もっと簡単な方法がないか調べてみると、すぐに情報が見つかりました。

それマグで! - Gmailの連絡先とiPhoneを同期する(cardDAV)

iCloudの連絡先を無効にし、GoogleコンタクトにCardDAVで接続すれば問題なし(≧∇≦)…っとそうは問屋が卸してくれませんでしたorz
CardDAVで接続してみても、全然アドレス帳が同期されませんでした。
原因を調査したところ、意外に厄介なものでした…

週刊アスキー - AndroidとWindowsのGoogle連絡先をiPhoneとMacでも完全同期

GoogleコンタクトからCardDAVで同期されるのは「Myコンタクト」に設定されている連絡先レコードのみだそうです。
しかも、「Myコンタクト」に登録されている連絡先は同期されても、Googleコンタクトで分類したグループの情報は連携されないとな…
見つけやすくする為に家族、学校別、店、メルマガ等で連絡先を分類しているのに、「Myコンタクト」でごちゃまぜになって同期されたら何の意味もないですよね。
どうにかしてGoogleコンタクトの連絡先とグループを同期する方法がないか調べてみましたが、情報が見つからず…
結局、以下の有料アプリを利用し、iCloud連絡先を利用しつつ、Googleコンタクトの情報を同期するしか方法がないとの結論に至りました。

Apple App Store - Google Gmail用コンタクト・シンク (Contacts Sync for Google Gmail with Auto Sync)

日本語には対応しているものの機械翻訳なのであやしい日本語になっていますが、使用に困るほどの文面ではありません。
このアプリを使用することで、GoogleコンタクトからiCloud連絡先、iCloud連絡先からGoogleコンタクト、または双方向の同期を実現してくれます。
また、GoogleコンタクトとiCloud連絡先の差分から同期の可否を決めることも可能です。
アプリを落とした時点では、最大40件までの同期に限定されていますが、動作確認で問題がなければ、アプリ内課金をし、同期件数を無制限にしましょう。
アプリ内課金のメニューは以下の通りでした。

1. 無制限の同期を:¥360
2. 自動同期:¥120
3. より大きな貢献をする:¥600
4. 貢献する:¥360

何気なくは分かるものの…いや、ここまで来ると何が何だか分からない(笑)
Contacts Sync for Google Gmail with Auto Sync(英文)を見たら意味が推測できました。

1. Unlimited Syncs:$2.99
2. Automatic Contact Syncing:$0.99
3. Make Larger Contribution:$4.99
4. Make Contribution:$2.99

ハイカラな訳し方をすると以下の様な文面でしょうか?

1. 無制限同期:¥360
2. 連絡先自動同期:¥120
3. 寄付(大):¥600
4. 寄付(小):¥360

最低限必要となるアプリ内課金は「1.無制限同期」です。
私は利用してませんが、GoogleコンタクトとiCloud連絡先を定期的に同期させたい場合には「2.連絡先自動同期」も購入しましょう。
このアプリは非常に便利だと感動された方は、「3.寄付(大)」、「4.寄付(小)」、またはその両方も購入してあげましょう。

そんなわけで、若干面倒な作業が残ったものの、Googleコンタクトを主たる電話帳としてiPhoneもAndroidも利用する方法に変更することができました。
いつか、CardDAVでグループも同期される日が来ることを願いつつ、自分への備忘録として、そして皆様のご参考情報としてこの記事を書き残したい思います( ̄∇ ̄)ノ♪

数年前から変わったこと

数年前に比べ、世の中で何が変わったか考えてみました。

携帯端末は携帯電話ではなくタッチパネル式のスマホが当たり前になった。
携帯端末の通信が地下鉄の駅間でも可能になった。
自宅で録画したTV番組を外出先で見ることが可能になった。
スマホでバーコードを表示し、ポイントカード代わりにできるアプリの公開が増えた。
おサイフケータイに対応しているポイントカードや電子マネーサービスが増えた。
Windows XPがサポート終了。
ダイヤルアップ、ISDN、ADSLを聞かなくなり、FTTH(光通信)やモバイルルータが普及した。
.yokohamaみたいな不思議なTLD(Top Level Domain)が大量にできた。
WebサイトはHTMLタグから作るものではなく、ブログサービスを利用するのが当たり前になった。
音声認識(Google、Siri等)、音声合成(初音ミク等)の技術が使われるようになった。
Radikoサービス公開でノイズのないラジオを全国で聞けるようになった。
TVで「続きはWebで」とか「詳細は番組のサイトを」と言うのが当たり前になった。
MSN Messengerが終了し、SkypeがMicrosoftに買収された。
mixi、GREE、モバゲーが廃れる。
Twitter、LINE、Instagramが普及した。
SNSと言えばこれを使えば良いというサービスがなくなった。
スマホカメラでも十分と感じる人が増えた。
一眼レフデジカメにも動画撮影機能が付いた。
猫喫茶が普及し、飽和状態になった。
ネコノミクス(猫を出せば話題になったり買う人がいると認知された)。
訪日外国人が増えた。
ホテルの宿泊料が数年前に比べ1~3割高くなった。
LED照明が普及した。
新幹線が増え、それに伴い並行在来線が地方自治体に払い下げられた。
東京メトロ副都心線、上野東京ライン、おおさか東線等、新線開業や乗り入れにより利便性が向上した。
カーシェアリングが普及した。
車の自動ブレーキ機能が現実のものとなり、自動運転も技術的に可能になってきた。
コンセプト居酒屋が増えた。
ブラック企業という言葉が認知されるようになった。
個人情報漏洩した際の件数が膨大になった。
地方の商店街の廃れ具合が半端なくなった。
設備老朽化に伴いサービス終了、廃業、建て替えという話を聞くようになった。
会社でシンクライアントが普及してきた。
会社で固定電話が撤去され、FMC(社外でも内線番号で通話できる技術)が普及してきた。

書いてみると色々ありますよねΣ
数年前から変わったな~ということについて、皆様もどのようなものを思い浮かべますか?

Google Maps Android API v2のサンプルプログラム(Google Maps API Demos)をEclipseにインポートし、実機で動かそうとしてみたのですが、強制終了されてしまいました。
デバッグ実行してみたところ、以下のログがLocCatにはき出されていました。

02-09 11:32:59.657: E/dalvikvm(430): Could not find class 'com.example.mapdemo.BasicMapActivity', referenced from method com.example.mapdemo.MainActivity. 02-09 11:33:13.688: E/AndroidRuntime(430): FATAL EXCEPTION: main 02-09 11:33:13.688: E/AndroidRuntime(430): java.lang.ExceptionInInitializerError 02-09 11:33:13.688: E/AndroidRuntime(430): at java.lang.Class.newInstanceImpl(Native Method) 02-09 11:33:13.688: E/AndroidRuntime(430): at java.lang.Class.newInstance(Class.java:1409) 02-09 11:33:13.688: E/AndroidRuntime(430): at android.app.Instrumentation.newActivity(Instrumentation.java:1021) 02-09 11:33:13.688: E/AndroidRuntime(430): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1561) 02-09 11:33:13.688: E/AndroidRuntime(430): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663) 02-09 11:33:13.688: E/AndroidRuntime(430): at android.app.ActivityThread.access$1500(ActivityThread.java:117) 02-09 11:33:13.688: E/AndroidRuntime(430): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931) 02-09 11:33:13.688: E/AndroidRuntime(430): at android.os.Handler.dispatchMessage(Handler.java:99) 02-09 11:33:13.688: E/AndroidRuntime(430): at android.os.Looper.loop(Looper.java:123) 02-09 11:33:13.688: E/AndroidRuntime(430): at android.app.ActivityThread.main(ActivityThread.java:3683) 02-09 11:33:13.688: E/AndroidRuntime(430): at java.lang.reflect.Method.invokeNative(Native Method) 02-09 11:33:13.688: E/AndroidRuntime(430): at java.lang.reflect.Method.invoke(Method.java:507) 02-09 11:33:13.688: E/AndroidRuntime(430): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 02-09 11:33:13.688: E/AndroidRuntime(430): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 02-09 11:33:13.688: E/AndroidRuntime(430): at dalvik.system.NativeStart.main(Native Method) 02-09 11:33:13.688: E/AndroidRuntime(430): Caused by: java.lang.NoClassDefFoundError: com.example.mapdemo.BasicMapActivity 02-09 11:33:13.688: E/AndroidRuntime(430): at com.example.mapdemo.MainActivity.(MainActivity.java:97) 02-09 11:33:13.688: E/AndroidRuntime(430): ... 15 more
数時間悩んでやっと解決方法を見つけたのでメモしておきます。

・前提条件
以下のページを参考にEclipseへの準備を進めて下さい:
Debian GNU/Linux 3.1 on PowerMac G4 - Google Maps Android API v2 のサンプルを動かしてみたら...

・ここからが本題
前提条件のサイトを参考に設定したつもりだったのですが、上記ログがはき出され、にっちもさっちもいきませんでした。
ググってみたところ、英語ですが、良さそうなソースを見つけました:
Stack Overflow - Google Maps Android API v2 - Sample Code crashes

なるほど。
ざっくり解説しますと、以下の通りです。

1. Google Maps API Demos (MainActivity)に"google-play-services_lib"をインポートする。
[プロジェクト(MainActivity)]→[プロパティ(R)]→[Android]と進むと[Library]の項目があります。
[Add]ボタンを押下すると[Project Selection]画面が開きますので、"google-play-services_lib"を選択し、[OK]ボタンを押下して下さい。
設定後は[プロパティ: MainActivity]画面を閉じます。
※"google-play-services_lib"を[Javaのビルド・パス]から[クラス・フォルダー]として追加しても、上手く動かないようです。

2. "libs"フォルダを作成し、そこに"google-play-services.jar"と"android-support-v4.jar"を追加する。
Google Maps API Demosには元々libsディレクトリがないようですので、[プロジェクト(MainActivity)]→[新規(W)]→[フォルダー]で[新規フォルダー]画面を開きます。
[フォルダー名(N):]に"libs"を入力し、[完了(F)]ボタンを押下します。
"libs"フォルダを選択し、[インポート(I)...]→[General]→[ファイル・システム]から[次へ(N) >]ボタンを押下します。
[インポート]画面の[次のディレクトリーから(Y):]"に"/extras/google/google_play_services/libproject/google-play-services_lib/libs"を指定し、[開く]ボタンを押下します。
"google-play-services.jar"のチェックボックスをチェックし、[完了(F)]ボタンを押下します。
同様の手順で、"android-support-v4.jar"も追加します。
"android-support-v4.jar"は、Windowsでは"/extras/android/ support/v4"に、Mac OSでは"/extras/android/compatibility/v4"に存在します。

3. 外部Jarとして"google-play-services.jar"と"android-support-v4.jar"を取り込む。
[プロジェクト(MainActivity)]→[プロパティ(R)]→[Javaのビルド・パス]と進むと[ライブラリー(L)]タブがあると思います。
その後、[外部 Jar 追加 (X)...]ボタンを押下し、[JARの選択]画面からEclipseのWorkspaceにあるGoogle Maps API Demos (MainActivity)の"libs"フォルダに進みます。
"google-play-services.jar"と"android-support-v4.jar"を選択し、[開く]ボタンを押下すれば完了です。
設定後は[プロパティ: MainActivity]画面を閉じます。

4. "MainActivity"と"google-play-services_lib"のクリーンビルド
[Eclipse]→[プロジェクト(P)]→[クリーン(N)...]から[クリーン]画面を開き、[以下で選択したプロジェクトをクリーン]ラジオボタンを選択し、"MainActivity"と"google-play-services_lib"のチェックボックスにチェックします。
[ビルドを即時に開始(B)]のチェックボックスをチェックし、[選択したプロジェクトのみビルド(P)]ラジオボタンを選択の上、[OK]ボタンを押下します。
※Eclipseで"/google-play-services_lib/bin/google-play-services_lib.jar"が存在しませんという警告が表示されていたのですが、クリーンビルドすることによって解決しました。

以上の作業が終われば、Eclipseで表示されまくりだった警告行も消え、すっきりしているのではないかと思います。
後は、Eclipseから実行すれば、USBで接続された実機でGoogle Maps API Demosが実行されるかと思います。

以上、備忘録でした( ̄∇ ̄)ノ♪

WindowsやらMacやらノートPCやらと端末が増えてきて困ってきたのが通信環境。
家庭ではWiFi(無線LAN)ルータがあれば楽になるのですが、そうも行かないのが外出先。

例えば、ホテルに備え付けのLANケーブルをMacBookに接続しても他の無線LAN(WiFi)端末はインターネットに通信できません。
その様な場合でも、Mac端末をインターネットと接続し、他の端末をアドホックでMac端末とWiFi通信させることで、全ての端末でインターネット通信する方法があります。

Mac OS Xを使ってイー・モバイルなどの通信環境をみんなで共有する方法

上記、有線LANケーブルを使用する場合、上記記事だと異なる場所だけを解説します。

3.「共有する接続経路」で emobile 等のワイヤレスインターネット接続を選ぶ。(例では I-O DATA USB2-PCADPG 経由で Softbank モバイルのカードにつないでます)
3.「共有する接続経路」で「Ethernet」を選ぶ。

Macを使用して、こんなに簡単にインターネット通信を共有できたんですね(´∀`)
そんなわけで、ちょっと豆知識でした( ̄∇ ̄)ノ♪