つくねの手帳

C++およびAndroidアプリ開発メインで何か書きたい

AWS CodeBuild上でTrivyを実行して結果をhtmlで出力する

この記事は「弥生 Advent Calendar 2021」20日目の記事です。

qiita.com

はじめに

この記事ではタイトルの通り、AWS上でTrivyを使用し脆弱性スキャンを行った結果をhtmlとして出力し、GitHubPagesなどでホストするためのファイルを作成することを目的とした記事です。

動機としては、AWS Security BlogでTrivyをCI/CDに組み込む
How to build a CI/CD pipeline for container vulnerability scanning with Trivy and AWS Security Hub | AWS Security Blog
という記事がありますが、もう少し簡易的にTrivyを試したかったのと、Trivyにhtml出力の機能があるので、GitHubPagesなどでホストすればチーム内での共有もしやすいと考えたためでした。

Trivyについて

Trivyはコンテナの脆弱性チェックツールでAquaSecurityが提供しています。
詳細な使用方法などのドキュメントこちらです。
aquasecurity.github.io

AWS CodeBuildでの実行

前提

CodeBuildのオペレーティングシステムUbuntuを想定して記載します。
ソースコードGitHubと連携やCodePipelineから渡すなどしてCodeBuild上で使用できるようにします。
Dockerイメージを作成するので、環境で特権付与のチェックをONにしてください。
その他環境変数などは各自の環境に合わせて設定してください。

インストール

CodeBuild上でもTrivyをインストールして動作させることができます。
Buildspecのinstallフェーズで以下コマンドを使用してインストールします。

install:
  - apt-get install wget apt-transport-https gnupg
  - wget -qO - https://aquasecurity.github.io/trivy-repo/deb/public.key | apt-key add -
  - echo deb https://aquasecurity.github.io/trivy-repo/deb bionic main | tee -a /etc/apt/sources.list.d/trivy.list
  - apt-get update
  - apt-get install -y trivy
スキャン対象イメージの作成

スキャン対象のイメージを作成するため、Buildspecのbuildフェーズでdocker buildを行います。

build:
  commands:
    - docker build -t <imagename>:<tagname>
Trivyのスキャン実行

Trivyでスキャンを行い、結果をhtmlで出力します。
リファレンスには詳細な説明はなく以下のコマンドだけ書かれています。

$ trivy image --format template --template "@contrib/html.tpl" -o report.html golang:1.12-alpine

Report Formats - Trivy

html.tplというファイルはテンプレートファイルで、Trivyをインストールしていれば組み込まれています。
formatオプションに"template"を指定して、template オプションにパス指定することで、任意のテンプレートを使用して結果出力することができます。

CodeBuild上の環境で、サンプルのままだとテンプレートをうまく読み込んでくれません。
CodeBuild実行環境のどこにhtml.tplが展開されているか探して、そのパスを指定してあげる必要があります。
ちゃんとしたパス指定をしたBuildspecは以下のようになります。
スキャン対象を作成した後に実行するのでpost_buildフェーズに記載します。

post_build:
  commands:
    - trivy image --format template --template '@/user/local/share/trivy/templates/html.tpl' -o report.html <imagename>:<tagname>

結果ファイルの出力先はoオプションで指定できるので、できたファイルをs3に格納するなどして使用してください。

おわりに

テンプレートファイルの指定の仕方、CodeBuild上のテンプレートファイルの場所を探すのにやや苦戦しました。
Trivyはデフォルトのコンソール結果出力でもちゃんと成形されているので見やすいですが、htmlだと色分けなどもされていて視認性がよりよくなりますし、ファイル出力しておくことで管理もできるのでおススメです。


「弥生 Advent Calendar 2021」も残すところ1週間を切りました。
明日以降の記事もお楽しみに!
qiita.com

splashtopの描画がとても重い場合の対処

