slackのアクセストークンを取得する方法
ここにアクセス
https://api.slack.com/apps
Create New App でアプリを作成スコープを設定
permissions > User Token Scopes で chat:write 権限を付与アプリをインストール
permissions > Install App To Team ボタンを押すアクセストークンをコピーして使う
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 で論理削除する方法
結論、論理削除よりバックアップのほうがいいかも?で使わなくなったんだけどメモ残す。
自前実装前に試したこと
最初に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')
リバートされたプルリを、間の変更を取り込みつつ再度プルリする
流れ
最新devから新しいブランチを切る
そこで、リバートされたものをリバーして
競合とか解決して
プルリする
コマンド
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
このプルリをマージしたら、新しいプルリをいつもどおり送る