2014年12月3日水曜日

[android]Android Studio 1.0 RC2なるものにあげたらビルドできなくなった

Check for Updates...でCanary Channelにあわせると、「Android Studio 1.0 RC2」なるものがありましたのでインストールしてみました。

ビルドができなくなりました。
app/build.gradleでCannot resolve symbol 'runProguard'とか言われます。
(知らんがな)
他には
/build.gradleで
classpath 'com.android.tools.build:gradle:0.12.2'
のバージョンが最低0.14.0じゃないといかんと言われています。

解決策として合っているのかどうかよくわかりませんが、
トップディレクトリの/build.gradleファイルで
classpath 'com.android.tools.build:gradle:0.14.2'
と書くとビルドができるようになりました。

これなのかしら?
http://stackoverflow.com/questions/27016385/error26-0-gradle-dsl-method-not-found-runproguard

2014年10月31日金曜日

[android] Android Studioを0.8.14にあげる

Windows Vistaです。
Andoroid Studioのアップデートがあったのでアップデートしてみました。

でました警告。

http://tools.android.com/knownissues
を読めとおっしゃっているので読んでみました。
sdk/フォルダを移動しろとおっしゃっているようなので移動しました。
移動したらRetryです。

しばらくすると以下のようなダイアログがでました。
続けるにはProceedを押せと書いてあるようにみえたのでProceedを押しました。



Android Studioが再起動しました。
最後にこんなのがでました。


最初に移動したsdk/フォルダの場所を教えてあげました。
JDKの場所も教えてあげました。

アップデートできました!






2014年10月25日土曜日

[android] GridView(ListView)を水平スクロールする

androidで「GridView(ListView)を水平スクロール」したかったんです。
①HorizontalScrollView内にLinearLayoutかなにかを置いてさらにその中にGridViewをいれる。コードで要素数に合わせて列数を計算したり、幅を計算したりする。
two-way-gridview を使う
Galleryを使う(This class was deprecated in API level 16.)

いずれもすばらしい方法です。私には思いつきもしませんでした。
敬意を表します。

第4の選択肢がでてきました。
Designに書いてある順に自然と並ぶのもGoodです。
RecyclerViewを使う」です。
RecyclerViewには、setLayoutManager(RecyclerView.LayoutManager layout)というメソッドがあるのですが、ここの引数に、
new StaggeredGridLayoutManager(int, StaggeredGridLayoutManager.HORIZONTAL)を指定するんです。一番目の引数が行数となります。

こんなのができました。
行数=3にしています。
サムネイル画像をタップすると、大きな画像を取得して表示します。


Creating Apps with Material Designここを参考にしました。
さらにDisplaying Bitmaps Efficientlyで勉強したこともまぜこんでみました。
GitHubに置いておきます。
jp.torifuku.ui. TorifukuAdapterとそれを呼び出している
jp.torifuku.recyclerviewsample. MyFragment#onCreateView()あたりがポイントです。
ぜひ読書日記の見た目をよくしていきたいものです。
(いつのことになるのやら?)




2014年10月11日土曜日

[android]Android StudioでAdMob

自分用のメモです。

こちらに書いてありました。

Eclipseとの違いはGoogle Play Servicesの追加の仕方くらいでしょうか。
1. SDK Managerで、下のほうにあるExtras配下のGoogle Play servicesとGoogle Repositoryを最新にしておく
2. build.gradleのdependenciesのところに、「compile 'com.google.android.gms:play-services:5.+'」を追加
(Eclipseでやったときはもっと面倒だったような気がします。これがGradleの力なのでしょうか、よくわかっておりませんが)


あとの手順はEclipseで作るときと同じだとおもいます。
1. AndroidManifest.xmlに下記を追加
<uses-permission android:name="android.permission.INTERNET"/>

<meta-data android:name="com.google.android.gms.version"
        android:value="@integer/google_play_services_version" />

<activity android:name="com.google.android.gms.ads.AdActivity"
            android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"
            android:theme="@android:style/Theme.Translucent" />

