東京大学理学部情報科学科の2019年アドベントカレンダー、14日目の記事です。 この記事は、Go言語でGo(のとても小さいサブセット)のインタプリタを作ってみようというものです。「Goはある程度わかるが言語の処理系のことはよく知らない」という人を想定して…
リバースプロキシで少し凝ったことをする際、Nginx+Luaで頑張るなど、いくつか手法があります。しかし、(個人の意見ですが)どれも使い勝手がいいとは言えません。そこで、「使い勝手のよく、少し凝ったことのできるリバースプロキシサーバー」を作ってみま…
「手元で、できるだけ実際の環境に近い環境でプログラムの挙動を確認したい」ということがあるかと思います。そこで今回は、遅い(レイテンシの高い)ネットワークをDockerコンテナを用いてシミュレートする具体的な方法を紹介します。 準備 以下のファイル…
言語仕様の一部しか実装していませんが、一応動くものができたので公開してみます。(v10以降の)Node.jsが必要です。 github.com Prologとは 論理型プログラミング言語の一つです。論理学をプログラミング言語に落とし込んだようなもので、「ある論理式の集合…
タイトルがわかりにくいですが... 事の発端 以下のような構成のディレクトリがあったとします。 /foo (共有したいファイル) /bar/foo (/fooへのシンボリックリンク) /bar/Dockerfile /baz/foo (/fooへのシンボリックリンク) /baz/Dockerfile そして、{bar,ba…
問題 コンテナにおいてイメージサイズの小ささは正義です。 そのため、UbuntuのDockerイメージはいろいろなものを削り落としています。その削り落とされているものの一つとして、manページが挙げられます。 例えば、次のようにUbuntuのイメージからコンテナ…
gVisorのロゴ 「少し聞いたがことある」程度だったのですが、Software Engineering Dailyというポッドキャストのエピソードで耳にしたのを機に、gVisorについて調べてみました。そして日本語の情報もあまり多くなかったので軽く記事にしました。 gVisorとは …
ログイン機能のあるアプリケーションを開発する場合、(大体の場合は)ユーザーにパスワードを設定してもらうことになります。当然ですがそれらのパスワードを平文でデータベースに保存したりするのはセキュリティ的にご法度で、ハッシュ化して保存をする必…
x86-64のマシン + Ubuntu 16.04で、PowerPC 64bit向けにC言語のプログラムをコンパイルする方法を紹介します。俗に言うクロスコンパイルっていうやつです。 以下のように、必要なものをaptで入れます。binutilsにはアセンブラやローダが入っています。 $ sud…
サーバーサイドアプリケーションを書いていると、「あるURLでアクセスできる画像の(縦横の)サイズを知りたい」という場面がまれにあると思います。Nodejsにおいて、そういった場合にどうしたらよいかを紹介します。 準備 image-size を利用します。また、…
Dockerコンテナ内でnginxを動かし、リバースプロキシサーバーを作る簡単な例を紹介します。 プロダクションで利用する際はnginxの設定をもっとしっかりしないといけませんが、この記事ではそのあたりは端折ります。 コード Dockerfile nginx.confを /etc/gin…
サーバーサイドアプリケーションの開発環境などにおいて、「初期化された(データベースやテーブルが作成された)MySQLのDockerコンテナを用意したい」といった場面があると思います。そういった際にどうすればよいか、簡単な例を通して説明します。 コード …
問題 Nginxのリバースプロキシでは、プロキシ先として(IPアドレスの他に)ホスト名を指定することができます。 その際、設定ファイルのlocationコンテキストは以下のようになると思います。 location /hoge/ { proxy_pass http://example.com/; } しかし、…
この記事では、InversifyJS を用いて TypeScript で DI をするサンプルを紹介し、また、(DIに慣れていない方向けに)DI をすると何が嬉しいのか、というのを説明します。 サンプル 「ユーザーの登録」「登録したユーザーの情報を取得」の 2 つのシンプルな…
AlpacaJapanさん主催のMarketTech Meetup #02でLTをさせていただいたので、その時の内容をここにもまとめておきます。 スライドはこちらです。 クラウドとディープラーニングと価格予測の話 from KazushiKitaya www.slideshare.net ディープラーニングで価格…
winstonでエラーをロギングするときに発生する問題 以下のようにwinstonのloggerを用意したとします。 const winston = require('winston'); const logger = winston.createLogger({ level: 'info', format: winston.format.json(), transports: [ new winst…
expressにおけるリクエストのロギングはmorganを使うのが鉄板ですが、winstonなどの他の高機能なロガーで、まとめてログを扱いたいことが多いと思います。 この記事では、どのようにしてそれを実現するのかを簡単な例で説明します。 準備 空のディレクトリを…
AWS SDKのDynamoDB.DocumentClientのscanメソッドを用いるのですが、そのままではテーブルのサイズが大きい場合に一部のデータしか取得できません。 バッチ処理などで、テーブル内の全項目を取得したいシーンもあると思います。(頻繁にそういった操作が必要…
passport.jsを用いると、expressでbasic認証が簡単にできます。 準備 $ npm i express passport passport-http コード 以下のファイルをindex.jsとして保存します。 const express = require('express'); const passport = require('passport'); const passp…
ウェブ開発においてある程度の地位を築いた感のあるNode.jsですが、自分も2年ほど使っています。 この記事では、Node.jsの良い点・悪い点をまとめてみます。 メリット フロントエンドと同じ言語(JavaScript)でバックエンドを書くことができる これは素晴らし…
ディープラーニング系の処理でもDockerを使いたい!ということで、Nvidia Dockerを利用してDockerコンテナでGPUを使ってみました。 マシンはAWSのp2.xlargeインスタンス(NVIDIA K80を積んでいます)を、OSはUbuntu 18.04を利用しました。 Dockerのインスト…
まえがき 機械学習関連のプロジェクトではPythonを使う人が多いと思うのですが、Pythonでの処理って遅いですよね。 Tensorflowでの学習などにおいてはPython側で計算をしているわけではないので大丈夫なのですが、前処理の際などにPythonの実行速度の遅さが…
最近、バックエンド開発でNode.jsを用いています。 JavaScriptは仕様がどんどん良くなってきているし、コールバックを用いた非同期処理も個人的には好きです。 しかしコードベースが大きくなると「型があればなあ...」と思うこともしばしば。 そこでTypeScri…
AWSを使っている人全員が触ったことがあるであろうS3。整理のためのメモ。 データを複数の場所に複製するという特徴から、データの更新・削除には結果整合性が採用されている Getでファイルをダウンロードできる Putでファイルをアップロード(新規/更新)で…
使う機会がったので。 SPOF(単一障害点)が存在しない、信頼性の高いマネージド型NoSQLデータベース テーブルごとにRead, Writeそれぞれに対して必要な分のスループットキャパシティをプロビジョンすることができる 運用中にオンラインでキャパシティの設定…
使う機会があったので。 データの暗号化には、通信の暗号化(in transit)と保管データの暗号化(at rest)があるが、KMSは保管データの暗号化に使われる KMSは、鍵の保管・管理を提供する Customer Master Keyは、KMS内部のHSMでのみ平文で存在し、最大4KBのデ…
libuvのロゴ http://docs.libuv.org/en/v1.x/design.html を読み進めていった際のメモです。 概要 libuvは「クロスプラットフォームサポートのためのライブラリ」で、Node.jsで使われることを想定して開発が進められてきた(現在はNode.js以外でも用いられて…
V8のロゴ V8とは V8はGoogleが開発しているオープンソースのJavaScript実行エンジン(JavaScriptのコードを解析し、機械語まで落とし込んで実行してくれるもの)です。 C++で書かれていて、Google Chromeで使われているほか、Node.js(サーバーサイド向けのJ…
Node.jsのロゴ Node.jsで「イベントループをブロックするコードを書いてはだめで、ノンブロッキングなコードを書かないといけない」とかよく言われます。Node.jsを用いて実際に開発をしている人にとっては至極当然のことですが、なぜノンブロッキングなコー…
V8のロゴ https://v8.dev/docs/embed を読み進めていったときのメモです。 概要 C++アプリケーション内に、V8 JavaScriptエンジンを組み込むためのガイド。 次の2つの方法を紹介する C++のオブジェクトやメソッドをJavaScriptで使えるようにする JavaScript…