OmniAICreator/Qiita-1.07M huggingface dataset:
PowerVSのPlatform metricsをIBM Cloud Monitoringで確認・監視する

IBM Cloudが提供するSaaS型の監視ソリューション IBM Cloud Monitoring には、OSにエージェントを導入してメトリックを収集する方式と、IBM Cloudの基盤から暗黙的に（ユーザーが明示的にエージェントを導入しなくても）メトリックを収集する方式の２通りがあります。
後者をプラットフォーム・メトリックスと呼びます。

Power Virtual Serverがプラットフォーム・メトリックスに対応しました。
https://cloud.ibm.com/docs/power-iaas?topic=power-iaas-monitor-sysdig
これにより、エージェントレスで、CPU・メモリ・I/Oの利用状況を取得・監視できます（OSレイヤーで確認する必要がある、ファイルシステム使用率やプロセス監視には対応していません）。2023年11月時点で、 WDC06, SYD05,  WDC04, DAL13で利用できます。

IBM Cloud Monitoringの管理画面でPlatform metricsを収集するインスタンスを各リージョンに1つ指定できます。
https://cloud.ibm.com/docs/monitoring?topic=monitoring-platform_metrics_enabling

[Cloud Monitoringの管理画面](https://cloud.ibm.com/observe/monitoring)で、Options > Edit platformを選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59627/851e89fa-7670-e2f0-d453-aa5020667055.png)

対象リージョンの中で、Platform metricsを収集するインタンスを指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59627/beb9ea19-4144-63aa-d594-850694008385.png)

指定したMonitoringインスタンスには、Platform metricsが有効になった旨のアイコンが付きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59627/33649797-91ef-56ef-ef63-25ff79594e6a.png)

Dashboards > IBM > IBM Power Systems Virtual Server Overview　で、PowerVSのダッシュボードが用意されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59627/9c9be5ca-ff5e-c6cd-d25a-1ad1d250ed36.png)

PowerVSのCPU・メモリ・I/Oの状況が可視化されています。このテンプレートを右上の"Copy to My Dashboards"ボタンでMy Dashboardにコピーすることで、閾値を設定して通知を受け取ることが可能となります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59627/ee54b96f-2b1f-ee46-8417-8af8a05ad14c.png)

以上
最近話題になっている「Self-RAG」について説明します

Self-RAGは最近非常に話題となっている最新RAG技術です。
日本語で調べるとなかなか相関記事がないので、今日はSelf-RAGの中身を共有したいと思います。
特徴としては、モデルがRAGする前に、RAGの必要性を判断してからRAGする/しないということです。
 
RAGをよく使うと気づくと思いますが、2つ大きな問題点があります。
一つはどんな質問に対しても強制的に検索することです。
極端的な例でいうと、例えば「こんにちは」とか非常にシンプルな内容をモデルに投げても、モデルが「こんにちは」をvectorstoreで検索していくつかの情報を持ってくるですね。
それらの情報を「こんにちは」と合わせてモデルに再inputすると、「こんにちは」すらもうまく回答できない時もあります。
 
もう一つはRAGで検索してきた情報はモデルのoutputに有益かどうかがわからないことです。
RAGで返した内容は、モデルのoutputに本当に有益なのか中身見れないので、実はoutputの生成に全然役に立たない、むしろoutputの質を悪くなってしまう可能性もあると思います。
 
Self-RAGは⇧の2つ問題点をある程度解決できてます。
コアになっているのは、RAGを評価するための小さなモデルＣ(Critic model)をトレニンーグしました。(chatgpt4を使って）
そのモデルをRAGとLLＭの間に内装します。
イメージとしは：Vectorstore-Critic model-LLMみたいな感じです。
まずCはすべてのdecoderに対して、検索マークを付けて、RAGが必要かどうかを判断します。
RAGが必要ではないと判断した場合は、RAGなしでモデルがそのまま回答をoutputします。
RAGが必要と判断した場合は、複数個のRAG結果を並行で探して、それぞれプロンプトと合わせてLLMに渡します。
それでLLMが複数個の回答をoutputしますので、その中から一番良いRAG結果を決めて、最終的なoutputはこれにします。

![11-14-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3556459/94d8dbb3-70c2-4cc6-8a5c-3045f6753470.png)

 
Self-RAGを提出した方はSelfRAGでトレニンーグしたllama2もhuggingfaceに公開しています。
私も試して見たですが、処理時間が少し長くなったですが、RAGの精度が高くなったことは実感できます。

SelfRAG-llama-7bにつて:

https://huggingface.co/selfrag/selfrag_llama2_7b

github:

https://github.com/AkariAsai/self-rag

論文:

https://arxiv.org/abs/2310.11511
あなたの iPhone には過小評価されている通話機能がありますが、きっとあなたは使っていないはずです

iPhoneの通話を保留する方法を知っていますか? まあ、このトリックを学ぶ前は私もそうでした。結局のところ、もう 80 年代ではないので、通話保留はビジネス コール ハンドリング センターで働く人だけが実際に行うものだと思っていました。
しかし、偶然にも、誰かを保留にする機能は依然として iPhone でよく使われており、間違いなくまだその用途があります。確かに、発信者の通話を止めるなど、その一部はミュート ボタンによって横取りされています。しかし、たとえば、休暇を予約したり計画を立てたりしながら、友人間で通話をやりくりしている場合、一方の通話を保留にして、もう一方の通話をチャットできると非常に便利です。
それで、どうやってやるのですか？これを学ぶ前、私は、別の電話に出ているときに電話がかかってきたとき、要求されたときに相手を保留にすることに慣れていました。しかし、私自身、他の電話がかからずに相手を積極的に保留にする方法がわかりませんでした。幸いなことに、それは非常に簡単なことであり、このガイドはそれを示すためにここにあります。
iPhoneの通話を保留する方法
全員が同じ認識を持っていることを確認するために、iOS が最新であることを確認してください。不明な場合は、iPhone のアップデート方法に関するガイドを参照してください。
1. 電話アプリを開いて誰かに電話します
電話アプリを開き、「連絡先」をタップして連絡先を選択するか、番号をダイヤルします。
2. ミュートボタンを長押しします
通話中にミュート ボタンを押し続けると、相手が保留になります。
3. 新しい発信者を追加する
通話は保留中です。相手の名前または番号の下に「保留」というテキストが表示されます。他の人を通話に追加するには、通話の追加ボタンをタップし、連絡先を選択するか、通話に追加する番号をダイヤルします。最初の通話を保留にして別の通話を開始するには、連絡先をタップし、連絡先を選択するか、番号をダイヤルします。
4. 発信者間の交換
別の通話を開始した場合は、上部のバーの最初の通話の下に 2 番目の通話が表示されます。通話を切り替えるには、交換ボタンをタップします。
これで、iPhone で相手を保留にする方法がわかりました。80 年代の青春映画にいるような気分になれる過去からの爆発で、非常に便利です。
ただし、通話が保留になっている間に、iPhone を最大限に活用するための簡単なガイドをチェックしてみてはいかがでしょうか。アプリの評価ポップアップが非常に煩わしいと感じる場合は、iPhone でアプリの評価ポップアップを無効にする方法をご覧ください。あなたまたはあなたの家族の中に光過敏性てんかんを患っている人はいますか? iPhone の点滅するライトを暗くする方法をご覧ください。iPhone カメラの簡単なハックをいくつか学びたいですか? まず、 iPhone で光学ビューファインダーを再現する「フレームの外側の表示」を有効にする方法と、より自然な感じの画像を提供するiPhone のレンズ補正を有効にする方法を学びます。

00
Pythonで「指定した文字列が対象の文字列に何個含まれるのかを取得する(count)」の動作を確認してみた

# 概要

Pythonで「指定した文字列が対象の文字列に何個含まれるのかを取得する(count)」の動作を確認してみました。以下のページを参考にしました。

https://www.javadrive.jp/python/string/index17.html

# 実装

以下のファイルを作成しました。
```sample.py
print("dictionary".count("io"))
print("Good School".count("oo"))
print("Goooood".count("oo"))
print("Orange".count("aa"))
print("")
print("Good School".count("oo"))
print("Good School".count("oo", 3, 10))
print("Good School".count("oo", 3))
```

以下のコマンドを実行しました。
```
$ python3 sample.py 
1
2
2
0

2
1
1
```

# まとめ

何かの役に立てばと。
初投稿

# 初投稿です

初めまして。
都内でフロントエンドエンジニアとして活動している者です。

主にNuxtjs Vuejsを使用して開発することが多いです。
技術的にまだまだひよっこなので
アウトプットの為にはじめました。

自分のメモ用になると思います。
よろしくお願いいたします。
Generative AIでどの程度生産性が向上したのか

# 記事の内容
Platform EngineeringのコミュニティでBackstageConというイベントで話されていたことを書きましたという記事があったので気になるところを一部まとめています。
登壇者はVMWareの[Ben Wilcock](https://www.linkedin.com/in/benwilcock/)という方です。

BackstageConは2023/11/06に行われたイベントで、リンクの記事は2023/11/10に書かれたものです。

https://thenewstack.io/how-to-boost-developer-productivity-with-generative-ai/

# AIによる生産性向上の測定結果
## コンサルタント向け
研究へのリンク: [Navigating the Jagged Technological Frontier: Field Experimental Evidence of the Effects of AI on Knowledge Worker Productivity and Quality](https://www.hbs.edu/faculty/Pages/item.aspx?num=64700)

- より優秀な人は17%, ローパフォーマーは43%のパフォーマンスの改善が見られた
    - 経験の浅い人ほど大きな恩恵を得られている
- データ分析などのAIが得意とする分野では、生産性・品質・速度の大きな向上がみられた
- AIを使用した場合、12%多くタスクを25%早く完了させた
- AIに向かないタスクではAI利用者は正しいソリューションを生み出す可能性が 19 ポイント低かった

## 開発者向け
マッキンゼーによる調査: [A McKinsey study shows that software developers can complete coding tasks up to twice as fast with generative AI. Four actions can maximize productivity and minimize risks.](https://www.mckinsey.com/capabilities/mckinsey-digital/our-insights/unleashing-developer-productivity-with-generative-ai)

以下はリンク先にある画像です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722539/e7362e74-d9ea-4311-6045-ed7afe5837c3.png)

調査の要約としては、
- ドキュメンテーションとコードの作成はほぼ半分の時間で完了
- リファクタリングは3分の2程の時間で完了
- タスクの複雑性と開発者の経験に応じて異なり、複雑性の高いタスクは10%未満へ減少した
    - 場合によってはGenAIを使用すると7～10%の増加が見られた
- 速度向上のために品質が犠牲になることはなかった

といった感じです。


## GenAIが導く場所
次に4領域で生産性が大幅に向上する
- 手作業や繰り返しの作業
- 新しいコードのドラフトをすぐに開始できる
- 既存コードの更新
- 新しい課題へ取り組む開発者の能力の向上
    - 複雑なタスクにおいて、指定された時間枠内で完了する可能性が 25～30% 高くなった

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722539/c9df4f8e-6683-d563-41a5-9aa100bebf13.png)


AIベースの生成ツールを使用している開発者は、全体的な幸福感、充実感、フロー状態であることを報告する可能性が 2 倍以上であった。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722539/cecee9bd-832e-19e9-9115-d345fa02a0fe.png)

### 開発者の専門知識が必要なタスク
人間の監視と関与が必要な３つの領域
- コードにバグやエラーがないかを判断する
- 組織(業務)のコンテキスト
    - 既製のGenAIはプロジェクトや組織のニーズを知らないため、コードやデータがニーズを満たしているか
- 難しいコーディング要件

### リーダーは何ができるのか
以下の４つの優先事項から始めることが推奨されています。
- スキル開発
- 高度なユースケースの追求
- スキルシフトの計画
- リスクマネジメント
ジョブカンっていろんな言語つかってるねん

ジョブカン採用管理の開発エンジニアをしている@yottaburgerです。
今日からゆるっとアドカレやっていきます。

1日目ということで今回は我々が開発している**ジョブカン**についてざっとご紹介したいと思います。

## ジョブカンシリーズは8プロダクト+α
[こちらのページ](https://jobcan.zendesk.com/hc/ja/articles/115000182521-%E3%82%B8%E3%83%A7%E3%83%96%E3%82%AB%E3%83%B3%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA%E3%81%AE%E3%81%94%E7%B4%B9%E4%BB%8B)にまとまっていますが、**バックエンド系ホリゾンタルSaaS**とか**クラウドERP**とか言われるWEBサービス群です。
運営元は株式会社DONUTSというところです。

【ジョブカンシリーズのイメージ】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1052904/e1c962ce-5b67-7ca5-ce42-5a51db88ff03.png)

画像の個々のブロックがそれぞれ独立したWEBサービス的なプロダクトになっています。
2010年にジョブカン勤怠管理がリリースされて以降、ワークフロー、採用管理、給与計算などなど現在時点で8つのプロダクトを提供しています。
またこのほかに共通認証基盤やモバイル、AIなどの横断チームがあります。

各プロダクトには専任の開発チームがあり、それぞれ数名～数十名のエンジニアが所属しています。開発チーム内にはモバイル分野やUIUXなどに特化した人もいますが、**サーバーサイドエンジニア 兼 フロントエンジニア**という感じでフルスタック的な動きをしているエンジニアの比率が高いです。

## 各チームで ~~勝手に~~ 現場が裁量を持ってアーキテクチャや言語を選んでいる
私がDONUTSに入って驚いたのが
・各開発チームでそれぞれ違う言語を使って特にトラブルなく日々の業務が進んでいること
・新しい言語の導入を当然のように検討していること
でした。

正直言って統一したほうが（管理者サイドとしては）ラクそうですが、今はジョブカンならではのユニークな特徴と感じています。

### 言語
【各プロダクトの技術構成概要（人事チームから拝借）】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1052904/a0c9da79-c346-544b-1c7c-65607d40dc25.png)

