OmniAICreator/Qiita-1.07M huggingface dataset:
早くインストールして！直近で一番感動したVSCodeプラグイン「Better Folding」

サボりがちなプラグイン探索ですが、最近インストールして最も感動したものを端的に紹介する記事です！

:::note
まだインストールしてない人は早く入れて欲しい！
お節介な記事となっていますのでご了承ください。
:::

## VSCodeの標準機能「行の折りたたみ」が微妙だと思っていた理由
VSCodeの標準機能に行の折りたたみがあります。
便利は便利です使いはするけど不満がありました…

下記の画像のようにブラケットが外に出てしまうからです…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146612/d912baa6-2014-ef50-f165-9fa2770b0337.png)

:::note alert
たったこれだけですが、使う気がおきない理由の一つでした…。
:::

## 「Better Folding」は行の折りたたみを覚醒させる！
百聞は一見にしかず。ご覧ください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146612/e9233fc7-d0b6-02c4-ad5d-29f588fa0014.png)

ブラケットも一緒に折りたたまれ、折りたたまれた行数も表示してくれる丁寧ぶり。

### その他いろいろなパターンの折りたたみ
その他の折りたたみはどのようになるか試してみました。
#### 関数
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146612/f49d0752-21a5-9ef5-0367-05af262d66a3.png)

#### addEventListener
なぜかイベントリスナーだけ「...」で表示されます。
ちなみにアロー関数、通常の関数どちらでも同じ結果です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146612/b29d250c-1779-ea5f-79bc-4b0e7cebdc79.png)


#### if文
trueの場合と、falseの場合それぞれで行数が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146612/85df608f-8e90-8f9e-c983-c43904edbe6b.png)

### Objectの場合
少し中身が見えずらい感じはあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146612/d4853346-595a-af8b-75b7-589e4db99834.png)


## まとめ
たったこれだけといえばそれまでですが、ちょっとした開発のストレスを解消して良い開発体験を生むことも仕事の効率を上げると思っています！

また、良いプラグインがあれば紹介したいと思います！
Deno: GitHub で GraphQL を使う

こちらのプログラムを Deno で書き換えました。
[Curl: GitHub で GraphQL を使う](https://qiita.com/ekzemplaro/items/35f37293cc49cdb09587)

## プログラム

```bash:get_data.sh
export ACCESS_TOKEN="ghp_*******************"
deno run --allow-all get_data.ts
```

```ts:get_data.ts
// ---------------------------------------------------------------
//	get_data.ts
//
//					Apr/15/2023
//
// ---------------------------------------------------------------
import process from "node:process"

const url = "https://api.github.com/graphql"
const str_query = 'query {user(login: "ekzemplaro") {name location url}}'
const query = JSON.stringify({ query: str_query })

const headers = new Headers({
  "Authorization": `bearer ${process.env.ACCESS_TOKEN}`,
  "Content-Type": "application/json",
})

const response = await fetch(url, {
  method: "POST",
  headers: headers,
  body: query,
})

const data = await response.json()
console.log(data)

// ---------------------------------------------------------------
```

## 実行結果

```text
$ ./get_data.sh 
{
  data: {
    user: {
      name: "Uchida Masatomo",
      location: "Tochigi,Japan",
      url: "https://github.com/ekzemplaro"
    }
  }
}
```

## 確認したバージョン

```text
$ deno --version
deno 1.32.4 (release, x86_64-unknown-linux-gnu)
v8 11.2.214.9
typescript 5.0.3
```
既存RailsアプリをDockerで環境構築する方法

本内容は、既存Railsアプリがあることを前提に、マルチステージビルドでDockerの開発環境を構築する手順です。DBはPostgresです。

マルチステージビルドについては、下記の記事を参考にしてください。
- [Multi-stage build でNode.jsのインストールをちょっぴり効率化する](https://tech.actindi.net/2019/06/20/084247)

## 事前準備
- dockerを使用できる状態にしておく
- railsアプリを用意しておく

## dockerファイル準備
まず初めにrailsアプリがあるディレクトリで`Dockerfile``docker-compose.yml`を作成する。

- Dockerfileの作成
```Dockerfile:Dockerfile
FROM node:12 as node
FROM ruby:3.0.2

RUN apt-get update -qq && apt-get install -y build-essential libpq-dev

COPY --from=node /usr/local/bin/node /usr/local/bin/
COPY --from=node /opt/yarn-* /opt/yarn/
COPY --from=node /usr/local/lib/node_modules /usr/local/lib/node_modules

RUN ln -fs /usr/local/lib/node_modules/npm/bin/npm-cli.js /usr/local/bin/npm \
    && ln -fs /usr/local/lib/node_modules/npm/bin/npx-cli.js /usr/local/bin/npx \
    && ln -fs /opt/yarn/bin/yarn /usr/local/bin/yarn \
    && ln -fs /opt/yarn/bin/yarnpkg /usr/local/bin/yarnpkg

RUN mkdir /repogitory_name
WORKDIR /repogitory_name

ADD Gemfile /repogitory_name/Gemfile
ADD Gemfile.lock /repogitory_name/Gemfile.lock
RUN bundle install

ADD package.json yarn.lock /repogitory_name/
RUN yarn install --check-files

ADD . /repogitory_name

```

- docker-compose.ymlの作成
```yml:docker-compose
version: '3'
services:
  db:
    image: postgres:14.6-alpine
    environment:
      - POSTGRES_PASSWORD=password
  web:
    image: repogitory_name:latest
    build: .
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    volumes:
      - .:/repogitory_name
    ports:
      - "3000:3000"
    environment:
      - POSTGRES_PASSWORD=password
    depends_on:
      - db
```

## DATEBASEの設定
- config/database.yml内の設定をpostgresに書き換える
```yml:database.yml
default: &default
  adapter: postgresql
  encoding: unicode
  host: db
  username: postgres
  password: <%= ENV['POSTGRES_PASSWORD'] %>
  pool: 5

development:
  <<: *default
  database: myproject_development

test:
  <<: *default
  database: myproject_test
```

## railsアプリの設定
Gemfileファイルの設定
- rubyバージョンがDockerfileと同じか確認する（違う場合はDockerfile側を修正）
```
ruby '3.0.2'
```
- posetgresの設定を追加
```
# Use postgres as the database for Active Record
gem 'pg'
```

## 起動・確認
railsアプリをビルドする
```
$ docker-compose build
```

railsアプリのデータベースを作成し、テーブルを作成する
```
$ docker-compose run web rails db:create db:migrate
```

railsアプリ起動
```
$ docker-compose up
```

ブラウザで、 http://127.0.0.1:3000/ にアクセスし、railsアプリの画面が表示されていればOK
それぞれのファイルの合計値を出してみた

# はじめに
以下のそれぞれ数値が記載されたファイルがカレントディレクトリにあります。


```data.txt
10
100
10
```

```data1.txt
20
30
```

ファイルの中の数値の合計を出すpowershellを作成しました。

```data.ps1
cat ./data.txt |foreach { $sum += [int]$_ }
cat ./data1.txt |foreach { $sum += [int]$_ }
$sum
```

実行すると以下の通り合計値が出ます。

```
170
```

# 配列にしてファイルの中身を簡潔にする

２つのファイルなのでそれほど冗長な感じはしませんが数が多くなってくると何度も記載することになり、面倒なので配列にして簡潔に書きます。

```data.ps1
$data = @('data.txt','data1.txt')
cat $data |foreach { $sum += [int]$_ }
$sum
```

配列の書き方は「変数 = @(要素１、要素２)」という感じですね。
それぞれのファイル（data.txt、data1.txt）を配列にします。

実行結果は以下の通りです。

```
170
```

配列を書いて慣れていきたかったので書きました。
数が多くなった時便利ですね。
vue3-google-mapを使って現在位置にアイコン表示

https://www.npmjs.com/package/vue3-google-map?activeTab=readme

を見ながら、いじってみたが、、うーん。
【index.vue】
```vuejs
<template>
    <GoogleMap  ref="mapRef" api-key="キー" style="width: 100%; height: 500px" :center="center" :zoom="15">
      <Marker :options="{ position: center }" />
    </GoogleMap>
  </template>
    
<script setup lang="ts">
import { GoogleMap, Marker } from "vue3-google-map";
import { ref } from "vue";

const mapRef = ref(null);
const center = ref({ lat: 0, lng: 0 }); // first position
const getLocation = function(map:any,center:any){
    navigator.geolocation.getCurrentPosition(
            // success
            function(position) {
                const lat = position.coords.latitude;
                const lng = position.coords.longitude;
                console.log(`Latitude: ${lat}, Longitude: ${lng}`);
                map.panTo({ lat, lng });
                center.value = { lat: lat, lng: lng };
            },
            // error 
            function(error) {
                console.error(`Error : ${error.message}`);
            }
    );
} 

watch(() => mapRef.value?.ready, (ready) => {
    if (!ready) return;
    const map = mapRef.value.map;
    getLocation(map,center);
})
</script>
```
エンジニアに必要な要素

エンジニアになるためには、新しいことを知り、学ぶことを楽しめることが重要です。IT業界は常に進化しているため、学び続けることが不可欠であり、学ぶことを止めると期待されない人材になる可能性があります。

エンジニアになるためには、新しいことを学び、学ぶことを楽しめることが重要です。

学習において好奇心を持つことは非常に重要です。好奇心は、新しいことを知るための欲求や探求心を表します。学び続けることが必要な多くの職業において、新しいことを知ることや興味を持つことが大切な要素となります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3329690/bbc5c22c-2ad7-4cc4-789a-10297a937ab0.png)

特にIT業界においては、常に新しい技術が生まれ、古い技術が陳腐化していきます。そのため、常に新しいことを学ぶことが必要です。好奇心を持って学び続けることで、最新の技術にアクセスし、より効率的に仕事を進めることができます。また、好奇心を持って学ぶことで、自己成長や自己啓発の機会を得ることができます。自分が興味を持つ分野について学ぶことで、自分の人生やキャリアにおいて価値あるスキルや知識を身につけることができます。

つまり、学習において好奇心を持つことは、自分自身の成長やキャリアにとって非常に重要な要素であり、これを大切にすることで、自分の可能性を広げることができます。

ですから、本を読むことや新しい知識に触れることを楽しめない人には、エンジニアになることはお勧めできません。そのような場合は、他の業種を探すことを検討するのがよいでしょう。
php artisan migrateでcould not find driverエラー


# エラーの内容
laravelでマイグレーションしようとしたところ、以下のようなエラーが出てうまくいかずでした。windows、xampp環境。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2779337/e54ef019-4988-55c6-6589-767b1470ab38.png)

