OmniAICreator/Qiita-1.07M huggingface dataset:
WSL2 + Dockerを利用してディスクの容量がいっぱいなっている問題の対応

# 問題
Windows10上にWSL + Dockerを利用して開発環境を作って頻繁にdocker buildしてimageを削除しました。
３ヶ月後に、C diskの容量がいっぱいなってしまったです。windows upgradeなどは全然対応できないです。
docker host osに全てのdocker imageを削除しても容量を改善できません。

* 前提条件
    * OS windows 10 pro (22H1)
    * WSL2: Ubuntu-20.04

# 分析
* サイズが大きいファイルを見つかりました
    * C:\Users\username\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu20.04onWindows_79rhkp1fndgsc\LocalState\ext4.vhdx
    * 135GBぐらい
* https://lazesoftware.com/ja/blog/230225/
    * DockerでWSL2を使用しているとディスク使用量が戻らない原因
    * 仮想ディスクがOSが自動的に拡張しているが、不要になった部分が自動的に削除されないそうです

# 解決
* docker imagesを削除して、ビルドキャッシュも削除する
    * docker system df
    * docker builder prune
* 仮想ディスクを最適化するために、ツールをインストールする
    * コントロールパネル -> プログラム -> windowsの機能の有効化または無効化
    * Hyper-V(Hyper-V プラットフォームとHyper-V 管理ツール)を有効にする
    * windows再起動
* 最適化実行(PowerShell管理者権限)
    * Optimize-VHD -Path C:\Users\username\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu20.04onWindows_79rhkp1fndgsc\LocalState\ext4.vhdx

# 感想
* WSL2 + dockerで仮想ディスク容量が自動的に削除されないで、初めての方に対してとても面倒です。
* 原因と対策がわかれば、docker buildの頻度より仮想ディスクの容量がいっぱいなってしまうことがあるので、何ヶ月に仮想ディスク最適化を一回実行して特に面倒なことではない
同じガンマ分布から2つの標本を無作為抽出することについてのメモ

# はじめに  

標本がいくつか得られた場合にそれが無作為抽出か調べる方法をBingに尋ねたところ、あるようです.  

> はい、あります。それは「無作為抽出検定」と呼ばれます。この検定は、標本が無作為に抽出されたかどうかを検定するために使用されます。この検定では、標本が無作為に抽出されたという帰無仮説と、そうでないという対立仮説を設定し、帰無仮説が棄却された場合、標本が無作為に抽出されていないと判断されます (Bing)

なので、前回考察した事例において、もう1つ標本を無作為抽出した上で確認してみる.  
というのが本記事の趣旨です.  

# メモ  
Bingにチャットで相談し、以下のようなコードと出力結果を得ました.  

```python 
import numpy as np
from scipy.stats import gamma
import matplotlib.pyplot as plt

# ガンマ分布のパラメータ
alpha = 2.5
beta = 10000

# サンプル数
n = 23

# 母集団のガンマ分布を描画
x = np.linspace(0, 100000, 1000)
y = gamma.pdf(x, a = alpha, scale = beta)

fig, axs = plt.subplots(2, 2)

axs[0, 0].plot(x, y)
axs[0, 0].set_title('Gamma Distribution')

# ガンマ分布からサンプルを生成
sample1 = gamma.rvs(alpha, scale=beta, size=n)
sample2 = gamma.rvs(alpha, scale=beta, size=n)

# ヒストグラムで可視化
axs[0, 1].hist(sample1, bins=20, alpha=0.5, label='sample1')
axs[0, 1].hist(sample2, bins=20, alpha=0.5, label='sample2')
axs[0, 1].legend(loc='upper right')
axs[0, 1].set_title('Histogram')

# 箱ひげ図で可視化
axs[1, 0].boxplot([sample1, sample2], labels=['sample1', 'sample2'])
axs[1, 0].set_title('Box Plot')

from scipy.stats import ttest_ind

# 無作為抽出検定
t, p = ttest_ind(sample1, sample2)
print('t値:', t)
print('p値:', p)

plt.show()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1276668/16891373-aadb-fb0c-4738-7cb6d1c9fd27.png)

>t値: 0.10165212329988577
p値: 0.9194946390839558

このコードの説明は次のとおりです.  

> このコードは、Pythonでガンマ分布を使って、2つのサンプルのt検定を行っています。ガンマ分布は、形状母数と尺度母数を指定することで定義される連続確率分布です。このコードでは、numpyとscipy.statsのライブラリを使って、ガンマ分布からサンプルを生成し、ヒストグラムや箱ひげ図で可視化しています。また、t検定にはscipy.statsのttest_ind関数を使用しています。(Bing)

無作為抽出かどうかを確認するためのt検定ということでしょうか.  
という質問をさらQとして入れたところ回答は以下のとおりでした.  

>　はい、正解です。このコードでは、2つのサンプルのt検定を行っています。t検定は、2つの平均値が等しいかどうかを検定する方法の1つで、無作為抽出検定とも呼ばれます。(Bing)

なるほど、t検定は無作為抽出検定とも呼ばれるのですね.  
言われてみると確かにその通りだと思います.  
漫然と統計検定2級のテキストをインプットするだけでは見落としていたようです.  
毎日新しい気づきを与えてくれるBingにお礼を言いたいです.  

今朝は時間がないので本メモはここまでとしたいですが、気になることがあったので質問してみました.  本記事はその回答で締めさせていただければと思います.  

> 同一のガンマ分布から実際本当に無作為抽出した２つの標本でこの検定を何度も行うと、p値の分布は一般的には一様分布になります。 ただし、標本数が少ない場合は、p値の分布が一様分布にならないことがあります。(Bing)
LWC プロジェクト作成する時選択のフォルダが長すぎまた別のプロジェクトの中にフォルダ作成した。

+ [LWC エラーの対処方法](https://qiita.com/Keiji_otsubo/items/480135e98f6b0144ee63)

# sfdx Error: Value too long for field: Source maximum length is:131072
+ [sfdx Error: Value too long for field: Source maximum length is:131072](https://qiita.com/Keiji_otsubo/items/5722555e350ef630eeaa)
+ [Error: Value too long for field: Source maximum length is:131072".Please help:解決](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000HDhT6)
+ [Value too long for field: Source maximum length is:131072](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007Rcbsg)


:::note info
I think you are creating another project in another project's folder.
I think it was an error because the folder hierarchy is deep.
Try changing the location of the folder.

別のプロジェクトのフォルダーに別のプロジェクトを作成していると思います。
フォルダ階層が深いのでエラーだったと思います。
フォルダの場所を変更してみてください。
:::

# Unable to build Lightning Component source for markup://c:bikeCard: Invalid suffix: json.

+ [Unable to build Lightning Component source for markup://c:workingWithDataInLWC: Invalid suffix: json.  ](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000Je1RD)

:::note info
This is because the folder name you chose when creating the project was too long, or the folder was created in another project's folder.

下記のエラーが出た時、一つの原因はプロジェクト作成する時選択のフォルダが長すぎまた別のプロジェクトの中にフォルダ作成した。
:::

# Unable to build Lightning Component source for markup://c:bikeCard: Invalid suffix: json.

+ [Starting SFDX: Authorize an Org 08:52:12.362 sfdx force:auth:web:login --setalias vscodeOrg --instanceurl https://login.salesforce.com --setdefaultusername » Warning: sfdx-cli update available from 7.198.7 to 7.199.7. Warning: The "force auth web logi](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000NRM8MSAX)

+ [Starting SFDX: Authorize an Org 08:52:12.362 sfdx force:auth:web:login --setalias vscodeOrg --instanceurl https://login.salesforce.com --setdefaultusername » Warning: sfdx-cli update available from 7.198.7 to 7.199.7. Warning: The "force auth web logi](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000NRM8M)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/99824fe9-058c-687b-ab70-61a5da480346.png)

:::note
This is because the folder name you chose when creating the project was too long, or the folder was created in another project's folder.

https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000Je1RD
:::
CSS.escape()でCSSセレクターとして使えない文字をエスケープする

## この記事の概要

[かつての自分の記事](https://qiita.com/xrxoxcxox/items/e24ec739db993bd41ec1#useid%E3%82%92%E7%94%A8%E3%81%84%E3%81%A6%E3%83%A6%E3%83%8B%E3%83%BC%E3%82%AF%E3%81%AA%E3%82%AF%E3%83%A9%E3%82%B9%E5%90%8D%E3%82%92%E7%94%9F%E6%88%90%E3%81%97%E3%82%88%E3%81%86%E3%81%A8%E3%81%99%E3%82%8B)で「ReactのuseIdを使って上手いこと一意なクラス名を生成しようと思ったけど`:`がクラス名として使えず断念」と書いたことがありました。

しかし、この事象自体は`CSS.escape()`を用いれば簡単に解消できることが分かったので備忘録として記事にしました。

## CSSのセレクターのルール

以下に記載があります。

https://www.w3.org/TR/selectors-3/#w3cselgrammar

今回関係あるものをざっくり説明するなら「クラス名は`[_a-z0-9-]`かエスケープした文字を使う」が該当します。
厳密に言えばもっと色々ありますが、ひとまず上記のように理解しておけばこの記事の話としては間違いないはずです。

## useIdの仕組み

記事の本旨とは関係ありませんが、この問題に行き着いた経緯を記載します。
冒頭に貼った記事にあるように、Reactにおいて`useId`を使うと`:`からはじまり`:`から終わる一意なidが生成されます（例 `:r0:`）。

## 困っていたこと

CSSセレクターのルールから、`:`はそのままではクラス名として使えないためエスケープする必要があります。
しかし、先ほど例で`:r0:`と挙げましたが、公式ドキュメントで明確な書式が提示されているわけではありません。[^legacy-document]
`:`だけにエスケープをかけるので十分なのかなど、微妙に迷いがありました。

[^legacy-document]: [古い方のドキュメント](https://ja.legacy.reactjs.org/docs/hooks-reference.html#useid)では、`:`を含むということだけは言及されていますが、新しい方にはその記載も見当たらないように思えます。

## CSS.escape()の仕組み

以下の書式で使用します。
`str`はエスケープしたい対象です。

```javascript
escapedStr = CSS.escape(str);
```

先ほどの`useId`で生成したidに適用すると、以下のようになります。

```javascript
const id = useId()

