TOKYO OYASUMI CLUB

記事一覧

gRPC でメソッドが副作用を持つ場合冪等性キーを持つことを保証する

gRPC に限らず、一般的に副作用のある API 呼び出しを行う際にはリクエストに一意な ID (いわゆる冪等性キー)を付け、同じ ID のリクエストが複数回飛んできた場合後続のものは無視することによって冪等性を保つ手法が取られることがあります。 このような冪等性キーを用いる方法は gRPC の仕様として標準化されてはいないものの、特定のサービス内や組織内で統一した方法を強制したい場合は多いかと...

ISUCON10に参加しました!

はじめに ISUCON10に「イキリ社会人」というチームで参加しました。 結果は惜しくも予選突破ならずでしたが、今回の大会でやったことを時系列順に書き留めておこうと思います。 メンバー 自分 @soiya1919 @neglect_yp やったこと 7/16 @soiya1919 がチームの登録をしてくれたものの、自分だけ完全に参加登録を忘れていたことに気づく。 8/1 ...

BIT VALLEY 2020 プレイベントで登壇しました

BIT VALLEY 2020 プレイベント#2 20代で圧倒的成長を目指すエンジニア~これが私のグロース戦略~ というイベントで、ガチャのリファクタリングについての話をしました。 スライドはこちらです: スライドには載せませんでしたが、新ロジックの設計や移行にあたっては以下の書籍の内容も参考にしました: Clean Architecture 達人に学ぶソフトウェアの構造と設計 ...

キャッシュについての雑多な話

この記事は、 ミクシィグループ Advent Calendar 2019 の20日目の記事です。 本当は全然別な話を書こうかと思っていたのですが、今朝同期が分報で↓の記事について言及していたのをみて触発され、急遽パフォーマンスに関する話をすることにしました。素敵な記事を書いてくださったリクルートの濱田さん、ありがとうございます! Railsアプリの処理を100倍以上に高速化して得られた知見 ...

git commitを使わずにコミットを作ってみる

git commit や git commit-tree を使わずにコミットを作ってみます。 完成後のイメージ こんな感じのコミット履歴になれるようにコミットオブジェクトを手作りしていきます。 $ pwd /path/to/my-first-repository $ ls hello.txt $ cat hello.txt HELLO WORLD $ git log --oneline XX...

defでメソッドが定義される対象

def キーワードを使うとメソッドを定義できますが、実は文脈によって挙動が結構違います。 特異メソッド 誰にメソッドが追加されるかを明示している特異メソッド定義の場合は挙動がわかりやすいです。この場合は、単純に対象のオブジェクトの特異クラスにメソッドが定義されます。 hoge = "hoge" def hoge.puts_self puts self end hoge.puts_self ...

よく忘れるinclude, prepend, extend

Rubyの include, prepend, extend のどれがどれだかすぐに忘れるのでまとめました。 include Module#include は、自身の継承チェーンの「自身より後、自身のスーパークラスより前」に指定したモジュールを挿入するメソッドです。 結果として、 include したモジュールに定義されているメソッドをそのままインスタンスメソッドとして取り込むことができます。...

Battle Conference Under30に登壇し(て)ました

去年のやつです…(この記事を投稿したのは2020年夏)。 ブログに書こうと思ってたはずが永遠に下書きになってたので、スライドだけ貼っつけておきます。 特に僕が何かした話ではないんですが、実はモンストってTURNめちゃくちゃ使ってるんだよっていう話をしたくなったので話してみた、という感じの経緯だったはずです。 ...

2019年度の草

2019年度は今まで経験したこと無い数十万行レベルの規模のサービスの開発ができたり、某OSSのバグを血眼になって必死に修正したりといろいろ経験できるものが多い一年でした。 趣味開発ではSlackのbot作ったり(使わなくなって開発停止)、Schemeのインタプリタ作ったり(飽きて開発停止)しました。 来年はもっとコード書きます。 ...

自作SchemeインタプリタでSICPをやるという夢

この記事は、 ミクシィグループ Advent Calendar 2018 の25日目の記事です。 突然ですが、みなさんは自作Scheme処理系でSICPをやりたくなったことはありますか? 僕はあります。なのでScheme処理系を書きました。以下がその処理系のソースコードになります: genkami/YAKLD: YAKLD: Yet Another JAKLD このYAKLDは、京都大学大...

