タグ

ブックマーク / blog.shibayu36.org (56)

  • golangでAPIなど外部にアクセスするロジックのテストをする - $shibayu36->blog;

    golangで、例えばGithubAPIを叩くような、特定のAPIにアクセスするロジックを書いた時、何も考えずにテストを書くと、テストを実行する際にもそのまま外部のAPIにアクセスしてしまう。この場合、色んなパターンのテストを書きづらい、依存している外部サービスが落ちたらテストも一緒に落ちるなどの問題が起こる。 このような問題から、統合テストではなくユニットテストのときは手元のみで完結して、外部サービスに依存しない状況でテストを書きたくなることがある。そこで今回は外部にアクセスするロジックを、手元で完結させた状態でテストする方法を試したので、その方法について書いてみる。 テストしたいコード 例えば以下のようなコード。Githubの https://github.com/shibayu36/shibayu36 の最新のリリースタグを取得し、そのリリースタグ名を出力する。これはGithub

    golangでAPIなど外部にアクセスするロジックのテストをする - $shibayu36->blog;
  • zsh-autoenvを使って、virtualenvの自動activate/deactivateを実現する - $shibayu36->blog;

    pyenv + venvでPython3環境を構築する - $shibayu36->blog; の記事で、特定のPythonプロジェクト用のvirtualenv環境を導入することが出来ました。しかし、このプロジェクトに入るたびにsource venv/bin/activateし、逆に抜ける時にdeactivateするのは 面倒 どう考えても実行を忘れる という問題があります。 そこでzsh-autoenvというzshプラグインを使って、自動でactivateとdeactivateを出来るようにしたのでメモしておきます。 zplugを導入する 今回の題から外れますが、zshのプラグインの管理ツールをこれまで入れてこなかったので、この機会にzplugを導入しました。 おい、Antigen もいいけど zplug 使えよ - Qiita https://github.com/zplug/zpl

    zsh-autoenvを使って、virtualenvの自動activate/deactivateを実現する - $shibayu36->blog;
  • pyenv + venvでPython3環境を構築する - $shibayu36->blog;

    機械学習のモチベーションを上げるためにTensorFlowを触ろうとしている。まずは環境設定でしょうということで、ひとまずPython3環境を作る。今はpyenv + venvで作るのが良いみたいなので、それでやってみたメモ。 pyenvでpythonをインストールする pyenvが必要かどうかフローチャート - Qiita も参考にしたのだけど、まあ細かくPythonのversionを指定したくなる時もありそうだし、とりあえずpyenvを入れておく。 自分は anyenv を使っているので、それでpyenvをインストール。 $ anyenv install pyenv 次にpyenvでpython 3.6.1をインストール。 $ pyenv install 3.6.1 $ pyenv versions system * 3.6.1 (set by /Users/shibayu36/.an

    pyenv + venvでPython3環境を構築する - $shibayu36->blog;
  • Pythonのvenvのプロンプト表示をカスタマイズする - $shibayu36->blog;

    pyenv + venvでPython3環境を構築する - $shibayu36->blog;の記事で、Python3でvenvを使った環境を構築することができた。しかしvenvでsource bin/activateすると、自分の設定したプロンプトの左側に(venvの環境名)という文字列が勝手に挟み込まれてしまって、あまり好みではなかった。 それを以下のように、venv環境の中にいたらpy:(pythonのversion):(venvの環境名)という表示にしたかった。 のでやってみた。 プロンプトの左側の環境名表示を消す まずプロンプトの左側の(venvの環境名)を消す。こちら を参考にして、VIRTUAL_ENV_DISABLE_PROMPTという環境変数を設定しておけば良いらしい。 # virtualenvでpromptを変更しない export VIRTUAL_ENV_DISABL

    Pythonのvenvのプロンプト表示をカスタマイズする - $shibayu36->blog;
  • 高速なRandomized Queueのアルゴリズムを実装する - $shibayu36->blog;

    CourseraのAlgorithms, Part Iというコースで、高速なRandomized Queueを実装するという話題があったので、試しに作ってみた。 高速なRandomized Queueとは Randomized Queueとは、Queueからdequeueするときに、中に入っている要素の中からランダムに一要素取り出すようなQueueである。 また「高速な」とは、enqueue、dequeue、isEmpty、sizeなどの操作の実行時間が、"constant amortized time"であること、つまり何回も操作を繰り返していくと、平均的には定数時間でそれぞれの操作が終わるということである。 この二つを満たすものを高速なRandomized Queueと呼ぶ。 実装 高速なRandomized Queueを実装すると次のようになった。 import java.util.

    高速なRandomized Queueのアルゴリズムを実装する - $shibayu36->blog;
  • CircleCIでJava8 + Gradleプロジェクトのテストを行う - $shibayu36->blog;

    興味位で自分のアルゴリズム実装repository( https://github.com/shibayu36/algorithms )のテストをCircleCIで動かしてみようと考えた。基的にCircleCIはcircle.ymlに設定を追加したら終わりなのだけど、何を設定すればいいか少し調べる必要があったのでメモ。 設定 Configuring CircleCI - CircleCI などを見ながら、最終的なcircle.ymlは以下のようになった。Circle CIでJavaを使ってビルドする | さにあらず や CircleCIでJUnitの結果を見る - Qiita あたりも参考になった。 machine: java: version: oraclejdk8 timezone: Asia/Tokyo environment: GRADLE_OPTS: -Xmx4G post:

    CircleCIでJava8 + Gradleプロジェクトのテストを行う - $shibayu36->blog;
  • nanobenchを使ってJavaのベンチマークを取る - $shibayu36->blog;

    アルゴリズムを学習していると、ある実装の速度がどのくらいか計測したいことがよくある。これまでは、currentTimeMillisを利用して、愚直にベンチマークを取っていたのだけど、結構だるい感じだった。 調べてみると、jmh と nanobench という二つのツールがあった。jmhは使ってみたけど、非常に重厚で難しかったので、nanobenchを使ってみた。 ハマったこと nanobench のREADME.mdを見ていると、nanobench.jarを落としてきて、以下のように実行すると良いと書いてある。 > javac ListBenchmark.java > java -jar nanobench.jar ListBenchmarkしかし、Java初心者のためか、jarファイルのことがよく分からなかったり、classpathの問題でハマったり、とにかくハマりまくってうまく動かなか

    nanobenchを使ってJavaのベンチマークを取る - $shibayu36->blog;
  • Javaに入門している(その1) - $shibayu36->blog;

    Javaでアルゴリズムを紹介しているに書いてあるアルゴリズムを全部Javaで実装してみるというのをやってみたかったので、まずJavaに簡単に入門している。 Javaの構文を理解する まあ簡単だった。 スッキリわかるJava入門を読む まあ素直な構文なので分かった気になる http://d.hatena.ne.jp/nattou_curry_2/20100130/1264821094 このくらい読んでおくだけでも良さそうだった IntelliJでとりあえずHelloWorldを動かす ここまでも簡単。 とりあえずNew Projectして、Javaプロジェクトを作る srcディレクトリに入れるらしいことがわかる src/HelloWorld.javaを使ってmainメソッドでprintする IntelliJでRunボタンを押したら普通に動く なるほど簡単 Javaでもテスト書けるようにする

    Javaに入門している(その1) - $shibayu36->blog;
  • はてなインターンの事前課題をJavaでやった - Java入門記(その2) - $shibayu36->blog;

    はてなインターンの事前課題で非常に簡単なltsvパーサーを作るやつがあるのだけど、Javaの勉強のためにJavaで実装してみた。ltsvパーサーは結構いろんな言語で誰かが実装しているので、これどうするのがいいのかってなったら、その実装を見に行くとやり方を理解できて便利。 事前課題 https://github.com/hatena/Hatena-Intern-Exercise2015 やったやつ https://github.com/shibayu36/java-Intern-Exercise これでいいのか気になるところもあるので、詳しい人に添削されたい。 日付操作こんなのでいいのか https://github.com/shibayu36/java-Intern-Exercise/blob/master/src/main/java/org/shibayu36/intern/exerci

    はてなインターンの事前課題をJavaでやった - Java入門記(その2) - $shibayu36->blog;
  • 「リファクタリング・ウェットウェア」を再読した - $shibayu36->blog;

    最近、学生時代よりも学習時間を取れなくなっていて、このままだと新しいことが身につかなくなっていっていくのではという危機感があった。またメンターをするにあたって、人の学習モデルをある程度理解しておいて、アドバイス出来るようにしたいという思いもあった。そこで、昔読んだ「リファクタリング・ウェットウェア」に、学習に関することが書いてあった記憶があったので、さらっと再読した。 [asin:4873114039:detail] このは、人間の脳について研究していた著者が、脳の働き方などについて解説し、その上で脳を活かすためにはどのようにしたら良いかについて解説している。脳をハックするということを題材にしているのが面白い。 このを読むと、人間の技能習得モデルとか、より良い学習の仕方とか、直感をうまく活かす手法とか、そのようなことを学ぶことが出来る。一度でも読んでおくと、今後の学習が効率的になるの

    「リファクタリング・ウェットウェア」を再読した - $shibayu36->blog;
  • 知識ゼロからElasticsearchを実践で使えるようになろう! - $shibayu36->blog;

    以前少しだけElasticsearchを触った時に、自分流Elasticsearch入門 - $shibayu36->blog; というElasticsearchに入門した時のメモをまとめていた。しかし、その頃はElasticsearchを使って完全に一人で一つの機能を作るというところまではいけなかった。 最近になってまたElasticsearchを一から導入する仕事をすることになった。この時以前自分がまとめた記事を読みながらやっていたのだが、実践で一から導入するためにはこの記事だけでは知識が足りなかった。 そこで、前の記事の知識をベースに、一から導入するために少しずつ学んでいき、自分のブログにまとめるなどのことをしてきたので、今回はその締めくくりとして、知識ゼロからElasticsearchを使えるようになるために学習したことについて書いておきたいと思う。 今回書くこと・書かないこと 今

    知識ゼロからElasticsearchを実践で使えるようになろう! - $shibayu36->blog;
  • JavaScriptのPromiseの概念について学習した時に参考にしたもの - $shibayu36->blog;

    JavaScriptのPromiseを使った実装をコードレビューしていたのだけど、やってみたら自分があんまりPromiseについて理解できていなかったことに気づいた。特にこれまでjQueryのajaxやjQuery Deferredをなんとなく使っていたのだが、Promiseの根的な概念がjQueryの巨大な仕様の中に埋もれていて、自分の中でjQueryの機能とPromiseの概念を分離して正しく言語化出来ていなかった。 そこでPromiseの根的な概念を再学習したので、何を参考に勉強したかを書いておく。 PromiseについてはとにかくJavaScript Promiseのを読めば大体把握できる。このドキュメントを読めば Promiseの概念 ES6 Promiseの利用方法 Deferredとの関係性 などといったことを知ることができる。 個人的には次の部分が特に参考になった。

    JavaScriptのPromiseの概念について学習した時に参考にしたもの - $shibayu36->blog;
  • Elasticsearchのインデックス定義を設計する手順 - $shibayu36->blog;

    Elasticsearchを使おうとすると、まずアプリケーションの仕様にしたがってインデックス定義やマッピング定義を設計しなければならない。これはMySQLを使っていてスキーマを考えるフェーズに相当する。 この時、考えることが非常に多く、いろいろなドキュメントを参照し設計したので、今回はその手順について書いていきたいと思う。 インデックスやマッピングが何かという話は、次の記事を参考に。 Elasticsearchチュートリアル - 不可視点 Mapping and Analysis | Elasticsearch: The Definitive Guide [2.x] | Elastic また対象とするElasticsearchのversionは記事執筆時点の安定版の2.3.5とする。 今回サンプルとする例 実際のプロジェクトを参考例にすることは流石にできないので、今回はブログの記事を検索

    Elasticsearchのインデックス定義を設計する手順 - $shibayu36->blog;
  • ElasticsearchのAnalyzerを理解するため全文検索の仕組みをシンプルに考える - $shibayu36->blog;

    Elasticsearchを使おうとしているとAnalyzerという概念が出てくるが、このAnalyzerという概念は最初理解することが難しかった。全文検索の仕組みを理解すれば分かるだろうと思い、https://speakerdeck.com/johtani/elasticsearchru-men?slide=5 やhttp://www.atmarkit.co.jp/ait/articles/1111/18/news148.html の記事などを読んで勉強してみたものの、こちらもいろんな言葉が出てきて非常に混乱した。例えば転置インデックス、tf-idf、トークナイズ、ストップワード、N-Gram、正規化などといった言葉が出てくる。 いろいろ調べてみて整理すると、全文検索の技術には、なぜ検索ができるかの話以外に、類似度の話、検索を高速に行うための話、あいまいな検索に対応する話など、いろんな話

    ElasticsearchのAnalyzerを理解するため全文検索の仕組みをシンプルに考える - $shibayu36->blog;
  • プロジェクト単位でElasticsearchのローカル開発環境を作成する - $shibayu36->blog;

    最近Elasticsearchを触っていて、まずはローカル開発環境を作ることになった。ただ、Elasticsearchはバージョンがかなり変わり、別プロジェクトと利用したいバージョンが異なっていたので、プロジェクト単位で使い分けるにはどうすればよいかを考えた。 やりたいこと プロジェクトごとにElasticsearchのバージョンを切り替えられるようにしたい MySQLだったら同じようなものにmysqlenvなどがある また、他の人が一瞬で環境を整えられるようにしておきたい 利用するプラグインなども含めて一瞬で バージョンを上げる時もローカル環境なら簡単にあげたい 作戦 Elasticsearchはここ からダウンロードして、特定のディレクトリに展開するだけでも利用できる そこでプロジェクトルートのelasticsearch/ディレクトリ以下に展開し、ここに展開したバイナリを利用するように

    プロジェクト単位でElasticsearchのローカル開発環境を作成する - $shibayu36->blog;
  • TypeScriptでのフロントエンド開発環境作成総まとめ - $shibayu36->blog;

    これまで自分のブログで、TypeScriptを使ったフロントエンド開発環境についてブログをいくつか書いてきた。ひとまずこの辺りで、TypeScriptフロントエンドを開発するための最低限の環境を構築できるようになったので、総まとめとしてブログエントリを書いておく。 今回のサンプルコードは https://github.com/shibayu36/typescript-project-sample/tree/4653cd002eef3ee1946a2ca1da344e0076b2844f に置いたので参考に。 これまでの記事 EmacsでTypeScript環境を整える - $shibayu36->blog; JSをbrowserifyでビルドし、ライセンスコメントを適切に残す - $shibayu36->blog; gulp + browserify + tsifyを利用してTypeSc

    TypeScriptでのフロントエンド開発環境作成総まとめ - $shibayu36->blog;
  • フロントエンド速度改善でやったこと(Expiresヘッダ、faviconのgzip圧縮、JSの読み込み遅延化) - $shibayu36->blog;

    フロントエンド速度改善をしようとして参考にしたもの - $shibayu36->blog; という記事を以前に書いたのだけど、結局何をやったか書いて欲しいと社内で言われたので、今回のフロントエンドの速度改善でやったことについて書いてみる。そこまで大したことはやってないので参考程度にどうぞ。 前提 ページのレンダリングが遅いと思い始めたので改善をすることになったのだが、改善をし始めたところChromeのアップデートがあり爆速になってしまった(FirefoxやSafari等はもともと速かった)ので、では明らかにやったほうが良いことだけやりますかという話になった。そのためあんまりbefore/afterもちゃんと取っていないので、今回はやったことの紹介くらいに留める。 やったこと 計測や調査をしてみたところ、以下のようなことはやってしまったほうが良いということになった。 静的ファイルに適切にEx

    フロントエンド速度改善でやったこと(Expiresヘッダ、faviconのgzip圧縮、JSの読み込み遅延化) - $shibayu36->blog;
  • Scala入門記 - $shibayu36->blog;

    僕はこれまでまともに学習したプログラミング言語がPerlJavaScriptしかなくて、静的言語的パラダイムや関数型パラダイムは概念は知っているものの、それがどう役に立つのか、逆にどういう面で課題がありどのように対処されているのか、などといったことを知らなかった。知らなくてもまあ仕事PerlとJSでやっているので問題ない。しかしすでにこれらの言語から得られる概念的な知識の吸収の速度が鈍化してきていて、このままではエンジニアとしてまずいのではないかという危惧感があった。 そこで静的言語であり、関数型言語であり、また社内でも使われ始めているためサンプルコードがあるScalaの学習をすることにした。 学習するにあたって困ったことは、どういうドキュメントを読み、どのように実践するとScalaの概観をつかめるか分からないということだった。そこで今回は自分の経験を踏まえて、このように入門していくと

    Scala入門記 - $shibayu36->blog;
  • プロジェクトを成功させるために最初におこなっていること - $shibayu36->blog;

    ディレクター時代に仕事プロジェクトを受け持つ時にどうやったら成功させることが出来るのかについていろいろ考えていた。僕は開発フローをいろいろ考えるのが好きなのだけど、実際に自分がリーダーシップを取ってプロジェクトを進めることを経験すると、そもそもその前に考える・決めるべきことがたくさんあるということが分かったので、ブログに書いておこうと思う。 ここで言うプロジェクトとはサービスを一から作ったり、サービスの一機能を作ったり、受託案件一つだったりを指す。特に開発プロジェクトに限定するものでもない。 プロジェクトを成功に近づけるためには、まずプロジェクトの開始時に、プロジェクトの5W1Hを明確にし、個々のメンバーの責任範囲を決め、それらを一つの場所にまとめておくということをしておくと良いと考えている。 5W1Hを決める すごい基的なことだけど、プロジェクトをやる上でやはり5W1Hは大事である。

    プロジェクトを成功させるために最初におこなっていること - $shibayu36->blog;
  • 符号化文字集合と文字符号化方式 - 「プログラマのための文字コード技術入門」を読んだ - $shibayu36->blog;

    最近文字コード周りでハマった時に、文字コードというものをそもそもちゃんと分かってないと気づいた。そこで「プログラマのための文字コード技術入門」を読んで勉強してみた。 プログラマのための文字コード技術入門 (WEB+DB PRESS plus) (WEB+DB PRESS plusシリーズ) 作者:矢野 啓介技術評論社Amazon このはコンピュータにおける文字について体系的にまとめてくれている。ASCIIやLatin1、UTF-8やUnicodeについて、どういう分類で何のために使われているかを知ることができる。また、歴史も合わせて教えてくれるので、今現状起こっている問題(円マークとバックスラッシュ問題とか)がどういう経緯で起こってしまったのかなどを理解できる。 簡単な文章で書かれているので、一度でも文字コードに関係することでハマったことのある人なら、どんどん読めると思う。ただ、符号化文

    符号化文字集合と文字符号化方式 - 「プログラマのための文字コード技術入門」を読んだ - $shibayu36->blog;