Hatena::ブログ(Diary)

素人がプログラミングを勉強するブログ

 

2012-02-07

おしゃれjQuery、Good Parts、Bad Parts

jQueryは互換性を保ちつつも洗練されたAPIを取り入れているので、新しく書くときは新しいAPIを使った方が良い。

liveとかセレクタの:hoverとかはBad Partsだ。

jQuery.fn.on / jQuery.fn.off

live/delegate/bind/click等は滅びた。全てonを使おう。 また、data引数を使う場合は必ずdataをオブジェクトかnullにする。dataが文字列の場合、関数の場合にセレクタ等と区別がつかないからだ。

$("body").on("click", function (event) {
  alert("Clicked!");
}, false);

また、querySelector/querySelectorAllの登場によって、:hover等のjQuery固有のセレクタは滅びた。validなCSSセレクタと、jQueryのメソッドをchainして使うこと。

$("div.article p").filter(":visible").hide();

jQuery.fn.oneは便利なので、使ってもよい。

jQuery.Deferred

非同期のコードを書くときに使う。jQuery.fn.ajaxなどのcallbackは滅びた。

$.when($.ajax("foo"), $.ajax("bar")).done(function (data) {
  var foo = data[0], bar = data[1];
  // do something
}).fail(functino () {
  $("#status").text("something went wrong...");
});

だいたいのことはできる。とは言ってみたものの、まだ発展途上なので、無理に使う必要はないかもしれない。

jQuery.fn.animate

jQuery.fn.animateはネイティブなアニメーションAPIを使用していないので、ガクガクする。いずれネイティブなAPIが整備されanimateもそれを利用するようになるだろう。それまではhttps://github.com/benbarnett/jQuery-Animate-Enhancedなどを使ってごまかすか、自分でコードを書こう。

jQuery()で要素をつくるとき

jQueryはセレクタとHTMLをごっちゃにしていて、$()にhtmlを渡すことができる。Bad Partsの一つだ。

本来であれば

$.html("<p>a</p>")

のように要素を作成できるべきだが、現状では$を使うしかない。

$("<a>").attr("href", "http://example.com/").text("example.com");

現状ではこれが妥協できるラインだと思う。複雑なhtml文字列を入れたい場合、innerHTMLに入れたい場合はjQuery.fn.html()が使えるが、新規要素を作成したい場合はそもそも良いAPIがない。

$("<div>")

だけ渡してhtml()を呼ぶのが良い。

jQuery.noConflict()

$関数はjQueryであるべきなので、使わない。

おまけ

https://github.com/madrobby/zeptoというjQueryでよく使う機能だけを集めたものがあって、良いデザインのAPIばかりが入っているので、コードを読んで、使えそうなところでは使って見ると良い。https://github.com/appMobi/jQ.Mobiというのもある。

JavaScript全体の流行、CoffeeScript、ES5、モバイル環境、node.jsやsocket.io、非同期処理と処理分散、などについてはいつか書きたい。

2011-08-27

TOEICと留学。どのように英語を覚えるか。

プログラミングというよりコンピュータにすら関係ないが、今日はTOEICと留学の話をしようと思う。

成果

2010年9月: 425点

2011年8月: 970点

背景

僕が英語を勉強しはじめたのは去年の9月、オーストラリアに語学留学した時だ。

留学すれば英語ができるようになるという根拠のない確信の元、事前の勉強無しで海外に飛び立った。

当時の英語力はほぼゼロに近い状態であり、諸事情で中学2年の知識の残りかす程度しか持っていなかった。

留学

おそらく、留学すれば自動的に英語が喋れるようになるというイメージを持っている人は多いと思う。僕も留学するまではそう思っていた。

しかし、現実は甘くない。勉強という形を取らずに自然に言語を覚えられるのは幼児だけである。

親切にma-maと1000回話しかけてくれる人がいない僕らは、教材を使って勉強しなければならない。

そこで、語学学校という選択肢が出てくる。ネイティブが英語を手取り足取り教えてくれるのだ。

だが、地域によっては、生徒が日本人だらけの語学学校もある。海外にいても結局、日本語が喋れるのだ。

留学しても、英語に触れられる時間は想像よりもはるかに少ない。上達したければ、自分で勉強をしなければならないのだ。

勉強法

では、どう英語を勉強すればいいのだろうか。留学が魔法ではない以上、1年で970点を取るのは困難だ。無駄は避けなければならない。

英文法

まず、重要なのは英文法である。英文法を学ばないと、いつまでたっても、単語から意味を想像するだけになってしまう。

リスニングにおいても、英文法の知識を使って補えないと聞き取り精度が極めて悪くなる。

英文法書でおすすめなのは、Forestという参考書と、Forest解いてトレーニング、という問題集の二つである。

やり方は、以下の方法をお勧めしたい。

参考書を読み、問題集を解く。間違えた部分の項目を読み、間違った問題をもう一度解く。参考書をもう一度読み、念のため全てもう一度解く。最終的に間違えた問題と答えを、記憶する。

