アウトプットは砕けない

21卒学生Webエンジニアのアプトプット

touchのソースを読んでみる

豆知識

Access ファイルデータが最後にアクセスされた時刻。mknod(2), utimes(2) と read(2) システムコールによって変更される。

Modify ファイルデータが最後に変更された時刻。mknod(2), utimes(2) と write(2) システムコールによって変更される。

Change ファイルの状態が最後に変更された時刻(inodeデータの変更)。chmod(2), chown(2), link(2), mknod(2), rename(2), unlink(2), utimes(2) と write(2)システムコールによって変更される。

qiita.com

lstat→link stat

pwdのソースコードを読んでみる

main 343行目 logicalかphysicalかをパースする

       o -L,  Output  the logical working directory, without resolving sym-
 17          links (default behavior).
 18
 19        o -P, Output the physical working directory, with symlinks resolved.
 20

369行目 logicalな時の処理 まずはtextual validtion PWD環境変数(wd変数にとる)のバリデーションを行う 条件 - '/'で始まってる - '/./' とか '/../'などが含まれていない

systemcall validation wdのstatと'.'パスに対するstatを取得して、inodeが一緒か判定

379 physicalな時の処理 gnulibのxgetcwdでcwdパスを取得し、問題なければ出力 それでも取得できなかった場合はrobust_getcwdで出力を得る

robust_getcwdはなんかゴリ押しなやり方っぽいけど、find_dir_entryで挫折した

【英語】TOEIC800点を超えるためにやったおすすめの参考書

f:id:dalekspritner:20200515122148j:plain

らぴおです。

先日、質問箱にこんな質問が来ました。

f:id:dalekspritner:20200515121306p:plain

どちらの方が聞いてくれたのかわからないのですが、こんな僕でも少しでも役に立てる情報を提供できるかもと思ってとても嬉しくなりました。

回答にはかなり雑に参考書だけ答えたのですが、英語学習やTOEICに興味のある方向けに、ここでもう少し深掘りたいと思います。

二年ほど前にTOEICで800点を超えた僕ですが、勉強を始めた時は大学受験時かそれ以下程度の知識しかないクソカスでした。

なので誰でも取り組める参考書だと思います。

取得から二年経過していますが、新形式になったのは僕が受験する少し前で、おそらくまだ形式が変わってないないはずなので、今でも十二分にに通用するはずです。

以下で、自分が最も効率が良かった参考書とその使い方を述べます。

おすすめの参考書

第3位 TOEIC L&Rテスト 文法問題 でる1000問

TOEIC L&Rテスト 文法問題 でる1000問

TOEIC L&Rテスト 文法問題 でる1000問

  • 作者:TEX加藤
  • 発売日: 2017/06/10
  • メディア: 単行本(ソフトカバー)

Part5の問題の対策に特化した問題集です。

早速学習範囲が狭めの問題集ですが、Reading分野の全問題で利用できる文法知識を手堅く身に付けることができます。

Part5の問題は、いくつかのカテゴリ(品詞、前置詞、接続詞など)に分けられるのですが、苦手なカテゴリと出題率を見分けて、適切に学習をしていく必要があります。(出ないカテゴリを重点的に対策してもしょうがないです)

1日30問でもいいので、空き時間をつかって何度も繰り返し解いてみましょう。(一度やった問題でも結構間違えます笑)

まずは本番形式の問題に取り組み、一通りやりきる体力と慣れを身に付け、苦手パートの対策が必要になってきた時に取り組むのがおすすめです。

第2位 金のフレーズ

単語帳です。

TOEICの学習を開始したら脳死でまずこれを買うべきです。

この単語帳に出る単語は本当に本番に出ます。怖いくらい出てきます。理想を言うなら全ての単語を暗記したいところです。

逆に言えばこの単語帳意外の単語帳はあまり持つ必要ないです。

以前、YouTube上に、僕がよく使っていた金フレの例文を読み上げてくれる動画あったのですが、見失ってしまいました。

類似する動画はあると思われるので、それと組み合わせながら頭に入れていくのがおすすめです。

第1位 公式問題集

公式 TOEIC Listening & Reading 問題集 6

公式 TOEIC Listening & Reading 問題集 6

突然ですがいい問題集とはなんでしょうか。

僕が思うに、簡単な問題集でも、難しい難易度の問題集でも、学習効率を謳っている問題集でもありません。

本番に出る(難易度や出題傾向が近い)問題を提供してくれる問題集です。

なぜかというと、出ない問題を対策しても、点数には直結しないからです。

つまり公式が本番に似せたこの問題集が最強ということになります。