# 解決方法
「extension=php_pdo_mysql.dll」をphp.iniファイルに加筆して解決しました。

ポイントは、どのphp.iniファイルに！？です！
最初、xampp内のphp.iniを編集してもうんともすんとも言わず、う～んと困った（擬音が多い）のですが、調べたところどうやら別の場所にもともとインストールしてあった別のphpのiniファイルが参照されていたようで、そっちに上記を追記したらうまくいきました。

どこのiniファイルがロードされているかは、
~~~
php -i | find /i "Configuration File"
~~~
でお調べください。


# 参考

https://stackoverflow.com/questions/46745365/artisan-migrate-could-not-find-driver#comment107425002_47929207
flutter-ios: Could not build the precompiled application for the device.



Could not build the precompiled application for the device.
════════════════════════════════════════════════════════════════════════════════
Building a deployable iOS app requires a selected Development Team with a 
Provisioning Profile. Please ensure that a Development Team is selected by:
  1- Open the Flutter project's Xcode target with
       open ios/Runner.xcworkspace
  2- Select the 'Runner' project in the navigator then the 'Runner' target
     in the project settings
  3- Make sure a 'Development Team' is selected under Signing & Capabilities > Team. 
     You may need to:
         - Log in with your Apple ID in Xcode first
         - Ensure you have a valid unique Bundle ID
         - Register your device with your Apple Developer Account
         - Let Xcode automatically provision a profile for your app
  4- Build or run your project again

For more information, please visit:
  https://flutter.dev/docs/get-started/install/macos#deploy-to-ios-devices

Or run on an iOS simulator without code signing
════════════════════════════════════════════════════════════════════════════════


書いていること以外に、
xcodeをアップデートも必要
Rubyは全てがオブジェクト「③クラスについて理解の深掘り」

## はじめに
今回は「クラスについて理解の深掘り」というタイトルで書いていきます:runner_tone1:
前回の記事

https://qiita.com/atsushi_1995/items/ccaeee9a15c8140878c1

の最後でも書きましたが、学習中にかなり困惑した
#### 「クラスとモジュールもインスタンス」
についての内容となっています！

今回は特に「クラスがインスタンス」であることについて書いており、モジュールやその他の細かい内容は次回の「④Rubyを構成している三大クラス」で書きます:bow_tone1:

## 「Ruby3.2リファレンスマニュアルのClassクラス」より抜粋
(class Class は)
クラスのクラスです。

## クラスはClassクラスのインスタンス
上記リファレンスにも明記されている通り、普段何気無く使っていたクラスはClassクラスと言うクラスのインスタンスです！

確かに、そうでなければ「rubyは全てがオブジェクト(インスタンス)」とは言えないとは思っていました:thinking:

最初は
・クラスは設計図
・インスタンスはクラスからできた実体
と言う認識しか持っておらず、全く理解できませんでした:sweat_smile:

以下、理解する上で私なりに腹落ちした解釈です、、、、、

・Classクラスは「設計図を作る為の設計図」

　　　　　　　　　👇(インスタンス化)

・クラスは「設計図を作る為の設計図」からできた「設計図」

　　　　　　　　　👇(インスタンス化)

・インスタンスは「設計図」からできた実体

と言う認識をした上で

クラスは
1.インスタンスを作る為の「設計図」としての側面
2.Classクラスという「設計図を作る為の設計図」からできた実体としての「設計図」の側面
の『二面性を持っている』と解釈の拡大をして、ようやく理解できました。

改めて、自分が泥沼にハマっていた理由は
「クラスはインスタンスを作る設計図」
つまり
「AはB」
だと思い込んでいた為です。
実は「AはBであり、Cでもある」という可能性を完全に排除していた為でした:sweat:

また先ほど書いた以下の図で
・Classクラスは「設計図を作る為の設計図」

　　　　　　　　　👇(インスタンス化)

・クラスは「設計図を作る為の設計図」からできた「設計図」

　　　　　　　　　👇(インスタンス化)

・インスタンスは「設計図」からできた実体　　　⏪これです

これの最後にできるインスタンスからは、インスタンスを作成できないことも「クラスに二面性」があることの理解を難しくしていました。

## 「じゃあ、Classクラスは誰が作っているの？？？」
クラスをClassクラスが作っていることを理解した後に私が感じた疑問です:thinking:

かなり大雑把な例えになるんですが、
「この世界はどうやってできたのか？」
👇
「神様が作った」
👇
「神様は誰が作ったのか？」
👇
「神様の神様が作った」
👇
「神様の神様は誰が作ったのか？」
👇
以下無限ループ

こんな感じで、「設計図」があり、「設計図を作る為の設計図」があるということは「設計図を作る為の設計図を作る為の設計図」があるはずでは？と思った次第です！

検証する為にclassメソッドでどのクラスに属するのか試してみました
```ruby:qiita.rb
class Sample
end

puts "#{Sample.class}" #=>Class
puts "#{Class.class}" #=>Class
```
結果として、やはり自分で作ったSmpleクラスはClassクラスに属しているとでます。
しかし、ClassクラスもClassクラスに属しているとでます。
つまり、先ほどのような無限ループが起こらないようにClassクラスで循環が起きているのだと思われます。
ここについては、今後また勉強していきたいと思います:walking_tone4:

## まとめ
今まで使っていたクラスは実は「インスタンスを作成できる」「Classクラスのインスタンス」の二面性を持っていた！

## 参考にしたサイト
・Ruby3.2リファレンスマニュアル>ライブラリ一覧>組み込みライブラリ>Classクラス

https://docs.ruby-lang.org/ja/latest/class/Class.html
LinuxでIntel CPUが遅い

## 問題


Alder Lake（12世代Coreプロセッサ）以降のIntelのCPUは計算速度重視のPコアとワッパ重視なEコアという2種類のコアを搭載したIntel Hybrid Technologyというものを採用しています．当然ですが，Eコアでプログラムを実行すると遅いため，なるべくPコアで実行してほしいですね．しかし，古いLinuxカーネル（古いと言っても2023年で最新のDebian 11のカーネルですが）では，どちらのコアで動かすかをうまく制御することができません．そのため，あるときはPコアでプログラムを実行し，またあるときはEコアでプログラムを実行するという現象が起こります．どちらのコアでプログラムを動かすかは運任せなので，運悪くEコアで実行してしまうと，とても遅くなってしまいます．

## 現状

2023年6月にリリースされたDebian12のkernelは6.1なので，Debian12では何もしなくてもAlder Lakeに対応していると思われます．

## 解決法


kernelを新しくすれば，Pコアでプログラムを動かしてくれるようになります（比較的適切にスケジューリングしてくれます）．Debianでは次のような操作をすると，Alder Lake以降のCPUに対応した比較的新しいkernelをインストールできます．

- 次のコマンドでaptのリポジトリの設定ファイルを開きます．
```
sudo nano /etc/apt/sources.list
```
- このファイルに次の設定を追加します．
```
deb http://ftp.riken.jp/Linux/debian/debian/ bullseye-backports main
deb-src http://ftp.riken.jp/Linux/debian/debian/ bullseye-backports main
```
- 次のコマンドでカーネルをインストールします．
```
sudo apt install -t bullseye-backports linux-headers-amd64 linux-image-amd64
```

これでAlder LakeとRaptor Lake（13世代Coreプロセッサ）に一応対応した新しいカーネル（2023年4月15日では6.1）がインストールされます．

この作業でインストールされるkernelはDebianにおいて安定版ではないことに注意してください．

## 感想

現在のIntel CPUはハイブリッドアーキテクチャなため並列計算が必要な数値計算に向かないでしょう．数値計算が目的ならAMDのRyzenを買ったほうが無難だと思います．
バリデーションエラーメッセージを日本語で表示する

