そごうソフトウェア研究所

SOA、開発プロセス、ITアーキテクチャなどについて書いています。Twitterやってます@rsogo

Android:Fragmentの画面遷移時にアニメーション

Androidで、Fragmentの画面遷移の時にアニメーションを付けるやりかたを書きます。 FragmentTransaction.setCustomAnimationsを使いました。 FragmentTransaction | Android Developers

進む時のみにアニメーションを付ける場合

setCustomAnimations(int enter, int exit)

  • enter: 次に表示されるFragmentのアニメーション
  • exit: 今表示されているFragmentのアニメーション

Backボタンなど、戻る時にもアニメーションを付ける場合

setCustomAnimations(int enter, int exit, int popEnter, int popExit)

popEnter、popExitに戻る時のアニメーションを指定します。

  • popEnter: 戻る時に次に表示されるFragmentのアニメーション
  • popExit: 戻る時に今表示されているFragmentのアニメーション

引数で指定するのは、アニメーションを指定したリソースIDです。 左からスライド・インさせるアニメーションであればこんな感じ。

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:duration="300"
        android:fromXDelta="-100%"
        android:toXDelta="0" />
    <alpha
        android:duration="300"
        android:fromAlpha="0.0"
        android:toAlpha="1.0" />
</set>

Activityの画面遷移全体に付けるのなら、Themeに指定するのが一番楽です。 詳しくはこちらが参考になりました。 【Android】画面遷移時のアニメーション設定 - Furudateのブログ

参考にさせてもらったサイト

LollipopでFragmentをスライドインするアニメーションの適用 - Qiita

java.lang.RuntimeException: Unknown animator name: translateが発生した時の対応を書いてありました。同じエラーが発生したのですが、自分の場合は、FragmentTransactionはSupportライブラリを使うことで、回避しました。

EclipseからAndroid Studioへ移行しました

先週末、あるAndroidのプロジェクトをEclipseベースから、Android Studioに移行しました。

新規のプロジェクトや、小さめのプロジェクトはAndroid Studio化は完了していたのですが、一番大きいプロジェクトは社外の開発者の方の慣れもあって、踏み切れていなかったのですが、急遽やる必要があって、慌ててやった感じです。

Android Studioに移行するにあたって、一番大きいのはGradleベースでビルド、リリースをできるようにすることでした。

Gradleでのライブラリの取り込みにでは次の3つを使い分けました。

  1. リポジトリに登録されているライブラリの参照
  2. jarファイルで公開されているライブラリの参照 リポジトリに登録されていない、社内のライブラリなど
  3. ライブラリプロジェクトの参照 ライブラリのソースを編集するようなケース
dependencies {
    compile fileTree(dir: ‘libs’, include: [‘*.jar’])
    compile ‘com.android.support:support-v4:22.+’    // 1の例
    compile ‘com.google.code.gson:gson:2.2.4’
    compile files(‘libs/StaggLib.jar’)     // 2の例
    compile project(‘:subproject’)       // 3の例
}

1,2は特に問題がないと思いますが、3について、やり方を忘れるので、メモ。

「File -> New -> Import Project」を選択

settings.gradleに参照が追加されるGUIでの操作では対象のプロジェクトは、元プロジェクトにコピーして、インポートされるので注意が必要。必要に応じて、コピーされたファイル群を削除して、File('')のパスをオリジナルのプロジェクトを参照するように修正する。

後は、Jarファイルを直接参照していたいのを、リポジトリから取得するように変更して、コンパイルが通るまで、ライブラリの重複なんかを取り除いていく。

その他、移行中に発生したエラーはこんな感じ。

移行とは、直接関係ないけど、ハマったのがAndroid Studioがハングするという問題。

Macで開発していましたが、Applications以下のAndroid Studioを削除したり、別のフォルダに新規にインストールしましたが、解決せず。 結局、こちらの情報を元に、Applications以外の場所もキレイにして、再インストールで解決しました。Applicationsの下だけ消せば、綺麗にアンインストールできるというのが、Macの良いところだと思うんだけど、これだとWindowsと一緒だよー!

