サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
会話術
south37.hatenablog.com
2021年4月末最終出社で Wantedly を退職して、5月からは Niantic でソフトウェアエンジニアとして働き始めることになりました。 Wantedly へ 2015 年4月に入社してから、ちょうど6年間働いたことになります。良い機会なので、Wantedly に関する思い出を振り返ってみたいと思います。 また、Niantic で働くことに対しての抱負なども書き残しておこうと思います。全体として長くなってしまったのはご容赦ください。 なお、タイトルは少しキャッチーにしてしまいましたが、実際に働くのは Niantic: Tokyo Studio という東京にある開発拠点です。 Wantedly との出会い 自分が Wantedly という会社を最初に認識したのは 2014 年 2 月初頭でした。まだ、大学院修士1年の学生だった頃です。当時は Wantedly の「会社に話を聞きにいく
はじめに 現在、広く使われているリンカの中でもっとも高速なものとして有名なのは LLVM project の LLD でしょう。LLD のパフォーマンスについては、公式 document に以下のような benchmark が掲載されていて、GNU ld, GNU gold などと比較して圧倒的に早いという結果が示されています。 Program Output size GNU ld GNU gold w/o threads GNU gold w/threads lld w/o threads lld w/threads ffmpeg dbg 92 MiB 1.72s 1.16s 1.01s 0.60s 0.35s mysqld dbg 154 MiB 8.50s 2.96s 2.68s 1.06s 0.68s clang dbg 1.67 GiB 104.03s 34.18s 23.49s
Chromium をゼロから Build して動かしてみる という前回のブログでは、Chromium を Build して動かすという一連のフローを試してみました。 この時は、Checking out and building Chromium on Linux の手順に従って作業をしました。これは、「最新の Chromium」を Linux 上で Build する事が出来るしっかりした公式手順です。しかしながら、8core, 32GiB memory の GCP VM instance でも Build に 6-7 時間程度かかってしまうのがネックでした。 そこで今日は、Chromium を Build して動かすまでのサイクルを 30 分で試せるようにすること を目指します。7時間と比較すると約15倍の高速化です! なお、具体的には 事前に Build 済みの Object File
以前、同僚と話していた際に「同じ URL で Accept request header に応じて response の Content-Type を変えていると、Chrome で Back button を押した際の結果が意図しないものになる」ということが話題になりました。 これは、自分も過去に経験した事があり、不思議に思っていた部分です。Safari や Firefox では発生せず、Chrome だけで発生するというのもポイントです。この挙動について、今回は調査してみました。 TL; DR 今回の調査内容を簡潔にまとめると、以下のようになります。 同じ URL で Accept request header に応じて response の Content-Type を変えると、Chrome では Back button を押した際に意図しないコンテンツが表示される事がある。Safar
kuKubernetes の Install Tools というページでは、kubernetes を local で動かすための tool として kind が紹介されています。今日はこの kind について内部構造及び使い方を見てみます。 kind とは kind は「Docker container の中で Kubernetes を動かすことが出来るツール」です。kind という命名は「Kubernetes in Docker」から来ていて、K-in-D という頭文字をとったものになっています。 kind については KubeCon + CloudNativeCon で何度か紹介されているようです。例えば KubeCon + CloudNativeCon North America 2019 における以下の "Deep Dive: Kind" というトーク では、「kind とは何か?
コンテナ標準化の現状と Kubernetes の立ち位置について というブログではコンテナ標準の現状についてまとめてみました。 また、手を動かして学ぶコンテナ標準 - Container Image と Container Registry 編 というブログでは Container Image と Container Registry について手を動かして学んでみました。 このブログでは、runc, containerd などの Container Runtime について、実際に手を動かして学んでみたいと思います。 なお、前回のブログ 同様、基本的にこのブログ内のコマンドは Linux で実行するものとします(自分は MacOS で Vagrant で Ubuntu VM を立てて実験してます)。 runc を動かしてみる runc は Low-Level Container Runti
先日は、コンテナ標準化の現状と Kubernetes の立ち位置について において、各種ドキュメントをベースにコンテナ標準についてまとめてみました。 このブログでは、実際に tool などに触れて手を動かすことで、コンテナ標準についてさらに理解を深めてみたいと思います。 なお、基本的にこのブログ内のコマンドは、Linux で実行するものとします(自分は MacOS で Vagrant で Ubuntu VM を立てて実験してます)。 OCI Image の中身を見てみる skopeo と呼ばれる「container image に対して様々な操作を行えるツール」があります。このツールを利用することで、「docker image から OCI Image への変換」を行うことができます。このツールを利用して、実際に OCI Image の中身を見てみましょう。 まず、以下のコマンドを実行して
コンテナ標準化が進んでいる事は知りつつも、標準化された仕様の具体的な内容についてはあまり知らない事に気づいたので、この機会に調べてみました。個人向けメモとして残しておきます。 余力があれば、後でもう少し詳細をまとめる予定です(docker image を OCI Image Format に変換して眺めてみたり、runc や containerd などを実際に動かしてみたり、containerd や CRI-O などの Container Runtime の実装に目を通してみたりしたので、その辺りについてもいつかまとめたいと思ってます)。 追記: 手を動かして調べた内容は以下の2つのブログにまとめました。 手を動かして学ぶコンテナ標準 - Container Image と Container Registry 編 手を動かして学ぶコンテナ標準 - Container Runtime 編
こんばんは、south37です。前回のブログではユーザー同士の類似度を見積もる方法について考えました。距離空間を使う方法、相関関数を使う方法等が存在し、はてなブックマークを利用するユーザ同士の比較ではjaccard相関関数が悪く無い値を与える事が分かりました。 今回は、類似度を「アイテムの推薦」に活かす方法について考えてみたいと思います。 協調フィルタリング 自分と他のユーザとの類似度を見積もる事が出来れば、アイテムの推薦を行う事が出来ます。具体的には、それぞれのユーザがアイテムに割り振ったスコアに自分とユーザとの類似度をかけ合わせ(類似度で重み付けし)、それを足し合わせる事で類似度を反映したアイテムのスコアを算出します。 類似度をかけ合わせる事で、自分と似たユーザが良いと判断したものが高評価を受ける事になります。実際、自分と似たユーザが良いと思うなら自分も良いと思う可能性は高そうです。そ
こんばんは、south37です。 前回は「圏論」におけるモナドについて触れた訳ですが、今回はいよいよモナドがどういう風にHaskell上で表現されているかに迫ってみたいと思います。 Haskell における Monad 自己関手であるモナド 前回、「モナド」は「自己関手」であると述べました。ここで、そもそも「関手」がHaskellにおいてどのように表現されていたかを思い出してみましょう。 まず、Haskellにおいては、「型」を「対象」として「関数」を「射」とするような「圏」を考えます。Haskellにおける「全ての型」が「対象」であるような「圏」はHaskと呼ばれ、その部分圏としてリスト型のみを「対象」とするLstなどが存在します。 関手は「圏」から「圏」への対応付けを行う訳ですが、それは「対象」を写す「対象関数」と、「射」を写す「射関数」の組み合わせと考える事が出来ます。Haskell
前回に引き続き、Mozillaイチオシの言語であるRustを触ってみる。今日はメモリ管理の仕組みとしての「Ownership」に着目する。 ちなみに、今日書く内容はRust Guideの17章、OwnershipのGuide、PointerのGuideをつまみ食いしながら適当にまとめたものなので、原文読んでもらっても良い。 メモリ管理について まずは背景として、メモリ管理の必要性について考えてみる。 一般に、計算機上で動くソフトウェアというのはデータをメモリ上に次々に確保して様々な計算等を行っていく訳だけど、メモリというのは有限の大きさしか持たない為にデータの追加ばかりしていく訳にも行かなくて、使わなくなった領域を次々に解放して再利用しなければならなくなる。 こういった事を考えると、メモリ解放の機構を言語に組み込む必要性があると分かる。 メモリに確保されるデータの種類 メモリに確保されるデ
コード書いてると、複数ファイルを一気にgrepしたり、特定の単語を一気に置換したりしたい事がある。例えば、リファクタリングの際にクラス名とかメソッド名がそもそも良く無いなーと思って一気にrenameしたくなるとか。そんな時、方法としてはunixのコマンドを使う方法とeditor(例えばvimとか)の機能を使う方法の大きく分けて2つが存在する。 1. unixコマンドを使ってgrep & 置換 まず、1つのファイルに対しての操作を考える。grepなら文字通りgrepコマンドが存在するし、特定の文字列を置換したい場合にはsedコマンドが使える。sedコマンドはファイル名を渡すとその中身を条件に合わせて置換して、結果を標準出力に出力する。 sed s/(元の文字列)/(新しい文字列)/g (入力ファイル名) $ echo 'my name is panda.' > test.txt $ cat
実はけっこう前からWebSocketの詳しい仕組みについて気になってて、遂に一念発起して調べてみた。何かとても良さげっぽい。 そもそもWebSocketとは Webにおいて双方向通信を低コストで行う為の仕組み。インタラクティブなWebアプリケーションではサーバから任意のタイミングでクライアントに情報の送信とかしたい事があって、例えばFacebookのチャットアプリみたいに多数のクライアントが一つのページにアクセスしてて誰かがメッセージを投稿するとそれをその他のユーザーに通知したい場合があって、そういった時に双方向通信の必要性が出てくる。 元々はWebにおいてはHTTPしか通信の選択肢が無くてHTTPのロングポーリング使って無理矢理双方向通信実現したりしてたんだけど、流石に無駄が多すぎるし辛いよねって事でWebSocketというプロトコルが作られた。 WebSocketにおいては、TCP上で
こんばんは、south37です。 前回までの流れをぶったぎって、今回はJavaScriptの話をしたいと思います。JavaSciptの悪名高い機能の一つ、暗黙の型変換についてです。 暗黙の型変換 JavaScriptは型に関してとても緩く、違う型同士の演算を許容します。その際に暗黙の型変換が行われるのですが、しばしば直感的には理解しにくい変換が行われたり、エラーを突き止めにくくする原因になったりします。 例えば、あんちべさんのブログでは下記の例が書かれてました*1。 // あんちべさんのブログから引用 1 + '1' > 11 //なるほど、数値と文字列で計算すると文字列に変換されるのね 3 * '3' > 9 //えっ! (1+2)+'3' > '33' 1+(2+'3') > '123' //結合法則とは何だったのか… 1 + true > 2 //やばい…どうしてこうなった… tru
Activerecordを使ってるとき、関連(Association)のあるmodel同士をまとめて取得したい時がけっこうある。そんな時、includesやjoinsを使えば効率良くデータを取得出来るんだけど、実はこの二つは振る舞いや特徴が全然違ってたりする。ややこしい気がしたので、ここでちょっとまとめておく。 先に結論を書いておくと、基本的には includesは先読みしてキャッシュしておく。 joinsはただINNER JOINしてくれる。 と思っておけばOK。 ちなみに、railsのversionは4.1.0。Web上に落ちてる情報は古いせいか若干現状の挙動とは違ってたりしたので、気をつけた方が良さそう。 includes includesはデータの先読みをしてくれる。その為、関連modelに対する参照を持ちたい場合に使う。そう言われてもよくわからないと思うので、実際に使用例を見てみ
どうもこんばんは、south37です。 今回は、自分がMacに導入して便利になったツールとか、terminalで使うプラグインとかの話をしたいと思います。 粒度がバラバラで若干まとまりの無い内容になってますがお許しください!! Kobito まず、ChromeとiTermを除くと一番使っているのはKobito.appです。KobitoはQiitaという情報共有サービスを運営しているIncrement社が作成したアプリケーションであり、Markdownの整形結果をリアルタイムで確認しながら文章を書けるのが大きな特徴です。Qiitaへの投稿を促進するために作成されたのですが、そのシンプルさと軽快さからマークダウンエディタとしてもめちゃくちゃ使い易いものになっています。 最近は、本を読むにしろコードを追うにしろWeb上で情報を集めるにしろ、出来るだけ自分用メモみたいなものを残す様にしており、その
どうもこんばんは、south37です。前回に引き続き今回もObjective-Cネタです。 iOSアプリ開発をしてるとシングルトンが活躍するケースがよくある(らしい)のですが、シングルトン生成のコードがパッと理解出来なくて悶々としたので、ここにメモとして残しておきます。 シングルトン シングルトンは、あるクラスのインスタンスが単一である事を保証するデザインパターンです。iOSアプリ開発における利用例としては、例えばAFNetWorkingというライブラリのAFNetworkActivityIndicatorManagerというクラスにおいて、シングルトンが使われています。 以下が、実際の実装です。 1 // "AFNetworkActivityIndicatorManager.m" 2 + (instancetype)sharedManager { 3 static AFNetworkAc
どうもこんばんは、south37です。今日はObjective-Cネタです。 プロパティ属性って何よ!? さて、皆さん、そもそも プロパティ属性 って分かりますか?Objective-Cでコーディングしてる人ならstongやweakやcopyなどを目にしていると思いますが、それがいわゆる プロパティ属性 です。 [参考: Objective-Cにおけるプロパティの定義] http://www.objectivec-iphone.com/introduction/property/property.html ざっくりと言えば、 @interface SomeClass : NSObject @property (nonatomic, copy) NSString *name; @end という風にクラスのプロパティを宣言する時に、プロパティの性質を宣言する為に指定するものですね。 プロパティ
こんばんは、south37です。 前回までbackbone.jsについて勉強していた訳ですが、最近のトレンドは圧倒的にAngular.jsらしいですね。 参考データ って事で、今回はAngular.jsについて学んでいこうと思います。 Angular.jsって何? そもそもAngular.jsって何やねんって話ですが、Backbone.js、Knockout.jsと並ぶJavascriptの3大MVCフレームワークの一つで、UIバインディング等の便利な機能を備えています。少ないコード量で高度な機能を実現出来るため、生産性の大幅な向上が見込めるのが特徴的ですね。 とりあえずコードを見てみましょう。 <!doctype html> <html ng-app> <head> <script src="http://code.angularjs.org/1.2.9/angular.min.js">
どうもこんばんは、south37です。 今日は久々にHaskellネタをぶっ込んで行きたいと思います。題材は、Haskellを知っていれば嫌でもその名を耳にするであろう「モナド」についてです。 そもそもモナドって何なんですか? はい、何なんでしょう?ここで、フィリップ・ワドラーの言葉を引用してみます。 モナドは単なる自己関手の圏におけるモノイド対象だよ。何か問題でも? うん、何だかよく分かりませんが超絶カッコいいですね!!こーゆうのサラッと言えたらいいですね!!! で、結局何なんですか? ワドラーの言葉は専門用語を使って簡潔にまとめられていた為、ベースとなる知識が無い状態では全く意味が分かりませんでした。まずは、ワドラーの言葉に出てきた単語の意味を一つ一つ見て行く事にしましょう。 自己関手 最初のキーワードは 自己関手 です。そのまま読むと、「自己」の「関手」です。はて? 関手(Funct
どうもこんばんは、south37です。今日も引き続きHaskellネタでいこうと思います。Functorって概念を知ったので、ちょろっとまとめてみたいと思います。 そもそも、Functorってなんですか? さて、Functorって聞いて、ピンと来ますか? 僕は、全然ピンと来ませんでした。Wikipedia先生の定義を見ても、 関手(かんしゅ、functor)とは、圏の間の対応付けのことである。関手は対象関数と射関数の組からなる。 などと、何だかよくわからない感じで書かれています。 じゃあ一体なんなんだって話ですが、ポイントはどうやら「対応付け」って点のようです。「圏(と呼ばれるよく分からないモノ)」から「圏」への対応付けをしてくれるのが、Functorです。そうすると、今度は「圏」がなんなんだって話になる訳ですが、これもWikipedia先生によれば 数学における圏(けん、category
こんばんは、south37です。毎回ギリギリになって気づいて慌ててる系なんですが、今日も元気に書いていきたいと思います。今回は前回に引き続き、JavaScript-The-Good-Partsの中に出てくるprototype拡張について説明していきたいと思います。 jsにおけるFunctionオブジェクト jsの関数はみなオブジェクトで、Functionオブジェクトと呼ばれます。そして、Function.prototypeへのリンクをみな持っています。つまりFunction.prototypeを書き換えればjs上の全ての関数に影響を与えられるという訳ですね。で、good partsではFunction.prototypeももちろん書き換えちゃいます。 Function.prototypeの拡張としては、しょっぱなでmethodメソッドというのが定義されています。コードだと、 Functio
こんばんは、south37です。 最近はEffective JavaScriptを読んでるのですが、知らなかった事がポロポロ出てくるので、とても勉強になっています。これからはちょいちょい、そーやって勉強した事をまとめていけたらいいなと思います。 って事で、今日は関数定義の話をしたいと思います。 関数宣言と関数式 JavaScriptにおける関数定義には、大きく分けて3つの方法があります。 function文を使う方法(関数宣言) function演算子を使う方法(関数式) Functionコンストラクタを使う方法 1と2が一般的によく使われる方法ですね。 // 方法1 function multi(x, y) { return x * y; } // 方法2 var multi = function(x, y) { return x * y; }; // これも方法2 var multi
このページを最初にブックマークしてみませんか?
『Nao Minami's Blog』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く