typescript elasticsearch helloworld

  1. make project dir

    mkdir sample

  2. open vscode

    code sample

  3. make docker-compose.yml

docker-compose.yml

```
version: "3"
services:
  app:
    image: node
    volumes:
      - .:/app
    working_dir: /app
    depends_on:
      - elasticsearch
    tty: true
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.7.0
    environment:
      - discovery.type=single-node
    ports:
      - 9200:9200
    expose:
      - 9300
  kibana:
    image: docker.elastic.co/kibana/kibana:7.7.0
    ports:
      - 5601:5601

```
  1. npm init

    sudo docker-compose run -u (id -u $USER):(id -g $USER) app npm init -y

  2. npm install

    sudo docker-compose run -u (id -u $USER):(id -g $USER) app npm install -D typescript ts-node

  3. tsc init

    sudo docker-compose run -u (id -u $USER):(id -g $USER) app npx tsc --init --target ES2020

  4. npm install

    sudo docker-compose run -u (id -u $USER):(id -g $USER) app npm install --save @elastic/elasticsearch

  5. create index.ts file

index.ts

```
import { Client } from "@elastic/elasticsearch";

(async () => {
  const client = new Client({ node: "http://elasticsearch:9200" });
  await client.index({
    index: "game-of-thrones",
    body: {
      character: "Ned Stark",
      quote: "hello",
    },
  });
})();
```
  1. edit package.json file

package.json

```
+"start": "ts-node index.ts",
```
  1. docker-compose up

    sudo docker-compose up -d

  2. npm start

    sudo docker-compose exec app npm start

  3. open kibana

    http://localhost:5601/

  4. create index pattern

    Screenshot_2020-05-24 Elastic Kibana.png (87.4 kB)

  5. discover index

    Screenshot_2020-05-24 Discover - Elastic Kibana.png (81.4 kB)

typescript mongodb helloworld

  1. make project dir

    mkdir sample

  2. open vscode

    code sample

  3. make docker-compose.yml

docker-compose.yml

```
version: "3"
services:
  app:
    image: node
    volumes:
      - .:/app
    working_dir: /app
    depends_on:
      - mongo
    tty: true
  mongo:
    image: mongo
    ports:
      - 27017:27017
    environment:
      MONGO_INITDB_ROOT_USERNAME: root
      MONGO_INITDB_ROOT_PASSWORD: example
  mongo-express:
    image: mongo-express
    restart: always
    ports:
      - 8081:8081
    environment:
      ME_CONFIG_MONGODB_ADMINUSERNAME: root
      ME_CONFIG_MONGODB_ADMINPASSWORD: example
```
  1. npm init

    sudo docker-compose run -u (id -u $USER):(id -g $USER) app npm init -y

  2. npm install

    sudo docker-compose run -u (id -u $USER):(id -g $USER) app npm install -D typescript ts-node

  3. tsc init

    sudo docker-compose run -u (id -u $USER):(id -g $USER) app npx tsc --init --target ES2020

  4. npm install

    sudo docker-compose run -u (id -u $USER):(id -g $USER) app npm install mongodb @types/mongodb --save

  5. docker run

    sudo docker-compose up -d

  6. setup mongo db

    http://localhost:8081/

    Screenshot_2020-05-23 Home - Mongo Express(1).png (91.8 kB)

    Screenshot_2020-05-23 sandbox - Mongo Express.png (65.8 kB)

  7. create index.ts file

index.ts