CSS.escape(id) // => \:r0\:
```

つまり、最初の記事の内容で言えば、このように指定することで問題なくCSSの指定ができます。

```jsx
<style>
  {`
    .class-${CSS.escape(id)} {
      color: red;
    }
  `}
</style>
```

だからとて記事に書いたやりたいことは上手く実現できないのですが、1つ引っかかりが取れました。

## 参考

https://developer.mozilla.org/ja/docs/Web/API/CSS/escape_static

https://react.dev/reference/react/useId

---

最後まで読んでくださってありがとうございます！
[Twitter](https://twitter.com/xrxoxcxox)でも情報を発信しているので、良かったらフォローお願いします！

[Devトーク](https://jobs.qiita.com/employers/qiita-inc/dev_talks/489)でお話してくださる方も募集中です！
デイトラ「Web制作コース」　受講内容をアウトプット 24日目

学んだことをアウトプットしています。完全に自己満足ですので悪しからず。
以下の点を確実にアウトプット

1）受講内容
　　デイトラ「Web制作コース中級編」　JavaScript・jQuery学習編
2）本日の学習内容
　　●jQueryを使うメリットとJavaScriptとの違い
　　　・短いコードで簡単にかける
　　　・ブラウザごとの対応がいらない
　　　・便利なライブラリがたくさんある
　　●jQueryの書き方のルール
　　　・$マークで始まり
　　　・function()で囲む
　　　・$("主語").動詞("補語")の文法ルールで書く
　　　・HTMLからjQueryを使う方法
　　　　⇒jQueryのライブラリはCDNを活用して読み込んでいる
　　　　　以下のjQueryの公式サイトからリンクを取得可能
　　　　　https://jquery.com/download/
　　　　読み込む場所は、HTMLの</body>の直前
　　●jQueryの代表的なメソッド一覧
　　　.text()　テキストを取得する
　　　.text('変更したいテキスト')　テキストを' '内の文字列に変更する
　　　.html()　HTMLを取得する
　　　.html('変更したいHTML')　HTMLを' '内のHTMLに変更する
　　　.click()　対象要素をクリックする
　　　.prepend('要素')　要素の先頭にHTMLを挿入する
　　　　例：$('#lists').prepend('< li >先頭に追加するリスト< /li >')
　　　.append('要素')　要素の最後にHTMLを挿入する
　　　　例：$('#lists').append('< li >最後に追加するリスト< /li >')
　　　.remove()　要素を削除する
　　　.attr('属性')　指定した属性の値を取得する
　　　　例：$('a#special-link').attr('href')
　　　.attr('属性', '値')　指定した属性の値を変更する
　　　　例：$('a#special-link').attr('href', 'https://xxxx.com')
　　　.removeAttr(属性名)　指定した属性を削除する
　　　.addClass(class属性値)　class属性を追加する
　　　　例：$('#button').addClass('active')
　　　.removeClass(class属性値)　class属性を削除する
　　　　例：$('#button').removeClass('active')
　　　.css(プロパティ名)　指定したCSSプロパティの値を取得する
　　　　例：$('#logo').css('color')
　　　.css(プロパティ名, 値)　指定したCSSプロパティの値を設定する
　　　　例：$('#logo').css('color', 'red')
　　　.val()　フォームの入力値(value属性の値)を取得する
　　　　例：$('input#name').val()
　　　.val('入力値')　フォームの入力値(value属性の値)を設定・上書きする
　　　　例：$('input#name').val('tofuri')
　　●アニメーションメソッド一覧
　　　https://api.jquery.com/category/effects/
Quick text

[まとめページに戻る](https://qiita.com/Keiji_otsubo/items/60afc2a8d211b6f7d89f)
[まとめN～Z](https://qiita.com/Keiji_otsubo/items/92f92bb9f668ca9688be)


+ [メール-toケースのメール作成者の Lightning Editor にクイックテキストボタンが表示されない](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000PmNBTSA3)

:::note
Quick Text はベータ版製品の一部ではありません。冬には GA エディターの一部となる予定です。これは制限と考慮事項のヘルプ ドキュメントで公開されており、来週から利用可能になります :)
:::

+ [クイックテキストは新しいメールエディターで利用できますか?](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000PmUBf)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/6a190917-e431-36a5-7470-e9d26f4dd32a.png)


+ [How do I edit existing Quick Text?](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007QbfFQ)

:::note
Please check this article. 

https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000A8Qb8SAF

https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000A982WSAR
:::

+ [カスタムオブジェクトでのクイックテキスト利用について](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007Yvppg)

①商談オブジェクトのカスタム項目でクイックテキストを利用することはできるのでしょうか？

②チャネルにカスタムオブジェクトを追加する方法がわかりません。追加をして、カスタム項目で利用することはできるのでしょうか。

:::note
ヘルプによると標準オブジェクトでは何やら「ソーシャル投稿で」と条件があるみたいですね。またコメントとかリッチテキストなど使用できる項目の属性にも制限があります。

クイックテキストの挿入と使用

同じメッセージを何度も入力するのはやめて、時間を節約しましょう。クイックテキストは、ナレッジ記事、チャット、活動の記録アクション、メール、行動、ToDo、ソーシャル投稿で、標準オブジェクトまたはカスタムオブジェクトに定義済みメッセージを挿入する場合に使用します。クイックテキストメッセージをメッセージ項目に挿入した後で、テキストを送信する前に状況に合わせて調整することもできます。

https://help.salesforce.com/s/articleView?id=sf.quick_text_insert.htm&type=5

商談オブジェクトの項目そのものでは使えないような感じですね。
Opportunity オブジェクトの下の Log a call アクションに対して表示されます。

https://salesforce.stackexchange.com/questions/404407/no-quick-text-yet
:::

# 新しいフォルダー作成ボタン

+ [サービスコンソールの分割ビューにマクロやクイックテキストを選択すると画像のように崩れてします](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000PWYCH)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/ee937d92-3436-48e0-8ed0-7dca451930df.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/6d481263-9d02-4458-9c65-f91feed2ae43.png)

:::note
設定 --> マクロ設定 でフォルダーでマクロを共有および整理をオフにすると、マクロの横の新規フォルダーは表示されなくなると思います。 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/611e9fe5-6775-4841-b200-50c903348cc3.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/c1014121-3c8a-47a3-9655-7cc1bd4a7ac3.png)
:::
Element {http://soap.sforce.com/2006/04/metadata}nameSegment invalid at this location in type FlowActionCall


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/0328692b-8c71-5ef0-6689-9746d850cf0a.png)

+ [Element {http://soap.sforce.com/2006/04/metadata}nameSegment invalid at this location in type FlowActionCall](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000PeiC4)

:::note
Yes it's due to Summer 23' You have to manually update XML change 58.0 -> 57.0 and remove nameSegment tag and there also the second tag related to this tag it must be deleted as well

はい、これは Summer 23 によるものです。XML 変更 58.0 -> 57.0 を手動で更新し、nameSegment タグを削除する必要があります。また、このタグに関連する 2 番目のタグも削除する必要があります。
:::
BDE Decision Cube ComponentsをDelphi2007で使用

# BDE Decision Cube ComponentsをDelphi2007で使用

Delphi ver7に存在した、BDEのDecision Cube Componentsが、Delphi2007のコンポーネントパレット上から消えている。
ソースは消されていないので、そこから、パレットに復元する方法です。

## 復元方法

ソースは、($BDS)\source\Win32\xtab にある。
上記ホルダにあるプロジェクトファイルを使って再構築するば良いのでだが、エラーが出る。
参照パッケージの追加が必要なようで、”参照の追加”で、dclbde.dcp の追加が必要なようである。
追加後、再構築すればＯＫ。

## バグ(?)修正

データの値によってオーバーフローするので下記の修正を行っておくことをお勧めする。

//  procedure SetMemoryCapacity(Value: Integer);
  procedure SetMemoryCapacity(Value: Int64);
//  function GetMemoryCapacity: Integer;
  function GetMemoryCapacity: Int64;
～～～～
var
//  AvailableMemory: Integer;    { Memory available to allocate }   
  AvailableMemory: Int64;       { Memory available to allocate }
// TotalAllocatedMemory: Integer;  { Total allaocted by the array classes }
  TotalAllocatedMemory: Int64;  { Total allaocted by the array classes }
文字数の取得方法(Ruby)

文字数の取得方法を***Ruby***で実装しました

```Ruby
# 文字列の最後の文字を出力する
# 新規作成 2023/5/15

