Web系に転職したい人の勉強記録

Web系に転職したいなーと最近たまに思うようになったので、それ向けて勉強を始めた。

まあ勉強なんて転職してからでもいいじゃない説はあるけど、損はないよね。多分。

なんとなくイメージとして、

  • 一通りの分野に常識的な知見があること
  • 時間かければそこそこのものが作れる

ってことが結構重要なのではないかという気がしているので、まずは前者の一通りの知見を身につけるべくお勉強をしていく。

とりあえずデータベース設計、API設計、インフラ設計、アルゴリズムかなぁと思ったので一冊ずつ本を選んでみた。

 

1.データベース実践入門

 業務でsqlのクエリを書いたりはするものの、正直なんとなくで書いていたのでデータベースが何なのかすらよくわかってなかったりするので下記を読了。

データベースは集合演算であるということ、効率的に集合演算を行うためには、DB設計が重要であること。が書かれている。とりあえずリレーショナルモデルの大事さはわかった。

わかったのだけど、正規化が必要って事実だけ頭に止めておけば、実務的にはフレームワークのmodels設計とかクエリの書き方とかのほうが重要度が高い気がする。別途勉強しなきゃなぁと思った。

2.Web API: The Good Parts

 APIの設計に関する本。読んでみると内容的に知ってることが多かったので流し読み。

Web API: The Good Parts

Web API: The Good Parts

 

 結局これもWebフレームワークの使い方のほうが重要度高いのではという気がした。

3.マイクロサービスアーキテクチャ

  最近良く聞くマイクロサービス。今の業務でもAPIサーバが大きくなってきて、サーバを分離したりしているのだけど、いまいち分離の方針がピンと来なかったりでもやもやしたので読んでみた。

マイクロサービスアーキテクチャ

マイクロサービスアーキテクチャ

 

 のだけど、ちょっと内容が抽象的で何を言っているのかよくわからなかった。

サーバの機能をどこで切り分けるか、サーバ間連携は同期か非同期か、等、書かれていることが重要なのはなんとなくわかるのだけど、さっぱり頭に入ってこない。

4.珠玉のプログラミング

珠玉のプログラミング 本質を見抜いたアルゴリズムとデータ構造

珠玉のプログラミング 本質を見抜いたアルゴリズムとデータ構造

 

 はるか昔、大学生の頃にアルゴリズムとデータ構造の授業を取った気はするのだけど、実際にコーディングってほとんどしたことないんですよね。いやしてたのかもしれないけど頭から抜けている。業務でスーパーアルゴリズムを活用しなきゃいけないシーンってあんまりないと思ってるんですけど、アルゴリズムに強いプログラマってかっこいいよね!って気はするので一応勉強。

 

 

1,2読了、3放置、4現在進行系。

やっぱり昨今のデータベース設計にしろAPI設計にしろrailsの影響をめちゃくちゃ受けている気がするので、次はrubyrailsの勉強を本格的にしたほうがいいのかなぁという気分。

ちょろちょろチュートリアル読んで動かしていたりするのだけどruby全くよくわからんです。

ryzen 7 1700でubuntu17.04マシンを組んでみた話

ryzen 7は3GHz 8コア16スレッドで値段4万以下やねんで!!!!!という心の声に負けてPCを組んで環境構築した。税込み9万しなかった(確か)。

ハードウェア構成

  • CPU: Ryzen 7 1700
  • メモリ: DDR4 PC4-19200 CL17 8GB × 2
  • マザーボード: PRIME B350-PLUS
  • グラフィックボード: Raden R5 230
  • SSD: SDSSDA-120G-J26
  • 電源: SST-ST55F-G
  • ケース: Fulmo.Q ECA3360

グラフィックボードとケースをめちゃくちゃケチった。(どっちも3000円くらいの安物)

グラフィックボードに関しては今のところ画面が映れば文句ない。GPUで何か計算したくなったらちょっといいの買おうかな。

ケースは、作りが雑&中のスペースが狭くて、電源の位置を調整しないとマザーボードが入らなくて焦ったけど、デザイン的には結構気に入っている。小さくて軽い。

何か配線を間違えていたのかマザーボードは通電するのにCPUクーラーが回らなくて焦ったけど、配線し直したら普通に問題なく起動。

ソフトウェア構成

Arch linuxをインストールしようとしたのだけど、途中で/bin/bashが見つかりませんみたいなエラーが出てよくわからなかったので断念。情弱悲しい。

結局いつものUbuntuに落ち着いたのでした。私は職場でも家でもUbuntu

  1. ハードでもソフトでもハマりどころが少ない。Ubuntuで解決できなきゃ他でも大体厳しい。ネット上に情報が多い。
  2. 仕事の鯖も開発PCも家のPCもUbuntuに統一しておけばディストリビューションごとの設定の違いなどを意識しなくて良いので楽。

今のところ下回りにそれほど興味がないので楽なのがいい。
というわけで人権がいくらか回復しました!頑張ってコード書くぞー。

ビットコインの自動取り引きbotを作ってみた話

今流行りのビットコイン。儲かるならちょっと手を出してみるか〜〜〜〜と思って仮想通貨取引所zaifに登録してみました。仮想通貨取引所というのは、お金をコインに交換して株のように売買できるネットサービスです。