最近リモートワークでsplashtopというサービスを利用しています。
最初は問題なく使えていたのですが、ある日からマウスカーソルやキー入力の反応が悪くなりました。
リモートカーソルを表示するオプションがあるので、リモートカーソルを表示してみると3秒くらい遅れてマウスがついてくる感じです。

リモートワークの人が増えて、回線速度的な問題が発生していると思っていたのですが、接続先PCの音は遅延なく聞こえるので、レンダリング周りの設定を見直しました。

いろいろ試したところ、Video Rendering Optionsの設定を変更することで描画の遅延が改善しました。
※この設定はWindows版の設定です。Mac版では設定項目が無い?ようです。手元にMacがないので未確認です。
メニューのファイルから、オプションをクリックし、Video Rendering Options のプルダウンからSDL with YUVを選択します。

f:id:tukunen13:20200511181201p:plain
オプション詳細タブ


接続元PCにGPUを搭載しているのであればHardware AccelerationのチェックをONにするとさらに快適かもしれません。

OKボタンをクリックして、接続すればOKです。
すでにリモートPCに接続済みの場合は一旦接続を切って再接続すると設定が反映されます。

ドキュメントを見る限り、バージョンが3.3.8.0にアップデートされたタイミングでデフォルトの設定が変わったようです。
support-splashtopbusiness.splashtop.com


この設定変更で私の環境はかなり快適になりました。splashtop使っていて、回線速度は出ているのになんか重たいなーって人はVideo Rendering Option周りの設定で快適になるかもしれません。

Coderetreat in 秋葉原 に参加しました。

11/17はGlobal Day of Coderetreatということで、秋葉原でもCoderetreatが開催されたため参加してきました。

イベントの概要はこちら。
minna-de-ochakai.connpass.com

  • Coderetreatとは

プログラマのスキル向上を目的としたイベントです。
基本的に企業などがスポンサーとなり、参加者は会場、ランチ、飲み物などを無料で提供していただけます。

実際に何をするのかざっくり書くとこんな感じです。
・お題は固定で、コンウェイライフゲームを作ります。*1
・45分を1セッションとしてペアプログラミングを行います。
・ペアは毎回変更します。
・コードは各セッション毎回0から書きます。持ち越しは禁止です。
・使用する言語、フレームワークは自由です。
・1メソッド3行以下やループ禁止などの縛りが追加されることもあります。

  • セッション開始!

今回は全体を通して、TDDを用いて進める。セッションはペアもしくはモブプロで進める。という方針でスタートしました。

・第一セッション
最初のセッションはモブプロ。
人数5人、使用言語Python
縛りは特になし。TDDで実装。

最初は、セルに状態を持たせて、メソッドで取得できるようにする機能を作りました。
モブプロは、メンバー間でスキルに差があっても複数人で補完できるので初対面同士でも結構有効だと感じました。

・ランチ
協賛企業様からおしゃれランチとデザートが提供されました。

f:id:tukunen13:20181203180837j:plainf:id:tukunen13:20181203180841j:plain
ランチ&デザート
屋上を開放してもらい、青空の元デザートをいただきました。
TDDについてや普段使っている言語についてなどの話で盛り上がり、ランチタイムにLTをやるという話はふんわり立ち消えにw


・第二セッション
もう一度モブプロ
人数確か6人?使用言語Kotlin
縛りは特になし。TDDで実装。

だれも詳しくない言語でやってみようということで、Kotlinを選択しました。
やっぱり一人くらいは知ってる人がいないとなかなか進まないよね。という感想。

・第三セッション
ペアプロ
使用言語Python
1メソッド3行以下縛り。ループ禁止。

せっかく3行以下縛りなので、よりロジカルなところをということで、周囲のセルから次世代を判断するロジックを実装しました。


・第四セッション
ペアプロ
使用言語C#
1メソッド3行以下縛り。

実装より、設計をじっくりやって見ることにしました。
セルを配列を使わずに表現出来るように設計しました。