```
import mongodb, { MongoClient } from "mongodb";

(async () => {
  const MongoClient = mongodb.MongoClient;
  const url = "mongodb://root:example@mongo:27017";
  const dbName = "sandbox";
  const connectOption = {
    useNewUrlParser: true,
    useUnifiedTopology: true,
  };

  const client = await MongoClient.connect(url, connectOption);
  const db = client.db(dbName);

  const collection = db.collection("hello")
  await collection.insertOne({ title: "hello", content: "hello" });
  await collection.insertMany([
    { title: "hello_1", content: "hello_1" },
    { title: "hello_2", content: "hello_2" },
  ]);
  await collection.updateOne({ title: "hello_1" }, { $set: { content: "hello changed" } });

  const helloCollection = await collection.find({}).toArray();
  for (let i = 0; helloCollection.length > i; i++) {
    const hello = helloCollection[i];
    console.log(hello);
  }

  await collection.deleteMany({});

  await client.close();
})();
```
  1. edit package.json file

    package.json

    "start": "ts-node index.ts",

  2. npm start

    sudo docker-compose exec app npm start

https://hub.docker.com/_/mongo

metabaseをdockerで試す

ようこそ画面が映るまで

  1. プロジェクト用のディレクトリを作る

    mkdir metabase-sample cd metabase-sample

  2. postgres用のdataディレクトリをつくる

    mkdir -p docker/postgres/data

  3. docker-compose.ymlを作る

docker-compose.yml

```
version: '3'
services:
  metabase:
    image: metabase/metabase
    environment:
      - MB_DB_TYPE=postgres
      - MB_DB_DBNAME=metabase
      - MB_DB_PORT=5432
      - MB_DB_USER=postgres
      - MB_DB_PASS=your_password
      - MB_DB_HOST=postgres
    ports:
      - 3000:3000  
    depends_on:
      - postgres
  postgres:
    image: postgres
    environment:
      - POSTGRES_PASSWORD=your_password
      - POSTGRES_USER=postgres
      - POSTGRES_DB=metabase
    volumes:
      - ./docker/postgresql/data:/var/lib/postgresql/data
```
  1. docker-compose up

    sudo docker-compose up

  2. アクセス

    http://localhost:3000

f:id:kytiken:20200517103222p:plain

これでいろいろ試す

ちなみに

これをやろうと思ったのはAthenaにつなげるかどうかを確認したかったから

metabase ← athena ← s3

ということがしたくて、もしこれができたら、例えばJSONファイルをS3に貯めるだけためておいて、athena経由でクエリを投げてmetabaseで可視化できると思った

JSONを放り込むだったりALBのログファイルとかにも応用できると、可視化がいろいろ楽になると思った

いろいろ調べたけど無理っぽかった...

Issueはある

github.com

github.com

開発中の模様

参考

ちょっとnodejsを試したいときにdockerで環境を作る

最近ubuntu20.04にしてから、ホスト側にnodejsを入れずにどこまでいけるのかというのを試しています。

nodejsに限った話ではないのですが、言語の環境を作りたいときにそれぞれの言語のバージョン管理システムを入れるのが邪魔くさいという問題があったからです。

せっかくLinuxディストリビューションを使っているのだから、dockerを使ったほうが楽になりそうだということで、最小限の環境を作るのにどうやったら楽になるのかを考えてみました。

手順

  1. 作業ディレクトリを作成

    mkdir sandbox cd sandbox

  2. docker-composeを作る

    ``` version: '3' services: app: image: node volumes:

       - .:/app
     working_dir: /app
    

    ```

  3. dockerコンテナでbashを立ち上げる

    sudo docker-compose run -u $(id -u $USER):$(id -g $USER) app bash

  4. npm init

    npm init -y

使い方

ホスト側でファイルを編集して、実行はdockerコンテナ上でします。

そのためにホストのカレントディレクトリをマウントしておきます。

docker-compose run-u オプションをつけておかないとコンテナ上でファイルを作った場合にrootユーザーで作られるので、ホスト側のユーザーのidとあわせます。

おわりに

とりあえず触ってみたいときにさっと環境を作る方法について紹介しました。

ただしこれは最小構成です。

これで環境構成が事足りるということは無いので、ここからいろいろ足していくことになると思います。

例えばmysqlservice に足したり、 ports の設定を足したり、.env の設定を足したりなどなどです。

