みの雑多ブログ

勉強したことをアウトプットしたり、しなかったり

BacklogAPIの課題追加でUrlFetchApp.fetchして出会ったエラー集

developer.nulab.com

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指定して画面キャプチャを一括で作成

developers.google.com

CLIで画面キャプチャとるんです

chromeのヘッドレススクリーンショット優秀すぎてびっくり
Firefoxもあるそう。。今回はchromeで。

Windowsコマンドプロンプトde実行

"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が使えるが、
そうでないとvscodepowershellにパスが通ってないことがあった。

システム環境変数にあるものと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の細かい基礎的なところは一旦省いて、そのままアウトプット

やりたいこと

人名×好きなものリスト
f:id:yamami78651:20210507173043p:plain
今夜のディナーは?リスト
f:id:yamami78651:20210507173555p:plain
好きなものから、食材の方を参照して料理を改行区切りでセルに入力したい

あくまで例なので、これくらいの量なら、普通に入力してもよいかも。
実際のケースでは人名に当たるものが1000近くあり、食材に当たるものが100近くあるので、辛いなと思い適当にスクリプトを書いた。

スクリプト実行のボタン設置(任意)

これは無くてもいい。(エクセルでも同じ)
普通にエディタから実行できるから。
でも気分上げるためにボタン置いたり、画像置いたりする。

f:id:yamami78651:20210507181531p:plain
挿入 > 図形描画 / 画像 選んで、挿入したものをクリックして右上の・・・を押すと↑のような状態に

スクリプトを割り当てる」で、自分の書いたスクリプト(デフォルトならmyFunctionとか)入力して登録すると、
画像や図形をクリックするだけで割り当てたスクリプトが実行されるようになる。

自分以外の人が使うとき(GASに詳しくない人のために作ったとき)とかは、ボタン置いてあげると喜ばれるかも!
実際に非エンジニアに依頼されたときは、修造さんと図形にスクリプトを割り当ててる
f:id:yamami78651:20210507182119p:plain

実装

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')); // 文字列を改行区切りに変換
  }
}

実行後
f:id:yamami78651:20210507190550p:plain

直したいところだらけやけど、列や行の指定はどこかで宣言しておいてそこ変えるだけでいいよって状態にしたい&結果を入力も配列に格納して最後に入力したい
エクセルもスプレッドシートもセルの情報は配列にぶち込んで操作するということを残しておきたかった

Linuxユーザーを追加してSSH接続でログインできるようにする

鍵のつくり方はここと同じような要領で作成 yamanomi5656.hatenablog.com

設定したいLinuxサーバにログインして作業開始

SSHDの設定

設定ファイル/etc/ssh/sshd_configを確認

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"