はじめに
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へのパス>
はじめに
Java開発で便利なjava.langをもう少しラップして機能アップされているjavaエンジニアお馴染みのライブラリをAndroidStudioへ導入します。
ApacheCommonsLangについて
ApacheCommonsLangを導入することで、langよりも便利な機能が使えるようになります。
Apache CommonsライブラリはMavenリポジトリにあります
現在バージョンは3系になってます。
Mavenリポジトリ:
http://mvnrepository.com/artifact/commons-lang/commons-lang
ApacheCommonsLangの代表的なユーティリティは以下になります。
AnnotationUtils : Annotation用ユーティリティ
ArrayUtils : 配列ユーティリティ
BitField : ビット演算ユーティリティ
BooleanUtils : Booleanユーティリティ
CharEncoding : 文字エンコーディングユーティリティ
CharUtils : Charユーティリティ
ClassUtils : Classユーティリティ
EnumUtils : Enumユーティリティ
LocaleUtils : Localeユーティリティ
ObjectUtils : Objectユーティリティ
RandomStringUtils : 乱数文字列生成ユーティリティ
Range : Range(範囲)ユーティリティ
SerializationUtils : Serializationをサポートユーティリティ
StringEscapeUtils : 文字列エスケープユーティリティ
StringUtils : 文字列ユーティリティ
SystemUtils : java.lang.helperをサポートするユーティリティ
プロジェクトへApacheCommonsLangの取り込み
プロジェクトのapp/build.gradle(AndroidStudioではGradleScriptでModule: appのbuild.gradle)へ以下を追加します
dependencies {
compile group: ‘org.apache.commons’, name: ‘commons-lang3′, version: ’3.4′
}
※dependenciesはプロジェクト新規で存在しているため、compile構文を一行追加でOKです
Mavenリポジトリをダウンロードして参照するためプロジェクト内へjarを配置などは不要です。
編集が出来ないのでさらに機能拡張する場合には継承して追加するといいとおもいます。
あとはgithubにもアップされていたため、こちらからsubmoduleなどで取り込む場合はクラスの変更が直接出来るのでいいかもしれません。
ここまでで取り込み完了です
ApacheCommonsLangのライブラリを使ってみる
まずはインポートします
import org.apache.commons.lang3.StringUtils;
※現在バージョン3系のためlangに3がつきます(バージョンにより違います)
例としてStringUtilsのisEmptyメソッドを使ってみます
String test = “”; // なんらかの入力文字
if (StringUtils.isEmpty(test)){
//testが空だった場合のなんらかの処理
}
以上です。
いろいろとStringUtilsクラスのメソッドなど一覧をみてみると便利そうなのがありました。
個人的にはRandomStringUtilsクラスが便利なので良く使います。
はじめに
マテリアルデザインはシンプルでフラットなGoogleが提唱しているAndroidの新しいデザイン模様です。
Android開発でマテリアルデザインを取り込むのをサポートしているライブラリを導入してみます。
マテリアルデザインについては以下を参照ください
https://www.google.com/design/spec/material-design/introduction.html#
MaterialDesignLibraryについて
MaterialDesignLibraryはAndroidのマテリアルデザインをサポートしているライブラリです。
※starも現在4700ついてました
実際どういったライブラリかどうかは以下のデモアプリで確認できます
https://play.google.com/store/apps/details?id=com.gc.demomaterialdesign
MaterialDesignLibraryリポジトリ詳細は以下を確認ください
https://github.com/navasmdc/MaterialDesignLibrary
プロジェクトへMaterialDesignLibraryの取り込み
まずは導入するプロジェクトを作成してください。
プロジェクト直下へ移動して以下のコマンドでライブラリをgitのサブモジュールとして取り込みます。
※GitHubのリポジトリより直接ダウンロードして配置しても問題ありません
$ git submodule add https://github.com/navasmdc/MaterialDesignLibrary.git
$ git submodule init
$ git submodule update
プロジェクトへMaterialDesignLibraryを読み込み
プロジェクトのapp/build.gradle(AndroidStudioではGradleScriptでModule: appのbuild.gradle)へ以下を追加します
repositories {
jcenter()
}dependencies {
compile ‘com.github.navasmdc:MaterialDesign:1.5@aar’
}
※dependenciesはプロジェクト新規で存在しているため、compile構文を一行追加でOKです
ここまでで取り込み完了です
MaterialDesignLibraryのViewを使ってみる
レイアウトの外枠は以下を設置してください
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:materialdesign="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" > </RelativeLayout>
上記のRelativeLayout内へボタンを配置してみます
<com.gc.materialdesign.views.ButtonFlat android:id="@+id/buttonflat" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="#1E88E5" android:text="Button" />
これでボタンが表示されればOKです。簡単にマテリアルデザインのビューを実装できました。
ボタンのイベントコールバックなどもAndroidデフォルトのボタンと変わらないので簡単です。
その他Viewの詳細についてはREADMEより確認してください
https://github.com/navasmdc/MaterialDesignLibrary
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学習で参考になるサイト一覧
アーカイブ
- 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月
エントリ