コメントを投稿するときに星評価（raty）とコメント文（content）を入力必須にして、コメント文は250字までにします。
```comment.rb
validates :raty, numericality: {
    less_than_or_equal_to: 5,
    greater_than_or_equal_to: 1,
    message: 'を入力してください。'
  }
  validates :content, presence: true, length: { maximum: 250 }
```

```controllers/comment_controller.rb
def create
    @comment = current_user.comments.new(comment_params) 
    @movie = Movie.find_by(params[:id])
    if @comment.save
      flash[:success] = 'コメントを投稿しました。'
      redirect_to movie_path(@comment.movie_id)
    else
      flash.now[:danger] = 'コメントの投稿に失敗しました'
      render "movies/show"
    end
  end
```

```movies/_comment_form.html
<%= form_for @comment do |f| %>
  <%= render 'layouts/error_messages', model: @comment %> 
<div class="field" id="star">
    <%= f.label :raty, "評価：" %>
    <%= f.hidden_field :raty, id: :comment_star %>
    <script>
      $('#star').raty({
        starOff: "<%= asset_path('star-off.png') %>",
        starOn: "<%= asset_path('star-on.png') %>",
        starHalf: '<%= asset_path('star-half.png') %>',
        scoreName: 'comment[raty]',
        half: true, 
      });
    </script>
  <%= f.hidden_field :movie_id, value: @movie.id %>
  <%= f.label "コメント・感想" %>
  <%= f.text_area :content, placeholder: "250文字以内で入力してください..." , onKeyUp: "countLength(value, 'textlength');",
                    class: "input-field", style: "margin-bottom:0;",required: true %>
  <p id="textlength" style="text-align:right; margin-bottom:0;">0/250文字</p>
  </div>
  <%= f.submit '送信', class: "btn btn-outline-secondary" %>
<% end %>

<script type="text/javascript">
  function countLength( text, field ) {
    document.getElementById(field).innerHTML = text.length + "/250文字";
    if (text.length>250) {
      $('#textlength').css({
          color:'#ff0000',
          fontWeight:'bold'
      });
    }
    else {
      $('#textlength').css({
          color:'#000000',
          fontWeight:'normal'
      });
    }
  }
</script>
```

![7ad5c090392234fe943d892c8ffa0199.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1962714/09144b90-e648-2bc8-c4ab-e12c045adbda.png)

こんな感じで文字数をカウントしてくれます。
これで星評価に何も入れなかったり、250字以上で投稿したりするとエラー文が出ます。
ただ、このエラー文が英語なので少し伝わりにくいかなと思うので、日本語に変更します。

```Gemfile
gem 'rails-i18n'
```
```bundle install```します。

```config/application.rb
module ValidationMessageSample
  class Application < Rails::Application
    config.load_defaults 6.0

    # 下の２行を追加する
    config.i18n.default_locale = :ja
    config.i18n.load_path += Dir[Rails.root.join('config', 'locales', '**', '*.yml').to_s]
  end
end
```

そして翻訳ファイルを ```config/locales/models``` 配下に作成します。```models```ディレクトリがない場合は、まずディレクトリを作ってから、その中に```ja.yml```ファイルを作成します。

```config/locales/models/ja.yml
ja:
  activerecord:
    attributes:
      comment: 
        raty: 星評価
        content: 文字数
```
実際にエラーが出るようにコメントを投稿してみます。

![430715ad8506cab0eacc2df6e9fbf0f7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1962714/629f0a85-ada2-8ef8-54e1-157b63e59b56.png)

無事日本語でエラー文が出ました！



参考：

https://zenn.dev/machamp/articles/rails-validation-message

https://qiita.com/okeicalm/items/9638250ddfb361d80a16
AutoHotkey を使って Windows Terminal 上の Emacs に C-SPC を送る


**Windows Terminal** などのターミナルエミュレータはキー入力をアスキーコードとして受け取る。
その場合、１部の特殊キーは認識されない。

Emacs で良く利用するキー、コマンドとして **C-SPC** を使った set-mark-command があるが、
C-SPC が Windows Terminal 上では使えないため、Windows Terminal から ssh 接続した先で
Emacs を利用する際、set-mark-command が使えない。

一方で Emacs には `event-apply-\*-modifiers` という関数があり、後続のキーの前にモディファイアキーが押されているとしてキー入力を受け付けることができ、C-x @ [hsmaSc] に割当られている。
例えば **C-x @ c SPC** と入力すれば C-SPC に割当られたコマンドを呼び出すことができる。

そこで、AutoHotKey で Windows Terminal を利用しているときに C-SPC が押されたら、
C-x @ c SPC を送信するように設定する。

*※ Sleep は気持ち。入れなくても動く。*

```
    #IfWinActive, ahk_exe WindowsTerminal.exe
    {
    ^Space::
    {
        Send, ^x
        Sleep, 50
        Send, @
        Sleep, 50
        Send, c
        Sleep, 50
        Send, {Space}
        Return
    }
    }
```

V2 版
```
    #HotIf WinActive("ahk_exe WindowsTerminal.exe") {
      ^Space::
      {
        Send, ^x
        Sleep, 50
        Send, @
        Sleep, 50
        Send, c
        Sleep, 50
        Send, {Space}
        Return
      }
    }
```
Whisperを使ってYouTubeの音声をテキストに変換。モデルごとの違いを比較してみた。

ChatGPTのAPIと一緒に公開されたWhisper、いろんな方が3Dモデルとの会話に使っていたりするのを見て、なるほどさすがみんなが欲しいタイミングで出してきてるんだなと思いました。
せっかくなので勉強してみたいということでYou Tubeの音声をテキスト情報にしてみようと思います。
モデルによって出力や所要時間がどう違うのかも含めて試したことを共有したいと思います！

# 試したこと
Youtubeの音声をWhisperでテキスト化、pandasでデータフレームに格納
その際
- 所要時間
- 出来上がりの文章

についても比較しました。

# 使用したもの
Google Colab GPU T4
YouTube動画　[ヨビノリさんの線形代数1](https://youtu.be/svm8hlhF8PA) 15分(約6000文字)
whisperモデル　tiny, base, medium
音声抽出　pytube

それぞれ下記でインストールしてください。
```
$ pip install openai-whisper
$ pip install pytube
```

#　コード全体像
```
from pytube import YouTube

video_url ='https://youtu.be/svm8hlhF8PA'
file = YouTube(video_url).streams.filter(only_audio=True).first().download(filename="audio.mp4")

import whisper

whisper_model = whisper.load_model("tiny")# change the model accordingly

transcription = whisper_model.transcribe(file)

import pandas as pd

# print as DataFrame
df = pd.DataFrame(transcription['segments'], columns=['start', 'end', 'text'])
print(df)

# or, print as String
print(transcription['text'])
```
# 先に結論。時間はかかるがミディアムが無難！
まずは所要時間です。
tiny 1分
base 1分
medium 4分

意外にもtinyとbaseはそこまで変わりませんでした。
mediumは4倍かかっていますが15分の動画で4分なら待てるかな、と思います。用途にもよりますね。

では文章の仕上がりを見てみましょう。

## tiny
```
ちょっとまんと、終了くるよこう。おはよう。めたらかいだ。めてねえや。おはようさ、好きな数とかあるの?4906か。完成すね。はいということで今回から、先程は、新駅ライスを入門って連続を行き始めてくるんだけども、先程をするって、リケーのガツセイが出らくに入って、まず最初にやらされる数学の2つであるし、さらに、経済学部などから必須感覚にやつたいするんだね。これがどうして、文言を当たらず、オールジャンがあらわれすがくになってるか、っていうのは、今から話す。
```

うん、、控えめに言ってぶっ壊れてますね。笑
かなり考えながら読んでも元文章が見えてきません。

次に行ってみましょう！

## base
```
ショートマンと収穫力をおいネタのかいネテネイヤお前さ、好きな数とかあるの496か完全すはい、ということで今回から先経来数リューモンって連続をおき始めてくんだけども先経来数って理計の学生が大学に入ってまず最初にやらされる数学の2つってなるしさらに今経済学分中の必要頑張くにやすいですよねこれがどうしてそれと文字はとはオールジャンが現れ数学になっているかというのは今から話す先経来数とは何かという話をで聞いてくれればその外観が使めるかなと思いますじゃあさっそ話していきましょう
```
だいぶ話が見えてきましたね！最初のコント部分はちょっと難しいですが、文脈が読める内容であればなんとかいけるかな。。GPTにむしろこれぶっ込んで意訳してもらうのもありかもしれないですね。

では最後、mediumいきましょう！　

## medium
```
ショートコント 修学旅行おい寝たのかよ寝てねぇやお前さ好きな数とかあんの496完全数はいということで今回から線形代数 流門って連続講義始めてくるんだけども線形代数って理系の学生が大学に入ってまず最初にやらされる数学の1つであるしさらには経済学部の中にある数学の1つであるしさらには経済学部の必修科目にあったりするとねこれがどうして分野とはずオールジャンルで現れる数学になっているかっていうのは今から話す線形代数とは何かっていう話を聞いてくれればその外観がつかめるかなと思いますじゃあ早速話していきましょう
```
おお。。！一気に完璧に近づきました！間違いあります？あ、流門っていうのがありますね。個人的にはこの程度なら全然問題ないかなと思いました。

# まとめ
いかがでしたか？ちょっとtinyの使い道が分からないですが、おそらく短い文章の、しかも英語(別途tiny.enというモデルもあります)であれば精度もっと出るんでしょうね。
baseに関しては実装する内容によっては使えるんじゃないかなと。今考えてるのはこれをembeddingしたいので、無理くり突っ込んでもある程度宜しく解釈してくれるのであればいいのですが、ちょっと別で試したいと思います。

いまのところそのまま実用に耐えるクオリティなのはmediumですね。
[C]配列に漢字の文字列を入れようとしたら表示されなかった話

[やりたかったこと]
char str[][3] = {"金", ...};
みたいな宣言して
printf("%s", str[0]);    // 金
をやろうとしたら表示されなかった。


[条件]
・vscode
・utf-8


[原因]
utf-8の日本語は3バイトや4バイトで表されるから、宣言した時のメモリの確保した量が足りてなかった。
ちなみにshift-jisは2バイトらしい


[修正]
char str[][100] = ...
メモリの確保量を増やしたら動いた


[反省点]
null文字や表示したい文字が何バイト必要なのかを踏まえて宣言をしよう
あとそもそもメモリの確保量が少なすぎた
Notion文献管理ツールちゃん改善日記

# はじめに

以下の記事の続きです。

https://qiita.com/haruchann/items/2f8fb19221ca15bb68d4

今日は　
１．NotionAPIのシークレットキーを、ハードコーディングではなくDBから読み込む形に変更
２．完了画面に、いま作成したページに飛べるリンクを置く
をしました。

# １．NotionAPIのシークレットキー
insert.phpの冒頭でDB接続を行い、DBに格納したAPIのシークレットキーをとってきて、配列に格納し、値を取り出すようにしました。
DBとの対話が初めて叶ってうれしいです、会話してくれてありがとう。

~~~php
//DB接続
$DB_DATABASE = 'reftion';
$DB_USERNAME = 'XXXX';
$DB_PASSWORD = 'XXXX';
$DB_OPTION = 'charset=utf8';
$PDO_DSN = "mysql:host=localhost;dbname=" . $DB_DATABASE . ";" . $DB_OPTION;
$db = new PDO($PDO_DSN, $DB_USERNAME, $DB_PASSWORD);
//notion_token読み込み
$stmt=$db->prepare('SELECT value FROM manage WHERE name=\'notion_token\';');
$stmt->execute();
$notion_token_array=$stmt->fetch(PDO::FETCH_BOTH);

define('NOTION_TOKEN', $notion_token_array['value']);
~~~

# ２．完了画面
前回つくった完了画面は以下のような感じでしたが、せめてURLがリンクになっていると直接飛べて便利ですよね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2779337/7a0f6c73-c429-80c2-87f1-f50d838122e9.png)

