kosappi の日記

愛知県豊橋市に住んでます。

引っ越しました

引っ越した

埼玉県の戸田市から、愛知県の豊橋市に引越しました。

なぜ引っ越したのか

自分はフルリモートワークかつ、妻は無職なので、埼玉に留まる理由がなくなった、というのが大きい理由です。 また、こどもが小さいうちは親戚にすぐ会える土地の方がベターだと判断し、引っ越すことになりました。

なぜ豊橋なのか

妻の実家があるからです。

戸田の思い出

戸田はとても住みやすい街でした。東京ほどシビアではないけど、東京にあるものはだいたい揃っている感じが、田舎から出てきた自分にはちょうど良かったです。新宿まで20分程度で移動できるのも良かったです。都内勢の飲み会に参加できる。

家賃に関しては、都内よりは安いものの自分の収入では厳しかったです。 こどもが生まれると途端に部屋が狭くなり「もっと広い部屋に引っ越したい...」と漠然と思うようになりました。

保育園や幼稚園、公園や児童館などはとても充実していて、これを手放すのはちょっと惜しかったです。(とはいえ豊橋にもそれなりに存在している)

引越しエピソード

家財の搬出当日に、スプレー缶をトラックに積めないことを知り困っていたんですが、大家さんの厚意で処分してもらえました。本当に助かりました。ありがとうございます。 引越しは梱包もやってもらえるコースを頼んだのだけど、ゴミみたいなものまで「これはゴミですか?」と何度も質問してもらって、途中から申し訳ない気持ちになりました。

引っ越して変わったこと

  • 自家用車で移動するようになった
  • 部屋が広くなった
  • 義理の祖父母とよく会うようになった
  • こどもが幼稚園に通い始めた

自家用車で移動するようになった

170シエンタに家族で乗って、毎週末でかけています。 アイドリングストップ機能を毎回OFFにするのが面倒くさい...。

部屋が広くなった

床面積は2倍になって、部屋も1つ増えました。 1部屋を完全に仕事部屋として占有できるようになって、かなり気持ちに余裕が生まれました。

義理の祖父母とよく会うようになった

週末はよくお互いの家に行きます。 大人の人数がこどもより多いと、かなり精神的に楽。

こどもが幼稚園に通い始めた

これは引越しとは直接関係ないです。(年齢的に幼稚園にスライドする必要があるため) 戸田に住んでいた頃は小規模保育園に通っていたので、かなりストレスがかかっているみたい。

感想

小松原街道で軽い煽り運転に遭い「これが豊橋か...」と洗礼を受けた気分になりました。 そんな小坂をなぐさめたい方は、ぜひほしいものリストからプレゼントをお願いします!

www.amazon.jp

AlpacaJapan株式会社に入社しました

2/4に弥生株式会社を退職しました。

blog.kosappi.net

2/7にAlpacaJapan株式会社に入社しました。

www.alpaca.ai

何をするのか

ウェブエンジニアとして、主にアルパカ証券に関わる予定です。 よろしくお願いします。

今までは RubyRails でしたが、これからは Java をやる予定です。 まだ全然わからなくて、ワクワクしています。

感想

前回の転職(BrandingEngineer -> Misoca)では、最初の面接こそオンラインでしたが、採用フローが進むとオフィスで面接をやりました。また、オンボーディングもオフィスに出社してやりました。 今回はコロナの影響もあり、まったく出社せずに入社日を迎えました。(初日は出社する予定だったけど、コロナの影響でオンラインに) やっぱりちょっとは出社したいですね。

mac -> windows、zoom -> meet、という差分に初日から面食らってますが、早く慣れていきたい。

その他

家庭の事情で、春ごろに愛知県に引っ越す予定です。

ほしいものリストからたくさんプレゼントをいただきました。ありがとうございます! 家電もいただいたんですが、使い始めるのは引っ越してからになると思います...。(早く開けたい...)

www.amazon.jp

弥生株式会社(Misoca)を退職します

弥生株式会社を退職します。 入社時は Misoca 株式会社だったので (Misoca) と書きました。

  • 2022/1/20 最終出社
  • 2022/2/4 退職日

感想

株式会社 Misoca に入社したのは2017年10月でした。自分が入社したときはすでに弥生に買収されており、入社後に合併されて弥生株式会社の社員になりました。足掛け4年3ヶ月でしたが、途中で育児休業(6ヶ月+7ヶ月)を挟んだので、実際に働いたのは3年ちょっとになります。

Misoca は自分にとってとても働きやすい組織でした。コロナ禍以前からずっとフルリモートだったので、昨今のリモートワーク移行の波に飲まれなかったのもラッキーだと思っています。

入社してから結婚して、こどもが2人できました。結婚も出産も育児も、Misoca が働きやすいことがモチベーションにつながっていたと思っています。

次もウェブエンジニアとして働きます。

ほしいものリスト

恒例のほしいものリストを作りました。 www.amazon.jp プレゼントをお待ちしています!

個人ウェブサイトを更新した

kosappi.net を更新しました。