受験ではないので、用語を覚える必要はない。その代わり、文章の構成を覚えるのだ。

構成を覚えるというのは、つまりこういうことだ。

I would like to have some tea.という文章ならば、Iの後にwould、助動詞が来て(用語ではなく、will、would、might、とか同じ種類のものを連想できるように)、doみたいなシンプルな形のlikeが来て、like to doだからto haveで、waterとか、数えられない物の量を限定するためのsome、そしてteaがくる。

また、参考書だけでは定着率が低いので、いちいち英文を見るたびに文法を分解する癖をつけたほうがいい。

wouldはwillの過去形で、if I could, I would like…のような、出来たらしたいというニュアンスがwouldに含まれている、また、wouldはif I were you, I would〜のように、ありそうもない場合の仮定、といった場合にも使う、ということを、上の例文から連想するのだ。

僕の場合、4ヶ月後にはTOEICの文法項目が95%を超える程度になった。

単語と熟語

英文法のほかに、どうしても覚えなければいけないものがある。単語と熟語だ。

おすすめは、DUOという教材である。これは一つの例文に単語と熟語が工夫して入っている、極めて有用な教材だ。

A woman passed by me giving off a subtle scent of perfume. It reminded me of my ex−girlfriend.

香水のほのかな香りを漂わせながら一人の女性が前を通りすぎた。

このような例文が詰まっている。

400点台の場合、知らない単語ばかりなので一つ覚えるだけでも難しいが、暗記は反復と慣れである。

おすすめの覚え方は、下記の通りである。

日本語を見てから英文を読む。どの単語がどの日本語に対応しているかを確認する。英文だけを読み上げながら紙に書く。

連想ゲームをするとより定着する。

例えば、giving offは〜しながら、as she gave offと同じような意味であり、passedと同じ時制だとdoing、being doneか省略されてdone、scentはofで、perfumeは数えられないからaはつかない。It reminded me ofはremind 人 of 物、不思議なofの使いかたはdeprived ofとか、そういうのもあったな、といった具合。

スペリングについては、最初は書いて覚えるしかない。

覚えていくうちに音とスペルのパターンが見えてきて、例外も見えてきて、自然と覚えられるようになる。

また、DUOには復習編というCDがある。リスニングも同時に鍛えよう。

一度書いて覚えたところをCDで聞いて、追いかけるようにして自分でも読む、といった使い方をすると良い。

また、寝る時に付けて、最初から最後までを流しっぱなしにすると、長期記憶に残り、覚えつつ忘れていく、といったことがなくなる。

僕の場合、およそ9ヶ月が経った時、日本語訳を見た瞬間に全て英語に戻せるようになった。

リーディング

リーディングは、単語力と文法力だけではない。まともなスピードで読むには、かなりの練習が必要である。

おすすめなのは、センター試験の長文のような何かを説明している文章と、エッセーである。

小説は難易度が非常に高い。読むのであれば、ペンギンリーダーズのような、レベル別に分類されている物を選ぶ。

TOEIC600くらいの段階で、リーダーズのIntermediate、700くらいでAdvancedを読むくらいだと、大筋を理解した状態で読める。

好きな本の英訳を探して、それを読むのも、モチベーション維持に役立つ。

読む時は意味を理解できる限界の速度で、文法的に知らない部分、構造が理解できない部分があったらメモしておく。

素早く読むことはTOEICにおいて重要だが、日本語を経由せずに英語を理解する訓練にもなる。

Google検索の設定を英語と日本語の両方にするというのも、普段から英語を読む習慣をつける、という上で効果的である。

類例としてWikipediaを英語で読むというテクニックがあるが、これは難易度が高い。TOEIC800程度の時も、Wikipediaを開くとかなりの苦痛が伴った。

3〜4ヶ月程度で、日本語を経由せずに英語を読む感覚がつかめてくる。

簡単な単語を使った文章から和訳が消え、徐々に長文を読む時に経由するのが日本語ではなく、英語の言い換えになってくる。

ライティング

TOEICにはないが、ライティングも重要な英語能力である。ライティング力とスピーキング力は強い相関があるので、ライティングを鍛える事でスピーキングも上達する。一石二鳥である。

とはいっても、ライティングは一日100単語程度の日記を毎日続けるだけで十分だ。

日記をつける時は、パターン化してしまわないよう、学んだ英語表現、英文法をどうにかして入れる。

日本語では表現できるが英語での表現が分からない時は、時間を惜しまず、辞書とインターネットで検索する。

アルクが出している英辞郎という辞書は、口語表現を含む、大量の例文が載っているので、かなりおすすめである。

スペースアルクというウェブサイトで無料で利用することもできるのでインターネット環境が良ければそれを使う手もある。

facebookに英語で書き込む、英語でメールする、メモは全て英語で取るといった、地道な努力も重要である。

英語で考えて英語で文章を書く感覚は、案外早いうちに身に付く。

この感覚は、スピーキング時の基礎となる部分でもある。

スピーキング

