2024年9月29日日曜日

Reactアプリケーションが驚きの白さになる問題(net::ERR_CONTENT_LENGTH_MISMATCH)

 Reactを使っていて、なぜか画面が真っ白になることがありました。驚きの白さです。

ブラウザーの開発者ツールでネットワークをモニターしたところ、CSSやJSなどの静的ファイルの読み込みに失敗していることがわかりました。

JSの読み込みに失敗したら驚きの白さになるというのはまあごもっともなんですが、問題は読み込みに失敗している原因がわからないこと。なにしろ、ローカルや開発環境では全く問題ないのに本番環境だけで問題が発生しています。そして読み込みに失敗している原因がnet::ERR_CONTENT_LENGTH_MISMATCHです。なんじゃこら。

色々原因を探っていたら、最終的に見つかったのがコンテンツ配信サーバーのディスクフル

配信サーバーのストレージが足りない→コンテンツのキャッシュができない→誤ったデータを返す(?)みたいな流れで起きるピタゴラスイッチのようです。

ディスクフルくらい監視して気づけや、というツッコミは勘弁してください。今回は色々事情があったんです。。。

2024年9月22日日曜日

Docker使っててストレージを圧迫してるやつはこれ実行しろ

 まじで実行しろ。びっくりするくらい空き容量できるから。

docker system prune


2024年9月15日日曜日

zedの公式Gentooパッケージが出た

 以前紹介したエディターのZedについて。

なんとかGentooでネイティブビルドするパッケージを作ろうとCargoのebuildパッケージ作成に挑戦していました。どうもうまくいかずモタモタしている間になんとGentooの公式からパッケージが登場しました!

https://packages.gentoo.org/packages/app-editors/zed

amdキーワードがマスクされているので、ACCEPT_KEYWORDSを設定しておいてください。

あと環境によってはファイルオープンダイアログが表示されないことがあります。そのときはxdg-desktop-portalをインストールして再ログインしてください。

使ってみましたが、やっぱり爆速ですね。後発であり、おそらくまだベータ版扱いだと思うので機能面ではさすがにVSCodeには劣りますが、簡単なコード編集には充分です。

応援の意味も込めてガンガン使ってます。みなさんもどんどん使ってください。MacとLinuxに対応しています。もうすぐWindows版も出るそうです。

2024年9月8日日曜日

サーバーにDockerをインストールするときの約束

 いいかい学生さん、Dockerをな、DockerをLinuxサーバーにインストールするときはな、一般ユーザーをdockerグループに追加するんだよ。

それが、root権限を使い過ぎもしない、ちょうどいいくらいってとこなんだ。

usermod -aG docker user

2024年9月1日日曜日

DockerfileでARGを1行に複数指定できた

 すでに知っている人にとっては何を今更と思うかもしれませんが、つい最近知りました。

公式のリファレンスの書式では1つしか指定できないように見えます。

ARG <name>[=<default value>]

使用例も1行に1つずつ指定する方法しか書いてありません。

FROM busybox
ARG user1
ARG buildno
# ...

でも試してみた結果、以下のように1行に複数のARGを指定できました。

ARG foo bar

ちなみにENVちゃんと1行に複数指定できることが明示されています

これで少しでもDockerイメージのレイヤーを減らせれば。。。

2024年8月25日日曜日

返信率が低いスカウトメール

 時々、知り合いの会社(複数)の人事の方から「エンジニア(IT開発者)にスカウトメールを送っているけど返信率が低い」という相談を受けることがあります。

話を聞いていると大体以下のどれかに当てはまっていることが多いのですが、他に思い当たる方はいないでしょうか。

2024年8月18日日曜日

GoのDTLSライブラリーの不具合

 GoでPion DTLSというライブラリーがあります。これはUDPの暗号化通信をするときに使われるライブラリーなので、特殊なプロトコルの実装以外ではそもそもそういうソフトウェアを開発する機会自体があまりないかもしれません。

このライブラリーにちょっとした不具合がありまして、コネクション切断後の再ハンドシェイクがDTLSの仕様どおりの挙動をしていないようです。

具体的には明示的なコネクション切断を行わずに同じ接続元(アドレス:ポート)からClientHello受け取ったとき、DLTSの仕様ではサーバーは新しいハンドシェイクを開始するべきなのですがこのライブラリーではClientHelloが無視されます。

1年近く前にその問題を報告したのですが、つい最近この問題が解消されたようです。

かなりニッチな情報ですが、個人的に結構嬉しかったのでここで報告。。。

