【Rails】ランキング機能を作ってみた【find_each】

最近仕事でランキング機能を作ったのでアウトプットしておこうと思います。

  • rails学習中の人
  • railsを使って仕事をしている人

実装したいこと

Userモデルにinteger型のlevelというカラムがあって、levelが高い順にユーザーを並びかえてランキング順に表示したい

 

       Userモデル                              

id       level         id      level

1        100                                 4       500          

2        400                 →             2      400

3        200                                  5      300

4        500                                  3      200

5        300                                  1      100

   これを          こうしたい

 

Controller

まずはランキング順に並び替えましょう

@user = User.all.order(rank_point: :desc)

これで上の右側みたいな並び替えられた状態でユーザーを取得できます。

 

次に順位を求めましょう

@ranking = 1
@user.find_each do |user|
  @ranking += 1
  if user.id == current_user.id
   return @ranking
  end
end

 

まずは@rankingの初期値を1にします。

@userをfind_eachで@rankingを +1しながら回してuser.id == current_user.idが一致したときの@rankingを返せばこれがそのユーザーの順位ということになります。

 

これを見たときにeach_wich_indexでいいじゃん!って思った方もいるでしょう

@user.each_with_index do |user, i|
  if user.id == current_user.id
   return i + 1
  end
end

確かにこれでもいいのですがユーザー数が何十万とか何百万とか大量になったときに、メモリに乗りきらずに大変なことになる可能性があります。

詳しくはこの記事を御覧ください。

blog.toshimaru.net

 

ランキング機能をもっといい感じに実装できる方法があったらぜひ教えてください!

ありがとうございました。それではまた。

 

最近やってること【ざっくりと】

生存報告と備忘録を兼ねて久しぶりに書いてみます。

入社して1ヶ月くらいのエンジニアが何をやってるのか、少しでも参考になれば幸いです。めちゃくちゃ雑に書くので適当に読んでください。

 

最近やったタスクは新機能の開発です

ざっくり言うと、ユーザーの所持しているアイテムと引き換えにユーザーに紐づくお金が増える機能です。

 

やったことを順番に書いていきます。

 

①まずは更新の履歴を残すモデルを作ります。

誰が、いつ、アイテムをどのくらいの数引き換え、どのくらいのお金が増えたかを記録しておくためのモデルです。マイグレーションファイルを走らせます。

②モデル間のリレーションを軽く書いて、今度はルーティングを設定します。

今回はresoucesのindexとcreateアクションを使いました。

③続いてはビューを作っていきます。デザイン案を見ながら作っていくのですが、今回は他のページに近いのがあったので足したり引いたりしながら時間短縮。CSSも適当に書いていきます。レンポンシブ対応もします。レンポンシブ対応も前までやったことなかったけど、コード見てたらなんとなくわかってきました笑

④続いてはコントローラーの処理を書いていきます。indexでは4つくらい変数を設定したのですがこれが結構苦戦。使ったことないメソッドを4つくらい使いました。

⑤createアクションを書いていきます。ここはトランザクションが必要でデータのロックも使いました。ここのアルゴリズムを考えるのに苦戦。eachで回してる中で更にx.timesで回す処理で落ち着きました。

⑥staging環境で何回か動作確認。

 

作業開始からここまで2日くらいで、結構幅広くやらせてもらってます。自学レベルでも経験できないレベルでいろいろなことを経験できてます。正直わからないところは結構先輩に頼っちゃってます。もう少し自走できるように頑張ります。

DockerをMacにインストールするやり方

Dockerのダウンロード方法をまとめてみました。

Dockerやってみたいけどやったことない、なんかよくわからないっていう人向けです。(自分も含めて)

Dockerのダウンロード方法

こちらの公式サイトからDocker for Macをダウンロードしましょう。

https://docs.docker.com/docker-for-mac/install/

f:id:coriander_eng:20190511213943j:plain

f:id:coriander_eng:20190511214242j:plain

ログインしていないとGet Dockerのボタンが出てこないので、アカウントを作成してログインして下さい。

ダウンロードが完了したらダブルクリックしてインストーラーを実行しましょう。

f:id:coriander_eng:20190511214856p:plain

そうするとこのような画面になるので、DockerをApplicationsにドラッグ&ドロップします。

f:id:coriander_eng:20190511215513j:plain

まずはNextを押して次へ進みます。

f:id:coriander_eng:20190511215657j:plain

