Runner in the High

技術のことをかくこころみ

Webview 内のデータを取得するメモ

webview を用いて表示させたページのソースやらなにやらのようなデータを取得する手段がドキュメントのどこにも書かれていないので困ったが、いろいろ調べたら見つかった。
var view = document.getElementById("web-view-test");
view.executeScript({
code: "document.title"
}, function(r) {
console.log("Title: " + r[0]);
}
);
例えばこうすることでタイトルが取得できる
executeScriptはもっと他にも面白い使い方がありそう :D

Chrome Dev EditorではGitで512kb以上のコミットをプッシュできない

Error whilst pushing changes #3456 - Chrome Dev Editor
Git push fails for huge changes. #2553 - Chrome Dev Editor

詳しくは上の2つのチケットを参照のこと。
Chrome Dev Editor(CDE)ではjs-gitというGitをJavaScriptで実装したものを利用してコミットやリモートリポジトリへのプッシュなどができるのだけれど、調子に乗って大きな変更を一気にプッシュしようとすると、失敗して痛い目を見る。画像は準備できなかったが、確かダイアログで fatal: The remote end hung up unexpectedly が出てくるはず。
Unfortunately the browser https protocol only allows to send a packet max of 512KB. For security purposes the browser explicitly disallows to set dangerous headers to have a open connection. This is currently a limitation of CDE. We are working on a more fledged port of libgit2 which will fix this.
Sorry that you are running into it :-(
詳しい理由は分からないが、どうやらhttpプロトコルのセキュリティに関係しているらしい。ワークアラウンドとしてはできるだけコミット毎にこまめにプッシュすることくらいか。Githubのチケットを見ないと情報が載ってないほどメジャーではないバグ(?)らしいのでとりあえずメモ。ちなみにこのときのバージョンは0.19.3493

Acer C720のこと

最近ちょっとあってAcerChromebook C720を手に入れたので
これについて軽く記事を書こうかなと思った今日このごろ

 


マシンの写真とかはそこらへんにごろごろしてるのでこんなもんで。

【スペック】
CPU: Intel(R) Celeron(R) 2955U @ 1.40Ghz 2core
Memory: 4G
Storage: SSD10G

充分軽い

 普段はmobusのバックパックで学校に持って行ったりするけれど、まずそんなに負担にはならない。MBAと比べたらそりゃ重いけど。基本的にスポーツといえばサッカーくらいしかやったことのないthinな人間でもこの体感、というくらいの軽さということで。

ぬるぬる動く

 スペックを見るとCeleron 2955Uとさほど早いCPUではないにもかかわらずストレスを感じさせないスピードで動く。そもそもできることが限られているという点で、マシンに負荷をかけることが難しい気がする(タブを100個開くとかすれば重くなるけどね!)

 特筆すべき点は起動・シャットダウン・スリープの速度MBAを持ってないからわからないけれど、やつらに匹敵するかそれ以上のレベルで早い。Amazonか何かのレビューで起動時間を測定する動画があったけれど、ぜひそれを見て欲しい。この点でのストレスは皆無。

 加えて、SSDなのでHDD特有の動作音がなくて静かなことと、忘れてはいけないのがWi-Fi接続までの速さ。これはもう本当に抜群に早い。環境によってスリープ復帰後とか起動直後のWi-Fiの接続にちょっと時間がかかってしまうことは度々あるけれど、C720ではまだそういうのは体験していない。この点は非常に優秀。

バッテリの持ちがやばい

 まだ一ヶ月ちょいしか使ってないから、ということもあるかとは思うけれど、バッテリの持ちはその辺のラップトップの比じゃない。スマホとかだと、バッテリの消費を抑えるために機内モードにしたりするけれど、そもそもそういうことをする必要なく、よっぽどぶっ続けでYoutubeでHD動画を見たりでもしなければ、半日くらいは持つ余裕を感じる。Lifetouch NOTEを持つ人間としては、あのマシンのバッテリの持ちにも相当のものがあるとは思っていたけれど、それに匹敵するレベルで(ネットブックという機能の上でのアドバンテージを加味すれば)最高のマシンだと思った。

個人的な総評(IMAO)

 まず、自分の基本的なChromebookでの作業習慣について説明しないと、評価の指針というものが理解されないと思うのでこれについて少し。Chromebook上でやる作業は、学校で提出するレポートを書いたりその情報収集をしたり、あとはたまにSSHでリモートの作業をしたり、と言った感じ。それ以外に基本的にはYoutubeで音楽を聴いたり動画を見たり、ネットサーフィンをしたりする程度。Google Keep, Text, Writebox, Serverauditorがヘビーユースアプリ。

 開発をやる人間が決して忘れちゃいけないことは、Chromebookでは開発はできませんよ、ということ。開発ができない、というのはもしかしたら語弊かもしれない。というのも、Chrome Dev EditorでChrome AppもDart Appも作れるし、ShifteditとかCodeanywhere、KodingなどのIDEも使えるっちゃ使えるわけで。ただ、個人的に一番負担になっているのは、gitとかsubversionとかのバージョン管理システムが使えないこと。croutonやchubuntuを導入するというワークアラウンドがあるのも事実ではあるけれど、そういうことではなく、ChromeOSとして使いたいのに、使えないということに負担を感じているということ。ChromeOSはそれ自体とても完成・洗練されていて、とても好きだから、そこにまた何か入れてやろうとは正直思わない。これとは別に、FTPクライアントでろくなものがないというのもどうにかしたいなという感じにはなっている。これはこれで自分で今度作ろうかな。

 なんとか言ってきたけれど、それでもなんだかんだ言ってChromebookは着実に僕の時間を奪う存在になりつつある。なにより普段からゴリゴリとコードを書いてコミットするわけじゃないし、むしろブラウザが使えるだけ、ということがいかに自分の作業内容へのフォーカスを後押ししてくれているのかがChromebookによって実感できた気がする。MacLinuxWindowsもそれぞれやっぱりできることの幅は大きくて、必ず持っていなければならないマシンであることはわかるけれど、そこにChromebookが入ってくることによって、その存在価値が無になるとは思えないし、とりわけ上のOS(Macは違うのかもしれなけれど)に特有の鈍重さになんらかの不満を持っているのであれば、むしろChromebookはその不満点を補う形で、実際に僕がそうだったように、ユーザーをサポートしてくれるだろうなと感じた。

結論: Macユーザー以外は買い

chrome.browsingDataの呼び出し回数制限

どうやらchrome.browsingDataには規定時間内の呼び出し回数制限があるらしい。
確かにコンマ何秒位の差で何度も呼び出されちゃオーバーヘッドも大きそうだしね。


みたところ、1秒未満の間に何度も呼びだそうとすると、エラーになるらしい。
もしかすると他にもこういうエラーを吐くAPIがあるのかもしれない。

EclipseでAndroidエミュレータ上のSQLiteのデータを見る

 EclipseAndroidエミュレータ上のSQLiteのデータを見るためのプラグインにはいろいろあるかとは思いますが、今回は最もシンプルで使いやすそうなQuestoid SQLite Browserとやらを使ってみます。

導入

  1. ここからQuestoid SQLite BrowserをEclipseにインストールする(Eclipseのフォルダ内にあるpluginsフォルダに放り込む)
  2. 再起動して有効化されているかどうか(dbファイルを選択したときに、右上のアイコンがクリックできるようになるかどうか)を確認。
  3. 拡張子がdbのファイル以外は選択しても中身を見れないので注意。
 

【コード】

package com.example.dbtest;

import android.app.Activity;
import android.widget.Toast;
import android.os.Bundle;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;

public class MainActivity extends Activity {
private final String DBNAME = "test.db";
private final String TABLE_NAME = "Info";
private final String[] column = { "name", "job", "age" };
private SQLiteDatabase database;
private Cursor cs;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

database = this.openOrCreateDatabase(DBNAME, MODE_PRIVATE, null);
database.execSQL("CREATE TABLE IF NOT EXISTS " + TABLE_NAME + " (name TEXT, job TEXT, age INTEGER);");
database.execSQL("INSERT INTO " + TABLE_NAME + " (name, job, age) VALUES('Jonathan', 'Engineer', '24');");
database.execSQL("INSERT INTO " + TABLE_NAME + " (name, job, age) VALUES('Bobby', 'Teacher', '45');");
database.execSQL("INSERT INTO " + TABLE_NAME + " (name, job, age) VALUES('Ricky', 'Taxi Driver', '32');");

cs = database.query(TABLE_NAME, column, null, null, null, null, null, null);
cs.close();
}
}
  • openOrCreateDatabase関数で、データベースファイルが存在していればファイルを作成、なければ新たにファイルを作成して、そこにデータを格納する。
  • SQLiteDatabase型変数のdatabaseから最後にclose()が呼ばれていないことに関して違和感を覚えるかもしれないが、最終的にDalvikVMによってオブジェクトが破棄されるため問題はない。だが、Cursorに関してはしっかりとclose()を呼んでおく必要あり。 (詳しくは「SQLiteをつかうための注意点」を参照)