スピーキング時は、日本語で最初に考えるのではなく、Would you like me toといった文章のとっかかりを考え、それから単語を肉付けしていくべきだ。

単語を肉付けする上で、英文法が重要であるのは言うまでもないが、もう一つ重要なことがある。

わからない表現の言い換えである。

卒業という意味のgraduateという単語が思い浮かばない場合、Umm..となってしまいがちであるが、finishを使って、I will finish school in March next year.と言うべきだ。

おもちつきをした、という表現がわからなくても、そこでおもちを食べた、と言い換えれば良い。

I ate rice cakes there.

スピーキングは応答速度が全てである。

スピーキングについては、他の能力がある程度ついた段階で、勝手に口から英語が出てくるようになる、あるいは少しの練習でできるようになる傾向がある。

 リスニング

洋楽を聞いたり、テレビを見たり、映画を英語字幕付きで見たり、とにかく大量に聞く事が重要である。

聞く時は、音のつながりや、消滅を意識する。

例えばdon't youのようにtとyouがくっつくパターンなどがある。

at youは上のパターン以外にもtが消えてa(t) youみたいに聞こえる場合があるといったように、注意して聞き、英語を流しているだけの状態にしないこと。

その他にも、waterのアメリカ発音、tがrへ変化する、といった知識があるとリスニングに役立つ。

暇な時にインターネットで調べるだけで効果がある。

感想

留学をしていても、メインは自習である。もちろんリスニングやスピーキング等、留学が役に立った部分も多いにあるが、この1年間を振り返って考えると、国内であっても、十分に戦略を練って勉強すればTOEIC900程度は無理な目標ではないと思う。

指摘されて気付いたが留学とは「他の土地、国へ行って学問すること」という意味であり、留学に行く、だと不自然であった。留学する、に訂正した。

2010-09-26

近況

9月からオーストラリアに留学に来ていてとても忙しい。コンピュータに触れる時間もないし、日本語自体あまり使う機会がない。

最近、IE9 Betaが出たりとかiPod系がリニューアルされたりとかを聞いたけど、細かいニュースを追うのは時間の無駄かなと思い始めていて、トレンドに疎くなった。

オーストラリアのインターネット環境について少し。

基本的にADSLやモデムを使った接続が主流だが、僕はプリペイドのインターネットを使っている。Vodafoneのインターネットは意外とどこでも繋がる。オーストラリアのMcDonaldsにもFreeのWifiがある。

インターネット自体は普及しているが、日本と比べると、とにかく遅い。携帯電話については電波が少し弱い。建物の中では使えないことも結構ある。

こちらで購入できるコンピュータは普通の英語キーボードで、iPod nanoは16GでAUDで$220程度。日本と比べると電子機器の価格が高い。

しばらくはブログは書けないが、コンピュータの本とかは英語で少し読んだりしようと思う。

2010-08-12

インデックスを増大/減少させるループとunsigned

for (int i = 0; i < N; i++) {
	/* array[i]を使う */
}

というコードについて、iの型はC言語ではsize_tを使うほうが良いのか?という議論から発展して、size_tを使うと減少(降下)ループがきれいに書けなくなる、という問題があがった。

下の話では、size_tが一般的にunsignedであることを踏まえる必要がある。また、Nが1以上であることを仮定している。

for (int i = 0; i < N; i++) {
}

と対称になる、インデックスを減少させるループ

for (int i = N - 1; i >= 0; i--) {
}

は、unsignedでは成立しない。

for (unsigned i = N - 1; i >= 0; i--) {
}

iが0の時i--するとunderflowし無限ループになってしまうからだ。少し考えれば分かるが、非負の数でi >= 0は常に成立する。

よって、この場合のみ使える大して役に立たない(が、少し格好良い)技を紹介する。

for (unsigned i = N - 1; ~i; i--) {
}

である。

i--でunderflowしてUINT_MAXになった時、全ビットが立った状態になるので、その補数が0になることを利用したテクニックである(signedにキャストして考えることもできる。-1の2の補数表現0..01は1..10+1で全ビットが立つ。どちらにしろ起こっていることは同じだ)。

さて、この方法はi -= 2などの時、-1を飛び越えてしまうので柔軟性に欠ける。そのような場合が存在する時は、

for (unsigned i = N - 1; i + step > i; i -= step) {
}

を使うことができる。これはx-yがunderflowする時、x<yになるということを使っている。

これらの方法のどれが一番良いだろうか?実際のところ、これらは面白いだけでどれも実用には適さない。

unsigned i = N;
while (i--) {
}

や、

for (unsigned int i = 0, k; i < N; i++, k = N - i - 1) {
}

を使うのが正しい。後者はstepが2以上の場合にも使用できる。

2010-07-24

jQuery.fn.$each

(function ($) {
  $.fn.$each = function (callback) {
    return this.each(function () {
      return callback.call($(this));
    });
  };
})(jQuery);


こういうのを定義しておくと便利。

$("a").$each(function () {
  /\.jpg/.test(this.attr("href")) && window.open(this.attr("href"));
});

こんな感じで使う。