NginxでTCP接続をトンネル

備忘録用のメモ

NginxでTCP接続のトンネルを行う場合、nginx.confに以下のようにstreamを設定することで行えます。この場合nginxの3456ポートに対して127.0.0.1:6543にプロキシします。
```
#user nobody;
worker_processes 1;

#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;

#pid logs/nginx.pid;


events {
worker_connections 1024;
}

stream {
server {
listen 3456;
proxy_pass 127.0.0.1:6543;
}
}
```
プログラム書くのも簡単ですが、既存のNginx使う方が信頼性的に良さそうです。
steavevaivai.hatenablog.com

RustでRefCellとRcを組み合わせて自己参照のパーサーを実装する

Rustのパーサーコンビネータ実装中、多次元配列のパーサコンビネータにて自分自身を再起的に呼び出せる必要がありそうなので調べていたが、後から配列パーサーのインスタンス生成時に渡したパーサーのvector変更を後から変更する方法で困っていたところ以下のドキュメントでRefCellとRcを組み合わせることで可能ということで試してみました。
https://doc.rust-jp.rs/book-ja/ch15-05-interior-mutability.html

続きを読む

JavaとgoのRabbitMQでAMQPを使ってメッセージのやり取りをしてみる

JavaとgoのRabbitMQのサンプルコードを動かして通信を確認してみます。RabbitMQはMacであればbrew install rabbitmqでインストールしたものを使うこともできますが、今回は以下のdocker-compose.ymlを起動させて使います。

version: '3'
services:
  rabbitmq:
    image: rabbitmq:management
    ports:
      - "5672:5672"
      - "15672:15672"
続きを読む

Rustで関数型プログラミング

Rustで関数型プログラミング

Haskellでtree型のデータ構造のfmap, foldMapを実装し、Rustでも同様のことをやってみたいと思います。

続きを読む

S3分析環境構築メモ

AWS分析環境構築メモ

S3

S3の料金計算をもとに検討内容を確認
https://calculator.aws/#/addService/S3

分析機能考慮

  • S3 select
    S3 Select は、GZIP または BZIP2 を使用した CSV および JSON オブジェクト、サーバー側暗号化オブジェクトの圧縮もサポートしているらしい。
    https://aws.amazon.com/jp/blogs/news/querying-data-without-servers-or-databases-using-amazon-s3-select/
    s3 select自体は制限が多く一つオブジェクトをもとにデータ取得でjoinなどはできない

  • Athena + Glue
    GlueはETLの役割を果たしS3上(s3以外でもクロールする)のオブジェクトを取り込んで定義済スキーマに保持し、Athenaにて分析用のクエリを実行できる

  • その他
    簡単に確認したいということであればS3に上げる必要もなくpythonでpandasで読み込むなりでも良さそうである

運用検討

前提として元データは自社構築のHDFSおよびDB上にあるので、分析に必要な分だけAWSに上がっていれば良い

  • データの保持期間はどうするか? データの削除はどうなるのか(スクリプトを書く必要があるか?)
  • 消した後のデータを見たい場合の再アップロードはどうするか?
  • s3 selectやathenaではobject指定でselectとなる(Hiveではテーブル指定でパーティションを日付で分けていたのでわかりやすかった、hdfs上の元データはhash化された文字列も付与されているので命名規則を決めて取得元のオブジェクト名がわかるようにしておく必要がある)
  • 保存先バケットはどうするか(テーブル毎になると思うが、その前に分析基盤識別文字/データ元/テーブル名とスラッシュ区切りにしておくか)
  • 権限グループについて(開発はアップロード、修正、参照ができて、分析者はselectだけ出来るぐらいか)
     AWS マネージドポリシー: AmazonS3ReadOnlyAccess
     https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/security-iam-awsmanpol.html
     athena側はどうなるか?
     https://docs.aws.amazon.com/ja_jp/athena/latest/ug/managed-policies.html

C++でstd::stringをスレッドセーフにする

c++を使っている時マルチスレッドで一方は文字列の更新、もう一方は更新した文字列のコピー取得をしていたのですがおかしな動きをすることがありまして、 例えば、以下の動きを確認すると

#include <iostream>
#include <mutex>
#include <string>
#include <thread>

int main(int argc, char *argv[]) {
  std::string update;
  std::string copy;

  auto updateFunc = [&update]() {
    bool a = true;
    while (true) {
      if (a) {
        update = std::move("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
      } else {
        update = std::move("bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb");
      }
      a = !a;
    }
  };

  auto copyFunc = [&update, &copy]() {
    while (true) {
      copy = update;
      if (copy != "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" &&
          copy != "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb") {
        std::cout << copy << std::endl;
    }
  };

  std::thread t1(updateFunc);
  std::thread t2(copyFunc);
  t1.join();
  t2.join();
}
続きを読む