最新の公式問題集を2種類書うと、4回分の問題集になるので、各3~4週をするといいでしょう。

ぶっちゃけ公式問題集あれば700overは余裕です。それぐらい最強です。

公式問題集を使ったおすすめの勉強法

✔︎ Listening

Part3, 4で読み上げられる例文を、スマホなどに取り込んで、1.2倍速くらいでずーっと聞く。

聞き取れなかった単語は、スクリプトを必ず確認して覚える。

ゆっくり風呂につかりながらちょい早めの速度に耳を慣らしましょう。等倍が楽に聞こえるようになります。(僕はこの方法でListening450/495くらいまでいきました)

✔︎ Reading

特に特別なことはないです。70分確保して解き、4~5倍の時間をかけて間違えたところを確認するのを3~4週しましょう。

番外編

至高の600問

番外編ですがこちらもご紹介させてください。

3回分の模擬試験ができるこの参考書ですが、問題の良質さとコスパの良さが挙げられます。

まず問題の質は、公式問題集に引けをとらないです。解説もわかりやすく、何周もする価値あります。

コスパについですが、なんとこちらAmazon Kindle Unlimitedに入っていれば無料で見ることができます。

本屋で購入しようとしたら3000円近くかかるのですが、Kindle Unlimitedは月980円、しかも初月は無料なので、加入した月にこの問題集を舐めまわしてしまえば、実質無料です。

僕は普通に書籍で買ってしまいました。つらい。

まとめ

おすすめの問題集を3+1種類紹介しました。

どれもAmazonで検索すればベストセラーと表示される、評判にも定評のある超優良本です。

僕はお金をかけていろいろな参考書を買ったのですが、本当に上記の3冊は学習効率が段違いです。

逆に、「これ1冊でOK」とか謳っている参考書は、そこまで良質だと思えなかった記憶があります。

(もちろん、TOEICの点数を効率的に上げるという点で紹介したものなので、英語学習と言う観点から見れば、他にも良い参考書はたくさんあると思います。)

英語学習においてTOEICは、最初の1ステップに過ぎないと思います。効率の良い勉強法で、さらっと目標点数を乗り越え、次のステップに進みましょう。

AtCoder水色になるまでにやったこと

f:id:dalekspritner:20200514144825p:plain

atcoder

 

らぴおです。

ブログの下書きを覗いたら、約一年半前の書きかけを見つけたので、供養してあげたいと思います。

 

AtCoderで水色になった

2018/12/8のAtCoder Beginner Contest 115で水色コーダーになることができました。

卒研と並行してやってた感じですが、隙間時間を見つけてコンテストに参加し続け半年ほどかかりました。

 

 

 

水色になるまでにやったこと 

緑からなかなか水色に上がれない方向けの内容になります。

 

1. 問題埋め

いろいろ含めだいたい600問くらい解いたみたいですが、緑から水色になるまでに経験値として役立ったと思う問題集を列挙しておきます。

  • AtCoder 300 ~ 400, 昔のARC B, ABC CD

https://kenkoooo.com/atcoder#/table/daleksprinter

  • JOI 難易度5, 6

https://joi.goodbaton.com/?aoj_id=daleksprinter&atcoder_id=daleksprinter

  • yukicoder ☆2 ~ 3

https://yukicoder.me/users/5915/submissions

https://yang33-kassa.jp/Codeforces-Problems/?user=b1015120

  • 蟻本初級編練習問題

 

これらの問題をたくさん埋めていたら少しずつ典型を吸収することができ、競プロ的な考察ができるようになる気がします。

 

2. ライブラリの作成、テンプレの整備など

新たに問題が解けるようになるって訳ではないですが、よく使用するようなアルゴリズムや関数なんかは、事前に準備しておくと、バグも発生しないですし、問題を解くスピードが上がります。

AtCoderに関して言えば、数学系の問題が多いので、整数論や、組み合わせ系のライブラリが役立つことが多かったような印象です。

コンテスト中の時間に余裕を持たせるためにもしっかりやっておきましょう。

 

 3. 覚えた典型のアウトプット

以前はこのブログに僕の解いた競プロの問題について記事を書いていました。

(ほぼ雑記だったし、今は消してしまっています。)

問題を解いて、解法や典型だと思った部分を、解けなかったときの自分に説明するように日を改めてアウトプットすると、コンテスト中にテクニックを思い出せるようになります。

 

まとめ

AtCoderで僕が水色になるまでに解いた問題や練習方法の紹介をしました。

もちろん元々の数学力などもレートの遷移に影響するためかなり個人差がありますが、

僕が紹介したレベルの問題をしっかり理解することができれば、問題なく水色は行けると思います。