2024年8月11日日曜日

Fluentdでmultilineを使うときにちょっとだけ注意

 前回に引き続きFluentdの話。今回はmultilineパーサーについてです。

このパーサーは正規表現で複数行を解析できるので、regexpの上位互換みたいなもんか。じゃあ何も考えずmultilineにしとけばええやん!と思っていたら・・・

なぜか最後の行が出力されない。

これでしばらく悩んだんですが、そもそも考えてみたら次の行頭が確定するまで現在の行全体が確定しないわけですからそりゃそうですね。

というわけで、しばらく入力がなかったら自動的に行を確定させるためにmultiline_flush_intervalを設定しましょう。

これも数日ハマったので、同じようなハマり方をしている人のために残しておきます。

2024年8月4日日曜日

FluentdでS3に出力するときに気をつけること

 クラウド全盛期の今、ロギングツールも各クラウドの機能に取って代わられている感がありますが、まだまだ現役なFluentdの話です。

Fluentdで収集したログをAWS S3にアップロードする場合、セキュリティー対策として(アカウントが乗っ取られたときにログを盗まれないように)アクセスキーやロールにWRITE権限しかつけないことがあります。

そのときは、out_s3プラグインの設定で以下の項目を無効にしましょう。

  auto_create_bucket false
  check_bucket false
  check_object false

よく考えれば当たり前なのですが、諸々の存在チェックはS3側に読みに行くので、READ権限が必要です。これらを無効にしておかないと、エラーが出てログを収集できなくなります。

なんでこんな当たり前のことをわざわざ記事にするかというと、これを忘れてハマったからです。

2024年7月28日日曜日

UNICODEのHELLO WORLD

5人組アイドル「UNICODE」登場 デビューシングルは「HELLO WORLD」 IT関心層「検索しにくそう」  

はい。ただのネタです。

そもそも文字コードとしての「ユニコード」は“Unicode”(先頭のみ大文字)、K&Rの元祖「ハローワールド」は“hello, world”(全て小文字、カンマあり)なので、このアイドルのことを知らなくてもブログのタイトルを見た時点で「ITとは関係ないな」とわかるはずです(?)

よーしパパ X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H* というユニットを作っちゃうぞー

ユニット名を保存したファイルがセキュリティーソフトに引っかかってもしらないぞー

詳細はEICARテストファイルで。

2024年7月21日日曜日

スクラッチから開発する新しいブラウザー Ladybird

 Google広告費の影響を受けない新たなWebブラウザが必要だと、スクラッチからWebブラウザを開発する「Ladybird Browser Initiative」、元GitHub創業者らが立ち上げ

動機は納得だし、健全な競争のためにも大いに応援したいと思っています。ただここまで巨大化したウェブ標準をフルスクラッチで実装するのは骨が折れるどころか粉末状に砕けるレベルの大仕事でしょうね・・・

当面の問題は、開発人材の確保と運営資金でしょうか。

とりあえずリンクをぺたり。みなさんも応援してあげてください。

公式サイト

GitHubリポジトリー

2024年7月14日日曜日

命名的問題 vs 構造的問題

技術的負債を抱えたレガシーコード。変なメソッド名と入り組んだロジック、リファクタリングするならどちらが先?(前編)

技術的負債を抱えたレガシーコード。変なメソッド名と入り組んだロジック、リファクタリングするならどちらが先?(後編)

記事の内容は「メソッドの名前がおかしいが実装わかりやすいコード」と「メソッドの名前は問題ないが実装がややこしいコード」の2つを50人ほどのJavaプログラマーに解読してもらい、メソッド名と実装のどちらを先に修正すべきかというものです。

統計結果を見る前に思ったのは、メソッド名を先に直すべきではないかということ。理由は記事中にある

構造的問題は局所的に起こるが、命名的問題はコードのどこにでも出てくるものがあるため
「命名的問題」があるとコードが信じられなくなる

などです。そして上記記事でも「命名が不適切なコードの方が読解精度が低い」という結果が出ました。

また実際の開発現場でも、命名が不適切なコードの方が読解精度が低い」という結果ですが、コードリーティングの際に実装がややこしい場合は「何だこれ?」と思って注意して読み進めるのに対し、命名が不適切な場合はメソッドの役割を勘違いしたまま開発を進めてしまう可能性があるので命名的問題のほうが深刻だと考えています。

2024年7月7日日曜日