2. あとはxmlとコードを駆使して、com.google.android.gms.ads.AdViewが表示されるようにする
最初に紹介したページではFragmentを使っていました。
xmlで設定するときはAdViewの外側のRelativeLayout/LinearLayoutとかに、xmlns:ads="http://schemas.android.com/apk/res-auto"を忘れずに!(お恥ずかしい話ではございますが、昔これに気づくまで2時間くらいかかったことがあります……)

2014年9月24日水曜日

[android] Failed to complete Gradle Execution

Android Studio 0.8.9
Windows Vista

私の場合、起動時にBuild -> Rebuild Projectをすると必ず下記のメッセージで失敗します。
それでも根気よく続けていると成功して、それからは順調です。

Failed to complete Gradle execution
Cause:
A fatal exception has occurred. Program will exit

毎回面倒なので調べてみると、解決策がこちらにありました。
File -> Settings -> Gradle
"Gradle VM options:"に-XX:MaxHeapSize=256m -Xmx256mと入力する。

ありがとうございました!

2014年9月22日月曜日

[android]R.javaがつくられない、新規作成したandroidプロジェクトでActivityが作られない

$ eclipse -cleanで解決しました。

もう少し具体的な症状ですが、
・iMac
・起動時にプロジェクトに赤い×がついているプロジェクトが2、3ヶ月前からたくさんあった。あまりメンテナンスしていないアプリだったのでほったらかしていました。メンテナンスしたいアプリがビルドできなくなっていて焦りました。
・Project -> Cleanをすると、ビルドが成功するプロジェクトもあった
・Project -> Cleanをしてもビルドが失敗するプロジェクトではR.javaが生成されていなかった
・androidのプロジェクトを新規作成すると、最後のActivity作成画面が消えない。キャンセルで閉じてプロジェクトをみると、なんだか白い。srcの下が空っぽ。
・Mac OSX 10.9.4 -> 10.9.5に直前にあげた(無関係かも?)

なんだかわからなかったのですが、eclipse -cleanをして起動するとビルドが成功するようになりました。

2014年9月6日土曜日

パソコンが壊れた → ほこりをはらったら治りました。

2008年ころに買ったDELLのデスクトップパソコンが壊れました。
ある日突然、電源を入れても、ビープ音が鳴るばかりで全然立ち上がってくれませんでした。

よく考えてみると、そうなる前の半年くらいは、いつもファンの音がうるさかったです。
けたたましい音がしていました。
でもまあ使えていたから、うるさいなあとは思っていましたがそのまま使っていました。

もう駄目かなあと思っていたのですが、
DELL ビープ音 4回」とかで検索すると、中を開けてメモリを挿し直すと治ったというような方が結構いらっしゃって、駄目でもともとでやってみました。

不器用ですし余計壊してしまうんじゃないかと不安でしが、やるだけやってみました。


するとなんと治りました!


ファンのところにホコリがたくさんたまっていました。
エアーダスターでブシューとやりました。
ただ治っただけではなく、ファンの音も静かになり、心持ち動作が軽くなったような気がします。

でもまたいつ壊れるかわからないので大事なデータはバックアップが必要だなあとかおもいました。

2014年5月18日日曜日

[Java]java.util.stream

int sum = widgets.stream()
                      .filter(w -> w.getColor() == RED)
                      .mapToInt(w -> w.getWeight())
                      .sum();
こ、これは?
Java(Java Platform SE 8)なんです。

従来の書き方だとこんな感じでしょうか。
public class Widget {
    private COLOR color;
    private int weight;
    
    public enum COLOR {
        RED,
        YELLOW,
        BLUE
    }
    
    public Widget(COLOR color, int weight) {
        this.color = color;
        this.weight = weight;
    }
    
    public COLOR getColor() {
        return color;
    }
    
    public int getWeight() {
        return weight;
    }
}

List<Widget> widgets = new ArrayList<Widget>() {{
    add(new Widget(RED, 1));
    add(new Widget(RED, 2));
    add(new Widget(YELLOW, 3));
    add(new Widget(BLUE, 4));
    add(new Widget(RED, 5));
}};
Stream<Widget> stream = widgets.stream();
Predicate<Widget> predicate = new Predicate<Widget>() {
    @Override
    public boolean test(Widget w) {
        return w.getColor() == RED;
    }
};
stream = stream.filter(predicate);
ToIntFunction<Widget> tif = new ToIntFunction<Widget>() {
        @Override
        public int applyAsInt(Widget w) {
            return w.getWeight();
        }
};
IntStream is = stream.mapToInt(tif);
int sum = is.sum();
System.out.println("sum: " + sum);