puts "文字を入力してください"
str = gets.chomp
# 文字数を取得する
num = str.length
# 1番最後の文字を出力する
puts str[num-1]

```
Pipenvを使って仮想環境を構築し、Jupyter Notebookを起動したい(Mac)

## はじめに
TensorFlowを使うための学習の一環で、画像分類機の作成に取り組みました。その際、講座ではjupyter notebookが簡単にinstallできる理由でAnacondaの利用を推奨していましたが、メインで使用しているPipenvでも同様のことをしたいと考えて、調べた結果を備忘録として残します。

## 手順
## プロジェクトの制作
1. Project用のdirectoryを作成する。
2. 作成したdirectoryに移動する。
3. `pipenv install jupyter jupytext` を実行して、Jupyter NotebookとJupytextが入ったPython環境を作成します。この際、自動でPipfileとPipfile.lockが作成されます。

## 設定情報の追加
`~/.jupyter/jupyter_notebook_config.py`に設定情報を追加する必要があります。
1. `pipenv run jupyter notebook --generate-config`を実行し`~/.jupyter/jupyter_notebook_config.py`を作成します。
2. `~/.jupyter/jupyter_notebook_config.py`をeditorで開き、以下のcodeを追加します。Jupytextが使用できるようになり、`.ipynb`と`.py`の変換が行えるようにします。
```
c.NotebookApp.contents_manager_class = "jupytext.TextFileContentsManager"
c.ContentsManager.default_jupytext_formats = "ipynb,py"
```
## Jupyter Notebookの起動・停止
1. `pipenv run jupyter notebook`を実行し、Jupyter Notebookを起動します。
![Screen Shot 2023-05-14 at 17.16.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2801102/209b4891-5f01-9a45-b251-dcb6149bacd4.png)
2. Jupyter Notebookを起動しているterminalで`Ctrl`+`C`で停止します。

## Jupyter Notebookが起動しない場合
- `~/.jupyter/jupyter_notebook_config.py`を作成してechoで設定値を書き込みましたが、以下のerrorでJupyter Notebookが起動できませんでした。
```
Bad config encountered during initialization: The 'contents_manager_class' trait of a NotebookApp instance expected a subclass of notebook.services.contents.manager.ContentsManager or jupyter_server.contents.services.managers.ContentsManage, not the JupytextContentsManager JupytextContentsManager.
```
- 設定値が適切に設定されているか確認したところ、`getConfig()`というFunctionを使用しているにもかかわらず、定義がされていなかったので簡易的に定義しました。
```
from traitlets.config import Config

def get_config():
    return Config()

#これだけ最初から含まれていた
c = get_config()
```
## 終わりに
今回初めて記事を書いてみましたが、物事を文章化することは非常に難しく時間のかかる作業であると再認識できました。定期的に備忘録を残していきたいと思っております。


## 参考文献
- Pipenvについて：https://zenn.dev/nekoallergy/articles/py-env-pipenv01
- Jupter Notebookのconfigについて：https://qiita.com/plumfield56/items/23bef4f5b76fafbf11c7
- 設定値の追加について：https://hikotaro.hatenablog.jp/entry/2019/11/21/073457
【Tableau】DATASaber:HandsOn - Fundamental(Ord1) Q6 解説

tableau datasaberになるための技術力に関する問題を解いていきたいと思います。
こちらの問題はtableauを始める方にぴったりだと思いますので、ぜひチャレンジしてみてください！
使用するデータは、「サンプル - スーパーストア.xls」を使用する。:arrow_down:
https://drive.google.com/drive/u/0/folders/1kXSb3fqPTt3VcPjGUSgOmrztlRfvvpMH

:white_check_mark:ord1-Q6
製品マスタの不備でカテゴリ項目に誤りがあることが判明いたしました。
製品IDの先頭(-(ハイフン)より前)を区切ると、正しいカテゴリが取得できるようなのですが、製品IDからカテゴリごとの正しい売上を算出してもらえませんか？

・データペインから、製品idをカスタム分割します。"-"で最初の1列を取り出します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3119468/c83467c0-8066-e21f-661b-c7e6049bf1ed.png)![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3119468/c9d3c43a-2d5f-33e2-d965-2042a2cd3978.png)

・名前の編集から、製品カテゴリに変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3119468/5d1e779f-5996-c15c-8715-20ba1510d8c5.png)![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3119468/2b4533a3-76b1-db03-f6aa-60e4643c0bc0.png)

・売上と製品カテゴリをビューに入れ、降順に直して終了です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3119468/a0af8471-6cc9-3636-b1e8-5c104996d4b1.png)

解説は以上になります！
最後まで読んでいただきありがとうございました！
もしよろしければ「いいね👍」お願いいたします！
2023/5/15主にITとかセキュリティの記事

水道利用者566人の個人情報、ウイルス感染で漏洩か　岩手・大槌町(5/13)
https://news.yahoo.co.jp/articles/78c7d78c166ca6485419096c7c08a621c193bfb0

５６６人の個人情報漏洩の恐れ　大槌町上下水道課のＰＣウイルス感染＜岩手県＞(5/13)
https://news.yahoo.co.jp/articles/11a5cd2c89607de24310aebe3592b485a86e7155?source=rss

セゾンカードを偽るフィッシング確認、注意を(5/13)
https://news.mynavi.jp/techplus/article/20230513-2678655/

マイナカードを使ったコンビニ証明書交付のトラブル、「二度と生じないよう強く求めた」と松本総務大臣(5/12)
https://news.nicovideo.jp/watch/nw12562442

「チャットGPT」技術　長野県が試験的に導入　議事録の要約やあいさつ文の作成などに利用(5/12)
https://news.yahoo.co.jp/articles/937ab7623892491c7446c8550c2e2ce96e6d8328?source=rss

SIMスワップ詐欺による暗号資産口座への不正送金事案についてまとめてみた(5/12)
https://piyolog.hatenadiary.jp/entry/2023/05/12/213116

この3つは「全てなりすましです」クロネコヤマトが注意呼びかけ。偽物を見抜くポイントは？(5/13)
https://news.goo.ne.jp/article/huffingtonpost/life/huffingtonpost-645ef881e4b005be8ff3957c.html

ランサムウェアは成熟したサイバー犯罪産業に成長、同盟関係も構築(5/13)
https://news.mynavi.jp/techplus/article/20230513-2678051/

HD現代、船舶運営サイバーセキュリティ技術開発···グローバル造船業界初(5/12)
https://japan.ajunews.com/view/20230512112608882

WordPressの人気プラグインに緊急の脆弱性、100万以上のサイトに影響(5/13)
https://news.mynavi.jp/techplus/article/20230513-2678046/
【Tableau】DATASaber:HandsOn - Fundamental(Ord1) Q5 解説

tableau datasaberになるための技術力に関する問題を解いていきたいと思います。
こちらの問題はtableauを始める方にぴったりだと思いますので、ぜひチャレンジしてみてください！
使用するデータは、「サンプル - スーパーストア.xls」を使用する。:arrow_down:
https://drive.google.com/drive/u/0/folders/1kXSb3fqPTt3VcPjGUSgOmrztlRfvvpMH

:white_check_mark:ord1-Q5
年月ごとの売上の前年比成長率を確認してください。
カテゴリごとの成長率を見た時に、
2016年の成長率が年の後半に向かってより高く上がる傾向にあるカテゴリはどれでしょうか。
傾向は線形で確認してください。

まず、オーダー年月ごとの売上を出します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3119468/897b88be-7a92-eb44-0aeb-5aa27a101bc2.png)

次に、売上を簡易表計算から前年比成長率を出します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3119468/dac4e2ec-06be-5e75-569a-fb569bd52897.png)
カテゴリごとに見たいので、カテゴリを色に入れて、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3119468/698a7c37-0ffb-28a7-50e4-b774a6ec300a.png)

傾向を見たいので、左上アナリティクスから「傾向線」をビューにドラッグアンドドロップ(線形の上)します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3119468/75f0cefc-6e37-4c1d-5986-cc022bb3096a.png)

よって、2016年の成長率が年の後半に向かってより高く上がる傾向にあるカテゴリを求めることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3119468/f3de131d-b7df-cd4a-2fab-af11305ac0d7.png)

解説は以上になります！
最後まで読んでいただきありがとうございました！
もしよろしければ「いいね👍」お願いいたします！
【Tableau】DATASaber:HandsOn - Fundamental(Ord1) Q4 解説

tableau datasaberになるための技術力に関する問題を解いていきたいと思います。
こちらの問題はtableauを始める方にぴったりだと思いますので、ぜひチャレンジしてみてください！
使用するデータは、「サンプル - スーパーストア.xls」を使用する。:arrow_down:
https://drive.google.com/drive/u/0/folders/1kXSb3fqPTt3VcPjGUSgOmrztlRfvvpMH

:white_check_mark:ord1-Q4
・売上TOP10のオーダーIDは？

まず オーダーidごとの売上を出したいので、
売上とオーダーidをビューに入れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3119468/c74efbee-2bfb-2723-6e10-cf957fbb6b03.png)


次に上位10に絞りたいので、オーダーidをフィルターに入れ、
上位を選択し、フィールド指定　上位　10とし、OKを押下。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3119468/b8474504-afff-fa2a-0547-0816b1830aba.png)![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3119468/48ba1a3c-4d9f-680d-b958-7c804b430465.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3119468/50384d9b-b47b-353a-90e3-c1a6898ce9ff.png)

トップ10のみ表示されるので、降順に直すことで、売上TOP10のオーダーIDを求めることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3119468/8b297f96-3174-51e4-f850-e2e0e4d30f57.png)

解説は以上になります！
最後まで読んでいただきありがとうございました！
もしよろしければ「いいね👍」お願いいたします！
Stable Diffusion web UIの旧バージョンをGoogleColaboratoryで起動する

色々忙しくて、久々の更新になります

Stable Diffusion web UIをGoogleColaboratoryで起動しようと思ったのですが
RuntimeErrorで起動できません

Stable Diffusion web UIがかなりの頻度で更新されているため
どうしても旧来の手順では上手く起動できないようです

かなり手間は掛かるのですが
旧バージョンのStable Diffusion web UIを使用するしかないようです
[（悠様参考）](https://yuuyuublog.org/automatic1111downgrade/)

まず、旧安定版のStable Diffusion web UIにアクセスします

https://github.com/AUTOMATIC1111/stable-diffusion-webui/tree/a9fed7c364061ae6efb37f797b6b522cb3cf7aa2

緑色の[Code]→[Download ZIP]でローカルにZIPファイルでDownloadします
Downloadが終わったら解凍します

解凍が終わったら
GoogleColaboratoryを使用しているアカウントで
Googleドライブにアクセスします

そして、「マイドライブ」以下のどこかに
ディレクトリ（私は「StableDiffusion」としました）を作成し
その中に解凍した旧安定版のStable Diffusion web UIをアップロードします

自分は、以下のようにしました
![setting_20230515_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2790258/59245dd1-289e-cde3-74d4-44c94ca4fa2f.png)

終わったら、GoogleColaboratoryで
新規ノートブックを作成します（GPUの設定を忘れずに）

作成が終わったら
左のツールバーから
「ファイル」→「ドライブをマウント」を行い
先程、Googleドライブにアップロードしたファイルが表示されていることを確認します

ここでColaboratoryのセルに次のようなコードを入力し実行します
（folder_1のパスは各自のものに合わせて下さい）

```
#旧versionのWebUIを複製
import shutil

