ラベル Developer の投稿を表示しています。 すべての投稿を表示
ラベル Developer の投稿を表示しています。 すべての投稿を表示

2014年7月28日月曜日

Android Studioの構成で、既存のプロジェクトをEclipseからAndroid Studioへ移行する

EclipseとAndroid Studioではプロジェクトの構成が異なる

ビルドシステムが異なるので、構成も異なります。

Eclipse
.
├── AndroidManifest.xml
├── assets(アセットなど)
├── bin(自動生成)
├── gen(自動生成)
├── libs(ライブラリなど)
├── project.properties
├── res(リソースなど)
│   ├── drawable
│   ├── layout
│   ├── menu
│   ├── values
│   └── xml
└── src(ソースなど)

Android Studio
.
├── プロジェクト名.iml
├── app
│   ├── app.iml(自動生成)
│   ├── build(自動生成)
│   ├── build.gradle
│   ├── libs(ライブラリなど)
│   └── src
│       └── main
│           ├── AndroidManifest.xml
│           ├── assets(アセットなど)
│           ├── java(ソースなど)
│           └── res(リソースなど)
│               ├── drawable
│               ├── layout
│               ├── menu
│               ├── values
│               └── xml
├── build(自動生成)
├── build.gradle
├── gradle(自動生成)
│   └── wrapper
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties(Gradleのバージョンを変えるときに稀にいじる)
├── gradle.properties(ビルドするときの変数などを記述)
├── gradlew(自動生成)
├── gradlew.bat(自動生成)
├── local.properties(Android SDKのパスなどを記述)
└── settings.gradle(ビルドするモジュールを記述)



Android Studioから Eclipseのプロジェクトをインポートする

Preview以前は無かった気がするのですが、Android Studioから直接インポートできるようになっていました。
Eclipseからエクスポートする場合と比べて、プロジェクトの構成まできちんと変換してくれます!
これでAndroid Lに触れますね。



既存のリポジトリを活用したい

Android Studioからインポートすればうまいことできるのですが、SCMの設定はうまく引き継がれません。
そういうときは、Android Studioで空のプロジェクトを作り、そこに既存のプロジェクトから、必要なフォルダ/ファイルだけ外部参照してあげると良い感じになります。

Subversionの場合は以下のようにします。

[studio app]$ svn propedit svn:externals . --editor-cmd=vi
リポジトリ/libs libs

[studio main]$ svn propedit svn:externals . --editor-cmd=vi
リポジトリ/res res
リポジトリ/assets assets
リポジトリ/AndroidManifest.xml AndroidManifest.xml
[studio java]$ svn propedit svn:externals . --editor-cmd=vi
リポジトリ/パッケージ パッケージ


複雑でないプロジェクトならこれで解決します。こうすることによって、EclipseとAndroid Studio同時に開発を進めることが出来ます!環境が異なるのであまりお勧めできませんが、会社などでいち早くAndroid Studioを検証したいときなどに使えると思います。



参考

Qiita / EclipseからAndroid Studioに移行する
うさがにっき / EclipseからAndroidStudioへの開発環境移行、疑問編
WEBTECH WALKER / svnコマンドの覚え書き



2014年7月26日土曜日

Maven Centralに自作ライブラリを登録するまでの長い道のりと挫折と回り道

ライブラリを簡単に使えるように

Maven Centralというところに登録すればライブラリの導入が簡単になるらしいということで、自作ライブラリを登録した。

  • Maven
    • プロジェクト管理ツール。ビルドもできるし、依存性も解決してくれるらしい。

環境

  • Eclipse() : 4.2 Juno
    • 通常のAndroidプロジェクトを作成。
    • AndroudStudio版も調べます!てか今後は全部移行すべき。
  • Eclipse ADT Plugin : 22.6
  • Apache Maven : 3.1.1

Sonatypeアカウント作成

  • Maven Centralにライブラリを登録するために必要。
    • Sonatypeのリポジトリを通して公開する。
  • https://issues.sonatype.org/

