ラベル Google Docs の投稿を表示しています。 すべての投稿を表示
ラベル Google Docs の投稿を表示しています。 すべての投稿を表示

2020年5月11日月曜日

chrome://tracing で並列処理の可視化をしてみたらすごく便利だった話

前回「ブログズミ: [C++] -ftime-trace オプションと Chrome でビルド時間の可視化」の続きです。
chrome://tracing の活用として iutest で使用している CI サービスの並列具合を調べて可視化してみました。

レポート集計の構成
各 CI サービスから並列具合を可視化するために使用したのは、 Intergromat と Google スプレッドシートの2つです。
構成は下図のようになっています。


まず各 CI サービスからはジョブごとに処理の開始・終了時に、Integromat で用意した Webhook URL に情報を送信します。
各 CI サービスで並列化する方法は ci-parallel リポジトリ の YAML を確認してください。
Webhook には「CIサービス名」「commit hash」「名前」「並列番号」「時刻」「開始・終了イベント」などの情報が付与されて来ます。
その情報から、Integromat で Google Drive から CI サービスごとのスプレッドシートを検索し、そこにコミットごとにシートを作成して情報を書き込みます。


そこから Chrome の tracing で表示するための json ファイルに GAS を使って変換しダウンロードします。
あとは、ダウンロードした json ファイルを tracing で読み込めば可視化が完成です。
tracing 用 json への出力
chrome://tracing の json フォーマットはこちらを参考にしました。

function getData() {  
  var sheet = SpreadsheetApp.getActiveSheet();
  var maxRow = sheet.getLastRow();//行数 -
  var maxColumn = sheet.getLastColumn();//列数 |
  var keys = [];
  var ret = [];

  //1列目のkeyの名前取得
  for (var x = 1; x <= maxColumn; x++) {
    keys.push(sheet.getRange(1, x).getValue());
  }

  var base = 0;
  //データ
  for (var y = 2; y <= maxRow; y++) {
    var json = {};
    for (var x = 1; x <= maxColumn; x++) {
      var k = keys[x-1];
      var v = sheet.getRange(y, x).getValue();
      if( k == "ts" ) {
        var d = new Date(v);
        if( base == 0 ) {
          base = d.getTime();
        }
        v = (d.getTime() - base) * 1000;
      }
      
      json[k] = v.toString();
    }
    ret.push(json);
  }

  //整形してテキストに
  return JSON.stringify(ret, null, '\t');  
}
行のヘッダー名と要素は Integromat で tracing フォーマットに合わせて書き出しているので、ほぼほぼそのまま json にしています。
時間だけ最初のレコードを起点にした差分時間に変換しています。
結果
こんな感じになりました。

詳細は ci-parallel リポジトリを確認してください。
最後に
CI サービスの並列具合を可視化しようと思い、最初は BI ツールを転々と試していたのですが、 tracing がベストマッチでした。
もちろん何をどのように可視化したいかによって、 BI ツールを使うべき場合もありますが、可視化の選択肢として tracing は覚えておいて損はなさそうです。
そして、今回は単純な Duration イベントのみを使いましたが、他のイベントも使うともっといろいろな表現ができそうです。

メモリの追跡はありですね。やってみようかな。

あと、今回はスプレッドシート使いましたが、BigQuery とか使ったほうがイケてるのかな?
この辺今まで触ってこなかったので覚えていきたいですね。

宣伝

「技術書典 応援祭」で販売した本には今回調べた並列処理の比較はありませんが、次回作に向けて鋭意活動中です。そちらには収録を予定しています。
既刊および次回作をよろしくおねがいしますmm

今回は以上です。では。

2020年2月3日月曜日

[技術書典8] GitHub Actions で作成した PDF を Google Drive にアップロードして Slack に通知する

「ブログズミ: [技術書典8] GitHub Actions で Re:VIEW Starter の PDF を作成する」先週の続きです。

先週は、GitHub Actions を使って Re:VIEW Starter の PDF 作成を CI にしました。
その際に、PDF のアップロード先を GitHub Actions の Artifact にしていましたが、こちらは誰でもアクセスが可能な場所だったので、private な場所にアップロードするようにしたいと思います。

Google Drive にアップロード
Google Drive へのアップロードはこちらで紹介されているアクションを利用しました。
「GitHub ActionsでLaTeXをビルドしてGoogle Driveに上げる - Qiita」
「Interact with Google Drive · Actions · GitHub Marketplace」