folder_1 = '/content/drive/MyDrive/StableDiffusion/stable-diffusion-webui-a9fed7c364061ae6efb37f797b6b522cb3cf7aa2'
folder_2 = '/content/stable-diffusion-webui'
shutil.copytree(folder_1 , folder_2)

%cd /content/stable-diffusion-webui

#LoRAモデルを格納するフォルダを作成
!mkdir -p /content/stable-diffusion-webui/models/Lora

#Hypernetworkを格納するフォルダを作成
!mkdir -p /content/stable-diffusion-webui/models/hypernetworks
```

![setting_20230515_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2790258/b8f9d93e-814c-e88f-978a-424cb80ea3b3.png)

ここまで終わったら
以前まで使用していたコードでStable Diffusion web UIをインストールしていきます

```
!wget https://huggingface.co/gsdf/Counterfeit-V2.5/resolve/main/Counterfeit-V2.5.safetensors -O /content/stable-diffusion-webui/models/Stable-diffusion/Counterfeit-V2.5.safetensors
!wget https://huggingface.co/gsdf/Counterfeit-V2.5/resolve/main/Counterfeit-V2.5.vae.pt -O /content/stable-diffusion-webui/models/VAE/Counterfeit-V2.5.vae.pt

%cd /content/stable-diffusion-webui/extensions/
!git clone https://github.com/liasece/sd-webui-train-tools /content/stable-diffusion-webui/extensions/sd-webui-train-tools

