wakasa5の日記

駆け出しエンジニアの勉強録

2020年上半期を振り返る

久しくブログを書いていませんでしたが、2020年も半年が過ぎそうとのことで、この半年間の振り返りをしようと急に思い立ちました。笑


ログの意味も込めて、この半年間プライベートで勉強したことをまとめようと思います。

1月

年初は友人からiOSアプリを作りたいかも!みたいな話を受けて、やったことないけど勉強するか〜と思い、Flutterを勉強していました。


簡単な見た目を作って、Railsをサーバーサイドに立てて、通信するところまでは勉強したのですが、その後友人からちょっと今はまだやらないみたいな話になったので、そこで終わりました。笑


でも、簡単なモックレベルなら結構簡単にできるんだなとわかったし、iOSAndroidのどちらにも対応したアプリをできるのはすごいなと思いました。


何より自分でアプリを作るのは楽しいですね。

2月

2月は、業務で少し複雑なアプリケーションの設計に関わっていたこともあり、設計周りの知識を学びたいと思い、「エリックエヴァンスのドメイン駆動開発」を読みました。


1年前にちょっと読んだ時は、何言ってんだという感じですぐに読むのを諦めてしまったのですが、今回は自分自身、問題意識を持っていたこともあり、かなり響くものが多かったです。


やっぱり本を読む時はなんとなく読むのではなくて、課題意識を持って読まないと、なかなかその意味合いをきちんと把握できないなと思いました。


分厚い本を淡々と読み進めて、ちょうど1ヶ月ほどで読み終えました。

3月

3月は仕事で3末にマストリリースのものが二つあったので、割と仕事で忙しい時期でした。


そのためあまりがっつり勉強はできなかったのですが、少し本を読みました。


1冊目は「Java言語で学ぶデザインパターン入門」で、2月のDDDの続きで、デザインパターンも勉強するぞーと思ってやってたのですが、半分くらい読んだところでモチベーションが続かずやめました。笑


2冊目は「はじめよう!要件定義」という本で、エンジニアだけど、PM側の視点も理解したいと思って読みました。


この本は要件定義の基本のキ、みたいな本だったので、自分のような要件定義とはをあまりよくわかっていない身でも理解しやすく勉強になりました。

ボリュームも少なかったので3日くらいで一気に読み終えることができました。

4月

4月からは履歴プロジェクトの担当になり、社で使っているBitemporal Data Modelと真剣に向き合う必要が出てきたので、使っているGemのソースコードリーディングをしていました。

github.com


最初は概念自体あまりわかっておらず、何やっているかわからねぇ…状態でしたが、並行してActiveRecordのソースを読んだり、手元でbinding.pryを埋め込んだりしながら、勉強を進めて行ったおかげで、最終的には、こういう操作をすると内部的にはこういう処理が行われているのかと理解できるようになりました。


おかげで、社内で履歴周り少し詳しい人的な認知を得られたので良かったかなと思います。

5月

5月は前職の先輩に誘われたこともあって、Rui UeyamaさんのCコンパイラの講座を受けていました。

https://twitter.com/rui314

www.sigbus.info


C言語触ったことないし、コンパイラの勉強など全くしたことがなかったのですが、わかりやすいテキストとgithubのレポジトリのおかげで、そんな自分でも進めることができました。


やる前はあんまり意識していなかったのですが、コンパイラ周りの基礎知識はあらゆるところで生きるなと思いました。


たまたまpryやArel周りのソースコードを読むことがあったのですが、それらの中でも入力された文書を解析して、任意のプログラムを実行するという観点では似ている部分もあり、そういったコードを読むときに当たりをつけやすくなりました。


並行してC言語の勉強も進めて、2つほど読みました。


1つ目は、「苦しんで覚えるC言語」で、こちらで大体の文法や基礎知識を学習しました。

9cguide.appspot.com

2つ目は、「C言語本格入門 ~基礎知識からコンピュータの本質まで」で、こちらの本は内部での動作が比較的詳しく書かれており、実際のメモリでの配置などより詳しくCについて学習することができたので、2冊目にちょうど良い本でした。


Rubyを書いている以上、いずれCと向き合わないとなと思っていたので、勉強できて良かったです。

6月

最近は「Inspired」というプロダクトをいかに作るかみたいな部分に本を読んでいます。

半年を振り返って

こうやってみると、いかに自分が飽き性というか、興味本位でコロコロとやる勉強を変えているかわかりますね…


この一つのことにずっと向き合えない性分といつか向き合わなくてはならなそう…


ただ、下半期も色々と興味のあることをつまんで勉強するのは続けていきたいなと思います。

ISUCONに初参戦しました

tknzkさんにお誘い頂きISUCON予選に初参加しました。

tknzk.hateblo.jp


結果はtknzkさんのブログにもある通り予選敗退


最終スコアは3,910とトップと10倍近い差で、自分の未熟さを思い知らされました…


f:id:wakasa5:20190909223654p:plain
ウデムシlab

やったこと

インフラ周りはtknzkさんにやって頂いたので、自分はアプリケーションのコードを読んで改善点を考え実装する係でした。


