OmniAICreator/Qiita-1.07M huggingface dataset:
【TryHackMe】Advent of Cyber3 (2021)を続けてみた Day15, 16

# Welcome to Advent of Cyber 2021
クリスマスまでの25日間、毎日基本的な知識を学び、初心者向けの新しいセキュリティ演習を行うことで、サイバーセキュリティを始めることができます。

https://tryhackme.com/room/adventofcyber3

# day15
クイズに答えて、自分の性格に合っているサイバーセキュリティのキャリアを知ろう！

# dat16
OSINT問題です。

```
あなたは、悪名高い「GrinchEnterprises」ランサムウェアギャングに関する詳細情報を探している諜報員です。 
Grinch Enterprisesからの最近のランサムウェア活動への対応として、あなたのチームはサンプルのランサムウェアノートを収集することに成功しました。

!!! ВАЖНЫЙ !!!
Ваши файлы были зашифрованы Гринчем. Мы используем самые современные технологии шифрования.
Чтобы получить доступ к своим файлам, обратитесь к оператору Grinch Enterprises.
Ваш личный идентификационный идентификатор: «b288b97e-665d-4105-a3b2-666da90db14b».
С оператором, назначенным для вашего дела, можно связаться как "GrinchWho31" на всех платформах.
!!! ВАЖНЫЙ !!!
```
`"GrinchWho31" site:twitter.com`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217966/570e1b27-2f7d-7a05-c3b0-01ee0a23cc98.png)

Twitterから以下のリンクに遷移する。
`https://keybase.io/grinchwho31/sigs/1GW8QR7CWW3cpvVPGMCF5tZz4j96ncEgrVaR`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217966/6971dce4-942e-4970-7802-b04ded6e6c6f.png)

keybase.ioにGithubが紐づけられていた。
`https://github.com/christmashater31`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217966/e86dd829-3cb8-9146-7f29-20c6b02dfa1e.png)

ほとんどの開発者はgithubを使用して、進捗状況を追跡したり、バージョン管理を維持したりしながら、物事を追加したり変更したりしています。そのため、githubで最も重要なのは「COMMIT」です！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217966/d6dc27b9-da40-5091-5dfb-dc823a835bcd.png)

# Answer
What is the operator's username?
<font color="White">GrinchWho31</font>
What social media platform is the username associated with?
<font color="White">Twitter</font>
What is the cryptographic identifier associated with the operator?
<font color="White">1GW8QR7CWW3cpvVPGMCF5tZz4j96ncEgrVaR</font>
What platform is the cryptographic identifier associated with?
<font color="White">keybase.io</font>
What is the bitcoin address of the operator?
<font color="White">bc1q5q2w2x6yka5gchr89988p2c8w8nquem6tndw2f</font>
What platform does the operator leak the bitcoin address on? 
<font color="White">github</font>
What is the operator's personal email?
<font color="White">DonteHeath21[at]gmail.com</font>
What is the operator's real name?
<font color="White">Donte Heath</font>
ローカルのMySQLクライアント使って踏み台の先のMySQLにアクセスする方法

# 初回準備
1. 踏み台サーバにアクセス元（ローカル）の公開鍵を登録
1. ローカルのSSH Configに以下を追加

```:~/.ssh/config
Host 踏み台の名前
  HostName       例えばEC2のホスト名
  User           ec2-userみたいなの
```

# MｙSQLへのアクセス

## 1.接続準備
接続用のポートを開く

```
ssh -fNL 23306:接続先MySQLのホスト名:接続先MySQLのポート 踏み台の名前
```

## 2.接続
ローカルのMySQLクライアントを使ってDBにアクセス

```
mysql -u 接続先MySQLのユーザ名 -p -h 127.0.0.1 -P 23306 DB名

or

mycli mysql://接続先MySQLのユーザ名@127.0.0.1:23306/DB名
```

## 3.後始末
開いたポートを閉じておく

```
ps aux | grep '[0-9] ssh -fNL 23306' | awk '{print "kill -9", $2}' | sh
```


# 参考

- https://qiita.com/lighttiger2505/items/ea33291639a8656d50b4
IT初心者、Drupalで玖珂サイト「駅通りに来てみんさい！」を構築＆リリースしました。

![unnamed.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253852/6a9cfb85-9bd5-59b2-1811-7bf4bc149040.jpeg)
DrupalCamp DEN 2021 Osakaが延期となりましたが、「玖珂サイト」は今日リリースしました。

#玖珂サイト「駅通りに来てみんさい！」について

来年２月、当社の岩国サテライトオフィスを山口県岩国市玖珂町（くがまち）の駅通りに設立します。
Drupalをより多くの人に知ってもらえるよういろんな形で山口県から情報発信していきたいと思っています。

その第一弾として、玖珂サイト「駅通りに来てみんさい！」をDrupalで構築しました。地域の人に利用してもらい、Drupalを身近に感じてもらえるところから始めようと、IT初心者が集まり構築しました。

今日リリースしましたので、是非ご覧ください。

サイト名：「駅通りに来てみんさい！」
URL：https://kuga.yamaguchi.meta-info.co.jp
Drupalバージョン9

![unnamed.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253852/f1a148af-2f95-712d-29fc-d85beac4f83f.jpeg)


#サイト構築までの簡単な経緯

今年の１０月中旬より「玖珂サイト」の構築を始めました。地域の人のためになるサイトを作りたいということで、玖珂住民のヒアリングから始めました。約３０名の協力を得ることができました。集積した情報をもとに、サイトの対象者、方向性を下記で決めました。

* 岩国市玖珂町に住む人たちのためのサイト
* 駅通りにもっと人が来て欲しい。駅通り商店街の人が笑顔になるサイト。
* 高齢者と（学生）が主人物像
* 高齢者　60代後半から80代、孫がいてLINEを使用、サイトは怖くて見れない。
* 学生　岩徳線利用者、運行状況がすぐに知りたい、インスタ世代。

次に、WebサイトのワイヤフレームをAdobe XDで作成し、ワイヤフレームでサイトのイメージが湧きやすくなり、いっきに仕事の効率が上がりました。それから、コンテンツタイプの設計、タクソノミーの設計を行い、コンテンツタイプの構築に取り掛かりました。並行して、商店街のインタビュー、写真撮影、イラスト作成、路線図もオリジナルで作成しました。コンテンツも徐々に増えていき、ワイヤフレームに日々近づいていくのが嬉しかったです。

PCよりもスマホを保有する人が多いということで、スマホで高齢者が見やすいことを考慮して、ハンバーガーメニューではなく、最初からグローバルメニューが表示できるように高齢者目線で構築しました。

#サイト構築で困ったこと、難しかったこと
以下のような、見栄えの調整部分ではコードがわからないこともあり、苦労しました。

* 表示したいものがなかなか表示できない。
* ビューズの操作が難しい。
* 写真を限定して表示ができない。
* 文章の行間を狭く調整できない。
* ブロックの左右への配置ができない。
* Drupalでできることなのか、CSSではないとできないのかの判断が難しい。

#今後の課題

* ホームページ等を作成するにあたりCSSの知識が必要。
* ソースコードを読む知識があれば、よりよい。
* 最初（インストール）と最後（リリース）の作業も一人でできるようになりたい。
* コントリビュートモジュールの意味と使い方をできるだけ多く理解する。
* チームで共有して構築できるコンテンツタイプの設計、タクソノミーの設計を作る。

#最後に

このサイト構築にあたりいろんな方のサポートを受けました。本当にありがとうございました。
今後も「駅通りに来てみんさい！」のサイトを大切にしながら、Drupalで地域の人の役に立つシステムを作りたいと思います。
openBDを使用して本の情報を表示させてみる

# はじめに
* openBDという使い勝手がよさそうな書籍検索のApiがあったので使って書籍情報を取得できるところを目標に使ってみる
* 2021/12/18　初版

# OpenBDについて
https://openbd.jp/

* 上記のサイトで提供している
* 本の販促、紹介などを行う分には特に制約などもなさそう
* 会員登録などの必要もなし

# 実際に情報を取得してみる

```index.html
<!DOCTYPE html>
<html lang="ja">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <script src="https://cdn.jsdelivr.net/npm/vue@2.6.0"></script>
  <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
</head>

<body>
  <div id="app">
    {{ info }}
  </div>

  <script>
    new Vue({
      el: '#app',
      data() {
        return {
          info: null
        }
      },
      mounted() {
        axios
          .get('https://api.openbd.jp/v1/get',{
            params:{
              isbn: 9784757506206
            }
          })
          .then(response => (this.info = response))
      }
    })
  </script>
</body>

</html>
```
* 上記でapiをたたいてisbnコードが「9784757506206」の書籍のデータ(鋼の錬金術師1巻)を取得した
* 以下実行結果のスクリーンショット
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1700794/dbdda39d-808d-5255-2840-fac4e939e11b.png)
* 以下のスクリーンショットはisbnコード「9784908356254」の書籍データ(ぐりとぐらのたまご)を取得した場合の結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1700794/8059c95e-eeb8-f8da-44aa-f679f3bd4353.png)
* スクリーンショットの記載の通り、本によって取得できる情報量にばらつきがある(書影画像のURLがあったりなかったり...)

# その他
* OpenBDで提供しているApi仕様
    - https://openbd.jp/spec/
* ISBN検索に使ったサイト
    - https://www.books.or.jp/
 
