タグ

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

  • Big Sky :: unsafe.StringData、unsafe.String、unsafe.SliceData が入った。

    Go ではバイト列と文字列は異なる内部データとして扱っています。[]byte から string へ変換したり、またその逆を行う際にはキャストが必要になります。ですので string はイミュータブルになります。 しかしイミュータブルなのは理解しつつもバイト列を文字列にする為に無駄なアロケートをしたくない場合もあります。これまで Go ではドキュメントに明文化していなかった為に色々な作法が生まれてしまっていました。その代表的な物が以下です。 s := *(*string)(unsafe.Pointer(&b)) 来は、Go のバイト列の内部は SliceHeader という構造体により管理されています。 type SliceHeader struct { Data uintptr Len  int Cap  int } また string は以下の StringHeader で管理されて

    Big Sky :: unsafe.StringData、unsafe.String、unsafe.SliceData が入った。
  • Big Sky :: Go の struct は小さくできる(fieldalignment のススメ)

    動的型付けプログラミング言語や、class を持つようなプログラミング言語を使う場合、そのフィールドメンバの定義順などを意識する事は少ないかもしれません。 Go は struct という、C言語が持っている構造体と同じ様にメモリ配置され、構造体そのものをレシーバとして、メソッドを定義しつつプログラミングを行います。struct はデータ構造そのものを示し、それが大きくなるにつれ、当然ながらメモリ使用量も多くなります。 さて、例えば以下のコードを実行すると、struct 100 個分のサイズは幾らになるでしょうか。 package main import ( "fmt" "unsafe" ) type Account struct { TimeZone struct { Name       string `json:"name"` UtcOffset  int    `json:"utc_

    Big Sky :: Go の struct は小さくできる(fieldalignment のススメ)
  • Big Sky :: Go に Fuzz testing が入った。

    みなさん Fuzz testing ってご存じでしょうか。 人間が作る物は必ずといっていいほどバグが存在します。そしてそのコードをテストする人間も必ずバグを見逃します。 想定していなかった境界値テスト等、人間には先入観という物があり、それが邪魔をして簡単にバグを見逃します。昨今、この様な誰も気付かなかったバグの隙間を突く様な脆弱性が沢山見つかっています。 物によっては重大インシデントに発展する物まであります。 こういった人間では想定できない様なバグを見付けてくれるのが Fuzz testing です。Fuzz testing を実施する事で、ソフトウェアは頑丈になり安全にもなりえます。 日、Go の master ブランチに Fuzz testing の機能が入りました。 [dev.fuzz] Merge remote-tracking branch 'origin/dev.fuzz'

    Big Sky :: Go に Fuzz testing が入った。
  • Big Sky :: コメントも扱える高機能な C++ 向け JSON パーサ「jsoncpp」

    おなじみC/C++から使えるJSONライブラリを紹介するコーナー。まずは過去のまとめ。 ヘッダファイルだけでC++から使えるJSONパーサ「picojson」が凄い! 何も見ずにC++でjsonパーサが書けるか試してみた。 C言語から使えるJSONパーサ、JSMNを試してみた。 僕がboost::asioとboost::property_treeを使いHTTPプロキシ環境下で非同期にGoogle Search APIから検索するまでにやった、たった一つの事。 C言語から使えるJSONパーサ、parson が思った以上に良い仕事をしている。 最速と言われる JSON パーサ「rapidjson」が当に爆速なのか試してみた。 C言語から使えるJSONパーサ、jansson がとても直感的で良い C++ で STL フレンドリに扱えるJSONパーサ「json.hpp」 これまで C++ から扱

    Big Sky :: コメントも扱える高機能な C++ 向け JSON パーサ「jsoncpp」
  • Big Sky :: Go に go:embed が入った。

    Go 言語はシングルバイナリをウリにしたプログラミング言語です。バイナリファイルを1つポンと scp で転送すれば動くのでとても便利です。シングルバイナリとなると当然、画像や HTML といったアセットをバイナリに埋め込みたくなります。 Go 言語ではこれまで go-assets や go-bindata、statik というツールを使う事でファイルのコンテンツをバイナリ化し、変数からアクセスする様にしてきました。 しかしそれらには色々な流儀や OS 間でのまばらな動作など、ユーザにとって納得のいかない物がありました。昨日、Go 言語ではオフィシャルとしてこのファイル埋め込みをサポートする様になりました。Go 1.16 から使える様になります。 cmd/go: add //go:embed support · golang/go@25d28ec · GitHub +3 −3 src/cmd

    Big Sky :: Go に go:embed が入った。
    MonMonMon
    MonMonMon 2020/10/30
  • 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」書いた。
  • Big Sky :: WSL2 でクリップボード使いたい。

    WSL2 がリリースされ Windows 10 Home Edition でも使える様になったので色々遊んでるのだけど、Windows 側とテキストを交換したい時に面倒で、クリップボードを共有する方法を模索した。 最悪 /dev/clipboard を実装するまで考えたけど、面倒過ぎたし exe の実行厳しい(何か常駐させてユーザランドから起動する為にサーバがいる)だろうから別の方法を考えた。WSL2 は binfmt (たぶん違うけど良く似た奴だろう) で Windows の exe が起動できるので、コマンド経由で stdin/stdout を read/write できる物を起動する方法を考えた。 で自分で書くかと Windows Terminal 起動した時点で「Windows Terminal からコピペできるやん、いらなくね?」となり、来の目的を忘れかけていたので、おとなしく

    Big Sky :: WSL2 でクリップボード使いたい。
  • Big Sky :: Go 言語で変数のシャドウイングを避けたいなら shadow を使おう。

    var hoge *Hoge if condition != nil { hoge, err := https://t.co/3dOQ15DCmc(ctx, hoge_key) if err != nil { return nil, err } fmt.Printf("%v", *hoge) } else { hoge = nil } こんな感じのコードで死んでたんですが、うっかりhogeがnil担っちゃうの防ぐにはどうしたら・・・(文字数 — chidakiyo (@chidakiyo) February 26, 2020 こういった場合に便利なのがオフィシャルが提供している解析コマンド shadow です。(相変わらずググらび...) インストールは以下を実行します。 $ go get golang.org/x/tools/go/analysis/passes/shadow/cmd/s

    Big Sky :: Go 言語で変数のシャドウイングを避けたいなら shadow を使おう。
  • Big Sky :: sudo の特権昇格バグはなぜ起こったのか

    « Microsoft Word を Markdown に変換するコマンド「docx2md」を作った。 | Main | VimConf 2019 を終えて » Linuxsudo に root 権限を奪取できるバグが見つかった。 Linuxの「sudo」コマンドにroot権限奪取の脆弱性。ユーザーID処理のバグで制限無効化 - Engadget 日版 この脆弱性は、sudoコマンドのユーザーIDに-1もしくは4294967295を指定すると、誤って0(ゼロ)と認識して処理してしまうというもの。0(ゼロ)はrootのユーザーIDであるため、攻撃者は完全なrootとしてコマンドを実行できることになります。 https://japanese.engadget.com/2019/10/14/linux-sudo-root-id/ 既に Ubuntu 等にはパッチが配布され始めているらしい

    Big Sky :: sudo の特権昇格バグはなぜ起こったのか
  • Big Sky :: Let's Encrypt を簡単操作できる CLI、Lego が MyDNS に対応した。

    Let's Encrypt という無料の SSL を提供しているサービスがあり、これを簡単に操作できる CLI として Lego というツールがあります。以前から Lego に MyDNS をサポートして貰おうとプルリクエスト を送っていたのですが、ようやく日マージされました。 環境変数 MYDNSJP_MASTER_ID と MYDNSJP_PASSWORD を設定した上で以下の様に実行すると登録されます。 $ lego -m your@email.com -a -x http-01 -x tls-alpn-01 --dns mydnsjp -s https://acme-staging-v02.api.letsencrypt.org/directory -d xxx.mydns.jp -d *.xxx.mydns.jp run また更新したい場合は以下の様に実行して下さい。 $ le

    Big Sky :: Let's Encrypt を簡単操作できる CLI、Lego が MyDNS に対応した。
  • Big Sky :: 書評「Go言語による並行処理」

    O'Reilly Japan, Inc. 様に献頂きました。ありがとうございます。 そして献頂く際にお声を掛けて頂いた、書の翻訳を担当された ymotongpoo さんにもお礼を申し上げます。ありがとうございます。 書の訳は非常に素晴らしく、とても原文が英文であったとは思えないほど綺麗で、読んでいく中で「原文でどの様に表現されているんだろう」といった引っかかりも無く、とてもスムーズに読み進められました。 Go 言語に関わって随分と長くなってきました。初めて Go を知ってからユーザがどんどん増える様を見る事が出来るのは正直に言って非常に嬉しいです。 ふと Go の魅力は何かと聞かれたら幾つか挙げる事が出来ますが、間違いなく選ぶのが「非同期処理の簡単さ」です。これまで多くの開発者が OS スレッドで実現してきた非同期処理を、Go 言語は少ないイディオムとインテリジェントなランタイムを

    Big Sky :: 書評「Go言語による並行処理」
  • Big Sky :: Go 言語の非同期パターン

    Gogoroutine という非同期の仕組みを提供していますが、使い方次第では色々なパターンが実装できる為、初めて goroutine を見た人はどの様な物が正解なのか分からない事があります。以前、このブログでも紹介した事がありますが Go の非同期の仕組みは一見単純な様に見えて実はとても奥深いのです。 Big Sky :: golang の channel を使ったテクニックあれこれ golang の channel は他の言語に見ない独特のパラダイムを開発者に提供します。 単純にスレッド間でメッセージングをするだけでもC言語で書けばそこそこの量になったり、慣れていない人であればど... https://mattn.kaoriya.net/software/lang/go/20160706165757.htm 2012 年に Rob Pike 氏が Google I/O で「Go

    Big Sky :: Go 言語の非同期パターン
  • Big Sky :: gRPC のサービスが簡単に作れるライブラリ「lile」

    gRPC は型の強い RPC を色々な言語を使って実装できる仕組みとライブラリです。 Big Sky :: Protocol Buffers を利用した RPCgRPCgolang から試してみた。 grpc/grpc · GitHub gRPC - An RPC library and framework https://github.com/grpc/grpc gRPCGoogle が開... https://mattn.kaoriya.net/software/lang/go/20150227144125.htm とても便利なのですが幾分手数が多いのが難点で、ちょっとしたサービスを gRPC で実装したいと思っていてもそう簡単に作る事が出来ませんでした。 ところが今回ご紹介する lile を使うと、とても簡単に gRPC を使った golang の実装を作れてしまいます

    Big Sky :: gRPC のサービスが簡単に作れるライブラリ「lile」
  • Big Sky :: sudo コマンド書いた。

    Windows で hosts ファイル(C:\Windows\System32\drivers\etc\hosts) を編集するには管理者権限が必要です。またコマンドラインから IP アドレスを変更するのにも管理者権限が必要です。管理者権限で hosts ファイルを編集するにはメモ帳を管理者権限で起動する必要があります。管理者権限でメモ帳を起動する為にはメニューから「メモ帳」を出し、右クリックして「管理者として実行」を選ぶ必要があります。そして実行したメモ帳のメニューから「開く」でファイルを選択します。管理者として開かないのであれば hosts ファイルを右クリックして「送る」等に登録したエディタを単に選べば済む話なのに、随分と手間ですね。 UNIX だと $ sudo vi /etc/hosts とだけタイプすれば良いのにこの手数の多さはちょっとゲンナリします。特にマウスに手を伸ばした

    Big Sky :: sudo コマンド書いた。
    MonMonMon
    MonMonMon 2017/06/15
    windows版のsudo!
  • Big Sky :: C言語から分かりやすいAPIで扱える JSON パーサ「cJSON」

    おなじみC/C++から使えるJSONライブラリを紹介するコーナー。まずは過去のまとめ。 最速と言われる JSON パーサ「rapidjson」が当に爆速なのか試してみた。 C言語から使えるJSONパーサ、parson が思った以上に良い仕事をしている。 僕がboost::asioとboost::property_treeを使いHTTPプロキシ環境下で非同期にGoogle Search APIから検索するまでにやった、たった一つの事。 C言語から使えるJSONパーサ、JSMNを試してみた。 何も見ずにC++でjsonパーサが書けるか試してみた。 ヘッダファイルだけでC++から使えるJSONパーサ「picojson」が凄い! C言語から使えるJSONパーサ、jansson がとても直感的で良い Big Sky :: C++ で STL フレンドリに扱えるJSONパーサ「json.hpp」 結

    Big Sky :: C言語から分かりやすいAPIで扱える JSON パーサ「cJSON」
  • Big Sky :: golang では変数の宣言位置が大事

    今日こんなツイートをした。 @mattn_jp よろしければベターな理由をm(_ _)m 名前空間を短くする作法なのはわかるのですがメモリやGCやコンパイラなど、どの辺に優しい感じですか? — Ryuji IWATA (@qt_luigi) April 5, 2017 qt_luigi さんからどうしてかを聞かれたので説明したいと思います。 golang では宣言した位置で初めて自動変数としてメモリが確保され、ゼロクリアされます。 for i := 0; i < b.N; i++ { var foo Foo bar, err := doSomething() if err != nil { continue } foo.v = bar fmt.Fprintln(ioutil.Discard, foo) } なので例えばこの様なコードで doSomething() が err を返した場合、

    Big Sky :: golang では変数の宣言位置が大事
  • Big Sky :: C++ で STL フレンドリに扱えるJSONパーサ「json.hpp」

    おなじみC/C++から使えるJSONライブラリを紹介するコーナー。まずは過去のまとめ。 最速と言われる JSON パーサ「rapidjson」が当に爆速なのか試してみた。 C言語から使えるJSONパーサ、parson が思った以上に良い仕事をしている。 僕がboost::asioとboost::property_treeを使いHTTPプロキシ環境下で非同期にGoogle Search APIから検索するまでにやった、たった一つの事。 C言語から使えるJSONパーサ、JSMNを試してみた。 何も見ずにC++でjsonパーサが書けるか試してみた。 ヘッダファイルだけでC++から使えるJSONパーサ「picojson」が凄い! C言語から使えるJSONパーサ、jansson がとても直感的で良い ずいぶんと前から GitHub TrendC++ 言語枠には登場していましたが、このコーナー

    Big Sky :: C++ で STL フレンドリに扱えるJSONパーサ「json.hpp」
  • Big Sky :: golang と Generics と私

    以下の記事は Java について触れていますが、Java を dis っている訳でもありませんし、冗長に見える例を意図的に使っています。 最近 Twittergolang に Generics が無い事についてずいぶんと盛り上がったのですが、僕の意見をこのブログにも書いておこうと思います。 golang に多相が無いのはアレだとか開発者の怠慢だみたいな話はだいたい他の言語を覚えた人から出る感想で、静的型付言語である golang を見ると確かにそう見えるかもしれない。ただ golangJava や他の言語と違って Duck Type を採用している。 — Vim芸人 (@mattn_jp) March 7, 2017 スクリプト言語の多くに多相が求められないのと同じ様に golang を深く触る人達から多相が欲しいという意見がそれほど出ないのは golang の型が Duck

    Big Sky :: golang と Generics と私
  • 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」
  • 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 作成講座