その中でやったことは下記

  • .ruby-versionのセット
  • mysql2-client-general_logを導入し、sinatraのクエリログを見える化
  • /new_items.jsonのN+1をどうにかする(ひたすらLEFT JOIN)
  • /new_items/:root_category_id.jsonのN+1をどうにかする
  • /new_items.jsonページ向けに、itemsテーブルに複合インデックスを追加
  • /users/transactions.jsonのN+1の解消

結果的に、JOINとADD INDEXしかしてない…

学んだ点

力の入れどころを間違えない

最初の環境構築とクエリ見える化で1.5時間ほど使った後は、/new_itemsのN+1を潰すのに結構な時間を使いました。


結果的にレスポンスタイムは10倍以上高速化したのですが、最終的な結果では、/users/transactionsのスコアが悪すぎました。


/new_itemsの方は素早く切り上げ、/users/transactionsの方に早めに注力すべきでした

ミスをしない

ベンチマークを走らせてエラーが出た時にステータスコードくらいしかわからず、エラーの原因追求に時間がかかりました


ローカルで再現すればまだしも、ベンチマークでしか再現しないものがあり、それがなぜ起きるのかわからず、2時間くらい費やされた…


revertめっちゃした…


エラーの詳細が全くわからないので、小さい単位でベンチマークを走らせるのが大事だなと思いました。

測定は自分でもできた方が良い

アプリケーションのコード改善は、自分と@ykarakita さんがメインでやっていましたが、ベンチマークを走らせて、スコアの計測はtknzkさんにお任せでした。


ただこれだと、毎回マージするたびに、ベンチを走らせていただき、結果が出るまで自分自身それほど集中できないので、自分で測定までできたらよかったなと思いました。

技術を腹落ちさせる

1番の学びはこれでした。


知識として知っていても、実務レベルで使えるようになっていないと全く意味がないと思いました。


非同期化という言葉や概念は知っていても、じゃあそれをどうやって実現するのか、どんなGemやツールがいるのかを理解して、実装できるレベルまでなっていないと、どうにもならないことを痛感しました


普段はRailsを書いているので、意識しないことが多いのですが、もう少し、自分の使っているツールの中身の理解と、手を動かしてみることが大事だなと感じました

ISUCONを終えて

自分の未熟さを十分に思い知らされましたが、ISUCON自体はすごく楽しかったです!


JOINとADD INDEXで、1000点くらいしか貢献できませんでしたが、それでも自分の改善を入れてスコアを伸びる喜びを味わえてよかったです


来年はパワーアップして、また参加したいなと思いました


ISUCON運営の皆さま、本当にありがとうございました!!

コードを書くときに意識したい、少し低いレイヤの基礎知識

こんばんは、最近勉強が停滞気味のwakasaです。

停滞気味で何かにまとめないと身につかない気がするので、今回は少し低いレイヤの超基礎の知識をまとめていきたいと思います。


対象としては、

Railsある程度書けるようになってきたけど、メモリとかCPUの話とどう関係があるかわからん。」

ActiveRecordで処理を書いていて、先輩にキャッシュ云々言われたけどどういうことかよくわからない。」

SQL発行多いと言われたけど、何が悪いの?」
という半年前の自分のようなプログラミング歴半年程度の人を対象に書いていきます。


私も低レイヤはまだまだ勉強中の身なので、もし認識違いの部分や理解が誤っている点があればご指摘頂けると幸いです。

プログラムの実行に必要なもの

まずは誰でも知っているプログラムの実行に必要な構成要素からです。


PCの主要な要素は下記の三つがあります。

①CPU
②メモリ
③ディスク(HDD/SSDなど)

他にもディスプレイやキーボードとか色々とあるだろう!と怒られそうですが、とりあえずプログラムを実行という観点で見れば、下記三つがあれば実行できます。


この三つは流石にどなたでもご存知だと思いますが、それでは、それぞれはどのような役割があり、どのように実行されるのでしょうか?
とても基本的なことなのですが、半年前の自分はそれすら分かっていませんでした…

ざっくりした実行の順序

プログラムの実行はまずディスクから必要なプログラムのソースやデータがメモリ上に読み込まれます。


そこからさらにCPUに読み込まれ(正確にはCPUのレジスタ)各種命令が実行されます。その結果が、またメモリに書き込まれ、メモリからディスクに書き込まれたりします。


ざっくり概念的に書くと下記のような感じになります。

Overview of instruction

実行速度に影響を与えるもの

ここでRailsを書く上で大きなポイントが一つあります。それは各種アクセスにかかるスピードです。各種アクセスというのは、

CPU ↔︎ メモリ
メモリ ↔︎ ディスク

のそれぞれの間のアクセス速度の違いです。業務でコードを書く上では、最低限アクセス速度の違いは最低限、理解する必要があります。
(自分がわかってなくて苦しんだ)


どのくらい違うのか、こちらの記事によると、メモリにアクセスする場合と、ディスクにアクセスする場合では、最低でも100倍、最大で1万倍近い差があることがわかります。


つまりメモリにアクセスする場合と、ディスクにアクセスする場合ではとてつもない差があることがわかります。