# 最後に
* 今回はjson形式で本の情報を取得するだけだったが、続編としてjsonで得た情報を使っていろいろ試していきたい
ニューロンカバレッジをとってみた

DNNモデルに対するテストの網羅度を示す一つの指標として、ニューロンカバレッジというものが提案されています。
ざっくりいうと、ニューラルネットワークを構成するニューロンがどの程度網羅的に発火したかを示す指標です。
その有効性については議論がさまざまあり、例えば「AIプロダクト品質保証ガイドライン 2021.09 版」では以下のように述べられています。

>これに対し、ニューラルネットワーク内における様々な計算部品（ニューロン）の数値大小を用いて、テストの多様性に関する評価や多様なテストの生成を行うことが考えられている〔Pei 2017〕〔Ma 2018〕。ただし、必ずしも求められる品質と強い相関があるわけではないことも報告、議論されており〔Harel-Canada 2020〕、少なくとも盲目的に従来のプログラムに対するカバレッジ指標と同等に安易に解釈、運用すべきではない。

また、「機械学習品質マネジメントガイドラインrevision 2.1.0」では、以下のように述べられています。
>NCの値は、不具合の状況よりも、モデル・キャパシティとの相関が大きい。例えば、NCが小さくても正解率が高くなったり、逆に、正解率が悪くてもNC値が大きくなったりすることがある

つまり、ソフトウェアの構造ベースのテスト技法から着想を得ている点ではなんとなく意味がありそうだけれども、意味を理解しつつ使いどころを選ばなければならない、という話ですね。

## というわけで、やってみた

今回使ったのは以下です。
対象にしたモデルは手元で実験的に作ったものです。

Keras：DNNエンジン
https://keras.io/

EvalDNN：機械学習モデル評価用のToolbox
https://yqtianust.github.io/EvalDNN-benchmark/

seaborn：ニューロンカバレッジのビジュアライズ
https://github.com/mwaskom/seaborn

## 生データ
こんな感じで各レイヤーでニューロンカバレッジが出ます。
計算の対象外になるレイヤーもあるようです。
![生データ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529567/06bf44c6-4276-c0cd-6bda-c0f8973c1bb7.png)


## 可視化
seabornを使って活性化度合いを可視化してみた結果がこちらです。色が濃いほど、活性化した度合いが高いことを示します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529567/86c23cd8-753e-90e9-a94b-76bd7d73d3c7.png)

テストデータを追加してみて、活性化度合いが上がることも確認してみました。何となく色が濃くなっていますよね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529567/ea99ba24-6427-bc34-89a6-64966dd182ed.png)

ニューロンカバレッジの計算をする場合には、閾値を設定して活性化度合いが一定以上であればカバレッジされたと判断するようになっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529567/f128ea8f-e390-99dc-6b04-7dcd298ab9a4.png)


## 考察
実験結果を受けて考えたことを記します。

・（わかっていたけど）活性化度を上げても、モデルが妥当であることを示すことは難しい

・学習データの十分性（機械学習マネジメントガイドラインで言う「モデル・キャパシティとの相関」）を示すことには使える可能性があるのでは

・Explainableなモデルになると、もう少しニューロンカバレッジの解釈ができるようになる？


## まとめ
ニューロンカバレッジはソフトウェアでいうところのステートメントカバレッジ的な扱いだと理解していますが、ソフトウェアにブランチやコンディションを考慮したカバレッジがあるように、DNNの世界でももう少し複雑なカバレッジも提案はされています。テストエンジニア（QAエンジニア）としてカバレッジという指標があると判断の拠り所になるため、盲目的に使いたくなりがちですが、どんなカバレッジも意味を理解して適材適所で使うことが大事ですね。それは、通常のソフトウェアにおけるコードカバレッジ然り、です。
[Stripe Updates] Customer PortalでInvoicing(請求書)の履歴の確認や領収書ダウンロードができるようになりました

以前からご要望いただいていた、Customer Portalの請求書対応がついにローンチしました。

# Customer Portalで新しくできるようになったこと

今回のアップデートで対応した機能は、以下の２つです。

- 請求書の履歴表示
- メールで送信した請求書の支払い操作

## 請求書の履歴表示

これまでCustomer Portalでは、Billing（定期課金）のサブスクリプションで発生した請求履歴のみ表示していました。

今回のアップデートからは、同じ顧客に対して発行された請求書であれば、Customer Portal内でまとめて確認することができます。

![スクリーンショット 0003-12-17 12.24.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/d0f827c8-b51c-6bfb-4096-08c972c5cc73.png)

サブスクリプションと同様に、領収書・請求書のダウンロードも可能です。

![スクリーンショット 0003-12-17 12.25.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/5ae37482-cb50-c0ad-a2e4-059dd0910324.png)

## メールで送信した請求書の支払い操作

請求書を発行する際、登録済みの支払い方法へ自動的に請求するだけでなく、顧客に支払いリンクをメールで送信することができます。

![スクリーンショット 0003-12-17 12.27.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/3e5bf03f-c110-cc7e-9aba-c856b06e1ac4.png)

この支払いリンクについても、Customer Portalから直接アクセスすることができます。

支払いが完了していない（オープン状態）の請求書がある場合、[インボイスの履歴]に[未完了]として項目が表示されます。

![スクリーンショット 0003-12-17 12.28.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/4f5315d1-bf37-f331-b946-7eafba80c1cd.png)

リンクをクリックすると、請求書と支払いフォームが表示されるページに移動します。

![スクリーンショット 0003-12-17 12.30.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/8fbcdfa9-9b81-aa05-64fa-05d8d1ae94b7.png)

# 「商品データのない支払い」については、Customer Portalに表示されません

PaymentIntentやDashboardから直接支払いを実行した場合など、商品・料金データを利用せずに支払いを行なった場合については、従来通りCustomer Portalの履歴には表示されません。

そのため、Customer Portalで領収書や請求書の表示・ダウンロードを行いたい場合は、BillingとInvoicingを利用する必要がありますのでご注意ください。

# 納税番号の入力にも対応しています

今回のアップデート内容ではありませんが、Customer Portal上で請求先情報を編集する際に、納税番号の登録・更新も可能です。

![スクリーンショット 0003-12-17 12.40.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/11c69f8f-2db8-feb0-589c-f0056e216470.png)

Dashboardの設定画面からオン・オフの切り替えができますので、EUなどの海外向けにビジネスを展開されている方はぜひこちらもお試しください。

![スクリーンショット 0003-12-17 12.43.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/0bc59ead-7feb-b3c7-3589-a0949aa21ce1.png)


# Customer PortalのURLを発行する方法（Node.js）
Customer PortalのURLを発行するには、サーバー側のプログラムにて、顧客のIDを利用して一時URLを発行する必要があります。

```js
const stripe = new Stripe('sk_test_xxxxxx',{
  apiVersion: '2020-08-27'
})

const session = await stripe.billingPortal.sessions.create({
  customer: customerId
})
console.log(session.url)
// -> 'https://billing.stripe.com/session/test_xxxxx'
```

# 参考URL
具体的な設定方法や、Node.js以外での実装方法などについては、ドキュメントをご確認ください。