%cd /content/stable-diffusion-webui
!pip install torch==1.13.1+cu117 torchvision==0.14.1+cu117 torchtext==0.14.1 torchaudio==0.13.1 torchdata==0.5.1 --extra-index-url https://download.pytorch.org/whl/cu117
!python launch.py --share --xformers --enable-insecure-extension-access
```

これで起動できます

ちなみにですが
以前まで必要だったPythonのバージョンアップは不要になりました
（GoogleColaboratoryのPythonのデフォルトバージョンが3.10.11となったため）

以上です
また、ぼちぼちStable Diffusion関連の記事を投稿していく予定です
非情報系がOSSコントリビュートした記録

# 初めに
非情報系(物理)がOSSコントリビュートしたので、記録します。非情報系の大学生が、そこまで技術力に自信がなくても、一歩が踏み出せるような手助けになれば幸いです。

# 概要
簡単にまとめると、Google Summer of Code(GSoC)の中から自分に関連した団体を探し、優しい問題にトライします。

# 利点
GSoCから団体を探す利点は、サポートが手厚いことです。GSoCは、初めてOSSコントリビュートする人を対象としたプログラムです。なので、そのプログラムに参加している団体は初心者が参加することを歓迎しているはずです。ドキュメントが揃っていたり、初めてでも取り組みやすいissueが明示されていることはその証拠です。

# やり方
## 1.GSoCのサイトから、 興味のある、または知識のあるOSSをいくつか見つける。
[GSoCのOrganization](https://summerofcode.withgoogle.com/programs/2023/organizations
)ページを開きます。ここには、GSoCに参加しているOSS団体がリストアップされています。自分の専攻に関連していたり、興味のある分野を選ぶと良いと思います。例えば、私はQuTiPを選びました。

## 2.その中のGood first issueを見つける。
興味のある団体のGithubのissuesを見ると、多くの場合、good first issueなどの名称で、初めてでも取り組みやすいissueが用意されています。その中で解決できそう、したいと思うものを見つけましょう。例として、私が候補にしていたQuTiPの[issues](https://github.com/qutip/qutip/issues)とSympyの[issues](https://github.com/sympy/sympy/issues)のリンクを載せておくので、見てみてください。

## 3.トライする。
実際に挑戦してみましょう。初めに適当にコメントを送って、管理者の人に自分を認識してもらうと良いと思います。より詳しい詳細を尋ねてみるのも良いです。おそらく多くの団体がcontribution guideという。開発環境の設定やPRの送り方を解説したドキュメントを持っているので、読んで実際にPRを送ってみましょう。参考例として、[私の初めてのコントリビュート](https://github.com/qutip/qutip/issues/2109
)を載せておきます。英語ですが、大した英語を使っていないことがわかると思います。

# まとめ
いかがでしたか？(まとめサイト風)今回は非情報系がOSSコントリビュートするということで記事を書きました。私自身は、今回の方法をGSoCに実際に応募する過程で行い、今回無事採択されました。GSoCは競争率が高いですが(今年は倍率が約6倍)、非情報系こそうまくやれば競争を回避して採択されると考えています。~~次回はそのことについて書いていきます。~~

# 補足
あんまり技術的な話ではないので、続きも書いておきます。
ガチCS系のトピックは倍率がかなり高いはずです。見かけたのでは最大５０倍であると警告している団体もありました(うろ覚え)。インドのIITの学生がかなり活発に動いているのをよく見かけます。逆に言えば、非CS系のプロジェクトは倍率が低いことが想定されます。物理・化学など、CS＋αが狙える学生は逆に狙い目だと思います。CS系に比べて技術力がない分は十分専門性でカバーできますので、ぜひがんばってください。需要がありそうであればProposalもおみせします(恥とかないので)。
Pocketのブックマークをdailyで保存する

あなたは今まで何回WWWブラウザのブックマークフォルダの中身を移行しましたか。ちゃんと初めてのInternet Explorerのブックマークを今も保持できていますか。

# コード
https://github.com/cookie-s/pocket-export

# 使い方

1. SSH鍵ペアを作成
1. Gitサーバ(i.e. GitHub)のDeploy keyに公開鍵登録
1. SSH秘密鍵を`.git/id_ed25519`に保存
1. crontabに設定
1. README.mdも読む
1. 初回にorphan branch `data` も作って適当にcommit生やした方がいいかもしれない


# コードを公開する技術

僕のPocketブックマークをみんなに晒す気はいまんとこないので。

```
git remote add github-public git@github.com:cookie-s/pocket-export
git checkout --orphan data-dummy
git commit -m 'hogefuga' --allow-empty
git push github-public data-dummy:data
```

GitHubの設定に行って、Branch Protectionルールをかけまくる。
* Branch name pattern: `data`
* Require a pull request before merging: ✅
* Require linear history: ✅
* Lock branch: ✅
* Do not allow bypassing the above settings: ✅


# 最後に

もし仮に僕のPocketブックマークが見えてしまったら、こっそり教えてください。
VisualStudio CodeでPython開発コンテナーを使おうとしてハマった備忘録

ローカルに開発環境を作るためにひさしぶりに開発コンテナーを使おうとしたらちょっとハマりました。

## やりたいこと

- Pythonの開発環境を作りたい
- Pythonのデータ解析ライブラリを使えるようにしたい：Pandas、Poloars、NumPy、PyArrow

## 実行環境

- Windows 11 Pro 22H2 22621.1702
- Rancher Desktop 1.8.1
- WSL2 (Ubuntu)
- VisualStudio Code 1.78.2
  - Dev Containers v0.292.0
- Dockerベースイメージ：python:3.11.3-bullseye (後述)

## 遭遇したトラブルと解決方法

### NumPyとPyArrowのインストールに失敗する

最新のPython(2023/5/14時点では3.12.0a7)を選ぶと失敗、Alpine Linuxを選ぶと失敗。  

最新のPythonを選んだとき：  
```sh
#0 1524.0       CMake Error at CMakeLists.txt:261 (find_package):
#0 1524.0         By not providing "FindArrow.cmake" in CMAKE_MODULE_PATH this project has
#0 1524.0         asked CMake to find a package configuration file provided by "Arrow", but
#0 1524.0         CMake did not find one.
```

Alpine Linuxを選んだとき：  
```sh
#0 26.92             [Errno 2] No such file or directory: 'gcc'
#0 26.92
#0 26.92             RuntimeError: Broken toolchain: cannot link a simple C program.
#0 26.92             [end of output]
#0 26.92
#0 26.92         note: This error originates from a subprocess, and is likely not a problem with pip.
#0 26.92         ERROR: Failed building wheel for numpy
#0 26.92       Failed to build numpy
#0 26.92       ERROR: Could not build wheels for numpy, which is required to install pyproject.toml-based projects
#0 26.92       [end of output]
```

解決方法は色々ありそうな気がしますが、今回はDockerベースイメージにpython:3.11.3-bullseyeを選ぶことで回避しました。  

### apt-get updateに失敗する

cmakeが必要なのかも？と試行錯誤する過程でapt-get updateしようとしたときに、以下のようなエラーが発生しました。  

```
E: Release file for http://deb.debian.org/debian-security/dists/bullseye-security/InRelease is not valid yet
```

apt-getのオプションに```-o Acquire::Check-Valid-Until=false -o Acquire::Check-Date=false```を加えて解決。

```dockerfile
RUN apt-get -o Acquire::Check-Valid-Until=false -o Acquire::Check-Date=false update \
  && apt-get install -y cmake \
  && apt-get clean \
  && rm -rf /var/lib/apt/lists/*
```

そもそもの原因はWSLの時刻がズレているせいだったみたい。  
確認してみたらめちゃめちゃズレてる！  

```sh
user@mypc:~$ date
Sun May 14 07:23:46 JST 2023
user@mypc:~$ sudo hwclock -s
[sudo] password for user:
user@mypc:~$ date
Sun May 14 12:09:05 JST 2023
```

### 開発コンテナーに接続しようとすると失敗する

開発コンテナーのイメージがビルドできたところで、以下のようなエラーが発生しました。  

```sh
docker: Error response from daemon: invalid mount config for type "bind": bind source path does not exist: \\wsl.localhost\Ubuntu\mnt\wslg\runtime-dir\wayland-0.
```

以下のページのトラブルシューティングを参考にVisualStudio Codeの設定を変更することで解決。  
[VSCode Dev ContainerとRancher Desktopで作るコンテナ環境【WSL】](https://tech-lab.sios.jp/archives/33994#VSCode_Dev_Container) 

なるほど、WSLにWAYLAND_DISPLAYが設定されてますね…
```sh
user@mypc:~$ echo $WAYLAND_DISPLAY
wayland-0
```

なので、```dev.containers.mountWaylandSocket```をfalseにします。  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917580/f5382da3-6e70-5d4a-17ff-3addd6b69505.png)

## 導入したライブラリ

無事に以下のライブラリを導入できました。  

| ライブラリ | バージョン |
| ---------- | ---------- |
| numpy      | 1.24.3     |
| pandas     | 2.0.1      |
| pyarrow    | 12.0.0     |
| polars     | 0.17.13    |

## 感想

ふりかえってみると簡単な話だった…精進が足りない。
Webアプリの設計③~画面遷移図の作成~



## はじめに

前々回の記事から、「自己研鑽＋ポートフォリオ+趣味」という位置づけでWebアプリを作り始めました。

https://qiita.com/kajiyai/items/f66ba5d9659ef87c3247

「自己研鑽＋ポートフォリオ+趣味」

自分のフェーズに合致したとてもいい記事があったので、こちらの記事を参考に進めています。

https://qiita.com/takahirocook/items/3cfa6585e74effafe5da

## キーワード

設計書, 設計, 設計プロセス, 外部設計

## 目次

1. 全体
2. 外部設計
    1. 画面設計
        1. 画面遷移図
3. おわりに

## 全体

各フェーズのざっくりとした自分の理解です

1. 企画
    1. どんなものを作るか決める
        1. ユーザーゴール
            1. サービスを使う人のゴール
        2. ビジネスゴール
            1. サービスを作る人のゴール
2. 要件定義
    1. 機能要件
        1. 最低限の機能
    2. 非機能要件
        1. +αの機能
3. 外部設計**←イマココ**
    1. 方式設計
        1. 使用するサーバー,言語,フレームワーク,DBなどの環境整備を行う
    2. 機能設計
        1. 実装する機能の洗い出し
            1. DB設計, バッチ処理等もここで設計する
    3. 画面設計
        1. 画面遷移図の作成
            1. トリガー, 流れを図示する
4. 内部設計
    1. データ設計
        1. 概念設計
            1. 概念図
        2. 論理設計
            1. ER図
        3. 物理設計
            1. テーブルの図
    2. モジュール設計
        1. モジュールの分割を行う
    3. プログラム設計
        1. 設計内容を具体的に落とし込む
5. 開発
    1. goooooooooooooooooooooo
6. テスト
    1. 単体テスト
        1. モジュール内のテスト
    2. 結合テスト
        1. モジュール間のテスト

## 画面遷移図

miroを無料で使ったので悪い画質ですが、悪しからず。

https://miro.com/

![画面遷移図1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3092463/787a9096-f7b3-d8ae-f7a8-7f84b55c30ca.jpeg)
![画面遷移図2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3092463/589a06fa-5c99-d239-4304-f48900b0ba3e.jpeg)


あるあるだとは思いますが、画面遷移図を書くうちに、これについて考慮が漏れてたなーとか、この仕様の方が良いのでは、等と思っていくつも修正してあります。以前の記事で作成した仕様や機能設計から大幅に変更されました。

以下に前回より変更した点を記しておきます

- チャレンジ概念の導入

まず、30日チャレンジのためのアプリだというところに立ち返り、そのための概念を導入しました。

「チャレンジにぶら下がって初めて投稿が出来る」仕様に変更しました

また、チャレンジは2個しか作成できず、作成から4日目以降は更新不可能(削除は可能)という仕様にしました。

それに伴い、チャレンジ作成後30日を過ぎると投稿が出来なくなる仕様にしました。

- SNS機能の削除

自前で作るよりも外部SNSと連携できることの方が、技術の学習的にもサービス的にもメリットが多そうだという事に気づきました。


## おわりに

今回は全体の画面遷移図を描いたところで力尽きました。
次回は各画面のレイアウト図を描こうと思います。(どんどん筆が重くなっていく…)


ではまた。
接続できなくなった Lightsail インスタンスからデータを救出する

# ある日のこと

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259685/304e180c-df28-a009-3321-3e3351c57dc5.png" width="50%">

Lightsail のインスタンスに SSH で接続できなくなった．

中には長年ためてきたログ達がおり，何としても救出したい．
でもバックアップも定期的なスナップショットも取ってなかった．

さて，どうしたものか……

# あった，救出方法

実は Lightsail インスタンスのスナップショットは EC2 にエクスポートできる．
しかし，単純にスナップショットから EC2 のインスタンスを起動しても，当たり前ながら状況は変わらない．

そこで，スナップショットから EBS の Volume を作成する．
そして，新たに作成した EC2 のインスタンスにアタッチしてマウントすれば……

見事に Lightsail のファイルシステムにアクセスできる．
あとは自由にデータを取り出せばよい．

# めっちゃ端折った

時間がないので，詳しい手順は省いて，とりあえずアイデアだけ書き起こしました．
需要がありそうなら，詳しい手順も追加したいと思います．
【Twig】条件分岐の使い方

Twigの条件分岐について備忘録的にまとめてみました。
## if 文の書き方から
```twig
{% if foo %}
  AAA
{% elseif %}
  BBB
{% else %}
  CCC
{% endif %}
```
## 論理演算子
### AND 条件
```twig
{% if hoge and fuga %}
  {{ hoge }} / {{ fuga }}
{% endif %}
```
### OR 条件
```twig
{% if hoge or fuga %}
  {{ hoge }} {{ fuga }}
{% endif %}
```
## 比較演算子
```== , != , < , > , <= , >=```等の比較演算子は使用可能。
### 正規表現
```twig
{% if phone matches '/^[\\d\\.]+$/' %}
  {{ phone }}
{% endif %}
```
### 厳密等価演算子
``===`` , ``!===`` は使用不可。
```twig
{% if foo is same as(false) %}
  {{ foo }}
{% endif %}
```
## 三項演算子
```twig
{{ foo ? 'yes' : 'no' }}
{{ foo ?: 'no' }} is the same as {{ foo ? foo : 'no' }}
{{ foo ? 'yes' }} is the same as {{ foo ? 'yes' : '' }}
```
## null合体演算子
```twig
{{ foo ?? 'no' }}
```
## その他のオペレーター
### in_array 関数
配列内の要素が含まれているかのチェックなどなど。
```twig
{{ 1 in [1, 2, 3] }}

{# 配列ではないけど...。文字列チェックもできるようですね。 #}
{{ 'cd' in 'abcde' }}
```

## 参考

https://twig.symfony.com/doc/3.x/templates.html#comparisons
【Tableau】DATASaber:HandsOn - Fundamental(Ord1) Q3 解説

tableau datasaberになるための技術力に関する問題を解いていきたいと思います。
こちらの問題はtableauを始める方にぴったりだと思いますので、ぜひチャレンジしてみてください！
使用するデータは、「サンプル - スーパーストア.xls」を使用する。:arrow_down:
https://drive.google.com/drive/u/0/folders/1kXSb3fqPTt3VcPjGUSgOmrztlRfvvpMH

:white_check_mark:ord1-Q3
オーダー日の2014年を対象とした場合、顧客IDとカテゴリの組み合わせの種類はいくつになりますか？

まず、オーダー日の2014年を対象とするため、
オーダー日をフィルターに入れ2014年を指定する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3119468/2ca719e3-0011-f082-d0ce-b90fd9c3644d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3119468/5cf5a9bd-2b4f-3be2-2629-a90bf0f7c6b3.png)

顧客Idとカテゴリをビューに入れます。
すると左下にマーク数がでます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3119468/92eb8314-a7e3-ad7f-3406-6393826216a1.png)

解説は以上になります！
最後まで読んでいただきありがとうございました！
もしよろしければ「いいね👍」お願いいたします！
TiDBをbackendにしたGrafanaをv9.3より前からv9.3以降に更新するときにDB migrationでエラーする

Migration ID `add primary key to seed_assigment`が以下のエラーで失敗する。

```
Error 8200: unsupported add column 'id' constraint AUTO_INCREMENT when altering 'grafana.seed_assignment'
```


https://github.com/grafana/grafana/blob/18aba61cbdacccec7336c17a4c42416b599487f6/pkg/services/sqlstore/migrations/accesscontrol/seed_assignment.go#LL43C56-L43C88

# 原因
たぶん発行されるSQL statementは以下。

```
ALTER TABLE seed_assignment ADD id INT NOT NULL AUTO_INCREMENT FIRST, ADD PRIMARY KEY (id)
```

### TiDB Restriction

https://docs.pingcap.com/tidbcloud/auto-increment#restrictions
> Currently, AUTO_INCREMENT has the following restrictions when used in TiDB:
> * ALTER TABLE cannot be used to add the AUTO_INCREMENT attribute.

TiDBはAUTO_INCREMENTを追加するALTER TABLEを現在許していない。


# 対処

`seed_assignment`がなにをするテーブルなのかはよく分かっていないけど、幸いにも空だったので、テーブルを削除して新スキーマで再生成する。

`mysqldump --no-data`でschemaのdumpを取った後、`id`を加えた`CREATE TABLE`文を用意し、`DROP TABLE`をした後に用意した`CREATE TABLE`を発行する。

そのままだとGrafanaはmigrationが行われたことに気づかずエラーを繰り返すので、table `migration_log`の適当なエラー行のsuccess列を`1`にしてしまってつじつまを合わせる。

```
SELECT id, migration_id, success FROM migration_log WHERE migration_id = 'add primary key to seed_assigment' LIMIT 1;
UPDATE `migration_log` SET `success` = '1' WHERE `migration_log`.`id` = ${{SELECTで得たID}};
```

Grafanaの`seedAssignmentPrimaryKeyMigrator`のコードを読むと、SQLiteの場合似たようなことをやっている。ちゃんとデータコピーしてるけど。


# 感想

これでとくに問題が起きないといいね。
パブリックサブネットによるインターネットへ直接接続できる Amazon WorkSpaces インスタンスの作成方法

Amazon WorkSpaces インスタンスから、インターネット接続をする方法は、主に2つあります。

1. プライベートサブネットから、NATインスタンスを経由してインターネットと通信
2. パブリックサブネットから、インターネットと直接通信
    a. パブリック IP アドレスを自動的に割り当て
    b. パブリック IP アドレスを手動で割り当て

ここでは一番手軽な 2-a「パブリックサブネットから、インターネットと直接通信 / パブリック IP アドレスを自動的に割り当て」について解説します。

## ポイントは以下3つ

1. Amazon VPC:
  プライベートサブネット2つ、パブリックサブネット2つを持つ VPC を作成する
2. AWS Directory Service:
  ディレクトリ自体には、プライベートサブネットを指定する
3. Amazon WorkSpace:
  ディレクトリをWorkSpaceへ登録するときには、パブリックサブネットを指定する

このディレクトリを使って作成した WorkSpaces インスタンスは、インターネットとの直接通信が可能になります。

## 手順

### Amazon VPC

- VPCを作成
    - 作成するリソース: VPCなど
    - 名前タグの自動生成: any-name-vpc1 (任意)
    - VPC エンドポイント: なし

結果的に、2 AZ に対して、プライベートサブネット 2 、パブリックサブネット 2 が作成されます。
=> 即時作成されます。

### AWS Directory Service

- ディレクトリタイプを選択
    - Simple AD
- ディレクトリ情報を入力
    - ディレクトリのDNS名: any-name-ad1.local (任意)
    - ディレクトリのNetBIOS名: ANY-NAME-AD1 (任意)
- VPCとサブネットを選択
    - VPC: any-name-vpc1 (先ほど作成したVPCを選択)
    - サブネット: (2つとも "プライベート" サブネットを選択)

=> 約10分で作成されます。

### Amazon WorkSpaces

- ディレクトリ
    - (先ほど作成したディレクトリ=any-name-ad1.local チェックを付けて) > アクション > 登録
    - サブネット: (2つとも "パブリック" サブネットを選択) ※ サブネットIDはVPC画面で確認するしかない
- WorkSpaces
    - ディレクトリを選択: any-name-ad1.local (先ほど登録したディレクトリを指定)

=> 約15分で作成されます。

初期ユーザーのパスワード設定は「Your Amazon WorkSpace」という件名のメールのリンクから行います。

## 他の方法

こちらをご覧ください。
- [AWS re:Post / WorkSpace からインターネットにアクセスするにはどうすればよいですか?](https://repost.aws/ja/knowledge-center/workspaces-turn-on-internet)

EoT
【悲報】WEB+DB PRESS休刊

# WEB+DB PRESS休刊

なんと、WEB+DB PRESSが休刊となるそうです・・・。
以下のコメントが記載されていました。

>WEB+DB PRESSは，2023年8月発売のVol.136をもって隔月刊誌としては休刊させていただきます。物価上昇による製作費の高騰など諸般の事情により，今回の決定に至った次第です。
>
>突然の休刊案内にてたいへん恐縮ではございますが，何卒ご理解を賜りますよう，お願い申し上げます。
>22年以上の長きにわたり，絶大なご支援をいただきましたことを，厚く御礼申し上げます。
>
>弊誌で扱っていた分野のコンテンツは，今後も弊社刊行のSoftware Designやgihyo.jp，書籍などで提>供させていただきます。また，必要な場合には「特別号」の編集・刊行なども検討してまいります。
>最後に，皆様の一層のご活躍を心より祈念しております。
>
>WEB+DB PRESS 編集長 稲尾尚徳

https://gihyo.jp/magazine/wdpress/suspended

WEB+DB PRESSは総集編をかなり良心的な値段で、しかもタイムリーに出版していたので、
総集編のみを買っていた人もいたのではないでしょうか。
自分は両方買っていました！

C Magagine、Java World、DBマガジン、ASCII.Technologiesなど、お世話になっていた雑誌が休刊になっていくのは切なくも悲しいです。
電子書籍やWebサイトだと、結局見ないことが多いので、個人的には紙の方がうれしいです。
（結構、積読状態だったりもしますが。。。）

Software Designはまだ続けるとのことなので、総集編だけではなく、月刊書も買いましょう！！

先端的なことをやりだしたのはここ2～3年で、SE歴15年目にして、ようやくWEB+DB PRESSとSoftware Designの良さを知りました。先端SEには必須です！
『refused to display '******/' in a frame because it set 'X-Frame-Options' to 'deny'.』の解決策


