秘密鍵を無くしたマシンからRaspberry Pi 4にSSH接続できるように復旧する
(なんかタイトルの日本語おかしい気がする) 🔗
$ ssh [email protected]
[email protected]: Permission denied (publickey).
先日、Macが壊れてまっさらな状態からスタートしたので、Raspberry PiにSSH接続できなくなった
でもRaspberry Pi 4には、ディスプレイやキーボード、マウスも接続できるので慌てる必要ない
Raspberry Piにディスプレイ、キーボード、マウスを接続してパスワード認証を有効にしたら、ホストマシンから接続して公開鍵を登録してあげればOK
手順 🔗
Raspberry Piの電源を抜いて、HDMIケーブルを刺したら電源を付ける 🔗
HDMIケーブル刺して普通に映ったら省略可
付属のHDMIケーブルを刺してもディスプレイに映らなくて焦った
どうやらHDMIを刺さずに起動するとHDMI出力が有効にならないらしい
いつだかの停電でHDMIなしの状態で再起動したのが原因だと思う
電源抜くのはSDカード故障の可能性があって怖いけどこれはしょうがない
パスワード認証を有効にする 🔗
pi@raspberrypi:~ $ sudo vim /etc/ssh/sshd_config
# To disable tunneled clear text passwords, change to no here!
-PasswordAuthentication no
+# PasswordAuthentication no
pi@raspberrypi:~ $ sudo service ssh restart
ホストマシンからSSH接続する 🔗
$ ssh [email protected]
[email protected]'s password:
公開鍵を登録する 🔗
pi@raspberrypi:~ $ vim .ssh/authorized_keys
パスワード認証を無効にする 🔗
pi@raspberrypi:~ $ sudo vim /etc/ssh/sshd_config
# To disable tunneled clear text passwords, change to no here!
-# PasswordAuthentication no
+PasswordAuthentication no
pi@raspberrypi:~ $ sudo service ssh restart
確認 🔗
最後にパスワードなしでSSH接続できるか確認
Create React AppでTypeScriptとTailwind CSSの導入まで
そろそろReactもガッツリ触ろうと思って、Create React AppでTypeScriptとTailwind CSSの導入までやった
手順はTailwind CSSのドキュメントで
Install Tailwind CSS with Create React App - Tailwind CSS
環境 🔗
- macOS Big Sur 11.5.1
- zsh 5.8 (x86_64-apple-darwin20.0)
- Node.js: v16.7.0
- Yarn: 1.22.11
- create-react-app: 4.0.3
手順 🔗
Reactアプリを作成(TypeScriptで) 🔗
$ npx create-react-app sample-react-app --template typescript
$ cd sample-react-app
$ yarn start
Tailwind CSSのインストール 🔗
$ yarn add tailwindcss@npm:@tailwindcss/postcss7-compat @tailwindcss/postcss7-compat postcss@^7 autoprefixer@^9
エラー 🔗
もしZsh環境で以下のエラーがでたら、zsh: no matches found: postcss@^7 を解決する - ちこぐ を参照
zsh: no matches found: postcss@^7
CRACOのインストールと設定 🔗
Create React AppではPostCSSの設定を上書きすることができないので、CRACO (Create React App Configuration Override)をインストールする必要がある
Gemfileで指定するRubyバージョンを.ruby-versionから読み込む
【Rails】Webpacker + Yarnでnode_modulesを消したりしておかしくなったらtmp/cache/webpackerを消してみる
自信ないのでこれは自分用メモとする
フロント周りをいじっていてnode_modulesディレクトリを消したら、 yarn install
し直しても必要なパッケージが入ってくれなくなってしまった
Yarnは .yarn-integrity
と yarn.lock
を参照して、必要なパッケージがインストールされているかチェックしているみたい
node_modulesディレクトリ以下を削除して yarn install
してもインストールされないのは、 .yarn-integrity
で既にインストール済みと認識してしまってるかららしい
だけど、Railsプロジェクトのディレクトリに .yarn-integrity
なんてファイルは見つからないし、 yarn --check-files
や yarn --force
をしても解決しなかった
config/webpacker.ymlにキャッシュの場所が書いてあったので削除したらうまくいった
cache_path: tmp/cache/webpacker
$ rm -rf tmp/cache/webpacker
$ yarn install
参考 🔗
Gatsby製のブログにPixelaグラフをツールチップ付きで表示する
Pixelaグラフをツールチップ付きで表示する方法を見つけたので、さっそくブログ下部に表示させてみた
今までもSVG画像では表示させていて、ツールチップ付きで表示できたらいいなと思っていたところだった
草グラフを iframe タグで簡単に埋め込む(Pixela v1.12.1) - えいのうにっき
<iframe src="https://pixe.la/v1/users/a-know/graphs/test-graph.html?mode=simple" height="155" width="720" frameborder="0"></iframe>
手順 🔗
コンポーネントの作成 🔗
import React from "react"
const PixelaGraph = () => {
const userName = "takagi"
const graphId = "task-durations"
return (
<div className="pixela-graph">
<iframe src={`https://pixe.la/v1/users/${userName}/graphs/${graphId}.html?mode=simple`} title="pixela-graph" frameborder="0"></iframe>
</div>
)
}
export default PixelaGraph
スタイルの定義 🔗
レスポンシブに対応するため
.pixela-graph {
position: relative;
padding-bottom: 23%;
height: 0;
overflow: hidden;
}
.pixela-graph iframe {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
}
padding-bottom: 23%;
はアスペクト比
横720:縦155(1:0.2153)
正確には21.53%だけど、横幅を狭くするとズレが発生したのでいろいろ試して23%にした
作成したコンポーネントの読み込み 🔗
import React from "react"
import { Link } from "gatsby"
+import PixelaGraph from "../components/pixela-graph"
import { rhythm } from "../utils/typography"
const Layout = ({ location, title, children }) => {
@@ -61,7 +61,7 @@ const Layout = ({ location, title, children }) => {
<header>{header}</header>
<main>
{children}
+ <PixelaGraph />
</main>
<footer>
© {new Date().getFullYear()}, Built with
確認 🔗
マウスオーバーでちゃんとツールチップも表示された!
【Mac】goenvでGoをインストールする
Goをちょっと書くことになったので、goenv
でインストールした
名前からわかるようにrbenvやpyenvを真似して作ってるみたいで、基本的に使い方は同じ
Goは後方互換性が担保されているからHomeBrewで最新バージョンに上げ続ければいいらしいけど、バージョン管理できた方が何かと楽なのでgoenvを使った
環境 🔗
- macOS Big Sur 11.5.1
- zsh 5.8 (x86_64-apple-darwin20.0)
手順 🔗
goenv/INSTALL.md に書いてある手順
goenvのインストール 🔗
goenvはHomebrewでもインストールできるけど、Goの最新バージョンを取得できないことがあるっぽいのでgitから落としてくる方法を選んだ
git clone 🔗
$ git clone https://github.com/syndbg/goenv.git ~/.goenv
パスを通す 🔗
$ vim ~/.zshrc
以下の5行を追記
export GOENV_ROOT="$HOME/.goenv"
export PATH="$GOENV_ROOT/bin:$PATH"
eval "$(goenv init -)"
export PATH="$GOROOT/bin:$PATH"
export PATH="$PATH:$GOPATH/bin"
$ source ~/.zshrc
確認 🔗
$ goenv -v
goenv 2.0.0beta11
Goのインストール 🔗
インストール可能なバージョンを確認 🔗
$ goenv install -l
Available versions:
1.2.2
1.3.0
1.3.1
...
1.17.1
1.17.2
インストールとシステム全体に反映 🔗
現時点で最新の1.17.2を入れる
$ goenv install 1.17.2
$ goenv global 1.17.2
確認 🔗
$ go version
go version go1.17.2 darwin/amd64
参考 🔗
【Cloud Functions】Functions Framework for Rubyを試す(環境変数を扱う編)
今回はCloud Functionsで環境変数を扱ってみる
(パスワードなどの秘匿情報はSecret Manager
を使うべし)
手順 🔗
環境変数 FUNCTION_ENV の設定を試してみる
コード 🔗
FunctionsFramework.http("env_vars") do |request|
"FUNCTION_ENV: #{ENV['FUNCTION_ENV']}\n"
end
RubyではENVで環境変数を呼び出すことができる
ローカルで実行 🔗
$ FUNCTION_ENV=development bundle exec functions-framework-ruby --target env_vars
$ curl http://localhost:8080
FUNCTION_ENV: development
デプロイ 🔗
--set-env-vars
で環境変数を設定することができる
$ gcloud functions deploy env_vars --runtime ruby27 --trigger-http --set-env-vars FUNCTION_ENV=production
$ curl https://us-central1-masamune-287217.cloudfunctions.net/env_vars
FUNCTION_ENV: production
補足 🔗
複数の環境変数を設定する 🔗
FunctionsFramework.http("env_vars") do |request|
"ENV_VAR_A: #{ENV['ENV_VAR_A']}, ENV_VAR_B: #{ENV['ENV_VAR_B']}\n"
end
カンマ区切りで複数の環境変数を設定できる
$ gcloud functions deploy env_vars --set-env-vars ENV_VAR_A=foo,ENV_VAR_B=bar
$ curl https://us-central1-masamune-287217.cloudfunctions.net/env_vars
ENV_VAR_A: foo, ENV_VAR_B: bar
一部の環境変数を更新・追加する 🔗
--update-env-vars
で更新・追加ができる
$ gcloud functions deploy env_vars --update-env-vars ENV_VAR_B=baz
$ curl https://us-central1-masamune-287217.cloudfunctions.net/env_vars
ENV_VAR_A: foo, ENV_VAR_B: baz
--set-env-vars
だと指定していない環境変数は消えてしまう 🔗
ENV_VAR_Bだけ指定した場合、ENV_VAR_Aは消えてしまうので注意
Terraformのタブ補完を有効にする
環境 🔗
CentOS 7 + Bash + tfenv
手順 🔗
if type terraform &> /dev/null; then
complete -C terraform terraform
fi
$ source ~/.bashrc
補足 🔗
$ terraform -install-autocomplete
$ source ~/.bashrc
公式ドキュメント に載っているやり方でもいいけど、
complete -C /home/vagrant/.tfenv/versions/1.0.8/terraform terraform
こんな感じでバージョン指定されるので、新たにサブコマンド追加されたバージョンに上げた場合は再設定が必要になる
参考 🔗
Terraform completion 🌎. テラフォーミングを少しだけ楽にする | by Atsushi Nakajo | Medium
【Ruby】Fakerを使ってダミーデータを作成する
ちょっとした検証で大規模なダミーデータのCSVファイルが欲しかった
よくあるダミーデータ生成サービスだと1万行くらいまでしか対応してなかったりするので、RubyでFaker
というGemを使ってスクリプトを書いてダミーデータを作った
ダミーデータの中身は名前、年齢、メールアドレスの3項目で1000万行
require 'bundler/inline'
require 'csv'
gemfile do
source 'https://rubygems.org'
gem 'faker'
end
CSV.open('./dummy.csv', 'w') do |csv|
csv << ['name', 'age', 'email']
10000000.times do
csv << ["#{Faker::Name.first_name} #{Faker::Name.last_name}", rand(18..80), Faker::Internet.email]
end
end
$ head dummy.csv
name,age,email
Kimberely Grimes,25,[email protected]
Juliann Waelchi,21,[email protected]
Hershel Pfannerstill,22,[email protected]
Carson Reynolds,32,[email protected]
Walter Koch,33,[email protected]
Rob Kuphal,48,[email protected]
Lawerence Dietrich,72,[email protected]
Hubert VonRueden,50,[email protected]
Harry Pacocha,56,[email protected]
$ wc -l dummy.csv
10000001 dummy.csv
ヘッダーの1行を除いて1000万行出来ている
$ time ruby app.rb
ruby app.rb 5707.99s user 25.91s system 63% cpu 2:29:51.79 total
ちなみに1時間半くらい掛かった
どうせなら高速化にチャレンジして記事にしたらよかったけどまあいいや
Ruby 2.6からirbはGem化されたので、Gemfileに記述しないと「bundle exec irb」は使えない
タイトルがすべて
Ruby 2.5までのirbは標準ライブラリだったが、Ruby 2.6でGem化されたらしい
プレーンなRubyプロジェクトで「bundle exec irb」が起動できなくてびっくりした
Ruby 2.7も出て、もうRuby 3系も出ているのでかなり今更だけど
$ bundle exec irb
bundler: failed to load command: irb (/Users/ytkg/.rbenv/versions/2.7.4/bin/irb)
Traceback (most recent call last):
16: from /Users/ytkg/.rbenv/versions/2.7.4/bin/bundle:23:in `<main>'
15: from /Users/ytkg/.rbenv/versions/2.7.4/bin/bundle:23:in `load'
14: from /Users/ytkg/.rbenv/versions/2.7.4/lib/ruby/gems/2.7.0/gems/bundler-2.2.28/exe/bundle:37:in `<top (required)>'
13: from /Users/ytkg/.rbenv/versions/2.7.4/lib/ruby/gems/2.7.0/gems/bundler-2.2.28/lib/bundler/friendly_errors.rb:128:in `with_friendly_errors'
12: from /Users/ytkg/.rbenv/versions/2.7.4/lib/ruby/gems/2.7.0/gems/bundler-2.2.28/exe/bundle:49:in `block in <top (required)>'
11: from /Users/ytkg/.rbenv/versions/2.7.4/lib/ruby/gems/2.7.0/gems/bundler-2.2.28/lib/bundler/cli.rb:25:in `start'
10: from /Users/ytkg/.rbenv/versions/2.7.4/lib/ruby/gems/2.7.0/gems/bundler-2.2.28/lib/bundler/vendor/thor/lib/thor/base.rb:485:in `start'
9: from /Users/ytkg/.rbenv/versions/2.7.4/lib/ruby/gems/2.7.0/gems/bundler-2.2.28/lib/bundler/cli.rb:31:in `dispatch'
8: from /Users/ytkg/.rbenv/versions/2.7.4/lib/ruby/gems/2.7.0/gems/bundler-2.2.28/lib/bundler/vendor/thor/lib/thor.rb:392:in `dispatch'
7: from /Users/ytkg/.rbenv/versions/2.7.4/lib/ruby/gems/2.7.0/gems/bundler-2.2.28/lib/bundler/vendor/thor/lib/thor/invocation.rb:127:in `invoke_command'
6: from /Users/ytkg/.rbenv/versions/2.7.4/lib/ruby/gems/2.7.0/gems/bundler-2.2.28/lib/bundler/vendor/thor/lib/thor/command.rb:27:in `run'
5: from /Users/ytkg/.rbenv/versions/2.7.4/lib/ruby/gems/2.7.0/gems/bundler-2.2.28/lib/bundler/cli.rb:478:in `exec'
4: from /Users/ytkg/.rbenv/versions/2.7.4/lib/ruby/gems/2.7.0/gems/bundler-2.2.28/lib/bundler/cli/exec.rb:23:in `run'
3: from /Users/ytkg/.rbenv/versions/2.7.4/lib/ruby/gems/2.7.0/gems/bundler-2.2.28/lib/bundler/cli/exec.rb:58:in `kernel_load'
2: from /Users/ytkg/.rbenv/versions/2.7.4/lib/ruby/gems/2.7.0/gems/bundler-2.2.28/lib/bundler/cli/exec.rb:58:in `load'
1: from /Users/ytkg/.rbenv/versions/2.7.4/bin/irb:23:in `<top (required)>'
/Users/ytkg/.rbenv/versions/2.7.4/bin/irb:23:in `load': cannot load such file -- /Users/ytkg/.rbenv/versions/2.7.4/lib/ruby/gems/2.7.0/specifications/default/exe/irb (LoadError)
使えるようにする方法 🔗
Gemfileに追加すればよい
scpをやめてrsyncを使うための予習
リモートサーバーからファイルを持ってくる時にいつもscpコマンドを使っていたけど、scpコマンドは非推奨かつ時代遅れで今はrsyncコマンドがいいらしい
rsyncはアプリケーションをデプロイする時のコマンドの中で動いてるのを見かけたくらいでよくわかってない
ファイルのコピーというよりは同期のイメージだった
すぐすぐrsyncに移行というわけではないけど、scpでよく使うパターンだけ予習しておく
scpとrsyncのコマンドの違い 🔗
ファイル単体のコピーとディレクトリごとコピーの2つのパターンを確認する
事前準備 🔗
リモートサーバーに以下のような構造でディレクトリとファイルを用意しといた
$ tree .
.
└── sample_dir
└── sample_file.txt
1 directory, 1 file
ファイル単体のコピー 🔗
$ scp [email protected]:~/sample_dir/sample_file.txt ./
$ rsync [email protected]:~/sample_dir/sample_file.txt ./
ディレクトリごとコピー 🔗
$ scp -r [email protected]:~/sample_dir ./
$ rsync -r [email protected]:~/sample_dir ./
まとめ 🔗
基本一緒だった
唯一違うところは、-rを付けた時にディレクトリ名の後にスラッシュがある場合
$ scp -r [email protected]:~/sample_dir/ ./
$ ls
sample_dir
$ rsync -r [email protected]:~/sample_dir/ ./
$ ls
sample_file.txt
scpはスラッシュを付けてもディレクトリごとコピーされるが、rsyncはディレクトリ内のファイルがコピーされる
参考 🔗
Cloud SQL Auth Proxyを使ってCloud SQLにローカルから接続する
環境(前提条件?) 🔗
- ローカル環境はCentOS 7を使用している
- Cloud SQLはMySQLのインスタンスを起動している
- 認証周りは整っている(gcloudコマンドが使えている)
手順 🔗
Cloud SQL Auth Proxyのインストール 🔗
$ sudo wget https://dl.google.com/cloudsql/cloud_sql_proxy.linux.amd64 -O /usr/local/bin/cloud_sql_proxy
$ sudo chmod +x /usr/local/bin/cloud_sql_proxy
$ cloud_sql_proxy -version
Cloud SQL Auth proxy: 1.25.0+linux.amd64
これはCentOS 7の場合なので、他のOSはここ を参照
Cloud SQL Auth Proxyを起動 🔗
$ cloud_sql_proxy -instances=hogehoge-project:asia-northeast1:hogehoge-instance=tcp:13306
# cloud_sql_proxy -instances=インスタンスの接続名=tcp:ポート番号
ポート番号は3306でも良いが、別で使っていたので13306にした
インスタンスの接続名の確認方法 🔗
- Cloud SQL の [インスタンス] ページ に移動
- インスタンス名をクリックして [概要] ページを開く
- [このインスタンスと接続] セクションで接続名をコピー(接続名のフォーマット:
projectID:region:instanceID
)
MySQLに接続 🔗
$ mysql -u root -h 127.0.0.1 -p -P 13306
【Cloud Functions】Functions Framework for Rubyを試す(GitHub Actionsからデプロイ編)
前回書いた「【Cloud Functions】Functions Framework for Rubyを試す(ローカルからデプロイ編) 」の続きで、今回はGitHub Actionsからデプロイしてみる
手順 🔗
サービスアカウントの作成 🔗
以下URLからサービスアカウント作成し、「Cloud Functions 開発者」のロールを付与する https://console.cloud.google.com/projectselector2/iam-admin/serviceaccounts/create
サービスアカウントキーをダウンロードして、そのJSONをGitHub Secretsに「GCP_SA_KEY」というキー名で登録する
ワークフローファイルの作成 🔗
$ mkdir .github/workflows
$ vim .github/workflows/deploy.yml
mainブランチにプッシュもしくはマージされたらデプロイが走る設定
name: Deploy
on:
push:
branches: [ main ]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: google-github-actions/deploy-cloud-functions@main
with:
credentials: ${{ secrets.GCP_SA_KEY }}
name: hello
runtime: ruby27
動作確認 🔗
デプロイができているかわかるようにコードを書き換えておく
require "functions_framework"
FunctionsFramework.http("hello") do |request|
- "Hello, world!\n"
+ "Hello, world! (Deploy from GitHub Actions)\n"
end
プッシュしたあと、ghコマンドで実行中のワークフローを確認する
$ git push
$ gh run watch
Refreshing run status every 3 seconds. Press Ctrl+C to quit.
✓ main Deploy · 1246588184
Triggered via push about 20 hours ago
JOBS
✓ deploy in 1m6s (ID 3640768767)
✓ Set up job
✓ Run actions/checkout@v2
✓ Run google-github-actions/deploy-cloud-functions@main
✓ Post Run actions/checkout@v2
✓ Complete job
✓ Run Deploy (1246588184) completed with 'success'
curlで叩いてデプロイができているか確認する
【Cloud Functions】Functions Framework for Rubyを試す(ローカルからデプロイ編)
前回書いた「【Cloud Functions】Functions Framework for Rubyを試す(ローカル編) 」の続きで、今回はCloud Functionsにデプロイしてみる
手順 🔗
Cloud Functions APIとCloud Build APIを有効化 🔗
$ gcloud services enable cloudfunctions.googleapis.com
$ gcloud services enable cloudbuild.googleapis.com
デプロイ 🔗
gcloud functions deploy [関数の登録名] --entry-point [ソースコード内の関数またはクラスの名前] --runtime [使用するランタイムの名前] [関数のトリガーの種類]
$ gcloud functions deploy hello_function --entry-point hello --runtime ruby27 --trigger-http
Ruby 2.7
のランタイムに HTTP
リクエストをトリガーする hello
関数を hello_function
という登録名でデプロイする
新しい関数を登録する場合は確認がある 🔗
Allow unauthenticated invocations of new function [hello_function]?
(y/N)?
動作確認 🔗
$ curl https://us-central1-hogehoge-123456.cloudfunctions.net/hello_function
Hello, world!
再デプロイ 🔗
コードを修正して再デプロイする場合、--runtime
と--trigger-http
は変更が無ければ省略できる
$ gcloud functions deploy hello_function --entry-point hello
$ curl https://us-central1-hogehoge-123456.cloudfunctions.net/hello_function
Hello, world! (Take 2)
補足 🔗
–entry-pointは省略できる 🔗
ソースコードの関数名と登録名を同じにする場合は省略できる
むしろ、–entry-pointは異なる時に使用する為のフラグかも
MySQLをDockerで起動してホストから接続する方法
データベースだけDockerで起動したい時がたまにあるけど、覚えてなくて都度調べるからメモ
手順 🔗
起動 🔗
$ docker run -it -e MYSQL_ALLOW_EMPTY_PASSWORD=true -p 13306:3306 -d mysql:5.7
他で使っていることがあるからポートを13306にしている
起動確認 🔗
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
66381dec4a53 mysql:5.7 "docker-entrypoint.s…" 11 seconds ago Up 10 seconds 33060/tcp, 0.0.0.0:13306->3306/tcp crazy_feistel
接続 🔗
$ mysql -u root -h 127.0.0.1 -P 13306
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.35 MySQL Community Server (GPL)
Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
停止 🔗
$ docker stop 66381dec4a53
Twitter APIのレートリミット情報を取得する(Rubyで)
Twitter APIを使った機能の開発をしている時、何度もAPIを叩くのであとどれくらい叩けるのか気になる
しかし、レートリミット情報を取得できるエンドポイントは用意されているが、使っているtwitter gem
にはそのメソッドが用意されてないので自前で用意するしかない
Why was Twitter::API#rate_limit_status removed? · Issue #430 · sferik/twitter
ちゃんと経緯を全て読んだわけではないけど、「Twitter::Error:TooManyRequestsでrescueしてあげればよくない?」らしい
メソッドを用意しない理由にはなっていないような。。。
実装 🔗
任意のエンドポイントが叩けるTwitter::REST::Request
クラスが用意されているので実装は簡単
見やすいようにformatador gem
を使ってテーブルフォーマットで出力する
require 'bundler/inline'
gemfile do
source 'https://rubygems.org'
gem 'twitter'
gem 'formatador'
end
client = Twitter::REST::Client.new do |config|
config.consumer_key = "YOUR_CONSUMER_KEY"
config.consumer_secret = "YOUR_CONSUMER_SECRET"
config.access_token = "YOUR_ACCESS_TOKEN"
config.access_token_secret = "YOUR_ACCESS_SECRET"
end
response = Twitter::REST::Request.new(client, :get, '/1.1/application/rate_limit_status.json').perform
rate_limit_status = response[:resources].values.each_with_object([]) do |endpoints, array|
endpoints.each do |endpoint, values|
array.push(
endpoint: endpoint,
limit: values[:limit],
remaining: values[:remaining],
reset: Time.at(values[:reset])
)
end
end
Formatador.display_table(rate_limit_status)
$ ruby app.rb
+-------------------------+--------+-----------+---------------------------+
| endpoint | limit | remaining | reset |
+-------------------------+--------+-----------+---------------------------+
| /lists/list | 15 | 15 | 2021-09-11 19:37:14 +0900 |
+-------------------------+--------+-----------+---------------------------+
| /lists/memberships | 75 | 75 | 2021-09-11 19:37:14 +0900 |
+-------------------------+--------+-----------+---------------------------+
| /lists/subscribers/show | 15 | 15 | 2021-09-11 19:37:14 +0900 |
+-------------------------+--------+-----------+---------------------------+
...
+-------------------------+--------+-----------+---------------------------+
| /trends/place | 75 | 75 | 2021-09-11 19:37:14 +0900 |
+-------------------------+--------+-----------+---------------------------+
| /live_pipeline/events | 180 | 180 | 2021-09-11 19:37:14 +0900 |
+-------------------------+--------+-----------+---------------------------+
| /graphql | 15 | 15 | 2021-09-11 19:37:14 +0900 |
+-------------------------+--------+-----------+---------------------------+
消費されているエンドポイントのみ表示 🔗
全エンドポイントが出力されても見づらいので、消費されているエンドポイントだけ出力させる
【Ruby】簡単なスクリプトを書くならGemfileが不要になるbundler/inlineが便利
bundler/inline
を使えば、「Gemfileを作ってbundle installして」をやらなくても済む
やり方 🔗
require 'bundler/inline'
gemfile do
source 'https://rubygems.org'
gem 'twitter'
end
client = Twitter::REST::Client.new do |config|
config.consumer_key = "YOUR_CONSUMER_KEY"
config.consumer_secret = "YOUR_CONSUMER_SECRET"
config.access_token = "YOUR_ACCESS_TOKEN"
config.access_token_secret = "YOUR_ACCESS_SECRET"
end
user = client.user('takagi_blog')
puts "id: #{user.id}"
puts "name: #{user.name}"
puts "screen_name: #{user.screen_name}"
$ ruby app.rb
id: 1313842761204867072
name: 高木のブログ
screen_name: takagi_blog
使い道 🔗
ブログにサンプルコードを載せる時や、Issueにバグ等の再現手順を載せる時に使える
たまたまこのIssueを見て、bundler/inline
の存在を知った
Improve performance for `Mysql2::Client#xquery` by kamipo · Pull Request #9 · tagomoris/mysql2-cs-bind
参考 🔗
bundler/inline (Gemfileの内容をプログラム中にインラインで書くための方法について) - Qiita
herokuコマンドでアプリの指定(--app yourappname)を省略する
git cloneをやり直したり、別環境だったりでherokuコマンドを使う時は以下のように--app
オプションでアプリ名を指定する必要がある
$ heroku log --app yourappname
いちいち指定するのは面倒なのでそれを省略するやり方
手順 🔗
$ heroku git:remote -app yourappname
.git/configに設定が追加されるので、都度アプリ名を指定しなくてもよくなる
[remote "heroku"]
url = https://git.heroku.com/yourappname.git
fetch = +refs/heads/*:refs/remotes/heroku/*
参考 🔗
【Cloud Functions】Functions Framework for Rubyを試す(ローカル編)
業務でCloud Functionsを触ることになったので予習をする
Ruby用にフレームワーク(Functions Framework for Ruby
)が用意されているのでそれを使う
今回はREADME.md
に書いてあるQuickstartを試して、さらにテストコードも書いてみる
Quickstart 🔗
必要なファイルを作成 🔗
Gemfileとapp.rb
source "https://rubygems.org"
gem "functions_framework", "~> 1.0"
require "functions_framework"
FunctionsFramework.http("hello") do |request|
"Hello, world!\n"
end
「Hello, world!」と返すhello関数
サーバー起動 🔗
$ bundle install
$ bundle exec functions-framework-ruby --target hello
I, [2021-08-19T02:55:33.358268 #65163] INFO -- : FunctionsFramework v1.0.0
I, [2021-08-19T02:55:33.358312 #65163] INFO -- : FunctionsFramework: Loading functions from "./app.rb"...
I, [2021-08-19T02:55:33.358474 #65163] INFO -- : FunctionsFramework: Looking for function name "hello"...
I, [2021-08-19T02:55:33.358490 #65163] INFO -- : FunctionsFramework: Starting server...
I, [2021-08-19T02:55:33.407831 #65163] INFO -- : FunctionsFramework: Serving function "hello" on port 8080...
8080番ポートでhello関数のサーバーが立ち上がった
【Deno】Deno Deployで動かすアプリの開発メモ
前にDeno Deployを試した記事(Deno Deployを試してみた
)を書いたけど、開発の部分を書いてなくてちょっとしたものをサクッと作ろうとした時に困ったのでメモしておく
まあこのくらいなら公式ドキュメントを見ればいいのだけど
CLI 🔗
ローカルで開発する時はdeployctl
というCLIを使用する
インストール 🔗
$ deno install --allow-read --allow-write --allow-env --allow-net --allow-run --no-check -f https://deno.land/x/deploy/deployctl.ts
✅ Successfully installed deployctl
/Users/ytkg/.deno/bin/deployctl
$ deployctl --version
deployctl 0.3.0
サーバー起動 🔗
コードに変更があったらリロードしてくれるので、--watch
オプションはつけておいた方が良い
$ deployctl run --watch app.js
Listening on http://0.0.0.0:8080
コード 🔗
シンプルに文字列でユーザーエージェントを返すサンプルコード
function handleRequest(request) {
const userAgent = request.headers.get("user-agent");
return new Response(`User Agent: ${userAgent}\n`, {
headers: { "content-type": "text/plain" },
});
}
addEventListener("fetch", (event) => {
event.respondWith(handleRequest(event.request));
});
$ curl localhost:8080
User Agent: curl/7.64.1
【GCP】Secret Managerを試す
GCPのサービス内でパスワードやAPIキーなどの機密情報を扱うなら必須のSecret Manager
とりあえず最低限必要な機能を試してみた記録
コマンドラインからシークレットの追加と取得と更新 🔗
Secret Manager APIを有効化 🔗
$ gcloud services enable secretmanager.googleapis.com
シークレットの追加 🔗
secret-sample
という名前で、値はP@ssw0rd
を追加する
$ echo "P@ssw0rd" | gcloud secrets create secret-sample --data-file=-
Created version [1] of the secret [secret-sample].
シークレットの取得 🔗
$ gcloud secrets versions access latest --secret='secret-sample'
P@ssw0rd
シークレットの更新(バージョンの追加) 🔗
シークレットの更新は、バージョンを追加する
$ echo "p@SSw0RD" | gcloud secrets versions add secret-sample --data-file=-
Created version [2] of the secret [secret-sample].
$ gcloud secrets versions access latest --secret='secret-sample'
p@SSw0RD
過去バージョンのシークレットの取得 🔗
latest
の部分を取得したいバージョンに変更(例では1
)
$ gcloud secrets versions access 1 --secret='secret-sample'
P@ssw0rd
Rubyのコードからシークレットの取得 🔗
実際に使うのはCloud Functionsだったりのアプリケーション内なので、Rubyのコードからシークレットの取得を試す
サービスアカウントの作成 🔗
以下URLからサービスアカウント作成し、「Secret Manager のシークレット アクセサー」のロールを付与する https://console.cloud.google.com/projectselector2/iam-admin/serviceaccounts/create
ZshでPreztoを導入してテーマをredhatにしたら、出力結果の改行無し最終行が表示されなくなった
問題 🔗
タイトル通りで、Zsh使いになってZshフレームワークのPreztoを導入したら出力結果の改行無し最終行が表示されなくなった
自分は文字列を返すAPIをCurlで叩いた時に起きたけど、わかりやすいようにここではechoで例を示す
問題の出力例 🔗
[ytkg@TAKAGInoMacBook-Pro ~]$ echo -n "Hello\nWorld"
Hello
[ytkg@TAKAGInoMacBook-Pro ~]$
理想の出力例 🔗
[ytkg@TAKAGInoMacBook-Pro ~]$ echo -n "Hello\nWorld"
Hello
World[ytkg@TAKAGInoMacBook-Pro ~]$
原因 🔗
プロンプトの設定で、PROMPT_CRがONでPROMPT_SPがOFFになっているからっぽい
その組み合わせだとどうしてダメなのか、そもそもPROMPT_CRとPROMPT_SPは何なのかは割愛する
$ set -o | sed -e 's/^no\(.*\)on$/\1 off/' -e 's/^no\(.*\)off$/\1 on/' |grep -E "prompt(cr|sp)"
promptcr on
promptsp off
ちなみにZshのデフォルトは両方ともONらしいけど、redhatの場合、PROMPT_CRのみONにする設定になっていた
- https://zsh.sourceforge.io/Doc/Release/Options.html#Prompting
- zsh/prompt_redhat_setup at 00d20ed15e18f5af682f0daec140d6b8383c479a · zsh-users/zsh
解決方法 🔗
~/.zshrcにPROMPT_CRをOFFにする設定を追加する
unsetopt prompt_cr
$ source ~/.zshrc
$ set -o | sed -e 's/^no\(.*\)on$/\1 off/' -e 's/^no\(.*\)off$/\1 on/' |grep -E "prompt(cr|sp)"
promptcr off
promptsp off
[ytkg@TAKAGInoMacBook-Pro ~]$ echo -n "Hello\nWorld"
Hello
World[ytkg@TAKAGInoMacBook-Pro ~]$
理想の出力になった
ZshフレームワークのPreztoを導入
Zsh使いになったので、ZshフレームワークのPrezto を導入してみた
手順 🔗
リポジトリをclone 🔗
% git clone --recursive https://github.com/sorin-ionescu/prezto.git "${ZDOTDIR:-$HOME}/.zprezto"
既存の設定ファイルを退避 🔗
次のステップで設定ファイルのシンボリックリンクを貼るので退避させておく
% mv ~/.zshrc ~/.zshrc.bk
他にも.zlogin .zlogout .zprofile .zshenvがあったら同様に退避させる
設定ファイルを作成 🔗
% setopt EXTENDED_GLOB
for rcfile in "${ZDOTDIR:-$HOME}"/.zprezto/runcoms/^README.md(.N); do
ln -s "$rcfile" "${ZDOTDIR:-$HOME}/.${rcfile:t}"
done
設定ファイルのシンボリックリンクができている
% ls -la | grep zprezto/runcoms
lrwxr-xr-x 1 ytkg staff 35 8 16 23:42 .zlogin -> /Users/ytkg/.zprezto/runcoms/zlogin
lrwxr-xr-x 1 ytkg staff 36 8 16 23:42 .zlogout -> /Users/ytkg/.zprezto/runcoms/zlogout
lrwxr-xr-x 1 ytkg staff 38 8 16 23:42 .zpreztorc -> /Users/ytkg/.zprezto/runcoms/zpreztorc
lrwxr-xr-x 1 ytkg staff 37 8 16 23:42 .zprofile -> /Users/ytkg/.zprezto/runcoms/zprofile
lrwxr-xr-x 1 ytkg staff 35 8 16 23:42 .zshenv -> /Users/ytkg/.zprezto/runcoms/zshenv
lrwxr-xr-x 1 ytkg staff 34 8 16 23:42 .zshrc -> /Users/ytkg/.zprezto/runcoms/zshrc
Zshを再起動 🔗
Preztoが適用されている
HomeBrew Bundler(Brewfile)でHomeBrewで入れるソフトを管理する
Homebrew Bundleを使えば、BrewfileというファイルでHomeBrewで入れるソフトを管理できるらしい
Brewfileをdotfilesリポジトリで管理しておけば、Macを初期化した時もセットアップが楽ちんになる
ちょうどMacが壊れてしまって最初からいろいろ入れ直している最中で、これからはBrewfileで管理していくことにした
手順 🔗
現在の環境からBrewfileを作成する 🔗
brew bundke dump
コマンドで現在の環境からBrewfileを作成できる
既にいくつか入れているのでこれができるのはありがたい
% brew bundle dump
Updating Homebrew...
==> Auto-updated Homebrew!
Updated 1 tap (homebrew/core).
==> Updated Formulae
Updated 10 formulae.
==> Tapping homebrew/bundle
Cloning into '/usr/local/Homebrew/Library/Taps/homebrew/homebrew-bundle'...
remote: Enumerating objects: 6199, done.
remote: Counting objects: 100% (377/377), done.
remote: Compressing objects: 100% (225/225), done.
remote: Total 6199 (delta 172), reused 329 (delta 149), pack-reused 5822
Receiving objects: 100% (6199/6199), 1.44 MiB | 9.88 MiB/s, done.
Resolving deltas: 100% (3595/3595), done.
Tapped 1 command (98 files, 1.8MB).
tap "homebrew/bundle"
tap "homebrew/core"
brew "git"
brew "tmux"
新たにソフトをインストールする 🔗
試しにrbenvとruby-buildをインストールしてみる
MacにプリインストールされているGitをHomeBrewで入れ直す
MacにプリインストールされているGitは古いのでHomeBrewで最新バージョンを入れる
% git --version
git version 2.30.1 (Apple Git-130)
プリインストールされているGitの場合、バージョンを確認した時にApple Git
と表示される
手順 🔗
インストール 🔗
% brew install git
パスを通す 🔗
別でまだパスを通していなかったらパスを通す
+ export PATH="/usr/local/bin:$PATH"
% source ~/.zshrc
確認 🔗
% git --version
git version 2.32.0
バージョンを上げる方法 🔗
一度HomeBrewで入れてしまえば最新バージョンへのアップグレードは簡単
% brew upgrade git
いつからかのHomeBrewのバージョンから最新バージョンしか保持しなくなったみたいで、バージョンを指定してのアップグレードやダウングレードはできなくなったっぽい