とんたんの技術メモ

注)ただのメモです。

nuxtjs SSRでライフサイクルが実行される場所

サーバーサイド

  • nuxtServerInit
  • plugin
  • middreware(画面遷移でも実行)
  • validate
  • asyncData
  • fetch
  • beforeCreate
  • computed
  • created

クライアントサイド

  • plugin
  • beforeCreate
  • computed
  • created
  • beforeMount
  • mounted
  • destroyed

plugin, beforeCreate, computed, createdはサーバー、クライアントで2回呼び出される(画面遷移時は実行されない) nuxtServerInitは、初期データとか設定したい場合これ使うといいかも。(SPAでは使えない)

elixir phoenix で論理削除する方法

結論、論理削除よりバックアップのほうがいいかも?で使わなくなったんだけどメモ残す。

自前実装前に試したこと

hexdocs.pm

最初にecto_soft_deleteを試したんだけど

  • 削除日がUTCから変えられない
  • 削除済みデータを取る方法がない という理由で自前実装することになった

自前実装メモ

Migration

defmodule App.Repo.Migrations.CreateItems do
  use Ecto.Migration

  def change do
    create table(:items) do
      add :did, :string
      add :deleted_at, :naive_datetime, default: "0000-01-01 00:00:00"
    end

    create index("items", [:did, :deleted_at], unique: true)
  end
end

Schema

defmodule App.Items.Item do
  use Ecto.Schema
  alias App.Repo

  schema "items" do
    field :did, :string
    field :deleted_at, :naive_datetime
  end
end

Service

def get_item!(did) do
  Repo.get_by!(Item, [did: did, deleted_at: "0000-01-01 00:00:00"])
end

def list do
  Item
  |> where([i], i.deleted_at == ^"0000-01-01 00:00:00")
  |> Repo.all
end

def delete_item!(%Item{} = item) do
  item
  |> change()
  |> force_change(:deleted_at, NaiveDateTime.local_now)
  |> Repo.update!()
end

elixir勉強メモ

コレクション

キーワードリスト

キーワードリストは通常​​、関数に引数を渡すため、またはオプションを渡すために使用される second = [first_name: "Philip", last_name: "Brown"]

マップ

map = %{first_name: "Philip", last_name: "Brown"}

docker+elixir+nuxtjsでアプリを作ったときの振り返り

これは2020年5月時点でのお話。

アンブレラプロジェクトにするか迷った

APIモードで使うだけなら境界がないので今回は通常プロジェクトにした。 APIとか管理画面とか明確な境界がある場合はアンブレラが良さそう。 でも、アンブレラはErlang内部で個別にサーバーがたってプロキシとかで振り分けるような処理になるという記事があって、その分サーバー負荷が高くなるのかも?と思った。

macにElixirのバージョン管理環境を作る

https://asdf-vm.com/#/core-manage-asdf-vm

# 依存関係を入れる
brew install autoconf wxmac openssl fop coreutils automake libyaml readline libxslt libtool unixodbc unzip curl
# asdf入れる
git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.7.8
git clone https://github.com/asdf-vm/asdf.git ~/.asdf
cd ~/.asdf
git checkout "$(git describe --abbrev=0 --tags)"
echo -e '\n. $HOME/.asdf/asdf.sh' >> ~/.bash_profile
# echo -e '\n. $HOME/.asdf/completions/asdf.bash' >> ~/.bash_profile # これ入れたら動かなかった
source ~/.bash_profile

asdf plugin-add erlang
asdf plugin-add elixir
asdf plugin-list

# 互換性確認: https://hexdocs.pm/elixir/master/compatibility-and-deprecations.html
export KERL_CONFIGURE_OPTIONS="--without-javac --with-ssl=$(brew --prefix openssl)"
asdf list-all erlang
# めちゃ時間かかる
asdf install erlang 22.3.3
asdf list erlang

asdf list-all elixir
asdf install elixir 1.10.2-otp-22
asdf list elixir

# バージョン切り替え
asdf global erlang 22.3.3
asdf global elixir 1.10.2-otp-22
asdf current

cd ~ && vi .tool-versions
----
elixir 1.9.4-otp-22
erlang 22.3.4.2
----

vscodeにelixir-ls入れる

保存したら自動フォーマットするように設定する

Credoをvscodeで使えるようにするelixirlinterを入れる

更新なく、ポップアップエラー解消しても動かない 今誰かが開発を引き継ごうとしてるみたい

DBカラムの正規化は文字列に

EctoEnumという拡張が便利そうだけどメンテナンスがあまりされてなくデプロイにバグがあるらしい。 DBのEnum型を使う方法がよく紹介されてたけど、定義が2箇所になるとの、複雑になるのでやめた。 結局、型を文字列にしてvalidate_inclusionを使う方法にした。

ユーザー認証にはPOWを使う

rails Deviseの弟分らしい https://hexdocs.pm/pow/README.html

クーロンどうする?

quantum使うと実行時間を一元管理できるっぽい?

Lambda[nodejs]でエクセルファイル内の文字列を置換したときのメモ

const XlsxPopulate = require('xlsx-populate')

const outputXlsx = os.tmpdir() + '/contract.xlsx'
  try {
    const workbook = await XlsxPopulate.fromFileAsync(`${appRoot}/contents/contract-template.xlsx`)
    const sheet = workbook.sheet(0)
    const assigns = {
      __name__: '山下 テスト' // エクセル内の__name__という文字列を置換
    }
    sheet._rows.forEach(row => {
      row._cells.forEach(cell => {
        const key = cell.value()
        if (assigns[key]) cell.value(assigns[key])
      })
    })
    await workbook.toFileAsync(outputXlsx)
} catch (err) {
    console.log(err)
    throw '契約書の作成に失敗しました'
}

で、できたエクセルをaws-lambda-libreofficeを使ってPDFに変換しようとしたんですが、日本語が文字化けする問題を解消できず…他の方法に変えました。 lambdaにカスタムフォントを追加したらいいと試したけど、ライブラリの問題なのかnode12だからなのかフォントの設定がうまく反映されず…。

const { convertTo, canBeConvertedToPDF } = require('@shelf/aws-lambda-libreoffice')
const outputPdf = os.tmpdir() + '/contract.pdf'
await convertTo('contract.xlsx', 'pdf')

リバートされたプルリを、間の変更を取り込みつつ再度プルリする

流れ

  1. 最新devから新しいブランチを切る

  2. そこで、リバートされたものをリバーして

  3. 競合とか解決して

  4. プルリする

コマンド

git log --oneline
---
・・・
24858e4 Merge pull request #2181 from xxxx/feature/revert-1591
0c39b00 Revert "Merge pull request #1974 from xxxx/feature/1591"
・・・
---
git revert 0c39b00

このプルリをマージしたら、新しいプルリをいつもどおり送る