-----------------------------------
Rubyで書くとこんな感じです。
class Widget
  attr_accessor :color, :weight
  def initialize(color, weight)
    @color = color
    @weight = weight
  end
end
sum = [Widget.new(:RED, 1), Widget.new(:RED, 2), Widget.new(:YELLOW, 3), Widget.new(:BLUE, 4), Widget.new(:RED, 5)].select{ |w| w.color == :RED }.inject(0){ |memo, obj| memo += obj.weight }
p sum


2014年4月26日土曜日

[Ruby]雑談対話2 OpenStructを使ってみました

雑談対話をRubyで書いてみました。

require 'httpclient'
require 'json'
require 'ostruct'

class Dialogue
  def say(msg)
    body = JSON.generate(utt: msg, context: @context.nil? ? "": @context)
    clnt = HTTPClient.new
    uri = 'https://api.apigw.smt.docomo.ne.jp/dialogue/v1/dialogue?APIKEY=(Your API Key)'
    res = clnt.post_content(uri, body, {'Content-Type' => 'application/json'})
    %w(utt yomi mode da context).inject(OpenStruct.new) { |result, key|
      result.send(key + "=", JSON.parse(res)[key])
      @context = JSON.parse(res)[key] if key == "context"
      result
    }
  end
end

感想とかです。
・@context.nil? ? "": @context のところはこれでいいんです。?は多くないです。
 nil?()というメソッドのあとに条件演算子(Rubyではこう呼ぶそうです。C言語だと三項演算子と呼んでいたような?)が続いている感じです。
・HTTPClientだけはgem install httpclientをしたのをおぼえています。その他のものはRubyをインストールしたときに最初から入っていたのだとおもいます(たぶん)。
・OpenStruct(requireのところは、'ostruct')はすごいです。
 カルチャーショックを受けました。
 たとえば
 o = OpenStrcut.new
    o.title = "タイトル"
 puts o.title
 と書くと、titleなんてものは事前に作った覚えも無いのに、自動的に下記のようなメソッドを作ってくれる(※)ようです。
(※)私の理解です。本当はもっと複雑なことをしていただいているのかもしれません。
 def title=(title)
      @title = title
    end
 
 def title
      @title
    end
 
これによりあたかも、titleフィールド(という言い方がよいのかどうかは微妙な気がしますが)に値を書き込んだり、読み込んだりしているようなコードを書けるようです。

[android]Android File Transferの[実行] --> [転送]とは?

Android File TransferをiMacにインストールしました。
Nexus 5で撮った写真をiMacに取り込みたかったので。
インストールはAndroid File Transferのページに書いてあるようにすればできました。
最後は「drag Android File Transfer to Applications」するのですね。
ここを参考にさせていただきました。
ありがとうございました。

さて、このAndroid File Transferに[実行] --> [転送]というメニューがあるのですが、何のことかはじめわかりませんでした。
ファイルの転送かなとおもって、ファイルを選択した状態で[転送]という名のメニューを選択してもうんともすんともいいません。どこかよくわからないところに転送されてしまったのではないかとドキドキしました。
[実行] --> [戻る]というメニューもあるのですが、[転送]はどうやらこれの逆の意味のようです。iMacを英語設定にすると、[Go(実行)] -> [Back(戻る)]と[Go(実行)] -> [Foward(転送)]になっていました。英語設定の方法はここを参考にさせていただきました。ありがとうございました。

[戻る]は、現在選択中のディレクトリから元のディレクトリへ戻る意味だとおもいます。
[転送]はそれの逆で「進む」みたいな感じのようです。


2014年4月25日金曜日

[Ruby]雑談対話

require 'httpclient'
require 'json'

msg = 'こんにちは'
puts 'Me>' + msg
body = JSON.generate(utt: msg) # {:utt => msg}のこと
clnt = HTTPClient.new
uri = 'https://api.apigw.smt.docomo.ne.jp/dialogue/v1/dialogue?APIKEY=(Your API Key)'
res = clnt.post_content(uri, body, {'Content-Type' => 'application/json'})
my_hash = JSON.parse(res)
puts 'docomo>' + my_hash['utt'].to_s


