ハラミTech

技術系ブログです

1年3ヶ月でTOEIC L&R スコアが385点から855点になった話

ご無沙汰です。
去年(2019年)の9月あたりから、業務外での技術系の勉強をすべてやめ、英語の勉強をずっとやってました。
モチベ維持のためにTOEIC L&R(以下TOEIC)を受けてたんですが、TOEICスコア800を超えたので、自分の今までの勉強法をまとめておこうと思います。

ちなみに自分が所属してる会社は、月1で社内でTOEICテスト(IPテスト)で実施してくれるのでそれを受けてました。
なので一般の方とは受験している日付が異なりますのでご注意を。

要約

時間ない人向け

  • 学歴はIT系専門卒、高校は工業高校。英語何もわからない
  • わりと単語の勉強をしたのに初回のTOEICスコアが385点だった
  • 1日約2〜3時間英語の勉強をした。これを1年3ヶ月
  • TOEIC 855点とれた

英語の勉強前の自分のスペック

こんな自分でもそれなりに英語できるようになってきたよ、って励みになればと思ったので
勉強前の自分のスペックを書いておきます。

  • 当時30歳
  • 中学の英語の成績はかなり下の方。たしか通信簿は1か2だった
  • 高校は工業高校。英語という科目はなくオーラルコミュニケーションという授業で、たぶん普通の学校よりレベルの低い授業だと思う
    • そんなところでもテストは毎回赤点か赤点ギリギリ
  • IT系専門学校に行ったので英語なんてやらない
  • 文法用語はなにもわからない(形容詞とか副詞っていわれても「?」)
  • 1ヶ月くらい英単語の勉強だけして初めて受けたTOEICスコアは385(ちなみにその1ヶ月後に受けたときは320だった。恥ずかしくてスコア捨てた)
  • 自分はIT系のエンジニアなので、プログラムでよく使う単語(ifとかfor)の意味はわかる

英語学習の目的

なにをモチベーションに学習しているのかを書いておきます。

TOEICを定期的に受けてたわけですが、
TOIECのスコアを目的に勉強はしてません。そのためTOEIC対策を中心に勉強しているわけではありません。

で、なにを目的にしてるかというと

  • 英語を使った仕事でのコミュニケーションをそつなくこなしたい
  • StarWarsの小説をスラスラ読みたい

StarWars大好きなので読めるようになりたい。。。
アメコミはそれなりに読めるようになってきました。

現在の自分の英語のレベル

TOEIC800を超えた現時点の自分の英語のレベルを書いておきます。

  • Reading
    • 技術系の公式リファレンスの英語は翻訳なしで大体読める
    • 仕事の英語メールも翻訳なしで大体読める
    • 児童向け小説を読める
    • StartWarsの小説は読めない。ビジネス系の単語ばかり学んだせいでSF系の単語がまったくわからない
    • 個人が書いた英語の技術ブログはなんとなくしか読めない
      • くだけた表現がわからないから?
  • Listening
    • TOEICとか英語学習用のCD音源みたいなゆっくりめの音声は8割内容を理解できる
    • 洋画を見てたらたまに意味がわかる
    • オンライン英会話で言ってる内容は7割理解できるが、正確には聞き取れてないので何度も聞き返す
    • 英語の生の会話を聞いてても理解できない
  • Writing
    • かなり遅いが辞書なしでコミットコメントやプレゼンを英語で書ける
    • 込み入ったメール文章とかは書けないと思う
  • Speaking
    • オンライン英会話で、教材に則ったSpeakingはできる
    • フリートークができない
    • オンライン英会話でまったく会話が盛り上がらない
      • なにかジョーク言われても「HAHAHA」しか言えない
    • 自分の思ってることがすぐに言葉で出ない(時間をかければ出る)

まとめると、Readingはかなり、Listeningもまぁまぁできるようになったけど、
WritingとSpeakingは全然だめ

TOEICスコアの変遷と勉強方法

f:id:mori_morix:20201107160121p:plain

回数 日付 Listening Reading Total
1 2017/03/12 245 140 385
2 2019/10/27 300 250 550
3 2020/01/17 340 315 655
4 2020/02/12 360 370 730
5 2020/08/07 370 265 635
6 2020/09/04 370 350 720
7 2020/10/08 420 335 755
8 2020/11/06 410 445 855

1回目と2回目が2年空いてますが、
英語の勉強を始めたのは2019年9月なので、2回目のスコアは約2ヶ月勉強した成果です。

2月から8月は半年空いてますが、コロナの影響でテストの実施がありませんでした。

こう見ると、Listeningは順調に上がってますが、Readingが安定してません。
というのも長文読解学習を7回目まで怠ってたからです。
長文読解を意識して勉強したら8回目で一気にスコアが伸びました。

ではそれぞれの期間でどのような勉強を行ったかを記載していきます。

550点まで(英語学習を始めてから約2ヶ月)

中1レベルの英語すらまともにできていないのは自覚できていたので、
まずは中学レベルの勉強からはじめました。

この期間の学習内容

  • 英単語学習(1時間/日)
  • 中学英文法ドリル(2時間/日)
  • DMM英会話(25分/日)

英単語学習

iKnowという英単語学習アプリを使って英単語の勉強をしていました。
これは1つの英単語を覚えたらそれが定着するまで毎日その単語が出題されます。
定着してきたらだんだん出題の間隔があいていきます。完全に定着したらようやく出題されなくなります。

この勝手に復習を強制してくれるのが僕に非常に合っていて、有料ですがいまでも使い続けています。

いろんなコースから選べるのですが、TOEICコースを中心に学習していました。
ビジネス系の単語を学びたかったので、TOEICコースがちょうどいいかなと思いました。
現在ではTOIECコースの全33レッスンすべてマスターしました。

他にも句動詞や熟語などのコースがありそれらもやりました。
1年3ヶ月で約3300語覚えました。