私が入社してから約3年経ちますが、その間に勤怠管理と労務HR（画像の左端2つ）でGolangが新たに導入されました。勤怠管理では古いPHPからの乗り換えで、労務HRでは新規のサブサービスで使用しています。

:::note info
ジョブカン採用管理も現状Rubyメインですが、一部を新言語で記載する作戦が始動中です
（詳細はいずれ別の記事で）
:::

ちなみにジョブカンの開発者募集の求人票とかには
> 使用言語：Ruby, Python, Go, PHP

みたいに書かれてますが、もちろん1人が同時に全部を使うわけではないのでご安心ください（笑）
私の場合、日常的に触るのはRuby(rails), React, TypeScript, SQLあたりです。
※本記事では割愛しますがフロントの環境も多様です

### プラットフォーム・アーキテクチャ
（私が各プロダクトの詳細を把握できてないのでふんわりとだけ。。）

先の画像を見ていただくとわかりますが、クラウドプラットフォームもAmazon Web Service(AWS)とGoogle Cloud Platform(GCP)を各チームで独自に使用しています。
さらに掘り下げると、採用管理ではKubernetes(GKE)やTerraformを独自に導入していたりします。

アーキテクチャ面では各プロダクトが順次5周年、10周年を迎えていっている中で「肥大化したモノリス」という課題は共通して出てきています。
去年はジョブカンのエンジニアが幅広く参加する輪読会で↓↓を読んだりもしました。

https://www.oreilly.co.jp//books/9784873119311/

各サービスで似た課題はありますが、個々の事情もありアーキテクチャのアプローチもやっぱりそれぞれ ~~勝手に~~ 独自路線でやっています。いわゆる式年遷宮的にアーキを分割＋順次リニューアルしているチームもありますし、採用管理では「マイクロサービス化したいねー」という話をしてたりします。

## ちなみにDONUTS社全体だともっと違う
ジョブカンを開発・運営するDONUTSでは他にもスマートフォン向けゲームやライブ配信＆動画アプリなど幅広いプロダクトを展開しています。
ジョブカンの開発チームで使用していない言語だと、ゲーム事業の一部タイトルでC++やC#を、クラウド型電子カルテの[CLIUS(クリアス)](https://clius.jp/)というプロダクトではScalaを使っています。

---
ということで今後のアドカレで各執筆者がバラバラな技術を紹介してくるかもしれませんがジョブカンの多様性ゆえですので、どんなネタが出てくるのか楽しんでいただけたら嬉しいです。

（…と、導入してみましたが、11月末時点で趣味開発のネタを準備している参加者が多そうなのでちょい冷や汗が出ています）


## お知らせ
DONUTSでは新卒中途問わず積極的に採用活動を行っています。
詳細はこちらをご確認ください。

https://www.donuts.ne.jp/recruit/

ジョブカン事業部のエンジニア募集はこちら。

https://recruit.jobcan.jp/donuts/show/B001/1396297
AWS Lambda Layerを利用しようとしてハマった話


## はじめに
AWS Lambdaにてサードパーティ製のライブラリを使いたいと思って調べたところ
Lambda Layerを使うとLambda関数間でライブラリを共有できるとのこと
じゃあ実際に使ってみようとしてハマった話です。

## 結論
Lambda Layerへアップロードするローカルのフォルダ名は「python」にする

Lambda関数はLayerを読み込む実行パスとして「opt/python/Layer」となるらしく
圧縮前のディレクトリ名は「python」としておく必要があった。

## 手順
今回利用したかったのは「line-bot-sdk」なので、これを例にしていきます。

### ライブラリのインストール(ローカルへ)
```bash
pip install line-bot-sdk -t python/
```
pythonディレクトリは別途作成してください。

### zipファイルに圧縮
```bash
zip -r layer.zip python
```

### Lambda Layerへアップロード

```bash
aws lambda publish-layer-version --layer-name your-layer-name --zip-file fileb://layer.zip --compatible-runtimes python3.11 --region us-east-1
```
「your-layer-name」は自分のレイヤー名を指定してください。
リージョンもLambda関数のあるリージョンへと変更してください。
ランタイムはLambda関数のランタイムと合わせるようにしてください。

※AWS Console上からzipファイルをアップロードでも問題ないと思います。

### Lambda関数へLayerを追加する
AWS ConsoleよりLayerを追加したいLambda関数を選択して、追加する。

これで、Lambda関数にて、Layerへ含めたサードパーティ製のライブラリがimportできると思います。

## おわりに
かなり初歩的ですが、同じように詰まることがあるの方もいるのではないかと思い、
記事にしました。(私はこれに気付かず2時間ほど時間取られました・・)

間違い等ありましたら、コメントにてご指摘いただければ幸いです。
ドメインはこちらで合っていますか？

# はじめに
今年のカレンダーはとある会社のとあるチームで活動した1年間を振り返っていきます

## 登場人物

### 山田さん：
他チームからヘルプに来てくれた真面目で素直な新メンバー。音声繋いでペアプロしているが声質や話し方が某アイドルグループの某メンバーにそっくり(な気がする)。

### アーキテクチャ先生：
AWSが好きな新上司。Docker on Lambdaを利用したサーバーレスアプリケーションのアーキテクチャなどが得意。いつも忙しい。

# ドメインはこちらで合っていますか？
今回はA社向けのデモ環境構築時のお話です。
ドメインやシステム設定内容などを事前にヒアリングする必要があるのですが、その際にコミュニケーションの齟齬が発生してしまいました。ドメインは以下の形をテンプレートとしていました。
- 製品名-○○.hoge.jp

私「環境構築できました！」

アーキテクチャ先生「ご対応ありがとうございます！近いうち振り返りのMTGをしたいですね」

山田さん「今後のタスクの件も相談しておきたいです。この日時でいかがでしょうか？」

～振り返りMTGにて～

アーキテクチャ先生「あれ、このドメインで渡したんですか？」

私「(…？)はい」