(一年半前の話なので、今のレベル感はわかりません。もしかしたら難しくなっている気がします。)

割と緑色の方を対象に書いていたのですが、灰や茶などの始めたばかりでどう勉強すればいいかわからないといった方は、まずはABC-Cを解くことを目指しつつ、以下の参考書などを使って典型を補っていく方法などが良いと思います。

 

 

プログラミングコンテストへの参加と練習は、エンジニアにとって良い筋トレだと思います。目的にせず、かといって怠らずに取り組み、エンジニアとしての地力を上げていきましょう。

【就活】コーディングテストのある企業と対策

f:id:dalekspritner:20200512201354j:plain

らぴおです。

僕は21卒のWebエンジニアを志望してインターンや就活の選考を行いました。

その過程でコーディングテストのある企業もいくつか受けたので、少しでも今後同じ業界で就活を行う方の役に立てるように、情報を残しておきたいと思います。

コーディングテストが実施される企業

僕が受けた(コーディングテストの選考があった)企業

↑難

↓易

その他コーディングテストが実施されることを知っている企業

プログラミングテストでの選考も可能な企業

  • teamLab

一応僕が知っている範囲だとこんな感じです。(他に知っている方がいたら教えてください)

体感として、ある程度有名なWeb系の企業だと、コーディングテストが必要な割合は3、4割な気がします。 どちらかというと、Github上の成果物やチーム開発経験などが重視されることは間違いありません。 しかし、コーディングテスト自体はそこまで難しくなく、対策を怠って足切りをくらってしまうと非常にもったいないです。

個人的に、これはやっておいた方がいいかもと思う対策をまとめておきます。

AtCoder Beginner Contest のA, B問題

このくらいは正直できて当然という感じだと思います。標準入出力やプログラミングテストの慣れにもなります。一番得意な言語で解いてみましょう。

atcoder.jp

アルゴリズム・データ構造の復習

結構ダイレクトなアルゴリズムの知識とか聞かれたこともありました。一度目を通して理解しておくといいと思います。(ソートや木構造とか)

アルゴリズム図鑑 絵で見てわかる26のアルゴリズム

アルゴリズム図鑑 絵で見てわかる26のアルゴリズム


逆に個人的にあまり良い対策ではないと思う方法もまとめておきます。

Paizaのスキルチェック

就活サービスとしては良いと思いますが、コーディング試験対策には向いていません。 なぜかというと、模範解答が無いため、復習ができないためです。

ABC-D以降

一般的な企業ではかなりオーバーキルです。逆にSmartNewsやLineといった企業はこれでも不安です。

まとめ

コーディングテスト自体はそこまで難易度の高いものでは無いですが、標準入出力や計算量、アルゴリズムなどに不慣れで、良いパフォーマンスを発揮できなかったらもったいないです。

もし上記の企業やその他コーディング試験が実施される企業を受ける可能性のある方は、AtCoderや本などで確認しておきましょう。

(ちなみにですが、言語については割と限定されていることもあるのでお気をつけください。 Pythonだとどこでも使えた気がします。)

また、勉強したことを生かして、PaizaやAtCoder Jobs、Athleticsといったサービスから応募することにより、ある程度コーディング力に保証を持たせたり、一部選考スキップなどの恩恵を受けることも可能になるので、是非視野に入れてみてください。

ISUCON9予選問題に挑戦する

isucon-logo

isucon-logo

GW中にちょいちょいISUCON9の予選問題に取り組んでみました。

 パフォーマンスチューニングとしてやったことを残しておきたいと思います。

 

環境

https://github.com/matsuu/vagrant-isucon

こちらを利用してvagrantでstandaloneな構成を構築しました。

実際の予選はマシン3台の構成で、おそらくスペックも異なると思うのですが、今回は1台でできる限りのことをやったという感じになります。

使用した言語はGoになります。

 

成果物

https://github.com/daleksprinter/isucon9-qualifier-golang

一応自分のリポジトリを貼っておきます。

 

やったこと(かなり他の人の記事とかを参考にしました。) 

1. getTransactionsのN+1潰し

pprofを用いてプロファイリングしたところ、getTransactionsが遅いようでした。

コードを読んでみると、4つくらいN+1が発生しているのがわかりました。

とりあえずItemとCategoryとUserをjoinしておこうと思って、SQLを修正しました。

https://github.com/daleksprinter/isucon9-qualifier-golang/commit/7b59ff7e8a306215b01b00ca59f8b7b78b1ebb9e

書いている途中に嫌になりました。

 

2. Categoryを埋め込む