雑談対話をRubyで書いてみました。
HTTPClientはgem install httpclientをしました。
JSONはインストール時に最初から入っていたのだとおもいます(たぶん)。
{'Content-Type' => 'application/json'}が必要でした。

Rubyのバージョンは下記の通りです。
$ ruby -v
ruby 2.1.1p76 (2014-02-24 revision 45161) [x86_64-darwin13.0]

2014年4月18日金曜日

[Ruby]パスワード生成

Rubyはじめました。
32文字のパスワードを自動的に作ります。
こちらを参考にさせていただきました。
ありがとうございました。

def password_gen(size=8)
  [*'!'..'~'].sample(size).join
end
puts password_gen(32)

パスワードはクセのようなもののせいで、どうしても同じようなものを作ってしまいます。
これを使うとランダムに作ってくれます。
けれど覚えられない……
みなさん、どうされているのですかね……




2014年4月2日水曜日

[android]AdMob更新

Admob SDK版からGoogle Play Services版に変更をしました。

2014.8.1がキーワードです。

https://developers.google.com/mobile-ads-sdk/docs/?hl=ja
ここに書いてある通りにやればできます。
私にもできました!

私がはまったポイントは、
①Android Manifestに追加した
android:value="@integer/google_play_services_version"
のビルドエラーが消えない。
 → <android-sdk>/extras/google/google_play_services_froyo/ からもってきたものを
   Libraryに追加していることが原因でした。
   <android-sdk>/extras/google/google_play_services/ から持ってきたものにすれば、
   解決しました。でもちょっと待った。後述。(※)

②ビルドは通った。よし実行! だけど、バナーのサイズが指定されていないとか言われて、アプリが起動しない。
 → 私はXMLに設定をしていたのですが、下記を変更しないといけませんでした。
   xmlns:ads="http://schemas.android.com/apk/lib/com.google.ads"
   ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
   xmlns:ads="http://schemas.android.com/apk/res-auto"

①・②ともにずっと悩んでいました。
だれかのお役にたてればうれしいです。

(※)私がリリースしているAndroidアプリは2.2(sdk=8)以上にしていました。
最初に買った機種がLYNX3Dなもので……
Google Play Services版にするとandroid:minSdkVersion="9"にしないといけないようです。
ということはそうですよ、そう、ごにょごにょごにょ。
2014.8.1以降も新規アプリやアプリの更新をしなければ、Admob SDK版でもよいようです。
これもそのうち広告が表示されなくなるようにおもうのでやっぱり、どこかでバサッと思い切らないといけないときがくるかもしれません。

2014年2月10日月曜日

[android]javax.net.ssl.SSLException発生

とあるWeb API(https)が突然使えなくなりました。
  • 先月までは大丈夫だった(通信できていた)気がします
  • javax.net.ssl.SSLExceptionが発生するようになりました
  • 私が所有している端末のうち、android2.2のみで不具合が起きていました
  • org.apache.http.impl.client.DefaultHttpClientを使って実装していました
org.apache.http.impl.client.DefaultHttpClientはandroidでは推奨されていないのですね……
私が利用させていただいているWeb API(https)では、javax.net.ssl.HttpsURLConnectionを使うと通信できるようになりましたので、そのときのソースを書いておきます。
try {
    URL url = new URL("https/......");
    HttpsURLConnection urlConnection = null;
    try {
        urlConnection = (HttpsURLConnection) url.openConnection();
        SSLContext context = SSLContext.getInstance("TLS");
        TrustManager tm = new X509TrustManager() {
            @Override
            public void checkClientTrusted(X509Certificate[] chain,
                String authType) throws CertificateException {
            }

            @Override
            public void checkServerTrusted(X509Certificate[] chain,
                String authType) throws CertificateException {
            }

            @Override
            public X509Certificate[] getAcceptedIssuers() {
                return null;
            }
        };
        context.init(null, new TrustManager[] { tm }, null);
        urlConnection.setSSLSocketFactory(context.getSocketFactory());
        InputStream in = urlConnection.getInputStream();
        if (urlConnection.getResponseCode() == HttpURLConnection.HTTP_OK) {
                // 通信成功!!!
                // inを煮るなり焼くなりしてください!
        }
    } catch (IOException e) {
        e.printStackTrace();
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    } catch (KeyManagementException e) {
        e.printStackTrace();
    } finally {
        urlConnection.disconnect();
    }
} catch (MalformedURLException e) {
    e.printStackTrace();
}