その他参考にさせていただいた記事。

基本をおさえる!Androidアプリで指定するバージョンについて(compileSdk,buildToolsVersion,....) - Qiita

Android Studioでproguard付きでビルドした時の`Duplicate zip entry`エラーの調査と対応 - Qiita

Android Studio で Build Variants - Qiita

移行そのものではないけど、Gradle化に合わせて、環境差異や、リリース版/テスト版の違いをBuild Typeなんかで切り分けるのも入れた。

WebLogic 12.1.2のCUIインストール

WebLogicCUIのみで入れる必要があって、いろいろ調べました。

12.1.1はコンソールモードっていうのがあって、CUIだけでインストールできるのですが、12.1.2からはなくなりました。サーバー側のソフトウェアのインストーラーにX Window systemがいるのって、本当にナンセンスだと思います。

クラウド化が進んでいくと、サーバーはどこにあるかわからない状態になって、リモート接続してセットアップしないといけなくて、セキュリティバリバリだと、いろいろポートは開いてないし、Xで接続するだけでも面倒。

しかもWebLogicのインストールは、半年に1回くらいしかやらないから、毎回手順忘れるっていう。

コンソールモードの廃止について

http://www.slideshare.net/OracleMiddleJP/wlstudy-201412unknown-features http://docs.oracle.com/cd/E28613_01/web.1211/b65940/console_mode.htm

OSXssh経由でXに接続する

ポートフォーワーディングして、ssh経由でXに接続するやりかた。 http://www.cyberciti.biz/faq/apple-osx-mountain-lion-mavericks-install-xquartz-server/

前準備

インストール先のディレクトリの作成

今回は、次の2つを事前に作成しました。

[root@demo02 opt]# chown weblogic:weblogic /opt/oracle/weblogic/
[root@demo02 opt]# chown weblogic:weblogic /opt/oracle/oraInventory/

orainst.locの作成

[weblogic@demo02 ~]$ cat /opt/oracle/oraInventory/oraInst.loc 
inventory_loc=/opt/oracle/oraInventory/
inst_group=weblogic

WebLogicのインストール

レスポンスファイルの作成

[weblogic@demo02 ~]$ cat media/sinstall.txt

[ENGINE]
 
 #DO NOT CHANGE THIS.
 Response File Version=1.0.0.0.0

 [GENERIC]

 #The oracle home location. This can be an existing Oracle Home or a new Oracle Home
 ORACLE_HOME=/opt/oracle/weblogic/

 #Set this variable value to the Installation Type selected. e.g. Fusion Middleware Infrastructure, Fusion Middleware Infrastructure With Examples.
 INSTALL_TYPE=WebLogic Server

 #Provide the My Oracle Support Username. If you wish to ignore Oracle Configuration Manager configuration provide empty string for user name.
 MYORACLESUPPORT_USERNAME=

 #Provide the My Oracle Support Password
 MYORACLESUPPORT_PASSWORD=

 #Set this to true if you wish to decline the security updates. Setting this to true and providing empty string for My Oracle Support username will ignore the Oracle Configuration Manager configuration
 DECLINE_SECURITY_UPDATES=true

 #Set this to true if My Oracle Support Password is specified
 SECURITY_UPDATES_VIA_MYORACLESUPPORT=false

 #Provide the Proxy Host
 PROXY_HOST=

 #Provide the Proxy Port
 PROXY_PORT=

 #Provide the Proxy Username
 PROXY_USER=

 #Provide the Proxy Password
 PROXY_PWD=<SECURE VALUE>

 #Type String (URL format) Indicates the OCM Repeater URL which should be of the format [scheme[Http/Https]]://[repeater host]:[repeater port]
 COLLECTOR_SUPPORTHUB_URL=

インストーラーの実行

[weblogic@demo02 media]$ java -jar wls_121200.jar -silent -responseFile /home/weblogic/media/sinstall.txt -invPtrLoc /opt/oracle/oraInventory/oraInst.loc 
ファイルを抽出しています.......
Oracle Universal Installerを起動中です

