タグ

ブックマーク / blog.utgw.net (26)

  • linterを導入していなかったプロジェクトにlinterを導入しようとするときにまずやること - 私が歌川です

    今どきlinterを使っていないプロジェクトなんて、と思われるあるかもしれませんが、歴史の長いプロジェクトだとそういうこともあるでしょうし、あるいは一部のDSLやスキーマ*1に対してのみlinterを走らせたいということもあるでしょう。 そういったプロジェクトに対してlinterを導入する前に、デフォルト設定でlinterを走らせたときにどういう出力になるのかを一通り眺める、というのをやっています。 どういうエラーがどこで何件出ているのか、warningなのかerrorなのか、linterのルールがプロジェクトにとって妥当なのか、一通り吟味した上で設定を調整してからlinterを導入するようにしています。なぜなら、linterのノイズが多いとlinterの言うことに従うモチベーションが下がる (と自分では思っている) からです。 最初からlinterが入っているなら、とりあえずlinter

    linterを導入していなかったプロジェクトにlinterを導入しようとするときにまずやること - 私が歌川です
  • URLにデータを載せつつ、できるだけ短いURLにしたい - 私が歌川です

    sugarheart.utgw.net イベント支出記録君は、同人誌即売会などでの支出をすぐに記録するためのツール。プリセットに金額を登録しておけば、ワンボタンで支出を記録することができる。CSVダウンロード、TSV形式でのコピー、URLシェアなど、いろいろな方法でデータをエクスポートできる。 下にあるのは、先日のイベントでの自分の支出記録が確認できるURL。 https://sugarheart.utgw.net/event-expenses-tracker/#3AAtzwAAAYeIkjSMzQH0oM8AAAGHiIwcRM0B9KDPAAABh4iIiQ3NAligzwAAAYeIhB9GzQH0oM8AAAGHiEjof80B9KDPAAABh4hGZ8LNA+igzwAAAYeIRHAXzQH0oM8AAAGHiELJ080B9KDPAAABh4hAf3jNASygzwAAAY

    URLにデータを載せつつ、できるだけ短いURLにしたい - 私が歌川です
  • YAPC::Kyoto 2023に参加した #yapcjapan - 私が歌川です

    久しぶりのオフライン開催であるYAPC::Kyoto 2023に参加しました。 前日祭見た 前日祭にも参加して、RejectConと東西対抗LTバトルを見ました。みんないい話をしていて、かつ、なんだかついにYAPCが始まったのだな、という感慨がありました。 その後のHelpfeelさん主催の飲み会では、席を詰めまくった結果dankogaiさんの隣に座っていろいろ話していておもしろい感じでした。 トークした 「prototype大全」というタイトルで発表しました。発表スライドはSpeakerDeckで公開しています。 speakerdeck.com 誰もPerlのprototypeに特化した話をしていないのでは? というのが発表のモチベーションでした。もはや業務ではPerlを書いていないのですが、Perlのこういう言語機能によって表現力が広まっている、というのを伝えたかったです。 一方で最近

    YAPC::Kyoto 2023に参加した #yapcjapan - 私が歌川です
  • GitHub Actionsで「matrixの全テストが通らないとマージできないようにする」設定を簡単に行う方法 - 私が歌川です

    GitHub Actionsで、複数環境でテストしたいのでmatrixに分けて、branch protectionの設定で全環境のテストが通ったらmasterにマージ可能にしましょう、というのをやろうとするとちょっと面倒です。 matrixの数だけ必要なstatus checkに含めないといけない jobの名前を変えたときにrequired status checkの設定も追従させないといけない? (未確認) 「なんか一生CI greenになりませんね」的なことになりそう jobの名前を途中で変えたら選択肢がめちゃくちゃ出てくる gyazo.com 全部のテストに通った、というのを1つのstatus checkで表現したいので、以下のようなjobを追加しました。 needs: test にして、 test jobが全てpassしないと作動しないようにする 1つでもテストが落ちたらcance

    GitHub Actionsで「matrixの全テストが通らないとマージできないようにする」設定を簡単に行う方法 - 私が歌川です
  • Recoilとwebpack.DefinePluginと環境変数の名前 - 私が歌川です

    これは React Advent Calendar 2022 7日目の記事です。 Recoilを使っているアプリケーションでWebpackのDefinePluginを使って環境変数の値をビルド時に埋め込むとき、Webpackの設定によっては環境変数の名前がビルドしたコードに含まれてしまう場合があります。 具体的には、以下のようにDefinePluginの process.env キーに対してobjectを渡す場合に発生しえます。 new webpack.DefinePlugin({ 'process.env': { FOO: JSON.stringify(process.env.FOO), }, }); ここでRecoilのコードを見てみましょう。ランタイムに process.env の値を参照するコードがあるのに気づくと思います。 github.com optional chaining

    Recoilとwebpack.DefinePluginと環境変数の名前 - 私が歌川です
  • ISUCON12 チーム :old_noto_innocent: で予選突破した #isucon - 私が歌川です

    今年も id:nonylene id:wass80 と出場しました。最終スコアは50,696点で予選突破できました。分析基盤 (Kibanaやプロファイラ) に流れてきたデータを見つつ作戦を立てて実装する、という流れがうまくはまって順調にチューニングを進められたのがよかったと思います。 最終的なサーバー構成 isuports-1 App (Go) nginx isuports-2 DB (MySQL, player_scoreのみ) isuports-3 DB (MySQL) やったこと リポジトリはこちらです。 github.com 分析基盤まわりの話を id:nonylene が書いてくれたので、こちらもあわせてどうぞ。 nonylene.hatenablog.jp id:wass80 視点の記事もあるので、こちらもあわせてどうぞ。 memo.wass80.xyz テナントごとのDB

    ISUCON12 チーム :old_noto_innocent: で予選突破した #isucon - 私が歌川です
  • 味玉のレシピをMakefileで記述する - 私が歌川です

    最近よく味玉を作っているのだけど、ジップロックに日付を記入し忘れたり、ボウルに水を入れてから氷を入れようとしたりしていて、手順の依存関係を意識しないとめちゃくちゃになる。 Makefileは依存関係と成果物を記述できるので、レシピをMakefileの形で書いたらおもしろいのでは、と思ったけど記述量が多い気がする。 .PHONY: お湯を湧かす 卵を茹でる 8分待つ ボウルに氷を入れる ボウルに水を入れる ボウルに卵を入れる 卵の殻を剥く ジップロックに日付を書く ジップロックにめんつゆを入れる ジップロックに卵を入れる 一晩寝かせる 味玉 お湯を湧かす: @echo お湯を湧かします 卵を茹でる: お湯を湧かす @echo 卵を茹でます 8分待つ: 卵を茹でる @echo 8分待ちます ボウルに氷を入れる: 8分待つ @echo ボウルに氷を入れます ボウルに水を入れる: ボウルに氷を入れ

    味玉のレシピをMakefileで記述する - 私が歌川です
  • Webフォントを分割して読み込む際にunicode-rangeを指定しなかったらどうなるのか - 私が歌川です

    表題のことについて検証してみましょう。 目次 目次 前提 Webページ上で独自のフォントを読み込むには フォントファイルのサイズ フォントファイルのサイズを抑える工夫 フォントファイルを分割し、必要に応じて読み込む フォントファイルを圧縮する 前提おわり 題 規格によると 4.5. Character range: the unicode-range descriptor 4.5.1. Using character ranges to define composite fonts 実験する 準備 実験方法 実験結果 まとめ 前提 題に入る前に、Webフォントを配信する際の前提について説明します。分かっている方は読み飛ばしてもらって大丈夫です。 Webページ上で独自のフォントを読み込むには CSSの font-family 属性に使いたいフォント名を書くことで、Webページ上のコンテン

    Webフォントを分割して読み込む際にunicode-rangeを指定しなかったらどうなるのか - 私が歌川です
  • create-react-app --template typesctiptの直後に初手で入れる設定 - 私が歌川です

    はじめに Reactでアプリケーションを作るときは、だいたい create-react-app --template typesctipt してから開発を始める。ゼロコンフィグでReactアプリケーションを書けて便利だけど、もうちょっと手を入れておくと快適に開発できるようになる。 趣味個人開発create-react-app --template typescript した直後にやっている設定を紹介する。集団開発だとまた変わってくる項目もありそう。 バージョン情報 create-react-app 4.0.3 設定していること ESLint package.jsonの eslintConfig を以下のように書き換える*1。 @typescript-eslint/explicit-module-boundary-types は、exportする関数の型を明示すべきというルール。型推論

    create-react-app --template typesctiptの直後に初手で入れる設定 - 私が歌川です
  • ペアプロ活動パターン - 私が歌川です

    仕事でよくペアプロでコードを書くのですが、気をつけていることがいくつかあるので共有します。みなさまは何に気をつけていますか? 考えていることを声に出す やりたいことが実現できずに詰まっていると黙りがち どうやったらいいか分からず困っている・違う結果になる、みたいなのを口に出す ペアの人が解決方法を知っているかもしれない クマさんデバッグみたいな効果もありそう ところで「クマさんデバッグ」って一般に通じる言葉なんですか? 書いているコードの自己評価を行う 最高のアルゴリズムになった、とか、これは一時しのぎです、みたいな 認識がずれていないかの確認をする 「こう思っているけどそれで合ってますか?」 こまめにcommitする こまめにセーブするイメージ git diffを確認したら、どこまでできているのかを見れる いざとなったらgit resetで戻れる ひと通りできあがってからちょっとずつco

    ペアプロ活動パターン - 私が歌川です
  • GitHub Actionsを使ったDDoSに巻き込まれた - 私が歌川です

    事例集です。 きのう、GitHubの通知を見たら、個人のリポジトリに My First PR というタイトルのPRが来ているのに気づいた。PR出すところを間違えたのかな、と思って見てみたがどうも様子がおかしい。 prog という名前のバイナリファイルを置いている .github/workflows/ci.yml*1の中身をガッと書き換えている on: [pull_request] でworkflowを起動している 20並列でjobが走るようにmatrixを設定している fail-fast: false なので、どれか1つのmatrixが失敗しても他のジョブは続行される base64 encodeした文字列をdecodeしてevalしている ドメインの名前解決を行ったあと ./prog を実行するコマンドにdecodeされた PRをめちゃくちゃな回数closeしてreopenしている PRを

    GitHub Actionsを使ったDDoSに巻き込まれた - 私が歌川です
  • #プログラミング原体験 - 私が歌川です

    「プログラミング原体験について記事を書く」というメモがずっとGoogle Keepに残っていたので書いた。書いたら思ったより分量があった。 プログラミングを始めたきっかけは、CGIのを買ったから、ということになる(!)。パソコンでできる暇つぶしを通過した中にプログラミングがあった、みたいな感じ? プログラミングを始める前は、RPGツクール2000でゲームを作って公開するためのホームページを作ったり*1、しょぼいFlashアニメを作ったりしていた。ジオシティーズとかinfoseekとか、無料レンタルサーバを転々としていった。今はどのサービスも終了していそう。 Perlに入門して掲示板CGIを書きましょう、というを読んだのがプログラミングを始めたきっかけだったと思う。これが小学生のときの出来事? Perlを書くときは use strict; use warnings; を書きましょうとか、

    #プログラミング原体験 - 私が歌川です
  • twitter-textのPerl実装 Twitter::Text を公開した - 私が歌川です

    Twitter::Text - Perl implementation of the twitter-text parsing library - metacpan.org Perlでツイートをバリデーションしたいときに使うことができます。どうぞご利用ください。 いろいろ学びがあったので、実装方針などについて書いていきます。 動機 そもそも既存ライブラリはなかったのか、と思うのですが、どうやら9年前から存在しなかったようです。 ツイートを読んでPerlのデータ構造にするText::Twitterってモジュールを見た記憶があるんだけど、そんなものはCPANになかった。なにを見たんだろう……。— 栗林健太郎 (@kentaro) 2011年1月24日 GitHubtwitter text perl で検索すると、以下のリポジトリがヒットしますが、どれも要件を満たさなかったです。 GitHu

    twitter-textのPerl実装 Twitter::Text を公開した - 私が歌川です
  • MySQLのEXPLAIN結果がどんどん変わっていく例 - 私が歌川です

    MySQLのEXPLAINが直感とは異なっていた事例 の続き。ふと実験中にEXPLAINを打っていたら、 rows が減っていることに気づいたのでさらに追試をした。 実験 MySQLのEXPLAINが直感とは異なっていた事例 の実験で、SELECT文にかかった秒数に加えて、EXPLAINの rows の値も測定する。MySQL 8.0で実験した。 結果 *1 mysql explain test rows - Google スプレッドシート 考察 インデックスなしの場合、常に rows は50 インデックスありの場合 done = TRUE な行数が14万を超えるまでは、 rows は一定 14万を超えたあたりから、振動しつつも減少傾向になる 全ての行が done = TRUE になったら rows は1になる (Cardinality低, Cardinality高) というインデックスを

    MySQLのEXPLAIN結果がどんどん変わっていく例 - 私が歌川です
  • MySQLのEXPLAINが直感とは異なっていた事例 - 私が歌川です

    おもしろかったのでメモ。 CREATE TABLE `tbl` ( `id` BIGINT UNSIGNED NOT NULL, `done` BOOLEAN NOT NULL DEFAULT FALSE, PRIMARY KEY (`id`), KEY `done_and_id` (`done`, `id`) ); tbl テーブルに done = FALSE で100万行INSERTしておく SELECT id FROM tbl WHERE done = FALSE ORDER BY id ASC LIMIT 50 でidを順に集める 処理する UPDATE tbl SET done = TRUE WHERE id IN (...) で処理済にする これを done = FALSE な行がなくなるまで繰り返す KEY `done_and_id (`done`, `id`) ありでEXP

    MySQLのEXPLAINが直感とは異なっていた事例 - 私が歌川です
  • ふだんの開発でPRを出すときに考えていること - 私が歌川です

    業務の話です。OSSとかだとまた変わってくるのかもしれないし、共通することもあるかもしれません。 先に作戦を練る 実装する前に、方針段階でレビューしてもらえるとよい 自分だけでは気づけない考慮漏れとか、こういう方針もあるよっていう提案とか、いろいろ得られるものがある 先に実装完成させてから、これでは要件を満たせない・うまくいかないねってなるともったいない 巨大なPRにしない diffの大きさについては、プログラミング言語とか、利用するフレームワークによっても変わってくるので、一概には言えなさそう +1500, -1500 だけどスナップショットの更新があったとか インデント1つ下げることになったとか たとえば、あらゆる機能を1つのPRで実装してたら巨大なPRになると思う 1つのPRであらゆるものを実装しない、1機能ずつ実装するとか、1つの層だけ実装する、とか PRが巨大だと、コミュニケーシ

    ふだんの開発でPRを出すときに考えていること - 私が歌川です
  • ふだんの開発で小さなPRに分けるために考えていること - 私が歌川です

    ふだんの開発でPRを出すときに考えていること - 私が歌川です の続編です。小さなPRを出す、という話がありましたが、どうやって小さくしているのか、というのを書きます。 どういうメソッドが欲しいか考える Aという情報をBという画面に出したい Aを取得するメソッドがないので、それを作る必要がある (メソッドCとする) というときに、メソッドCを作るPRをまず先に出して、マージされたら続いてCを使って得られる情報Aを画面Bに出すPRを出す、というのをやります。 実装方針を考えて既存実装を眺めてからそういう作戦を立てることもあれば、実装しているうちにメソッドCが足りないな、と気づいて別ブランチでPRを作ってそちらを先に出す、ということもあります。 このとき、1つのPRで両方やろうとすると、メソッドCの実装のレビューと、情報Aを画面Bに出す実装のレビューが同じPRで行われることになります。メソッド

    ふだんの開発で小さなPRに分けるために考えていること - 私が歌川です
  • MySQLやPostgreSQLのWHERE INに空のリストを渡そうとすると文法エラーになる、SQLiteはエラーにならない - 私が歌川です

    小ネタかつ備忘録です。 MySQL この記事ではMySQL 8での実行結果を書いてるけど、5.6でも同様に文法エラーでした。 Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 13615 Server version: 8.0.21-0ubuntu0.20.04.4 (Ubuntu) Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their res

    MySQLやPostgreSQLのWHERE INに空のリストを渡そうとすると文法エラーになる、SQLiteはエラーにならない - 私が歌川です
  • VSCodeでPerlのpackage宣言を挿入してくれるperl-insert-packageっていう拡張機能を出した - 私が歌川です

    Perlでモジュールを書くとたいてい先頭に package Hoge::Fuga::Piyo::Payo; のような宣言を書くことになると思います*1。 最初のうちはいいけど、名前空間がだんだん複雑になっていくと、これは単に写してるだけでは?? となってきます。 ところで、ファイルパスからパッケージ名への変換は、たいていの場合すごく素朴に行えるのではないでしょうか。 先頭の lib/ を消す 拡張子の .pm を消す / を :: に変換する ということでそれをコマンド1つで実行してカーソルの位置に挿入してくれる拡張機能を作って出しました。ご活用お待ちしております。 marketplace.visualstudio.com 利用方法は以下の動画が全てを物語っています。 2019/10/29追記: このたび、コマンドだけでなく補完にも対応しました。よりストレスフリーにパッケージ宣言ができるよ

    VSCodeでPerlのpackage宣言を挿入してくれるperl-insert-packageっていう拡張機能を出した - 私が歌川です
  • 新しい仕事を探しています - 私が歌川です

    私事ですが2/9付で今の会社のアルバイトを辞めるので新しい仕事を探しています。出社が苦手なのでリモートで働けるところがいいです。スキルセットをざっくりまとめてmdにしました https://t.co/vsfYPvkBTQ— うたがわきき🔰💊 (@utgwkk) 2018年1月9日 連絡先 Twitter: @utgwkk E-mail: utagawa.kiki(at)gmail.com ((at) -> @) github.com 以下はmarkdownの内容です. スキルセット プログラミング言語 上にあるものから順によく書くことができます Python Ruby Golang 作ったもの 大学の実験で作ったWebアプリケーション (Python, PostgreSQL) https://github.com/utgwkk/le4-database Twitterで流れてきた画像付

    新しい仕事を探しています - 私が歌川です