[要約] 外国語を6ヶ月でマスターするための3つの原則と7つの行動

この記事は ログミー[o_O] の掲載記事の抜粋要約です。

WS000005_R-590x323

Chris Lonsdale(クリス・ロンズデール)氏の長年の研究によれば、以下に述べる規範に倣えば、高速で言語やスキルを習得できるとのこと。
部分部分では聞いたことのある方法だったりします。
それらが研究によって裏付けされたんだな、と考えることが出来ますね。
詳しい理由や原理については、ログミーの翻訳書き起こしや講演ビデオをご覧ください。


↓引用ここから

3つの原則

  1. 自分に関係する言語内容に集中すること
  2. 学習初日からその言語をコミュニケーションのためのツールとして使う
  3. 最初にメッセージを理解したら、無意識のうちに言語を習得出来る
    • 文法だけ勉強してもだめ。理解可能なインプットで勉強するべき
    • 語学学習とは、たくさんの知識を蓄えることではない
    • 語学学習とは、身体的トレーニングのようなもの

7つの行動

  1. たくさん聞くこと
    • 理解してるかどうかは気にしなくていい
  2. 言葉を学ぶよりも先にその意味を掴む
    • ボディランゲージを使って意味を汲み取る
    • 理解可能なインプットを通じて習得する
      • 日本語で学ぼうとしない
  3. 知っている単語を組み合わせてバリエーションを作る
  4. 核となる語彙の習得に集中する
    • 英語であれば、核となる1,000語で、日常コミュニケーションで使う語彙の85%がカバー出来る
    • 3,000語で、日常会話の中で言いたいことの98%を表すことが出来る
  5. 「言葉の親」を見つける
    • あなたという人に興味を持ち、もっぱら対等な立場でコミュニケーションをとってくれ、かつ、あなたがメッセージを理解出来るように注意を払ってくれるような人
    • 親は子どもに話しかける時、ボディランゲージを使い、子どもが理解できるとわかっている単純な言葉で話してくれるので、理解可能なインプットができる環境がある
  6. 顔の動きを真似する
    • ネイティブスピーカーの筋肉の使い方を真似する
    • 顔の筋肉を正しく動かして、人々があなたの言うことを理解出来るような音を出さなければならない
  7. 母国語を経由させず、直接意味を思い浮かべる
    • 「自分が知っていることは全て頭の中にあるイメージであり、感情である」ということを認識する

↑引用ここまで

僕はリスニングとスピーキングが苦手なので、「たくさん聞くこと」から始めたいと思います!

PhantomJSでHTML5の一部APIを使えるようにする方法

phantomjs

PhantomJS 1.9.xは古いWebKitを使っている

GUIを持たないヘッドレスブラウザのPhantomJSは、ウェブでのフロントエンド開発においてそのテストに適したツールです。
このPhantomJSは、QtWebKitをベースに開発されています。
HTML5やCSS3をふんだんに使ったイマドキのウェブサービスを開発している場合、PhantomJSを使ってテストしようとすると上手くいかない場合があります。
これは、使用しているWebKitが古いために起こる問題です。古いWebKitではJavaScriptCoreも古いので、JavaScriptの新しい機能も一部使えません。

どのような機能が使えないのかは、Supported Web Standards に明記されています。
このページには書かれていませんが、Web fontsも使えません。これは前回の記事で使えるようにする方法を書きました。

PhantomJS向けのshimsまとめ

前述の通り、PhantomJSは古いWebKitをベースにしているため、HTML5のAPIやJavaScriptの新機能が使えません。
自分が確認した限りで使えなかったAPIを使えるようにするshimをまとめました。
以下の機能が使えるようになります。

  • Function.prototype.bind
  • History API

今後も適宜更新していこうと思います。

https://gist.github.com/noradaiko/12cbaf8a1674e3b8c8e6.js

参考になれば幸いです!

関連資料

PhantomJS 1.9.xでウェブフォントを使う方法

phantomjs

ヘッドレスブラウザのPhantomJSはWeb fonts未対応

Web fontsは昨今とても一般的に使われるようになった技術です。
例えば、Twitter Bootstrapfont awesomeなどで、いわゆる “Glyphicons” として使われることが多いように思います。

PhantomJSというGUIを持たないブラウザがあります。
このブラウザは、ウェブサービスのフロントエンドのテスト自動化にとても便利なツールです。
JavaScriptで自動化のための処理を記述できて、スクリーンキャプチャも出来てとても便利です。

Web fontsに対応させることは出来るが再ビルドが必要

しかしながら、現行の1.9.xではWeb fontsに対応していません。
理由は、WOFFファイルにPhantomJSがまだ対応していないためです。
Web fontsを有効にするための手順 がありますが、PhantomJSをビルドしなおす必要があります。
ビルドは結構時間がかかり、大変です。