gitignore.ioを使って.gitignoreを自動生成する

.gitignoreを手動で用意したり、.gitignoreのテンプレート集をコピペする時代は終わりました。 gitignore.io 単純な使い方としては、上のサイトの検索窓に適当なワード(例: Emacsを使ってPythonのコードを書く場合、 「Emacs」「Python」等)を入力し、「Create」ボタンを押すだけで対応する.gitignoreを生成してくれます。 さらに、gi...

JQueryのhtml()とtext()の微妙な差にハマった話

jQueryの .html(), .text() はそれぞれ指定した要素の中身をHTML/テキストで取得する関数です。この両者は似たような用途で使われがちですが、取得する内容以外にも微妙な挙動の違いがあるため注意が必要です。 具体的には、 $(...) で指定した対象の要素が複数ある場合が両者で大きく異なります。 .html() については、対象の要素が複数ある場合、その先頭要素の中身のみを返...

Elixir基礎文法最速マスター

Elixirのすべての機能は紹介しきれないけど、とりあえずこれだけわかればfizzbuzzくらいは書けるでしょ程度の言語機能の一覧です。 並行処理関連の話とかは全く書いてないので注意。 リテラル 数値 整数は10進数、16進数、8進数、2進数が扱える ex(1)> 123 123 iex(2)> 0x123 291 iex(3)> 0o123 83 iex(8)> 0...

Rubyのthrow/catchとraise/rescueの違い

throw/catch throw/catchはKernelのメソッド。 # Kernel のメソッドであることがわかるように、明示的に Kernel.(...) の形で呼んでいる Kernel.catch :error do puts "hoge" Kernel.throw :error puts "fuga" end #=> hoge throwで投げることができるの...

Slack APIの基本と、簡単なbotを作るまでの流れ

SlackのAPIの使い方の一例として、「echo hogehoge」と発言したら「hogehoge」と返す簡単なbotを作るまでの流れです。 説明中に出てくるコードは基本的にGAE + Python 2.7 (無料枠で使えるバージョンがこれしかない)を想定しています。 アプリケーションの種類 Slackでアプリケーションを作成する場合、最初にアプリケーションの種類を選ぶ必要がある。 Sl...

iexでモジュールを再読み込み

recompileでプロジェクト全体を、r Module.Nameで指定したモジュールのみを再コンパイルすることができます。 以下実行例: # hoge.ex defmodule Hoge do def hoge, do: IO.puts "hogeeee" end このhoge.exをロードする。 iex(3)> c("hoge.ex") [Hoge] iex(4)> ...

以外と知らないGCCの拡張文法

