OmniAICreator/Qiita-1.07M huggingface dataset:
Laravel9ログの出力

# Laravel9ログの出力

Laravelでログを保存する方法と出力方法を解説


### 環境
- Laravel 9

ログの出力方法は2種類あります。
- ログの保存(/storage/logs/laravel.log)して表示
- ログを保存せずにターミナルで表示

### ログの保存(/storage/logs/laravel.log)して表示の場合

/config/logging.phpに追記

``` js:/config/logging.php
'channels' => [
        'stack' => [
            'driver' => 'stack',
            'channels' => ['single'],
            'ignore_exceptions' => false,
        ],

        'single' => [
            'driver' => 'single',
            'path' => storage_path('logs/laravel.log'), //<-変更
            'level' => env('LOG_LEVEL', 'debug'),
        ],
],
```

### ログを保存せずにターミナルで表示の場合

/config/logging.phpに追記

```js:config/logging.php
'stdout' => [
    'driver' => 'monolog',
    'handler' => StreamHandler::class,
    'with' => [
        'stream' => 'php://stdout',
    ],
],
```
.envに追記
```js:.env
LOG_CHANNEL=stdout
```

### ログの出力
#### ログレベル
```js
Log::emergency($message);
Log::alert($message);
Log::critical($message);
Log::error($message);
Log::warning($message);
Log::notice($message);
Log::info($message);
Log::debug($message);
```
#### 使用方法
```php

use Illuminate\Support\Facades\Log;

    public function store(Request $request)
    {
        Log::info($request);
    }
```
ソフトウェアエンジニアが開発業務で直面する3つの主要な課題とその解決策

# ソフトウェアエンジニアリングは、常に変化する技術の世界で進化し続ける分野です。エンジニアとしての私たちの仕事は、ただコードを書くだけではなく、様々な課題に直面し、それらを乗り越えながら価値あるソフトウェアを創造することです。今回は、開発業務でよく遭遇する3つの主要な課題と、それらを克服するための実用的なアプローチについて紹介します。
# 要件の明確化と変更:
•プロジェクトの成功は、明確で安定した要件に大きく依存します。しかし、現実には要件はしばしば曖昧で、開発の途中で変更されることがあります。このような状況を管理するためには、以下のようなアプローチが有効です：
アジャイル開発プラクティスの採用: 短い開発サイクルを用いて、頻繁にフィードバックを受け取り、迅速に適応することができます。
◦ステークホルダーとの継続的なコミュニケーション: 定期的なミーティングやデモを通じて、ステークホルダーとの認識のずれを防ぎます。
•今回、ちょっとONES.comのプラットフォームを利用してみました。ONES Wikiの情報共有ツールを活用して、会議内容や要件、仕様をステークホルダーと共有して、変更された場合もチームメンバーですぐに共有することで、コミュニケーションミスを削減します。また、その開発においてもその内容を開発チームが参照することで、認識のズレを大きく削減できます。ソフトウェア開発においては、開発チームだけでなくステークホルダー、営業チームとのコミュニケーションを強化することで、プロジェクト管理をよりスムーズにすることが可能です。設定も簡単で、技術者であれば、すぐに利用できると思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3762085/9257e999-9898-069e-1daf-8a4c83f71f93.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3762085/c6206ee3-b877-de3c-8e54-7ca1012692d3.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3762085/78a872d3-61f5-fc16-3984-f171caad18d3.png)

# 技術的な課題
新しい技術を学習したり、既存のシステムとの統合、パフォーマンスの最適化など、技術的な課題はエンジニアにとって重要です。

# テストチームとの課題
開発チームとテストチームの間には、しばしば認識のずれやコミュニケーションの問題が生じます。
•開発の初期段階からテストを組み込むことで、開発とテストの間のギャップを減らし、品質を向上させます。
•継続的インテグレーションと継続的デリバリー(CI/CD): 自動化されたテストをCI/CDパイプラインに組み込むことで、コードの品質を継続的に保証し、テストチームとのコラボレーションを強化します。
•テストチームとの定期的なミーティング: 定期的なミーティングを通じて、開発チームとテストチームの間のコミュニケーションを促進し、互いの期待を調整します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3762085/a54737ce-8e13-b51c-cfe1-f80e1ea18eaf.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3762085/81ef3d5f-b9ab-78b3-67c7-6ceac4d0c454.png)
上記の場合において、ONES.comプラットフォームでは、ONES ProjectとONES TestCaseを連携することで、より開発チームとテストチームのコミュニケーションが促進され、また、ONES Wikiを活用して情報共有することで、相互に信頼関係を築きながら、ソフトウェア開発に臨むことが可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3762085/139ce7c0-398c-2d4c-edbf-5fb4faa55bf2.png)

# まとめ：
ソフトウエア開発は、多くの部門も関係することも多く、より良いソフトウェアを開発して、デリバリーを継続するためには、様々な取り組みが必要となります。その際、ツールを活用することで、その取り組みをより推進することも可能だと考えております。プロジェクト管理ツールとテスト管理ツールの連携は、とてもスムーズだと感じました。。大体別会社の製品を組み合わせて使っているからか？　１社のプラットフォームの良さが活きている気がしました。
皆様もぜひ使ってみてください。
ONES.comのトライアルは下記からご利用できます。
https://ones.com/ja/
polars unique sort

```python
import polars as pl

# Assuming you have a DataFrame called 'df'
# Here's a sample DataFrame for demonstration
data = {'A': [1, 2, 2, 3, 4],
        'B': ['a', 'b', 'b', 'c', 'c']}
df = pl.DataFrame(data)

# Get unique values from column 'B'
df = df.unique(subset=['B'])
df = df.sort('B')
print(df)
```
AccessでクエリのSQLビューのフォント変更

# 概要

デフォルトだとこう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/95b9a86d-a07e-f5a2-851d-84483e5669db.png)

文字小さいし読みにくくて間違えやすいので、フォントの種類やサイズを変更します。

# やり方

『ファイル』。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/2abc2564-18a0-fba1-70ad-83c3e8752c28.png)

『オプション』。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/aab217a6-8af4-0398-6ada-dac4fd0efb7e.png)

『オブジェクトデザイナー』 ⇒ 『クエリデザインのフォント』。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/10e02981-9f6f-878d-13c4-9e52984e0db8.png)

こうすると…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/fc1f5ee5-cb76-dc37-565d-be6c042ab39c.png)

こうなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/4b40dcfa-5c39-645a-2ce3-0d44992ecc5b.png)

# 蛇足

https://qiita.com/waokitsune/items/dacb9688abfb0ac0e820

# 参考サイトさん

https://hamachan.info/access2019-querydesign/

# バージョン

Microsoft Windows [Version 10.0.19045.4170]
Microsoft Access for Microsoft 365 MSO (バージョン 2403 ビルド 16.0.17425.20124) 32 ビット
Ubuntu 22.04にSlack desktop app をダウンロードする

## Linux版Slackをダウンロード
以下リンク先のページを開きます

https://slack.com/intl/ja-jp/help/articles/212924728-Linux-%E7%89%88-Slack%EF%BC%88%E3%83%99%E3%83%BC%E3%82%BF%E7%89%88%EF%BC%89%E3%82%92%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89%E3%81%99%E3%82%8B

開いたページの先でダウンロードするのですが、.RPMではなく右下の.DEBをダウンロードします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2323577/0725acf2-5159-3792-61dd-597b0916f145.png)

ダウンロードしたファイルを「ソフトウェアのインストール」で開きます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2323577/82698a82-c0dc-1ad0-bd47-c787265ab049.png)

インストール完了したら検索して開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2323577/eb8d7c8b-5fbb-ef15-1ed7-08e60be5bd92.png)

開いたらログインして完了！！:grinning:
McAfeeエージェントで所定のフォルダに定期的にウイルス定義ファイルを取得する


![McAfeeエージェントで所定のフォルダに定期的にウイルス定義ファイルを取得する.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3754524/d2a70aa4-086f-a487-cb5d-b1f0579e3a02.png)




## 本記事で実現できること
McAfeeエージェント(McAfeeEndpointSecurity)で所定のフォルダに
定期的にウイルス定義ファイルを取得する

## 前提
- McAfeeEndpointSecurity導入済み

## 簡単な解説
全部で9フェーズ