最初はシステムがよくわからなかったので200円ほどのコインを売ったり買ったりして0.05円儲かった!とかで喜んでいたのですが、次第に人の欲望はエスカレートしていきます。

 少しずつ取引額を増やしながら遊んでいたのですが、zaifのアカウントページを詳しく見るとなんとapi keysの項目があるではないですか

え、これってもしかしてお手軽にプログラムを書いて取り引きし放題なんですか!?神かビットコイン神サービスか?

botが毎日少しでもお金を増やしてくれるなら私は数年後には億万長者やで!!!!!!とすっかり興奮してしまい、自動取引botを作ることになるのでした。

 

結論からいうと自動取引は儲かるのか? 

私の実力では儲かりませんでした。儲かったらこんな記事書いてません。

あ、儲からないとは言っても、ここ数日の仮想通貨界隈はバブルで爆上げ状態でしたので、ある程度は儲かりましたよ。もちろん。

コインを買ってただずっと持ってるというスタイルに一週間近くbotを回して及ばなかった、という意味です。大変悲しい。

もちろん私が実装できなかっただけで、うまくやれば儲かる方法はあると思いますが。

 

そもそも市場が単調増加の時、最適な行動はただ持っていること

 大した成果が挙げられなかった原因の一つに、私がbotを動かし続けている間、ビットコインがほぼ毎日高値を更新する単調増加状態だったことがあるように思います。

値段が毎日あがるなら、ずっと持っているのが一番です。細かく売り買いしても、タイミングを逃せば売った時より高く買うだけになってしまいますから。

結構上下はしていましたけど、かなり値上がりしていたので、ただ持っているだけが十分効率的だったという気がします。

 

試したアルゴリズム1:コスト平均法

一日1%利益が得られれば、一年間で何倍になるでしょうか?1.01の365乗≒38です。10万円で初めても380万円になります。2%なら1億3000万円になります。

やばい。夢がある。人生勝組への道はここにあったか・・・・。ということで、一日1%から2%の利益率を目標に、アルゴリズムを試しました。

  •  手持ちの資産を24*60=1440分割して、毎分ビットコインを購入する
  • 2%値段が上がったら売却する

これだけです。非常に単純。ただし、このアルゴリズムだと一日にどれだけビットコインが値上がりしても最大で2%しか資産を増やすことができません。

また、このアルゴリズムで大金持ちになるためには、ビットコインの値段が一年間毎日ずっと2%程度上昇していかなければなりません。

一年間でビットコインの値段が今の1.02の365乗≒1300倍になることは到底有り得そうもない。

そこで、下記のように変更しました。

  • 手持ちの資産を4*60=480分割して、毎分ビットコインを購入する
  • 0.33%値段が上がったら売却する

このアルゴリズムは以下のような仮定をおいてます。

  • ビットコインの値段は一年間毎日約0.33%程度ずつ上昇し続ける
  • 一日に6回程度大きく値段を上下する

年間せいぜい0.33%上昇しても、年間で3.3倍程度にしかならない。一年でビットコインの値段が3倍・・・・ないとも言い切れない・・・。夢を見る程度の価値はあります。

でも毎日相場が爆アゲしてる今試すアルゴリズムじゃねーよなーーーーーーーということでボツ。超長期的に見るなら、資産を線形じゃなくて指数で増やすことができるので有効ですけど、目の前の大きな利益を捨てて試すことじゃあない。

 試したアルゴリズム2:とにかく全力で売り買い

自分の持っている全資産を常に全つっぱで売り買いする男気あふれるアルゴリズム。試して見て思ったのですがアルゴリズム1よりは成績がいいです。

でも、ずっと持ってるだけのほうがもっとよかったです。南無。

ランダムに売り買いする非常に雑なアルゴリズムを組んでしまったため、市場が単調増加の時は、買いそびれる確率が高くて危険です。

いずれにしてもある瞬間に値段があがるのか、下がるのかを一定以上の精度で予測できない限り、ずっと持ってるだけ戦術には勝てない気がします。

試したアルゴリズム3:とにかく細かく上下に売り買い

これが一番可能性がある気がします。ビットコインって手数料が非常に安くて、0.01%とかだったりします(zaifの場合はなんと-0.01%)。

今の相場って手数料の割に値段の細かい上下が激しいんですよね。

少しでも値段が上下すれば、売り買いをするという取り引きを超高スピードで回せば、いくらでも利益を出すことが理論上可能・・・・・・・なはず・・・・・。

でしたが、売りそこねたり買いそこねたりした不良債権が溜まっていくせいで、資産の回転率が低くて全然ダメでした。

それにAPIをやたらと叩きまくるのあんまり好きじゃないしね。

まとめ

上記のアルゴリズムはすごくシンプルなので、もう少し改善できないかと思っていくつか調整をしてみたりしましたが、結局ずっと持ってるほうが強いという結論は変わりませんでした

今はまだ、上がり調子下がり調子がすごくはっきりしてるしね。

ある程度の精度で値段の上下を予測する仕組みがないと、単純なルールベースじゃ無理なんじゃないかなーという気がしています(3の方法はもしかしたらその限りではないかもしれないけど)。

 

まあ、まだ他にもいくつかやってみたいことはあるのですが、とりあえず自分の中で結論がでるまで書きません。

ちなみにこれまでのコードはgithubにあるので気が向いたら試して見てください。

github.com