<h2>環境</h2>
<ul>
    <li>言語　kotlin (framework：spring)</li>
    <li>ブラウザ　GoogleChrome</li>
</ul>
<h2>事象</h2>
先日、モーダル画面の実装で動作確認をしていた際、以下の画面が表示された。
<img width="300px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1202056/5c5474ae-db26-11df-7352-ad6b32454ece.png">

F12でコンソールログを見ると表題のエラーが出力されていた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1202056/4e9dcb6b-c87f-f72f-a30a-c0ab47764c50.png)

<h2>調査結果</h2>
<h4>・X-Frame-Optionsとは</h4>

HTTP のレスポンスヘッダーで、ブラウザーがページを &lt;frame&gt;、&lt;iframe&gt;、&lt;embed&gt;、&lt;object&gt; の中に表示することを許可するかどうかを指定するために使用するもの。

自分の Web サイトを上記のタグで埋め込むことができるようにしていると、XSSやクリックジャッキング攻撃を受ける危険性がある。


X-Frame-Options には 2 つの有効なディレクティブがある。

```kotlin:有効ディレクティブ
// すべてのサイトからの埋め込みを拒否
X-Frame-Options: DENY 
// 同じオリジン（スキーム・ホスト・ポートの組み合わせ）のみ許可
X-Frame-Options: SAMEORIGIN
```
<h4>・事象原因</h4>