なので、こうして、
~~~php
<p><?php  echo $res_cite_array['name'].'を登録しました。';?></p>
<a href="<?php echo $res_notion_array['url']?>">登録したページはこちらから確認してください。</a> 
~~~

こうしました。ちゃんとリンクを押すと、作ったページに飛びます。便利！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2779337/eb56b311-8a1b-f038-9a97-bd427d613e91.png)

今日はここまでです。
これ、どこかのサーバにあげたとしたら、誰でも私のDBにガンガン挿入できちゃうじゃ～んと思ったので、つぎはログイン機能を作ろうと思います。（いまはローカルで毎回立ち上げてます）

# 参考
https://sugublog.org/php-base-db-control/

https://nagablog.info/php-pdo-mysql/
関西春ロボコン

# 概要
2023年度関西春ロボコンに出たときの機体(足回り)の製作についてです。

# 機械（足回り）
四輪オムニホイール機構を採用しました。
ロボコンの足回りといえば、これですよね？
とくにこれと言って特徴はないんですが、シンプルなものが好きなので敢えてシンプルを売りにします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2725749/9d2f7807-5cec-7fed-5484-f67fe649009c.png)

# 回路
電源基板（分電盤）は自作
モータードライバーは市販品のMD20A (cytron製)
PCの代わりにraspberry pi
マイコンはArduino Unoです。

# 制御
Arduino IDEとROS_noeticを使いました。
rosserialを使って、raspberry piとArduino Unoを通信させ、制御していました。
【AWS】MFAセッショントークンを取得する【Powershell】

# PowerShellコマンド
MFAセッショントークンを取得し、環境変数に設定するPowershellコマンド。

```powershell
# アカウントID、ユーザー名、ワンタイムパスワードは書き換える
# 有効期間は3600秒を設定（最大129600秒（36時間））
$session = aws sts get-session-token `
  --serial-number arn:aws:iam::{アカウントID}:mfa/{ユーザー名} `
  --token-code {ワンタイムパスワード} `
  --duration-seconds 3600 `
  --profile default | ConvertFrom-Json

# ユーザーの環境変数に設定
[System.Environment]::SetEnvironmentVariable("AWS_ACCESS_KEY_ID", $session.Credentials.AccessKeyId, "User")
[System.Environment]::SetEnvironmentVariable("AWS_SECRET_ACCESS_KEY", $session.Credentials.SecretAccessKey, "User")
[System.Environment]::SetEnvironmentVariable("AWS_SESSION_TOKEN", $session.Credentials.SessionToken, "User")

# プロンプトを開き直さなくてもよいように、プロンプト上の環境変数にも設定
$env:AWS_ACCESS_KEY_ID = $session.Credentials.AccessKeyId
$env:AWS_SECRET_ACCESS_KEY = $session.Credentials.SecretAccessKey
$env:AWS_SESSION_TOKEN = $session.Credentials.SessionToken
```

```~\\.aws\credentials
[default]
aws_access_key_id = {アクセスキー}
aws_secret_access_key = {シークレットキー}
```

# Powershellのコマンドとして登録する
毎回スクリプトを実行するのは面倒なので、Powershell上のコマンドとしていつでも実行できるようにする。

Powershellのプロファイルに以下を記載する。
※プロファイルの場所は、\\$PROFILE 変数の値。
　（現在のユーザーの場合は、$HOME\Documents\PowerShell\Microsoft.PowerShell_profile.ps1）
※初回作成時はファイルが存在しないので作成する
```powershell:Microsoft.PowerShell_profile.ps1
function SetMFASessionToken() {
  Param([Parameter(Mandatory)]$token)

  # アカウントID、ユーザー名は書き換える
  # 有効期間は3600秒を設定
  $session = aws sts get-session-token `
    --serial-number arn:aws:iam::{アカウントID}:mfa/{ユーザー名} `
    --token-code $token `
    --duration-seconds 3600 `
    --profile default | ConvertFrom-Json

  # ユーザーの環境変数に設定
  [System.Environment]::SetEnvironmentVariable("AWS_ACCESS_KEY_ID", $session.Credentials.AccessKeyId, "User")
  [System.Environment]::SetEnvironmentVariable("AWS_SECRET_ACCESS_KEY", $session.Credentials.SecretAccessKey, "User")
  [System.Environment]::SetEnvironmentVariable("AWS_SESSION_TOKEN", $session.Credentials.SessionToken, "User")

  # プロンプトを開き直さなくてもよいように、プロンプト上の環境変数にも設定
  $env:AWS_ACCESS_KEY_ID = $session.Credentials.AccessKeyId
  $env:AWS_SECRET_ACCESS_KEY = $session.Credentials.SecretAccessKey
  $env:AWS_SESSION_TOKEN = $session.Credentials.SessionToken
}
```

## Powershell上でコマンドレットのように呼び出せる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/572307/97881b67-c182-5dc7-757b-4229dd615c79.png)

※動作確認環境※
AWS CLI：2.1.32
PowerShell：7.3.4
PlatformIOのインストールでハマった話と対処法

大学で使うということなので、WindowsのVSCodeに`PlatformIO IDE`をインストールしました。
その途中で詰まったので、対処法を記しておきます。

## 詰まった内容

VSCodeに`PlatformIO`をインストールすると、初期設定が走って進捗状況が右下の表示されます。プログレスバーが中盤に差し掛かった頃に、
```
PlatformIO: Can not find working Python 3.9+ Interpreter.
Please install the latest Python 3 and restart VSCode
```
というメッセージが表示されました。