アーキテクチャ先生「今回はデモ環境なので問題ないですが、気にされるお客様もいるので次からは気を付けてほしいです」

山田さん「すみません、ヒアリング内容のテンプレート通りに設定してしまいました」

アーキテクチャ先生「私も確認できてなくて申し訳ないです」

この一件でお客様向けのドメイン名は確認を怠らないようになりました。
どこで齟齬が起きたのか後からメッセージ履歴を遡ってみると、こちら側の見落としでした。
そして同時に気がかりだったことも解決しました。
この件の前に上司がドメイン名を2度確認しているところを見ていました。

---

Aさん「ドメイン名はこちらになります！(リプで他の方のメッセージを引用)」

上司「ドメインは○○-□□.hoge.jpで合っていますか？」

Aさん「はい！」

当時はなぜ2度も確認したんだろうと思っていましたが理由が分かりました。

# おわりに
テンプレートを過信せず、気にしないといけないことは確認をとろうと思います。
【Bingで解説】「container」って何？

以下のコードの「container」とは何でしょうか？小学生でも理解できるくらい丁寧に解説して頂けますか？

```kotlin
override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    )
```

https://e-words.jp/w/%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A.html。

例えば、貨物輸送に使われる金属製の箱もコンテナと呼ばれますが、これは物を入れて運ぶという入れ物の役割をしていますね

あなたが示したコードは、Androidアプリの開発に使われるKotlinというプログラミング言語で書かれています。

このコードは、onCreateViewという関数を定義しています。

関数とは、ある処理をまとめたもので、名前をつけて何度も呼び出すことができます。

この関数は、アプリの画面に表示する部品（ビュー）を作るときに呼び出されます。

この関数には、inflater, container, savedInstanceStateという3つの引数があります。

引数とは、関数に渡す値のことで、関数の処理に影響します。

このうち、containerという引数は、ビューを入れる入れ物の役割をしています。つまり、containerはビューの親となるビューグループのことです。

ビューグループとは、他のビューを含むことができるビューのことで、例えばレイアウトやスクロールビューなどがあります。containerの値によって、作成するビューの大きさや位置などが決まります。

例えば、containerが縦に並べるレイアウトだったら、作成するビューも縦に並べられます。また、containerがnullだったら、作成するビューは親がないので、自分で大きさや位置を指定しなければなりません。

小学生でも理解できるように説明しましたが、いかがでしたか？

コンテナは、ITの分野では入れ物のような働きをするものや仕組みのことを指す言葉です。

あなたが示したコードのcontainerは、ビューを入れる入れ物のことで、ビューの親となるビューグループです。
React propsの基本

## はじめに
propsの基本の備忘録です💁
初心者です😅
間違えてる部分多々あると思います。
もし見つけた場合、ツッコミいただけると助かります🙇


## 内容

### propsをなぜ使うのか？
作成したコンポーネントを型として使うために、値を親コンポーネント（App.js）で入力して値をその時のものに変更して使得るようにすることために使う。