今回は、地元(熊本県)の友人にお金を払って、デザインから実装までやってもらいました。 (old mac っぽくしてくれ、みたいなオーダーは自分が出した)

デスクトップ版の PageSpeed Insights は 98 だったので、問題ないと思っている。

f:id:rkosaka:20211221233646p:plain
pagespeed insights

もうちょっと整理しようと思えばできるけど、しばらくこれで。

彼に仕事を頼みたい場合は、自分に連絡をください。

2つの PostgreSQL 間でデータをコピーする

pg_dump ではデータベース丸ごと、テーブルごと、が指定できる。

でも、データがめちゃくちゃ大きい場合は SELECT * FROM users WHERE sex=0 みたいな SQL の結果をダンプしたくなる。 pg_dump のオプションでは、これを実現できない。

PostgreSQL ではクライアント(psql)の \copy コマンドが使える。 \copy

フロントエンド(クライアント)コピーを行います。 これはCOPY SQLコマンドを実行する操作ですが、サーバで指定ファイルに対する読み込みまたは書き込みを行うのではなく、psqlがファイルの読み書きや、サーバとローカルファイルシステム間のデータ送信を行います。 この場合、ファイルへのアクセス権限はサーバではなくローカルユーザのものを使用するので、SQLのスーパーユーザ権限は必要ありません。

PostgreSQL が持っている COPY とは厳密には違うので注意されたい。

シェルスクリプトを工夫すれば COPY でも同じことができると思うが、今回は psql でログインしてササッとやる感じ。

ダンプ

-- クライアントをデータベース1(コピー元)につなぐ
\copy (SELECT * FROM users WHERE sex=0) TO './users_sex_0.dump'

リストア

-- クライアントをデータベース2(コピー先)につなぐ
\copy users FROM './users_sex_0.dump'

PostgreSQL の WITH で再帰させる

これは弥生 Advent Calendar 2021 の7日目の記事です。

qiita.com

PosgreSQL の WITH

共通テーブル式(Common Table Expression)は一時的なテーブルを定義するもの。 サブクエリを使って SQL がネストして深くなってしまうような場合に、便利だと思う。

PostgreSQL では WITH 句で CTE を書ける。

www.postgresql.jp

こんな感じで、名前をつけた式を別の式から呼ぶことができる。便利。

WITH company_names AS (
    SELECT company_name AS name
    FROM companies
)

SELECT name
FROM company_names;

WITH で再帰できる?

WITH RECURSIVE と書けば、自分自身を参照できるようになり、再帰的に問い合わせることができる。 公式ドキュメントでも紹介されていた、1から100までの合計を計算する式は、以下のようになる。

WITH RECURSIVE t(n) AS (
    VALUES (1)
  UNION ALL
    SELECT n+1 FROM t WHERE n < 100
)
SELECT sum(n) FROM t;

-- 5050

これを ruby で書くとこんな感じだろうか。

def t(n)
  return nil if n > 100
  
  [n, *t(n + 1)]
end

pp t(1).sum

# 5050

なるほど再帰が書けるのか、と思ったけど、どうやら再帰ではないらしい。

注意: 厳密には、この手順は反復であって再帰ではありませんが、RECURSIVEはSQL標準化委員会で選ばれた用語です。

ふむ...

たしかに 再帰的問い合わせの評価 を読むとこれは for 文に近い。

とはいえ、面白いので、他にも試してみる。

添字の列を確保しておくと、ちょっと難しい数列も表現できる。

等比数列

WITH RECURSIVE t(i, n, d) AS (
    SELECT 1, 1, 3
  UNION ALL
    SELECT i + 1, n * d, d FROM t WHERE i < 10
)

SELECT i, n FROM t;
i    n
1   1
2   3
3   9
4   27
5   81
6   243
7   729
8   2187
9   6561
10  19683

フィボナッチ数列

WITH RECURSIVE fibonacci(i, x, y) AS (
    SELECT 0, 0, 1
  UNION ALL
    SELECT i + 1, y, x + y  FROM fibonacci WHERE i < 10
)

SELECT i, x FROM fibonacci;
i    x
0   0
1   1
2   1
3   2
4   3
5   5
6   8
7   13
8   21
9   34
10  55

感想

再帰じゃなくて反復なのは違和感があるし、トリッキーだと思う。なんとかならなかったのだろうか。 SQL でちょっと気の利いた計算ができるのは面白いけれど、この機能で救われる場面はあるのだろうか?と考えてしまう。

引き続き、弥生 Advent Calendar 2021 をよろしくお願いします。

qiita.com

webpack を小さく試す

学生時代から今日まで、何度も JavaScript を書く機会はあったが、いまだに良くわかっていない。 特にバンドルツールやパッケージマネージャの話が出てくると???となる。 チームの詳しい人が整備してくれた環境をなんとなく使ったりアップデートする、という状況が続いている。 まずは webpack を理解したい。 そのために、小さい構成で webpack を試してみたい。

webpack

github.com

Webpack is a module bundler. Its main purpose is to bundle JavaScript files for usage in a browser, yet it is also capable of transforming, bundling, or packaging just about any resource or asset.

