Go言語でGo言語のインタプリタを作る

東京大学理学部情報科学科の2019年アドベントカレンダー、14日目の記事です。 この記事は、Go言語でGo(のとても小さいサブセット)のインタプリタを作ってみようというものです。「Goはある程度わかるが言語の処理系のことはよく知らない」という人を想定して…

少し凝ったことを(簡単に)できるリバースプロキシサーバーをGoで書いてみた

リバースプロキシで少し凝ったことをする際、Nginx+Luaで頑張るなど、いくつか手法があります。しかし、(個人の意見ですが)どれも使い勝手がいいとは言えません。そこで、「使い勝手のよく、少し凝ったことのできるリバースプロキシサーバー」を作ってみま…

tcコマンドとDockerコンテナを用いて遅いネットワークをシミュレートする

「手元で、できるだけ実際の環境に近い環境でプログラムの挙動を確認したい」ということがあるかと思います。そこで今回は、遅い(レイテンシの高い)ネットワークをDockerコンテナを用いてシミュレートする具体的な方法を紹介します。 準備 以下のファイル…

Prologの処理系をTypeScriptで書いてみた

言語仕様の一部しか実装していませんが、一応動くものができたので公開してみます。(v10以降の)Node.jsが必要です。 github.com Prologとは 論理型プログラミング言語の一つです。論理学をプログラミング言語に落とし込んだようなもので、「ある論理式の集合…

Dockerイメージのビルド時にシンボリックリンクの実体を含める