CPU速度が300MHzを超えていることを確認してください.   実際2500.114MHz    問題なし
スワップ領域の確認中: 512MBを超えている必要があります.   実際4079612MB    問題なし
このプラットフォームに64-bit JVMが必要かどうかを確認中.   実際 64    問題なし(64-bitは不要)
一時領域の確認中: 300MBを超えている必要があります.   実際39149MB    問題なし


/tmp/OraInstall2016-02-19_03-54-05PMからOracle Universal Installerの起動を準備中
ログ: /opt/oracle/oraInventory//logs/install2016-02-19_03-54-05PM.log
Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved.
レスポンス・ファイルの読取り中..
予期した結果: enterprise-4,enterprise-5,enterprise-6,redhat-6,redhat-4,redhat-5,SuSE-10,SuSE-11の1つ
実際の結果: (不明なOSバージョン)
チェックが完了しました。このチェックの全体的な結果: 失敗しました <<<<

問題: このOracleソフトウェアは現行のオペレーティング・システム上では認証されていません。
推奨: ソフトウェアを適切なプラットフォームにインストールしていることを確認してください。
警告: チェック: CertifiedVersionsに失敗しました。
予期した結果: 1.7
実際の結果: 1.7.0_71
チェックが完了しました。このチェックの全体的な結果: 問題なし
CheckJDKVersionチェック: 成功しました。
データの検証中......
ファイルのコピー中...
-----------20%----------40%----------60%----------80%--------100%

WebLogic Server 12.1.2.0.0のinstallationが正常に完了しました。

ドメインの作成

ドメインの作成はWLSTを使ってやることができます。

こちらを参考にさせていただきました。 「一歩先に進むためのWLST活用技法 + お悩み相談室」 https://blogs.oracle.com/wlc/entry/wlstudy_20130723_2

WLSTを起動

http://montai-garage.sakura.ne.jp/getthreaddump/

[weblogic@demo02 bin]$ ./wlst.sh 
WebLogic Scripting Tool(WLST)を初期化しています...
WebLogic Server Administration Scripting Shellへようこそ
使用可能なコマンドに関するヘルプを表示するには、help()と入力してください

wls:/offline> myHome="/opt/oracle/weblogic"
wls:/offline> wlHome=myHome + "/wlserver"
wls:/offline> readTemplate(wlHome + "/common/templates/wls/wls.jar")
wls:/offline/base_domain>setOption('ServerStartMode', 'prod')
wls:/offline/base_domain>cd('/Servers/AdminServer')
wls:/offline/base_domain/Server/AdminServer>set('ListenAddress', '0.0.0.0')
wls:/offline/base_domain/Server/AdminServer>set('ListenPort', 7001)
wls:/offline/base_domain/Server/AdminServer>cd('/Security/base_domain/User/weblogic')
wls:/offline/base_domain/Security/base_domain/User/weblogic>cmo.setPassword('パスワード設定してね')
wls:/offline/base_domain/Security/base_domain/User/weblogic>writeDomain(myHome + '/user_projects/domains/mydomain')
wls:/offline/mydomain/Security/mydomain/User/weblogic>closeTemplate()
wls:/offline>exit()

WebLogic Scripting Toolを終了しています。

writeDomainで、すっごい時間掛かった。

インストール後の作業

起動WebLogicユーザーの設定

http://www.oracle.com/webfolder/technetwork/jp/obe/fmw/wls/12c/15-BootProp--4471/bootproperties.htm

ユーザーのプロパティの指定。 起動時にパスワードをいれなくていいように。

2016年2月時点でのAndroidの各種情報

2016年2月時点でのAndroidの各種情報をまとめます。

Androidのバージョンシェア

Dashboards | Android Developers

f:id:begirama:20160211013341p:plain

KitKat(4.4)と Lollipop(5.x)で7割を占めています。 Jelly Bean(4.1, 4.2, 4.3)を加えると9割を超えます。 まだMarshmallow(6.0)は少ないけど、新規であればサポートするとして、KitKat以上は必須。日本だとJelly Beanの割合ももう少し高いと想定すると、なかなかサポートしないという訳には行かないかな。

