OmniAICreator/Qiita-1.07M huggingface dataset:
【Ruby】requireとrequire_relativeの違い

# はじめに
こんにちは、Ruby絶賛勉強中のものです。
「たのしいRuby」という書籍を使用して勉強しているのですが、そこで`require`と`require_relative`についての説明がありました
`require`は既存のライブラリを読み込むときに使用し、`require_relative`は相対パスの際に使用する旨が書いてありました。
外部ライブラリや絶対パスの場合について言及されていなかったので詳しく調べてみました。

環境：`Ruby 3.3.5`

# `require`とは
`require` は、指定したライブラリやファイルを読み込む際に使います。
`require` を使う場合、通常はRubyのライブラリの検索パス (`$LOAD_PATH`(後に説明します) もしくは `$:` として参照される) から指定されたファイルを検索します。
また、ファイルパスは<strong>絶対パスまたは `$LOAD_PATH` </strong>に基づいて検索されます。

続いてどのような場面で使用されるのでしょうか。
* Ruby標準ライブラリや、Gemなどの外部ライブラリを読み込む際に使用。
* 明示的に絶対パスを使ってファイルを指定する場合にも使用される。
本書で言及のなかった外部ライブラリや絶対パスの場合は`require`を使用するということです

```ruby:req1.rb
require 'date'      # Ruby標準ライブラリ
require 'json'       # 外部ライブラリ（Gemなど）
require '/path/to/file' # 絶対パスでファイルを読み込む
```

### `$LOAD_PATH`とは？
さらっと出てきた`$LOAD_PATH`とは何者なのでしょうか。
Rubyはファイルを読み込む(`require`など)際に、ある特定のディレクトリを検索します。
この検索するディレクトリのリストを`$LOAD_PATH`（もしくは`$:`）と呼びます。
`require`を使うと、この`$LOAD_PATH`に含まれるディレクトリを検索し、指定したファイルを見つけて読み込みます。

例えば、`$LOAD_PATH`に以下のようなディレクトリが含まれている場合を考えます
```ruby:
["/usr/local/lib/ruby/site_ruby", "/usr/local/lib/ruby/vendor_ruby", "/usr/lib/ruby/2.7.0"]
```
ここに存在するファイルであれば、ファイル名だけを指定してrequireで読み込むことができます。
```ruby
require 'mylibrary'
```

すでに`Linux`を勉強している方ならわかるかもしれませんが、この仕組みは`Linux`の `PATH` 環境変数と似ています。

`Linux`では、例えば `ls` コマンドを実行すると、システムは `PATH` にリストされたディレクトリの中から `ls` の実行ファイルを探します。
Rubyでは、`require 'mylibrary'` と書くと、Rubyは `$LOAD_PATH` にリストされたディレクトリから `mylibrary` という名前のファイルを探してロードします。

# `require_relative` の特徴
`require_relative` は、指定したファイルを <strong>現在のファイルの相対パス</strong> で読み込む際に使用します。
これにより、`require_relative` は、現在のファイルと同じディレクトリやサブディレクトリにあるファイルを簡単に読み込むことができます。
`require_relative`は以下の場面で使用されます。
* 自分のプロジェクト内のファイルを、現在のファイルの場所を基準にして読み込みたいときに使う。
* 小規模なプロジェクトや、複数のファイルが同じディレクトリ内またはディレクトリ階層にある場合に便利。
1つ目は本書に書いてあった相対パス指定するということ、2つ目は1つ目の特徴を生かした特徴です。

```ruby
require_relative 'my_class'         # 現在のファイルと同じディレクトリ内の my_class.rb を読み込む
require_relative '../utils/helper'  # 1つ上のディレクトリにある helper.rb を読み込む
```

# まとめ
本日は`require`と`require_relative`について特徴や違いについて説明しました。
`require`は標準ライブラリや外部ライブラリ（Gem）を読み込む場合や、絶対パスを使う場合に使用。
`require_relative`は相対パスで自作のファイルを読み込む場合に使用。
と覚えておきましょう。
内容に誤りやこの表現のほうがいいよというアドバイスがありましたら、コメントお待ちしております。
htmlで縦書き推進はいいが、数字とアルファベットは縦にしたい

<h2>サンプル</h2>