つぎにOKを押します。すると権限の設定をするためにユーザー名とパスワードが要求されるので入力して下さい。

 

すると右上にクジラのアニメーションが始まります。🐳

 

アニメーションが動いている間は起動中なので、止まるまで待ちましょう。

 

起動したらターミナルで動作確認しましょう。

f:id:coriander_eng:20190511220926p:plain

docker versionと打って上の画像のような感じに表示されれば正しくダウンロードできてます。

 

次はdockerを使ってrailsの環境構築をする方法を書く予定です。

 

最後に

f:id:coriander_eng:20190511221228p:plain

Dockerのアイコン可愛すぎませんかね(^o^)

Vue.jsの環境構築のやり方

Vue.jsの環境構築をVue CLIを使って行うやり方を備忘録も兼ねてまとめました。

 

Vue CLIとは?

Vue.jsの開発環境をセットアップするためのツール

Vue.jsの開発に必要なツール類を質問に答えるだけでまとめてインストールしてくれる

  • トランスコンパイラ(ES6などの標準では対応していない新しいJavascriptの構文をブラウザで解釈できるように変換するためのツール)
  • Vue.js関連のライブラリ(RouterやVuexなど)
  • リントツール(構文のミスなどを検出してくれるツール)
  • テストツール(プログラムが意図したとおりに動くかチェックするツール)

 

Vue CLIを利用するために必要なもの

  • Nodeのバージョン8.9以上

 インストールページ

ご丁寧に推奨版なるものがあるので、そちらをインストールするのが安牌だと思います。もちろん、すでにインストール済みの方は飛ばして下さい。

 

  • Vue CLIのnpmパーケージ

コマンドをターミナルに打っていきます。(今回はバージョン3.5.0を使用します。)

 

~ $ npm install -g @vue/cli@3.5.0

 

インストールが終わったら、正しくインストールされたか確認するため

 

~ $ vue -V

 

と打って3.5.0と表示されれば成功です。

表示されない場合はエラーが起きている可能性が高いです。permission deniedと出ていたらこの記事のとおりにコマンドを打てばおそらく治ります。(私もなりました)

Vue.js 環境構築時のエラー解決法

Vue CLIがインストールできたらVueコマンドが使えるようになるので、開発環境をセットアップしていきましょう。

 

プロジェクトを作成したいディレクトリに移動して下さい。

デスクトップに作成する場合は次のコマンドを打ちます。

 

~ $ cd ~/Desktop/

 

次にVueコマンドを打ってプロジェクトを作成します。

Desktop $ vue create sample-app

(実際に打つのはvue以下、sample-appの部分はプロジェクト名になるので自由に指定して下さい。)

 

ここから各種オプションが選択肢で提示されるので選んで行きます。

? Please pick a preset: (Use arrow keys)
❯ default (babel, eslint)
  Manually select features

デフォルトのプリセットを使用するか、個別にインストールするツールを選ぶか聞かれています。下を選択すると細かくカスタマイズできますが、今回は簡易的に、そのままエンターを押して上を選択します。

 

プロジェクトのディレクトリに移動してサーバーを立ち上げましょう。

Desktop $ cd sample-app/
sample-app $ npm run serve

 

 サーバーがうまく立ち上がると下のようにターミナルに表示されるので、http://localhost:8080/にアクセスしてみましょう。(8080番ポートが使用済みの場合は8081番以降で空いている番号が指定されます)

 

App running at:
  - Local:   http://localhost:8080/

 

f:id:coriander_eng:20190505005656p:plain

 

 こんな画面が表示されれば成功です!めでたしめでたし〜。

【Rubyの】..と...の違い【細かい文法】

想定する読者層

  • ..と...の違いを忘れてしまった人
  • そんなの違いあるの?って人
  • 今まさにrandメソッドを使おうとしている人

結論

  • ..は最大値を含む
  • ...は最大値を含まない
  • 例えば(1..10)は10を含むけど(1...10)は10を含まない

これだけじゃ分かりにくいよーっていう人は最後まで見て下さい。

rand(1..5)

 

と書いたら1、2、3、4、5のうちの一つがランダムに出力されます。5を含むというのがポイント。

 

rand(1...5)

 

と書いたら1、2、3、4のうちの一つがランダムに出力されます。5を含まないというのがポイント。

 

ちなみに

 

rand(5)

 

と書いたら0、1、2、3、4のうちの一つがランダムに出力されます。5を含まない&0を含むというのがポイント。

 

