はじめに
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レベル/コードネーム一覧
はじめに
xibはXML Interface Builderの略です。xibをエックスアイビーと呼んでいましたが一般呼称は違うようです。←頭文字読みなのでエックスアイビーでも間違いではないですけど。
答え
以下サイトよりzibと言われていることがわかりました。日本語読みでジブが正しいようですね。でも伝われば何でも良いですね。
http://lists.apple.com/archives/xcode-users/2008/Jul/msg00927.html
はじめに
wordpressで新規記事登録などのページで「メディアを追加」ボタンを押して表示されるダイアログがおかしくなっていたので、対応策を載せておきます。
エラーの概要と解決
メディアライブラリの一覧で画像データが表示されずに空になっている、また、「ファイルをアップロード」からファイルをアップすると「アップロード中にエラーが発生しました。後ほど再度お試しください。」のエラーが表示されました。
特にwordpress自体は弄った記憶がなかったのでサーバの環境かphpのバージョンアップなどで影響を受けたのかもしれません。
事象発生時に、wordpressのメディアタブからだと、正常に表示されていました。
そのためダイアログ表示するメディア追加だけがおかしくなっていました。
原因を調べるとズバリの記事がありました。ありがとうございます。
http://uehi.info/2014/03/post-728/
対応
wp-admin/admin-ajax.phpの以下の箇所を修正すると直りました。
修正前
@header( 'Content-Type: text/html; charset=' . get_option( 'blog_charset' ) );
修正後
if(in_array($_POST['action'], array('query-attachments', 'send-attachment-to-editor'))){ @header('Content-Type: application/json; charset=' . get_option('blog_charset')); }else{ @header( 'Content-Type: text/html; charset=' . get_option( 'blog_charset' ) ); }
実際に確認する時はバックアップを取って確認したほうがいいですね。
はじめに
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ファイルが混ざっている場合も削除はされないので、本当につかってない画像ファイルを一式だすのであれば、まずは不要なソースコードとレイアウトファイルを削除してから実行してください。
あとは動的に画像ファイル名を生成するようなコードの場合は、対象にならず必要な画像ファイルも削除する可能性があるので、ご注意ください。
はじめに
macにhomebrewを使用してhydraをインストールしてクラックをデモしてみます。
hydraインストール
hydraはパスワードクラック用のライブラリです。
あるサーバのftpやssh、basic認証のパスをクラックします。
クラックを推奨しているわけではなく、自サーバがブルートフォースにあった場合に突破されにくいかどうかをチェックするためです。汗
インストール
まずはhydraの概要をチェックします
% brew info hydra (git)-[master] hydra: stable 8.1 (bottled), HEAD Network logon cracker which supports many services https://www.thc.org/thc-hydra/ /usr/local/Cellar/hydra/8.1 (14 files, 1.2M) * Built from source with: --with-libssh From: https://github.com/Homebrew/homebrew/blob/master/Library/Formula/hydra.rb ==> Dependencies Build: pkg-config ✔ Required: openssl ✔ Optional: subversion ✘, libidn ✘, libssh ✔, pcre ✔, gtk+ ✘ ==> Options --with-gtk+ Build with gtk+ support --with-libidn Build with libidn support --with-libssh Build with libssh support --with-pcre Build with pcre support --with-subversion Build with subversion support --HEAD Install HEAD version
info情報の通り、opensshが必須です。インストールされていない場合(チェックになっていない)はインストールしてください
% brew install openssh
ではhydraをインストールします
libsshも必要なようなのでwithオプションでインストールします
% brew install hydra --with-libssh
これでインストールできました。
hydraのバージョンをチェックしてみましょう ※合わせてオプションを確認してみましょう
% hydra -v Hydra v8.1 (c) 2014 by van Hauser/THC - Please do not use in military or secret service organizations, or for illegal purposes. Syntax: hydra [[[-l LOGIN|-L FILE] [-p PASS|-P FILE]] | [-C FILE]] [-e nsr] [-o FILE] [-t TASKS] [-M FILE [-T TASKS]] [-w TIME] [-W TIME] [-f] [-s PORT] [-SuvVd46] [service://server[:PORT][/OPT]] Options: -l LOGIN or -L FILE login with LOGIN name, or load several logins from FILE -p PASS or -P FILE try password PASS, or load several passwords from FILE -C FILE colon separated "login:pass" format, instead of -L/-P options -M FILE list of servers to attack, one entry per line, ':' to specify port -t TASKS run TASKS number of connects in parallel (per host, default: 16) -U service module usage details -h more command line options (COMPLETE HELP) server the target: DNS, IP or 192.168.0.0/24 (this OR the -M option) service the service to crack (see below for supported protocols) OPT some service modules support additional input (-U for module help) Supported services: asterisk cisco cisco-enable cvs ftp ftps http[s]-{head|get} http[s]-{get|post}-form http-proxy http-proxy-urlenum icq imap[s] irc ldap2[s] ldap3[-{cram|digest}md5][s] mssql mysql nntp oracle-listener oracle-sid pcanywhere pcnfs pop3[s] postgres rdp redis rexec rlogin rsh s7-300 sip smb smtp[s] smtp-enum snmp socks5 ssh sshkey teamspeak telnet[s] vmauthd vnc xmpp Hydra is a tool to guess/crack valid login/password pairs. Licensed under AGPL v3.0. The newest version is always available at http://www.thc.org/thc-hydra Don't use in military or secret service organizations, or for illegal purposes. Example: hydra -l user -P passlist.txt ftp://192.168.0.1
-xオプションを使う場合のyosemite環境の対策
-xオプションはランダム(passlistがない場合 ※password辞書)なブルートフォースを行う場合に使えるオプションです。
/usr/includeディレクトリがない場合に-xオプションでエラーとなるため対応が必要です。
macのバージョンにより存在しないようでyosemite環境ではなかったです。marveric以降はないのかもしれません。
% hydra -x -h Hydra v8.1 (c) 2014 by van Hauser/THC - Please do not use in military or secret service organizations, or for illegal purposes. [ERROR] -x option is not available as math.h was not found at compile time
※/usr/includeの直下にmath.hが必要です
以下のコマンドでダイアログが表示されるのでインストールしてください
% xcode-select --install
hydraでsshクラックデモ
今回はsshクラックのみ確認してみます
パスワードリストファイルを使用してブルートフォース
まずはパスワードリストファイルを作ります。適当です。
password 123456 abc123 hello testtest
※ファイル名はpasslistとしておきます
よく使われるパスワードトップ500について参考:
http://www.symantec.com/connect/blogs/top-500-worst-passwords-all-time
※ここにあるパスワードは個人でパスワードとしては使わないほうが安全です
フォーマット
hydra -l [ユーザ名] -P [パスワード辞書ファイル] [対象サーバIPアドレス] ssh
ではクラックします
% hydra -l root -P passlist 123.456.789.000 ssh
※ユーザ名はroot,サーバIPは123.456.789.000として確認します。ユーザ名もパスワード同様に-Lオプションでクラック可能です。
うまくパスワードをクラックすると以下のようなメッセージになります
1 of 1 target successfully completed, 1 valid password found
ランダム値を使用してブルートフォース(-xオプション使用)
フォーマット
hydra -l [ユーザ名] -x [パスワードパターン] [対象サーバIPアドレス] ssh
[パスワードパターン]は MIN:MAX:CHARSET形式で指定します
MINからMAXまでの範囲の文字数のパスワードを設定します ※4:6であれば4文字から6文字の範囲
CHARSETは、1指定で数字、a指定でアルファベット小文字、A指定でアルファベット大文字を指します
ではクラックします
% hydra -l root -x 4:6:1aA 123.456.789.000 ssh
※ユーザ名はroot,サーバIPは123.456.789.000として確認します。
うまくパスワードをクラックすると以下のようなメッセージになります
1 of 1 target successfully completed, 1 valid password found
tigの最低限の流れ
tigでとてもわかりやすい図をみつけたのでなくさないようにメモします
※引用元をそのまま転載です
引用元:
tigでgitをもっと便利に! addやcommitも
http://www.rich.co.jp/blog/tech/1245
はじめに
2015年9月16日にios9がリリースです。
伴ってアプリ側もios9対応と前々から言われているipv6対応をしていく必要があるので参考となる情報を載せておきます。
iOS9も動作保障するのであれば一旦ビルドして早急に確認しましょう
iOS9ユーザ視点新機能:
http://www.apple.com/jp/ios/whats-new/
iOS9日本公開日時は17日の午前2時を予定
http://www.timeanddate.com/worldclock/fixedtime.html?msg=iOS+9&iso=20150916T10&p1=224
iOS9対応/ipv6対応について記事を載せてる参考サイト
公式
https://developer.apple.com/library/prerelease/ios/navigation/
リリース内容公式(ios9.0)
https://developer.apple.com/library/prerelease/ios/releasenotes/General/WhatsNewIniOS/Articles/iOS9.html
リリース内容公式(ios9.1)
https://developer.apple.com/library/prerelease/ios/releasenotes/General/WhatsNewIniOS/Articles/iOS9_1.html
apns(2015WWDCより)
http://odecee.com.au/wwdc-2015-big-changes-to-apple-push-notifications/
iOS9 で必要な IPv6 only Network への対応
http://qiita.com/shao1555/items/4433803419dfc72bf80b
秋のiOS 9対応リリースに向けて、iOSアプリ開発者が今からやっておくべきことまとめ
http://qiita.com/mono0926/items/e7c4ca0bf0f5196b88a2
【追記】iOS9でHTTP通信がSSL通信になるのを防ぐ方法
http://nlogic.jp/?p=412
iOS9 ATS問題
http://qiita.com/yanayanalte/items/e6d83c12af77fa238a58
[iOS 9] iOS 9 で追加された App Transport Security の概要
http://dev.classmethod.jp/smartphone/iphone/ios-9-intro-ats/
【iOS9】API Diffs から見る iOS 9 の新機能
http://d.hatena.ne.jp/shu223/20150609/1433813938
開発者向けiOS 9、WatchOS 2、Swift 2、Xcode 7の新機能と新しいApple Developer Programの参考情報まとめ
http://www.atmarkit.co.jp/ait/articles/1507/24/news025.html
iOS9 SDKでDeprecatedになるもの。
http://quesera2.hatenablog.jp/entry/2015/06/29/001035
iOS 9の「Search API Best Practices and FAQs」が公開されたので読み解いてみた
http://qiita.com/mono0926/items/27af791065ed919255e0
iOS9のWebviewでNSURLErrorDomainとなる場合の対処法(ATS)
http://qiita.com/peromasamune/items/f5b72c4dbd33b5019611
UIWebViewでhttpなURLにアクセスしようとしたら代わりにSFSafariViewControllerで開くようにする
http://qiita.com/bricklife/items/ac92be3e33c7c9eaca9b
iOS9対応について
iOS9対応を行い、これからiOS9へ移行したユーザでも使用できるようにアプリも移行作業を進めましょう
まずXcodeで[Base SDK]をiOS9.0に設定しビルドします。
ここでビルドエラーになった場合に、エラー箇所を修正していきます。
公式資料:
https://developer.apple.com/library/prerelease/ios/navigation/
XCode 7 への移行について
2015/9/11時点では9/9のXcode 7.1 beta版が最新版です。
iOS9はXcode6でビルド可能です、XCode7の機能を使う予定がなければ、正式リリースされたあとで入れてもいいと思います。
XCodeバージョン情報:
https://developer.apple.com/xcode/download/
iOS9で変更(非推奨)APIの修正について
swift/objective-cで追加や非推奨となるAPI一覧が出ているため、更新されたAPIはios9用にしてあげるといいです。
非推奨なので基本的には使えるはずですがいずれ使えなくなる可能性があります。
swiftのメソッドは非推奨ではなくremoveになっているのが結構あるので別途用意されている代わりのメソッドに移行する必要があります。
https://developer.apple.com/library/prerelease/ios/releasenotes/General/iOS90APIDiffs/index.html
ATS(App Transport Security)について
公式より、ios9とOS X 10.11からサーバとアプリ間のネットワークはセキュア(https)なアクセスを行う機能とのことです。デフォルト設定でオンになっているのでhttpでもアクセスできるようにするにはATSの機能をオフ設定にして設定を上書きしないといけなくなりました。
Xcodeで[Base SDK]をiOS9.0に設定してビルドするとATSがデフォルトでONになるので、この設定を行わない限りは既存アプリでOSをiOS9にアップグレードしてもアプリはエラーにはなりません。
App Transport Security is a feature that improves the security of connections between an app and web services. The feature consists of default connection requirements that conform to best practices for secure connections. Apps can override this default behavior and turn off transport security.
Transport security is available on iOS 9.0 or later, and on OS X 10.11 and later.
ユーザ情報などのセキュアにするべきデータを扱うアプリ(サービス)では、すでにSSL対応はしていても、公に公開されているRSSデータのやり取りなどではSSL対応していない場合が多いとおもいます。
今回のATS機能により対象がすべてのサーバAPIのデータ・WebViewに表示しているサーバサイト自体もすべてSSL対応したサイトへのアクセス以外は受け付けなくなります。
対応方法は以下3点のいずれかになります
- サーバをSSL対応する(httpsでアクセスできるようにする)
- ATSで対象サーバのみ無効にする(Info.plistファイルを編集して対応可能)
- ATS自体を無効にする(Info.plistファイルを編集して対応可能) ※リジェクトされる可能性あるのでやめたほうが無難
サーバ側で対応する場合はTLSプロトコルの1.2以上をサポートする必要があります
The server must support at least Transport Layer Security (TLS) protocol version 1.2.
Connection ciphers are limited to those that provide forward secrecy (see the list of ciphers below.)
Certificates must be signed using a SHA256 or better signature hash algorithm, with either a 2048 bit or greater RSA key or a 256 bit or greater Elliptic-Curve (ECC) key.
Invalid certificates result in a hard failure and no connection.
アプリの設定ファイルInfo.plistファイルでデフォルトのセキュアなアクセスを上書きして変更することができます
You can specify exceptions to the default behavior in the Info.plist file in your app or extension. Use the keys in the property list for specific exceptions or to turn off App Transport Security.
ATSを有効状態で対象サーバのみ無効にするにはInfo.plistに以下のように指定すると良いようです。
<key>NSAppTransportSecurity</key> <dict> <key>NSExceptionDomains</key> <dict> <key>[無効にするサーバドメイン]</key> <dict> <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key> <true/> </dict> </dict> </dict>
NSExceptionDomainsで例外(無効)にするドメインを指定します
NSExceptionDomains
A dictionary of App Transport Security exceptions for specific domains. Each key is a string containing the domain name for the exceptions.
指定の詳細は公式資料を参考ください
ipv6対応について
App Storeの審査で、現行はipv4/ipv6の何れかまたは両方の対応があるアプリはリリース可能でしたが、
今後はIPv6対応をしていないものはリリースできなくなります。
サーバ,キャリアがipv6対応していればとくに、アプリ内で対応はだいたいのアプリで不要となりますがipv4に依存している場合に修正が必要になるので以下項で記載します。
公式資料に移行手順が書いてあります。
公式資料:
https://developer.apple.com/library/
https://developer.apple.com/videos/wwdc/2015/?id=719
http://devstreaming.apple.com/videos/wwdc/2015/719ui2k57m/719/719_your_app_and_next_generation_networks.pdf
ipv4アドレスを直接指定している場合の対応
固定のipv4のipアドレスを直接アプリでリテラル指定している場合は修正が必要になります。
webviewやwebapi時に指定しているホストはipアドレスではなくドメイン指定としてください。
Don’t Use IP Address Literals
Make sure you aren’t passing IPv4 address literals in dot notation to APIs such as getaddrinfo and SCNetworkReachabilityCreateWithName. Instead, use high-level network frameworks and address-agnostic versions of APIs, such as getaddrinfo and getnameinfo, and pass them hostnames or fully qualified domain names (FQDNs). See getaddrinfo(3) Mac OS X Developer Tools Manual Page and getnameinfo(3) Mac OS X Developer Tools Manual Page.
引用:
https://developer.apple.com/library/
非推奨なネットワークapiを使用している場合の対応
ipv4に依存(ipv4で動作しているメソッドなど)したメソッドをコールしている場合は修正が必要になります。
ipv4に依存したNSURLConnectionを使っている場合は、代わりにNSURLSessionを使ってください。
Deprecated APIs
The following APIs are deprecated:
The Address Book and Address Book UI frameworks. Use the Contacts and Contacts UI frameworks instead.
The NSURLConnection API in the Foundation framework. Use NSURLSession APIs instead.
ipv4依存のapiを仕様している場合の対応
変数指定で「uint32_t, in_addr, sockaddr_in」を使っている場合、apiで「inet_aton, gethostbyname」を使っている場合、ipv4でしか動作しないapiをコールしている場合、ipv4のアドレスチェックをアプリでしている場合などはipv6で動作するよう修正が必要とあります。
What Breaks?
IPv4-only code
IPv4-only storage objects: uint32_t, in_addr, sockaddr_in
IPv4-only APIs: inet_aton, gethostbyname
IPv4-only usage of an API: gethostbyname2(hostname, AF_INET);
Pre-flight checks before connecting
• Checking if device has an IPv4 address
• Checking for reachability to 0.0.0.0
対応期限
At WWDC 2015 we announced that iOS 9 will support IPv6-only network services. All apps submitted to the App Store must support IPv6 starting in early 2016. To make sure your app is compatible, use the networking frameworks (e.g., “NSURLSession”), avoid use of IPv4-specific APIs, and avoid hard-coded IP addresses. Before submitting your app, test for compatibility.
引用:
https://developer.apple.com/news/?id=08282015a
「starting in early 2016」とある通り
今のところは2016年初頭までに対応する必要があるようです。元々の発表では2015年末までだったため、変更が入りました。
ここを過ぎるとAppleStoreの審査に通らなくなります。これから実装するものは対応を必須としたほうがよさそうです。
APNSプッシュ通知について
iOS9対応とは別でAPNSの仕様が変更されます。
2016年で正確な日付はアナウンスされていませんが、デバイストークンの長さが32バイトから100バイトに変更されます。
DBのサイズが100未満で固定にしている場合は変更が必要ですね。
APNS token getting bigger
Up until this point, a device token (used to identify a particular iOS or Mac device for the purposes of sending push notifications) has been a 32-character hexadecimal string. At WWDC 2015 – buried in the middle of a history lesson about how to use APNS – Apple quietly announced that they are planning on lengthening their device tokens from 32 bytes to 100 bytes next year. It may seem like a boring change – but it’s something many of us will need to plan for by checking that our database schema will accommodate these larger tokens.
引用:
http://odecee.com.au/wwdc-2015-big-changes-to-apple-push-notifications/
他サービスのios9のアナウンスについて
うーん、動作検証した上で動かない可能性を懸念するのはなにがあるんでしょう。
『アイ★チュウ』 iOS9対応につきまして
http://www.i-chu.jp/p655
【重要】スマレジのiOS9対応について
http://timecard.smaregi.jp/news/press/2015090847.php
感想
Androidと違いiosはバージョンが上がったタイミングでSDKにあわせて移行対応が必要になる場合が多いので毎年この時期は大変です。
Androidも必須でなくてもバージョンが上がったらガイドラインの変更にあわせて直した(Deprecateメソッドも増えるので)ほうがいいですね。
ただ便利なUIツールやAPIが使えないっていうくらいな印象です。
GraphAPI変更点
FacebookのAPI仕様変更についてメモしておきます
2015/4より1.0が新規・既存アプリで終了し2.0が適用されています
変更点で多くのアプリで影響を受けそうなのは、ユーザIDがグローバルなIDを取得できていたところが、アプリ専用のIDになる、友達リストが全友達ではなくアプリ利用者のみという仕様変更が大きいのかなと思います。
ユーザIDについては仕様変更をしらずに使っているとあとで痛い目にあいそうですね。
引用元:
https://developers.facebook.com/docs/apps/changelog?locale=ja_JP
v1.0からv2.0への変更点
・アプリ専用のユーザーID: 利用者の情報の保護を強化するため、利用者が、グラフAPIをv2.0にアップグレードしたアプリにログインする場合、Facebookではその利用者の元のIDではなく、アプリ専用IDを発行するようになりました。ただし、以前にアプリにログインしていた利用者の場合、ユーザーIDは変更されません。
・アプリの友達: /me/friendsエンドポイントには、利用者の全友達リストが含まれなくなりました。 その代わり、その利用者の友達のうち、同じアプリを使用している友達のリストが返されます。
・/{id}/pictureを除く、グラフAPI v2.0への要求にはすべて、アクセストークンが必要です。
・/me/permissionsエンドポイントの形式が更新されました。 アクセス権限とそれらの権限が許可されているかまたは拒否されているかを示すステータスフィールドがリストに含まれるようになりました。
v2.0で利用可能な新機能
・タグ付け可能な友達API: 「/me/taggable_friends」と呼ばれる新しいエンドポイントを追加しました。このエンドポイントを使用すると、友達がアプリを使用していなくても、その友達をタグ付けした記事を生成できます。 このタグ付け可能な友達APIを使用する場合、アプリのレビューが必要になります。
・招待可能な友達API: 「/me/invitable_friends」と呼ばれる新しいエンドポイントを追加しました。このエンドポイントを使用すると、友達リストを生成し、カスタムインターフェイスを通じてゲームに招待できます。 このAPIは、Facebookキャンバス上のゲームアプリの場合だけ利用できます。
・ソーシャルコンテキストAPI: オブジェクトおよびアプリに新しいエンドポイントを追加しました。このエンドポイントを使用すると、あるオブジェクトに関する利用者の友達のアクションを表示できます。 たとえば、/{movie-id}?fields=contextエンドポイントを見ると、自分の友達のうち誰がこの映画を観たかわかります。 または、/{game-app-id}?fields=contextエンドポイントを見ると、自分の友達のうち誰がこのゲームで遊んだかがわかります。 ゲームアプリの例は、ゲーム間での相互宣伝を行う場合に、特に便利です。
・ビジネスマッピングAPI: このリリースにより、1つのビジネスでたくさんのアプリを所有することができます。 アプリ専用のユーザーIDを発行する動きと共に、「/me/ids_for_business」と呼ばれる新しいエンドポイントの導入を進めています。このエンドポイントを使用すると、1つのユーザーIDと、ユーザービジネスマネージャ内に定義されたビジネスと同じものに関連付けられた複数のアプリを、相互に関連付けることができます。
・タグ付けされたスポットAPI: 「/me/tagged_places」と呼ばれる新しいエンドポイントの追加を進めています。このエンドポイントを使用すると、写真、動画、近況、リンク内で、利用者がタグ付けしたすべてのスポットにアクセスできます。 このエンドポイントに関連付けられた新しい権限は次の通りです。 user_tagged_places.
アプリ専用のユーザーIDについて
上記変更点に記載している通りのため、既存アプリでバージョン1.0を使用している場合にバージョン2.0に切り替えても、グローバルなユーザIDをそのまま使用してくれるようです。
新規アプリでバージョン2.0以降から使用する場合は、グローバルIDではなくアプリ専用のIDが使われるということです。
そのため、ユーザの識別でユーザIDを使用しているだけであれば影響はないです。
はじめに
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; } }); } }
ここまでで実装完了です。
あとはアプリ仕様にあわせてナビゲーションなど実装してください
はじめに
Unicorn + Nginxで、Railsアプリの公開までに必要な設定を行います。
最近のRailsアプリではApache + Passengerの組み合わせよりもパフォーマンス面に強いということでNginx + Unicornが使われることが多くなっています。
Unicorn導入
UnicornはRuby用アプリケーションサーバのことです。
Unix系OS上で動作するRack規格Rubyアプリケーションを動かすためのアプリケーションサーバです。
Unicornの設定はいろいろあるので今回は簡易設定のみにします。
公式ページ:
http://unicorn.bogomips.org/
Unicornの詳細で参考にしたページです
http://www.engineyard.co.jp/blog/2013/everything-you-need-to-know-about-unicorn/
デプロイ対象のRailsプロジェクトを設置
今回は/home/直下に設置します
Unicornインストール
デプロイ対象のアプリディレクトリ直下のGemfileに以下を追加します
gem install unicorn
インストールします
$ bundle install
Unicorn設定
sock,pidファイルのディレクトリを作成します
$ mkdir /var/run/unicorn $ chmod 777 /var/run/unicorn
デプロイ対象のアプリディレクトリ直下のconfigディレクトリへunicorn.rbファイルを作成し以下コードで保存します
application = "<Railsアプリケーションディレクトリ名>" worker_processes = 2 working_directory "/home/#{application}" listen "/var/run/unicorn/unicorn_#{application}.sock" pid "/var/run/unicorn/unicorn_#{application}.pid" stderr_path "/home/#{application}/log/unicorn.stderr.log" stdout_path "/home/#{application}/log/unicorn.stdout.log" preload_app true
※worker_processesは適時変えてください
Unicorn起動時などにエラーなど出る場合は上記指定しているパスの「unicorn.stderr.log」ファイルで確認ができます
Unicorn起動
デプロイ対象のアプリディレクトリ直下で以下コマンドを実行します
$ unicorn_rails -c config/unicorn.rb -E development -D
※ここでエラーが出なければプロセスが実行されています
unicorn_railsのオプションについては以下になります
-c : 設定ファイル
-E : RAILS_ENV(デフォルトはdevelopment)
-D : デーモンで実行(バックグラウンド)
-p : ポート指定
–path : ディレクトリ指定
unicornのプロセスを確認してみます
ps aux | grep unicorn
ここで正しくでていればOKです
Nginx導入
軽量・高速のwebサーバーでRailsの開発ではApacheよりシェア高く、速度も高速とのことのようです。
こちらもいろいろしようとすると設定がいろいろあるので、プロジェクトにあった設定にするとパフォーマンスがあがる?と思います。
Nginxインストール
Nginxをインストールします
$ yum install nginx
Nginx設定
デフォルト設定ファイルを無効にし、設定ファイルsample.confを作成します
$ cd /etc/nginx/conf.d $ mv default.conf _default.conf.bak $ vim sample.conf
sample.confは以下の設定にします
upstream unicorn-unix-domain-socket { server unix:/var/run/unicorn/unicorn_hoge.sock fail_timeout=0; } upstream unicorn-tcp { server 127.0.0.1:3000; } server { listen 80; server_name localhost; root /home/[railsapp]/public; access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log; location / { proxy_pass http://unicorn-unix-domain-socket; } }
※「unicorn_hoge.sock」部分はunicorn.rbの「listen “/var/run/unicorn/unicorn_#{application}.sock”」で設定した値に置き換えて設定してください
Nginx起動
Nginxを起動します
$ service nginx start
既に起動している場合に設定情報を反映される場合は再起動をします
$ service nginx restart
ブラウザ動作チェック
http://[ipアドレス]
はじめに
Androidのライブラリを導入時にManifestファイルで競合が発生し、実行できなくなったので改善案をメモしてます。
エラー発生から解決まで
Androidのライブラリを導入時にManifestファイルでiconの競合たるエラーが発生しました。
恐らく、ライブラリとiconで競合しどちらを優先するべきかコンパイラがわからなくなってのエラーと思います。
エラー詳細:
Error:(9, 9) Attribute application@icon value=(@drawable/ic_launcher.png) from AndroidManifest.xml:9:9
Error:(9, 9) Execution failed for task ‘:app:processDebugManifest’.
> Manifest merger failed : Attribute application@icon value=(@drawable/ic_launcher.png) from AndroidManifest.xml:9:9
is also present at com.github.example:1.0.0:13:9 value=(@drawable/ic_launcher)
Suggestion: add ‘tools:replace=”android:icon”‘ toelement at AndroidManifest.xml:7:5 to override
解決方法
エラー詳細に記載されている通り競合したプロジェクトのiconをreplaceすることで無事実行できました。
まずManifestファイルのmanifestタグを修正します
xmlns:tools=”http://schemas.android.com/tools”を追加します
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="hoge.piyo.xxx" xmlns:tools="http://schemas.android.com/tools">
次にManifestファイルのapplicationタグを修正します
tools:replace=”android:icon”の追加します
<application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" tools:replace="android:icon" android:theme="@style/AppTheme" >
ここまでで改善しました
はじめに
Googleが開発しているjsonライブラリのgsonをAndroidStudioへ導入します。
javaでjsonのパーサーなどでよく使われています。
gsonについて
gsonを導入することで、jsonデータをjsonObjectへ変換(逆も可能)することができます。
また、jsonデータをそのままModelデータへすることも可能です。
gsonライブラリはMavenリポジトリにあります
現在バージョンは2.3.1になってます。
Mavenリポジトリ:
http://mvnrepository.com/artifact/com.google.code.gson/gson
プロジェクトへgsonの取り込み
プロジェクトのapp/build.gradle(AndroidStudioではGradleScriptでModule: appのbuild.gradle)へ以下を追加します
dependencies {
compile ‘com.google.code.gson:gson:2.3.1′
}
※dependenciesはプロジェクト新規で存在しているため、compile構文を一行追加でOKです
Mavenリポジトリをダウンロードして参照するためプロジェクト内へjarを配置などは不要です。
ここまでで取り込み完了です
gsonのライブラリを使ってみる
jsonデータをModelへ変換を行ってみます。
jsonデータは以下とします
{ "args": {}, "data": "", "files": {}, "form": {}, "headers": { "Accept-Encoding": "gzip", "Content-Length": "0", "Content-Type": "application/x-www-form-urlencoded", "Host": "httpbin.org", "User-Agent": "Dalvik/1.6.0 (Linux; U; Android 4.1.1; HTL21 Build/JRO03C)" }, "json": null, "origin": "123.456.789.123", "url": "http://httpbin.org/post" }
Modelを作る
まずはjsonデータをModelに変換するためのModelを作成します
import com.google.gson.annotations.SerializedName; public class TestModel { // 変数宣言 @SerializedName("data") private String data; @SerializedName("origin") private String origin; @SerializedName("url") private String url; @SerializedName("headers") private Header headers; // getter/setter public String getData() { return data; } public void setData(String data) { this.data = data; } public String getOrigin() { return origin; } public void setOrigin(String origin) { this.origin = origin; } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } public Header getHeaders() { return headers; } public void setHeaders(Header headers) { this.headers = headers; } /** * heddarクラス */ class Header{ // 変数宣言 @SerializedName("Accept-Encoding") private String acceptEncoding; @SerializedName("Content-Length") private Integer contentLength; @SerializedName("Content-Type") private String contentType; @SerializedName("Host") private String host; @SerializedName("User-Agent") private String userAgent; // getter/setter public String getAcceptEncoding() { return acceptEncoding; } public void setAcceptEncoding(String acceptEncoding) { this.acceptEncoding = acceptEncoding; } public Integer getContentLength() { return contentLength; } public void setContentLength(Integer contentLength) { this.contentLength = contentLength; } public String getContentType() { return contentType; } public void setContentType(String contentType) { this.contentType = contentType; } public String getHost() { return host; } public void setHost(String host) { this.host = host; } public String getUserAgent() { return userAgent; } public void setUserAgent(String userAgent) { this.userAgent = userAgent; } } }
アノテーションで指定している@SerializedNameは実際のjsonのkeyと紐付けて別の名前の変数へ代入ができます。
アノテーションを指定しない場合は、jsonのkey名と完全一致の変数名としなければいけません。
上記サンプルでは作法として全ての変数名に指定しておきます。
作法として入れてますがgetter/setterは特に用意しなくてもgson自体は動作します。その場合は変数はpublicにしてアクセスしてください。
jsonデータをModelへ変換する
では上記で作成したModelへjsonデータを入れてみます
gsonをインポートします
import com.google.gson.Gson;
Modelへjsonデータを入れます
Gson gson = new Gson(); TestModel model = gson.fromJson(response.toString(),TestModel.class);
※response変数にjsonデータを入れています
ここまででModelへjsonデータを入れることができました。とてもシンプルに簡単にできて便利です。
実際にサーバのデータを取得してgsonでパースする想定ですので、サーバデータを取得したらresponse変数へ代入して使ってください。
Androidの場合は通信ライブラリとしてgsonと同じくGoogleが開発しているvolleyがメジャーです。※volleyについてはこちらでは省略します
はじめに
HTTPのリクエストとレスポンスが確認できるhttpbin.orgページについてご紹介します。
公式ページ:
http://httpbin.org/
httpbin.orgを使って確認とテストをしてみる
httpbin.orgページではHTTPリクエストに対してjsonデータでレスポンスを表示して確認することができます。
レスポンス情報でグローバルIPアドレスを確認することができます。
公式ページのリンクをクリックしてブラウザ上で確認することもできますが、curlコマンドやプログラムで実行してjsonレスポンスを受け取ることもできるのでget/postのテストやjsonのパーステストなどにも使えて非常に重宝します。
http://httpbin.org/
curlでグローバルIPアドレスの確認
グローバルIPアドレスを確認します
$ curl http://httpbin.org/ip
グローバルIPアドレスとリクエストヘッダ・レスポンスヘッダ(curlのverboseオプション)を確認します
$ curl -v http://httpbin.org/ip
get/post送信のテスト
以下のコマンドを実行することでget/postの送信を行いレスポンスの確認ができます。
jsonで戻ってくるのでプログラムでコールしてjsonのパースのテストなどにも使えて便利でした。
get送信でhttpレスポンスを確認します
$ curl -X GET http://httpbin.org/get
post送信でhttpレスポンスを確認します
$ curl -X POST http://httpbin.org/post
postにパラメータを含めて送信でhttpレスポンスを確認します
$ curl -X POST http://httpbin.org/post -d “key1=test&key2=test”
はじめに
[git submodule add]コマンドを実行したときにエラー「A git directory for ‘[指定モジュール]‘ is found locally with remote(s):」が出たので解決案をメモします。
エラー発生から解決まで
こちら環境ではvolleyというandroidの通信ライブラリを導入時にエラーがでました。
フローとしては、最初の一回目のsubmodule化ではエラーにはなりません。一度入れたsubmoduleを削除するときに、[rm -rf]で単に削除し、再度[git submodule add]を行おうとするとエラーになります。
[git submodule add]で追加してgit上削除できていないものがあることでエラーが発生しています。
エラー内容:
A git directory for ‘lib/volley’ is found locally with remote(s):
origin https://android.googlesource.com/platform/frameworks/volley
If you want to reuse this local git directory instead of cloning again fromhttps://android.googlesource.com/platform/frameworks/volley
use the ‘–force’ option. If the local git directory is not the correct repo
or you are unsure what this means choose another name with the ‘–name’ option.
解決方法
不要な設定情報とファイルを手動で削除することで解決します
以下の3手順を全て実行してください
- .gitmodulesファイルから追加したモジュール情報を削除する
- .git/configファイルのモジュール情報を削除する
- .git/modules/配下にあるsubmodule化したリポジトリを削除する
ここまでで、再度[git submodule add]ができるようになりました
正しいsubmodule化したリポジトリの削除方法
そもそも削除の方法が悪かったようです。以下の方法で削除すれば上記のようなエラーにはならないはずです。
引用:
submoduleの削除
gitのバージョンが1.8.5以上なら以下の方法で出来る。
$ git submodule deinit <消したいsubmoduleへのパス>
$ git rm <消したいsubmoduleへのパス>
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学習で参考になるサイト一覧
2024年4月 月 火 水 木 金 土 日 « 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 アーカイブ
- 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月
エントリ