[maxiphorism（世界の名言・金言）](https://maxiphorism.netlify.app/)









<h2>CSS</h2>

```vartivcal.css
.vertical-text {
    float:right;
    writing-mode: vertical-rl; /* 縦書き、右から左 */
    text-align: top right; /* 文字の水平方向の揃え */
    font-family: '明朝', serif; /* フォントを明朝体に設定 */
    /* 上部に寄せるための追加 */
    height:90%;
    /*display: flex; /* フレックスボックスを使用 */
    flex-direction: column; /* 縦方向に配置 */
    justify-content: flex-start; /* 上端に揃える */
    overflow-x: auto; /* 横方向にスクロールバーを表示 */
    width: 100%; /* 親要素の幅に合わせて広げる */
}
.number {
    text-orientation: upright; /* 数字を横向きに */
}
td{
    vertical-align: top;
}
```




<h2>JavaScript</h2>

```int_alphabet_vartivcal.js

//********* この例ではtdを対象としています **********
const tds = document.querySelectorAll('td.main_cont, td.nam');

tds.forEach(td => {
  const textNode = td.childNodes[0];
  //********* テキストノードが存在し、かつテキストが空でない場合 **********
  if (textNode && textNode.nodeType === Node.TEXT_NODE && textNode.nodeValue.trim()) {
    const words = textNode.nodeValue.split(' ');
    const newText = words.map(word => {
      const number = word.replace(/[^a-zA-Z0-9”]/g, '');
      //********* style numberを適用 **********
      return number ? `<span class="number">${word}</span>` : word;
    }).join(' ');
    td.innerHTML = newText;
  }
});
```

<h2>html</h2>

```sample.htm
<table>
  <tr><td class="main_cont">一羽のツバメが来ても夏にはならないし、一日で夏になることもない。
  このように、一日もしくは短い時間で人は幸福にも幸運にもなりはしない。</td><td class="nam">アリストテレス</td></tr>
  <tr><td class="main_cont">一人ひとりに天の使命があり、その天命を楽しんで生きることが、処世上の第一要件である。</td><td class="nam">渋沢栄一</td></tr>
  <tr><td class="main_cont">明日死ぬかのように生きよ。
  永遠に生きるかのように学べ。</td><td class="nam">ガンジー</td></tr>
  <tr><td class="main_cont">今の時間を大事にできない人は、未来の時間もきっと大事にはできない。</td><td class="nam">平尾誠二</td></tr>
  <tr><td class="main_cont">今日一日をできるだけ利用するのだ。</td><td class="nam">デール・カーネギー</td></tr>
  <tr><td class="main_cont">常識とは十八歳までに身につけた偏見のコレクションのことをいう。</td><td class="nam">アインシュタイン</td></tr>
  <tr><td class="main_cont">国王であれ、農民であれ、家庭に平和を見いだせる者が、もっとも幸せである。</td><td class="nam">ゲーテ</td></tr>
  <tr><td class="main_cont">効率や損得にとらわれると、人間が小さくなる。</td><td class="nam">斎藤茂太</td></tr>
  <tr><td class="main_cont">教育とは、人々が知らないことを教えるのではなく、実例によって道を拓いてやる不断の困難な仕事である。</td><td class="nam">ジョン・ラスキン</td></tr>
  <tr><td class="main_cont">３０センチほどのヤマメと、その倍もあるサクラマスが、もともとは同じ魚　少しずつ努力を重ね、昨日の自分よりちょっとだけでも成長しようと心がける。</td><td class="nam">斎藤茂太</td></tr>
  <tr><td class="main_cont">言葉は選んで使いなさい。
  言葉の選択一つで、人生は明るくも暗くもなるのです。</td><td class="nam">ジョセフ・マーフィー</td></tr>
  <tr><td class="main_cont">速やかに成長するものは早く枯れ、徐々に成長するものは永存する。</td><td class="nam">J・G・ホーランド</td></tr>
  <tr><td class="main_cont">人は無意識の中にも一つの見方に執して、他の見方のあることを忘れがちである。</td><td class="nam">松下幸之助</td></tr>
</table>
```




<h2>なぜ作ったか</h2>
「webを縦書きに」のプロジェクトは色々あるのですが
数字とアルファベットが横になっていたり
複雑に対応しているようだったので
ライトに縦書きを実践し自分の好みは　数字とアルファベットは縦！　だったので作成。
PHPでpreg_replaceのエラーが出て動かない

PHPをアップデートしたら以下のエラーがでるようになって、Webアプリが動かなくなりました。

```
preg_replace(): Compilation failed: unrecognised compile-time option bit(s) at offset 0
```

おかしいと思って調べたら、libpcreの問題らしいことが分かりました。

ChromebookのLinux環境だったので、以下のようにライブラリをアップデートしたら直りました。

```sh
sudo apt install libpcre2-8-0
sudo apt install libpcre2-16-0
```

### 参考

https://let.blog.jp/article/31724231

https://stackoverflow.com/questions/70040287/php7-4-
preg-replace-compilation-failed-unrecognised-compile-time-option-bi
Rails のコンソールで Unable to connect: Adaptive Server is unavailable or does not exist (ホスト名) (TinyTds::Error) がでる 

## Unable to connect: Adaptive Server is unavailable or does not exist (ホスト名) (TinyTds::Error)が出てどうしようもない

Ruby・Rails で開発をしている時に、テスト用のDBサーバ(SQLServer)を使用していると、コンソールで上記のエラーが出たので共有します。

https://github.com/rails-sqlserver/tiny_tds/issues/218

上記のサイトでも似たようなエラーが見られますが、Azure を私は使っていないし、日本語じゃないしで全然わからなかったです。

しかし、IRB Codeのところを参考にして、
irb＞require 'tiny_tds'
irb＞ client = TinyTds::Client.new username: 'ユーザ名', password: 'パスワード', host: 'ホスト名', port: 1433, database: 'DB名'
と叩くと、同じエラーが出ました。
その時に、テスト用のDBサーバが急に動き出した感じがあったので、もう一度叩くと、エラーは出ませんでした。

以上の事から、テスト用のDBサーバのスリープじゃないかという結論になりました。

本番用サーバは24H稼働してくれるので、テスト用のPCだからこそ起きるエラーでした。

テスト用のPCがスリープしているというのは、わかりやすいようで盲点だと感じました。

似たような境遇の方の一助になれば幸いです。
CSS3アニメーションの色変化を用いた錯視の実験

　CSSアニメーションのカラーチェンジを使った錯視によって、キャラクターが流れるように光る的な感じみたいな風の効果を試す。

# 概要
　オブジェクトの色が変化するとき、色変化のタイミングが背景色によって違って見える場合がある。本実験ではCSSアニメーションによるカラーの明滅と、段階的に異なる背景色指定することで効果をつける。
　私は専門家ではないが「[ホワイト錯視](https://ja.wikipedia.org/wiki/%E3%83%9B%E3%83%AF%E3%82%A4%E3%83%88%E5%8A%B9%E6%9E%9C)」の一種と思われる。ホワイト錯視とは、同じ色のオブジェクトでも背景色が暗ければより明るく、背景色が明るければより暗くみえるという現象である。
　この結果、全体が同じ割合で明るくなるようにアニメーションさせても、背景の暗い部分は先に明るくなるように見え、また暗くなるようにアニメーションさせれば、背景の明るい部分が先に暗くなるように見えると考えられる。

## 作例１
![cap1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87385/cdc743ef-5bc2-212e-868a-9783e4a8fe9c.gif)
　5つの三角形 ▶ は、単一のCSSアニメーションによって同時に明滅している。しかし背景色の差で、左から右（あるいは右から左）の順に光っているかのように見える、ような気がする。しないかもしれない。

```HTML:test1.html　
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <link rel="stylesheet" href="test2.css">
</head>
<body>
   <div class="sign1">
      <span class="bg1">▶</span><span class="bg2">▶</span><span class="bg3">▶</span><span class="bg4">▶</span><span class="bg5">▶</span>
   </div>
</body>
</html>
```
```CSS:test1.css
.sign1 {
  font-size:4rem;
  animation:colorchange1 .8s ease-out infinite;
}
@keyframes colorchange1 {
  0% {color:#fc0;}
  20% {color:#fc0;}
  80% {color:#420;}
  100% {color:#420;}
}

.bg1 {background-color:#224;}
.bg2 {background-color:#557;}
.bg3 {background-color:#88a;}
.bg4 {background-color:#bbd;}
.bg5 {background-color:#eef;}

```
## 作例２
![cap2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87385/2338a1a5-f776-2e0f-8a1d-04486a416c4a.gif)
　先の例と同じく、それぞれの文字は同じタイミングでアニメーションしている。文字背景色でなく背景全体をグラデーションにすることで構成をシンプルにした。

```HTML:test2.html　
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <link rel="stylesheet" href="test2.css">
</head>
<body>
  <div class="sign2">
    RESTAURANT WILDCAT-HOUSE
    <div class="animebox">
      😺山猫軒→
    </div>
  </div>
</body>
</html>
```

```CSS:test2.css
.sign2 {
  width:30rem;
  text-align:center;
  font-size:2rem;
  color: white;
  background:#222;
}
.animebox {
  padding:.5rem;
  font-size:4rem;
  animation:colorchange2 1s ease-out infinite alternate;
  background:linear-gradient(165deg,#ffe,#442);
}
@keyframes colorchange2 {
  0% {color:#222;}
  80% {color:#ffe;}
  100% {color:#ffe;}
}
```

# 結論
　カラーチェンジ＋グラデーションによる錯視は、Webやその他のデザインでも応用可能と思われるが、だからどういう使い所があるのかと聞かれれば「微妙」と答えざるを得ない。さらなる素晴らしい応用の見出されん事を願う。
勉強メモ2

### 統計
データを集めて傾向を割り出すもの

・平均値:各データの合計をデータの個数で割って求めた値

・メジアン:小さい順に並べて中央に位置する値

・モード:出現頻度の最も高い値

・レンジ：データの最大値と最小値

・分散:平均値からのばらつきを表す。平均値との差（偏差値）の2乗の平均値で求める

・相関:お互いの要素が関連している（○○が増えれば□□も増える）

・因果:原因と結果（○○が原因で□□が起こる）

・仮説検定:とある仮説が正しいか統計学的に検証すること
→帰無仮説:仮説検定で検証したい仮説のこと
→対立仮設:仮説とは逆の仮設のこと

### 正規分布
平均値を中心とした左右対称の釣り鐘型の分布
・歪度:正規分布からどれだけ左右に歪んでいるか
```
歪度＞０=左に歪んでいる　歪度＜０＝右に歪んでいる
```
・尖度:正規分布からどれだけ尖っているか
```
尖度＞０=尖っている　尖度＜０＝つぶれている
```

### AI
・データ活用の流れ
①データ収集:目的に応じて情報を収取
　→一次データ(調査者が特定の目的で収集)
　→二次データ（第三者がほかの目的で収集(外部から入手できるデータ/内部（自社内）から入手できるデータ))
　→データレイク:生データ保管場所

②データ加工・分析:収集したデータを活用しやすい形に整える。
　→データクレンジング:不要なデータを取り除く※制度の向上
　→データウェアハウス:クレンジング後データの保管場所
 
③統計的手法を用いた分析:データからいえる事は何か。何を意味するのかを把握

④可視化し活用：データ分析結果を目的に応じて図表やグラフで表現

### 機械学習
大量のデータ(ビッグデータ)をコンピュータに解析させ予測や判断が出来る様に学習させること
・教師あり学習:正解のあるデータをインプット
　→回帰モデル:連続する数値や傾向をもとに予測を行う(連続する数値データ)
　→分類モデル:データを分類分けをする
 
・教師無し学習:正解のないデータをインプット
　→クラスタリング:特徴が類似するものをグループに分類しまとめる
　→ 次元削減:重要なデータを抜き出し、重要でないデータを削減（2次元から1次元に）
・強化学習:機械学習自身の行動とその結果をインプット

### UI/UXデザイン
・UI:ユーザーと製品をつなぐ接点
4つの原則
①説明が無くても操作ができる
②操作しやすい配置
③レスポンスの時間が適切
④デザインに一貫性を持たせる

・UX:サービスを通じて得られる体験や経験

・GUI:画面上のアイコンやボタンなどマウスで操作する視覚的なインターフェース
　→トグルボタン:ON/OFFの切り替え
　→ホバー:カーソルを合わせた時に色や大きさが変わる

 ### ソフトウェア
 ・ローコードツール:最小限のソースコードで開発するツール

 ・ノーコードツール:ソースコードを記述することなく開発するツール

 ・DevOps:開発チームと運用チームが密接に連携して柔軟かつスピーディーにシステム開発を行う手法

 ・MLOps：機械学習チーム、開発チームと運用チームが連携して機械学習のライフサイクル全体を効率的に行う手法

 ### データベース
 ・バックワードリカバリ:ロールバック(エラー発生時、更新前に戻すこと)

 ・フォワードリカバリ:ロールフォワード(更新後の状態にやり直すこと)
 
・NUI:人が普段行っている自然な動作(音声やジェスチャーなど)で入力を行うインターフェース
非対称な角丸

Material Design にある Connected button group の両サイドにある片方だけ、丸みがあるボタンってどうやって作るんだろうというお話です。

Connected button group
https://github.com/material-components/material-components-android/blob/master/docs/components/Button.md#connected-button-group

Web サイトから転載
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3853334/b5c19910-afb5-cd2d-ce74-02527a4e5d7b.png)

## 非対称な角丸の設定方法
そりゃそうだろって話ですが、Style を定義して適用すれば OK です。
### Style 定義
styles.xml に左側用と右側用の Style を定義します。
```xml:styles.xml
<!-- 左側 -->
<style name="ShapeAppearanceOverlay.Button.Left" parent="">
    <item name="cornerFamily">rounded</item>
    <item name="cornerSizeTopLeft">20dp</item>
    <item name="cornerSizeBottomLeft">20dp</item>
    <item name="cornerSizeTopRight">4dp</item>
    <item name="cornerSizeBottomRight">4dp</item>
</style>

<!-- 右側 -->
<style name="ShapeAppearanceOverlay.Button.Right" parent="">
    <item name="cornerFamily">rounded</item>
    <item name="cornerSizeTopLeft">4dp</item>
    <item name="cornerSizeBottomLeft">4dp</item>
    <item name="cornerSizeTopRight">20dp</item>
    <item name="cornerSizeBottomRight">20dp</item>
</style>

```

### Style 適用
レイアウト xml ファイルで定義している View の `app:shapeAppearanceOverlay` に定義した Style を指定します。
```xml:抜粋
<!-- 左側 -->
<Button
    android:id="@+id/leftButton"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    
    app:shapeAppearanceOverlay="@style/ShapeAppearanceOverlay.Button.Left"
    
    style="?attr/materialIconButtonFilledStyle"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintStart_toStartOf="parent" />

<!-- 右側 -->
<Button
    android:id="@+id/rightButton"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    
    app:shapeAppearanceOverlay="@style/ShapeAppearanceOverlay.Button.Right"

    style="?attr/materialIconButtonFilledStyle"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent" /> 
    
```

### 使用例
Android の標準で用意されているスライダーと組み合わせて、一体感のある UI にできます。

![cut.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3853334/a7d551dd-02da-d66c-10db-a49bbbd9314a.png)

## さいごに
Mterial Design のドキュメントを読むとけっこう楽しい。

material-components-android/docs/components
https://github.com/material-components/material-components-android/tree/master/docs/components