開発ツール

Android Studioを使って開発します。Eclipseベースから、Android Studioに変わって、ツールはすごく進化したと思います。

Android Studio と SDK Tools のダウンロード | Android Developers

今、安定版はv1.5。2.0のベータ版が出ています。2.0ではInstant Runと呼ばれるコードの変更を、実行中に反映できるという機能や、エミュレータの高速化が個人的に目玉。 Android Studio 2.0 Preview | Android Developers Blog

デザイン

新規でAndroidに最適化したアプリをデザインするためには、マテリアルデザインを知っておくべきでしょう。 Introduction - Material design - Google design guidelines

次のStructure、Components、Patterns(特にナビゲーション!)は、設計者、デザイナーとも知っておくべきでしょう。知らないと、Androidでは一般的ではない(標準で機能が用意されていない)ことをやることになるのでUX的にも問題だし、開発のコストも上がります。

Structure - Layout - Google design guidelines

Bottom sheets - Components - Google design guidelines

Navigation - Patterns - Google design guidelines

複数の画面サイズ、複数

Devices and Displays | Android Developers

Supporting Multiple Screens | Android Developers

スマフォとタブレットは別のレイアウトを用意しておく、複数の解像度の画像を用意しておく、ピクセルじゃなくてdpを使おうぜ、みたいな話。

複数画面のデザイン | Android Developers

上の2つの記事のもうちょい詳しい資料。

Permission

Best Practices for App Permissions | Android Developers

Android 6.0 MarshmallowからPermissionの仕組みが変わっています。

端末ID

Best Practices for Unique Identifiers | Android Developers

Instance IDの利用が推奨されています。Instance IDとは何かとか、取得の方法はWhat is Instance ID?  |  Instance ID  |  Google Developersを参照。

Instance IDを使いたくない場合は、UUIDを自分で作ってねって書いてる。

便利なチェックリスト

発注側、受注側で合意しておくといいかも。

Core App Quality | Android Developers

Tablet App Quality | Android Developers

その他のNews

日本で唯一のグローバル端末ベンダーといってもいいSonyに、スマートフォン事業からの撤退という噂もあります。 Sony sees 25-fold profit jump by 2018; could exit TVs, phones | Reuters

AWS DataPipeline TaskRunnerのJava8での実行エラー

Data Pipelineを検証しています。

Data Pipelineのマニュアルはこちら。 docs.aws.amazon.com

やりたいことはデータ分析用のバッチを夜間に実行したい。

実行するためのEC2インスタンスを指定します。指定の仕方は次の2パターン。

  1. RunOnオプションを指定して、インスタンスを起動させて実行する
  2. WorkGroupオプションを指定して、既存のインスタンス上で実行する

既存インスタンスで実行するためには、TaskRunnerを実行する必要があります。

で、Java8で実行すると下記の問題があります。

