【Ubuntu】heroku cliでGPGエラー
どうもてぃ。
今回のエラーはいつも出るのでさすがに記事にしてあとで見返そうと思い書くことにしました。
毎回調べるのに疲れた…。
エラー内容
% sudo apt update ヒット:1 http://ubuntutym.u-toyama.ac.jp/ubuntu bionic InRelease ヒット:2 http://ubuntutym.u-toyama.ac.jp/ubuntu bionic-updates InRelease ヒット:3 http://ubuntutym.u-toyama.ac.jp/ubuntu bionic-backports InRelease ヒット:4 https://cli.github.com/packages stable InRelease ヒット:5 http://packages.microsoft.com/repos/code stable InRelease 無視:6 http://ftp.jaist.ac.jp/pub/Linux/linuxmint/packages tricia InRelease ヒット:7 https://repo.steampowered.com/steam stable InRelease ヒット:8 http://dl.google.com/linux/chrome/deb stable InRelease ヒット:9 http://ftp.jaist.ac.jp/pub/Linux/linuxmint/packages tricia Release ヒット:10 https://repo.nordvpn.com/deb/nordvpn/debian stable InRelease 取得:12 https://packages.cloud.google.com/apt cloud-sdk InRelease [6,751 B] ヒット:13 http://apt.postgresql.org/pub/repos/apt bionic-pgdg InRelease 取得:14 https://packages.stripe.dev/stripe-cli-debian-local stable InRelease [3,427 B] ヒット:15 http://ppa.launchpad.net/alessandro-strada/ppa/ubuntu bionic InRelease ヒット:17 http://archive.canonical.com/ubuntu bionic InRelease 取得:16 https://cli-assets.heroku.com/branches/stable/apt ./ InRelease [2,550 B] エラー:16 https://cli-assets.heroku.com/branches/stable/apt ./ InRelease 公開鍵を利用できないため、以下の署名は検証できませんでした: NO_PUBKEY 536F8F1DE80F6A35 ヒット:19 http://ppa.launchpad.net/chrdevs/figma/ubuntu bionic InRelease 取得:20 http://security.ubuntu.com/ubuntu bionic-security InRelease [88.7 kB] ヒット:21 http://ppa.launchpad.net/ethereum/ethereum/ubuntu bionic InRelease ヒット:18 https://packagecloud.io/github/git-lfs/linuxmint tricia InRelease ヒット:23 http://ppa.launchpad.net/linuxuprising/java/ubuntu bionic InRelease ヒット:22 https://packagecloud.io/slacktechnologies/slack/debian jessie InRelease ヒット:24 http://ppa.launchpad.net/obsproject/obs-studio/ubuntu bionic InRelease ヒット:25 http://ppa.launchpad.net/peek-developers/stable/ubuntu bionic InRelease 取得:26 http://security.ubuntu.com/ubuntu bionic-security/universe amd64 Packages [1,224 kB] ヒット:27 http://ppa.launchpad.net/xuzhen666/ppsspp/ubuntu bionic InRelease 取得:28 http://security.ubuntu.com/ubuntu bionic-security/universe i386 Packages [1,034 kB] 取得:29 http://security.ubuntu.com/ubuntu bionic-security/universe Translation-en [282 kB] 2,641 kB を 8秒 で取得しました (327 kB/s) パッケージリストを読み込んでいます... 完了 W: 署名照合中にエラーが発生しました。リポジトリは更新されず、過去のインデックスファイルが使われます。GPG エラー: https://cli-assets.heroku.com/branches/stable/apt ./ InRelease: 公開鍵を利用できないため、以下の署名は検証できませんでした: NO_PUBKEY 536F8F1DE80F6A35 W: https://cli-assets.heroku.com/branches/stable/apt/./InRelease の取得に失敗しました 公開鍵を利用できないため、以下の署名は検証できませんでした: NO_PUBKEY 536F8F1DE80F6A35 W: いくつかのインデックスファイルのダウンロードに失敗しました。これらは無視されるか、古いものが代わりに使われます。
NO_PUBKEY 536F8F1DE80F6A35
これ。システム側にGPGエラーで出てきたキーがないとのこと。なので追加してあげます。
解決方法
% sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 536F8F1DE80F6A35 Executing: /tmp/apt-key-gpghome.a9Y6s4DyNb/gpg.1.sh --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 536F8F1DE80F6A35 gpg: 鍵536F8F1DE80F6A35: 公開鍵"Heroku Inc. <support@heroku.com>"をインポートしました gpg: 処理数の合計: 1 gpg: インポート: 1
問題なくシステム側にpublic keyがインポートできました。
終わり
% sudo apt update ヒット:1 http://ubuntutym.u-toyama.ac.jp/ubuntu bionic InRelease ヒット:2 http://ubuntutym.u-toyama.ac.jp/ubuntu bionic-updates InRelease ヒット:3 http://ubuntutym.u-toyama.ac.jp/ubuntu bionic-backports InRelease 無視:4 http://ftp.jaist.ac.jp/pub/Linux/linuxmint/packages tricia InRelease ヒット:5 http://ftp.jaist.ac.jp/pub/Linux/linuxmint/packages tricia Release ヒット:6 https://cli.github.com/packages stable InRelease 取得:7 https://cli-assets.heroku.com/branches/stable/apt ./ InRelease [2,550 B] ヒット:8 http://dl.google.com/linux/chrome/deb stable InRelease ヒット:9 https://repo.nordvpn.com/deb/nordvpn/debian stable InRelease ヒット:10 https://packages.cloud.google.com/apt cloud-sdk InRelease ヒット:12 https://repo.steampowered.com/steam stable InRelease ヒット:13 http://security.ubuntu.com/ubuntu bionic-security InRelease 取得:14 https://cli-assets.heroku.com/branches/stable/apt ./ Packages [608 B] ヒット:16 http://archive.canonical.com/ubuntu bionic InRelease ヒット:17 http://ppa.launchpad.net/alessandro-strada/ppa/ubuntu bionic InRelease ヒット:18 http://packages.microsoft.com/repos/code stable InRelease ヒット:19 http://apt.postgresql.org/pub/repos/apt bionic-pgdg InRelease ヒット:15 https://packagecloud.io/github/git-lfs/linuxmint tricia InRelease ヒット:21 http://ppa.launchpad.net/chrdevs/figma/ubuntu bionic InRelease ヒット:20 https://packagecloud.io/slacktechnologies/slack/debian jessie InRelease ヒット:22 http://ppa.launchpad.net/ethereum/ethereum/ubuntu bionic InRelease 取得:23 https://packages.stripe.dev/stripe-cli-debian-local stable InRelease [3,427 B] ヒット:24 http://ppa.launchpad.net/linuxuprising/java/ubuntu bionic InRelease ヒット:25 http://ppa.launchpad.net/obsproject/obs-studio/ubuntu bionic InRelease ヒット:26 http://ppa.launchpad.net/peek-developers/stable/ubuntu bionic InRelease ヒット:27 http://ppa.launchpad.net/xuzhen666/ppsspp/ubuntu bionic InRelease 6,585 B を 6秒 で取得しました (1,058 B/s) パッケージリストを読み込んでいます... 完了 依存関係ツリーを作成しています 状態情報を読み取っています... 完了 パッケージはすべて最新です。
よいUbuntuライフを。
【Prisma】upsertがうまく動かないときに確認すること
おひさしどうもてぃです。
最近は個人開発で自分のshopだったりhomeブログだったり作っていて、あまり記事をアウトプットできてなかったので書きます。
いつも通り解決シリーズです。
環境
- NestJS 8.0.0
- Prisma client 4.0.0
NestJS × Prisma × GraphQLの構成です。
問題
Prismaのupsertで要求されるwhereの型にidしか表示されず、他の条件(たとえばemailとか)を入れたとしてもエラーを返されていました。
該当のコードはこちら。
import { Injectable } from '@nestjs/common' import { Prisma, User } from '@prisma/client' import { PrismaService } from '~/prisma/prisma.service' @Injectable() export class UsersService { constructor(private readonly prisma: PrismaService) {} // auth validateで使用 async findOrCreateBy(email: string): Promise<User> { return await this.prisma.user.upsert({ where: { email: email }, update: { email: email }, create: { email: email, name: 'test user' }, }) } }
ちな、Prisma公式を参考にしました。
上のままだと型のエラーが出ていたのでupsertの定義元の型を確認してみました。
すると…
/** * User upsert */ export type UserUpsertArgs = { /** * Select specific fields to fetch from the User * **/ select?: UserSelect | null /** * Choose, which related nodes to fetch as well. * **/ include?: UserInclude | null /** * The filter to search for the User to update in case it exists. * **/ where: UserWhereUniqueInput /** * In case the User found by the `where` argument doesn't exist, create a new User with this data. * **/ create: XOR<UserCreateInput, UserUncheckedCreateInput> /** * In case the User was found with the provided `where` argument, update it with this data. * **/ update: XOR<UserUpdateInput, UserUncheckedUpdateInput> } . . . export type UserWhereUniqueInput = { id?: string }
upsertのwhereに使われているのは UserWhereUniqueInput
で、この子を確認してみるとidしか型にない…
どういうこと!?
公式をもっとちゃんと見ましょう
そういうこと。
Upsertのところをもっとちゃんと見てみましょう。
↑のwhereのところに注目。
Wraps all unique fields of a model so that individual records can be selected
unique field
、これだわ。
もっとわかりやっすく書いてほしい…(切実)、せめて大文字とか。
解決
ということで、prisma.schemaにunique制約をかけて…
// User(ユーザー) model User { id String @id @default(dbgenerated("gen_random_uuid()")) @db.Uuid email String? @unique() @default("") phoneNumber String? @unique() @default("") @map("phone_number") companyName String? @default("") @map("company_name") address String? @default("") createdAt DateTime @default(now()) @map("created_at") @db.Timestamptz(6) updatedAt DateTime @default(now()) @map("updated_at") @db.Timestamptz(6) }
マイグレーションをかければ
$ npx prisma migrate dev --name add_unique --skip-seed
UserWhereUniqueInput
がこんな感じになりました。
export type UserWhereUniqueInput = { id?: string email?: string phoneNumber?: string }
ちゃんとUnique制約つけたカラムが追加されてました。
【docker】dockerコマンドにサブコマンドのcomposeを導入する
どうもてぃ。
もてぃ家に新たに家族が増えました。可愛らしい男の子です。
そして新居も引き渡され、やっと落ち着いてきた次第。
環境
% cat /etc/os-release NAME="Linux Mint" VERSION="19.3 (Tricia)" ID=linuxmint ID_LIKE=ubuntu PRETTY_NAME="Linux Mint 19.3" VERSION_ID="19.3" HOME_URL="https://www.linuxmint.com/" SUPPORT_URL="https://forums.linuxmint.com/" BUG_REPORT_URL="http://linuxmint-troubleshooting-guide.readthedocs.io/en/latest/" PRIVACY_POLICY_URL="https://www.linuxmint.com/" VERSION_CODENAME=tricia UBUNTU_CODENAME=bionic % docker -v Docker version 20.10.7, build 20.10.7-0ubuntu5~18.04.3
github公式のインストールコマンドを実行
こちらを参考。
ま、結論から言えば失敗です。
% docker compose version docker: 'compose' is not a docker command. See 'docker --help'
docker V2公式ドキュメントを見る
自分はubuntuを使っているので、ここを参照。
まんまここに書いてる通りで上手く行きました。公式 is best.
% docker compose version Docker Compose version v2.2.3
【docker】コンテナの再起動を通知したい
どうもてぃです。
Herokuのようにインスタンスを定期的に再起動したい。そんなことを思ったことはありませんか?僕だけですか?
自社サービスをコンテナで動かしているのですが、原因不明でVMにアクセスできなくなり、VMを再起動しコンテナも同じく再起動する…といったかなり良くない運用方法で進めていたので、コンテナを定期的に再起動して対応してみました(主な原因としては、workerのコンテナでredisと突然接続できなくなるものでした)。
環境
slack-dockerを使用する
当初はcronでコンテナを再起動したあと、slack通知用にスクリプトを組もうと考えていて、cron実行ユーザー用に環境を作ろうか…と思いましたがめんどくさくなり、
「え、これもコンテナでよくね?なんかimageあるやろ」
と思いしらべたらすぐに見つかりました。
slack-dockerコンテナにホスト側のdockerプロセスを同期し、更に通知したいwebhook urlを渡してあげるだけで通知が完了します。
slackのincoming webhookのURLは↓
https://my.slack.com/services/new/incoming-webhook
URLが出てきたら以下のコマンドを実行する。
$ docker run -d -e webhook="上で作ったincoming webhook url" -h "$(hostname)" -v /var/run/docker.sock:/var/run/docker.sock ghcr.io/int128/slack-docker
設定がうまくいくとchannelに通知が行きます
すばらしい...
IaaSでdockerを使う場合はこれを採用すると幸せになりますね(IaaSでコンテナ立てるのは微妙なんですがね)
【aws】vpcネットワークを作っていくメモ
VPCネットワーク
デフォルトVPC
設定名 | 設定内容 | 設定の割当最小単位 |
---|---|---|
VPC | デフォルトVPC全体のネットワークアドレス。範囲 172.31.0.0/16 | リージョン |
サブネット | 各AZに1つずつ設置。 [/20]のネットワークアドレスが割り当てられる。 | AZ |
ルートテーブル | VPCネットワークアドレス範囲内の通信はVPC内部へルーティング。それ以外はインターネットに向けたルーティング。 | サブネット |
インターネットゲートウェイ | インターネットへの接続用ゲートウェイが作成され、ルートテーブルに割り当てられている。 | VPC |
ネットワークACL | インバウンド・アウトバウンドともに全ての通信を許可 | サブネット |
セキュリティグループ | インバウンドは全ての通信を拒否、アウトバウンドは全ての通信を許可 | インスタンス |
- VPCネットワークアドレスは一度設定すると後から変更できないので注意
カスタムVPC
VPC → VPCを作成
で新規に作成する。
- テナンシーを専用にすると利用料が割高に
- 新規作成時、自動でルートテーブル・ネットワークACL・セキュリティグループが作成される
- EC2インスタンスでパブリックDNSを使用する場合は、DNSホスト名を有効化する
aws cli経由で作成
$ aws ec2 create-vpc --cidr-block 10.0.0.0/16 # Nameをつけたい場合 *******はVPC ID $ aws ec2 create-tags --resources vpc-*********** --tags Key=Name,Value=awscli # hostname 有効化 aws ec2 modify-vpc-attribute --vpc-id vpc-********* --enable-dns-hostnames
サブネット
大きなネットワークを複数の小さなネットワークに分割して管理する際の管理単位となるネットワークのこと。
VPC -> サブネット -> サブネット作成
で新規に作成する。
- ELBを作成する予定があるサブネットは余裕をもって
/24
以上のネットワーク範囲で作成すること
aws cli経由で作成
$ aws ec2 create-subnet --vpc-id vpc-*********** --availability-zone ap-northeast-1a --cidr-block 10.0.0.0/24 # tag Name作成(resource idは上記実行時に返ってくるsubnet-***********) $ aws ec2 create-tags --resources subnet-************ --tags Key=Name,Value=awscli
ルートテーブル
サブネット単位で設定することが出来る、サブネット内で稼働するEC2インスタンスのネットワークルーティングを制御する。
VPCネットワークを作成すると、自動的にルートテーブルも作成される。
VPC -> ルートテーブル -> ルートテーブルの作成
で新規に作成する。
aws cli経由で作成
$ aws ec2 create-route-table --vpc-id vpc-**************** # tag name $ aws ec2 create-tags --resources rtb-************* --tags Key=Name,Value=awscli
作成したサブネットとルートテーブルの関連付け
ルートテーブル -> 作成したルートテーブルを選択 -> サブネットの関連付け -> 編集 -> サブネットにチェック
でおk
作成したサブネットはVPC内の1つのルートテーブルに関連付ける必要がある。
- メインルートテーブルに自動的に関連付けされたサブネットはそのままにせず、明示的にルートテーブルと関連付けるようにする。
- メインルートテーブルを他のルートテーブルに変更した場合、明示的に関連付けていないサブネットは新たに設定したメインルートテーブルに関連付けられてしまい、それまで出来ていた通信ができなくなったり不要な通信が出来るようになったりする等の問題が発生するため。
- メインルートテーブルはできるだけ必要最低限のルーティング設定にしておく、VPCの内部通信のみ可能な設定から変更しないようにする
aws cli経由で作成
$ aws ec2 associate-route-table --route-table-id rtb-***************** --subnet-id subnet-******************
インターネットゲートウェイ
VPC内で稼働するEC2インスタンスがインターネットを通じて外部と通信する際に必要。EC2以外のリソースも同様で通信する際に必要。VPCごとに1つだけ紐付けが可能。
ルートテーブルのターゲットとして使用する。
VPC -> インターネットゲートウェイ -> インターネットゲートウェイの作成
で新規に作成する。
VPCと関連付ける
アクション -> VPCにアタッチ
で作成したVPCと関連付けられる。
aws cli経由で作成
$ aws ec2 create-internet-gateway # tag name(igw-******は上記実行時に取得) $ aws ec2 create-tags --resources igw-************ --tags Key=Name,Value=awscli-gateway # VPCへアタッチ $ aws ec2 attach-internet-gateway --internet-gateway-id igw-*********** --vpc-id vpc-**********
インターネットゲートウェイをルーティング先に指定する
aws cli経由で作成
# igw-*******/rtb-*********は先程作成したもの $ aws ec2 create-route --route-table-id rtb-*************** --destination-cidr-block 0.0.0.0/0 --gateway-id igw-***************** ````
【CSS】tips inputにフォーカスしたときborderの色を変える
どうもてぃ。
CSS力向上を願ってtips記事を書いていきたいと思います。
TL;DR
input:focus-visible { outline: 1px solid #ddd; } // もしくは input:focus { outline: 1px solid #ddd; }
inputを装飾している場合…
focus時にoutlineで強調すると、inputにborder-radiusを使っていた場合outlineがradius化してくれず若干違和感を感じる挙動になります。
そんなときは outline: none;
にしてbox-shadowで装飾しましょう。
See the Pen by motty (@motty93) on CodePen.
以上。
【vim】vim-prettierがPrettier: failed to parse bufferで動かないときに確認すること
どうもてぃ。
vim + JavaScript/TypeScriptで悩まされる日々が続いておりました。
が、とうとう決着をつけることが出来て感謝カンゲキ雨嵐です(何に?)
何がおきていたか
当方、vimmmmmmmmmmmmmmmmmmmmmerです。
フロントエンド開発で重要になってくるprettierのプラグイン、vim-prettierを使用しているのですが、いかんせん上手く動かない。
題名どおりのエラーがjs/jsx/tsファイルで起き、prettierが動かないという自体が起きてました(tsxファイルだと何故か動く)。
代替えとしてdense-analysis/aleを使用している人がいたりいなかったり。
自分の方でもaleを使用してprettierを掛けるのですが、以下のように楽しいことになります。
これがマジでムカつく。
最近は色んな所でjsを触る機会が増えてきたため、いい加減直そうと思い調査に走りました。
調査
同じように悩んでる方がたくさんいるようでした。
issue内で書かれてるものを自分の方で試してみても全く効果はなかったのでライブラリのオプションを確認していくことに。
試したこと その1
prettierの入っているプロジェクト内で:PrettierCliPath
で何が出てくるか確認。
これに関してはprettier
と返ってきたのでプロジェクト内のprettierが実行されてるっぽい。
もしかしたら、vim-prettier
のバグでプロジェクト内のprettierを認識できてない可能性がある…ということでglobalで使用しているprettierを使うようにオプション指定。
.vimrc
に下記を追加。
# which prettierで出てきたやつを指定 let g:prettier#exec_cmd_path = '/home/motty/.asdf/shims/prettier'
:PrettierCliPath
で上記パスが出てきたけど、:Prettier
は上手くいかない…。
予想が外れたので次。
試したこと その2
これが正解でした。
何事も解決は公式が書いてるだろうと、vim-prettier本体のドキュメントを見に行くことに。
ローカルにあるprettier.txt
を確認(自分のパスは/home/motty/.cache/dein/repos/github.com/prettier/vim-prettier/doc
でした)
と、自分の.vimrc
で設定してある項目に目がつきました。
" flow|babylon|typescript|css|less|scss|json|graphql|markdown or empty string " (let prettier choose). " default: '' let g:prettier#config#parser = ''
自分はparserをbabylon
を指定してました。以前、vim-prettierが動かなかったときにbabylonを指定したら上手く行ったからです。かなり安直な考え。
もしや…と思いdefault状態に戻すことに。以下自分のvim-prettier
設定です。
" vim-prettier call dein#add('prettier/vim-prettier', { \ 'do': 'yarn install', \ 'branch': 'release/1.x', \ 'for': [ \ 'javascript', \ 'typescript', \ 'typescriptreact', \ 'css', \ 'less', \ 'scss', \ 'json', \ 'graphql', \ 'vue', \ 'yaml', \ 'html' \]}) let g:prettier#autoformat = 0 let g:prettier#quickfix_enabled = 0 let g:prettier#config#semi = 'false' let g:prettier#config#single_quote = 'true' let g:prettier#config#bracket_spacing = 'true' let g:prettier#config#parser = '' let g:prettier#exec_cmd_path = '/home/motty/.asdf/shims/prettier' " autocmd BufWritePre *.js,*.jsx,*.ts,*.tsx,*.vue,*.css,*.scss,*.json PrettierAsync
:Prettier
を動かすと…
うまくいったぁぁぁああああああああああああああああああああああああああああああああああ
つーか、babylonのリポジトリはすでに4年前に開発終了してましたね。
babelのモノレポ化前の名残らしく、今は@babel/parser
として開発されているそうです。そら動かんわ。
終わり
色んなものを定期的にメンテナンスしましょう。
今年中にvimrcの整理/toml化へ向けてがんばります。ALEのムカつく問題も残ってますしね。