まとめ

今回この記事を書いた経緯としては、itemsテーブルの中でcategory_idが67〜94番まで取り出したいけど、どうやって書くんだっけ?となったというのがあります。

「.」が一つ違うだけで全然違う結果になってしまうので注意が必要ですね!

 

未経験から3ヶ月で機械学習エンジニアになれるのか?

3ヶ月で機械学習エンジニアに!

「3ヶ月で機械学習エンジニアに!」

というキャッチーな広告を見つけて即話を聞きに行きたいを押しました。

 

早速話を聞いてきましたので内容をまとめたいと思います。

(試験的に普通のweb記事っぽくしてみました。)

 

想定する読者層

  • 機械学習に興味がある人
  • エンジニアとしての方向性に迷っている人

 

結論だけ先にまとめると

  • 3ヶ月で機械学習エンジニアになれるといえばなれる
  • ただしめちゃめちゃ勉強が必要
  • 数学に抵抗のある人は無理
  • 学習を継続することが苦痛に感じる人は無理
  • ただし3ヶ月程度の学習では見習いレベル
  • 長期戦になる覚悟がないと無理

 

次から少し詳しく説明していきます。

 

研修内容

 

3か月間の研修で線形代数微積分、統計学などの数学からPython、Kaggleなどを使った実践的な学習を行います。いわゆるSES事業を行っていて、研修中は研修のみに集中できてちゃんと給料も出ます。

 

プログラミングより数学

数学は大学2、3年レベルのことを行うようなので、数学に苦手意識があるとかはそもそも無理みたいです。面接時点ではじかれます。過去の受講生の中には文系の方もいるようなので文系は絶対に無理というわけではないですが、チャッチアップできる自信がないと無理みたいです。プログラミング経験はゼロでも問題ないけど数学苦手は即NG、そんな感じです。

 

三ヶ月後のレベルは?

みっちり本気で3か月勉強して機械学習エンジニアとして即戦力デビューできるかというと、そんな甘い話はありません。機械学習エンジニアとしてはひよっこです。先輩エンジニアのもとで、データの前処理などの雑用係的なポジションからスタートするようです。

 

長期戦になる覚悟が必要

機械学習の分野はハイレベルな学習が必要なので一人前になるには2、3年はかかると考えておいたほうが良いみたいです。

 

 

 まとめ

この研修に参加した方は今までで計10名ぐらいいて、途中でやめた方は一人もいないようです。今超有名IT企業で機械学習エンジニアとして活躍している人もいるみたいなので夢がありますね!数学に自信がある方は目指してみるのもありかもしれません。

初めてエンジニア面接というものに行ってきました-未経験からフリーランスになれるのか-

これはエンジニア面接体験記である

とあるプログラミングスクールに通うただのゲーマーが、初めてのエンジニア面接を時系列で簡単に記していこうと思う。

これからエンジニア面接に挑もうとしてる人、もしくはエンジニア転職を考えている人の参考に少しでもなれば幸いである。

面接が決まるまで

ある日slackにメッセージが届いた。

とあるフリーランスエージェントが登録会を実施するから来ませんかというものである。

話を聞くだけならただなので、迷わずホイホイついていった。

 

簡単に要点だけまとめると

  • 実務未経験に紹介できるフリーランス案件はほぼないが、1件だけ紹介できる
  • その企業はAIや人工知能を利用したプロダクトを作っている
  • フロントエンドエンジニアを募集している
  • バックエンドはPython(Dgango)を使用している
  • 経験者より未経験のほうがいい、教えたい(え?)

その案件について分かったことは本当にこれだけである。最後の点はどこか不可解である。採用できるなら教育コストも少なく済む経験者のほうがいいに決まっている。(この点に関しては後でコンサルの方に質問して解決する)

 

それ以外の点に関しては、フロントエンドも悪くないと思っていたし、AIや人工知能にも興味があるし、Pythonも触りたい。特に断る理由もなく二つ返事で面接の意思があると回答。話を聞くだけならただなので、迷わずホイホイついていった(2回目)

 

その後会社名でググり、どんな事業をしているのかコーポレイトサイトを見るも、新たな情報がない、とにかくない。具体的なプロダクトとか事業内容などを知ろうとしても、出てくるのはAI、人工知能を使っていることぐらい。モヤモヤしつつも面接日に。

 

コンサルの方と打ち合わせ

まずはエージェントのコンサルの方と喫茶店で軽く打ち合わせ。