①McAfeeSecurityEndpointを開く
![McAfeeエージェントで所定のフォルダに定期的にウイルス定義ファイルを取得する (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3754524/7fd5128e-b86a-de56-0b3b-0f67b6ce1095.png)


②右上のタブから[**設定**]をクリック
![McAfeeエージェントで所定のフォルダに定期的にウイルス定義ファイルを取得する (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3754524/427bd83c-c835-0fd8-e1f0-574a9ad91542.png)



③[**詳細を表示**]をクリック
![McAfeeエージェントで所定のフォルダに定期的にウイルス定義ファイルを取得する (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3754524/74ec8ee0-f365-d7d7-6dc6-09148bf11fbf.png)




④下部までスクロールし、タスクの[**追加**]をクリック
![McAfeeエージェントで所定のフォルダに定期的にウイルス定義ファイルを取得する (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3754524/17bba207-2cf8-3207-76f6-688ccd64eea2.png)




⑤タスクの追加画面で下記を設定して[**次へ**]をクリック
名前：[任意の名前を設定]
タスクの種類を選択：[**ミラーリング**]


![McAfeeエージェントで所定のフォルダに定期的にウイルス定義ファイルを取得する (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3754524/ef91fa8e-811d-a536-1c29-0bd1042f20cf.png)

⑥設定タブで下記を選択する
- 名前：[任意の名前を設定]
- ミラーリングの場所：格納したい所定のフォルダを選択
![McAfeeエージェントで所定のフォルダに定期的にウイルス定義ファイルを取得する (6).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3754524/74154a66-436e-29fb-0060-16bef1a90e6d.png)


⑦スケジュールタブにて下記を入力し、[**OK**]をクリック
- スケジュールを有効にする：チェック
- スケジュールの種類：
[取得したい頻度を選ぶ(毎日,毎週,毎月,1回,システム起動時,ログイン時,すぐに実行)]
- 頻度(日)：1日に取得する頻度を選択
- 開始日：いつから始めるか選択
- 終了日：終了日がある場合はチェックを入れ選択。
- 開始時間：開始時間を選択
- 実行に関して1度だけor 繰り返しの条件を選択


![McAfeeエージェントで所定のフォルダに定期的にウイルス定義ファイルを取得する (7).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3754524/a3886495-ec9b-c0f9-fa98-f4c8ac065eac.png)

⑧ミラーリングのタスクがスケジューリングされれば、設定完了。
![McAfeeエージェントで所定のフォルダに定期的にウイルス定義ファイルを取得する (8).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3754524/edb628a7-c815-eb79-b24a-987af8db001f.png)



⑨所定のフォルダに指定した期間で定期的にウイルス定義ファイルが取得される
![McAfeeエージェントで所定のフォルダに定期的にウイルス定義ファイルを取得する (9).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3754524/2ff17c08-9e34-5a70-338f-c4c494e1484d.png)

## まとめ
本稿が、McAfeeエージェントで所定のフォルダに定期的にウイルス定義ファイルを取得したい方の参考になれば嬉しいです。

ITエンジニア向け、AWS資格取得を目指す方向けに個人ブログで記事も投稿していますので、
合わせて読んでもらえると嬉しいです。
[ことなの学校(個人ブログ)](https://kotona-school.com)

更によりレベル感の高そうなAWS関連の発信はZennの方で行います。
こちらももしよければフォロー、ご確認いただけると嬉しいです。
[Zenn個人アカウント](https://zenn.dev/tomo_itbizblog)

Twitterでも役立つ情報を発信しますのでフォローしてもらえると嬉しいです 
→ [@tomo_ITBizBlog](https://twitter.com/tomo_ITBizBlog)
Ubuntu 22.04にNotion Desktop Appをインストールする

## Ubuntu22.04に追加する方法
自分の備忘録として書くつもりなので、間違っていたらすみません。

以下リンク先からダウンロード
https://snapcraft.io/notion-snap-reborn
右上の方のinstallを押して、出てくるコマンドをTerminalに打ち込むだけ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2323577/20b8d0a6-8220-6223-6cc7-70d9b1a4e24a.png)

打ち込むコマンドは以下
```
sudo snap install notion-snap-reborn
```

ダウンロード完了
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2323577/7d20880b-1d9d-3f3d-f010-8263de313bf2.png)

開きました:grinning:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2323577/44b4ca5c-2896-7d2b-7bae-6dc75938fcf4.png)



## ちなみに他の方法も載せておきます。(僕はうまくいかなかったですが...)
こちらもコマンドで実行します
```
echo "deb [trusted=yes] https://apt.fury.io/notion-repackaged/ /" | sudo tee /etc/apt/sources.list.d/notion-repackaged.list
sudo apt install notion-app-enhanced
sudo apt install notion-app
```
参考リンクhttps://dev.to/gabrieladnz/install-notion-on-ubuntu-1nj5

これでNotionのアプリがデスクトップに表示されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2323577/924fb517-50d9-d2d8-6888-f480b83e34dc.png)

でも一向に開かない...
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2323577/ceb5ea32-8193-01b0-5ba5-b61a4ac6a353.png)

そこで一度再起動して、もう一回起動を試みます。
再起動しても開かないので、この方法は断念しました。

なにか間違い等ありましたらコメントお願いします。
全宇宙でみれば大した事ない太陽だけど凄いぞ太陽って話

この地球に人類が現れてからずっと、人は星空を眺めて、そこに何があるのか思いを馳せてきました。

## ジェイムズ・ウェッブ宇宙望遠鏡
2021年末に次世代宇宙望遠鏡を打ち上げて、2022年に本格運用が開始しました。
作るだけで1兆円もしたジェイムズ・ウェッブ宇宙望遠鏡。直径約6.5㍍の鏡を使って、これまで見ることの出来なかったさらに向こうの宇宙を観測できるようになりました。

星空を眺め観測するのを仕事にしている天文学者たちは、これまでの常識がひっくり返る新しいことを、この望遠鏡で次々に見つけて、２０２４年春の今、夜な夜な大発見ラッシュお祭り騒ぎでパーリーピーポーになっているそうです。

## どうしてそんなに空を眺めるの？
人が空を眺めることに、こんなにしてまで情熱を傾けるのはなぜなのでしょうか？
それは宇宙に働いている力の真実を知りたいからです。そして今、人々はその秘められた力を知ってますます圧倒されています。

わたしたちもこうした科学的新発見の恩恵に預かっているわけですが、ここまでしなくても、あなたも空気の澄んだ夜空を眺めて満天の星空のあまりの美しさ力強さに圧倒されたことはありませんか？

### 太陽とか銀河とか
太陽のように自分で明るく光る星を「恒星」と言います。

夜空を見上げるとこの恒星がたくさんあり、無数の恒星が集まって銀河になります。
肉眼では雲のように見えたりします。それを星雲ともいいます。夏の夜空には天の川が見えたりしますが、これも星雲で、それが私達のいる「天の川銀河」です。

この天の川銀河の中にも恒星が無数にあって、多すぎるために数えることができません。
そんな数多の星の中で太陽のサイズはというと中くらいの大きさです。
中くらいの大きさの太陽ですが、その周りを回っている地球と比べてみましょう。

## 人がすっぽり入る巨大風船が太陽だったら
太陽の大きさをギューッと小さくして人をすっぽり包めるような大きな風船が太陽だとしましょう。

### そんな巨大風船サイズの太陽だったら、地球はこの１円玉ほどになります。

続いて太陽の重さを比べてみましょう。１円玉はピッタリ１㌘なので、1円玉だけを積み上げて富士山と同じ形で同じ大きさの山を想像してください。これで重さは2兆トンあります。2000兆㌔㌘になるので、金額は２００京円（日本GDP4000年）分あります。

こうして作った1円玉富士山を**1千万倍**してから**さらに1億倍**するとだいたい**太陽**になります。
もう訳がわかりませんね。

さらに太陽の周りを回っている惑星や月や小惑星を全部集めて重さを計算すると、
太陽は99.9％の重さで、残り0.1％が惑星とか月とか小惑星を全部ひっくるめた重さです。

宇宙空間ではたいしたことない太陽ですが、
地球に住む人類にとってはとてつもなく大きくて偉大な太陽です。

太陽の引力はもの凄く強く，
地球は太陽から1億5千万㌔離れた軌道をだいたい365日かけて1周します。

## 地球と太陽は1億5千万㌔離れているってどんだけ？
光は1秒間で地球を7回以上回れる速さです。
その同じ光が、太陽から放たれると地球に届くには8分以上かかります。
そして太陽が放つ光のたった20億分の1だけ地球に届きます。

### ハピタブルゾーン
それだけで地球を温めるのには十分なのです。しかも、地球がある位置は「ハピタブルゾーン」と呼ばれていて、とある科学者は、その位置「ハピタブルゾーン」に地球が存在する理由は偶然だとは、とても考えられないことだとしています。

## え！じゃあ誰かが作ったってこと？
あなたはどう考えますか？
春休み期間にアプリを3つリリースして学びと反省

## はじめに
春休み中にアプリをリリースする。という目標でFlutterを用いてアプリ開発を始めました。開発経験はほとんどなくデータベースなどの知識も０からのスタートでした。この記事は私が大学２年生の春休み期間中にアプリ開発を通して学びと反省のまとめとして作成しました。

## 目次
- [作ったアプリの説明](#作ったアプリの説明)
- [学びと反省](#学びと反省)
- [リリースはしていないけど作ったアプリ](#リリースしてはいないけど作ったアプリ)
- [終わりに](#終わりに)

## 作ったアプリの説明
#### 1. カバンの中身 - What’s new bag? 制作期間 4週間
ガジェット系Youtuberがカバンの中身を紹介するコンテンツを見るのが好きで、自分のカバンの中身を紹介したり、人のカバンの中身を見て新しいガジェットを発見できたら面白そうと考え開発したアプリです。

https://apps.apple.com/jp/app/カバンの中身-whats-in-my-bag/id6477269413

![GGF96lwbYAAoQhP.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1281785/4d67e0e0-b1be-09e6-fd91-e4533eedca95.jpeg)


#### 2. スタディタスク 制作期間 1週間半
復習もできるToDoリストがほしいと思って作ったアプリ。タスクを完了するとタスク名に関する問題をChatGPTが出題してくれるアプリ。OpenAIのAPIを使って開発しました。

https://apps.apple.com/jp/app/スタディタスク-todoリスト-ai作問/id6478274039

![GHaUcePbwAACkxv.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1281785/3e9639dc-69cb-cdd2-3ad3-09e294a9af5a.jpeg)


#### 3. キースイッチ　サウンド　制作期間 半日
キーボードをカチカチするだけのアプリ。最初は自分用に作ったが意外とキーボードの音が好きな人は多いかもしれないと思いリリース。

https://apps.apple.com/jp/app/キースイッチ-サウンド/id6480108344

![GJzk2GaaAAAdXuA.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1281785/feddd393-06db-f70a-e355-a5255292a76b.jpeg)


## 学びと反省
#### ・ 既存のアプリ ＞ 開発したアプリ になってしまった
カバンの中身の物を撮影してアップロードすると第三者が見ることができるという流れでアプリを作りました。ですが、Xやinstagramでも同じことができる。またユーザー数も多い。
既存のアプリに被ることはあっても他のアプリには無いものを考えるべきだった。

#### ・ 機能を盛りだくさん
最初に開発した「カバンの中身-What’s new bag?」では課金機能、いいね機能、ハッシュタグ検索機能、通知機能などユーザーが増えてからアップデートして追加すれば良いものをリリース前に実装してしました。結局使って貰う人がいないと無駄な時間になってしまう。

#### ・ 作っているアプリを説明できない
友人にどのようなアプリを作っているのかを聞かれたが上手く説明できなかった。自分が説明できないアプリを他の人が見てダウンロードしてもらえるはずがない事に気づいた。

#### ・ SNSの反応をおろそかにしてしまった
「カバンの中身」アプリのリリース報告するとカバンの中身界隈の方かアプリにいくつかの反応をもらえました。だがこれを私は当たり前のことだと思ってしまった。２つ目のアプリをリリースして自分の作ったアプリについて言及してもらえるのはとても貴重なことだと後になって知った。

#### ・ 自分が使わないアプリを作ってしまった
無理やりアイデアを考えたせいで、アプリをリリースしたが一週間もしないうちに使うのをやめてしまった。

#### ・自分の当たり前で考えない
カバンの中身のアプリを例に出すと、自分の考えが一般的なものとは限らないことに気付きました。自分はガジェットが好きで一つ一つのものを厳選してお気に入りのものを使う考えを持っていたけど他の人はそこまで思っていない。そこに気づくべきだった。一度自分のアプリを第三者の視点で見ることが必要と学んだ。


## リリースはしていないけど作ったアプリ
#### 1. ニュースアプリ
自分の見たいジャンルのニュースだけを集めたアプリがほしいと思って開発

<img width="200" alt="スクリーンショット 2024-04-04 10.53.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1281785/c062dc78-7980-2b4a-3db3-6b0f4a99d65c.png">

<img width="200" alt="スクリーンショット 2024-04-04 10.53.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1281785/714c16e9-389f-e6f9-3f62-8e462e25f9ab.png">

上の画像のように自分の好きな記事を追加できる。

#### 2.地図を使った習慣化アプリ
位置情報を使用して選択した範囲に入るとタスクを完了できるアプリ。
<img width="300" alt="スクリーンショット 2024-04-04 11.06.17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1281785/cb9013bb-b2f5-a00b-9afd-f8c4e7ea4aa9.png
">

## 最後に
アプリ開発を通して多くの学びと反省がありました。ですが春休みという短い期間にFirebaseを使ってSNSアプリを作ったり、内部課金の実装の仕方、広告の表示、アプリストアにアプリをリリースするなど多くの経験ができました。これは自分にとって大きな経験だと思います。これを将来エンジニアになるうえで活かしていきたい。
[Joke] 最大の圧縮率のファイル圧縮プログラムtmcomp

tmcomp.c
tmcompはどんなに大きいファイルでも最小のファイルサイズに圧縮する圧縮プログラムです。非可逆圧縮で、一旦圧縮したファイルは再現できません。
cc tmcomp.c -o tmcompとしてコンパイルしてください。
実行は、./tmcomp fileとします。
実行するとファイルを出力し、メッセージを出して終了します。元のファイルは削除しません。
複数のファイルを圧縮する場合にはarを使って一旦アーカイブしたものを圧縮します、

ar q file.a file1 [file2 ...]
./tmcomp file.a

圧縮が終わった出力ファイルは0バイトの長さを持ち.tmcの拡張子を持ちます。
圧縮率はファイルサイズが0の場合は1、その他の場合、無限大です。
どんなに大きいファイルでも0バイトに圧縮できる世界最小圧縮サイズのソフトです。

```tmcomp.c
#include    <stdio.h>
#include    <stdlib.h>
#include    <string.h>
void main(int argc,char *argv[]) {
    if (argc!=2) {
        fprintf(stderr,"Usage tmcomp file\n");
        exit(1);
    }
    char s[256];
    strcpy(s,argv[1]);
    FILE *ifp=fopen(s,"rb");
    if (ifp==NULL) {
        fprintf(stderr,"Source file open error.\n");
        exit(1);
    }
    strcat(s,".tmc");
    FILE *ofp=fopen(s,"wb");
    while(!(fgetc(ifp)==EOF));
    fclose(ofp);
    fclose(ifp);

    fprintf(stderr,"Compression successfully completed.\n");
    fprintf(stderr,"output file written.\n");
}
```
Vimコマンドの考え方覚え方について

# この記事について
Vimを使用して普段開発しているのですが、先輩に勧められたテキストを読んでvimコマンドの考え方が今までと変わったので考え方について書いていきます。
その他テキストから知って便利だったプラグインを紹介します。

https://amzn.asia/d/9Bg16yY

# 考え方
コマンドの実行は主に暗記に頼っていました。例えば、dwがwで「word（単語）」を表すため、単語を削除するコマンドだという程度の理解でした。特に、dibやci"のようなコマンドは完全に暗記して使用していました。

しかし、本来はそんな覚える必要はなくものすごく直感的なコマンドでした。
https://vimdoc.sourceforge.net/htmldoc/motion.html
```sh:delete
	"dl"	delete character (alias: "x")		|dl|

	"diw"	delete inner word			*diw*

	"daw"	delete a word				*daw*

	"diW"	delete inner WORD (see |WORD|)		*diW*

	"daW"	delete a WORD (see |WORD|)		*daW*
	"dd"	delete one line				|dd|

	"dis"	delete inner sentence			*dis*

	"das"	delete a sentence			*das*

	"dib"	delete inner '(' ')' block		*dib*

	"dab"	delete a '(' ')' block			*dab*

	"dip"	delete inner paragraph			*dip*

	"dap"	delete a paragraph			*dap*

	"diB"	delete inner '{' '}' block		*diB*

	"daB"	delete a '{' '}' block			*daB*
```

例えば、dib（delete inner block）は括弧()内のテキストを削除し、da"（delete around quotes）は引用符""とその中身を削除します。

これらのコマンドはd{motion}形式で表され、y{motion}でテキストをコピーし、c{motion}でテキストを削除してから挿入モードに入る、という操作が可能です。

また、df{char}（delete find character）を使えば、指定した文字xを含む箇所まで削除でき、dt{char}（delete till character）では、指定した文字xの直前までを削除できます。

# プラグイン

### tpope/vim-surround
S"コマンドは、ビジュアルモードで選択したテキストを引用符"で囲みます。
cs'"コマンドは、すでに'で囲まれたテキストを見つけ、その'を"に置換します。

https://github.com/tpope/vim-surround

### vim-commentary

gc{motion}コマンドは、指定した範囲をコメントアウトします。
gccコマンドはカーソルが位置する1行をコメントアウトします。

https://github.com/tpope/vim-surround

## 最後に
普段JetBrainsを使用してvimを使用しています。
便利なコマンド、プラグインがあればコメントで教えてください。
Windows Terminalで、Git for WindowsやCygwinのbashを使いたい

# What's？

Windows Terminalで、Git for WindowsやCygwinのbashを使いたいということで。

# 環境

Windows Terminal 1.19.10573.0

# Git for Windows

「設定」 → 「プロファイル」 → 「新しいプロファイルを追加します」で追加。

設定値。

| 項目名 | 設定値 | 備考 |
|:------|:-------|:----|
| 名前 | Git Bash | 表示名なのでお好みで |
| コマンドライン | `C:\Program Files\Git\bin\bash.exe  --login -i` | `C:\Program Files`以外にインストールした場合は適宜変更、`--login`（または`-l`を指定しないと`.bash_profile`等を読まない） |
| 開始ディレクトリ | `%USERPROFILE%` | 「親プロセス ディレクトリの使用」のチェックを外すとこの値になる |
| アイコン | `C:\Program Files\Git\mingw64\share\git\git-for-windows.ico` | `C:\Program Files`以外にインストールした場合は適宜変更 |

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309669/5c2c60a8-4852-cb2e-3145-22275e4b04b0.png)

設定したら「保存」。

## 補完時の画面のチラつきを止める

この設定だけだと、タブやCtrl-iで補完をしようとした時にとてもチラつきます。

これを止めるには`$HOME/.inputrc`というファイルを作成し、以下のように定義します。

```bash:.inputrc
set bell-style none
```

# Cygwin

基本的にはGit for Windowsのbashと似たようなものになります。

| 項目名 | 設定値 | 備考 |
|:------|:-------|:----|
| 名前 | Cygwin | 表示名なのでお好みで |
| コマンドライン | `C:\cygwin64\bin\bash.exe --login -i` | `C:\cygwin64`以外にインストールした場合は適宜変更、`--login`（または`-l`を指定しないと`.bash_profile`等を読まない） |
| 開始ディレクトリ | `%USERPROFILE%` | |
| アイコン | `C:\cygwin64\Cygwin.ico` | `C:\cygwin64`以外にインストールした場合は適宜変更 |

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309669/3419ef85-d6bb-f69a-29c6-af8d86cb5c5c.png)

設定したら「保存」。

これでGit for WindowsやCygwinのbashがWindows Terminalで使えるようになります。
[Makefile] shellコマンドの実行結果をmake変数として使う

ちょっと詰まったのでメモ。

## TL;DR



```sh
# 定義。:= は即時実行。 = は参照のたびに遅延実行。
make変数名 := $(shell 実行コマンド)

# 参照
$(make変数名)
```

## 例

```makefile

ORIGINAL_BRANCH := $(shell git rev-parse --abbrev-ref HEAD)

.PHONY: dev-deploy
dev-deploy:
	git checkout development
	git reset --hard $(ORIGINAL_BRANCH)
	git push -f
	git checkout $(ORIGINAL_BRANCH)
 ```
専門家の知識を持つChatBotを作ってみる

できるかどうか分かりませんが、専門家の知識を持つChatBotを作っていきたいと思います。うつの治療のための臨床心理の知識を持ったChatBotを作りたいです。ゴールは「世界からうつをなくす」です。
知識も不十分なので、学びながらの実装・検証となる予定です。どこから手を付けてよいのか分からないので、とりあえずマイルストーンを考えてみました。もっと簡単な方法があったら誰か教えてください。
マイルストーンは以下の通り：
### 最新の対話モデルの論文を読んでみる
知識グラフを使って専門家知識を持つChatBotを作りたいので、まずは勉強。ここで力つきるのかも。
https://arxiv.org/pdf/2012.14827.pdf

### Transformer等の言語モデルの実装
言語モデルの実装が分からないので、MOOCで学んでみる。DeepLearning.AIで無料のコースがあるので、これで勉強だ。DeepLearning.AIはeラーニングで有名なCourseraを立ち上げたAndrew Ng博士が作った会社だ。私は、このCouseraのMachine Learningコースを三回も繰り返して勉強した。本当にNg先生にはお世話になった。Ngは英語で[ɪŋ,イン]と読むそうだが、私はふざけてウングと読んでいます。広東語（あるいは福建語）の音節を為す鼻子音なので、むしろ日本語の[ン]に近いのではないかと思います。

* Transformerなどの言語モデルの扱い方のコース
Open Source Models with Hugging Face
https://www.deeplearning.ai/short-courses/open-source-models-hugging-face/

* 知識グラフ（Knowledge Graph）の実装・使用法についてはこちらで学ぶこととする。
https://www.deeplearning.ai/short-courses/knowledge-graphs-rag/
* RDFやSparQLも使ってみたいが、RDFは、Webとの連携があり、ちょっと大枠なので、知識グラフ間の橋渡しに使うべきなのかなと思ったりもする。

## データベース、知識グラフの定義などしてみる

## Webとの連携
これがよく分かんないんだよなあ。
STEP: 5 複合的な条件を指定して取得しよう (Part 2)

https://paiza.jp/works/mondai/sql-new-primer-03_drill/sql-new-primer-03_drill__0804

これ、なかなかいい問題だなと思ってて、コードにしたら全然たいしたことない簡単なものだけど、
今までSQLを書いた結果がどうなっているのか？というデータを読んで次にどう書けば正しいのが出てくるかを推測しないといけないということで。
周りの皆さんにもおすすめしたい良い問題だなと思いました。

定期的に復習しときたい問題なので、記事にしました笑
コードはそんなに難しくないんで、ここでは書きませんが。

SQLはまあ大体できるんですが、Paizaラーニングにもあるので、Pythonの問題を解く傍らでSQLは簡単だけど問題が多いので、気長に解くと良いかなと思っています。
多いっちゃ多いけど、SQLを書くのに慣れるという意味では良いのかなと思っています。
SQLはプログラミングと同じでたくさん書かないと身につかないので。。。
AWS CLIでのRDS for MySQLを構築する

## 早速コマンドを見せます

要件によって変わってくるオプションもありますが必要最小限の設定を指定してDBインスタンスを作成します。
``` bash
aws rds create-db-instance \
	--allocated-storage <ストレージ容量> \
	--backup-retention-period <自動バックアップが保持される期間> \ 
	--ca-certificate-identifier <認証機関> \
    --db-instance-identifier <DB識別子> \
	--db-instance-class <インスタンスクラス> \
	--db-name <DB名> \
	--db-subnet-group-name <サブネットグループの名前> \
	--engine <エンジン> \
	--engine-version <エンジンバージョン> \
	--kms-key-id <暗号化に利用するkey> \
	--master-username <マスターユーザー名> \
	--master-user-password <マスターユーザーで利用するパスワード> \
	--vpc-security-group-ids <VPCセキュリティグループ> \
	--copy-tags-to-snapshot \ # スナップショット取得時にタグをコピーするかどうか
	--deletion-protection \ # 削除保護
	--no-auto-minor-version-upgrade \ # 自動マイナーバージョンアップをするかどうか
	--storage-encrypted # ストレージの暗号化
```

例
``` bash
aws rds create-db-instance \
	--allocated-storage 20 \
	--backup-retention-period 1 \
	--ca-certificate-identifier rds-ca-rsa2048-g1 \
	--db-instance-identifier test_instance \
	--db-instance-class db.t3.micro \
	--db-name test_db \
	--db-subnet-group-name testsubg \
	--engine-version 8.0.35 \
	--kms-key-id arn:aws:kms:ap-northeast-1:xxxx:key/xxxx \
	--master-username admin \
	--master-user-password password \
	--vpc-security-group-ids sg-xxxx \
	--copy-tags-to-snapshot \
	--deletion-protection \
	--no-auto-minor-version-upgrade \
	--storage-encrypted
```

作成後に利用できる状態になっているかを確認するコマンド

``` bash
aws rds describe-db-instances --db-instance-identifier <インスタンス識別子> --query 'DBInstances[*].DBInstanceStatus'
```
`available`と返ってくれば利用可能です。

## なぜCLIで作るのか？
サクッと作るのであればAWSのマネジメントコンソール(以下：マネコン)上から作成した方が早いと思います。
ですが、作成手順をマネコンベースでまとめてしまうとUIの変更によって確認する場所や手順が変わってしまいます。その都度手順を更新するのは正直手間です。
![computer_manual_woman.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/572072/f7e5d759-ccfa-07fe-7ddb-0d0eeb03ca4a.png)

そこでCLIを利用することで先ほどの課題は解消されると考えてます。
AWS CLIのバージョンが変わったとしても破壊的変更がなければCLIでまとめた手順は最小限の更新コストで済みます。
![setsumeisyo_man.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/572072/b62d148a-aafb-ed56-3e72-5212738a2e70.png)

[AWS CLIのドキュメント](https://docs.aws.amazon.com/cli/latest/)も充実してますが、最近ならAIにコマンドを書いてもらい必要に応じて修正すれば簡単に作成できます。

## まとめ
個人的には手順書を作成するならAWS CLIでの構築手順をお勧めします！
「Error: Failed to load parser 'babel-eslint' declared in '.eslintrc': Cannot find module 'babel-eslint'」が出た場合

## はじめに
`git commit`しようとすると、タイトルのエラーとなったのでその対処。


## 検証環境

```shell
sw_vers
ProductName:	macOS
ProductVersion:	11.6.1
BuildVersion:	20G224
```

## 結論


```shell
npm install eslint babel-eslint --save-dev

```

単にbabel-eslintがインストールできていなかったことが原因だった。
Kubernetes+Golnag+gRPC+Terraformでクライアントからサーバーに接続する方法

クライアントからサーバーにgRPC接続する際に以下のようなコードを書くと思います。ローカル環境で開発する際はSERVER_URLとしてlocalhost:ポート番号を指定すれば良かったのですが、Kubernetesにデプロイする際に何を指定すればよいのかについて説明します。terraformで構築するものとして説明します。

```golang:client.go
	conn, err := grpc.Dial(os.Getenv("SERVER_URL"), grpc.WithTransportCredentials(insecure.NewCredentials()))
```
# 解決法
まず、サーバー側のアプリケーションのサービスを以下のように作ります。「cluster_ip = "None"」とするのが重要です。自分は「type = "NodePort"」としていて色々試してずっとうまくいきませんでし。。。
```terraform:server_service.tf
resource "kubernetes_service_v1" "server_service" {
  metadata {
    name = "server-service"
    namespace = "namespace1"  
        ・
        ・
        ・
      spec {
        ・
        ・
        ・
        port {
          name        = "http"
          port        = 80
          target_port = 8000
        }
        cluster_ip = "None"
        ・
        ・
        ・
      }
  }
}

```
次に、クライアント側のSERVER_URLの環境変数を以下のように設定します。

```terraform:client_deployment.tf
resource "kubernetes_deployment_v1" "client_deployment" {
      metadata {
        name = "client_deployment"
        namespace = "namespace1"    
        labels = {
          app = "client_deployment"
        }
      } 
    ・
    ・
    ・
   spec {
    ・
    ・
    ・
    template {
    ・
    ・
    ・

      spec {
    ・
    ・
    ・
       container {
    ・
    ・
    ・
  
          env {
            name = "SERVER_URL"
            value = "server-service.namespace1.svc.cluster.local:8080"
          }
    ・
    ・
    ・
}

```
以上でKubernetesでもgRPC通信ができるようになりました。

# 参考
https://kubernetes.io/docs/concepts/services-networking/service/
Microsoft Fabric workout - Lakehouse - Date types

扱うデータ型は重要だ。まずは多くつかうであろうデータ型とは？って考えた。

# Dataflow Gen2 → Lakehouse
Destination type は Power BI セマンティックのモデルのデータ型と一致するようだ。
|Power Query|Destination type|SQL name|pyspark.sql.types|
|:--|:--|:--|:--|
|type text, Text.Type|Text|STRING|StringType()|
|type number, Number.Type|Decimal number|DOUBLE|DoubleType()|
|type date, Date.Type|Date|DATE|DateType()|
|type datetime, DateTime.Type|Date/Time|TIMESTAMP|TimestampType()|
|type datetimezone, DateTimeZone.Type|-||
|type time, Time.Type|-|||
|type duration, Duration.Type|-||
|type logical, Logical.Type|True/False|BOOLEAN|BooleanType()|
|type binary, Binary.Type|-|||
|Decimal.Type|Decimal number|||
|Int64.Type|Whole number|BIGINT, LONG|LongType()|
|Int32.Type|Whole number|INT, INTEGER|IntegerType()|
|Int16.Type|Whole number|SMALLINT|ShortType()|
|Int8.Type|Whole number|SMALLINT|ShortType()|
|Currency.Type|Currency|DECIMAL(19, 4)|DecimalType(19, 4)|
|Percentage.Type|Percentage|DECIMAL(34, 6)?|DecimalType(34, 6)?|
|type table, Table.Type||-||
|type record, Record.Type|-|||
|type list, List.Type||-||
|type any, Any.Type||-||
|type anynonnull||-||


```text:Power Query
let
    Source = Table.FromRows(
        {{
            "0", 0, #date(2024, 4, 4), #datetime(2024,4,4,10,50,30),
            0, 0, 0, 0, 0, 0, 0, 0
        }},
        {
            "TextType", "NumberType", "DateType", "DateTimeType",
            "LogicalType", "DecimalType", "Int64Type", "Int32Type",
            "Int16Type", "Int8Type", "CurrencyType", "PercentageType"
        }
    ),
    ChangedType = Table.TransformColumnTypes(
        Source,
        {
            {"TextType", Text.Type},
            {"NumberType", Number.Type},
            {"DateType", Date.Type},
            {"DateTimeType", DateTime.Type},
            {"LogicalType", Logical.Type},
            {"DecimalType", Decimal.Type},
            {"Int64Type", Int64.Type},
            {"Int32Type", Int32.Type},
            {"Int16Type", Int16.Type},
            {"Int8Type", Int8.Type},
            {"CurrencyType", Currency.Type},
            {"PercentageType", Percentage.Type}
        }
    )
in
    ChangedType
```
```python:PySpark : Runtime 1.2
spark.sql("desc DataTypes").show(truncate=False)
```
```text
+--------------+-------------+-------+
|col_name      |data_type    |comment|
+--------------+-------------+-------+
|TextType      |string       |null   |
|NumberType    |double       |null   |
|DateType      |date         |null   |
|DateTimeType  |timestamp    |null   |
|LogicalType   |boolean      |null   |
|DecimalType   |decimal(34,6)|null   |
|Int64Type     |bigint       |null   |
|Int32Type     |int          |null   |
|Int16Type     |bigint       |null   |
|Int8Type      |smallint     |null   |
|CurrencyType  |smallint     |null   |
|PercentageType|decimal(34,6)|null   |
+--------------+-------------+-------+
```
# 思ったこと🙄
Dataflow Gen2 / Direct Lake mode のことを考慮すると、データ型使い分けの詳細を知ろうとするのは後回しで充分。


# その他
https://powerbi.connpass.com/

https://www.microsoft.com/en-us/power-platform/products/power-bi

https://www.microsoft.com/en-us/microsoft-fabric
wsl2でpvserver(paraviewのサーバー)をインストールして，ローカルPCからリモートで接続する

## はじめに

今回は，windowsのwsl2環境で生成されたvtkファイルを可視化するために，wsl2（ubuntu）にpvserverをインストールする手順をまとめました．

余談ですが，wsl2はwindowsとはほとんど完全に切り離された仮想環境なので，ファイルのやり取りが意外と大変です．デフォルトの設定では，windows側のcストレージを/mnt/c/でマウントしていますが，このディレクトリを普段使いするのは，主にスピードの点で問題があると感じました．

そこで，今回はwsl2側をサーバー・windows側をクライアントとしてsshでつないでしまうことにしました．


## サーバー（wsl2）側の設定

### sshのインストール

[参考](https://www.kkaneko.jp/tools/server/pubkey.html)

### OpenGLのインストール

[参考](https://www.kkaneko.jp/tools/server/pubkey.html)

### pvserverのインストール

paraviewを公式から落としてきます．Linuxタブから**ParaView Server for Headless Machines**と書かれているところからダウンロードします．～egl～.tar.gzと～osmesa～.tar.gzの２種類がありますが，積んでいるGPUによほど問題がなければeglを選びます．osmesaについては，昔書いたこちらの[記事]((https://qiita.com/dwatanabee/items/cf6b5e28974e9341eb53))も参考にしてみてください．

![スクリーンショット 2024-04-04 114907.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1035656/28e7a496-535e-bbc3-1759-e3fa2e6421fb.png)

ダウンロードが終わったら，wsl2にtar.gzを移動させて解凍します．
binの中にあるものを確認した後，それをローカルにコピーさせることでインストールします．

~~~
tar -zxvf <your paraview>.tar.gz
#インストールする物の中身を確認
cd <your paraview>/bin
cd ..
sudo cp -rf <your paraview>/bin/* /usr/local/bin
~~~

同様に，lib,shareの中身も/usr/local/lib, /usr/local/shareにコピーします．

~~~
cd <your paraview>/lib
cd ..
sudo cp -rf <your paraview>/lib/* /usr/local/lib
cd <your paraview>/share
cd ..
sudo cp -rf <your paraview>/share/* /usr/local/share
~~~

端末を再起動して,以下のコマンドを打つことで，下のような待機状態になれば成功です．
"12345"の部分は，最初が1の，好きな５桁の数字を入れてください．

~~~
pvserver --server-port=12345
~~~


 ~~~
Waiting for client...
Connection URL: cs://<your computer>:12345
Accepting connection(s): <your computer>:12345
 ~~~

 ## クライアント側の設定

まず，"サーバー側（wsl2）側の設定"で落としてきたバージョンと同じバージョンのparaviewを落としてきます．そのとき，こちらは普通のGUI付きのものを選んでください．

インストール＆起動した後，左上のボタンを押します．

"Add Server"をクリックし、Name（任意）、Server Type（Client / Server）、Host（サーバ名．基本的にlocalhostのままで良い．）Port（先程設定したポート番号…12345など）を指定し、Configure後Saveします．

最後に，"connect"を押して１０秒ほど待ち，左上の"built-in"が"リモート先のマシン名"になったら接続成功です．
【ChatGPT＋DALL-E3】編集機能のお遊び２。


　どうも、カーブミラーです。

　今回もDALL-E3の編集機能で遊びます。

:::note info
本記事は、ChatGPT（有料版）
＋DALL-E3で行なっております。
画像はあります。　あしからず。
:::

　DALL-E3の編集機能ですが、
　　インペインティング機能とか
　　インペイント機能とか
　　　呼ぶようですね。

　とりあえず、
　　この編集機能ですが、
　　　Web版、Android、iOSで
　　　　利用可能になるそうです。
　　　　　順次開放されます。

　それから
　　GPTsのDALL-Eも
　　　機能アップしています。

　スタイルとアスペクト比を
　　指定できるようです。
　　　プロンプトに
　　　　追記するだけですけどねw
***
　私はAndroidのアプリ版を
　　使うしかありませんね。
　　　パソコンはないし、
　　　　PC版サイトにしたら
　　　　　スマホじゃ
　　　　　　見づらいですから。
***
　編集機能のEditは
　　リトライするので、
　　　結局あまり意味がありません。

　今回は、Selectのみです。

　まずは、
　　元画像として、こちら。
![1712199343316.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457238/88e6be90-9aa7-dcb9-8e0e-18a6b6daf149.jpeg)

　両腕を塗りつぶして、
　　“黒革ジャケットを着せて”と入力。
![1712199356073.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457238/76c7e9a3-d566-fa3f-9df0-8a5399c36364.jpeg)

　うん、うまくいきますね。
***
　それで、
　　いつものように
　　　英文プロンプトを
　　　　出させたんですが、
　　　　　妙に短い。

　よくよく見ると、
　　上記の編集を
　　　行なった部分だけの
　　　　プロンプトでした。

　こちらとしては
　　全体のプロンプトが
　　　欲しかったので、
　　　　これは困りました。

　結局、
　　画像をロングタップして
　　　ポップアップメニューから
　　　　“Copy Prompt”をタップして
　　　　　クリップボードに
　　　　　　コピーすることに。

　まぁ、
　　もっと前から、
　　　この機能はありますが、
　　　　私は使っていませんでした。

　Web版にもあるのですが、
　　スマホで使っていると、
　　　Promptをコピれなくて。
　　　　それで“英語プロンプト出力”を
　　　　　使ってきたわけです。
***
　それはさておき、
　　次の案件です。

　画像生成をしていると、
　　ときおり余分な部位が出てきます。

　腕や足や手の指が
　　多く出てくる、というヤツです。

　これもSelectで
　　消せますよ👍

　元画像はこちら。
![1712199595016.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457238/4a70066b-fbf0-0281-b03e-a7e791e080ab.jpeg)

　ポケットに突っ込んでいる手を
　　塗りつぶして、“腕を消して”と
　　　入力します。
![1712199605399.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457238/f634f386-0528-87b3-2c6f-ac43b479acf5.jpeg)

　うん、消えましたね。

　ただ、
　　このSelectでも
　　　消せないものが
　　　　ありました。

　こちらです。
![1712199368865.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457238/cb9c27ea-5ca8-7b87-fb2d-20a93901b1e9.jpeg)

　背景の白い板がありますが、
　　塗りつぶして消そうとしても
　　　ちょっとサイズが変わるだけ。

　人物以外を
　　塗りつぶしても
　　　ダメでした。

　Promptを確認すると、
　　オブジェクトとして
　　　記述があります。
　　　　（どこの時点で入った？）

　そこを削除すればいい、
　　のですが、そうなると
　　　リトライされて、
　　　　全身の描画ができなくなる
　　　　　可能性があり、
　　　　　　諦めました。

　時と場合によって
　　諦めねばならないときも
　　　ありますよね(泣)
***
　このことが、
　　みなさんの
　　　作品制作の糧に
　　　　なれば、幸いです。

　今回は、ここまで。

PS.
　金土日と
　　また企画を催します。

　明日、発表しますね😄
【G検定】「人工知能分野の問題」を学習してみた

引っ越しやら新生活やら何やらで、前回から学習期間がずいぶんと空いてしまいましたが、学習を再開しようと思います。

# 参考書籍
**・深層学習教科書 ディープラーニング G検定(ジェネラリスト)公式テキスト**

# 学習内容
## 人工知能分野の問題
### トイ・プロブレム（おもちゃの問題）
　現実世界の問題を、コンピュータで扱えるように本質を損なわない程度に問題を簡略化したもの。

### フレーム問題
　1969年にジョン・マッカーシーとパトリック・ヘイズが提唱した人工知能における重要な問題。未だに本質的な解決がされておらず、人工知能研究の最大の難関である。
　フレーム問題とは、「**今しようとしていることに関係あることがらだけを選び出すことが、実は非常に難しい**」ことである。

#### チューリングテスト（人工知能ができたかどうか判定する方法）
　イギリスの数学者**アラン・チューリング**が提唱。
**別の場所にいる人間がコンピューターと会話をし、相手がコンピューターだと見抜けなければコンピューターには知能があるものとする。**

#### イライザ(ELIZA)
　1966年にジョセフ・ワイゼンバウムによって開発された。
精神科セラピストの役割を演じるプログラムで、人間とコンピューターが会話を行う最初のプログラムである。本物のセラピストと信じてしまう人も現れた。

#### ローブナーコンテスト
　1991年以降、毎年開催されるチューリングテストに合格する会話ソフトウェアを目指すコンテストである。

### 「強いAI」と「弱いAI」
　「**強いAI**」「**弱いAI**」という言葉は、アメリカの哲学者**ジョン・サール**が1980年に発表した「Minds, Brains, and Programs(脳、心、プログラム）」という論文の中で提示した区分です。この論文は人工知能に肯定的な哲学者との間に論争を引き起こした。

##### 強いAI： 
**適切にプログラムされたコンピューターは人間が心を持つのと同じ意味で心を持つ。また、プログラムそれ自身が人間の認知の説明である。**

##### 弱いAI：
**コンピューターは人間の心を持つ必要はなく、有用な道具であればよい。**

#### 中国語の部屋
　ジョン・サールは「強いAI」の実現は不可能であると説明するために提案した思考実験。
　ある部屋に英語しか分からない人が閉じ込められていて、その部屋の中には中国語の質問に答えることができるマニュアルがある。それを使えば、部屋の中の人は中国語で受け答えができる。これを繰り返すことで部屋の外の人は中の人が中国語を理解していると判断できる。しかし実際にはマニュアルを通して中国語で受け答えできただけであり、中国語を理解していることにはならない。従って、知能があるような受け答えをできるか調べるチューリングテストに合格しても、本当に知能があるかわからないという議論。

#### ロジャー・ペンローズ
　数学者の**ロジャー・ペンローズ**は「皇帝の新しい心ーコンピュータ・心・物理法則」という著書の中で、意識は脳の中にある微細な管に生じる量子効果が絡んでいるので、既存のコンピューターでは「強いAI」は実現できないと主張。

### シンボルグラウンディング問題（記号接地問題）
　1990年に認知科学者**スティーブン・ハルナッド**により議論されたもので、**記号（シンボル）とその対象がいかにして結びつくか**という問題。

### 身体性
　知能が成立するためには**身体が不可欠**であるという考え方がある。人間には身体があるからこそ、物事を認知したり思考したりできるという考え。このようなアプローチは **「身体性」に着目したアプローチ**と呼ばれている。

### 知識獲得のボトルネック
　**機械翻訳**は、人工知能が始まって以来ずっと研究が続いている。1970年代後半は**ルールベース機械翻訳**という仕組みが一般的だったが、1990年代以降は**統計的機械翻訳**が主流になった。しかしまだまだ実用レベルではなかった。機械翻訳が難しい理由は、コンピューターが「意味」を理解していないことが最大の理由でした。
　例えば、「He saw a woman in the garden with a telescope.」という英文を日本語に訳す場合、ほとんどの人は「彼は望遠鏡で、庭にいる女性を見た」と訳す。しかし統計的機械翻訳を使うと「彼は望遠鏡で、庭で女性を見た」という訳文になる。少し不自然に感じるのは、人間には「望遠鏡を持っているのは男性が多い」「庭にいるのは女性が多い」といった経験から生じる一般常識があるからである。
こういった知識をコンピューターに入れる必要がある。
　このように、1つの分を訳すだけでも一般常識がなければ訳せないということが、統計的機械翻訳の問題点である。このように、コンピューターが知識を獲得することの難しさを、人工知能の分野では**知識獲得のボトルネック**と呼ばれている。

#### ニューラル機械翻訳
　最近になって、ディープラーニングを使った**ニューラル機械翻訳**という技術が利用されるようになった。2016年11月にGoogleが発表したGoogle翻訳ではニューラル機械翻訳が利用されており、機械翻訳の品質が格段に向上した。

### 特徴量設計
　機械学習では **「注目すべきデータの特徴」の選び方**が性能を決定付ける。
たとえば、真夏のビールの売り上げを予測する場合、「気温」に注目する。このように、注目すべきデータの特徴を量的に表したものを、**特徴量**と呼ぶ。
　特徴量を見つけることが難しいのであれば、特徴量を機械学習自身に発見させればよく、このアプローチは**特徴表現学習**と呼ぶ。
　ディープラーニングは、**「特徴表現学習」を行う機械学習アルゴリズム**の1つです。
 　ディープラーニングに関するもう1つの視点は、**ニューラルネットワーク自身が複数ステップのコンピュータープログラムを学習できる**ということ。
  この視点に立てば、特徴量は入力データとは無関係で、**与えられた問題を解くために必要な処理（プログラム）に役立つ情報**が特徴量として抽出されていると考えられる。

### シンギュラリティー
　人工知能の分野で語られる **シンギュラリティー（技術的特異点）** とは、人工知能が十分に賢くなり、自分自身よりも賢い人工知能を作るようになった瞬間、無限に知能の高い存在を作るようになり、**人間の想像力が及ばない超越的な知性が誕生する**という仮説。
　未来学者で実業家の**レイ・カーツワイル**は、このようなシンギュラリティーが2045年という近未来であると主張している。

#### 特異点
数学や物理学でよく用いられる概念で、**ある基準が適用できなくなる点**のことを指す。
最近の個人的勉強法

# なにこれ？
このメモは、「個人的に効果があった勉強法を共有しよう」という考えで作りました。
やり方としては、
1.技術記事検索
2.Notionに説明文をコピペ、見やすく整理
3.説明を見ながらでいいので、学んだ技術を自分なりの言葉で紙に書き出す
4.シミュレーターなどで実際に使ってみる
5.わからないことをもう一度確認する
6.学んだ内容を何も見ずに、実装手順などをアウトプットしてみる

技術をある程度理解して一連の流れが終了したら次の技術へ…

Notionでいつでも参照できる自分専用の技術wikiを構築しつつ、アウトプットを最低三回繰り返す、という感じです。
朝起きた後、書いた紙やwikiを見返したり、朝食中にニュースを見ながらほわほわ思い出したり…
睡眠を挟み、次の日に簡単な復習をすることで、少し理解が進むと思います。

メリットとしては、情報整理の時間を圧倒的に短縮してアウトプットに移ることができます。
デメリットは、wikiの構築など、最初の一歩が重いことです。

私のように自分で書いた文字がわからないような人、学生時代に知識の断片をノートにまとめるのは面倒くさかった人、Notionの使いみちが思いつかない人など…
作った個人用wikiに毎日ページが増えていくだけでも充実感があるので、これと言った勉強フローが無かったりする人は参考にしてみてください。
もちろん、究極で万能の勉強法は存在しないので、鵜呑みにして自分のスタンスを崩すことがないようにお願いします。

以上です。

それぞれの実現したいことに向けて、お互い地道に頑張りましょう！

(勉強の合間にさくっと書いたので、訂正などあるかも)
情報学部 / 学科をオススメしたい人の特徴

# はじめに
先日，卒業判定で合格を頂くことができ，無事に情報学科を卒業することができました！これを機に何か関連した記事を書いてみたいということで，タイトルの内容について意見を書いてみたいと思います．

もっとも，これが参考になるのは主に高校生になるかと思いますが，果たしてQiitaを見ている高校生はどのくらいいるのでしょうか…？


# 論理的な思考が好きな人
プログラミング・コーディングで最も難しいポイントってどこでしょうか？
エラー対処？設計？など様々だと思いますが，共通して言えることは，いずれも「論理的思考」を要するという点だと思います．

実は，自分がコーディングすべき内容をしっかりと理解している状態でのコーディングは全く難しいものではありません．少し面倒なだけです．（個人的な意見）
それ以上に，課題の解決方法を模索している段階やエラーが発生してそれに対処している時が最も難しく，上級者との差が顕著な部分です．

実際，高校までは数学がそれなりにできたけど実は暗記で乗り切っていた！という人が，プログラミングに苦戦していることが多い印象を受けました．


# 情報系のトピックに興味がある人
プログラマは継続的な学習が必須である，といった内容の記事や動画がよく見られますが，それ以上に興味を維持できるかが大きな要因なのではないかと，個人的には感じています．（ごく稀に義務感のみで苦痛にさえ感じることを継続してのける人もいますが）
情報系のトピックに興味を持っている人は勉強しているという意識は無く，趣味の範疇で高度なことをやってのけます．実際，学友の1人は「カッコいいから」という理由だけでその分野の大会に参加していたりします．
何でも良いので，熱中できる情報系のトピックがある人には向いているのではないでしょうか？


# 粘り強い人
プログラマは何でもスマートに解決して泥臭いことは一切しないというイメージ（大袈裟）があるかもしれませんが，そんなことはまずありません．（ごく稀に恐ろしく簡単にやってのける人もいますが）

コードを書いている時間は全体の1, 2割程度で，コーディング以外の作業の方が圧倒的に多いです．この作業を粘り強くできる人が最終的に残ります．
折角，全体的な能力が高いのに，粘り強さが不足していることが原因で，中途半端になってしまっているのを何人も見てきました……


# 【補足】向いていない人の特徴
タイトルとはズレているため書くか迷ったのですが，どうしても挙げておきたい特徴があり，本章を設けました．

それは「実践的なスキルを身につけたいと考えている人」です．ここで言う実践的とは，学問以外の何か，くらいのふわっとした感じに捉えて下さい．（説明が下手ですみません！）
大学はあくまで「研究機関」なので，サービスを作ったり，ゲームを開発したりといったことは専門外です．もちろん，そういったことに取り組んでいる研究室もありますが，そういったことを期待するのであれば，おそらく専門学校が向いているのではないでしょうか？（間違っていたらすみません！）
ゲーム開発を専門に取り組む専門学校の方とご一緒する機会があったのですが，こと開発については大きな力の差を感じました．

ここまで言うなら「じゃあ大学で身につけることができるのは何なんだ」という話ですが，結論から述べると「情報学の体系的な理解」なのだと思います．
もちろん，大学ごとに掲げている教育理念（HPに大体載っています）がありますが，大まかには「情報学の体系的な理解」につながるのではないかなと思っています．
これを身につけることが「研究」に繋がるのでこうしたカリキュラムになっているのだろうと思います．

長々と書いてきましたが，何故ここまでこの項目に紙面を割くのかというと，（少なくとも私の周りでは）最もドロップアウトする原因だからです．
「思っていたのと違う」とか「もっと実践的なことがやりたかった」とか，そういった話をよく聞きます．これについてはどこの学部でもそうだと思いますが，やりたい事とカリキュラムのミスマッチは可能な限り避けた方が良いのかなと思います．


# 最後に
ここまで読んで頂いた方に，お礼を申し上げます．拙い文章ながら，感じたことや思ったことを書き綴ってみました．
他の方の記事を読んでいると，輝かしい経歴を振り返られている中，単に卒業しました！というだけの記事で恥ずかしい限りですが，頑張っていきたいと思います．
自分のサイト作成-遍歴001

# 自分のサイト作成の備忘録

## 技術選定

- Nuxt.js 3

現状はNuxt3に、いくつかのライブラリを導入して作成中
理想とするところは、APIサーバーやヘッドレスCMSなどの連携もしていきたい。

Nuxt3を選んだ理由は、仕事でReactを使用する頻度が高いものの
別の技術スタックにも触れていきたいことと、MVCモデルライクに書けそう
などの理由からNuxtを選定した。

### ライブラリ

Nuxt3では組み込みで入っているライブラリなどもあり、導入が非常に楽であった。

設定および、導入したもの一覧

- Nitoro
- PostCSS
- Vite
- ESLint
- ~~Prettier~~
  - ESLintによるチェックとPrettierによるフォーマットの議論がされていたようだが、フォーマットもESLintに任せるようになっていたため導入をしていない。
- Stylelint
- Vitest
- SCSS
- TailwindCSS
- Vuetify

まだまだ、使いこなせていないが、エラーなどが出ない感じになっている。
躓いたポイントとしては、Stylelintがちょっとしたことでエラーになったり、.vueファイルにダミーでもスタイルの記述が無いとエラーになる。
その他は、公式ドキュメントに従うことで概ね問題なく導入することができた。

## 開発状況

現在は、ホームページの作成がおおむね完了
ヘッダー、フッターのコンポーネントを作成していく。

## 備考

見よう見まねでサイトの作成をやっているが、サイト作成におけるセオリーについて調べたい。
音に合わせて動くサイトを作ってみる

まず 出来上がったもの

https://dondokodon.vercel.app/

# この記事は

webに関わってサイトを作っていくと、何か音と連携したサイト作りたいなぁとか思ったりすると思います。
ので作りましょうという話。
**いつかはやってみたいと思うやれを個人消化してく** 記事です〜

# 要件と結果

### 要件

- 音に合わせて何かを動かす
- 音は決めうちではなくてダイナミックに対応したい
- ちょっとパリピっぽくしたい

### 結果

- 音の解析は以下を使う
    - https://www.npmjs.com/package/music-tempo
- 音に合わせて gif を使う
    - https://giphy.com を使わせていただく
- デザインは自分の中でパリピを目指す
    - 自助努力、なんか虹色を使えばパリピっぽいやろ〜
- ローカルの素材をあげることを可能にしておく
    - お作法として
    - Gif のシェアも考えたが、権利的に責任持てなさそうなので一旦辞めとく
- VJ ツールっぽさを少し出す
    - ショートカット機能とかを持ち込む
- スマホなし
    - mp3 とか gif とかないやろ。ないよな？？
- サイト名は ドンドコドン - Dondokodon
    - かっこいい・・・

### ざっくり使用技術

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/68729/30d7b89b-7f0e-485a-5db4-78f1e2518911.png)

- Audio
    - music tempo
    - NCS (mp3 をサイトからダウンロード)
- Gif
    - omggif
    - giphy api
- Framework
    - Nuxt
    - zustand
- Infra
    - vercel

# 結果

https://dondokodon.vercel.app/

# 仕組みについて

基本 music-tempo のサイトを参照。
mp3 などのバッファをライブラリに渡すと曲の情報が返ってくる。
その中の beats という配列にテンポ相当の時間が詰まっている。
あとは曲の再生時間とその配列の値を見ながらイベントとして処理する。
ドンドコドンではこの時間を scale (x1 - x1/8)したり、 テンポの間を 0-1 で表現して gif の再生に利用したりしている。

詳しいコードを書こうと思ったが

```
const mt = new MusicTempo(audioData, {});
```

で事足りるので本当に良いライブラリだなと思う。
そもそもテンポの抽出については論文がライブラリ側に乗っけてある
https://www.eecs.qmul.ac.uk/~simond/pub/2001/jnmr.pdf
これについては、専門の方に解説していただきたい。ほんまにありがたい世の中。


# やってみた結果

楽しかった。意味がないサイトではあるが。ビートに合わせるというのはロマンあるな。
FB ももらうほどではない。あったら嬉しい。

テンポを取る部分が思った以上に簡単にできてしまったので、 UI とかその他の部分を少し凝り出してしままった。
omggif も良くできている。
gif の圧縮にも詳しくなれた気がする。フレームを先に全部レンダリングしておくとか、ちょっとコツがいる。

一つ、 NCS Music を使ったが、これが規約的には怪しいところではある。
本来動画の音楽だったらフリーで使えるようなスタンスのようです。ゲームに関しては無償であるなら良しというような規約もあったのですが、web siteならどうだ？というので、一応お金儲けを目的とはしてはいないところだが、怪しいと思っている。一応 コンタクトフォームから許可を得たいと思って相談をしたが、返事がない。そもそもコンタクトフォームもコマーシャルとしての使われ方を前提にした質問であるので困った。

あとは mp3 ってそもそも所有することなくなったなぁと思う。
なので spotify とかなんでもいいんだけど、 api 経由で曲のデータ取らしてくれないかな。beats のデータがあるだけでいいんだど(無茶苦茶言う)。
だから NCS は偉大だなって思う。

あとは、 gif をアップロードできるようにしたいなって思っている。が、権利関係が責任持てないなぁと思ったので迷っている。こう言うのは利用規約でカバーすればどうにかなるのかしら？

ノーデザイン + パッションだけ作ったが、結構良いなと思う。
ただデザイナの人にロゴとアドバイスだけもらった。ありがて〜

https://fontmeme.com/jfont/generale-station-font/
こんなフォント使うのも趣味的なサイトじゃなきゃないわけで。
いい機会だった。

## 宣伝

ノンコマーシャルじゃなくなるかもしれない。が
私は UNIBA と言う会社で働いていて、その中で Z1 と言うチームを運営してます。
こんなサイトをいつも作るわけじゃないけど、サイトに対して面白さだったり、使い心地だったりを常に考えているチームなので興味あったら一緒に何か作りましょう。



終わり
mise: バージョンを選んでmise useできるようにする方法

この投稿では「mise」をもっと便利に使う方法についてお話ししたいと思います。開発者の皆さんは、日々の作業でさまざまなツールやライブラリを使い分けていることでしょう。そんな時、**mise**がとても役立つツールです。しかし、特定のバージョンを使いたい時にいちいちバージョン番号を覚えておかないといけないのは少し面倒ですよね。今回は、そんな小さなストレスを解消する方法をご紹介します。

### miseとは

まず、「mise」とは何かについて軽く触れておきましょう。「mise」は開発環境において、さまざまなツールやライブラリのバージョン管理を簡単にするためのツールです。特に複数プロジェクトを同時に進めている場合、プロジェクトごとに異なるバージョンのツールを使い分ける必要があり、そういう時に「mise」は非常に便利です。

https://mise.jdx.dev/

### 課題「`mise use`でバージョンが思い出せない！」

具体的な使い方としては、`mise use ツール名@バージョン`の形式で特定のツールを有効化することが一般的です。しかし、この方法には小さな課題があります。それは、使用したいツールの**バージョン番号を正確に覚えておく必要がある**[^fuzzy]ことです。開発を進める中で、ぱっとバージョンが思い出せないことも少なくありません。こういうのが個人的にチリツモでストレスになるところです。

[^fuzzy]: `mise use --fuzzy [ツール名]@[メジャーバージョン]`でおおまかなバージョンを指定することも一応可能です。

### mise useを楽にする方法

この課題を解決するため、便利な関数を定義します。この関数を使えば、バージョン番号を覚えておかなくても、簡単に任意のバージョンを有効化することができます。

関数の定義は以下のようになります:

```bash
mise-select() { [[ -z "$1" ]] && return 1 || mise use "$1@$(mise ls-remote "$1" | sort -rV | fzf)" }
```

### 使い方

例えば、Node.jsのバージョン一覧から特定のバージョンを選んで`mise use`したい場合は、以下のようにコマンドを実行します。

```bash
mise-select node
```

実行すると、まずNode.jsのバージョン一覧が表示されます。ここで、**fzf**を使って表示された一覧から好きなバージョンを選ぶだけです。選択すると、そのバージョンのNode.jsが自動的に`use`されるようになります。めちゃ楽です。

動作の様子は↓動画のようなかんじになります。

<iframe width="560" height="315" src="https://www.youtube.com/embed/nsVHUkzdCyU?si=WOztASHhXmh-j6iJ" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

### 必要なもの

この方法を使うためには、**fzfコマンド**が必要です。fzfは、コマンドラインから簡単にリストをフィルタリングして選択するためのツールです。まだインストールしていない場合は、事前にインストールしておくことをお勧めします。

https://github.com/junegunn/fzf?tab=readme-ov-file#installation

Homebrewなら`brew install fzf`で入れられます。もちろん`mise use fzf@latest`でも入ります。

### おわり

この小さな工夫によって、日々の開発が少しでも楽になれば幸いです。`mise`の便利さをもっと活かして、快適な開発ライフを送りましょう！
AtCoder Beginner Contest 347参戦記録(A～C問題)

RubyでAtCoderに参戦した記録です。
AB2完で、C問題はコンテスト終了後に解説を見てからコードを書きました。もっとC問題解けるようになりたい…！

## [ABC347 A Divisible](https://atcoder.jp/contests/abc347/tasks/abc347_a)
長さNの配列Aと正整数Kが渡されます。配列Aの中からKの倍数のみを全て取り出し、それぞれをKで割ったものを昇順で出力する問題です。

```Ruby
n,k=gets.split(" ").map(&:to_i)
array=gets.split(" ").map(&:to_i).sort
result = array.select{|num| num % k == 0}
puts result.map{|s| s / k}.join(" ")
```
問題文の通りに実装したという感じですね。


## [ABC347 B Substring](https://atcoder.jp/contests/abc347/tasks/abc347_b)
文字列Sが与えられ、その中に含まれる部分文字列が何種類あるか出力します。
ここでの部分文字列とは、「連続する部分列」、たとえば「yay」という文字列の部分文字列は、「y」「ya」「yay」「a」「ay」の5種類となります。

```Ruby
s = gets.chomp
size = s.size
result = []
for i in (0...size)  # 部分列の先頭位置
  for j in (1..size-i)  # 部分列の末尾位置
    result << s.slice(i,j)
  end
end
puts result.uniq.size
```
文字列Sの部分文字列を全て配列resultに集め、最後にuniqで重複を取り除き、種類数を出力しました。

## [ABC347 C Ideal Holidays](https://atcoder.jp/contests/abc347/tasks/abc347_c)
N個の予定がそれぞれ今日から何日後にあるかの配列が与えられます。1週間が休日A日+平日B日からなるとした時、N個の予定全てが休日に重なる可能性はあるかどうかを出力します。

それぞれの予定が、1週間の日数A+B日の内の何日目に当たるかを考えればいいので、まずは「今日から何日後に予定があるか」の配列をA+Bで割った余りで考えるのが良さそう、というところまでは行ったのですが、その後、「では今日が1週間のいつだと仮定するのがいいのか？」「どうやって場合分けしよう…？」と躓いてしまいました。

```Ruby
# 提出コード。WAです。
n,a,b=gets.split(" ").map(&:to_i)
array=gets.split(" ").map(&:to_i)
sum = a + b
result = array.map{|s| s % sum}
# 以下求め方がわからず、とりあえず休日の日数A日と配列の各要素を比較しています。
flag = result.all?{|item| item <= a}
puts flag ? "Yes":"No"
```
上記コードだと、「今日が1週間の最終日(=1日後が休日A日の始まり)だった場合」しか検討できていないため、テストコード20件でWAが出てしまいました。

そんなわけで、以下解説確認後の解答です。今回はYouTubeの解説動画を参考にさせていただきました。
### 方針：予定がある日を含めずにB日分取ることができるかを検討する＋1週間を円で考える

たとえば1週間が休日2日、平日5日の７日間で構成されている場合、予定のある日の配列を7日で割った余りの配列の要素は、0~6のいずれかになっており、これは1週間のうちの何日目かを表しています。この問題では、1週間のうちの何日目に予定があるのかということがわかれば良いので、まずはこの配列をsortし重複を除きます。

例）休日2日、平日5日、予定があるのが2,3,9日後の場合：それぞれ1週間のうちの2,3,2日目なので、2,3日目のみ検討すれば良い

あとはその配列の隣同士の要素を比較し、間隔がB日以上空いているところがあれば、問題の条件を満たすことになります。
ただし、1週間は最後の日の次はまた最初の日に戻る=円状になっていることに要注意です。配列の最後の要素と最初の要素の間隔がB日以上の可能性があるからです。

例）上記例の場合、2日目〜3日目の間は0日 < 平日5日だが、3日目〜2日目と考えると、4,5,6,0,1日目が間にあるため条件を満たす

下記のコードでは、この部分を最初に別で検討することにしました。

```Ruby
n,a,b=gets.split(" ").map(&:to_i)
array=gets.split(" ").map(&:to_i)
sum = a + b
result = array.map{|s| s % sum}.sort.uniq
flag = false
if sum - result[-1] + result[0] > b  # 週を跨ぐ部分の検証
  flag = true
else
  for i in (0...result.size-1)
    if result[i+1] - result[i] > b  # 隣同士の要素の間隔を検証
      flag = true
      break
    end
  end
end

puts flag ? "Yes":"No"
```



## おわりに
考えるのは楽しいですが、解けないのは悔しい…！
最近あまり過去問精進できてないので、時間取ってやっていきたいと思います。


## 参考リンク
https://www.youtube.com/watch?v=mRsawW3ow98
PowerApps入力チェックの実装方法

# 実装イメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368087/ca8d4b49-1003-f559-4f91-8e21b985ac00.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368087/26c9d79b-5db1-4cda-1e68-97da81853feb.png)

# 実装内容
|項目 |プロパティ  |式  |
|---|---|---|
| |OnStart  |Set(ErrorMessage_Inputbox1,"");  |
| SharePointIntergration|OnNew  |Set(Inputbox1Check,false);  |
| |  |Set(ErrorMessage_Inputbox1,"");  |
| |  OnEdit|Set(Inputbox1Check,false);  |
| |  |Set(ErrorMessage_Inputbox1,""); |
| ErrorMessage| Text |ErrorMessage_Inputbox1 |
| |  Visible|Parent.DisPlayMode=DisplayMode.Edit(設定必要なし) |

InputBox1のOnChange：
```
If(
   AND(
       Inputbox1Check,
       IsBlank(Inputbox1.Text)
   ),
   UpdateContext({ErrorMessage_Inputbox1:"Inputbox1を入力してください。"}),
   UpdateContext({ErrorMessage_Inputbox1:""})
)
```

Submit ButtonのOnSelect
```
//check flgを設定
Set(Inputbox1Check,true);

If(
   AND(
       Inputbox1Check,
       IsBlank(Inputbox1.Text)
   ),
   UpdateContext({ErrorMessage_Inputbox1:"Inputbox1を入力してください。"}),
   UpdateContext({ErrorMessage_Inputbox1:""})
)

If(
    And(
        IsBlank(ErrorMessage_Inputbox1)
    ),
    IfError(
        SubmitForm(SharePointForm1),
        Notify(SharePointForm1.Error);
    );
    Set(LastId,Text(SharePointForm1.LastSubmit.ID));
    //ステータス設定
    Patch(
        リスト名,
        LookUp(リスト名,ID=Value(LastId)),
        {
            状態:{Value:"submit"}
        }
    );
    RequestHide(),
    Notify("入力内容をご確認ください。",NotificationType.Error)
);
```

Cancel ButtonのOnSelect
```
ResetForm(SharePointForm1);
 RequestHide()
 ```
cscの作法 その474

# 概要
cscの作法、調べてみた。
練習問題やってみた。

# 練習問題
tabcontrolを、使え。

# 方針
- ToDoアプリを作る。
- 動的に、TabPageを作る。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/70135d30-db4a-32c9-2ec4-1fd0b1285ac4.png)


# サンプルコード

```
using System;
using System.Drawing;
using System.Windows.Forms;

class SampleForm: Form {
	TextBox bo0;
	TabControl tabc;
	int i = 0;
	SampleForm() {
		ClientSize = new Size(400, 200);
		Text = "To Do";
		Label la0 = new Label();
		la0.Location = new Point(50, 10);
		la0.Text = "To Do";
		bo0 = new TextBox();
		bo0.Location = new Point(150, 10);
		bo0.Text = "金持ちになる";
		Button btn1 = new Button();
		btn1.Location = new Point(150, 50);
		btn1.Text = "登録";
		btn1.Click += btn1_Click;
		tabc = new TabControl() {
			Location = new Point(50, 90),
			Size = new Size(300, 60),
		};
		Controls.AddRange(new Control[] {
			la0,
			bo0,
			btn1,
			tabc
		});
	}
	void btn1_Click(object sender, System.EventArgs e) {
		i++;
		TabPage tabp = new TabPage() {
			Text = "Page" + i.ToString(),
			Dock = DockStyle.Fill,
		};
		tabc.TabPages.Add(tabp);
		tabp.Controls.Add(new TextBox() {
			Text = bo0.Text,
			Dock = DockStyle.Fill,
			BackColor = Color.Azure,
		});
	}
	[STAThread]
	static void Main(string[] args) {
		Application.Run(new SampleForm());
	}
}





```


以上。