WindowsのSouceTreeを使ってGitHubのプロジェクトをクローンする
GitHubからプロジェクトをSouceTreeでクローンした際に引っかかったところのメモ
環境
Windows8 Pro 64bit版
SourceTree Windows版 http://www.sourcetreeapp.com/
1.どこからダウンロードしたらよいのかわからない
https://github.com/JAGAT-XML-publishing-study-group/HTMLBook-JA
このプロジェクトに参加したいと思ったけれどどれがGitのURLかわからない。
この部分がCloneに必要なURL
https://github.com/JAGAT-XML-publishing-study-group/HTMLBook-JA.git
2.SSL認証でエラーが出る
EV SSL用ルート証明書のダウンロードをする
https://www.digicert.com/testroot/DigiCertHighAssuranceEVRootCA.crt
C:\Users\xxx\.gitconfig にSSL証明書の追加
xxx:ユーザー名
[http]
sslCAInfo=C:\\Users\\xxx\\DigiCertHighAssuranceEVRootCA.crt
3.クローン OK
NetBneans IDE 7.4 でGoogle Map Service v2
やっとNetBeansでGoogleMapServiceを使ったプロジェクトがビルド出来たのでメモ
OS | Windows8 Pro 64bit |
JavaSDK | OracleJava Oracle 1.7.0_45 |
Android SDK | Rev 22.3 |
Gradle | 1.9 |
IDE | NetBeans IDE 7.4 |
プラグイン | Android 1.226 |
NBAndroid Gradle Support 1.226 | |
NBAndroid Extensions 1.226 |
キーストアの作成とDevelopers ConsoleでAPIキーの取得は済んでいるものとします。
build.gradleの変更
- 末尾に依存情報を追加
- 実行をして依存関係を読み込ませる
dependencies { compile 'com.android.support:appcompat-v7:+' // Google Play Services compile 'com.google.android.gms:play-services:+' // You must install or update the Google Repository through the SDK manager to use this dependency. // The Google Repository (separate from the corresponding library) can be found in the Extras category. // compile 'com.google.android.gms:play-services:+' // Google Play Services }
MainActivityの変更
- FragmentActivityへ変更
- importを整備
import android.os.Bundle; import android.support.v4.app.FragmentActivity; public class MainActivity extends FragmentActivity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } }
AndroidManifest.xmlに権限追加
- 権限の追加
- meta情報も忘れずに
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="jp.tackn.hellogradle" android:versionCode="1" android:versionName="1.0"> <uses-sdk android:minSdkVersion="9" android:targetSdkVersion="12" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" /> <!-- External storage for caching. --> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <!-- My Location --> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <!-- OpenGL ES 2.0. --> <uses-feature android:glEsVersion="0x00020000" android:required="true" /> <application android:label="@string/app_name" android:icon="@drawable/ic_launcher"> <meta-data android:name="com.google.android.maps.v2.API_KEY" android:value="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" /> <meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" /> <activity android:name="MainActivity" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
レイアウトファイルの編集
- match_parentにするくらいかな
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:map="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <fragment android:id="@+id/map" android:layout_width="match_parent" android:layout_height="match_parent" class="com.google.android.gms.maps.SupportMapFragment" /> </LinearLayout>
これでビルドすればとりあえず通るはず。
署名をする前準備
- 署名に必要なkeystoreを用意
- プロパティファイルを作成
- pushしないように注意
storeFile=../Relase.key storePassword=XXXXX keyAlias=XXXXX keyPassword=XXXXX
build.gradleの編集
android配下、buildTypesの弟に追加signingConfigs { releaseConfig { storeFile=file(project.properties.storeFile) storePassword=project.properties.storePassword keyAlias=project.properties.keyAlias keyPassword=project.properties.keyPassword } } buildTypes { release { signingConfig signingConfigs.releaseConfig } }
署名ファイルの作成
プロジェクトで右クリックしてassembleReleaseのタスクを実行カスタムタスクを実行
毎回apkファイルを別途インストールしているのも面倒なのでカスタムタスクReleaseを作る- clean
- assembleRelease
- installDefaultFlavorRelease
これで署名付きファイルのクリーン、ビルド、インストールを一括に行える
NetBeans IDE 7.4 の Gradle でAndroid Projectが実行出来るようになった!
こう書くと出来なかったようにも思われてしまうかもしれませんが、【なんとか】実行することは出来ていたのですが、今回のプラグインのアップデートで一歩前進。
環境
OS | Windows8.1 64bit |
Java | Oracle 1.7.0_45 |
Android SDK | Rev 22.3 |
Gradle | 1.9 |
IDE | NetBeans IDE 7.4 |
プラグイン | Android 1.226 |
NBAndroid Gradle Support 1.226 | |
NBAndroid Extensions 1.226 |
インストール
Java
jdk-7u51-windows-x64.exeをダウンロード、インストールAndroid SDK
USE AN EXISTING IDEのSDK Tools for Windowsをダウンロード、インストールGradle
gradle-1.11-all.zipをダウンロードして解凍NetBeans IDE 7.4
NetBeans.org から好みのをダウンロードJava SE用で良いのではないでしょうか。
インストールして起動したら
ツール(T) > プラグイン(G) で使用可能なプラグインタブを開き、androidで検索。以下のプラグインをインストールしてIDEを再起動
ツール(T) > オプション(O) > その他(M)タブを開き、
これでインストールは完了
プロジェクトの作成
これがわからない…。Gradleの素のプロジェクトはウィザードがあるのですが、android用というのがわからない。
あるのかも?
> android create project --gradle --name HelloGradle --gradle-version 0.7.+ --target 3 --path HelloGradle --package jp.tackn.hellogradle --activity MainActivity
--gradle | Gradleでプロジェクトを作成 | |
--name | HelloGradle | アプリ名 |
--gradle-version | 0.7.+ | 今時点で0.7.+で良いみたい |
--target | 3 | SDKのインストール状況によって変わります |
--path | HelloGradle | プロジェクトのパス |
--package | jp.tackn.hellogradle | パッケージ |
--activity | MainActivity | 起動するアクティビティ名 |
NetBenas で作成したパスをみるとGradleプロジェクトがあります。
開くとプロジェクトタブでAndroidのリソースにアクセス出来ます。
(ココが1つの改善点:前はGradleプロジェクトのみでandroidのリソースへはファイルタブでアクセスでした)
実行ボタンを押すとGradleプロジェクトがビルドされ、実行されます。
(ココが1つの改善点:前はビルドのみでandroidへのデプロイはファイルタブで手動でおこないました)
おわり
NetBeans IDEでもGradleでAndoroid Projectで作業出来る様になったのは大きな一歩だと思います。Ubuntu 12.04 LTS に GlassFish v4.0をセットアップ
Java7のインストール
$ sudo add-apt-repository ppa:webupd8team/java $ sudo apt-get update $ sudo apt-get install oracle-java7-installer
複数Javaを入れていたらこれで切り替え
$ sudo update-alternatives --config java
GlassFish 4.0のインストール
$ sudo su # cd /opt # wget http://dlc.sun.com.edgesuite.net/glassfish/4.0/release/glassfish-4.0.zip # unzip glassfish-4.0.zip # rm glassfish-4.0.zip
起動スクリプト
# vi /etc/init.d/glassfish GLASSFISH_HOME=${GLASSFISH_HOME:-"/opt/glassfish4/glassfish"} case "$1" in start) $GLASSFISH_HOME/bin/asadmin start-domain >/dev/null ;; stop) $GLASSFISH_HOME/bin/asadmin stop-domain >/dev/null ;; restart) $GLASSFISH_HOME/bin/asadmin restart-domain >/dev/null ;; \*) echo "usage: $0 (start|stop|restart|help)" esac # chmod +x /etc/init.d/glassfish # update-rc.d glassfish defaults
GlassFish起動
$ sudo /etc/init.d/glassfish start
GlassFishストップ
$ sudo /etc/init.d/glassfish stop
管理コンソールを使ってデプロイ
http://localhost:4848/ へアクセス
* 但し、ほかのマシンからアクセスするとログイン画面が出る
リモートから管理コンソールへアクセス
まずは、http://localhost:4848/でアクセスできるマシンで管理者パスワードを設定$ cd /opt/glassfish4/glassfish/bin $ sudo ./asadmin --host HOSTNAME --port 4848 enable-secure-admin $ sudo /etc/init.d/glassfish restart
証明書を例外に追加すればこれでリモートで管理コンソールへ接続が出来ます
自己証明書のリポジトリに接続する方法
自宅にGitリポジトリを作成したのでhttpsで公開しようとして躓きました。
自己証明書でSSLををしているのでエラーが出てしまいます。
ちなみにこのようなエラーが出たので証明書を追記して見ましたが上手くいきませんでした。
環境
OS | Windows8 Pro 64bit |
Gitクライアント | SourceTree v1.3.3.0 |
証明書の追加
C:\Users\<ユーザー名>\.gitconfig に証明書のパスを追記します[http] sslCAInfo=C:\\Users\\琢巳\\xxxxx.ddo.jp.cacert.pem
Git | UTF-8 |
DOS | Shift_JIS |
証明書が有効になったかチェック
そのほかの方法
このように証明書が有効になったのでアクセスが出来る様になる。.gitconfig をこのように設定して全ての証明書のチェックを辞めてもアクセス出来る
[http] sslverify = false
証明書の取得方法
先ずはブラウザでアクセスこれで自己証明書が手に入ります。
証明書はテキストファイルなので、上で設定したsslCAInfoに追記していけばOK?
Android Studio 0.4.0 でAIDLを使ってサービスからUIを非同期更新
バックグラウンド(無限ループ)で重い処理が動き続ける状態で
それにあわせてUIを更新したいと思いました。
- Activity内でThreadを使うとUIが固まってしまう
- AsyncTaskは便利だけれどTaskが使い捨てなのが利用を悩む
- Messengerは非同期では無さそう。
勉強不足なのは重々承知なので誤解は多々あると思いますがご容赦下さい。
AIDLを用いたコールバックでUIを非同期に更新にチャレンジ
環境
OS | Windows8Pro 64bit |
Java | Oracle Java SE 1.7.0u45 |
IDE | Android Studio 0.4.0 |
Android SDK | r22.3 |
Gradle | 1.9 |
ファイルリスト
以下のファイルを生成・編集します。- IMyService.aidl
- IMyCallback.aidl
- MyService.java
- fragment_main.xml
- MainActivity.java
- AndroidManifest.xml
Android Studio 0.4.0 でウィザードが使えるところは使っています。
fragment_main.xmlを今回は使います。
AIDLを格納するフォルダをjavaと同階層につくります
javaと階層を揃えるたpackageをつくります
ドロイド君アイコンの空ファイルが出来ます
これでAIDLの記述準備が出来ました。
※コードに色は付きますが入力サポートは受けられません
AndroidManifest.xmlへの登録も完了します
※今回は修正が必要です
AIDLを含めてコンパイルをすると入力サポートが受けられます
IMyService.aidl
package jp.tackn.aidldemo; import jp.tackn.aidldemo.IMyCallback; /** * バックグラウンド処理を行うサービス * Created by Tackn on 13/12/22. */ interface IMyService { /** * コールバック登録。 * @param callback 登録するコールバック。 */ oneway void registerCallback(IMyCallback callback); /** * コールバック解除。 * @param callback 解除するコールバック。 */ oneway void unregisterCallback(IMyCallback callback); /** * 非同期の処理スタート * @param num 何号線か指定 */ void AsyncStart(); }
IMyCallback.aidl
package jp.tackn.aidldemo; /** * UI更新用のコールバック * Created by Tackn on 13/12/22. */ oneway interface IMyCallback { /** * バックグラウンド処理 * @param date UI更新に使うコールバックされる値 */ void doInBackground(String date); }
MyService.java
package jp.tackn.aidldemo; import android.app.Service; import android.content.Intent; import android.os.IBinder; import android.os.RemoteCallbackList; import android.os.RemoteException; import android.util.Log; import java.util.Date; /** * Serviceから非同期コールバックでUIを更新デモ */ public class MyService extends Service { /** 識別用文字列 */ private static final String TAG = "AidlDemo"; /** AIDLのサービス実装 */ private IMyService.Stub mStub = new IMyService.Stub() { /** コールバックリスト */ private RemoteCallbackList<IMyCallback> mCallbacks = new RemoteCallbackList<IMyCallback>(); /** * コールバック登録 * @param callback 登録するコールバック。 * @throws android.os.RemoteException 接続エラー */ @Override public void registerCallback(IMyCallback callback) throws RemoteException { mCallbacks.register(callback); } /** * コールバック解除 * @param callback 解除するコールバック。 * @throws RemoteException 接続エラー */ @Override public void unregisterCallback(IMyCallback callback) throws RemoteException { mCallbacks.unregister(callback); } /** * 非同期処理開始 */ @Override public void AsyncStart() throws RemoteException { // 無限ループ定義 new Thread(new Runnable() { @Override public void run() { while (true){ //時間のかかる処理 try { Thread.sleep(10000L); } catch (InterruptedException e) { e.printStackTrace(); } //コールバックへ updateUI(new Date().toString()); } } }).start(); } /** * コールバックでUIの更新処理を行う * @param date 更新用文字列 */ private void updateUI(String date){ int n = mCallbacks.beginBroadcast(); for (int i = 0; i < n; i++) { try { mCallbacks.getBroadcastItem(i).doInBackground(date); } catch (RemoteException e) { Log.d(TAG, e.getMessage(), e); } } mCallbacks.finishBroadcast(); } }; /** * コンストラクタ */ public MyService() { super(); } /** * サービスがバインドされたときのコールバック * @param intent 情報コンテナ * @return 接続に利用されるサービス */ @Override public IBinder onBind(Intent intent) { return mStub; } }
fragment_main.xml
findViewById をするためにidを追加しただけです<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context="jp.tackn.aidldemo.MainActivity$PlaceholderFragment"> <TextView android:id="@+id/textView" android:text="@string/hello_world" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </RelativeLayout>
MainActivity.java
メインの実装なのでちょっと長めですpackage jp.tackn.aidldemo; import android.content.ComponentName; import android.content.Intent; import android.content.ServiceConnection; import android.os.Handler; import android.os.IBinder; import android.os.RemoteException; import android.support.v7.app.ActionBarActivity; import android.os.Bundle; import android.util.Log; import android.widget.TextView; /** * サービスからのコールバックでUI更新デモ */ public class MainActivity extends ActionBarActivity { /** 識別用文字列 */ private static final String TAG = "AidlDemo"; /** 更新対象のUI */ private TextView textView; /** UI更新用 */ private Handler mHandler; /** AIDLで記述されたサービスの参照 */ private IMyService mService; /** AIDLで記述されたコールバックの中身 */ private IMyCallback mCallback = new IMyCallback.Stub() { /** * バックグラウンド処理 * @param date 更新文字列 */ @Override public void doInBackground(final String date) throws RemoteException { mHandler.post(new Runnable() { public void run() { Log.d(TAG,"doInBackGroud:"+date); textView.setText( date + "\n" + textView.getText() ); } }); } }; /** * サービスとのコネクション */ private ServiceConnection mServiceConnection = new ServiceConnection() { /** * サービスが接続された時の処理 * @param name サービスのクラス名 * @param service サービスとのバインダ */ @Override public void onServiceConnected(ComponentName name, IBinder service) { mService = IMyService.Stub.asInterface(service); try { Log.d(TAG, name.getClassName()); //コールバックの登録 mService.registerCallback(mCallback); //サービス側のメソッドを実行 mService.AsyncStart(); } catch (RemoteException e) { e.printStackTrace(); } } /** * サービスが切断された時の処理 * @param name サービスのクラス名 */ @Override public void onServiceDisconnected(ComponentName name) { mService = null; } }; /** * アクティビティ生成時の処理 * サービスの接続処理 * @param savedInstanceState 保存された状態 */ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.fragment_main); mHandler = new Handler(); textView = (TextView)findViewById(R.id.textView); bindService(new Intent(IMyService.class.getName()), mServiceConnection, BIND_AUTO_CREATE); } /** * アクティビティ破棄時の処理 * サービスの切断処理 */ @Override protected void onDestroy(){ unbindService(mServiceConnection); super.onDestroy(); } }
AndroidManifest.xml
serviceのintent-filterでAIDLへのパスを与えます<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="jp.tackn.aidldemo" > <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="jp.tackn.aidldemo.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <service android:name="jp.tackn.aidldemo.MyService" android:process=":service" > <intent-filter> <action android:name="jp.tackn.aidldemo.IMyService" /> </intent-filter> </service> </application> </manifest>
実行
service側のスレッドで実行している10秒毎の呼び出しで、
Activity側のUIが非同期で更新されていきます。
Android Studio 0.3.7 で Google Map Service v2
Android Studioを立ち上げたらUpdateがあったので気軽に0.3.7にアップしたら
Import ModuleがなくなってしまってGoogle Map Serviceを認識させれば良いのか
わからなくなったので調べたメモ
OS | Windows8 Pro 64bit |
JavaSDK | Oracle Java 1.7.0u45 64bit |
統合開発環境 | Android Studio v0.3.7 |
AndroidSDK | r22.3 |
- インストール
- 編集
- Android Manifestの編集
- Layoutファイルの編集
- Activityの編集
- ビルド⇒成功!
インストール
Android Studioはこちらからダウンロードできます。しかし、これはv0.3.2
インストールしたら適当なプロジェクトを作ってアップデートしてしまったほうが良いと思います。
メニュー>Help>Check for Update
Google Repository と Android Support Repositoryのインストール
メニュー>Tools>Android>SDK Manager
選択してインストール
編集
依存関係の記述
プロジェクトのbuild.gradleを編集
dependencies { compile 'com.android.support:appcompat-v7:+' // Google Play Services compile 'com.google.android.gms:play-services:+' }
今回はSupport Libraryは記述しませんでした。
Android Manifestの編集
権限を追加
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/> <!-- External storage for caching. --> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <!-- My Location --> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> <!-- Maps API needs OpenGL ES 2.0. --> <uses-feature android:glEsVersion="0x00020000" android:required="true"/>
メタデータを追加
<meta-data android:name="com.google.android.maps.v2.API_KEY" android:value="AIzaSyCvGBr5in13NK2yYBR7lhXTtnxj3mrXQy4"/> <meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" />
赤く指摘されているけれど無視
Layoutファイルの編集
<fragment xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/map" android:layout_width="match_parent" android:layout_height="match_parent" class="com.google.android.gms.maps.SupportMapFragment"/>
赤く指摘されているけれど無視
Activityの編集
してません。もともとlayout/fragment_main.xmlはFragmentだったので
そのまま読み込んでいます。
なのでSupportLibraryも入れてません。
ビルド⇒成功!
緑三角のボタンからビルドを開始すると
あっけなくGoogleMapService v2がビルドされてデプロイされました。
レイアウトの編集などもグラフィカルで印象は良いですね。
簡単そうに書いていますが、最初依存関係の指定がさっぱりわからず困りました。
GradleをNetBeansの依存関係指定につかえないかと少し眺めていたので糸口がありましたが…。