その時の状況を再現することができなかったので、[同様のエラーが出ていたissue](https://github.com/platformio/platformio-core-installer/issues/1774)にあった画像を示しておきます。
![message.png](https://user-images.githubusercontent.com/2607849/140660638-cc13fe62-f12a-4e50-a7d8-8d50d9fdad25.png)

Ancondaを使って3.9以上のPythonは複数インストール済みでパスまで通しているので、エラーが出た事は理解できませんでした。

## 対処法1 指示通りPythonを追加でインストールする

調べると、[Windows環境のVisual Studio Code + PlatformIO IDEでエラーが起こる場合の対処法](https://zenn.dev/nemuki/articles/6c9a6f8a66d297)の記事があり、Python3系を新たにインストールすることで解決できるとのことでした。
実際、上記メッセージに[`Install Python`](https://docs.platformio.org/en/latest/faq/install-python.html)のボタンがあったので、リンク先ページに言われた通りにインストールしました。しかし、再起動したものの状況は変わりませんでした。

## 対処法2 PATHの優先順位を変える

VSCodeとPlatformIOで調べ続けると、[PlatformIO Community](https://community.platformio.org/t/problem-with-anaconda-installation-on-vscode/29874)で`Anaconda is not supported.`という文面を目にしました。
`where python`で調べてみると、PATHの優先順位的に`Anaconda`が最優先になっていました。このため、Python3を新しくインストールしても埋もれてしまい、状況が変わらなかったようです。
早速PATHの順番を変えて再度試してみると、無事インストールが成功しました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1120826/52f94dfb-ab7a-0485-ac7d-25c835ce1eb7.png)

## おわりに

今までAnacondaがあれば何でも対応できると思っていました。
Anacondaダメってことがあるんですね。
Salesforce 一般ユーザとシステム管理者のプロファイルを変更する

背景
Aさん：システム管理者
Bさん：Salesforce platform 一般ユーザ
Cさん：システム管理者

やりたいことはBさんとAさんのプロファイルを交代させることです。
とても初級問題で、Cさんでログインしてたら、一発で変えられますが、
Cさんが不在のため（:joy_cat:）ログインできず、ちょっとした工夫が必要になり、面白いなと思いました。

結論を言いますと
⓵Aさんがログインした後、AさんからCさんの代理ログインをします。
⓶Cさんの代理ログインをしている状態でAさんを無効化にします。（この時点で絶対にログアウトしちゃだめだよ！）
⓷Cさんの代理ログインをしている状態でBさんをシステム管理者に変更します。
⓸Cさんの代理ログインをしている状態でAさんを有効化にし、Salesforce platform 一般ユーザのプロファイルを割り当てます。

注意点としては
⓵システム管理者から一般ユーザプロファイルへ変更する前、リードやケースのデフォルト作成者や所有者をほかの権限あるユーザに割り当てしないといけないこと。
⓶プロファイルを変更した後、権限セットから外れる可能性はあります。
Salesforce正規表現を使って入力規則とフロー入力検証の違いを説明


Salesforceの入力規則とフローの入力検証の違いを一言でいうと
一般的の入力規則はtrueの時、エラーが発生します。
フローの入力検証はfalseの時、エラーが発生します。
つまり、同じ中身の反対を入力すれば、同じ効果になります。
例えば、
⓵オブジェクトのカタガナの項目にカタガナのみ入力させたいとき下記の数式を使います。
入力規則→エラー条件数式：NOT(REGEX(kana__c,"^[ア-ー]+$"))
その結果
![エラー画面1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3330192/97d024dd-dd4f-49f8-df50-e6bf00f51b9a.png)
⓶フロー項目の場合
入力を検証→数式：REGEX({!kana},"^[ア-ー]+$")
その結果
![エラー画面2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3330192/cd942d60-8a6e-e6dc-842c-877dc3365746.png)
その{!kana}というのはコンポーネントのAPI名になります。
![画面3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3330192/06340671-4056-4aa2-466a-974a9302c345.png)
RESTful APIのBackendリクエストについて

仕事をしていると意外と説明する機会が多いような気がしなくはない、フロントエンド・バックエンドについて備忘録を書いていこうと思います。

# MVC
:::details MVCとは
MVCモデルとは、プログラムを役割ごとにModel（モデル）・View（ビュー）・Controller（コントローラー）の3つに分けて管理するソフトウェア設計モデルのことです。 システムの保守性や生産性の向上を図ることができます。 Model・View・Controllerの頭文字を取ってMVCモデルと呼ばれます。
[参考Link](https://system-kaihatu.com/archives/3204#:~:text=MVC%E3%83%A2%E3%83%87%E3%83%AB%E3%81%A8%E3%81%AF%E3%80%81%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0,%E3%83%A2%E3%83%87%E3%83%AB%E3%81%A8%E5%91%BC%E3%81%B0%E3%82%8C%E3%81%BE%E3%81%99%E3%80%82)
:::
要するに、1つのサーバが、データをDBに取りにいって、WEBページをこねこね作って返してくれます。
![MVC.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1588937/e090fb2a-5ccc-eab8-a877-f8801bef8804.png)


# MVVM
:::details MVVMとは
MVVMとは、利用者に対する表示・操作の機能（ユーザーインターフェース）が存在するソフトウェアの構造を階層的に整理したモデルの一つで、全体を「Model」（モデル）-「View」（ビュー）-「ViewModel」（ビューモデル）の3層に分割にしたもの。
[参考Link](https://e-words.jp/w/MVVM.html#:~:text=MVVM%E3%81%A8%E3%81%AF%E3%80%81%E5%88%A9%E7%94%A8%E8%80%85,%E3%81%AB%E5%88%86%E5%89%B2%E3%81%AB%E3%81%97%E3%81%9F%E3%82%82%E3%81%AE%E3%80%82)
:::
要するに、WEBページを返してくれるサーバと、データを返してくれるサーバがそれぞれ分かれています。
![MVVM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1588937/96ac026f-d62b-6ac6-3e1f-0950704554e0.png)



# あとがき
最近はMVVMの形式が主流ですね。（たぶん）
文学部卒社会人が大学院で人工知能研究に挑戦〜4日目〜

本日の授業は
1. データサイエンス（入門）
2. 人工知能（概要）

でした。


## 本日の講義内容

ポイントだと思った部分をかいつまんでご紹介します。
※初学者ゆえ誤った内容を含む部分がある場合もあるのでご了承ください。

本日はどちらの授業についても初回のため、オリエンテーション的な位置付けで
・データサイエンスの概念や言葉の使われ方の変遷や歴史、世界における日本の位置付け
・人工知能の概要、歴史や変遷
の内容が中心でした

データサイエンス＝人工知能ではないということ。また現在ブームの機械学習やディープラーニングだけが人工知能というわけではないということを先生方はおっしゃってましたが、共通するのは学問としての歴史は他分野に比べはるかに浅いことや研究に大規模な設備投資が必要というわけではないため広く門戸が開れているので志高く頑張っていこうねということだと思いました。


## 本日の学習内容＆時間
- 予習：30分
- 授業：180分
- 自習：120分
    -　スマートシティにおけるAIの活用についての調査 
    -　統計（回帰分析）

計：330分（約6時間半）

明日は授業３コマ。はやくもこの調子だとやばそうだと痛感。。。
読みやすいコードとは【備忘録】

### はじめに  
この記事では、私が色々な本を読み得た「読みやすいコード」についての知見を記述しています。
備忘録のようなテンションで書いています。
ご理解ください。

*ゆっくり更新していきます

### なぜ読みやすいコードを書くべきなのか
コードが読みやすくなることで、どこに何が書いてあるのかを理解し易くなる。
　　　　　　　　　　　　　↓
開発者が正確にコードを理解でき、バグが生じるリスクが減少したり、開発速度が上がる。また、バグが発生した場合でも修正がし易くなる。

#### アーキテクチャの適用
そもそも、ViewControllerにベタ書きされているコードは行数も多く、責務分離もできておらず可読性は低いです。
そこでMVC・MVVM・VIPERなどなど数ある設計パターンを適用し、責務を分離させることでグッと可読性が向上します。（同時に効率性も向上するので、処理速度も良くなります）

#### 分かりやすい命名
・意味不明な省略をせずに、誰もが意味や役割が簡単に理解できる名前にする
・正確且つ説明的な名前にする
・何かの動作について記述している関数であれば、どんな動作をしているのか分かる名前にする
・基本的には、クラスや変数は(形容詞)　+ 名詞、関数は命令形（動詞から始める）の語句を用いる
・肯定的な語句を用いる(enable, disable...)

#### 関数
・ベタ書きをせずに、一定のまとまりを関数として切り分ける
・関数が持つ責務は1つにする
・必ず自身のインスタンス変数を使う
・コマンドとクエリを分離させる→[CQS](https://qiita.com/pakkun/items/7dc5a9b6bc57225a3673)
・引数は不変にする（変更する場合は、ローカル変数に代入）
・エラーは戻り値で返さない（その場で対処する）

#### ネストを深くしすぎない
 ・早期return、早期breakを有効に活用する
・条件分岐を一箇所にまとめる（単一責任選択の原則）
・メゾットチェインを使う
・[ストラテジーパターン](https://qiita.com/Howasuto/items/267f152378809b98ef6d)を使う

#### クラス
・class単体でも動作するように設計する（インスタンス変数とそれを操作する関数を備えたクラス）
・意味がある単位ごとにclass化をする→ex) 計算アプリ: 定価class, 割引class, 割増class...

#### コメント
・（関数や変数に正しい命名をして）極力少ない文章で説明する
・関数は何を返すのか、何をいじるのかを説明する
・副作用を持つ関数は、その内容を説明する
・各行に書かないで、ある程度のまとまりについての説明をする

#### 状態
・基本的には不変な値を使う
・計算ロジックはデータ保持側に持たせる
・コード外とのやりとり（データベースなどとの通信）は局所化する→[Repository型](https://qiita.com/kazakago/items/1d6477b8d4dc628522e7#リポジトリパターン)

### まとめ
上記の事を意識してコードを書くことで、自分も共同開発者も読み易くなり、開発効率が向上したり、バグの撲滅につながると考えています。
ぜひ、参考にしてください。

### 参考文献
・[読みやすいコードのガイドライン（著者：石川宗寿）](https://www.amazon.co.jp/%E8%AA%AD%E3%81%BF%E3%82%84%E3%81%99%E3%81%84%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E3%82%AC%E3%82%A4%E3%83%89%E3%83%A9%E3%82%A4%E3%83%B3-%E6%8C%81%E7%B6%9A%E5%8F%AF%E8%83%BD%E3%81%AA%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E9%96%8B%E7%99%BA%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AB-%E7%9F%B3%E5%B7%9D-%E5%AE%97%E5%AF%BF/dp/429713036X/ref=asc_df_429713036X/?tag=jpgo-22&linkCode=df0&hvadid=588889454778&hvpos=&hvnetw=g&hvrand=9759340808861884760&hvpone=&hvptwo=&hvqmt=&hvdev=c&hvdvcmdl=&hvlocint=&hvlocphy=1009218&hvtargid=pla-1776418963394&psc=1&th=1&psc=1)

・[良いコード/悪いコードで学ぶ設計入門（著者：仙塲大也）](https://www.amazon.co.jp/%E8%89%AF%E3%81%84%E3%82%B3%E3%83%BC%E3%83%89-%E6%82%AA%E3%81%84%E3%82%B3%E3%83%BC%E3%83%89%E3%81%A7%E5%AD%A6%E3%81%B6%E8%A8%AD%E8%A8%88%E5%85%A5%E9%96%80-%E2%80%95%E4%BF%9D%E5%AE%88%E3%81%97%E3%82%84%E3%81%99%E3%81%84-%E6%88%90%E9%95%B7%E3%81%97%E7%B6%9A%E3%81%91%E3%82%8B%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E6%9B%B8%E3%81%8D%E6%96%B9-%E4%BB%99%E5%A1%B2/dp/4297127830/ref=sr_1_1?adgrpid=135514740676&hvadid=651268234029&hvdev=c&hvlocphy=1009218&hvnetw=g&hvqmt=e&hvrand=5595326048092858522&hvtargid=kwd-1708234924487&hydadcr=13647_13521629&jp-ad-ap=0&keywords=%E8%89%AF%E3%81%84%E3%82%B3%E3%83%BC%E3%83%89+%E6%82%AA%E3%81%84%E3%82%B3%E3%83%BC%E3%83%89&qid=1681483821&sr=8-1)
【シェルスクリプト】ディレクトリの有無を判定する方法

## ディレクトリの有無を判定する方法

以下のようにするとディレクトリが存在する場合に`true`となります。  

```zsh
if [ -d ディレクトリ ]; then
  コマンド
fi
```

また以下のようにするとディレクトリが存在しない場合に`true`となります。  

```zsh
if [ ! -d ディレクトリ ]; then
  コマンド
fi
```
【令和5年最新版】エクスプローラーのコンテキストメニューに Markdown の「新規作成」を追加しよう

Markdown ファイルを新規作成するとき、エディターから新規作成したりまずテキストファイルを作成して拡張子を書き換えたりしていました。
先達の記事を参考にしながら、Windows11で令和5年最新版のスクショを交えてまとめました。

# 目的
- エクスプローラーのコンテキストメニュー（右クリックメニュー）の「新規作成」に Markdown ファイルを追加する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1107938/45f2be18-dcfb-190f-53d9-2ab2544bc057.png)

# 環境
- Windows 11 Home 22H2

# 手順

:::note alert
レジストリをいじります！
誤った操作をするとOSの再インストールが必要になる場合があります！
不安な場合はコンピューターの先生に相談しよう！
:::
## 1. 拡張子 .md のレジストリキーを編集
1. レジストリ エディター を起動する
    1. 検索バーに `regedit` と入力して起動する
    1. 変更を加えることを許可する
1. `HKEY_CLASSES_ROOT` を開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1107938/ecaf0e33-8a06-2250-5302-33beec43aca3.png)
1. `.md` を選択
    1. ない場合は追加します（`HKEY_CLASSES_ROOT`右クリック→新規→キー→`.md`と入力）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1107938/02a666c5-5994-8b04-626c-64eba103cf9c.png)
1. 既定を右クリック→修正→`markdown`と入力
1. `.md`を右クリック→新規→キー→`ShellNew`と入力
1. `ShellNew`を右クリック→新規→文字列値→`NullFile`と入力

## 2. ファイルタイプ markdown のレジストリキーを追加する
1. `HKEY_CLASSES_ROOT`右クリック→新規→キー→`markdown`と入力
1. 既定を右クリック→修正→`Markdown file`と入力

:::note
ここでの入力がコンテキストメニューの選択肢として表示されます。
:::

## 3. エクスプローラーを再起動する
1. タスクマネージャーを起動する
    1. タスクバーを右クリック
    1. タスクマネージャーを起動
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1107938/bb7b0ac9-b89e-e9ec-f63e-8df8fefe8e0c.png)
1. エクスプローラーを右クリック→再起動
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1107938/4118c703-aed4-8d12-5f42-33c5a2474f4f.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1107938/61bc62fe-5a5a-6c63-3a11-764d85587ac5.png)
やったぜ！

# 参考

https://qiita.com/kekenonono/items/3a2873d0a134160b4f4f

https://qiita.com/do-gugan/items/a105235d149ffbecbd3b

https://loumo.jp/archives/28108
GPT4とGPT3.5の性能差を, GPT4に漫画などに例えてもらう

# 概要
社内でchatGPTをお勧めするために
直接GPT4に漫画に例えてもらって営業しました.



# 結論
凄い自信
スーパーサイヤ人ブルーが何なのかもう分からない


# ドラゴンボール
![スクリーンショット 2023-04-14 23.09.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118627/c28172e2-5024-2bf0-4f40-93764b2674bb.png)



# ガンダム
![スクリーンショット 2023-04-14 23.10.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118627/8a570e38-d2ab-7945-dd9c-5b62dea8251d.png)



# ハンターハンター
![スクリーンショット 2023-04-14 23.15.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118627/a2738403-1b5b-f4a5-a570-f983fb83a897.png)




# 鬼滅の刃
![スクリーンショット 2023-04-14 23.17.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118627/43e48627-1a84-3fec-73fc-91bc1bf51a7a.png)



# ワンピース
![スクリーンショット 2023-04-14 23.25.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118627/836c5bb0-e539-73f2-e04a-bad1ac606cf3.png)



# ジョジョ
![スクリーンショット 2023-04-14 23.28.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118627/401547ee-4f7f-3062-b4a4-7a9e865a61d8.png)



# るろうに剣心
![スクリーンショット 2023-04-14 23.31.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118627/fdae15f8-d1b2-0490-22d7-8be6f1f7f1fb.png)



# ダイの大冒険
![スクリーンショット 2023-04-14 23.35.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118627/1f6d5825-5572-872f-e6ce-12e5c5de0b50.png)
2018年に開発が終了した二段階認証アプリのAuthenticator Plusの認証情報をエクスポートして他のアプリに乗り換える方法

Authenticator Plusという二段階認証のワンタイムパスワード（TOTP）を生成・管理するアプリがあります。このアプリはすでに開発終了していて、現行のAndroidの新しいAPIレベルに対応できていません。
そのため「Export As Text and HTML」や「Backup to SD Card」（authplus.db）などが失敗します。

詳細を調べるとこのアプリはAndroid10まで動いて、Android11以降はSecret Keyなどの機密情報のエクスポートが正常に動作しないようです。

# 解決方法

1. 実機から「Backup to SD Card」（authplus.db）で認証情報を書き出す
1. Android10のエミュレータ（以下エミュレータ）にAuthenticator Plusをインストール
    2.a. エミュレータにバックアプしたDBを入れ、「Export As Text and HTML」で書き出し
    2.b. エミュレーターから再度書き出したauthplus.dbにSQLiteでクエリを発行しQR生成

2.aと2.bはどちらでもいけますが、簡単で確実なのは2.aです。


https://github.com/beemdevelopment/Aegis/issues/607

https://blog.nigelsim.org/2021-01-15-extracting-authenticator-plus/

# 以下エミュレータの導入＆操作方法のまとめ
簡単なメモをまとめておきます。

## Android 10を入手する

https://developer.android.com/about/versions/10/get?hl=ja

## エミュレータ内のファイルを見る方法
Android Studio > View > Tool Windows > Device File Explorer

/mnt/sdcard 以下にMainStrageのデータが入っている

## エミュレーターにアプリをインストールする方法
* 実機からアプリバックアップアプリでapkをPCへぶっこ抜く
* PC上でエミュレータにドラッグ・アンド・ドロップでアプリをインストール完了

## エミュレータにテキストを貼り付ける方法
マウスorタッチ長押し→貼り付け
M1macでのPostgreSQLのインストールなど

PostgreSQLのインストールが上手くいかなかったので忘れないように

今回の環境は
＊macOS M1
＊postgresql-14.7

# PostgreSQLでバージョンを指定しないとエラーが発生
### HomebrewでPostgreSQLをインストール
```
$ brew install postgresql
Warning: No available formula with the name "postgresql". Did you mean postgresql@13, postgresql@12, postgresql@11, postgresql@15, postgresql@10, postgresql@14, postgresql@9.5, postgresql@9.4, postgrest or qt-postgresql?
postgresql breaks existing databases on upgrade without human intervention.

See a more specific version to install with:
  brew formulae | grep postgresql@

```
バージョンを指定してくださいとの警告
# 解決策
### HomebrewでPostgreSQLをインストール
```
$ brew install postgresql@14
~~
==> Summary
🍺 /opt/homebrew/Cellar/postgresql@14/14.7: 3,314 files, 45.2MB
~~
```
バージョンを指定しないとエラーが発生するので@14のようにバージョンを指定


```
$ psql --version
psql (PostgreSQL) 14.7 (Homebrew)
```
インストールされたか確認

DBをUTF-8で初期化
```
$ initdb /usr/local/var/postgres -E utf8
The files belonging to this database system will be owned by user "sf213471118".
This user must also own the server process.

The database cluster will be initialized with locale "ja_JP.UTF-8".
initdb: could not find suitable text search configuration for locale "ja_JP.UTF-8"
The default text search configuration will be set to "simple".

Data page checksums are disabled.

initdb: directory "/usr/local/var/postgres" exists but is not empty
If you want to create a new database system, either remove or empty
the directory "/usr/local/var/postgres" or run initdb
with an argument other than "/usr/local/var/postgres".
```

# postgreSQLの起動/停止
### postgreSQLの起動
```
$ brew services start postgresql@14
==> Successfully started `postgresql@14` (label: homebrew.mxcl.postgresql@14)
```
このコマンドもバージョン指定しないとエラーになる

### postgreSQLの停止
```
$ brew services stop postgresql@14
Stopping `postgresql@14`... (might take a while)
==> Successfully stopped `postgresql@14` (label: homebrew.mxcl.postgresql@14)
```
こちらもバージョン指定する

参考にした記事
https://qiita.com/sf213471118/items/0e843af332ea0210c810
SourcetreeでGithubリポジトリをクローンできない

# 現象
タイトルの通りクローンに失敗した
また再現すると困るので備忘的に残す

## 環境
M1 Macbook Pro
Sourcetree バージョン：4.0.1

## エラーメッセージ
` 有効なソースパス/urlではありません`

```
git@github.com： パーミッションが拒否されました（publickey）。
fatal: リモートリポジトリから読み取れませんでした。

正しいアクセス権を持っていることを確認してください
となり、リポジトリが存在します。
git@github.com： パーミッションが拒否されました（publickey）。
fatal: リモートリポジトリから読み取れませんでした。
```


# 解決方法
設定＞アカウント
プロトコルをSSHにしていたが<strong>HTTPS</strong>に変更したら解決した

![Cursor_と_アカウント.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3120926/31cee61f-518c-f4ef-f4b3-4d811459b8e7.jpeg)

再度SSHに変更したらエラーが再現できなかったため、一時的なバグだったかもしれない。。
【初学者】Web技術基本用語まとめ

## はじめに
実務で曖昧に使用している用語について、改めてまとめていきます

## この記事の対象者
- プログラミング初学者

### ライブラリ
- プログラムの部品を集めてひとまとめにしたもの

### フレームワーク
- 全体の処理の流れを枠組みにしたプログラムのこと

### ミドルウェア
- DBサーバーなど、OSとアプリケーションの間で特別な機能を提供するもの

### API
- Application Programming Interface
- 別のプログラムからある機能を使うために窓口のこと

### ステートレス
- 状態を**保持しない**こと
- HTTPのように、リクエスト/レスポンスの１往復のやりとりが**完結された処理**とみなされ、複数の処理を関連づける仕組みがないことをステートレスという

### ステートフル
- 状態を**保持**すること
- 直前の処理を覚えておき、次の処理内容に反映させるような方式
- ステートフルは、多くの状態を保持しなければならないため、ステートレスより負荷が高い

### クッキー
- HTTPのように**ステートレスなプロトコルを使用する**場合に、状態を保持し管理する必要がある場合に、クッキーと呼ばれるデータが用いられる
- Webサーバへ接続してきたWebブラウザに対して、コンテンツなどと一緒に**Webブラウザに保持してもらいたい情報**をクッキーとして送る
- 受け取ったクッキーを、Webブラウザは保存しておき、次にWebサーバに接続する際にクッキーを送信することで、Webサーバは**相手を識別**することができる
- 有効期限が設定されていないクッキーは、**セッションクッキー**と呼ばれ、ブラウザを閉じると削除される

### クライアントサーバシステム
- コンピュータの機能や情報を提供する``サーバ（server）``と、サーバを利用する``クライアント（client）``に分けて通信を行うコンピュータネットワークモデル

### リクエスト
- クライアントからサーバに対する**要求**のこと

### レスポンス
- クライアントから受けたリクエストに対する**応答**のこと

### プロトコル
- クライアントからどういうリクエストを受け取り、サーバがどういうレスポンスを返すのかの**ルール**のこと
- HTTP、SSL、HTTPSなどが存在する
- HTTP：Web通信のルール
- SSL：通信の情報を暗号化するルール
- HTTPS：HTTPとSSLを組み合わせたもの

### IPアドレス
- コンピュータに割り当てられた**インターネット上の住所**のようなもの
- インターネットに接続された**コンピュータを特定**し、データの行先を管理する
 
### ポート番号
- コンピュータが提供する**サービスを指定**するための番号
- IPアドレスでコンピュータを指定し、さらにコンピュータ内部にある各サービスを識別するために利用される
- 一般的にWebサーバであれば80番といったようにポート番号が決まっており、サービスを識別できる

## 最後に
いかがでしたでしょうか。

今回は、Web技術の基本用語についてまとめました。
理解不足な点などありましたら、ご指摘お願いします。
Ubuntu 22.04のMySQL8.0でlower_case_table_names=1に変更する

Windows環境で構築したサーブレットシステムをUbuntuに移植しようとしてMySQLでハマりました。なんとか解決したのでまとめておきます。

# 開発環境
Ubuntu 22.04
Java 11.0.18
Tomcat9
Apache2

# 問題の発生
Ubuntu上にMySQLをインストールし、Windows環境で開発したサーブレットを移植し実行すると、最初のログイン認証でエラーが出て落ちます。UbuntuにEclipse環境を作ってデバッグすると、

> [ESSR0072]SQLで例外 ・・・Table 'xxxxxx.USER' doesn't exist

とエラーが出力されます。はて、userテーブルのはずだけど、なんで大文字？ということで、調べると、「[MySQL 8.0 リファレンスマニュアル　9.2.3 識別子の大文字と小文字の区別](
https://dev.mysql.com/doc/refman/8.0/ja/identifier-case-sensitivity.html)」に、

>Windows では大文字と小文字が区別されませんが、ほとんどの種類の Unix では大文字と小文字が区別されます。

とあります。

どうやら、lower_case_table_namesシステム変数を1にすればいいようですが、

> lower_case_table_names は、サーバーの初期化時にのみ構成できます。 サーバーの初期化後の lower_case_table_names 設定の変更は禁止されています。

とあり、これを設定するのがとにかく大変でした。いろいろ調べて、何度、MySQLをアンインストールしては再インストールをすると繰り返したか。MySQL5.7で、lower_case_table_names=1にするのは簡単そうなので、いっそダウングレードしようかと思いましたが、MySQL Database 5.7のサポート期限は2023年10月だそうで、8.0で頑張るしかありません。

やっと、こちらのコメントを参考に成功したのでまとめておきます。
[lower_case_table_names=1 on Ubuntu 18.04 doesn't let mysql to start](https://stackoverflow.com/questions/53103588/lower-case-table-names-1-on-ubuntu-18-04-doesnt-let-mysql-to-start)

# 解決手順
## ① root ユーザに切り替え
$sudo su

## ② MySQL をインストール
未インストールの場合は、まず普通にMySQLをインストールします。

#apt-get install mysql-server

## ③ 構成ファイルをバックアップ
この構成ファイルのバックアップをあとで使います。

#cp /etc/mysql/mysql.conf.d/mysqld.cnf /etc/mysql/mysql.conf.d/mysqld.cnf.backup

## ④ MySQLのストップ
#service mysql stop

## ⑤ アンインストール
一旦、MySQLのアンインストールとすべてのデータベースと関連データを削除します。

#apt-get --purge autoremove mysql-server
#rm -R /var/lib/mysql

## ⑥ 保存した構成ファイルを復元
③で保存した構成ファイルを復元します。

#cp /etc/mysql/mysql.conf.d/mysqld.cnf.backup /etc/mysql/mysql.conf.d/mysqld.cnf

## ⑦ lower_case_table_names=1を記述
構成ファイルをエディタで開いて、[mysqld]の最後にlower_case_table_names=1を追加します。

#vim /etc/mysql/mysql.conf.d/mysqld.cnf

[mysqld]
lower_case_table_names=1

## ⑧ 構成ファイルを保持してMySQL を再インストール
途中で、構成ファイルの保持を聞かれるので、「N」を入力します。

#apt-get install mysql-server

パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています... 完了        
状態情報を読み取っています... 完了        
以下の追加パッケージがインストールされます:
　　（中略）
設定ファイル '/etc/mysql/mysql.conf.d/mysqld.cnf'
 ==> あなたかスクリプトによって設定ファイルが作成されています。
 ==> パッケージメンテナが提供するパッケージにもこのファイルが存在します。
   どうしますか? 以下の選択肢があります:
    Y か I  : パッケージメンテナのバージョンをインストールする
    N か O  : 現在インストールされている自分のバージョンを残す
      D     : 両バージョンの差異を表示する
      Z     : 状況を調査するためにシェルを開始する
 デフォルトでは現在使っている自分のバージョンを残します。
*** mysqld.cnf (Y/I/N/O/D/Z) [デフォルト=N] ? N
（後略）

## ⑨ MySQLスタート
#service mysql start

## ⑩ lower_case_table_namesの確認
デフォルトでは0だったlower_case_table_namesが1になっているのが確認できます。

#mysql -u root -p

mysql> show variables where variable_name='lower_case_table_names';
+------------------------+-------+
| Variable_name          | Value |
+------------------------+-------+
| lower_case_table_names | 1     |
+------------------------+-------+

mysql> exit





以上です。
これで無事にサーブレットのログイン認証ができるようになりました。
Crystalで自作ライブラリにバージョンナンバーをつける

## はじめに

Crystal言語は、Rubyとは異なり、shard.ymlにバージョンナンバーを明示する文化がある。
Rubyでは、gemspecに直接バージョンナンバーを書き込むのは好ましくないとされており、VERSION定数を参照する。

Crystalでは、VERSION定数を指定しなければならないという決まりはない。しかし、Rubyの文化を踏襲して、VERSION定数が指定されていることも多い。しかし、shard.yml とVERSION定数の両方でバージョンナンバーを記述すると、記述が二重で冗長である。

## 結論

Shardsに書かれたバージョンナンバーを、マクロを使って参照するということが行われる。
具体的には下記のように書けばいい。

```crystal
module PIYO
  VERSION = {{ `shards version #{__DIR__}`.chomp.stringify }}
end
```

このようにすることで、バージョンナンバーの定義はshard.ymlに集約される。

この記事は以上です。
github上で削除したブランチ、ローカル(git origin)も削除したい（メモ）

# 方法

```bash:リモートでブランチ削除済みをローカルに反映
git fetch --prune
```

とのことでした。


# 調べた流れ

## google検索

「git originブランチ 削除 githubに既にない」で検索した結果、`git push --delete origin ブランチ名` コマンドと言われたので実行するもエラー。

前もこうなった気がした。
折角なので話題な[ChatGPT](https://chat.openai.com/)に相談することに。

## ChatGPT

![スクリーンショット 2023-04-14 22.29.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2847454/44a96ad7-d2a2-d161-536e-e411d9219474.png)


エラーになる解答しか返って来ませんでした。なので、エラーを添えてもう一度聞いてみた。

![スクリーンショット 2023-04-14 22.31.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2847454/ff57779f-9c02-1c10-7f4a-7e5246001e17.png)

解決しました！...凄い
（よく見ると、コードタイトルがsqlって...）


## 後日談

結局、参考にならないと思っていたGoogleの上位2つ候補サイトでも記事中盤部分に書かれていたし、４つ目には直接な解法があったという......
- 上位2つ
    - https://www.freecodecamp.org/japanese/news/how-to-delete-a-git-branch-both-locally-and-remotely/
    - https://www-creators.com/archives/1062
- 4つ目
    - https://www.r-staffing.co.jp/engineer/entry/20201023_1

これは、ChatGPTを使うには時期尚早(?)だったな...
（何故に気付かなかったんだろ）
オブジェクト指向って何？～イントロダクション～

# オブジェクト指向って？

初学者による第一弾記事は、誰しもが引っかかるオブジェクト指向についての記事を書こうと思います。
まず初めに、本記事は自分の学習内容を備忘録的に記載していくので初学者の方と一緒に勉強していくスタイルです！
オブジェクト指向そんなに甘くないよというお声もあると思いますが、まずは慣れるところから行きます。

## ソフトウェアを楽に作る
"オブジェクト指向でなぜつくるのか"という名著によると、
オブジェクト指向というのはそもそも"ソフトウェアを楽に作るため"に使うそうです。

ほぉ　一番難しいと思っているのにどういうこと？

用語も呪文のようにプログラミングでしか聞かない言葉もいっぱいあるし、
なんか分かった気になって実装しようとするとうまくいかないし…。

ということでまずは用語になれる所から始めます。

## classとインスタンス
まず初めにこの二つから
・class "設計図"
・インスタンス　"モノ"
これは対に考えていくといいみたいです。

classを実行すると物であるインスタンスが出来上がる。

このclassやインスタンスに対して何か変数を持たせたいと思ったときに登場するのがメソッドですね。

下記はPersonというclassに二つのインスタンスメソッドを定義してあります。
```
class Person
　# インスタンメソッドであるイニシャライズメソッド
  def initialize(name, age)
    @name = name
    @age = age
  end
　# 自己紹介をするメソッドです。
  def greet
    "Hello, my name is #{@name} and I am #{@age} years old."
  end
end

person = Person.new("Alice", 30)
puts person.greet # => "Hello, my name is Alice and I am 30 years old."

```
## initialize メソッド
initializeメソッドはインスタンスを初期化するものになります。
なんか初期化ってよくわからないけど設計図どおりにインスタンスを生成するというイメージです。

今回のインスタンスを言葉にすると
initialize(name,age)
引数の名前と年齢ちょうーだい！

お次にdef greet に関しては自分で定義しているメソッドです。
initializeメソッドでもらった引数で、自己紹介の挨拶するね！

なので、person = Person.new("Alice", 30)で"Alice"という名前と"30"歳という引数をあげると
 ```
                   　(@name)         　(@age)
"Hello, my name is  　Alice　 and I am　 30　  years old."
```

ここだけならなんかめちゃ簡単にみえますね。

次の記事ではポリモーフィズムについて書きます。

[ポリモーフィズムって？](https://) (準備中)

参考文献

[オブジェクト指向でなぜつくるのか 第３版](
https://www.amazon.co.jp/%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E6%8C%87%E5%90%91%E3%81%A7%E3%81%AA%E3%81%9C%E3%81%A4%E3%81%8F%E3%82%8B%E3%81%AE%E3%81%8B-%E7%AC%AC%EF%BC%93%E7%89%88-%E7%9F%A5%E3%81%A3%E3%81%A6%E3%81%8A%E3%81%8D%E3%81%9F%E3%81%84OOP%E3%80%81%E8%A8%AD%E8%A8%88%E3%80%81%E3%82%A2%E3%82%B8%E3%83%A3%E3%82%A4%E3%83%AB%E9%96%8B%E7%99%BA%E3%81%AE%E5%9F%BA%E7%A4%8E%E7%9F%A5%E8%AD%98-%E5%B9%B3%E6%BE%A4-%E7%AB%A0-ebook/dp/B092HDFJKK/ref=sr_1_1?adgrpid=66215873512&hvadid=655037513238&hvdev=c&hvlocphy=1009540&hvnetw=g&hvqmt=e&hvrand=15396777849912557355&hvtargid=kwd-659533404469&hydadcr=27295_14669489&jp-ad-ap=0&keywords=%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88+%E6%8C%87%E5%90%91+%E3%81%A7+%E3%81%AA%E3%81%9C+%E3%81%A4%E3%81%8F%E3%82%8B+%E3%81%AE%E3%81%8B&qid=1681479351&sr=8-1)
SQLのNOT LIKE演算子はNULL値のカラムには適用されない

SQLにおけるLIKE演算子は、文字列の一部に一致するかどうかを確認する際に使用されます。その中には、否定の条件を満たすNOT LIKE演算子もあります。しかし、注意すべき点として、NULL値のカラムに対してはNOT LIKE演算子が適用されません。

このことに気付かずバグを作ってしまったので備忘録を残します。

# なぜ適用されないのか

SQLでは、NULLは値が存在しないことを表します。つまり、NULL値のカラムには実際には何も格納されておらず、データが欠損している状態です。そのため、NULL値のカラムに対しては、通常の比較演算子やパターンマッチング演算子が適用されないのです。

特に、NOT LIKE演算子は、あるパターンに一致しない値を取得する際に使用されます。しかし、NULL値のカラムに対しては、パターンが存在しないため、結果が得られず、出力されません。

例えば、以下のようなSQLクエリがあるとします。

```sql
SELECT * FROM users WHERE name NOT LIKE '%John%';
```

上記のクエリの場合、以下のデータのみ出力されます。

```
ichirou -> 出力される
zirou -> 出力される
John kenedy -> 出力されない
John -> 出力されない
NULL -> 出力されない
```

NULL値を含むカラムに対しては、IS NULL演算子やIS NOT NULL演算子を使用するなど、適切なNULL値の扱いを考慮したクエリを組み立てる必要があります。
Mac+Edge+BingAIで日本語確定時に送信されてしまう問題を解決する方法

BingAI便利ですよね。
ただ、mac＋edge+google日本語入力だと、漢字変換確定時のEnterで自動的に送信されてしまうバグがあります。
何度か報告していますが、まったく直る気配がありません。

ひとまず下記対策でなんとかなりあす。

1. [tampermonkey](https://microsoftedge.microsoft.com/addons/detail/tampermonkey/iikmkjmpaadaobahmlepeloendndfphd)という拡張機能を入れる
2. [ここにあるユーザースクリプト](https://gist.github.com/koseki/d377f8f2e6df6655a1e160a4e03421d1)をありがたくお借りする

上記gistに移動し、rawを押したら自動的にtampermonkeyで使用しますか、みたいな画面になるので、使用するを選ぶといい感じになりました。