2014年2月6日木曜日

ありがとう

JavaScriptのイベントを勉強しました

2014年1月11日土曜日

[android][Java]雑談対話

docomo Developer support様の雑談対話APIを使ったandroidアプリケーションを作ってみました。
雑談対話APIはHttpPostを使う必要があります。
これまでHttpGetを使うWeb APIはいくつか使ったことがあったのですが、HttpPostはあまり経験がなくて苦戦してしまいました。
なんとかできましたので、その時のメモを残しておきます。
苦戦したポイントは……(いやーお恥ずかしい)
  • <uses-permission android:name="android.permission.INTERNET" />を忘れずに
  • JSON形式でリクエストを送らないといけないことになかなか気づかなかったこと
  • StringEntityのコンストラクタで第2引数 "UTF-8"が必要だったこと(機種依存なのかも? しれません)

参考にさせていただいたサイト様です。

HttpPostリクエストを実行して、HttpResponseを得るところまでのソースです。
AsyncTask#doInBackground()等main threadではないThreadで動作するように実装すればよいかとおもいます。
DefaultHttpClient httpclient = new DefaultHttpClient();
final String APIKEY = "ご自身のAPIKEYをお使いください";
HttpPost post = new HttpPost("https://api.apigw.smt.docomo.ne.jp/dialogue/v1/dialogue?APIKEY=" + APIKEY);
JSONObject json = new JSONObject();
try {
    json.put("utt", "こんにちは");
    StringEntity body = new StringEntity(json.toString(), "UTF-8"); /** LYNX 3D SH-03Cは第2引数"UTF-8"が必要でした。 */
    //post.addHeader("Content-Type", "application/json"); /** 雑談対話APIでは設定をしなくてもよいようです。 */
    post.setEntity(body);
    HttpResponse response = httpclient.execute(post);
    int statusCode = response.getStatusLine().getStatusCode();
    if (statusCode == HttpStatus.SC_OK) {
        HttpEntity entity = response.getEntity();
        String jsonTxt = EntityUtils.toString(entity, "UTF-8");
        JSONObject response_json = new JSONObject(jsonTxt);
        /** レスポンスの取り出し */
        String utt = response_json.getString("utt");
        String yomi = response_json.getString("yomi");
        String mode = response_json.getString("mode");
        String da = response_json.getString("da");
        String context = response_json.getString("context");
    }
} catch (ClientProtocolException e) {
} catch (IOException e) {
} catch (JSONException e) {
}

2014年1月1日水曜日

[android]NFC

あけましておめでとうございます。
今年もよろしくお願いします。

ABC 2013 Autumnに行ったときに記念に買ったNFCタグ(100円)に情報を書き込んでみたくなりました。
秋に買ったときは対応端末を何も持っていなかったので、ずっと引き出しの奥に眠ったままになっていました。
 ↑↑↑
こんなやつです。

Nexus 5を買ったのでかざしてみました。
「なにも書き込まれていません」みたいな表示がされました。

何か書き込んでみたくなりました。
http://developer.android.com/guide/topics/connectivity/nfc/index.html
を読んでいろいろやってみましたが、できませんでした……

http://www.ntts.co.jp/publish/column/tec/mobile_04/index.html
わかりやすく解説してくださっているページがありましたので、そのとおりにやるとできました。
URL情報がNFCタグに書き込まれて、かざすとそのページがブラウザで開けるようになりました。

もう一回公式の内容を読み返してみたいとおもいます。
今度は話がつながってくるような気がします。


追伸
Nexus 5いいです。Google Playで買いました。
ビックカメラSIM(SMS)との組み合わせが一番いいんじゃないでしょうか。


追伸2
『インフラエンジニアの教科書』をある人からススメられて読みました。
いろいろ勉強せんといかんですね。