・おやつ

f:id:tukunen13:20181204003230j:plain
おやつのオムレット


ここで予定の時刻になってしまったので、ひとまず終了となりましたが、有志の方たちでおまけセッションを行いました。

・おまけセッション
モブプロ(ハードモード)*2
使用言語Java

おまけということで、ちょっぴりアルコールも入れつつモブプロをしました。
ここではちょっと変則的なアプローチを試しました。
まず、いきなりライフゲームのルールを無視してべた書きでブリンカーパターンを出力する実装をします。
そこからライフゲームのルールのロジックを足していき、ロジカルに動作するようにしていきました。

普段の業務での例をとると、まずは画像だけのモックアップを作り、そこにビジネスロジックを実装していくイメージです。
この手法はATDD*3や、BDD*4と呼ばれる手法だそうです。

  • 振り返り

今日一日の振り返りを、Fun/Done/Learnというフレームワークを使って行いました。
個々で1日の感想をかき出し、Fun(楽しんだ)、Done(やり切った)、Lean(学んだ)の視点で、他人の感想をそれぞれのサークルに張っていきます。
今日全体を通して、どんなことを楽しめたか、学びべたか、実行できたかが見えるようになりました。

f:id:tukunen13:20181208205930j:plain
みんなの感想まとめ

  • まとめ

参加前は1セッション45分はなかなか長いなと思っていましたが、実際に設計とコーディングを行うには短く、その中で形にするためにかなり集中するので、どのセッションもあっという間でした。
普段とは違う手法、初対面の人、新しい言語と知らない事盛りだくさんでしたが、その新しいことを楽しくチャレンジできるいい機会となりました。
ライフゲームについてもかなり奥が深く、その仕組みを深堀してみるのも面白そうです。

*1:ライフゲームとは。単純で奥が深いです。 ライフゲーム - Wikipedia

*2:ドライバーの人はアドバイザーの指示以外のコードは書けない

*3:受入テスト駆動開発

*4:ふるまい駆動開発

Java覚書:Serializable

  • java.io.Serializableインターフェース

Javaでは、DBへの保存やファイル出力を行う際に、java.io.Serializableインターフェースを実装したクラスを使います。
このインターフェースを実装することで、シリアライズ/デシリアライズが可能になります。実装していない場合はシリアライズ/デシリアライズされることはありません。

例:

import java.io.Serializable;

public class SampleData implements Serializable {
  private static final long serialVarsionUID = 1L;

  private String name;

  public String getName(){
    return name;
  }

  public void setName(String data){
    name = data;
  }
}

このインターフェース、上の例を見てもわかる通り、オーバーライドするべき関数はありませんし、フィールドもありません。
単純に、シリアライズ/デシリアライズが可能であることを示すための宣言として機能します。

注意事項として、内部に持つフィールドは、プリミティブ型もしくはシリアライズ可能なクラスである必要があります。

  • シリアルバージョンID

例のクラスに書かれている、

private static final long serialVarsionUID = 1L;

この定義はシリアルバージョンIDで、シリアライズ/デシリアライズの前後でクラスのバージョンが異なっていないかを識別するために定義しています。
serialVersionUIDを定義しておくことで、バージョンが不一致の際にInvalidClassExceptionの例外を投げてくれます。
明示的に宣言をしていない場合でもデフォルト値を計算してくれますが、コンパイラの実装次第で予期しない不一致が発生する可能性があります。
コンパイラが異なっても一貫性を保つために、明示的に宣言することが推奨されています。

6年目エンジニアの転職記

2017年12月で5年半ほどお世話になった会社を退職し、2018年1月から新しい会社で働いています。

初転職の所感としてはやはり売り手市場というか、どこの企業も人手が欲しい感じを受けました。
今回は実際に使ったサービスや感想などを簡単にまとめたいと思います。

転職エージェント・サービス

