サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
2024年ランキング
ymmt.hatenablog.com
Docker ビルド職人の朝は早いーー 毎日コンテナイメージを山ほどビルドしては捨てている皆様、おはようございます。 ビルドの速度はそのまま CI にかかる時間だったりするので、短縮には余念のないことと思います。 レイヤのキャッシュやマルチステージビルドといった基本テクニックについて、ご存じない方は以下の記事がお勧めです。 future-architect.github.io この記事では、良い Dockerfile をさらに活用できる、かもしれない docker buildx bake について紹介します。 bake の紹介の前に、私が抱えていた問題を説明します。 目下のプロジェクトでは Kubernetes 上で多数のマイクロサービスを動作させています。 マイクロサービス群はモノリポ(monorepo)上の共通のフレームワークやライブラリを用いて効率的に開発されています。 そのため、全
GitHub Actions で CI している皆様、こんにちは。 GitHub Actions 便利ですよね。使わない日がないというくらい毎日お世話になっています。 さて、CI といえば良く問題になるのが実行時間。 長い待ち時間は開発効率を下げますし、プライベートリポジトリだと Runner の費用も嵩んでしまいます。 時間を短縮する方法は色々ありますが、一手目によく行われるのが依存パッケージのキャッシュじゃないかなと思います。 例えば Go で開発していると、依存パッケージは ~/go/pkg/mod にダウンロードして保存されます。 これを CI 実行のたびにダウンロードしてコンパイルするのは時間とお金の無駄というものです。 幸い、GitHub Actions には CI の実行間でこういった依存パッケージを保存して再利用できるキャッシュ機能があります。 詳しくは以下のドキュメントを
ソフトウェアエンジニアとして働き始めて 20 年以上になります。 元々ソフトウェアでいろいろ作りたくて就いた職業なので、結構な数のプロダクトを開発してきました。 私がメインで開発したもので OSS として出ているものでは、 yrmcds: memcached クローンで、レプリケーション機能などを持つ usocksd: SOCKS4/5 サーバー & ライブラリ transocks: アプリのネットワーク通信を透過的に SOCKS サーバーにプロキシする透過プロキシ coil v2: Kubernetes の CNI ネットワークドライバ moco: MySQL を自動運用する Kubernetes オペレーター accurate: Kubernetes 上で namespace ベースのソフトマルチテナンシーを実現するためのソフトウェア などがあります。これらのソフトウェアの多くは、現役
最初に断っておきますと、OpenTelemetry を良く知っていたり真面目に調査しようという人が読むべき内容はここにはありません。 公式ドキュメントなりをご参照ください。これは最近 OpenTelemetry を使いだした一般人の感想記事です。 さて、いけてる Web 開発者、特にバックエンド開発者の方はオブザーバビリティという言葉は聞き及んでいるかと思います。 なかでもオブザーバビリティ三種の神器と言われている(?)ログ、メトリクス、分散トレーシングをどう実装するか頭を悩ませているかもしれません。 頭を悩ませてきた、あるいは頭を悩ませている理由の一つは、これらを実装するときに特定の実装向けになりがちであったためです。 メトリクスであれば最近は Prometheus 向けに /metrics エンドポイントとして提供する実装が多いといった話です。しかしながら、 あらゆる人が Promet
ログ出力をどうするかっていうのは、Go 書くときに常にちょっとした悩みの種でした。 標準の log パッケージはあるものの、実用には機能が不足していると見なす人が多いためです。 かくいう私もその一人で、近年は Kubernetes 界隈でよく使われている以下を組み合わせていました。 go-logr/logr uber-go/zap + go-logr/zapr logr は所謂 structured logging のための共通インタフェースを提供するパッケージで、uber-go/zap のような著名なログライブラリ向けにアダプタも提供してくれます。 debug, info, warn, error といったいわゆるログレベルも備えていますし、context 経由で logger を渡すこともできるので、便利に活用していました。 ただ、logr は結構使われているとはいえ標準パッケージでは
昨今 ID 管理系の業務をやっていて、まあ色々学びがあるんですがそのうちのひとつ、PRECIS について。 PRECIS というのは RFC 8264 で規定される、ユニコード文字列を適正に比較するためのフレームワークです。 PReparation, Enforcement, and Comparison of Internationalized Strings の acronym で PRECIS と呼ばれています。 ユニコードは表示上は同じように見えても UTF-8 のバイト列としては異なる表現になる文字列があったりします。 たとえば「が」は 0xE3 0x81 0x8C もしくは 0xE3 0x81 0x8B 0xE3 0x82 0x99 のどちらかで表現可能です。 当然、単純にバイト列として比較してしまうと同じ文字列なのに異なるという誤判定をしてしまいます。 ここまでは NFC と
Squid と言えば Web proxy のド定番なわけでコンテナ化して走らせたいことも多いでしょう。 巷に転がっている Squid 用の Dockerfile は root 権限が必要なものが多く root 権限が不要なものが見当たらなかったので作ってみました。 以下に置いてあるのでご活用ください。 github.com
この記事は私が過去 3 年ほど Kubernetes に携わる中で学んだ、ちょっと見つけにくい知識をまとめたものです。 特にカスタムコントローラーを開発するような人に必要となる知識群です。 感想とか指摘とかあれば Twitter までお寄せください。 更新履歴 2021-03-05: "コンテナの resources.limits と resources.requests の違いについて" の項を補足しました (thanks to @superbrothers) API コントローラー実装 プログラムと連携動作 資源管理 ネットワーク モニタリング アクセスコントロール API kube-apiserver が備える拡張機構を列挙しなさい 回答例 Custom resources: OpenAPI スキーマで独自のリソース型を追加できる Aggregation layer: kube-ap
あけましておめでとうございます。年賀状代わりに開発環境の構築記事を差し上げます。 いやわりと真剣に、開発環境にはその開発者の近況が表れていると思うのですよ。 いっちょあなたもどうですか 😀 閑話休題。 以下今日やった Ubuntu 20.04 LTS のインストール作業記録です。語調変わるのはご勘弁。 Hyper-V VM の用意 Ubuntu のインストール インストール後の作業 systemd-networkd の設定 不要なツールを purge build-essential をインストール dotfiles で初期設定 Go をインストール Docker をインストール 以上 Hyper-V VM の用意 特に難しいことはない。 ブリッジ仮想スイッチを作り、第2世代タイプにしてセキュアブートを無効化するくらい。 あとチェックポイント(自動スナップショット)はうざいので無効化してい
新型コロナウィルスの影響も長引いてますが、皆さま無事お過ごしでしょうか。私は幸い無事です。 日ごろチームでソフトウェア開発をしているのですが、近年社内ではペアプログラミングやモブプログラミングが流行しています。 私のいるチームでもここ二年ほどモブプログラミング(ないし類似のプラクティス)に取り組んできました。 モブプログラミングについて正確にどのようなものかは以下の記事などをご参照いただければと思います。 簡単にまとめると、要求分析やコーディング等幅広い開発作業を、同じ場所に集まったチームの共同作業でこなしていくというものです。 このご時世ですので、最近はオンラインのミーティングルームに集合する形式でしたけど。 www.agilealliance.org ここから先は、非常にパーソナルな、私に限定された体験になります。 どの人・チームにも適用できる話ではありません。ではありますが、どの人・
さて、テストコードなんて書きたくなかった私ですが、世の流れには逆らえず今はせっせとテストコードを量産しています。 開発完了=試験完了=出荷可能が求められる忙しない世の中でありますから。 目下開発しているのは Kubernetes 向けのネットワークソフトウェア Coil のバージョン 2 なんですが、この開発では main 文以外はすべて自動テストする徹底ぶりです。他にも近年様々にテストコードを書いてきた過程で、以下の知見を得るに至りました。 外部依存はなるべく実物を使う etcd を使うなら etcd を用意、ネットワークをいじるなら network namespace を用意、... 内部依存はなるべくインタフェースで依存注入する 多分この結論に似たことはあちこちで言われている気はするのですが、結論に至った理由が大事と思うため、以下少し書きます。 あ、以下モックと言ってる用語は専門的に
仕事で、データセンターのアーキテクチャを刷新するプロジェクトを進めてます。 Kubernetes を中心としているので、必然的に Kubernetes 上で動作するアプリケーションを開発する機会があります。 Kubernetes は API サーバー (kube-apiserver) にリソースを登録して、他のプログラムは API サーバー上のリソースを監視して動く Hub & Spoke アーキテクチャを特徴としています。 出展:https://kubernetes.io/docs/concepts/architecture/cloud-controller/ Kubernetes の動作をカスタマイズするには、API サーバーの動作に手を入れる必要があります。kube-apiserver はそのための仕組みとして、通常の API に加えて以下を提供しています。 Custom Resou
業務で Linux 向けの Go プログラムを多数開発しています。 しかしながら、開発している機材の OS は好きこのんで Windows です。 在宅から勤務するときに、Windows のリモートデスクトップが最強すぎるので手放せないのが大きな理由です。 そんなわけで、Windows の Hyper-V という機能で Ubuntu を仮想マシンとして動作させ、Emacs で長年開発していました。 しかし近年、モニタも 4K 32 インチと大きくなりましたしメモリも 32 GB 搭載されていますし、なにより Visual Studio Code のような高機能 IDE が手軽に利用できる状況でありながら、ろくにカスタマイズをしない Emacs で開発を続けるのも怠慢かなと考え、「WSL で快適な Go 開発環境を作る」という記事に書いたように Windows + WSL + Visual
先日 GitHub に「開発中のためまだマージするべきでない」プルリクエストを作ることができる Draft Pull Request 機能が追加されました。 今の業務では複数人でモブプロしたりする関係で、開発途中のブランチを GitHub に push してひとまずプルリクエストを作ることが良くあります。従来は、そういったプルリクエストを作る都度 "wip" ラベルをつけたり [WIP] とタイトルを変えたりとひと手間かかっていました。その手間を無くせるので、draft pull request は待望の機能です。 もうひとつ、業務ではプルリクエストは working tree から git neco review という拡張コマンドで自動作成するようにしています。いちいち画面を触る必要がなくとても便利です。自然な考えとして、git neco draft というコマンドを打てば draft
個人的な備忘録です。 仕事上 Ubuntu をターゲットに Go のプログラム開発をする必要があるのですが、従前 Windows デスクトップに Hyper-V の Ubuntu で Emacs で開発していたところをVisual Studio Code(vscode) に開発環境を変えたいと考えました。理由は省略。 最初は Ubuntu 上に vscode を入れて X 越し(VcXsrv)で試してみたのですが大画面だと描画速度が遅すぎてストレスたまってダメでした。 仕方がないので Windows 上の vscode で WSL の Ubuntu を併用しつつネイティブ Windows 開発環境を構築することにしました。大分手順が多くなってきたのでメモとして残します。 WSL のセットアップ 公式手順に従えば難しいことはない。 WSL を有効にしたら Microsoft Store で
最近 CKE というベアメタル向けの Kubernetes 管理ツールを作っています。 ブートストラップツールではなく自律的・継続的にクラスタの構成を修正していくツールで、以下が特徴です。 ネットワークプラグイン非依存 HA 対応 CKE 自体の高可用性 今日は CKE の紹介が目的ではないのでこのあたりにします。 本題は、CKE が内部で使っている golang.org/x/crypto/ssh というライブラリが無期限に ブロックしてしまう問題があったので、どう対応したかです。 問題 以下のようなスタックトレースで動作が停止するケースが試験中に何度か発生しました。 goroutine 2153 [chan receive, 4 minutes]: golang.org/x/crypto/ssh.(*mux).openChannel(0xc000105730, 0x13a0ec2, 0x
builderscon tokyo 2018に参加してきましたので、メモ。 仕事で Kubernetes を扱っているので、その周辺技術の話を聞いてきました。 初日はサービスメッシュ関係がたくさん。 Envoy internals deep dive Envoy 開発者の Matt Klein 氏による、開発の背景と内部アーキテクチャの解説。 Kubecon EU 2018 の拡大版(同じ?)のようで、そちらの資料は公開されていました。 speakerdeck.com マイクロサービスが多様な言語で開発されると、サービス間通信の標準的な振る舞いをライブラリアプローチで実装するのが困難 そこで L7/L4 プロキシとしてサービス間通信を調整する Envoy を開発 Envoy 自体は通信処理に専念するデータプレーンで、Envoy のクラスタを管理するコントロールプレーンを別に用意する アーキ
TL;DR HDD 同様、NVMe ストレージも nobarrier するなら内部キャッシュを無効化したほうがいいケースがあります。 分かる人向けに端的に書くと、NVMe 仕様には volatile write cache の有無と、有効化/無効化切り替え、および有効な場合にデータが消失するケースが明記されています。手持ちの NVMe デバイスの情報を確認して、ファイルシステムに nobarrier つけたいなら、確実に無効化しておきましょう。 以下は詳細。 NVMe というのは PCIe バスに直接つないでデータを保存できるストレージの共通規格で、nvmexpress.org で仕様が公開されています。最新の仕様は rev. 1.3です。 HDD や SSD のようなものではあるんですが、hdparm コマンドで設定することはできず、ベンダが提供するツールか、NVMe 仕様に基づいてコン
@tamagawa_ryuji 氏からこの度和訳して発売された「SRE サイトリライアビリティエンジニアリング」をご恵贈いただきました。 英語の原本は昨年発売されており、Google のサービス運用について実践的な知見が得られる貴重な書籍ということで、去年のうちに英語版を社内で購入し、輪講しています。今回和訳本を頂きましたので、二度目となりますが早速拝読しました。 SRE (Site Reliability Engineering) という言葉を聞きなれない方のために簡単に解説しておくと、Google において古典的なシステム管理者の概念に代えて導入された、システムとその上のサービスの信頼性に責任を持つエンジニアとその仕事のやり方の体系的な概念です。 初めて読んだ際は、SRE とそれにまつわる Toil や Postmortem といった概念や SLO の定義の仕方について Google
長年 Android を使っていたんですが、最近 iPhone にしまして。 cybozu.com にリモートからアクセスする際、クライアント証明書で認証する「セキュアアクセス」という機能があるのですが、Safari で使うには証明書を読み込ませておかねばなりません。 Android では PKCS#12 形式のファイルを選択するだけで読み込めたのですが、iPhone だとユーザーインタフェースがないのですね。 調べてみると、会社の iPhone をまとめて設定するために使う「構成プロファイル」という機能があり、この一機能でクライアント証明書を設定できるようです。 構成プロファイルは .mobileconfig という拡張子の XML ファイルで、以下のように自作できます。 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUB
Go 1.7 から本体に入った context パッケージは便利、というより今や必須の道具です。以下のように書くことで、一定時間で処理をキャンセルできたりします。 func slowOperationWithTimeout(ctx context.Context) (Result, error) { ctx, cancel := context.WithTimeout(ctx, 100*time.Millisecond) defer cancel() // releases resources if slowOperation completes before timeout elapses return slowOperation(ctx) } defer cancel() とありますが、このようにしないとリソースリークするので context 使うときはこう書くのがパターンです。 さて
メモです。C:\Go\bin にパスを通したいとして、以下のようにするとマシン全体の Path に追加できます。 PowerShell を管理者権限で起動する 以下を文字通りに入力する [Environment]::SetEnvironmentVariable("Path", $env:Path+";C:\Go\bin", "Machine") コマンドプロンプトを別途開いて go を打ってみる GUI が諸事情で使えない人はどうぞ。
@songmu 氏からご恵贈いただいた「みんなの Go 言語」(みんGo)、早速拝読しました。 書評としてはタイトル通り、なのですがそれではあんまりなのでもう少し。 本書でも述べられている通り、Go 言語は早ければ一日で大体学べてしまう学習効率の良さが魅力です。最大の魅力と言っていいかもしれません。コンパクトな言語仕様に実務で必要な周辺ツールが揃っているため、初学者から歴戦のプログラマまで活用範囲が非常に広いのです。 さて、その Go 言語をさらに活用するための本書。お手に取ってみればわかりますが 150 ページ弱で薄い本です。読むのに半日あれば十分でした。本の内容も余計なことは書かれておらず、「こんな便利な機能があるよ」くらいなあっさり風味で淡々と役に立つ情報が並べられています。 ああ、わかっているなと。 Go 言語の最大の魅力と思う学習効率の高さを、文字通り形にした本、それが「みんなの
yrmcdsという memcached のクローンを開発・メンテナンスしています。yrmcds は memcached を機能拡張しているので、クライアントライブラリも独自に開発する必要があり、libyrmcds という C/C++ 用クライアントライブラリとそれを基にした php-yrmcds という PHP の拡張モジュールも開発・メンテナンスしています。 この時点でもう関心ない人が大半だと思いますが、ここから書くのは世界中でたぶん私くらいしか苦労してないし、することもない話です。苦労したので書き残しておくか、くらいな駄文です。 You've been warned! memcached には当初から実装されているテキストプロトコルと、後から追加されたバイナリプロトコルがあります。後から追加されたバイナリプロトコルは後発なだけあって、テキストプロトコルにはない、以下の特徴があります。
/usr/local/bin にある #!/usr/bin/python3 をみつけたい、場面です。 こんな感じ。 find /usr/local/bin -type file | xargs awk '/python3/ {print FILENAME} {nextfile}' 1行目だけ検査したらさっさと nextfile で次に移るので OK というわけ。 nextfile Stop processing the current input file. The next input record read comes from the next input file. FILENAME and ARGIND are updated, FNR is reset to 1, and processing starts over with the first pattern in the
Linux 限定ですが、binfmt_misc を使えば shell script や Python と同じように実行ビットを立てるだけで実行できるようになります。 以下のスクリプトを /usr/local/bin/gorun とでもして保存 #!/bin/sh exec go run "$@" Debian/Ubuntu なら update-binfmts があるので以下を実行 sudo update-binfmts --install go /usr/local/bin/gorun --extension go Go スクリプトに実行ビットを立てる chmod a+x hello.go hello.go が直接実行できるようになる $ ./hello.go Hello World! 小ネタで頻出と思いますけど。
これまた誰かの役に立てばということで。 keepalived (VRRP)はその仕組み上、ネットワーク分断時にマスターが二つ以上できます。俗にいう、スプリットブレインというやつです。 ネットワーク分断が解消したのち、マスターは一つに収束します。ネットワークスイッチの類であれば大概の場合これで問題はありません。ええ、問題はないはずでした。 ところが先日、ネットワーク分断解消後にある Linux サーバーからスイッチの仮想IP(VIP)への通信ができなくなる現象が発生しました。原因を調べたところ、VIP を現在持っているスイッチの MAC アドレスではなく、バックアップスイッチ側の MAC アドレスが ARP キャッシュに載っていたためでした。 以下のような経緯で障害になったものと思われます。 スプリットブレイン中、複数のマスターから VIP の ARP キャッシュを更新するためGratuit
2010 年代になってまだ Apache だの PHP だの使っているの?っていう突っ込みは却下です。 世の中には様々な事情を抱えた人がいるのです。生暖かく見守ってください。 さておき、Apache 2.2 の頃、FastCGI で PHP を動作させるといえば mod_fastcgi や mod_fcgid を利用して、以下のような httpd.conf を作成していたわけです。 Alias /php5-fpm /usr/sbin/php5-fpm FastCgiExternalServer /usr/sbin/php5-fpm -host 127.0.0.1:9000 DocumentRoot /var/www <Directory /var/www> Options FollowSymLinks AllowOverride None Order deny,allow Allow fr
人類は大袈裟ですが、私には厳しかったという話。 IPv6 対応のプログラムとは? いたるところに書かれているので省略。以下の記事などを参考にどうぞ。 IPv6ソケットプログラミング Programming using C-API 手短にまとめると gethostbyname(3) ではなく getaddrinfo(3) を使って名前解決する accept(2) や getpeername(2) で返るアドレス情報は struct sockaddr_storage に格納する listen するソケットは AF_INET6 指定で作ると IPv4/v6 両対応になる シンプルですよね。ここまでは。 落とし穴1:リンクローカルアドレス IPv6 のアドレス体系は IPv4 とかなり異なります。最たるものがリンクローカルアドレスです。 リンクローカルアドレスはルーティングされないので、リンク(≒
次のページ
このページを最初にブックマークしてみませんか?
『誰かの役に立てばいいブログ』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く