GCCの文法拡張のうち、個人的に使ったことのなかったものをまとめました。 文を式として扱う 複文を括弧で括ることによって、その複文を式として扱うことができます。この際、最後の文の実行結果がそのままその式の値となります。RubyやElixirみたいな感じの挙動。 int main() { for (int i = 1; i <= 100; i++) { cha...

WordPressで独自のpost typeを定義する

PHPもWordPressも全然知らないのにたまに触らないといけない状態が来てしまってつらい。 WordPressの投稿は、「通常の投稿」「固定ページ」などのように複数の種類に分けられています。この投稿の種類のことを、post type(投稿タイプ?)と呼ぶようです。今回はこ のpost typeを新たに登録する必要に迫られたので、行ったことのメモを残しておきます。 お試し環境構築 vers...

【2018年版】MacBookを買ったら入れるべきアプリと初期設定

新しいMacBook Airを手に入れたので、最初にインストールしたものとか初期設定とかをまとめておきました。これさえあればそれなりに使えるようになるはず……。 Firefox Rustを応援したいのでFirefox派です。 公式からダウンロード Google日本語入力 公式からダウンロード 入力ソース大量にあってもあんまり使わないので、Google日本語入力の英数とひらがなの2種類だけ...

Haskellで二重数を使って自動微分

二重数とは 複素数の兄弟のようなものに、二重数というものがあります。二重数は実数の集合 \(\mathbb{R}\) に新しい元 \(\epsilon~(\epsilon^2 = 0)\) を追加したものです。 二重数を用いると、例えば \[(x + \epsilon) = x + \epsilon\] \[(x + \epsilon)^2 = x^2 + 2x\epsilon\] \[(x...

Ectoを初めて使ってみたので基本的な書き方とかメモ

Ectoの使い方がなんとなく分かってきたので、Ectoを使ってデータベースの操作を行っていくための大まかな流れをメモしておきます。それぞれの機能の詳細には触れないので、そのあたりは公式のドキュメントなりを読むといいと思います。 最初の設定 新しいアプリケーションecto_exampleを作ります。 $ mix new ecto_example 生成されたファイルを、以下のように書き換えてい...

"alias Hoge.{A, B}"の"{A, B}"って何だ?

Elixirでは普段何気なくalias Hoge.{A, B}みたいに書いていますが、このaliasにしか出てこないHoge.{A, B}という構文は文法的にどういう意味になっているのでしょうか? quoteして構文木を見てみると、Hoge.{A, B}はHoge.{}/2という関数呼び出しに相当する構文らしいということがわかります。 iex(11)> quote do Mod.func...

GNU Make 基礎文法最速マスター

これを書いていたらMakefileに関する知識がついてしまったので、ここにまとめておきます。 基本的な構文 makefileの基本的な構文は以下のようなものである: target1 target2 ... targetN: dep1 dep2 ... depM cmd1 cmd2 ... cmdK target1, …, targetNをそれぞれターゲットという。ターゲットとは、...

Makefile"のみ"でFizz Buzz

Fizz Buzzを変態的な環境で書こうという試みは世界中で行われており、MakefileによるFizz Buzzも例外ではありません。適当にググってみたところ、既存のMakefileによるFizz Buzzを謳ったコードは以下の3箇所で見つかりました。 FizzBuzz - Rosetta Code 時代遅れひとりFizzBuzz祭り make編(gmakeでもpmakeでも書いてみ...

コラッツの予想

過去のブログ(現在閉鎖済み)を供養していた所,ちょっとおもしろい問題が出てきたので掲載します. コラッツ列とは,与えられたnから始まり以下のようなルールで定義される数列です. collatz 1 = 1 : [] collatz n | even n = n : collatz (n `div` 2) | otherwise = n : collatz (3 * n + 1) 実際...

Contモナドとcall/cc

前回: モナドから始めない継続入門 Contモナドを実装する 前回で継続の説明と継続渡しを暗黙的に行うContモナドが作れたので,今回はcall/ccの実装を行います. call/ccとは 継続の代名詞であるSchemeには,call-with-current-continuation略してcall/ccという関数があります.この関数は「引数として渡された関数に,現在の継続を渡...

Jekyllで下書き管理

あまり知られていないようですが,実はJekyllには下書き管理機能があります. サイトのルートに_draftsディレクトリを作っておくと,その中に入っている.md等のファイルをJekyllは下書きと認識します. これらの下書きファイルは,_config.ymlに show_drafts: true を設定するか,--draftsオプション付きでJekyllを起動することで通常の記事と同様...

Contモナドを実装する

モナドから始めない継続入門 上の記事では,モナドの登場しない継続の説明を書きましたが,今回はこのとき使った継続をContモナドというモナドに変換していきます. 前回定義したaverage3CPSの定義を見直してみましょう.この関数は,3つの引数x, y, zの平均を継続に渡す関数でした. module Cont where addCPS :: Num a => a -> a -...

モナドから始めない継続入門

Twitterのどこかで「Contモナドを使わない継続の説明を書いてくれ」みたいな話を目にしたので書きました. この記事は,以下のような方を対象に書かれています. Haskellはなんとなく使える.モナドもなんとなくわかる. 息をするように新しいモナドを定義したりはできない. 継続が何かは全く分からない.Schemeとかを使ったこともない. 継続とは Haskell(に限ら...

『プログラミングElixir』日本語版以降のElixirの進化

『プログラミングElixir』の日本語版はElixir 1.2を想定して書かれていますが,現在の最新版は1.6.0-rc.1となり,そこそこバージョンが上がってしまっています. そこで,これらのバージョン間での違いを雑にまとめました. なお,書いている人はElixir初心者なので,説明不足や表記の間違いなどあればコメントなりプルリクなりでご報告ください. 文法の変更 変数名とatomのUn...

魔法のおまじない: alias __MODULE__

Elixirではネストされたモジュールとその親の間には何の関係もないので,ネストしたモジュール内でそのモジュール自身を参照するときは,いちいち頭からモジュール名を全部打っていかないといけません. defmodule Game.User do defstruct [:name, :level] def new(name, level) do # %User{...} ではダメ ...

iexで履歴を表示する

iexというようりはErlang側の問題らしいです. Erlang/OTP 20以降 以下のオプションを渡すことで、履歴を保存することができます. $ iex --erl "-kernel shell_history enabled" また、環境変数EAL_AFLAGSに同様の値を設定することでも,同様の結果を得ることができます. export ERL_AFLAGS="-kernel s...

京都のおいしいコーヒー

この記事は、 ミクシィ18新卒 Advent Calendar 2017 の23日目の記事になります。 あれ、23日目…???今日は一体何日……???? 大遅刻ですね。非常に申し訳ないです :bow: :bow: :bow: :bow: 今回は こんなことを書いてしまったので、プログラミングからは一旦離れ、京都のおいしいコーヒーが飲める店でも紹介したいと思います。 京都に来る機会があ...

人工知能がはじき出した、最高にインスタ映えする画像はこれだ!!

この記事は、 ミクシィ18新卒 Advent Calendar 2017 の22日目の記事になります。(1日遅れましたごめんなさい) 皆さん、インスタ映え、してますか? Instagramは近年女子大生を中心に大流行している、ユーザーが画像を気軽に投稿できるタイプのSNSです。 近頃は「インスタ映え」というワードも至る所で聞かれるようになり、観光地なども「インスタ映え」を重視したスポットなど...

GaucheでEmacsのnadviceみたいなことができるやつを作った

nadviceとは? Emacsでアスペクト指向プログラミング的なことをできるようにするためのライブラリです。 アスペクト指向というのは聞き慣れない言葉かもしれませんが、nadviceを使うだけなら難しくはありません。簡単に言うと、任意の関数の実行前後に好きな処理を挟むことができるライブラリです。 (defun hello-world () (print "Hello, world!")...

Trampが起動時に失敗してコケるのを防ぐ

ある日、trampを使ってサーバー上のファイルを書き換えた後にemacsを終了させ、再起動しようとすると、以下のようなエラーが出てしまうようになりました。 Tramp failed to connect. If this happens repeatedly, try ‘M-x tramp-cleanup-this-connection’ Tramp failed to connect...

MacでBitVisorをビルド(Docker編)

Mac上でBitVisorをビルドする方法として、考えられるのは以下のような方法があります Mac上で環境を整えて頑張ってビルド これはかなり茨の道です。できることはできるようですが、BitVisor自体のソースコードを弄ったりする必要があり、割と面倒です。 Linuxをデュアルブートしてそっちでビルド Linuxメインで使ってる人なら問題無いでしょうが、Macメインの人はビルドのたび...

Haskellで型を明示的に適用する

GHC8からの機能として、多相的な関数fに対してf @Tとすることで明示的に型を指定することができるようになりました。 この機能はTypeApplicationsという名前で提供されています。 Prelude> :set -XTypeApplications Prelude> :t show show :: Show a => a -> String Prelude&g...

テトリスの盤面の評価関数

ふと思い立って、テトリスを自動で解くAIを書いてみました。 最初はαβ法でやってみようと思ったのですが、ブロック1つに対して置き場所の候補が3〜40通りくらいあり、探索空間がアホみたいに広くなってしまったため断念。とりあえず探索の深さを1だけにして、評価関数だけで攻めていく方針でやっています。 テトリスの場合はゲームとしてかなり単純なので、あまり深く先読みをしなくてもうまくやればうまくいきそう...

ライフゲームを改良しました

去年くらいに作ったライフゲームを更新しました。具体的な更新内容は以下の通り Angular1からRiotへの置き換え 大量のDOMを重ねてゲーム画面を描画していたのを、<canvas>にまとめた サンプルの盤面の追加 UIをマシにする スマホ対応 ちなみにゲーム自体にはこちらからアクセスできます。 ライフゲームって何?って方は以下の説明を読むといいかもしれ...

SVMの理論的な話

前提 この記事では以下のものについては成り立つと仮定します。 Lagrange関数を用いて導出した双対問題の解が、元の最適化問題の解に一致すること(強双対性定理) KKT条件を満たす値が、元の最適化問題の解に一致していること この2つについてはそのうち勉強していきたいと思います。 SVMとは SVM(サポートベクターマシン)とは二値分類器の一つで、分離平面と訓練データの間の距離の...

Emacsで楽々絵文字入力 :joy_cat:

Jekyllにjemojiを追加したのはいいですが、:smile:みたいな絵文字の名前を全部覚えているわけではないので、絵文字の入力が面倒です :cry: そんなときは、emoji-cheat-sheet-plusというプラグインが便利です :blush: このプラグインは、絵文字のグラフィカルな一覧を表示して絵文字入力を支援してくれるものです :hatched_chick: インストールは...

親要素の高さを子のfloatしている要素に合わせる

つい先ほどまで、このサイトのタグ一覧は画面幅が狭い時に悲惨なことになっていました。 この原因は、タグ一覧にfloatされているliタグを使っていることです。 現在のタグ一覧の部分は以下のような構成になっています。 <div.tag-list> <ul> <li>タグ名</li> </ul> </div&gt...

Q-learningで効率的に動く車を探す

前回に引き続き、マルコフ決定問題を解いていきます。 前回は状態遷移確率がわかっているものであるとして計算をしていましたが、現実は必ずしも遷移確率がわかるとは限りません。 そのような場合に、前回の評価関数 \(Q_{t}(i, k)\) の漸化式を少し変え、確率の推定を行わずにその場のノリで \(Q_t\) を更新していく方法が取られることがあります。 このような学習方法を直接法といいます。 ...

Github Pagesが更新されなくなった

昨日あたりから突然、Github Pagesが更新されなくなりました。 以下のURLにアクセスしてリポジトリの設定を見てみると… https://github.com/username/username.github.io/settings 以下のようなシンプルな説明だけが出ていました。 Your site is having problems building: Page bui...

88%の適合率でドル円の値上がりを予測するプログラムを書いた

タイトルは釣りです。 FXに関しては全くの初心者ですが、適当に分析してみたらなんとなくそれっぽい結果が出てきたので紹介したいと思います。 機械学習の勉強のついでにFXの価格予測でもやって一儲けできたら一石二鳥だなーと思い、一番簡単な分類方法として、ドル円が値上がりするかどうかが線形分離できないか試してみました。 今回は線形分離用のアルゴリズムの中でも最も簡単な部類に入る、パーセプトロンを使っ...

ocamloptの謎のエラー「wrong file naming」

次のような2つのファイルを用意します。 (* mymodule.ml *) let hello () = print_endline "hello" (* hoge.ml *) let () = MyModule.hello () これをビルドしようとすると、以下のようなエラーが出ます。 $ ocamlfind ocamlopt mymodule.ml hoge.ml File "ho...

型レベルでFizz Buzz

GHC.TypeListにはNatというkindが定義されており、自然数のリテラルをkindがNatである型として利用することができます。 また、基本的な計算(+, -, *, ~)や、比較(==, CmpNat)なども用意されているので、型レベルFizz Buzzくらいなら比較的簡単に書けてしまいます。 -- TypeFizzBuzz.hs {-# LANGUAGE KindSign...

QEMUのuser mode network内のパケットをキャプチャする

QEMUにはパケットをキャプチャしてくれる機能があるので、オプションを足すだけで簡単にできます。 $ qemu -net nic,model=e1000 -net dump,file=/path/to/hoge.pcap -net user あとは吐かれたファイルをWiresharkなりで適当に解析すればok ...

人と違うC言語のコードを書く方法ベスト3

C言語は大学の講義などでも使われることが多く、あまりプログラミングを知らない人でもそれなりに読めてしまうので、面白くありません。 そこで、ここでは一歩差をつけた通っぽいコードを書くために必要なテクニックを3つ紹介したいと思います。 第3位: コンマ演算子を乱用する ,は左と右の式を評価し、右の式の結果を返す演算子です。これを使わなくていいところで使うことによって、意味の分からないコードにするこ...

キャラクターなんとか機 Web版を更新しました

キャラクターなんとか機 Web版 5年前に作ったっきり全く更新もせずに放置していたので、Python2.5が使えなくなり動かなくなっていたのを直しました。 とはいっても、ほとんど何もせずに使っているPythonのバージョンを上げただけです。 それ以外にもいろいろと古い部分が残っているので、暇な時にでも作り直したいと思ってます(ただし優先度は低い)。 ...

Emacs25から追加されたalist-get

むしろ今までなかったのか (setq lunch-price-alist '((hamburger . 500) (curry . 800) (sushi . 1200))) (assq 'curry lunch-price-alist) ;; => (curry . 800) (alist-get 'sushi lunch-price-al...

Macで$HOSTNAMEとhostnameを一致させる

Macでのホスト名の設定は2種類あるようです。 1つめが$HOSTNAMEに保存されている値。こちらは、システム設定→共有から変更できます。 もう一つがhostnameコマンドの表示する値。Emacsの(system-name)もこちらを表示します。こちらの方のホスト名は以下のコマンドで変更することができます。 $ sudo scutil --set HostName NEW_HOST_NA...

CSSで文字のはみ出した部分を「…」で省略する

今までは左側のRecent Postsの部分の記事タイトルを文字数指定で切り落としていたのですが、CSSでも同様のことができるみたいです。しかも文字数じゃなくて幅を超えた分だけ省略できるので、見た目も綺麗 <p id="box"> 寿限無寿限無五劫の擦り切れ海砂利水魚の水行末雲来末風来末食う寝る処に住む処藪ら柑子の藪柑子パイポパイポパイポのシューリンガンシューリンガンのグーリンダイグ...

Github Pages + Jekyllな環境でRSS

使う人いなさそうだけど無いとなんとなく不安なRSSフィードをこのサイトにも追加しました。 Github Pagesなのでプラグインを使わず、Jekyll管理下のxmlファイルを使ってテンプレートから自動的にフィードの生成をしています。 ちなみに参考にしたのは以下のリポジトリ。 snaptortoise/jekyll-rss-feeds: Templates for rendering RSS...

簡潔データ構造: Bit Vector (たぶんその1)

高速にアクセスができ、かつ理論上最も効率よくデータを圧縮した場合と同程度に小さなデータ構造のことを簡潔データ構造といいます。 今回は簡潔データ構造のうち、最も基本的なものの一つであるBit Vectorについて紹介したいと思います。 Bit Vector Bit Vectorは文字通り1ビットの値の列で、通常は以下の2種類の操作について考えます。 \( rank(B, x) \) : ...

Twitterのアイコンを寿司にする

Twitterのアイコンが丸くなってしまったので、昔ながらの寿司に戻す方法を紹介します。 Firefoxの場合 1. Greasemonkeyをインストールする まずはGreasemonkeyをインストールします。 インストールボタンを押して再起動すれば準備完了です。 2. スクリプトを追加する 再起動が終わればFirefoxの右上にキモい猿みたいなアイコンが出てくると思うので、そ...

逆FizzBuzzをHaskellで解いてみた

逆FizzBuzz問題というのがあるらしいです。 逆FizzBuzz問題 (Inverse FizzBuzz) - 猫とC#について書くmatarilloの雑記 簡単に言うとFizzBuzzの逆関数を求める問題ですね。 Haskellで解いてみました。 -- FizzBuzzInv.hs import Data.Maybe (catMaybes) import Data.Function ...

破壊的変更を隠蔽するDiffArray

HaskellのArrayは要素の更新を行うたびに配列全体のコピーが発生するので、頻繁な書き換えには向いていません。 -- ArrayTest.hs import Control.Monad import Data.Array.IArray import System.IO.Unsafe import System.Random randomVals :: Random a => Int...

ブログにDisqusのコメント欄を設置した

方法自体はいろいろな所に書かれていますし、特に今更説明する必要もないでしょう。 Disqus コメント欄があるとたまに間違えたことを書いたときに偉い人が集まってきて指摘してくれるので便利です。 ...

はてなブログからGithub Pagesに移行しました

タイトルの通りです。 サイトのレイアウトとかは今後少しずつなんとかしていこうかと思います。 ちなみに移行の方法についてですが、はてなブログからエクスポートしたMovable type形式のファイルを、以下のスクリプトにかけて大量のjekyll用htmlファイルに変換しました。 #!/usr/bin/env python # -*- coding: utf-8 -*- import sys,...
にマッチする記事はありません。