この学習は毎日1時間前後やってます。

中学英文法ドリル

英文法の知識が皆無だったので、本を読むだけではなく、ドリル形式でひたすら学習することが必要だと感じたので、
以下のドリルを購入しました。

これは自分としては最高の教材だと思っていて、この教材の力でTOEICが550点まで行ったと思います。

内容としては中学1〜3年の英文法の知識と、その練習問題がたくさんあります。
これを1日2時間やりつづけ、最後の総復習問題が100点になるまで、この本を周回しました。
結局3周しました。

DMM英会話

英語学習を始めてすぐにオンライン英会話をはじめました。
これは非常に意味のない勉強だったと思います。

なぜなら、相手は日本語がわからない教師で、僕もリスニング能力が皆無の状態で挑んだため、ほとんど会話になりませんでした。
まったく英語ができない状態でのオンライン英会話は僕には合わなかったです。
そのため2ヶ月でやめました。

ただDMM英会話自体はとても使いやすく、料金も手頃だったです。
また入会すると上記で紹介したiKnowが無料になるので、iKnowが使いたくてオンライン英会話やりたい人にはおすすめです。

730点まで(550点から約4ヶ月)

ここまでで、中学の英文法の知識が一通り理解できました(定着はしてない)。
ただリスニング能力がだめだめだったのでそのへんを鍛えていきました。
また読む速度が遅いのでそこも鍛えていきました。

この期間の学習内容

  • 英単語学習(1時間/日)
  • 英語耳(25分/日)
  • 多読(2〜3時間/日)

英語耳

英語の発音ができれば、英語が聞けるようになる!と聞いたので、
英語耳という教材で発音の練習をするようになりました。

英語耳[改訂・新CD版] 発音ができるとリスニングができる

英語耳[改訂・新CD版] 発音ができるとリスニングができる

  • 作者:松澤喜好
  • 発売日: 2010/08/12
  • メディア: 単行本(ソフトカバー)

これは英語の一通りの発音のやり方を紹介してくれてます。
またこの本は練習用のフレーズを用意してくれており、それをちゃんとすべてやると25分かかります。
なので毎日この本を使って発音練習を行いました。
50週をした時点で、本を見なくても発音がちゃんとできるようになったと思ったので、やめました。

成果ですが、細かい音が聞こえるようになったと思います。冠詞とか。
またRとLの聞き分けもできるようになったと思います。

この学習を始めてから、英単語学習時の音読も、発音を意識してやるようになりました。
ただ自分の発音がちゃんとできているのかは未だによくわからない(オンライン英会話では発音を指摘されたことはほとんどない)

多読

英語で書かれた本をたくさん読む、というのを多読学習というらしいです。
自分は以下の本を読みました。

Factfulness以外は全部児童向けの本です。
Factfulnessは多読に良いと聞いたので読んだのですが、とても読みやすかったです。

Wonderはめちゃくちゃ泣けました。小説で泣いたのは初めてかも知れない。
その後映画も見ましたがこれも泣けた。

暇さえあれば洋書を読んでました。
ただ、ストーリーが児童向けというのがあってちょっと自分には物足りず、いまは多読をしていません。

この多読の効果ですが、英語を読むスピードは飛躍的に伸びたと思います。
TOEICでも段々とPart7を解ける問題数も増えてきました。

730点から635点になってしまった(730点から約6ヶ月後)

IPテスト(社内で開催されるTOIECテスト)がコロナで開催されなくなってしまいました。
なぜかこのあたりから将棋にハマってしまい、将棋の勉強をしてました。
そのせいで英語の学習時間が減ってしまった影響で、点数が下がったのかもしれません。

またテストがオンラインに変わった影響もあるかもしれません。

この期間の学習内容

  • 英単語学習(1時間/日)
  • 多読(1時間/日)