また実際にはCPUとメモリの間にはL1 ~ L3のキャッシュメモリという層があり、その層はメモリより高速に動作し、一度読み出された値を保持してくれたりします。
そのため上記の差はさらに大きくなります。

参考となる図:マルチコアCPU上の並列化手法、その並列性能と問題点


そのためRailsで処理を書くときもこれはディスクアクセスを伴う処理なのか、メモリにアクセスしているのかを意識する必要があります。
特にモデル周りでDBアクセスを伴う処理を書くときはここを気をつけないと、思いがけずかなり時間を取る処理を知らぬ間に書いてしまうことがしばしばあります。

実際にRailsで見てみる(書き込み編)

それでは実際にRailsの実例で見ていきましょう。まずは書き込みです。


こちらは初心者の方でも使ったことがあると思いますが、ActiveRecordのbuildとsaveとcreateの違いです。
例えばUserモデルがあったときに下記のようにすることもあると思います。

user = User.build(name: 'hoge', age: 18)
user.save!

buildだと保存はされず、saveを使うとDBに保存されますよね?そして、createはbuildとsaveを同時に行う、といったように習ったはずです。


それを先の概念で見ると、まずbuildの場合はメモリ上のインスタンスの値が変更されることになります。そしてsaveを行うことによって、DBにSQLが発行されディスクに保存されます。


メモリ上の値はディスクに保存しないと消えてしまうので、もしsaveしないとそのうち消えることになります。そのため消えても良いデータなのか、DBに保存すべきデータなのかはきちんと分けて考えないといけないですし、DBのIndex作成や大量にデータを作成する時は、それなりのディスクへの書き込みアクセスが走ることになるので、リソースに余裕のないプロダクトの場合、CPUやディスクアクセスへの負荷を考える必要があります。

実際にRailsで見てみる(読み込み編)


読み込みの場合は、メモリにデータが乗っているか否かやSQL発行の有無、目的のデータが取れているか、さらに言うと、どのデータをメモリに乗っけて、Rubyレイヤ、SQLレイヤのどちらが処理を担うかを考えなくてはいけません。


そのためにもどの処理はSQLを発行し、どの処理はSQLを発行しないのかをざっくりとでも理解することが重要になります。なぜかというとDBへのアクセスはディスクアクセスになるので、非常に時間を取られるからです。


そう考えるとN+1が何故ダメかわかると思います。毎回ディスクアクセスが走ると待ちが発生しますし、時間がかかりますよね。そのため基本的にはN+1ではなく、一気にデータをメモリ上に取ってきて、Rubyレイヤで順次処理する方が良いというのが理解できると思います。(レコード数や構造、インデックスややりたいことなど条件にもよりますが)


例えば、ブログサイトを作っていて、ブログに紐付くユーザーを取ってくる時、

blogs = Blog.where(status: :published)
blogs.each do |blog|
  puts blog.user.name
end

とするより、

blogs = Blog.where(status: :published).includes(:user)
blogs.each do |blog|
  puts blog.user.name
end

とした方が、includesはデータをキャッシュして読み込んでくれるので、処理が早いということになります。


そうしたディスクアクセスに対するコスト意識が少しずつ必要になってきますし、DBやSQLに関する知識も求められるようになります。
(まさに自分が最近DB系の知識不足を痛感しています…)

終わりに

自分もまだまだ勉強中の身ですが、初心者でも知っておいた方が良さそうな、基礎的な部分をまとめてみました。


参考になれば幸いです。

Railsを学び始めた1年で学んだこと、得たこと

こんばんは!


12月も中旬になり、2018年ももうすぐ終わりですね。今年は1月にエンジニアに転職し、大きな変化を迎えた年でした。


さてRailsを勉強し始めて今月で一年が経ちました。そこで今回はRailsを勉強し始めて1年、エンジニアになって11ヶ月が経ったということで、どういうことを学び、何ができるようになったのかを書いていこうと思います。


エンジニアになったばかりの人で、どうやって勉強していったらいいかわからない方に、少しでも参考になればと思います。

1年前はどんな状態だったか?

一年前は、前職を最終出社して、入社までの1ヶ月の間、会社からRails Tutorialをやるように言われ取り組んでいました。その時どのような状態だったかというと、下記のようなツイートをしていました。

あまりに知識が不足しすぎてるのか、何なのか、なぜ出来ないのか不明な感じになってきてわけわかめ
4:49 - 2017年12月26日

createの際に何故か一部のカラムがnilになるところで3時間くらい詰まってた…
3:25 - 2017年12月27日

ちょっとRailsが裏側でどう動いてるかの解説本が欲しい…なんでこうなるのかがわかんなくてイライラする…今はtestでモデルのbefore_saveが効かなくて、理由が不明
20:02 - 2017年12月27日

Factory Girlが何故かうまくいかないぞ…Rspecでテスト書いたら、UserモデルはふつうにFactory Girlでテストデータ作成できるのに、Relationshipモデルは何故かFixturesの方からテストデータ持ってきてる…なんでだ…
23:54 - 2017年12月29日

