vol35. 英語の勉強方法について振り返る

過去に色々な英語を試してみた。どの勉強方法が効果的だったかをあらためてふりかえってみたい。

ipad で英語タイトルのドラクエ

  • 1タイトル500円 - 2500円程度
  • ドラクエ1から8まで発売されている(英語版は7はまだリリースされていない)
  • ipad で辞書を引きながら進める
  • 幼少の頃にはまったドラクエ。ストーリはバッチリ覚えているので、わからない英
    語があっても飛ばして楽しめる。街の人々との会話は、まさに英会話のレッスンになる
    スマホ版でリメイクされていて、グラフィックがキレイになり、新しいキャラやスト
    ーリーも追加されている。AIモードも追加されているし、quicksave機能でフィールド
    上ですぐにsaveができるのも便利。iOS11のsplitview 機能をつかって、気になる単語
    が出てきた時は、辞書ですぐに調べると語彙力もグンとあがる。

https: appadvice.com

オンライン英会話

いろいろなオンライン英会話学校がある。skypeをつかって、ネット上で海外の先生と話
す。自分は、skytalkを利用した。skytalkの先生はフィリピン在住の先生が主。フィリピ
ンは主言語が英語なので、どの先生もペラペラ。

  • skytalk
    • 月 5000円 で毎日25分レッスン
    • 先生をその日の気分で選べる
    • 英語を話す時に感じる照れの解消や度胸をつけるのに役立った。

skytalk.co.jp

図書館で、幼児向けの英語の絵本を大量に借りる。

  • 図書館だからタダ
  • 1冊5分-10分くらいでサクサク読める
  • 最初は楽しく読んでいたが、ストーリーが幼稚で流石に飽きてきた

Youtube 幼児向け動画

  • Peppa Pig
    • これも1話が5分-10分くらい。
    • 絵本と同じく、これも、最初は楽しんでいたが、ストーリーが幼稚で流石に飽きてきた
  • 他にも色々とあるが他にいいものを自分は見つけれなかった。

www.youtube.com

日本アニメの英語版

  • 子供の頃にみたアニメ番組が、英語で吹き替えされて、海外で放映されている。
    ネットで"watch anime dubbed"等で探すと、ガンダムとかエヴァンゲリオンとかジ
    ブリの映画とかがみつかる。
    もちろん、洋画を普通にみてもいいんだけど、ものによっては英語が聞き取れなく
    て、ストーリーについていけなかったりするから、過去にはまったものを英語で改
    めてみてみるのも良いと思う。英語に大量に触れるには良い題材だ。

その他

最後に

本当は、海外の人と1on1で話す場数を踏むのがもっとも早いと思う。何事もoutput が大
事だ。ただ、NOVAとか英会話学校は授業料が高いので、なかなか気軽に大量のレッスンは
受けれない。

なので、以下のブログのような、フィリピンセブ等への短期語学留学はとっても良い方法
だと思う。1ヶ月の滞在日、食費込みで、20万ちょい。後は飛行機のチケットを手配すれ
ばいいだけ。空き時間は、ビーチ等でのんびりできるしとても、よいかと思う。

おすすめの勉強法があったら、是非教えてください。

vol34. Linuxの時間関数

Linuxでは、time_t, tm, timespec, timevalなど、様々な型や構造体が、様々な関数で 使用されている。全体像を整理してみた。

全体像

f:id:john-rama01:20180602050949p:plain

man page で引くと
- gmtime() やlocaltime()は、ライブラリ関数
- time(), gettimeofday(), clock_gettime()はシステムコール

である

全体的にみると、システムコールカーネル層から取得した時刻を、ライブラリ関数で人
間にもわかりやすい形に加工するといった構造だ。

time_tは秒単位の情報を、timespec, timevalはそれぞれ、us, ns単位の情報を扱う。

    struct timeval {  
        time_t tv_sec;            /* Seconds.  */  
        suseconds_t tv_usec;      /* Microseconds.  */  
    };  

    struct timespec {  
        time_t tv_sec; /* Seconds.  */  
        long tv_nsec;  /* Nanoseconds.  */  
    };  

timeval時刻を取得するには、gettimeofday()を、timespec時刻を取得するには、
clock_gettime()を使う。ただし、gettimeofday()はPOSIX環境で古くから使われてきたが
、今は、非推奨でclock_gettimeが推奨されている。

time_t のインプリはアーキテクチャ依存で、32bit だったり、64bitの変数だったりする

