OmniAICreator/Qiita-1.07M huggingface dataset:
PG16:Summary function for pg_buffercache

# はじめに

にゃーん。趣味でポスグレをやっている者だ。

この記事は[PostgreSQL 16 全部ぬこ Advent Calendar 2022](https://qiita.com/advent-calendar/2022/pg16-all-nuko) 9日目の記事です。

今回はcontribモジュール``pgbuffercache``にPostgreSQL 16で入った新規関数について書いてみます。

# 概要

|項目|内容|
|:--|:--|
|タイトル|[PG16:Summary function for pg_buffercache](https://commitfest.postgresql.org/40/3839/)|
|Topic|Monitoring & Control|
|ステータス|commited|
|Last Modified|2022-10-13|
|概要|contrib/pg_buffercacheに<br>サマリ情報を返却する関数<br>``pg_buffercache_summary()``が追加された|

# 変更内容
## pg_buffercacheとは
``pg_bufferchache``はPostgreSQLの共有バッファの内容をモニタリングするための拡張機能(contribモジュール)です。
この拡張機能は、PostgreSQL 8.3からサポートされている結構歴史のあるものです。
参考：[PostgreSQL 14文書のpg_buffercacheのページ](https://www.postgresql.jp/document/14/html/pgbuffercache.html)

## 現状の問題
PostgreSQL 15までは、``pg_bufferchar``でキャッシュ全体の傾向（dirtyページがどのくらいあるか等）を取得しようとすると、
``pg_buffercache``によってキャッシュページを全スキャンした結果を集約するクエリを書く必要がありました。

最近はハードウェアのスペックも上がり、共有バッファに大きなサイズを割り当てることも多いと思います。
そうした環境だと、``ppg_buffercache``の結果を集約するコストはけっこう高くなります。
定期的にそうした監視を行うのであれば、その辺りのコストは下げたいもの。

## pg_buffercache_summary関数
ということで、PostgreSQL 16から、pg_byffercahceの内容をサマライズした結果を出力する``pg_buffercache_summary``関数が追加されました。

この関数は引数なしで実行し、以下の5つ列をもつ1行のレコードを返却します。

|列名|型|意味|
|:--|:--|:--|
|buffers_used|integer|有効なrelfilenodeを持つバッファの数(ダーティと非ダーティの両方)|
|buffers_unused|integer|無効なrelfilenodeを持つバッファの数|
|buffers_dirty|integer|ダーティバッファの数|
|buffers_pinned|integer|バックエンドを少なくとも1つピン留めしているバッファの数|
|usagecount_avg|double precision|使用済みバッファの平均使用量|

実行結果はこんな感じになります。

```sql
=# \x
Expanded display is on.
=# SELECT * FROM pg_buffercache_summary();
-[ RECORD 1 ]--+------------------
buffers_used   | 4278
buffers_unused | 12106
buffers_dirty  | 2072
buffers_pinned | 0
usagecount_avg | 1.548153342683497

=#
```

この関数を使用しない場合には、以下のような集約クエリで同等の結果を得ることができます。

```sql
=# SELECT relfilenode <> 0 AS is_valid, isdirty, count(*) FROM
pg_buffercache GROUP BY relfilenode <> 0, isdirty;
 is_valid | isdirty | count
----------+---------+-------
 t        | f       |  2206
          |         | 12106
 t        | t       |  2072
(3 rows)

=#
```
* 1行目と3行目を加算したものが、``buffers_used``
* 2行目が``buffers_unused``
* 3行目が``buffers_dirty``
に相当してますね。
また、このクエリだと``bufferd_pinned``と``usagecount_avg``に相当する情報は出力されません。それらを取得するためには別のクエリが必要になるようです。

# 検証
では、``pg_bufferchache``の結果を集約したクエリと、``pg_buffercache_summary()``の実行時間を雑に比較してみます。

* shared_buffersを64MB, 128MB, 256MBに変更して、PostgrerSQLサーバを起動する。
* 起動直後に、pgbenchの初期化(Scalefactor=100)を実行する。
    * ``pgbench --unlogged-table -i -s 100``
* pgbench実行直後に、``\timing``オプションをつけて``pg_buffercache``を集約したクエリと、``pg_buffercache_summary()``を実行し処理時間を測定する。

|shared_buffers|pg_buffercache集約|pg_buffercache_summary|
|--:|--:|--:|
|64MB|4.949|0.561|
|128MB|8.432|0.691|
|256MB|15.033|0.827|


![](https://i.imgur.com/K7v1UDz.png)

こうかはばつぐんですね。
検証した環境だと、shared_buffersにそれほど大きな値が設定できないので、集約関数を使ってもそれほど処理時間はかからないのですが、それでも、pg_buffercache_summary()を使う方が圧倒的に高速に処理できることがわかりました。

ハイスペックで数百GBのhared_buffersを設定可能な環境だと、pg_buffercache_summary()の恩恵は大きなものになりそうです。

# おわりに
今回は``pg_buffercache``拡張機能に追加されたサマリを取得する関数について説明しました。
この関数を使ったバッファ監視の運用などを考えてみるのも面白いかもしれません。
Chrome拡張機能を30日で作る()

chromeの拡張機能の作り方の情報がまとまってなかったので12月は拡張機能を作ってみる期間にします。ついでにチュートリアルも作ります。

相対時間を取得するパスを作ります。


### ライブ中のから相対時間を計算する

タイムスタンプは動画時間からの経過時間を指定するものだ。配信終了後はメニューバーに経過時間が表示されているが配信中は表示されていない。なので配信中中は配信開始からの経過時間を取得する方法を実装する必要がある。(配信開始時間) - （現在の時間）= (経過時間)で経過時間を取得できる。現在の時間はJSで普通に取得できるが、配信開始時間をどこから取得すればいいかわからなかった。

開発者ツールのネットワークを見ればどこかに配信開始時間がどこかに Unix秒で保存されていたが、ユーザーが開発者ツールを開かないとJSではアクセスできない。そんな挙動をするとユーザーからは奇妙に映る。

**結果**

ライブ終了後と同じパスで格納されていた。ネットワークの通信ログから探そうなんて面倒なことをやろうとしていた。画面に表示されていないだけで実は表示されていた。見つけたきっかけは偶然。ライブ中の動画でもクリップボタンを押したのがきっかけ。

だとすると、 ytp-time-duration とはなんなのだろう。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2955569/4562b41b-80bb-5426-7ac5-2f7fc3a74540.png)
javascriptで効果音を鳴らす方法

javascriptで作ったゲームなどで効果音を鳴らす方法。

JavaScriptでAudioインスタンスを作成する。
「beep.mp3」の名前は任意。サーバーに音楽ファイルをアップロードしておく。

```js
const music = new Audio('beep.mp3');
```

使用したい場所で以下のように実行する。

```js
music.currentTime = 0;
music.play();
```
例えば効果音ファイルの長さが２秒であった場合、１秒毎に実行されてしまうと効果音が出ないことがある。

しかし、.currentTime = 0 を設定しておけば、短い期間で関数が実行されたとしても、ちゃんと効果音を鳴らすことができる。

※もっといい方法があったら教えてくださいm(_ _)m
HTML基礎　HEADタグ内を解説



## はじめに

この記事では、HTMLをこれから学習する方向けにhead要素の中身について詳しく解説していきたいと思います。

1つ1つの意味を理解することで、すっきりした状態でWeb制作を始められると思うので是非読んでいただければと思います。

# HTML学習にお勧めサイト

忍者CODEでは、多数の無料問題集から有料のコンテンツまで用意されています。
「初心者でいきなりお金かけて学ぶのは怖いなあ」
「まずはお金をかけずに学びたい」
そんな方には非常におすすめなサービスなので是非活用しましょう！

https://ninjacode.work/


https://koga.ninjacode.site/?ni=q_5


# ```<head>```要素とは

```<head>```～```</head>```で囲まれている部分がhead要素になります。
「head」とは、文書のヘッダー部分を指定するタグのことです。```<head>```タグで囲った内容は、htmlファイルの情報を指定するものであり、```<html>```タグと```<body>```タグの間に書きます。
```<head>```タグの中の内容は、```<title>```タグを除いてブラウザの画面上に表示されないようになっています。（title要素はブラウザ上部のタイトルバー）。ヘッダー部分は```<title>```、```<meta>```、```<link>```など、HTMLファイルの様々な情報が指定されます。また、スタイルシート（CSS）やJavaScriptを外部から読み込む場合にも```<head>```タグの中に記述して読み込ませます。（JavaScriptの記述はbodyタグ内に置くこともある。）

# HTML基本構成の理解

HTMLの基本構成は「! + tab」か「! + enter」のショートカットキーで瞬時に作れます。
[![Image from Gyazo](https://i.gyazo.com/54ec269ae859117ea3fe4ba5ff73a3fe.png)](https://gyazo.com/54ec269ae859117ea3fe4ba5ff73a3fe)
ですが、一気に色々表示されて最初はなんのことだか分からないですよね。1つ1つ細かく解説していきます！


## ```<!DOCTYPE html>```
これはドックタイプ宣言と言われるもので、この文書がHTML5の形式であるとパソコンに認識させるために記述します。
HTML文書を作成する場合、必ずほかのタグよりも先頭に書くべきものです。
コチラは正確にはHTMLタグではないので、閉じタグを書く必要はありません。

## ```<html lang="ja">```〜```</html>```
```<html lang="ja">```〜```</html>```に書かれているものがHTMLの内容だということを示します。
lang属性は言語を指定するために記述します。「lang=”ja”」で日本語を指定できます。
プログラムに対しても言語を理解させるということで文字化けなどの発生を避けられる可能性があります。
デフォルトでは「lang=”en”」（英語）になっているので、変更しておきましょう。

# ```<head>```内の解説

```<head>```～```</head>```で囲まれている部分がhead要素になります。
head要素とは、そのページの基本情報を表す要素のことで、この中に記述した内容はブラウザに読み込まれますが、表示はされません。

## ```<meta charset="UTF-8">```

```<meta charset="UTF-8">```は HTML5 で登場した新しい記法で文字コードを指定しています。文字化け対策として記述します。
日本語のサイトであれば、必ず書いておいたほうがよいです。

## ```<meta http-equiv="X-UA-Compatible" content="IE=edge">```

こちらのmeta要素を記述することで、Internet Explorer（IE）に対して互換性モードを指定することができます。「IE=edge」でIE（Internet Explorer）であれば最新版で表示するように指示しています。

## ```<meta name="viewport" content="width=device-width, initial-scale=1.0">```

レスポンシブ対応させるために記述するものです。あまり深く考えず書くものだと認識しておけばOKです。

## ```<link rel="icon" href="favicon.ico" />```

ファビコンはブラウザのタブに表示される小さなアイコンのことです。タイトルの左側に表示されます。
ルートディレクトリにファビコンファイルを置く場合は、拡張子が.icoのものを使わないと表示されません。

## ```<title>```～```</title>```

ページ内のコンテンツを簡潔に説明する部分です。検索ページにタイトルとして表示されます。
SEO的にも重要な項目です。

## ```<meta name=”description” content="">```

Webページの紹介文。Google等での検索結果ページのタイトル下にでる説明文にあたります。
表示される文字数は、60~120字文字程度です。

## ```<link rel="stylesheet" href="reset.css">```

リセットCSSとはブラウザ毎に設定されているデフォルトの表示設定を無効かするための記述です。リセットCSSを記述していないと、表示するブラウザによってホームページの見た目が変わってしまいます。

## ```<link rel="stylesheet" href="style.css">```

「rel=”stylesheet”」はスタイルシートを読み込ませるために記述します。「href=””」に読み込みたいCSSファイルのURLを記述します。

# 最後に

解説は以上となります。

少し説明不足な点もあるかとは思いますので、また改めて追記しておきたいと思います。
MySQL闇歴史　MySQL GUI Tools

現在MySQL開発チームが提供するGUIクライアントといえばMySQL Workbenchと開発中のMySQL Shell for VS Codeである。2005年9月にMySQL WorkbenchがGAリリースとなる前は、MySQL GUI ToolsというMySQL Administrator, MySQL Query BrowserとMySQL Migration Toolkitの3本セットだった。

知名度：★★☆☆☆
闇度　：★☆☆☆☆
3本柱度：★★★☆☆

![MySQL Administrator](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102878/967c2eb0-af2f-2d69-090a-fa9f94a4b0e6.png)
*懐かしのMySQL Administratorのスクリーンショット*

いまでもアーカイブのサイトからダウンロード可能だがそこにもカオスの片鱗が。
https://downloads.mysql.com/archives/gui/
MySQL GUI Toolsの最後の方のマイナーバージョンはWindows版しかないが、5.0.12はWindows以外にも各種LinuxディストリビューションやMac OS X版もある。単品だったAdministratorやQuery BrowserもマイナーバージョンによってOSがまちまちだったりするのでそういうものらしい。

ソースコード的にはそれぞれカオス感があってJavaでアプリが書かれていて中でLuaのスクリプトが動いてたりするのがある。が、これら3本の中で最もカオスなのがMySQL Migration Toolkitで、GUIはDelphi(懐っ！)で書かれているがDB接続には各データベースのJDBCドライバを使うようになってる。当時としては最適な実装方法だったんだろう。
完走賞を目指してみましょう！ on Livebook

<b><font color="red">$\huge{元氣ですかーーーーッ！！！}$</font></b>

https://qiita.com/advent-calendar/2022

https://qiita.com/advent-calendar/2022/elixir

## はじめに

::: note info
2022/12/12 更新

最新のデータに更新しました
:::

この記事は @torifukukaiou さんの記事を~~パクった~~リスペクトしたものです

アカウント毎に Qiita Advent Calendar 2022 に何件記事を投稿したかを Elixir で取得しています

https://qiita.com/torifukukaiou/items/17d55cf896c24b13350e

これで自分が完走賞がもらえそうなのか分かりますね！

すごく面白かったので、私は愛すべきLivebookで動かしてみました

ノートブックはこちら

https://github.com/RyoWakabayashi/elixir-learning/blob/main/livebooks/qiita/calender_2022.livemd

## 実行環境

Livebook 0.8.0 の Docker　イメージを元にしたコンテナで動かしました

https://hub.docker.com/layers/livebook/livebook/0.8.0/images/sha256-6ef3fdd439fd72af9ae01d58e947664a46a8493f031e179cc0e91c08ddac02e5?context=explore

コンテナ定義はこちらを参照

https://github.com/RyoWakabayashi/elixir-learning

## セットアップ

必要なものをインストールします

せっかく Livebook なので Explorer と VegaLite で可視化しましょう

```elixir
Mix.install([
  {:req, "~> 0.3"},
  {:floki, "~> 0.34"},
  {:explorer, "~> 0.4"},
  {:kino, "~> 0.8"},
  {:kino_vega_lite, "~> 0.1"}
])
```

エイリアスなどを準備します

`require Explorer.DataFrame` を忘れると、 Query の機能が使えないので気をつけましょう

https://qiita.com/RyoWakabayashi/items/053296b36d8744aca9ca

```elixir
alias Explorer.DataFrame
alias Explorer.Series
alias VegaLite, as: Vl
require Explorer.DataFrame
```

## カレンダーデータの取得

@torifukukaiou さんのコードを参考に、ひとつなぎにしました

最後に dbg を付けているので、途中経過を楽しめます

```elixir
calendar_df =
  "https://qiita.com/advent-calendar/2022/elixir"
  |> Req.get!()
  |> then(&(&1.body))
  |> Floki.parse_document!()
  |> Floki.find("[data-js-react-on-rails-store=AppStoreWithReactOnRails]")
  |> Enum.at(0)
  |> elem(2)
  |> Jason.decode!()
  |> get_in(["adventCalendars", "tableAdventCalendars"])
  |> Enum.at(0)
  |> Map.fetch!("items")
  |> Enum.frequencies_by(&get_in(&1, ["user", "urlName"]))
  |> then(fn map ->
    %{
      name: Enum.map(map, fn {name, _} -> name end),
      count: Enum.map(map, fn {_, count} -> count end),
    }
  end)
  |> DataFrame.new()
  |> dbg()
```

![cal.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/cf6a41ca-5e05-bb10-e7da-089ed30e4fc5.gif)

## データテーブルの表示

```elixir
calendar_df
|> DataFrame.arrange(desc: count)
|> Kino.DataTable.new()
```

![スクリーンショット 2022-12-12 10.51.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/c0bb9fe2-a691-e4b8-f383-70b17f8ae47b.png)

どうやら何とか完走賞は貰えそうです

## グラフの表示

```elixir
x = Series.to_list(calendar_df["name"])
y = Series.to_list(calendar_df["count"])

Vl.new(width: 800, height: 400)
|> Vl.data_from_values(x: x, y: y)
|> Vl.mark(:bar)
|> Vl.encode_field(
  :x,
  "x",
  type: :nominal,
  sort: "-y",
  title: "アカウント名"
)
|> Vl.encode_field(
  :y,
  "y",
  type: :quantitative,
  title: "記事数"
)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155423/4c94783b-8f09-d341-633e-cef3e9ddaae0.png)

グラフにすると勢いの凄さが分かりますね

## まとめ

パイプ `|>` で繋いで `dbg` するのが楽しすぎる

まだまだ記事は増やせそう
CpawCTF Writeup Level 2 Q15.[Web] Redirect (注意<spoiler>)

# Q15.[Web] Redirect

```
このURLにアクセスすると、他のページにリダイレクトされてしまうらしい。
果たしてリダイレクトはどのようにされているのだろうか…
http://q15.ctf.cpaw.site

※この問題のサーバへの攻撃はお止め下さい
```

デベロッパーツールを開き、ネットワークを見ればResponxe Headerにフラグがある


![スクリーンショット 2022-12-01 192251.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/813031/56af9d46-24ea-8593-41ae-ba46d4608d64.png)


cpaw{4re_y0u_1ook1ng_http_h3ader?}
XAI書籍2022

## これは何？

本記事は、XAI（説明可能なAI）について日本語で執筆されている書籍のまとめです。以下にまとめる書籍はXAIの概要や複数のXAIの手法について書かれています。これにより、俯瞰的に把握することで手法の選択に役立ちます。それぞれに対して、@daikikatsuragawaのコメントをつけています。

## 機械学習を解釈する技術〜予測力と説明力を両立する実践テクニック

https://gihyo.jp/book/2021/978-4-297-12226-3

実務を見据えたXAIの概要、実務において特に有用であろう手法について解説されています。線形回帰モデルの解釈性に加え、ブラックボックスなモデルに解釈性を与える手法であるPFI（Permutation Feature Importance）、PD（Partial Dependence）、ICE（Individual Conditional Expectation）、SHAP（SHapley Additive exPlanations）が紹介されており、これらの手法が有用な場面での参考になります。

## XAI（説明可能なAI）--そのとき人工知能はどう考えたのか？

https://www.ric.co.jp/book/data-sience/detail/1843

XAIの概要、各手法の特徴などについて広く深く解説されています。XAIが求められる背景から、様々な場面に対して有用な手法とその実践例、使われ方（とその時の注意）まで網羅的に紹介されています。XAIというキーワードに引っかかる方にとっては、ご自身の理解を増補させる内容が得られるものがはずです。

## 情報処理 特集別刷「AI判断の根拠を説明するXAIを使いこなす」

https://techbookfest.org/product/askUFYFEGtdzAYF56gPabB?productVariantID=fLfLwB677fuaCWeqK6iZZJ

情報処理学会の学会誌「情報処理」のXAI特集です。XAIに関わる著者複数人がそれぞれXAI自体や今後の展望、産業利用について解説しています。特に、今後に書かれていることも多く、社会実装（産業利用など）に向けた現状の課題についての理解を深めることができます。

## Interpretable Machine Learning

https://hacarus.github.io/interpretable-ml-book-ja/

『Interpretable Machine Learning──A Guide for Making Black Box Models Explainable』の日本語訳でありWeb上での閲覧が可能です。解釈可能な機械学習（Interpretable Machine Learning）の全般について特に広く深く解説されています。XAI自体についての理解を深めるのに有用です。各手法について参考文献が示されており、深堀も可能です。また、継続的に執筆中で、今後も改善や章の追加が予定されています。原著は2022年11月12日に更新されていました（2022年12月1日に確認）。
CpawCTF Writeup Level 2 Q13.[Stego]隠されたフラグ (注意<spoiler>)

# Q13.[Stego]隠されたフラグ

```
以下の画像には、実はフラグが隠されています。
目を凝らして画像を見てみると、すみっこに何かが…!!!!
フラグの形式はcpaw{***}です。フラグは小文字にしてください。
stego100.jpg
```

![steg10.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/813031/fdd84ada-32a4-93c1-24c5-27f8d0cb587d.jpeg)


モールス信号が左上と右下にあるのでデコードする

https://morsedecoder.com/

cpaw{hidden_message:)}
【Swift】初心者のランダム通話アプリ開発奮闘記 #4

# 今日の積み上げ
Titleの下にVStack、HStack、を使ってsubheadlineを付けてみました。
Spacer() を使ったのですが、思い通りの幅にならなかったので、アドリブでwidthを定義したら、うまくいったという、、
来週の月曜日から仕事なのが憂鬱すぎますが、ほどほどに頑張ろうと思います。。
![2022:12:01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/997222/f9a25e47-6df5-ae09-846d-78e4387e8c59.png)
【Ansible】特定のパッケージがインストール済みかどうかでTask処理を分岐させる

[新卒エンジニアによる全部俺カレンダー2022](https://qiita.com/advent-calendar/2022/arie_onlyme2022)　2日目投稿記事です。

## やりたいこと

 yumで特定のパッケージがインストール済みかどうかを確認し、その結果によって以降のTaskの実行可否を分岐させたい

## サンプルコード

httpdがインストールされていなかったら、yum install httpdを実行するコード
```yaml
- name: check if httpd is already installed
  yum:
      name: httpd
      state: installed
  check_mode: true
  register: is_installed
- name: debug check
  debug:
      msg: "{{ is_installed.changed }}" # falseならインストール済み
- name: install httpd
  yum:
      name: httpd
      state: latest
  when: is_installed.changed # インストールしてなかったら（trueだったら）実行される
```

## 解説
```yaml
yum:
    name: httpd
    state: installed
check_mode: true
register: is_installed
```
`check_mode`をtrueにすることによって、playbook実行時は常にdry run（このタスクによってhttpdが勝手にインストールされることはない）
yumモジュールの`state: installed`で、registerに指定した変数にhttpdのインストール情報を格納する。


is_installedに格納される情報が以下の通り。
```
"changed": false,
"failed": false,
"msg": "",
"rc": 0,
"results": [
    "httpd-2.4.54-1.amzn2.x86_64 providing httpd is already installed"
]
```


httpdがインストールされているかどうかの判定はis_installed.changedに格納される。
（インストール済みならfalseとなる）


```yaml
- name: install httpd
  yum:
      name: httpd
      state: latest
  when: is_installed.changed # インストールしてなかったら実行される
```

yumモジュールの`state: latest`でhttpdの最新版をインストールする。
whenモジュールはタスクを実行する条件であり、is_installed.changedがtrueならタスクを実行する。

## 参考
https://docs.ansible.com/ansible/2.9_ja/user_guide/playbooks_variables.html?highlight=register

https://qiita.com/atsushi586/items/a591f1c6dee66773aaeb
Herokuで最新ではないスタックにアップデートする

この記事は [Qiita株式会社のアドベントカレンダー | Advent Calendar 2022 - Qiita](https://qiita.com/advent-calendar/2022/qiita-inc) 5日目の記事です。

世間的には無料が終了したことで話題のHerokuですが、今回は普通にアップデート関連です。

Qiita社では社内Bot等の小さなアプリケーションにHerokuを利用しているわけですが、一部のアプリケーションがHeroku-18を利用していました。
Heroku-18を使っているアプリケーションは2023年の5月1日で新しくビルドが出来なくなる、ということでアップデートをすることにしました。

https://help.heroku.com/X5OE6BCA/heroku-18-end-of-life-faq

アップデート先のスタックにはHeroku-20とHeroku-22が存在し、最新はもちろんHeroku-22なのでそちらに上げたいです。
しかし、アプリケーション側の都合ですぐにはHeroku-22に上げることができなかったので、今回はHeroku-20に上げることを目指します。

## 最新のスタックに上げる場合
Herokuの管理画面にログインし、扱っているアプリケーションのsettingから上げることができます。（スクショは既に20に上げた後）

![スクリーンショット 2022-12-01 17.51.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/359721/06b38669-62c6-0c7d-e6db-85e97d9d4bae.png)

## 最新ではないスタックに上げる場合

### 1.リポジトリを手元にcloneする

herokuで登録しているリポジトリをまず手元にcloneしましょう。（大抵の場合既にしてると思いますが）
```
git clone git@github.com:hoge/fuga.git
```

### 2.Heroku CLIをインストール
次に、[Heroku CLI](https://devcenter.heroku.com/ja/articles/heroku-cli)をインストールします。
今回Macで作業しているので、自分は下記のコマンドで行いましたが、WindowsやLinuxだとまた変わってくると思うので、そちらは公式のヘルプを参照してください。
```
brew tap heroku/brew && brew install heroku
```

### 3.Herokuにコンソールからログイン
コンソールからHerokuにログインしましょう。

```
heroku login
```
コマンドを打つと、

```
heroku: Press any key to open up the browser to login or q to exit: 
Opening browser to https://cli-auth.heroku.com/auth/cli/browser/(適当な文字列)?requestor=(適当な文字列)
Logging in... 
```
と出るので、q以外のキーをタイプするとブラウザが立ち上がりログイン画面が開かれます。
その画面からログインすれば、

```
Logging in... done
Logged in as (あなたのアカウント名)
```
と表示されると思います。

### 4.remoteブランチに登録する
下記のコマンドでherokuと手元のgitを関連づけます。

```
heroku git:remote -a herokuで登録しているアプリケーション名
```

もし、本番環境とステージング環境がある場合、上記のコマンドで切り替えをしましょう。

### 5.指定したいスタックをセットする
ここで、指定したいherokuのスタックをセットします。`--app`オプションを使うことで4の工程を省略もできますが、今回はあえてこちらで。
ここではまだスタックは変わっておらず、次のデプロイから変わる点に注意しましょう。

```
heroku stack:set heroku-20
```

### 6.プッシュしてデプロイ
最後にmasterブランチやmainブランチなど、デプロイしたいブランチをデプロイして終了です。hogeブランチをデプロイしたい場合は下記。

```
git push heroku hoge:master
```

これで、あなたのアプリケーションのスタックはアップデートができているはずです。

## まとめ

今回はHerokuを最新じゃないスタックにアップデートする方法を紹介しました。
とはいえ、最新にスッと上げられる方が良いので、アプリケーションの方も最新にして常に新しく保てるようにしたいと思います。
Pythonで株価の移動平均線を計算する。

チャートツールなどで移動平均線を扱っていると、値が微妙過ぎてグラフからだと移動平均線を超えているか超えていないかが分からない時がある。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953203/f7dd5318-464e-b5be-9a32-a4cbe0355fd5.png)


そんな時にはPhythonの出番。

データを取得してCSVに保存するのは前回の記事を参照されたい。

https://qiita.com/tatsu_sekine/private/7d979c47177c64fb9677

早速だがソースコード。ここでは10か月移動平均線を求めてみる。

```python
import pandas as pd
 
# カラムごとの計算手法を指定
agg_dict = {
    "open": "first", 
    "high": "max",
    "low": "min",
    "close": "last",
    "volume": "sum"
}
 
# CSVからデータを取得
df = pd.read_csv('SP500.csv')
# 月足に変換する
df["datetime"] = pd.to_datetime(df.timestamp, unit="ms")
df_month = df.set_index("datetime").resample("M").agg(agg_dict)
print(df_month["close"].tail(10))
sumSma10 = 0
for index, row in df_month.tail(10).iterrows():
    sumSma10 = sumSma10 + row['close']
print(sumSma10 / 10)
```

実行すると各月の終値と最後に10か月移動平均線の終値が出力される。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953203/de7dba7b-fc1a-ae02-29ac-f2cadb4d94d1.png)

4,080 > 4,057 なので12月の月足は移動平均線を上回って開始されることが分かった。

めでたしめでたし。
就活に行き詰まったら街へ出かけてみよう

「ReDesigner for Student 後輩に贈るデザイナー就活応援 Advent Calendar 2022」、2日目です！

皆さん初めまして！
来年から、コンサルティング会社のクリエイティブ系職種として働くキョウスケです。

今回、縁あって就活生の皆さんに発信できる機会をいただきました。

何か有益なことを書きたい…！とは思ったものの、僕は皆さんより1年早く就活をしていただけで、何か特別なスキルを持っていたわけではないごく普通の就活生でした。

逆に、普通の就活生だったからこそ何か伝えられるのでは..?と思ったので、僕が1年前特に悩んでいた職種選びについて書こうと思います。




こんな考えもあるんだなあ程度に軽い気持ちで見ていただければ…！


・・・・
・・・・
・・・・

# 職種にとらわれない企業選び

就活前の自分は、プロダクトデザイナーか、UI/UXデザイナーのどちらかになるのかなあとなんとなく思っていました。
自分の周りにいたほとんどの先輩や同期はデザイナーを目指していた環境にいたので、自分もデザイナーを目指すのが当たり前だと思っていたのです。

そのため、就活の最初はとにかく色々なデザイナー系職種の説明会やインターンに参加していました。
デザイナーになることは前提として、何のデザイナーになるか(プロダクト,UI/UX,空間etc...)決めるんだ！という気持ちで色々なイベントに参加していた気がします。
しかし就活の中で段々と自分のやりたいことが見え始め、結果デザイナーではなくコンサルティング会社のクリエイティブ系職種で働くことを選びました。


就活を通して感じたことは、「企業ごとに職種名が違っても、案外業務内容の本質は一緒だったりする」ということです。

自分のやりたいことは、ある会社では「UXデザイナー」かもしれないし、ある会社では「PRプランナー」、ある会社では「商品企画職」かもしれません。


ただ、「大学でずっとデザインについて学んできたけど、結局デザイナーにはならない」というのはかなり勇気のいる決断で、今まで学んできたことが全部無駄になってしまうような気がするかもしれません。

しかし、「デザイナー」と名のつかない職種でも実はデザイン的なことができたり、今まで大学で学んできたことを生かせる職場環境はたくさんあります。

「職種名が違うだけで、できることは実は同じ」みたいなことは結構あるなあと就活中ひしひし感じていました。

そのため、皆さんには、職種にこだわりすぎない就活をしてほしいな〜と思います！


「将来は〇〇デザイナーになるんだ！」と職種で企業をフィルタリングするのではなくて、自分のやりたいこと軸で企業を探していけば、少し視野が広がるかもしれません。


ただ、そういった企業の探し方をするには、やはり「自分のやりたいこと」を軸として持っておくことが大事なんじゃないかと思います。(耳の痛い話かもしれませんね...笑)

# 自分のやりたいことの見つけ方

実際「自分のやりたいことを見つける」ってすごく難しくて、多くの人が悩んでいることだと思います。
就活が本格化してきたこの時期、自分のやりたいことを見つけようとひたすら色々な企業情報を見ている方もいるかもしれません。


ずっと就職活動と向き合っていると、就活掲示板や大学内の狭い環境がどうしても世界の全てに見えてしまいます。

自分のやりたいことを探しているはずが、知らず知らずのうちに自分の視野を狭めてしまっているかもしれません。


なので、就活と向き合いすぎて自分のやりたいことがわからなくなったら、一息ついて街に出かけてみることをオススメします！

現実世界は広くて複雑です。注意しながら街を歩いてみると、面白い気づきがたくさんあります。
家の中、毎日の通学路、電車内の広告などなど、、思わぬところに「自分の好き」が転がっているかもしれませよ。

街を歩く中で見つけた、純粋に心を動かされたことこそが「自分のやりたいこと」の源になる気がします。


企業選びは、パソコンと睨めっこしながらするものではありません。
あまり気負いすぎず、たまにはパソコンから離れて、リフレッシュしてくださいね！


# 最後に
以上、企業選びに困ったら自分のやりたいことを考えて外に出てみよう！というお話でした。
就活生の皆さんが何か一歩踏み出すきっかけになったら嬉しいです！

12月25日まで、アドベントカレンダーは更新されます。

明日の先輩のエピソードもお楽しみに！


執筆者：
Twitter:@1111_design
CpawCTF Writeup Level 1 Q14.[PPC]並べ替えろ! (注意<spoiler>)

# Q14.[PPC]並べ替えろ!
```
下にある配列の中身を大きい順に並べ替えて、くっつけてcpaw{並べ替えた後の値}をフラグとして提出してください。
例：もし配列｛1,5,3,2｝っていう配列があったら、大きい順に並べ替えると｛5,3,2,1}となります。
そして、フラグはcpaw{5321}となります。
同じようにやってみましょう（ただし量が多いので、ソートするプログラムを書いたほうがいいですよ！）


[15,1,93,52,66,31,87,0,42,77,46,24,99,10,19,36,27,4,58,76,2,81,50,102,33,94,20,14,80,82,49,41,12,143,121,7,111,100,60,55,108,34,150,103,109,130,25,54,57,159,136,110,3,167,119,72,18,151,105,171,160,144,85,201,193,188,190,146,210,211,63,207]
```

プログラムを書く
```:main.cpp
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
#define rep(i,n) for (int i = 0; i < (n); ++i)

int main(){
    vector<int> a = {15,1,93,52,66,31,87,0,42,77,46,24,99,10,19,36,27,4,58,76,2,81,50,102,33,94,20,14,80,82,49,41,12,143,121,7,111,100,60,55,108,34,150,103,109,130,25,54,57,159,136,110,3,167,119,72,18,151,105,171,160,144,85,201,193,188,190,146,210,211,63,207};
    sort(a.begin(), a.end(), greater<int>());
    rep(i,a.size()) cout << a[i];
}
```
```
>g++ main.cpp

>a.exe
2112102072011931901881711671601591511501461441431361301211191111101091081051031021009994938785828180777672666360585755545250494642413634333127252420191815141210743210
>
```

cpaw{2112102072011931901881711671601591511501461441431361301211191111101091081051031021009994938785828180777672666360585755545250494642413634333127252420191815141210743210}
Unit test で LifeCycleメソッドを呼ぶ

参考：
[Testing for viewDidLoad in iOS](https://medium.com/fantageek/testing-for-viewdidload-in-ios-7808a155ccfc)
[[iOS、Swift] ユニットテストの時に、任意のタイミングでViewDidLoad()、ViewWill(Did)Appear()、ViewWill(Did)Disappear()を呼び出す方法 - Qiita](https://qiita.com/mii-chan/items/a9d8fd420d04b92a1c34)

# viewDidLoad

実装

```swift
class ViewController: UIViewController {
	var searchBar = UISearchBar()
	override func viewDidLoad() {
		searchBar.delegate = self
	}
}

extension VIewController: UISearchBarDelegate {
	public func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
    //なんかの処理
  }
}
```

viewDidLoadはクラスが初期化されただけでは呼ばれないため
この場合テストは失敗する。

```swift
class ViewControllerTests: XCTestCase {
	func test_set_delegate_to_searchBar() throws {
		let viewController = ViewController()
    
    
    XCTAssertNotNil(viewController.searchBar.delegate)
	}
}
```

ではテストでviewDidLoadを呼べばいいかというとベストプラクティスではない。
（テストはパスする）

```swift
class ViewControllerTests: XCTestCase {
	func test_set_delegate_to_searchBar() throws {
		let viewController = ViewController()
    
		viewController.viewDidLoad()
    
    XCTAssertNotNil(viewController.searchBar.delegate)
	}
}
```

viewDidLoadはviewにアクセスされた時に実行されるイベントなので、
結果的にviewDidLoadを2回呼んでしまうことになる。
つまりviewにアクセスするだけでいい。

```swift
class ViewControllerTests: XCTestCase {
	func test_set_delegate_to_searchBar() throws {
		let viewController = ViewController()
    
		_ = viewController.view
    
    XCTAssertNotNil(viewController.searchBar.delegate)
	}
}
```

または `loadViewOfNeeded`を呼ぶ

```swift
viewController.ViewController()
viewController.loadViewIfNeeded()
```

# ViewWillAppear

beginAppearanceTransitionの第一引数をtrueにして呼ぶ

```swift
viewController = ViewController()
viewController.beginAppearanceTransition(true, animated: false)
```

# ViewDidAppear

beginAppearanceTransitionの第一引数をtrueにして呼んだ後に
endAppearanceTransitionを呼ぶ

```swift
viewController = ViewController()
viewController.beginAppearanceTransition(true, animated: false)
viewController.endAppearanceTransition()
```

# ViewWillDisappear


beginAppearanceTrasitionの第一引数をfalseにして呼ぶ

```swift
viewController = ViewController()
viewController.beginAppearanceTrasition(false, animated: false)
```

# ViewWillDisappear

beginAppearanceTrasitionの第一引数をfalseにして読んだ後に
endAppearanceTrasitionを呼ぶ

```swift
viewController = ViewController()
viewController.beginAppearanceTrasition(false, animated: false)
viewController.endAppearanceTrasition()
```

# ViewWillLayoutSubviews

layoutViewIfNeedeを呼ぶ

```swift
viewController = ViewController()
viewController.view.layoutViewIfNeeded()
```
Pythonで株価を取得する。

Pythonで株価を取得してみる。
ここではS&P500を例とする。

いきなりだがソースコード

```python
import sys
from yahoo_finance_api2 import share
from yahoo_finance_api2.exceptions import YahooFinanceError
import pandas as pd
 
my_share = share.Share('^GSPC')
symbol_data = None
 
try:
    symbol_data = my_share.get_historical(
        share.PERIOD_TYPE_YEAR, 2,
        share.FREQUENCY_TYPE_DAY, 1)
except YahooFinanceError as e:
    print(e.message)
    sys.exit(1)
 
df = pd.DataFrame(symbol_data)
df["datetime"] = pd.to_datetime(df.timestamp, unit="ms")
print(df)
df.to_csv('SP500.csv')
```

今回はYahooのAPIを利用したが、他のAPIも含めてこの手のAPIは短時間に何回も叩くと制限に引っかかるのでCSVに変換したうえで、CSVからデータ分析を行うのがよい。（モジュールを分割すべし）
なお、他の株価を取得したい場合は^GSPCを取得したいティッカーシンボルへ変更すればよい。

Python IDLEよりRun Moduleで実行。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953203/ca9eaa08-0967-d23c-b99b-d99b0acf5a25.png)

コンソールに結果が出力され、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953203/2afa25a1-f889-09ca-488f-c454b0ab7733.png)

CSVにも値が出力された。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953203/6b14591a-3792-162b-bd90-6ff9eb1fa076.png)

めでたしめでたし。
Flexboxを学び直す

[ひとりCSS Advent Calendar 2022](https://qiita.com/advent-calendar/2022/css-becolomochi) 2日目です。

Flexbox を学び直します。

## Flexbox を使うには

親のコンテナーに `display: flex` と書くとできる。

### サンプル

```html
<div class="parent">
  <div class="child">
    child
  </div>
  <div class="child">
    child
  </div>
  <div class="child">
    child
  </div>
</div>
```

```css
.parent {
  display: flex;
  gap: 16px;
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41088/3095af2f-2085-42fe-3e20-f47375f8446a.png)

## 親のコンテナーに指定できるプロパティ

- `flex`
    - `flex-grow`, `flex-shrink`, `flex-basis` のショートハンド
- `flex-flow`
    - `flex-direction`, `flex-wrap` のショートハンド
- `flex-wrap` - アイテムを1行に配置するか折り返しするか
    - wrap - 折り返したいときに使う
- `justify-content` - 左右方向の配置を指定
    - flex-end - 行末
    - space-between - 両端揃え
- `align-items` - 上下方向の配置を指定（1行時）
    - stretch - 高さいっぱいに広がる
    - center - 中央
- `align-content` - 上下方向の配置を指定（複数行）
- `flex-direction` - 配置の向きを指定
    - row - 横並び（デフォルト値）
    - row-reverse -  row と同様だが、逆向き
    - column - 縦ならび
    - column-reverse - column と同様だが、逆向き
- `gap` - 子（アイテム）まわりの余白を指定

## 子に指定できるプロパティ

- `align-self` - 親に指定する align-items を上書きできる
- `flex-basis` - 幅の指定
- `flex-grow` - どれだけ広くするか
- `flex-shrink` - どれだけ狭くするか
- `order` - 順番

## 遊んでみる

<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="wvXYBJN" data-user="becolomochi" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/becolomochi/pen/wvXYBJN">
  Flexbox</a> by Beco (<a href="https://codepen.io/becolomochi">@becolomochi</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

## 感想

- 色々プロパティが用意されているものの、実務として使うのは限られているんだよな…という気持ちでいる
    - flex-grow, flex-shrink はめったに使わない
        - 挙動をしっかりコントロールできないため
- gap がモダンブラウザ対応で使えるようになって便利になった。

## 参考

- https://developer.mozilla.org/ja/docs/Web/CSS/CSS_Flexible_Box_Layout/Basic_Concepts_of_Flexbox
- https://developer.mozilla.org/ja/docs/Glossary/Flex_Container
- https://developer.mozilla.org/ja/docs/Glossary/Flex_Item
AWSでサポートケースを起票する時に気をつけること

## はじめに

本記事は、[エムスリーキャリア FY22 AdventCalendar](https://qiita.com/advent-calendar/2022/m3c)の6日目の記事になります。

## サポートケースって？

AWSのサポートを受けるための問い合わせのことです。問い合わせはケースという単位で管理されます。

AWSでは下記の３種類のサポートケースがあります。

- アカウントおよび請求のサポートケース
- サービスの上限緩和リクエスト
- Technical support (技術サポート) ケース
  - サポートプランが　Basic　Supportプランだと、このタイプのケースは作成できない。

https://docs.aws.amazon.com/ja_jp/awssupport/latest/user/case-management.html

本記事では、良い **技術サポートケース** の書き方について記述していきます。

## 良い技術サポートケースとは？

技術サポートケースをあげる状況というのは、AWS環境を利用するにあたり、困っていることを解決したい時です。

では、良い技術サポートケースを起票する意味とはなんでしょうか？

そのためには、サポートエンジニアの立場を知ると理解しやすいかもしれません。

テクニカルサポートエンジニアだった自分が教わったのは、サポートするために必要な第一ステップは「 **お客様が遭遇している問題を正しく理解すること** 」でした。

そうでなければ、お客様の状況にあった適切な情報や解決策がご案内できません。

したがって、サポートエンジニアが問題を理解するために必要な情報を最初から提供できれば、サポートエンジニアから追加で確認を求められることが少なくなります。その結果、コミュニケーションの往復が減り、結果として問題解決が早くなることが期待できます。

このような円滑なコミュニケーションができているケースの書き方をしているのが、よい技術サポートケースと言えます。

## AWS サポートケースのプラクティス

AWSは、サポートケースに記載して欲しい内容について、下記のドキュメントで案内しています。

https://aws.amazon.com/jp/premiumsupport/tech-support-guidelines/

その中でも、特に一般的な内容で、よく忘れがちな内容としては下記があります。

- 全般的な留意事項
- 解決したい課題を明確にする
- 状況を正確に共有する
- 経緯を共有する

## サポートケースの雛形

上記ドキュメントはケース記載の際に気をつけることですが、そもそもサポーケースはどう言う流れでどんな項目を記載すべきでしょうか？

一般的には、下記のような流れでケースを記述するのが良いと思われます。

- 課題・困っていることを一言で言う
- 問題の前提条件、アプリケーションの構成などの環境情報
- 問題の再現手順（AWS環境で何か処理を実行したり、操作を行ったなら、その操作時刻とタイムゾーン）
- 発生した事象
    - 事象について説明する場合、ログやCloudWatchのメトリクスのスクリーンショットがあると、とても良いです
- 期待値ないしは確認事項を明確に記載する
    - サポートエンジニアの回答が「はい」or「いいえ」となるような質問の形式で問い合わせるのがベストです。確認したい事項を明確にし、サポートエンジニアの調査方針をコントロールする上でとても重要です。

## さいごに

サポートエンジニアとうまくコミュニケーション取れているか、今一度振り返ってみるきっかけになれば幸いです。
new relicのコスト妥当性確認

# new relic 未利用者が、パッと見える機能だけでも自前で作ったら幾らかかるのか？

## 課題（というかストレス）と対策

- new relic入れようとしたら、ドイツもロイツもROI、ROI、ROI　! 　
そんなにいうなら、小一時間で思いつくやりたい事を挙げてみて、もしも自前でやったら幾らかかるのか、これだったら大人しくnew relic使った方がいいんじゃないのぉーっ？って言ってみたい。

## ROI?

Return On Investment

投資収益率、投資利益率、投資対効果

${(効果コスト)/(導入コスト)>1}$　

これなら　導入した方がお得。
社員数150名位の我が社では絶賛コスト見直し中。
いつでもなんでもこれでお得だと納得してもらえるらしい。

## 必要な物は組織によって違うが、それぞれ自前でやると幾らかかるのか？

### 必要そうな物事↓（new relicのスコープ外っぽい物は最初から書かなかったり、打ち消し線ひいたり）

### 社会的信頼や責任

SRE的仕事

- 快適
    - 早い（使いやすい）
- 使える
    - 落ちない
    - （使いやすい）
- 安全
    - 安心感
        - ~~規程~~
        - ~~手順・フロー、ガバナンス~~
            - ~~認証・認可、権限管理~~
    - セキュリティ

~~SLA~~

- SLO
    - SLAを割らないように社内で対策を取る閾値は？そこまであとどれくらい？大胆かつ慎重なリリースやメンテナンスをするために気にする値
- SLI
    - 管理するのは何の値？
        - どうやって計測・取得
        

### 改善するための観測値

インフラ的観測

- リソース
- パフォーマンス
- 構成管理
    - 物理（H/W)
    - 論理（M/W,S/W)
        - EOL/EOS
        - その他のVersion管理
    - ~~設定情報~~

開発的観測

- パフォーマンス
- ライブラリ管理

### 納得・得心・安心して日々の対応をするための情報共有

- グラフツール
- レポート
- 通知

### 何がこれまでどうで、これからどうなるのかの予測値

- グラフ
- レポート
- 通知

## 観測して改善するために

### 最低かかるコスト（管理するNW(≒AWSアカウント)が60個の場合）コストが1日稼働で5万円として

↓

　**イニシャル: 1,475万円**

　**ランニング: 4,148万円/年**　

加えて、

　           **納期:** 完成時期や対応の遅れ: 存在する箇所だけで**10ヶ月**後　自動化対応完了前の追加案件は開始が遅延する

### コストの内訳

（要らないところは削ればいいし、自分だったらもっと安くできるならやればいい）

観測値の共有ツール

　・構築

　　・エクセルでもスプレッドシートでも良いならほぼ無料　1日仕事　10万円

　・運用

　　・データインプット　貼り付け60箇所　0.5万円/月

　　・仕様変更対応　1万円/月

通知

　・特定の値になったらSlackに通知　初期構築　30万円

　・宛先変更とか閾値変更とか新しい値の追加とか　運用　10万円/月

レポート

　・定期的にまとめて通知　初期構築　30万円

　・変更、運用、宛先別とか　5万円/月

構成管理ツール

　・クラウド連携　初期構築300万円

　・変更、運用とか＋サーバ　15万円/月

　・仕様変更対応　10万円/月

SLO/SLI

・初期構築　5万円

・ランニング（サーバ）　10万円/月

~~snmp~~,クラウドメトリクス、グラフツール

　・初期構築　AWS 無料

　・見たいものだけみる専用の表示画面

　　・初期構築　100万円

　　・運用＋サーバ　15万円/月

データ正確性担保のための横断管理（60アカウント）

　・運用　180万円/月

↑個別の機能は作れない事もないが、↓連携は無理

それぞれのデータを行き来して関連性の有無を確認するインターフェース　初期構築　　1000万円くらい

　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　仕様変更　  　100万円/月くらい

ざっと、必要なものを挙げてみただけでこれ。

ニーズに合わせて増減してもらって、金額を再度算出してもらったらnew relicの価値がわかるかもしれない。

と、

ここまで作っておいてなんだけれども、

ドイツもロイツも、普段からコメを自宅で作って、自作の玄米味噌を舐めて玄米飯を食うような生活しているのだろうか？
肉も野菜も米もよそから買ってるし、IROIROと買分けて暮らしているよね。
new relicとか外部サービスを自前で用意せずに外から買うのも同じことでは？
それくらい、自前で作った場合に高くなるのが当たり前なので、それを論じる意味がなさそうな気がしてきた。
活用出来なかったら当然のことながら損なのだけれど、活用出来ないのは組織が標準から外れていると思った方が良い。


おしまい。

## 追記。
###（AWSを利用中の人たちが、「来年何しようか？」「オブザーバビリティを組織に浸透させたいね。」「どんな効果あるかね？」って話したのをメモ。）

new relicを活用したら

- SLOの達成状況がわかる→危ないところ、未達のところがわかる→具体的なSLIから、誰に頼んでどうなったのかわかる→開発者が勝手に改善してくれたではなく、連帯感がある。責任感のある対応ができる。対応の充実度があがる。
- マルチベンダー・マルチクラウド（インターネットエッジはAWS、アプリケーションはサーバレスでGCPのAppEngine等）の構成をする時に、AWS内部のサービスでは、GCPのモニタリングができない→サードパーティ利用
- コストの減らし方には種類があるけれど、DevOpsの開発サイクルをnew relicで見守れば、全て解決が可能になる
    - 単純にリソース使用量が少ない→リソースを減らせる（但し、スケーリングは迅速に→ECS・サーバレス）
    - リソース使用量が多いが、アプリケーションロジックや処理に問題がある→処理などを変更すればリソースを減らせる
    - 構成がそもそも改善可能（スケーリングが遅い、管理ツールが不要等）
- 売り上げは単年・単月の数値　コストカットは未来永劫？サービス継続期間分の支出減　になる　効果は見えないけど大きい
    - そもそも無駄な構成を作らない→DevOpsのサイクル　開発中も実運用中もモニタ出来る→負荷を考えて開発が出来る→迷ったらどっちが早さと負荷のバランスが良いか選べる
- 構成管理ができる
    - M/WやS/WのVer.管理
    - ~~設定管理は出来ない~~
    - CVE検出
- チームの品質を維持出来る、エンジニアの成長を促す、チームエンジニアリングを加速する→開発効率があがる→開発コストが下がる

#### 物事は観測出来るから直せる。目を瞑っていれば直すべき事にも気付けない。
#### 人間は立って歩くから転ぶ。初めから寝ていれば決して転ぶことはない。（ずっと寝てろ。）
初心者がプログラミングサークルに入ってみたら

2022年4月、初心者の私はプログラミングサークルDo'erに所属しました。そこからの8ヶ月でどのような変化があったのか、ご紹介したいと思います。

# 生態
私の生態について軽く説明します。
- 2回生
- 文理融合の学部の理系女子
- サークル掛け持ち(現在別のサークル長)
- ロボティクス系の研究室所属

# 驚異的な初心者ぶり
Do'erに入る前の私はどんな感じだったと言いますと...

**Pythonしか勝たん！**

授業でPythonを習っていたのでなんとなく触れるくらいでした。が、授業の理解度が高い方だったのでPythonはできると思い込んでいました。まさに井の中の蛙

そんな初心者の私ですが、プログラミングを書くことが楽しくて仕方がない人間でした。そして、私にはプログラミングの目標がありました！

1. Webアプリケーションを作れるようになる
1. 機械学習・AIに精通する

そして、Twitterで見つけたDo'erに一目惚れして入会に至りました。

# Web開発デビュー
lぼんやりとした目標だけを持って入会して1ヶ月、初めてハッカソン「技育CAMP vol.4」に参加する機会を頂きました。この時期の私はHTMLを書くことしかできない人間でした。フロントエンドで参加しました。使用技術はReact。HTMLしか書けない私にとっては大航海です。JavaScriptからGitHubの使い方、チーム開発、Reactの使用と初めてがいっぱいのハッカソンになりました。そんなハッカソンで、なんと**努力賞**をいただくことができました✨さらに、このおかげで技育展にも出場させていただきました！

# 競プロデビュー
デビューはまだ続きます。
競技プログラミングを始めることになりました。きっかけは青コーダーであり、現在私のメンターをしてくださっているcozy_saunaさんとの出会いです。
まだ灰コーダーですが、茶パフォを安定して出せるくらいの実力がつきました。年内の入茶を目指して頑張っています！
忙しくないときは、なんやかんや週末の21:00から競技プログラミングに没頭しています。

# 素敵な先輩たちとの出会い
Do'erで素敵な先輩たちと出会えたのもまた良い変化だったと感じています。雲の上の存在でありながらもさらなる高みを目指している方々って、本当に素敵すぎませんか！？そんな先輩方に教えてもらいながら、楽しくお話しできる。常に刺激があって楽しいです。

# 一進一退
Web開発と競技プログラミングの2足の草鞋を履き、あわよくば機械学習までと考えている私ですが、そう簡単に全てが上手くいきません。


- 大学とサークルとの両立
- Web開発と競プロの両立
- モチベーションの維持

2回生で授業が忙しく、別サークルの活動も活発なので思ったように時間を当てられないってことよくありますよね。(多分)あと、アウトプットする機会がなかったらなかなか触らないので、モチベーションの維持も大変です。これからの課題といったところ。

# まとめ
初心者の私がプログラミングサークルに入ったらを書かせていただきました。様々な変化がありましたが、プログラミングを楽しむ心だけは今も尚変化しておりません！ **プログラミング楽しい！** これからは、チームリーダーを務めるハッカソンをはじめとして様々なイベントがあるので、これらを通してアウトプットして、技術を身につけていきたいと思っています！
nodejs + express + mongoDB、 Routerでapi管理

# はじめに
nodejs + express + mongoDBでrouterによるapi管理の方法がなかなか見つからず、苦戦していたので、ここにメモ


# 構成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821152/baab2c38-6ec3-db26-1259-c5f7fdc9c4c7.png)

# Code
```javascript:server.js
const express = require('express');
const app = express();
const bodyParser = require('body-parser');
require('dotenv').config()
app.use(express.json());
app.use(bodyParser.urlencoded({ extended: true }));
app.set('view engine', 'ejs')

var db
const MongoClient = require('mongodb').MongoClient
const mongoDbUrl = `mongodb+srv://${process.env.MONGODB_ID}:${process.env.MONGODB_PASSWORD}@cluster0.akash.mongodb.net/?retryWrites=true&w=majority`

MongoClient.connect(mongoDbUrl, function (err, client) {
    if (err) return console.log(err)
    db = client.db('nodejs-work-request')

    //rouetrで使えるように宣言
    app.db = db
})

// server.jsでusers.jsを使用する
app.use('/', require('./routes/users.js'))


//server.jsで使用する場合のDBの使用方法、これをrouterで管理する
app.get('/users', function (req, res) {
    db.collection('users').find().toArray((err, result) => { 
        res.send(result)
    })
})
```


```javascript:users.js
var router = require('express').Router();

router.get('/users', (req, res) => {
    req.app.db.collection('users').find().toArray((err, result)=> {
        res.send(result)
    })
})

//server.js で使用するたにexport
module.exports = router;
```


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821152/07ae3192-eddc-918a-83aa-69d40d8562fb.png)
問題なく、mongoDBから読み込めた。

# 関連
https://qiita.com/junzai/items/de839f43d98a9b29ccdd
【Salesforce】【多要素認証】MFA除外ユーザの設定方法


https://qiita.com/piepie1231/items/e311fcc5f98a4a076ebc

summer'22 のリリースノートまとめでも言及していましたが
実際に使う場面が出てきたので設定方法まとめました！

# 権限セットの作成

設定画面で「権限セット」の画面を開き、新規ボタンを押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461666/210e24af-ee73-8f37-af7d-6df0602c004c.png)


表示ラベルとAPI参照名に任意の値を入力し保存ボタンを押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461666/3c011bb0-9ca8-8c75-37ba-ea62cfa108fb.png)


作成した権限セットを開き、「システム権限」を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461666/15b94927-ec33-a5b4-fcc4-8e6f5339396f.png)


編集ボタンを押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461666/b17efdbe-4673-8cb3-5de2-a7e861cfa796.png)


「除外ユーザの多要素認証を放棄」を有効にして保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461666/1d06ee66-e0a4-ceba-98f9-79389ffebe47.png)


# ユーザの割り当て
作成した権限セットの画面で割り当ての管理ボタンを押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461666/7daf07cf-8f19-11e0-a58a-732ec732d5b2.png)


割り当てを追加ボタンを押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461666/ab377f1e-afbe-ed91-0aad-b03b844ef4f8.png)


多要素認証を除外したいユーザを選択し、次へボタンを押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461666/e6c2d8fa-7923-445d-6f78-2d3d6a81d304.png)


有効期限を設定し、割り当てボタンを押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461666/6e15537c-2c14-8d49-c3f8-15321ecf6064.png)


割り当てができていれば完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461666/a0eaf09b-9ec3-4686-ced5-52c8a0bf6cdd.png)


# 参考

https://help.salesforce.com/s/articleView?id=sf.security_mfa_exclude_exempt_users.htm&type=5
ReportLabで長い表を作るとき、改ページ後にもテーブルヘッダーを表示する

ReportLabでPDFを作るシリーズ第2弾

## DocTemplateとLongTableを使おう

### SimpleDocTemplateの使い方

```python
doc = SimpleDocTemplate(filename=filename)
flowables = [
    # Flowableオブジェクトのリスト
]
doc.build(flowables)
```

もっと複雑なレイアウトの例は第1弾の [お前らのReportLabの使い方は間違っている](https://qiita.com/kokardy/items/92e8f3b65c965e20de34)を参照


### LongTableの使い方
```python
table = LongTable(table_contents, repeatRows=1)
```
repeatRowsを指定することで改ページ時に繰り返す行を指定する

TableStyleをセットして、罫線や寄せなどを指定できる。

## サンプルソース

```python
from reportlab.lib import colors
from reportlab.platypus import (LongTable, Paragraph, SimpleDocTemplate,
                                TableStyle)


def main() -> None:
    filename = "/tmp/temp.pdf"
    doc = SimpleDocTemplate(filename=filename)
    table_style = TableStyle(
        [
            ("ALIGN", (0, 0), (-1, 0), "CENTER"),  # header
            ("GRID", (0, 0), (-1, 0), 2, colors.red),  # header
            ("GRID", (0, 0), (-1, -1), 1, colors.black),  # body
        ]
    )
    header1 = Paragraph("<font color='blue'>header1</font>")
    table_contents = [
        [header1, "header2", "header3"],
    ]
    for i in range(1, 51):
        table_contents.append([f"row {i}", f"{i+100}", f"{i+200}"])
    table = LongTable(table_contents, repeatRows=1)
    table.setStyle(table_style)

    flowables = [table]

    doc.build(flowables)


if __name__ == "__main__":
    main()

```

## 出力結果

![reoprtlab_test.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28898/fb6b0955-cee2-52d6-3f0a-1c6d0f08770c.png)
DatadogのCommunity Team

本ブログはDatadog Japan 2022年アドベントカレンダーの1日目の投稿です。

## DatadogにおけるCommunity Team
以前[こちらのブログ](https://medium.com/@taiponrock/datadogへjoinしました-728148430148)に書きましたが、私は9月末からDatadog Japanで働いております。
Role(役割)はテクニカルエバンジェリスト（テクニカルアドボケイト）になります。
所属はEngineering Teamの中のCommunity Teamというところです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81226/ac8593c5-2c0e-32e1-a0d0-cdb98469c463.png)

では、DatadogにおけるCommunity Teamというのはどういう役割を担っているのでしょうか？
実はこれ、Datadog社内でもまだしっかりと認知されていないかもしれません。なぜなら、私がJoinするまで、日本にはテクニカルエバンジェリストはもちろんCommunity Teamの人間が一人もいなかったからです。
なんなら、APACで私が一人目のテクニカルエバンジェリストということで、少なくともこれまでアジア圏ではDatadogのコミュニティ活動というのはあまりできていなかったと思います。

そんなCommunity Teamですが、たぶんみなさん、テクニカルエバンジェリストの仕事というのはなんとなく想像つく方も多いのではないかと思います。
技術系のカンファレンスなどでプレゼンを行ったり、ユーザーコミュニティイベントなどでお話をさせていただいたり、技術系コンテンツを提供したり、ハンズオンワークショップやセミナーなどを実施したり、そんなイメージではないでしょうか？
Datadogのテクニカルエバンジェリストも、だいたいそんな感じです。

![Screen Shot 2022-12-01 at 18.31.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81226/7feaf99d-66e1-82bc-6249-6e70c7165788.png)

Community Team全体を見ると、エバンジェリスト（アドボケイト）以外のRoleのメンバーもいまして、かんたんに紹介していきたいと思います！

| Role | 
|:-----------|
| Technical Curriculum Developer       |
| Technical Advocate/Evangelist       |
| Developer Relations       |
| Software Engineer       |
| Technical Writer       |
| Documentation Editor       |
| Resercher       |
| Customer Education & Training       |
| News Letter & Engineering Blog       |

まあ、こんなところでしょうか。
総勢39名のチームになりますが、先述の通りAPACには私一人しかおりません。
残りのメンバーはほとんどがアメリカ（米国、カナダ）で、数名ほどヨーロッパ（UK、スイス、スペイン、フランス）といった感じです。
これね、Team Meetingが大変なんですよ、時差調整が。Japanの私に合わせるとその他大勢が夜中になっちゃうので、基本的に日本時間の真夜中（1時、2時くらい）です 笑

まあ、それはさておき、メンバー構成を見てお気づきの方もいらっしゃると思いますが、Community Teamと名乗っていますが、いわゆるユーザーコミュニティ/ユーザー会的な部分をカバーするRoleが無いんですよね。強いて言えばDeveloper Relations担当なんですが、あまりコミュニティ（グループ）に重きは置いていません。
通常、我々のようなチームにはコミュニティマネージャーなるRoleがあることが多いのですが、Datadogでは残念ながら現状コミュニティマネージャーはおりません。

では、日本でユーザーコミュニティは蔑ろにするのか？いえいえ、そんなことはございません！
私がテクニカルエバンジェリストとしての活動の一環として、ユーザーコミュニティを支援していきたいと考えてますのでご安心ください。
先日、Datadog Japan 主催でユーザー向けMeetupを開催しました。こんな状況下ではありますが、オフラインイベントとして京橋の東京スクエアガーデンweworkを借りて実施したところ、約30名の方にお集まり頂けました！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81226/a688f761-b159-e75c-aa1e-8e1c8df41861.png)

今後も、ユーザーのみなさんの横のつながりを作れる場を企画していきたいと考えてますので、こんなことやりたい、やってほしい、などご意見ありましたらお気軽に私までご連絡いただけると嬉しいです！

このブログ（アドベントカレンダー）もそんな活動の一環です。呼んでみてご興味ある方は、今からでも全然OKですので、ぜひアドベントカレンダーへ参加してみてください 👋

ではでは！
Migrate deployer from 6.x to 7.x

homebrewで入れてたdeployerを 6.x->7.xにアップデートしてしまい設定ファイルを変更するはめになった。

[https://deployer.org/docs/7.x/UPGRADE](https://deployer.org/docs/7.x/UPGRADE)を参考にする


```
-    ->user('xxxxxxxx')
-    ->port(10000)
-    ->identityFile('~/.ssh/id_rsa')
-    ->forwardAgent(true)
+    ->set('remote_user', 'xxxxxxxx')
+    ->set('port', 10000)
+    ->set('identity_file', '~/.ssh/id_rsa')
+    ->set('forward_agent', true)
```

IdentityFileはサーバ側でcloneするときの鍵の設定で、デフォルトで`.ssh/config`を見るようなのでそっちに書いといてもよかったかも。

そして実行。

```
[remote_host]  error  in update_code.php on line 90:
[remote_host] run export GIT_TERMINAL_PROMPT='0' GIT_SSH_COMMAND='ssh -o StrictHostKeyChecking=accept-new'; [ -f /home/xxxxxxxx/web/.dep/repo/HEAD ] || /usr/local/bin/git clone --mirror git@gitserver:xxxxxxxx/web.git /home/xxxxxxxx/web/.dep/repo 2>&1
[remote_host] Cloning into bare repository '/home/xxxxxxxx/web/.dep/repo'...
[remote_host] command-line line 0: unsupported option "accept-new".
[remote_host] fatal: Could not read from remote repository.
[remote_host] Please make sure you have the correct access rights
[remote_host] and the repository exists.
[remote_host] exit code 128 (Invalid exit argument)
```

"accept-new"オプションに対応してねーよ。的なコメントが出た。
デフォルトでgit clone時のsshのオプションが付くようになったようだが
サーバのsshが対応していないので外したい。

[https://github.com/deployphp/deployer/issues/2908](https://github.com/deployphp/deployer/issues/2908)

ということぽいので

```
+set(‘git_ssh_command’, ‘ssh’);
```

あとは、指定しないと動かなかったtaskのmigrateなどが指定しなくても動くようになったりしたので、削除した。

完了。

`ｄep deploy` 時に飛んでいた飛行機のアイコンが無くなって寂しい。
未経験から転職成功した人の共通点3選

# はじめに
今回、自分が運営するプログラミングコミュニティ「Progaku」でアドベントカレンダーに参加することになりまして、記念すべき第一日目を担当させていただくことになりました！

Progakuは設立して9ヶ月、参加人数はおよそ50名ほどのプログラミングコミュニティです。
僕はというと、エンジニア歴8年目のフリーランス歴5年目の人間です。

参加当時は業界未経験の学習中だった方が記事執筆現在で、およそ20%ほどの方が現役でやってるもしくは、業務委託で仕事をされている状況です。

その中で、僕があぁ**こういう人が転職成功していくのかと思ったことが3つ**あるのでそれを書こうかと思います！

:::note warn
今回の記事は、僕がコミュニティを運営して感じた、あくまで個人的な考えです
:::

# [その１]転職活動に力を入れてる
![8e91d0da3ccf3ed79dc0e9638600075c_600.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474880/5c8a935f-acd6-10d5-224d-f38aefcc2b14.jpeg)

わかります。わかります。落ち着いてください。

僕が見てきた人でこういう人が割と多くいました。それは

**ポートフォリオを作るのに必死で転職活動ができていない人**
*これ以降ポートフォリオ=PFとする

より良いPFを作りたいのもエラー出ずに完璧に仕上げたい気持ちも分かりますよ？
(まぁ、でも実際はみんなが使ってるあのサービスだって完璧じゃないし日々エンジニアが不具合修正したりテスト回してるんですよ笑)

でもこれは落とし穴で、あなたが叶えたいのは
・完璧なPF実装
・転職成功
どちらでしょうか？？

おそらく後者ですよね？

PFはあくまで目的達成のための武器です。
**武器を強くするのは構いませんが、大事なのは目的を果たすことです。**

これに気付いてないもしくは、気付いてるけどPF以外の武器が出来上がらないと転職活動という行動に移せない人が多いよなぁって思います。


Progakuで未経験転職成功者に話聞いても、PFが完璧だから転職成功しました！って話は聞いたことないです。

なので
```
・この日までに最低限PFをここまで作る
・それが終われば、会社情報収集
・後はPF修正しながら、面談する
```
これが大事だと思います。

自分がこの出来じゃダメだと思っても、企業にしてみたらいいかもしれない。
落ちる原因がPFじゃなくて、適正試験や面接内容かもしれない。
そもそも、未経験に即戦力求めてないですしね。

これは実際に面接やってみないと得られない情報なので、早めに行動するのは転職への近道です。

# [その2]本当に転職したい人
あたりま◎＄♪×△￥●＆？＃$！

はい、具体的には今までに使ってた時間をどれだけ転職活動に当てられるかですね。

他業種で働きながら勉強して学習しつつ転職活動して内定もらったら転職

これが理想ですよね？？

でもこれって結構難しくないですか？？

今まで仕事終わった後や休日の時間を、ネトフリ見てる時間やソシャゲしてる時間、あるいは家族との団欒の時間を学習・転職活動に当てる必要があります。

その**時間をちゃんと確保して(時間量は問わない)、継続できる人**というのは僕が感じた転職成功者の共通点の一つでした。

やっぱり転職したい人みんなが本気でしたい訳じゃないと思うんですね。
稼げそーとかリモートいいなーとかの、転職できたらいいなぁ(願望)勢もいます。

そんな中やっぱり意識高く本当に転職したい人は、やっぱり転職成功してますよ。

ウイリアム・ジェイムズという哲学者の言葉に


**心が変われば行動が変わる。
行動が変われば習慣が変わる。
習慣が変われば人格が変わる。
人格が変われば運命が変わる。**

とあります。

本気で転職したければ結果はついてきます。
本気になれば色々視点も変わると思いますよ？

# [その3]運
ある意味これが**一番大事**かもしれない笑


結局、

こんだけ準備したから絶対受かるよね！はーと

みたいなことの方が少ないわけで、**たまたまこの面接官の時だから一次面接通ったとか、たまたまこの企業が求めてる人材とマッチしたからとか色んな運**も絡んでくるんです。

逆に、落ちる時もたまたま今欲しいタイプの人じゃなかった、たまたま面接官と合わなかったとか、全て自分のせいではない訳です。
もちろん全部運のせいにしちゃダメですよ笑


ただ、この運っていうのも種類があって、例えばサイコロを降って1の目が出る確率はどんだけ練習しても誰が降っても1/6です。パチンコとかも同じですね。
これは誰も皆平等です。

でも、この人/企業と繋がれたとか、めちゃくちゃ自分とマッチする企業と巡り合えたっていうのは、全員同じ確率じゃないです。

僕はこれを、**行動することで確変(確率変動)する運**って言ってます。

この運は努力であげられるので、ここを行動であげていたという人が実際多くいました。

人によってはProgakuに運よく入ったことも転職成功の要因になった人もいるかもですね笑

# 最後に

これ以外にも、メンターとかいた方がーとかこれした方がーとかあるかもですが、あげた3つは要因として大きそうなのでピックアップしました！

僕が運営するプログラミングコミュニティ「Progaku」では現役と未経験が混ざり合って学習しているコミュニティになっています。

興味ある方や転職成功者の話を聞きたい方がもしおられれば、[Twitter](https://twitter.com/tokuyuuuuuu)やってるので声かけてください！

また、今回このアドベントカレンダーはProgakuのメンバーで記事書いていくので、良ければ2日目以降も読んでください！！

良い技術者揃ってるので、良い記事書いてくれます！！！！！！

![2c355a9f5e9e3c56b05be49d33017821_t.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474880/f6fef9c3-73bf-3ba6-a19f-86727aa6cbd3.jpeg)
counsel-rg で Omitted long line with となるのを表示させる

emacs で counsel-rg を使って ripgrep を呼び出すと Omitted long line with となるものがでてくる。
これは counsel じゃなく rg が出してるものなので rg のコマンドライン引数を変更することで表示する。

```emacs-lisp
(use-package counsel
  :custom
  (counsel-rg-base-command
   `("rg"
     "--max-columns" "640"
     "--with-filename"
     "--no-heading"
     "--line-number"
     "--color" "never"
     "%s"
     ,@(and (memq system-type '(ms-dos windows-nt))
            (list "--path-separator" "/" "."))))
  )
```

`--max-columns` が　デフォルト `240` なので、それを`640`に増やした。
「ちょっとつくってみたんですけど」でめちゃくちゃ話が進んだ話


12月になりました。
今年もアドベントカレンダーを書いていこうと思います！！

この記事はモチベーションクラウドシリーズ [Advent Calendar 2022](https://qiita.com/advent-calendar/2022/mcs)の1日目の記事になります

最近プロダクト開発チームで仮説検証を回していきたい！という潮流が来ており、そのなかでやったプロトタイプ開発が思ったよりウケがよかったので、良かったことをまとめようと思います。

## なぜやったのか

もともとチームとして開発したアウトプットがちゃんと顧客に届いているかどうかを測定しよう。という流れはあり、僕たちも機能開発等をする際はアウトカムを設定して開発を行っていました。
ただ、「このプロダクトをどのようにユーザーが使って、どこで詰まっているのか」をちゃんと観測して、使いづらいところや、価値が届いていないところの改善をすることはあまりできていませんでした。

チームでもっと利用データをみて、改善サイクルを回していこう！！となり、そのためにユーザの利用データ取得を行ったり、課題の仮説を議論したりしていました。

そうすると各方面から、
- 「こんな機能あったらいいよね〜」
- 「この体験の前に、こんな機能追加したほうがいいんじゃない？」

いろんな声が集まってきたので、せっかくならやってみよう！！と思い実装しました。

## なにをやったのか

具体の中身はご説明できないのですが、機能要件としては簡単に以下のようなものです。
- 20問のアンケートに回答を貰って、その答えをFBしたい
- 計算ロジックは四則演算
- 結果によって、画面に表示する情報も出し分けをしたい

具体的な実装として
フロントは
- アンケート回答画面の実装（ラジオボタンで選択したものによって点数を変化）
- アンケート結果画面の実装

バックエンドは
- モデルを一つ追加
- APIを2つ追加

しました。
技術スタックはVueとRails です。


※実際に作ったものがこちらです。実際のものと文言等は変更しています。
![アンケート.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642245/de556b8e-295f-b5db-7a84-4a9626c4c250.gif)


## 何がわかったか
色んな発見があって楽しかったです。
またチャレンジしていきたいと思っていますが、よかったこととかまとめます！


### 体験の話の解像度が揃う

まだ作成していない機能などの話をする際によく、前提がズレることが起きていました。
そもそも考えていることが違うのに、まだ見ぬ機能や、体験について話をしているとどうにも深まっていかない感じがありました。

プロトタイプを作って話すことで「今回はここの体験だったけど、こっちの体験の中の方がいいんじゃないのか」とか「アンケート機能じゃなくて、こんな機能のほうがよくない！？」など意見は結構出てきたと思います。
アウトプットはまた変わると思いますが、意味のある議論になったと思います

### 意外と簡単に作ることができるとわかった

今回のプロトタイプは一人で作成しました。
テストコードとかは書いていませんが、ちゃんとFEもBEも作って大体4h~5hぐらいだったと思います。
悩んでる時間も結構あったので、次からはもっと早くできそうだと思っています！！

### 久しぶりにAPIの開発をして楽しかった

これは結構個人的な話ですww
普段はフロントエンドをしているので、画面からモデルまで作るのは久しぶりで楽しかったです。


## 次回開発する時に変えてみたい点

プロトタイプ作成といっても、何を明らかにしたいかで結構変えられると思います。
- バックエンドをまるまるmockして、画面だけ作成する
- デザインツールを使って、ワイヤーを作ってみる

とか、具体的なものが欲しいけど、どうしよう...って時に選択肢にしてみたいと思います！！


## あとがき
空中戦で始めると話ってどんどんずれていってしまうという課題感から今回手を動かして見ましたが、よかったです。
使われないものを作っても苦しいので、ちゃんと使えるものを作るために試行錯誤していきたいと思っています！

明日以降のアドベントカレンダーもお楽しみに〜！
CpawCTF Writeup Level 1 Q12.[Crypto]HashHashHash! (注意<spoiler>)

# Q12.[Crypto]HashHashHash!
```
ハッシュ関数とは、値を入れたら絶対にもとに戻せないハッシュ値と呼ばれる値が返ってくる関数です。
ですが、レインボーテーブルなどでいくつかのハッシュ関数は元に戻せてしまう時代になってしまいました。
以下のSHA1というハッシュ関数で作られたハッシュ値を元に戻してみてください！（ヒント：googleで検索）

e4c6bced9edff99746401bd077afa92860f83de3

フラグは
cpaw{ハッシュを戻した値}
です。
```

https://hashtoolkit.com/decrypt-hash/

このサイトでe4c6bced9edff99746401bd077afa92860f83de3をでSHA-1でデコードした値はShalである。

cpaw{Shal}