EclipseプロジェクトのMaven対応

  • プラグインを入れてなければ入れる
    • Maven Integration for Eclipse
  • Configure -> Convert to Maven
    • pom.xml が作成される(pom = Project Object Model)
      • 作成時の項目は後から変更できる。
      • GroupId
      • com.github.sakebook
      • ArtifactId
      • DialogHelper
      • Version
      • 0.0.1
    • Packaging
      • jar
    • Name
      • DialogHelper
    • Description
      • Easy way to make dialog for everyone.

  • 変更前の.classpath

 
 
 
 
 
 



  • 変更後に追加される
...
 
  
   
   
  
 
...
 
  
   
  
 
 
  
   
  
 
...


  • 変更前の.project

    DialogHelperSample
    
    
    
    
        
            com.android.ide.eclipse.adt.ResourceManagerBuilder
            
            
        
        
            com.android.ide.eclipse.adt.PreCompilerBuilder
            
            
        
        
            org.eclipse.jdt.core.javabuilder
            
            
        
        
            com.android.ide.eclipse.adt.ApkBuilder
            
            
        
    
    
        com.android.ide.eclipse.adt.AndroidNature
        org.eclipse.jdt.core.javanature
    

  • 変更後に追加される
...
        
            org.eclipse.m2e.core.maven2Builder
            
            
        
...
    
        org.eclipse.m2e.core.maven2Nature
        com.android.ide.eclipse.adt.AndroidNature
        org.eclipse.jdt.core.javanature
    
...

  • 作成されるpom.xml

  4.0.0
  sample.convert.maven
  MavenConvertSample
  0.0.1
  MCS
  sample
  
    src
    
      
        maven-compiler-plugin
        3.1
        
          
          
        
      
    
  