JANOG54 Meetingに参加しました

 先日7/3-5に、奈良でJANOG54 Meetingが開催されました。毎回ネットワーク分野の錚々たる企業が集まっており、日本国内でインターネットが壊れた場合は大抵ここの参加企業のどこかが何かやらかしていると考えて間違いないです。

色々ブースを見て回った他、さくらインターネットのブースで「高火力 DOK」の説明も行いました。AI関連のサービスなのでネットワークと直接関係はないんですが、6/27に発表されて1週間ほどしか経っていないサービスなので、広報も兼ねて説明要員としても参加しました。

ネットワークなどの低レイヤーにあまり興味のないウェブ開発者もいると思いますが、自分たちが開発している(あるいは普段使っている)サービスの土台を知るためにもこういうカンファレンスはおすすめです。最初は言っていることがさっぱりわからないかもしれませんが、何度も参加しているうちに知り合いができたり話の内容も理解できたりするので面白いですよ。

奈良には学生時代に数年(今回の会場から2駅ほどしか離れていない場所に)いたんですが、さすがに当時から時間が経っているので駅前がかなり開発されていますね。ただ夏暑く冬寒いという気候は相変わらずでしたが。

2024年6月30日日曜日

excuse us

 やや混み気味の電車に乗っていたとき、外国人の家族連れが降りようとしていました。そのときに聞いたのが “Excuse us” 

こういうときのイディオムは “Excuse me” が定番だと思っていましたが、usは初めて聞きました。

よく考えれば、許してもらう対象が家族という「複数」の場合はusを使う、というのは当たり前といえば当たり前ですね。知っている人にとっては「何を今更」という感じでしょうが、今まで習ったことも聞いたこともない表現だったので勉強になりました。

   /⌒ヽ 
  / ´_ゝ`)   /⌒ヽ  Excuse us...
  |    /   / ´_ゝ`) 
  | /| |    |    /
  // | |     | /| |
 U  .U     // | |
         U  .U


2024年6月23日日曜日

ひも理論から円周率の公式を発見

 インドの物理学者がひも理論の研究から偶然「円周率」の新しい公式を発見

いやー、こういう発見があるから数学は面白い。数学が「自然科学の言語」と言われるのも納得です。

原論文はこちら。実際の計算公式は以下のとおりです。

\begin{eqnarray*} \pi=4+\sum_{n=1}^{\infty}\frac{1}{n!}\left(\frac{1}{n+\lambda} - \frac{4}{2n+1}\right)\left(\frac{(2n+1)^{2}}{4(n+\lambda)}-n\right)_{n-1} \end{eqnarray*}

2つほど補足すると、唐突に出てくる\(\lambda\)は実部が\(-1\)より大きな任意の複素数、右下の小さな\({}_{n-1}\)はポッホハマー記号(昇冪)です。

Pythonで書くとこんな感じ。元の式をできるだけ忠実に表しているので、メモ化などの最適化はしていません。

# https://gigazine.net/news/20240619-string-theory-pi/
# 原論文: https://journals.aps.org/prl/pdf/10.1103/PhysRevLett.132.221601
import math

def poch(x: float, n: int) -> float:
    # ポッホハマー記号(昇冪)
    # https://ja.wikipedia.org/wiki/%E3%83%9D%E3%83%83%E3%83%9B%E3%83%8F%E3%83%9E%E3%83%BC%E8%A8%98%E5%8F%B7
    y = 1
    for j in range(n):
        y *= x + j

    return y

def term(lambda_: float, n: int) -> float:
    # 第n項を計算
    a = 1/(n+lambda_) - 4/(2*n+1)
    b = (2*n+1)**2 / (4*(n + lambda_)) - n
    return a * poch(b, n-1) / math.factorial(n)

def pi(lambda_: float, n: int) -> float:
    # 円周率を計算
    p = 4
    for n_ in range(1, n):
        p += term(lambda_, n_)

    return p

print(pi(1000, 100))

Python Praygroundにコードを貼り付けると結果が出てきます。pi関数に渡す値を色々いじって遊んでみてください。

2024年6月16日日曜日

𝕏の「いいね!」非公開

X、「いいね!」を週内に非公開化すると発表  

わざわざこの記事を取り上げた理由はこの記事そのものではなく、これに対するGoogle翻訳。

  • "Like"(名詞)を「いいね!」
  • "like"(動詞)を「『いいね!』する」

のように、ちゃんと文脈を捉えて訳しているのが興味深かったです。

𝕏関連の文章も大量に学習させたんでしょうけど、過学習起こしてないよな・・・?

2024年6月9日日曜日