もうRailsの挙動が全然わからなくて、何がどうなっているのかわからない状態でした…

そして入社後すぐの時は、

職場の方々が凄すぎて絶望的なまでの差があるので、途方に暮れながら帰ってたけど、途方に暮れてても仕方ないし、目標立てて、計画立てて、一個一個埋めてくしかないんやなと思った。
4:17 - 2018年1月23日

とあまりの自分のできなさに、先輩エンジニアの方にも、どうしたら周りの方みたいになれるのか、背中が遠すぎてわからないですと、泣き言をよくこぼしていました。。この当時は本当に何をどうしたら、いいか途方に暮れていましたね…


それではそういう状態から、どのように勉強していったか見ていきたいと思います。

Railsやgit、Linuxの基礎を学ぶ(12 ~ 2月)

入社して、すぐの時に困ったのは、

・Rails Tutorialを一通りやったものの、実務で使うにはRailsの理解が全然足りない。

・gitのコマンドも開発フローもPull Requestの出し方もよくわからない。

・Linuxコマンドが何をしているのかも、何をやっているのかもわからない。

ということでした。これは実務をやる上では最低限必要なことですが、スクールはphpJavaでしたし、gitによるチーム開発も全く未経験でしたし、環境構築は先生におんぶにだっこでした。そのためまずはここを勉強しました。


この時は下記のような本を読みました。

改訂3版 基礎 Ruby on Rails 基礎シリーズ


入門者のLinux 素朴な疑問を解消しながら学ぶ (ブルーバックス)


GitHub実践入門 ~Pull Requestによる開発の変革 (WEB+DB PRESS plus)


を読んでいました。入門者のLinuxは今でもおすすめだなと思いますが、Railsだと今なら万葉さんの、「現場で使える Ruby on Rails 5速習実践ガイド」、gitだと、「わかばちゃんと学ぶ Git使い方入門〈GitHub、Bitbucket、SourceTree〉」、が良さそうだな〜と思います。


これらの書籍と先輩から丁寧に教えて頂いたおかげで、一応業務をこなすための最低限の基礎の基礎ができるようになってきました。

オブジェクト指向LinuxRubyの理解を深める。Vimを使い出す(3 ~ 6月)

上記を学んだことで、まだまだ先輩におんぶにだっこですが、最低限、業務を進めていくということができるようになってきました。しかし、Qiitaの記事や本にないことはわからない状態で、ネット上に書いていないことを知る必要が業務で出た際に、何もできず先輩に聞くしかない状況でした。


そのような中で、現CTOとペアプロする機会があったのですが、その際にQiitaの記事なんか読まずに公式リファレンスやRailsソースコードを読む癖をつけましょうと指摘されました。


まだエンジニア歴2ヶ月の自分にはそんなことできるわけがないやろと思ったものの、Rubyをしっかりと学ばないとダメだと改めて痛感しました。


そこで読んだのが下記の本です。


メタプログラミングRuby 第2版


Rubyのしくみ -Ruby Under a Microscope-



上記の本は、以前の記事でもご紹介した通り、すごく良い本でした。その結果、Rubyに対する理解が深まり、ソースコードや公式リファレンスに対する抵抗が薄れ、それらをしっかりと読む癖がつきました。


またこの当時、業務を進めていく中で、最低限設計の基礎を知るためにオブジェクト思考を学ばなければいけないと感じるようになっていました。そこで下記の本を読みました。


オブジェクト指向設計実践ガイド ~Rubyでわかる 進化しつづける柔軟なアプリケーションの育て方


こちらは、いわゆる自転車本と呼ばれるもので、自分にとっては少し難解な本でしたが、会社の輪読会と友達との勉強会で繰り返し読むことによって、設計の基礎を学ぶことができました。


今でも設計には苦しみますが、本を読んだことで、自分の中の判断基準となるものができたことで、以前よりはまともなアプリが作れるようになりました。


またLinuxも継続して勉強していて、「新しいLinuxの教科書」を読みました。その中でVimを使っつていたのをきっかけにAtomからVimに乗り換えました。


この頃から、実装については少しずつ一人でも進められるようになってきました。

コンピュータアーキテクチャとインフラへの入り口(7 ~ 10月)


この頃には決められた要件を実装するだけであれば、なんとなくできるようにはなってきましたが、効率的でパフォーマンスの高い実装ができず、そういう点で指摘を受けることが多くなってきました。


しかし、その当時はメモリやCPUの動きについてよくわからず、指摘をされてもイメージができない状態でした。そのためCPUやメモリ、プロセスについて学びたいと思うようになりました。


そこで、まず最初に「Goならわかるシステムプログラミング」を会社の輪読会で読み始めました。しかし、システムプログラミングやコンピュータアーキテクチャ初心者の自分にとっては周辺知識がなさすぎて、腹落ちするまで理解できないことが多かったので、並行して、下記の本を読んでいました。


CPUの創りかた


はじめてのOSコードリーディング ~UNIX V6で学ぶカーネルのしくみ


32ビットコンピュータをやさしく語る はじめて読む486 (アスキー書籍)


コンピュータの構成と設計 第5版 上・下電子合本版


