BacklogAPIの課題追加でUrlFetchApp.fetchして出会ったエラー集
BacklogAPI便利ですよね。
APIを使う上で色々出くわしたエラーとそのときの対応策
①URL長すぎ
Exception: 上限を超えています: URLFetch URL の長さ
URLが2KB超えると、エラーになる。
テンプレの内容を課題の詳細に設定したりすると超えたりする。
URLが長い原因として、URLにパラメータ付与してGETリクエストにしていることがある。
GETリクエストではなく、POSTに切り替える。
②項目ないっすよ
muteHttpExceptions: true
にして、返ってきたレスポンス
400 "errors":[{"message":"Expect [項目名].","code":7,""}
必須項目がないですよと言われている。
確かに設定していない、という場合は、リクエストに[項目名]を追加する。
[項目名]リクエストに含んでるのになぁ、って時は、Content-Type
でしている形式とリクエストの形式が正しいかチェック(無駄にここで詰まってしまった)
"Content-Type" : "application/x-www-form-urlencoded"
なのに、JSON形式で送ろうとしてしまってた。
developer.mozilla.org
③形式違うっすよ
400 "errors":[{"message":"error.invalid : [項目名]","code":7,"moreInfo":"[項目名] requires number. Raw input: [値].0"}
修正している間に出てきたエラーで、UrlFetchApp.fetchはなぜか整数じゃなくて小数点第一位付きに変換するみたい。というのが分かっただけの例
これ自体がエラーの課題ではなかったが、一応メモとして残す。
URL指定して画面キャプチャを一括で作成
CLIで画面キャプチャとるんです
chromeのヘッドレススクリーンショット優秀すぎてびっくり
Firefoxもあるそう。。今回はchromeで。
"C:\Program Files\Google\Chrome\Application\chrome.exe" --headless --disable-gpu --screenshot=[画像フォルダ/画像名].png --window-size=1280,1696 [画面キャプチャ撮りたいURL]
URLがあれば、全部すぐに撮れる。
Basic認証かかってるやつはhttps://[ユーザー名]:[パスワード]@www.xxx.com/hogehoge/
で。
フルフルとれないところが課題。
ここからは結構大変だったので、やる気元気モリワキじゃない人は離脱で。
API使って画面キャプチャフルフルとる
Davidさんのブログを参考に、と書いてあるので試みる
→ 壁にぶつかる。node.jsワカラナイ
dschnurr.medium.com
とりあえず、node.jsをインストール(ダウンロード | Node.js)する
Node.js command prompt立ち上げる
次は必要なパッケージをインストールする
npm…node package manager
composerにお世話になってるので、それのnode版かぁ~という感じ。
npm init -y npm install chrome-remote-interface --save npm install chrome-launcher --save
ファイル実行する
node [ファイル名].js
わぁい、動いた。output.pngでキャプチャ撮れてる。Bufferが非推奨なのかな・・?
って、node.jsわからな過ぎてびっくりした。(javascript分かったら、わかるんじゃねという甘い考えだった)
ちょっと勉強して仕切りなおす。。
vscodeのpowershellにパスを通す
Docker Desktopから『Open in Visual Studio Code』選択するとdocker -vが使えるが、
そうでないとvscodeのpowershellにパスが通ってないことがあった。
システム環境変数にあるものとpowershellのパスは別物。
- 確認コマンド
(見やすく;区切りに)
$ENV:Path.Split(";")
- 一時的な追加
(通したいパスは複数可)
$ENV:Path=$ENV:Path+";[通したいパス]"
- 永続的な追加
(Machineでシステム環境)
[Environment]::SetEnvironmentVariable("Path", $ENV:Path + ";[通したいパス]", [EnvironmentVariableTarget]::Machine)
Dockerfileとdocker-compose.yml
何もわからない状態から、githubでDockerfileとかdocker-compose.ymlとか見てナニコレナニコレになったので( ..)φメモメモ
Dockerfileはインフラの構成を書いている。
命令文 | 簡単な説明 |
---|---|
FROM | ベースイメージ |
RUN | コマンド実行 |
ADD | ファイルやフォルダの追加 |
COPY | ファイルのコピー |
などなど、命令文が書かれている。
docker build
このコマンドを実行すると、Dockerfileに書かれたインフラ構成でイメージが作られる。
docker-composer.ymlは複数(WEBサーバ、DBサーバとか)のコンテナの構成情報を書いている。
それぞれのDockerfileを読み込むこともできる。
たこさんのロゴの意味がよく分かった。
GASを使って条件を満たす値を改行区切りでセルに入力していく
とてもコアな内容
昔はエクセルで、単純作業嫌だからマクロで作ってたけど今はスプレッドシート使いがちなので。
同じような考え方で、単純作業をスクリプトで実装してみた。
GASの細かい基礎的なところは一旦省いて、そのままアウトプット
やりたいこと
人名×好きなものリスト
今夜のディナーは?リスト
好きなものから、食材の方を参照して料理を改行区切りでセルに入力したい
あくまで例なので、これくらいの量なら、普通に入力してもよいかも。
実際のケースでは人名に当たるものが1000近くあり、食材に当たるものが100近くあるので、辛いなと思い適当にスクリプトを書いた。
スクリプト実行のボタン設置(任意)
これは無くてもいい。(エクセルでも同じ)
普通にエディタから実行できるから。
でも気分上げるためにボタン置いたり、画像置いたりする。
挿入 > 図形描画 / 画像 選んで、挿入したものをクリックして右上の・・・を押すと↑のような状態に
「スクリプトを割り当てる」で、自分の書いたスクリプト(デフォルトならmyFunctionとか)入力して登録すると、
画像や図形をクリックするだけで割り当てたスクリプトが実行されるようになる。
自分以外の人が使うとき(GASに詳しくない人のために作ったとき)とかは、ボタン置いてあげると喜ばれるかも!
実際に非エンジニアに依頼されたときは、修造さんと図形にスクリプトを割り当ててる
実装
function myFunction() { const ss = SpreadsheetApp.getActiveSpreadsheet(); var ffMaxRow = ss.getSheetByName('人名×好きなものリスト').getRange("B:B").getValues().filter(String).length + 1; // 入力されている行数を取得 var favoriteFoods = ss.getSheetByName('人名×好きなものリスト').getRange("B2:B" + ffMaxRow).getValues(); // スプレッドF列を配列に入れる var mMaxRow = ss.getSheetByName('今夜のディナーは?リスト').getRange("A:A").getValues().filter(String).length + 1; var menu= ss.getSheetByName('今夜のディナーは?リスト').getRange("A2:B" + mMaxRow).getValues(); for(var i = 0; i < favoriteFoods.length; i++) { // 好きなものがない人はスキップ if(favoriteFoods[i] == "") continue; var resultList = []; var searchWord = favoriteFoods[i].toString().split('\n'); // 改行区切りの文字列を配列に変換 for(var j = 0; j < searchWord.length; j++) { for(var k = 0; k < menu.length; k++) { if(searchWord[j] == menu[k][0]) { resultList[j] = menu[k][1]; break; } } } // 結果を入力 ss.getSheetByName('人名×好きなものリスト').getRange("C" + (i + 2)).setValue(resultList.join('\n')); // 文字列を改行区切りに変換 } }
実行後
直したいところだらけやけど、列や行の指定はどこかで宣言しておいてそこ変えるだけでいいよって状態にしたい&結果を入力も配列に格納して最後に入力したい
エクセルもスプレッドシートもセルの情報は配列にぶち込んで操作するということを残しておきたかった
Linuxユーザーを追加してSSH接続でログインできるようにする
鍵のつくり方はここと同じような要領で作成 yamanomi5656.hatenablog.com
設定したいLinuxサーバにログインして作業開始
SSHDの設定
vim /etc/ssh/sshd_config
AuthorizedKeysFile .ssh/authorized_keys
の記述があればOK。なければ追加
認証鍵ここに置いてますからねという設定
再読み込みしておく
/etc/init.d/ssh restart
sudo権限の設定準備
※AMILinuxであれば、初期状態で設定されているので対応不要
wheelグループにsudo権限があるか確認
visudo
sudo権限に関する設定がずらっと記載されている
%wheel ALL=(ALL) NOPASSWD: ALL
が、コメントアウトされていたらコメント外す
これでパスワードナシで、rootっぽい振る舞いができるようになる
ユーザーの追加
ユーザー追加してwheelグループに所属させる
adduser [user_name] usermod -G wheel [user_name]
公開鍵を保存する
作ったユーザーに切替
su - [user_name]
ここからは作成ユーザーとしてコマンドを実行する
認証鍵ここに置いてますからねという設定 で指定した場所に鍵を置く
mkdir .ssh
vim .ssh/authorized_keys
公開鍵をコピペして、保存したらOK(i → コピペ → Esc → :wq)
最後にファイルやフォルダの権限を変更して終わり
chmod 600 .ssh/authorized_keys chmod 700 .ssh
600とか、700とかはこちらの情報を見て理解しました
http://rousi.com/tag/library/permission.html
一番わかりやすかった・・
私が子どものころからアウトプットしてくれている方々に感謝
GitLabでもGitHubでもSSH接続するまでの手順
Windowsでやりました、簡単にコマンドのみ( ..)φメモメモ
$ ssh-keygen Enter file in which to save the key (フォルダ):
そのままEnter
Created directory '/c/Users/user/.ssh'. Enter passphrase (empty for no passphrase):
パスワードを2回入力
※*とか●とかは表示されないけど、心眼で文字数は確認
公開鍵の方をGitHubやGitLabに登録
$ ssh -T git@github.com
鍵の名前もフォルダも変更しなかったら、そのままyesで先に進めて無事接続完了
You've successfully authenticated
でたらOK
docs.github.com
2021/4/8追記
公式では鍵の生成は Ed25519
を推奨しているよう
$ ssh-keygen -t ed25519 -C "your_email@example.com"
Ed25519
アルゴリズムサポートしていない場合、4096というわけで↑のコマンドだと2048なので弱い
$ ssh-keygen -t rsa -b 4096 -C "your_email@example.com"