主に使用したのは以下の3つです。
これ以外にもいくつかのエージェントと話をしましたが、いまいちしっくり来なかったので見送りました。
エージェントについては合う合わないがあるので、自分がやりやすく信頼できる所を見つけたほうがいいと思います。
あと、エージェントを増やしすぎるのはオススメしません。自分が管理しきれなくなります。3つでも結構大変でした。


①レバテック

  • 個人担当と個別企業担当がいる。*1
  • 求人情報等はGoogleスプレッドシートで管理される。*2
  • 面接対策用の資料が充実している。
  • 個人担当と企業担当が別が故のデメリットが発生することがある。*3


②ビズリーチ

  • CMでおなじみのやつ
  • 結構手軽で登録するだけで求人がわんさか来る。*4
  • 個別の面接対策とかはない。*5


③@Type転職

  • 転職先を紹介するというより、この先のキャリアについて考えさせてくれた。*6
  • 大きい企業の求人を結構持っている印象。
  • 書類の添削が丁寧。

ハローワーク

  • 実際ほとんど使ってない。無職になってしまった場合の給付とかの話を聞きに行った。
  • 求人検索用端末のUIが使いにくすぎてつらかった。
転職活動に関して

今回初めての転職に際して、準備したこと、転職活動中の所感などを書きます。

  • 準備

私は転職を考えてから実際に行動するまで、約10か月ほど時間がかかりました。
その間に準備として、自分のスキルの棚卸、業界の動向調査などは意識的に行いました。

現職の環境がひどい場合はその限りではありませんが、転職に踏み切る際にはある程度準備をしておくほうがよいです。
よく取りあげられていますが、自分のスキルの棚卸はおススメです。
自分の出来ること、足りないこと共に再認識できるので、転職するしないに関わらず私も定期的に行っていこうと思っています。

  • 転職活動中

実業務と転職活動を並行して行うので、結構疲れます。
私が思っていたよりかなりスピーディーに選考が進みました。
また、複数企業一斉に選考が進むので、スケジュール管理がなかなか大変でした。

大変ではありますが、いろいろな企業の方と話が出来るのはいい体験でした。

  • 転職後

やはり新しい環境で働くというのはエネルギーを使います。
社歴は1年目になりますが、エンジニアとしては経験者なので、ある程度の能力は求められます。
不慣れであったり、人間関係も築けていない状態で思うようにアウトプット出来ない自分に、もどかしさも感じました。
しかし、新しい人たちと働くことで、新たな考え方や技術に触れられるというのは大きなプラスになっています。

まとめ

実際に選考を受けてみて、私の予想以上に選択肢は広いんだなぁと感じました。
自分のスキルを活かせる新たな業界も観ることができました。
現職では出来ないがやりたいことがある人、行きたい企業がある人、思い切って飛び込んで見てもいいかもしれません。

転職するか悩んでいる人は、とりあえず準備を進めておくというのがいいかもしれません。
求人とかを見てみるだけでも待遇面や、メインの技術などはある程度つかめます。

*1:個人担当が日程調整や求人紹介をしてくれて、企業担当が面接対策とかをしてくれます。

*2:実際私はほとんど使いませんでした。

*3:個人担当と企業担当の意思疎通がうまくいっていない事が少し見られました。

*4:企業から直接面接オファーがくる場合と、転職エージェントが声をかけてくる場合があります。登録しているスキル、現年収、自己PRの内容にもよると思いますが、転職エージェントからの連絡が多めでした。③の@Type転職はビズリーチ経由で話を聞きに行きました。

*5:企業からの面接オファーなので当然期待できないです。

*6:今回の転職というより、この先エンジニアとしてどうなって行きたいかを面談で話し合ってくれました。

Widgetの回転と枠線について

今回は、組み込み開発などにおいて、LCDの関係などでWidgetを回転させたい。という時に、QGraphicsSceneとQGtaphicsViewを用いた回転方法と、その際にWidgetに対してついてしまう枠線について書きたいと思います。

