WebView+JavaScript
概要
WebViewを通して開いているhtmlページ.
その中に表示されているJavaScriptが登録されているボタン.
このボタンを押してAndroid側へコマンドを実行する方法.
ポイント
JavaScriptから実行できるメソッド用意
class JsHandler { public void onClickFromHtml() { finish(); } }
JavaScript有効化
webView.getSettings().setJavaScriptEnabled(true);
webView.addJavascriptInterface(new JsHandler(), "app");
JavaScript側の呼び出し
<input type="button" value="送信" onClick="app.onClickFromHtml()" />
xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <WebView android:id="@+id/webView1" android:layout_width="match_parent" android:layout_height="match_parent" /> </LinearLayout>
html
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> <title>このアプリについて</title> </head> <body> うんたらかんたら. <input type="button" value="送信" onClick="app.onClickFromHtml()" /> </body> </html>
Activity
/** ローカル上のhtmlを表示するWebViewアクティビティ */ public class LocalWebViewActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.local_web_view_layout); WebView webView = (WebView) findViewById(R.id.webView1); webView.getSettings().setJavaScriptEnabled(true); webView.addJavascriptInterface(new JsHandler(), "app"); webView.loadUrl("file:///android_asset/about.html"); } /** JavaScriptハンドラ */ class JsHandler { /** Htmlから呼ばれるメソッド */ public void onClickFromHtml() { finish(); } } }
啓発本の読み方
情報はいかに使いこなせるかが大事です。
本を読むだけでは、自分からは変えれない
本に納得するようなことが記載されていても、その意味を理解しただけでは自分の生活ルーチンに取り入れない限り覚えることも身に付くことも、習慣化し、そこから何かを学ぶことも出来ない。
誰かから同じ意味を聞くか関係ない話題で偶然シナプスが走ったときに思い出すだけだ。
しかもこれは結局本を読んだときに納得しているのと同じで、きっかけとなったその人に対して親近感や共有による親密度があがるだけで、何も変えれない。
本を読んだ後は、読んで得た要素を本から抜き出しする作業をすることが何よりも大事だ。
抜き出ししないと再び本を読み直すことになるし、情報資産としてその本を保存し続けなければいけない。
せっかくお金を払って借りている部屋にデッドスペースが生まれ値段相応の価値を得られなくなる。
はてなのスタイル変更しました。
サイトの自作CSSを作成しました。
前々からはてなのデザインを自分で弄りたいと思っていたのですが、優先度が低く弄る機会がなく、そしてそのまま更新頻度も下がり放置状態が続いていました。。
しかし別件で再びサイトを更新する必要性が出てきたついでに作成しました。はてなにCSSを適用する方法やCSS自体の種類や使い方をウェブで調べながら、ちまちまと進めたので割にあわない時間を使ってしまいましたが、今後ももんもんと弄りたいなーと考えなくて済むので、まあ良しとしました。
以下全部ではないですが参考サイトと実際のCSSファイルです。コメントに嘘や非効率な組み方になっているので、使用・参考は自己責任で。
続きを読むLua Object-Oriented Programming(OOP) オブジェクト指向
注意:勉強がてらの覚え書き、間違っている可能性もあります。
鵜呑み注意。
テーブルを利用したオブジェクト指向プログラムライク
Account = {balance = 0} function Account.withDraw(v) Account.balance = Account.balance - v end
この定義は Accountオブジェクト内に新しい関数とフィールドを作成する.次のように呼び出せる。
Account.withDraw(100.00)
しかしこの方法だと次のケースで問題が起きる
a = Account; Account = nil a.withDraw(100.00) -- ERROR
withDraw関数内でAccountが参照されているが、この関数を呼ぶ前にAccountにnilを渡している。
もう少しスマートに
Account = {balance = 0} function Account.withDraw(self, v) self.balance = self.balance - v end
呼び出し↓
a1 = Account; Account = nil a1.withDraw(a1, 100.00) --OK
withDraw関数呼び出しの前にAccountにnilが渡されても問題ない.
ついでにselfパラメータを使うことで,別オブジェクトでも同様にwithDraw関数を使える.↓
a2 = {balance = 0, withDraw = Account.withDraw} a2.withDraw(a2, 290.00)
メタテーブルを利用したオブジェクト指向プログラムライク
メタテーブルとはテーブルと同じ。
ただしテーブル内の値は特定の演算をしたときのみ使われる。
テーブル内の値は決まっている。
- __add : +演算
- __sub : -演算
- __mul : *演算
- __div : /演算
- __mod : %演算
- __pow : ^(累乗)演算
- __unm : 単項演算
- __concat : 連結演算
- __len : #演算
- __eq : ==演算
- __lt : <演算
- __le : <=演算
- __index : table[key]インデックスアクセス
- __newindex : table[key] = valueインデックス代入
- __call : 値を関数呼び出したとき
所謂C++でいうところのoperator*()などになる。
setmetatable(a, {__index = b})
aオブジェクトが持っていないときは,bへオペレーションを探す。
function Account:new(o) o = o or {} --もしUserが提供しない場合は生成される. setmetatable(o, self) self.__index = self return o end
oオブジェクトのメタテーブルをself(=Account)に決定する。
selfにindexアクセスをした場合はself(=Account)を探すように決定する.
oオブジェクトが持っていないときは, self(=Account)へオペレーションを探す。
(indexに設定している理由は、関数呼び出しはテーブルのindexアクセスによるもののため. Account.drawWithはAccount["drawWith"]と同じ)
a = Account:new()
a:deposit(100.00)
↑新しいAccountインスタンスが生成される。
a:deposit(100.00)が呼ばれたとき、テーブルa内にdepositが見つからない場合はメタテーブルの__indexを調査する。
展開するとこんな感じになる。
getmetatable(a).__index.deposit(a, 100.00)
↑aのメタテーブルのキーとなる__indexの中にあるオブジェクトAccountのdeposit関数をコールしている。
つまりは
Account.deposit(a,100.00)
になる。これは初めの方で説明したもの。
aオブジェクトに対してAccountのdeposit関数を使っているのと同じ。
これでAccountのインスタンスが作成でき、
aのインスタンスメソッドが呼ぶことができた。
継承
とりあえず次のような基底クラスみたいなAccountクラスがあったとする。
Account = {balance = 0} function Account:new(o) o = o or {} setmetatable(o, self) self.__index = self return o end function Account:deposit(v) self.balance = self.balance + v end function Account:withDraw(v) if v > self.balance then error "金がねぇ" end self.balance = self.balance - v end
AccountのサブクラスSpecialAccountを定義する.
SpecialAccount = Account:new()
これでSpecialAccountはAccountのインスタンスになる。
そして次で変数追加.
s = SpecialAccount:new{limite = 1000.00}
selfはSpecialAccountを参照しています。
そしてselfはmetatableの__indexに登録されています。
つまりこれで s はSpecialAccountのインスタンスになります。
しかもAccountを継承してます。
↓この式を評価すると
s:deposit(100.00)
sの中にdepositない。SpecialAccountを見に行く。
SpecialAccountの中にdepositない。Accountを見に行く。
Accountの中にdepositある。Account.depositを実行。
こんな感じになります。
オーバーライドを実現
上の評価の流れでいくと、SpecialAccountにwithDrawを定義したらAccountのwithDrawを呼ぶ前にSpecialAccountのwithDrawを呼ぶことになります。
function SpecialAccount:withDraw(v) if v - self.balance >= self.getLimite() then error "金欠" end self.balance = self.balance - v end function SpecialAccount:getLimite() return self.limit or 0 end
参考:http://www.lua.org/pil/index.html:Programming in Lua (first edition)
参考:http://milkpot.sakura.ne.jp/lua/lua51_manual_ja.html:Lua 5.1 リファレンスマニュアル(エンコードによる文字化け注意)
Fragmentの使い方メモ
自分用メモ。
概要
Activityの部品の一つ。再利用可能なUIを作るのが目的。
例えばActivityが2つあったとして、その二つに同じUIが存在する場合に
そのUI部分をフラグメントで実装することによって、同じ実装を2度することなく再利用できる。
(所謂関数)
使い方(3.0未満〜1.6以上)
ライブラリを登録
・Android SDK Manager > Available Packages > Android Compatibility package
をインストールする。
・ライブラリを登録する(パスを通す)(eclipse 画面)
インストールが完了するとSDKフォルダ/extras/android/support/v4フォルダに
android-support-v4.jarというファイルがあるのでそれがライブラリになる。
layoutフォルダにUIとなるxmlを追加する。
Mac + GitHub
Mac環境下でGitHubにSSH通信する必要が出たので、https://help.github.com/articles/generating-ssh-keysを実際に試しながらメモ。
SSHキーの作成からGitHub登録まで
Step 1:既にSSHキーを所持しているか確認
#PC内に既に.sshというディレクトリが存在するか確認.
$ cd ~/.ssh
もし"No such file or directory"と出たらStep 3へ
Step 2:バックアップと既存のSSHキー削除
古いSSHキーをバックアップし、.sshフォルダ下の古いキーを削除します。
$ mkdir key_backup
$ cp id_rsa* key_backup
$ rm id_rsa*
Step 3:新しいSSHキーを生成する
PublicとPrivateのRSAタイプのSSHキーを生成.
キーは.ssh/id_rsaとして生成される.
$ ssh-keygen -t rsa -C "your@mail address"
[Press enter]
[パスフレーズを入力]
[再度パスフレーズを入力]
Step 4:GitHubにSSHキーを追加する
先ほど作成したSSHキー(Public)をクリップボードへコピー
$ pbcopy < ~/.ssh/id_rsa.pub
GitHubのアカウント設定ページで、SSH Keysをクリック。
Add SSH keyをクリック。
Keyフィールドにクリップボードからペーストして、キーを設定する。
GitHubパスワードを確認。
Step 5:正しくできたか検証
GitHubへSSHプロトコルで接続を試す
$ ssh -T git@github.com
[yes]
もし"access denied"と表示されたら、HTTPSプロトコルを使用してください。
もしSSHが必要な場合、問題を探さなければいけません。
GitHubにリポジトリ作成からEclipseプラグインのEGitインストールまで
Step 1:GitHubにリポジトリを作成
もしEclipseマーケットプレイスが見つからない場合はStep 2へ
ある場合はStep 3へ
Step 2:Eclipseマーケットプレイスをインストールする
新規ソフトウェアのインストールから実行
Indigo - http://download.eclipse.rg/releases/indigo
一般ツール > Marketplace Clientをインストール
Step 3:EclipseマーケットプレイスからEGitをインストール
Step 4:プロジェクトをGitに登録する
Eclipseでプロジェクトをエクスプローラーで右クリックしてチーム > 共有を選択
開いたダイアログでレポジトリータイプを聞かれるのでGitを選択
Step 5:.git/configを編集する
プロジェクトに.gitフォルダが追加されるので、/.git/configを開き
以下の設定を追加する
[user]
name = ここにユーザ名
email = user@example.com
コミットなどは未定。