タグ

golangに関するrryuのブックマーク (8)

  • 有効期限を過ぎても消えないインメモリキャッシュの謎 - 私が歌川です

    tl;dr キーワードは「monotonic clock」です。 あらすじ Goで以下のようなコードを書いていた*1*2。あるAPIを叩くクライアントで、APIコールに必要なアクセストークンを4時間キャッシュしている。c.getToken() で得られたトークンを使ってAPIコールを行えばよい。 type Client struct { mu sync.RWMutex expiresAt time.Time token string } // トークンのキャッシュがあればキャッシュから返し、なければ更新してから返す func (c *Client) getToken() string { if cachedToken, ok := c.getTokenFromCache(); ok { return cachedToken } return c.refreshToken() } // トー

    有効期限を過ぎても消えないインメモリキャッシュの謎 - 私が歌川です
    rryu
    rryu 2023/02/25
    Goのtimeパッケージはおそらく閏秒でも問題ないように時刻の差分をmonotonic clockを使って求めるように気を利かせているが、monotonic clockはOSが更新しているのでスリープすると実時間と差ができる罠ができてしまったという
  • hugoの日付書式がクソすぎる(悪いのはgo言語です) - やってみる

    yyyy-MM-dd HH:mm:ssのような書式ではなく2006-01-02 15:04:05である。この数値でなければ正しく表示されない。は? なにこれ? ひどくない? 手順 Go言語をインストールする hugoをインストールする プロジェクト作成&pulpテーマ適用 以下のように設定ファイルを編集する コード 日付の表示形式をyyyy-MM-ddに変更したい。以下のようにする。 config.toml [params] listPageDateFormat = "2006-01-02 15:04:05" singlePageDateFormat = "2006-01-02 15:04:05" 具体的な日時に見えるでしょ? これ、フォーマットなんだぜ……。 ハァ? と思うでよね? ふつうyyyy-MM-dd HH:mm:ssとか%Y-%m-%d %H:%M:%Sとか、そーゆー感じなのに

    hugoの日付書式がクソすぎる(悪いのはgo言語です) - やってみる
    rryu
    rryu 2022/11/19
    日付の書式文字列が覚えられない問題をクールに解決してみたよ(ただし米国国内に限る)という感じだと思うのだが、24時間表記の時が12時間表記が03だからPM3時という意味で15なのが捻りすぎている感じがする。
  • Goのソースコード内のトリビア - YAMAGUCHI::weblog

    はじめに こんにちは、StackdriverあらためGoogle Cloud Operations担当者です。Google Cloud Operationsもさることながら、Go Conferenceの運営など、長らくGoコミュニティに関わってきましたが、まだまだ知らないことがあったということを昨日今日で知ったので共有します。 time.minWall time.minWall という値があります。 src/time/time.go - go - Git at Google const ( hasMonotonic = 1 << 63 maxWall = wallToInternal + (1<<33 - 1) // year 2157 minWall = wallToInternal // year 1885 nsecMask = 1<<30 - 1 nsecShift = 30 ) こ

    Goのソースコード内のトリビア - YAMAGUCHI::weblog
    rryu
    rryu 2020/07/17
    ある条件を満たせば値はなんでもいいという時にこういうのを思い付けるのいいなあ。変数名のaLongTimeAgoはずるい。
  • Gormが本番テーブルの数億件のデータを消そうとした話 - keroxpのScrapbox

    MySQLの場合、--safe-updatesオプションを利用することでこういった不慮のUPDATE/DELETEを防げるようです

    Gormが本番テーブルの数億件のデータを消そうとした話 - keroxpのScrapbox
    rryu
    rryu 2020/05/07
    引数の内容によって発動する機能が変わる系のメソッドあるある。指定されたオブジェクト郡の削除と条件指定の削除の機能が同居しているのでオブジェクト郡が空だと無条件削除の方が発動するという。
  • Go 1.14でシステムコールがEINTRエラーを返すようになった - Plan 9とGo言語のブログ

    Go 1.13までのゴルーチンの切り替えは、チャネルの送受信やシステムコール呼び出し、関数呼び出し前にコンパイラが暗黙的に挿入する処理などによって行われていました。そのため、上記の切り替わり操作を全く行わないループなどがあれば、そのゴルーチンがずっと実行されます。 func loop() { // この辺りにコンパイラがコード挿入している for { // 切り替わり処理が行われないので無限に実行される } } この結果、$GOMAXPROCSが1の場合はプログラムが停止します。コンパイラが挿入するコードは、インライン展開された場合やgo:nosplitディレクティブが記述された場合には行われないので、関数呼び出しをしていてもゴルーチンが切り替わらない場合はあります。 ゴルーチンの切り替えと関数のスタックチェック go doc compile/Compiler Directives Go

    Go 1.14でシステムコールがEINTRエラーを返すようになった - Plan 9とGo言語のブログ
    rryu
    rryu 2020/03/08
    ビジーループでも切り替わるようにプリエンプションポイントを増やすと速度が落ちるから協調プリエンプションやめますってことらしいが、その副作用が予期せぬEINTRの発生というのは厳しい気がする。
  • nilが欲しいからと言ってむやみにポインタを使うとひどい目にあう話 - moriyoshiの日記

    スマートフォンアプリ側の実装担当として少し関わっているあるβ版のサービスで、奇妙だが比較的クリティカルな問題が発生していた。 それもメッセージが関係ない人間に届くというものであった。 なんとなくその問題を担当することになったが、常に状況が再現するわけではなく、他の仕事もあったので、問題への見当を付けられないまましばらく過ごしてしまった。 そのメッセージを送信する部分はサーバサイドのコードで、Goで書かれていた。 そのコードのエッセンスを抽出すると、以下のようになる。 package main import ( "fmt" "sync" ) type User struct { Id int Name string } type Mail struct { Title string UserId *int } func sendMail(mail Mail, wg *sync.WaitGro

    nilが欲しいからと言ってむやみにポインタを使うとひどい目にあう話 - moriyoshiの日記
    rryu
    rryu 2018/03/21
    スコープというよりはgoroutineが非同期実行だからポインタを使うとレースコンディションが発生しやすという感じだと思う。
  • CPUやメモリなどの情報を取得するgopsutilのご紹介 — そこはかとなく書くよん。 ドキュメント

    CPUやメモリなどの情報を取得するgopsutilのご紹介¶ Go Advent Calendar 2015 の16日目です。 Pythonには psutil という、CPUやメモリなどの情報を取得するライブラリがあります。 拙作 gopsutil はこのpsutilをgolangに移植しようと始まりました。 gopsutilは、以下の特徴があります。 Linux/Darwin/FreeBSD/Windowsで動作します もちろん、対応状況はかなり違います (ほぼ) pure golangで実装されています。そのため、クロスコンパイルが容易です ほぼ、というのはdarwinのCPU利用率だけcgoを使っています。cgoを使わない場合は単にnot implementedが返ってきます。 psutilにない情報も取れます docker(cgroup)の情報だったり、仮想化状況だったり、好き勝手

  • そろそろ理解しておきたいのでDockerのソースコードをビジュアルに読む! - Qiita

    まずはツールの紹介 昨今、注目を浴びているアプリケーションコンテナを作ったり管理したりできるDocker。 そろそろ中身も理解しておきたいところ。特に最近はlibcontainerというのができて、lxc依存すら切り離されているとの噂。 ただ、結構ソースコードの量も大きくなっているので(2014/4月現在 テストコード除いて70000行弱)、 さっと大まかに理解するためのツールを書いてみました。 このツールはgoのastからパッケージの間の依存関係を読んで、graphvizの解釈するdot言語に吐き出すツールです。 たとえば、最近話題のgo-xslateの全体像をつかもうと思ったら、 のようにすることで、 拡大 こんな感じにパッケージ間の依存関係を図示することができます。 これだけでも何となくどんな構造になってるかわかってきそうですね。 不安定性の表示 govizにはdot言語の出力の他に

    そろそろ理解しておきたいのでDockerのソースコードをビジュアルに読む! - Qiita
    rryu
    rryu 2014/04/14
  • 1