December 28, 2015

2015年を振り返る

今年も早いもので2015年が終わろうとしています。一年を振り返りたいと思います。 ブログのアクセス数から振り返る セッション数は11856で、ビュー数は17032でした。去年のアクセスに比べれば多くなりましたが、今年は伸びが無かったです。来年は記事のクオリティを上げたり、頻度を上げるように努力せねば。 最もビューが多かった記事は、ハードディスクの寿命分布を比較 で、この記事が元になってバイトに結びついたのは嬉しかったです。大学時代の専攻は信頼性工学でしたので、仕事に直接活かすことが出来たのは良い経験でした。 所属組織から振り返る 2015年3月に電気通信大学大学院を卒業しました。先生方や研究室の仲間達には大変お世話になりました。今でも時々交流があるので嬉しいです。 2015年4月からは、新天地で会社員になりました。学生時代に磨いてきたスキルを活かせています。最初の一ヶ月はOJT形式で先輩社員の下で教わり、それ以降は先輩と共に仕事をしたり、1人で案件を担当することもありました。1人で担当した案件によって、局内表彰を頂くことが出来ました! また、社外向けの勉強会で発表したり、来年の1月は新卒向けのイベントに登壇したりと対外的な活動も出来るようになりました。 10月には始めての海外出張をさせて頂いたりと刺激的な会社員生活をしています。 コミュニティから振り返る 去年に引き続き、今年もJapan.Rを主催させて頂きました。二回目という事もあり、”去年に比べて”スムーズに運営できたと思います。 また、知人の紹介によってR言語コミュニティ以外にも交友関係を築き始めているので、こちらは継続して頑張りたい。 エンジニアとして振り返る 個人で作っている(途中の)ものとして、いくつかあるので記しておきます。 gepuro task views webビーコンを作った ラズパイでラジコン どれも開発段階ですが、多くの学びがあって楽しいです。 他には、scala及びSparkの勉強を始めたり、dockerを使うようになったり、テストコードを意識的に書くようになったり、AWSを使ったりとエンジニアとしての成長を続けています。 来年は何を作ろうかな。 趣味から振り返る 3月に台湾に行きました。旅の記録をブログに書いていなかったので、その時のtwilogを張っておきます。 2015年03月06日(金) 2015年03月07日(土) 2015年03月08日(日) 2015年03月09日(月) 2015年03月10日(火) 2015年03月11日(水) 2015年03月12日(木) 2015年03月13日(金) 2015年03月14日(土) 2015年03月15日(日) 2015年03月16日(月) 2015年03月17日(火) 2015年03月18日(水) 2015年03月19日(木) 2015年03月20日(金) 2015年03月21日(土) 2015年03月22日(日) 2015年03月23日(月) twilogのリンクを貼っていたら、縦に長くなってしまいました。約2週間かけて、台湾の一周(1040km)を完走しました。学生最後の最高に楽しい思い出です。 Read more

December 23, 2015

ABテストを実装&実施してみる