ブラウザで使用するために JavaScript ファイルをバンドルしてくれるツールで、いろんなリソースやアセットを変換したりバンドルしたりパッケージ化することができる。 開発中は、個別の JavaScript ファイルの間に依存関係が存在している状態が続くが、プロダクションに出す際に webpack を通すことで、1つの JavaScript ファイルにまとめてくれる。

試す

仕事で使う際はある程度育ったリポジトリで webpack を実行することが多いと思うが、今回は少ないファイル構成でやりたい。 複数の JavaScript ファイルを用意して、webpack で1つのファイルにしたい。

バンドル前

作業するディレクトリはあらかじめ git init しておく。 下記2つをバンドルしたい。

src/index.js

import messages from './messages.js';

console.log(messages);

src/messages.js

export const messages = ['first_message', 'second_message'];

webpack のインストール

まずはインストール。公式ドキュメントを見つつインストールする。

Getting Started | webpack

npm init -y
npm install webpack webpack-cli --save-dev

いろいろ置かれるので、一度 git status してみる。

On branch master
Untracked files:
  (use "git add <file>..." to include in what will be committed)
    node_modules/
    package-lock.json
    package.json

nothing added to commit but untracked files present (use "git add" to track)

node_modules は npm がインストールしてくれたモジュール達なので ignore する。

echo node_modules/\*\* > .gitignore

package.jsonpackage-lock.json はコミットする。

webpack の設定

We also need to adjust our package.json file in order to make sure we mark our package as private, as well as removing the main entry. This is to prevent an accidental publish of your code.

とのことなので package.json を編集する。

--- a/package.json
+++ b/package.json
@@ -2,7 +2,7 @@
   "name": "webpack_test",
   "version": "1.0.0",
   "description": "",
-  "main": "index.js",
+  "private": true,
   "scripts": {
     "test": "echo \"Error: no test specified\" && exit 1"
   },

webpack.config.js はなくてもいい感じにやってくれるらしい。

実行結果

実行するとこういう出力になった。

$ npx webapck
npm ERR! code E404
npm ERR! 404 Not Found - GET https://registry.npmjs.org/webapck - Not found
npm ERR! 404
npm ERR! 404  'webapck@latest' is not in this registry.
npm ERR! 404 You should bug the author to publish it (or use the name yourself!)

npm install webpack@latest --save-dev で更新した。 もう一度実行する。

$ npx webpack
asset main.js 223 bytes [emitted] [minimized] (name: main)
orphan modules 62 bytes [orphan] 1 module
runtime modules 274 bytes 1 module
./src/index.js + 1 modules 124 bytes [built] [code generated]

WARNING in ./src/index.js 3:12-20
export 'default' (imported as 'messages') was not found in './messages.js' (possible exports: messages)

WARNING in configuration
The 'mode' option has not been set, webpack will fallback to 'production' for this value.
Set 'mode' option to 'development' or 'production' to enable defaults for each environment.
You can also set it to 'none' to disable any default behavior. Learn more: https://webpack.js.org/configuration/mode/

webpack 5.64.2 compiled with 2 warnings in 240 ms

今回は html を置いていないため orphan なのは想定通り。 警告を順番にみていく。

WARNING in ./src/index.js 3:12-20
export 'default' (imported as 'messages') was not found in './messages.js' (possible exports: messages)

import 文が間違ってるので下記のように修正してパスした。 import 文を理解できてないことがバレた...。

import - JavaScript | MDN

-import messages from './messages.js';
+import { messages } from './messages.js';

次の警告。

The 'mode' option has not been set, webpack will fallback to 'production' for this value.
Set 'mode' option to 'development' or 'production' to enable defaults for each environment.
You can also set it to 'none' to disable any default behavior. Learn more: https://webpack.js.org/configuration/mode/

mode を設定してとのこと。 今回は設定ファイルなしでやっているので、コマンドに追加のオプションを加えてみる。

$ npx webpack --mode=development

asset main.js 4.15 KiB [emitted] (name: main)
runtime modules 670 bytes 3 modules
cacheable modules 128 bytes
  ./src/index.js 66 bytes [built] [code generated]
  ./src/messages.js 62 bytes [built] [code generated]
webpack 5.64.2 compiled successfully in 78 ms

パスした。

バンドル後

dist/main.js が成果物として置かれるのだが --mode=development で書き出したため、開発用の便利ツールが含まれた大きな js になっている。 今回はバンドルの様子だけ知りたかったので --mode=production でもう一度やってみる。

$ npx webpack --mode=production

asset main.js 71 bytes [emitted] [minimized] (name: main)
orphan modules 62 bytes [orphan] 1 module
./src/index.js + 1 modules 128 bytes [built] [code generated]
webpack 5.64.2 compiled successfully in 163 ms

結果はこのようになった。

$ cat ./dist/main.js
(()=>{"use strict";console.log(["first_message","second_message"])})();%

なるほど。 依存先のソースを取り込んで、短い js に変換してくれている。

感想

最小限の構成で webpack を使ってみた。 ここからいろいろ足して、プロダクションコードで理解できていなかったアレとかコレを再現させてみたい。