$ java -jar TaskRunner-1.0.jar  --workerGroup=ec02_dev --region=ap-northeast-1 --config=./credencials.json 
log4j:WARN No appenders could be found for logger (amazonaws.datapipeline.objects.PluginModule).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
Starting log pusher...
Not enabling task runner logging as given log uri null is invalid
Initializing drivers...
Starting task runner...
private.com.amazonaws.services.s3.model.AmazonS3Exception: AWS authentication requires a valid Date or x-amz-date header (Service: Amazon S3; Status Code: 403; Error Code: AccessDenied; Request ID: XXXXXXX), S3 Extended Request ID: XXXXXXX
    at private.com.amazonaws.http.AmazonHttpClient.handleErrorResponse(AmazonHttpClient.java:1182)
    at private.com.amazonaws.http.AmazonHttpClient.executeOneRequest(AmazonHttpClient.java:770)
    at private.com.amazonaws.http.AmazonHttpClient.executeHelper(AmazonHttpClient.java:489)
    at private.com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:310)
    at private.com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:3604)
    at private.com.amazonaws.services.s3.AmazonS3Client.createBucket(AmazonS3Client.java:792)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at private.com.amazonaws.services.datapipeline.retrier.RetryProxy.invokeInternal(RetryProxy.java:36)
    at private.com.amazonaws.services.datapipeline.retrier.RetryProxy.invoke(RetryProxy.java:48)
    at com.sun.proxy.$Proxy24.createBucket(Unknown Source)
    at amazonaws.datapipeline.logpusher.Uploader.ensureBucketExists(Uploader.java:86)
    at amazonaws.datapipeline.logpusher.Uploader.compressAndUploadToS3(Uploader.java:49)
    at amazonaws.datapipeline.logpusher.LogPusher.uploadPart(LogPusher.java:404)
    at amazonaws.datapipeline.logpusher.LogPusher.pushFile(LogPusher.java:397)
    at amazonaws.datapipeline.logpusher.LogPusher.pushItem(LogPusher.java:226)
    at amazonaws.datapipeline.logpusher.LogPusher.finishAndRemoveLogItem(LogPusher.java:108)
    at amazonaws.datapipeline.taskrunner.TaskPoller.executeRemoteRunner(TaskPoller.java:144)
    at amazonaws.datapipeline.taskrunner.TaskPoller.executeTask(TaskPoller.java:105)
    at amazonaws.datapipeline.taskrunner.TaskPoller$1.run(TaskPoller.java:81)
    at private.com.amazonaws.services.datapipeline.poller.PollWorker.executeWork(PollWorker.java:76)
    at private.com.amazonaws.services.datapipeline.poller.PollWorker.run(PollWorker.java:53)
    at java.lang.Thread.run(Thread.java:745)

公式のフォーラムでも話題になっていますが、まだ正式には解決していなさそう。 https://forums.aws.amazon.com/thread.jspa?messageID=688746

Jodaの入れ替え

TaskRunner-1.0.jarを解凍して、joda-time-2.9.1.jarのクラスファイルと入れ替えます。 ここにあります。

TaskRunner-1.0/org/joda/time

入れ替えたら、再アーカイブ。実行可能なjarにするために、マニフェストファイルを指定しています。