点数が急に下がったので将棋の勉強はやめることに(´・ω・`)

755点まで(635点を取ってしまってから約3ヶ月)

755まではめちゃくちゃ伸び悩みました。
この段階での自分のTOEICの悩みは

  • リスニングパートのPart2〜4、6割程度しか言ってる内容を理解していない
  • リーディングパートで、よくわからない文法が度々出てきて混乱する
  • Part7の時間が足りない

Part7の時間が足りないのは、よくわからない英文法が出てくるせいで時間を食ってしまうからだと思ったので
文法の学習に力を入れることにしました。

この期間の学習内容

  • 英単語学習(50分/日)
  • ディクテーション(15分/日)
  • 瞬間英作文(15分/日)
  • 高校英文法学習(30分/日)
  • 英語喉(20分/日)

英単語学習

引き続きiKnowを使ってましたが、やり方を少し変えました。
今までは出てきた単語を音読して例文読んで終わり。だったんですが
ここにシャドウイングを追加しました。

シャドウイングが完璧にできるまで次の単語に進まないようにしました。

ディクテーション

ディクトレというアプリを使って
英語の文章をリスニングし、それをディクテーションする、というのを毎日15分やりました。
このアプリ内にあるTOIECのPart2の問題は全部やりました。

このトレーニングのおかげで、単語と単語のつながりの音や冠詞を正確に捉えるようにできるようになった気がします。

瞬間英作文

この期間からしゃべることを意識した勉強を始めたいと思って
瞬間英作文トレーニングをするようになりました。
これは、日本語が問題として出されるので、それを英訳する。というトレーニングです。
以下の本を使いました。

個人的にはスラスラ話すための瞬間英作文シャッフルトレーニングをおすすめします。
青い本のほうは、例えば「現在進行系」という学習のタイトルを示された上で、日本語が問題として出るんですが
「あ、これは現在進行系を使って問題を解けばいいんだな」とわかってしまうので学習の邪魔でした。

シャッフルトレーニングはそういうのがなく、いろんな文法を組み合わせてトレーニングができるのでおすすめです。

このトレーニングのおかげで、中学英文法を使った文章の作成能力がかなり上がった気がします。
このあたりから機械翻訳無しで英文が書けるようになってきました。

また、リーディングにも効果が出て、例えば関係代名詞の使い方がはっきりわかるようになって
文章を読む際もスムーズに読めるようになったと思います。

高校英文法学習

ここまでの自分は中学英文法の知識しかなかったので、高校英文法に進んでみることにしました。
ということでキク英文法という本で始めました。

【CD・音声DL付】キク英文法

【CD・音声DL付】キク英文法

大学入試に必要な知識、とのことで自分の知らない英文法のルールがまだあることに気づきました。

この本は3周しました。1周目は普通に読んで、2周目は1周目で理解できなかったことをノートに書き写し、3周目でまた普通に読む。という感じでやりました。
あまりに細かい表現があったりしてそういうのはまだ覚えられてないですが、いままで疑問に思ってた謎の文法ルールも身についたと思います。

英語喉

リスニング、もうちょいできることないかなと思ってネットで勉強法を調べてたら
英語喉という教材に出会いました。

CD付 英語喉 50のメソッド

CD付 英語喉 50のメソッド

これは、英語の発音は日本語のように口先でやるのではなく、喉で発音するのだ。というのを提言した本です。
これまでの発音で意識されていた舌を使った発音ではなく、喉で発音することでネイティヴと同じ発音ができる、とのことです。

このトレーニングを1日20分やり、2周してやめました。

この学習の成果としては、LとRの発音の違いがはっきりわかるようになりました。
また英語耳では微妙に違いがわからなかった発音方法も理解できました。

発音がよくなったのかは自分ではよくわかりません。。。

またこの本は説明がちょっと雑で、結局舌の動きも必要だったりするんですが
その舌の動きがわかりづらいです。ただこの舌の動きは英語耳で学習することができるので
この本をやる前にまず英語耳をやったほうがいいと思います。

855点まで(755点から約1ヶ月)

リスニングはかなり伸びてるのに、リーディングが安定していないのが悩みでした。
安定しないのは、おそらくPart7の長文読解がちゃんとできていないせいだろうなと思ったので
そこに力をいれることにしました。

この期間の学習内容

  • 英単語学習(50分/日)
  • ディクテーション(15分/日)
  • 瞬間英作文(15分/日)
  • 長文読解学習(45分/日)
  • オンライン英会話(25分/日)

ディクテーション

ディクトレのTOEIC問題が全部おわってしまったので、
abceedというアプリの読み放題プランを利用し、
TOEIC L&R TEST 出る単特急金のフレーズ」のディクテーショントレーニングをやりました。

長文読解学習

Core1900 という学習教材を使い始めました。

速読速聴・英単語 Core1900 ver.5 (速読速聴・英単語シリーズ)

速読速聴・英単語 Core1900 ver.5 (速読速聴・英単語シリーズ)

これは英字新聞に載っているようなニュースを抜粋し、英単語や文法の解説をしてくれるものです。
CDがついており、その英文のリスニングができるんですが、これがとても速い・・・!
音読するので手一杯なほど速いです。シャドウイングは無理。

自分は以下のようにこの本を使ってます

  • まずCDの音声だけ聞く
  • 文章のみ読む
  • 単語や文法の解説を読む
  • 日本語訳を読む
  • 英語の文章を3周音読する
    • 文の解釈などをしながらなのでゆっくり読みます
  • CDを聞きながら音読を3周する
  • 音声だけを2周聞く

これを1日2つの文章やります。

この学習の成果ですが、
TOIECのReadingが100点伸びたのはこの教材のおかげだと思います。

まず英文の読み方がかなりよく理解できるようになったと思います。
英語のテンポというか、そういうのが身についてくる感じ。

またCD音声がとんでもなく速いのでリスニング能力も向上したと思います。
TOIECの音声が遅く感じます。

ちなみにこの本はTOEIC600以上の方を対象とされてますが
600の人はこの本は無理です。まったく歯がたたないとおもいます。
700以上になってギリギリ読めると思います。

オンライン英会話

QQ Englishというところでまたオンライン英会話を始めました。

理由としては、Speaking能力が全く伸びていないのを自覚していたからです。
最初の頃とは違い、今は単語や文法知識はあるので、あとは瞬発力をあげていくだけだと思うので
このタイミングでの英会話は効果があると思ってやってます。

いまは「Topic Conversations for Beginner」というのをやってます。

この英語学習を通して得た教訓

習慣化がなにより大事

勉強を毎日するって大変です。ただそれを習慣化するとと勉強をするのが当たり前になり、やらないと気持ち悪くなります。

自分の場合、どうやって習慣化したかというと、
電車での通勤時間をすべて英語学習にしたことです。
通勤中は手持ち無沙汰でアニメを見たりネットサーフィンしてるだけなので、
学習時間に置き換えるには最適でした。
また通勤時間は、残業しようが飲み会があろうが必ず発生する時間なので必ず英語学習ができます。

そうして習慣化していき、コロナで通勤がなくなっても英語学習を続けられました。

あとまったく英語ができなかった自分でも学習を続けてさえいればちゃんと結果が出る、っていうのも実感できました。
これは英語学習以外でも励みになるかなと思います。

一時的な数値目標はモチベーション維持になる

TOIECのスコアを取るのは目的じゃないです。
ただ、自分の英語能力を数値でフィードバックもらいたいので、そういう点でTOIECを受け続けてよかったなと思います。

TOIECの点数取れても英語喋れるようにならねーじゃん!って意見を見たことがあるんですが
現実僕がそうなのでそうだと思います。

ただ話すためには聞く能力が必要だし、書くためには読む能力が必要だと思います。
その能力を測るための指標としてTOEICはモチベーションにもなるし、受ける意味はあるなーと思いました。

今後の方針

リーディングはかなり自信が持ててきました。
ただビジネス系英語を中心にやってきたので、自分の好きなSF系の語彙を増やしていきたいです。

リスニングがまだまだです。
TOEIC Part2も、最初の質問ははっきり聞こえるのに、その後の受け答えの一部が聞こえないとか。
あと英語プレゼンも音声だけ聞いてもよく内容が理解できません。

なのでリスニングを鍛えていきたいんですが、うーん、なにしようかなー。と考えているところです。

またスピーキング能力も引き続き英会話などで鍛えていきたいと思います!

AnsibleをAWS Systems Managerセッションマネージャー経由で使えるか試してみた

ちょっと前に、AWS System ManagerのセッションマネージャーがSSH経由で使えるという記事が話題になりました。

docs.aws.amazon.com

dev.classmethod.jp

これが出来るんならAnsibleもセッションマネージャー経由で出来るよな?と思ったので確認のために試してみます。

セッションマネージャーをEC2で使えるようにする

EC2をセッションマネージャーでログインするためには以下の状態になっていなければなりません

  • SSMエージェントをEC2にインストールする
  • EC2のIAM Roleのポリシーに「AmazonSSMManagedInstanceCore」がアタッチされている
  • EC2がインターネットに接続できるか、SSMのVPC Endpointに接続できる

Linuxの場合のSSMエージェントインストール方法は以下に記載してあります。

Amazon EC2 Linux インスタンスに SSM エージェント を手動でインストールする - AWS Systems Manager

AWSのAMIの中には、SSMエージェントがプリインストールされているのもありますので、
新規で作成する場合はこれらを選択してもいいと思います。

2016 年 11 月以降に公開された Windows Server 2003-2012 R2 AMI
Windows Server 2016 および 2019
Amazon Linux
Amazon Linux 2
Ubuntu Server 16.04
Ubuntu Server 18.04

SSM エージェント の使用 - AWS Systems Manager

今回はせっかくなのでプリインストールされているAMIを使用してEC2を作成します。
このときアタッチするセキュリティグループにはSSH(22)のポートは空けないでおきます。
上記の状態を満たしている場合、EC2起動時に、セッションマネージャーのコンソールで起動したインスタンスが表示されます。(表示されるまでちょっと時間かかる)

f:id:mori_morix:20191108165441p:plain

まずはこの画面で、セッションマネージャによるサーバーログインを試してみましょう。
ログインできたら準備完了です。

ローカルPCにSession Managerプラグインをインストールする

aws-cliを使用してセッションマネージャーログインを行うため、ローカルPCにSession Managerプラグインをインストールする必要があります。
インストール方法は下記に記載してあります。

(オプション) AWS CLI 用の Session Manager Plugin をインストールする - AWS Systems Manager

自分のPCはUbuntuなので、以下のコマンドでインストールしました。

$ curl "https://s3.amazonaws.com/session-manager-downloads/plugin/latest/ubuntu_64bit/session-manager-plugin.deb" -o "session-manager-plugin.deb"
$ sudo dpkg -i session-manager-plugin.deb
$ session-manager-plugin --version
1.1.35.0

sshでEC2にログインできるようにする

この辺は冒頭の記事のままですが、~/.ssh/configに以下の設定を追記します。

~$ cat ~/.ssh/config
host i-*
  ProxyCommand bash -c "aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters 'portNumber=%p'"

これでインスタンスIDをsshのホスト名に指定すればsshログインできます。
EC2を作成したときに指定したキーペアの秘密鍵の指定も忘れずに。(次の例ではid_rsaを使ってるので省略してます)

# AWSのprofileを指定したい場合は事前に以下の環境変数を指定しましょう
$ export AWS_PROFILE=xxxx

$ ssh ubuntu@i-xxxxxxxx

これでログインできます。セキュリティグループでssh(22)を設定していないにも関わらずです。
便利ですね〜。

プライベートサブネットに属するEC2にもローカルPCから接続してみる

本題とはずれますが、このsshはプライベートサブネットに属するEC2に対しても、別のネットワークのPCからsshできます。

注意としては、上記のセッションマネージャー使う上での条件の

EC2がインターネット経由でSSMエンドポイントに接続できるか、SSMのVPC Endpointに接続できる

ここが、プライベートサブネットだとVPC Endpointに接続する設定をしないといけないです。
やり方は以下に記載されています。

Systems Manager を使用したインターネットアクセスなしでのプライベート EC2 インスタンスの管理

僕も試したので、簡単に手順を記載しておきます。

  1. プライベートネットワークからのインバウンドのhttps(443)ポートの接続を許可する(443 10.0.0.0/16 みたいな感じ)セキュリティグループを作る
  2. VPC > Endpoints > Create Endpointsの画面に行く
  3. サービス名で「com.amazonaws.ap-northeast-1.ssm」を選択
  4. VPCはEC2が属するものを選択
  5. サブネットも必要なものを選択
  6. Enable Private DNS Nameはチェックしておく
  7. セキュリティグループは1で作ったものを指定して保存
  8. 以下のサービス名分、4〜7を繰り返す
    • com.amazonaws.ap-northeast-1.ssmmessages
    • com.amazonaws.ap-northeast-1.ec2messages

この設定をしておくと、プライベートサブネットに属するEC2へsshログインできるようになります。

Ansibleで実行してみる

じゃあやってみましょう。
Ansibleの構成は以下にコミットしてます。

GitHub - morix1500/ansible-ssm-test

.
├── ansible.cfg
├── group_vars
│   └── all
│       └── vars.yml
├── hosts.yml
├── roles
│   ├── copy-files
│   │   ├── files
│   │   │   └── test.txt
│   │   └── tasks
│   │       └── main.yml
│   └── copy-files2
│       ├── files
│       │   └── test2.txt
│       └── tasks
│           └── main.yml
└── site.yml

hosts.ymlはこんな感じで、インスタンスIDが指定されてます。

all:
  children:
    test:
      hosts:
        i-0290aa0692d91b322

site.ymlはこんな感じ。内容はテキストファイルをコピーするだけのロールを2つ用意してます。

- hosts: test
  become: yes
  roles:
    - { tags: "test", role: "copy-files" }
    - { tags: "test", role: "copy-files2" }

では実行してみます。

$ ansible-playbook -l test site.yml

PLAY [test] ************************************************************************************************************************************************************************************************

TASK [Gathering Facts] *************************************************************************************************************************************************************************************
ok: [i-0290aa0692d91b322]

TASK [copy-files : copy file] ******************************************************************************************************************************************************************************
changed: [i-0290aa0692d91b322]

TASK [copy-files2 : copy file] *****************************************************************************************************************************************************************************
changed: [i-0290aa0692d91b322]

PLAY RECAP *************************************************************************************************************************************************************************************************
i-0290aa0692d91b322        : ok=3    changed=2    unreachable=0    failed=0

はい、行きました。
ということで、セッションマネージャー経由でもansibleが動きます。(そりゃそうだろと思うけど)

通常のsshと速度差はあるのか?

なんか微妙に遅い気がしたので、通常のsshとセッションマネージャー経由のsshで速度差があるか比較してみました。
といっても雑です。↑のやつをsshでやってみるだけです。

################
# 通常のssh
################

$ time ansible-playbook -l test site.yml

PLAY [test] ************************************************************************************************************************************************************************************************

TASK [Gathering Facts] *************************************************************************************************************************************************************************************
ok: [54.199.142.244]

TASK [copy-files : copy file] ******************************************************************************************************************************************************************************
changed: [54.199.142.244]

TASK [copy-files2 : copy file] *****************************************************************************************************************************************************************************
changed: [54.199.142.244]

PLAY RECAP *************************************************************************************************************************************************************************************************
54.199.142.244             : ok=3    changed=2    unreachable=0    failed=0


real    0m8.032s
user    0m2.109s
sys     0m0.768s

################
# セッションマネージャー経由のssh
################
$ time ansible-playbook -l test site.yml

PLAY [test] ************************************************************************************************************************************************************************************************

TASK [Gathering Facts] *************************************************************************************************************************************************************************************
ok: [i-0cf6d9186cfd7ed34]

TASK [copy-files : copy file] ******************************************************************************************************************************************************************************
changed: [i-0cf6d9186cfd7ed34]

TASK [copy-files2 : copy file] *****************************************************************************************************************************************************************************
changed: [i-0cf6d9186cfd7ed34]

PLAY RECAP *************************************************************************************************************************************************************************************************
i-0cf6d9186cfd7ed34        : ok=3    changed=2    unreachable=0    failed=0


real    0m9.463s
user    0m1.994s
sys     0m0.655s

通常のsshが約2秒、セッションマネージャー経由が約3秒でした。
後者は最初だけ時間がかかりますが、その後は体感だと変わらなかったです。

これはsshのProxyコマンドをコネクション確立時に実行しているためです。
一度確立させるとそのコネクションを使いまわすようになっています。
Ansbileのデフォルトの動作でControlMasterが有効になっている影響かと思います。

感想

sshポート空けずに済むので、安全性を高められるし、踏み台も不要なるかもと思いました。
あとは実際に業務で使ってみて使い勝手を試したいですね。

ただたまにうまく接続できないことがあるのがちょっと気になりました。
接続に時間がかかることによるタイムアウトかな?

OS自作入門してみた&やりきった

最近自分にはコンピュータ・サイエンス(CS)に関しての基礎知識があまりないなぁと感じていました。
ここでいうCSとはどういうものなのかというと

挙げればいっぱいありますけど、ざっくり「低レイヤー」と呼ばれている部分に関してです。

現在様々な書籍を読んで勉強をしている最中です。
どんな書籍を読んで勉強しているかはまた別の記事で書くとして、
今回は「30日でできる! OS自作入門」という書籍を読んで実際にOSを作ってみたので、その報告記事です。
いやー、長かった・・・

30日でできる! OS自作入門

30日でできる! OS自作入門

書籍の概要・学べること

「HariboteOS」というOSをBIOSから作っていきながら、OSの仕組みを学べます。

などが実際に作りながら学べます。

こんな感じで動くOSが作れます。

3日目(画面が描画された)
f:id:mori_morix:20190721113223p:plain

10日目(マウス制御ができた)
f:id:mori_morix:20190721113334g:plain

29日目(ゲームが動いた)
f:id:mori_morix:20190721113513g:plain

30日目(完成!)
f:id:mori_morix:20190721113647p:plain

実施した自分の環境

この環境でやり遂げたソースを載せておきます。

GitHub - morix1500/zisakuos

かかった時間

「30日でできる!」と書いてあるので実際にかかった期間も載せておきます。

僕は1日2〜3時間やって、ちょうど30日でおわりました。
2日ほど作業できない日があったので期間的には32日間かかりました。

活動時間は以下のようになっていて、
仕事が終わって帰るのが18〜19時くらいなのでそのへんのコミットが多くなってます。

これはなにかというと、Gitリポジトリから活動時間帯(コミットした時間)を抽出できるものです。
詳しくは下記参照

At what time of day do famous programmers work?

$ git log --author="morix1500" --date=iso | perl -nalE 'if (/^Date:\s+[\d-]{10}\s(\d{2})/) { say $1+0 }' | sort | uniq -c|perl -MList::Util=max -nalE '$h{$F[1]} = $F[0]; }{ $m = max values %h; foreach (0..23) { $h{$_} = 0 if not exists $h{$_} } foreach (sort {$a <=> $b } keys %h) { say sprintf "%02d - %4d %s", $_, $h{$_}, "*"x ($h{$_} / $m * 50); }'
00 -    2 **
01 -    1 *
02 -    0 
03 -    0 
04 -    0 
05 -    0 
06 -    0 
07 -    0 
08 -   10 *************
09 -   19 **************************
10 -    9 ************
11 -    5 ******
12 -    0 
13 -    1 *
14 -    2 **
15 -    0 
16 -    4 *****
17 -   10 *************
18 -   14 *******************
19 -   22 ******************************
20 -   36 **************************************************
21 -   31 *******************************************
22 -   19 **************************
23 -    9 ************

感想

そもそもディスプレイにどうやって画面を描画しているんだろうとか、マウスはどうやって動かすとか
ぼんやりとは理解していたものが、はっきり実装のイメージがつきました。
意外に愚直にやってるんだなぁというのが正直な感想で、あまり難しくないのだなと苦手意識がなくなった気がします。

あとC言語でもプログラムを書くんですが、アセンブリを書く機会がめちゃくちゃ多いです。
CPUレジスタのことをわからないと当然かけないので、そのへんから丁寧に教えてくれます。
丁寧と行っても全部説明してくれるわけでもなく、「なんでここでこのレジスタ使うんだろ?」っていう疑問が結構ありました。
そのへんの知識は、同時に読んでいた「プログラムはなぜ動くのか」という本でもアセンブリを扱っており、知識を補完することが出来ました。

「概念としては理解してるけど実装はちょっと・・・」という方にはぜひおすすめしたい書籍です。
自分もそんな感じだったんですが、いろんな部分がクリアになって自分に自信が持てました。

今後OSに追加したい機能

ファイルシステムの実装やデバイスドライバの実装をやっていきたいのと、
ウィンドウサイズを可変にしたいですねぇ・・・

あとはRustで書き直したいです。

やれるかな・・・?

詰まったところ

この書籍はWindowsで行うことを前提にしています。
残念ながら自宅にWindows環境がないのでUbuntuでやりました。

やはりそれだとスムーズに行かなかったので、詰まったところを書いておきます。

必要なツールのインストール

以下のコマンドでインストールします。
バイナリエディタのbedは、vimライクでエディタを操作できるので非常にコーディングが楽でした。

# バイナリエディタ
$ go get -u github.com/itchyny/bed/cmd/bed
$ bed helloos.img

# QEMU
$ sudo apt install qemu

この書籍では、著者が作った独自ツールを多用していきます。
それは当然Windowsにしか対応していないので、Linuxを使っている場合は使えません。

サポートページにはLinux版を配布していますが、
Makefile以外は流用するとエラーになったり、ツールが足りなかったりします。

ちなみに29日目の圧縮機能実装をするまでは上記のものでも問題なくできます。
しかし圧縮機能実装時に必要なツールが含まれていないため実装できません。

また以下のようなエラーが日本語機能実装時に出てしまい、先に進めなくなりました。

../../../z_tools/gas2nask -a tek.gas tek.nas
skip:shrdl      $16, %edx, %eax
gmake[1]: *** [tek.nas] Error 1

以下にlinuxでも動くツールキットを用意してあるリポジトリがあったのでそれを使ったところ、
圧縮に必要なツールや上記のgas2naskの不具合?が解消され、無事30日目までやり遂げることができました!!
ほんと感謝しかないです・・・

GitHub - HariboteOS/z_tools_linux

あとはQEMUのバグなのか知りませんが、「13 タイマ2」の章がどうやっても動きませんでした。
その場合、qemuの実行時にkvmオプションをつけたところ、解消しました。

$ sudo apt install -y qemu-kvm libvirt0 libvirt-bin virt-manager libguestfs-tools
 
# Makefileの修正(qemu実行部分を置換)
$ sudo qemu-system-i386 -m 32 -fda haribote.img -enable-kvm

2018年の振り返り&2019年やりたいこと

2018年の振り返りと、2019年やりたことをつらつらと書いていこうかなと思います!

2018年の振り返り

全体的に非常にアウトプットが多い年だったなぁと思います。
アウトプットというのは個人サービスや登壇やブログとかのことね。どういうアウトプットしたか列挙するのがめんどうなのでしませんがかなりやりました。
自画自賛してるようであれですが、結構成長できたんじゃないかな〜

2018年はひたすら勉強してました。わりと勉強疲れを感じてます。。。

では今年の振り返りを出来事で振り返ります!

個人サービスを色々リリースした

個人サービスを4つほどリリースしました。
最初のサービスは確か4月頃だったと思います。

最初は「技術の学習」のために個人サービスを作りましたが
いまではその個人サービスを成長させていきたいと思うようになるくらい個人サービス開発が楽しくなってきています!

なんで楽しいのか?それを振り返ってみるとやはり「ユーザさんからの生の反応が聞ける」というところに尽きます。
普段のお仕事でユーザさんからサービスを使った反応を聞けることってそんなにないんですが、個人サービスだと直接聞くことができます。
僕の知らない人が僕の使ったサービスを使ってさらにそれを褒めてくれたり改善点を提案してくれたりするんです。
これほど承認欲求が満たされる体験ってのはなかなかないと思うんですよね。

あとは個人サービス開発を通した技術の学習は質が違って、より実践レベルで学習していくのでそういった点も楽しいところです!

転職した

2018年4月にソーシャルゲーム会社から現在の会社に転職しました。
結構年収もあがりました。

一応チームリーダー的な立ち位置でやらせてもらっており、アーキテクチャから実装まで幅広くやってます。

技術的にはKubernetesを使ってマイクロサービスをつくったり、AWSのFargateを使ってモノリスなサービスを作ったり色々新しいこともやれてます。
ただ事業があまり進展しておらず、対外的に発表できることがなにもないのが困るところです。。。

副業をはじめた

転職した会社は新規でサービスを作ることになっており、しばらくインフラ周りの運用からは離れそうで余裕ができそうだったので
副業をはじめました。

以下のようなお仕事をさせていただきました

  • データ分析基盤の構築
  • インフラ系の技術講師
  • gRPCの基盤構築

特にお金に困ってるわけではないので、面白そうな案件だけやらせてもらいました。
他社の事例や技術を勉強できたので非常に貴重な経験でした。

結婚式をあげた

2017年に籍はいれてましたが、結婚式がまだだったのでしました。

2月に親族のみで挙式を行い、3月に友人のみで1.5次会を行いました。
準備が死ぬほど大変でもうやりたくないですが、結婚式当日はすごく楽しかったです!
数百万はかかったけどそれだけの価値はあったかな〜と思います。

交友関係が広がった

技術的なアウトプットをしまくったおかげで、エンジニア界隈で交友関係がめちゃくちゃ広がりました。
主に以下のコミュニティの方々とですね!

  • インフラ勉強会
  • しがないラジオ
  • 運営者ギルド

色んな人と飲み会をしたけれど、どれも楽しかったなぁ。 2019年も色んな人とお話をしたい。

2019年やりたいこと

やりたことというよりも、思いとかそういうの。

仕事

  • 副業は今まで通り面白そうなやつだけ受ける
  • 転職は提示額次第でするかもしれない

副業は引き続き募集してますが、週1が上限なのであまり案件来なそう。
転職はもしオファーいただけるのなら額次第で行くかもしれないです。フリーランスは今は考えてないです。

技術

Webのフロントエンドからクラウドのインフラまで、Webサービスを作る上で必要なものはすべて実践レベルでできるようになりました。
しかしまだモバイルアプリ開発の経験があまりありません(Androidアプリを仕事で作った程度)

今年はモバイルアプリやUnityを作ったゲーム開発をできたらいいな〜と思っています。

あと2018年はブロックチェーンの会社で副業させてもらいましたが、正直よくわからなかったのでブロックチェーンの学習をしていきたいです。
現在勉強中ですが、色んな可能性があって面白そうな技術です。

個人開発

  • 「技術の勉強」という軸はぶれないようにする
  • 本数は少なめで、一つのサービスを成長させていきたい
  • ブロックチェーンでなにか作りたい

個人開発はあくまで自分の市場価値を上げるためのもの、というスタンスでしたが今年もそれは継続です。
なので新しく学習したい技術が個人サービスで活かせるなら、ガンガンサービスをリリースしたい気持ちもありますが
できれば本数少なめでサービスの成長を集中してやりたいなーと思ってます。

あとブロックチェーンが面白そうなのでそれでサービスは作りたい。アイデアはあります!

プライベート

2018年は技術の勉強の年でしたので、2019年はそれを抑えめにして別のことをしたいなーと思ってます。
主に以下のこと

  • なにかしらスポーツ
  • 哲学
  • 英語

技術のことばかりやりすぎて、エンジニアの人以外と話すネタがまったくなくなってしまいました。
今年はもうちょい視野を広げて新たな趣味やスキルを得たい。

最後に

ということで以上です。今年もよろしくお願いします〜|!!

Firebaseを広め隊!講師のお仕事をやってます🔥

僕はFirebaseというサービスがとても大好きです。
仕事でも使っていますし、個人開発でもバリバリ使ってます。

そんな中、一般社団法人全日本ピアノ指導者協会さまで僕はインフラ知識の講師のお仕事を副業としてやっていまして
そこでFirebaseのハンズオンをやりました。

そしてそういう講師経験があると言ったところ、ハンズシェアさまで開催された「Firebaseもくもく会」で再度講師をさせていただきました!

www.wantedly.com

そこで講師としてなにをやってるのかを簡単に書いておこうと思います。
「もし自分のところでもやってほしい!」と思いましたら、お気軽にTwitterでDMください!

講義について

Firebaseの初歩的なところから解説していき、最終的には各開発サービスを触ってもらうところまでやります。
大体2〜3時間です。

初歩的な解説をしつつも、自分の運用しているサービスで実例を見せたり、その運用で得た知見などを喋ったりしてます。

対象者

まずこの講義の対象者ですが、まったくFirebaseを触ったことがない人 です。
もう結構触ってるよって人には合わないかもしれません。

内容

具体的には以下のような内容をやってます。

Firebaseってそもそもなに?

そもそもFirebaseとは?というところからやります。
どうしてこのようなサービスが出来たのか、そういう背景を簡単に説明しFirebaseの必要性を話します。

またFirebaseではどういうサービスがあるのか一つ一つ簡単に解説していきます。

Firebaseを使うメリット・デメリット

WebサービスやモバイルアプリはすべてFirebaseで作ればいいじゃん!」という世界には残念ながらまだないです。
Firebaseを採用するとどんな良いことがあるのか、またどういうケースに適さないか。
また使うにあたって気をつけなければいけないポイントなど解説します。

ハンズオン

実際に以下の開発サービスを触ってもらいます。

  • Authentication
  • Firestore
  • Hosting
  • Functions
  • Storage

ひとつひとつ触りながら、開発する上での知見や勘所など解説します。

最後に

ものすごーく初歩的なところから実際に触ってもらうところまでやるので
Firebaseがどういうものか、どういうふうに使えばいいのかなどイメージできやすい講義なのではと勝手に思ってます。

もし興味があればぜひご連絡ください〜!

f:id:mori_morix:20181207141123p:plain

なるべくお金をかけず個人開発をしていくには

こちらはCrieitアドベントカレンダー Advent Calendar 2018の5日目の記事です。

自分は結婚しておりまして現在お小遣い制です。
独身時代と比較すると自由に使えるお金がそんなに多くありません。

そんな中、個人でWebサービスを作るというのを趣味にしてます。
Webサービスを作るためにはお金が色々かかるわけです。

そこでいかにお金をかけずに個人開発をしていくかを考えながら開発しています。
そのノウハウをこの記事で書いていきたいと思います。

サーバー

作ったWebサービスを動かすための基盤が必要になるわけですがここが結構お金がかかるポイントじゃないでしょうか。
さくらのVPSやConohaを使うのが最初に思いつくと思うのですが、これは月額制です。
払っているお金以上請求が来ないというのはすごく安心感があり魅力的です。

ただ自分の場合そこにお金をあまりかけたくないです。ものすごくケチです・・・

ということでSaasなどをうまく使ってお金を最低限しかかけないようにしてます。

SaaS/PaaS/MBaaSをうまく使う

Webサービスを作るとなると

といろんなサーバーが必要になりますし、運用を楽にするならそれぞれ冗長化をしたいところです。
となるとやたらお金がかかるので自分でインフラは用意したくないです

ということでこういうのはSaas/PaaS/MBaaSを使って無料枠を駆使します。

Webホスティング

SPAを前提としますが、html/css/JavaScriptは静的ファイルです。
最近は無料で静的ファイルをホスティングできるところが増えてきています。

  • Netlify
  • GItHub Pages
  • Firebase Hosting

その他にはAWS S3でもWebホスティングできるので安く済ませることが出来ます。

またこれらはHTTPSに必要な証明書も無料で発行してくれます。
今時であれば必ずHTTPS対応しておきたいので、これは嬉しい。Let's Encryptさまさまです!
(S3であればCloud Frontを使ってHTTPS対応する必要がありますが)

APIやDB

ブラウザからは直接叩けないものをバックエンドのAPIから叩きたいとか
情報をDBに保存したいという要件は必ずあるでしょう。

これはFirebaseやHerokuといったMBaasやPassの無料枠を使うことが出来ます。

  • Firebase
    • 認証/API/DB/ストレージと全部揃ってる
    • DBはNoSQLなので要件にあったら使うといい
    • 無料プランがある
  • Heroku
    • RailsなどのWebアプリケーション置ける
    • MySQLやRedisが無料で使える(制限がきついけど)

もちろんFirebaseとHerokuを組み合わせて使うことも出来るのでおすすめです。

ちなみになんですがこういうインフラを考えなくて良いサービスを作ってると監視も最低限で済みます
Firebase起因の障害でない限り落ちたりはしないので!
監視をしたい場合はメトリクスの保持期間の少なさや制限が多いですがMackerelもフリープランがあるのでそれが使えます。

ストレージ

画像や動画を保存したくなると思いますが、それも最近は従量課金やその無料枠で使うことが出来ます。

  • AWS S3
  • Firebase Storage
  • Cloud Storage

ドメイン

Webサービスを公開するためにはできれば独自ドメインがほしいところです。
ただWebホスティングできるサービスはだいたいそこの無料ドメインを提供してくれるので、お金をケチりたかったらそれを使ってもいいと思います。

サブドメインをサービスのドメインにする

せっかく自分のWebサービスを作ったんだから、どうせならイケてるドメインにしたいですよね!
Kibelaは「kibe.la」というドメインで非常に美しいです・・・

ただドメインを取得するにはお金がかかります。
1ドメインが安くても年間1,000円前後はかかるんじゃないですかね。(セールはありますが!)

しかし1回買って終わりじゃなく、毎年請求がきます。
1サービスだったらいいかもしれませんが、何個も何十個も作っていくと結構な額になります。

そこで自分は、作ったサービスはほとんどサブドメインにしてます。

  • nyaaan.haramishio.xyz
  • markdowntable.haramishio.xyz
  • blog.haramishio.xyz
  • trash.haramishio.xyz

オシャレ感はありませんが、1ドメイン分のお金しか払わなくていいので安く済みます。

またサブドメイン戦略は他にもメリットがあります。

サブドメインだと広告を出すのが楽

以下の内容は間違いで、一回ルートドメインで審査通れば別ドメインでも広告出せるみたいです。

Google Adsenseで広告を出すのは一般的じゃないかなと思ってるのですが、
Adsenseそのドメインで広告を出す許可をもらったら、そのサブドメインすべてで広告を載せることが出来ます。

僕の場合は、このブログのドメインで広告を出す許可をもらったのでその他のサブドメインで広告を載せられるようになりました。
1つ1つのサービスでドメインを取っていると毎回広告を出す申請(結構ハードル高い)をしないといけないので大変です。

素材

Webサービスを作ってると、どうしてもイラストやロゴなど素材が必要になります。
僕は絵を書くスキルが皆無なのでフリー素材でどうにかしています。

ロゴ

サービスのロゴはフリーイラストフリーフォントで作ってます。
フリーフォントでいいのないかなーと探すときに便利なのがためしがきです。

tameshigaki.jp

これで良さそうなフォントを見つけたら、Gimpに入れてロゴを作ってます。

素材

フリーのイラストは「フリー イラスト ○○」でひかかったものを使ってます。
特にこれ!っていうサイトはないですが、「いらすとや」はなるべく使わないようにしてます。

なぜかというと、いらすとやのイラストの世界観が強すぎてうまくサービスにマッチしないときが多いからです。

運用方針

個人で開発・運用してますのである程度「俺ルール」を使えると思っています。

なので、現在Firebaseを従量課金プランで使うことが多いのですが
もしトラフィックが多くなり多額の請求が来そうになったらサービスを止めると思います
そういう割り切りを行えるのも個人開発のいいところだと思います。

ただ永久閉鎖というわけではなく、利益を取れるようマネタイズを考えた上でインフラをきちっと整えたものでまた出せればと思ってます。
そんな機会あるのかわかりませんがw

最後に

ということで、なるべくお金をかけずに個人開発をしていくにはというお話をしました。
昔よりはだいぶ安く済ませるためのサービスが出ているので、いい時代になりました。

同じようにお金あんまりかけられない・・・って人はぜひ参考にしていただけばと思います!


ちなみになんですが、現在4サービス運営しておりまして
そのサーバー費用やドメイン費用合わせて 毎月200円くらいです。
ほぼドメイン費用とDNSサーバー費用です。


次回はSさんです。お楽しみに!