Linuxのしくみ ~実験と図解で学ぶOSとハードウェアの基礎知識


上記の本は全て読みきったわけではなく、一部しか読めていない本もありますが、これらを読んだことによって、メモリやCPU、プロセスについての理解が一気に深まり、今までブラックボックスだった世界が少しはイメージできるようになりました。


低レイヤは、最近の実用性重視の風潮では軽視されがちですが、プログラムはメモリやCPU上で動くことがほとんどですし、FWと比べると変化が少ない領域なので、知っておいて損はなく、長期で使える知識だと思います。


またこの頃から社内のインフラも触らせてもらうことが増え、その際にも低レイヤ知識は非常に役立ちました。


インフラはDockerやkubernetesを触っていたのですが、「プログラマのためのDocker教科書 第2版」を読んで、Dockerの基礎的な部分を学び、あとは先輩に教えていただいたり、公式ドキュメントや記事を読んでインフラの業務を進めていきました。

アルゴリズムとデータ構造(10月 ~ 現在)

最近は「みんなのデータ構造」を輪読会で読んでいるので、ずっとアルゴリズムとデータ構造を勉強しています。


最近Atcoderの初心者用のコンテストに参加しているのですが、競技プログラミングはゲーム性が高く楽しいですね。


アルゴリズムとデータ構造もいわゆるCSの分野で、実務に直結するかと言われれば、そうではないものの、こういうデータ構造で作ると遅くなるよなとか、Rubyの内部ではこういうアルゴリズムで動いているのかなどわかって楽しいです。ますますパフォーマンスに対する意識が高くなりました。笑


また、本がC++で書かれているので、C++も勉強していますが、難しいですね…Goを以前やっていなければ、完全に挫折していた気がします…笑

Railsを勉強し始めて1年経って

1年前は下記のような状態でした。

・Rails Tutorialの内容に書いてあることはコピペで書いたりできるが、中身は理解しておらず、書いてないことはわからない。


しかし、周りの方々に教えて頂いたり、上記で挙げた本や他にも様々な本や記事を読み、一年経って下記のことが出来るようになりました。

・Railsの挙動について、公式ドキュメントやソースコードを読むことが苦でなくなり、中身を知りたいと思えば少し知ることが出来るようになった。


・最低限の低レイヤ知識を理解し、キャッシュや処理内容を理解して、メモリやCPUを効率的に使ったコードを少しは書けるようになった。


・Docker, kubernetes, itamaeの各種.yaml/.rbファイルを書けるようになり、先輩のサポートを得ながらだが、ゼロから環境構築出来るようになった。また詰まっても公式ドキュメントを読んである程度は解決出来るようになった。


一年経ってこれだけか、と思う方もいらっしゃると思いますが、自分なりには精一杯やってきた結果なので、個人としては満足はしています。


職場の周りの方々には、いつも助けていただいてばかりで、Rubyもgitもコマンドも全く理解していない状態から、一年でここまで来れたので、本当に感謝しかないです。


とはいえ、エンジニアとしてはまだまだ鍛錬が足りず、設計も未熟だし、フロントエンドFWは全然触れないし、インフラも助けなしでは出来ない状況なので、来年も今年以上に色々と学んで、成長していきたいと思います。


あと自分のエンジニアとしての方向性も定めていかないとな〜と思うので、せっかく年末年始で長期休暇があるので、そこで考えたいと思います。


最後までお読みいただきありがとうございました!
今年も残り少ないですが、良いお年を!

【金融お悩み相談】海外株式は円建て投信とドル建てETFどちらを買うべきか?

先日、Twitterで金融のお悩み相談受けますというツイートをしたところ、早速一件ご質問を頂きました!

海外株式に投資したいのですが、日本円で投資信託買うか、ドル建てでETFを買うかを迷ってます。分配金再投資したいので、自動でやってくれる投資信託は良いなと思いつつ、リアルタイムで売買できるETFも良いなと思ってまして悩んでいます。

という訳で「金融お悩み相談」ということで、投資や家計など金融にまつわる、ご質問を頂いてご返答させて頂くコーナーを開設したいと思います!


まぁご質問がなければこれで最後になるかもしれませんが、よろしければ最後までお付き合いください。

免責事項

金融系のサイトでよくあるやつですね!一応ご確認!

・本記事を利用して行った投資等の取引による結果については、一切の責任を負いません。
・当記事の情報は細心の注意を払って調査しておりますが、その正確性、完全性、有用性、安全性等について、一切保証するものではありません。
・当記事の作成時と閲覧された時間において情報にズレがあり、見解が変わる可能性があります。記事の日付をお確かめの上、内容を吟味頂くようお願いいたします。

要するに投資は自己責任で行ってくださいということです。

今回の質問の二つの軸

さっそく頂いたご質問を見ていきたいと思います。


今回のご質問は海外株式を円建て投信とドル建てETFどちらで買うべきかという問いですが、これには二つの大きな軸があります。

 円建て ↔︎ ドル建て

 投信  ↔︎ ETF