そういうときに、どう書くのかいつも忘れるので docker-composeのリファレンスも貼っておきます。

docs.docker.com

ノシ

ubuntuにコピペツールを入れる(CopyQの紹介)

最近Ubuntu20.04をインストールしたので環境整備をしています。

それでコピペをするときに便利になるツールを探していました。

私が探していたのはコピーした履歴を管理してくれるようなツールです。

例えば3つ前にコピーしたものを貼り付けるみたいなことがしたいのです。

Macでいうとclipyというツールがあり、Macのときはこれを使っています。

Ubuntuでもそのようなツールが無いかを探していて、CopyQというツールが便利だったので紹介します。

インストール方法

aptでインストールします。

sudo apt install copyq

使い方

CopyQを起動するとCopyQのアプリケーションが常駐するようになり、コピーした履歴が表示されるようになります。

f:id:kytiken:20200505080715p:plain

設定

ちょっとだけ設定します。

自動起動の設定

f:id:kytiken:20200505082534p:plain

ショートカットの設定

f:id:kytiken:20200505083226p:plain

まとめ

以上、CodeQというツールの紹介でした。

Macを使っているときはClipyに頼り切っていたので、似たツールがあってよかったです。

chromeのconsoleからxpathを使いつつhrefを取ってくるワンライナー

ある特定のidの配下にあるaタグのhrefを全部取りたかった

nodejsなりrubyなりで書けるが、よりお手軽にchrome上でしたかった

やり方

xpathを使う

$x('//*[@id="target_dom_id"]//a/@href').map((href) => {return href.value})

解説

chromeでは$x()xpathからdomを取ってくる機能がある

なのでここの中でhrefの属性値を取ってくるようなxpathを書いている

xpathでは/@hrefと書くと属性値が取得できるようなのでそれを利用する

これでhrefが取れるわけだが、表示として下記のような感じになり見づらいScreenshot from 2020-05-03 07-12-36.png (49.6 kB)

f:id:kytiken:20200503072302p:plain

なのでmapを使って整形する

.map((href) => {return href.value})

以上

ubuntuをインストールしたときにセットアップしたもの

Ubuntu20.04が出たので入れてみた

最初にやったことをメモる

やったこと

  1. apt update & upgrade

    sudo apt update

    sudo apt upgrade

  2. JetBrains mono install

    https://www.jetbrains.com/lp/mono/

  3. ターミナルのフォント設定変更

    JetBrains monoを設定

    f:id:kytiken:20200425141401p:plain

  4. カラースキームを変更

    Solarized Darkにする

    f:id:kytiken:20200425141446p:plain

  5. ホームディレクトリ名前を変更

    LANG=C xdg-user-dirs-gtk-update

  6. vscode install

    https://code.visualstudio.com/

    sudo dpkg -i code_1.44.2-1587059832_amd64.deb

  7. slack install

    https://slack.com/intl/ja-jp/downloads/linux

    sudo dpkg -i slack-desktop-4.4.2-amd64.deb

  8. nvim install

    snap install nvim

  9. aws-cli install

    snap install aws-cli --classic

  10. docker install

    sudo snap install docker

  11. fish install

    https://launchpad.net/~fish-shell/+archive/ubuntu/release-3

    sudo apt-add-repository ppa:fish-shell/release-3

    sudo apt-get update

    sudo apt-get install fish

  12. デフォルトシェルを変える

    sudo chsh -s /usr/bin/fish

  13. CapsLock -> Ctrl

    sudo nvim /etc/default/keyboard

    XKBOPTIONS="ctrl:nocaps"

vscodeとslackをなぜsnapで入れていないか?

日本語対応していないから

https://forum.snapcraft.io/t/slack-doesnt-support-cjkv-text-input-ibus/8538

ここで議論されているが、ibusに対応していないため、対応するまではaptのパッケージを使用する・・・