ビットの海

ゆるふわソフトウェアエンジニアしゃぜのブログ

Parquet ファイルを覗く

Parquet ファイル、これまであんまり向き合ってこなかったので、少し向き合う。

vim で開けない...かなしい...。

parquet-cli

parquet でぐぐると、parquet-tools 使おうみたいな記事がよく出てくるが、2022年8月現在だともう更新されていないので、代わりに parquet-cli というのを使う。

Mac の場合

$ brew install parquet-cli

で、OK

$  /opt/homebrew/Cellar/parquet-cli/1.12.3/bin/parquet

にあるので、適当に path を通しておきましょう。

$ parquet meta foobar.parquet

で meta データを見たりできる。

詳細は help で

$ parquet help

Usage: parquet [options] [command] [command options]

  Options:

    -v, --verbose, --debug
        Print extra debugging information

  Commands:

    help
        Retrieves details on the functions of other commands
    meta
        Print a Parquet file's metadata
    pages
        Print page summaries for a Parquet file
    dictionary
        Print dictionaries for a Parquet column
    check-stats
        Check Parquet files for corrupt page and column stats (PARQUET-251)
    schema
        Print the Avro schema for a file
    csv-schema
        Build a schema from a CSV data sample
    convert-csv
        Create a file from CSV data
    convert
        Create a Parquet file from a data file
    to-avro
        Create an Avro file from a data file
    cat
        Print the first N records from a file
    head
        Print the first N records from a file
    column-index
        Prints the column and offset indexes of a Parquet file
    column-size
        Print the column sizes of a parquet file
    prune
        Prune column(s) in a Parquet file and save it to a new file. The columns left are not changed.
    trans-compression
        Translate the compression from one to another (It doesn't support bloom filter feature yet).
    masking
        Replace columns with masked values and write to a new Parquet file
    footer
        Print the Parquet file footer in json format

  Examples:

    # print information for meta
    parquet help meta

  See 'parquet help <command>' for more information on a specific command.

pandas で扱う

pandas で Parquet ファイル 扱うことができる

pip で必要なものをそろえる

$ pip install pandas  pyarrow fastparquet

例えば csv にしたい場合はこういう感じ(カレントディレクトリに、foobar.parquet がある想定)

$ python3
Python 3.10.4 (main, May 25 2022, 11:41:04) [Clang 13.1.6 (clang-1316.0.21.2.3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>>
>>>
>>> import pandas as pd
>>> df = pd.read_parquet('foobar.parquet')
>>> df.to_csv('foobar.csv')

これから仲良くしていこう...。

「最新医学で一番正しい アトピーの治し方」を読んだ

サマリ

わたしとアトピー

長男がアトピーなので、ここ数年アトピーに向き合ってきた。

長男のアトピーでは、まず病院のチョイスに難儀した。当時通っていた小児科では皮膚は見ないんだよ(皮膚科行ってくれ)と断られ、皮膚科では、ろくな説明もなく薬だけ処方され、状態がよくならず、困った。

ネットでいろいろぐぐった結果、アトピーやアレルギーに理解のある小児科が良い、みたいな記述をどっかのブログで見つけて、家から通える範囲で1件小児科を見つけて受診し、はじめてそこでまともなアトピーの説明と治療方針について理解した。

その時もらったパンフレットはネットにあるのでぜひ。

www.erca.go.jp

この情報が本当に最初にほしかったなぁという感じ。

その後、その小児科の先生の話、ネットの話なんかを眺めつつ、なんとかコントロールできてる状態で(通院は塗り薬をもらいに月1回程度)で、長男は5歳を迎えた。

保湿超大事

というわけで、世の中的な意味での標準的な方針は、一通り理解しているつもりである。

なので、正直この本も知ってることが多かったし、著者の意図としては、脱ステロイド的な人にこそ読んでほしい内容だったのだろうと思う(その考え方がいかに危険であるか的な)。

とはいえ、トリビア的な日常のケアに活かせる知識も多くあるので(保湿の細かい話とか)、アトピーと向き合っている人は読めば得るものがあると思う。

おすすめですー。

zsh の ヒアドキュメントを変数に入れる

いつも忘れるので

 $ cat foobar.zsh
#!/bin/zsh

FOO="BBB"

FOOBAR=`cat << EOF

aaa
${FOO}
ccc

EOF`

echo ${FOOBAR}

実行

 $ zsh foobar.zsh

aaa
BBB
ccc

おまけ

バッククオート(backquote)を escape して表示させたい。これもいつも忘れる。

$ cat foobar.zsh
#!/bin/zsh

FOO="BBB"

FOOBAR=`cat << EOF

aaa
${FOO}
ccc
\\\`DDD\\\`

EOF`

echo ${FOOBAR}

実行

$ zsh foobar.zsh

aaa
BBB
ccc
`DDD`

Airflow 公式 docker image を使って、Cloud Composer の Local 開発環境を構築

サマリ

  • local で Composer 向けの DAG 開発をしたい
  • BigQuery Operator ぐらいはちゃんとうごいてほしい
  • Airflow 2.1.x
  • Python 3.8
  • ほんとはリポジトリつくってそれ pull してねってすれば親切なんだろうけど面倒くさいので個人のブログに書きなぐっている

ファイル

ディレクトリ構成

.
├── Dockerfile
├── credentials
│   └── credential.json
├── dags
│   └── hello.py
├── docker-compose.yaml
├── .env
├── logs
└── plugins

credential.json

Google Cloud の Service Account のもの

.env

AIRFLOW_UID=503
AIRFLOW_GID=0
GOOGLE_APPLICATION_CREDENTIALS=/opt/airflow/credentials/credential.json
AIRFLOW_CONN_GOOGLE_CLOUD_DEFAULT=google-cloud-platform://?extra__google_cloud_platform__key_path=%2Fopt%2Fairflow%2Fcredentials%2Fcredential.json&extra__google_cloud_platform__project=[your project_id]

docker-compose.yaml

公式のを拾ってくる

curl -LfO 'https://airflow.apache.org/docs/apache-airflow/2.1.4/docker-compose.yaml'

変更点

image 変更

image: ${AIRFLOW_IMAGE_NAME:-apache/airflow:2.1.4}

を適当な自分で build する image に

image: docker-airflow-for-gcp

volume 追加

  volumes:
    - ./dags:/opt/airflow/dags
    - ./logs:/opt/airflow/logs
    - ./plugins:/opt/airflow/plugins
    - ./credentials:/opt/airflow/credentials # 追記

credentials の volume を追記

Dockerfile

gcloud コマンドも居てほしいなと思って、cloud sdk install してる

FROM apache/airflow:2.1.4-python3.8

RUN mkdir -p /opt/airflow/credentials

USER root

RUN sudo apt-get update -yqq \
  && sudo apt-get install curl apt-transport-https ca-certificates gnupg procps -yqq

RUN sudo echo "deb [signed-by=/usr/share/keyrings/cloud.google.gpg] https://packages.cloud.google.com/apt cloud-sdk main" | sudo tee -a /etc/apt/sources.list.d/google-cloud-sdk.list

RUN curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key --keyring /usr/share/keyrings/cloud.google.gpg add -

RUN sudo apt-get update \ 
  && sudo apt-get install google-cloud-sdk -y


RUN gcloud version

操作

コンテナビルド

$ docker build --rm -t docker-airflow-for-gcp .

DB初期化

$ docker-compose up airflow-init

起動

$ docker-compose up

さいごに

  • localhost:8080 でブラウザアクセスできるようになる。
  • id/passowrd は 初期状態で airflow / airflow
  • apache-airflow-providers-google とかは、この Airflow 公式イメージには入ってた。他必要なものがあれば、Dockerfile で pip install してあげればよい。
  • これで、BigQuery Operator ぐらいは動くけど、他の物を動かすときは、環境変数(.env)に追加が必要かも。

参考にしました

Cloud Composer の辛さと、それに負けない開発フローの構築 ~ローカル環境開発編~|JDSC|note

coc-python が archive されたので、coc-jedi と coc-diagnostic に乗り換えた

はじめに

元々 coc-python でLSPとして以下のような設定をして使っていたが、coc-python が停止してしまったので、乗り換えたというお話。

coc-settings.json

   
{
  "languageserver": {
    "python": {
      "command": "pyls",
      "filetypes": [
        "python"
      ],
      "trace.server": "verbose",
      "args": [
        "-vv",
        "--log-file",
        "/tmp/foo.log"
      ],
      "settings": {
        "pyls": {
          "trace": {
            "server": "verbose"
          },
          "configurationSources": [
            "flake8"
          ],
          "plugins": {
            "pydocstyle": {
              "enabled": false
            },
            "pycodestyle": {
              "enabled": false
            },
            "yapf": {
              "enabled": false
            },
            "pylint": {
              "enabled": false
            }
          }
        }
      }
    }
  }
}

やりたいこと

  • Language Server によるアシスト
  • Flake8 での Lint
  • Black での Format

どうするか

coc-jedi と coc-diagnostic を使います。

Language Server によるアシストは coc-jedi を使う

coc-jedi の導入

:CocInstall coc-jedi

Language Server は coc-python 時代は、 pip install 'python-language-server[all]' していたのですが、jedi の場合は以下のようになる。

pip install jedi-language-server

python-language-server(pyls) と同じく、vim が参照できる path を jedi-language-server も設定しておく。

そして、coc-settings.json にも設定を書く

  "jedi": {
    "enable": true,
    "startupMessage": false,
    "executable.command": "jedi-language-server"
  }

coc-diagnostic で Lint と Format

インストール

:CocInstall coc-diagnostic
pip install flake8 black

coc-settings.json の設定

  "diagnostic-languageserver.filetypes": {
    "python": ["flake8"]
  },
  "diagnostic-languageserver.formatFiletypes": {
    "python": ["black"]
  },
  "diagnostic-languageserver.linters": {
    "flake8": {
      "command": "flake8",
      "debounce": 100,
      "args": [ "--format=%(row)d,%(col)d,%(code).1s,%(code)s: %(text)s", "-" ],
      "offsetLine": 0,
      "offsetColumn": 0,
      "sourceName": "flake8",
      "formatLines": 1,
      "formatPattern": [
        "(\\d+),(\\d+),([A-Z]),(.*)(\\r|\\n)*$",
        {
          "line": 1,
          "column": 2,
          "security": 3,
          "message": 4
        }
      ],
      "securities": {
        "W": "warning",
        "E": "error",
        "F": "error",
        "C": "error",
        "N": "error"
      }
    }
  },
  "diagnostic-languageserver.formatters": {
    "black": {
      "command": "black",
      "args": ["--quiet", "-"]
    }
  },

フォーマットするばあいは、以下のコマンドを呼び出す

:call CocAction('format')

参考にしています

coc-pythonがArchive入りしていることに気がついたのでcoc-jediに変えてみた | DevelopersIO

Quipper Japan の 思い出

これはなに

Quipper Japanというなくなってしまったが、素晴らしい組織/企業を懐かしむ独り言です。

(インターネット上から Quipper という文字列が消えてきたので、少しでも残したいなと思って書きました)

あなたはなに

リクルートからの出向で、2019年4月〜2021年9月の2年半ほどQuipperに所属したイチ元社員です(すでに退職済)。

最終的にQuipper Japan の事業と人材は2021年9月末にリクルートに吸収されたので、Quipper 最後の2年半所属したということになるかと思います。

(Japanの事業はリクルートに吸収されましたが、フィリピンとインドネシアは新たにQuipperの現地法人が設立されて、事業を継続しています)

Quipper って

web.archive.org

www.recruit.co.jp

渡辺雅之氏(元DeNA創業メンバー)が、2010年に創業した、グローバルをターゲットにした、Edtechプラットフォームを提供する企業が、Quipper でした。

いろいろ端折りますが、2015年にリクルートに買収され、日本の事業については、リクルートスタディサプリ(当初は受験サプリ)とインテグレーションされました。

2019年当時の体制としては、Quipper Japan で、Quipper 社員と、リクルートから出向したメンバーで、スタディサプリの開発をしていました。

当時はフィリピン、インドネシア、メキシコ、日本で主に事業展開していました。

Quipper の素晴らしかった点

良い企業文化

5つの指針として、

  • UserFirst
  • Diversity
  • Ownership
  • Fact-Based
  • Growth

があり、どれも日常的に意識され、組織運営されていたと思います。

こういったスローガンが日々の業務にきちんと落ちているのが素晴らしいと感じました。

あと、言語化が難しいのですが、ファウンダーの方々の思い(世界の果てまで、最高のまなびを届けよう)を感じることができる環境でした。

良い開発組織

入社して最初に感銘を受けたのが、開発環境です。

blog.studysapuri.jp

いろいろSRE中心に整備されていたのですが、Monorepo で Pull-Request を作成すると、pr-xxx という k8s の namespace が作成され、各マイクロサービスが立ち上がった状態で、テスト環境が生成されるのには非常に感銘を受けました。

codezine.jp

開発組織の力が一番顕在化したのが、上記のコロナ対応だったと思います(自分はjoinした直後でほぼ貢献してませんが...)。

また、Slack / GitHub / Google の User Nameを統一することで、リモート時代でも大変仕事がしやすかったことを記憶しています(github-management という社内の仕組みがありました)。

社内の仕組みだけではなく、開発に必要な SaaS プロダクトも一通り使うことができたのも便利でした。

おまえは何をやっていたのか

会社のブログに書いた話でいうとこのへんですかね

Cloud Dataflow で実現する柔軟なデータパイプライン - スタディサプリ Product Team Blog

Cloud Composer(Airflow)で分析者向けBigQuery SQL実行基盤をつくりました - スタディサプリ Product Team Blog

Quipper/スタディサプリの素晴らしい人々と仕事ができたことは自分の財産になっています。

さいごに

Quipper ありがとう!

Mac で しゅっと Embulk をセットアップする (2022年5月版)

知らないうちに adoptopenjdk はなくなっているのであった...

$ brew tap homebrew/cask-versions
$ brew install --cask temurin8

# install されている java 一覧を出力
$ /usr/libexec/java_home -V

$ export JAVA_HOME=`/usr/libexec/java_home -v 1.8`
$ java -version

$ export EMBULK_VERSION="0.9.24"
$ curl --create-dirs -o ~/.embulk/bin/embulk -L "https://github.com/embulk/embulk/releases/download/v${EMBULK_VERSION}/embulk-${EMBULK_VERSION}.jar"
$ chmod +x ~/.embulk/bin/embulk

$ ~/.embulk/bin/embulk --version