ビルド済みWeb Fonts対応版PhantomJS

PhantomJS with Webfonts Support – Binary Build – Arunoda Susiripala – Web Geek というサイトでは、ビルド済みのWeb Fonts対応版PhantomJSを公開しています。バージョンは1.9.0のようです。

ビルド済みのWeb Fonts対応版PhantomJS 1.9.0をダウンロード

作者に感謝しつつ、使いましょう!

PhantomJS + CasperJSで テスト終了時に警告が出まくる問題への対処方法

phantomjs

警告の内容

CasperJSでテストを書いていると、スクリプト終了時にPhantomJSが次のような大量の警告を吐いて止まらなくなります。

Unsafe JavaScript attempt to access frame with URL about:blank from frame with URL ...
Domains, protocols and ports must match.

これではまともにテスト結果が見られない上、CIも回せません。

PhantomJS v1.9.8はバギーなのでv1.9.7を使う

以下のスレッドにヒントが書かれていました。

To anyone who has a problem with this. Downgrade PhantomJS to 1.9.7 and run casperjs with the –ssl-protocol=tlsv1 to be functionally completely the same as PhantomJS 1.9.8.
There won’t be an updated PhantomJS 1.x version which fixes this issue.

Mac OSXでの v1.9.7 のインストール法

brewだと1.9.8が入ってしまいます。
バイナリを本家から直接ダウンロードして使います。

ただし、最新版へのリンクしかありませんので、バージョン番号を変えて直接リンクを開いてください。
一応、こちらにリンクも貼っておきます。

brewでインストールした既存のphantomjsはアンインストールしておくことを忘れないでください。

[node.js] mongooseでクエリをタイムアウトさせるには

MongoDB

tl;dr

  • MongoDBではv2.6から cursor.maxTimeMS()によって処理をタイムアウトさせられる
  • 各ドライバから使用可能
  • mongooseでは mongoose.Query#maxTime メソッドで指定可能

サーバ側で処理をタイムアウトさせるには

MongoDBでは、v2.6からサーバ側で処理の実行タイムリミットを設定できます。
処理のタイムリミットは、cursor.maxTimeMS() メソッドを呼ぶことで設定できます。
この maxTimeMS を設定すると、指定したタイムリミットを超えて検索やアップデートが実行された場合、その処理を中止します。

以下のようにコンソールで試せます:

db.collection.find({description: /August [0-9]+, 1969/}).maxTimeMS(50)

各ドライバでのmaxTimeMSの使用方法

各ドライバといっても調べたものだけを列挙しておきます。

PHP

例:

$cursor = $collection->find();
$cursor->maxTimeMS(2000);

try {
    $results = iterator_to_array($cursor);
} catch (MongoExecutionTimeoutException $e) {
    echo "query took too long!";
}

ちなみに、PHPにはMongoCursor::timeout もあります。
このメソッドはクライアント側でタイムアウト処理を行うものです。
サーバ側では処理をキャンセルしないので、注意です。

node.js

こちらに詳しく書いてあります。
例:

var MongoClient = require('mongodb').MongoClient;

MongoClient.connect("mongodb://localhost:27017/test", function(err, db) {
    // Get an aggregation cursor
    var cursor = db.collection('data')
        .find({"$where": "sleep(1000) || true"})
        .maxTimeMS(50);

    // Get alll the items
    cursor.toArray(function(err, items) {
        console.dir(err);
        console.dir(items);
        db.close();
    });
});

mongooseでタイムアウトさせるには

MongoDBのnode.jsにおけるODM(Object Data Mapping)のmongooseでもmaxTimeMSに対応しています。
v3.8.13 から利用できるようになりました。
該当の変更は こちら
実際には子分モジュールの mquery で実装されています。

使い方はシンプル:

var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/test');

var Cat = mongoose.model('Cat', { name: String });
Cat.find({name: 'Zildjian' }).maxTime(1000).exec(function(err, docs) {
    console.log(err); // --> { [MongoError: operation exceeded time limit] name: 'MongoError' }
});

operation exceeded time limit というメッセージのエラーが得られます。

このように、mongoose.Query オブジェクトを返すメソッドでmaxTimeメソッドが使えます。
Model#saveメソッド、Model#remove では残念ながら使えないようです。

エラーを判別しにくい問題

Errorオブジェクトにはエラー種別を明示的に判別するコードがありません。
そのため、とても不安な方法ですがエラーメッセージで判別する方法しか見当たりません(他に良い方法をご存知の方がおられましたらぜひご教授ください)。
メッセージによるタイムアウト判別は以下のようになります:

if(err.message === 'operation exceeded time limit') {
   // retry
}

なぜPHPにはMongoExecutionTimeoutExceptionがあるのにnode.jsでは無いんだ?

参考