time_tの情報を人間にわかりやすい形の情報で格納するための構造体がstruct tmだ。

    struct tm {  
        /*  
         * the number of seconds after the minute, normally in the range  
         * 0 to 59, but can be up to 60 to allow for leap seconds  
         */  
        int tm_sec;  
        /* the number of minutes after the hour, in the range 0 to 59*/  
        int tm_min;  
        /* the number of hours past midnight, in the range 0 to 23 */  
        int tm_hour;  
        /* the day of the month, in the range 1 to 31 */  
        int tm_mday;  
        /* the number of months since January, in the range 0 to 11 */  
        int tm_mon;  
        /* the number of years since 1900 */  
        long tm_year;  
        /* the number of days since Sunday, in the range 0 to 6 */  
        int tm_wday;  
        /* the number of days since January 1, in the range 0 to 365 */  
        int tm_yday;  
    };  

個々の関数の役割は、man page で確認して欲しい。

参照:

vol33. GDPRとは

最近、会社でGDPRに関する説明会が実施されたり、いろいろな会社から、GDPRに関する
メールが届いたり、GDPRという名前を急に身の回りで聞くようになった。

そこで、GDPRについて調べてみた。

GDPR(General Data Protection Regulation) とは

  • 欧州で始まる、個人情報保護に関する新しい法律

    • EU市民の個人情報の管理を厳格化し、個人データが安全であることを保障しなければならない
    • 個人データの利用方法について明確な同意を本人から得なければならない
    • 顧客の権限を強化
      • 本人の個人データへのアクセスや修正、削除を可能に
  • 2016/4/27に採択、2018/5/25より適応

  • 個人データは、名前、写真、メールアドレス、銀行の詳細、SNSの投稿やウェブサイト
    の更新情報、場所の詳細、医療情報、コンピューターのIPアドレスCookie、生体遺伝
    子情報、 思想信条、入れ墨に至るまで、個人に関する広範囲な情報

なぜ、EUでこのような法律が採択されたのか?

企業にとっては、GDPRに対応するのには大変な労力と資金が必要になる
では、なぜ、EUでこのような法律が採択されたのか?

  1. プライバシーの保護
    • ヨーロッパでは、会社から監視を受けること自体に大きな抵抗がある
  2. EU内のビジネスの保護
    • 特に米IT企業に強く抵抗するため

結果、米国のITスタートアップ企業やゲーム制作会社、広告技術会社の数社はGDPR
違反を犯すリスクより、EU撤退を選んだ。米国の小規模企業の一部でこうした動きが広
がっている。

なぜ今なのか?

ビジネスのグローバル化ビッグデータの台頭、クラウドサービスの利用拡大などのITの
進化により、個人情報保護の重要性が高まる一方で、サイバー攻撃や内部不正等によって
、個人情報に関るリスクが高まっていることが背景。
https://www.secure-sketch.com/blog/gdpr-5minutes-explanation

このプライベートデータは、何も欧州だけでなく、世界各国共通の事項だ。
欧州だけでなく、米国やアジアでも今後似たような法律が採択されるのか?

vol32. Windows スポットライト

Windows スポットライト

f:id:john-rama01:20180523071530p:plain

日替わりで、壁紙やロック画面の写真が変わる。
日々、ネットから写真をダウンロードしているらしい。
これはよい機能だね。
TVのディスプレイに応用すれば日替わりフォトフレームになるな。

dynamic-theme というアプリを使うと、このwindows スポットライトの写真を壁紙にも
適用できる。
https://forest.watch.impress.co.jp/docs/review/1107477.html
https://www.microsoft.com/ja-jp/store/p/dynamic-theme/9nblggh1zbkw

vol31. Ethernet AVB gPTP のannounce message について

gPTPのGMを決定するプロトコルとして、BMCA(Best Clock Master Algorithm)がある。

BMCA は、GMになる能力のあるデバイス(gmCapableがtrueのデバイス)が、自身のクロック
精度情報を載せたAnnounce message をネットワーク内にマルチキャスト配信することに
より、どのデバイスGM(Grand Master)になるかを決定するプロトコル

john-rama01.hatenablog.com

各デバイスはAnnounce message を受け取ると、
1. 受信したAnnounce messageに記載されているクロック情報と、自身のクロック情報を比較
2. 自身のクロックが劣っていれば、
  - slave port role へと移行
  - Announce message の送信をやめる
3. 自身のクロックが勝っていれば、Announce message を送信し続ける

