タグ

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

  • Big Sky :: ログイン認証をマイクロサービス化する「loginsrv」

    認証を持たないウェブアプリケーションをいざ認証に対応させようと思うと案外面倒でモチベーションを無くしてしまうなんて事もよく起きうる話です。特に社内向けのアプリケーションを作っていたら番で使う事になってしまって、なんて話は良くある話です。開発でDB を見るのはちょっと...。でも既存のコードをゴリゴリと触りたくない。そんな場合にログイン認証部分だけマイクロサービス化できると気持ちも幾分和らぎます。今日はそんなちょっと便利なサーバ「loginsrv」を紹介したいと思います。 GitHub - tarent/loginsrv: JWT login microservice with plugable backends such as OAuth2, Github, htpasswd, osiam loginsrv is a standalone minimalistic login se

    Big Sky :: ログイン認証をマイクロサービス化する「loginsrv」
  • 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」作ってみた
  • 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 を速くする
  • Big Sky :: Matz の「言語のしくみ」を読んだ。

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

    Big Sky :: Matz の「言語のしくみ」を読んだ。
  • Big Sky :: C++でcoutやcerrの挙動を変える。

    先日twitterで「C++でデバッグする時、よくやるよね」って言ったら結構知らない人がいたのでここでも紹介してみる。 既存のコードでcout/cerrを使ったデバッグ文がわんさかあって、これログファイルとして出力したいな...って場合ありますよね。 そんな場合 #include <iostream> #include <fstream> using namespace std; int main() { // こんなの ofstream ofs("debug.log"); cout.rdbuf(ofs.rdbuf()); // いれとく cout << "debug string" << endl; } こうしておくと、その後のcoutへの出力が全てdebug.logというファイルへ出力される。 なおrdbufを元に戻すには #include <iostream> #include <f

    Big Sky :: C++でcoutやcerrの挙動を変える。
  • 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 でパフォーマンスチューニングする際に気を付けるべきこと
  • 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 インタフェース難しい問題が解決した
  • Big Sky :: golang の遅いコードをたった1行で高速化するテクニック

    記事中に間違いがありました。数倍も速くはなりませんでした。確か 1.0X ~ 1.1 倍程度の高速化は得られましたがびっくりするほどの物ではありませんでした。すみません。 そろそろ Go1.7 がリリースされるそうですが、皆さん如何お過ごしですか。Go 界隈の波平こと mattn ですこんにちわ。バカモー(略 Go1.7 ではコンパイラの最適化が行われ、ビルド速度がかなり短縮される様になりました。毎日ビルドしてる僕としては非常に嬉しい機能改善ですね。 さてとてもキャッチ―なタイトルで釣ってしまった訳ですが、気にしたら負けなのでどんどん話を進めます。 var t [256]byte func f(b *[16]byte) { for i, v := range b { b[i] = t[v] } } 例えばこのコードを見て下さい。このコードはココから拝借しました。issue の内容はスコー

    Big Sky :: golang の遅いコードをたった1行で高速化するテクニック
  • Big Sky :: golang の channel を使ったテクニックあれこれ

    golang の channel は他の言語に見ない独特のパラダイムを開発者に提供します。 単純にスレッド間でメッセージングをするだけでもC言語で書けばそこそこの量になったり、慣れていない人であればどう実装すればいいか分からないなんて事もあったと思います。しかし golanggoroutine/channel は、やっている内容の割にとても容易にスレッド間通信やキューイング、処理の受け待ち等を実装できる様になっています。尚、channel をどの様に適用したら良いかについては以下を参照下さい。 Big Sky :: Golang の channel の使い所 golang の特徴と言えば goroutine と channel ですが、その使いどころに悩む人もおられる様です。 goroutine は非同期に実行される処理、channel はその grout... http://mat

    Big Sky :: golang の channel を使ったテクニックあれこれ
  • Big Sky :: コマンドラインから JSON が簡単に作れるツール jo

    « golang で画像アップロードが簡単に出来る go-imageupload を使ってみた。 | Main | SQLite3でカジュアルにズンドコキヨシ » コマンドラインから JSON を扱うツールとしては jq が一般的ですが、例えば ls を実行した結果を JSON の Array にしたいであったり、コマンドライン引数から簡単に Object を作りたいといった場合には一旦考え込まないといけないくらい使い方が難しかったりします。そんな中でひょいと現れたのが jo です。 GitHub - jpmens/jo: JSON output from a shell JSON output from a shell https://github.com/jpmens/jo 作者である jpmens さんがなぜ jo を作るに至ったかをブログに書いています。 Jan-Piet Mens

    Big Sky :: コマンドラインから JSON が簡単に作れるツール jo
  • Big Sky :: golang のミドルウェアとして組み込むだけでパフォーマンス改善が見込める「HTTP Coala」

    ミドルウェアとして Use するだけでパフォーマンスが向上するなんて夢の様な話はないと思っていたけど、HTTP Coala はそれをやってのけている様です。 goware/httpcoala · GitHub Go http middleware handler for request coalescing https://github.com/goware/httpcoala ちょっと信じがたかったので、まずはベンチマークを取ってみた。 Coala 未使用 package main import ( "net/http" "github.com/zenazn/goji" "github.com/zenazn/goji/web" ) func main() { goji.Get("/", func(c web.C, w http.ResponseWriter, r *http.Reques

    Big Sky :: golang のミドルウェアとして組み込むだけでパフォーマンス改善が見込める「HTTP Coala」
  • Big Sky :: Protocol Buffers を利用した RPC、gRPC を golang から試してみた。

    grpc/grpc · GitHub gRPC - An RPC library and framework https://github.com/grpc/grpc gRPCGoogle が開発しているRPC(リモートプロシージャコール)のライブラリとフレームワークで、通信層は HTTP/2 を介して行われます。 データ層については、固定されている訳ではなくあくまでデフォルトで Protocol Buffers が使われる様になっています。使用出来るプログラミング言語は現在、C++, Node.js, Python, Ruby, Objective-C, PHP, C# となっています。 実はこれら以外にも grpc-go という、なぜかこのリストに加えられていないオフィシャルリポジトリがあります。 grpc/grpc-go - GitHub gRPC-Go The Go impl

    Big Sky :: Protocol Buffers を利用した RPC、gRPC を golang から試してみた。
  • Big Sky :: ちっちゃなビルドシステム qo が激しく便利だった件

    « Re: VimでURLをドメインだけに置換するコマンドを正規表現でうったら、当に正規表現って意味不明なフォルムと思った。 | Main | golang のリファクタリングには gofmt ではなく、gorename を使おう。 » golang には go build というビルド機能があり、C言語と golang をまぜた cgo というC言語拡張も同じコマンドでビルド出来ます。 その際、ソースコードのコメントに CFLAGS や LDFLAGS を自ら指定する事が出来るので package gtk // #include "gtk.go.h" // #cgo pkg-config: gtk+-2.0 import "C" import ( "fmt" "log" "reflect" "runtime" "strings" "unsafe" "github.com/mattn/g

    Big Sky :: ちっちゃなビルドシステム qo が激しく便利だった件
  • Big Sky :: golang で最近お気に入りの WAF「Goji」

    Web アプリケーションを書くときは今までずっと 小さい物は web.go 大きい物は net/http というスタンスを何故か貫いて来たんだけど、最近ようやく web.go をやめて goji を使う様になった。 Goji A web microframework for Golang https://goji.io/ 理由としては Sinatra ライクでありながら高度な正規表現マッチも使えるルータ それでいて net/http コンパチ 簡単に実装出来るミドルウェアスタック グレースフルシャットダウン そして何と言っても速い ミドルウェアも一般的な Web アプリケーションを作るには十分な物が既に揃ってます。 それでもやっぱり大きめな物は net/http で書くんだけど、小規模から中規模な物を一気にゴリゴリっと書く場合には goji は便利です。もちろん Windows でも動きま

    Big Sky :: golang で最近お気に入りの WAF「Goji」
  • Big Sky :: Golang のオフィシャルが提供するインタフェースまとめ

    golang が提供するインタフェースの中で代表的な物の使い方をまとめてみる。 io.Reader type Reader interface { Read(p []byte) (n int, err error) } ご存じ io.Reader。このシグネチャの Read を実装しておけば golang のありとあらゆる入力機能に対して自分のコードを提供する事が出来る。 例えば永遠に「おっぱい」と言い続ける Reader だと以下の様な実装になる。 package main import ( "io" "os" ) var text = []rune("おっぱい") type OppaiReader struct { n int } func (r *OppaiReader) Read(p []byte) (int, error) { in := len(p) nw := 0 for i

    Big Sky :: Golang のオフィシャルが提供するインタフェースまとめ
  • Big Sky :: clib の使い勝手にマジ感動した

    C言語でアプリケーションを書くのは他の言語と比べて少し気合が必要ですよね。例えば HTTPからデータを取得する 取得したデータを json パースする 結果の一部を色付きで表示する こんな場合、C言語プログラマは 「HTTP か、じゃぁcurlかな」 「JSON か、parson かな」 「色表示か...エスケープシーケンスでもいいけどWindowsがなー...」 といった事を考え、そこから curl や parson といった資材の調達を始める事になります。途中で新しい機能を追加したくなり、それを外部ライブラリに頼る場合だとその都度資材を調達する必要があり、思考を停止しなければなりません。 この辺は rubyperl、nodejs、golang 等の様に、ちょっとした手間だけで済ませたい物です。 またC言語の場合、ヘッダファイルはシステムの include フォルダに提供元が期待す

    Big Sky :: clib の使い勝手にマジ感動した
  • Big Sky :: モテる Vim 使いに読み書き出来ないファイルなどなかったんだよ!

    Vim Advent Calendar 2012 の 4 日目の記事です。 「やった!コンプガチャで Vim 出た!」 「だって前の彼氏、Vim 使いじゃなかったんだもん」「マクドナルド店員「ご一緒に Vim など如何ですか?」」 こんな言葉が聞かれる様になって随分と経ちました(要出典)。 昨今、Vim はテキストエディタの枠を超え、アプリケーションプラットフォームへと変わりつつあります。 vital.vim 等を使う事で簡単にアプリケーションを作る事も出来る様になりました。手前味噌ではありますが webapi-vim の一部も vital.vim に取り込まれています。 このブログでも結構取り上げていますが webapi-vim とは一体何か。名前の通り、Web Application Programming Intreface を扱えるライブラリです。 webapi-vim とは we

    Big Sky :: モテる Vim 使いに読み書き出来ないファイルなどなかったんだよ!
    muddydixon
    muddydixon 2012/12/04
    vimはどこに向かうんだろうw
  • Big Sky :: VimでDBが操作できる vdbi-vim 作った。

    DB操作ツール Emacs DBI を作ってみた - 技術日記@kiwanami このツールの目的は、クロスプラットフォームで便利なDB操作環境を実現することです。 pgAdmin や MySQL Query Browser のようなGUIの良さをCUIで実現してみようとしてみました。すなわち、ぼくのかんがえたさいきょうのDBツールです。ちなみに、このツールにとってEmacsはただの実行環境です。Emacs使わない人でも使うと便利だと思います。 http://d.hatena.ne.jp/kiwanami/20120305/1330939440 VimもーVimもー! って事で作りました。 mattn/vdbi-vim - GitHub Database client for Vim https://github.com/mattn/vdbi-vim Emacs版はepcというRPCプロト

    Big Sky :: VimでDBが操作できる vdbi-vim 作った。
  • Big Sky :: C++で軽量Webサーバ書いた。

    書いたといっても結構前からあったのですが、いらん所を削ぎ落として軽量Webサーバとして仕立て上げました。 軽量とは言えど、CGIを使って結構色々動きます。 例えば、ソースアーカイブを解凍したらCGIがあって、apacheから見える場所にコピーして...とか面倒くさかったりしますよね。 おれは今すぐWebサーバを起動したいんだ!そして今いるディレクトリのファイルをWebサーバからサーブしたいんだー! って事ないですか?blogソフトウェアをダウンロードして今すぐ試したいけど、apacheインストールされてなかった...とか悲しすぎます。 今回紹介する"tinytinyhttpd"(tthttpd)はそんな、小さい様で大きな問題を解決出来るかもしれないソフトウェアです。 mattn's tinytinyhttpd at master - GitHub tiny tiny httpd http:

    Big Sky :: C++で軽量Webサーバ書いた。
  • Big Sky :: Web開発屋なら知っておきたい。AtomPubとは何か?

    Blogging APIは何処に行こうとしているのか... 先日は、XMLRPCについてのお話をさせて頂きました。 今日はその中で出てきたBlogging APIについて。 著名なブログツールの多くは、リモートからブログが更新出来る仕組みを提供しています。 その中でも、一般的な物が先日お話した「XMLRPC」をベースにした「Blogger API」や「metaWeblog API」、「MovableType API」があります。 ※現在ではBloggerはXMLRPCではなく、Atompubを使用しています。 それとは別に、Atomフィードを使用したAtomPub APIがあります。 XMLRPCの場合は、リモートメソッドとしてXMLを生成してブログの投稿、削除等を行いますが、AtomPubの場合は送受信されるXMLの単位自身が文書になります。 この文書をHTTPのGET/POST(PUT

    Big Sky :: Web開発屋なら知っておきたい。AtomPubとは何か?
  • 1