2019年1月13日 Google スプレッドシートで個別にフィルターする方法 背景 Google スプレッドシートは普段業務などでよく使うかと思います。 私も、バグのチケット管理やタスク管理などで用いることがあります。 スプレッドシートにはフィルター機能があるのですが、普通にフィルターをかけてしまうと全ユーザーのスプレッドシートがフィルタリングされてしまいます。 たとえば、タスク管理で自分のタスクだけ表示させておきたいといった場合に他の人もそのフィルターの影響を受けてしまします。 当然スプレッドシートには個別にフィルタリングできる機能が用意されているのですが、意外と知らない方が多かったのでその方法をまとめます。 方法 今回は以下のようなスプレッドシートを対象に考えます。 データ > フィルタ表示 > 新しいフィルタ表示を作成 すると以下のような黒色でフィルタ表示がされます。 名前がつけられるので、なに用のフィルタか記載しておくとよいでしょう。 (今回は田中タスク確認用と入力しました) この状態で、田中さんのタスクだけ確認しようとしてみると以下のようになります。 このようにすると他のユーザーに影響を与えず好きにフィルタリングすることができます。 まとめ スプレッドシート便利なので、こういったフィルタなども駆使してどんどん業務効率化していきましょう! 🍻 2019年1月1日 2018年のふりかえりと2019年に向けて 2019年になったので、2018年のことを振り返ってみます。 (年内に書き上げるつもりが年を越してしまいました・・・) ブログ 2018年は19本のブログを書きました。以下に列挙してみます。 1/16 「ベタープログラマ」を読んだ 4/15 Hugoで作成したブログをPWA対応した(ホーム画面に追加のみ) 8/25 Planckキーボードを作ってみた 8/31 週一ブログチャレンジ 9/2 書籍「Clean Architecture」を読んだまとめ 9/9 DIPを意識してgoを書いてみる 9/16 isucon8予選に参加してきました 9/23 Elmに入門してみた その1 9/30 Elmに入門してみた その2 10/7 Cocos2d-xのActionまとめ 基本編 10/14 Elmに入門してみた その3 10/21 Percelで静的ページをつくってみた 10/28 記述統計学と推測統計学 11/5 記述統計学とデータについて 11/17 度数分布表とヒストグラム 11/17 データの代表値について 11/24 相関について 12/13 ElmでWebGLしてみる 12/29 C++で逆ポーランド記法を実装する こうみるとそんなに多くはないかなぁという印象です。 9/1から週一でブログを書いて行こうという試みを個人的に行なっていたのですが、ところどころ途切れちゃってますね。まぁでも以前よりははるかにブログ書く回数も増えたのでこれは2019年も継続してやっていきます! ブログの内容ですが、○○をしてみた、入門してみた系の記事が多く、後半は統計学の基本的なところの記事がおおいです。 来年は入門じゃなくもうちょっと深いところまで踏み込んだ内容がかけるとよいなぁと思います。 ジャンルとしては、Elm、確率・統計あたりがメインな感じです。 来年は機械学習系をもっと書いていきたいです。 読んだ本 こちらも雑に列挙してみます。 Python クローリング&スクレイピング 自然言語処理の基本と技術 世界でもっとも強力な9のアルゴリズム みんなのGo言語 Being Geek ベタープログラマ 仕事ではじめる機械学習 データサイエンスのための統計学入門 ゼロから作るDeep Learning 2 直感 Deep Learning ふつうのLinuxプログラミング エンジニアのためのマネジメントキャリアパス Clean Architecture 機械学習系のやさしめの本が多い感じですね。 ほかにも読んでるかもしれませんが、Amazonの購入履歴からはこんな感じでした。 2018年12月29日 C++で逆ポーランド記法を実装する 背景 make 10 (4つの数字と四則演算を用いて10をつくるゲーム。切符とかでよく遊ぶやつ) を解くプログラムを作ろうとして、その1要素としてC++で逆ポーランド記法を計算するプログラムを書いてみたら楽しかったのでメモしておきます。 逆ポーランド記法とは? 四則演算を計算する際の記法で、例えば 1 + 2ならば、12+の用に書きます。 コンピュータで計算式を解析するのに向いている記法で、演算子を後置するようなイメージです。 \ 具体的な 123+4++ のような例をつかって計算順序のイメージをみてみます。 左から順番に文字を処理していき以下のような順序で演算していきます。 1 12 123 123+ // (23+ -> 5) 15 154 154+ // (54+ -> 9) 19 19+ // (19+ -> 10) 10 詳しい説明はこちらのサイトがすごくわかりやすいので、ぜひ参照してみてください。 https://qiita.com/yumura_s/items/ddb0d143fb0e9a082891 環境 環境は以下の通りです。 OS X(High Sierra) $ g++ -v Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1 Apple LLVM version 10.0.0 (clang-1000.11.45.5) Target: x86_64-apple-darwin17.7.0 Thread model: posix InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin また、c++14の記法を一部使っています。 今回はユニットテスト用にgoogleTestを使用することにしました。 https://github.com/google/googletest Google Testに関しては参考になったサイトを載せておくのでそちらを参照していただければと思います。 Google Test ことはじめ GoogleTestでC++のコードをテストする GoogleTest + CMakeでC++の実践的なユニットテスト環境を構築する 実装 今回実装した成果物はこちら 2018年12月13日 ElmでWebGLしてみる この記事はElm2(完全版) Advent Calendar 2018の 13 日目の記事です。 はじめに Elm が楽しいので、WebGL も動かしてみました。 今回はサンプルを動かして簡単にソースを見て行きます。 環境 OSX 10.13.6 (High Sierra) Elm 0.19.0 WebGL ライブラリについて 現状(2018/12/10)、elm の 0.19.0 では elm-explorations/webgl を用いると良さそうです。 https://package.elm-lang.org/packages/elm-explorations/webgl/latest ちなみにこいつにたどり着くまでにちょっと苦労しました。 どうやらElmにもWebGLのライブラリがあるらしい ↓ Googleで「elm webgl」と検索 ↓ 検索の一番上に引っかかるのが、elm-community/elm-webgl ↓ deprecated orz ↓ elm-community/webglにリンクが貼られている。 ↓ elm-community/webglを見ると使えそうな雰囲気。 ↓ githubを見るとdeprecated ↓ elm-explorations/webgl !! ソースコードを見る elm-explorations/webgl の sample コードを軽く眺めて見ます。 ソースコードはこちらのを使用します。examples/cube.elm Main 部分は以下のような感じです。 main : Program Value Float Float main = Browser.element { init = \_ -> ( 0, Cmd. 2018年10月21日 Parcelで静的ページをつくってみた 背景 だいぶ昔に、自分のホームページ製作をやろうかなーと思い、中途半端に作って放置してたのですが、 今回重い腰を上げて製作を始めようとしました。 しかし、そんな私の前に立ちふさがったのは、はるか昔に作成したまま動かぬものと化したgulpfile。 何もしてないのに壊れたってやつです。(多分npmとかのバージョンガンガン上げてたからそれ) もうエラーを直すのも億劫なので、ビルド環境を作り直そうと思いちょっと前から気になっていたparcelを使って見ました。 結論から言うと、かなり簡単にサクッと導入できたので最高でした。 せっかく試したので軽くまとめておきます。 前提 すごくシンプルなこんなサイトを公開したかった(https://foresta.me) 公開したいのはHTMLファイル1つ CSSはSASSを使いたい JSはそんなに書かない想定 導入 最初に今回対応した、ページのリポジトリはこちらです。 (https://github.com/foresta/foresta.me) 今までのgulpfileなどを全削除して、npm initからはじめました。 $ npm init $ npm i -D parcel 今回のケースだと環境構築は以上で終了なので非常にお手軽です。 ローカルでの開発 今回作成したページのディレクトリ構成はこんな感じになっています。 $ tree -I "node_modules" . ├── README.md ├── dist/ ├── package-lock.json ├── package.json └── src ├── app.js ├── images │ └── profile.jpg ├── index.html └── sass ├── _base.scss ├── _color.scss ├── _font.scss ├── _media-query.scss ├── _reset.scss └── style.scss 4 directories, 20 files 以下のコマンドを打つと、ビルドとローカルにサーバーが立ち上がるのでそこで動作確認しつつページを実装していけばOKな感じです。 (自分が試した時は, localhost:1234 が立ち上がりました) 2018年10月14日 Elmに入門してみた その3 Elmに入門してみたのでそのメモです。 今回は、The Elm Architectureについて簡単にまとめます。 その1はこちら その2はこちら The Elm Architecture Elmは言語が特定のアーキテクチャ推奨しているという珍しい一面があります。 そのアーキテクチャですが大きく分けて以下の三つの部品からなります. Model – アプリケーションの状態を管理する Update – 状態を更新するためのロジック View – HTMLで状態を表示するためのロジック ソースコードをみるとわかりやすいと思いますので、今回はgithubで公開されている簡単なサンプルを取り上げて見ていきます。 The Elm Architectureについてのサンプル実装はこちらです。 https://github.com/evancz/elm-architecture-tutorial/ このサンプルの中からボタンをクリックのものを今回は見ていきます。 +ボタンと-ボタンが表示され、それぞれ押されるたびにModelの数値がincrement/decrementされるというものです。\ 実際の動きはこんな感じ。 短いのでソースコード全文を載せます。 import Browser import Html exposing (Html, button, div, text) import Html.Events exposing (onClick) main = Browser.sandbox { init = init, update = update, view = view } -- MODEL type alias Model = Int init : Model init = 0 -- UPDATE type Msg = Increment | Decrement update : Msg -> Model -> Model update msg model = case msg of Increment -> model + 1 Decrement -> model - 1 -- VIEW view : Model -> Html Msg view model = div [] [ button [ onClick Decrement ] [ text "-" ] , div [] [ text (String. 2018年10月7日 Cocos2d-xのActionまとめ 基本編 Cocos2d-xでアニメーションを行うのによく用いるActionクラスをまとめました。 ソースコードはこちらから https://github.com/foresta/ActionSample/blob/master/Classes/TestScene.cpp 基本編と応用編とイージング編に分けてまとめていきます。 環境 OS X High Sierra Cocos2d-x 3.17 アクションまとめ Actionの基本 Node::runAction(Action* action)を用いてアクションを実行します。 ActionにはByとToが存在することが多いです。 Moveの例で説明すると、MoveByが今のNodeの位置からどれだけ移動するかで、MoveToはどこに向かって移動するかになります。 相対的な指定と、絶対的な指定ができるイメージです。 状況に応じて使い分けましょう。 Move void TestScene::move() { // iconを(x: 50, y: 0)分だけ、1秒間かけて移動 this->icon->runAction(MoveBy::create(1.f, Vec2(50.f, 0))); } Rotate void TestScene::rotate() { // iconを1秒かけて一回転 this->icon->runAction(RotateBy::create(1.f, 360.f)); } Scale void TestScene::scale() { // iconを1秒かけて、2倍の大きさにする this->icon->runAction(ScaleBy::create(1.f, 2.f)); } Skew void TestScene::skew() { // iconを1秒かけて、x方向に30だけ歪ませる this->icon->runAction(SkewBy::create(1.f, 30.f,0.f)); } Resize void TestScene::resize() { // iconを1秒かけて、(x: 100, y: 50) だけ多くリサイズする this->icon->runAction(ResizeBy::create(1. 2018年9月30日 Elmに入門してみた その2 Elmに入門してみましたのでそのメモです。 今回はElmの型についてまとめてみました。 その1はこちら 環境 私の環境が以下のような構成のため、それを想定した記事となっています。 OSX High Sierra elm 0.19.0 vim 8.1 Elmの型 Elmの型について以下の4つをまとめていきます。 Type Annotations Type Alias Custom Type Cardinality Type Annotations 型アノテーションをメソッドや変数につけられる -- 変数 num : Int num = 3 -- 関数 square : Int -> Int square n = n^2 distance : { x : Float, y : Float } -> Float distance { x, y } = sqrt (x^2 + y^2) Type Alias 型に別名をつけられる 2018年9月23日 Elmに入門してみた その1 背景 フロントエンドの技術を何か身に付けたいなぁと考えていた時、Rebuild.fm#214でElmの話をきき良さそうだなと思い軽く触ってみました。 私のスペックとしては、サーバーやゲームのクライアントがかけるエンジニアで、JSは書けるけどReactやVueなどのフレームワークは触ったことがないくらいのレベルです。 また、関数型言語についてもElixirやlispを少し触ったことがあるくらいでそこまでガッツリ触ったことがないというレベルです。 今回は公式のガイドやドキュメントを眺めて得た知識を簡単にまとめます。 その1ということで簡単に、シンタックスなどをまとめます。 環境 私の環境が以下のような構成のため、それを想定した記事となっています。 OSX High Sierra elm 0.19.0 vim 8.1 Elmとは? ElmはJavaScriptにコンパイルできる関数型言語で、Reduxの元になった言語と言われてます。 仮想DOMを標準でサポートしています。 また、Elm Architectureというアーキテクチャを言語レベルで定めているのも面白い一面かなと思います。 インストール Elm brewで一発 $ brew install elm インストールすると以下のツールが手に入ります。 elm repl elm reactor elm init etc… vim elmcast/elm-vimを入れてます。 vim 上で使えるようにするため、フォーマッタなどを入れます。 # vim上でunit testできるようにするやつ $ npm install -g elm-test # コード補完とdocument $ npm install -g elm-oracle # フォーマッタ $ npm install -g elm-format パッケージ管理にはdeinを使っています。適宜読み替えてください。 call dein#add('elmcast/elm-vim') 文法 基本 コメントアウト 2018年9月16日 isucon8予選に参加してきました 9 / 15 の予選1日目の土曜日にチーム名「さばかんちゃーはんかれー」として参加して来ました。 2年前のisucon6にも出場したのですが、今年は本選に参加するぞという意気込みで、5月くらいから過去問解いたり準備を進めていたと思います。 結果としては予選落ちとなってしまいましたが、 限られた時間内で、アプリケーションを高速化させるという非常にエキサイティングな時間を過ごすことができました。 楽しい問題とリッチなダッシュボード等すごく恵まれた環境下でできたなぁと、運営の方々には感謝しかないです。 運営の皆様ありがとうございました。 また、おなじチームで参戦してくださったお二方(@peto_tn, @matsukaz) ありがとうございました。 そして、参加された皆様おつかれさまでしたー。 ざっくりタイムライン 自分が観測できた範囲をざっくりと。 実際にはもうちょっとミドルウェアのチューニングとか行ってます。 時間 やったこと 10:00 レギュレーション読み 10:10 参考実装をGoに変えてベンチ. たしか1000点ちょっとオーバーくらい. ソースをgithub管理にしたり、アプリをぽちぽちして仕様把握 10:30 profile系をガツガツ入れてく ひたすらソースコードリーディング 15:50 getEventをリファクタしスコアが一気に3万点近くまで上がりみんな盛り上がる。わいわい 16:20 H2Oからapp1, app2をラウンドロピンで実装.DBサーバーの構成に変更 17:00 ベンチがFailしはじめ原因調査 18:00 ベンチがFailする問題をを完全に対処しきれず、原因が特定できないまま、appの実装を戻してFinish. 一時は上位の順位争いに加われてわいわいした空気になってました。 わいわい わいわいしてた時のスクショ 自分やったこともうちょっと詳しく sheetsテーブルをコードで置き換える sheetsテーブルは以下のようなデータ構造でした。 id rank num price 1 S 1 5000 2 S 2 5000 ・・・ 50 S 50 5000 51 A 1 3000 52 A 2 3000 ・・・ はじめ、sheetsテーブルにあるDBのレコードを全て 2018年9月9日 DIPを意識してgoを書いてみる 背景 go言語を触っていて、DuckTypingによるインターフェースとDIPとの相性がかなり良いものだなぁ感じ試して見た記事です。 以前のアーキテクチャについての記事にも書きましたが、ソフトウェアの詳細にビジネスロジックが依存しない方が好ましく、 できれば実装の詳細についての判断をできるだけ遅くすることがアーキテクトの腕の見せ所と言えます。 そこで今回は以下のユースケースをDBに依存することなく実装を進めて見たいと思います。 ユーザー一覧の表示 ユーザーの登録 ソースコードはこちら(http://github.com/foresta/go-dip-sample) DIPとは SOLIDの原則と言われるクラス設計の原則の中の一つで、日本語だと依存関係逆転の原則と言います。 ソースコード 全体のファイル構成はこんな感じです。 src/ ├── memory │ └── user_repository.go ├── mysql │ └── user_repository.go ├── server.go └── user ├── user.go └── user_repository.go パッケージは user, memory, mysql の三つで user がソフトウェアドメインに関するパッケージ、 memory, mysqlはデータストア (インフラ) に関するパッケージです。 今回はmysqlを準備することなくメモリ上にユーザーデータを保存をできるようにします。 ユーザーは以下のようなデータ構造とします。 // user.go package main type User struct { ID int Name string Email string } 保存にはUserRepositoryというインターフェースを使用することにします. // user_repository.go package user type Repository interface { Store(u *User) error FindAll() []*User } 以下にmainパッケージの処理全てを載せます。\ 2018年9月2日 書籍「Clean Architecture」を読んだまとめ 普段からソフトウェアの設計やアーキテクチャに関心があり色々調べていたのですが、 最近発売された、「Clean Architecture」がとても良さそうなので読みました。 結果すごく良かったのでエッセンスをまとめます。 書籍「Clean Architecture」 Clean Architecture 達人に学ぶソフトウェア構造と設計 この本は、「ソフトウェアの価値とはなんなのか」という着眼点から始まり、プログラミングのパラダイムに軽く触れたのちに、アーキテクチャの話に深く入っていきます。 題名から、いわゆる設計手法としての「Clean Architecture」についての話かと思いがちですが 内容はアーキテクチャとは何か、どういった目的意識があるのかいうアーキテクチャ全体的な概念などの非常にためになる話が多くいくつも気づきがありました。 以下、簡単にまとめます。 ソフトウェアの価値とは ソフトウェアの価値は、「提供する機能」と「更新できること」にあります。 「提供する機能」とはそのままの意味で、そのソフトウェアが問題を解決することに価値があるということです。 「更新できること」は需要や周りの環境の変化に応じてソフトウェアが変化できること自体に価値があるということです。 ソフトウェアの「ソフト」とは柔軟に変化できることを表していて、継続的に更新できることは大きな価値になり得ます。 アーキテクチャとオブジェクト指向 アーキテクチャの目的とは、ソフトウェア継続的に更新し続けられる柔軟な状態にすることにあると言えるでしょう。 このため、変更が頻繁に起きるところと少ない箇所を分離しお互いが影響しないように適切にソフトウェアの境界を引いて行くことが重要です。 またソフトウェアには「方針」と「詳細」があるという風に言われています。 方針はソフトウェアがどのように問題を解決するかの方針、つまりはビジネスロジックのことを指します。 詳細とはデータベースや、フレームワーク、UIなどのことを指します。 この二つのうち、変更が頻繁に起こるのは「詳細」の方だと思います。 ソフトウェアの目的は「方針」側にあります。 (データベースの種類や、どのフレームワークを使用するかなどの詳細はソフトウェアの本質ではないということ) この「方針」が「詳細」の変更に影響されないように(詳細に依存しないように)依存関係を管理することがアーキテクトの腕の見せ所です。 依存関係を完全に管理するためには、オブジェクト指向プログラミング (以下OOP) のパラダイムが非常に役に立ちます。 OOPの特徴であるポリモーフィズムにより、オブジェクト (あるいはコンポーネント) 同士の依存の方向を制御することができます。 具体的には、SOLIDの原則のDIP (依存関係逆転の法則) で依存の方向を逆転させることで、方針が詳細に依存しないようにして行くことができます。 ちなみに、SOLIDの原則については以下の本に非常に詳しく書かれています。 アジャイルソフトウェア開発の奥義 第2版 オブジェクト指向開発の神髄と匠の技 私もこの本に出会うまでは、SOLIDの原則について全く知りませんでした。 非常に分厚く読み応えがすごいですが、今ではプログラミングをする上の指針となる大事な原則を得られ、読んで良かったと思える一冊です。 話を戻しまして、書籍「Clean Architecture」には、ソフトウェアのどこに境界を引くのか、依存関係をどうやって管理するのか、についての具体的なエッセンスが多く書かれていました。 ここでは詳細には触れませんが、どのようにコンポーネントを分離するのかや、設計手法であるクリーンアーキテクチャの紹介などが印象的でした。 アーキテクチャの概念等の抽象的な話題から、実際にどうアーキテクチャを考えて行くかの指標になる具体的な話題まで揃っていて非常にお得感のある本でした。 感想 最初にこの本を読もうと思ったのが、kindle版の無料サンプルで公開されている以下の文を読んでこれは面白そうだぞっと感じたのがきっかけです。 崩壊したコードを書くほうがクリーンなコードを書くよりも常に遅い Robert C.Martin; 角 征典; 高木 正弘. Clean Architecture 達人に学ぶソフトウェアの構造と設計 (アスキードワンゴ) (Kindle の位置No.460). 株式会社ドワンゴ. Kindle 版. 他には、 2018年8月31日 週一ブログチャレンジ宣言 自分を追い込んで行くために宣言します。 週一ブログチャレンジ宣言とは 週一でブログを更新するという強制的なOutputの習慣をつくり、InputとOutputのサイクルを回し、より深い知識を得ようとする試みのことです。 モチベーション 私はエンジニアとして働かせてもらっていますが、周囲の優秀なエンジニアと自分を比較して劣等感に苛まれることが多々あります。 そこで優秀だと思うエンジニアと自分の決定的な違いは何なのか?また、どんなとき優秀だなぁと思うのか? という疑問が生まれてきました。 まず、圧倒的に自分にはOutputの量が足りないなぁということ。そして優秀だと感じる瞬間は (当たり前ではありますが) Outputした瞬間であることであると考えました。 まずはOutputの習慣を作ること。そして、Output駆動でより多く深いInputを得ることを目的として週一でブログを更新していこうと思い至りました。 ルール 自分の中で以下のルールを定めました。 ブログを毎週1記事以上書いて公開する 書いたブログはTwitter等でシェアする 締め切りは毎週日曜日23:59まで (終わるまで寝れない) ブログの内容は問わない 4番目に関しては、内容は問いませんがあくまで「InputとOutputのサイクルを回す」「深い知識を得る」という目的に沿っていればOKという前提はあります。 意気込み 頑張るぞ! (これ続かなかったらすごく恥ずかしい結果になりそうだなぁ……) 2018年8月2日 Planckキーボードを作ってみた 2018年4月15日 Hugoで作成したブログをPWA対応した(ホーム画面に追加のみ) 背景 PWA(Progressive Web Apps)自体は以前から気にはなっていたのですが、最近iOS11.3のSafari11.1から対応されるとのことで周囲でちょっと盛り上がってたので自分のブログに対応させてみたくなってしまったので対応させました。 今回説明するのはホームスクリーンにアイコンを設置できるようにするところまでです。 前提 公式サイトによるとバナーが出る条件は以下のようになっています。 * 次の情報が記述されたウェブアプリ マニフェスト ファイルが存在する。 - short_name(ホーム画面で使用) - name(バナーで使用) - 192x192 の png アイコン(アイコンの宣言には MIME タイプ image/png の指定が必要) - 読み込み先の start_url * サイトに Service Worker が登録されている。 * HTTPS 経由で配信されている(Service Worker を使用するための要件)。 * 2 回以上のアクセスがあり、そのアクセスに 5 分以上の間隔がある。 対象のWebサイトのhttps対応が必須なので やられてない方はLet’s Encryptなどを用いてhttps対応してください。 (手間みそですが、さくらVPSに導入する記事です。https://qiita.com/kz_morita/items/ba9c171633ca54d72d2a) やったこと https対応はすでにしているので今回やらなきゃいけないことは以下の二つです。 manifestファイルの用意 ServiceWorkerの登録 順に説明していきます。 manifest.jsonの作成 以下のようなjsonファイルを作成しました。 { "icons": [ { "src": "images/logo/logo-512.png", "sizes": "512x512", "type": "image/png" }, { "src": "images/logo/logo-256.png", "sizes": "256x256", "type": "image/png" }, { "src": "images/logo/logo-192. 2017年12月2日 Elixirで線形回帰してみた この記事はElixir Advent Calendar 2017の17日目の記事です。 最近始めたElixirで何かOutputしたいということで線形回帰のアルゴリズムを実装してみました。 リポジトリはこちら https://github.com/foresta/mlex.git Elixirでも機械学習できないこともない(かもしれない)ことを書いていこうかなと思います。 背景 最近の私の興味があるものとしてEilxirと機械学習があります。 Elixirはサンプルアプリや簡単なツールを制作した程度、機械学習はcourseraのコースを一通りやり本を数冊読んだ程度です。 今回はその両方の学習と、どうせ機会学習アルゴリズム実装するなら書きごごちの良いElixirで書いてみたいと思い実装してみました。 線形回帰とは データを元に線形モデルを作成しその線形モデルを用いて未知のデータを予測するものです。 図1はデータの次元が2次元の場合の線形回帰の概念を示し、×印が与えられたデータ、直線が学習した結果の線形モデルを表しています。 図1 線形回帰のサンプルグラフ 詳しくはこちらのサイトを参照してください。 https://qiita.com/ynakayama/items/5732f0631c860d4b5d8b http://gihyo.jp/dev/serial/01/machine-learning/0008 学習データ 今回学習には以下のデータセットを使用しました。 linnerud_physiological.csv linnerud_exercise.scv linnerud_physiological.csvには体重・ウエスト・心拍数等の身体的特徴データが、 linnerud_exercise.csvには懸垂・腹筋・跳躍に関するデータがあります。 今回は身体的特徴と、懸垂のデータで線形回帰をしてみます。 実装 使用したライブラリは以下のような感じです。 defp deps do [ {:matrix, "~> 0.3.0"}, {:csv, "~> 2.0.0"}, {:explotter, git: "https://github.com/foresta/explotter.git"} ] end ソースコードは以下のような感じです。 mlex/apps/sample/lib/linnerud.ex def run do # 1. load dataset features = load_linnerud_feature_dataset() targets = load_linnerud_target_dataset() # 2. setup featuresex pulses = features[:pulse] waists = features[:waist] weights = features[:weight] number_of_data = length pulses bias = for _times <- 1. 2017年7月7日 alfred上でshellを実行する 日頃開発をしていて、面倒な作業をshellにするのはよくやられていることだと思うが、 毎回ターミナルから実行するのがちょっと面倒だった。 自分はalfredというランチャーソフトをつかっていて、Alt + Spaceで簡単によびだせる設定にしているので、ここからshellを実行できないもんかなーと思って調べてみたらできたのでまとめてみる。 環境 OS X El Capitan Alfred 1.2 方法 任意のシェルを作成する(hoge.sh)とする 実行権限をつける hoge.shをhoge.appにリネーム alfredから実行 これだけ。 シェルを作成しただけだと以下のようになって実行はできない。 がリネームするとこうなる。 ためしにデスクトップ通知をするだけのshellを書いてみる。 hoge.sh #!/bin/bash↲ if [ "$(uname)" == 'Darwin' ]; then↲ # デスクトップ通知↲ osascript -e 'display notification "hogehoge" with title "title"'↲ fi↲ これを実行すると次のようにちゃんと実行できる。 これは色々とはかどりそうで良いぞ。 こういうのでどんどん開発効率を上げていきたいですね。 2017年6月27日 Cocos2d-xで並列に通信をする 先に結論 シーケンシャルに通信するときは HttpClient::send(HttpRequest* request); パラレルに通信するときは HttpClient::sendImmediate(HttpRequest* request) を使用すれば良さそう。 背景 アプリケーションが画像などのアセットを取得するときに、1件ずつシーケンシャルにダウンロードするのではなく並列に通信したかった。 結論までの経緯 まず内部実装をみてみる。 それっぽいのがHttpClient::sendクラスだったのでその実装を見ていく。 //Add a get task to queue void HttpClient::send(HttpRequest* request) { if (false == lazyInitThreadSemphore()) { return; } if (!request) { return; } request->retain(); _requestQueueMutex.lock(); _requestQueue.pushBack(request); _requestQueueMutex.unlock(); // Notify thread start to work _sleepCondition.notify_one(); } 詳しくは見ないが、_requestQueueにリクエストを詰めているだけのようだ。 その_requestQueueはどこ使われているかというと 同じくHttpClientクラスのnetworkThread()で使用されていた。 // Worker thread void HttpClient::networkThread() { increaseThreadCount(); while (true) { HttpRequest *request; { std::lock_guard<std::mutex> lock(_requestQueueMutex); while (_requestQueue.empty()) { _sleepCondition.wait(_requestQueueMutex); } request = _requestQueue. 2017年6月21日 jenkinsさんが503 Service Unavailableと言ってるのを修正したメモ Jenkinsさんが動かなくなってしまったので対応したメモ 借りているさくらVPSのCentOS6.7で軽い気持ちで $ sudo yum update したらJenkinsが動かなくなってしまった。 具体的には503が返ってきてしまう。 とりあえず、原因を調査するためにlogを見てみる。 自分の環境では以下にある。 $ /var/log/jenkins ログの中には以下のような記述が。 ・・・ Jenkins requires Java7 or later, but you are running 1.7.0_79-b15 from /usr/java/jdk1.7.0_79/jre java.lang.UnsupportedClassVersionError: winstone/Launcher : Unsupported major.minor version 52.0 ・・・ Javaのバージョンによるエラーっぽかったので公式サイトを見てみる。 すると以下のissueがたってた https://issues.jenkins-ci.org/browse/JENKINS-43492 yum updateでJenkinsがアップデートされ、Java8が必須になったみたいなので対応していく。 Javaインストールが必要な場合は以下の記事が参考になると思う。 http://qiita.com/Sa2/items/8ba501294df745be8c78 自分の環境だと、すでにJava8はインストール済みだったのでalternativesでjavaのバージョンを変更する $ sudo alternatives --config java alternatives結果 このdefaultがjava8だったのでこれを使用するように変更したのちに、Jenkinsを再起動したら無事動きました。 よかったよかった。 参考にしたサイト様 http://blog.officekoma.co.jp/2017/04/jenkins-http-error-503-service.html 2017年6月13日 CentOS6系のyum updateでつまづいたのでメモ 背景 let’s encryptの証明書更新用に仕込んだcronがエラーを吐いているようで、 原因を調査したところyum install系で更新ができないエラー。 yum updateすればなおるかなーと思ったがそもそもyum updateも404返ってきてうまくいかない。 どうやら、yumのリポジトリのミラーが古いバージョンのままになったようでした。 環境 さくらVPS CentOS 6.7 解決方法 以下のサイトが非常に参考になったので、その通り下記の対応をしたら無事に解決した。 よかったよかった。 [tips][Linux]旧バージョンCentOSでyum更新できなくなった時 $ su - $ cd /etc/yum.repos.d $ cp -p CentOS-Base.repo CentOS-Base.repo_yymmdd $ sed -i -e "s|mirror\.centos\.org/centos/\$releasever|vault\.centos\.org/6.7|g" /etc/yum.repos.d/CentOS-Base.repo $ sed -i -e "s|#baseurl=|baseurl=|g" CentOS-Base.repo $ sed -i -e "s|mirrorlist=|#mirrorlist=|g" CentOS-Base.repo $ cp -p CentOS-SCL.repo CentOS-SCL.repo_yymmdd $ sed -i -e "s|mirror\.centos\.org/centos/\$releasever|vault\.centos\.org/6.7|g" /etc/yum.repos.d/CentOS-SCL.repo $ sed -i -e "s|#baseurl=|baseurl=|g" CentOS-SCL.repo $ sed -i -e "s|mirrorlist=|#mirrorlist=|g" CentOS-SCL. 2017年6月5日 DDD本を読んだのでメモ 導入〜第1章まで 前から読みたかったDDD本を、読み始めたので雑にメモしていく。 ドメインとは、そのシステムが解決したい問題の領域のこと。 DDDにおいてのモデルとは、以下のようなもの 設計と相互に形成し合う チームメンバが使用する言語の基盤 蒸留された知識 設計と相互に形成し合う これはDDDがモデル駆動開発で進められることを意味している。 設計時にモデルを書きそこからコードを書き始める。 また逆に、コードを書き始めて気づいたことなどをモデル側にも反映させることでモデルとコードを一緒に成長させていく。 チームメンバが使用する言語の基礎 これは後ほど出てくるユビキタス言語について。 チームメンバ同士がコミュニケーションする際には、モデルや実際にコード上で表現されている言葉を用いる(逆にコミュニケーションに用いられる言葉をコードに落とし込む) 蒸留された知識 モデルはドメインの知識をそのまま反映したものであるべき。 モデルと実装が紐付いていれば、コードから得た知見をモデルに反映できる。 そうして、どんどん知識は噛み砕かれてよりドメインを明確に表すものに蒸留されていく。 これらの設計を進めていくためには、ドメインの知識を噛み砕く必要がある 第1章 知識を噛み砕く ドメインエキスパートの頭の中にあったり、過去のシステムなどからドメインに関する知識を得ることが重要で、繰り返し継続的にドメインに関する知識を学習する必要がある。 得た知識の中から重要な概念を抽出し、それをそのままコードに落とし込む。 オブジェクト指向でよく言われる、名詞を抽出するという手法の他に、 ビジネスルールなども概念として抽出する。 ビジネスルールなどはよくif文の中などに現れる。 例えばATMでお金を引き出せる時間かどうかのロジックについて考えると、 以下のように書かれることがある。(適当な疑似コード) Time now = Time::Now(); Time am9 = Time(9,0,0); Time pm10 = Time(22,0,0): if (am9 < time && time < pm10) { // 引き落とし処理 } このようにしてしまうと、処理の中に重要な業務ルール(引き落とし可能時間) が隠れてしまう。 そこでPolicyクラスなどを作成すると良いとされている。 if (businessHourPolicy.isAllowed(Time::Now())) { // 引き落とし処理 } ただしこのような手の込んだ設計はどこにでも適用することは推奨されていない。 ドメインの中でも特に重要となる知識に対して行うことが重要。 このようにして書かれたコードはドメインエキスパート(非エンジニア)にもコードを見せることができ、プログラマの手助けがあれば理解することができる(はず)。 また、コードを書いたことによる気づきなどをモデルにフィードバックさせ、知識を深めていく。 深いモデル アプリケーションが解決しようとしている問題の核心を表すうまいモデルのこと。 深いモデルを見つけるために、開発を続け、ドメインの知識について継続的に学習・嚙み砕きを行うことが重要とされる。 雑なまとめ DDDはモデル駆動開発 モデルをコミュニケーションに活用する より深いモデルのためにドメイン知識の嚙み砕きを継続的に行う 2016年12月19日 OptionParserのソースコードを読む この記事はElixir (その 2)と Phoenix Advent Calendar 2016 の 1 9日目の記事です。 背景 書籍「プログラミング Elixir」の 13 章でお世話になった OptionParser がとても便利そうだったので、中身の理解と Elixir のソースコードに慣れる目的で、ソースコードを読んでみました。 メインである parse/2 を中心に説明します。 下記に記載するソースコードは全て、公式のものを引用しています。 環境 Elixir 1.3.3 ドキュメント ソースコード おおまかな流れ parse/2 (外部に公開するインターフェース) do_parse/6 (実際にパースの再帰処理を行っているところ) next/4 (パース処理) ソースコード parse/2 まずはメインの parse/2 です。 parse/2 @spec parse(argv, options) :: {parsed, argv, errors} def parse(argv, opts \\ []) when is_list(argv) and is_list(opts) do do_parse(argv, compile_config(opts), [], [], [], true) end 引数の opts をcomple_config/1を通して加工してdo_parseに渡しています。 また、do_parse/6の結果をそのまま返しています。 2015年8月12日 Homesteadに複数サイトを追加する二つの方法 2015年7月15日 Homesteadを使ってLaravel5を動かしてみる