ここでの会話も要点だけまとめると

  • エンジニアへの志望動機や何を学習してきたかなど必ず聞かれるであろう質問の確認
  • 今回の案件は実務未経験ということで、完全にチャレンジ案件(将来性や学習意欲などを見られる)
  • 普段の1.5倍くらいのテンションでいってやる気をアピール
  • 休日に何をしていますかという質問は学習意欲を図る意図で聞かれることが多い

 

また、前述の点について質問すると

 

Q.今回なぜ経験の浅い人材を募集するに至ったと思うか?採用コストが低く済むというのもあるか?

 A.正直そういう部分はある。vue.jsやreactなどjavascriptフレームワークをゴリゴリ書ける、経験豊富なエンジニアを採用しようとすると3桁万円ぐらいかかってしまう。また経験豊富なエンジニアだとこだわりが強く、言うことを聞いてくれないときがあったりする。

 

という回答。これが100%本心かどうかわからないが、未経験のほうが優遇されるというのは極めて稀なケースであるということは分かった。

 

いざ面接へ

やたらおしゃれな感じのビルに案内され、フロアに入るとそこにはなぜか撮影スタジオのようなスペースが

撮影スペース

イメージとしてはこんな感じ

そこで、面接官の方が「今日撮影しててね」と一言。そうなんですね~といった感じで特に突っ込まなかったのが今日1番の反省点w面接が進行していくにつれ完全に忘却の彼方に。

 

ようやく面接スタート。ここから面接官(面)、コンサルタント(コ)、私の会話形式でお送りします。

 

面接スタート

コ : まずは会社と、今回の案件の募集の経緯について説明お願いします。

 

面 : 私達の会社ではAIを活用したプロダクトを複数もっています。医療系のサービスなど5,6個のプロジェクトが走っています。バックエンドはすべてdjangoを使用しています。当然フロント領域も人が必要です。現在デザイナーはいるのですが、HTML、CSSを書けるフロントエンドエンジニアが足りないというのが今回の案件募集の経緯となります。ここまででなにか質問はありますか?

 

私 : 当然javascriptも使用していると思うのですが、フレームワークは何を使っていますか?

 

面 : vue.jsまたはreactが採用されています。導入する技術は最新のものにしています。それは最新の技術を自慢するためではなくて、最新のもののほうが素直に早く動くから。

 

私 : 実際に働くことになった場合そういったフレームワークを触ることはできますか?

 

面 : それは...あなた次第ですね(笑)今のレベル感としてはどんな感じですか?

 

私 : JQueryであれば簡単なことは書けるのですが、vue、reactに関しては多少自習しているものの、ほぼ0からのスタートということになります。ですが、これらのフレームワークを習得したいという強い意欲はあります。

 

面 : 本も支給しますし、たくさんの先輩エンジニアの方がいるので、学習環境は整っています。ただし、業務時間内にインプットすることは良しとしていません。あくまでプロとしての契約ですから、業務時間内はアウトプットすることに専念して下さい。

 

私 : 分かりました。ありがとうございます。

 

面 : それでは次にエンジニアを目指した経緯をお聞かせ下さい。

 

私 : はい。まずは前職の話からさせていただきます。ゲーム系の攻略メディアで約2年ほどライターをしておりました。いわゆるwebライターというものです。ライターを目指したのはもともとゲームが好きで、とあるゲーム大会の東北予選で優勝、全国大会でベスト16まで行ったという経験があります。

 

面 : へーすごいね

 

私 : それでこの経験を生かしてゲーム関連の仕事をしたい、と思ったときに一つの選択肢とあったのがライターでした。そこで完全未経験からライターになり2年ほど続けました。次にどうしてエンジニアを目指したかという話なのですが、ライターとしてキャリアを積んでいって、文章力などは確かに上がりましたが、自分のスキルとして積み上がって行くものが少ないなと思いました。それに比べエンジニアは、経験した言語やフレームワークは自身のスキルとして積み上がっていきます。エンジニアを目指したのはそういった理由になります。

 

面 : どうして東北?出身は東北ですか?

 

私 : 出身は東北ではなくて東京です。東北大会に出たのは出場チーム数とかから考えて1番突破できる可能性が高いと踏んだからです。わざわざ新幹線で前乗りしましたね。

 

面 : ガチ勢じゃん(笑)

 

私 : はい(笑)

 