【中身を見る】

Questoid SQLite Browserを起動するとこんな感じの画面に。
  • データベース構造」タブからテーブルの一覧とそのカラムが見られる。
  • Browse Data」タブからテーブルを選ぶとその中身が見られる。
 
ちなみにQuestoid SQLite Browserからできるのは、テーブルのカラムやその内容を見たりすることだけで、データの修正や追加はできません。あしからず!

(参考)http://www.coderzheaven.com/2011/04/18/sqlitemanager-plugin-for-eclipse/

LINEで「正常に処理できませんでした」が出る

 

 LINEストアにだれかが2回ほどログインしようとしたので、パスワードとメールアドレスの変更を試みるも、「An error has occured. Please try again later.」というダイアログが出て先に進めない。
※ちなみに日本語版だと「正常に処理できませんでした」という文章になる。

【対処法】
Wi-Fiをオンにする

(参考)
http://did2memo.net/2014/06/24/naver-line-e-mail-address-registration-error/

Chrome.storage.syncを使ってみる

Chrome.storageを使うと、異なるマシン上のChromeブラウザ間で同じ拡張機能が保存しているstorageを同期してくれる。

このサンプルの機能は、テキストボックスに入力された文字列をChrome.storage.sync.setでストア。起動時にChrome.storage.sync.getで読み込んで上のdivに内容を表示。同期されていれば、その内容が異なるマシン上で同じになる、というもの。 

  • setもgetも何らかのエラーが起きるとChrome.runtime.errorに文字列をセットする。ちなみに、getで指定されたデータが存在しなかった場合にはundefinedが帰ってくるだけでエラーにはならないので注意。
  • setでデータをセットするときには連想配列でキーを指定すること。ここがlocalStorageと違うところ。
  • データが同期されません!!という場合には、chrome://settings/syncSetup拡張機能にチェックが入っているかどうかを確認のこと。
  • うまく機能していれば、chrome://sync-internalsのSync Protocol Logとか、Transient CountersのCommited Countが増えたりする。