つまり、円建てのETFやドル建ての投信も実際には存在するので、実際には4つのパターンが存在します。2つの軸それぞれについて、どちらが良いかを考えた上で、購入するのが良いと思いますので、今回はこの二軸について見ていきたいと思います。


それでは上記二つの軸についてそれぞれ見ていきたいと思います。

円建て vs ドル建て

まず「円建て」か「ドル建て」かですが、日本に暮らし円で給与を貰い、そのお金で海外株式を買う場合は本質的にはどちらも同じ行為です。


為替ヘッジ有りの商品を選ぶ場合を除いて、円をドルなどの外貨に変えて、海外資産に投資している点は同じです。唯一の違いは円をドルに変える、ドルを円に変えるを誰が行うかということです。


円建ての場合は、証券会社もしくはファンドの方でそういった為替の取引を行ってくれていることになります。一方ドル建ての場合は、こちらの方でやらなければなりません。ただ、一般的には国内証券でもドル建て資産を購入するときは、為替取引を代行してくれているところが大多数なので、実際に自分で為替取引を行う場合は稀でしょう。


例外的なパターンとしては、海外の証券会社に自ら申し込む場合は、入金前に為替取引をする必要があるかもしれませんが、一般的には国内の証券会社を使うと思うので、今回は考慮しません。


その結果、円建てとドル建てでは、コスト面で下記のような違いがあります。

円建ての場合
 = 売買手数料 + 信託報酬等
ドル建ての場合
 = 売買手数料 + 信託報酬等 + 為替手数料

一般的にはドル建ての資産を購入する場合は、売買手数料が高くなる傾向があり、為替手数料も取られるので、円建ての方がコスト面ではメリットがあると言えます。
(為替手数料がない分、信託報酬が高い場合はある)


ただ円建ての海外 ETF投資信託は限られるので、どうしてもドル建てしか存在しないETFや投信に投資したいという場合は、ドル建てを検討する価値はあると思います。


また日本の財政破綻や極度の円安の可能性の観点からドル建てで持っておいた方が、良いという話もありますが、国内で円が流通しなくなると言うことがない限り、実質的に外貨建てで持っていることと同じなので、円建てでも良いと思います。
(為替ヘッジ済みの商品を除いて、円安になると資産価値が上がるため)


参考
www.nikkei.com


もちろん将来はドルの国に移住するからその資金にするんだという場合は、ドル建ての方が良いですよ。そこはご自身の人生プランと相談ですね。

ETF vs 投信

こちらに関しては結構難しい問題です。完全にその人のタイプによるからです。


まず投信が適しているのは、ほったらかしで日々相場を気にする事無く積み立てたいタイプの人です。
投信の場合は、一気に購入するというよりは、毎月一定額をドルコスト平均法的に購入するパターンが多いでしょう。それに税制優遇がある、iDeCoや積み立てNISAで、購入するというパターンが多いと思います。


また質問にもある通り、分配金の再投資を投信は自動でやってくれるので、その点もほったらかしたい人はメリットが大きいです。



一方、ETFが適しているのは、日々投資をしていて、ある程度まとまったお金で売買している場合です。


投信は最近はノーロードといって売買に関する手数料がかからない商品が多いですが、ETFは普通に株式を買うのと同じなので、売買手数料がかかります。


一般的には売買手数料は少額の場合より高額で投資する場合の方が、安く済む傾向にあります。そのため、少額で売買を繰り返していると手数料がバカになりません。特に海外ETFを購入する場合は、ネット証券であってもある程度のコストは掛かるので、その点は注意です。また分配金の再投資もありません。


一方、ETFは上場していて、東証上で取引されているので、リアルタイムに取引ができます。そのため相場の急変時でも対応が可能です。
(ただし、1日の取引額が少ないマイナーな商品の場合は、刺さりにくい場合があります。)


また一般的に、信託報酬が投信と比べて安い傾向にあるので、その点でもメリットがあります。


さらに積み立てNISAの場合は40万円の非課税枠で投信(一部ETF)しか投資ができませんが、NISAの場合は120万円分の非課税枠があり、NISAは株式も購入できるので、日常的に株式売買がある人が購入するのであれば、ETFが良いでしょう。
(NISAと積み立てNISAはどちらかしか選べない)


そのため自分がどちらのタイプか考えた上で選択すると良いと思います。

最後に

いかがでしたでしょうか?


最終的には自己判断になるので、自分の性格や投資スタイルに合わせて慎重に選択していただければと思いますが、参考になれば幸いです。


また上記では少ししか触れませんでしたが、4つのどれを選ぶかで買える銘柄も変わりますので、その点も留意しながら軸選びをして頂ければ良いかと思います。


この2軸を選んだ後にも、銘柄選びという(人によっては証券会社選びも)、ある意味大変、ある意味楽しい、作業がありますので、後悔のない意思決定を頂ければと思います。


また他に質問や相談があれば、いつでもご連絡ください。


最後に参考までにお役に立ちそうなサイトを貼っておきます。