タイトルがわかりにくいですが... 事の発端 以下のような構成のディレクトリがあったとします。 /foo (共有したいファイル) /bar/foo (/fooへのシンボリックリンク) /bar/Dockerfile /baz/foo (/fooへのシンボリックリンク) /baz/Dockerfile そして、{bar,ba…

Docker上のUbuntuでmanページなどを見れるようにする

問題 コンテナにおいてイメージサイズの小ささは正義です。 そのため、UbuntuのDockerイメージはいろいろなものを削り落としています。その削り落とされているものの一つとして、manページが挙げられます。 例えば、次のようにUbuntuのイメージからコンテナ…

安全で軽量なコンテナランタイム「gVisor」について

gVisorのロゴ 「少し聞いたがことある」程度だったのですが、Software Engineering Dailyというポッドキャストのエピソードで耳にしたのを機に、gVisorについて調べてみました。そして日本語の情報もあまり多くなかったので軽く記事にしました。 gVisorとは …

Bcryptを用いてパスワードをハッシュ化する (Node.js)

ログイン機能のあるアプリケーションを開発する場合、(大体の場合は)ユーザーにパスワードを設定してもらうことになります。当然ですがそれらのパスワードを平文でデータベースに保存したりするのはセキュリティ的にご法度で、ハッシュ化して保存をする必…

Cのプログラムをx86-64のマシン上でPowerPC向けにコンパイルする

c

x86-64のマシン + Ubuntu 16.04で、PowerPC 64bit向けにC言語のプログラムをコンパイルする方法を紹介します。俗に言うクロスコンパイルっていうやつです。 以下のように、必要なものをaptで入れます。binutilsにはアセンブラやローダが入っています。 $ sud…

URLから画像のサイズを取得する(Node.js)

サーバーサイドアプリケーションを書いていると、「あるURLでアクセスできる画像の(縦横の)サイズを知りたい」という場面がまれにあると思います。Nodejsにおいて、そういった場合にどうしたらよいかを紹介します。 準備 image-size を利用します。また、…

NginxとDockerでリバースプロキシサーバーを作る

Dockerコンテナ内でnginxを動かし、リバースプロキシサーバーを作る簡単な例を紹介します。 プロダクションで利用する際はnginxの設定をもっとしっかりしないといけませんが、この記事ではそのあたりは端折ります。 コード Dockerfile nginx.confを /etc/gin…

初期化されたMySQLのDockerコンテナを用意する

サーバーサイドアプリケーションの開発環境などにおいて、「初期化された(データベースやテーブルが作成された)MySQLのDockerコンテナを用意したい」といった場面があると思います。そういった際にどうすればよいか、簡単な例を通して説明します。 コード …

NginxのリバースプロキシでのDNS名前解決における落とし穴

問題 Nginxのリバースプロキシでは、プロキシ先として(IPアドレスの他に)ホスト名を指定することができます。 その際、設定ファイルのlocationコンテキストは以下のようになると思います。 location /hoge/ { proxy_pass http://example.com/; } しかし、…

inversifyJSを用いてTypeScriptでDIをする

この記事では、InversifyJS を用いて TypeScript で DI をするサンプルを紹介し、また、(DIに慣れていない方向けに)DI をすると何が嬉しいのか、というのを説明します。 サンプル 「ユーザーの登録」「登録したユーザーの情報を取得」の 2 つのシンプルな…

クラウドとディープラーニングと価格予測の話

AlpacaJapanさん主催のMarketTech Meetup #02でLTをさせていただいたので、その時の内容をここにもまとめておきます。 スライドはこちらです。 クラウドとディープラーニングと価格予測の話 from KazushiKitaya www.slideshare.net ディープラーニングで価格…

winstonでのエラーログにエラーメッセージを含める

winstonでエラーをロギングするときに発生する問題 以下のようにwinstonのloggerを用意したとします。 const winston = require('winston'); const logger = winston.createLogger({ level: 'info', format: winston.format.json(), transports: [ new winst…

winstonでexpressのリクエストログを扱う

expressにおけるリクエストのロギングはmorganを使うのが鉄板ですが、winstonなどの他の高機能なロガーで、まとめてログを扱いたいことが多いと思います。 この記事では、どのようにしてそれを実現するのかを簡単な例で説明します。 準備 空のディレクトリを…

DynamoDBから特定のテーブルの全項目データを取得する(TypeScript/Node.js)

aws

AWS SDKのDynamoDB.DocumentClientのscanメソッドを用いるのですが、そのままではテーブルのサイズが大きい場合に一部のデータしか取得できません。 バッチ処理などで、テーブル内の全項目を取得したいシーンもあると思います。(頻繁にそういった操作が必要…

express.js + passport.jsで1分でbasic認証を実装する

passport.jsを用いると、expressでbasic認証が簡単にできます。 準備 $ npm i express passport passport-http コード 以下のファイルをindex.jsとして保存します。 const express = require('express'); const passport = require('passport'); const passp…

ウェブ開発でNode.jsを採用するメリット・デメリット

ウェブ開発においてある程度の地位を築いた感のあるNode.jsですが、自分も2年ほど使っています。 この記事では、Node.jsの良い点・悪い点をまとめてみます。 メリット フロントエンドと同じ言語(JavaScript)でバックエンドを書くことができる これは素晴らし…

Nvidia Dockerを用いてDockerコンテナからGPUを利用する

ディープラーニング系の処理でもDockerを使いたい!ということで、Nvidia Dockerを利用してDockerコンテナでGPUを使ってみました。 マシンはAWSのp2.xlargeインスタンス(NVIDIA K80を積んでいます)を、OSはUbuntu 18.04を利用しました。 Dockerのインスト…

Numbaを用いたPython/Numpyの高速化

まえがき 機械学習関連のプロジェクトではPythonを使う人が多いと思うのですが、Pythonでの処理って遅いですよね。 Tensorflowでの学習などにおいてはPython側で計算をしているわけではないので大丈夫なのですが、前処理の際などにPythonの実行速度の遅さが…

Express/Node.jsでTypeScriptを使ってみる

最近、バックエンド開発でNode.jsを用いています。 JavaScriptは仕様がどんどん良くなってきているし、コールバックを用いた非同期処理も個人的には好きです。 しかしコードベースが大きくなると「型があればなあ...」と思うこともしばしば。 そこでTypeScri…

AWS S3 の特徴まとめ

aws

AWSを使っている人全員が触ったことがあるであろうS3。整理のためのメモ。 データを複数の場所に複製するという特徴から、データの更新・削除には結果整合性が採用されている Getでファイルをダウンロードできる Putでファイルをアップロード(新規/更新)で…

AWS DynamoDB についてのメモ

aws

使う機会がったので。 SPOF(単一障害点)が存在しない、信頼性の高いマネージド型NoSQLデータベース テーブルごとにRead, Writeそれぞれに対して必要な分のスループットキャパシティをプロビジョンすることができる 運用中にオンラインでキャパシティの設定…

AWS Key Management Service (KMS) についてのメモ

aws

使う機会があったので。 データの暗号化には、通信の暗号化(in transit)と保管データの暗号化(at rest)があるが、KMSは保管データの暗号化に使われる KMSは、鍵の保管・管理を提供する Customer Master Keyは、KMS内部のHSMでのみ平文で存在し、最大4KBのデ…

libuvとは(特にイベントループについて)

libuvのロゴ http://docs.libuv.org/en/v1.x/design.html を読み進めていった際のメモです。 概要 libuvは「クロスプラットフォームサポートのためのライブラリ」で、Node.jsで使われることを想定して開発が進められてきた(現在はNode.js以外でも用いられて…

V8 JavaScriptエンジンとは(そしてその高速化について少し)

v8

V8のロゴ V8とは V8はGoogleが開発しているオープンソースのJavaScript実行エンジン(JavaScriptのコードを解析し、機械語まで落とし込んで実行してくれるもの)です。 C++で書かれていて、Google Chromeで使われているほか、Node.js(サーバーサイド向けのJ…

Node.jsでノンブロッキングなコードを書くべき理由

Node.jsのロゴ Node.jsで「イベントループをブロックするコードを書いてはだめで、ノンブロッキングなコードを書かないといけない」とかよく言われます。Node.jsを用いて実際に開発をしている人にとっては至極当然のことですが、なぜノンブロッキングなコー…

V8をアプリケーションに組み込むためのガイド

v8

V8のロゴ https://v8.dev/docs/embed を読み進めていったときのメモです。 概要 C++アプリケーション内に、V8 JavaScriptエンジンを組み込むためのガイド。 次の2つの方法を紹介する C++のオブジェクトやメソッドをJavaScriptで使えるようにする JavaScript…