はじめに
映画サマーウォーズで健二が夏希先輩の誕生日を聞いて曜日を即座に言い当てた曜日当てを実現するアプリを作りました。
健二と同じことを再現できるアプリです。
日付から曜日を算出するにはツェラーの公式(モジュロ演算)に沿った複雑な計算が必要になります。
※サヴァス症候群などの才気ある人はカレンダーを丸暗記して数秒で回答する人もいるようです
サマーウォーズのような誕生日(1900年代から2000年代限定であれば比較的暗算も簡単)当てや大分過去に遡った日付、未来の日付でも同様にアプリを使うと曜日を言い当てることができるようになります。
まずはAndroidアプリを作りました。iOSアプリも今後作る予定です。
アプリ詳細
アプリの詳細より引用
当アプリは、音声認識により日付から曜日当てを行うための(バイブでこっそり通知)お遊びアプリです。
アプリを実行して胸ポケットやズボンポケット、テーブルなどに置いて利用すると相手にわからずに曜日を知ることができます。音声認識は次の仕様になります
・文章に西暦(和暦は非対応)を話すと曜日を知らせます(画面表示・バイブ通知)
・音声認識は西暦の年月日が含まれる場合に曜日を返すが月日の場合は当年として曜日を知らせます
・バイブ通知は「日曜=1…土曜=7」として回数分のバイブで知らせます■音声認識の例
「2000年8月9日」→2000/8/9として曜日を算出
「えっと、2000年の8月の9日です」→2000/8/9として曜日を算出
「8月9日です」→2017/8/9として曜日を算出■音声認識レベル
機種によりマイクの認識レベルが良い場合、悪い場合があります。
※端末のマイクの感度については機種により設定が可能なため設定画面より設定ください
周りに雑音が多い場合は認識ができない場合がありますので、認識の程度を事前にご確認ください■設定項目
1)アプリを閉じても継続することが可能です(on/off切り替え)
2)ポップアップによるエラーや認識状態の表示切り替えが可能です(on/off切り替え)
3)バイブの強さを設定可能です
はじめに
Androidを起動中にどのアクティビティか確認するのに役立つコマンドをメモします。
adb shellのdumpsysコマンドを使うとシステムのダンプ(出力)できます。メモリの使用状況やネットワーク関係の情報など確認できます。
起動しているActivityを確認する
$ adb shell dumpsys activity | grep -B 1 “Run #[0-9]*:”
画面を開いてファイル名をすぐに知りたい時に便利です
はじめに
javaからkotlinに移行して学習する際にお世話になったサイトをメモしておきます。
個人アプリはjavaからkotlinに変換してるためAndroidに関するサイトも貼っておきます。qiitaユーザの意識が高すぎて負けそうです。
参考サイト一覧
公式リファレンス(日本語)
http://dogwood008.github.io/kotlin-web-site-ja/docs/reference/
リファレンスPDF
https://kotlinlang.org/docs/kotlin-docs.pdf
リファレンス日本語訳
http://qiita.com/dogwood008/items/6e8d3225ea9bb0fe3099
http://qiita.com/dogwood008/items/f4ceabd0b0d801fb3a9f
ガイドライン
まずは公式ページでコーディング規約、ガイドラインを把握しましょう
https://kotlinlang.org/docs/reference/
ベストプラクティス
https://blog.philipphauer.de/idiomatic-kotlin-best-practices/
日本語訳
http://qiita.com/takahirom/items/87d46150088aadccb481
文法関連
http://qiita.com/ssuzaki/items/0ab14379e2d30e807e9a
http://qiita.com/k5n/items/35e76d79ee9de4effb89
http://qiita.com/magie-pooh/items/b1179af28f5e0d50b62a
コンストラクタ
http://woshidan.hatenablog.com/entry/2015/10/30/083000
スコープ(apply/let/run/with)関連
http://tech.pjin.jp/blog/2017/04/10/kotlin_scoping_function/
http://qiita.com/ngsw_taro/items/d29e3080d9fc8a38691e
kotlinとjavaの混在関連
http://qiita.com/boohbah/items/167233c7eafe17f3150b
http://qiita.com/k5n/items/ceb1f921b27d62fc9fcb
コーディング規約関連
https://github.com/SmartTechVentures/kotlin-style-guide/
javaからkotlin変換でつまずきやすいところ
http://qiita.com/kazhida/items/09b9c7c95f7c43fc903a
http://qiita.com/HIkaruSato/items/4a5a7906761b19217370
kotlin勉強サービス
サンプル文や問題などあります。
https://kotlinlang.org/
はじめに
AndroidStudio3に変更してjenkinsでビルドした時に出たエラーについて、対応をメモします。
エラーメッセージ
「Could not find com.android.tools.build:gradle:3.0.0-alpha3」
ローカル環境でStudioでビルドすると問題なかったのですが、gradlewコマンドで実行するとエラーが出ます。
原因
もともとはライブラリ系はjcenterからダウンロードしていましたが、GoogleI/O2017以降に一部がmavenに変更されたようです。
そのため、mavenからダウンロードが必要なライブラリがある場合にエラーになっていたようです。
改善
プロジェクトbuildファイルへmavenリポジトリを追加して改善します
buildscript {
repositories {
jcenter()
maven { url “https://maven.google.com” } // 追加
}
dependencies {
classpath ‘com.android.tools.build:gradle:3.0.0-alpha3′
}
}
はじめに
FacebookのGraphAPIのバージョンの期限切れ予告メッセージが来ているため対応をメモします
2.3バージョンを使っている場合、期限がすぎると使えなくなりますよという知らせです。
「Reminder: Graph API v2.3 will be deprecated on July 10, 2017. Please use the API Upgrade Tool to understand how this might impact your app. For more details see the changelog. 」
GraphAPIの更新履歴と更新期限
更新履歴も期限も公式ページに記載していますので確認してください。
https://developers.facebook.com/docs/apps/changelog
大体リリースして2年で期限が設置されているため、毎回気を使って変更する必要がありますね。
アップグレードについて
WebもiOSもAndroidも比較的新しいバージョンから更新する場合はあまり修正する内容はありません。
たまにバージョンに寄り大幅に更新されている場合があります、と入ってもメジャーバージョンがアップグレードしている場合がほとんどです。
それ以外のマイナーバージョンのアップでは基本的にSDKを差し替えれば動作するはずですのでアップグレードの方法を公式ページで確認して更新してください。
iOS対応
iOSのFacebookSDK内でGraphAPIを使っています。どのバージョンを使っているかは更新履歴に記載されています。
現在のFacebookのSDKがGraphAPIのどのバージョンを使っているかを確認して、アップグレードしてください。
更新履歴
https://developers.facebook.com/docs/ios/change-log-4x
アップグレード方法
https://developers.facebook.com/docs/ios/upgrading-4x
Android対応
AndroidのFacebookSDK内でGraphAPIを使っています。どのバージョンを使っているかは更新履歴に記載されています。
現在のFacebookのSDKがGraphAPIのどのバージョンを使っているかを確認して、アップグレードしてください。
AndroidはGradleでインストールしている場合、Gradleファイル内でバージョンが確認できます。
更新履歴
https://developers.facebook.com/docs/android/change-log-4x
アップグレード方法
https://developers.facebook.com/docs/android/upgrading-4x
使っているGraphAPIの簡単な調べ方
SDKの更新履歴から追っていくのも大変ですね。Facebookの管理画面から対象のアプリを選択すると使用しているGraphAPIのバージョンがすぐに確認できます。
https://developers.facebook.com/apps/
アプリの詳細ページ
ここのバージョンを見たほうが早いですね。ここでGraphAPIのバージョンが2.3であれば期限があと少しで切れるのでアップグレードしてください。
2.4も10月に切れるので更新作業ができるだけはやく更新作業が必要です。汗
はじめに
2017年5月18日のGoogle I/OでKotlinがファーストクラスランゲージにすると発表されたのでKotlinについてメモしておきます。
もともとアプリを作る上でも構文的に見てSwiftより劣っていたJavaです。それらの問題をkotlinは改善してくれます。
java8でラムダ式やオプショナルが実装され大分良くなりましたが、kotlin > (java8 ≒ java9)な所感です。
情報源
https://blog.jetbrains.com/jp/2017/05/18/767
セッション内容の動画
公式ページ
https://kotlinlang.org/
AndroidでKotlinを正式サポート
以前からプラグインでkotlin開発ができていましたが、AndroidStudio3.0より正式サポートになりました。
本日より、Android Studio 3.0はKotlinを最初から同梱します。つまりAndroidデベロッパは互換性について心配する必要がなくなります。今後JetBrainsもGoogleもKotlinでのAndroidアプリケーション開発をサポートしていきますのでご安心ください。
Kotlinの他のプラットフォーム(サーバ、デスクトップにおけるKotlin/JVM、Kotlin/JS、Kotlin/Native)におけるサポートについてもJetBrainsにとって引き続きフォーカスしていきますのでご安心ください。JetBrainsのKotlinにおけるビジョンは、この言語を様々なアプリケーションをマルチプラットフォームで、エンドトゥーエンドに繋げる統一ツールにすることです。これはフルスタックWebアプリケーションも、Androidも、iOSクライアとも、組み込み/IoTも含みます。
プログラミング言語は人間の言語と同じです。つまり話す人が多ければ多いほど良くなります。Androidでの公式サポートで、より多くのデベロッパがKotlinを使うことになるでしょう。そしてJetBrainsはKotlinコミュニティが急速に広がっていくと期待しています。Kotlinによる、またはKotlin向けのライブラリやツール開発が加速し、経験が共有され、Kotlinを使う職が増え、学習教材がたくさん公開されていくことでしょう。Kotlinのエコシステムがより盛り上がっていくことを楽しみにしています!
JetBrainsはGoogleとのパートナーシップで、非営利のKotlinの財団の設立を予定しています。言語開発は引き続きJetBrainsが支援していき、40人いるJetBrainsで二番目に大きいKotlinチームはこれまで通り活動して参ります。Andrey Breslavが引き続きリード言語デザイナーを務め、Kotlinはこれまでと同じ原則をもとに開発が続けられます。JetBrainsはKotlinのデザインプロセスを今後もオープンなものにし続けます。皆様のフィードバックこそKotlinを正しい方向に導くのに必要不可欠だからです。
引用:https://blog.jetbrains.com/jp/2017/05/18/767
Kotlin言語とは
Jetbrain社のオープンソースな言語です。
今すぐにjavaからkotlinへ移行するべき理由とは
既存サービスの場合、規模によっては移行するコストもありますが、費用対効果はその分にあります。
個人的には一番は開発速度が大幅に改善されバグが減ることが大きいと思ってます。
kotlin > (java8 ≒ java9)と言語で優っている
Null Safetyや関数プログラム(ラムダなど)がjavaよりも優っています。java8からoptionalがついてますが、本来のoptionalとずれていてswiftのように使うことはできません。kotlinはswiftに近いためoptionalチェイニングも可能なため、nullでも動きます。
javaもjava9がリリースなどで上がって来ているがAndroidが対応バージョンが6移行など考えるとkotlinにするのがいいと思います。
java9も今年夏にリリース予定とのこと。
http://www.journaldev.com/13121/java-9-features-with-examples#java-9-core
kotlin ≒ swift
言語の基本構文や用意されている機能(ラムダ、オプショナルなど)がswiftに近いです。swiftを触ったことがある人であればkotlinもすぐに理解できます。あとはAndroidのフレームワークの理解は必要です。
開発速度とモチベーション
新しい言語はモチベーション上がります。あとは構文も今風の軽量言語仕様に沿っているので覚えがいがあると思います。
Androidでよく見かけるnpe問題から解放され、コード量がjavaよりも断然少ないコードで実装可能なため、バグなども減ってくると思います。
削減した時間はMVP,MVVM,DDD開発などの設計面に回すことができまね。
互換性100%
javaとkotlinの互換性が100%のため、変えることによりできなくなることはありません。
kotlinで書き方などわからない場合はとりあえずそこはjavaのままというスタンスでもいいと思います。2言語の共存ができます。
JavaからKotlinの学習コストについて
java6,7のスキルでは10日、java8の関数型プログラミングを知っているひとであれば2日程構文を流し見してコードを打てばそれなりに習得できるレベルです。
既存サービスのkotlin化について
既存サービスでjavaからkotlinに変更する場合の進め方を考えました。
時間に余裕があるのであればまとめてコンバートすることが一番スムーズですが、既存サービスの場合、ほかタスクもあるため、一気には難しいのかもしれません。
手始めにテストコードから
どこからコンバートするか迷うところですが、まずは完全にコードと切り離された位置にいるテストコードからやるのがお手軽です。
まずはパッケージ単位で
MVPモデルの場合はM→P→V(Vは最悪やらなくていい)の順番で優先度をつけて対応するといいと思います。
あとはutilityやライブラリの切り離されたところから行うと影響範囲が少なくていいと思います。
単にkotlinに変換ではなく、kotlin仕様のコードに変更
単にjavaからkotlinにコンバートしてエラー対応しても、それはほとんどjavaです。
最終的にkotlinの仕様に沿ったコードに変更しましょう。(まずは順序立てて3フェーズで考えました)
第1フェーズ
java→kotlinにコードを変換
(せっかくkotlinなのにjavaと変わらない状態)
第2フェーズ
kotlinの制御に変更(おもにnullチェック、代入、return関連)
第3フェーズ
FP言語に寄せて変更
妥協
無理にすべてをコンバートするのではなく、あまり機能追加など行わない部分はjavaのままでいくのもありだと思います。
コンバートする場合はすべてテストを再度行わなくていけないのと既存コードで問題が起きていないのであればjavaのままで害になることもないからです。
androidでjava開発のサポートは
公式でのアナウンスはしてませんが、今後もgoogleはjavaのサポートは辞めないのではないでしょうか。言語の選択肢が増えたと考えたほうがいいと思います。kotlinもjavaもファーストクラスランゲージでjavaも伸びしろがあります。
ただoracleと著作権で揉めたりしてたはずですが、どうなのでしょうか。
https://developers.srad.jp/story/16/05/27/0415243/
kotlinの将来性
Android以外にもweb開発などjavaを使って開発していたものがkotlinですべて開発可能です。
言語仕様としてkotlinが上回っているため今後はkotlin開発が増えていくのではないでしょうか。
altJSとしてのkotlinは?
kotlinはjvmのほかjavascriptへコンパイルできます。そのため、altJS(typescript,coffeescript,dartなど)としてもなり得る可能性があります。
kotlinで用意しているものからできることとして比較するとjavascript > kotlinにはなるとおもいます。typescript > kotlinでもあります。
基本的なことは全てできるので、altJSとしても十分に発揮できるのではないでしょうか。
typescriptやらのdslを覚える学習コストを考えると、javaエンジニアはkotlinのほうが慣れやすいのではないかなと思います。
はじめに
iOS/Androidで知っていた方がいいサイトをメモしておきます。
iOS
開発公式ページ(日本語)
https://developer.apple.com/jp/
公式ドキュメント(日本語)
https://developer.apple.com/jp/documentation/
WWDC
https://developer.apple.com/wwdc/
appleセキュリティアップデート情報
https://support.apple.com/en-us/HT201222
xcodeリリースノート
https://developer.apple.com/library/content/releasenotes/DeveloperTools/RN-Xcode/Chapters/Introduction.html
バージョンシェア情報
https://developer.apple.com/support/app-store/
Android
開発公式ページ
https://developer.android.com/index.html
マテリアルデザインガイドライン
https://material.io/guidelines/material-design/introduction.html
Google I/O
https://events.google.com/io/
APIレベル一覧
https://developer.android.com/guide/topics/manifest/uses-sdk-element.html?hl=ja
AndroidStudioのリリースノート
https://developer.android.com/studio/releases/index.html
バージョンシェア情報
https://developer.android.com/about/dashboards/index.html
はじめに
ToolbarやTabLayoutなどに影の設定(elevation)が効いていなかったため対応をメモします。
※ロリポップより前はもともと影は標準ででません
CollapsingToolbarLayoutでtoolbarなどを括った場合に影が表示しない不具合があるようです。
対応策
stackoverに答えがありました。
参考:
http://stackoverflow.com/questions/32474073/android-design-library-toolbar-shadow
stackoverのとおりカスタムしたCollapsingToolbarLayoutを作成します。
※コンストラクタも必要です
public class ShadowCollapsingToolbarLayout extends CollapsingToolbarLayout { private AppBarLayout.OnOffsetChangedListener mOnOffsetChangedListener; public ShadowCollapsingToolbarLayout(final Context context) { super(context); } public ShadowCollapsingToolbarLayout(final Context context, final AttributeSet attrs) { super(context, attrs); } public ShadowCollapsingToolbarLayout(final Context context, final AttributeSet attrs, final int defStyleAttr) { super(context, attrs, defStyleAttr); } @Override protected void onAttachedToWindow() { super.onAttachedToWindow(); ViewParent parent = this.getParent(); if (parent instanceof AppBarLayout) { if (mOnOffsetChangedListener != null) ((AppBarLayout) parent).addOnOffsetChangedListener(mOnOffsetChangedListener); } } public void setOnOffsetChangeListener(AppBarLayout.OnOffsetChangedListener listener) { mOnOffsetChangedListener = listener; } }
レイアウトファイルでCollapsingToolbarLayoutをShadowCollapsingToolbarLayoutに差し替えます。あとはmCollapsingLayoutとした変数に以下のコードを実行します。
※CollapsingToolbarLayoutの中にあるAppBarLayoutにはelevationの数値設定をしてください。
mCollapsingLayout.setOnOffsetChangeListener(new AppBarLayout.OnOffsetChangedListener() { @Override public void onOffsetChanged(AppBarLayout appBarLayout, int i) { ViewCompat.setElevation(appBarLayout, appBarLayout.getTargetElevation()); } });
これでうまく影が表示されるようになりました。
はじめに
AndroidでAPI通信またはWebViewでページにアクセスする場合のSSLの必要性と対応についてメモします。
元々の考えでは、サイトの情報、apiにセキュアなデータが存在する場合はhttpsで、一般サイトなどはhttpを使っていました。
今後はスマホのセキュリティ的な考えのもと、httpsのみが推奨されてきています。
iOSはiOS9以降よりATSの有効化を推奨しておりデフォルトもオンになっています。
ATSについてはこちら:
http://to-developer.com/blog/?p=2036
Androidのセキュリティについて
Googleはセキュアな通信を推奨しています。ただAndroid上ではまだ推奨はしているとはおもいますが、特に設定上でデフォルトでセキュアな対応にはまだなっていないといった状態です。
AndroidにもあるiOSのATSなものについて
マニフェストの設定でusesCleartextTrafficがiosのATSと同等と思われます。デフォルトはhttpとしているため、まだhttpsを推奨としているわけではないようですが、いずれ推奨またはデフォルトは変わるのではないかと思います。
usesCleartextTraffic
アプリは、平文HTTPとして、クリアテキストのネットワークトラフィックを使用しようとするかどうかを示します。デフォルト値は「真」です。
属性は「偽」、プラットフォームコンポーネントに設定されている場合(例えば、HTTPおよびFTPスタックは、DownloadManager、MediaPlayerのは)クリアテキストトラフィックを使用するアプリケーションの要求を拒否します。サードパーティのライブラリを強く同様に、この設定を尊重することをお勧めします。クリアテキストトラフィックを回避するための主な理由は、機密性、真正性、および改ざんに対する保護の欠如である:ネットワーク攻撃者は、送信されたデータを盗聴し、また、検出されることなく、それを変更することができます。このフラグは、それが彼らに提供されるアクセスのレベルを指定したAndroidアプリケーションからすべてクリアテキストのトラフィックを防止することは不可能ですので、ベストエフォートベースで表彰されます。例えば、それは、そのトラフィックがクリアテキストであるかどうかを判断できないため、ソケットAPIはこのフラグを尊重するという期待がありません。ただし、アプリケーションからのほとんどのネットワークトラフィックがどちらかがApplicationInfo.flagsまたはNetworkSecurityPolicy.isCleartextTrafficPermittedからそれを読み取って、このフラグを尊重することができ、より高いレベルのネットワークスタック/コンポーネントによって処理されます()。
引用:
https://developer.android.com/guide/topics/manifest/application-element.html
webviewでhttps/http混在コンテンツについて
セキュリティのルールが変わり、Androidのロリポップ(5系)以上では、httpとhttpsの混在コンテンツのあるページをwebviewで表示しようとすると通信がブロックされるようになりました。httpsサイトの中でhttpの画像リソースを置いた場合などが混在コンテンツ扱いになります。
混在コンテンツをロリポップ以上でも許容するにはwebviewの設定でsetMixedContentModeでモードを「 MIXED_CONTENT_ALWAYS_ALLOW」に切り替えると、ブロックされなくなります。このデフォルトの設定がロリポップ(5系)以上で変更になってます。
5系以前はMIXED_CONTENT_ALWAYS_ALLOWでした。SEOとしても混在コンテンツはhttpsと評価されずに効果がでなくなるようです。
setMixedContentMode (Added in API level 21)
void setMixedContentMode (int mode)
Configures the WebView’s behavior when a secure origin attempts to load a resource from an insecure origin. By default, apps that target KITKAT or below default to MIXED_CONTENT_ALWAYS_ALLOW. Apps targeting LOLLIPOP default to MIXED_CONTENT_NEVER_ALLOW. The preferred and most secure mode of operation for the WebView is MIXED_CONTENT_NEVER_ALLOW and use of MIXED_CONTENT_ALWAYS_ALLOW is strongly discouraged.
引用:
https://developer.android.com/reference/android/webkit/WebSettings.html
httpsにする必要性
セキュアにする理由
クリアテキストトラフィックを回避するための主な理由は、機密性、真正性、および改ざんに対する保護の欠如である:ネットワーク攻撃者は、送信されたデータを盗聴し、また、検出されることなく、それを変更することができます。
httpsによるSEOの評価について(HTTPSをランキングシグナルに利用する)
https化対応にするメリットはSEOでクローラーの評価が違うことがあります。
セキュリティは Google の最優先事項です。Google は、デフォルトで強力な HTTPS 暗号化を導入するなど、業界でも最先端のセキュリティを Google サービスに導入することに力を注いでいます。これにより、たとえば Google 検索、Gmail、Google ドライブを使用しているユーザーは自動的に、Google に安全に接続することができます。
Google は、Google のサービスだけにとどまらず、より広い範囲でインターネットを安全に利用できるように取り組んでいます。そこで大きな割合を占めているのは、ユーザーが Google から安全なサイトにアクセスできるようにすることです。たとえば、Google ではウェブマスター向けにハッキングの対策や修正方法について詳しい情報を提供するサイトを作成しました。
Google ではさらにもう一歩踏み込んで、数か月前の Google I/O では、「HTTPS everywhere」をウェブで提唱しました。
また、ますます多くのウェブマスターが HTTPS(HTTP over TLS / Transport Layer Security)を彼らのサイトに導入するようになってきています。これはとても心強いことです。
こうした理由から、Google では過去数か月にわたり、Google のランキング アルゴリズムでのシグナルとして、暗号化された安全な接続をサイトで使用しているかを考慮に入れたテストを実施してきました。この実験ではよい結果が得られているため、ユーザーがもっと安全にサイトを閲覧できるよう、すべてのサイト所有者の皆様に HTTP から HTTPS への切り替えをおすすめしたいと考えています。Google は、みなさんがより簡単に TLS を導入し、よくある失敗を避けられるように、今後数週間のうちに詳細なベスト プラクティスを公開する予定です(Update: こちらのヘルプ記事内で公開しました)。開始にあたって、以下の基本的なヒントもご確認ください。
必要な証明書タイプを決定します: シングル、マルチ ドメイン、ワイルド カード
2048 bit の証明書を使用します
同じ安全なドメイン上にあるリソースには相対 URL を使用します
他のすべてのドメインにはプロトコル相対 URL を使用します
サイトのアドレスの変更方法について詳しくは、サイト移転に関するヘルプ記事をご覧ください
robots.txt を使用して HTTPS サイトへのクロールをブロックしないでください
可能な限り検索エンジンがページをインデックス登録できるようにします。Noindex メタタグの使用は避けます。
サイトが既に HTTPS で配信されている場合は、Qualys Lab ツールを使用してウェブサイトのセキュリティ レベルと設定をテストできます。TLS とサイト パフォーマンスについて不安がある場合は、「Is TLS fast yet?」(英語)をご覧ください。また、ご質問やご不明な点がある場合は、ウェブマスター ヘルプ フォーラムでお尋ねください。
このランキングの変更は、グローバルでクエリの 1% 未満にしか影響しませんが、これから長い期間をかけて強化していきます。全体的に見ると、このシグナルは良質なコンテンツであるといった、その他のシグナルほどウェイトは大きくありません。HTTPS は、優れたユーザー エクスペリエンスを生み出す多くの要素のうちの 1 つです。
今後、より多くのウェブサイトで HTTPS が使用されることを期待しています。ウェブの安全性をさらに強化しましょう。
参考:
http://googlewebmastercentral-ja.blogspot.jp/
発表当時2014/8/7は
「このランキングの変更は、グローバルでクエリの 1% 未満にしか影響しませんが、これから長い期間をかけて強化していきます。全体的に見ると、このシグナルは良質なコンテンツであるといった、その他のシグナルほどウェイトは大きくありません。HTTPS は、優れたユーザー エクスペリエンスを生み出す多くの要素のうちの 1 つです。」
の通りのため、ほとんどhttps化によるSEOの効果はなかったと思います。
いまはどうでしょうか。
Indexing HTTPS pages by default
Thursday, December 17, 2015
At Google, user security has always been a top priority. Over the years, we’ve worked hard to promote a more secure web and to provide a better browsing experience for users. Gmail, Google search, and YouTube have had secure connections for some time, and we also started giving a slight ranking boost to HTTPS URLs in search results last year. Browsing the web should be a private experience between the user and the website, and must not be subject to eavesdropping, man-in-the-middle attacks, or data modification. This is why we’ve been strongly promoting HTTPS everywhere.
As a natural continuation of this, today we’d like to announce that we’re adjusting our indexing system to look for more HTTPS pages. Specifically, we’ll start crawling HTTPS equivalents of HTTP pages, even when the former are not linked to from any page. When two URLs from the same domain appear to have the same content but are served over different protocol schemes, we’ll typically choose to index the HTTPS URL if:
It doesn’t contain insecure dependencies.
It isn’t blocked from crawling by robots.txt.
It doesn’t redirect users to or through an insecure HTTP page.
It doesn’t have a rel=”canonical” link to the HTTP page.
It doesn’t contain a noindex robots meta tag.
It doesn’t have on-host outlinks to HTTP URLs.
The sitemaps lists the HTTPS URL, or doesn’t list the HTTP version of the URL
The server has a valid TLS certificate.
Although our systems prefer the HTTPS version by default, you can also make this clearer for other search engines by redirecting your HTTP site to your HTTPS version and by implementing the HSTS header on your server.
We’re excited about taking another step forward in making the web more secure. By showing users HTTPS pages in our search results, we’re hoping to decrease the risk for users to browse a website over an insecure connection and making themselves vulnerable to content injection attacks. As usual, if you have any questions or comments, please let us know in the comments section below or in our webmaster help forums.
https://webmasters.googleblog.com/
クローラーのindexはhttpsを優先するとあります。
効果はわかりませんが、だいぶ優先してくれるようです。
まとめ
AppleもGoogleもセキュアな通信を基本推奨しているので、今後はサーバ側で対応しアプリも基本Strictな設定(https通信のみ)にすることが必要となるようです。
現行ではiOSであればATSを無効にすることやAndroidはデフォルト無効のため、急ぐ必要はまだないとはおもうのですが。
参考:
https://koz.io/android-m-and-the-war-on-cleartext-traffic/
https://developer.android.com/guide/topics/manifest/application-element.html
はじめに
ギャラリー・カメラの選択した画像をonActivityResultで取得する場合に以前は「content://media/external/images/media/」形式で
URLが取得できていましたが、「storage/sdcard0/」形式のファイル取得になりました。SDKのバージョン上げたからかな?変わったのかな?調べてません。
そのためcursolがnullになりエラーに陥ったので対応策をメモしておきます。
対応策
「content://media/external/images/media/」形式
「storage/sdcard0/」形式
どちらの場合も対応できるようにコードを分岐しました。
public static final String[] PROJECTION = { Images.ImageColumns._ID, // 0 Images.ImageColumns.TITLE, // 1 Images.ImageColumns.MIME_TYPE, // 2 Images.ImageColumns.LATITUDE, // 3 Images.ImageColumns.LONGITUDE, // 4 Images.ImageColumns.DATE_TAKEN, // 5 Images.ImageColumns.DATE_ADDED, // 6 Images.ImageColumns.DATE_MODIFIED, // 7 Images.ImageColumns.DATA, // 8 Images.ImageColumns.ORIENTATION, // 9 Images.ImageColumns.BUCKET_ID, // 10 Images.ImageColumns.SIZE, // 11 Images. ImageColumns.BUCKET_DISPLAY_NAME, // 12 }; public void onActivityResult(int requestCode, int resultCode, Intent data) { Uri uri = data.getData(); Cursor cursor = null; if (ContentResolver.SCHEME_CONTENT.equals( uri.getScheme()) ){ // content://media/external/images/media/形式 ContentResolver cr = getContentResolver(); String[] columns = {MediaStore.Images.Media.DATA }; cursor = cr.query(mData.getData(), columns, null, null, null); } else { // storage/sdcard0/形式 ※HDのディレクトリ構成のまま cursor = getContentResolver().query( Images.Media.EXTERNAL_CONTENT_URI, PROJECTION, Images.ImageColumns.DATA + " LIKE '%" + mData.getData().toString() + "%'", null, null ); } String fileName = cursor.getString(c.getColumnIndex(Images.Media.DATA)); }
はじめに
AndroidStudio作成のgradle環境のプロジェクトをコマンド実行します。
gradleコマンドは全環境に依存しているため、プロジェクト毎に関連性を持つGradleをラップしたgradlewコマンドを使います。
前回作成のプロジェクトをコマンド実行してみます
[Android]Gradleファイルで環境ごとに処理を切り分け(APK名・Keystore設定など)
プロジェクトは以下
https://github.com/y-matsumoto/template-project
タスク確認
プロジェクト直下にgradlew.batができてます。こちらを使います。
まずはプロジェクト直下に移動して以下のコマンドを実行し、タスク一覧を確認します
$ gradlew tasks Parallel execution with configuration on demand is an incubating feature. :tasks ------------------------------------------------------------ All tasks runnable from root project ------------------------------------------------------------ Android tasks ------------- androidDependencies - Displays the Android dependencies of the project. signingReport - Displays the signing info for each variant. sourceSets - Prints out all the source sets defined in this project. Build tasks ----------- assemble - Assembles all variants of all applications and secondary packages. assembleAndroidTest - Assembles all the Test applications. assembleDebug - Assembles all Debug builds. assembleDevelop - Assembles all Develop builds. assembleProduct - Assembles all Product builds. assembleRelease - Assembles all Release builds. assembleStaging - Assembles all Staging builds. build - Assembles and tests this project. buildDependents - Assembles and tests this project and all projects that depend on it. buildNeeded - Assembles and tests this project and all projects it depends on. clean - Deletes the build directory. compileDevelopDebugAndroidTestSources compileDevelopDebugSources compileDevelopDebugUnitTestSources compileDevelopReleaseSources compileDevelopReleaseUnitTestSources compileProductDebugAndroidTestSources compileProductDebugSources compileProductDebugUnitTestSources compileProductReleaseSources compileProductReleaseUnitTestSources compileStagingDebugAndroidTestSources compileStagingDebugSources compileStagingDebugUnitTestSources compileStagingReleaseSources compileStagingReleaseUnitTestSources mockableAndroidJar - Creates a version of android.jar that's suitable for unit tests. Build Setup tasks ----------------- init - Initializes a new Gradle build. [incubating] wrapper - Generates Gradle wrapper files. [incubating] Help tasks ---------- components - Displays the components produced by root project 'template-project'. [incubating] dependencies - Displays all dependencies declared in root project 'template-project'. dependencyInsight - Displays the insight into a specific dependency in root project 'template-project'. help - Displays a help message. model - Displays the configuration model of root project 'template-project'. [incubating] projects - Displays the sub-projects of root project 'template-project'. properties - Displays the properties of root project 'template-project'. tasks - Displays the tasks runnable from root project 'template-project' (some of the displayed tasks may belong to subprojects). Install tasks ------------- installDevelopDebug - Installs the DebugDevelop build. installDevelopDebugAndroidTest - Installs the android (on device) tests for the DevelopDebug build. installProductDebug - Installs the DebugProduct build. installProductDebugAndroidTest - Installs the android (on device) tests for the ProductDebug build. installStagingDebug - Installs the DebugStaging build. installStagingDebugAndroidTest - Installs the android (on device) tests for the StagingDebug build. uninstallAll - Uninstall all applications. uninstallDevelopDebug - Uninstalls the DebugDevelop build. uninstallDevelopDebugAndroidTest - Uninstalls the android (on device) tests for the DevelopDebug build. uninstallDevelopRelease - Uninstalls the ReleaseDevelop build. uninstallProductDebug - Uninstalls the DebugProduct build. uninstallProductDebugAndroidTest - Uninstalls the android (on device) tests for the ProductDebug build. uninstallProductRelease - Uninstalls the ReleaseProduct build. uninstallStagingDebug - Uninstalls the DebugStaging build. uninstallStagingDebugAndroidTest - Uninstalls the android (on device) tests for the StagingDebug build. uninstallStagingRelease - Uninstalls the ReleaseStaging build. Verification tasks ------------------ check - Runs all checks. connectedAndroidTest - Installs and runs instrumentation tests for all flavors on connected devices. connectedCheck - Runs all device checks on currently connected devices. connectedDevelopDebugAndroidTest - Installs and runs the tests for developDebug on connected devices. connectedProductDebugAndroidTest - Installs and runs the tests for productDebug on connected devices. connectedStagingDebugAndroidTest - Installs and runs the tests for stagingDebug on connected devices. deviceAndroidTest - Installs and runs instrumentation tests using all Device Providers. deviceCheck - Runs all device checks using Device Providers and Test Servers. lint - Runs lint on all variants. lintDevelopDebug - Runs lint on the DevelopDebug build. lintDevelopRelease - Runs lint on the DevelopRelease build. lintProductDebug - Runs lint on the ProductDebug build. lintProductRelease - Runs lint on the ProductRelease build. lintStagingDebug - Runs lint on the StagingDebug build. lintStagingRelease - Runs lint on the StagingRelease build. test - Run unit tests for all variants. testDevelopDebugUnitTest - Run unit tests for the developDebug build. testDevelopReleaseUnitTest - Run unit tests for the developRelease build. testProductDebugUnitTest - Run unit tests for the productDebug build. testProductReleaseUnitTest - Run unit tests for the productRelease build. testStagingDebugUnitTest - Run unit tests for the stagingDebug build. testStagingReleaseUnitTest - Run unit tests for the stagingRelease build. Other tasks ----------- clean jarDevelopDebugClasses jarDevelopReleaseClasses jarProductDebugClasses jarProductReleaseClasses jarStagingDebugClasses jarStagingReleaseClasses lintVitalDevelopRelease - Runs lint on just the fatal issues in the DevelopRelease build. lintVitalProductRelease - Runs lint on just the fatal issues in the ProductRelease build. lintVitalStagingRelease - Runs lint on just the fatal issues in the StagingRelease build. To see all tasks and more detail, run gradlew tasks --all To see more detail about a task, run gradlew help --task <task> BUILD SUCCESSFUL Total time: 4.033 secs
Androidプロジェクトのビルド
タスクにより端末にインストールや、ビルド、APKファイル作成を指定環境ごとに作成します。
試しにassembleReleaseタスクを実行します
$ gradlew assembleDebug Parallel execution with configuration on demand is an incubating feature. :app:preBuild UP-TO-DATE :app:preDevelopDebugBuild UP-TO-DATE :app:checkDevelopDebugManifest :app:preDevelopReleaseBuild UP-TO-DATE :app:preProductDebugBuild UP-TO-DATE :app:preProductReleaseBuild UP-TO-DATE :app:preStagingDebugBuild UP-TO-DATE :app:preStagingReleaseBuild UP-TO-DATE :app:prepareComAndroidSupportAppcompatV72221Library UP-TO-DATE :app:prepareComAndroidSupportDesign2221Library UP-TO-DATE :app:prepareComAndroidSupportSupportV42221Library UP-TO-DATE :app:prepareDevelopDebugDependencies :app:compileDevelopDebugAidl UP-TO-DATE :app:compileDevelopDebugRenderscript UP-TO-DATE :app:generateDevelopDebugBuildConfig UP-TO-DATE :app:generateDevelopDebugAssets UP-TO-DATE :app:mergeDevelopDebugAssets UP-TO-DATE :app:generateDevelopDebugResValues UP-TO-DATE :app:generateDevelopDebugResources UP-TO-DATE :app:mergeDevelopDebugResources UP-TO-DATE :app:processDevelopDebugManifest UP-TO-DATE :app:processDevelopDebugResources UP-TO-DATE :app:generateDevelopDebugSources UP-TO-DATE :app:processDevelopDebugJavaRes UP-TO-DATE :app:compileDevelopDebugJavaWithJavac UP-TO-DATE :app:compileDevelopDebugNdk UP-TO-DATE :app:compileDevelopDebugSources UP-TO-DATE :app:preDexDevelopDebug UP-TO-DATE :app:dexDevelopDebug UP-TO-DATE :app:validateDebugSigning :app:packageDevelopDebug :app:zipalignDevelopDebug :app:assembleDevelopDebug :app:checkProductDebugManifest :app:prepareProductDebugDependencies :app:compileProductDebugAidl UP-TO-DATE :app:compileProductDebugRenderscript UP-TO-DATE :app:generateProductDebugBuildConfig UP-TO-DATE :app:generateProductDebugAssets UP-TO-DATE :app:mergeProductDebugAssets UP-TO-DATE :app:generateProductDebugResValues UP-TO-DATE :app:generateProductDebugResources UP-TO-DATE :app:mergeProductDebugResources UP-TO-DATE :app:processProductDebugManifest UP-TO-DATE :app:processProductDebugResources UP-TO-DATE :app:generateProductDebugSources UP-TO-DATE :app:processProductDebugJavaRes UP-TO-DATE :app:compileProductDebugJavaWithJavac UP-TO-DATE :app:compileProductDebugNdk UP-TO-DATE :app:compileProductDebugSources UP-TO-DATE :app:preDexProductDebug UP-TO-DATE :app:dexProductDebug UP-TO-DATE :app:packageProductDebug :app:zipalignProductDebug :app:assembleProductDebug :app:checkStagingDebugManifest :app:prepareStagingDebugDependencies :app:compileStagingDebugAidl UP-TO-DATE :app:compileStagingDebugRenderscript UP-TO-DATE :app:generateStagingDebugBuildConfig UP-TO-DATE :app:generateStagingDebugAssets UP-TO-DATE :app:mergeStagingDebugAssets UP-TO-DATE :app:generateStagingDebugResValues UP-TO-DATE :app:generateStagingDebugResources UP-TO-DATE :app:mergeStagingDebugResources UP-TO-DATE :app:processStagingDebugManifest UP-TO-DATE :app:processStagingDebugResources UP-TO-DATE :app:generateStagingDebugSources UP-TO-DATE :app:processStagingDebugJavaRes UP-TO-DATE :app:compileStagingDebugJavaWithJavac UP-TO-DATE :app:compileStagingDebugNdk UP-TO-DATE :app:compileStagingDebugSources UP-TO-DATE :app:preDexStagingDebug UP-TO-DATE :app:dexStagingDebug UP-TO-DATE :app:packageStagingDebug :app:zipalignStagingDebug :app:assembleStagingDebug :app:assembleDebug BUILD SUCCESSFUL Total time: 5.978 secs
BUILD SUCCESSFULで成功です。
template-project\app\build\outputs\apkディレクトリにdebugモードで各環境(develop,staging,product)でapkファイルが作成されます。
環境毎に実行する場合はassembleDevelop,assembleStaging,assembleProductタスクを実行してください。debug,releaseでファイルが作成されます。
ant,mavenより簡単で早いですね。
はじめに
Gradleの設定ファイルを修正することでdebugモード、releaseモードで処理を切り分け設定を有効化できるので、設定しておきます。
1.keystore設置
keystoreもdebugとreleaseでアップしておくとビルドが楽なのでいいと思います。
ただ、release用はgitなどでサーバプッシュはしないほうがセキュリティ的に良いと思います。
keystoreというディレクトリ名にしてプロジェクト直下に作成し、中にkeystoreファイルをそれぞれ設置してください。
2.Gradleファイルについて
設定プロパティなど詳細は公式を参照ください
http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Build-Types
Gradleファイルのベースとなるテンプレートをアップしておきます。適時変えて使ってみてください。
実行時はAndroidStudioよりBuild VariantからdevelopDebug,stagingDebug,productDebug,developRelease,stagingRelease,productReleaseより選択して実行してください。
実行したできたapkは「app\build\outputs\apk」に作成されます。
実行した場合のapkファイル名のフォーマットは以下になります
[パッケージ名簡潔]_r[バージョン名]-[環境名]-[モード名(release or debug)]_r[バージョンコード]_[実行日付].apk」
app-[環境名]-[モード名(release or debug)]-unaligned.apk」になります。
デフォルトインポートについて
よく使うjava系(java.lang、java.io、java.math、java.net、java.util)はすでにimportされているので、Dateなどその場で使えます。
足りないものはimportで「import java.text.SimpleDateFormat」のように追加できます。
詳細は以下より確認ください。
3.2.1. Default imports
All these packages and classes are imported by default, i.e. you do not have to use an explicit import statement to use them:java.io.*
java.lang.*
java.math.BigDecimal
java.math.BigInteger
java.net.*
java.util.*
groovy.lang.*
groovy.util.*
http://docs.groovy-lang.org/latest/html/documentation/index.html#_differences_with_java
productFlavors
productFlavorsは実行環境毎に処理を切り分けるために使用できます。今回は環境ごとにファイル名に環境を付加する設定です。
3.その他ファイルの環境別切り分け(develop,staging,product)
productFlavorsで実行環境の処理を切り分けた場合、その環境名と同名のディレクトリを作成すると環境ごとに読み込みディレクトリを自動的に変えてくれます。
今回はstring.xmlのアプリ名となる
ディレクトリは以下のようにします
│ └─src │ ├─develop │ │ └─res │ │ └─values │ │ └─strings.xml │ ├─main │ │ ├─java │ │ │ └─hogehoge │ │ └─res │ │ ├─drawable │ │ ├─drawable-v21 │ │ ├─layout │ │ ├─menu │ │ ├─mipmap-hdpi │ │ ├─mipmap-mdpi │ │ ├─mipmap-xhdpi │ │ ├─mipmap-xxhdpi │ │ ├─mipmap-xxxhdpi │ │ ├─values │ │ └─strings.xml │ │ ├─values-v21 │ │ └─values-w820dp │ ├─product │ │ └─res │ │ └─values │ │ └─strings.xml │ ├─staging │ │ └─res │ │ └─values │ │ └─strings.xml
Build Variantから環境ごとにビルドして実行すると確認できます。
一式をテンプレートプロジェクトとしてgithubにアップしました
https://github.com/y-matsumoto/template-project
はじめに
Android開発ではbuild.gradle(Eclipse開発の場合はmanifestファイル)にminSDKVersion,TargetSDKVersionを記載します。この設定によりアプリのバージョン対応をします。
minSDKVersion設定は特に重要で、このバージョンより下位にあたるバージョンの端末ではアプリは実行できません。
Androidの記事を見ていると稀に、コードネームでバージョンを記載している場合も多いです。※Androidではコードネームがお菓子に関連した名前になっています
いまだ2015/11/19時点で2.3.3バージョン(APIレベル10)もシェア3%いるため、捨てるか迷いますが、これから作成するアプリはminSDKVersionは4.1(APIレベル16)にしておけばよいと思います。
公式ページに一覧一式掲載されています。
公式APIレベル
http://developer.android.com/intl/ja/guide/topics/manifest/uses-sdk-element.html
公式バージョンシェア率 ※頻繁に更新されているため信頼あるデータです
http://developer.android.com/intl/ja/about/dashboards/index.html
バージョン毎の変更点など
https://ja.wikipedia.org/wiki/#Android_6.0_Marshmallow
Androidバージョンと対応するAPIレベル/コードネーム一覧
はじめに
Androidアプリの中で、使っていない画像ファイルって開発中にどんどんたまってしまいますね。
Androidはアプリサイズに制限(50メガ/4.0以降は100メガ)があるのと、小さいほうがインストールもはやくなるので、無駄なファイルは削除してください。
作ったスクリプトとスクリプトの使い方を残しておきます。
以下の二つのプロジェクト版も近々アップしてみようと思います。
[Android]使用していない画像ファイルをまとめて削除する(Eclipse版)
[ios]使用していない画像ファイルをまとめて削除する(XCode版)
削除スクリプト
アプリで使用している画像ファイル一覧・使用していない画像一覧をファイルに書き出し、
使用していない画像ファイルを一式削除までします。
削除はしないで画像ファイルを確認したいだけの場合はスクリプトの40行目「rm -r $elem」をコメントアウトしてください。
その他の要望は、スクリプトを読み適時変更して使ってみてください。
スクリプトを見ればわかりますが、find,grepを使って文字列チェックをしているだけです。
使い方(スクリプトファイルの作成)
以下のスクリプトファイルをremove.shとしてファイルを作成してください
ファイルはgistにアップしました
https://gist.github.com/y-matsumoto/4b23050754014e9eb868
使い方(実行方法)
プロジェクトのディレクトリが置いてあるパスを指定して実行すればスクリプトが実行されます
$ sh remove.sh [プロジェクトパス]
注意点
削除する画像ファイルは、src,res,manifestに直接的に文字列設定していないファイルのみ削除します。
そのためActivityファイルで使っていないjavaファイルが混ざっている場合も削除はされないので、本当につかってない画像ファイルを一式だすのであれば、まずは不要なソースコードとレイアウトファイルを削除してから実行してください。
あとは動的に画像ファイル名を生成するようなコードの場合は、対象にならず必要な画像ファイルも削除する可能性があるので、ご注意ください。
はじめに
5.0Lollipopで今までのActionBarの変わりになるToolbarが追加されました。
カスタム性がこれまでのActionBarより行いやすいので出来る場合は移行をすると良いと思います。
support library7に組み込まれているので2.1以降であれば動作します。
リファレンス
https://developer.android.com/intl/ja/reference/android/support/v7/widget/Toolbar.html
ToolBarを実装
今回は戻るボタンと検索ボタンを追加してみます
※画像は見た目のイメージです。今回の実装とは少し異なります。(色・アイコンなどは適時変えてください)
Activityレイアウト実装
activity_mainレイアウトファイルを作成します
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="wrap_content" android:theme="@style/ThemeOverlay.AppCompat.ActionBar"/> </LinearLayout>
今回はActivityへToolbar書きましたが別xmlにしてincludeのほうが良いです
menuレイアウト実装
menu_mainメニューレイアウトを作成します
<menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> <item android:id="@+id/action_settings" android:title="@string/action_settings" android:orderInCategory="100" app:showAsAction="never" /> <item android:id="@+id/action_search" android:icon="@drawable/search" android:title="test" app:showAsAction="always" /> </menu>
Activity実装
上記で作成したレイアウトをバインドしクリックイベントを実装します
public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); toolbar.setTitle("hoge"); toolbar.setNavigationIcon(R.drawable.back); toolbar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivityy.this,"back click!!",Toast.LENGTH_LONG).show(); } }); toolbar.inflateMenu(R.menu.menu_main); toolbar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem item) { int id = item.getItemId(); if (id == R.id.action_search) { Toast.makeText(MainActivity.this,"search click!!",Toast.LENGTH_LONG).show(); return true; } return true; } }); } }
ここまでで実装完了です。
あとはアプリ仕様にあわせてナビゲーションなど実装してください
coffee-break
Don't write code that useless.
1日5杯はコーヒー、カフェオレ飲みます。狭心症のため安静にします☆松本 雄貴
Kotlinでサービスリリース目指す!
iOSでチャットアプリ作成中。自然言語解析LSIを習得中
Mac / Android・iOS / Rails / Oracle
2017年 Lpic L2取得
2012年 Android技術者資格取得
2010年 OracleMasterGold10g取得
2008年 CCNAQiitaもたまに投稿
https://qiita.com/y-matsumoto東京近郊で常駐開発探してる方はこちらよりご連絡ください
SES企業でパートナー会社を探している企業様はこちらよりご連絡ください
スプリットカメラ iOS / Android
音声認識で聞いた日付から曜日当てアプリ Android
ソーシャルタイマー Android
カテゴリー
- ActiveRecord (2)
- Android (52)
- AndroidStudio (10)
- Ansible (1)
- AWS (1)
- Bash (18)
- Blog (7)
- BootStrap (1)
- CentOS (16)
- Chef (1)
- css (2)
- Eclipse (5)
- error (1)
- Facebook (2)
- Firebase (1)
- FuelPHP (16)
- Git (22)
- GitHub (3)
- Gradle (2)
- GraphAPI (1)
- Grunt (1)
- heroku (2)
- illustrator (1)
- iOS (17)
- Java (4)
- Jenkins (1)
- jQuery (3)
- Kotlin (2)
- Mac (22)
- nginx (1)
- Node.js (3)
- peco (1)
- php (5)
- Python (1)
- Rails (16)
- Ruby (11)
- shell (1)
- SNS (1)
- Swift (2)
- tmux (2)
- Vagrant (6)
- Vim (6)
- windows (2)
- WordPress (3)
- zsh (4)
- フリーランス (1)
- ライブラリ (1)
- 勉強会 (2)
- 宣伝 (1)
- 未分類 (2)
最近の投稿
- [MAC]HighSierraでgitプッシュエラー「Unable to negotiate with xxx.xxx.xxx.xxx port xx: no matching cipher found. Their offer: aes128-cbc,3des-cbc,blowfish-cbc,cast128-cbc,arcfour,aes192-cbc,aes256-cbc,rijndael-cbc@lysator.liu.se fatal: Could not read from remote repository.」
- [iOS]iOS11からFacebook,Twitter連携(シェアなど)廃止の対応方法
- [iOS]速報2017AppleSpecialEventのiOS11、iPhone8など発表内容について
- [iOS][Firebase]The default Firebase app has not yet been configured. Add `[FIRApp configure];
- [iOS]2017年9月リリースのiOS11で開発者が対応するべきこと
- 今人気の現金化サービスCASH(キャッシュ)を使ったレビュー
- [Pandoc][Mac]pandocでmarkdownからwordファイル作成
- [Android]映画サマーウォーズの聞いた日付(誕生日)から曜日当てをアプリ音声認識で簡単に実現
- [Android]起動しているActivityを取得するadb shell コマンド
- [Android][Kotlin]kotlin学習で参考になるサイト一覧
2023年10月 月 火 水 木 金 土 日 « 5月 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 アーカイブ
- 2018年5月
- 2017年9月
- 2017年8月
- 2017年7月
- 2017年6月
- 2017年5月
- 2017年2月
- 2017年1月
- 2016年12月
- 2016年7月
- 2016年6月
- 2016年1月
- 2015年12月
- 2015年11月
- 2015年10月
- 2015年9月
- 2015年8月
- 2015年7月
- 2015年6月
- 2015年5月
- 2015年4月
- 2015年3月
- 2015年2月
- 2015年1月
- 2014年12月
- 2014年11月
- 2014年6月
- 2014年5月
- 2014年4月
- 2014年3月
- 2014年2月
- 2014年1月
- 2013年12月
- 2013年11月
- 2013年9月
- 2013年8月
- 2013年7月
- 2013年6月
- 2013年5月
- 2013年4月
- 2013年3月
- 2013年2月
- 2013年1月
- 2012年12月
- 2012年10月
- 2012年5月
- 2010年6月
エントリ