アンテナサイト作った話
同期のブログのアンテナサイト作りました
http://six-antena.herokuapp.com/
作った経緯
飲んだ勢いで、同期の一人に「同期ブログのアンテナサイト作るぜ!!!!!1」
と宣言したのがはじまりです。
環境
言語 :ruby
フレームワーク:ruby on rails
インフラ :heroku
機能
データベースに登録されている同期のブログの更新情報がトップページに表示されます。
表示される内容は、各記事のタイトル、og:imageに指定されている画像とdescriptionと呼ばれる記事の概要が表示されます。
また、descriptionのない写真ブログからも記事を取得しているので、その場合はタイトルと画像のみが表示されます。
困っていること
アンテナサイトなので定期的にデータベースを更新しなければなりません。
herokuでタスクの定期実行を行う場合、「heroku Scheduler」というサービスを利用することで
実現できます。「heroku Scheduler」はプロセスの 利用時間が750時間/1ヶ月まで無料で利用することができますが、
750時間を超えると課金対象になるので、「heroku Scheduler」を利用するにはクレジットカードの登録が必須となります。
しかし、僕はクレジットカードを持っていないので「heroku Scheduler」を利用することができません。
そのため、手動でデータベースの更新をやってます。
何か良い方法があれば教えてください。
これから
機能の追加・修正と見た目を良い感じにしたいです。
GMOペパボに入社しました
ペパボ新卒6期生として入社したのおぎどーです。 そろそろ入社して1ヶ月がたち落ち着いてきたので入社エントリというものを書いてみます
だれ
沖縄高専の専攻科で情報工学を学んだ22歳の若者です ドローン飛ばしたりしてました
ペパボとは
ペパボは「もっと面白くできる」を企業理念としている本当に面白い会社です。
以下の動画見るとペパボの面白さを何となく理解していただけるかと思います
新卒採用2017 GMOペパボ会社説明会
なにやってるの
入社式を終え、すぐにグループ全体研修に入りました。そこでは、各グループの社長さんのお話やマナー研修、宿泊研修などを受けました。 その後、ペパボの研修に入り各部署のオリエンテーションを受け、現在はポートフォリオ研修で自分のこれまでをふりかえっている最中です
これから
5月は福岡研修でそれが終わると技術研修が始まります。研修はまだまだこれからなので、一人前のエンジニアになれるよう頑張って行きたいなという感じです。 また、研修を受けて技術の知識だけじゃなくデレクションやデザインも学びたくなったので、先輩や同期に助けもらってどんどん学んでいくぞ!!!!11という気持ちですので、各位よろしくお願いします
終わりに
ペパボは研修も充実してて、エンジニアのスーパープレイヤーも多く在籍してます!!
17年卒の採用も始まってるみたいなんで興味ある方は是非!!!
新卒採用2017-GMOペパボ株式会社
visual studioで動くbebop drone用の制御ライブラリを作った
必要になったので、bebop drone用の制御ライブラリ「CV Bebop」を作成しました。
環境
visual studio 2012
言語:visual c++ 2012
画像処理ライブラリ:OpenCV3.1
使い方
必要なライブラリはすべて入っているので、visual studioのソリューションファイルを開き、 ターゲットをwin64にし、Releaseモードでビルドするだけです。
ライセンス周りがよく分かっていないので、マズイところがあれば連絡していただければ幸いです。
Q学習で迷路を学習
昔、授業でQ学習を習ったの思い出したのでQ学習使って迷路学習させるスクリプトをrubyで書いた
Q学習とは
Q学習は機械学習手法の方策オフ型TD学習の一つである。概念自体は古くから存在するが、Q学習(Q-learning)という名前で今日の手法がまとめられたのは、1989年のクリス・ワトキンズ(Chris Watkins)の論文に端を発する。
Q学習は有限マルコフ決定過程において全ての状態が十分にサンプリングできるようなエピソードを無限回試行した場合、最適な評価値に収束することが理論的に証明されている。実際の問題に対してこの条件を満たすことは困難ではあるが、この証明はQ学習の有効性を示す要素の一つとして挙げられる。
Q学習 - Wikipedia
なんか難しい感じだけど、マルコフ条件の元で状態遷移する場合(ある状態は直前の状態からのみ影響を受ける場合)、無限回試行すると、最適な行動を学習出来るってことらしい。たぶん
Q値の更新
Q学習のきもはQ値の更新で
でQ値をどんどん更新していく
Q学習で迷路を学習するときのイメージは複数回試行することで報酬(ゴール)がどんどん伝搬していって各状態におけるQ値が決まっていく感じ
実験
こんな感じの迷路を学習させてみた
##################### #S 0 0 0 0# #0 -10 0 0 0# #0 0 -10 0 -10# #0 -10 0 0 0# #0 0 0 -10 50# #####################
Sが初期位置で右下の50がゴールになっている
この迷路を5000ステップ学習して、学習したQ値を使って迷路を解いた
学習時の行動選択は、ある小さな確率εでランダムに選択し、それ以外では Q値の最大の行動を選択するε-グリーディ法を利用した。
学習したQ値を利用して迷路を解いたところ、以下のような結果になった
x: 0 y: 0 @ 0 0 0 0 0 -10 0 0 0 0 0 -10 0 -10 0 -10 0 0 0 0 0 0 -10 50 x: 1 y: 0 0 @ 0 0 0 0 -10 0 0 0 0 0 -10 0 -10 0 -10 0 0 0 0 0 0 -10 50 x: 2 y: 0 0 0 @ 0 0 0 -10 0 0 0 0 0 -10 0 -10 0 -10 0 0 0 0 0 0 -10 50 x: 2 y: 1 0 0 0 0 0 0 -10 @ 0 0 0 0 -10 0 -10 0 -10 0 0 0 0 0 0 -10 50 x: 3 y: 1 0 0 0 0 0 0 -10 0 @ 0 0 0 -10 0 -10 0 -10 0 0 0 0 0 0 -10 50 x: 3 y: 2 0 0 0 0 0 0 -10 0 0 0 0 0 -10 @ -10 0 -10 0 0 0 0 0 0 -10 50 x: 3 y: 3 0 0 0 0 0 0 -10 0 0 0 0 0 -10 0 -10 0 -10 0 @ 0 0 0 0 -10 50 x: 4 y: 3 0 0 0 0 0 0 -10 0 0 0 0 0 -10 0 -10 0 -10 0 0 @ 0 0 0 -10 50
ちゃんと解けてるっぽい
結構楽しかったので、これを気に機械学習とかちゃんと勉強してみたい
rubyでRANSAC
研究で必要になったから調べてみた
観測したデータから最小二乗法などでモデルを推定する際に、観測したデータに外れ値が混じっていた場合、推定したモデルは外れ値に引っ張られてしまいます。そこで、RANSACアルゴリズムを利用することで、外れ値を無視したモデルの推定を行うことが出来ます
RANSACアルゴリズム
1.観測データ群からランダムに幾つかのデータを取り出す
2.取り出したデータを用いてモデルを推定
3.推定したモデルに対して、観測データ群を適用し、モデルを評価する
4.1~3を複数回行い、一番評価が高いモデルを採用
意外とシンプルなアルゴリズムです。
実験
今回は、直線のモデルを最小二乗法で推定します。
直線のモデルなんで、
のaとbの部分を推定します。
今回は正解のモデルを
っぽい直線としました。
正解データは
(1- rand() / 10) * x
また外れ値は
rand(0.0..5.0) * x
として生成しました。
ちなみにxは1から100までの整数です。
グラフの描画はgnuplotなるライブラリを使いました。
まずは外れ値なしの最小二乗法から
なかなかよい感じ
続いて、外れ値ありの最小二乗法
めっちゃ外れ値に引っ張られてます。
最後にRANSAC使った場合です。
きれいに外れ値を無視してくれました。
RANSACは簡単に実装できて、強力なんですが、
複数回、モデルの推定を行って、それを更に観測データ群に適応させるので、
計算量がめっちゃ大きい感じがします。
実際にRANSACを使う場合には工夫が必要かもしれません
ちなみに今回書いたコードはこんな感じです。
c++でイベント駆動っぽくTCPを書いた
思いつきでc++でイベント駆動っぽいTCPのクラス書いてみた
これでTCPのサーバーとクライアント両方ともイベント駆動っぽくかける
試しにエコーサーバ
サーバ
#include <iostream> #include "TCPEventServer.h" int main(void) { eventTCP server(5432); server.on("connect", [](Socket *sock){ std::cout << "connect" << std::endl; sock->on("echo", [sock](std::string data){ std::cout << data << std::endl; sock->emit("echo", data); }); sock->on("disconnect", [sock](std::string data){ std::cout << "disconnect" << std::endl; sock->close(); }); }); server.listen(5); return 0; }
クライアント
#include <iostream> #include "TCPEventClient.h" int main(void) { TCPEventClient client; client.connect("127.0.0.1", 5432); client.on("connect", [](Socket *sock){ std::cout << "connect" << std::endl; sock->on("echo", [sock](std::string data){ std::cout << data << std::endl; }); sock->on("disconnect", [sock](std::string data){ sock->close(); }); sock->emit("echo", "echo server"); }); return 0; }