筆者は skicka は使ったことがなかったのでそちらの手順に従ってセットアップしました。

まずは手順通りに進めてみる
「skicka-を使ったことがない方」の手順どおりに進めていきます。

手順の 1. と 2. を実行してみて、「このアプリでは「Google でログイン」機能が一時的に無効」と出た場合は、別途回避手順が必要です。
筆者がやった時点では、このメッセージが表示されましたので回避手順を行いました。

回避手順を行う
「skickaの『「Google でログイン」機能が一時的に無効』を一時的に解決する - Qiita」
回避手順も Qiita とアクションのページに記事が投稿されていますので、参考にしましょう。

必要なのは、Google Drive API の Client ID と Client Secret です。
こちらを作成したら、アクションページの手順にあるとおりに ENV に 作成した ID/Secret を渡して docker run します。
続いて、手順にあるコマンドをそのまま実行します。

回避対応は以上です。
URL が表示されているので、もとの手順(2. ブラウザで開く)にもどりましょう。

続き
回避対応が正しくできていれば、今度はアクセスできると思います。
(警告出るかもしれませんが・・詳細開いて続行します)

アクセスを許可したら、コードが発行されるので docker に戻って入力します。


入力したら json が表示さます。
これで必要な情報が揃いました。

GitHub の Secrets に登録する
上記で作成した json と Google Drive API の Client ID/Secret を GitHub repository の Secret に登録します。

GitHub Actions に追加する
- name: Upload to Google Drive
  uses: satackey/action-google-drive@v1
  with:
    skicka-tokencache-json: ${{ secrets.SKICKA_TOKENCACHE_JSON }}
    upload-from: ./
    upload-to: /path/to/upload
    # 回避手順を取った場合は以下の2つも必須
    google-client-id: ${{ secrets.SKICKA_CLIENT_ID }}
    google-client-secret: ${{ secrets.SKICKA_CLIENT_SECRET }}

完成
無事にアップロード完了しました。



Slack に通知する
アップロードできたら、今度はアップロード通知が欲しくなりました。
そこで Slack 通知にも対応しておきました。

Post Slack messages · Actions · GitHub Marketplace
中みたら curl で API 叩いているだけだったので、正直 Actions 使う必要ないなーと思いつつも、これを使うことにしました。

Slack bot 作成

まずは Slack のボットを作成します。

1. Slack API で App を作成する



2. サイドバーの「OAuth & Permissions」のリンクを開きます。
(「App Home」の「Bot Token Added」のところにもリンクがあります)


3. 「Scopes」に chat:write 権限を追加


4. ワークスペースに Bot をインストールします。

5. 「Bot User OAuth Access Token」にトークンが表示されます。


Secrets 登録

トークンを発行できたら、続いて GitHub のリポジトリ設定から Secrets にトークンを追加します。
名前は「SLACK_BOT_TOKEN」としました。

Slack notification step

最後に、GitHub Actions のワークフローに以下のステップを追加します。
      - name: Notify slack
        env:
          SLACK_BOT_TOKEN: ${{ secrets.SLACK_BOT_TOKEN }}
        uses: pullreminders/slack-action@master
        with:
          args: '{\"channel\":\"CSYR0PEHW\",\"text\":\"Upload new pdf!!\"}'


最後に
技術書典にサークル参加される皆さん。準備はバッチシでしょうか?
私はダメです。。。

がんばります。

2019年11月12日火曜日

[Google Docs] スプレッドシートが編集できなくなったときの対処

気づいたら入力しても更新されない状態になってしまってました。(確定すると戻る感じ)
「スプレッドシート 編集できない」で WEB 検索すると、以下の対応方法がでてきますがそれでは直らなかったので、メモ。

* 編集権限の問題(権限の確認・アカウントの確認)
* ブラウザの問題(バージョン・ソフトを変える)
* 制限(セル数)

症状
(キャプチャ残しておけばよかったな)

* セルへの入力や結合、行・列削除など一切の編集ができない
* ブラウザを変えると問題なし
* 同じブラウザでもブラウザのログインアカウントを変えると問題なし


対応方法
ローカルのアカウントに紐付いた情報がおかしいと推測して、サイトデータを削除しました。

「サイトの設定」→「Cookie とサイトデータ」→「すべての Cookie とサイトデータを表示」




「docs.google」で絞り込みして削除。