例によって、Qtのversionは4.8です。

先ず、Widgetの回転についてです。
Widgetの回転は、対象のWidgetをQGraphicsSceneへ渡し、そのQGraphicsSceneをQGraphicsViewへ登録。QGraphicsViewのrotate関数で実現できます。

  QGraphicsScene *scene = new QGraphicsScene();
  scene->addWidget(/*回転させたいWidgetハンドル*/);

  QGraphicsView *view = new QGraphicsView(scene); // QGraphicsViewにsceneを登録
  view->rotate(90); // 90度回転

これで対象のWidgetを回転させられたかと思います。
ただ、このままだとWidgetに1pxの枠線がついてしまうと思います。

  setWindowFlags(Qt::FramelessWindowHint);

などをWidgetに指定しても、消せないのですが、これには理由があります。

先程、回転のためにQGraphicsViewを使用しました。
このクラスは親クラスをたどるとQFrameクラスを継承しています。
その為デフォルト1pxの枠線を描画してしまいます。
枠線を描画したくない場合は、以下のようにQGraphicsViewにオプション指定をしましょう。

  view->setFrameShape(QFrame::NoFrame);

こうすることで、もとのイメージのまま回転が可能です。

QtCreatorでデバッグ中にブレークポイントにとまるとアプリがクラッシュする

この現象はQtCreator2.5.2という古いバージョンで発生したものなので、現在のQtCreatorでは発生しないかもしれません。

内容はタイトルの通りで、QtCreatorでQtプロジェクトのデバッグ実行中に、特定の場所、タイミングでブレークポイントんとに止まるとアプリがクラッシュするというものです。

結論から言うと、QtCreatorの監視ウィンドウが原因でした。


QtCreatorにはデバッグ中に変数の中身を表示させる監視ウィンドウというものがあります。
中身を見たい変数を右クリックし、「監視ウィンドウに追加」のメニューを選択することで、QtCreatorが変数の中身を表示してくれます。
VisualStudioでいうローカル変数タブのイメージですね。

デバッグ時には便利なのですが、以下のようなコードを監視することで、タイトルの現象が起きてしまいます。

hoge.h

class hoge

public:

  hoge();
  ~hoge();
  
  bool getFirstItem(int* buf); 

private
  QVector<int> m_vector; // メンバ変数にQVectorを定義
hoge.cpp

hoge::hoge()
{
  this->m_vector.clear(); 

  int a = 0;
  this->getFirstItem(&a); // ここにブレークポイントを置くと落ちる。ブレークせずに走らせる場合は問題なし。
}

bool hoge::getFirstItem(int* buf)
{
  bool bRet = false;
  
  if(false == this->m_vector->isEmpty())
  {
    buf = this->m_vector[0]; // ここのthis->m_vector[0]を監視ウィンドウに追加
    bRet = true;
  }

  return bRet;
}


QVectorは可変配列ですが、通常の配列のようにでアクセスが可能です。

当然、Vectorの中身がない場合はエラーになるのですが、上記のようにコード上はチェックをしていても、
監視ウィンドウにm_vector[0]のような変数を追加しておくと、このVectorはメンバ変数なので、クラス内どこでも参照可能です。

そのため、クラス内のブレークポイントに止まった際に、問答無用でアクセスエラーを起こします。

この時に、QtCreatorがエラーログをはいてくれるのですが、"ASSERT failure in QVector::operator:"index out of range",file....."
と配列オーバーアクセスなのはわかるのですが、どこで起きているのかわからないので、コード上を探しても配列オーバーアクセスを起こすコードは見つからない。
ということが起こります。

そもそもVectorにたいして[]でアクセスするな。という話かもしれませんが、ブレークしたときにVectorのアクセスエラーで落ちる。
なんて現象に遭遇した場合は、一度監視ウィンドウをチェックするほうがいいかもしれません。