Spring Securityではデフォルトで上記の値が``DENY``となっている。
→これを許可にしてあげればOK！

<h2>解決策</h2>

X-Frame-Optionsを``SAMEORIGIN``に変更する。
```kotlin:SecurityConfig.kt
@Configuration
@EnableWebSecurity
class SecurityConfig() {

    @Bean
    fun fiilterChain(http: HttpSecurity): SecurityFilterChain {
        // 以下を追加
        http {
            headers {
                frameOptions {
                    sameOrigin = true
                }
            }
        }
    }
```
→ 再度ビルド後、正常に表示されました。

<h2>参考記事</h2>
<ul>
<li>
<a href="https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/X-Frame-Options">X-Frame-Optionsについて</a>
</li>
<li>
<a href="https://spring.pleiades.io/spring-security/reference/servlet/exploits/headers.html#servlet-headers-default">Security HTTP Response Headers</a>
</li>
<li><a href="https://qiita.com/opengl-8080/items/4e800eb6990653b0395c#x-frame-options">Spring Security 使い方メモ　レスポンスヘッダー</a></li>
</ul>
Github Copilot と Amazon Codewhisperer どっちが良いの？

## 初めに
`Github Copilot` や `Amazon Codewhisperer` 

自動でコード生成するAIとしてどちらを使った方がより快適な
コーディングライフが送れるのでしょうか？

簡単な`Task`の`CRUD`を作成する中で
どちらが良くて、どう使えば効率的にコーディングできるのかを探ってみます。

## 導入方法
AIの導入方法は以下の記事をご参照ください。
詳細が丁寧に説明されていました m(__)m

