試したこと、読んだ本について書いていくブログです。

Vue.jsで配列を扱ったお話


はじめに

Vue.jsを使っていて、配列の中身を変更したのに画面上の値が変わらないなー、となって困ったのでメモです。

本文

ボタンを押すたびに配列に格納された数値を倍にし、リアルタイムで画面上にも表示するサンプルプログラムです。

See the Pen vue_array_ng by foresukecom (@foresukecom) on CodePen.

…このサンプルだと、ボタンを押すたびに配列の中身は更新されるのですが、画面上は変化がありません。

以下のように、配列の中身を変更する箇所を修正したら想定通りに動くようになりました。

See the Pen vue_array_ok by foresukecom (@foresukecom) on CodePen.

具体的には以下のように、要素番号を指定して配列の中身を変更しても画面上の値は変化しませんが、Vue.jsに用意されているメソッドを使えは配列の中身に応じて画面上の値も変化します。

/*失敗例*/ this.num_list[i] = this.num_list[i] * 2;
/*成功例*/ this.num_list.splice(i, 1, this.num_list[i] * 2)

公式ドキュメントにも注意事項としてちゃんと書かれていました。
JavaScriptの制限じゃ仕方ないですね(´・ω・`)

JavaScript の制限のため、Vue は配列で以下の変更を検出することはできません:
1.インデックスでアイテムを直接設定するとき。例: vm.items[indexOfItem] = newValue
2.配列の長さを変更するとき。例: vm.items.length = newLength

まとめ

公式ドキュメントを読みましょう。
内容とはまったく関係ないですが、記事の中にソースコードを埋め込みたかったのでCODEPENを初めて使ってみました。 ソースコードと実行内容をまとめて埋め込めるのは便利ですね。

その他

最近はRocket Leagueにハマっています。
車でサッカーをするという天才的発想。 FPSほどの精密な操作は求められないので、お酒を飲みながら遊ぶにはピッタリです。

ワイルドスピードやバットマンに登場する車が使えるようになるDLCも多数用意されているので、自分の気に入った車で走り回ることもできます。

Read more ⟶

GAE上でGolangを動かしてみましたよ


はじめに

GoogleAppEngine上で動くwebサービスをgolangで作りはじめました。
作り始めでつまずくことが多いので自分用の最小構成メモです。 ここで説明するwebサービスは、Ajaxで非同期通信し、Golangが返した文字列を表示するだけのものです。

環境の準備

まずは、GCPの公式ドキュメントを参考にGolang、Cloud SDKをダウンロードします。
以下のようにバージョンが表示されればOKです。

$ goapp version
go version 1.9.4 (appengine-1.9.74) darwin/amd64

ちなみに、開発にはmacOS High Sierra(10.13.6)を使用しています。

構成説明

ディレクトリ構成は以下の通りです。

├── app.yaml
├── hello.go
└── static
    ├── js
    │   └── main.js
    ├── css
    │   └── main.css
    └── index.html

この中でGAE特有のファイルはapp.yamlになります。
app.yamlリファレンスに各パラメータの説明が載ってますが、最低限のパラメータだけ書いておきます。

runtime: go #Golangを使用する場合はgoを指定
api_version: go1 #最新のバージョンを使用する場合はgo1を指定

handlers: #リクエストと実行する処理をURLパターン毎に指定
- url: /
  static_files: static/index.html
  upload: static/index.html
- url: /js
  static_dir: static/js
- url: /css
  static_dir: static/css
- url: /.*
  script: _go_app

その他のファイルについては、特別なことはしていないので説明は省略します。
各ファイルはGithubに置いてあります。

ローカル環境での実行

ローカル環境にGoogleAppEngineの開発用サーバを立ち上げるには、Cloud SDKに含まれているdev_appserver.pyを実行します。
実行時のオプションはいくつも用意されていますが、サーバを立ち上げるだけならば、以下のようにapp.yamlを指定して実行すれば問題ありません。 ※dev_appserver.pyを実行するにはPython2.xがインストールされている必要があります。

Read more ⟶

英語漫画のススメ


はじめに

最近、海外ドラマを観たりオンライン英会話を受けたりして英語を勉強しています。
しかし学生時代に英語の勉強をサボっていたので、わからない単語が多すぎて会話に付いていけず苦労しています。

単語帳なんかも買ってみたのですがすぐに飽きてしまったので、英語版HUNTER×HUNTERをKindleで買って試してみました。

とりあえず飽きずに10巻まで読み進められたので、メリット/デメリットをまとめてみます。

メリット

  • なんとなく読める
    僕は日本語版のHUNTER×HUNTERを何度も読み返しているので、英語版でも100%理解しなくても読み進めることができます。
  • すぐに買える
    大型書店でないと英語版の漫画は売っていないと思います。(少なくとも僕は売っているのを見たことがありません。) 読みたい時にすぐ買えるのは電子書籍ならではです。
  • (紙版の本と比べると)安い
    1冊だいたい850円ぐらいなので、日本語版と比べれば割高になります。 しかし、英語版HUNTER×HUNTERは紙の本では1冊1,000円ぐらいします。 翻訳コストがかかるので日本語版よりも高くなるのは仕方がありませんが、紙の本と比べて1〜2割引で買えるのはありがたい限りです。

デメリット

  • 翻訳機能が使えない
    Kindleでは漫画を画像として取り込んでいるので、セリフの検索や翻訳ができません。
    しかし先日、Google I/O 2018で写真に写っているモノをAIが認識するGoogleLensというサービスが発表されました。 KindleはAmazonのサービスなので、Googleのサービスを使うとは思えませんが、こういった技術が発展すれば漫画の中の文字も翻訳対象として扱えるようになると思います。
    最終的にはNetflixの音声や字幕のように、1冊の本を買ったら自由に言語を切り替えて読める世界になるのでしょうか。
  • 英語がすべて大文字
    理由は諸説あるようですが、アメリカンコミックではセリフが大文字で書かれていることが多いようです。 英語版HUNTER×HUNTERでは作者コメントは大文字と小文字が混ざっているのですが、セリフや説明分はすべて大文字で書かれています。 慣れの問題かもしれませんが、なかなか読みにくいものです。

今後

HUNTER×HUNTERを読み終えたら、ハガレンかドラゴンボールに挑戦予定です。
ハガレンも日本語で何度も読み返しているから大丈夫でしょう。 実はドラゴンボールをしっかりと読んだことがないので、せっかくなので教養として読んでおこうかと。
3月のライオン、よつばと、ヨルムンガンドあたりもKindleで翻訳版が出てほしいのです。

Read more ⟶

Go言語でJSONを作成したときのイージーミス


はじめに

Go言語を使って構造体をJSON形式に変換しようとしたら詰まったのでメモです。
JSON形式への変換は標準パッケージに含まれているjson.Marshalを使っています。

失敗例

こんな感じで構造体のスライスをJSONにしようとしたところ、作成されたJSONの中身が空になっていました。

成功例

原因がわからなかったので色々と試行錯誤した結果、下記のコードで想定した動きを確認することができました。 失敗例では10〜12行目の構造体のフィード名の先頭文字を小文字にしていましたが、成功例では先頭文字を大文字に変えています。

原因

ここまで書けば原因がわかる方も多いと思いますが…
Go言語では変数や関数のスコープが先頭文字列が小文字か、大文字かで判定されます。 先頭文字が大文字の場合は他パッケージからの参照が可能(いわゆるpublic)、先頭文字が小文字の場合は他パッケージから参照不可(いわゆるprivate)となります。 このルールは構造体のフィードにも適用されます。
そのため、失敗例では構造体のフィードに対してパッケージ外からアクセスすることができず、作成されたJSONが空っぽになっていました。

ちなみに

作成されるJSONのKeyを先頭小文字にしたい場合、以下のようにフィードに対してタグをつけることで任意の名前を指定することができます。

おわりに

初歩的なミスでしたが原因に気づくまで時間がかかってしまいました。 前に触ったことがあるはずなんですが…先頭文字でスコープが変化するのは慣れないと忘れちゃいますね。
コンパイルエラーとかで教えてくれないかなぁ。

Read more ⟶

JavaからRESAS APIを使ってみましたよ


お久しぶりです。

巷で話題のビッグデータを使って何かやってみようかと思い立ったので、RESASから情報を取得してみます。
RESASとは地域の活性を目的とし、市町村名一覧や人口構成、観光資源などの多くの情報を公開しているWebサイトです。
APIも公開されているので、かんたんに情報を取得することができます。

地域経済分析システム(RESAS:リーサス)は、地方創生の様々な取り組みを情報面から支援するために、経済産業省と内閣官房(まち・ひと・しごと創生本部事務局)が提供しています。
自治体職員の方や、地域の活性化に関心を持つ様々な分野の方によって、効果的な施策の立案・実行・検証のためなどに広く利用されています。
引用元: RESAS 地域経済分析システム

とりあえず今回は勉強がてら、Javaを使って都道府県の一覧を取得してみます。
※RESASのAPIを使うには利用登録をしてAPIキーを発行してもらう必要があります。利用登録は公式サイトから行えます。
RESAS-API利用登録

以下のように結果が返ってきます。 JSON形式なので簡単に加工が出来そうです。

{
    "message": null,
    "result": [
        {
            "prefCode": 1,
            "prefName": "北海道"
        },
        {
            "prefCode": 2,
            "prefName": "青森県"
        },
        {
            "prefCode": 3,
            "prefName": "岩手県"
        },
        {
            "prefCode": 4,
            "prefName": "宮城県"
        },
        {
            "prefCode": 5,
            "prefName": "秋田県"
        },
        {
            "prefCode": 6,
            "prefName": "山形県"
        },
        {
            "prefCode": 7,
            "prefName": "福島県"
        },
        {
            "prefCode": 8,
            "prefName": "茨城県"
        },
        {
            "prefCode": 9,
            "prefName": "栃木県"
        },
        {
            "prefCode": 10,
            "prefName": "群馬県"
        },
        {
            "prefCode": 11,
            "prefName": "埼玉県"
        },
        {
            "prefCode": 12,
            "prefName": "千葉県"
        },
        {
            "prefCode": 13,
            "prefName": "東京都"
        },
        {
            "prefCode": 14,
            "prefName": "神奈川県"
        },
        {
            "prefCode": 15,
            "prefName": "新潟県"
        },
        {
            "prefCode": 16,
            "prefName": "富山県"
        },
        {
            "prefCode": 17,
            "prefName": "石川県"
        },
        {
            "prefCode": 18,
            "prefName": "福井県"
        },
        {
            "prefCode": 19,
            "prefName": "山梨県"
        },
        {
            "prefCode": 20,
            "prefName": "長野県"
        },
        {
            "prefCode": 21,
            "prefName": "岐阜県"
        },
        {
            "prefCode": 22,
            "prefName": "静岡県"
        },
        {
            "prefCode": 23,
            "prefName": "愛知県"
        },
        {
            "prefCode": 24,
            "prefName": "三重県"
        },
        {
            "prefCode": 25,
            "prefName": "滋賀県"
        },
        {
            "prefCode": 26,
            "prefName": "京都府"
        },
        {
            "prefCode": 27,
            "prefName": "大阪府"
        },
        {
            "prefCode": 28,
            "prefName": "兵庫県"
        },
        {
            "prefCode": 29,
            "prefName": "奈良県"
        },
        {
            "prefCode": 30,
            "prefName": "和歌山県"
        },
        {
            "prefCode": 31,
            "prefName": "鳥取県"
        },
        {
            "prefCode": 32,
            "prefName": "島根県"
        },
        {
            "prefCode": 33,
            "prefName": "岡山県"
        },
        {
            "prefCode": 34,
            "prefName": "広島県"
        },
        {
            "prefCode": 35,
            "prefName": "山口県"
        },
        {
            "prefCode": 36,
            "prefName": "徳島県"
        },
        {
            "prefCode": 37,
            "prefName": "香川県"
        },
        {
            "prefCode": 38,
            "prefName": "愛媛県"
        },
        {
            "prefCode": 39,
            "prefName": "高知県"
        },
        {
            "prefCode": 40,
            "prefName": "福岡県"
        },
        {
            "prefCode": 41,
            "prefName": "佐賀県"
        },
        {
            "prefCode": 42,
            "prefName": "長崎県"
        },
        {
            "prefCode": 43,
            "prefName": "熊本県"
        },
        {
            "prefCode": 44,
            "prefName": "大分県"
        },
        {
            "prefCode": 45,
            "prefName": "宮崎県"
        },
        {
            "prefCode": 46,
            "prefName": "鹿児島県"
        },
        {
            "prefCode": 47,
            "prefName": "沖縄県"
        }
    ]
}

備考

モンハンワールドが面白すぎて…進捗ダメです。

Read more ⟶

GoogleComputeEngineとのファイルやりとり


GoogleComputeEngine(GCE)とファイルをやりとりする必要があったので方法を調べてみました。
gcloud compute scpでGCEとのファイルのアップロード/ダウンロードが行えます。 gcloud compute copy-filesでもファイルコピーが行えますが、非推奨となっているのでgcloud compute scpコマンドを使うのがいいようです。

ローカルのカレントディレクトリにあるファイルを、GCEの/tmp配下にアップロードするには以下のコマンドで行えます。

gcloud compute scp ./gokuhi.txt gce_server:/tmp/

逆に、GCEの/tmp配下のファイルを、ローカルのカレントディレクトリにダウンロードするには以下のコマンドです。

gcloud compute scp gce_server:/tmp/gokuhi.txt ./

公式ドキュメントにも記載されている通り、gcloud compute scpにもいろいろとオプションが用意されていますが、単純なファイルアップロード/ダウンロードであればオプションを付けなくても簡単に使うことができます

Read more ⟶

DockerコンテナでDjango


はじめに

Dockerコンテナ上にDjangoの開発、実行環境を作りたいなぁ、と思ったので構築メモです。 Dockerエンジン自体はGoogleComputeEngine上で動かしています。

今回は、GCPのプロジェクトが作られている前提で説明を進めていきます。
GCEの仮想マシン作成などはWebUIからも作成できるのですが、説明が面倒くさいので今回はCloudShellからGCE仮想マシンを作って行きます。
CloudShellは、GCPのリソースを管理できる仮想マシンで、GCPのプロジェクトを作成していれば無料で使用することが可能です。 CloudShellの詳細は以下公式ドキュメントを参照してください。
Google Cloud Shell ドキュメント

今回、3つの仮想マシンを操作するので、混乱しないようにプロンプトに仮想マシンを示すようにしています。 使用する仮想マシンは以下の通りです。

項目説明
CloudShellGCPで標準で提供されている仮想マシン。
HostMachineDockerEngineが稼働する仮想マシン。OSはCentOS7です。
Container実際にDjangoが動くDockerコンテナ。OSはCentOS7です。

全体的な流れ

  1. GCEでCentOS7を作成、SSHで接続
  2. docker導入
  3. Dockerfile作成
  4. Dockerイメージとコンテナを作って接続
  5. djangoプロジェクト作成、allowhost設定
  6. django開発用サーバ起動
  7. ブラウザからアクセス

GCEでCentOS7を作成、SSHで接続

以下コマンドで、GCEをのインスタンスを作成します。 後半で必要になるので、作成したインスタンスのEXTERNAL_IP(外部IP)を控えておいてください。 その後、インスタンスに対してSSHで接続します。

(CloudShell)$ gcloud compute instances create example-name --tags http-server --zone asia-east1-a --image centos-7
(CloudShell)$ gcloud compute ssh example-name

GCEインスタンス作成時に使用したオプションは以下の通りです。

オプション名記事内の値説明
INSTANCE_NAMESexample-nameGCEインスタンス名です。オプション名は指定する必要がありません。
zoneasia-east1-aGCEインスタンスを作成するゾーンを指定します。指定しないと、対話形式でゾーンを指定することになります。
tagshttp-serverGCEインスタンスに適用するファイアウォールを指定します。今回はHTTPでの接続を許可するファイアウォールを指定しています。
imagecentos-7GCEインスタンスの元イメージです。デフォルトではdebian-9が指定されています。

docker導入

以下コマンドでDcokerをインストールし、有効化します。

(HostMachine)$ sudo yum install -y docker
(HostMachine)$ sudo systemctl start docker
(HostMachine)$ sudo systemctl enable docker

Dockerfile作成

以下の通りDockerfileを作成します。

Read more ⟶

完全栄養食COMPを食べてます


はじめに

みなさんは完全栄養食COMPをご存知でしょうか。
完全栄養食の名の通り、これを食べるだけで必要な栄養素が取得できるという優れものです。 アメリカではソイレントが有名ですね。

概要

COMPはパウダータイプ(水などとシェイクして飲む)と、グミタイプの2種類を販売していますが、今回はパウダータイプのお話になります。

パウダータイプのCOMPには、400キロカロリーの小袋と、4,000キロカロリーの大袋が販売されています。 大袋で買った方が、カロリー単価の値段は安いのですが、僕は飲むときの手間が少ないことを優先して小袋を購入しています。

最初は1日3食なので、小袋で3袋分を摂取すれば必要な栄養素が摂取できると考えていました。 調べてみると、小袋3食分ということではなく、人間が生きるために必要なカロリー分のCOMPを飲めば必要な栄養素が摂取できる、ということでした。
必要なカロリーについては、COMP公式サイトをはじめ、いろいろなサイトに掲載されているのですが、体格、年齢、性別、運動量などが影響する関係でサイトに毎に必要なカロリーが異なっています。 いくつかのサイトから平均を取ったところ、僕の場合は2,000キロカロリー(±200キロカロリー)ぐらいが妥当みたいでした。 2,000キロカロリーをCOMPで摂取すると、小袋で5袋が必要になります。

さすがに、毎日5袋のCOMPを飲んで生活をするのは非人間的な気がするので、僕は朝食のみをCOMPで補い、昼夜は普通の食事を取るようにしています。

メリット

COMPのメリットとしては、まず朝食の時間短縮が挙げられます。
朝食をCOMPにする前は、卵焼いてー、キャベツ千切りにしてー、適当な野菜でスムージー作ってー、と雑ながらも朝食を作っていました。 料理に慣れていないこともあり、作り始めてから片付けるまで1時間ぐらいかかっていました。 COMPにしてからは、作り始めてから片付けるまで10分以内に収まるようになりました。

直接的な食事時間以外にも、買い物の時間が短縮できたことも大きなメリットになります。 今までは週に2,3回は食材の買い出しに行っていたのですが、買い出しの頻度を減らすことができました。 スーパーに行くと、つい余計なものまで買ってしまうので、スーパーに行く頻度が下がったのは時間だけでなく、無駄遣い防止にも大きく貢献ししています。

また、冷蔵庫の中身を把握しておく必要がなくなったのは、精神的にかなり楽になりました。
朝食を作っていると、食材の残量を把握して、足りなければ買い出しをする必要が出てきます。 毎朝料理をするとなると、冷蔵庫の中身を気にする頻度も高くなり、それがストレスにつながっていました。。
今は週末にしか料理をしないので、平日に冷蔵庫の中身を気にする必要がなくなったので、ストレスフリーになりました。

おすすめの味

COMP自体は豆乳っぽい味なので、水に溶かして飲むのがベーシックなスタイルになります。
ベーシックな味があまり気に入らなかったので、以下を混ぜて作っています。
とりあえず、健康によさそうなものを入れてみたら美味しくなりました。
(純ココアはCOMPの鈴木社長が以前おすすめしていたので取り込んでいます。)

  • COMP
  • SAVAS(ココア味)
  • ナチュラルヘルシースタンダード(ピーチ)
  • 純ココア
  • 調整豆乳

screenshot

まとめ

日本には「ハレとケ」の文化があります。
友人知人との会食や、時間があるときにはハレの食事として、美味しいものをのんびり食べる。 それ以外はケの食事として、最低限栄養の取れるものを食べる。 と、使い分けていけばいいのかな、と思っています。

Read more ⟶

Google Home Miniを買いました


はじめに

先日のGoogleイベントで日本での発売が発表されたGoogle Home Miniを購入しました。

Google Home Miniができることや同封物については以下のようなページで多数公開されているので、ここでは省略します。 Google HomeとGoogle Home Miniの違いはスピーカーの音質程度のようで、動作内容自体に差異は内容です。
手のひらに乗るスマートスピーカ「Google Home Mini」開封の儀

Google Home Miniの電源ポートはマイクロUSBです。次期的にTypr-Cが使われると思っていたので意外なところです。 ただ、僕の身の回りにはマイクロUSBを使っているデバイスがまだ多いので、他のケーブルを流用できるので結果オーライと考えていました。
しかし、下の写真を見ていただくと分かる通り、マイクロUSBポートが本体の奥の方についているので、Google Home Mini自体がケーブルと干渉してしまい、僕の持っている他のケーブルでは代用することができませんでした。
まぁ、持ち運ぶ想定をしていないので仕方がないのですが、ちょっと別の部屋に持っていきたいときには不便でですね(バッテリーも内蔵していないので、給電しながらでないと使えませんし)。 screenshot

とりあえず、天気やニュースを尋ねたり、音楽を再生したりしましたが、対応しているサービスについては、求めている解答が返ってくるのでとても気持ちがいいです。
僕は滑舌が悪いので、音声認識がうまく動作するか不安だったのですが問題なく使うことができました。 さすがはGoogleさんです。

しかし、対応しているサービスがまだ少ないので、かゆいところに手が届かないと感じる部分も多いです。 例えば、僕はPocket Castsというサービスはを使ってPodcastを聴いているのですが、まだGoogle Home Miniに対応していません。 「未視聴のPodcastを順次再生」とかを音声で指示ができればベストです。

懸念事項

Google Home Miniは物理的にミュートボタンがあるので、マイクを無効にすることもできますが、基本的には音を拾い続けたまま使うことになると思われます。
以下のようなバグもあったようですし、悪意の有無に関わらず、情報が外部に漏れてしまうリスクは考えておくべきでしょう。
Google Home Miniに常時録音してしまうバグ発覚、すでに修正済みで製品版には影響なし

極端に悪意がある例では、ジョージオーウェルの1984に登場するテレスコープを使って、国民の監視をしていました。 現時点でのGoogle Home(Mini)は音を拾うだけですが、今後カメラなどが搭載されると、ますますテレスコープ化していくことになります。

良い例でいうと、自分の家に異常があったことを検知できるので防犯、防災対策に活用することが期待できます。 また、体調の変化をすぐ発見してもらえたり、アリバイの証明に使うこともできるかもしれません。

今後の希望

現在は、一問一答での対話となっているので、正直なところ会話をしている感じではありません。 会話のキャッチボールが長く続けられるのであれば、英会話のレッスンを受けたり、愚痴を聞いてもらったりできそうです。

HoloLensをはじめとする、Mixed Realityのヘッドマウントディスプレイと連携させ、アシスタント用のアバターを仮想空間上に表示することも可能になると思います。 そうすれば、Haloシリーズのコルタナや、PSYCHO-PASSの登場人物 常守茜の部屋にいるクラゲ型アバターのキャンディ、のようにますます愛着を持って扱うことができそうです。

Googleの公式ブログにも記載されているように、開発キットも公開されています。 日本語にも対応し始めたようなので、何か作ってみても面白いかもしれません。
Google アシスタント対応アプリを日本語で開発してみよう

Read more ⟶

英語のお勉強


はじめに

みなさんは英語を使いこなしていますか。僕は使えません。
最近はGoogle翻訳の精度も上がりましたが、英語の講演を聞いたり、画像として表示されている英語を理解するためには自身の英語力を鍛える必要があります。

国内で開催されるAmazonWebServiceやGoogleCloudPlatformのイベント、セミナーによく参加しているのですが、英語の講演を理解できず、せっかくの貴重な機会を逃してしまうことが多々ありました。

なので、中学生レベルの英語力があるかも怪しい僕ですが、一念発起して英語の勉強を始めてみました。

試している勉強方法

とりあえず、英語を読む、聴くことが人並みになることが目標なので、Podcastを使ったリスニング、 Kindleでのリーディングを中心に進めています。

Podcast

通勤中に以下のPodcastを中心に聴いています。 アメリカとの文化の違いや、最近の時事問題をテーマにすることも多く、飽きずに聴き続ける事ができます。

以下のような英語のテック系Podcastも聴いています。 正直なところshow noteで概要を見ながら聴いても内容が聴き取れていません。
なので、これらのPodcastをスムーズに聴き取れることが現状の目的になっています。

Kindle

リーディングの勉強としては、Kindkeを使って、英語の絵本や童謡を読んでいます。
電子書籍であれば、わからない単語の翻訳も行えるので、なんとか読み進めることができます。 最初は絵本を読むことに恥ずかしさがあったのですが、読んで見ると読めない単語が多いことに気が付き、恥ずかしがっている場合ではないと腹をくくることができました。

最終的にはO’Reillyの洋書とか読みたいですね(格安、または無料で公開されている本も多くありますし)。

今のところ、読み終えた本は以下の通りです。

Duolingo

無料で使える語学勉強用のWebサービスDuolingoも使っています。
このサービスはゲーム感覚でリスニングやリーディング能力を鍛えることができるので毎日続けています。 英文の意味を日本語で解答する問題では、日本語を入力して解答する都合上、文章の揺らぎが生まれるのですが、ある程度はDuolingo側で吸収してくれるので、自分の言葉で解答することができます。

問題を解いていると「あれ」「これ」「それ」がごっちゃになったり、代名詞の変化を忘れていたりするので、レベルの低さに落ち込むこともありますが、なのか続いています。 1回の学習が10分程度と短時間で完結し、PC版やスマホ版が出ているので、少し空いた時間にサクッとこなせるように設計されているようです。

おわりに

今のところ、スピーキングについては必要としていないのでスカイプ英会話などは使っていません。
海外の人と話したい欲求が生まれたら、スピーキングの勉強を始めてもいいかもしれません。

Read more ⟶