WindowsのSouceTreeを使ってGitHubのプロジェクトをクローンする

GitHubからプロジェクトをSouceTreeでクローンした際に引っかかったところのメモ



環境
Windows8 Pro 64bit版
SourceTree Windowshttp://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 ConsoleAPIキーの取得は済んでいるものとします。

build.gradleの変更

  1. 末尾に依存情報を追加
  2. 実行をして依存関係を読み込ませる
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の変更

  1. FragmentActivityへ変更
  2. 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に権限追加

  1. 権限の追加
  2. 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>

これでビルドすればとりあえず通るはず。

署名をする前準備

  1. 署名に必要なkeystoreを用意
  2. プロパティファイルを作成
  • 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ファイルが出来ている


カスタムタスクを実行

毎回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 IDESDK Tools for Windowsをダウンロード、インストール

Gradle

gradle-1.11-all.zipをダウンロードして解凍

NetBeans IDE 7.4

NetBeans.org から好みのをダウンロード
Java SE用で良いのではないでしょうか。

インストールして起動したら
ツール(T) > プラグイン(G) で使用可能なプラグインタブを開き、androidで検索。以下のプラグインをインストールしてIDEを再起動

ツール(T) > オプション(O) > その他(M)タブを開き、

  • androidタブにインストールしたAndroid SDKのパスをセット
  • gradleタブにインストールしたGradleのパスをセット

これでインストールは完了

プロジェクトの作成

これがわからない…。
Gradleの素のプロジェクトはウィザードがあるのですが、android用というのがわからない。
あるのかも?

私はAndroid SDKで作成しました。

> 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へのデプロイはファイルタブで手動でおこないました)

生成されたGradleファイルがこんな感じです

おわり

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を今回は使います。


gradle でプロジェクトがつくられていきます


プロジェクトが起動した直後


AIDLを格納するフォルダをjavaと同階層につくります


javaと階層を揃えるたpackageをつくります


新規作成でFileを選択


拡張子まで含めて空ファイルを作成


ドロイド君アイコンの空ファイルが出来ます
これでAIDLの記述準備が出来ました。
※コードに色は付きますが入力サポートは受けられません


ServiceはAndroidComponentにあります


ウィザードでServiceを選択します


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
  1. インストール
    1. Google Repository と Android Support Repositoryのインストール
    2. 依存関係の記述
  2. 編集
    1. Android Manifestの編集
    2. Layoutファイルの編集
    3. Activityの編集
  3. ビルド⇒成功!

インストール

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の依存関係指定につかえないかと少し眺めていたので糸口がありましたが…。