Github Copilot
[【GitHub Copilot】登録方法の解説と試してみた](https://chigusa-web.com/blog/github-copilot/)

Amazon Codewhisperer
[無料で始めるAmazon CodeWhisperer on VSCode（Github Copilotと同等の性能？）](https://qiita.com/masakinihirota/items/52d3fad3aea8300d391f)

## 試した環境
Ruby 3.1.0
Rails 7.0.4
Visual Studio Code 1.7.7

## 結論
**`Github Copilot` を使いましょう。**

これはあくまで
- **使用言語が Ruby**
- **フレームワークがRails**
- **コードの文脈が少ない**
- **erb, rb ファイルの記述**

というかなり限定的な条件ではありますが

`Github Copilot`の方が
- **速度が速い**
- **精度が高い**
- **あまり詳細なコメントを要求しない**

ように感じました。
他言語やコードの文脈が多いファイルの場合、どうなるかは試してみないと分かりません。



## 初期設定

アプリ作成
```
rails new rails-todo-github-copilot
```
作成したファイルに移動
```
cd new rails-todo-github-copilot
```

Taskモデルの作成
```
rails g model Task title:string description:string
```
データベースへの反映
```
rails db:migrate
```
コントローラーの作成
```
rails g controller Tasks
```

ルーティングの設定
```routes.rb
Rails.application.routes.draw do
  resources :tasks
end
```

## Github Copilot
`tasks_controller.rb`の内容を`Copilot`と一緒に書いてみる↓

![画面収録-2023-05-16-15.25.28_out.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2508607/0de50ff5-b87d-1cf7-3c2f-a03f8f518250.gif)


「こんな感じのコードが欲しいんだろ？」をバリバリ先読みして書いてくれるが、
コードの文脈がない状態では、予測変換の精度が微妙になる

というわけでどんどん書き進めてみる。


フォームの実装を書いてもらう↓

![画面収録-2023-05-14-12.05.52_out.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2508607/4c82d5cc-f208-6b18-719a-161c4cebdeb6.gif)



**★ 爆速ですね　Ｏ（≧∇≦）Ｏ　 ★**

実は`controller`を実装する前にも`view`の実装を試しましたが
`attributes`にない`name`が書かれていたりなど予測変換が微妙でした。

`controller`を実装した後で試すと、`controller`の内容にマッチした`form`になりました。
表示中のファイルだけではなく、他のファイルも参照しながら、予測変換してくれるようです。

`CRUD`を一通り実装した後では、書き進めるにつれて予測変換の精度が上がるようにも感じました。


### メモ
- **コメントを書いた方が予測変換の精度が上がる**
- **詳細情報を技術用語を使ってコメントに書く方がいい**
   例 「# task_paramsを使用して、タスクの編集を実装する」
- **テンプレ的な書き方が得意**
- **コードの文脈は多いほど精度が上がる**
- **求めている完璧な解答ではないが修正ベースで記述できる**ため、脳のリソースを節約できる


## Amazon Codewhisperer
こちらも初期設定通りにプロジェクトを作成します。
`tasks_controller.rb`の内容を`Codewhisperer`と一緒に書いてみる↓
![画面収録-2023-05-14-23.48.19_out.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2508607/91208139-7f88-5f69-5ebc-71cf71a40a03.gif)



変換速度が圧倒的に違うように感じます。
精度も微妙・・・🤔

一応View側も実装してみましょう。

フォームの実装を書いてもらう↓
![画面収録-2023-05-15-0.07.42_out.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2508607/3cefe870-a686-a9db-a167-fde862fd67ae.gif)


**NO 予測変換**

うーん、予測変換がなかなか機能しない
コメントも英語で記述したり、詳細な技術ワードを入れても劇的な改善は見られなかったです。
後で`CRUD`の機能を一通り実装してみたのですが、`Codewhisperer`の方は変換に苦労している印象を受けました。

### メモ
　ただ、`Codewhisperer`も`Copilot`と同様に
- コメントを書いた方が予測変換が働きやすい
- 詳細情報を技術用語を使ってコメントに書く方がいい
という点では共通でした。

ただ、`Copilot`よりも手直しの量が多く、
「実際に運用するのは難しいかもしれない」という不安な印象を受けました。


## 最後に
ここまで見ていただきありがとうございます。m(__)m

他言語や既存コードがたくさんある環境で使用する場合、どうなるかまではわかりませんが、
導入するなら`Github Copilot`が良いという感じです。


業務にも実験的に導入して、生産性がどれくらい上がるかの実験もしてみても良いかもしれません。
Ubuntuで1つのNICに複数の固定IPアドレスを設定する方法

# はじめに
Ubuntuにおいて、1つのNICに複数の固定IPアドレスを設定する方法について説明します。この方法を使用すると、1つのネットワークインターフェースカードを使用して、複数のネットワークセグメントに接続することができます。

# 前提条件
Ubuntu 20.04 LTSを使用していること
root権限またはsudo権限を持っていること

# 手順
ネットワークインターフェース設定ファイルにアクセスします。/etc/netplan/ディレクトリにある適切な設定ファイルを編集します。

:::note info
**おすすめ：バックアップの取得**
ネットワークインターフェース設定を元に戻せるように、/etc/netplan/ディレクトリにある設定ファイルのバックアップを取っておくことをお勧めします。
```shell_session
例：
cp /etc/netplan/00-network-manager-all.yaml /etc/netplan/00-network-manager-all.yaml.back
```
:::

設定ファイルに以下のようなコードブロックを追加します:

```yaml
network:
  version: 2
  renderer: networkd
  ethernets:
    enp1s0:   # 自分のNICの名前に置き換えてください
      addresses: [172.16.1.5/24, 172.16.2.5/24]
      gateway4: 172.16.1.1
      nameservers:
        addresses: [172.16.1.16, 172.16.1.32]
```
設定を保存し、Netplanを更新します:

```ruby
$ sudo netplan apply
```
設定が適用されたかどうかを確認します:
```ruby
$ ip addr
```
設定が正常に適用されている場合、2つの固定IPアドレスが表示されます。
```ruby
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 6c:62:6d:98:91:04 brd ff:ff:ff:ff:ff:ff
    inet 172.16.1.5/24 brd 172.16.1.255 scope global enp1s0
       valid_lft forever preferred_lft forever
    inet 172.16.2.5/24 brd 172.16.2.255 scope global enp1s0
       valid_lft forever preferred_lft forever
    inet6 fe80::6e0f:d022:ecb8:4d76/64 scope link noprefixroute
       valid_lft forever preferred_lft forever
```

:::note warn
**注意点**
- 複数のIPアドレスが同じネットワークセグメント内にある場合は、1つのデフォルトゲートウェイを指定することが一般的です。この例では、共通のゲートウェイ（172.16.1.1）を使用しています。
- ネームサーバのアドレスは環境に合わせて適切なものに置き換えてください。
:::

# まとめ
この記事では、Ubuntuで1つのNICに複数の固定IPアドレスを設定する方法を紹介しました。複数のIPアドレスを1つのNICに割り当てることで、ネットワーク上の異なるセグメントへの接続や仮想環境での柔軟なネットワーク設定が可能になります。是非試してみてください。
CloudFormationのリソース作成用ymlファイルのサンプル

## やりたいこと
1. CloudFormationでのスタック作成用のサンプルを用意し、実際にリソースを作成したい
2. 作成したEC2に、そのままターミナルからsshログインしたい

## 作成予定のリソース
- VPC
    - subnet
    - security group
- EC2
    - EC2インスタンス

## ap-norteast-1リージョンに存在するAMIの確認のためのaws-cliコマンド
AMI-IDの指定を間違いによるROLLBACKの発生が多かったため、記述

```sh
aws ec2 describe-images --owners amazon \
--filters "Name=virtualization-type,Values=hvm" \
"Name=architecture,Values=x86_64" \
"Name=name,Values=amzn2-ami-hvm-*" \
"Name=block-device-mapping.volume-type,Values=gp2" \
"Name=root-device-type,Values=ebs" \
"Name=ena-support,Values=true" \
--query "reverse(sort_by(Images, &CreationDate))[:1].ImageId" \
--output text --region ap-northeast-1
```

```sh
# 出力結果
ami-0828596b82405edd7
```

## AMIについて注意すべきこと
- ami-idは、CloudFormationでスタックを作成するリージョンに存在しているものを指定する必要がある（今回はap-northeast-1のリージョン）
- 下記をコピペで流用する際は`KeyName`の項目の中から、実際に存在するキー名に変更する（EC2の「キーペア」の項目の中から指定する）

## 実際に使用するyamlファイル
```yaml
AWSTemplateFormatVersion: '2010-09-09'
Resources:
  MyVPC:
    Type: 'AWS::EC2::VPC'
    Properties:
      CidrBlock: '10.0.0.0/16'
      EnableDnsSupport: true
      EnableDnsHostnames: true
      Tags:
        - Key: Name
          Value: 'vpcFromCf'
  MySubnet:
    Type: 'AWS::EC2::Subnet'
    Properties:
      VpcId: !Ref MyVPC
      CidrBlock: '10.0.1.0/24'
      AvailabilityZone: ap-northeast-1a
      Tags:
        - Key: Name
          Value: 'subnetFromCf'
  MyInternetGateway:
    Type: 'AWS::EC2::InternetGateway'
    Properties:
      Tags:
        - Key: Name
          Value: 'igwFromCf'
  MyVPCGatewayAttachment:
    Type: 'AWS::EC2::VPCGatewayAttachment'
    Properties:
      VpcId: !Ref MyVPC
      InternetGatewayId: !Ref MyInternetGateway
  MySecurityGroup:
    Type: 'AWS::EC2::SecurityGroup'
    Properties:
      GroupName: 'MySecurityGroup'
      GroupDescription: 'Allow inbound SSH traffic from anywhere'
      VpcId: !Ref MyVPC
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 22
          ToPort: 22
          CidrIp: 0.0.0.0/0
  MyEC2Instance2:
    Type: 'AWS::EC2::Instance'
    Properties:
      ImageId: ami-0828596b82405edd7
      InstanceType: t2.micro
      KeyName: ${keyName}
      NetworkInterfaces:
        - AssociatePublicIpAddress: true
          DeviceIndex: '0'
          SubnetId: !Ref MySubnet
          GroupSet:
            - !Ref MySecurityGroup
      Tags:
        - Key: Name
          Value: 'ec2FromCf'
  MyRouteTable:
    Type: 'AWS::EC2::RouteTable'
    Properties:
      VpcId: !Ref MyVPC
      Tags:
        - Key: Name
          Value: 'routeTableFromCf'
  MyRoute:
    Type: 'AWS::EC2::Route'
    DependsOn: MyInternetGateway
    Properties:
      RouteTableId: !Ref MyRouteTable
      DestinationCidrBlock: '0.0.0.0/0'
      GatewayId: !Ref MyInternetGateway
  MySubnetRouteTableAssociation:
    Type: 'AWS::EC2::SubnetRouteTableAssociation'
    Properties:
      SubnetId: !Ref MySubnet
      RouteTableId: !Ref MyRouteTable

```
※秘密鍵の名前の箇所だけ、置き換えてます。

これで、AWSリソースを作成することができます。
また、sshコマンドでEC2へのログインも確認済みです。

```sh
ssh -i ~/.ssh/aws-infra-ssh-key.pem ec2-user@${ec2PublicIpAddress}
```