### 子コンポーネントで変数名を入力
```jsx:sample.js
const Contact = (props) => {
    return {
        <div>
            <h2>(props.title)</h2>
            <p>(props.content)</p>
        </div>
    };
};

export default Contact
```
:::note warn
注意点
* propsが省略できる
const Contact = (**props**) => {
この部分が
const Contact = () => {
このように省略できる。
:::

```jsx:sample.js
import Contact from './components/Contact';

function App() {
  return (
    <div>
        <Top
            title={'このコンテンツのh2に入れるもの'}
            content={'pタグ内容'}
        />
    </div>
  );
}

export default App;
```

:::note info
押さえておくべき点🧠
* 基本的にはpropsを使って型としてを意識して記載する
* 関数定義するときはprops部分は省略できる。
:::
【備忘録】PowerShell7 ネットワークドライブ追加方法

# powershellでのネットワークドライブのマウント
powershellを使い始めたが、ネットワークドライブが見えなかったため、マウントすることとした。
以下のコマンドでマウントできることがわかった。
```powershell
New-PSDrive -Name "J" -PSProvider FileSystem -Root "\\server\dir" -Persist
```
`-Persist`は保持するためのオプション
【データベース勉強中】PostgreSQLとMySQLについて


MySQLとPostgreSQLは同じオープンソースのRDBMS（リレーショナルデータベース管理システム）だけど

# そもそもRDBMSとは
RDBMS（リレーショナルデータベース管理システム）は、データベースを操作するためのシステム。
データベースのファイル構造の定義やデータの検索、更新、共有したり、データへのアクセス権限を管理したりできる。
下記の投稿でも記載したように様々な種類のRDBMSがある。

https://qiita.com/takegons/items/c3f1a855d61516946a65

MySQLもPostgreSQLもどちらもオープンソースソフトウェアなので無料で利用できる。

# MySQLは
もともと1995年に発売された後に2010年からOracle社が所有権を持ち開発やソースコード管理が行われている。
高性能かつ高い堅牢性ながら低コストで利用できるので個人から大企業まで利用されている。

**MySQLには、大きく分けて無料版と商用版の2つがある。**

無料版は、実験的な要素が組み込まれることもあり、商用版に比べ安定性が落ちることもある。
また、Oracle社によるサポートが受けられないので、わからないことは自分で情報を探す必要がある。

商用版は、ライセンスを購入する必要があるが、安定した環境が提供されていて、Oracle社によるサポート窓口などがある。
商用版には３つのパッケージがありそれぞれプロジェクトに適したものを選ぶ。
- MySQL Standard Edition
- MySQL Enterprise Edition
- MySQL Cluster Carrier Grade Edition

（パッケージの調査はいつか）

# PostgreSQLは
1986年にカリフォルニアで開発されたPOSTGRESパッケージをベースに30年近くにわたり開発が続けられてきた。
現在でもPostgreSQLは開発者やサポート企業やボランティアからなる開発コミュニティが保守・開発を続けている。
MySQLよりも複雑・大量なデータの操作や管理を得意とする。

# 人気度
DB-ENGINESの人気DBMSランキングでは23年現在、
2位:MySQL（1115.24）・4位:PostgreSQL(636.86)となっていて
数年前はスコアに2倍以上の差があったけど現在では徐々にPostgreSQLの人気が高くなってきてその差は縮まってきているみたい。
![スクリーンショット 2023-11-14 14.50.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3587166/fc552199-2ffb-f69a-6204-b12c149a036a.png)

# 何が違うのか？

- サポートしているSQL構文が違う
    - MySQLでは使えないサブクエリがある。
    - PostgreSQLはほぼ使える。
- 使用できるプログラミング言語の数が違う
    - PostgreSQLのほうが多い。
- 処理方法（スピード）が違う
    - MySQLはデータの読み込みに特化した場合かなり早いらしい。
    - PostgreSQLは複雑なクエリでの膨大な量の読み書きでも優秀らしい。
- アーキテクチャが違う
    - MySQLは純粋なリレーショナルデータベース
    - PostgreSQLはオブジェクトリレーショナルデータベース
- サポート体制
    - PostgreSQLは有志によるコミュニティのみ
    - MySQLはコミュニティ＋Oracle社による有償サポートがある

などなど。
現状、高速で簡単に管理・設定できて初心者でも安心して利用できることを求めるならMySQLがいいかも。
大量のデータを扱うプロジェクトで機能としても充実していることを求めるならPostgreSQLがいいかも。

# まとめ
MySQLとPostgreSQLは機能的にも差がどんどんなくなってきてるらしい。
どちらのほうが自分で使いやすいかを確認するためにも、実際にどちらのDBMSも試してみたいと思う。
deviseでremember me機能を使わない場合はrememberableモジュールを削除すること

deviseを使い認証機能を作る際、remember me機能が必要ない場合、deviseメソッドの引数に、`:rememberable`を付けない必要があります。

```rb
class User < ApplicationRecord
  # こちらの引数から:rememberableを削除する事
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :validatable
end
```

deviseメソッドの実装はこうなっています。

```rb
    def devise(*modules)
      options = modules.extract_options!.dup
      # ~~略~~
```

rememberableモジュールの中身はこのようになっています。
```rb
    module Rememberable
      extend ActiveSupport::Concern

      attr_accessor :remember_me 
      # ~~略~~
```

https://github.com/heartcombo/devise/blob/main/lib/devise/models/rememberable.rb

今後さらに調べようと思いますが、railsアプリを初期化する際に、deviseライブラリを読み込んで、`:rememberable`モジュールが有効化されている(モデルに記載されている)場合、ログイン＆ログアウトの認証の際に、読みに行く設定になっているのだと思います。

なので、利用しない際は、`:rememberable`を削除する必要があるのだと思います。

## 追記

単純にdeviseは着脱可能な様々な認証機能を提供しているので、remember me機能を使わないんだったら、usersテーブルを作成する際に`remember_created_at`のカラムを作らず、`:rememberable`モジュールを読み込まなければ良い、というだけの話だったかも知れません


```rb
class DeviseCreateUsers < ActiveRecord::Migration[7.0]
  def change
    create_table :users do |t|
      ## Rememberable
      # t.datetime :remember_created_at # 利用しないなら、ここをコメントアウトしてカラムをつくらず、モジュールも読み込まなければ良いだけ
```

## 今後生かしたいこと

ライブラリの実装を見に行く前に、READMEでdeviseについて説明している箇所を読んで概要を掴んだ方が早そうですね。

deviseのREADMEにもこのように書かれています。
https://github.com/heartcombo/devise
```
本当に必要なものだけを使用するというモジュール性の概念に基づいています。
```

必要なものを使ってね、と書かれています。

Rememberableモジュールの説明では、以下のようにincludeした際に利用できるメソッドが書かれています。
https://www.rubydoc.info/github/heartcombo/devise/main/Devise/Models/Rememberable

Rememberableモジュールを利用するには、`remember_created_at`カラムが必要、というだけの話なのかな、、

クラスメソッドとして定義されているこのメソッド名に`required_fields`というメソッドがあり、名前と中身を勘案すると`remember_created_at`が必要だよ、と読み解ける感じがするので、そういう理解でいいのかな、、

```rb
      def self.required_fields(klass)
        [:remember_created_at]
      end
```
deviseの内部を解明して読み解くのは難しいですね。
Aimless.js

![Aimless.js](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3620161/84ed16ee-53bd-9538-a2e7-6b8880907421.png)


# ■ Aimless.jsとは？

**Aimless.js**は、ランダム性を管理することのできるJavaScriptライブラリです。

# ■ Aimless.jsを使用する理由

JavaScriptでランダム性を管理するには、ネイティブ関数の**Math.random**を利用できます。これは次のように使用されます:

```javascript
const r = Math.random(); 
```

では、**Aimless.js**は使用するメリットはどこにあるのでしょうか？ :thinking: 
**Math.random**関数は、0から1までの浮動小数点数を返すだけなので、ランダム性を管理するためには、自身でコードをより複雑に書く必要があります。
いくつかの例を挙げて説明してみましょう。


### 例１：

ランダムなブール値を作成したい場合、次のようにコードを書く必要があります：

```javascript
const r = Math.floor(Math.random() * 2);
const v = (r === 1) ? true : false;
console.log(v); // true または false
```

### 例２： 

配列[1, 2, 3]からランダムに値を取得したい場合、次のようにコードを書く必要があります：

```javascript
const a = [1, 2, 3];
const r = Math.floor(Math.random() * a.length);
const v = a[r];
console.log(v); // 1、2、または3
```

### 例３：

値に重みを付けながらランダム性を管理したい場合、コードはさらに複雑になります。例えば、配列[1, 2, 3, 4, 5, 6]があり、1、2、3、4、5はそれぞれ重み1で、6は重み10です。重みを考慮に入れたランダムな数値を取得するには、次のようにコードを書く必要があります：

```javascript
const a = [1, 2, 3, 4, 5, 6];

// 重み
const weights = [1, 1, 1, 1, 1, 10];

// 重みの合計を計算
const totalWeight = weights.reduce((acc, weight) => acc + weight, 0);

// 0から重みの合計までのランダムな値を生成
const randomValue = Math.random() * totalWeight;

// 重みを考慮して要素を選択
let cumulativeWeight = 0;
let v;

for (let i = 0; i < a.length; i++) {
  cumulativeWeight += weights[i];
  if (randomValue <= cumulativeWeight) {
    v = a[i];
    break;
  }
}

// 重みを考慮したランダムな値を表示
// 他の値よりも6がはるかに頻繁に表示されます
console.log(v);
```

# ■ Aimless.jsの使用方法

**Aimless.js**を使用するには、次のように依存関係をインストールするだけです：

```bash
npm install aimless.js
```

次に、プロジェクトで必要な関数をインポートする必要があります。たとえば：

```javascript
const { bool } = require('aimless.js');
```

前述の例にいくつかの修正を加えましょう：

### 例１（修正）：

ランダムなブール値を作成したい場合、次のようにコードを書きます：

```javascript
const { bool } = require('aimless.js');

const v = bool();
console.log(v);
```

### 例２（修正）：

配列[1, 2, 3]からランダムに値を取得したい場合、次のようにコードを書きます：

```javascript
const { oneOf } = require('aimless.js');

const a = [1, 2, 3];
const v = oneOf(a);
console.log(v);
```

### 例３（修正）：

配列[1, 2, 3, 4, 5, 6]があり、1、2、3、4、5はそれぞれ重み1で、6は重み10です。

重みを考慮に入れたランダムな数値を取得するには、次のようにコードを書きます：


```javascript
const { weighted } = require('aimless.js');

const a = [1, 2, 3, 4, 5, 6];
const weights = [1, 1, 1, 1, 1, 10];
const v = weighted(a, weights);
console.log(v);
```

## ■ 動画

Youtubeで動画を作成しました。

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

## ■ 参考

- [公式サイト](https://chriscavs.github.io/aimless-demo/)
- [Github](https://github.com/ChrisCavs/aimless.js)
【Python】散乱しているAccessのDB情報を取得する（前編）

# 背景
* 各部署に多くのAccessファイル(データベース)が散乱している
* 参照したい項目がどこにあるか一目で分からず、手当たり次第Accessファイルを開くしかない


# 目標
* Pythonを学習する
* Access(データベース名)、テーブル名、項目名を取得する
* 結果をデータベース化する　※今後予定


# 参考資料
下記資料を参考にさせていただきました。ありがとうございました。

* Accessへの接続 / テーブル情報取得　について

https://qiita.com/keisukesato-ac/items/e808fea4ec88821e8d2f

* descriptionプロパティの使用　について

https://lightgauge.net/language/python/9141/


# 手順
使用するライブラリをインストールしておく。

```:コマンドプロンプト
$ pip install pyodbc
```
>pyodbc
Pythonから任意のDBにODBC接続するためのライブラリ
今回は、AccessDBへの接続に使用

下記のPythonコードを実行する。

```python:Python
# モジュールをインポート
import pyodbc

# DBのファイルパス指定
db_paths = []
db_paths.append(r'C:\AAA\database1.accdb')
db_paths.append(r'C:\BBB\database2.accdb')

for db_path in db_paths:
    # データベース接続
    con_str = (
        'DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};'
        f'DBQ={db_path};'
    )
    conn = pyodbc.connect(con_str)
    cursor = conn.cursor()

    #ファイルパス名を分割
    split_path = db_path.rsplit('\\',1)
    print(split_path[0]) #DBパス出力
    print(split_path[1]) #DB名出力

    # データベース内のテーブル取得
    for table_info in cursor.tables(tableType='TABLE'):
        print(f'\t{table_info.table_name}') #テーブル名出力

        # テーブル内のカラム名（＋データ１行のみ）取得
        result = conn.execute(f'SELECT TOP 1 * FROM [{table_info.table_name}]')

        # 全カラムのメタデータ群取得
        columns_metadatas = result.description

        # １カラムずつ参照
        for column_metadatas in columns_metadatas:
            print(f'\t\t{column_metadatas[0]}') #メタデータ群のうち、カラム名(0)出力

    # データベースを閉じる
    cursor.close()
    conn.close()
```


# 実行結果
下記のような実行結果が出力される。tab(\t)で見やすくしている。
どのDBにどのテーブル、項目が含まれているかが分かる。

```
C:\AAA
database1.accdb
    テーブル名A
        カラム名a
        カラム名b
C:\BBB
database2.accdb
    テーブル名B
        カラム名c
        カラム名d
```


# コード解説（一部抜粋）
```python
    #ファイルパス名を分割
    split_path = db_path.rsplit('\\',1)
    print(split_path[0]) #DBパス出力
    print(split_path[1]) #DB名出力
```

ファイルパス名(例：C:\AAA\database1.accdb)を、rsplit()で分割した。
Windowsだと'\\\\'(バックスラッシュ２つ)でないとエラーになる。

```python
        # テーブル内のカラム名（＋データ１行のみ）取得
        result = conn.execute(f'SELECT TOP 1 * FROM [{table_info.table_name}]')
```

最終的にカラム名のみが取得できればよいので、データは「TOP 1」で１行のみに限定した。
SELECT文の[ ]は、Accessテーブル名によるエラーを回避するため。

```python
        # 全カラムのメタデータ群取得
        columns_metadatas = result.description

        # １カラムずつ参照
        for column_metadatas in columns_metadatas:
            print(f'\t\t{column_metadatas[0]}') #メタデータ群のうち、カラム名(0)出力
```

カラム名の取得には、descriptionプロパティを使用した。

descriptionプロパティの説明文は下記の通り。
カラムについてのメタデータが格納されている。
例えば「型」の情報を取得する場合は、[1]を指定する。

>The metadata for the columns returned in the last SQL SELECT statement, in the form of a list of tuples. Each tuple contains seven fields:
>
>0.name of the column (or column alias)
>1.type code, the Python-equivalent class of the column, e.g. str for VARCHAR
>2.display size (pyodbc does not set this value)
>3.internal size (in bytes)
>4.precision
>5.scale
>6.nullable (True/False)
ToDo作成とテスト駆動

# はじめに
今年のカレンダーはとある会社のとあるチームで活動した1年間を振り返っていきます

## 登場人物

### Jさん：
昨年で転職。在籍時は社内に新しい風を巻き起こし、その影響度は今でも意志を受け継ぐ者がいるほど。

### 山田さん：
他チームからヘルプに来てくれた真面目で素直な新メンバー。音声繋いでペアプロしているが声質や話し方が某アイドルグループの某メンバーにそっくり(な気がする)。

# ToDo作成とテスト駆動
三ヶ月前ぶりのペアプロでしたが、テスト駆動で開発をすることにしました。

私「テスト駆動で開発したことありますか？」

山田さん「いや～ないですね」

私「そしたらぜひテスト駆動で開発しましょう。おすすめの動画があるので時間があるときに見てみてください」

https://www.youtube.com/watch?v=Q-FJ3XmFlT8

山田さん「わかりました！」

テスト駆動とToDo作成は開発初期段階の認識合わせとしても相性が良く、これからペアプロを行うにあたって導入したいと思っていました。

簡単な例ですがToDoはこのように作成していました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2889192/573824a9-0e5b-9ec4-d096-3175098928f0.png)

# おわりに
開発前に作業内容の認識をお互いに合わせた状態を作ることでペアプロがやりやすくなるのでぜひ試してみてください。
日本最速！GPT Storeに出るかもしれない日本系GPTsの傾向

# はじめに

OpenAI Dev Dayが先週ありました。
この秋にはGoogle gemini/MakerSuite/Stubbsのコンボが来ると思っていましたが、OpenAIの先制攻撃の鋭さに驚かされました。
その日のうちにDev Dayまとめもあふていて関心の高さを感じます。
2日くらいたつとGPT Storeに関する話題が増えてきました。
ついつい、AppleのApp Storeで起こったことがGPT Storeでも起こると思って身構えてしまうのは人情です。
(1) 初期の熱狂　→　(2) 競争激化　→ (3) 規則の強化　→ (4) 大企業の寡占、となることはわかっていても、最初の椅子取りゲームには参加したくなるものです。
今回は、GPT Storeで App Storeの熱狂を連想してしまう人達のために日本最速の日本系GPT 予想を書いておきます。

# 大規模言語モデルの変遷
大規模言語モデルの変遷はこんな感じと予想されます。
1. 大規模言語モデルの開発
2. APIの開放（開発者のサービス開発）
3. 開発環境の開放（個人のサービス開発）

聞いたところによれば、この第三段階は、ビジネスモデル上の有利さとともに各人がカスタムGPTを作り、Swarm AIを形成することによって規制が厳しくなることを防ぐ効果があるそうです。
(参考：松田語録：OpenAI DevDay 2023 考察編
 https://www.youtube.com/watch?v=_rx2yMgscGM 2023年 25m56s)

 規制逃れにせよ、ビジネスエコシステム作りにせよ、生成AIも第三段階になり、技術競争から経済競争に移っていく過渡期なのかと思います。

 # 作るべきGPTsの候補
海外の動画を見ると作るべきGPTsは以下のようなものです。
1. 生成AIニュース
2. 自動化GPT

これにあえて付け加えれば
3. 英米で流行っているGPTsのまねっこ日本版
というのがあるかと思います。

 # 1週間で世の中に出た日本版GPTs
 どれが日本作者なのかはわかりませんが、名前あるいは説明に日本語が入っているGPTsは現時点では以下のようなものです。
* デジタルバッGPT 六角形のデジタルバッジを作ることに特化したGPTです。
* 人狼GPT 舞台は中世の小さな村。リアルな世界で人狼を探し出そう。
* おでかけGPT あなたの行動エリアに基づいた休日のおでかけ情報を提案します
* 婚活GPT 1週間以内に結婚相手を見つけよ.
* ねこGPT. ねこ画像とねこ情報を提供するGPT.
* 実況しかできないGPT. 情熱の実況専門.
* 私立GPT北高校　This is GPT where you can enjoy a love simulation game!
* Jazz理論GPT. Jazz理論の質問に答えサポートするAI.
* なんでも知ってる博士GPT A scholarly elder who speaks in old-fashioned Japanese, providing factual information without jokes or imagination.
* GPT Monsters 画像生成型モンスターゲーム ワードを入れてモンスターを召喚！
* Bitcoin GPT. ビットコインの全てをサポート.
* 英文校正GPT. Academic paper English proofreading assistant.
* 地方議会GPT. 地方議会を盛り上げていきましょう.
* ぬっこGPT. ぬっこさんに詳しいGPT
* ROS2ではじめよう GPT 書籍「ROS2ではじめよう 次世代ロボットプログラミング」の内容を基にROS 2に関する質問に回答します
* UNDOKAI GPT. 運動会を開催したり、運営したり、競技や出し物をつくったりすることを会話しましょう.
* Anime Girls GPT 好きな単語やシチュエーションを入れると、それをモチーフにした女の子の画像を作ってくれます
* 和英翻訳GPT. Specializes in Japanese to English academic translations.
* ブレストGPT ブレストしたいテーマを送ってください。AIブレインが議論を行い要約と結論を提示します。
* ホトトギスGPT. 偉人がホトトギスを言います。
* うんこGPT. 関西弁でうけとる人生相談家
* サザンGPT
当直表GPT Helps create duty rosters and on-call schedules for medical professionals.
 結構、ディープですね。
 ChatGPTの広がりを感じます。

 ぱっと見た感じは：
 1. 画像生成系
 2. 検索系
 3. ゲーム系
 4. 知識提供系
 5. 外部連携系
 6. 目的型対話系
 7. 言葉遊び系
 に分かれるようです。

 # おわりに
 私も何作ろうかなーと思案しているところです。
 この記事がいくばくかの参考になれば幸いです。
Databricks の Hive Metastore のテーブルの日本語のカラムに対する ANALYZE TABLE はエラーとなる

## 概要

Databricks の Hive Metastore のテーブルの日本語のカラムに対する ANALYZE TABLE はエラーとなるようです。Unity Catalog のテーブルの場合には、日本語のカラムでもエラーとなならないため、Unity Catalog へのアップグレードを検討してください。

## 実行コードとエラーメッセージ

```tex
AnalysisException: org.apache.hadoop.hive.ql.metadata.HiveException: Unable to alter table.
```

```python
%sql
ANALYZE TABLE hive_metastore.tpch.flights_summary_data_004__for_store
  COMPUTE STATISTICS FOR COLUMNS 
    `目的地の国名`
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/f1fb41bb-d6bf-fd65-399b-3ba26ebecf39.png)

## Unity Catalog のテーブルに対する実行例

```python
%sql
ANALYZE TABLE `カタログ`.`スキーマ`.`テーブル`
  COMPUTE STATISTICS FOR COLUMNS 
    `ネーションキー`
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/7c2ce84d-b484-a5f4-fb76-889da6ad9725.png)
数秘術を自動計算するGoogleスプレッドシート（標準関数のみ）

## サンプル

著作権フリーです。コピーなどしてご自由にお使いください。
https://docs.google.com/spreadsheets/d/1Q_ZFeZvKTCQAfEPCfSylcXjro2oOY1vn369pUZh8Vkg/edit?usp=sharing

## 目的
日付の数秘を簡単と出せるようにすることで、
その日が持つエネルギーの認識、活用を積極的に行う。

※そもそも数秘とは？という方はこちらがわかりやすいです
https://tsuduri-illust.com/aboutmangasuhi

## 解説
処理を分解すると下記の5ステップになります。
1. 日付をシリアル値から文字列に変換
1. 文字列を1文字ずつに分割
1. 1文字ずつ文字列から数値に変換
1. 全ての数値を足し合わせる
1. 上記の過程を1桁 or ゾロ目になるまで続ける

### 1. 日付をシリアル値から文字列に変換
`=TEXT(A2,"yyyyMMdd")`
input: 2023/11/14
output: "20231114"

### 2. 文字列を1文字ずつに分割
`=SPLIT(REGEXREPLACE(【1のoutput】,"","_"),"_")`
input: "20231114"
output: ["2","0","2","3","1","1","1","4"]

REGEXREPLACEで各文字の間に "_" を付与することで、SPLITできるようにしています。

### 3. 1文字ずつ文字列から数値に変換
`=ARRAYFORMULA(VALUE(【2のoutput】))`
input: ["2","0","2","3","1","1","1","4"]
output: [2,0,2,3,1,1,1,4]

2の結果が配列になっているので、VALUEのみだと先頭の文字しか返ってきません。
そのため、ARRAYFORMULAを用いて各要素にVALUEを適用しています。

### 4. 全ての数値を足し合わせる
`=SUM(【3のoutput】)`
input: [2,0,2,3,1,1,1,4]
output: 14

全てを足し合わせます。

### 5. 1桁 or ゾロ目になるまで続ける
4の結果がゾロ目になるまで、1~4を繰り返す必要があります。
ただし、4の結果は最大でも2桁なのでもう一度のみ繰り返せば良いです。

4の結果は複数回参照するので、別のセルでゾロ目かどうか判定する数式を用意します。
2桁のゾロ目のパターンは11,22,33のいずれかなので、11で割った余りが0かどうかで判定できます。
`=IF(MOD(C2,11)=0,TRUE,FALSE)`
input: 14
output: FALSE

その後、ゾロ目では無く2桁の場合のみ、最後1~4を行います。
`=IF(OR(【4のアウトプット】<10,【ゾロ目か】=TRUE),【4のアウトプット】,VALUE(REGEXREPLACE(TEXT(SUM(Arrayformula(VALUE(SPLIT(REGEXREPLACE(TEXT(【4のアウトプット】,"00"),"","_"),"_")))),"0"),"0$","")))`
input: C2=14,D2=FALSE
output: 5

よく見ると、`REGEXREPLACE(足し合わせた結果,"0$","")`という処理が入っています。
これは、4のアウトプットを足し合わせると10になる場合(19,28,37)は1として出力したいので
足し合わせた結果の末尾が0の場合は取り除く処理をしています。
AIはじまり　母集団、標本　google colabo

# 母集団と標本順列について

母集団とは
母集団（Population）とは、統計学において、研究や分析の対象となる全ての個体や要素の集まりを指します。例えば、ある国の全住民、特定の病気を持つ全患者、ある工場で生産される全製品などが母集団にあたります。

標本とは
標本（Sample）は、母集団から選ばれた一部の個体や要素の集まりです。全ての母集団を調査することが難しい場合、標本を通じて母集団の特性を推測します。

標本順列とは
標本順列（Sampling Permutation）は、標本を取る際に、母集団の中から無作為に選んだ要素を並べ替えることを指します。これは、標本が母集団を代表するようにするために重要です。

プログラミングコード例
以下は、Pythonを使用して母集団から標本を無作為に選び、順列を生成する簡単な例です。

```
import random

# 母集団の定義（例：1から100までの数）
population = list(range(1, 101))

# 標本のサイズ
sample_size = 10

# 標本の無作為選択
sample = random.sample(population, sample_size)

# 標本順列の生成
sample_permutation = random.sample(sample, len(sample))

print("選ばれた標本: ", sample)
print("標本の順列: ", sample_permutation)

```

このコードは、1から100までの数を母集団として、そこから10個の数を無作為に選び（標本）、それらをさらに並べ替えて順列を生成しています。このようなプロセスは、統計学における標本抽出やランダム化実験において重要な役割を果たします。


上記のコードを
google colaboで
実施してみましょう

# google colabo について

Pythonを学びたいけれど、開発環境の構築が難しいと感じている方々に朗報です。特にプログラミング初学者にとって、環境構築は大きなハードルになりがちですが、Googleが提供する「Google Colaboratory（通称：Colab）」がその課題を解決します。この記事では、Google Colabの特徴や基本的な使い方、具体的な使用事例をわかりやすく解説します。

## 1. Google Colaboratoryとは？
Google Colaboratoryは、ブラウザ上でPythonを実行できる無料のクラウドサービスです。開発環境の構築が不要で、機械学習、データ分析などPythonを活用する多様な場面で利用されています。初学者から研究者まで、幅広いユーザーに支持されています。

## 2. Google Colaboratoryの主な特徴
ローカル環境の構築不要：ローカルマシンに開発環境を設定する必要がありません。Pythonの標準ライブラリに加え、PandasやNumPyなどのライブラリもインストール済みです。
フレームワークやライブラリの追加が可能：ユーザーは自分の要件に合わせた環境を自由に構築できます。例えば、自然言語処理のライブラリ「MeCab」をインストールして使用することが可能です。
Pythonコードの共有が容易：作成したコード（ノートブック）を他のユーザーと簡単に共有できます。Google Driveと連携しており、共有機能を利用してノートブックを他のユーザーと共有できます。

## 3. Google Colabの利用方法
Google Colabを使用するには、Googleアカウントが必要です。Google Driveにアクセスし、新しいノートブックを作成することで、すぐにPythonコードの記述を始めることができます。コードセルとMarkdown形式のテキストセルを組み合わせることで、ドキュメントを作成できます。

## 4. Google Colabの活用事例
機械学習の教育：初心者が機械学習の基本を学ぶためのプラットフォームとして最適です。
データ分析プロジェクト：データの視覚化や分析を行うためのツールとして活用できます。
チームでのコラボレーション：共有機能を使って、チームメンバーとコードを共有し、協力してプロジェクトを進めることができます。



https://colab.research.google.com/?hl=ja


# Google Colab で　母集団から標本を無作為に選び、順列を生成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3531332/7f011de5-22e0-ed39-940e-425551df1e29.png)


無事に実行できれば　
python によるデータ解析の世界へ一歩踏み出した状態です

ようこそ！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3531332/2fff02fe-a983-0e84-393e-8b7113cb5878.png)
はじめての社内リリース

# はじめに
今年のカレンダーはとある会社のとあるチームで活動した1年間を振り返っていきます

## 登場人物

### 山田さん：
他チームからヘルプに来てくれた真面目で素直な新メンバー。音声繋いでペアプロしているが声質や話し方が某アイドルグループの某メンバーにそっくり(な気がする)。

### アーキテクチャ先生：
AWSが好きな新上司。Docker on Lambdaを利用したサーバーレスアプリケーションのアーキテクチャなどが得意。

---
私「これで期限内の開発は終わりですね」

山田さん「長いようで短かったですね。Reactについて学べたので良かったです。アーキテクチャで苦戦しましたね」

アーキテクチャ先生「やりましたね！検証期間設けて問題なければ社内リリースしましょう」

私「はい！」

# はじめての社内リリース
自分達で開発したシステムを社内リリースするのは初めての経験でした。
リリースにあたって以下の準備を行いました。

- 2週間の動作検証期間
- 簡易マニュアルの作成
- 検証期間中のサポート対応
- 期間中に挙がった要望などをまとめる

## 動作検証期間中に気づいたこと
- システムに対して反応が良かった
初めてReactで開発したのですが、普段社内で開発しているデザインと比べてモダンな感じにしていたので反応が良かったです。メンバーが要所に散りばめた遊び心もウケが良かったです。

- 検証のリマインドは何度も行う
動作検証のお願いを周知した当日は多くの方に触っていただけたのですが、翌日からは音沙汰なしでした。
結果として、1週間後と最終日にリマインドを行いましたが多くの方は最終日に触っていただきました。
最終日はもう直接ヒアリングしたりしていました。中には期間を失念されている方もいたので、リマインドはしつこいくらいにしようと思いました。

# おわりに
初めて学んだ言語で開発したシステムを無事リリースすることができてひと段落つきました。
中途半端に終わることがなくてよかったです。
ライブラリなしのソルトの生成と文字列への変換

ソルトをランダムに生成する方法と任意の文字列をソルトにする方法です。
また、ソルトを文字列にして保持する場合に16進数やBase64に変換する方法です。
ライブラリを使わない方法を記載しました！

```java:ByteConvert.java
import java.security.SecureRandom;
import java.util.Arrays;
import java.util.Base64;

public class ByteConvert {

	public static void main(String[] args){
	    //ランダムなソルトの生成
		byte[] salt1 = createSalt();
		System.out.println(salt1);
		System.out.println(Arrays.toString(salt1));
	    StringBuffer hexSalt1 = byteToHex(salt1);
	    System.out.println(hexSalt1);
	    String base64Salt1 = byteToBase64(salt1);
	    System.out.println(base64Salt1);
	    
	    //任意の文字列をソルトに指定
	    String str = "pass";
        byte[] salt2 = str.getBytes();
		System.out.println(salt2);
		System.out.println(Arrays.toString(salt2));
	    StringBuffer hexSalt2 = byteToHex(salt2);
	    System.out.println(hexSalt2);
	    String base64Salt2 = byteToBase64(salt2);
	    System.out.println(base64Salt2);
	    //元の文字列に戻す
	    System.out.println(new String(salt2));
	    

	}
	//ランダムなソルトの生成
	public static byte[] createSalt(){
	    SecureRandom random = new SecureRandom();
	    byte bytes[] = new byte[20];
	    random.nextBytes(bytes);
	    return bytes;
	}


	//ソルトを16進数の文字列に変換
	public static StringBuffer byteToHex(byte[] salt) {
		StringBuffer sb = new StringBuffer();
		for (int i = 0; i < salt.length; i++) {
		    sb.append(String.format("%02x", salt[i]));
		}
		return sb;
	}

	//ソルトをBase64の文字列に変更
	public static String byteToBase64(byte[] salt){
	    return Base64.getEncoder().encodeToString(salt);
	}

}
```
この結果は以下のように出力されます。
ランダム生成の部分は実行ごとに変わります。
```
[B@1a86f2f1
[-116, -98, -75, 77, 12, 67, -105, -13, 98, -120, 82, -14, -120, 96, 24, 103, 27, -107, 49, -4]
8c9eb54d0c4397f3628852f2886018671b9531fc
jJ61TQxDl/NiiFLyiGAYZxuVMfw=

[B@531d72ca
[112, 97, 115, 115]
70617373
cGFzcw==
pass
```
AWS Forecastで再学習を行うときの実装ノーハウ（boto3利用）

## 下記のような知識があるとこの記事が理解しやすいです。

- AWS Forecastについて基本知識
- AWS SDK (boto3等)やCLIでAWS Forecastの予測の実施方法がわかる
- Python

**AWS Forecastとは**
https://docs.aws.amazon.com/ja_jp/forecast/latest/dg/what-is-forecast.html

**AWS boto3 forecast Doc**
https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/forecast.html

## 再学習とは

### Forecastの予測の実施流れ

Forecastの予測は以下のような流れで行われます。

1. Dataset Group作成
1. Dataset 作成
1. Dataset インポート
1. Predictor 作成
1. Forecast 作成
1. Forecast エクスポート

予測を行うたびに全体の流れを繰り返すのは非効率的です。

### 再学習の実施流れ

1. 既に作成済みのDatasetに追加データをインポート
1. 既に作成済みのPredictorを指定してPredictorを作成
1. Forecast作成からの手順は同上です。

とくにPredictorの処理が高速になります。

> 予測子の再学習は、新しい予測子をゼロから作成するよりも最大 50% 高速です。
> Predictor のトレーニング時間は短くなり、Forecast では既存の構成設定が自動的に使用されます。

参照：https://docs.aws.amazon.com/ja_jp/forecast/latest/dg/retrain-predictors.html

## 実装ノーハウ

### 利用ライブラリ：boto3

```python
forecast = boto3.client(service_name='forecast', region_name='ap-northeast-1')
```

### 引数：create_dataset_import_job

- 過去作成した`dataset-group`の既に存在する`dataset`へ追加データをインポート
- 追加データをインポートする際は`create_dataset_import_job`の引数に`ImportMode='INCREMENTAL'`を指定

```python
dataset_import_job_response = forecast.create_dataset_import_job(
    DatasetImportJobName=import_job_name,
    DatasetArn=dataset_arn, # `dataset-group`の既存の`dataset`
    DataSource={
        "S3Config" : {
            "Path": s3_path,
            "RoleArn": role_arn
        }
    },
    TimestampFormat=time_stamp_format,
    ImportMode='INCREMENTAL' # `ImportMode='INCREMENTAL'`を指定
)
```

※ `ImportMode='FULL'`を指定すると追加とはならなく全体データが上書きされます。

### 引数：create_auto_predictor

- `ReferencePredictorArn`引数に再学習する対象の`Predictor`を指定

```python
create_predictor_response = forecast.create_auto_predictor(
    PredictorName=predictor_name,
    ReferencePredictorArn=retraining_predictor_arn # 再学習する対象の`Predictor`を指定
)
```

※ 引数の`ForecastHorizon`, `ForecastFrequency`, `DataConfig`は指定しないことにご注意ください。

## 検証結果

- Predictor作成時間が明らかに短くなっています。

| 区分  | 実績データ  | 再学習元  | Predictor作成時間 | Forecast作成時間 | 予測対象期間
| ------------- | ------------- | ------------- | ------------- | ------------- | ------------- | 
| 1回目予測  | 2022年1月1日～2022年8月31日  | なし  | 50分  | 17分  | 2022年9月1日～2022年10月30日
| 2回目予測（再学習）  | 2022年9月1日～2022年9月30日（追加分） | 1回目予測Predictor  | 34分 | 15分  |  2022年10月1日～2022年11月29日
| 3回目予測（再学習）  | 2022年10月1日～2022年10月31日（追加分）  | 2回目予測Predictor  | 34分 | 15分  |  2022年11月1日～2022年12月30日
python　で作る　<br> をつける

# python を一通り学んだ人へ
## 目的を持つ、とりあえず便利そうなもの
pythonの初心者向けの本を一読した人へ、とりあえずこんなのあったら便利じゃない？  
ってものを作ってみました。  
　何をもって便利かはひとそれぞれなのですかが、私なりにちょっとしたものを作りたくて作った備忘録です。  
**環境**  
- windows11  
- python 3.10.7  
- pyperclip 1.8.2  
  
まずpipでpyperclip ライブラリーをインストールします  
  
```python  
pip install pyperclip  
```  
エディタは何でもいいです  
  
プログラムの細かい説明は割愛します。  

```python:br.py  

import tkinter as tk    #画面作成
import pyperclip #クリップボードを制御するライブラリーをimportする
def btnBR_click(): #ボタンを押したときのイベント
    print("コピーする")
    str = pyperclip.paste() #クリップボードの文字列をstr変数に代入
    str_br = str.replace("\r\n","<br>\r\n") #全ての改行の前に<br>をつけてstr_brに代入
    str_br1='<br>追加したい文字<br>' #必要なければ空欄にする

    pyperclip.copy(str_br+str_br1) #変更した文字列をクリップボードに戻す

#画面作成
main = tk.Tk() #画面の初期設定
main.geometry('250x150') #画面の大きさの設定
main.title('<BR>') #タイトルを表示

#クリップ<BR>ONモード
btnCopy = tk.Button(main,text="<br>に変換",font=("ＭＳ ゴシック", 16, "bold"),command=btnBR_click)

btnCopy.place(x=50, y=40) #ボタンの位置決め
main.attributes("-topmost", True) #ウインドウを常に前に表示する
main.mainloop() #ウインドウを表示する
```
使い方はいたって簡単  
- ＜br＞をつけたい文章をコピーする
![123.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3615595/b983174d-3f43-cb55-bb84-a7c78b6bbe39.png)
- tkinter のBRボタンを押す
![BR.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3615595/ca6bd3cb-1e16-3e77-08cb-4150d4896491.png)
- ペーストする
![kekka.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3615595/3098d9d6-d0f5-6062-539c-ed559b9b4e04.png)

これだけ！
MySQLの系初期設定

# MySQL系の初期設定について
以下いちいち調べるのが面倒なのでメモ

## root以外の全権限をもつユーザーの追加
```
create user 'username'@'host_name' identified by 'password';
grant all on *.* to 'username'@'hostname';
```

    
## データベースをutf8mb4で作る
```
create database dbname character set utf8mb4 collate utf8mb4_bin;
```

## mysqlコマンドで接続する。
```
mysql dbbane -u username -p
```
初学者に向けた「ソフトウェア開発」とは、基本的なプロセスを理解する

「ソフトウェア開発」という言葉を聞くと、ITに詳しくない初学者にとって「少し難しそう」と思う方も多く、私もその一人でした。
しかし、実際の開発プロセスや手順を理解することで各フェーズで何を目的に業務を行っているのか、何をOutPutとして必要とされるのか明確に理解することができます。

この記事では、ソフトウェア開発をこれから行う初学者に向けて、ソフトウェア開発の意味や、開発の流れ、各種設計手法の違いについて解説していきます。

## ソフトウェア開発プロセスの概要
<h3>ソフトウェア開発とは何か？</h3>
そもそもソフトウェアとは、「コンピューター上で動作するプログラム」のこと意味します。
ソフトウェア開発は、そのソフトウェアを設計・開発して世の中にリリース（公開）することです。他にも、アプリケーションやゲームソフト、OS(オペレーディングシステム)の開発なども、このソフトウェア開発に該当します。

<h3>ハードウェアとは？</h3>
このソフトウェアに対し、サーバーやモニター、マウス、キーボードといった機器のことをハードウェアと呼びます。
ソフトウェアは単体ではなく、周辺にあるハードウェアと結びつけることで人間が利用することが可能になります。
そのため、ソフトウェアにとってハードウェアは必要不可欠な存在です。

よくそれぞれの違いとして、「目に見えないもの」＝ソフトウェア、「目に見えるもの」＝ハードウェアという認識で覚えらることもあります。

<h3>主要な開発手法について紹介</h3>
<h4>ウォーターフォールモデル</h4>
ウォーターフォールモデルは、各工程を順序通りに完了させ、上流工程から下流へと業務が水のように流れ落ちていくイメージから名づけられました。

実際の業務プロセスにおいても、
「要求分析→要件定義→外部設計→内部設計→コーディング→テスト」というようにタスクが完了するごとに次の工程が始まります。

<h4>アジャイル開発</h4>
アジャイル開発は、開発業務における柔軟性と迅速な対応力を重視したプロセスです。
前述した”ウォータフォールモデル”よりもアジャイル開発では、要求や設計を最初に完全に固定するのではなく、進行しながら変更を受け入れる柔軟性を持っています。

開発工程を短い期間で複数に分け、優先順位を決めて開発を進めていきます。

<h4>スクラム開発</h4>
スクラム開発は、アジャイル開発の手法の1つで、チームワークより重要しした開発手法です。
アジャイル開発と比べて、チームの働き方やコミュニケーションを改善することを行います。

開発期間を短い「スプリント」と呼ばれる単位に区切り、それぞれのスプリントで価値のある機能を開発することを目指します。
スプリン計画会議を開き、目標を定め、ディリースクラムと呼ばれる定例会議で進捗や問題点を共有し進めていきます。

<h4>プロトタイプ型開発</h4>
プロトタイプ型とは、開発中に試作品を作成し、ユーザーのフィードバックを取り入れながら進める開発手法です。これは、ウオーターフォール型開発のデメリットを解消するために生まれました。

小規模なプロジェクトや開発と試作を繰り返すプロジェクトに適した手法です。
最大のメリットは、手戻りが少なくなることで、試作とユーザーの承認を早い段階から交互に行うことで、テストや運用の段階での問題も減らすことができます。

しかし、大規模なプロジェクトでは、試作の回数が増えたり、コストや手間が膨大になるなどデメリットも存在するため、プロジェクト規模にあった手法の選択が重要です。


<h4>スパイラル型開発</h4>
スパイラル型とは、設計・開発・テストを繰り返しながらプロセスの見直しと改善を行う開発手法です。この手法は、ウォーターフォール型とアジャイル型のメリットを組み合わせた、より良い開発プロセスだと言えます。

特に、品質の要求が高いプロジェクトの開発に最適で、最大のメリットは仕様変更や機能追加に柔軟に対応できる点です。たとえ手戻りが生じても、その影響を最小限に抑えることができます。

しかし、開発初期段階でシステムの全体像を把握しにくいため、プロジェクトの管理には十分な注意が必要です。

<h2>システム開発ライフサイクル（SDLC）</h2>
<h3>システム開発ライフサイクル（SDLC）とは？</h3>
SDLC(Software DeveLopment Life Cycle)は、ソフトウェアアプリケーションを作成し、リリースするために必要なタスクを簡潔にまとめたものです。これにより、無駄を省き効率を向上させることが可能です。
システムが企画されて実際にリリースされ運用されるまでのすべての工程を表現しています。
具体的に、以下で解説していきます。


<h3>各フェーズについて詳しく解説します</h3>
システム開発ライフサイクルは、7つの過程で説明できます。
以下をそれぞれ、詳しく解説します。

<h4>1.企画・要求定義</h4>
目的やビジネスへの貢献などを計画し、そしてシステムに対する明確な「要求」を定めるプロセスです。要求の明確はとても重要な作業であり、プロジェクトが進行する中で要求が明確でなければ、頻繁な修正が発生してしまいます。
予定外の修正に、開発スピードが低下し、開発費用が増えてしまう可能性もあります。

<h4>2.要件定義</h4>
「企画・要求定義」で決定した内容を踏まえて、実際に実装する機能やそれに伴う仕様などを定めていきます。

<h4>3.設計</h4>
操作性やUI/UXの設計などの「外部設計」、システムの機能や動作などの「内部設計」を行います。

<h4>4.プログラミング</h4>
設計した内容を、実際にプログラミング言語を使って実現させる工程です。

<h4>5.テスト</h4>
作ったシステムを、テストを行い必要する機能が満足されているか確認します。
このテストには、「単体テスト」、「結合テスト」、「システムテスト」、「運用テスト」と４段階あります。

<h4>6.展開・リリース</h4>
いよいよ、システムを公開します。

<h4>7.保守運用・メンテナンス</h4>
公開したシステムに関して、実際に使用する中で発生したバグやトラブルなどへの対応や、定期的なアップデートなどを行います。
この工程は、サービスが続く限り行っていきます。


<h2>まとめ</h2>
ソフトウェア開発における各種開発プロセスの違いとシステム開発ライフサイクル（SDLC）の過程について解説しました。
各種開発手法には、それぞれメリット・デメリットがありプロジェクトの目的や規模にあった手法を選択することがとても重要です。

また、システム開発ライフサイクル(SDLC)を理解した上で、業務を行うことで各フェーズで何が必要とされるのか明確に理解し業務を行えるようになります。
Go言語プロジェクトでの一般的なLinterエラーとその対処法

# **はじめに**

Go言語のプロジェクトでは、品質を保つためにさまざまなlinterツールが使われます。これらのツールは、コードの可読性を高め、潜在的なバグを早期に発見するのに役立ちます。しかし、これらのツールが出す警告やエラーに対処するのは時に難しいものです。この記事では、**`goimports`**、**`errcheck`**、**`gocognit`**、**`gocyclo`**などの一般的なlinterツールでよく見られるエラーと、それらを解決する方法について説明します。

## **目次**

1. goimportsに関するエラー
2. errcheckに関するエラー
3. gocognitに関するエラー
4. gocycloに関するエラー
5. まとめ

## **goimportsに関するエラー**

**`goimports`**はインポート文を整理し、フォーマットします。このエラーは、インポートが適切に整理されていない場合に発生します。

### **サンプルコード（lintエラーが出る）**

```go
package main

import (
    "fmt"
    "os"
)

func main() {
    fmt.Println("Hello, world!")
}
```

### **改善後のコード**

```go
package main

import (
    "fmt"
)

func main() {
    fmt.Println("Hello, world!")
}
```

不要な **`"os"`** インポートを削除しました。**`goimports`**はこのような不要なインポートを自動的に削除します。

## **errcheckに関するエラー**

**`errcheck`**はエラーを返す関数の戻り値が適切にチェックされているかを検証します。このエラーは、エラーを返す関数の戻り値が無視されている場合に発生します。

### **サンプルコード（lintエラーが出る）**

```go
package main

import (
    "fmt"
    "os"
)

func main() {
    fmt.Fprintf(os.Stdout, "Hello, world!")
}
```

### **改善後のコード**

```go
package main

import (
    "fmt"
    "os"
)

func main() {
    if _, err := fmt.Fprintf(os.Stdout, "Hello, world!"); err != nil {
        panic(err)
    }
}
```

**`fmt.Fprintf`**のエラーリターン値をチェックし、エラーがある場合はpanicを発生させます。

## **gocognitに関するエラー**

**`gocognit`**は関数の認知複雑度を計測します。このエラーは、関数が設定された複雑度の閾値を超えた場合に発生します。

### **サンプルコード（lintエラーが出る）**

```go
package main

func complexFunction(a, b, c int) int {
    if a > 10 {
        if b > 10 {
            if c > 10 {
                return a + b + c
            }
        }
    }
    return 0
}

```

### **改善後のコード**

```go
goCopy code
package main

func simpleFunction(a, b, c int) int {
    if a <= 10 || b <= 10 || c <= 10 {
        return 0
    }
    return a + b + c
}

```

複数のネストされたif文を単一の条件文に置き換えて、関数の認知複雑度を減らしました。

## **gocycloに関するエラー**

**`gocyclo`**は関数のサイクロマティック複雑度を計測します。このエラーは、関数が設定された複雑度の閾値を超えた場合に発生します。

### **サンプルコード（lintエラーが出る）**

```go
package main

func complexLogic(a int) string {
    if a == 1 {
        return "one"
    } else if a == 2 {
        return "two"
    } else if a == 3 {
        return "three"
    } // ... 他の多くの条件
    return "unknown"
}
```

### **改善後のコード**

```go
package main

func simpleLogic(a int) string {
    numbers := map[int]string{
        1: "one",
        2: "two",
        3: "three",
        // ... 他のマッピング
    }

    if val, ok := numbers[a]; ok {
        return val
    }
    return "unknown"
}
```

複数のif-else文をマップを使用して置き換え、関数のサイクロマティック複雑度を減らしました。

## **まとめ**

Go言語のプロジェクトでlinterツールを使用することは、コードの品質を維持し、一般的なエラーや問題を早期に発見するのに役立ちます。この記事で紹介したエラーと対処法は、Go言語の開発においてよく遭遇するものであり、これらの対処法を理解し適用することで、より効率的で読みやすいコードを書くことができます。
Vue 基礎勉強 v-if

(Vue.js 3.1.5を使用)

**v-if**
表示、非表示の切り替え。

```javascript:javascript
const app = Vue.createApp({
    data: () => ({
        toggle: false
    })
})
app.mount('#app')
```

```html:html
    <div id="app">
        <p v-if="toggle">こんにちは！</p>
    </div>
```
`
toggle: false
`
のままだと、表示されない。

![1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1284134/b97d0dea-8f23-5a3d-9acc-013b74589ac9.png)
`
toggle: true
`
に変更すると、表示される。

![2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1284134/1f062e59-8001-c07f-e9da-64056ad11de7.png)

**v-else**

v-ifの表示条件以外（elseの条件）のとき表示する。

```html:html
    <div id="app">
        <p v-if="toggle">こんにちは！</p>
        <p v-else="toggle">おはよう！</p>
    </div>
```

`toggle: false`のとき、

![9.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1284134/2a12317f-f9e5-4350-10e4-0529fbd71703.png)

`toggle: true`のとき、

![10.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1284134/3d6c6afd-460a-274c-5244-cc61da9f0cb8.png)
JavaScriptでObjectのKeyに変数展開する

jsonのkeyに動的にkey名を代入したくて調べたら見つけたサイトを備忘メモ。

https://zenn.dev/ry_km/articles/use-variables-with-object-key-in-js

Keyに変数展開する
上記例を見ていただければ分かる通り，Valueに変数を展開することは当然可能です。しかし，Key側に変数展開しようとすると，展開せずに変数名がそのまま表示されてしまいます。

```
const newKey = 'hoge'
const obj = {
  newKey: 'test'
};
console.log(obj) // { newKey: 'test' }
```
Keyに'hoge'のように変数展開したいときは，[newKey]のように[]で変数名を囲います。
```
const newKey = 'hoge'
const obj = {
  [newKey]: 'test'
};
console.log(obj) // { hoge: 'test' }
```
ちなみに，この書き方はES2015以降で使える方法です。

**この書き方どこかで見たことあるような...**
そう！TypeScriptで型指定するときですね！
```
const someObject: {[id: string]: value} = {};
```
[id: string]のように，[]で囲っていることでidが変数であることを明示しているんですね。これを知るまでは，ObjectにはKey-Valueがいくつも入るから配列にしているのかな，とか思っていました[2]。

ちょっとしたことですが，新しいことを知ると嬉しいスッキリしますね。
以上になります。お読みいただきありがとうございました！
画像を理想のサイズで印刷する方法

# 画像を理想のサイズで印刷する方法

自分のスマホやパソコン、車などを好きなステッカーでデコりたい！でも気に入る画像が見つからない……そうだ！じゃあ画像を作ろう！…と、思うことはありませんか？
私はあります。

フリーのペイントソフトで画像を作成した後、サイズを6cm四方ぴったりで印刷したい！
そんな時の印刷方法についてまとめてみました。

## 前提
1.画像は既に用意が済んでいる
2.パソコンにWordが入っている
3.ペイントソフトから印刷する際にセンチでサイズの指定がわからない

上記に当てはまる方には参考になると思います！


### サイズ指定の方法
1.Microsoft Wordを開き、新規ドキュメントを作成します。
2.メニュータブの「挿入」を開き、印刷したい画像を「画像」から選択し貼り付けます。
![キャプチャ1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2028933/4590344d-8a41-8014-519d-139c2c7670b0.png)


※今回、画像はフリー素材サイトIllustAC様から対い蝶の家紋の画像をお借りしてきました。

こちらの家紋を6cm×6cmの正方形いっぱいに収まるサイズでシール用紙へ印刷し、ヘッドホンに貼りつけるのが今回の目的です。

3.画像の上で左クリックをし、「レイアウトの詳細設定」を選択します。
![キャプチャ2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2028933/d7e74471-0d68-40b5-d199-83f907595261.png)


4.「レイアウト」のポップアップが出てくるので、そこに好きなサイズを指定します。
今回は6cm四方いっぱいに紋が入るようにしたいので、一旦高さを60mmに設定します。
![キャプチャ3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2028933/28614652-b837-9c85-1d6c-704761d2863a.png)


「OK」をクリックするとサイズが変更されて反映されます。
![キャプチャ4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2028933/d3c6a715-7530-cb63-6842-6eacbcd95196.png)

5.6cm四方いっぱい…というには少し小さいのでサイズ調整を更にします。
※別に枠いっぱいにする必要はない方は飛ばしてしまって大丈夫な工程です。

まず画像の上で左クリック、それから「トリミング」を選択します。
![キャプチャ5.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2028933/0ce9d12f-c2b7-7865-2717-6ea0d8c6161a.png)

黒い枠と白丸が表示されるので、白丸を操作して画像サイズを変更します。
高さを6cmに指定しているので、高さいっぱいに画像を拡大していきます。
![キャプチャ6.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2028933/d8971525-693f-803a-4536-5e7926a27f31.png)


画像を広げていくとグレーアウトする部分が出てくると思います。
枠に対してお好きなサイズまで拡大していきます。
![キャプチャ7.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2028933/daa5c625-584c-6b68-433d-5d722a365824.png)

枠ぴったりまで広げたら画像の枠外をクリックすると適用されます。
![キャプチャ8.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2028933/8933ebf5-3104-696c-d93f-91abdac95464.png)


サイズ指定はこれで完了です！あとは通常通り、メニュータブの「ファイル」から「印刷」を選択するだけです！


## おまけ～Wordで画像を透過処理する方法～
ペイントソフトで背景透過処理をして保存してもこの方法だと背景が透過しなくなってしまうので、その変更方法もお伝えします。

1.メニュータブの中から「図の形式」を選択し、その中にある「色」の項目から「透明色を指定」を選択します。
※今回は変化が分かりやすいように、ドキュメント自体の背景色を黒に変更しています。
![キャプチャ9.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2028933/67e85d99-4cae-6539-4bec-0cbe7c6b375d.png)


2.「透明色を指定」をクリックするとマウスのポインタの形が変わるので、透明にしたい色の箇所をクリックします。
今回の例だと白い箇所を透明にしたいので、白の余白の箇所をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2028933/083b5a52-69b0-ad22-b930-0a5088e3aee2.png)

白い余白部分が透過されて、背景色の黒が表示されます。
これで透過処理は完了です！

3.画像の上で左クリックしメニューを表示させ、「図として保存」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2028933/6dac96a2-f4d9-12e0-52e2-a332e23f3df8.png)


比較のために分かりやすくデスクトップに保存して表示させてみました。
左側が透過前の画像、右側が透過後の画像になります。
サムネの状態でもデスクトップの背景が見えるのがお分かりになるでしょうか。

![キャプチャ10.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2028933/f6be43ba-6127-04b0-606d-c22d7d76c2dd.png)


以上になります！
ペイントソフトに不慣れな方でもお気に入りの画像を好きなサイズのシール用紙などに印刷してお好きなものに貼って気分を上げることが出来るかと思います。
是非お試しください！