- [Docs - カスタマーポータルの組み込み](https://stripe.com/docs/billing/subscriptions/integrating-customer-portal?utm_source=qiita&utm_medium=stripeUpdates)
- [API Docs - Create a portal session](https://stripe.com/docs/api/customer_portal/sessions/create?utm_source=qiita&utm_medium=stripeUpdates)

# [PR] Stripe開発者向け情報をQiitaにて配信中！
2021年12月よりQiitaにて、Stripe開発者のためのブログ記事更新を開始しました。

- [Stripe Updates]：開発者向けStripeアップデート紹介・解説
- ユースケース別のStripe製品や実装サンプルの紹介
- Stripeと外部サービス・OSSとの連携方法やTipsの紹介
- 初心者向けのチュートリアル(予定)

など、Stripeを利用してオンラインビジネスを始める方法について随時更新してまいります。

-> [Stripe Organizationsをフォローして最新情報をQiitaで受け取る](https://qiita.com/organizations/stripe)
ARKitのFaceTrackingを使ってゲームでよくみるあの入力を実装

こんにちは．株式会社ZOZOでiOSエンジニアとして内定者アルバイトをしている[@thenagain](https://github.com/thenagain)です．
本記事は[ZOZO Advent Calendar 2021](https://qiita.com/advent-calendar/2021/zozo)のカレンダー5の17日目の記事です．

#はじめに
ナンバリングが増すごとにワクワクする機能もどんどん増えていく[ARKit](https://developer.apple.com/jp/augmented-reality/arkit/)ですが，今年にリリースされたARKit 5の主なアップデートは以下の2点です．4と比べるとちょっと寂しい😢

* **フェイストラッキングの対応拡大**
    * A12 Bionicチップ以降を搭載したすべてのデバイスのフロントカメラで利用可能に
* **ロケーションアンカー**
    * 街中や人気のスポットなど，特定の場所にAR体験を配置

今回はその対応拡大したという**フェイストラッキング**を使って**ゲームでよくみるホイール入力**を実装してみました．

ゲームでよくみるホイール入力の例はこちら ↓
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2286493/42e30edb-f4fa-ed2f-13bd-851d64edb66f.jpeg" width=300>
ボタンを押している間，ホイール状のUIが表示されて，特定の方向へマウスやスティックを向けることで選択し，ボタンを離すことで入力が確定するというものです．（個人的にこの操作感が大好き）
今回はこのような入力を，画面へのタップと顔の向きで再現してみました．具体的には，画面をタップしている間，ホイール状のUIが表示されて，特定の方向へ顔を向けることで選択し，タップを離すことで入力が確定する，という流れです．

実際の動作の様子はこんな感じ ↓
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2286493/03f9aad1-3e48-7d64-f29e-b7a8e0f9c9f5.gif" width=400>
8つの絵文字がホイールに表示されていて，それを顔の向きで選択している様子となります．分かりやすいように少し大きめに頭を振っていますが，ブンブンと頭を振らなくても入力できます😉

#実装
キモとなる顔の向きによる選択ですが，下図のようにして角度を算出し，その角度をホイール状のUIに反映させるという実装にしました．
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2286493/8c2a3991-2855-a9bb-15d4-c1403b57ac2f.png" width=800>

コードにするとこんな感じ

``` swift
func session(_ session: ARSession, didUpdate anchors: [ARAnchor]) {
    currentTransform = anchors.compactMap({ $0 as? ARFaceAnchor }).first?.transform

    if let initial = initialTransform, let current = currentTransform {
        let diff = simd_mul(simd_inverse(initial), current)
        let zvec = simd_float4(x: 0, y: 0, z: 1, w: 0)
        let raycast = simd_mul(diff, zvec)
        let raycast_xy = simd_float2(x: raycast.x, y: raycast.y)

        guard simd_length(raycast_xy) > deadZone else {
            // デットゾーンよりも小さい場合は未選択とする
            // (省略) 
            return
        }

        var theta: Float = acos(simd_normalize(raycast_xy).x)
        theta = simd_normalize(raycast_xy).y < 0 ? 2 * .pi - theta : theta

        // 得られた角度thetaをUIに反映させる処理
        // (省略)
}
```

`initialTransform`がタップ開始時の`ARFaceAnchor`のtransform行列で，`currentTransform`が現在のtransform行列です．これをもとに行列計算によって，基準平面上でのレイキャスト座標`raycast_xy`を算出し，この長さがデッドゾーンよりも大きい場合に角度を求めてUIに反映させるという処理になります．


#まとめ
今回はARKitのフェイストラッキングを使って，ゲームでよくみるホイール入力を実装してみました．
とりあえずホイールは8分割として実装してみましたが，動かしてみるともっと分解能が高いと感じました．
ARKitのトラッキング精度，素晴らしいですね…！
[Ruby on Rails]MVC仕組みについて「ひと言」「簡単に要約」(初心者)

###はじめに
初学者でたくさんのことを学ぶ中で忘れていたり、言語化してアウトプットするのが苦手なため書かせていただいております。

#まずMVCの各役割を説明

###Mについて

**要約**

```
Modelは、データベース管理に関する役割
データベース内の該当するテーブルに対して、データの保存や保存されているデータの取得。
```

###Vについて

**要約**

```
Viewは、ブラウザに表示される見た目の役割
クライアントサイドに画面上に表示される見た目の事
```

###Cについて

**要約**

```
Controllerは、モデルやビューに処理を指示する橋渡しとなる役割
クライアントサイドからのリクエスト内容に基づきレスポンスを用意する。
```

#MVCのメリット
###3点あります

```
1,それぞれの役割が明確　(どこに何を書けばいいのかはっきりしている)
2,保守性が高い　（処理の流れを把握しやすくエラーなどが起きた時に原因を特定しやすい）
3,チーム開発がしやすい　（MVCによって分けるなど、効率的な開発ができる）
```
#MVCのデメリット
###2点あります

```
1,詳細設計を密に行う必要がある（きちんと役割分担しないと機能しない）
2,分担に時間がかかる
```

#参考文献

[MVCとは？MVCの概念](https://www.fenet.jp/infla/column/network/mvc%E3%81%A8%E3%81%AF%EF%BC%9Fmvc%E3%81%AE%E6%A6%82%E5%BF%B5%E3%82%84%E5%BD%B9%E5%89%B23%E3%81%A4%E3%81%A8%E5%85%B7%E4%BD%93%E4%BE%8B%E3%82%92%E7%B4%B9%E4%BB%8B%EF%BD%9C%E3%83%A1%E3%83%AA%E3%83%83/)

[MVCとは！概念やそのメリットをわかりやすく解説！](https://www.geekly.co.jp/column/cat-technology/1911_040/)

[MVCモデルとは？開発者のための基礎知識](https://bap-software.net/knowledge/mvc-model/)
VSCode で学ぶ define_method

# はじめに
https://qiita.com/superrino130/items/6e745547d398de82187c#comment-0933984d65fe6197b8b9

この記事のコメントで@kts_h さんに教えていただいた`define_method`を`VSCode`で理解する。
# define_method
```ruby
def my_decorator(meth)
    orig = method(meth)
    define_method(meth) do |*args, **kwargs, &block|
      puts "Calling decorated method"
      orig.call(*args, **kwargs, &block)
    end
  end
  
  def example
    puts "Called decorated method"
  end
  
  my_decorator(:example)
  
  example
```
https://docs.ruby-lang.org/ja/latest/method/Module/i/define_method.html

何やら難しそう。
でも大丈夫、VSCodeならね。
# VSCode でのデバッグ
https://qiita.com/superrino130/items/947a7cab222b7439002c

手前味噌ながら、こちらの記事を参照願います。
# F5
まずは、`F5`を押下。
![20211217a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538241/d95b8cfe-6256-b30e-f907-52f015c01a16.png)
`"stopOnEntry": true`なので、ここで止まります。
次に、`F11`を押下（以下、`F11`の押下を繰り返します）
![20211217b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538241/ae92f6ca-758d-0c84-9b7b-730341ace16a.png)
`Ruby`の中の人として、どういうメソッドが定義してあるか確認していると思われ。
![20211217c.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538241/c659c11f-afb3-6af9-b7ca-aee8b431d478.png)
`my_decorator`にシンボル`example`を引数として渡します。
![20211217d.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538241/6a71b1e0-2baa-55a9-be8f-bebba057c53b.png)
my_decoratorメソッドの1行目に行きます。
![20211217e.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538241/b5de58de-9610-47fd-df27-ddca5d39af69.png)
ここがポイントですが、先程メソッドの確認をしたように`define_method`で再定義されたmeth = exampleを確認するにとどめます。
![20211217f.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538241/9a8c9a60-c26c-f2b6-05a3-43268b384748.png)
よって、`puts "Calling decorated method"`は呼び出されずに次の行である15行目に行き`example`が呼び出されます。
![20211217g.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538241/88a4fcdc-e326-cbd3-d311-cff30e0e72d6.png)
`example`は`define_method`で再定義されていますので、そこの1行目に行き、`puts "Calling decorated method"`が実行されます。
![20211217h.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538241/ddad18ab-383b-56cd-320c-19e6ac5aa489.png)
次は、再定義前のもとのメソッドを呼び出します。
![20211217i.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538241/8fa2d19f-f800-43db-f479-3efe4ab3e039.png)
もとのメソッドにある`puts "Called decorated method"`が呼び出されてプログラムは終了します。

何となく理解した気がします。
# メモ
+ Ruby の define_method を学習した
+ 道のりは遠そう
Gmailの@より前でピリオドが連続しているケースのRFC違反アドレスに対してメール送信が出来ない

## 現象

メールサーバでRFC違反メールアドレスのうち、
`アットマーク（@）より前で、ピリオド (.) が連続している`パターンのGmaiアドレスに対して、
メール送信が失敗している事に気がついた。

## 原因

どうやらGmailサーバの方で拒否られている模様。
Gmailの`アットマーク（@）より前で、ピリオド (.) が連続している`ケースのRFC違反Gmailアドレスに対して、
少なくても2020年10月までは送信は出来ていたようだが、いつの間にか出来なくなった模様。

下記を見る限り、最低でも去年から起きてるようには見える。
https://srad.jp/comment/3919948

2015年から、RFC 5321に準拠していないメールアドレスはGmailでは送受信出来なくなったとあるが、
登録されているGmail自体が特定のRFCに準拠していない場合、アドレス自体に対して受信出来なくなったのだろうか？
https://kitaney-google.blogspot.com/2015/11/rfc-5321gmail.html

ちなみに、G Suiteベースのアドレスに関しても、同様の現象が起きるため、
メールアドレスのドメインから判断する事は厳密には出来ない。

## 挙動確認

### quoted-stringなし。

```shell
$ sendmail {文字列}..{文字列}@gmail.com
test
.
```

```shell
Dec 17 10:32:53 {サーバ名} postfix/smtp[104650]: F0CAB1057CDE: to=<{文字列}..{文字列}@gmail.com>, relay=aspmx.l.google.com[142.250.157.27]:25, delay=3.2, delays=2.7/0.01/0.36/0.17, dsn=5.1.3, status=bounced (host aspmx.l.google.com[142.250.157.27] said: 553-5.1.3 The recipient address <{文字列}..{文字列}@gmail.com> is not a valid 553-5.1.3 RFC-5321 address. Learn more at 553 5.1.3  https://support.google.com/mail/answer/6596 y73si6977040pgd.457 - gsmtp (in reply to RCPT TO command))
```

### quoted-stringあり。

```shell
$ sendmail "{文字列}..{文字列}"@gmail.com
test
.
```

```shell
Dec 17 10:54:27 {サーバ名} postfix/smtp[106506]: 47B291057CDE: to=<{文字列}..{文字列}@gmail.com>, relay=aspmx.l.google.com[142.251.8.26]:25, delay=6.9, delays=6.4/0.01/0.36/0.18, dsn=5.1.3, status=bounced (host aspmx.l.google.com[142.251.8.26] said: 553-5.1.3 The recipient address <{文字列}..{文字列}@gmail.com> is not a valid 553-5.1.3 RFC-5321 address. Learn more at 553 5.1.3  https://support.google.com/mail/answer/6596 p12si7100498pgi.571 - gsmtp (in reply to RCPT TO command))
```

## 解決方法

アプリやインフラからは対処方法がなさそうだし、
対象少ない場合はメールアドレス登録者に個別に連絡して変更して貰うとかなのかな。
なにか知ってる人がいたら教えて頂けると嬉しい。。

## 参考

* [RFC違反によるメールアドレスご使用時に起きる問題について](https://www.kogumahome.com/rfc-error)
* [「RFC違反のキャリアメールアドレスという負の遺産、iOS 14で再び顕在化」記事へのコメント](https://srad.jp/comment/3919948)
* [【お知らせ】RFC 5321に準拠していないメールアドレスはGmailで取り扱えなくなった](https://kitaney-google.blogspot.com/2015/11/rfc-5321gmail.html)
会社が許可したデバイスに限って LINE WORKS を利用する (クライアント証明書 + トラストログイン 編)

## アップデートによるシングル サインオンの設定項目の追加

LINE WORKS のシングル サインオンまわりのアップデートで、認証サービス側の追加機能が使いやすくなっています。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">先月の <a href="https://twitter.com/hashtag/LINEWORKS?src=hash&amp;ref_src=twsrc%5Etfw">#LINEWORKS</a> のアップデートで、ひっそりとシングル サインオンまわりの機能追加を行っています。<br><br>これによって、認証画面をデバイスの既定のブラウザで開くことが可能になっています。<a href="https://t.co/QqV77yARRW">https://t.co/QqV77yARRW</a></p>&mdash; iwaohig (@iwaohig) <a href="https://twitter.com/iwaohig/status/1469181829861494784?ref_src=twsrc%5Etfw">December 10, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

ここでは、GMOグローバルサイン社が提供するトラスト・ログインを認証基盤とするシングル サインオンで LINE WORKS 利用時にクライアント証明書によるデバイスの制限を試してみます。

## シングル サインオンの設定

とても分かりやすく設定手順をまとめられている、こちらに沿ってトラスト・ログインと LINE WORKS の SSO の設定を行います。

TITLE: LINE WORKS のSAML認証の設定方法
URL: https://support.trustlogin.com/hc/ja/articles/900000498046

さらに、こちらの設定手順に沿って、クライアント証明書利用の設定を行います。

TITLE: クライアント認証（トラスト・ログインで証明書を発行する場合）
URL: https://support.trustlogin.com/hc/ja/articles/360013101533

LINE WORKS Developer Console で [Set External Browser] を有効にしています。
![l_1517737_1507_1639116636504.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396107/e73f74f8-e091-d3a7-11bd-b42aca5ede87.png)

これにより、アプリからのアクセス時に認証画面がデバイスの既定のブラウザで行われるようになります。

## シングル サインオンの様子
iPhone の LINE WORKS アプリでのログインの様子です。

クライアント証明書を iPhone に配布しておきます。

LINE WORKS アプリで ID を入力し [ログイン] をタップ。
![l_1517737_1512_1639710865374.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396107/8d3d463d-d111-0722-3027-48cebb444eb4.png)

標準部ブラウザでトラスト・ログインの認証画面に遷移します。
クライアント証明書がインストールされていない場合には認証が完了しません。
![l_1517737_1513_1639710968987.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396107/22224d1f-6be6-1f7d-dd10-0d0aa20a77cf.png)

認証が完了すると LINE WORKS アプリに戻ってログインします。
![l_1517737_1514_1639711085254.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396107/e238bb23-8b6b-459b-f441-9bffe63f43b8.png)
gitチーム開発で使う基本コマンド


<h1>gitチーム開発で使う基礎コマンド</h1>
今回の記事を見ると、チーム開発に参加した際、gitの基本的な操作に困らなくなります。
チーム開発に参加した場合に使う基礎コマンドを紹介致します。

<h1>前準備</h1>
事前にGitHubアカウントの登録をお願いします。

<h1>前提知識</h1>
gitにあまり触れたことがない方は、
私が前回投稿した、「git最低限覚えておくべきの基本コマンド」
を見てから、こちらの記事を読まれる事をおすすめします。

https://qiita.com/Yuta-Tsutsumi/items/9eb812b4caa80082661a






<h1>チーム開発で使うgit基本コマンド</h1>
チーム開発に参加した際に最初に行う事は
新規でリモートリポジトリからファイルをローカル側に持ってくる事。
その際に`git clone`（ギット　クローン）を使用する。
クローンとはリモート側にあるファイルを自分のパソコンにダウンロードする事。

```
git clone ダウンロードしたいパス

(例)
git clone https://github.com/xxxxxxxxxxxxxxxxxxx.git
```
（ダウンロードしたいパスは、GitHubのサイトでコピーしたHTTPSのパスになる）




<b>・最新のリポジトリをリモートからローカルに持ってきたいとき</b>


・`git clone`（ギット　クローン）使用し、自分のローカル側にリポジトリがある場合、最新のリポジトリをダウンロードが出来ない。
理由は自分のローカル側にリポジトリがある場合は`git clone`が使えない。
この場合は下記のコマンドを実行する事。そうする事で最新のリポジトリが自分の端末にダウンロードできる。

```
git pull origin
```

<b>・マスターブランチから他のブランチに切り替えるコマンド</b>

```
　　git checkout
```


(例)developというコマンドを打つことでdevelopというブランチを新規作成し、

　　developにブランチが切り替わる。

下記の最後尾の記述に現在いるmaster書いている。今masterブランチにいるので「そこからdevelopブランチを切り替える」という意味になる。

```
git checkout -b develop master
```

Switched to a new branch 'develop'とターミナルに出れば成功
（ブランチを切り替えたようという意味）

<b>・ブランチの一覧をみるコマンド</b>

```
git branch
```

上記のコマンドを実行し緑色で表示されたブランチが今、作業をしているブランチになる。


<b>・ブランチを切り替えたい時</b>
（例）現在のdevelopブランチ から masterに切り替えたいときは下記のコマンドを打つ事。

```
git checkout master

git checkout 切り替えたいブランチ名
```

<b>・作成したブランチでコミット内容をリモートにプッシュする際のコマンド</b>


（例）現在のdevelopブランチにプッシュをする際のコマンド

```
git push origin develop

git push origin 今いるブランチ名
```
Instanaバックエンドサーバの導入でunauthorized: authentication requiredでPullできない場合のTips

# はじめに

この投稿は、IBM Cloud Paks Advent Calendar 2021 Advent Calendar 2021　の　17日目の投稿になります。

IBM Cloud Pak for Watson AIOpsの関連製品であるIBM Observability by Instana は、まだまだ、日本語の導入TipsがGoogleで検索しても皆無なので、 ハマりがちなTipsの１つを投稿します。

# IBM Observability by Instanaとは
Instanaは、APM(アプリケーション・パフォーマンス・モニタリング）分野の製品です。監視対象にAgentを入れて、Agentを取得したデータをバックエンドのサーバに転送し、観測・分析を行う仕組みになってます。<img src="https://www.instana.com/docs/static/eef3dcddbf5895dfe05d87abddffbcc9/f041d/architecture_overview.png">
[InstanaのDoc アーキテクチャーの概要]("https://www.instana.com/docs/ja-JA/self_hosted_instana/#%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%81%E3%83%A3%E3%83%BC") より

Instanaでは、バックエンドサーバに SaaSとオンプレミスの２つの環境を提供しています。この投稿では、オンプレミス版のInstanaサーバをインストールした時に、" unauthorized: authentication required"と コンテナイメージをpullできなくて、インストールができなくて困った時のTipsです。

なお、Instanaのインストール手順は、下記URLのInstanaのドキュメントで提供されています。
https://www.instana.com/docs/ja-JA/self_hosted_instana/installation/

# 事象

`instana init`コマンドして、始まるインタラクシェルで必要な情報を入力した後に、始まるインストールの途中で、導入する際に、 `can not pull image 省略  unauthorized: authentication required`エラーで　インストールが止まってしまう。

```console
# instana init
Setup host environment ✓
? [Please choose Instana installation type] single
? [Insert your agent key (optional). If none is specified, one is generated which does not allow downloads.] aaabbbcccddd 
? [Insert your download key or official agent key (optional).]  aaabbbcccddd  
? [Insert your sales key] xxxyyyzzz
〜〜〜省略〜〜〜〜
? [Path to your private key file?] 
Handle certificates ✓
Ensure images ✗

can not pull image containers.instana.io/instana/release/product/cockroachdb:21.1.7 Error response from daemon: Get https://containers.instana.io/v2/instana/release/product/cockroachdb/manifests/21.1.7: unauthorized: authentication required
```

# 解決方法

1. Agent Keyが　有効であるか確認する。
1. `instana init`を実行したフォルダに生成される `settings.hcl`ファイルに記載されているAgent Keyが正しく入力されているか確認する。

- Instana の構成 (settings.hcl) 例   
https://www.instana.com/docs/ja-JA/self_hosted_instana/configuration

```console
type      = "single"
profile   = "normal"
tenant    = "<Your-tenancy-identifier>"
unit      = "<Your-backend-identifier>"
agent_key = "<Your-agent-key>"
sales_key = "<Your-sales-key>"
host_name = "<The-FQDN-of-the-machine-the-backend-is-installed-on>"
token_secret = "<max_12_digits>"

cert {
  crt     = "<Path-to-your-signed-certificate>"
  key     = "<Path-to-your-private-key-file>"
}
〜〜〜〜〜〜〜〜省略〜〜〜〜〜〜〜〜〜〜〜〜
docker_repository {
  base_url = "containers.instana.io"
  username = "_"
  password = "<Your-agent-key> "
}

```

今回、ハマったのは、　Agent Keyは問題なく、
実は、`instana init`コマンドを実行した後に始まる、インタラクティブシェルで Agent Keyを入力するために、コピペした際に　
`password = "<Your-agent-key>空白"` の様に空白が紛れ込んでいたのが原因で、この値を使って、pullで認証できないってエラーになってました。　余計な空白は削ってくれないんですね。

# 最後に
特に導入時にコピペをやってると、余計な文字が含まれがちです。
その時に、 "unauthorized: authentication required" ってエラーが出ちゃうと、　まさか、空白が原因だって気がつかなくて、　ライセンスの問題なのか、それとも導入が悪いのか色々調べ尽くして、時間が費やされてしまいます。

いつか、どなたかが困った時に Googleで検索した時にヒットしてお役に立つことでしょう。
プロダクトマネジャーの思考プロセス

# プロダクトマネジャーの思考プロセス

多くのプロダクトマネジャーにとって望ましいと考えられる思考プロセスは以下の通り。

`Who→Why→What→How`

誰に(Who)、どんな価値を届けるか(Why)、そのために何を(What)、どうやるか(How)の順で考える。

Who+Why=Valueと考えるとわかりやすい。「誰にどんな価値を届けるか」はプロダクトマネジメントを行うにあたりよく立ち戻るスタート地点のようなところ。

もちろん、プロダクトはNice to haveではなくMust haveなものが良いし、尻に火がついたような状況を解決してくれるプロダクトであれば飛ぶように売れるだろう。

大事なのは、実際に誰かの身の上に起きている問題を扱うこと。実際には存在しない空想上のニーズに応えるプロダクトを作っても誰も買ってくれない。

プロダクトが売れないときはWhoとWhyが確実かをレビューすると良い。

# 立場による思考プロセスの違い

ある日、働く人の立場によって思考プロセスが大きく異なることに気がついたので、備忘録も兼ねて典型的なものをまとめてみた。

## 一般的マネジャー

`Why→What→How`

何のために何をどうやるかの順で考える。
多くの場合、Whyは現実に起きている問題の解決となる。
マネジャーは日々の問題解決に忙しい。

## 投資家・経営者

`Money→What→How`

稼ぐために何をどうやるかを考える。
「一般的マネジャー」のWhyの部分がMoneyになる。

## プロダクトマネジャー

`Who→Why→What→How`

冒頭に記述の通り。
誰にどんな価値を届けるか、そのために何をどうやるかの順で考える。
思考の起点は「ターゲットの特定(Who)」となる事が多い。

## エンジニア

`How→What→Why`

技術で何ができるか、それが何に役立つかの順で考える。

起点がHowのため、最後のWhyの部分に拡大解釈が持ち込まれやすい。
「これってもしかしたらすごくニーズがあるんじゃないか？」みたいな。
そういう発想でプロダクトを開発するとよく失敗する。もちろん当たることもある。

エンジニアが一般的マネジャーや投資家・経営者やプロダクトマネジャーにクラスチェンジする際は、思考プロセスを大きく転換する訓練が必要となる。Howを起点に考えるのではなく、WhoやWhyやMoneyを起点に考えられるようになっておくことが大事。
IT企業で求められる女性リーダー像について

こんにちは。
会社に届いたお歳暮のお菓子を片っぱしから食べている遠藤です。

女性リーダー研修への参加をきっかけに、
「IT企業で女性がリーダーになるということ」について私なりに考えてみました。

## そもそも、女性が企業のリーダーになるメリットって？

ひとことで言えば、モノが売れるから。

家計のお財布は女性が握っていることが多い。
だから、女性が企業のリーダーとなって女性に刺さる製品を開発することが、販売促進には有効的だと言われます。
なんとなく、女性が女性目線で開発した電子レンジって使いやすそうじゃないですか？


## IT業界の人材の多様化
近年エンジニア転職ブームが到来し、エンジニア転職する方が増えてきています。
自動車メーカー、教師、建築大工、、、さまざまなバックグラウンドを持った方がエンジニアとしてキャリアを再スタートさせています。
バックグラウンドが異なれば、それぞれが持つ無意識的な価値観も異なります。

歯学部で歯科医師を志し、晴れて歯科医師になった人の周りには、同じような価値観を持つ人が多いはず。
IT業界は、多様な価値観を持つ人材が近年急激に増加している、人間関係激動業界の一つなのです。
IT業界重鎮の先輩方は、「最近いろんな人か入ってくるな、、」とびっくりしているはず。


## 会社に社員が定着しない！どうして？

学生時代、かなり厳しい部活だったのに、続けられた人は多いはず。
でも仕事となると、厳しくされると辞めてしまう。
これってちょっと考えたら当たり前の話で、サッカーが大好きな人は部活でどんなに罵倒されても必死に食らいつくことはできるけど、
一方で罵倒されても仕事が大好き！って人は少ないですよね。
仕事が選べる時代だからこそ、働きやすい環境に人が集まるんです。


## IT企業には女性リーダーが必要とされている！

今後も深刻な人材不足が続くといわれているIT業界では、
一人のエンジニアがやめてしまっただけでも大打撃。優秀であればなおさらです。
だから、さまざまな価値観を持つ社員が働きやすい環境をつくり、会社に定着してもらうことが今後どんどん重要になってきます。

多様な社員の特性を生かしながら、生産性を上げる。

この課題に向き合うためには、女性が得意な細やかな気配りが、今後より一層重要になってきそうです。


## 女性がリーダーになる上で意識するべき点

3. 鋭い直感活かそう
女性は相手のちょっとした異変に気づきやすい。
気づいたら問題が大きくならないうちに早めの対処を。

3. 共感力を活かそう
女性はフラットな関係を構築し、周囲と共感することを好む傾向あり。
男社会で成り立ってきたIT業界に、女性が働きやすいフラットな風を吹かせよう。

3. 気遣いをしよう
強い指導者が「俺についてこい」精神で組織を動かす時代は終焉。
社員がどうしたら気持ちよく働けるかを考え、ひとりひとりに気遣えるリーダーに人が集まる時代です。

4. 声がけを意識しよう
異変に気づいても、共感をしても、言葉にしないと伝わらない。
小さなことでも、言葉にして表現することが大事です。


## 終わりに

社員の皆さんに気持ちよく働いていただく、という感覚でしょうか。
上下関係バチバチの環境で生きてきた私にはちょっと違和感がありますが、時代には逆らえません。
気配りの練習として、頑張っている人の机にそっとお歳暮のお菓子を置いてあげよう。
そんな気持ちになっている今日この頃です。
再起動時に勝手に立ち上がるコンテナを止めたい

PC再起動時に毎回コンテナが立ち上がっていちいち止めていたのを直した話です

## 結論

docker-compose.yml の `restart: always`になっている部分を消しましょう。

https://qol-kk.com/wp2/blog/2020/03/04/post-1532/

## 確認法
下記コマンドで restart: always で設定されているコンテナ名がわかります

```shell
docker inspect -f "{{.Name}} {{.HostConfig.RestartPolicy.Name}}" $(docker ps -aq) | grep always
# => /コンテナ名 always 
#    上記の形式で出力される。
```

### コマンド内容補足

```shell
docker inspect $INSPECT_ID
# => jsonで出力される。引数でIDを指定したコンテナの情報を表示。
```

https://docs.docker.jp/engine/reference/commandline/inspect.html

```shell
docker ps -aq 
# => 全てのコンテナの整数値のIDを出力
# オプション -a: 全てのコンテナを表示 (デフォルトは実行中コンテナのみ表示)
# オプション -q: 整数値の ID のみ表示
```

https://docs.docker.jp/engine/reference/commandline/ps.html

```shell
docker inspect -f "{{.Name}} {{.HostConfig.RestartPolicy.Name}}"
# オプション -f: 指定する go テンプレートを使い、出力を整形
```

goテンプレートに関しては下記参照

https://pkg.go.dev/text/template

上記例だと、 `docker inspect` へ出力されるjsonの要素に `.` つなぎでキーを指定して取得している。

go全然わからないのですが、 `range`を使うと `for文`みたいなことができるようで、

```shell
docker inspect -format='{{range .Config.Env}}{{println .}}{{end}}' $INSPECT_ID
```

のようにすると、json のConfigキーの中のEnvキーの値が配列なので、配列の要素1つ1つに対して `println`してるみたいな感じ。


## 対応

### 手順1
`restart: always` なコンテナを探す

```shell
docker inspect -f "{{.Name}} {{.HostConfig.RestartPolicy.Name}}" $(docker ps -aq) | grep always
```

### 手順2

確認するコマンドで出てきたコンテナを作成している `docker-compose.yml` の `restart: always` の部分を消す。

### 手順3
コンテナを立ち上げ直す
`docker compose down`、 `docker compose up -d `。

### 手順4
手順1に戻りまだ該当のコンテナがあれば同様の手順を繰り返す。

## まとめ
PC再起動時にコンテナが勝手に立ち上がらないようにしました。
~~調べたらすぐにわかることなのに他にやるべきことがあると理解を後回しにしてしまうのは悪い癖~~
Diataxisという思考ツールとしてのフレームワーク

# はじめに
こんにちは。 KDDIアジャイル開発センターの小板橋です。 この記事は、[KDDI Engineer&Designer Advent Calendar 2021](https://qiita.com/advent-calendar/2021/engineer-designer)の17日目の記事です。

今回は、[Diataxis](https://diataxis.fr/#)という技術文書作成のための体系的なフレームワークについてまとめていこうと思います。

# Diataxisというフレームワーク
少し前に、Ubuntuの支援及び開発援助を行うCanonical社から「今後CanonicalでのドキュメンテーションはDiataxisフレームワークを用います」という宣言が発表されました。(https://gihyo.jp/admin/clip/01/ubuntu-topics/202111/19)

* Diataxisを要約すると、ドキュメントと名の付くものは全て**Tutorial**、**How-to Guide**、**Technical Reference**、**Explanation** の4つに分類し、それぞれがどのように記述されるべきかを整理する思考フレームワークです。

![スクリーンショット 2021-12-17 11.42.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563635/9970e74a-e567-f3d4-2279-6c8d9f9991ed.png)

## Tutorials
* Tutorialsは、初心者が最初に始める知識習得のための起点です。
* 目的は、初心者が始められるようにするために教育し、リードします。
* なので、形式としてはレッスンするに近いです。

## How-to guides
* How-to guidesは、特定のタスクを解決する方法を教えます。
* なので、一連のステップとして、ガイド、デモンストレーションに近いです。

## Reference
* Referenceとは、参考資料や定義や動作を示すものです。
* Explanationsと被ると思いますが、こちらは技術情報に関して、"~とは…？"を教えるものです。

## Explanations
* Explanationsは、解説や理解のための詳細なドキュメントです。
* Referenceとの違いは、こちらは技術情報に関しての"なぜ…？"を教えるものです。

# まとめ
* Diataxisにより、明確にドキュメントが区分されることで、ドキュメントの対象となる技術や製品をより使いやすくすることができると思います。Canonical社が導入したことで、今後、これに基づいた整理が行われることで、Ubuntuの「使いやすさ」に影響がでるのではないかと期待できそうです。
Sudachi で空文字列の形態素を抑制する

## 文字正規化と形態素解析

辞書のエントリをふやさず多様な入力に対応するために、形態素解析をかける前に文字を正規化するのが一般的です。よくおこなわれるのがアルファベットの小文字化や Unicode 正規化です。場合によってはおなじ文字の連続をみじかくしたり、混同されやすいマイナス記号に類似する文字をマイナス記号や長音記号に統制することもあります。

## 正規化によって分解される文字への対応

文字正規化によって1文字が複数の文字に分解されることがあります。

```ruby
irb(main):001:0> '…'.unicode_normalize(:nfkc)
=> "..."
irb(main):002:0> '㈱'.unicode_normalize(:nfkc)
=> "(株)"
```

この正規化後の文字列を形態素解析にかけると以下のように複数の形態素になります。

```
$ echo ... | java -jar sudachi-0.5.3.jar
.       補助記号,句点,*,*,*,*   .
.       補助記号,句点,*,*,*,*   .
.       補助記号,句点,*,*,*,*   .
EOS
```

さて、この結果をもとの文字列と対応づけるにはどうすればいいでしょうか。2つの案がかんがえられます。

### 案1

それぞれの形態素をもとの文字列と対応づける。

```
…       補助記号,句点,*,*,*,*   .
…       補助記号,句点,*,*,*,*   .
…       補助記号,句点,*,*,*,*   .
EOS
```

### 案2

特定の形態素だけ (この場合は先頭) を対応づけてそれ以外は対応なし (空文字列) とする。

```
…       補助記号,句点,*,*,*,*   .
        補助記号,句点,*,*,*,*   .
        補助記号,句点,*,*,*,*   .
EOS
```

### 元文字列での位置

全文検索でヒットした語をハイライティングするなどの用途には元文字列上の位置が必要です。
元文字列上での位置を`(開始位置,終了位置)`[^1]の形式で書くと、案1は `(0,1)(0,1)(0,1)` となります。

[^1]: 終了位置は末尾の文字位置+1とします。

案2の表現方法はいくつかかんがえられますが、位置の前後関係と文字長を素直にあらわす `(0,1)(1,1)(1,1)`とするのが妥当でしょう。

## どちらがよいか

案1は単純ですが同一位置が繰り返し出力されるので出力結果を合成しても入力を再現できません。複数のツールを組み合わせてつかうにはよくない性質です。[^2]

[^2]: 開始位置と終了位置が連続しないのもうつくしくない。

案2は入力の再現性は保たれていますが、元文字列上で空文字列の形態素が発生します。世の中には分割結果に長さ0のトークンがふくまれていると想定していないツールもあり、おもわぬ不具合の原因になることがあります。

形態素解析器 [Sudachi](https://github.com/WorksApplications/Sudachi) では入力の再現性を重視して案2をデフォルトの動作としています。

```
$ echo … | java -jar sudachi-0.5.3.jar
…       補助記号,句点,*,*,*,*   .
        補助記号,句点,*,*,*,*   .
        補助記号,句点,*,*,*,*   .
EOS
```

ですが、空文字列をあつかえないツールにもつなげるようにしぶしぶ `allowEmptyMorpheme` という設定を用意しています。

```
$ echo … | java -jar sudachi-0.5.3.jar -s '{"allowEmptyMorpheme":false}'
…       補助記号,句点,*,*,*,*   .
…       補助記号,句点,*,*,*,*   .
…       補助記号,句点,*,*,*,*   .
EOS
```

デフォルトは `true` です。プロパティ名が長いのはせめてもの抵抗です。

ではよい Sudachi life を。
iOS15でUIStackView内のオブジェクトにAutoLayout設定(Constraints)があるとそれが原因で表示が崩れることがある件

## 結論

iOS15 からオートレイアウトのConstraintsにあるPriority設定が `正しく` 効くようになったので、iOS14以前に作ったアプリでConstraintsのPriority値を意識した実装をしていないと何らかの画面崩れが発生する可能性があり対処が必要になります。
（iOS15のRelease Notesにはない挙動の変更のようです。そして、iOS15だけでなくiOS14でも同様の仕様変更がされているようです）

## 気づいた経緯

### iOS15で発生した表示問題

扱っているiOS版アプリにて、UIStackViewで、説明表示を実装している部分がありました。
構成は以下のドキュメントアウトラインの通りにしていました。そして、iOS12版で表示すると下の画像の通り、細い棒線と文字を組み合わせた表示でした。オブジェクトの実装内容の内訳は、棒線はUIViewオブジェクトでConstraintsのheightを1にして、文字（UILabel）の両脇に表示していました。文字にConstraints設定はありません。
iOS15では、添付の画像の通り、UIViewのConstraintsに引っ張られてUILabelの表示もheightに1になって表示されました。

* ＜変更前のドキュメントアウトライン＞   
![before.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6846/110947c8-3be5-b64e-fc5c-fea945aff786.png)
* ＜iOS12での表示＞   
![rapture_20211217111318.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6846/9a379e9c-bb22-46bf-d75a-262eb11a56cb.png)
* ＜iOS14,15での表示＞  
![rapture_20211217112559.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6846/974a68ef-6ac6-123a-0cf0-6da968c38b05.png)


### iOS15でとりあえず表示されるように暫定対応した

調査した結果、Priority設定周りの仕様変更がiOS15リリース前までは正しく効いてなかったのが、iOS15から効くようになったことが原因とわかりました（同時にiOS14にも反映されています）。
変更は、以下のアウトラインには表示されていないのですが、UIViewのConstraintsのPriorityを999にして、UILabelのPriorityを1000でheightを設定しています。
参考にした後述のサイト曰く、Constraintsのpriority仕様変更はNew Featureとして掲載されていない件だということです。

*  ＜優先度と説明のConstraints変更後のドキュメントアウトライン＞    
![after.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6846/4a97081e-0c09-b32e-3e54-60891503c09e.png)
* ＜iOS15での表示＞   
![rapture_20211217112724.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6846/d72c189a-8fcf-c7e7-18d0-9bee2b8ecbd3.png)

## 腑に落ちない点

Priority設定が効くようになったというのはわかりますが、それ以上に挙動が不思議な点があります。上記の例でUIStackViewエリア内に横並びのオブジェクトがあって、それらの一番左のConstraints設定が右に並んでいる全てのオブジェクトに効いてしまう点です。左端のオブジェクトのPriority設定を999にして、真ん中を1000にすると真ん中のConstraints設定が優先されます。


ハマった際にはご注意ください。


## 参考にした情報ページ

https://useyourloaf.com/blog/stack-view-changes-in-ios-15/
Blazor WebAssembly (AOT) vs. .NET MAUI Blazor （ライフゲームの処理速度を比較）

私にとって2021年はBlazor WebAssemblyとAzureを使いはじめる年になりました。最初は既存のデスクトップアプリをMAUIで作り直すことを考えていたのですが、8月にBlazor WebAssemblyのAOTコンパイルの技術的な検証をしてプロダクトに採用することを決めて、それからは.NET 6のプレビュー版を使いながら開発をしてきました。プレビュー版のおかげで.NET 6のGAとほぼ同じタイミングでプロダクトを実戦投入することができました。

MAUIやBlazorは日本語よりも英語の方が情報が豊富なので、英語のブログやYouTubeを見て情報収集することが増えました。YouTubeのおすすめにも.NET関連がレコメンドされることが増えてきて、動画の閲覧履歴の知的レベルが向上した気がします。

# .NET MAUI Blazor

YouTubeでおすすめされた.NET MAUI Blazorの動画を眺めていました。

<iframe width="560" height="315" src="https://www.youtube.com/embed/swwWgFZJvEs" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

この動画を見るまでは私は.NET MAUI Blazorが動作する仕組みをよく理解していませんでした。この動画を見てBlazor WebAssemblyよりもかなり高速な処理ができるのではと思い、簡単な検証をしてみることにしました。

# .NET MAUI Blazorでライフゲーム

.NET MAUI Blazorでライフゲームを動かして処理時間を計測してみます。

## セットアップ

まず最初にVisual Studio 2022 Previewで`.NET MAUI Blazor App`のアプリを作成します。

[祝 .NET 6 GA！.NET 6 での開発 Tips や試してみたことなど、あなたの「いち推し」ポイントを教えてください【PR】日本マイクロソフト Advent Calendar 2021](https://qiita.com/advent-calendar/2021/microsoft)に以下の記事を投稿しました。この記事の`Pages/Index.razor`をそのままコピーして使います。

https://qiita.com/kaorumori/items/88d836fab1fcbbbb7114

起動します。リリースビルドをしようとしたのですがエラーが発生して解決方法がわからなかったので、今回は`デバッグなしで開始`で起動しました。

![起動画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2238166/8c458d44-ff33-9c98-8fcc-d821f39ef26d.png)

## 処理時間の比較

結果はこのようになりました。

![実行画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2238166/37667ca4-8d3e-5811-dfc4-ca11d415959b.png)

|  | 処理時間 |
| --- | --: |
| .NET MAUI Blazor | 5.306 秒 |
| Blazor WebAssembly (AOT) | 9.163 秒 |
| Blazor WebAssembly (non-AOT) | 12.575 秒 |

.NET MAUI Blazor、速かったです。

# 画像処理（エッジ検出）の処理時間を比較

[Blazor Advent Calendar 2021](https://qiita.com/advent-calendar/2021/blazor)に投稿した[Blazor WebAssemblyのAOTコンパイルで処理が遅くなることもある](https://qiita.com/kaorumori/items/552a2acfddcbec254159)のエッジ検出も試してみました。NuGetで`SixLabors.ImageSharp`をインストールして、ライフゲームと同様に`Pages/Index.razor`をコピーします。`Pages/Index.razor`には一点だけ変更が必要で、`MemoryStream`のために`@using System.IO;`を追加します。

起動した画面で512x512のPNG画像を指定します。

![エッジ検出](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2238166/59c58fd8-2616-6840-a407-542327b31923.png)

|  | 処理時間 |
| --- | --: |
| .NET MAUI Blazor | 0.118 秒 |
| Blazor WebAssembly (AOT) | 2.432 秒 |
| Blazor WebAssembly (non-AOT) | 2.029 秒 |

# まとめ

Blazor WebAssemblyのアプリのために作ったコードを.NET MAUI Blazorで動作させて、.NET MAUI Blazorが高速に動作することを確認しました。

Blazor WebAssemblyは速度では負けてしまいましたが、Blazor WebAssemblyにはWebブラウザで動作するという利点があります。私がBlazor WebAssemblyで開発をはじめたきっかけは、ある自治体のPCにどうしてもデスクトップアプリをインストールできなかった経験があったからでした。

うまく工夫すればBlazor WebAssemblyと.NET MAUI Blazorで大部分のコードを共有して、Webアプリとデスクトップアプリを同時に提供することも可能になりそうです。来年はそういった開発にもチャレンジできればと思っています。
社内で費用をかけずに動画をストリーミング配信したい

#前提条件
・会社でなんらかのレンタルサーバーを契約している
・この記事の例は、CPIのSV-Basic（レンタルサーバ）です。

#たどりついた方法
・情報共有基盤システム[NetCommons3（ネットコモンズ3・無償）](https://www.netcommons.org/NetCommons3)を利用する
・[NetCommon3](https://www.netcommons.org/NetCommons3)を自社で契約しているレンタルサーバにインストールする
・[NetCommon3](https://www.netcommons.org/NetCommons3)には動画のストリーミング配信の機能があり、それを使って社内の動画配信を実現する

#NetCommons3のインストールのはまり所（2点）
・ダウンロード→解凍→FTPで自社契約サーバにアップロード
　までは、時間はかかりますが問題なくいけるかと思います。
・アップロード後、ブラウザで最初にURLを読み込むタイミングでチェックがあり、下記のポイントで2回引っかかる感じです。
##①…/app/Console/cake に実行権限がありません。パーミッションを確認してください
####①-1　FTPソフト等でパーミッションを実行権限があるものに変更します
　　　　＜ファイルの場所＞ .../app/Console/
　　　　　＜対象ファイル＞　cake
　　　　![FileZilla.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/648912/74cf9dbd-c496-68aa-7714-100a75854cf4.jpeg)

####①-2　先ほどパーミッションを変えたファイル（cake）を書き換えてPHPのパスを通します。
#####①-2-1　まずはサーバの環境（PHP）を調べます。
　　　　![パス情報.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/648912/d975017d-6529-ab8b-6e6f-857aa4d63fb1.jpeg)
#####①-2-2　cakeの中身を調べたパスに置き換えます。
　　　　![cake書き換え.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/648912/4fedbced-8508-ac36-53ea-159e56ac9762.jpeg)

##②「データベースが作成できませんでした」エラー
・あらかじめレンタルサーバー内のMySQLに新たなデータベースを作成しておけばエラーがでません。
・CPIの場合は、下記の手順で新たなデータベースが作成できます。
![db1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/648912/feb5cf96-bc14-f901-5d1c-04fd4e07fe25.jpeg)
![db2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/648912/cc4652f6-28fb-5b56-6eb6-4109e17faf49.jpeg)

・データベースが作成できたら、その情報（データベース名）を入力すればOKです。
![db3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/648912/17c3bdfa-f486-8b34-7039-1fa60738cf2b.jpeg)




#インストールがうまくいけば、あとはNetCommons3の設定です。
・構造が多階層ですこしとっつきにくいのですが「コミュニティ」の層にページを作成し、そこに「動画」プラグインを追加するイメージでいけます。
・後日、記事を追加予定です。
【Mac】zshでpyenvをインストールする

## 概要
zshを使用した際にpyenv導入でwhich pythonが/usr/bin/pythonを参照してしまってつまづいたので、解決方法をメモ

## 解決方法
以下のパスを通してシェルを再起動

```
$ echo 'eval "$(pyenv init --path)"' >> ~/.zprofile
$ echo 'eval "$(pyenv init -)"' >> ~/.zshrc
```

## 環境
- MacbookPro 16インチ 2021年モデル
- macOS Monterey
- Shell：zsh

## インストールの流れ
### インストール前の状態
```
$ python --version
Python 2.7.10
```

### Homebrewでpyenvをインストール
```
$ brew update
$ brew install pyenv
```
### pyenvでPythonをインストール
インストールできるバージョンの確認

```
$ pyenv install --list
```

インストールするバージョンを決めて、インストール実行

```
$ pyenv install 3.7.12
```

以下のパスを通してシェルを再起動

```
$ echo 'eval "$(pyenv init --path)"' >> ~/.zprofile
$ echo 'eval "$(pyenv init -)"' >> ~/.zshrc
```

Pythonがpyenv環境になっていることを確認

```
$ which python
/Users/{UserName}/.pyenv/shims/python
```

### バージョン切り替え
```
$ pyenv global 3.7.12
$ pyenv versions
  system
* 3.7.12 (set by /Users/{UserName}/.pyenv/version)
```

## 参考
[Simple Python Version Management: pyenv](https://github.com/pyenv/pyenv#homebrew-on-mac-os-x)
図解するKubernetes Podのlimits, requestsとは？

# limits, requestsとは？
Kubernetes(K8s)では，Podのデプロイ時にCPU使用量とメモリ使用量をrequests(要求量)とlimits(制限量)の2つの項目で設定することができます.
CPUは，1 (vcpu)=1000 (millicores)として定義されており100 (millicores)と設定すると1 (core)の10%が使用される．

下記はPodのCPUのrequestsを350 (millicores), limitsを600 (millicores)に設定している例です．

```yaml
resources:
  requests:
    cpu: "350m"
  limits:
    cpu: "600m"
```

# requests(要求値)
#### **ノードでPodを起動するのに満たすべき空き資源(CPU)の値​**
#### **⇒ノード空きCPUよりrequestsが小さければデプロイ可**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502802/3e2d9b72-8ba5-1ecc-2a08-abb92eb024c4.png)
例としてノードの空きCPU容量が350 (millicores)であった場合requestsが350であればデプロイ可能​であるが容量を超えてrequestsを400 (millicores)要求してしまうと容量を超えてしまいデプロイが不可となります​. 

# limits(制限値)
#### **PodがCPUを使用できる量の制限値​**
#### **⇒Limits＞CPU使用量となる​**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502802/fb752ad2-483d-606a-a4d9-51f187a43423.png)
PodのCPU Limitsの値が600 (millicores)であった場合，Podの使用量がlimtisの値を超えて700 (millicores)を使用しようとした場合limtisで設定した600 (millicores)に制限され​, それ以上のCPU量を使用することが不可能となります．​

# 参考文献
- [Kubernetesドキュメント コンテナのリソース管理](https://kubernetes.io/ja/docs/concepts/configuration/manage-resources-containers/)
- [A Practical Guide to Setting Kubernetes Requests and Limits](https://blog.kubecost.com/blog/requests-and-limits/)
git diff から特定のフォルダを除外する

# :(exclude)【除外したいpathのパターン】
gitのコマンド（diffに限らず）でpathを指定する場合pathspecが使えます。
例えばこうなります。

```shell
git diff master -- ':(exclude)*/test/*'
```
これで*/test/*に一致するパスは無視されます。
pathspecについてのGitの記事はこちら

https://git-scm.com/docs/gitglossary/#Documentation/gitglossary.txt-aiddefpathspecapathspec

こちらの記事が内容を詳しく調査してくださっています。

https://qiita.com/darai0512/items/c2cf3719ec0903ab8002

gitのバージョンにも左右されますが、シンプルでわかりやすく大変便利です。
UIデザインの勉強をゲーム感覚でできる「CAN’T UNSEE」

![FFb-Dv-aAAMWGUA.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2399853/af6f5f4f-47bb-5b2d-985e-14867c608954.jpeg)


どちらが正しいUIデザインでしょうか？？
デザインが良いかどうか判断するためには、デザインを見る目が求められます。

正解は→https://kisa.ne.jp/design/cant-unsee/
herokuでpipeline作成+github連携

# この記事でやること

- herokuでgithub連携
- pipelineの作成


# herokuとgithubの連携

- settingからレポジトリを指定
- pipelineを作るかと出るのでyes

# pipelineの作成

- review appsにdefault branchを設定
- deploy
- staging設定
- production設定

# 途中からpipelineを作成

すでにherokuのprodcutionを運営している状態でpipelineを作成

- pipelineの作成後productionのadd appですでにあるアプリを選択


懸念点

- 環境変数はどのアプリに反映されるのか？
  - productionはもともとあったのでそれが引き継がれる。しかし、review appとstagingは別なのでそこには反映されない。
別々のリポジトリで管理されていたGitを統合する

こんにちは。

諸般の事情で別々に管理されていたGitを統合する必要がありました。その手順を記録しておきます。

## 前提
下記のように２つのリポジトリがあり、BからAに向けて統合します。

- リポジトリ A repo_a
- リポジトリ B repo_b

それぞれ `main` ブランチがあるとします。

下記のような手順で進めます。

1. リポジトリAのリモートリポジトリとしてBを追加
1. リポジトリAに統合用のブランチを作成し、Bからプル
1. リポジトリAで統合用ブランチからマージ

## 手順

### リポジトリAのリモートリポジトリとしてBを追加

```console
$ git remote add repo_b git@github.com:yousan/repo_will_be_migrated_b.git
```

### リポジトリAに統合用のブランチを作成し、B/mainからプル

```console
$ git checkout -b migrate_branch
$ git pull --no-rebase --allow-unrelated-histories repo_b main
```

### リポジトリAで統合用ブランチからマージ（実務ではPRにすると良いかも）

```
$ git checkout main && git merge migrate_branch
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47327/54efd9ee-48f0-266f-8733-d0bcea91bae7.png)



# リポジトリをやり直す
動作試験の際に過去の履歴を抜きにして作り直したいことがありました。リポジトリを作り直すのも一つですが、`main` ブランチを別名に置き換え、新たにイチからブランチを作り直してテストを行いました。

```console
$ git branch -m main main_old && git checkout --orphan main
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47327/95f673cc-5435-1559-64a0-b6dfcdd98dea.png)


# 参考

https://progzakki.sanachan.com/develop-software/maintenance/integrate-git-repositories/
整数除算として最適化してくれそうな記述

JavaScript の最適化がどうなっているのかは知りませんが

```JavaScript:
// a と b が整数ならば必ず割り切れるので、c も整数になる
c = (a - (a % b)) / b;
```

ならば機械的に整数除算と判断して最適化してくれることを期待したい。
Delphi コンパイル後の生成ディレクトリの最適解おしえて！

## Delphi標準生成ディレクトリの問題点

Delphiではコンパイル後ファイルの置き場所をプロジェクトオプションで指定できます。

標準では

|生成物|生成ディレクトリ
|---|---
|ユニット|```.\$(Platform)\$(Config)```
|実行ファイル|```.\$(Platform)\$(Config)```

となっています。

ただ、この構成ですと ```Debug\Win32\sample.exe``` とディレクトリが深くなる上、exeと同じ場所にユニットコンパイル後の.dcuがバラバラと生成され、見た目にも管理しづらくなります。

今回は自分なりの設定を示した上で、みなさんの「最適」を教えていただければな、と思っています！

## 自分なりの設定

僕が使いやすく、ここ数年使っている構成は以下です。

|生成物|生成ディレクトリ
|---|---
|ユニット|```..\dcu\$(Platform)\$(Config)```
|実行ファイル|```..\$(Platform)_$(Config)```

まず僕はソース一式を ```プロジェクトディレクトリ(Project1)\src```というディレクトリに入れます。またフォームはFormsというさらに深いところで一括管理します。

```
Project1
  └ src
    |- Project1.dpr 
    └ Forms
      └ MainForm
```

その上で、プロジェクトディレクトリのルートに dcu だけを出力する dcuディレクトリ、生成物の出力先を指定します。

生成物は```win32\debug```など2段階にせず、アンダースコアでつないで```win32_debug```という1段にしています。

最終的に下記のようになります。

```
Project1
  |- dcu
  |    └ win32
  |        └ Debug
  |           └ unit1.dcu ...
  |- src
  |  |- Project1.dpr 
  |  └ Forms
  |    └ MainForm
  |- win32_debug
  |    └ Project1.exe
  |- win32_release
  |    └ Project1.exe
  |- win64_debug
  |    └ Project1.exe
  └- win64_release
       └ Project1.exe
  
```

## 利点

- それぞれの環境の生成物を浅い階層で管理できる
- dcuが混ざらない
- 環境ごとのまとまりは変わらない

## みなさんの設定は？

ディレクトリ構成以外にも、こんなプロジェクトオプションが効く！とかありましたら、ぜひ教えてください！
いま使っているツールについて整理しておく

いちばん使っているのはExcelかも知れませんが、それはそれとして、いま使っているツールについて整理しておきます。
詳細の説明は省いて１行だけ。

## 環境
OS：Windows 10 Home 64 ビット オペレーティング システム
CPU：Intel(R) Core(TM) i5-8250U CPU @ 1.60GHz   1.80 GHz
RAM：16.0 GB

## IDE、コードエディタ
### Eclipse
Pleadesのプラグインを使っています。Javaで。Pythonでも。
[https://mergedoc.osdn.jp/](https://mergedoc.osdn.jp/)

### Visual Studio
C#開発で使用。
[https://visualstudio.microsoft.com/ja/downloads/](https://visualstudio.microsoft.com/ja/downloads/)

### Visual Studio Code
「[Visual Studio Code実践ガイド](https://gihyo.jp/book/2020/978-4-297-11201-1)」の表紙の鳥がいい。
[https://code.visualstudio.com/](https://code.visualstudio.com/)

### Atom
A hackable text editor. Webまわりのスクリプト作成に便利。
[https://atom.io/](https://atom.io/)

### Anaconda
Jupyter Notebookが手軽で嬉しい。
[https://www.anaconda.com/products/individual](https://www.anaconda.com/products/individual)

### XAMPP
PHP用として。
[https://www.apachefriends.org/jp/index.html](https://www.apachefriends.org/jp/index.html)

## TELNET/SSH/SFTP
### Tera Term
いろいろやってみても定番のこれに戻ってきます。
[https://ja.osdn.net/projects/ttssh2/](https://ja.osdn.net/projects/ttssh2/)

### WinSCP
ドラッグ＆ドロップ操作ができるので有難い。
[https://winscp.net/eng/download.php](https://winscp.net/eng/download.php)

## データベースクライアント
### A5M2
クライアントとしては、ほぼこれでいける。
[https://a5m2.mmatsubara.com/](https://a5m2.mmatsubara.com/)

### DBeaver
使い始めたばかり。SAP HANA や Elasticsearch、Neo4j などが接続できるのが嬉しい。
[https://dbeaver.io/](https://dbeaver.io/)

## パケット解析
### Wireshark
最強かと。
[https://www.wireshark.org/download.html](https://www.wireshark.org/download.html)

### Fiddler
httpデバッギングならこれがとても使いやすい。
[https://www.telerik.com/fiddler/fiddler-classic](https://www.telerik.com/fiddler/fiddler-classic)

## ファイル比較
### WinMerge
これがなければ目視だと目が疲れるし結局わけがわからなくなる。
[https://winmergejp.bitbucket.io/](https://winmergejp.bitbucket.io/)

## テキストエディタ
### サクラエディタ
使用頻度高い。
https://sakura-editor.github.io/

## 圧縮・解凍
### 7-Zip
圧縮・解凍はいつの間にかこればかり使っています。
[https://sevenzip.osdn.jp/download.html](https://sevenzip.osdn.jp/download.html)