面 : プログラミングスクールは色々あると思うんだけど、どうして今通っているところにしたの?

 

私 : 1番は1番厳しそうというのが理由ですね。週60時間というかなりスパルタな学習スケジュールが組まれるのでこれなら身につきそうだなと。無料や安いスクールもあるんですが、その中であえてかなり高いスクールを選びました。というのも高い分それだけ本気で学びに来ている人が多いし、お互い切磋琢磨できます。また、チームでの開発経験がつめるのも選んだ理由になります。

 

面 : なにかスクールのカリキュラム以外で学んでいることはありますか?

 

私 : そうですねAIに興味があったので、UdemyでAIチャットボットの講座を購入して一通り学びました。

 

面 : それはどんな技術を使ってるの?

 

私 : バックエンドはfirebaseで、会話の仕組み自体はDialogflowを使っています。データを保存する際に自作APIとしてGASを使用しています。APIを呼び出すときに一部node.jsも使っています。

 

面 : へー。それは今見れる?

 

私 : もちろんです。(LINEを開いて見せながら)こんな感じで動きます。

 

面 : おー。チームでアプリを開発しているみたいだけどそれもみれる?

 

私 : もちろんです。(PC画面を見せながら)こんな感じで作ってます。

 

面 : この固定アドレス(独自アドレス?すいません忘れました(*_*;)はどうやってとってるの?

 

私 : (一瞬何のことかわからず)えーっと、AWSでデプロイしてます。

 

面 : AWSではどんな技術を使いましたか?

 

私 : えーと、画像の保存先としてS3、それからEC2インスタンスも使用しました。(かなりたどたどしくなってしまった)

 

面 : 出品もできるの?

 

私 : もちろんです。画像を10枚まで投稿もできます。

 

面 : へー。この画像投稿機能に使用した技術はなんですか?

 

私 : 画像を投稿するためのgemがありまして、えーとすいません名前をど忘れしまったんですが(carrerwaveという名前が出てこなかった。反省。担当範囲外という言い訳もあるけど、そのくらい出てこないというのはある。)、そのgemとJQueryもかなり使っています。

 

面 : なるほどjsも使わないと難しいだろうね。

 

面 : ゲームはいつ頃から好きなんですか?

 

私 : いつ頃から...といいますと、まぁ子供の頃からゲームは好きでしたね。ゲームともに成長してきた(?)みたいなところはあるかもしれません。最初にやったのは確かニンテンドー64マリオカートだったと思います。

 

面 : ここまでどのくらいかかりますか?

 

私 : だいだい1時間ぐらいですね

 

面 : 結構遠いね〜。○○線沿いに住んでるんだね〜。確かあのあたりでピカチュウを捕まえに行ったことがあるよ(笑)

 

私 : Pokemon Goですね

 

面 : そうそう。いやあのとき東京に住んでてよかったと思ったよね。

 

私 : 田舎だとなかなかイベントないですもんね

 

面 : そうなんだよね(笑)休みの日は何してますか?

 

私 : 昔はゲームばかりやってましたけど。最近はプログラミングの勉強で忙しくてやってませんね。休みの日もプログラミングしてます(笑)

 

コ : あとなにか聞いていきたいことなどあれば

 

私 : 実際に働くことになった場合、今回はフロントエンドでの募集ですが将来的にバックエンドのPythonにも触る可能性はありますか?

 

面 : もちろん。意欲次第ではどんどん挑戦できるよ。正直Pythonエンジニアって全然いなくて経験2年くらいでもかなり高い単価になるんだよね。django rest flameworkに関して言えば1番経験が長い人で1.5年くらいじゃないかなー。このあたりはあなたが詳しいと思うけど。

 

コ : いやいや(謙遜)

 

面 : まだなにか質問などあれば?なさそうですかね。それでは終了したいと思います。

 

面 コ 私 : ありがとうございました!

面接おわり

気づいたこと

  • 自分の作ったポートフォリオなどで使っている技術は、すらすら説明できるように整理しておいたほうが良い(当たり前ですが)
  • 意外と技術とは関係のない話もある(今回が特殊なのかもしれない)
  • 実務未経験なので現時点で技術力がどれだけ高いかというよりも、将来性と学習意欲をチェックしている

 

最後に

私自身は絶対に最初からフリーランスとは全く思っていません。正直最初の数年は技術力と経験を積むことを優先すべきだと思います。雇用形態にこだわらずいろんな選択肢を見ていきたいと思います。