タグ

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

  • Big Sky :: C++ で flask ライクなウェブサーバ「clask」書いた。

    今まで C++ でちょっとしたウェブアプリを作る際は crow という micro-framework を使ってきました。 GitHub - ipkn/crow: Crow is very fast and easy to use C++ micro web framework (inspired by Python Flask) How to Build If you just want to use crow, copy amalgamate/crow_all.h and include it. Requirements C... https://github.com/ipkn/crow ヘッダオンリーで使えてとても便利だったのですが、boost に依存している点があまり好きじゃなかったのと、最近 crow の開発が止まり最新の boost でビルド出来なくなってしまったので、自分で作

    Big Sky :: C++ で flask ライクなウェブサーバ「clask」書いた。
    kazuhooku
    kazuhooku 2020/07/14
    なうい C++ で良い
  • Big Sky :: Google Developers Expert (Go) になりました。

    Google の方からお誘いを頂き、Google Developers Expert (Go) になりました。 僕のこれまでの Go に対する活動を評価頂けました。僕が Go を触り始めたのが2009年、今から10年前でした。Go はまだメジャーリリースすらされておらず、誰も仕事で使っていない言わばホビー言語でした。 一部のアーリーアダプタが「この言語、面白い」という言葉を残し飽きて来た頃、僕は職場で自前のツールを Go で書くようになりました。それまではC言語でした。 マルチプラットフォーム、速いコンパイラ、ポータビリティの高さ、簡単な記述での並行処理、色々な物に惹かれました。特に、シングルバイナリで動作し、コンパイルし直しさえすればソースコードを書き直す事なく Windows で動き、なおかつマルチバイトの問題も発生しない、こんな夢の様なプログラミング言語はそれまで見た事が無かったので

    Big Sky :: Google Developers Expert (Go) になりました。
    kazuhooku
    kazuhooku 2019/08/17
    「仕事では色々なプログラミング言語を使いますが、今では仕事で一番使うプログラミング言語が Go になりました。僕だけの話ではありません。今や業務で Go を使っておられる会社は沢山あります」
  • Big Sky :: SSE を使わなくても HTML エスケープはある程度速くできる。

    SSEを使ってHTMLエスケープを高速化してみた - k0kubun's blog 高速なHTMLエスケープをするライブラリを作った ある日HTMLエスケープを速くしたくなって、hescapeというライブラリを作った。 github.com とにかく速いHTMLエスケープがしたい R... http://k0kubun.hatenablog.com/entry/hescape 以前、moznion 氏の petit-html-escaper を勝手に高速化した時の話。 GitHub - moznion/petit-html-escaper: A simple and small escaper for HTML with SSE4.2 function Author moznion ( moznion@gmail.com ) mattn License The MIT License (M

    Big Sky :: SSE を使わなくても HTML エスケープはある程度速くできる。
    kazuhooku
    kazuhooku 2016/08/18
    SSE使えば一度に16文字処理できるようになってそれくらい速くなるんだから、SSE版の方を最適化する方がコストメリットが大きいよ
  • Big Sky :: Windows ユーザは cmd.exe で生きるべき。

    [D] Windowsはターミナルがダメだから使えないってのは過去の話? 基的にはいい感じに見えますが、いくつか問題は発覚してます。 http://blog.drikin.com/2015/01/windows-2.html 僕は Cygwin よりも msys2 が好きです 理由は最後の方に書きます。 cygwin は windows 上に完全な POSIX を提供するのが目的であって、msys2 は native な windows アプリケーションをビルドするのが目的なのでゴールが違うのよね。そして僕は全て cygwin で染められるのが好きじゃ無い。それだけの話です。 — mattn (@mattn_jp) April 10, 2016 もちろん msys2 を POSIX 環境としても使いますが、一番の目的は cmd.exe から Windows ネイティブなアプリケーションを

    Big Sky :: Windows ユーザは cmd.exe で生きるべき。
    kazuhooku
    kazuhooku 2016/04/12
    SFUが使いにくかったのはWin32との親和性というよりパッケージがないとかビルドがめんどいとかだったので、Linuxエミュレーションを実装したのは正しい選択なのかもと思ってる / SFUの頃にhomebrewがあればあるいは…
  • Big Sky :: 別のプロセスの動的な環境変数を盗み取る

    linux - .bashrcでexportしたPATHが/procにあるプロセスファイルの環境変数(PATH)と一致しないように見える - スタック・オーバーフロー Ubunt 15.04 を使っています。 どういう際に利用するかは措いておくとして、 /proc にある各プロセスIDの名前がついたディレクトリにある、 environ というファイルを、プログラミン... http://ja.stackoverflow.com/q/19984/440 回答の中で答えられている通り、/proc/$$/environ (/proc/self/environ)は、プログラム起動時の環境変数だけが表示される。プロセスが起動中に設定した環境変数は表示されない。 なんとかして取れないかなーと思って以下のスクリプトを書いた。 #!/bin/bash if [ "x$2" == "x" ]; then G

    Big Sky :: 別のプロセスの動的な環境変数を盗み取る
    kazuhooku
    kazuhooku 2015/12/16
    setenvは遅いしメモリリークするOSもあるので、不特定な回数セットするようなプログラム(たとえばシェル)では使えないってことかな
  • Big Sky :: gcc は副作用のある関数呼び出しを含む式評価順序を最適化する。

    2013/04/30 タイトル修正 昨日、とある場所でこんな話で盛り上がった。 逆ポーランド計算機を作ろうと思ったんだけど、どうも結果が期待通りにならない。 ソースコードを見せて貰うと以下の様なコードだった。 #include<stdio.h> #include<stdlib.h> #define MAX_SIZE 100 int stack[MAX_SIZE]; int stack_pointer = 0; void push(int data){ stack[stack_pointer++] = data; } int pop(){ return stack[--stack_pointer]; } int pop1(int n){ printf("pop %d\n", n); return stack[--stack_pointer]; } int main(void){ char s

    Big Sky :: gcc は副作用のある関数呼び出しを含む式評価順序を最適化する。
    kazuhooku
    kazuhooku 2015/11/18
    「これではダメ」ではなく「副作用完了点」という概念について解説を加えたほうがいいのでは? https://www.jpcert.or.jp/sc-rules/c-exp30-c.html
  • Big Sky :: golang でスライスの先頭に追加する append がなぜ遅いのか

    Go - ISUCON5予選でスコア34000を出す方法 - Qiita Goで下記のようなsliceの先頭にひたすらオブジェクトを追加する処理を書く際は、不必要に長いsliceにならないよう注意しましょう。負荷が非常に高い処理になります。 hoge := []int{} for _, comment := range comments { hoge = append([]int{comment.ID}, hoge...) } http://qiita.com/y_matsuwitter/items/771020ebb68c07053548 append は第一引数のスライスに第二引数以降の可変個アイテムを追加する関数です。なるべく呼ばれない実装が良いです。どうしても多いアイテムを扱う場合は出来れば以下の様に書くのが良いです。 参考: https://blog.golang.org/sli

    Big Sky :: golang でスライスの先頭に追加する append がなぜ遅いのか
    kazuhooku
    kazuhooku 2015/09/28
    リスト操作の話。prependがO(N)になる言語処理系において、prependがAPIとして提供されないとO(N^2)の実装をユーザが使ってしまうという(言語設計者にとっての)闇
  • Big Sky :: select(2)の第一引数にディスクリプタの最大値を渡すのは間違い?

    追記 POSIX では明確にソケットの最大値とはうたってはいないものの、Linux の実装を見ても最大値と扱う方が良い様です。また Winsock では select(2) の第一引数は無視されるようです。 C言語でソケットを使うプログラミングを行う際、ソケットディスクリプタがシグナル状態かを調べる方法としてselect(2)があります。 使い方は int r; fd_set rfds; FD_ZERO(&rfds); FD_SET(sock, &rfds); r = select(1, &rfds, NULL, NULL, NULL); といった感じ。ここでselect(2)の第一引数に渡している値は、ディスクリプタ集合rfdsの内、いくつ検証するかを指す値。つまりrfdsに対してFD_ZERO/FD_CLRしてからFD_SETした回数となります。 ちなみに戻り値は、ディスクリプタ集合の

    Big Sky :: select(2)の第一引数にディスクリプタの最大値を渡すのは間違い?
    kazuhooku
    kazuhooku 2015/07/14
    Winsockの動作はそのとおりだけど、Un*x系のselectに関する解説としては間違い。Un*x系ではFD_SETSIZEを変更することは普通できないし、max_fdsに入れるのはFD_SETした個数ではなくfile descriptor番号の最大値が正しい
  • Big Sky :: libuv と http-parser を使って高速なウェブサーバ書いてみた。

    どうしても高速なWeb サーバが書きたくなったので joyent の libuv と http-parser (nodejs が内部で使っているライブラリ)を使ってWeb サーバを書いてみた。 mattn/http-server - GitHub https://github.com/mattn/http-server I/O は全て非同期で行いブロッキングしない作りとしました。これで絶対速くなるとは言わないけど、少なくともスケールはするんじゃないかと思います。 Date ヘッダとか、65536 バイト以上の POST ペイロードとか色々省いてるのでツッコミビリディ高いですが、ひとまず GET でファイルのサーブが出来る状態にはしたのでベンチマークを取ってみました。 # nginx $ ab -k -c 10 -n 10000 http://127.0.0.1/ # http-server

    Big Sky :: libuv と http-parser を使って高速なウェブサーバ書いてみた。
    kazuhooku
    kazuhooku 2014/08/04
    あとで
  • Big Sky :: MSVC の怖い話

    夏だし、怖い話しようぜ! #include <cstdio> #include <math.h> class C { public: C() {} C(double) { printf("hello world\n"); } }; int main(int argc, char** argv) { C(NAN); return 0; } 僕は今日... こんなコードをコンパイルしたんだ...。gcc でコンパイルして実行したんだ...。 hello world 期待通りだった。 僕は安心し、これを今度は MSVC でビルドしたんだ...。 実行すると... 何も出ない... 僕は怖くなった。 何なんだ!何なんだ!NaN なんだーーー! 僕の C++ 人生はなんだったのか...。僕は病に侵されているに違いない...。 怖いながらもデバッガで追ったんだ... そしてステップインした... えっ

    Big Sky :: MSVC の怖い話
    kazuhooku
    kazuhooku 2014/06/30
    C言語においては int (i)=3; が正しいコードだ、という話。int (*f)(); と int ((*f))(); が等価なのを考えれば自然だが…しかし…
  • Big Sky :: clib の使い勝手にマジ感動した

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

    Big Sky :: clib の使い勝手にマジ感動した
    kazuhooku
    kazuhooku 2014/06/28
  • Big Sky :: golang で複数のエラーをハンドリングする方法

    golangいまどき例外ないの頭おかしいって思ってたけどようするにgoroutineと例外がうまくいかないからgoroutineのほう取って例外捨てたってことかねえ。 — Urabe, Shyouhei (@shyouhei) April 15, 2014 FAQ に書いてあります。 Why does Go not have exceptions? - Frequently Asked Questions (FAQ) - The Go Programming Language We believe that coupling exceptions to a control structure, as in the try-catch-finally idiom, results in convoluted code. It also tends to encourage programme

    Big Sky :: golang で複数のエラーをハンドリングする方法
    kazuhooku
    kazuhooku 2014/04/17
    ファイルオープンに失敗した理由を知るためだけに、2回も型チェックが必要なことに驚きを隠せない / os.IsNotExist(err) で良いらしい
  • Big Sky :: 最速と言われる JSON パーサ「rapidjson」が本当に爆速なのか試してみた。

    なんびとたりとも俺の前は走らせねぇ ガチバトルです。 rapidjson - A fast JSON parser/generator for C++ with both SAX/DOM style API - Google Project Hosting Rapidjson is an attempt to create the fastest JSON parser and generator. Small but complete. Support... https://code.google.com/p/rapidjson/ fastest をうたうとは度胸があるなーと思いながら、半信半疑で試してみました。 rapidjson も picojson 同様に、ヘッダファイルだけあればコンパイル出来る C++ 向け JSON パーサ(およびシリアライザ)です。 まずは rapidjso

    Big Sky :: 最速と言われる JSON パーサ「rapidjson」が本当に爆速なのか試してみた。
    kazuhooku
    kazuhooku 2013/02/15
  • Big Sky :: CD-ROM トレイを取り出せる vim プラグイン、「eject.vim」作った。

    vim 使ってると良く CD-ROM を取り出したくなりますよね。 ならないとしたら、今すぐこの記事を読むのをやめて病院に行って下さい。 mattn/eject-vim - GitHub https://github.com/mattn/eject-vim インストールすると :Eject というコマンドが追加されるので、実行するだけで CD-ROM トレイがゲロっと排出されます。 便利ですね! 皆さんもぜひ、使ってみて下さい。 (今日の参考文献: http://d.hatena.ne.jp/hasegawayosuke/20130112/p1) なお、Windowsでしか動作しません。動作には libcallex-vim が必要です。

    Big Sky :: CD-ROM トレイを取り出せる vim プラグイン、「eject.vim」作った。
    kazuhooku
    kazuhooku 2013/01/21
    「vimユーザーは変態か病人ばかり」まで読んだ
  • Big Sky :: Re: プログラム中に HTML とか埋め込むためのテンプレートエンジン picotemplate を作った件

    プログラム中に HTML とか埋め込むためのテンプレートエンジン picotemplate を作った件 - kazuhoのメモ置き場 たとえばドキュメント生成ツールなんかを作ってると、HTML をプログラムの中で生成したい!ってことは良くあると思います。でも、そのためにいちいちテンプレートエンジンを使うのは大げさな場合も多いですよね。たとえば、ちょっとリストを出力するとき。以下のような感じのコードを書いたことがある人は多いと思います。 http://d.hatena.ne.jp/kazuhooku/20120726/1343290960 例えばこんなのどうだろう #include <string> #include <list> #include <iostream> #define _(...) std::string(#__VA_ARGS__) int main() { std::li

    Big Sky :: Re: プログラム中に HTML とか埋め込むためのテンプレートエンジン picotemplate を作った件
    kazuhooku
    kazuhooku 2012/07/26
    _(<a href=") + url + _(">) とか書けないし、行単位での文脈切替と、HTML中へのコードの埋め込みの2点が実現できないと現実には使いづらいんじゃないかと思います
  • Big Sky :: JSX の Vim 環境を整備してみた ~ jsx.vim に何個か pull req を送った

    「JSX 書くなら Vim だよね」というのが当たり前になる明るい未来を目指して jsx.vim に何個か pull req を送りました! jsx/jsx.vim - GitHub https://github.com/jsx/jsx.vim pull reqを送った機能は次のとおりです。 コンパイラプラグインの追加 補完機能の追加 簡単に説明していきます。 コンパイラプラグインの追加 デフォルトではオンになっていないので、:compiler jsx にしておくか、vimrc で以下を実行する必要があります。 autocmd FileType jsx compiler jsx この状態で :make を実行すると quickfix にエラーが表示されます。vim-hier と併用すると以下の様になります。 補完機能の追加 manga_osyo さんが neocomplcache での実装

    Big Sky :: JSX の Vim 環境を整備してみた ~ jsx.vim に何個か pull req を送った
    kazuhooku
    kazuhooku 2012/06/18
    emacs使いたい > 「「JSX 書くなら Vim だよね」」
  • Big Sky :: やったーJavaScriptの動くSQLiteできたよー

    ※ネタです ※UDFです 正誤表を書くのにしばらくこのをちょっと眺めてみたら、SQLiteのUDFって簡単に作れるんだなー、と思った && そういやV8ってライブラリとして簡単にリンクできるはずだな、と思い出した ので、ついカッとなって作った。 sqlite3udf-jseval - GitHub http://github.com/mattn/sqlite3udf-jseval UDFうんぬn ほとんど↑の、全然関係ないと思ってたけど、やっぱりSQLiteのUDFについて全然書いてなかった。しょうがないので軽く紹介しておくと UDFを追加する場合、SQLiteの再コンパイルは必要ない (しかるべき所に.soがおいてあればいい) UDFはこの辺読んどけばだいたい分かる。 例えば文字列っぽいものを返すmyfuncっていうUDFを作りたい場合 SQLITE_EXTENSION_INIT

    Big Sky :: やったーJavaScriptの動くSQLiteできたよー
    kazuhooku
    kazuhooku 2011/09/26
    SQLiteの低レベルAPIをJavaScriptで呼べるようにしてほしい
  • Big Sky :: ZimbuでFizzBuzz

    Vimの作者であるBram Moolenaar氏が開発しているプログラミング言語「Zimbu」を触ってみた。 the Zimbu programming language Suppose you want to write a new program, something like a text editor. What language would you write it in? It has to be as fast as possible, so interpreted languages are out. You don't want to micro manage memory, so C is out. You don't want to require programmers to have a degree, so C++ is out. You want fast s

    Big Sky :: ZimbuでFizzBuzz
    kazuhooku
    kazuhooku 2010/12/05
    なんかDISられてたw
  • 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サーバ書いた。
    kazuhooku
    kazuhooku 2009/07/30
    「C++で書かれた軽量Webサーバ tinytinyhttpd が凄い」
  • Big Sky :: jjencodeをApacheのmod_ext_filterに仕込む

    jjencode素晴らしいですね。記号だけでjavascriptが実行出来てしまいます。 何かに使えないかなーと考えて、apacheのmod_ext_filterを使ってjavascriptの難読サーブをやってみようかと思います。 javascriptエンジンとして使うのは、v8。当は全部Cで書けば速いのでしょうがメンドクサイのでやりません。 以下フィルタのソース crypt-js.cc #include <v8.h> #include <string> #include <iostream> static std::string& replace_string(std::string& str, const std::string from, const std::string dest) { std::string::size_type n, nb = 0; while((n = s

    Big Sky :: jjencodeをApacheのmod_ext_filterに仕込む
    kazuhooku
    kazuhooku 2009/07/21
    ファイル単位で暗号化できるし遅くてもいいんじゃないかなと思った。よさげ