かくして最後まで勝ち残ったデバイス(annouce message を最後まで送信しつづけれたデ
バイス)がGrandMaster となる。


バイスが単体の場合のgPTP の挙動

では、デバイスが単体の場合の挙動はどうなるか?
つまり、デバイスEthernet switch に接続しない場合だ。

システム内に他のgmCapable デバイスが存在しないので、そのデバイス
GrandMaster として動き続け、Announce message を送信し続ける ?


実際に、openAVBのgPTPを動かして挙動を確認してみた。 GMとして動作している状態で、Ethernet Switch とのケーブルを物理的に外したら
Announce mssageの発行が停止し、pdelay_req を送信する挙動になった。


何故か?

答えは、対向機(リンクパートナー)がasCapable = false と判定されたためだ。
802.1AS 対応デバイスと認定されなかったのだ。

gPTP デバイスはpdelay_reqを周期的に発行し、リンクパートナーが常に存在しているかを
診断している。pdelay_req の応答があるか、測定されたpropagation delay値がthresh
hold を越えていないかといった項目を確認し、判別している。

今回の実験では、pdelay_reqに対する応答がなかったため、802.1AS対応デバイスが存在
しなくなったと判定され、その結果、ethernet port のport role がDisabledPort 状態
へと移行したため、Announce message が発行されなくなった。

なるほどね。

vol30. Windows/Linux on virtual machine/Linux on remote でクリップボードの共有

私の開発環境は、windows PCとその上で走る仮想マシン上でLinux、そして、remote に
desktop PCのLinuxを使用している。

これらのクリップボードの共有のしくみは以下の通り

  • windows - Linux OS on virtual

  • Linux OS on virtual - vim

    • .vimrcの以下の設定
      set clipboard=unnamed,unnamedplus,autoselect
    • vim の:register コマンドでクリップボード確認
  • Linux OS on virtual - tmux

    • xclip を利用
    • .tmux.conf に以下の設定 bind-key -t vi-copy 'y' copy-pipe "xclip -sel clip -i"
      bind-key p run-shell 'xclip -sel clip -o | tmux load-buffer -; tmux paste-buffer'
    • tmux list-buffers コマンドでクリップボード確認
  • Linux OS on virtual - Linux OS remote

    • X forwarding を利用
    • ssh -X でremote にログイン

一枚の絵で書くと以下のとおり。

f:id:john-rama01:20180517065542j:plain

X forwarding を利用するとremote のPCとクリップボードが共有できるのは知らなかった。

vol29. SIOCADDRT: File exists/RTNETLINK answers: File exists エラー

$sudo systemctrl restart networking 

を実行すると、以下のエラー

Job for networking.service failed because the control process exited with error code.
See "systemctl status networking.service" and "journalctl -xe" for details.

ログ通りに

$journalctl -xe

を実行すると、

May 15 16:24:12 pc-linux avahi-daemon[598]: Joining mDNS multicast group on interface enp5s0.IPv4 with address 192.168.0.63
May 15 16:24:12 pc-linux avahi-daemon[598]: New relevant interface enp5s0.IPv4 for mDNS.
May 15 16:24:12 pc-linux avahi-daemon[598]: Registering new address record for 192.168.0.63 on enp5s0.IPv4.
May 15 16:24:12 pc-linux dhclient[12150]: bound to 192.168.0.63 -- renewal in 241 seconds.
May 15 16:24:12 pc-linux ifup[12133]: bound to 192.168.0.63 -- renewal in 241 seconds.
May 15 16:24:12 pc-linux ifup[12133]: SIOCADDRT: File exists
May 15 16:24:12 pc-linux ifup[12133]: ifup: failed to bring up enp5s0
May 15 16:24:15 pc-linux avahi-daemon[598]: Joining mDNS multicast group on interface enp8s0.IPv4 with address 192.168.101.2
May 15 16:24:15 pc-linux avahi-daemon[598]: New relevant interface enp8s0.IPv4 for mDNS.
May 15 16:24:15 pc-linux avahi-daemon[598]: Registering new address record for 192.168.100.20 on enp8s0.IPv4.
May 15 16:24:15 pc-linux ifup[12133]: RTNETLINK answers: File exists
May 15 16:24:15 pc-linux kernel: IPv6: ADDRCONF(NETDEV_UP): enp8s0: link is not ready
May 15 16:24:15 pc-linux ifup[12133]: ifup: failed to bring up enp8s0
May 15 16:24:15 pc-linux systemd[1]: networking.service: Main process exited, code=exited, status=1/FAILURE
May 15 16:24:15 pc-linux systemd[1]: Failed to start Raise network interfaces.

