かなり久しぶりのブログです。
4~5年ほど前から書き捨てのコードや勉強用のコードなどを一つのリポジトリに雑に放り込んでいたのですが、それなりのサイズになってきたので今まで書いてきたコードを振り返ってみることにしてみました。
対象となるコード
対象となるコードは、前述した通りのプライベートリポジトリの中にあるもの全てになります。このリポジトリ自体は(本の写経など権利的に公開してよいか微妙なもの...
gRPC に限らず、一般的に副作用のある API 呼び出しを行う際にはリクエストに一意な ID (いわゆる冪等性キー)を付け、同じ ID のリクエストが複数回飛んできた場合後続のものは無視することによって冪等性を保つ手法が取られることがあります。
このような冪等性キーを用いる方法は gRPC の仕様として標準化されてはいないものの、特定のサービス内や組織内で統一した方法を強制したい場合は多いかと...
はじめに
ISUCON10に「イキリ社会人」というチームで参加しました。
結果は惜しくも予選突破ならずでしたが、今回の大会でやったことを時系列順に書き留めておこうと思います。
メンバー
自分
@soiya1919
@neglect_yp
やったこと
7/16
@soiya1919 がチームの登録をしてくれたものの、自分だけ完全に参加登録を忘れていたことに気づく。
8/1
...
BIT VALLEY 2020 プレイベント#2 20代で圧倒的成長を目指すエンジニア~これが私のグロース戦略~ というイベントで、ガチャのリファクタリングについての話をしました。
スライドはこちらです:
スライドには載せませんでしたが、新ロジックの設計や移行にあたっては以下の書籍の内容も参考にしました:
Clean Architecture 達人に学ぶソフトウェアの構造と設計
...
この記事は、 ミクシィグループ Advent Calendar 2019 の20日目の記事です。
本当は全然別な話を書こうかと思っていたのですが、今朝同期が分報で↓の記事について言及していたのをみて触発され、急遽パフォーマンスに関する話をすることにしました。素敵な記事を書いてくださったリクルートの濱田さん、ありがとうございます!
Railsアプリの処理を100倍以上に高速化して得られた知見 ...
fluent-plugin-query-fingerprint というリアルタイムpt-query-digestをやるためのFluentd Pluginを社内LTで紹介したときの資料を発掘したので、こちらにも公開します。
...
git commit や git commit-tree を使わずにコミットを作ってみます。
完成後のイメージ
こんな感じのコミット履歴になれるようにコミットオブジェクトを手作りしていきます。
$ pwd
/path/to/my-first-repository
$ ls
hello.txt
$ cat hello.txt
HELLO WORLD
$ git log --oneline
XX...
def キーワードを使うとメソッドを定義できますが、実は文脈によって挙動が結構違います。
特異メソッド
誰にメソッドが追加されるかを明示している特異メソッド定義の場合は挙動がわかりやすいです。この場合は、単純に対象のオブジェクトの特異クラスにメソッドが定義されます。
hoge = "hoge"
def hoge.puts_self
puts self
end
hoge.puts_self ...
Rubyの include, prepend, extend のどれがどれだかすぐに忘れるのでまとめました。
include
Module#include は、自身の継承チェーンの「自身より後、自身のスーパークラスより前」に指定したモジュールを挿入するメソッドです。
結果として、 include したモジュールに定義されているメソッドをそのままインスタンスメソッドとして取り込むことができます。...
去年のやつです…(この記事を投稿したのは2020年夏)。
ブログに書こうと思ってたはずが永遠に下書きになってたので、スライドだけ貼っつけておきます。
特に僕が何かした話ではないんですが、実はモンストってTURNめちゃくちゃ使ってるんだよっていう話をしたくなったので話してみた、という感じの経緯だったはずです。
...
2019年度は今まで経験したこと無い数十万行レベルの規模のサービスの開発ができたり、某OSSのバグを血眼になって必死に修正したりといろいろ経験できるものが多い一年でした。
趣味開発ではSlackのbot作ったり(使わなくなって開発停止)、Schemeのインタプリタ作ったり(飽きて開発停止)しました。
来年はもっとコード書きます。
...
この記事は、 ミクシィグループ Advent Calendar 2018 の25日目の記事です。
突然ですが、みなさんは自作Scheme処理系でSICPをやりたくなったことはありますか?
僕はあります。なのでScheme処理系を書きました。以下がその処理系のソースコードになります:
genkami/YAKLD: YAKLD: Yet Another JAKLD
このYAKLDは、京都大学大...
.gitignoreを手動で用意したり、.gitignoreのテンプレート集をコピペする時代は終わりました。
gitignore.io
単純な使い方としては、上のサイトの検索窓に適当なワード(例: Emacsを使ってPythonのコードを書く場合、 「Emacs」「Python」等)を入力し、「Create」ボタンを押すだけで対応する.gitignoreを生成してくれます。
さらに、gi...
jQueryの .html(), .text() はそれぞれ指定した要素の中身をHTML/テキストで取得する関数です。この両者は似たような用途で使われがちですが、取得する内容以外にも微妙な挙動の違いがあるため注意が必要です。
具体的には、 $(...) で指定した対象の要素が複数ある場合が両者で大きく異なります。
.html() については、対象の要素が複数ある場合、その先頭要素の中身のみを返...
Elixirのすべての機能は紹介しきれないけど、とりあえずこれだけわかればfizzbuzzくらいは書けるでしょ程度の言語機能の一覧です。
並行処理関連の話とかは全く書いてないので注意。
リテラル
数値
整数は10進数、16進数、8進数、2進数が扱える
ex(1)> 123
123
iex(2)> 0x123
291
iex(3)> 0o123
83
iex(8)> 0...
throw/catch
throw/catchはKernelのメソッド。
# Kernel のメソッドであることがわかるように、明示的に Kernel.(...) の形で呼んでいる
Kernel.catch :error do
puts "hoge"
Kernel.throw :error
puts "fuga"
end
#=> hoge
throwで投げることができるの...
SlackのAPIの使い方の一例として、「echo hogehoge」と発言したら「hogehoge」と返す簡単なbotを作るまでの流れです。
説明中に出てくるコードは基本的にGAE + Python 2.7 (無料枠で使えるバージョンがこれしかない)を想定しています。
アプリケーションの種類
Slackでアプリケーションを作成する場合、最初にアプリケーションの種類を選ぶ必要がある。
Sl...
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の文法拡張のうち、個人的に使ったことのなかったものをまとめました。
文を式として扱う
複文を括弧で括ることによって、その複文を式として扱うことができます。この際、最後の文の実行結果がそのままその式の値となります。RubyやElixirみたいな感じの挙動。
int main() {
for (int i = 1; i <= 100; i++) {
cha...
PHPもWordPressも全然知らないのにたまに触らないといけない状態が来てしまってつらい。
WordPressの投稿は、「通常の投稿」「固定ページ」などのように複数の種類に分けられています。この投稿の種類のことを、post type(投稿タイプ?)と呼ぶようです。今回はこ
のpost typeを新たに登録する必要に迫られたので、行ったことのメモを残しておきます。
お試し環境構築
vers...
新しいMacBook Airを手に入れたので、最初にインストールしたものとか初期設定とかをまとめておきました。これさえあればそれなりに使えるようになるはず……。
Firefox
Rustを応援したいのでFirefox派です。
公式からダウンロード
Google日本語入力
公式からダウンロード
入力ソース大量にあってもあんまり使わないので、Google日本語入力の英数とひらがなの2種類だけ...
二重数とは
複素数の兄弟のようなものに、二重数というものがあります。二重数は実数の集合 \(\mathbb{R}\) に新しい元 \(\epsilon~(\epsilon^2 = 0)\) を追加したものです。
二重数を用いると、例えば
\[(x + \epsilon) = x + \epsilon\]
\[(x + \epsilon)^2 = x^2 + 2x\epsilon\]
\[(x...
Ectoの使い方がなんとなく分かってきたので、Ectoを使ってデータベースの操作を行っていくための大まかな流れをメモしておきます。それぞれの機能の詳細には触れないので、そのあたりは公式のドキュメントなりを読むといいと思います。
最初の設定
新しいアプリケーションecto_exampleを作ります。
$ mix new ecto_example
生成されたファイルを、以下のように書き換えてい...
Elixirでは普段何気なくalias Hoge.{A, B}みたいに書いていますが、このaliasにしか出てこないHoge.{A, B}という構文は文法的にどういう意味になっているのでしょうか?
quoteして構文木を見てみると、Hoge.{A, B}はHoge.{}/2という関数呼び出しに相当する構文らしいということがわかります。
iex(11)> quote do Mod.func...
これを書いていたらMakefileに関する知識がついてしまったので、ここにまとめておきます。
基本的な構文
makefileの基本的な構文は以下のようなものである:
target1 target2 ... targetN: dep1 dep2 ... depM
cmd1
cmd2
...
cmdK
target1, …, targetNをそれぞれターゲットという。ターゲットとは、...
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モナドを実装する
前回で継続の説明と継続渡しを暗黙的に行うContモナドが作れたので,今回はcall/ccの実装を行います.
call/ccとは
継続の代名詞であるSchemeには,call-with-current-continuation略してcall/ccという関数があります.この関数は「引数として渡された関数に,現在の継続を渡...
あまり知られていないようですが,実はJekyllには下書き管理機能があります.
サイトのルートに_draftsディレクトリを作っておくと,その中に入っている.md等のファイルをJekyllは下書きと認識します.
これらの下書きファイルは,_config.ymlに
show_drafts: true
を設定するか,--draftsオプション付きでJekyllを起動することで通常の記事と同様...
モナドから始めない継続入門
上の記事では,モナドの登場しない継続の説明を書きましたが,今回はこのとき使った継続をContモナドというモナドに変換していきます.
前回定義したaverage3CPSの定義を見直してみましょう.この関数は,3つの引数x, y, zの平均を継続に渡す関数でした.
module Cont where
addCPS :: Num a => a -> a -...
Twitterのどこかで「Contモナドを使わない継続の説明を書いてくれ」みたいな話を目にしたので書きました.
この記事は,以下のような方を対象に書かれています.
Haskellはなんとなく使える.モナドもなんとなくわかる.
息をするように新しいモナドを定義したりはできない.
継続が何かは全く分からない.Schemeとかを使ったこともない.
継続とは
Haskell(に限ら...
『プログラミングElixir』の日本語版はElixir 1.2を想定して書かれていますが,現在の最新版は1.6.0-rc.1となり,そこそこバージョンが上がってしまっています.
そこで,これらのバージョン間での違いを雑にまとめました.
なお,書いている人はElixir初心者なので,説明不足や表記の間違いなどあればコメントなりプルリクなりでご報告ください.
文法の変更
変数名とatomのUn...
@enforce_keysを使うことで,structが特定のフィールドを持つことを強制することができます.
例は先ほどのGame.Userで.
defmodule Game.User do
alias __MODULE__
defstruct [:name, :level]
def new(name, level) do
%User{name: name}
end
...
Elixirではネストされたモジュールとその親の間には何の関係もないので,ネストしたモジュール内でそのモジュール自身を参照するときは,いちいち頭からモジュール名を全部打っていかないといけません.
defmodule Game.User do
defstruct [:name, :level]
def new(name, level) do
# %User{...} ではダメ
...
iexというようりはErlang側の問題らしいです.
Erlang/OTP 20以降
以下のオプションを渡すことで、履歴を保存することができます.
$ iex --erl "-kernel shell_history enabled"
また、環境変数EAL_AFLAGSに同様の値を設定することでも,同様の結果を得ることができます.
export ERL_AFLAGS="-kernel s...
この記事は、 ミクシィ18新卒 Advent Calendar 2017 の22日目の記事になります。(1日遅れましたごめんなさい)
皆さん、インスタ映え、してますか?
Instagramは近年女子大生を中心に大流行している、ユーザーが画像を気軽に投稿できるタイプのSNSです。
近頃は「インスタ映え」というワードも至る所で聞かれるようになり、観光地なども「インスタ映え」を重視したスポットなど...
nadviceとは?
Emacsでアスペクト指向プログラミング的なことをできるようにするためのライブラリです。
アスペクト指向というのは聞き慣れない言葉かもしれませんが、nadviceを使うだけなら難しくはありません。簡単に言うと、任意の関数の実行前後に好きな処理を挟むことができるライブラリです。
(defun hello-world ()
(print "Hello, world!")...
ある日、trampを使ってサーバー上のファイルを書き換えた後にemacsを終了させ、再起動しようとすると、以下のようなエラーが出てしまうようになりました。
Tramp failed to connect. If this happens repeatedly, try
‘M-x tramp-cleanup-this-connection’
Tramp failed to connect...
Mac上でBitVisorをビルドする方法として、考えられるのは以下のような方法があります
Mac上で環境を整えて頑張ってビルド
これはかなり茨の道です。できることはできるようですが、BitVisor自体のソースコードを弄ったりする必要があり、割と面倒です。
Linuxをデュアルブートしてそっちでビルド
Linuxメインで使ってる人なら問題無いでしょうが、Macメインの人はビルドのたび...
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をマシにする
スマホ対応
ちなみにゲーム自体にはこちらからアクセスできます。
ライフゲームって何?って方は以下の説明を読むといいかもしれ...
前提
この記事では以下のものについては成り立つと仮定します。
Lagrange関数を用いて導出した双対問題の解が、元の最適化問題の解に一致すること(強双対性定理)
KKT条件を満たす値が、元の最適化問題の解に一致していること
この2つについてはそのうち勉強していきたいと思います。
SVMとは
SVM(サポートベクターマシン)とは二値分類器の一つで、分離平面と訓練データの間の距離の...
Twitterとかに投稿したときに記事のサムネイル画像を表示できるようにしました。
この記事はテスト用です。
...
Jekyllにjemojiを追加したのはいいですが、
みたいな絵文字の名前を全部覚えているわけではないので、絵文字の入力が面倒です
そんなときは、emoji-cheat-sheet-plusというプラグインが便利です
このプラグインは、絵文字のグラフィカルな一覧を表示して絵文字入力を支援してくれるものです
インストールは...
つい先ほどまで、このサイトのタグ一覧は画面幅が狭い時に悲惨なことになっていました。
この原因は、タグ一覧にfloatされているliタグを使っていることです。
現在のタグ一覧の部分は以下のような構成になっています。
<div.tag-list>
<ul>
<li>タグ名</li>
</ul>
</div>...
前回に引き続き、マルコフ決定問題を解いていきます。
前回は状態遷移確率がわかっているものであるとして計算をしていましたが、現実は必ずしも遷移確率がわかるとは限りません。
そのような場合に、前回の評価関数 \(Q_{t}(i, k)\) の漸化式を少し変え、確率の推定を行わずにその場のノリで \(Q_t\) を更新していく方法が取られることがあります。
このような学習方法を直接法といいます。
...
昨日あたりから突然、Github Pagesが更新されなくなりました。
以下のURLにアクセスしてリポジトリの設定を見てみると…
https://github.com/username/username.github.io/settings
以下のようなシンプルな説明だけが出ていました。
Your site is having problems building: Page bui...
タイトルは釣りです。
FXに関しては全くの初心者ですが、適当に分析してみたらなんとなくそれっぽい結果が出てきたので紹介したいと思います。
機械学習の勉強のついでにFXの価格予測でもやって一儲けできたら一石二鳥だなーと思い、一番簡単な分類方法として、ドル円が値上がりするかどうかが線形分離できないか試してみました。
今回は線形分離用のアルゴリズムの中でも最も簡単な部類に入る、パーセプトロンを使っ...
次のような2つのファイルを用意します。
(* mymodule.ml *)
let hello () = print_endline "hello"
(* hoge.ml *)
let () = MyModule.hello ()
これをビルドしようとすると、以下のようなエラーが出ます。
$ ocamlfind ocamlopt mymodule.ml hoge.ml
File "ho...
GHC.TypeListにはNatというkindが定義されており、自然数のリテラルをkindがNatである型として利用することができます。
また、基本的な計算(+, -, *, ~)や、比較(==, CmpNat)なども用意されているので、型レベルFizz Buzzくらいなら比較的簡単に書けてしまいます。
-- TypeFizzBuzz.hs
{-# LANGUAGE
KindSign...
QEMUにはパケットをキャプチャしてくれる機能があるので、オプションを足すだけで簡単にできます。
$ qemu -net nic,model=e1000 -net dump,file=/path/to/hoge.pcap -net user
あとは吐かれたファイルをWiresharkなりで適当に解析すればok
...
C言語は大学の講義などでも使われることが多く、あまりプログラミングを知らない人でもそれなりに読めてしまうので、面白くありません。
そこで、ここでは一歩差をつけた通っぽいコードを書くために必要なテクニックを3つ紹介したいと思います。
第3位: コンマ演算子を乱用する
,は左と右の式を評価し、右の式の結果を返す演算子です。これを使わなくていいところで使うことによって、意味の分からないコードにするこ...
キャラクターなんとか機 Web版
5年前に作ったっきり全く更新もせずに放置していたので、Python2.5が使えなくなり動かなくなっていたのを直しました。
とはいっても、ほとんど何もせずに使っているPythonのバージョンを上げただけです。
それ以外にもいろいろと古い部分が残っているので、暇な時にでも作り直したいと思ってます(ただし優先度は低い)。
...
Google Cloud SDK ドキュメント | Cloud SDK | Google Cloud Platform
これに従ってインストールを進めていくと…
$ ./install.sh
Welcome to the Google Cloud SDK!
Traceback (most recent call last):
File "/Users/admin/Downloads...
むしろ今までなかったのか
(setq lunch-price-alist
'((hamburger . 500)
(curry . 800)
(sushi . 1200)))
(assq 'curry lunch-price-alist)
;; => (curry . 800)
(alist-get 'sushi lunch-price-al...
Macでのホスト名の設定は2種類あるようです。
1つめが$HOSTNAMEに保存されている値。こちらは、システム設定→共有から変更できます。
もう一つがhostnameコマンドの表示する値。Emacsの(system-name)もこちらを表示します。こちらの方のホスト名は以下のコマンドで変更することができます。
$ sudo scutil --set HostName NEW_HOST_NA...
今までは左側のRecent Postsの部分の記事タイトルを文字数指定で切り落としていたのですが、CSSでも同様のことができるみたいです。しかも文字数じゃなくて幅を超えた分だけ省略できるので、見た目も綺麗
<p id="box">
寿限無寿限無五劫の擦り切れ海砂利水魚の水行末雲来末風来末食う寝る処に住む処藪ら柑子の藪柑子パイポパイポパイポのシューリンガンシューリンガンのグーリンダイグ...
使う人いなさそうだけど無いとなんとなく不安なRSSフィードをこのサイトにも追加しました。
Github Pagesなのでプラグインを使わず、Jekyll管理下のxmlファイルを使ってテンプレートから自動的にフィードの生成をしています。
ちなみに参考にしたのは以下のリポジトリ。
snaptortoise/jekyll-rss-feeds: Templates for rendering RSS...
高速にアクセスができ、かつ理論上最も効率よくデータを圧縮した場合と同程度に小さなデータ構造のことを簡潔データ構造といいます。
今回は簡潔データ構造のうち、最も基本的なものの一つであるBit Vectorについて紹介したいと思います。
Bit Vector
Bit Vectorは文字通り1ビットの値の列で、通常は以下の2種類の操作について考えます。
\( rank(B, x) \) : ...
逆FizzBuzz問題というのがあるらしいです。
逆FizzBuzz問題 (Inverse FizzBuzz) - 猫とC#について書くmatarilloの雑記
簡単に言うとFizzBuzzの逆関数を求める問題ですね。
Haskellで解いてみました。
-- FizzBuzzInv.hs
import Data.Maybe (catMaybes)
import Data.Function ...
HaskellのArrayは要素の更新を行うたびに配列全体のコピーが発生するので、頻繁な書き換えには向いていません。
-- ArrayTest.hs
import Control.Monad
import Data.Array.IArray
import System.IO.Unsafe
import System.Random
randomVals :: Random a => Int...
Jekyllではタグ一覧や記事一覧は取得できてもタグごとの記事一覧を表示する機能がないので、無理やりそれっぽいのを作りました。
<h1>タグ '<span class="tag-name"></span>' の記事一覧</h1>
{% for tag in site.tags %}
<div class="tag tag-{{ tag[0] ...
方法自体はいろいろな所に書かれていますし、特に今更説明する必要もないでしょう。
Disqus
コメント欄があるとたまに間違えたことを書いたときに偉い人が集まってきて指摘してくれるので便利です。
...
タイトルの通りです。
サイトのレイアウトとかは今後少しずつなんとかしていこうかと思います。
ちなみに移行の方法についてですが、はてなブログからエクスポートしたMovable type形式のファイルを、以下のスクリプトにかけて大量のjekyll用htmlファイルに変換しました。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys,...