スクリーンショットに使用したアプリは ↓ なので、興味があれば使ってみてください。

https://play.google.com/store/apps/details?id=com.jyro.nettorechner
サブテーブル非表示

Bootstrap Tableの機能のみで、サブテーブル（詳細表示）がデータがない場合に開かないようにする方法として、`detailView`機能と`onExpandRow`イベントを使用することができます。この方法では、サブテーブルのデータがない場合に詳細表示をキャンセルすることが可能です。

以下に、具体的なコード例を示します。

```html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css">
    <link rel="stylesheet" href="https://unpkg.com/bootstrap-table@1.20.2/dist/bootstrap-table.min.css">
    <title>Bootstrap Table</title>
</head>
<body>

<div class="container mt-5">
    <table id="table" 
           data-toggle="table" 
           data-detail-view="true" 
           data-detail-formatter="detailFormatter"
           data-on-expand-row="onExpandRow">
        <thead>
            <tr>
                <th data-field="id">ID</th>
                <th data-field="name">Name</th>
                <th data-field="status">Status</th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td>1</td>
                <td>John</td>
                <td>Active</td>
            </tr>
            <tr>
                <td>2</td>
                <td>Jane</td>
                <td>Inactive</td>
            </tr>
            <tr>
                <td>3</td>
                <td>Bob</td>
                <td>Pending</td>
            </tr>
        </tbody>
    </table>
</div>

<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
<script src="https://unpkg.com/bootstrap-table@1.20.2/dist/bootstrap-table.min.js"></script>

<script>
    // サブテーブルの詳細フォーマッター
    function detailFormatter(index, row) {
        if (row.id === 1) {
            // データがある場合のみ、詳細表示
            return `<p>Details for ${row.name}</p>`;
        }
        // データがない場合は空を返す
        return '';
    }

    // 詳細行を展開するときに実行される処理
    function onExpandRow(index, row, $detail) {
        // データがない場合はサブテーブルをキャンセル
        if (!detailFormatter(index, row)) {
            $('#table').bootstrapTable('collapseRow', index);
        }
    }
</script>

</body>
</html>
```

### 解説
1. **`detailView`**: Bootstrap Tableの詳細表示機能を有効にしています。
2. **`detailFormatter`**: この関数は、詳細表示の内容をカスタマイズします。ここで、特定の条件（`id`が1である場合）にデータを返し、その他の行は空文字列を返しています。
3. **`onExpandRow`**: 行が展開される際に呼ばれるイベントで、詳細表示が空（データがない）場合は、その行を折りたたむ（閉じる）ようにしています。

このようにして、データがない場合に詳細表示が自動的に閉じられるため、ユーザーが無駄にサブテーブルを開いてしまうことを防ぐことができます。


ｒ
Apex 例外メール

### 受信先設定箇所

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894299/761a8f3f-1fd5-0a4b-b2f1-124eba405a4a.png)

