タグ

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

  • 入門 考える技術・書く技術を読んだ - $shibayu36->blog;

    人に分かりやすく伝える技術が不足していると感じたので読んだ。 入門 考える技術・書く技術――日人のロジカルシンキング実践法 作者:山崎 康司ダイヤモンド社Amazon ビジネス文書を書くために実践的に使えるテクニックを手早く知るためには良いだと思った。また日語における固有の難しさについても触れているので、いつも日語を使っている僕らが知りたいことについても書かれていた。以前読んだ「考える技術・書く技術」というは結構ボリュームがあり難しかった記憶があるので、とりあえず「入門 考える技術・書く技術」を読んで実践してみると良さそう。 個人的に印象に残ったのは OPQ分析というフレームワーク 何か文章を書くときには必ずやってみたい 感謝の言葉にPDFというフレームワーク メールの文章を書く時には良さそう。グループウェアとかで質問があった時に、簡単な返信をするフレームワークとしても良さそう

    入門 考える技術・書く技術を読んだ - $shibayu36->blog;
  • ISUCON8予選を突破した - $shibayu36->blog;

    id:hitode909とid:takuya-aとチーム「ディメンジョナルハイソサイエティぬれねずみ」としてISUCON8に参加し、40867点で戦に行けることになった。ISUCON初参加でいろいろ不慣れではあったが、なんとか戦に行けて嬉しい! サーバ複数台構成かつボトルネックになる箇所が結構面白いところが多く、非常に楽しめました。運営の皆様ありがとうございました。 振り返りとして、チームでやったこと・良かった進め方をまとめてみる。 チームでやったこと 開始直後は役割分担して作業していった。言語は勉強がてらgolangにしようと思ったこともあったが、せっかくなら勝ちたいし慣れてるperlにした。 shiba_yu36: 鍵置いたりコードのバックアップしたりなどといったオペレーション周り 他二人: アプリケーションの挙動を確認し、作戦を立ててもらう 以下が最初のオペレーションでやっていた

    ISUCON8予選を突破した - $shibayu36->blog;
  • tracerouteの仕組みをtcpdumpとwiresharkで理解する - $shibayu36->blog;

    どうやってIPからMACアドレスを解決するか - ARPの挙動を調べた - $shibayu36->blog; に続き、マスタリングTCP/IPで気になったことの実践。tracerouteではIPヘッダのttlの値とICMPをうまく利用して、経路を教えてくれるというのを見たので、今回はそのパケットの様子をtcpdump + wiresharkを使って見てみることで、仕組みの理解を深めてみたい。 tracerouteの仕組み まず手元でtracerouteを8.8.8.8に対して打つと、以下のように経路情報を教えてくれる。 $ traceroute 8.8.8.8 traceroute to 8.8.8.8 (8.8.8.8), 64 hops max, 52 byte packets 1 aterm.me (192.168.10.1) 4.408 ms 3.977 ms 3.989 ms

    tracerouteの仕組みをtcpdumpとwiresharkで理解する - $shibayu36->blog;
  • OSSライセンス参考資料 - $shibayu36->blog;

    OSSライセンスについて調べてたのだけど、毎回どこ見たら良いか分からなくなるのでメモ。OSSライセンスまじむずい。 Githubによる、オープンソースライセンスの選び方 | オープンソース・ライセンスの談話室 ざっと把握するための参考 たくさんあるオープンソースライセンスのそれぞれの特徴のまとめ | コリス いろんなライセンスの特徴知るために 自作ソースコードに、MITライセンスを適用する3つのやり方 | オープンソース・ライセンスの談話室 MITライセンスの適用方法 図解:Apache License2.0の特許条項 | オープンソース・ライセンスの談話室 Apacheライセンスについて オープンソース法 詳しくは

    OSSライセンス参考資料 - $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;
  • 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;
  • 高速な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;
  • BM法による文字列マッチング学習メモ - $shibayu36->blog;

    grepで文字列マッチングしている時の仕組みを学ぶために、BM法などの文字列マッチングについて調べていた。調べたことをメモしておく。特にまとまってはいない。 参考になった文献は以下。 文字列の中から効率良くキーワードを探し出せ:コーディングに役立つ! アルゴリズムの基(7)(3/4 ページ) - @IT BM法をJSで実装している とりあえずイメージ掴むのには分かりやすい サービス終了のお知らせ BM法や、その亜種のHorspool のアルゴリズムとQuick-Searchを解説している ちょっとわかりづらいけど、一番ちゃんと書かれている すごく雑にイメージすると、 パターンの方に前処理を加えて、ある文字がパターンの中のどの位置にあるかを保存しておく パターンマッチングしていきマッチしなかった場合に、前処理で作った位置情報を使っていい感じにスキップする という感じ。雑すぎる。 BM法関連

    BM法による文字列マッチング学習メモ - $shibayu36->blog;
  • Union Findアルゴリズムの様々な実装とパフォーマンス計測 - $shibayu36->blog;

    CourseraにAlgorithms Part1という授業があり、これが非常に評判が良いので、会社で勉強会をしている。Week1にUnion Findというアルゴリズムが出てきて、その実装パターンがいくつかあった。それぞれ計算量が違うらしいのだけど、速度がどのように変化するか試したかったので、実装してパフォーマンス計測をしてみた。それぞれの実装の詳しい説明が知りたかったら、https://www.coursera.org/learn/algorithms-part1 を見ると良い。 Union Findとは何か 二つのノードを繋いでいき(Union)、あるノードとあるノードがつながっているか(Find or Connected)を判定するアルゴリズム。 例えば、union(1,6)、union(5,6)、union(2,7)、union(3,8)、union(4,9)、union(8,9

    Union Findアルゴリズムの様々な実装とパフォーマンス計測 - $shibayu36->blog;
  • 転置インデックスの構造から見る全文検索 - $shibayu36->blog;

    全文検索エンジンについて学んでいたのだけど、転置インデックスのデータ構造という観点から見るといろいろ面白かったのでまとめてみる。 転置インデックスの具体的な構造 全文検索では、転置インデックス(Inverted index)という仕組みを使う。詳しくは第3回 転置索引とは何か?:検索エンジンはいかにして動くのか?|gihyo.jp … 技術評論社 や、A first take at building an inverted index あたりを見たら良い。 もうちょっと具体的な構造が「検索エンジン自作入門」というに書いてあったので、まとめてみると以下のようになる。 # 転置インデックス。トークンをキーとした連想配列で構築されている。 inverted_index = { "token1" => { docs_count => 3, # トークンが出現するドキュメント数 positions

    転置インデックスの構造から見る全文検索 - $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;
  • 基礎技術の学習のモチベーションをどう保つか - $shibayu36->blog;

    最近、コンピュータサイエンスなどの基礎的な知識を学習するように心がけている。できる限り今後も長い期間役に立つ、寿命の長い技術や知識を付けておきたいためである。その一貫で アルゴリズムを学習 してみている。 学習をはじめて感じた課題 しかし、とりあえずアルゴリズムを学習してみると、学習を続けられるか分からないという課題も感じた。 寿命の長い技術であるほど、日々の開発にすぐに利用できないことが多い 例えばアルゴリズムを学んだとしても、それが役立つまでいくにはある程度長い時間が必要 日々の開発に利用できていないと、モチベーションをずっと保ち続けるのが難しい モチベーションが保てないと、結局途中で勉強をやめてしまい、日々の開発に利用できるレベルまでたどり着けない 流行りの技術とかは、すぐに開発に導入してみるとかができるので、とりあえずモチベーションは保ちやすい。しかし、数学とかアルゴリズムとかLi

    基礎技術の学習のモチベーションをどう保つか - $shibayu36->blog;
  • suffix arrayを一番簡単なアルゴリズムで実装する - アルゴリズム学習(その6) - $shibayu36->blog;

    文字列アルゴリズムを学んでいると、suffix array(接尾辞配列)という配列が出てくる。これは文字列の接尾辞の集合を辞書順にソートし、その順でそれぞれの接尾辞の文字列中の開始位置のindexを格納した配列のことである。以下が参考になる。 接尾辞配列 - Wikipedia サービス終了のお知らせ 例えばbananaの場合、接尾辞は - banana (position=0) - anana (position=1) - nana (position=2) - ana (position=3) - na (position=4) - a (position=5)となり、これを辞書順にソートしたものは - a (position=5) - ana (position=3) - anana (position=1) - banana (position=0) - na (position=

    suffix arrayを一番簡単なアルゴリズムで実装する - アルゴリズム学習(その6) - $shibayu36->blog;
  • 力づく法・分割統治法・動的計画法 - アルゴリズム学習(その5) - $shibayu36->blog;

    アルゴリズムの設計手法として、力ずく法・分割統治法・動的計画法というような考え方があった。新しいアルゴリズムを学ぶ時、どの設計手法でやっているのだろうかと意識しておくと、頭に入りやすい気がした。そこで、自分の頭を整理するためにメモを書いておく。自分用メモなので、情報の正確さについては保証がない。 力づく法 全探索する方法 アルゴリズムの考え方としては単純なことが多いが、かなり遅いものになることが多い 例えば、Nクイーンなら、N個の置き方を全通り作って、それぞれが条件をみたすか確認し、条件を満たしたら返すようなもの。Nの二乗のなかから、N個の組み合わせを作って試すので、計算が膨大になる 例えば文字列マッチなら、1文字ずつずらしながら、マッチさせたいパターンとテキストの文字を比較していくようなもの 分割統治法 Wikipediaによると、そのままでは解決できない大きな問題を小さな問題に分割し、

    力づく法・分割統治法・動的計画法 - アルゴリズム学習(その5) - $shibayu36->blog;
  • MySQLを使って簡易的にサービスの数値を集計する - $shibayu36->blog;

    最近色んな機能を作る時に、簡単に数値を集計してみて様子を見るということがよくあった。そこで今回はその時に使ったクエリの紹介。 【2016/10/18 10:28追記】 社内でHOUR関数とかGROUP BYにalias名を使ったらもっと簡単にできるよと言われたので、それぞれ追記してみます。 日間の作成数の集計 1日このアクションが何回行われたかとかが集計できる。date_columnにはcreatedみたいなカラムを指定し、table_nameには集計したいテーブルを入れる。他にもCOUNTの仕方を工夫したらいろいろ集計できそう。 SELECT DATE(date_column) as date, COUNT(*) as count FROM table_name GROUP BY DATE(date_column); 【改善版】 SELECT DATE(date_column) as d

    MySQLを使って簡易的にサービスの数値を集計する - $shibayu36->blog;
  • 「オブジェクト指向入門 第2版」の上下巻を全て読み終えた - $shibayu36->blog;

    「オブジェクト指向入門 第2版 方法論・実践」を読み終えた。これでようやく「オブジェクト指向入門 第2版」を全て読み終えることが出来た。読むのは確かに大変だったけど、抽象データ型や契約による設計などといったエンジニアにとって役立つ概念を学ぶことができ、今後のプログラムの設計に大いに役立つだろうと思った。 オブジェクト指向入門 第2版 原則・コンセプト (IT Architect’Archive クラシックモダン・コンピューティング) 作者:バートランド・メイヤー翔泳社Amazon オブジェクト指向入門 第2版 方法論・実践 (IT Architects' Archiveクラシックモダン・コンピューティング) 作者:バートランド・メイヤー翔泳社Amazon 上巻 原則・コンセプト 上巻は特に「第3章 モジュール性」、「第6章 抽象データ型」、「第11章 契約による設計」の3つの章が面白かった

    「オブジェクト指向入門 第2版」の上下巻を全て読み終えた - $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;