JREが、J2SE-1.5に変更されるので、プロジェクトデフォルトに戻す。
* BuildPath -> Configure Build Path -> Java Build Path -> Libraries -> JRE SystemLibrary -> Edit -> Workspace default library

    pom.xmlの設定

    • Mavenでビルドする際に必要な記述を追加していく。
      また、Maven Centralに登録して皆が使えるようにするには、誰が作ったのか?どのようなライセンスなのか?なども記述しないといけない。先に完成系を張っておく。
    
        4.0.0
    
        
            org.sonatype.oss
            oss-parent
            7
           
    
        com.github.sakebook
        DialogHelper
        0.0.1
        jar
        DialogHelper
        Easy way to make dialog for everyone.
        https://github.com/sakebook/android-library-dialog-DialogHelper/
    
        
            
                Apache License 2.0
                http://www.apache.org/licenses/LICENSE-2.0
                repo
            
        
    
        
            https://github.com/sakebook/android-library-dialog-DialogHelper
            scm:git:git://github.com/sakebook/android-library-dialog-DialogHelper.git
            scm:git:git://github.com/sakebook/android-library-dialog-DialogHelper.git
        
    
        
            
                sonatype-nexus-staging
                Nexus Staging Repository
            https://oss.sonatype.org/service/local/staging/deploy/maven2/
            
        
    
        
            
                sakebook
                Shinya Sakemoto
                sakebook@gmail.com
                http://sakebook.blogspot.com/
                
                    developer
                
            
        
    
        
            GitHub
            https://github.com/sakebook/android-library-dialog-DialogHelper/issues
        
    
        
            UTF-8
            UTF-8
            UTF-8
            UTF-8
            4.1.1.4
            16
            r7
            1.6
            3.1.1
        
    
        
            
                
                    com.google.android
                    android
                    ${android.version}
                    provided
                
                
                    com.google.android
                    annotations
                    ${android.version}
                
                
                    com.google.android
                    support-v4
                    ${android.support.version}
                
            
        
    
        
            ${base.dir}src
            
                
                    res
                     
            
            
                
                    
                        org.apache.maven.plugins
                        maven-compiler-plugin
                        3.1
                        
                            ${java.version}
                            ${java.version}
                            true
                            ${project.build.sourceEncoding}
                            ${project.reporting.outputEncoding}
                        
                    
                    
                        com.jayway.maven.plugins.android.generation2
                        android-maven-plugin
                        3.8.2
                        
                            ${project.basedir}/AndroidManifest.xml
                            
                                ${env.ANDROID_HOME}
                                ${android.platform}
                            
                        
                        true
                    
                    
                        org.apache.maven.plugins
                        maven-javadoc-plugin
                        2.9
                            
                                ${project.build.directory}
                            
                    
                    
                        org.apache.maven.plugins
                        maven-source-plugin
                        
                            
                                package
                                
                                    jar
                                
                            
                        
                    
                
            
            
                
                    org.apache.maven.plugins
                    maven-release-plugin
                    2.4
                    
                        ${project.build.sourceEncoding}
                        ${project.reporting.outputEncoding}
                        forked-path
                        true
                    
                
            
        
    
        
        
            
                release-sign-artifacts
                
                    
                        performRelease
                        true
                    
                
                
                    
                        
                            org.apache.maven.plugins
                            maven-gpg-plugin
                            1.4
                            
                                ${project.build.sourceEncoding}
                                ${project.reporting.outputEncoding}
                            
                            
                                
                                    sign-artifacts
                                    verify
                                    
                                        sign
                                    
                                
                            
                        
                    
                
            
        
    
    
    

    • parent
      • 親プロジェクト。sonatypeのレポジトリを利用するため。
    • licenses
      • プロジェクトのライセンス。
    • scm
      • プロジェクトのソースコード管理システムを記述。
    • distributionManagement
      • リモートリポジトリにでプロイするために必要な情報を記述。
    • developers
      *プロジェクトの開発者を記述。 貢献者がいる場合はcontributorsへ書く。
    • issueManagement
      • バグ管理システムを記述。
    • properties
      • 変数を定義。pluginで同様のプロパティ名を持つ場合、pomに記述した内容が用いられる。
    • dependencyManagement
      • 依存関係を定義。dependenciesのみで定義した場合との違いは、Managementで括ると、子pomに依存関係は、明示的に宣言しないといけない。その代わりバージョンは親pomのものが継承される。
    • build
      • buildに関する情報を定義。
      • sourceDirectory
        • ソースディレクトリを相対パスで定義。今回はEclipseのプロジェクトをConvertしたので、通常のMavenプロジェクトとは構成が異なる。
      • resources
        • リソースを定義。ソースと同様に、EclipseのプロジェクトをConvertしたので、通常のMavenプロジェクトとは構成が異なる。
      • pluginManagement
        • 依存関係を定義。dependenciesのみで定義した場合との違いは、Managementで括ると、子pomに依存関係は、明示的に宣言しないといけない。その代わりバージョンは親pomのものが継承される。
      • plugins
        • プラグインに関する情報を定義。
    • profiles
      • プロジェクトのプロファイルを定義。環境に依存する設定を記述。今回はperformReleaseビルド時のみmaven-gpg-pluginを利用するように。

    • ローカルの設定やpasswordの設定は ~/.m2e/setting.xmlに記述。
    
        
            
                
                sonatype-nexus-staging
                xxxxxxxxx
                xxxxxxxxx
            
        
        
            
                android-sdk
                
                    
                    xxxxxxxxxx/xxxxxxx
                
            
        
        
            android-sdk
        
    
    
    

    issue作成

    • 先ほど作成したSonatypeで、リポジトリを作成してもらうようにissueを作成します。
      • 僕が作成したissueはこちらです。Group Idに問題があり、やりとりがありました汗
      • 作ってもらったら、今度はライブラリをデプロイしたときにまたコメントしましょう。

    pgp署名確認

    • Maven Centralに登録するには、公開物に対して署名をしなければなりません。
    • 未インストールの場合はこちらから。

    鍵作成

    • 聞かれる値はデフォルト値でOK
    $ gpg --gen-key
    
    • 作成された鍵の確認
    $ gpg --list-keys
    
    • 対象ファイルの署名
    $ gpg -ab FILE
    
    • 署名の確認
      • sub鍵で署名されていないか確認
        • 45yH63G3 の様な8文字が鍵のID
        • pub(公開鍵) のIDと一致していればOK
    $ gpg --verify FILE
    
    • 公開鍵の配布
    $ gpg --keyserver hkp://pool.sks-keyservers.net --send-keys 45yH63G3
    
    • 確認
      • 45yH63G3 が帰ってくればOK
    $ gpg --keyserver hkp://pool.sks-keyservers.net --recv-keys 45yH63G3
    

    コマンドラインからビルド

    プロジェクトのルートディレクトリで

    $ mvm clean package
    
    • ライブラリ本体のjarを作成
    $ mvm deploy
    
    • distributionManagementに記述したリポジトリにライブラリ本体とpom.xmlをデプロイ。
    • デプロイしたら、次のURLからstagingリポジトリに上がったことを確認できます。
    $ mvm source:jar
    
    • ソースファイルのjarを作成
    $ mvm javadoc:jar
    
    • javadocのjarを作成
    $ mvn gpg:sign-and-deploy-file -Durl=https://oss.sonatype.org/service/local/staging/deploy/maven2/ -DrepositoryId=sonatype-nexus-staging -DpomFile=pom.xml -Dfile=target/DialogHelper-0.0.1.jar -Dgpg.passphrase=yourpassphrase
    
    • jarを署名してリポジトリにアップロード
    $ mvn gpg:sign-and-deploy-file -Durl=https://oss.sonatype.org/service/local/staging/deploy/maven2/ -DrepositoryId=sonatype-nexus-staging -DpomFile=pom.xml -Dfile=target/DialogHelper-0.0.1-javadoc.jar -Dclassifier=javadoc -Dgpg.passphrase=yourpassphrase
    
    • javadocを署名してリポジトリにアップロード
    $ mvn gpg:sign-and-deploy-file -Durl=https://oss.sonatype.org/service/local/staging/deploy/maven2/ -DrepositoryId=sonatype-nexus-staging -DpomFile=pom.xml -Dfile=target/DialogHelper-0.0.1-sources.jar -Dclassifier=sources -Dgpg.passphrase=yourpassphrase
    
    • sourceを署名してリポジトリにアップロード
    • ここまでくれば、Stagingにある自分のリポジトリをCloseして、しばらくすると、Releaseできます。

    issue追記

    • Releaseが完了したので、その旨をコメントに記入しましょう。
    • 返事があり、その後しばらくすると、登録完了です!

    使ってみる

    • pom.xml
    
    
        com.github.sakebook
        DialogHelper
        0.0.1
        jar
    
    
    • build.gradle
    compile 'com.github.sakebook:DialogHelper:0.0.1'
    

    初めて上がったときは感動です!サンプルアプリや、CI済みなどがわかるとより使われやすくなると思います。皆さんも自作ライブラリを作り、職場や家でも簡単に使い回せるようにしましょう!


    参考

    #侍ズム / 【最新版】Maven Central Repository へのライブラリ登録方法 #maven
    @vvakameの日記 / JsonPullParser が Maven Central Repository に入るようです
    ノウハウ共有サイト!Knowledge Enabling / appendix. mavenセントラルリポジトリに公開する
    エルピーベ / MacOSXでGnuPGを使おう
    SlideShare / Maven基礎
    Unlimited Island / pom.xml

    2014年4月6日日曜日

    MacでChef + Vagrant 環境構築メモ

    環境だけを手っ取り早く整えたい方用

    用語などは別サイトで学んでください。


    Chefのインストール
    OfsCodeが提供しているChef配布用スクリプト

    $ curl -L https://www.opscode.com/chef/install.sh | sudo bash
    


    knifeの設定
    色々聞かれるがとりあえず全部Enterで良い

    $ knife configure
    
    

    VirtualBoxのインストール
    サイトから入手
    [VirtualBox download]


    Vagrantのインストール
    gemでの配布は更新されていないのでサイトから入手
    [Vagrant download]


    VagrantでVM初期設定
    VagrantloudからOSイメージを探す
    [Vagrantcloud]

    例:centos-6.5の場合
    vmの設定を置きたいディレクトリで下記のコマンドを入力

    $ vagrant init chef/centos-6.5
    
    

    作成されたVagrantfileを編集
    コメントアウトを外す
    ➡ Vagrantを入れた環境からアクセスできるようにし、VMのIPを192.168.33.10に設定

    config.vm.network "private_network", ip: "192.168.33.10"
    
    

    VM起動
    Vagrantfileがあるディレクトリで

    $ vagrant up
    
    

    ssh接続
    ~/.ssh/config に下記を追加編集
    sshコマンドでvmへ接続できるように

    HOST 192.168.33.*
    
     IdentityFile ~/.vagrant.d/insecure_private_key
    
     User vagrant
    
    

    下記のコマンドでも可
    ssh設定を出力して書き出し

    vagrant ssh-config --host 192.168.33.* >> ~/.ssh/config
    
    

    内容は以下

    Host 192.168.33.∗
    
      HostName 127.0.0.1
    
      User vagrant
    
      Port 2222
    
      UserKnownHostsFile /dev/null
    
      StrictHostKeyChecking no
    
      PasswordAuthentication no
    
      IdentityFile /Users/$HOST_NAME/.vagrant.d/insecure_private_key
    
      IdentitiesOnly yes
    
      LogLevel FATAL
    
    

    ssh接続(まだしなくても良い)

    $ ssh 192.168.33.10
    
    

    knife-soloインストール
    gemコマンド

    $ sudo gem install knife-solo
    
    

    XCode5.1でClangエラーが出る場合は以下のコマンドを用いる

    $ sudo ARCHFLAGS=-Wno-error=unused-command-line-argument-hard-error-in-future gem install knife-solo
    
    

    ~/.chef/knife.rb に下記を追加編集
    tmpディレクトリの設定とCookbookをインポートする際の設定

    knife[:solo_path] = '/tmp/chef-solo'
    
    cookbook_path            ['./cookbooks']
    
    

    knife-soloでChef Solo環境を生成
    Chefレポジトリを作成
    レポジトリを管理したいディレクトリで実行
    下記だと chef-repoレポジトリが作成される

    $ knife solo init chef-repo
    
    

    合わせてgit管理
    Chefレポジトリ直下で以下のコマンドを入力
     
    $ git init
    
    $ git add .
    
    $ git commit -m "first commit"
    
    

    Chefレポジトリ直下で以下のコマンドを入力
    vmにChefをインストール

    $ knife solo prepare vagrant@192.168.33.10
    
    

    作成されたjsonファイルをコミット

    $ git add nodes/
    
    $ git commit -m "add node json file"
    
    

    Cookbook作成
    nginx というCookbook作成
    Chefレポジトリ直下で以下のコマンドを入力

    $ knife cookbook create nginx -o site-cookbooks
    
    

    Recipe編集
    site-cookbooks/nginx/recipes/default.rb を編集

    package "nginx" do
    
      action :install
    
    end
    
    
    
    service "nginx" do
    
      supports :status => true, :restart => true, :reload => true
    
      action [ :enable, :start ]
    
    end
    
    
    
    template "nginx.conf" do
    
      path "/etc/nginx/nginx.conf"
    
      source "nginx.conf.erb"
    
      owner "root"
    
      group "root"
    
      mode 0644
    
      notifies :reload, 'service[nginx]'
    
    end
    
    
    
    

    上記recipeで使うtemplate(nginx.conf.erb)を作成
    site-cookbooks/nginx/templates/default/ に作成

    user nginx;
    
    worker_processes 1;
    
    error_log /var/log/nginx/error.log;
    
    pid /var/run/nginx.pid;
    
    
    
    events {
    
      worker_connections 1024;
    
    }
    
    
    
    http {
    
      include /etc/nginx/mime.types;
    
      default_type application/octet-stream;
    
    
    
      server {
    
        listen <%=node['nginx']['port']%>;
    
        server_name localhost;
    
        location /{
    
          root /usr/share/nginx/html;
    
          index index.html index.htm;
    
        }
    
      }
    
    }
    
    
    
    Cookbookをインポートする
    centosでnginxを取得するにはyumのEPELというアドオンパッケージのyumレポジトリを有効にする必要がある
    yumのCookbookを取得

    $ knife cookbook site vendor yum
    
    $ knife cookbook site vendor yum-epel
    
    

    Nodeの設定
    jsonファイルはサーバ(node)の状態を示す
    nodes/192.168.33.10.json
    下記のように編集

    {
    
      "nginx":{
    
        "port":80
    
      },
    
      "run_list":[
    
        "yum-epel", "nginx"
    
      ]
    
    }
    
    

    vmへChef Soloを実行
    実行後、http://192.168.33.10 へアクセスし、nginxが起動しているか確認

    $ knife solo cook vagrant@192.168.33.10
    
    

    以上。お疲れさまでした。

    参考
    Amazon.co.jp 入門Chef Solo
    Qiita 「入門 Chef Solo」 on MacOSX ではまったこと
    2noの日記 【Mac】clang によるビルドエラー【Xcode 5.1】

    2014年3月18日火曜日

    ダイアログのレイアウトをカスタムできる、DialogFragmentを呼ぶライブラリ (Android)

    DialogFragment

    ダイアログのレイアウトをカスタムする機会があったので、なるべく使い回しができるようライブラリを作成しました。
    APIレベル13から、showDialogは非推奨となってますので、DialogFragmentで実装しました。

    android-library-dialog-DialogHelper



    設定

    ライブラリプロジェクトとして取り込んでください。
    APIレベル10以上じゃないと動作しません。



    ソース

    一行で呼べます。
    カスタムレイアウトも利用できるメソッドを用意してあります。
    DialogHelper.callDialog(this, "title", "message", "positive", "negative", "neutral", "tag");
    



    今後

    キャンセルの有効無効や、その他のオプションを追加していくといたずらに引数が増えていくのでオプションを作成したい。
    Builderで組み立てられるようにしたい。
    テーマも変更できるといいな。
    pull requestや要望があると喜びます。



    参考

    Y.A.Mの雑記帳 / Android DialogFragmentを使うときの注意点。
    Y.A.Mの雑記帳 / Fragment から Activity にコールバックする方法
    暇なメモ帳 / DialogFragmentでのカスタムダイアログ実装方法
    ケーワン・エンタープライズのエンジニアメモ(`・ω・´)ゞビシッ!! / Fragmentを使ってみる(画面回転時のライフサイクルについて)

    2013年12月18日水曜日

    imgurを利用したアップロードライブラリ(Android)

    imgurとは

    画像共有サイトです。
    アップロード機能があるのですが、APIが公開されているので、簡単にアップロードができるAndroidライブラリプロジェクトを作りました。

    android-library-imgur-UploadHelper



    設定

    まずは、imgur apiを使うためにアカウント登録して、
    Client ID と Secret IDを発行しなければなりません。

    登録したら、このリポジトリからソースを落としてください。

    ライブラリプロジェクトなので、組み込みたいプロジェクトのプロパティから追加してく設定してください。



    ソース
    UploadHelper helper = new UploadHelper(this, this);
                    helper.setClientId("YOUR_CLIENT_ID");
                    helper.setSecretId("YOUR_SECRET_ID");
    
                    helper.uploadData(imageReturnedIntent.getData());

    基本的には使用したいActivity内で、上記の設定とimplements methodを書けば使えます。
    インスタンス作成時にViewを渡せば、通信中はそのViewを押せなくすることもできます。uploadDataの引数はUriです。
    第2, 3引数に文字列を渡せば、通信ダイアログのタイトルとメッセージを設定できます。
    成功すればsuccess methodがcallbackで呼ばれます。



    課題

    とりあえずGithubで公開したい!という気持ちが先走って、エラーハンドリングがうまくできていなかったり、バグがあったりします汗
    Oauth認証の部分も、ほとんどimgurのサンプルのまんまです。

    画面も回転させると、通信中のダイアログが消えてしまいます(通信は継続)。
    Utilityも充実してないし。
    pull request、改善案などをお待ちしております。


    参考

    Github ImgurAPIv3ExampleAndroid

    2013年10月3日木曜日

    Androidでxmlをjsonに変換(JSONICを利用)

    レスポンスの生xmlをjsonに変換したい

    hoge.xmlなどのxmlファイルをjsonへ変換する方法は簡単に見つかったのですが、
    通信結果などのレスポンスの生xml(表現あってんのか?)jsonに変換する方法があまり引っかからなかったのでメモ。
    AmazonのProduct Advertising APIのレスポンスがxmlだったので使うことになりました。


    JSONICをインポート

    こちらからダウンロードできます。
    ダウンロードしたjarファイルは、libフォルダに入れてください。

    JSONICのメソッドは
    JSON.encode(Document docment)
    を利用します。



    サンプルコード

    staticメソッドですのでこのままコピペで動きます。
    引数や返り値は適宜変更してください。

     public static JSONArray responseToJson(HttpResponse res) {
      if (res == null){
       return null;
      }
      HttpEntity httpEntity = res.getEntity();
      JSONArray jsonArray = null;
    
      try {
       String xml = EntityUtils.toString(httpEntity, "UTF-8");
       Log.d("convert", "xml= "+ xml);
       DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
       DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
       Document doc = docBuilder.parse(new InputSource(new ByteArrayInputStream(xml.getBytes("UTF-8"))));
       String json = JSON.encode(doc);
       Log.d("convert", "json= "+ json);
       jsonArray = new JSONArray(json);
      } catch (JSONException e) {
       e.printStackTrace();
      } catch (ParseException e) {
       e.printStackTrace();
      } catch (IOException e) {
       e.printStackTrace();
      } catch (ParserConfigurationException e) {
       e.printStackTrace();
      } catch (SAXException e) {
       e.printStackTrace();
      }
      return jsonArray;
     }
    



    参考

    JSONIC - simple json encoder/decoder for java 
    StackOverFlow java.net.MalformedURLException: no protocol

    2013年3月24日日曜日

    FacebookのjavascriptSDKとUIWebViewでの落とし穴

    FB.login()を使うとブランクが残る

    いくつも関数が用意されているのですが、ログインのために開いたWindowが自動で閉じません。
    そのため、白いブランク画面が表示されたままで遷移が止まってしまいます。

    ログインは、window.locationとリダイレクトURLを自前設定することで、FBログインののち、用意している画面にリダイレクトさせることができます。



    サンプルコード
     
    
    
    login
    
    
    
    
    
    
      window.fbAsyncInit = function() {
        var stat = "";
        var hostUrl = "http://foo.bar/login.html";
        var appId = "xxxxxxxxxxxxxxx";
        var permission = "user_about_me,user_photos,user_birthday,user_location";
    
        // init the FB JS SDK
        FB.init({
          appId      : appId, // App ID from the App Dashboard
          status     : true, // check the login status upon init?
          cookie     : true, // set sessions cookies to allow your server to access the session?
          xfbml      : true  // parse XFBML tags on this page?
        });
    
        // Additional initialization code such as adding Event Listeners goes here
        FB.getLoginStatus(function(resp){
            if(resp.status === 'connected'){
                console.log("already login");
                getData();
                stat = resp.status;
                $("#facebookLogin").text("logout");
            }else if(resp.status === 'not_authorized'){
                console.log("noAuth");
            }else{
                console.log("noLogin");
            };
        });
    
        function getData(){
            FB.api("/me/", function(resp){
                console.log(resp);
            });
        }
    
        $("#facebookLogin").click(function(){
            console.log("click");
            if(stat === "connected"){
                console.log("connect");
                FB.logout(function(response) {
                    $("#facebookLogin").text("login");
                    stat = "";
                });
            }else{
                console.log("not connect");
                window.location = encodeURI("https://m.facebook.com/dialog/oauth?client_id="+appId+"&redirect_uri="+hostUrl+"&response_type=token&scope="+permission);
            }
        });
    
      };
    
      (function(d, debug){
         var js, id = 'facebook-jssdk', ref = d.getElementsByTagName('script')[0];
         if (d.getElementById(id)) {return;}
         js = d.createElement('script'); js.id = id; js.async = true;
         js.src = "//connect.facebook.net/ja_JP/all" + (debug ? "/debug" : "") + ".js";
         ref.parentNode.insertBefore(js, ref);
       }(document, false)); 



    参考
    JavaScript SDK

    2013年1月21日月曜日

    Google App EngineとPyScripterでハマった。

    2013年はPythonの

    僕自身は詳しくないのですが、巳年ということと、友人にPython使いが多いことから、Pythonを学び始めることにしました。
    そしてGoogle App Engineを用いて開発しようとしたところで、躓きました。


    文字コードに注意

    エディターにPyScripterを用いて開発をしようとしたのですが、何故かGoogle App Engine Launcher内のプロジェクトが、赤文字になり、RunすることもLogsを見ることも何も選択できない状態になってしまいました。

    この状態は、Google App Engine Launcherにプロジェクトを追加した後にフォルダを変更したり、app.yamlが読みこめていないときなどに起こるそうです。

    日本語を利用したいのでPyScripterからファールフォーマットを、「Ansi」から「UTF-8」に変更したことが問題でした。

    ここでは、「app.yaml」は、「UTF-8(No BOM)」を選択しなければなりません。

    かといって、すべて「UTF-8(No BOM)」にすればいいかと言えばそうでもなく、.htmlなどは「UTF-8」を用います。




    「PATHも通って、さっきまで動いていたのに何が問題なんだ!」



    同じような事態になったときは、一度ご確認ください。