### 受信するには
[Apex での例外](https://developer.salesforce.com/docs/atlas.ja-jp.apexcode.meta/apexcode/apex_exception_definition.htm)
>Apex 例外メールの数は、アプリケーションサーバーごとに 1 時間あたり 10 件に制限されています。これは組織ごとの制限ではないため、特定の組織に配信される例外メールの件数がこのとおりになるとは限りません。

注意：組織単位ではないので、必ず１０件のメールが届く意味ではない

確実に送信したい場合は、以下の方法を使うしかない
[Exception のステートメント](https://developer.salesforce.com/docs/atlas.ja-jp.apexcode.meta/apexcode/apex_exception_statements.htm)

[送信メール](https://developer.salesforce.com/docs/atlas.ja-jp.apexcode.meta/apexcode/apex_forcecom_email_outbound.htm)
4人で大富豪をしたときに、ジョーカーが手に入る確率（自分用メモ）

$13\times 4$ 枚のうち、2 枚ブラインドカードとして引いて、ジョーカー (JK) を 2 枚入れた 52 枚を、4 人に 13 枚ずつ配布する設定。


交換前に
JK が 0 枚の確率: 19/34 = 55.88 % (約 9/16)
JK が 1 枚の確率: 13/34 = 38.24 % (約 6/16 = 3/8)
JK が 2 枚の確率:  1/17 = 5.88 %  (約 1/16)

計算式:
0 枚: $\binom{50}{13} / \binom{52}{13}$
1 枚: $\binom{50}{12} / \binom{52}{13} \times 2$
2 枚: $\binom{50}{11} / \binom{52}{13}$

### 2 人に注目
A,B,C,D さんのうち A,B さんの 2 人に注目して、交換前のJK の枚数が

P(A=2, B=0) =  1/ 17 =   6/102 =  5.88 % (約 1/16)
P(A=1, B=1) = 13/102 =  13/102 = 12.75 % (約 1/8)
P(A=1, B=0) = 13/ 51 =  26/102 = 25.49 % (約 1/4)
P(A=0, B=0) = 25/102 =  25/102 = 24.51 % (約 1/4)

暗記用には、2 枚を4人に配るとき、それぞれ A～D さんの4択を2枚なので、$4^2 = 16$ と考えれば良い。
厳密には、1枚のときはこれで良いが、2 枚めのとき、{$\frac{12}{51}, \frac{13}{51}, \frac{13}{51}, \frac{13}{51}$ } のように枠が不均衡になるので微妙に影響が出る。

### 交換後
交換後、大富豪が
JK 0 枚: 25/102 = 24.51 % (約 1/4)
JK 1 枚: 26/ 51 = 50.98 % (約 1/2) 
JK 2 枚: 25/102 = 24.51 % (約 1/4) 

富豪が
JK 0 枚: 25/102 = 24.51 % (約 1/4)
JK 1 枚: 29/ 51 = 56.86 % (約 9/16)
JK 2 枚: 19/102 = 18.63 % (約 3/16)

貧民が
JK 1 枚: 1/ 17 =  5.88 % (約 1/16)
Windows でビルドしていた Docker がいきなり動かなくなった解決策

# 背景
会社支給の Windows で午前に作業中、
午後から作業を開始したら
Docker の App コンテナと Tomcat コンテナが起動しなくなった。
# error log
app-1         | exec /usr/local/bin/start.sh: no such file or directory
tomcat-1      | exec /usr/local/tomcat/bin/start-libreoffice.sh: no such file or directory
# 解決策
.sh ファイルの改行拡張子を CRLF から LF に変更した。
# 原因
Windowsで作成・編集したシェルスクリプトは、デフォルトでCRLF（\r\n）の改行コードを使用する。Unix/Linux環境では、CRLFの改行コードが原因で「No such file or directory」というエラーが発生することがある。

# Visual Studio Codeでの変換方法
1. 対象のファイルを開く。
1. 右下のステータスバーにある「CRLF」をクリック。
1. 表示されたメニューから「LF」を選択。
1. ファイルを保存。
DEPRECATION WARNING: ActiveSupport::ProxyObject is deprecated and will be removed in Rails 8.0.

# tltr

原因はダウンロード済gemの中で古いものがあることで、解決方法はgemのアップデートです。

gemアップデートでアプリに影響を与えないように、以下コマンドでgemを一つずつアップデートして、該当warningが出なくなるまで古いgemを特定して、特定ができたら該当gemだけアップデートすれば、warningを解消できます。

```
bundle update gemの名前
```

gem全体が更新されても挙動変化の心配がない場合の解消法は以下です。

```
bundle update
```

# 背景

Rails ver up 7.1 to 7.2のときに以下warningが出ました。

```
DEPRECATION WARNING: ActiveSupport::ProxyObject is deprecated and will be removed in Rails 8.0.
Use Ruby's built-in BasicObject instead.
(called from <main> at /Users/xxx/yyy_rails_project/config/application.rb:9)
```

warningが出たコードはこれみたいです。

```
Bundler.require(*groups)
```

以下Bundler公式のIssueによると、ダウンロード済のgemがProxyObjectを使っていることが原因で、gemをコメントアウトして原因gemを特定できるらしいです。

https://github.com/rubygems/rubygems/issues/7953

筆者はgemをコメントアウトしてbundle installして、またgemのコメントを外してbundle installすると、warningが消え、gemのバージョンが最新のものになる現象が起きました。
もしかすると、bundle updateで原因gemの特定も不要で、一気にwarningを解消できる可能性があると考えて、実行すると無事解消できました。
DEPRECATION WARNING: `rails/console/app` has been deprecated and will be removed in Rails 8.0. `rails/console/helpers` has been deprecated and will be removed in Rails 8.0.

# tltr

原因はダウンロード済gemのバージョンが古いことで、解消法はgemアップデートです。

gemアップデートでアプリに影響を与えないように、以下コマンドでgemを一つずつアップデートして、該当warningが出なくなるまで古いgemを特定して、特定ができたら該当gemだけアップデートすれば、warningを解消できます。

```
bundle update gemの名前
```

gem全体が更新されても挙動変化の心配がない場合の解消法は以下です。

```
bundle update
```


# 背景

Rails ver up 7.1 to 7.2のときに以下warningが出ました。

```
DEPRECATION WARNING: `rails/console/app` has been deprecated and will be removed in Rails 8.0.
Please require `rails/console/methods` instead.
 (called from <main> at /Users/yuhaogao/.rbenv/versions/3.3.0/lib/ruby/gems/3.3.0/gems/railties-7.2.1.1/lib/rails/console/app.rb:3)

DEPRECATION WARNING: `rails/console/helpers` has been deprecated and will be removed in Rails 8.0.
Please require `rails/console/methods` instead.
 (called from <main> at /Users/yuhaogao/.rbenv/versions/3.3.0/lib/ruby/gems/3.3.0/gems/railties-7.2.1.1/lib/rails/console/helpers.rb:3)
```

原因は一部のgemが古いことで、bundle updateで解消できました。
備忘録 ～PowerPointで「表のスタイル」を自作し、再利用する方法～

備忘録
PowerPointの「表のスタイル」を自作して再利用したい場合の方法

2024/10/21時点でMicrosoft365のPowerPointのアプリ版には
　「テーブルデザイン」>「表のスタイル」
に書いてある以外のスタイルを自作した場合、それを登録する機能は「ない」。
故に自作した場合、その表を「コピーして使いまわす」しかない。
今後、機能が追加されることを期待する。

以上
チャットGPT 無料 - 私のタスク管理を効率化してくれた

近年、テクノロジーの進化により、私たちの仕事のやり方は大きく変わりました。その中でも「<a href="https://chatgptjapanese.net/">チャットGPT 無料</a>」は、私のタスク管理を効率化し、日々の業務をスムーズに進めるための強力なサポートツールとして大きな役割を果たしてくれました。

![1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3915477/352100ab-62d2-07f5-cac2-0c28c32e99e0.jpeg)

タスクの整理と優先順位の決定
私は毎日、多くのタスクを抱えており、時にはどれから手をつけて良いか迷うこともありました。しかし、チャットGPT 無料を利用することで、優先順位を簡単に整理することができるようになりました。例えば、重要度や緊急度に基づいてタスクを並べ替えるアドバイスをもらうことができ、効率的に仕事を進める手助けをしてくれました。

スケジュール管理のサポート
チャットGPT 無料は、単なる質問への回答だけでなく、スケジュール管理にも役立ちます。日々のスケジュールや、今後のプロジェクトの進行計画を立てる際に、最適なスケジュールを提案してくれるため、無理のない計画を立てることができます。例えば、忙しい時期でもチャットGPTの提案をもとに予定を調整し、効率的に時間を使うことができました。

プロジェクト計画のサポート
プロジェクトを始める際には、事前に詳細な計画を立てることが重要です。チャットGPT 無料は、プロジェクトの各ステップを整理し、必要なリソースやタイムラインを示してくれるため、全体の流れを把握しやすくなります。これにより、タスクが重複することなく、円滑にプロジェクトを進めることができました。

日常業務の負担軽減
日常業務には、単調で時間のかかる作業が多くあります。チャットGPT 無料を使うことで、こうした単純作業も効率よくこなせるようになりました。例えば、会議の議事録を作成したり、定型文のメールを作成したりといった作業を、短時間で行えるようになり、他の重要な業務に集中する時間が増えました。

まとめ
チャットGPT 無料は、私の日常業務を効率化し、スケジュール管理やプロジェクト計画において欠かせない存在となりました。無料で利用できるという点も大きな魅力であり、多くの人が手軽に試してみることができます。このツールを活用することで、これからも多くのタスクをスムーズにこなしていくことができると確信しています。

チャットGPT 無料は、誰にとっても強力なパートナーとなり得る存在です。これからもますます進化していくであろうこの技術に期待を寄せながら、より良い仕事の方法を見つけていきたいと思います。

接触
名前 : Amaake Tomosumi(あまあけ ともすみ)
会社名：ChatGPT Japanese - ChatGPT 日本語
マイページ : https://chatgptjapanese.net/
市区町村：東京都渋谷区
国: 日本
郵便番号：150-0022(〒150-0041)
電話番号：+81 3 5422 3311
メール：amaaketomosumi@chatgptjapanese.net
Googleマップ：Shibuya Mark City, 7th Floor (渋谷マークシティビル7F)
#チャットgpt 無料  #チャットgpt #チャットgpt 日本語
読書感想文+α（備忘録）：今と未来がわかる半導体

Qiitaに初めて投稿する。
理由は、
- 最近Qiitaを読んでいたら楽しかったので自分でも書きたくなったから。
- 産休によりインプットの時間がたくさんあるはずなので学びをアウトプットしたかったから。
- Qiitaで記事書いたらなんとなくかっこ良さそうだから。

目標は、
- ローマ字やカタカナがたくさん書いてある記事を書くこと。
- 後々自分が見て役立つこと。
- 私が今まで勉強させてもらったように、誰かの勉強につながること。

ただ、まずは読書感想文。
普段は人工衛星の地上局に携わっているので時々宇宙に関連することも書こうと思います。

## 読んだ本、読んだきっかけ
本のタイトルは記事のタイトルにある通り。読んだのは、2024/8/1　第5版。
きっかけは、
- AIに興味があると豪語しながら半導体についてよく分からなかったこと
- そういえば大学のときp型とかn型とかノートに書いた、懐かしい、と思ったこと
- お盆(24/8)に1冊読もうと思ったこと
- パラパラ見たらカラフルで読みきれそう、知らないことも多く読みきったら新しい自分に出会えそう、と思ったこと。


## 気になった箇所&気になって調べたこと
- 日常生活にたくさんあるという紹介
-- ジャイロセンサの写真、大きさが書いていなくて想像より大きく見えたが、ググったら想像通りの大きさだった。人工衛星に使われているジャイロセンサはどれくらいの大きさだろうと思って調べたら、ISS(International Space Station、24/10現在、2030年にNASAによる運用終了予定)内のドローン[Int-Ball](https://fanfun.jaxa.jp/topics/detail/10536.html)は3cm角内に三軸姿勢制御機能を持たせたとのこと。
- 半導体のほとんどはシリコン(Si)できている
-- ここで、シリコン製の容器って電気通しそうにないなと思い調べていたら、金属のシリコン(Silicon)とは別物（Silicone）であることがわかった。
- 最近ではパワー半導体（電気の直流と交流を相互に変換）の素材として、SiC(シリコンカーバイド)やGaN(ガリウムナイトライド、窒化ガリウム)も普及している
- GaNによる青色発光ダイオード（LED）の発明により、2014年に中村修二らがノーベル物理学賞を受賞した
-- GaNがGAN(敵対的生成ネットワーク)に似ているからという理由で2023年のCEATECで見たとき気になっていたが、ここで繋がった。

- n型半導体は15族の原子（ドナー）、p型半導体は13族の原子（アクセプタ）が添加され、それぞれ自由電子、正孔（ホール）が移動することで電気が流れるようになる
-- エネルギーバンド図的には、絶縁体・半導体は電子が充填している最外殻軌道が価電子帯、電子の存在しない軌道を伝導帯があり、絶縁体と半導体の場合、伝導帯と価電子帯の中間にフェルミ準位（フェルミレベル）がある。n型は電子が過剰になるので、常温ではフェルミ準位は伝導帯に、p型は価電子帯に近づく。[引用](https://toshiba.semicon-storage.com/jp/semiconductor/knowledge/e-learning/basics-of-schottky-barrier-diodes/chap1/chap1-2.html)）
- CMOSを使ったイメージセンサは各画素が増幅器を持つ

## 感想
- 仕組みから業界まで、半導体について体系的に学べるのがこのようなまとめ本を読むことの良さだと思ったので、今後もQiita記事だけではなく本も読もう
- 気になる株が増えたので買ってみる
- 半導体関連の記事を読むとき知ってることが増えたので理解が速くなった
- （本の感想ではないが）気になったことを調べながら振り返ることで色々と知見が増えた。良い
- （本には関係ないが）記事をmarkdownで書くことでmarkdownに慣れそうな気がして良い。いつかGithub経由でも描きたい
- （本の感想ではないが）記載内容のゴールを決めておかないと途中で飽きる場合がある

Youtubeや高校の教科書見ながら振り返って楽しかった。次回は何か作った系か試した系を書きたい。
docker-compose テンプレート

```yaml
version: '3.8'

services:
  mysql:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: root_password
      MYSQL_DATABASE: my_database
      MYSQL_USER: user
      MYSQL_PASSWORD: user_password
    ports:
      - "3306:3306"
    volumes:
      - mysql_data:/var/lib/mysql
    networks:
      - my_network
[JSTQB CT-MAT]　4.モバイルアプリケーションの プラットフォー ム、ツール、および環境　を視覚的にまとめてみた

# はじめに

2024年11月に　ISTQB® Mobile Application Testing(CT-MAT)　の試験を受験予定のMa5am1nです。（2024年9月22日時点で、JSTQBによる日本語の試験は行われていないため、英語で受験予定）

理解促進のために、[シラバス](https://jstqb.jp/dl/JSTQB-SyllabusFoundation-MobileSpecialist_Version2019.J01.pdf)[^1]の内容を、図など視覚的に入ってきやすそうな形式でまとめてみます。

※あくまで一個人の解釈で作成したものです。内容が100%シラバスの通りであることは保証できませんので、ご了承ください。
※スライドの青文字、青線になっている箇所は、シラバスに記載されていない、私独自の解釈で記載した内容です。

このページでは、　4.モバイルアプリケーションの プラットフォー ム、ツール、および環境　について扱います。

# 4.モバイルアプリケーションのプラットフォー ム、ツール、および環境
## 4.1モバイルアプリケーション向け開発プラットフォーム
![JSTQB CT-MAT-120.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1636570/ec55c7d5-872b-ad97-ae9b-0552c2bbe93e.png)

## 4.2一般的な開発プラットフォームツール
![JSTQB CT-MAT-122.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1636570/0296aae7-3862-dcf6-60b4-cd85699227a9.png)

## 4.3エミュレーターおよびシミュレーター
### 4.3.1エミュレーターおよびシミュレーターの概要
![JSTQB CT-MAT-125.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1636570/4358f985-5d44-2d5e-91ee-77429c71641d.png)

### 4.3.2エミュレーターおよびシミュレーターの使用
![JSTQB CT-MAT-127.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1636570/97afc74d-493f-10b2-11aa-2e0fcc764c3b.png)

## 4.4テストラボのセットアップ
![JSTQB CT-MAT-129.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1636570/80229f3e-a479-9a9a-8a7d-e1aade646a1e.png)

![JSTQB CT-MAT-130.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1636570/a023450a-8847-0282-a21b-0892009353bc.png)
【ChatGPT】にニッチな思考方法を教えてもらった。


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

　今回は、ニッチな思考方法を教えてもらいました。

:::note info
本記事は、ChatGPT（有料版）
で行なっております。画像は
ありません。　あしからず。
:::
　ニュースもありませんので、
　　さっそく、本題に入ります。

　今回は、
　　ニッチな思考方法を
　　　教えてもらいました。

　これは
　　下記のポストを
　　　やってみた感じです。
　　　　[木内翔大さんポスト](https://x.com/shota7180/status/1847058302154559882?t=A7QEKK5pynAM_Mpl9qWO7w&s=19)

　ところが、
　　まったく違う思考方法が
　　　出てきました。

　それが、こちらです。
```Text:ちょっとニッチな思考方法を教えて
以下は、あまり一般的ではないニッチな思考方法と、その概要です。

1. **逆張り思考**  
   通常の考え方とは逆に、常識や大多数の意見に反対するアプローチを取る。あえて反対側から見ることで、見逃されがちな問題やチャンスを発見することができる。

2. **リミテーション思考**  
   意識的に制約を設けて考える。例えば、資源が限られていると仮定したり、時間を短縮したりすることで、効率性を追求し新しい解決策を見つける。

3. **メタ認知思考**  
   自分の思考プロセスを観察し、客観的に自分がどう考えているかを把握する。これにより、思い込みや偏見に気づき、思考の質を向上させることができる。

4. **シミュレーション思考**  
   現実世界の出来事を複数のシナリオでシミュレーションすることで、さまざまな結果や影響を考慮する。この方法は、未来の予測やリスク管理に有効。

5. **逆方向思考**  
   最終目標を先に設定し、その目標を達成するために必要なステップを逆に辿る。通常のプロセスの流れとは逆に考えることで、見落としがちな重要な要素に気づける。

6. **ランダムインプット思考**  
   無作為に選ばれた言葉やアイデアをインプットにして、その関連性や新しい意味を考える。偶然の要素を取り入れることで、従来の枠にとらわれない発想が可能。

7. **反復的探求思考**  
   一つのテーマを何度も繰り返し検討し、深掘りする。この方法では、表面的な理解から始めて、徐々に複雑な要素を明らかにしていくことができる。

8. **パラレル思考**  
   同時に複数のアプローチを試みることで、異なる視点や解決策を比較する。これにより、最も効果的な戦略を見つけることができる。

9. **ポジティブフレーミング思考**  
   どんな状況でも肯定的な面を見つけ、それを強調することで、難題に対するアプローチを変える。リソースの有効活用やモチベーションの向上に役立つ。

10. **スキーマ破壊思考**  
    既存の枠組みやスキーマを意識的に破壊し、新しい組み合わせや視点を模索する。これにより、革新的なアイデアや新しい視点を見つけることができる。

これらの思考法を意識的に使い分けることで、発想の幅を広げ、今までにない解決策や視点を見つけることができます。
```

　木内さんは、
　　ご自分で出した思考方法を
　　　組み合わせて、
　　　　「問題解決能力と
　　　　　分析能力が飛躍的に向上」
　　　　　　したと報告しています。

　ならば
　　私も、と
　　　画像解析が
　　　　できないかと
　　　　　挑戦していますが、
　　　　　　思った感じではない
　　　　　　　のが残念なところ😅

　みなさんの
　　作品制作の糧に
　　　なれば、幸いです。

　今回は、ここまで。
Git BASHでPython仮想環境のアクティベイト忘備録

# 忘備録
Windows環境でPythonをVSCODEで利用する場合、PowershellやCscript等の環境になり、Bashが使えない。そこで、Git BASHを利用して、Python環境の仮想化を実行したいので以下の通りまとめておく。

```bash
>cd <your directory>
>python -m venv .venv
>cd .venv/Script
>. activate
```
アクティベイトのコマンド前は、スペースがあるので気を付けよう。

ちなみにディアクティベイトは、以下のコマンドのでよい。
```bash
>deactivate
```
スクショも載せておく。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283070/0a371a53-c519-5f85-0773-0d7b23b0eff2.png)
フロー作成

フロー作成イメージ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/f42b4159-3fef-82cb-2af2-7e7e264484be.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/788ab133-d0f7-1660-6341-b2181cd5d300.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/32fa5cc4-df11-ff89-8047-dc5c3b0ebe89.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/28e72ad1-8066-8299-b416-41f3f0d98e3a.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/d775ae62-508c-cc3b-2cef-a68fabcc6110.png)
いまさらAOSPをMシリーズMacでビルドする

### AOSP（Android OS）をMシリーズMacでビルドしたい
現在自分のメイン環境はMシリーズMac（ARMベースのCPU）で、AndroidのOS (AOSP) のビルド、（なんちゃって）開発なんかもこの上でしてみたいんですよね。
（注: Androidのアプリなら普通にAndroid Studioで開発可能です。これはいわゆるAOSP（OS）の話です）

### 公式情報によると
[公式情報](https://source.android.com/docs/setup/start/older-versions)によるとAOSP (Android Open Source Project) のコードのmacOSでのビルドは**Android 8**（今(2004年10月)現在14）まで、それも**Intelプロセッサ**のみとなっています（ショボーン）。それ以降、公式には**x86_64のUbuntuでのビルドのみ**のサポートですね。
ビルド環境のOSの違いだけならDockerでビルドという手もありますが、CPUも違います。エミュも一応可能ですが、遅いでしょうね。
### ネット情報によると
MシリーズMacでビルドしたという話もちらほら... それらを総合した結果、とりあえず**Android 11**まではMシリーズMacでビルドできたので、以下、ビルド時に問題になる部分の対策方法をまとめます。
（注：AOSPのビルドに関する一般的な項目は解説していません。ごめんなさい。）

#### 0. 基本的なセットアップ、コードのチェックアウト等
AOSPの一般的なビルドの方法、すなわち`repo`をインストールし、`repo init`、`repo sync`でソースをチェックアウトし、`lunch`でビルドターゲットの設定、`m`（`make`）でビルドという流れは同じです。

一点だけ、macOSはデフォルトのファイルシステムが**大小文字を区別しない**（case-insensitive）APFSで、これだと問題（大小文字だけが違うファイル名の衝突）が生じるので、**大小文字を区別する**（case-sensitive）APFSを作って、そこで作業します（詳細略）。

Androidのバージョンに関して、ここではAndroid 11をビルドするので、`repo init`のときにAndroid 11のブランチを`-b`オプションで指定して`repo init`します。私は`android-11.0.0_r35`を指定しました。
```
$ repo init -u https://android.googlesource.com/platform/manifest -b android-11.0.0_r35
```

#### 1. ビルドエラーの修正 (1) macOS SDKのバージョン
ビルド中、`"Could not find a supported mac sdk: [\"10.13\" \"10.14\" \"10.15\"]"` みたいなエラーが出ます。macOS Cataliaの環境の想定なんでしょう。
このSDKのバージョンリストは`build/soong/cc/config/x86_darwin_host.go`にあります。実際にはAOSPのビルドはmacOSのSDKにはあまり依存しないようで、単にローカルにあるSDKのバージョンを追加して回避しておけばいいようです。私の場合はSonomaなので14.0を追加しました。


#### 2. ビルドエラーの修正 (2) コンパイラの警告フラグ
macOS上だとコンパイラの警告レベルの扱いが違うようで、以下のような警告がエラー扱いになってビルドが止まります。本当は元のコードを修正すべきでしょうが、ここではコンパイラのフラグを修正してとりあえず回避します。
エラーパターンその1: ``'sprintf' is deprecated: This function is provided for compatibility reasons only. ``
エラーパターンその2: ``error: incompatible pointer types passing 'unsigned long *' to parameter of type 'uint32_t *' (aka 'unsigned int *') [-Werror,-Wincompatible-pointer-types]``

ビルドエラーの修正(1)(2)をまとめると以下のようになります:
```diff
diff --git a/cc/config/x86_darwin_host.go b/cc/config/x86_darwin_host.go
index 8eb79e34e..79c6a73a7 100644
--- a/cc/config/x86_darwin_host.go
+++ b/cc/config/x86_darwin_host.go
@@ -41,6 +41,9 @@ var (
                "-DMACOSX_DEPLOYMENT_TARGET=${macMinVersion}",
 
                "-m64",
+
+               "-Wno-deprecated-declarations",
+               "-Wno-incompatible-pointer-types",
        }
 
        darwinLdflags = []string{
@@ -66,6 +69,7 @@ var (
                "10.13",
                "10.14",
                "10.15",
+               "14.0",
        }
 
        darwinAvailableLibraries = append(
```

#### 3. ビルドエラーの修正 (3) オープンできるファイルの最大数の変更
ビルドの際にソースツリー上のMakefileを再帰的に読み込みますが、このときオープンしたファイル数のデフォルトの上限に達してエラーになるので、ビルドを走らせる前に以下を実行します:
```
$ ulimit -S -n 2048
```

### というわけで
Macでビルドする際の要点のみを書いてみました。万一同じようにMシリーズMacでAOSPをビルドされる方がいて、その助けになれば幸いです。
LinuxのIntel x86のIntrinsic関数をRISC-VやARM用にポートする（１１）

今までIntelからRISC-VなどのプラットフォームにLinuxアプリケーションを移植する議論を行ってきたが、実は、すべての最適化及び、移植作業において、「処理の等価性チェック」のフレームワークが必要なのではという結論に達した。
すべての最適化において、処理は高速化してほしいが、多くの場合処理内容はほんの僅かでも変わってほしくない。処理内容が変わったら深刻なバグやエラーや事故を引き起こす。
よって、コンパイラ設計者としては、処理の速度より、処理の等価性を優先して設計することとなる。よって、思い切った最適化は行えなくなり、ソフトウェアは年月を経るごとに重くなっていく。
従来はムーアの法則などにより、ソフトウェアは重くなっても処理を速くすることができたが、今後は期待できるかどうかはわからない。
それはIntelからRISC-Vにポートする作業においても同じである。ポートする手法としては、自動ベクトル化を使う方法や、Universal IntrinsicやLinux on Power porting guideのように特殊なラップ構造を取ってやる方法などがあるが、全てにおいて共通するのは、処理が等価である必要性である。処理が等価でないと、ポートしたことにはならない。
僕が考えている処理の等価性チェックは、数学的な手法ではなく、２つの等価性を比較するモジュールにおいて、入力値をある程度ランダムに決めてやり、２つのモジュールに入力して、出力が同じであることを確認する方法である。
ネットワーク接続などは使用せず、ファイル転送やHDD、USBメモリの差し替えなどによって、データを転送する。よってネットワークで相互接続する必要はない。
ある意味力任せに等価性チェックする手法である。
つまるところ今まで異なるCPU間でポートや最適化が難しかったのは等価性の保証が難しかったからで、等価性の保証が簡単になればポートも簡単になる可能性がある。
Firefox派生のブラウザ比較

ZDNetに

https://japan.zdnet.com/article/35224817/

と言う記事が出てFirefox派生（要はGeckoエンジンのブラウザ）が紹介されています。Firefox大好き人間としてはちょっと内容を補足しようかなと思います。
| ブラウザ | バージョン | Firefoxのバージョン | 特徴 | 使用・未使用 |
|:-:|:-:|:-:|:-:|:-:|
|Firefox|131.0.3   |131.0.3|基本です   | 使用中  |
|Tor   |13.5.7|131.0.2  | 隠すやつです  | 未使用  |
|Mulvad   |13.5.7   |知らないです   |未使用   |
|Waterfox|G6.0.20|不明|Tab Mix Plusの作者の方とお話し合いがあって組み込まれているようです|使用中|
|LibreWolf|131.0.3-1|不明|セキュリティガチガチ・Pocket使えません（後述）|インストールしたけどあきらめた｜
|Floorp|11.19.1|Firefox ESR 128.4.0|日本製、学生が作っている|使用中|
|Zen Browser|1.0.1-a.12|Firefox 131.0.1?|Arcみたいな感じ|使用中|

そんなわけで現在使用中なのは本家FirefoxとFloorpとWaterfoxとZen Browserなのでこのあたりの比較を。
### Pocketの扱い
その前にPocketの扱いなんですがどうもセキュリティ的に何かあったのか、よく知らないんですけれど、MozillaがPocketを買ったにもかかわらず本家以外はインストール直後に使えません。
`about:config` で `extensions.pocket.enabled` を **true** にしないと出てきません。LibreWolfはこの項目自体がグレーアウトされていてEnableにできないです。なので私はPocket必須なので使っていないです。

### さて実際は
さて、私がメインで使っているのはZen Browserです。見た目がすっきりしていること、垂直タブが使えること（微妙にTree Style Tab（TST）を埋め込んでいるらしく、時間でタブがUnableになるとTSTの画面が出てきます。またFirefoxでTSTを使うときにchrome.cssで横のタブを隠すことができますが（TSTのWikiにあります）この時はほかのFirefoxにタブの利用が伝わらないので結局横タブも出したままにした方が利便性が良くなります。ただ見た目が悲しいのでZeb Browserが使いやすい、見た目がすっきりしているなと思いますし、最新のFirefoxを追いかけているし、セキュリティアップデートも追いかけてやるので安心なんですが唯一、Zen Browserのバージョンをみてもらうとわかるようにα扱いのようなんです。実際、1.0.1-a.9,1.0.1-a.10はバギーでなかなかに大変でした。Discordで様子を知ることができます。

もし普通に使うのだとしたら**Floorp**か**Waterfox**をおすすめします。

### Floorp
**Floorp**はESRが元ですが取り込みも早いですし、まあ安定はしています。Web Panel（ブラウザパネルと呼んでいますが）というサイドバーの反対側にもう一つリンクをおいて使えるやつとか垂直タブも独自の垂直タブを実装していて（TSTみたいには使えないんですが）垂直タブにデザインを優先することもできるので見た目すっきりします。各Firefoxにタブの様子を教えることもできています。
あと何が良いって日本語でIssueが書けるんですよ（英語でも当然大丈夫なんですが）。GitでIssueを英語で書くのが面倒だと思う方はおすすめ。
学生がと言うところで危惧されるかも知れませんがAblazeと言う会社形態を作って開発をしているので大変そうですがきっちり作られていることは確かです。

### Waterfox
こちらはZDNetで言われているような軽さはあまり感じませんが、垂直タブをTSTと独自で選ぶことができて、独自の方もTSTの作者とお話し合いなどをしているようなので（Floorpもしているという噂）使い勝手はTST付きFirefox,横タブなしという感じです。ただ元にしているFirefoxのバージョンがわからないという欠点はあります。
またバージョン番号の付け方が若干不明で次にくるのはG.6.0.3らしいです。

### その他特徴
FloorpとZenは任意のタブを選んで画面を分割することができます。（お互いにソースを持ってかれたと言っていますが真偽はわかりません。）
Floorpのほうが任意の位置で分割してから移動が可能なので利便性は高いです。
wsl2がlsで固まる場合の備忘録


wsl2で　ls をすると固まってしまう。   
ctl＋Cもctl+Zも効かない

### 原因
原因は、mountミス
ネットワーク共有をしているドライブの mountしない状態で lsをしたのが原因と思われる。

### 対応
wslを一旦シャットダウンすると、とりあえず解決。

```
wsl --shutdown
```
再度、wsl2を立ち上げて、mountを実施する   
mount出来ていないシンボルリンクが（私の設定では）赤で表示される。
ソフトキーボードが勝手に閉じる

業務にて詰まった部分とその解決方法を簡単に紹介

## 発生した問題
flutterでテキスト入力欄を実装していた時に発生
内容としては`TextFormField`で実装した入力欄をタップしてソフトキーボードを開くと、１文字入力するたびにソフトキーボードが閉じてしまう状態になってしまいました

## 解決策（その１）
`TextFormField`だけではなく、`FormBuilder`でも発生する問題とのことで、解決方法も確立されていました
シンプルに`GlobalKey`を生成して指定することで解決するとのこと

TextFormFieldの場合
``` dart
final formKey = GlobalKey</*state指定*/>();
Form(
    key: formKey,
    child: TextFormField(
    // いろんな設定
    ),
);

```
FormBuilderの場合
``` dart
final formKey = GlobalKey</*state指定*/>();
FormBuilder(
    key: formKey,
    // いろんな設定
);

```
これで一件落着と思いきや…

## 解決してなかった
上記の実装に変更してみたものの何も変わらず
何が問題なのかと検索していたところ、`flutter_hooks`の場合は上記の解決策では足りないとのこと

## 解決策（その２）
`GlobalKey`を使うという部分は同じですが、生成の仕方に違いがありました
useMemorizedで生成する必要があるみたいです

``` dart
final formKey = useMemorized(() => GlobalKey</*state指定*/>());
```
これを解決策（その１）と同じようにそれぞれのFormに指定することで解決

シンプルな問題も二段構えになると手強くなるという話でした
操作不要・完全自動でデスクトップフォルダのバックアップを取る Windows アプリケーションを公開してみる。

デスクトップフォルダ上の
ファイルが保存される度に
バックアップを保存する
~~頭の悪い~~アプリケーションを開発したため
皆さんの役に立てればと思い
ソースと本体を公開したいと思います。

[本体はこちら(BOOTH)](https://giftedstyle.booth.pm/items/6186686)
[本体はこちら(Google Drive)](https://drive.google.com/file/d/1HQiAMr36ChpSMISC_tcgEAysUv7t_qrn/view?usp=sharing)

＜利用規約＞
・自作発言のみ禁止とさせて下さい。
　禁止内容には我々に対し著作権を主張する事を含みます。
・再配布・販売 OK です。
・加工後の再配布・販売も OK です。
・再配布・販売の際に
　独自のライセンスを付与する事も許可します。
　ただし自作発言禁止のルールに関してのみ
　反しないようにお願いします。
・自作発言をしないならば
　アプリケーション名を変えて
　再配布・販売をして頂いてもかまいません。

＜免責事項＞
当アプリケーションのダウンロード、およびご利用に伴い発生した事象については責任を負いかねます。ご利用は自己責任でお願いします。

＜クレジット表記について＞
特に必要ありません。気軽にお使いください。

***

ファイルのバックアップを自動で保存する
Windows アプリケーションです。

デスクトップ上のファイル全てのバックアップを
操作不要・完全自動で保存します。

起動しておく以外の操作は必要ありません。
起動はしておく必要があります。

PC 起動時のスタートアップアプリケーションに
登録する事で、完全自動化できます。

デスクトップフォルダと同じ階層に
「Desktop_BackUP」フォルダが生成されて
その中にバックアップが蓄積されていきます。
恐らく「C:\Users\User\Desktop_BackUP」フォルダです。

ファイルの容量によって
保存間隔と保存するファイル数上限が異なります。

条件は下記の通りです。
0B～1MB のファイル：5 秒に 1 回 300 個まで保存します。
1MB～5MB のファイル：10 秒に 1 回 200 個まで保存します。
5MB～10MB のファイル：60 秒に 1 回 100 個まで保存します。
10MB～30MB のファイル：300 秒に 1 回 30 個まで保存します。
30MB～50MB のファイル：900 秒に 1 回 20 個まで保存します。
それ以上のファイル：1800 秒に 1 回 10 個まで保存します。

いずれもファイルが更新されていない場合は
指定秒数を経過してもバックアップを取りません。

指定された個数を超えた場合は
新しいバックアップを保存する際に
一番古いデータが削除されます。

例えば 20MB のファイルの
バックアップファイルが 30 個の状態で
新しくバックアップを取る場合は
一番古いバックアップファイルが削除されます。

あくまでもファイルが保存されている場合に
バックアップを定期的に実行するだけなので
ファイルを保存する機能自体はありません。
Ctrl + S など保存自体は
手動で行う必要があります。

「Desktop_BackUP」フォルダの容量が
たまってきた場合は
「Desktop_BackUP」フォルダを削除する事を
検討して下さい。
削除すると再度「Desktop_BackUP」フォルダが作成されます。

![037e4d5b-7631-44e7-a9d3-ee4864921533_base_resized.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3752886/55684868-6d3b-846a-e30e-44c4653cba7b.jpeg)

***

プロジェクトファイルの配布

プロジェクトファイルは
下記の URL からダウンロードして下さい。
Visual Studio で開くことができます。
[https://drive.google.com/file/d/1Y_FQOlchQwesQEJGHcS3vtkWFmGn_2U8/view?usp=sharing](https://drive.google.com/file/d/1Y_FQOlchQwesQEJGHcS3vtkWFmGn_2U8/view?usp=sharing)

***

以上ファイルの自動バックアップの
Windows アプリケーションを公開しました。

このアプリケーションを使えば
デスクトップ上で作業した場合限定ですが
午前中のデータを拾いたいといった場合に
拾うことができるかもしれません。

このアプリケーションが
皆さんの役に立てたならば嬉しいです。

皆さんの開発の助けになれますように。
閲覧ありがとうございました。
TypeScriptのフロントエンドとバックエンドでの使い方

**TypeScriptは、JavaScriptに型を付与することで開発効率を向上させ、バグを減らす目的で広く使われています。この記事では、フロントエンドとバックエンドそれぞれでのTypeScriptの使い方と具体例について紹介します。**

TypeScriptを使う理由についてはこちらで記事にしていますので気になるかたは是非読んでみてください！

https://qiita.com/y-t0910/items/32e74d2ef175ab16a1e7

# 1. フロントエンドでのTypeScriptの使い方
フロントエンドの開発では、ReactやAngularなどのフレームワークと一緒にTypeScriptを使うことが多いです。

**1.1 ReactとTypeScriptの連携**
Reactでは、コンポーネントの型定義を行うことで、プロパティ（props）や状態（state）のバグを防ぐことができます。

Reactの基本的なコンポーネント例
```tsx
import React, { useState } from 'react';

// propsの型定義
type CounterProps = {
  initialCount: number;
};

const Counter: React.FC<CounterProps> = ({ initialCount }) => {
  const [count, setCount] = useState<number>(initialCount);

  return (
    <div>
      <p>現在のカウント: {count}</p>
      <button onClick={() => setCount(count + 1)}>増やす</button>
    </div>
  );
};

export default Counter;
```
ポイント
React.FC: Functional Componentの型です。
useState<number>: useStateフックに型を指定することで、状態管理を型安全に行います。


1.2 フロントエンド開発でのメリット
開発中のエラー検出: 型エラーが早期にわかるため、バグを防止できます。
IDEの補完機能の強化: 型定義によって、エディタがプロパティや関数の補完を行ってくれます。
コードの可読性向上: コンポーネントのインターフェースが明確になるため、チーム開発での理解が容易です。

# 2. バックエンドでのTypeScriptの使い方
バックエンドの開発では、Node.jsの環境でTypeScriptを使用することで、サーバーサイドのロジックも型安全に構築できます。

**2.1 ExpressでのTypeScriptの使用例**
ExpressはNode.jsの軽量フレームワークであり、TypeScriptと組み合わせることで、APIのエンドポイントも型安全に設計できます。

Expressのサンプルコード
```ts
import express, { Request, Response } from 'express';

const app = express();
const PORT = 3000;

// ユーザー情報の型定義
interface User {
  id: number;
  name: string;
  email: string;
}

// ダミーのユーザーデータ
const users: User[] = [
  { id: 1, name: 'Alice', email: 'alice@example.com' },
  { id: 2, name: 'Bob', email: 'bob@example.com' },
];

// エンドポイントの定義
app.get('/users', (req: Request, res: Response) => {
  res.json(users);
});

app.listen(PORT, () => {
  console.log(`Server is running on http://localhost:${PORT}`);
});
```

**ポイント**
interface: データ構造の型定義。APIのレスポンスに使用する型を明確にします。
RequestとResponse: Expressのリクエストとレスポンスの型を指定することで、正確なAPI設計が可能です。


**2.2 バックエンド開発でのメリット**
API設計の一貫性: 型定義により、エンドポイント間でのデータのやり取りが一貫します。
メンテナンス性向上: 大規模なプロジェクトでも型定義により、関数やデータ構造の管理が容易になります。
セーフティネットの提供: ランタイムエラーを未然に防げるため、サーバーの信頼性が向上します。

# 3. フロントエンドとバックエンド間の型共有
TypeScriptを使うことで、フロントエンドとバックエンドで型定義を共有することも可能です。これにより、APIのリクエストやレスポンスのデータ構造が一貫し、開発効率が向上します。

**型定義を共有する方法**
共通の型定義ファイルを作成します。
フロントエンドとバックエンドで同じ型定義を使用するため、sharedディレクトリなどに配置します。
例：型定義の共有
```ts
// shared/types.ts
export interface User {
  id: number;
  name: string;
  email: string;
}
```


フロントエンドでの使用例：
```ts
import { User } from '../shared/types';

const fetchUsers = async (): Promise<User[]> => {
  const response = await fetch('/users');
  return response.json();
};
```

**バックエンドでの使用例：**
```ts
import { User } from '../shared/types';

const users: User[] = [
  { id: 1, name: 'Alice', email: 'alice@example.com' },
];
```

# 4. まとめ
TypeScriptは、フロントエンドとバックエンドの両方で使うことで、以下のような多くのメリットをもたらします：

型安全性により、エラーの予防とバグの削減。
開発効率の向上とコード補完の強化。
型の共有による一貫性のあるAPI設計。
フロントエンドではReactなどのフレームワークで、バックエンドではExpressやNestJSと組み合わせて使用することで、TypeScriptの強力な機能を最大限に活用できます。
【Laravel DB Snapshot】DBの簡易ダンプの取り方

https://github.com/spatie/laravel-db-snapshots

いつもの spatie 様がたの製作



## はじめに

開発環境でDBのダンプを取ったり、開発メンバーに配ったりすることがありますよね
その際 `mysqldump` や `pg_dump` のコマンドを用意するのは多少コストがかかる...

そこで `.env` に登録したDBの設定を利用して `artisan` コマンドから実行しよう、というのがこのライブラリです！

`mysql` でも `postgres` でも同じように使えますが、
`mysqldump` や `pg_dump` 系のコマンドを使用可能な環境である必要があります



## インストール

```bash
$ composer require spatie/laravel-db-snapshots

# 細かい設定がしたければ
$ php artisan vendor:publish --provider="Spatie\DbSnapshots\DbSnapshotsServiceProvider"
```

基本的に `.env` のプライマリDBを参照する

次に、どのディスクに書き出すかを `config/filesystems.php` に記入する
とりあえずローカルに書き出すと良い
`disk` 配列に定義できるものであれば、なんでも使える

```php:config/filesystems.php
'disks' => [
    // ...
    'snapshots' => [
        'driver' => 'local',
        'root' => database_path('snapshots'),
    ],
    // ...
]
```


## 使い方

```bash
# snapshot の保存
$ php artisan snapshot:create
Creating new snapshot...
Snapshot `2024-10-21_00-47-25` created (size: 543 B)

# snapshot の読み込み
$ php artisan snapshot:load
 Which snapshot? [2024-10-21_00-47-25]:
  [0] 2024-10-21_00-47-25
 > 0
Snapshot `2024-10-21_00-47-25` loaded!
```

基本的にこれだけ！

上記の設定だと `database/snapshots/*` に保存される
好きな場所に変更するなり、`.gitignore` に追加するなり好きに使おう

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3833190/db0446f6-20ab-efb6-08f7-39756955e17d.png)




## 応用

```bash
# 任意の名前を付ける
$ php artisan snapshot:create 20241021_v3_dump
Creating new snapshot...
Snapshot `20241021_v3_dump` created (size: 543 B)

# snapshot を消す
$ sail artisan snapshot:delete
 Which snapshot? [20241021_v3_dump]:
  [0] 20241021_v3_dump
  [1] 2024-10-21_00-47-25
 > 1
Snapshot `2024-10-21_00-47-25` deleted!
```

正直消す系のコマンドは、ファイル操作でやったほうが良い気がした




## [PostgreSQL] Sail 環境下のエラー

Sail 環境で実行しようとしたら以下のエラーが出た
どちらかのバージョンを合わせよう

```
Error Output
============
pg_dump: error: aborting because of server version mismatch
pg_dump: detail: server version: 17.0 (Debian 17.0-1.pgdg120+1); pg_dump version: 15.7 (Ubuntu 15.7-1.pgdg22.04+1)
```

Sail コンテナを変更するのは少々コストが高いので、DB側を15に寄せる
```diff_yaml
      pgsql:
-         image: 'postgres:17'
+         image: 'postgres:15.7'
```

既存DBを消して再起動する

```bash
$ sail down --volumes
$ sail up -d
```



## おわりに

面倒なことは artisan コマンドにやらせようの会
Linuxデスクトップ（Ubuntu）初めて使う人の困った点と対策でやったこと

## この記事は

随時発生した困り事とやった対策が追加されていきます。

## ディストリビューション

Ubuntu 24.04 LTS

初心者にお勧めと銘打っているディストリビューションはいろいろあるのですが、初心者に一番必要なのはUIの易しさとかとっつきやすさではなくて引っかかったときに情報量が多いことと、メンテナンスが長く続いてくれることですので、デスクトップ向けとして最もメジャーで体制もしっかりしているところのものを選んだ次第。

## バックグラウンド

- Windows - DOS2.11以来のMS製OSユーザー。MFC開発・Windows Forms開発経験あり。Windowsのものの考え方はだいたいわかっているけど、Windows7を頂点に以降はわかりにくいユーザー体験になってきてるなと思っている。最近はWSLしか使っていないうちにWindows使っている意味がわからなくなってきた
- Mac - OSX以降のユーザー。IntelとARMと。XCode開発はやってない。三本指ドラッグに染められてしまった
- パソコンでやりたいこと - VSCodeで主にWeb系のコードをいじる。Linuxサーバー管理端末。メール・SNS。スマホで撮った写真の管理。ゲーム全然しない。オフィスソフト使わない

## 困り事＆やったこと

| 困り事 | やったこと |
|---|---|
|マウスカーソルの移動速度はちょうどいいのに、二本指スクロールのスピードだけ異常に速い|体を慣らすしかないかなと思っている。|
|caps lockキーをctrlキーとして使いたい|https://qiita.com/peachft/items/c5de9a0224a6e710ba1d|
|二本指スワイプでブラウザバック・フォワードしたい|libinput-gestures<br>https://blog.uyorum.net/post/ubuntu-multitouch/<br>2本指設定はできないようなので4本指左右スワイプで進む・戻るになった|
|三本指ドラッグでドラッグしたい||
|デュアルブートで残っているWindowsのドライブをマウントしたい||
|シェルウィンドウでコピー・ペースト操作がショートカットキーでできない||
|lenovoノート（ThinkBook 14 G5 ABP）についている指紋認証パッドが認識されていない||
|日本語入力モードにするキーはあるが、英数モードにするキーはなくて日⇔英トグルするキーしかない||
事業所郵便番号辞書について

前回は郵便番号辞書について記述しましたが、今回は事業所郵便番号辞書についてです。
１日に規定数以上の郵便物がとどく場所については、固有の郵便番号を割り当ててもらうことができます。
これは通常の郵便番号とは別になっていて、これらについても日本郵便株式会社からデータが提供されています。よって、郵便番号から住所を補完する場合、この事業所郵便番号にも対応する必要があります。（対応していないサイトはちょくちょく見かけます。）
対応していないサイトでは当然のごとく、ユーザーはすべての住所を自分で入力する必要があります。

# 提供されるデータ
事業所郵便番号データは郵便番号データとは異なる型式で提供されています。そのこと自体は問題はないのですが、提供される会社名が必ずしも正確な「法人名」（法務省に登記されている名称）ではないため、他のデータ（例えば法人番号DB）と連携して利用することが難しいという難点があります。
これは日本郵便株式会社は企業（事業所）から申請された内容をそのまま利用していることが原因と考えられます。実際、誤りがあることもあし、筆者の指摘で修正いただいたこともあります。

例）504-8501 岐阜県立　岐阜各務野高等学　校岐女商校舎
　　　　　　　　　　　　　　　　　　　　空白の位置が間違っている

# 郵便番号辞書
郵便番号による住所補完を実現する場合、郵便番号データと事業所郵便番号データを同じ形式にそろえて辞書化るうことで、通常の郵便番号と事業所郵便番号を同列で扱うことができます。
paizaラーニング問題集「【全探索 4】ストラックアウト」を解いてみた

https://paiza.jp/works/mondai/b_rank_new_level_up_problems/b_rank_new_level_up_problems__struck_out

▼考え方

この問題を解くために私が考えた内容1.～6.を以下に示します。

1.9枚の数字のパネルを倒す順番の順列をすべて洗い出し、それぞれについて獲得できる得点を求めます。その中の最大値を答えとして出力します。

2.ただし、9枚のパネルのうち最初の2枚については、題意にあるとおりビンゴによる加算(b_i_j点)はなく、パネルを倒した時の加算(s_i点)のみです。

3.9枚のパネルのうち最初の2枚を除く7枚については、題意にあるとおりビンゴによる加算(b_i_j点)があり得ます。パネルを倒す順番によってb_i_j点が異なるため、7枚の順列をすべて洗い出して処理を行います。順列の洗い出しにはモジュールitertoolsを使用します。

paiza君がパネルを倒す順番はリストpi(pitching)で示しています。piの一例を示します。
```
pi = [3,2,1,4,5,6,8,7,9]

　・3→2→1→4→5→6→8→7→9の順にパネルを倒すことを示します。
　・3は変数i、2は変数jで構成されます。
　・1以降はリストpn(pitching next)で構成されたものを、考え方4のforループで1つずつpnからpiへappendされます。
```

4.7枚のパネルを1つずつ、パネルを倒した時の加算とビンゴによる加算を計算します。

5.ビンゴによる加算は、ビンゴの組合せを定義した辞書bcをもとに計算します。

6.7枚の順列の1つに対して、パネルを倒した時の加算とビンゴによる加算の計算が終了したら、次の順列の処理をおこなうため、その7つの数字を削除します。

▼コード
```py
########## 処理0(準備) モジュールインポート,インプット,リスト定義 ###########

# 考え方3.
import itertools

# s: パネルを倒した時の加算の点数を定義した辞書
s = {}
for i in range(3):
    a,b,c = map(int,input().split())
    s[i*3+1] = a
    s[i*3+2] = b
    s[i*3+3] = c

# bc: ビンゴの組合せを定義した辞書
bc = {}
bc[1] = [[2,3],[4,7],[5,9]]
bc[2] = [[1,3],[5,8]]
bc[3] = [[1,2],[5,7],[6,9]]
bc[4] = [[1,7],[5,6]]
bc[5] = [[1,9],[2,8],[3,7],[4,6]]
bc[6] = [[3,9],[4,5]]
bc[7] = [[1,4],[3,5],[8,9]]
bc[8] = [[2,5],[7,9]]
bc[9] = [[1,5],[3,6],[7,8]]

# bk: ビンゴによる加算の点数を定義した辞書
bk = {}
for i in range(1,10):
    bk[i] = list(map(int,input().split()))

# pi: paiza君がパネルを倒す順番を定義したリスト(pitching)
pi = []

# pn: paiza君がパネルを倒す順番(3枚目以降)を定義したリスト(pitching next)
pn = []

# bc_count: パネルを倒したことによって、発生するビンゴの数
bc_count = 0

# score: paiza君が獲得できる得点
score = 0

# max_score: paiza君が獲得できる最高得点
max_score = 0

########## 処理1 paiza君が獲得できる最高得点を求める処理 ###########

# 考え方1.
for i in range(1,10):
    
    for j in range(i,10):
        
        if i == j:
            continue

        # 考え方2.
        pi.append(i)
        pi.append(j)
        score = s[i]+s[j]

        # 考え方3.
        pn = list(set(range(1,10))-{i,j})
        
        for k in itertools.permutations(pn):

            # 考え方4.
            for l in range(7):
                
                pi.append(k[l])
                score += s[k[l]]

                # 考え方5.
                for m in bc[k[l]]:
                    if all(num in pi for num in m):
                       bc_count += 1
            
                if bc_count > 0:
                    score += bk[k[l]][bc_count-1]
                    bc_count = 0
            
            if max_score < score:
                max_score = score
                
            score = s[i]+s[j]
            # 考え方6.
            del pi[-7:]
            
        del pi[:]
        
print(max_score)
```
プロセス vs スレッド: 何が違う？マルチタスクを支える基本概念を理解しよう

## はじめに  
現代のアプリケーション開発では、マルチタスク処理はもはや当たり前。CPUのリソースを効率よく活用するために、開発者が知っておくべき二大要素が「プロセス」と「スレッド」です。今回は、それぞれの違いと役割について解説し、パフォーマンス向上に繋がるヒントを提供します。

---

## 1. プロセスとは？  
プロセスとは、OSによって管理される「独立した実行単位」です。各プロセスは独自のメモリ空間を持ち、他のプロセスとは隔離されています。例えば、複数のブラウザタブがそれぞれ異なるプロセスで動作することで、あるタブがクラッシュしても他のタブに影響がないのはこのためです。

- **特徴**: 独立したメモリ空間、他のプロセスとの干渉がない。  
- **メリット**: 安定性が高い。  
- **デメリット**: プロセス間の通信にはオーバーヘッドが生じる。  

---

## 2. スレッドとは？  
スレッドは、プロセス内で実行される「軽量なタスク」です。スレッドは、プロセス内のリソースを共有するため、同じプロセス内で複数のスレッドが並列して動作できます。たとえば、ゲームアプリが背景処理とプレイヤー操作を同時に行えるのは、スレッドが活躍しているからです。

- **特徴**: プロセス内でリソース（メモリ空間、ファイル）を共有。  
- **メリット**: プロセス内での効率的なタスク並列化が可能。  
- **デメリット**: スレッド間の競合やデッドロックに注意が必要。  

---

## 3. プロセスとスレッドの違いをまとめると…  
- **メモリ管理**: プロセスは独自のメモリ空間を持つが、スレッドは共有する。  
- **オーバーヘッド**: プロセスの切り替えには大きなオーバーヘッドがかかるが、スレッドの切り替えは比較的軽い。  
- **安定性**: プロセスは隔離されているため、他のプロセスの影響を受けないが、スレッドは同じプロセス内で影響を与え合う可能性がある。

---

## 4. どちらを選ぶべきか？  
アプリケーションの性質によって、プロセスとスレッドのどちらを使うべきかが決まります。安定性が求められる場合はプロセスを、効率的なリソース共有が必要ならスレッドを使いましょう。

- **プロセスを選ぶ場面**: 複数の独立したタスクが必要で、安定性が最優先の場合。  
- **スレッドを選ぶ場面**: 同じデータを扱いながら、複数のタスクを並列処理したい場合。

---

## まとめ  
プロセスとスレッドは、どちらもマルチタスク処理を支える重要な概念です。アプリケーションのニーズに応じて、適切な選択をすることが、効率的で安定したプログラムの作成に繋がります。

---

## 参考文献
[スレッドとプロセスの違いを完全に理解する](https://zenn.dev/farstep/articles/process-thread-difference)