タグ

ブックマーク / mattn.kaoriya.net (453)

  • Big Sky :: レーベンシュタイン距離を使ったあいまい grep コマンド「lsdgrep」作ってみた

    元ネタはずいぶんと昔の記事なのだけど。 編集距離 (Levenshtein Distance) - naoyaのはてなダイアリー ■ 編集距離 (Levenshtein Distance) 昨日 最長共通部分列問題 (LCS) について触れました。ついでなので編集距離のアルゴリズムについても整理してみます。 編集距離 (レーベン... http://d.hatena.ne.jp/naoya/20090329/1238307757 思い付きはまったく関係ない所から。 mp3 が数千ファイル入ってるフォルダで何かの手違いで同じ曲が入ってしまう事が結構あって重複取り去る作業してた。ID3が違ってるとMD5も違うのでレーベンシュタインの文字列距離を使ってファイル名が似てるの調べたら422ファイル消せる事が分かった。 — Vim芸人 (@mattn_jp) February 25, 2017 これを

    Big Sky :: レーベンシュタイン距離を使ったあいまい grep コマンド「lsdgrep」作ってみた
    mattn
    mattn 2017/02/27
    書いた。
  • Big Sky :: Ruby の Array#<< は Array#push よりも速いか

    巷の噂で Ruby の Array#<< が Array#push よりも速いと聞いたので調べてみた。まずはベンチマークを取ってみた。 require 'benchmark' Benchmark.bm 10 do |r| r.report "push" do 8000000.times do; [].push(1); end end r.report "<<" do 8000000.times do; [] <<1; end end end 結果は以下の通り。 user     system      total        real push         1.570000   0.000000   1.570000 (  1.579687) <<           1.280000   0.000000   1.280000 (  1.288951) 確かに Array#<< の

    Big Sky :: Ruby の Array#<< は Array#push よりも速いか
    mattn
    mattn 2017/02/11
    書いた。
  • Big Sky :: golang でメモ専用コマンド「memo」作った。

    « Ruby の a = a + 1 はなぜ undefined method '+' for nil:NilClass なのか | Main | Ruby の Array#<< は Array#push よりも速いか » 僕は日々 memolist.vim という Vim plugin を使い、仕事で思いついた疑問点や会話の一部をメモ取りする様にしています。相手と会話している最中に「あ、ここ大事だ」と思ったら vim を起動して :MemoNew してメモを編集していました。もちろん Vim ですから起動は抜群に速くてとてもご機嫌良く動くのですが、どうしてもこれをシェルから扱いたいという要求に負けてささっと作ってみました。 GitHub - mattn/memo: Memo Life For You README.md memo Memo Life For You Usage NAME:

    Big Sky :: golang でメモ専用コマンド「memo」作った。
    mattn
    mattn 2017/02/08
    書いた。
  • Big Sky :: Ruby の a = a + 1 はなぜ undefined method '+' for nil:NilClass なのか

    以前からずっと疑問に思っていた事があった。 ruby の後置 if/unless で条件が偽になった場合でも代入構文が実行されるのはどうしてだろう 例えば以下のコードを irb や pry で実行してみて欲しい。 a = 1 if false 続けて a をタイプする。すると nil が表示される。 僕のこれまでの理解だと後置if/unlessは、ステートメントに作用するのでそのステートメント自体が無効になる、つまり代入自体されなかった事になるという理解だった。ruby のパーサのソースコードを見ても後置ifはステートメントに作用している様だった。 | stmt modifier_if expr_value { /*%%%*/ $$ = new_if($3, remove_begin($1), 0); fixpos($$, $3); /*% $$ = dispatch2(if_mod, $

    Big Sky :: Ruby の a = a + 1 はなぜ undefined method '+' for nil:NilClass なのか
    mattn
    mattn 2017/02/01
    書いた。
  • Big Sky :: golang オフィシャル謹製のパッケージ依存解決ツール「dep」

    « Re: Go でシングルバイナリな Web アプリを開発しているときに webpack --watch をうまいところやる | Main | Ruby の a = a + 1 はなぜ undefined method '+' for nil:NilClass なのか » golang にはパッケージマネージャが無数にあります。 PackageManagementTools · golang/go Wiki · GitHub Home Articles Blogs Books BoundingResourceUse cgo ChromeOS CodeReview CodeReviewComments CodeTools C... https://github.com/golang/go/wiki/PackageManagementTools 僕もその一つの gom というのを開発している

    Big Sky :: golang オフィシャル謹製のパッケージ依存解決ツール「dep」
    mattn
    mattn 2017/01/25
    書いた。
  • Big Sky :: Re: Go でシングルバイナリな Web アプリを開発しているときに webpack --watch をうまいところやる

    go-bindata もいいけど、go-assets もいいよ。 Go でシングルバイナリな Web アプリを開発しているときに webpack --watch をうまいところやる - Diary Go でシングルバイナリな Web アプリを開発しているときに webpack --watch をうまいところやる 個人的なアプリをつくるとき、だいたい以下のような環境で作業しています WAF は E... http://diary.app.ssig33.com/166 みんなのGo言語にも書いた気がするのでそういうの興味ある人は買って下さい。 バイナリに assets を埋め込む際には go-bindata が有名ですが、実は go-assets も便利です。 GitHub - jessevdk/go-assets: Simple embedding of assets in go READM

    Big Sky :: Re: Go でシングルバイナリな Web アプリを開発しているときに webpack --watch をうまいところやる
    mattn
    mattn 2017/01/19
    書いた。
  • Big Sky :: golang の http.Client を速くする

    « Windows からも ssh でリモートコマンド実行したい、それ golang で出来るよ | Main | Re: Go でシングルバイナリな Web アプリを開発しているときに webpack --watch をうまいところやる » この記事には幾らか正しくない部分がありました。後で訂正していきますが、ひとまず shogo82148 さんの解説記事も確認下さい。 http.Client はリクエスト毎に名前を引くので連続したアクセスはあまり速くない。 Goのhttp.Clientで名前解決結果cacheする楽な方法ないかな — fujiwara (@fujiwara) December 7, 2016 Go 1.8 からは Resolver が提供されるので、自前で簡単に名前引きのキャッシュを実装出来る。 Go 1.9 だった様です。 Go 1.8 Release Notes -

    Big Sky :: golang の http.Client を速くする
    mattn
    mattn 2017/01/12
    書いた。
  • Big Sky :: Windows からも ssh でリモートコマンド実行したい、それ golang で出来るよ

    おそらく golang を暫く使っておられる方であればご存じだと思いますが今日は crypto/ssh を紹介します。 Windows で ssh と聞くとどうしても msys やら cygwin やら入れないといけなくて ランタイムを入れるのが嫌だ 特殊なパス形式とか嫌だ そもそも業務で使いづらい といった個人的もしくは政治的な事柄が起きてなかなか実現しづらかったりします。でも golang なら msys や cygwin に頼らず ssh コマンドを、しかもライブラリとして扱う事が出来るので golang で作ったウェブサーバやバッチから UNIX ホストに対して ssh コマンドを送る事が出来るのです。 ssh - GoDoc package ssh import "golang.org/x/crypto/ssh" Package ssh implements an SSH cli

    Big Sky :: Windows からも ssh でリモートコマンド実行したい、それ golang で出来るよ
  • Big Sky :: Matz の「言語のしくみ」を読んだ。

    Twitter で「言語のしくみ」読みたいなって呟いたら Matz 人から「献しましょうか」とメンション頂いて即答でお願いしました。ありがとうございます。 ひさびさ紙のを通勤電車の中で立ちながら読んだので手がだるくなりました。なんだか懐かしい感じがしました。 さてこのですが、一言で言うとこんなです。 Ruby のパパこと Matz が雑誌の連載に追われながら試行錯誤して作ったプログラミング言語「Streem」を解説する 聞こえが悪かったらすみません。言いたいのはこの「試行錯誤」がとても良いエッセンスになっている点なのです。実際にはその連載記事をまとめた物に対して、この当時はこの様に考えていたが後になってみると実は良く無かったといった振り返り「タイムマシンコラム」で構成されています。 この連載が1つのに纏められた事でプログラミング言語設計者の葛藤が非常に良く表されているな、そう

    Big Sky :: Matz の「言語のしくみ」を読んだ。
    mattn
    mattn 2017/01/06
    書いた。
  • Big Sky :: コマンドラインアプリで OAuth2 認証を使う際に使えるテクニック

    OAuth2 でレスポンスタイプがコードもしくはトークンの場合、ブラウザで認証を行ってコードやトークンを自前サーバで受け取る事になる。モバイルアプリだと組み込みブラウザが前提になっておりリダイレクトの最終 URL からアクセスコードやトークンを得る。ただコマンドラインアプリの場合、認証の為に起動したブラウザの最終 URL を得る方法はない。また1コマンドラインアプリケーションの為にドメイン付きのコールバックサーバを用意するのも面倒だし、作ったサーバをユーザに信用して貰う必要がある。あとそもそも外部のサーバで受け取ったトークンをどうやってコマンドラインアプリに渡すかという問題がある。 そこで使うのがローカルサーバを立てる方法。認証後のコールバック先をコマンドラインアプリから起動したローカルサーバにし、そこにリダイレクトさせてアクセストークンを貰い保存する。 今日はこれが伝わり易い用に Mic

    Big Sky :: コマンドラインアプリで OAuth2 認証を使う際に使えるテクニック
    mattn
    mattn 2016/12/31
    書いた。
  • Big Sky :: gops が SIGINT をキャッチしてしまう問題が修正された。

    ここ最近、gops に関する記事を2つ書いた。 golang で書かれたプロセスのリソースを外部から監視/操作できる「gops」 - Qiita この記事は [Go Advent Calendar 2016](http://qiita.com/advent-calendar/2016/go) の3日目の記事です。 # はじめに 今回は gops... http://qiita.com/mattn/items/a92f69ff18eb5cbcdd59 稼働中のバッチを監視したくなったら Mackerel Custom Metrics が便利 - Qiita この記事は [Mackerel Advent Calendar 2016](http://qiita.com/advent-calendar/2016/mackerel) の 12/13 日の記事です... http://qiita.co

    Big Sky :: gops が SIGINT をキャッチしてしまう問題が修正された。
    mattn
    mattn 2016/12/21
    書いた。
  • Big Sky :: builderscon 2016 で登壇してきました。

    « バイナリ一つで zip, tar.gz, tar.bz2, tar.xz が開けるコマンド「archiver」(と go1.8 への対応方法) | Main | gops が SIGINT をキャッチしてしまう問題が修正された。 » 冒頭でもお話させて頂いた通り、僕は YAPC に何回も誘われながらも結局参加できなかったというのが気持ちの奥にずっとあり、一度くらいは出ておくべきだったのかなと考えていたので今回、牧さんからお誘いを貰った時はお詫びをするなら今しかないと思っていました。はじめは15分とか30分程度のトークかなと思っていたら気付けば builderscon 2016 第1回目のド頭で1時間枠を割り当たっていました。 内容は「OSS は Windows で動いてこそ楽しい」というお題で Windows アプリの開発のつらさ、闇、そしてGo言語の誕生と希望について熱く語らせて頂き

    Big Sky :: builderscon 2016 で登壇してきました。
    mattn
    mattn 2016/12/03
    書いた。
  • Big Sky :: バイナリ一つで zip, tar.gz, tar.bz2, tar.xz が開けるコマンド「archiver」(と go1.8 への対応方法)

    追記: 修正が中途半端だったのでいったんリバートされ go1.9 で修正される事になりました。 UNIX に慣れている人であれば問題ないのですが、Windowszip や tar.gz, tar.bz2, tar.xz を開くのは意外と不便で専用アーカイバをダウンロードしてきてインストールする必要があり、割かし不便なのですが archiver というツールを使うと以下のフォーマットを簡単に作成、展開できるようになります。 .zip .tar .tar.gz .tgz .tar.bz2 .tbz2 .tar.xz .txz .rar (開くのみ) インストールは golang が入っていれば簡単です。 $ go get github.com/mholt/archiver/cmd/archiver 使い方も簡単で、圧縮は以下の手順。 $ archiver make [archive na

    Big Sky :: バイナリ一つで zip, tar.gz, tar.bz2, tar.xz が開けるコマンド「archiver」(と go1.8 への対応方法)
    mattn
    mattn 2016/12/02
    書いた
  • Big Sky :: シェルで作る Twitter Bot 作成講座

    数年前 TwitterAPI はベーシック認証、かつ Public な API だったので Twitter Bot なんて楽ちんで作れたのですが、最近は認証は OAuth、Public な API も無くなってしまい Bot を作るのはとても難しくなりました。 やりたい事はそんなに大した事ではないのに、認証のおかげでコードも大きくなりがちで、気付けば体コードよりも認証用のコードの方が多くなってしまう事もあります。Bot を作りたいのに敷居が高くて手を出せない、なんて思っている方も多いかもしれません。 でももし Twitter Bot がシェルで書けたら、簡単だと思いませんか?実は twty というツールを使うと簡単に Twitter 連携アプリケーションが作れてしまうのです。 GitHub - mattn/twty: command-line twitter client writ

    Big Sky :: シェルで作る Twitter Bot 作成講座
    mattn
    mattn 2016/11/15
    書いた。
  • Big Sky :: Golang 1.8 でやってくる database/sql の変更点

    golang 1.8 では database/sql に幾らかの新機能が追加されます。 キャンセル可能なクエリ データベースの型の可視化 複数の結果セット サーバへのping トランザクション分離レベル 名前付きパラメータ database/sql changes - Google ドキュメント https://docs.google.com/document/d/1F778e7ZSNiSmbju3jsEWzShcb8lIO4kDyfKDNm4PNd8/edit# 記事では Golang 1.8 で追加される database/sql の変更内容と、go-sqlite3 での対応状況、利用する上での注意点等を書いていきます。 キャンセル可能なクエリ 実行が長いクエリがキャンセルできるようになります。各 API に Context のサフィックスが付いた物が提供されます。具体的には Que

    Big Sky :: Golang 1.8 でやってくる database/sql の変更点
    mattn
    mattn 2016/11/06
    書いた。
  • Big Sky :: GolangでAPI Clientを実装する、の続き

    いい記事に感化されて僕も何か書きたくなった。 GolangAPI Clientを実装する | SOTA GolangAPI Clientを実装する 特定のAPIを利用するコマンドラインツールやサービスを書く場合はClientパッケージ(SDKと呼ばれることも多いが記事ではClientと呼ぶ)を使うこ... http://deeeet.com/writing/2016/11/01/go-api-client/ この先、JSON REST API のエンドポイントに対して Golang の struct を用意していく訳だけど、ここが一番かったるい作業で一番手を抜きたい所だと思います。そこで便利なのが JSON-to-Go です。 JSON-to-Go: Convert JSON to Go instantly JSON-to-Go Convert JSON to Go struct T

    Big Sky :: GolangでAPI Clientを実装する、の続き
    mattn
    mattn 2016/11/01
    書いた。
  • Big Sky :: golang で終了を確認するテストの書き方

    いい記事に感化されて僕も何か書きたくなった。 Golangにおけるinterfaceをつかったテスト技法 | SOTA Golangにおけるinterfaceをつかったテスト技法 最近何度か聞かれたので自分がGolangでCLIツールやAPIサーバーを書くときに実践してるinterfaceを使ったテスト技法について簡単... http://deeeet.com/writing/2016/10/25/go-interface-testing/ 僕も1つ golang のテストの tips を。golang を書いていて良くあるのが「コマンドがステータス 0 で終了する事」のテスト。 package main import "os" func doSomething() { os.Exit(0) } func main() { doSomething() } でも os.Exit しちゃうとテ

    Big Sky :: golang で終了を確認するテストの書き方
    mattn
    mattn 2016/10/25
    書いた。
  • Big Sky :: golang でパフォーマンスチューニングする際に気を付けるべきこと

    golang のテストツールには標準でベンチマークツールが付属しています。例えば、引数 n を貰ってその数分だけメッセージの入ったスライスを返す関数 makeSlice が以下の実装だったとします。 foo.go package foo import "fmt" func makeSlice(n int) []string { var r []string for i := 0; i < n; i++ { r = append(r, fmt.Sprintf("%03d だよーん", i)) } return r } 如何にも遅そうなコードですね。まずはこのコードを単品で計測するベンチマークを書きます。 foo_test.go package foo import "testing" func BenchmarkMakeSlice(b *testing.B) { b.ResetTimer()

    Big Sky :: golang でパフォーマンスチューニングする際に気を付けるべきこと
    mattn
    mattn 2016/10/19
    書いた。
  • Big Sky :: GitHub 等で Markdown に画像を貼る時は代替テキストを意識しようと思った。

    コマンドラインで標準入力をフィルタリングできる peco というソフトウェアがあり僕も開発メンバとして参加させて貰っているのですが、これに興味を持ってくれたとあるユーザから issue が来た。 Textual examples · Issue #349 · peco/peco · GitHub Hello. I use screen readers to interact with the computer, such applications speaks for me what you ... https://github.com/peco/peco/issues/349 こんにちわ。 readme でテキストによる例もしくは画像キャプチャの代替テキストを用意してくれませんか?私は盲目で画像を見ることができない。 僕らはこれまで当然の様に、Markdown で画像を貼る時に ![](

    Big Sky :: GitHub 等で Markdown に画像を貼る時は代替テキストを意識しようと思った。
    mattn
    mattn 2016/10/05
    書いた。
  • Big Sky :: golang の sort インタフェース難しい問題が解決した

    golang では配列をソートしたい場合に癖があり、Int や Float64、String といった固定の型であれば sort パッケージが提供する関数でソートが可能でしたが、独自の型や Int64 等といった sort パッケージが用意していない型の配列をソートするには Sorter というインタフェースを備えた型で扱うしかありませんでした。 package main import ( "fmt" "sort" ) type Food struct { Name  string Price int } type Foods []Food func (f Foods) Len() int { return len(f) } func (f Foods) Less(i, j int) bool { return f[i].Price < f[j].Price } func (f Foods

    Big Sky :: golang の sort インタフェース難しい問題が解決した
    mattn
    mattn 2016/10/04
    書いた。