Categoryの更新が発生しないことに気がつき、メモリにキャッシュしようとしました。

けど解説なんかを読んでいると、コードに埋め込んだ方がいいことに気がつきます。

https://github.com/daleksprinter/isucon9-qualifier-golang/commit/80dad1384cb2b90412dc73ccf7be16768481f02f

それに伴い、1の修正をきれいに改善します。

 

3. UNION句を用いた高速化

getTransactionsのWHERE(`seller_id`  = ? OR `buyer_id` = ?)という書き方だと、indexが効かないらしくて、修正しました。

SELECT * FROM items WHERE seller_id = ?

UNION

SELECT * FROM items WHERE buyer_id = ?

というように修正したら良いそうです。

https://github.com/daleksprinter/isucon9-qualifier-golang/commit/e0c603688c1895311c36c56b9f356b0b052c29d8

 

4. Userをインメモリ化

sync.RWMutexを用いてMapを安全に処理します。

https://github.com/daleksprinter/isucon9-qualifier-golang/commit/ba768ade6d8c16b5ff491fa5edc79371c5d41099

それに伴ってまたSQLも修正

 

参考 https://qiita.com/TsuyoshiUshio@github/items/c3234f3705949d8cf413

 

5. getTransactoins内の残りのN+1をなくす

https://github.com/daleksprinter/isucon9-qualifier-golang/commit/9aca44a9732bcca2cd198e37104bbb8cdacf0378

 

6. 外部APIへの通信を並列、非同期処理

これがgetTransaction内の最後の修正です。

https://github.com/daleksprinter/isucon9-qualifier-golang/commit/f807b53d0e6dd3a3117fe59c80927ee26a99c547

一番点が上がった改善でした。

 

マジでGoの並列処理勉強しないといけないなと思いました。 

Go言語による並行処理

Go言語による並行処理

  • 作者:Katherine Cox-Buday
  • 発売日: 2018/10/26
  • メディア: 単行本(ソフトカバー)
 

 ↑欲しい

 

7. postBuyの外部APIアクセスも非同期に

https://github.com/daleksprinter/isucon9-qualifier-golang/commit/7215f25e3afb1a72f012dca584d1224e0c7225bb

 

8. その他

Index貼ったり、インメモリ化した部分のSQLしました。

UserやCategoryをインメモリ化したので、全体のSQLも修正しようとしたのですが、

SELECT ~ FOR UPDATEになっているクエリを消して、syncでメモリ参照しようとするとベンチが失敗してしまいました。ロック周りの問題らしいのですが、よくわからず...

 

結果

最終的に7500点くらいになりました。

 

学び

・N+1の改善はjoinで結合して持ってくるだけでなくIN句を用いるとわりとすっきりするかも

・WHERE(`seller_id`  = ? OR `buyer_id` = ?)はIndexが効かない。(Indexについて要復習)

・並列、非同期処理の勉強が必要

 

感想

3台構成で続きやりたい。

 

 

AWSのハンズオンに参加した

先日うちの大学でVoyage Group主催のAWSハンズオンに参加しました。

 

AWSは何もわからなかったので、とりあえずこれを片手に持っていきました。

Amazon Web Services実践入門 (WEB+DB PRESS plus)

Amazon Web Services実践入門 (WEB+DB PRESS plus)

 

 

約2時間の勉強会で、30人くらいはいたと思う。みんなAWS触ってみたかったんだろうな。

 

やったこと

f:id:dalekspritner:20190522200745j:plain

aws-handson

上記のようなVPCネットワークを実際に構築してみようという内容でした。

(draw.ioで作成しました。雑でごめんなさい。)

 

VPCたてて、インターネットゲートウェイを設定

・2つのアベイラビリティーゾーンで、EC2(パブリックサブネット) + RDS(プライベートサブネット)の構成を作成

・S3でstaticなファイルを扱えるようにする

・ELBでアクセスの負荷を水平分散

 

みたいなのが大まかな流れでした。

 

感想

EC2やS3とかは使ったことがあるし、VPCやインターネットゲートウェイの話なんかもそのついでに調べたりしたので、一応知ってはいたんですが、実際に負荷分散(水平、垂直)を意識したネットワーク設計は初めての経験だったので、非常に満足しました。

 

かなり急ぎ足の印象だったんですが、意外とB1, B2の人とかも多くて、しかもしっかりついてきていたので、後輩もすごいなって思っていました。(僕がそのくらいの時なんか、バイトしたり遊んだりって感じだったんだけどな(殴))

 

もっといろんな勉強会がうちの大学で開催されるようになってほしい(懇願)

そのあとの講師の方との飲み会も非常に楽しめました。