$ jar cfm ../TaskRunner-1.0.sogo.jar META-INF/MANIFEST.MF ./*

TaskRunnerの実行

$ java -jar TaskRunner-1.0.sogo.jar  --workerGroup=ec02_dev --region=ap-northeast-1 --config=./credencials.json

これで作ったjarはサポートされる訳は無いと思うので、公式な解決を待ちたいところです。 古いJavaを入れて、TaskRunnerは古いJavaで動かしてもいいんだけど、TaskRunnerだけのために余計なもの入れたくなかったんだよなー。

インスタントWebミーティングツール「speak」試してみたよ

Sqwiggleの人から最近、Speakっていうサービスをやってるから試してみてねという案内が来ました。

f:id:begirama:20151127153607p:plain

使い方

  1. https://go.speak.io にアクセスする
  2. ユニークなIDを含むURLが生成されるので、参加者とシェアする

以上。

f:id:begirama:20151127152420p:plain

主な機能

  • 音声チャット
  • ビデオチャット
  • テキストチャット
  • 画面共有
  • 録音(有償プランに要アップグレード)

f:id:begirama:20151127153622p:plain

画面共有には専用のGoogle Extensionが必要だった。入れた後、ブラウザの再起動が必要だったので、この機能が必要な場合には大事なミーティングの前に入れときたい。

特徴

とにかく簡単。 ブラウザで使えば、専用のアプリを立ち上げる必要もないし、ログインが不要なので、誰でもすぐに使える。

テキストチャットは消えるし、ファイルをアップしたりもできないし、がっつりミーティングというのには向かないけど、 社外の人とちょっと話せる?みたいな使い方にはいいかも。

Jekyllを使って極力デザインに手をかけずに製品サイトを作りたい

自分が製品マネージャをやっているAppPotという製品のWebサイトを再整備する取り組みをやっています。

  • 今のWebサイト

AppPot〜企業向けスマートデバイスアプリ開発のためのプラットフォーム

このサイトとは別にGithub上にマークダウンで記載した製品マニュアルを公開しています。今回の再整備で、Github上のマニュアルを静的HTMLに変換して、製品サイトと一緒に公開したいと思っています。

今回は、Jekyllを使って、且つ、なるべく既存のThemeを使ってやりたいと思っています。

今日は技術検証なので、このテーマを使て試してみたいと思います。

swcool/landing-page-theme · GitHub f:id:begirama:20151126162004p:plain

  • jekyllのインストール
$ gem install jekyll
$ git clone https://github.com/swcool/landing-page-theme.git
  • serveオプションでローカルで試せる
$ jekyll serve
Configuration file: /Users/rsogo/work/jekyllsample/landing-page-theme/_config.yml
            Source: /Users/rsogo/work/jekyllsample/landing-page-theme
       Destination: /Users/rsogo/work/jekyllsample/landing-page-theme/_site
 Incremental build: disabled. Enable with --incremental
      Generating... 
                    done in 0.206 seconds.
 Auto-regeneration: enabled for '/Users/rsogo/work/jekyllsample/landing-page-theme'
Configuration file: /Users/rsogo/work/jekyllsample/landing-page-theme/_config.yml
    Server address: http://127.0.0.1:4000/
  Server running... press ctrl-c to stop.

4000番ポートにアクセスするとこんな感じ。ここまでは簡単。

f:id:begirama:20151126162004p:plain

ここからテーマをカスタマイズしていきます。 このテーマは_postsの内容をServicesとして表示してくれるみたいです。 この辺はテーマによって違うようなので、テーマのお作法に沿ってやる必要があります。

以下の様な感じでファイルを作成すると、 _posts/2014-09-20-services-0.markdown

---
layout: default
img: only_use_detail01.jpg
category: Services
title: 開発コストが2分の1になります
description: |
---
AppPotを使えばサーバーの開発が不要です。そのため、セットアップ後、すぐにフロントエンドの開発を行うことができ、開発期間の短縮と、開発コストの削減に効果があります。

こんな感じに表示してくれます。 f:id:begirama:20151126170414p:plain

  • _config.ymlの基本の設定を変更します。 titile、twitterアカウント、githubの情報を更新して、LinkedInの情報を消しました。 変更した場合はjekyll servを再起動しないと変更されないです。
# ----------------------- #
#      Main Configs       #
# ----------------------- #

url: http://yoursite.com
title: AppPot
email: your-email@domain.com
author: Your Name
description: > # "Write an awesome description for your new site here.
  You can edit this line in _config.yml. It will appear in your document
  head meta (for Google search results) and in your feed.xml site
  description.
copyright: 'Copyright &copy; 2015 Your Name. All Rights Reserved.'
credits: 'Credits: Landing Page is a free to use, open source Bootstrap theme created by <a href="http://startbootstrap.com/">Start Bootstrap</a>.'

# ----------------------- #
#    Jekyll & Plugins     #
# ----------------------- #

# Build settings
markdown: kramdown
permalink: pretty

# ----------------------- #
#   3rd Party Settings    #
# ----------------------- #

social:
  - title: twitter
    url: https://twitter.com/app_pot
  - title: github
    url: https://github.com/NCDCHub/apppot-docs
    

後、一番上の画像を元の製品サイトのものに変えました。 ここまで変えるとレイアウトの崩れなどはありますが、それっぽくなりました。

f:id:begirama:20151126172315p:plain

このテーマを実際使うわけではないので、微調整はやりませんが、テーマに合わせて画像などを用意すれば良さそうです。

実際やってみて感じたのは、ブログ・サイト用のテーマはたくさん有るのですが、それ以外の場合、自分の求めているサイトに「デザイン」「サイト構成」の点で近いものを探すのがポイントかなと思います。

いいところ

  • デザイナーさんに画像などを用意してもらう必要がありますが、だいたいイメージにあったサイトをすごい速さで作ることができる
  • コンテンツをマークダウンで書けるので楽
  • デザインを変えたかったらテーマを変えればいい。コンテンツと、テーマが強制的に明確に分離されているので、やりたいサイトにフィットしたテーマがあれば楽