このブログでABテストを実施するにあたって、悩んだ事をつらつらと書きます。 既にあるwebビーコンを活かしたい webビーコンを作った にあるように、このブログには自作ビーコンが埋め込まれています。google analyticsでは拾いきれないログを取得する動機で作ったのですが、これを活かしきれていませんでした。 今回はABテストを実装する上で、このログを有効活用しようと思います。 悩んだ実装方法 アプリ側でwebビーコンが持つIDを使いたい 新規ユーザの場合、htmlのレンダリングが先なので、IDを特定できない webビーコンにABテストを仕込む アプリとwebビーコンが密結合になってしまう 独立したサービスとして動かしたい ABテスト用のアプリを新たにつくる dom操作で書き換えれば出来そうだが、重くなりそう 最終的な実装方法 アプリ側でアクセス元のipアドレスを取得 偶数ならA、奇数ならBを出す 検証方法 webビーコンにABというカラムを追加して、偶数か奇数かを記録しておけば、後から確認が簡単になる。 ワンライナーで、こんな感じで現状を確認出来るようにした。 cat data/* | jq -r ' select(.site=="blog.gepuro.net") | select(.ab==1 or .ab==0) | select(.ymd >= 20151221) | [.sid, .ab] | @csv' | header -a '"sid","ab"' | csvsql --query "select sid,ab,count(1) as view from stdin group by sid, ab" | csvsql --query " select ab, 1. Read more

December 18, 2015

dockerコンテナの稼働状況を一覧する

コンテナの稼働状況は下のようにして確認出来る。 docker stats [OPTIONS] CONTAINER [CONTAINER...] しかしながら、コンテナ名orIDを入力するのは面倒ってわけで、一発で表示できるコマンドを作った。 #!/bin/sh docker inspect --format='{{.Name}}' $(docker ps -q) | sed -e "s/\///g" | xargs docker stats また、コンテナのipアドレスを調べたい時は、 #!/bin/sh docker inspect --format '{{.Name}},{{.NetworkSettings.IPAddress}}' $(docker ps -q) | sed -e "s/\///g" とすれば良い。 これをpathの通る場所に置いておけば、dockerライフがより素敵になる!!!

December 6, 2015

Japan.R 2015を開催しました

R advent Calendarの12月6日担当です。更新日が12月7日になってしまいました。(寝落ちしてた) 12月5日にJapan.R 2015を開催しました。ATNDでの登録数は197人と昨年同様の盛り上がりでした。 スタッフの皆さん、参加者のみなさん、ありがとうございます。 懇親会の参加者は約70人で、二次会の参加者は約40人でした。眠かったので帰りましたが、三次会もあったようです。 また、会場提供をして頂いた株式会社リクルートコミュニケーションズさん、ありがとうございます。 当日の様子はtogetterにまとめています。 Japan.R 2015 前半セッション Japan.R 2015 後半セッション Japan.R 2015 LT大会以降 http://www.ustream.tv/channel/kbWLTTuAtLhに当日の録画もあります。 また、僕自身もLT大会に参加しました! gepuro task views from Atsushi Hayakawa 今年もR言語にお世話になりました。来年以降もR言語コミュニティに貢献していけたらと思います。来年もJapan.Rを開催しますので、よろしくお願いします。 Enjoy R!

December 2, 2015

ioslidesにおけるロゴのサイズを変える

スライドをRmdで書くgepuroです。 デフォルトのままでは、ロゴのサイズがピクセル単位で固定されているので、画像によっては歪んで表示されてしまう。 それでは困るので、 CSSを弄りました。 また、 タイトル以外のページに現れるロゴは邪魔なので、 background-size: 0px 0px;として、消しています。 slide.Rmd title: "タイトル" author: "@gepuro" output_format: ioslides_presentation: css: logo.css logo: logo.png mystyle.css /* トップのロゴの大きさを変える */ aside.gdbar img { width: 180px; height: 47.2px; position: absolute; right: -5px; top: 15px; margin: 8px 15px; } /* 他のページのロゴの大きさを変える */ slides > slide:not(.nobackground):before { font-size: 12pt; content: ""; position: absolute; bottom: 20px; left: 60px; background: url(logo.png) no-repeat 0 50%; -webkit-background-size: 30px 30px; -moz-background-size: 30px 30px; -o-background-size: 30px 30px; background-size: 0px 0px; padding-left: 40px; height: 30px; line-height: 1. Read more

November 26, 2015

Rmarkdownのioslidesで右下に画像を配置する方法

もう少し綺麗な方法があると思うけど、下で出来た。 <style> .bottom_right img { position: relative; left: 500px; top: 180px; }</style> <div class="bottom_right" markdown="1"> <img src="logo.png", width="300px"> </div> kazutanさんに教えてもらった方法 <aside class="gdbar right bottom"><img src="hoge.png"></aside> ありがとうございます!

October 29, 2015

implyでアクセスログの分析

webビーコンを作った という記事を投稿してから、暫く経ちました。 データも集まり初めてきたところで、分析を始めたいと思います。 最近、僕の中で話題のdruidという時系列なデータが得意なデータベースがあります。 このデータベースは、秒間300万イベントでも捌けるらしいです。(関係者談) これを利用したpivotというUIツールがあります。開発している会社は、implyというサンフランシスコにあるベンチャー企業です。 この企業がduirdやpivotをパッケージにしたimplyというソフトウェアを提供しています。 今回は、これを使ってデータを分析してみます。 http://imply.gepuro.netにアクセスすると、当ブログで収集しているデータを見れます。(ただし、10月28日の分しか登録していません。早く全部入れたい・・・) 使い方については、少しずつ書いていきたいと思います。

October 17, 2015

サーバの引越

当ブログのサーバを引っ越しました。運用開始時期にはdockerが流行っておらずLXCを直接弄っていましたが、時代の流れに乗ってdockerに変えました。 また、さくらVPSを利用しているのですが大阪リージョンから石狩リージョンに変更したのでpingが遅くなっています。 今後ともよろしくお願いします。

October 9, 2015

2つの画像を比較

Pythonで2つの画像の比較をしたい。 シェル上で実行するなら、 diff img1.png img2.png で良い。 Pythonでは、 img1.tostring() == img2.tostring() で比較出来る。 もっと綺麗な方法がある気がする。その時は加筆する。

October 2, 2015

sparkの開発環境はspark-notebookが良さげ

spark-notebookです。 何でもnotebookの時代ですね。 RStudio好きとしては、ブラウザで使えるIDEもあると嬉しい。 現時点での最新版は下で使える模様 docker pull andypetrella/spark-notebook:0.6.2-SNAPSHOT-scala-2.10.4-spark-1.5.0-hadoop-2.7.1-with-hive-with-parquet docker run -p 9000:9000 -p 4040-4045:4040-4045 andypetrella/spark-notebook:0.6.2-SNAPSHOT-scala-2.10.4-spark-1.5.0-hadoop-2.7.1-with-hive-with-parquet scalaもsparkもスタート地点に立っていないレベルだけど、出来ることから少しずつ学ぶ。

October 2, 2015

新しいdockerをubuntuに入れる

ubuntu14.04でapt-getから入るのは古めなので、動かないことが多い。 Ubuntuに最新のDockerをインストールするに書いてあるし、何番煎じか分からないけど、すぐに忘れるのでメモ curl -sSL https://get.docker.com/ubuntu/ | sh

September 14, 2015

webビーコンを作った

google analyticsでアクセスログを取ってるのだけれど、セッション毎のデータを利用するのは有料だったので、自分で作ってみた。 な感じのプログラムに対して、 <script type="text/javascript">document.write("<img src='http://beacon.gepuro.net/?site=blog.gepuro.net");document.write("&referrer="+encodeURIComponent(document.referrer)+"'>");</script> な感じにタグを埋め込んで使う。 このサイトでデータを集めて、何かに使うつもり。

September 10, 2015

library(ranger)とlibrary(randomForest)の速度を比較する

Predicting Titanic deaths on Kaggle V: Rangerを読んでいたら、 「ranger早いぜ」というのを見つけたので試してみた。 library("ranger") library("randomForest") ## randomForest 4.6-10 ## Type rfNews() to see new features/changes/bug fixes. ## ## Attaching package: 'randomForest' ## ## The following object is masked from 'package:ranger': ## ## importance data("iris") # http://d.hatena.ne.jp/a_bicky/20101225/1293258748 test <- function(code, ic = 1000) { expr <- substitute(code) print(system.time(for (i in 1:ic) { eval(expr) })) } test( ranger(Sepal.Length~., data=iris, mtry=2, num.trees = 500, write.forest=TRUE) ) ## user system elapsed ## 71. Read more

September 9, 2015

「データサイエンティスト養成読本 機械学習入門編」を読みました

献本を頂きました。ありがとうございます。 これを読んで勉強します! pic.twitter.com/9HjYqGbAl7 — 12/5にJapanRやるgepuro (@gepuro) 2015, 9月 4 技評さんからご寄贈いただきました。ありがとう御座います! tjoさんの『データサイエンティスト養成読本 機械学習入門編』ご恵贈いただきましたやchezouさんの「データサイエンティスト養成読本 機械学習入門編」を読んだにも書評が上がっています。 僕は偉い事を言える立場ではないので、一読者としての感想文になります。 初学者から中級者の人にとってタメになる 内容が詰まっています。 第1部 序盤の「機械学習を使いたい人のための入門口座」、「機械学習の基礎知識」、「ビジネスに導入する機械学習」、「深層学習最前線」では、基礎的な知識から最新の手法まで書かれており、素早くトレンドを掴むのに良いかと思います。 特に、「深層学習最前線」では数式をほぼ使わずに話が進んでいきスラスラ読めるので、面白かったです。 KDD CUP 2015で登場するxgboostやstackingやblend(stackingと同じ?)の話が出ると嬉しかったです。 第2部 また、「機械学習ソフトウェアの外観」、「Pythonによる機械学習入門」、「推薦システム入門」、「Pythonで機械学習入門」、「推薦システム入門」、「Pythonで画像認識にチャレンジ」、「Jubatusによる異常検知」では、実際に仕事で使う上で参考になるコードが多く出てきます。コピペで実践できるので、助かります!! 実際にモデリングしていると課題になるクロスバリデーションやサンプリング、モデルの評価指標の話が少なかったので、寂しく感じました。 また、モデリングに使用したコードやデータの管理方法も知りたかったです。皆さんがどうしてるのか気になります。 最後に リンクを張っておきます。

September 5, 2015

実行速度のボトルネックをplopで見つける

2016/10/6の追記 python3 setup.py install でインストールするだけで良く、下にあるソースコードの変更は不必要になった。 以降は2016/9/5に書いた記事 Plop: Low-overhead profiling for Pythonにあるようにdropboxの中の人が開発したplopというツールがある。 これを使えば、プログラムの累積実行時間をメソッド単位で計測でき、コールグラフも作成出来る。pythonが遅いと感じた時に、簡単にボトルネックになっている箇所を発見出来るので便利! しかしながら、https://github.com/bdarnell/plopにあるコードはpython2系でしか動かないので、3系でも動くように修正した。 面倒だったので、計測用のコードしか修正してないです。可視化は2系のまま。 使い方 計測 python3 -m plop.collector myscript.py 可視化 python -m plop.viewer --datadir=/tmp コード collector.py from __future__ import with_statement import collections import signal import sys import _thread as thread from plop import platform import time class Collector(object): MODES = { 'prof': (platform.ITIMER_PROF, signal.SIGPROF), 'virtual': (platform.ITIMER_VIRTUAL, signal.SIGVTALRM), 'real': (platform.ITIMER_REAL, signal.SIGALRM), } def __init__(self, interval=0.01, mode='virtual'): self. Read more

August 8, 2015

RでCSVファイルを一行ずつ読み込む

メモリを節約するんじゃ 学習データはサンプリングするからメモリに載せられるけど、 予測対象はメモリに乗らない時に一行ずつ読み込んで処理をさせたい。 f <- file("data.csv", "r") while(1){ line <- readLines(f, n=1) if(length(line) == 0){ break }else{ line.f <- textConnection(line) line.df <- read.csv(line.f, header = FALSE, sep=",") } write.table(line.df, stdout(), row.names=F, col.names=F, sep=",") } 標準入力から受け取る時は、 file("data.csv", "r") を file("stdin") にすれば良さそう 参考 http://stackoverflow.com/questions/9370609/piping-stdin-to-r 追記 奥村先生版です。 「RでCSVを1行ずつ」のいいかげん版: while (length((line = readLines(f,n=1))) > 0) { x = unlist(strsplit(line, ",")) https://t.co/fTpnA5CVIr — Haruhiko Okumura (@h_okumura) August 8, 2015 追記2 hoxo_mさんバージョンです。 Read more

June 17, 2015

kmeansとkmedoidsを比較してみる

やったこと kmeansとkmedoidsの比較をしてみました。 アルゴリズムの詳細は下の参考文献を見てください。 ざっくりとした説明をすると、 kmeansはクラスタの中心を重心として距離を2乗で評価するのに対して、 kmedoidsはクラスタの中心をデータ点として距離を1乗で評価します。 パッケージの読み込み library("ggplot2") library("cluster") サンプルデータ作成、可視化用関数 makeSampleData <- function(sd){ df1 <- data.frame(x = rnorm(20, mean=1, sd=sd), y = rnorm(20, mean=1, sd=sd), cluster = rep(1, 20)) df2 <- data.frame(x = rnorm(20, mean=1, sd=sd), y = rnorm(20, mean=3, sd=sd), cluster = rep(2, 20)) df3 <- data.frame(x = rnorm(20, mean=3, sd=sd), y = rnorm(20, mean=1, sd=sd), cluster = rep(3, 20)) df4 <- data.frame(x = rnorm(20, mean=3, sd=sd), y = rnorm(20, mean=3, sd=sd), cluster = rep(4, 20)) df5 <- data. Read more

May 2, 2015

確率変数の変換

何度か勉強しているのだけれど、毎回確認しているのでブログに書いておく。 数式転がし 確率変数 $X$ に対して、その関数の確率分布を求める。(例: $X^2$, $\log(X)$) 変換の関数を$Y=\phi(X)$とする。$\phi(x)$は単調増加。 $\phi(x)$は単調増加であるから、$x \leq X \leq x + \Delta x$と$Y \leq Y \leq y + \Delta y$は論理的に同値であるので、 \begin{align} P(y \leq Y \leq y + \Delta y) = P(x \leq X \leq x + \Delta x) \end{align} 確率変数$X$, $Y$の密度関数を$f(x)$, $g(y)$とおく。 ここで、$P(x \leq X \leq x + \Delta x) = f(x) \Delta x$であるから、 \begin{align} g(y) = f(x) \Delta x / \Delta y \approx f(x) ( dx / dy ) \end{align} となる。 Read more

April 29, 2015

時系列解析の入門に良い資料

オハイオ州立大学のRobert de Jong先生が公開されている講義資料?がよさ気なので、紹介します。 Lecture 1: Stationary Time Series∗ Lecture 2: ARMA Models∗ Lecture 3: Spectral Analysis∗ Lecture 4: Asymptotic Distribution Theory∗ Lecture 5: Linear Regressions∗ Lecture 6: Vector Autoregression∗ Lecture 7: Processes with Deterministic Trends∗ Lecture 8: Univariate Processes with Unit Roots∗ [Lecture 9: Multivariate Unit Root Processes and Cointegration](http://www.econ.ohio-state.edu/dejong/note9.pdf) Lecture 10: Further Topics∗ 誤植 部分的にしか読んでいないけど、誤植がありました。他にも誤植がありそう。 Read more

© gepuro 2013