どうやら以下のログのとおり、ネットワークインターフェース enp5s0 と enp8s0 のifup で失敗している模様だ。

ifup[12133]: SIOCADDRT: File exists
ifup[12133]: ifup: failed to bring up enp5s0 

ifup[12133]: RTNETLINK answers: File exists                  
kernel: IPv6: ADDRCONF(NETDEV_UP): enp8s0: link is not ready 
ifup[12133]: ifup: failed to bring up enp8s0                    

ifup は/etc/network/interfaces の設定ファイルに基づいて、 ネットワークインターフェースの立ち上げを行うコマンド。

/etc/network/interfaces の設定は、

auto enp5s0
iface enp5s0 inet dhcp
    post-up route add -net 0.0.0.0 netmask 0.0.0.0 gw 192.168.3.254

auto enp7s0
iface enp7s0 inet static
    address 192.168.101.2
    netmask 255.255.255.0
    gateway 192.168.101.1

auto enp8s0
iface enp8s0 inet static                                                                                                        
    address 192.168.100.20
    netmask 255.255.255.0
    gateway 192.168.100.1

ifup は -v オプションで詳細なログが表示される。 まずは、enp5s0が失敗する原因について調査。

$sudo ifdown --force enp5s0 
$sudo ifup -v  enp5s0      

ifup: configuring interface enp5s0=enp5s0 (inet)
/bin/run-parts --exit-on-error --verbose /etc/network/if-pre-up.d
run-parts: executing /etc/network/if-pre-up.d/ethtool
run-parts: executing /etc/network/if-pre-up.d/wpasupplicant

/sbin/dhclient -4 -v -pf /run/dhclient.enp5s0.pid -lf /var/lib/dhcp/dhclient.enp5s0.leases -I -df /var/lib/dhcp/dhclient6.enp5s0.leases enp5s0
....
DHCPDISCOVER on enp5s0 to 255.255.255.255 port 67 interval 6
DHCPREQUEST of 192.168.0.63 on enp5s0 to 255.255.255.255 port 67
DHCPOFFER of 192.168.0.63 from 192.168.3.254
DHCPACK of 192.168.0.63 from 192.168.3.254
bound to 192.168.0.63 -- renewal in 275 seconds.
route add -net 0.0.0.0 netmask 0.0.0.0 gw 192.168.3.254
SIOCADDRT: File exists
ifup: failed to bring up enp5s0

なるほど、 route add コマンドの実行結果が、SIOCADDRT: File exists につながっているのね。

route add コマンドの直前まで、マニュアルでコマンドを実行して、routing table を表示してみると、

$sudo route -n 
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.3.254   0.0.0.0         UG    0      0        0 enp5s0
192.168.0.0     0.0.0.0         255.255.248.0   U     0      0        0 enp5s0
192.168.100.0   0.0.0.0         255.255.255.0   U     0      0        0 enp8s0
192.168.101.0   0.0.0.0         255.255.255.0   U     0      0        0 enp7s0

route add コマンドで実施したいdefault gatewayがすでに追加されている。dhclient コマンドで設定されるみたいだ。

よって、/etc/network/interfaces から以下の行を削除。

post-up route add -net 0.0.0.0 netmask 0.0.0.0 gw 192.168.3.254

同様の手順で、enp8s0 のerror の原因を調査してみると、以下の行が問題だったため、 削除。

gateway 192.168.100.1

最後にもう一度動作確認。

$sudo systemctrl restart networking 

よし。エラーなし!!


ちなみに、以下のようにifdown コマンドでinteface not configured エラーになる場合は、 /run/network/ifstate が壊れている。 ifconfig コマンドを使ってネットワークを立ち上げたり、ifup/ifdown コマンドが失敗したりして、ifstate ファイルの更新が失敗して、 実際のネットワークインターフェースの状態と不整合が起きた時に発生する。

その場合は、--force option をifup/ifdown コマンドに渡してあげれば、ifstate ファイルの状態を無視してコマンドを実行してくれる。

$sudo ifdown -v  enp5s0                                                                      
ifdown: interface enp5s0 not configured  

ネットワーク立ち上げ後は、以下が正常な状態

$ cat /run/network/ifstate
lo=lo
enp5s0=enp5s0
enp7s0=enp7s0
enp8s0=enp8s0

以下はネットワークがダウンしている状態

$ cat /run/network/ifstate
lo=lo