・上場している外国株の銘柄一覧(≒円建てETF
→信託報酬が0.15%のものから1%以上のものまでたくさんあるので、比較に使用頂ければ。
 またコードを押すと銘柄詳細が見れるので、売買高は要確認が必要です。
 あまりに売買高が低いと現金化したい時に思うような値段で刺さらない可能性が高いので、その点も見ておくと安心です
www.jpx.co.jp


・NISAと積み立てNISAの違い
→文中でNISAと積み立てNISAの話が出てきましたが、違いを詳しくは説明していません。
 詳しく知りたい方は下記のサイトが参考になるかなと思います。
media.rakuten-sec.net


・世界の株価
→やや玄人向けというか、投資をしている人の間ではよく知られているサイトですが、海外株式も含めたチャートを見ることができるサイトです。
 前職時代、時間が余っていた私は毎日すきあらば眺めていました。
 現在は以前より頻度は減っていますが、毎日は一応見て、株式や債券、仮想通貨などの動向を眺めて、チャンスがないか見ています。
 海外ETFを購入して海外株の動向が気になった時に参考ください。
世界の株価

Ruby入門者から初心者になるためのオススメ本

最近はもっぱらパタヘネ本とはじめて読む486で、コンピュータアーキテクチャばかりを勉強しており、自分がどこに向かっているかよくわからない今日この頃のtakwakです。


さて、私もRailsエンジニアになって約8ヶ月が経ちました。8ヶ月経ってもわからないことだらけで、まだまだ勉強不足な自分ではありますが、入門者から初心者くらいにはなれてきたのかなと思います。


そんな初心者の自分が送る、入門者から初心者になるためのRuby勉強法をお伝えできればと思います。

Ruby入門の道筋

最近はプログラミングの入りとして、Rubyは非常に人気ですね。


Twitter上でもRubyRails勉強中の方がたくさん増えているのをひしひしと感じますし、最近は勉強するだけでなくサービスも作るのが当たり前みたいになっていて、末恐ろしい限りです…


特にRubyは初学者向けには非常にレールが敷かれており、


ProgateでRubyRailsを勉強

チェリー本(プロを目指す人のためのRuby入門)を読む

Rails Tutorialをやりながら、チェリー本を参照する。


という流れが割と鉄板になっているように思います。


一方でそこから先の学習法というのはあまり語られず、色々な初学者のアカウントが就職して以来、ブログ更新やTwitter更新が途絶えるのを見てきました。(恐ろしい…)


という訳で、本日はようやく入門者を脱して、初心者くらいになった自分が考える、入門者から初学者になるための学習法をお伝えできたらと思います。

(以下、自分が所属しているような自社でwebサービスを運営している場合を想定しています。受託は経験したことがないのでわかりません。)

趣味と実務の違いは何か

まず趣味でやっている時と、就職してからの大きな違いは、コードを書くことと読むことの比率が大きく変わることだと思います。


趣味で勉強中の時は、自分の作りたいものがあって、そのために色々と調べたりはあるものの、基本はコードを書くというのが多いと思います。


一方で実務に入ると、既存の機能改善をする際はもちろん、新規機能開発であっても、既存のシステムとの兼ね合いがあるため、コードを読んで理解する時間が非常に多くなります。


またRailsの機能をちゃんと使いこなそうと思ったら、必然的にRailsソースコードを読むことになりますし、gemもちゃんとReadmeが書いてなかったりすると、ソースコードを読んで理解する必要があります。


下手するとコードを読むだけで1日が終わることもあります。


ではその際に、現場やRails、gemが何で書かれているかというとRubyです。


そのため実務でやっていくにはRubyに対する、一定程度の理解がマストになります。

より深くRubyを理解するための2冊

最初にオススメするのはメタプログラミングRubyです。


メタプログラミングRuby


タイトルにメタプログラミングとありますが、内容の多くはRubyを理解する上では極めて重要な、メソッドや定数の探索、ブロック、クラス定義、特異クラスなど、ソースコードを読む上ではマストと言える内容が比較的わかりやすく説明されています。


わかりやすいといってもある程度入門が終わっており、Rubyでコードをある程度書いた経験がないと難しいので、入門者にはオススメしません。


僕自身、既に3周くらいはしていますが、まだまだ理解が足りないところも多いです。しかし、これを読んだ後と前ではソースコードの読みやすさが格段に違います。これを読む前はRailsソースコードは絶対に読むのは無理だと思っていましたが、少しくらいは読めるようになりました。


メタプログラミングRubyを読んで、ある程度理解した後に、オススメしたいのがRubyのしくみです。


Rubyのしくみ


Rubyがどのように実行されるのか?クラスやオブジェクトの中身は実際はどういうものなのか?などなど、メタプログラミングRubyで理解した、Rubyの中身がどうなっているかを非常にわかりやすく理解することができます。


僕もこちらはまだ1/3も理解できていないですが、Rubyに対する理解がさらに進みましたし、プログラムが実行される時にどういうことが起きるのかの端緒を掴めたような気がします。


そこから結局もっと下のレイヤで何が行われているか興味を持つようになって、今に至るのですが…

これらの本を読んだ後は?

これらの本をある程度理解できれば、Rubyのコードが読みやすくなってくると思います。


もちろん最初からスラスラとは行きませんし、なかなか理解できないところもあると思いますが、そういう時は本を読み直したり、周りの先輩に聞いたりして、少しずつ読めるようになっていくと思います。


そうなるとわからないことがあった時にも、qiitaやブログに書かれた適当な記事を読まずとも、Rails本体やRubyのリファレンスマニュアルなど、しっかりしたソースを読んで理解できるようになります。

(僕は某プログラミングスクールのRailsのとあるメソッドの記事を鵜呑みにして痛い目に合いました…適当な記事を読むだけでなく、公式ドキュメントをしっかり確認しましょう。)


Railsのメソッドを調べる時はこちらのサイトがオススメです。検索して、読んでわからなければgithubに飛んでソースを読むと良いです。

Ruby on Rails API


Rubyのメソッドはご存知るりまですね。

オブジェクト指向スクリプト言語 Ruby リファレンスマニュアル (Ruby 2.5.0)


こうやって少しずつ、公式ドキュメントを読む比率を上げていけば、入門から初心者くらいにはなれると思いますし、実務でも自分で調べて実装を進められるようになります。

終わりに

どうでしたでしょうか?入門者から初心者になれそうでしょうか?


もし他にもっとオススメの書籍等あれば、教えて頂けると幸いです。


最後までお読み頂きありがとうございます!

Goで実装するLinuxコマンド ~ cat拡張編 ~

前回の続きで、catコマンドを拡張する試み行いました。


スターティングGoを読んで、少しGoの基礎知識を入れましたが、全然まだまだ理解できていないです…笑


つらいし難しいけど楽しい…

複数ファイルの対応

前回のcatコマンドは、単体ファイルしか読めませんでした。


それだとconcatenateではないですよね…笑


というわけで複数ファイルを読み込めるようにしました。

package main

import (
	"io"
	"log"
	"os"
)

func main() {
	filenames := os.Args[1:]
	files := make([]io.Reader, len(filenames))

	for i, filename := range filenames {
		file, err := os.Open(filename)
		defer file.Close()
		files[i] = file
		if err != nil {
			log.Fatalln(filename, "is empty")
		}
	}

	reader := io.MultiReader(files...)
	io.Copy(os.Stdout, reader)
}

前回はio.Readerを使いましたが、今回は複数ファイルを読み込めるように、io.MultiReaderを使っています。


また前回はos.Args[1]だけを読み込んでいましたが、os.Args[1:]でos.Args[1]以降のスライスを切り出して、それぞれをos.Openで開いています。


また前回はlog.Fatalln()を使っていましたが、埋め込みを使いたかったので、log.Fatalf()を使うようにしました。


log.Fatal系ってPrintに対応した感じになっているみたいですね。

(Println <=> Fatalln, Printf <=> Fatalf)

参考:https://golang.org/pkg/log/#Fatalf


上記の実装で複数ファイルでも動くようになりました。

オプションパラメーターを渡す


当たり前ですが、Linuxコマンドはオプションを渡せますよね。


Goにはflagという便利なものがあるので、オプションパラメーターも比較的簡単に扱えます。


kubernetesやdockerのコマンドもこれ使っているのかな〜と思ったり…?


catコマンドは本来的には色々とパラメーターがありますが、今回は一番簡単そうな-nオプションを実装してみることにしました。


ちょっとオプションのところが拡張がつらい実装ですが…

package main

import (
	"bufio"
	"flag"
	"fmt"
	"io"
	"log"
	"os"
)

var (
	numOpt = flag.Bool("n", false, "add num of column for n option")
)

func main() {
	flag.Parse()

	filenames := flag.Args()
	files := make([]io.Reader, len(filenames))

	for i, filename := range filenames {
		file, err := os.Open(filename)
		defer file.Close()
		files[i] = file
		if err != nil {
			log.Fatalf("%s is empty", filename)
		}
	}

	reader := io.MultiReader(files...)
	if *numOpt == true {
		scanner := bufio.NewScanner(reader)
		i := 1
		for scanner.Scan() {
			line := scanner.Text()
			fmt.Println(i, line)
			i++
		}
	} else {
		io.Copy(os.Stdout, reader)
	}
}

flagオプションを使って、オプションを取り出せるようになっています。


ちゃんと-hオプションで設定したhelpが見れるのはすごい…flagすごい…
(英語が適当…笑)

$ ./cat -h
Usage of ./cat:
  -n	add num of column for n option


また今回は行番号を頭につけるためにbufio.NewScanner()を使っています。


それで頭に行番号をつけて一行ずつ標準出力に出すようにしています。


これで-nオプションをつけて、複数ファイル渡しても、ちゃんと番号付きでラインが出るようになりました!

$ ./cat -n sample-txt/cat.txt sample-txt/dog.txt
1 cat
2 dog
3 egg
4 dog
5 dog
6 dog

終わりに

まだまだGo言語慣れていないですが、こうやって調べながら試行錯誤するのは楽しいですね。


rebuildのruiさんの回を聴きながら楽しく作業していました。笑


あとオプション作るの大変なんだなと改めて思いました。。


Linuxはどうやって複数オプション処理しているのか気になる…


今日はこの辺で。


最後まで見ていただきありがとうございました!