Enpassのバグ その後

 先日FirefoxのプライベートモードでEnpass拡張機能が動作しなくなったという記事を書きました。記事中にあるとおり公式フォーラムでも報告したんですが、「プライベート拡張機能を有効にする設定にしてね」というコメントをいただき、ちょっと話が噛み合っていませんでした。

そして最近Firefoxを更新したところ、拡張機能が使えるようになっていました。何もしてないのに壊れて何もしてないのに直りました

Firefox本体の仕様の問題だったんでしょうか。でも全ての拡張機能が使えなくなっていたわけでないので詳しいことはよくわかっていません。モヤモヤ感は残りますが、とりあえずフォーラムにも報告して一件落着(?)です。

2024年6月2日日曜日

パスワードの定期変更について

 昔、アルゴリズム辞典やLaTeXの本などで大変お世話になった奥村先生のポストより。

このポストについては何も異論はないのですが、とはいえこのブログで何度か取り上げたように「パスワードは半角英数16文字以内」のようにお前絶対ハッシュ化しとらんやろというウェブサービスがいまだ存在しています。

そういうサービスがSQLインジェクションのような基本的な攻撃に正しく対応しているところばかりとも思えないので、「いつかデータを引っこ抜かれることを想定した定期的なパスワード変更」は必ずしも無意味ではないと思います。

何事も臨機応変に。

2024年5月26日日曜日

プログラミング言語の省略表記について

 ちょっと前にPythonを滅ぼそうやない会とかいう記事が投稿され、それに対するアンサー記事も投稿されるなどまあまあ賛否両論だった記憶があります。

個人的にはシンタックス云々に一部同意する部分もありつつ、でも英語の語順的にまあそうだろうなーというアンサー記事に同意する部分もありつつ、でも英語話者以外が使うことも考えてくれよなーと思いつつというどっちつかずの状態です。

個人的ついでに書くと、三項演算子やラムダ式などの省略記法は基本的に書きません。リストの内包表記も使いません。理由はあとで自分がすんなり読める自信がないから

「そんなもんも読めないお前のスキルが低いだけ」と言われたら返す言葉もないんですが、とはいえ大抵のプログラマーは数ヶ月前、いや数週間前に書いた自分のコードが理解できないという状況を経験しているはずで、なるべく平凡な書き方のほうが大抵の人が理解しやすいでしょう。

Pythonに限らず、他の言語でもあまり省略記法やシンタックスシュガーは使わない傾向ですね。例えばJavaScriptのオプショナルチェーンとかも使いません。

JavaScriptといえば、個人的には互換性を数十年引きずっているあの言語仕様はなんとかならんもんかと思ってます。とはいえ上澄みをすくおうと頑張っているAltJSが生まれては消え、スーパーセットを謳っているTypeScriptが事実上のデファクトスタンダードという現状を見ると、これが市場の意思なんだと納得するしかないですね。JSConfの運営ボランティアにも入っていながらこんなこと言うのもアレなんですが。

結局何を言いたいのかよくわからん記事になってしまいましたが、要するに自分は平凡なソースコードを書いてるよという極めて平凡な内容しか書いてないですね。

2024年5月19日日曜日

ReLU関数がよくわからない

 ニューラルネットワークの活性化関数にReLUってあるじゃないですか。あれがどうもよくわからんのです。

数学的な定義とか「正の値の微分が1なので勾配消失問題に強い」とかは知ってるんですけど、なぜこれを使うと精度が向上するのか、負の値を一律で0にすることがニューラルネットワーク上でどういう意味を持つのかがわかりません。

上でリンクを張ったWikipediaでは

2000年にHahnloseらによって強い生物学的動機と数学的正当化を持って、動的ネットワークへに導入された

とありますが、生物学的な動機ってなんだろう。。。

そしてPyTorchのseq2seqとAttentionのチュートリアルでは、デコーダーの単語埋め込み(ベクトル表現)に対してReLUを適用していますが、これって大丈夫なん?

ベクトル表現の負の値を0にしてしまうと別の単語が同じ表現になってしまったり、特に全ての要素が負の値で表現される単語があったら、ゼロベクトル(PADやUNKなどの特別な単語)として扱われたりするんじゃないかと。

まあ内部状態は刻々と変化するのでゼロベクトルが渡されたからといって毎回出力結果が同じになるわけじゃないですし、そうなることを織り込み済みで学習させているので問題ないという理屈なんでしょうか。

誰か詳しい人教えてください。生物学的動機についても。