OmniAICreator/Qiita-1.07M huggingface dataset:
lazygit を Ubuntu にインストールする（開発元の手順通りでは失敗するので手順を修正する）

# lazygit とは
git操作CUIです。
先達の tig に比べて、メニュー操作のみでコミットログ修正やリベースができるのが魅力です。
UIやヘルプが日本語化されているのも嬉しい。

## インストール方法
Ubuntu ではパッケージ化されていないので、`sudo apt install` ではインストールできません。

開発元サイトにインストール方法が解説されているのですが、その通りにコマンドを打ち込んでも失敗します。
 
https://github.com/jesseduffield/lazygit#ubuntu

### 指示通りのインストール手順
```sh
LAZYGIT_VERSION=$(curl -s "https://api.github.com/repos/jesseduffield/lazygit/releases/latest" | grep -Po '"tag_name": "v\K[0-35.]+')
curl -Lo lazygit.tar.gz "https://github.com/jesseduffield/lazygit/releases/latest/download/lazygit_${LAZYGIT_VERSION}_Linux_x86_64.tar.gz"
sudo tar xf lazygit.tar.gz -C /usr/local/bin lazygit
```
#### 失敗理由
- 1行目にて export なしで LAZYGIT_VERSION 変数を設定しているので、２行目のcurlコマンド実行時点では LAZYGIT_VERSION変数は消えており失敗します。
- 3行目で、curlがダウンロードした tar.gz を展開して /usr/local/bin に lazygit を配置しようとしていますが、ファイルのオーナとグループを元通りに展開しようとするので具合が悪いです。

### エラーを取り除いたインストール手順
```sh
export LAZYGIT_VERSION=$(curl -s "https://api.github.com/repos/jesseduffield/lazygit/releases/latest" | grep -Po '"tag_name": "v\K[0-35.]+')
curl -Lo lazygit.tar.gz "https://github.com/jesseduffield/lazygit/releases/latest/download/lazygit_${LAZYGIT_VERSION}_Linux_x86_64.tar.gz"
tar xf lazygit.tar.gz lazygit ; sudo install lazygit /usr/local/bin
```
export を付け、/usr/local/bin へは sudo install を使って配置するように手順変更しました。
これでインストールに成功しました。オーナとグループも一般的なroot:rootとなります。

## END
CヘッダからPython向けバインディングを自動生成してDLLから関数を呼び出す方法

# この記事は？
C向けSDKが手元にあるけど柔軟にインタプリタ型言語のPythonでチクチク触りたい人向に刺さると思われる記事です。

## 時間がない人向け
ctypeslib2をインストールすると付属するclang2pyを使用すると簡単にできる
1. `pip install ctypeslib2`
2. `clang2py header.h -o out.py`
3. （Windowsのみ）生成されたコードを編集し、DLLとリンク


## 確認のためCソースから自作してPythonから呼んでみる
XとYの値を持つ`POINT`型を含んだヘッダファイルを作ります。
C言語側のお仕事は`print_position()`で`POINT`の属性を出力すること。
DLL化するために`__declspec(dllexport)`を使用します。

```c:point.h
#ifndef POINT_H
#define POINT_H

typedef struct Point {
    int x;
    int y;
} Point;

__declspec(dllexport) void print_position(Point *);

#endif

```
```c:point.c
#include "point.h"
#include <stdio.h>

void print_position(Point *point) { printf("X:%d, Y:%d", point->x, point->y); }

```

## 動的ライブラリを作る
```powershell
cl -LD .\point.c
```
この地点でdllとlibが生成されれば成功。

## clang2pyでcヘッダを変換
```powershell
pip install ctypeslib2
```

```powershell
clang2py.exe .\point.h > point.py 
```

## 生成されたバインディングにDLLを紐づける
生成結果には以下のような行があるはずです。
```py:point.py
# libraries['FIXME_STUB'] explanation
# As you did not list (-l libraryname.so) a library that exports this function
# This is a non-working stub instead. 
# You can either re-run clan2py with -l /path/to/library.so
# Or manually fix this by comment the ctypes.CDLL loading
_libraries = {}
_libraries['FIXME_STUB'] = FunctionFactoryStub() #  ctypes.CDLL('FIXME_STUB')
```
これをこう書き換えます。
```py:point.py
# libraries['FIXME_STUB'] explanation
# As you did not list (-l libraryname.so) a library that exports this function
# This is a non-working stub instead. 
# You can either re-run clan2py with -l /path/to/library.so
# Or manually fix this by comment the ctypes.CDLL loading
_libraries = {}
_libraries['FIXME_STUB'] = ctypes.WinDLL(r'path\to\point.dll')
```

dllが一つならばリンクするキーは`FIXME_STUB`のままでいい気もします。 linuxならclang2pyの-lオプションで自動でやってくれるかもしれないです。

## pythonから呼び出してみる
構造体を作って`print_position`に参照渡しする。
```py:main.py
import ctypes
import point

p = point.Point()
p.x = 100
p.y = 200
point.print_position(ctypes.byref(p))
```
### 成功例
成功していればcのソースに従ってX,Yのポイントが出力されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1977360/c69e2f6c-9422-fd77-b43d-e500264d7de1.png)

## 感想
フィールドが補完されないのがちょっとつらいです。
あとメモリダンプをデバッガから確認しづらいのも苦しいです。
【Java Silver SE11】検証環境をdockerで構築する

## 概要
Java Silver SE11の検証用環境をdockerで構築する。
[今回はgithubにソースを置いときました。](https://github.com/hagemanto-saitama/openjdk11)
こちらをベースに説明していきます。
※dockerとdocker-composeの環境が整っていることが前提です

## Java Silverおすすめの勉強方法
なぜdockerで環境を構築するのか、に関係するのがこれ。
Java Silverの試験対策で、個人的におすすめなのが、
コード検証を
**テキストエディタで編集+コマンドラインでコンパイル&実行**
で行うこと。
理由は以下の通り。
- コマンドを自然と覚えられる。
→コマンドも試験に出てくるため、わざわざ頑張って暗記するよりも自然に覚える方が楽
- ディレクトリ構成が自然と頭に入ってくる。
→ファイルを跨いだ継承やモジュール関係の箇所は、
実際にディレクトリ、ファイルを作成してコンパイル&実行を行うと頭に入ってきやすい。
- コンパイルエラー、例外、実行時エラー等の違いが経験として蓄積できる
→WebのコンパイラやIDEはお手軽に作業できるが、
いちいち手でコンパイル&実行する方が、コンパイルと実行の差がはっきりして分かりやすい。
また、コンパイルを省略してjava A.javaのように実行したときの挙動など、
実際に手で実行した方が経験として残りやすい。

※参考までに、私の合格時の正答率は90%です！もちろん1発合格です。
※コマンドラインでコンパイル&実行したいというだけの理由なら、
　dockerでなくてもいいのでは？という声が聞こえてこないでもない。
　まーその通り。
　dockerで構築した方がかっこいいじゃんというだけ。あとホスト側の環境汚さないし。

## ディレクトリ構成
ディレクトリ構成は以下の通り。
```
.
|-- docker/                 # docker関係のファイルの置き場所
|   `-- docker-compose.yml
|-- memo/                   # ちょっとしたメモ類
|-- readme.md
`-- work/                   # 作業ディレクトリ
                            # コンテナ内の~/workとマウントしてある
```

## インストール方法
docker-compose.ymlがあるディレクトリで、下記コマンドを実行する。
```bash
docker-compose up -d
```

## 使い方
- お好みのテキストエディタを使用し、作業ディレクトリ(work/)内でjavaファイルを作成、編集
※work直下に直接ファイルを作成すると散らかるので、
　実際はwork下に沢山ディレクトリを作成し、
　その下で作業を行うことになると思う。
- コンテナ内でコンパイル&実行
```bash:※コンテナへの入り方
docker exec -it コンテナ名 bash
```
ファイルから日本語とスペイン語の文章をそれぞれ順番に読み上げていくスクリプト

<h3>ファイルから日本語とスペイン語の文章をそれぞれ順番に読み上げていくスクリプト</h3>
ファイルから日本語とスペイン語の文章をそれぞれ順番に読み上げていくスクリプトをJavascriptで作りました

2022.09.11 スペイン語と日本語の読み上げ順序を入れ替えました

<hr>
githubURL: https://github.com/NanjoMiyako/spanishAndJapaniseSpeak
gitHubPageURL: https://nanjomiyako.github.io/spanishAndJapaniseSpeak/

<hr>
使い方<br>
以下のような形式のcsvファイルをページから読み込み、読み上げボタンを一回クリックしてから
待つと、順番に読み上げ始めます<br>

日本語文1,スペイン語文1
日本語文2,スペイン語文2
...

<hr>

スクリーンショット
![scnshot1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412430/16e27fb9-405a-7c3a-c791-753795687fac.png)

<hr>
参考にしたサイト<br>
<a href="https://into-the-program.com/javascript-read-the-file/#inputtypefilefilesFile">【JavaScript】ファイルの読み込み方法｜Into the Program</a><br>
<a href="https://prog-8.com/docs/github-pages">自分で作ったWebページをインターネット上に公開しよう！ | プログラミングの入門なら基礎から学べるProgate[プロゲート]</a><br>
<a href="https://web-creates.com/code/js-web-speech-api/">【JS】Web Speech APIの音声読み上げ機能の実装方法（日本語 / 英語読み上げ）｜WEB CREATES</a><br>
<a href="https://qiita.com/chihiro/items/b105a901bbfd6c5b483c">JavaScriptのタイマー処理　setIntervalとsetTimeout - Qiita</a><br>
Ubuntu22.04LTS(デスクトップ版)の設定

# はじめに
こちらの記事の続きです

https://qiita.com/Nats72/items/e88b41b35f02a3fcec09

# ネットワーク設定
IPアドレスを固定したい場合、右上のメニューから**有線設定**を選択して設定できます。
その他にもプロキシ設定したり、IPv6を無効化もGUIで簡単に行えます。

# rootパスワードを設定する
初期状態だと、rootにパスワードが設定されていません。(つまりsudoとかできない）

```
$ sudo passwd root
[sudo] ユーザー のパスワード: {{ユーザーのパスワードを入力}}
新しい パスワード: {{rootパスワードを入力}}
新しい パスワードを再入力してください: {{もう一度入力}}
```

# aptを最新状態にする
```
# apt update
```

# SSH接続できるようにする
OpenSSHをインストールします
```
# apt -y install openssh-server
# systemctl enable ssh
```
初等幾何的解法！「ますいしいからの挑戦状(７)!!」をsympyでやってみたい。


オリジナル

https://ameblo.jp/mathisii/entry-12763510746.html


# sympyで(ますいしい様の手順で)
(1)点H,点Iを定め....
```python
from sympy import *
var('x')
CH=1
AH=x
HD=CH
CD=HD*sqrt(2)
BD=CD
AI=(HD+AH)/sqrt(2)
ans=solve(Eq(AI*sqrt(3)-(x+1)/sqrt(2),BD),x)[0]
print("#(1) HD=",HD)
print("#(1) CD=",CD)
print("#(1) BD=",BD)
print("#(1) AI=",AI)
print("#(1) CH,AH,∠ACH=",CH,",",ans,",",atan(ans/1)*180/pi)
print("#(1) ∠DCA",45+atan(ans/1)*180/pi)
#(1) HD= 1
#(1) CD= sqrt(2)
#(1) BD= sqrt(2)
#(1) AI= sqrt(2)*(x + 1)/2
#(1) CH,AH,∠ACH= 1 , sqrt(3) , 60
#(1) ∠DCA 105
```

(2)勉強中


# sympyで(Pointで)
以下,変数に値を入力しなくてもいいはずと思いました。

(1)a=1が必要でした？

```python
from sympy import *
var('a y')
a=1
B=Point(  0,0)
D=Point(  a,0)
C=Point(2*a,0)
A=              Line(B, slope=tan(Rational(30,180)*pi))     \
  .intersection(Line(D, slope=tan(Rational(45,180)*pi)))[0]
print("#(1)",180-Line(C,A).angle_between(Line(y)).simplify()*180/pi)
#(1) 105
```
？？？？aに値を代入しなかった場合
```python
#(1) -180*acos(sqrt(2)*a*(-1 + sqrt(3))/(4*sqrt(a**2)))/pi + 180
```

(2)a=1が不要でした？
```python
from sympy import *
var('a y')
# a=1
B=Point(  0,0)
D=Point(  a,0)
C=Point(2*a,0)
A=              Line(B, slope=tan(Rational(    15,180)*pi))     \
  .intersection(Line(C, slope=tan(Rational(180-30,180)*pi)))[0]
print("#(2)",Line(D,A).angle_between(Line(B,A)).simplify()*180/pi)
#(2) 30
```
無料の App Service マネージド証明書を Azure CLI で試してみた

## 背景と目的

無料の SSL/TLS 証明書と言えば、Let's Encrypt ですが、昔は Azure App Serivce に対して証明書を自動更新するスクリプトを用意して Cron を別環境で動かしていました。現在は無料の App Service マネージド証明書を使用して、自動更新も Azure に任せる方法がとても楽で便利です。ということで、Azure CLI で無料の App Service マネージド証明書を検証してみました。

## 前提条件

DNS に CNAME レコードを登録する必要があります。今回は Azure DNS を使用しますが、CNAME レコードが登録できて名前解決可能であれば良いです。

## 検証用の App Service を作成

```bash:bash
# 環境変数をセットします
region=japaneast
prefix=mnrappdev
domain=example.jp

# リソースグループを作成します
az group create \
  --name ${prefix}-rg \
  --location $region

# App Service Plan を作成します
az appservice plan create \
  --name ${prefix}-plan \
  --resource-group ${prefix}-rg \
  --sku B1

# WebApp を作成します
az webapp create \
  --name ${prefix}-app \
  --resource-group ${prefix}-rg \
  --plan ${prefix}-plan \
  --runtime "PHP|7.4"

# （省略可） 常時接続を有効にします
az webapp config set \
  --name ${prefix}-app \
  --resource-group ${prefix}-rg \
  --always-on true

# （省略可） 自分の IP からのみアクセスを許可します
az webapp config access-restriction add \
  --name ${prefix}-app \
  --resource-group ${prefix}-rg \
  --priority 100 \
  --rule-name MyIP \
  --action Allow \
  --ip-address $(curl -s inet-ip.info)

# （省略可） WebApp 自身からのループバックアクセスを許可します
az webapp config access-restriction add \
  --name ${prefix}-app \
  --resource-group ${prefix}-rg \
  --priority 200 \
  --rule-name AppIP \
  --action Allow \
  --ip-address $(az webapp show \
  --name ${prefix}-app \
  --resource-group ${prefix}-rg \
  --query outboundIpAddresses \
  --output tsv)
```

## DNS に CNAME レコードを作成

```bash:bash
# WebApp へのアクセス用に CNAME レコードを登録します
az network dns record-set cname set-record \
  --resource-group ${prefix}-rg \
  --zone-name $domain \
  --record-set-name ${prefix} \
  --cname ${prefix}-app.azurewebsites.net

# ドメイン検証用に CNAME レコードを登録します
az network dns record-set cname set-record \
  --resource-group ${prefix}-rg \
  --zone-name $domain \
  --record-set-name awverify.${prefix} \
  --cname awverify.${prefix}-app.azurewebsites.net
```

## ドメインと証明書を登録

```bash:bash
# ドメインを登録します
az webapp config hostname add \
  --webapp-name ${prefix}-app \
  --resource-group ${prefix}-rg \
  --hostname ${prefix}.$domain

# マネージド証明書を作成します
az webapp config ssl create \
  --resource-group ${prefix}-rg \
  --name ${prefix}-app \
  --hostname ${prefix}.$domain

# 作成したマネージド証明書をバインドします
az webapp config ssl bind \
  --certificate-thumbprint $(az webapp config ssl show \
  --resource-group ${prefix}-rg \
  --certificate-name ${prefix}.$domain \
  --query thumbprint \
  --output tsv) \
  --resource-group ${prefix}-rg \
  --name ${prefix}-app \
  --ssl-type SNI

# ブラウザでアクセスして確認します
open https://${prefix}.$domain
```

## 検証環境を削除

```bash:bash
# リソースグループを削除します
az group delete \
  --name ${prefix}-rg \
  --yes
```

## 参考

https://docs.microsoft.com/ja-jp/azure/app-service/configure-ssl-certificate?tabs=apex%2Cportal#create-a-free-managed-certificate
オブジェクトを配列要素として持つ、配列型同士で構成される交差型は array.map での推論で失敗してしまう

## 課題

タイトルの通り、下記のような交差（配列）型 `HogePiyo` に対して array.map でオブジェクトを取り出した場合、そのオブジェクト内に存在するはずのプロパティーが型情報として欠けてしまいます。これは [TypeScript PlayGround](https://www.typescriptlang.org/play?ts=4.8.2) でも確認する事ができます。

```ts
type Hoge = { hoge: number }[];
type Piyo = { piyo: string }[];
type HogePiyo = Hoge & Piyo;

const arrayHogePiyo: HogePiyo = [
    {
        hoge: 1,
        piyo: "a"
    }
];

// OK
const piyo = arrayHogePiyo[0].piyo;

// NG: Property 'piyo' does not exist on type '{ hoge: number; }'.(2339)
const arrayPiyo = arrayHogePiyo.map((item) => item.piyo)
```

## 解決方法

ものすごく単純ですが `HogePiyo` の型定義を下記のように変更します。

```ts
type Hoge = { hoge: number };
type Piyo = { piyo: string };
type HogePiyo = (Hoge & Piyo)[];

const arrayHogePiyo: HogePiyo = [
    {
        hoge: 1,
        piyo: "a"
    }
];

// OK
const arrayPiyo = arrayHogePiyo.map((item) => item.piyo)
```

## 結論

配列型同士を交差型にするのではなく、配列要素（オブジェクト）同士を交差型にして配列型を定義してください。この問題に対しては [TypeScript - issues11961](https://github.com/microsoft/TypeScript/issues/11961) でも取り上げられています。

```ts
// BAD（推論の結果が不透明であり、悪い定義）
type InterSectionArray = Hoge[] & Piyo[];

// GOOD
type InterSectionArray = (Hoge & Piyo)[];
```

## 余談（経緯）

お仕事で [GraphQL Code Generator](https://www.graphql-cli.com/codegen/) を使用しており、そいつが自動で生成してくれる型定義において、上記のような交差（配列）型と array.map 問題に当たってしまったので記事として残しました。自動生成による型定義の場合どうしようもないので、一旦下記のように解決しました。

```ts
// 自動生成された型
type BaseConnection = {
  edges: BaseEdge[]
}
type HogeConnection = {
  edges: HogeEdge[]
}
type Connection = BaseConnection & HogeConnection;
```

```ts
// 解決前: connection.edges の型が BaseEdge[] & HogeEdge[] なため array.map での推論に失敗
const idList = connection.edges.map((item) => item.id);

// 解決: as 句を使って (BaseEdge & HogeEdge)[] に cast する
const idList = (connection.edges as (BaseEdge & HogeEdge)[]).map((item) => item.id);
```
世界一優しいReactの基本その3 -イベントとスタイルとは-

## はじめに
前回はReactのコンポーネント基本を学びました。今回はイベントとスタイルいうところを書いていきたいと思います。
https://qiita.com/k-tetsuhiro/items/88ae3c7eee4aa78942b8

## イベント
Reactにおけるイベントは少し書き方が異なります。
例えばクリックイベントはjsの場合`onclick=xxx`のように書くとおもいますが、
Reactのjsxの場合は`onClick=xxx`のように**キャメルケース**で記載します。

```jsx
<button onClick={xxx}>ボタン</button>
```

## スタイル
スタイルも同様に記載の仕方が通常のhtmlとは異なります。
Reactでは各タグにstyle属性を当てられるのですが、下記のような書き方をします。

```jsx
<h1 style={{ color: "red" }}>タイトル</h1>
```
`style={{}}`となっているのは、**JavaScriptのオブジェクト**を値として入れるためです。
ここでいうJavaScriptのオブジェクトは`{ color: "red"}`になります。
そのため、例えば`font-size`を変更する際には`{ fontSize: "10px" }`のような形になります。
JavaScriptオブジェクトとして定義してあげれば下記のように書くことができます。
```jsx
const contentStyle = {
    color: "red",
    fontSize: "10px"
};

...

<h1 style={contentStyle}>タイトル</h1>
```


## まとめ
jsとhtmlでの記載方法と、jsxでは**多少の差分**があります。
特にハマりやすいのがキャメルケースでの記載だと思います。
例） font-sizeではなくfontSize, onclickではなくonClick等

基礎的なところですがエラーが出やすいところなのでぜひ気をつけたいです。
【Mac】PDFをダークモードで開く方法

### 環境
・mac
・Adobe Acrobat Reader

### Adobe Acrobat Readerをインストール
下記リンクからインストール。
https://helpx.adobe.com/jp/acrobat/kb/install-reader-dc-mac-os.html

### 設定を変える
1, Adobe Acrobat Readerを開く。
2, ショートカットで`Command + K`を実行する。環境設定というタブが開かれたらOK。
3, 左のバーにある`アクセシビリティ`をクリック。
4, `カラーの表示を調整`をONにする。
5, `ハイコントラスト色を使用`をONにする
6, 右側のプルダウンから`黒の背景に白のテキスト`を選択。
7, 右下の`OK`をクリック。

[![Image from Gyazo](https://i.gyazo.com/037866712df67d1fcee36d738556e5ef.png)](https://gyazo.com/037866712df67d1fcee36d738556e5ef)
以上で完了。
ESXiにUbuntu22.04LTS(サーバー版)をインストールする

# はじめに
VMwareESXi7.0u2eの仮想マシンにインストールさせます。

# Ubuntuを入手する
以下のサイトから入手できます。

https://jp.ubuntu.com/download

GUIは要らないので、**UbuntuServer22.04.1LTS**(2022/09現在)をダウンロードします。
**ダウンロード**をクリックするとダウンロードが始まります。

# ESXiデータストアにアップロード
データストアブラウザを使って任意のディレクトリにISOイメージファイルを保存します。

# 仮想マシン作成
1. **仮想マシンの作成/登録**を選択
1. **新規仮想マシンの作成**を選んで次へ
1. 適当な**名前**をにつけます
ゲスト0Sファミリは**Linux**、ゲストOSのバージョンは**UbuntuLinux64ビット**を選択して次へ
1. ストレージを選択して次へ
1. 設定のカスタマイズを以下のとおり変更して次へ
CPU:2
メモリ:2GB
ハードディスク:100GB
  ディスクプロビジョニング:シンプロビジョニング
CD/DVDドライブ:データストアISOファイル > ダウンロードしたISOイメージファイルを選択
1. 完了をクリックで仮想マシン作成完了

# 仮想マシン起動
仮想マシンをパワーオンして起動させます
しばらく待っていればUbuntuインストール準備が始まります

# Ubuntuを設定する
1. 言語選択が表示されたら、**English**を選択して、Enter
1. キーボードレイアウトは、Layout:**Japanese**、Variant:**Japanese**を選択してDone
1. インストールの種類は、**Ubuntu Server(minimized)**を選択して、Done
1. ネットワーク設定をStaticで設定する場合は、変更したいネットワークアダプタを選択して変更
設定完了したら、Done
1. プロキシ設定が必要であれば、プロキシサーバーのアドレスを入力してDone
1. ミラーサーバーの設定は、**http://jp.archive.ubuntu.com/ubuntu/**のままDone
1. ディスク設定は特に変更せずDone
1. Confirm destructive actionが表示されたら、**Continue**を選択
1. ユーザー名、パスワードなどを入力してDone
1. OpenSSHのインストールを聞かれるが、一旦選択せずDone
1. その他、インストール候補が表示されるが、チェックせずDone
1. インストールがはじまります
1. Install complete!と表示されたら、**Reboot Now**を選択

# Ubuntuにログイン
ユーザーを選択肢、パスワードを入力してログインできます
FN1241を鳴らしてみた

秋月電子にたくさん在庫がある、新潟精密のFN1241を鳴らしてみました。まだFN1242の在庫が有ったころに一緒に買ったものです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/3bb854d4-de0b-2cf0-c8c2-5d0ba4d8d165.png)

FN1241はTEACのVRDS-50(￥250,000)という高級CDプレーヤーでも使われていたようです。

FN1242の時も結構苦戦したのですが、今回もFN1241も結構な曲者でした。

FN1241は384fsか512fsなので使用できるDAIが限定されます。おそらくFN1241が制約が多く改良したものがFN1242だったのではないかと思われます。FN1241は2000年くらいの発売でFN1242は2002年くらいの発売だったようです。

FN1242はTEACのVRDS-15やLUXMANのDU-7i,DU-80で使われていたようです。

FN1241は最初の製品なので、パッケージも大きいし良い音がしそうな予感がします。

48Kの512fsは24.576MHzです。

DAIは512fs対応したpic32mx_usb_i2sを使います。

アナログ部分はOKIRAKU AUDIOさんの回路を参考にしました。おそらくこの回路は、リファレンスボードの回路に近いのではないかと思います。

変換基板はaitendoのものを使いました。GNDを変換基板上で空中配線して、VCCは基板の裏で回します。変換基板の2番ピンにチップの1番にしてみましたが、3番ピンにすると角が2ピンずつ空くので、そっちの方が良かったかもしれません。

いつもは秋月のC基板でつくっているのですが、変換基板が大きいのでマルツで買ったちょっと大きい基板を使いました。

384fs,512fsはジャンパーで変更できるようにしました。

片チャン作って音だししたところ音がでません。

リセット回路をプルアップだけにしていたところ、だめでコンデンサーを入れた遅延回路が必要でした。

![Fb-f0dJaAAE2JXt.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/0447ada6-7735-deb8-ce52-74283d2e635b.jpeg)

音は出るようになったのですが、音がおかしいです。

とりあえず両チャン作ってみましたが、両方ともおかしいです。

いろいろいじってるうちにランドをはがしてしまい、ジャンパー張りました。

正弦波を再生してオシロで信号を見ると波形がおかしいです。

![FcB_yjiacAEZSoV.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/7e88e540-f4d5-50f7-0650-8f92dd99d58c.jpeg)

いろいろ試したところ、mpg123を何度か起動しなおすとまともな時があります。I2Sの何らかの問題と思われます。ぼちぼち調べてみたいと思います。

FreeBSD/mips 12.3のmpg123とMacOS X 10.4のiTunesで試しましたが、同じようにノイズ混じりになるときと正常に再生されることがありました。

正常に再生が始まれば、その再生は止めるまでは問題ありません。

~~ネット上で回路図を調べてみると、外部からリセットできるような回路があり、何らかのケースにおいてリセットが必要なのかもしれません。~~ リセットしても変わらないようです。

I2Sの信号線にダンパー抵抗入れてみましたが、効果ありません。

データーシートには無いんですが、512fsの設定で256fsでも鳴るようです。とくにおかしいような感じはないんですが。DAIによるのかもしれません。なにかの勘違いかな。。。

|DAI|Sound|
|:--|:--|
|PIC32MX|△|
|PCM2706|○|
|CP2114|×|
|SN11122|○|
|AR9341|○ *|

\* AR9341は74HC125のバッファを入れたらちゃんと鳴るようになりました。

OPアンプが片側10mAくらいなので、合計40mAくらいかと思われます。正負電源はOPアンプで作ってるので、ほぼほぼ限界です。

当初FN1241のデジタル系のDVDDとアナログ系のAVDDを一緒にしていたのですが、アナログ系をOPアンプの電源側からレギュレータで入れるようにしました。FN1242はAVDDが5VなのですがFN1241は3.3Vです。

![IMGP0029.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/960ab6c8-a0cb-7c2a-52ab-077a767b2fb3.jpeg)

WBGO聞いていますが、ゴージャスな音がするような気がします。音にしまりがあって、むちゃいいです。

pic32mx_usb_i2sはWindowsでは使えませんがMacやFreeBSDではちゃんと使えます。

参考にまでFN1241の秋月電子取り扱いは「発売日　2008/01/23」となっていて、その後新潟精密は「2008年1月31日，東京地方裁判所に民事再生手続きの開始を申し立てた。」だったようです。

秋月にある在庫は最後の生産で、おそらく256fsも対応したものなのかもしれません。

蛍光灯や扇風機のON/OFFの電源のノイズで暴走する事があったのでRESETをグランドに落とすスイッチを付けました。

2022/8くらいから秋月電子ではいろいろ処分品が出ていますが、FN1241は800円のままです。ただ、PCM1795が半額になっていたので、次のターゲットはこれです。

![FcQZN9haAAIBMKD.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/9df4f270-d4c1-15c1-84a6-2f50185aa921.jpeg)
【GitHub】テンプレートリポジトリの作成方法

## 作成方法
通常どおりリポジトリを準備します。

作成したリポジトリのページを開き、「Settings」をクリックします。
「Template repository」にチェックを入れます。

![スクリーンショット 2022-09-10 15.29.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/a97d11ba-fc78-1125-9bf9-eb786ce43f83.png)

これでテンプレートリポジトリが作成できました。

## 使用方法
テンプレートリポジトリを使用して新規リポジトリを作成するには以下の2つの方法があります。

- テンプレートリポジトリのページから作成
- 「New repository」から作成

### テンプレートリポジトリから作成
テンプレートリポジトリのページを開き、画面右上にある「Use this template」を選択します。
![スクリーンショット 2022-09-10 15.36.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/5d694747-2c23-8a4e-023a-43f90ccf4603.png)


すると以下の画面になりますので通常どおりリポジトリ名などを入力してリポジトリを作成します。
![スクリーンショット 2022-09-10 15.47.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/fabc900e-12bb-a610-38b3-be3a560ab968.png)

するとテンプレートリポジトリの内容が`Initial commit`された状態のリポジトリが作成されます。

![スクリーンショット 2022-09-10 15.55.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/95bd1ff8-c07c-c140-0931-ba1df2fd2a56.png)


### 「New repository」から作成する

通常どおり「New repository」から作成するには「Create a new repository」の画面の「Repository template」の項目でテンプレートリポジトリを選択します。
すると選択したテンプレートリポジトリの内容が`Initial commit`されたリポジトリが作成されます。

![スクリーンショット 2022-09-10 15.54.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/e5712333-7380-2274-6735-6f274629dccf.png)

![スクリーンショット 2022-09-10 15.55.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/95bd1ff8-c07c-c140-0931-ba1df2fd2a56.png)
AWSでdocker-composeを動かすまで

dockerもAWSも「触ったことがある」程度の僕が、自分でEC2インスタンスを立て、そこでdocker-composeする必要が出たので、その際にやったことのメモです。

## 概要
+ AWSにdocker-composeを入れる
+ git cloneするためにGitHubにSSH keyを設定する

### 前提
+ EC2を立てられる人向けです
+ docker-composeで動くモノをGitHubにおいている人向けです

# 参考
+ [【AWS】EC2にDockerとDocker Composeをインストール](https://kacfg.com/aws-ec2-docker/)

# AWSの基本設定
### セキュリティグループ
EC2のセキュリティグループでSSHを許可しましょう。
IPアドレスはわかるなら自分のものにしましょう。僕は実験用なら0.0.0.0にしてしまっています。
ウェブサーバーならHTTP・HTTPSも許可しておきましょう。

# AWSにdockerを入れる
### dockerのインストール
```bash
sudo amazon-linux-extras install -y docker
```

### dockerの起動
```bash
sudo systemctl start docker
```

### 再起動時に自動で起動する設定
```bash
sudo systemctl enable docker
```

### ec2-userにdockerの操作を許可
```bash
sudo usermod -a -G docker ec2-user
```
一旦`exit`して再度ssh接続すれば、ec2-userのまま、sudoなしでもdockerの操作が可能になる。

# AWSにdocker-composeを入れる
```bash
sudo mkdir -p /usr/local/lib/docker/cli-plugins
sudo curl -L https://github.com/docker/compose/releases/download/v2.4.1/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/lib/docker/cli-plugins/docker-compose
sudo chmod +x /usr/local/lib/docker/cli-plugins/docker-compose
sudo ln -s /usr/local/lib/docker/cli-plugins/docker-compose /usr/bin/docker-compose
```
2行目のコマンドの`2.4.1`の部分を変えることで入れるdocker-composeのバージョンを変えることができます。

# gitの準備
### yumのアップデート
```bash
sudo yum update -y
```

### AWSにgitを入れる
```bash
sudo yum install -y git
```

### git用のSSH keyを設定する
```bash
cd .ssh
ssh-keygen
```

### GitHubにSSH keyを登録する
[ここ](https://github.com/settings/keys)に`.pub`で終わるファイルの中身をコピペする。

これで`git clone`がSSHを使って行うことができるようになります。
お疲れさまでした。


# 結論
とても簡単にできました。
docker、慣れてくると便利ですね……。

なお、ファイル権限の問題で`docker-compose up`してもmysqlコンテナが動かない……などといった問題が発生しました。
こう言うことの対策で[Rootless mode](https://docs.docker.com/engine/security/rootless/)なるものがあると友人に教えてもらったので、この辺も慣れていきたいなぁ……。

# 宣伝
2022年11月18日（金）〜20日（日）に[駒場祭](https://komabasai.net)と言う学園祭があります。
僕は委員は引退したものの、[ut.code();](https://utxcode.net)というソフトウェア（特にウェブアプリケーション）開発に主眼を置いたプログラミングサークルの担当者として参加します。

「あなたのためのプログラミング」と題しまして、プログラマーの方も、初心者の方も、未経験者の方も、また子供も、大人も、皆さんが楽しめる企画を準備しているところです。

まだ対面開催になるか、オンライン開催になるかなど不確定な点が多いですが、今後新情報が入りましたら[ut.code();のTwitterアカウント](https://twitter.com/utokyo_code)にて発信しますので、もし興味を持っていただけましたらぜひフォローしてお待ちください。

皆様のご来場（オンライン含め）を心からお待ちしております。
ESXiにUbuntu22.04LTS(Remixデスクトップ版)をインストールする

# はじめに
VMwareESXi7.0u2eの仮想マシンにインストールさせます。

# Ubuntuを入手する
以下のサイトから入手できます。

https://www.ubuntulinux.jp/download

Ubuntuは、本家とRemixの2種類あります。
Remix版は、Japanese Teamが日本語関連などのバグを対策したもののようです。
なので、基本的にはRemix版をインストールすれば良いらしい。

こちらはUbuntu22.04LTS　Remix版のダウンロードページです。

http://cdimage.ubuntulinux.jp/releases/22.04/

**ubuntu-ja-22.04-desktop-amd64.iso**をクリックしてダウンロードします。

# ESXiデータストアにアップロード
データストアブラウザを使って任意のディレクトリにISOイメージファイルを保存します。

# 仮想マシン作成
1. **仮想マシンの作成/登録**を選択
1. **新規仮想マシンの作成**を選んで次へ
1. 適当な**名前**をにつけます
ゲスト0Sファミリは**Linux**、ゲストOSのバージョンは**UbuntuLinux64ビット**を選択して次へ
1. ストレージを選択して次へ
1. 設定のカスタマイズを以下のとおり変更して次へ
CPU:2
メモリ:2GB
ハードディスク:100GB
  ディスクプロビジョニング:シンプロビジョニング
CD/DVDドライブ:データストアISOファイル > ダウンロードしたISOイメージファイルを選択
1. 完了をクリックで仮想マシン作成完了

# 仮想マシン起動
仮想マシンをパワーオンして起動させます
しばらく待っていればUbuntuインストール準備が始まります

# Ubuntuを設定する
1. ようこそ画面が表示されたら、**日本語**を選択して、**Ubuntuをインストール**ボタンをクリック
1. キーボードレイアウトは、**Japanese > Japanese**を選択して**続ける**を選択
1. **最小インストール**を選択、その他のオプションは全部チェックを外して**続ける**を選択
1. インストールの種類は、**ディスクを削除してUbuntuをインストール**を選択して、**インストール**を選択
1. ディスクに変更を書き込みますか？と聞かれたら、**続ける**を選択
1. どこに住んでいますか？は、**Tokyo**を入力して**続ける**を選択
1. ユーザー名やパスワードを入力、**ログイン時にパスワードを要求する**設定で**続ける**を選択
※ ユーザー名とパスワードはログインに使いますので控えておきましょう
1. インストール完了を待ちます
1. インストール完了すると、再起動するかどうか聞かれますので、**今すぐ再起動する**を選択
1. Prease remove the installation medium, then press ENTER:
が表示されたら**ENTERキー**を押下

# Ubuntuにログイン
ユーザーを選択肢、パスワードを入力してログインできます
配列の繰り返し処理

# 目的
- 繰り返処理の方法とメリットを理解する

# ポイント
- 繰り返処理を使えば、何度も同じ処理を書く必要が無くなる
- ループの回数を使い時は、with_index メソッドを使う

# 書き方の例
```ruby
#以下の配列の要素を２倍にして足し合わせる
numbers = [1, 2, 3]

sum = 0

numbers. each do |number|
  sum += number*2  #sum = sum + number*2
end

puts sum


numbers = [1, 2, 3]
sum = 0
numbers.each {|number| sum += numbers*2}
```
~実際の表示~
12
12

# 注意するポイント
- 「each」「map」はオブジェクトのループで使う
- 「each」は先頭から順に変数に渡される
- 「times」は回数を指定するループ

# 具体的な例
```ruby
fruits = ["apple", "banana", "lemon"]

fruits.each.with_index(1) do |fruit, index|
  puts "No,#{index}: #{fruit}"
end

```
~実際の表示~
No,1: apple
No,2: banana
No,3: lemon
HuggingFaceのtokenizerとbertを触ってみた

huggingfaceより提供されているtransformersを使って出力を確認します。
tokenizerは文字列を数値に変換するためのものです。モデルそのものは文字列を扱えないため数値に変換する必要があります。bertにトークン化した文章を入力すると各単語を768次元のベクトルに変換して返してくれます。

まずはライブラリをinstallします。
```
pip install transformers
```

bertモデルを使用します。提供されているモデルは以下より確認できます。
https://huggingface.co/models

```
from transformers import AdamW, AutoModel, AutoTokenizer

MODEL_NAME='bert-base-uncased'
tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME)
model=AutoModel.from_pretrained(MODEL_NAME)
```

準備は済んだのでそれでは使ってみましょう。
まずは "i am a man"　という文字列を入れてみます。 

```
tokenizer("i am a man")

#=>　{'input_ids': [101, 1045, 2572, 1037, 2158, 102], 'token_type_ids': [0, 0, 0, 0, 0, 0], 'attention_mask': [1, 1, 1, 1, 1, 1]}
```
出力はinput_ids、token_type_ids、attention_maskが帰ってきます。
input_idsが文字列を数値にしたもので、文頭と文末にCLSとSEPという特殊なトークンがついて帰ってきます。"i am a man" => "CLS i am a man SEP" =>"101, 1045, 2572, 1037, 2158, 102"という風に変換されます。

```
tokenizer.encode("i am a man")


#=> [101, 1045, 2572, 1037, 2158, 102]
```
tokenizer.encodeとするとinput_idsだけを返してくれます。


```
tokenizer.tokenize("i am a man")

#=> ['i', 'am', 'a', 'man']
```
tokenizer.tokenizeとすると分かち書きと言って単語ごとに分けて返してくれます。


```
tokenizer("i am a man",return_tensors='pt')

#=> {'input_ids': tensor([[ 101, 1045, 2572, 1037, 2158,  102]]), 'token_type_ids': tensor([[0, 0, 0, 0, 0, 0]]), 'attention_mask': tensor([[1, 1, 1, 1, 1, 1]])}
```
return_tensors='pt'とすると、モデルに入力できる形にしてくれます。ptはpytorchです。

次に大文字と小文字を入力し結果を確認します。
```
tokenizer("i am a man")

#=> {'input_ids': [101, 1045, 2572, 1037, 2158, 102], 'token_type_ids': [0, 0, 0, 0, 0, 0], 'attention_mask': [1, 1, 1, 1, 1, 1]}
```

```
tokenizer("I AM A MAN")

#=>{'input_ids': [101, 1045, 2572, 1037, 2158, 102], 'token_type_ids': [0, 0, 0, 0, 0, 0], 'attention_mask': [1, 1, 1, 1, 1, 1]}
```
結果は同じになりましたね！モデルを'bert-base-uncased'にすると大文字小文字を区別しません。'bert-base-cased'を使用すると大文字小文字も区別します。



次にbertを触ってみます。
```
input=tokenizer("i am a man",return_tensors='pt')
out=model(input_ids = input['input_ids'],
      token_type_ids = input['token_type_ids'],
      attention_mask = input['attention_mask'],
      return_dict=False)

print(type(out))
print(len(out))

#=> <class 'tuple'>
    2
```
タプルで2つの出力が得られました。中身を見てみましょう。

```
print(out[0].shape)
print(out[1].shape)

#=>torch.Size([1, 6, 768])
   torch.Size([1, 768])
```
一つ目の出力は各単語のベクトルが帰ってきます。真ん中の6は文章の単語数4とCLSとSEPを入れた6になっています。
文書分類では先頭のCLSトークンが文章を表しているとみなし、これを特徴量として使います。


今回はここまでとなります。
Chromeデベロッパーツールの背景画像を変える🙀


こんにちは。皆さんはChromeデベロッパーツール使ってますか？
VSCodeでもvimでも、テキストエディタでは背景画像やテーマが変えられる拡張機能がありますよね。
じゃあ、Chrome devtoolsは…？と興味本位で調べると、英語でも全然やってる人がいない。

ということで、今回は軽くChromeデベロッパーツールの背景画像（background image）を変えてしまうやり方をシェアします。

（蛇足： 先日[こういうアプリ作ったよ記事](https://qiita.com/yuipapps/items/62d638ca06e06c5693f0)をQiitaに上げていて、このQiitaアカウントではReact.jsとかNext.jsとか、開発に関連する学習記事を上げていく予定でしたが、
Qiitaアカウントの切り替えが面倒なので、このアカウントのまま投稿することにします😿）

## 早速、Chromeデベロッパーツールの背景画像を変える

ではやっていきましょう。
まず、完成図がこちら。

![ShareX-220910T154106-K2NzIxHh~chrome-DevTools_-_chrome.google.comwebstoredetailrevol.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2818973/c99c570d-1f6e-f026-6c26-d6eb449653ce.png)

と言っても特にやることはなく、画像を入れるだけならシンプルです。

ChromeデベロッパーツールはHTML/CSS/JavaScriptで書かれていますので、理屈上、普段やるようにCSSを変えてやればよいです。

任意のウェブページ・URL上でChromeデベロッパーツールを開き（ctrl-shift-Iショートカットキーで開きます）、
さらにもう一度Chromeデベロッパーツールを開きます（同じく、ctrl-shift-Iショートカットキーで開きます）。

これで、ChromeデベロッパーツールのためのChromeデベロッパーツールが開かれます。

こういうふうに、HTML、DOM要素の検証ができます。

![ShareX-220910T160753-BtdVgt46~chrome-DevTools_-_devtoolsdevtoolsbundleddevtools_ap.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2818973/cf3899f2-a27e-ee7a-cb66-bef61916c5af.png)

今回はChromeデベロッパーツールのJavaScriptを入力するコンソールタブの背景画像を挿入するので、
ChromeデベロッパーツールのHTML上で次の要素を探します。

```js 
div[id="console-messages"]
```

そこに以下のようにCSSを追加します。
画像のURLは任意で差し替えます。

```css 
{    
    background-image: url(https://images.unsplash.com/photo-1588093335104-b539e62d7a72?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=880&q=80);
    background-repeat: no-repeat;
    background-size: cover;
}
```

使用画像: [white and black cat on brown wooden table photo – Free Image on Unsplash](https://unsplash.com/photos/gBKJ7GY5jhE)

完了です。

![ShareX-220910T161649-7MYu65MK~chrome-DevTools_-_chrome.google.comwebstoredetailrevol.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2818973/e9de68db-e5ab-9e80-10fc-a91efebc4c6d.png)

少し見にくいですね。猫さんと可読性のトレードオフ、悩ましい…😿

もちろん画像はお好きなのが使えますので、黒色メインでいい画像であれば見やすくなるかと思います。

## 恒久的にするにはどうするの？

できるか試しただけなので恒久的に設定するにはどうするかまで考えていませんでした…😿
少し調べましたがあまり情報も多くなく、後日時間が空いたら検証、出来たら当記事も更新したいと思います。

ご存じの方など、コメントなどでご教授いただけると助かります。

以上です。適当に自慢にでも使ってもらえれば幸いです。

終わり。😺

---

PS. よいやり方の提案・間違い修正etcぜひお伝え下さい。
ありがとうございました。
【jQuery】特定のセレクタが付いた親要素を持つ子要素（または子要素を持つ親要素）の指定

<h2>特定のセレクタが付いた親要素を持つ子要素を指定したい場合</h2>

セレクタとは、スタイルを適用する箇所(条件式)のこと。
idとかクラスとか、タグとか。

↓こんなパターンのときに使える。

▼"hoge-wrap"というクラスが付いた親要素の子要素に、クラスを追加したいときの記述
html
```
<ul class="hoge-wrap">
  <li class="hoge"></li>
</ul>
```
js
```
function $hoge() {
  $(".hoge-wrap").children().addClass("hogehoge");
}
```

＜注意点＞
`addClass`とか`removeClass`メソッドのように、メソッド名に"Class"というワードが入っていたら、""内に入力するクラス名の先頭には".（ドット）"は付けない。

＜応用編＞
▼"hoge-wrap"というクラスが付いた親要素の子要素に、スタイルを追加したいときの記述
```
$(".hoge-wrap").children().css("background", "lightgreen");
```
▼"hoge-wrap"というクラスが付いた親要素の子要素から、特定のクラスを削除したいときの記述
```
$(".hoge-wrap").children().removeClass("background", "lightgreen");
```

他にも色々応用できそう〜！
`children`以外にも、特定のセレクタが付いた要素の子要素を指定するメソッドはいっぱいあった。

参照元：
https://flytech.work/blog/19413/#children

<h2>特定のセレクタが付いた子要素を持つ親要素を指定したい場合</h2>

▼`"hoge"`というクラスが付いた子要素の親要素の<li>タグに、クラスを追加したいときの記述
html
```
<ul class="hoge-wrap">
  <li><span class="hoge">1</span></li>
</ul>
```
js
```
function $hoge() {
    $("li:has(.hoge)").addClass("hogehoge");
  }
```

＜応用編＞
▼"hoge"というクラスが付いた子要素の、"hoge-wrap"というクラスが付いた親要素内の子要素`<li>`タグだけに、スタイルを追加したいときの記述
```
$(".hoge-wrap li:has(.hoge)").addClass("hogehoge");
```

参照元：
https://stand-4u.com/web/javascript/jquery-has.html
定積分「2005年 名古屋大・理系(前期) 数学 第４問(b)(2)」をwolframAlphaとsympyでやってみたい。

安易な方法は、だめでした。
＞訓練と経験が大切でした！！

オリジナル ますいしい様

https://ameblo.jp/mathisii/entry-12763519567.html

上と同じです。大学入試数学問題集成＞【４】(b)

https://mathexamtest.web.fc2.com/2005/200510481/2005104810100mj.html#top-0109



# wolframAlphaで(安易な方で)

Integrate[x(sinx)^3/(4-cosx^2), {x, 0, pi}]

https://www.wolframalpha.com/input?i=Integrate%5Bx%28sinx%29%5E3%2F%284-cosx%5E2%29%2C+%7Bx%2C+0%2C+pi%7D%5D&lang=ja

定積分 integral_0^π (x sin^3(x))/(4 - cos^2(x)) dx = 0.553048

# sympyで(ますいしい様の手順で)
勉強中


# sympyで(安易な方で)
```python
from sympy import *
import sympy
var("x")
f=x*sin(x)**3/(4-cos(x)**2)
print("#",integrate(f,(x, 0, sympy.pi)))
print("#",Integral (f,(x, 0, sympy.pi)).evalf())
print("#",nsimplify(Integral(f, (x, 0, sympy.pi)), [pi]))
print("#オリジナルより",(4-3*log(3))/4*sympy.pi,float((4-3*log(3))/4*sympy.pi))
plot(f,(x,0,sympy.pi))
# -Integral(x*sin(x)**3/(cos(x)**2 - 4), (x, 0, pi))
# 0.553048432172391
# Integral(x*sin(x)**3/(4 - cos(x)**2), (x, 0, pi))
#オリジナルより pi*(1 - 3*log(3)/4) 0.5530484321723912
```
作図は、matplotlibでなくsympyの作図モジュールで。縦横比違います。

![Figure_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109698/45a76637-6309-aa21-4f4c-93ab0ca68d2e.png)
ip netns で仮想ネットワーク構築

# 背景・目的
CCNA資格を取得後、自分の心に湧き上がってきた「勉強したことを何かアウトプットしたい！」、という強い想いを発散させる。
## 条件、内容
・Cisco機器は手元にないので仮想ネットワークを構築する（ip netnsを使う）。
・dockerコンテナで作業を行う。
→致命的なミスをして使用PCに影響を与えたくない。
→ubuntu:18.04のコンテナ環境で作業実施。
[参考_docker](https://www.sejuku.net/blog/82240)

・2つの仮想ネットワークからpingを打ち、疎通確認を行う。
・PCはMac
・ネットワークの簡略図
![screen 5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698556/ee13e522-4c33-f13b-a9d3-e710a7b14c00.png)


## 実行コマンド
ターミナルで入力したコマンド。
```:ターミナルで入力
# ns1とns2の間にルーター（r1）を設置し、各々設定してpingで疎通確認できるようにする

#各namespaceの作成
ip netns add ns1
ip netns add ns2
ip netns add r1

#各々のインターフェースを接続する
ip link add ns1-eth0 type veth peer name gw-eth1
ip link add ns2-eth0 type veth peer name gw-eth2

#インターフェースをnamespaceに所属させる
ip link set ns1-eth0 netns ns1
ip link set ns2-eth0 netns ns2
ip link set gw-eth1 netns r1
ip link set gw-eth2 netns r1

#インターフェースをUPの状態にする
ip netns exec ns1 ip link set ns1-eth0 up
ip netns exec ns2 ip link set ns2-eth0 up
ip netns exec r1 ip link set gw-eth1 up
ip netns exec r1 ip link set gw-eth2 up

#IPアドレスを設定する
ip netns exec ns1 ip address add 192.0.2.1/24 dev ns1-eth0
ip netns exec r1 ip address add 192.0.2.254/24 dev gw-eth1
ip netns exec r1 ip address add 198.51.100.254/24 dev gw-eth2
ip netns exec ns2 ip address add 198.51.100.1/24 dev ns2-eth0

#デフォルトルートを設定する
ip netns exec ns1 ip route add default via 192.0.2.254
ip netns exec ns2 ip route add default via 198.51.100.254

#実際にpingを打つ
ip netns exec ns1 ping -c 3 198.51.100.1 -I 192.0.2.1

```
## 所感
・実際にpingは成功した。
・netns やコマンド内容はCCNAの資格取得前に一度読んだことのある本を参考にしました。
以前はさっぱりわからなかったですが、今回はスラスラと内容がわかりました。
・内容的には初歩ですが、「資格勉強が活きている！！」と実感でき満足です。


以上
配列 の様々な メソッド

# 目的
- どのようなメソッドがあるのかを理解する

# ポイント
- pry の ls を使って配列のメソッドを確認する
- やりたい処理を言語化し、使えるメソッドを探す

# 書き方の例
```ruby
array = [1, 2, 3]

array.shift  #キュー方式
p array

array.unshift(1)  #キュー方式
p array

array.pop  #スタック方式
p array


```
~実際の表示~
[2, 3]
[1, 2, 3]
[1, 2]
# 注意するポイント
- 破壊的メソッド と 非破壊的メソッドがある
- 非破壊的メソッドでも「!」を使えば元の変数の値を書き換えることができる

# 具体的な例
```ruby
numbers = [3, 8, 1, 18, 124, 10, 8, 5, 53, 10]
numbers.uniq!
p numbers
p numbers.sum


names = ["聡", "次郎", "太郎", "小次郎", "武蔵"]

man = "小次郎"

#result = true

result = names.include?(man)  #trueがかえる

if result
  puts "名前が含まれています"
else
  puts "名前が見つかりませんでした"
end
```
~実際の表示~
[3, 8, 1, 18, 124, 10, 5, 53]
222
名前が含まれています
Android アプリの ANR の解析方法

Android アプリで [ANR](https://developer.android.com/topic/performance/vitals/anr?hl=ja) が発生した際の解析方法をメモします。

ANR の解析には [Bugreport](https://developer.android.com/studio/debug/bug-report?hl=ja) を使用します。
```
adb bugreport
```

bugreport コマンドを実行すると、下記のような zip ファイルが生成されます。
```
bugreport-sdk_phone_x86-RSR1.210210.001.A1-2022-09-10-15-05-50.zip
```

zip ファイルを解凍すると、下記のファイルが生成されています。
```
bugreport-sdk_phone_x86-RSR1.210210.001.A1-2022-09-10-15-05-50/FS/data/anr/anr_2022-09-10-15-05-30-781
```
※ファイル名は ANR が発生した日時になります。

ファイルを開くと下記のような、メインスレッドで何の処理が行われていたかが出力されています。
```
"main" prio=5 tid=1 Sleeping
  | group="main" sCount=1 dsCount=0 flags=1 obj=0x70e9b058 self=0xe0804610
  | sysTid=9121 nice=-10 cgrp=top-app sched=0/0 handle=0xeedbf478
  | state=S schedstat=( 3911734179 4176691909 1541 ) utm=230 stm=160 core=0 HZ=100
  | stack=0xff0ae000-0xff0b0000 stackSize=8192KB
  | held mutexes=
  at java.lang.Thread.sleep(Native method)
  - sleeping on <0x03003049> (a java.lang.Object)
  at java.lang.Thread.sleep(Thread.java:442)
  - locked <0x03003049> (a java.lang.Object)
  at java.lang.Thread.sleep(Thread.java:358)
  at com.ykato.sample.kotlin.MainActivity.onStart(MainActivity.kt:76)
```

上記の場合は、MainActivity.onStart(MainActivity.kt:76) で処理が止まり、ANR　が発生したことがわかります。
DBFSルートを操作する際の推奨事項

[Recommendations for working with DBFS root \| Databricks on AWS](https://docs.databricks.com/dbfs/dbfs-root.html) [2022/9/2時点]の翻訳です。

:::note warn
本書は抄訳であり内容の正確性を保証するものではありません。正確な内容に関しては原文を参照ください。
:::

Databricksでは、いくつかのワークスペースのアクションのデフォルトロケーションとしてDBFSルートディレクトリを使用します。DBFSルートにプロダクションデータやセンシティブな情報を格納することはお勧めしません。本書では、誤ってセンシティブなデータをDBFSルートで公開してしまうことを避けるための推奨事項にフォーカスしています。

:::note
**注意**
Databricksは、内部DBFSと呼ばれる顧客保有のクラウドストレージにデータや設定を永続化するために、別のプライベートストレージロケーションを設定します。このロケーションはユーザーには公開されません。
:::

# DBFSルートにデータを格納しないようにユーザーを教育してください

DBFSルートはワークスペースの全てのユーザーがアクセスできるので、ここに格納されたデータには全てのユーザーがアクセスできます。センシティブなデータを格納する際にこのロケーションを使わないようにユーザーに指示することが重要となります。DatabricksにおけるHiveメタストアのマネージドテーブルのデフォルトロケーションはDBFSルートとなります。マネージドテーブルを作成するユーザーがDBFSルートに書き込まないように、Hiveメタストアでデータベースを作成する際に外部ストレージのロケーションを宣言してください。

Unity Catalogのマネージドテーブルは、デフォルトでセキュアなストレージロケーションを使用します。Unity Catalogのマネージドテーブルを使用することをお勧めします。

# アクティビティをモニタリングするために監査ログを使用してください

データをDBFSルートに格納するユーザーを監視、特定するために、ワークスペースの監査ログを用いてクラウド監査ログを活用することができます。

問題を迅速に調査できるように、DBFSルートバケットに[S3オブジェクトレベルのロギングを有効化](https://docs.aws.amazon.com/AmazonS3/latest/userguide/enable-cloudtrail-logging-for-s3.html)することをお勧めします。S3オブジェクトレベルのロギングを有効化すると、AWSの利用コストが増加することに注意してください。

# 顧客管理キーを用いてDBFSルートのデータを暗号化してください

顧客管理キーを用いてDBFSルートのデータを暗号化することができます。[Databricksワークスペースストレージに対する顧客管理キーの適用](https://qiita.com/taka_yayoi/items/a93cc81ed0c803401bb7)をご覧ください。

### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)
vscodeでMarkdownファイル修正中に「command 'markdown.extension.onEnterKey' not found」と表示されたときの対処法

## 現象

- vscodeで改行ができなくなり、以下のメッセージが表示される。
  - `command 'markdown.extension.onEnterKey' not found`

![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449867/2e4643f3-a7dc-765a-90fe-88d18dfae8e5.png)

## 対処法

- 拡張機能「Markdown All in One」の再インストールを行う
![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449867/70ac61ae-2389-736d-8a65-482adc14e661.png)
- それでも直らない場合は、vscodeの再起動を行う
- それでも直らない場合は、PCの再起動を行う

※ 筆者はPC再起動で直った。
Raspberry Pi Picoに電力を供給する最小の手段

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Raspberry Pi Pico史上最もコンパクトで手抜きな電源のつけ方を発見しました <a href="https://twitter.com/hashtag/RaspberryPiPico?src=hash&amp;ref_src=twsrc%5Etfw">#RaspberryPiPico</a> <a href="https://twitter.com/hashtag/%E3%83%A9%E3%82%BA%E3%83%94%E3%82%B3?src=hash&amp;ref_src=twsrc%5Etfw">#ラズピコ</a> <a href="https://t.co/IkebayefxW">pic.twitter.com/IkebayefxW</a></p>&mdash; くらむぼん (@krmbn0576) <a href="https://twitter.com/krmbn0576/status/1565320972558745600?ref_src=twsrc%5Etfw">September 1, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# 解説

Raspberry Pi PicoはmicroUSBポートからだけでなく、VSYSピンからも電力を供給できる仕様がある。

そこでリチウムコイン電池CR2025をひとつ用意し、＋極がVSYS(39ピン)に、－極が隣のGND(38ピン)に当たるように挟んでみたら起動した。

# 他の方法

## モバイルバッテリー（microUSBポートに挿す）

まず小さくてもトランプ1枚ほどの大きさがありPicoよりもでかすぎるうえ、供給先として想定されていないためか１分ほどで供給が止まってしまいうまくいかない。

## 電池をケースに入れてジャンパー線でVSYSにつなぐ

USBポートを用いないアプローチでは最もオーソドックスなやり方で、手間を惜しまずサイズも妥協するのであれば悪くはない。ただ普通のラズパイではなくラズパイピコを採用している時点で「めっちゃコンパクトにしたいなあ」と思っていることは多いだろうから、今回の最小手段も魅力的ではないだろうか。

## アルカリボタン電池

確かにリチウムコイン電池よりさらに直径が小さい傾向にあるが、１個で1.5Vしかないため「VSYSは1.8～5.5Vを流すと起動する」という公式に要求されている電圧に微妙に足りない。（なおリチウムコイン電池なら１個あたり3Vなので十分）

２個挟むのはサイズ的に本末転倒だし、リチウムの方が小さい電力をじっくり供給するのに向いている気がするし実際起動したのでとりあえずそっちでいいのでは。

## 他の型番のリチウムコイン電池

今回はCR2025を使用したが、他のでもいけるかもしれない。

CRxxyyのxxは直径、yyは幅を表し、ピンヘッダは2.54mmピッチなので一番近いyy=25であることはほぼ必須。xxの値はなんでもいけそうだが100均で一番よく売ってたのがCR2025だった。あまり直径が小さくても抜き差しが難しいので一番よく売ってるのがそのままベストだったパターンかもしれない。

# 備考

何度も抜き差ししているうちに挟んだピンがたわんでいき電池がすり抜けて落ちてしまう可能性がありそう。そうなったら追記する。
DBFSルートにはデフォルトでどのようなディレクトリが存在するのか？

[What directories are in DBFS root by default? \| Databricks on AWS](https://docs.databricks.com/dbfs/root-locations.html) [2022/8/17時点]の翻訳です。

:::note warn
本書は抄訳であり内容の正確性を保証するものではありません。正確な内容に関しては原文を参照ください。
:::

それぞれのDatabricksワークスペースには、デフォルトでDBFSルートストレージコンテナにいくつかのディレクトリが含まれています。これらのディレクトリのいくつかは、DBFSルート上のロケーションにリンクされ、その他のものは仮想的なマウントとなっています。これらのディレクトリのいずれかのデータにアクセスできない場合は、ワークスペース管理者にコンタクトしてください。

- `/FileStore`
- `/databricks-datasets`
- `/databricks-results`
- `/databricks/init`
- `/user/hive/warehouse`

# `/Filestore`ディレクトリには何が格納されるのか？

DatabricksのUIからアップロードされたデータやライブラリは、デフォルトでは`/Filestore`に格納されます。また、生成されたプロットもこのディレクトリに格納されます。

# `/databricks-datasets`ディレクトリには何が格納されるのか？

Databricksは、このディレクトリで数多くのオープンソースのデータセットを提供しています。Databricksが提供するチュートリアル、デモの多くはこれらのデータセットを参照していますが、皆様ご自身でDatabricksの機能を探索するために活用することもできます。

# `/databricks-results`ディレクトリには何が格納されるのか？

`/databricks-results`には、クエリーの[完全な結果](https://qiita.com/taka_yayoi/items/dfb53f63aed2fbd344fc#%E5%85%A8%E3%81%A6%E3%81%AE%E7%B5%90%E6%9E%9C%E3%81%AE%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89)をダウンロードすることで生成されるファイルが格納されます。

# `/databricks/init`ディレクトリには何が格納されるのか？

このディレクトリにはグローバル[initスクリプト](https://qiita.com/taka_yayoi/items/88cb46be00a175085f87)が格納されます。

# `/user/hive/warehouse`ディレクトリには何が格納されるのか？

デフォルトでは、`hive_metastore`のマネージドテーブルがこのディレクトリに格納されます。

### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)
配列 と 集合

# 目的
- 配列同士の演算の仕方を理解する

# ポイント
- 和集合は、配列に含まれる全ての値をとる
- 積集合は、どちらの配列にもある値をとる
- 差集合は、配列から重複する部分以外の値をとる

# 書き方の例
```ruby
numbers_a = [1, 2, 3]
numbers_b = [3, 4, 5]

p numbers_a | numbers_b  #和集合
p numbers_a & numbers_b  #積集合

p numbers_a - numbers_b  #差集合
p numbers_b - numbers_a

```
~実際の表示~
[1, 2, 3, 4, 5]
[3]
[1, 2]
[4, 5]


# 注意するポイント
- 差集合は、左辺で重複していて右辺にはない要素は除かれない
配列の先頭、末尾に追加する

# 配列の最初に追加する
```配列.unshift(その配列の先頭に追加する要素)```

```rb
irb(main):022:0> a = []
=> []
irb(main):023:0> a.unshift("a","b")
=> ["a", "b"]
irb(main):024:0> a.unshift("c","d")
=> ["c", "d", "a", "b"]
```
出典 https://techacademy.jp/magazine/20565

# 配列の最後尾に追加する
```配列.push(その配列の末尾に追加する要素)```

```rb
irb(main):025:0> a.push("e","f")
=> ["c", "d", "a", "b", "e", "f"]
```
出典 https://techacademy.jp/magazine/20565

### 気づき
これ使おう。
[TypeScript] クラスを関数で実装する

## どっちがいいのか
`class`キーワードなどはOOPに最適化された言語仕様だから関数よりも便利なはずなんだけど、ケースによってはことを難しくしすぎるような気もする。
今回は同じ概念をクラスと関数で実装してみる。

## コンストラクタ
### クラス
```typescript
class Animal {
  constructor(public name: string){}
  bark(): void {
    console.log("brrr")
  }
}
```
### 関数
```typescript
interface Animal {
  name: string
  bark: () => void
}
const newAnimal = (name: string): Animal => {
  const bark = () => {
    console.log("brrr")
  }
  return { name, bark }
}
```

## 継承・オーバーライド
### クラス
```typescript
class Dog extends Animal {
  constructor(public name: string, public breed: string){
    super(name)
  }
  bark(): void {
    console.log("ruff!")
  }
  getProfile(): string {
    return `${breed}: ${name}`
  }
}
```
### 関数
```typescript
interface Dog extends Animal {
  breed: string
}
const newDog = (name: string, breed: string): Dog {
  const animal = newAnimal(name) // 親のコンストラクタ呼び出し
  const bark = () => {
    console.log("ruff!")
  }
  const getProfile = () => {
    return `${breed}: ${name}`
  }
  return { ...animal, bark, breed, getProfile } // barkが上書きされる
}
```

## 総評
可読性という観点ではクラスに軍配があがる。
関数でやりたくなったのは「入力と出力という極めてシンプルな処理でアプリケーションを完成させる」というある種の美学がバイアスをかけていたのかもしれない。
配列 の 基本的な扱い方

# 目的
- 配列の生成方法、使い方を理解する
# ポイント
- 配列とは データの塊のこと
- 配列のメリットは、要素をまとめて処理できること
- 要素の取得は、添字（index）を指定する

# 書き方の例
```ruby
array = Array.new  #配列の生成
array.push("apple", nil, 12, true) #要素の追加
p array[-1]
p array[0]

array[1] = "orange"  #2番目の要素を文字列「orange」に更新
p array

array.delete_at(2)  #3番目の要素を削除
p array

```
~実際の表示~
true
"apple"
["apple", "orange", 12, true]
["apple", "orange", true]


# 注意するポイント
- puts で配列を出力すると、[]で表示されない
- index は0から始まる
DockerでReactを立ち上げる

## ファイルの作成
```terminal
mkdir react_app
cd react_app
touch Dockerfile docker-compose.yml
```
## ファイルの記述
```Dockerfile
FROM node:16.15.0-alpine
WORKDIR /var/www
```
```
version: '3.9'
services:
  web:
    build:
      context: .
      dockerfile: Dockerfile
    volumes:
      - .:/var/www # ローカルをコンテナ内にマウント
    command: sh -c "cd my-app && yarn start"
    ports:
      - "3000:3000"
    stdin_open: true 
```
## 実行
```terminal
docker-compose build
docker-compose run --rm sh -c "npm install -g create-react-app && create-react-app my-app --template typescript"
```

## コンテナの起動
```terminal
docker-compose up -d
```
localhost:3000にアクセスすると表示される
もし応答がなければ下記コマンド
```terminal
docker compose logs -f
```
少し待って、以下のような応答が返ってきたらlocalhost:3000にアクセスできる
```terminal
react-app_1  | Compiled successfully!
react-app_1  |
react-app_1  | You can now view react-sample in the browser.
react-app_1  |
react-app_1  |   Local:            http://localhost:3000
react-app_1  |   On Your Network:  http://172.19.0.2:3000
react-app_1  |
react-app_1  | Note that the development build is not optimized.
react-app_1  | To create a production build, use npm run build.
react-app_1  |
react-app_1  | webpack compiled successfully
react-app_1  | No issues found.
```

## コンテナ内のシェルを起動
```
docker-compose exec web /bin/sh
```
`docker-compose exec web ~~`とするのは面倒なので、上記コマンドを実行してからコンテナ内で使いたいコマンドを実行する
jdでJSONのdiffを手軽に抽出

# TL; DR

- [jd](https://github.com/josephburnett/jd) を使えば、2つのJSONの差分をフィールド単位で取得できる！

```
$ cat a.json
{"foo": {"bar": 1, "baz": 2}}
$ cat b.json
{"foo": {"bar": 1, "baz": 3}}

$ jd a.json b.json
@ ["foo","baz"]
- 2
+ 3
```

# はじめに

更新処理前後の差分等、2つの以上のJSONファイルを見比べる際に、`diff` コマンドを使うことがあると思います。

しかし、`diff` コマンドは差分が行単位でしか出ないため、 `jq` で整形してもフィールド名しか出てこず「結局差分はどこで起きているんだ？」と探し回る必要があります。

```bash:bazフィールドってどこにあるの？
$ diff <(cat a.json | jq) <(cat b.json | jq)
4c4
<     "baz": 2
---
>     "baz": 3
```

そこで今回は、**JSONの構造に基づいて差分を出してくれる `jd` コマンド**を紹介したいと思います。

# バージョン

```bash
$ jd -version
jd version 1.6.1
```

# 使い方

引数の渡し方は `diff` と同じです。**差分をフィールドのフルパスで出してくれるので、変更箇所が一目瞭然です**。

```bash
$ cat a.json
{"foo": {"bar": 1, "baz": 2}}

$ cat b.json
{"foo": {"bar": 1, "baz": 3}}

# 差分表示、@行がフィールドのフルパス
$ jd a.json b.json
@ ["foo","baz"]
- 2
+ 3
```

配列の場合はインデックスで表されます（jqのパス表現と同じ）。

```bash
$ cat a.json
{"foo": ["a", "b", {"c": 1}]}
$ cat b.json
{"foo": ["a", "b", {"c": 2}]}
$ jd a.json b.json
@ ["foo",2,"c"]
- 1
+ 2

$ cat a.json
{"foo": ["a", "b", {"c": 1}]}
$ cat c.json
{"foo": ["a", "b"]}
$ jd a.json c.json
@ ["foo",2]
- {"c":1}
```

`-color` で差分に色を付けられます。差分が多いときは色がある方が見やすいですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239887/28b2f677-2f13-73d8-d0d4-9ff767e230b0.png)

## YAMLの差分も表示可能

さらに、JSONだけでなくYAMLにも対応しています。マニフェストの変更点を確認するのに便利そうです。

```bash
$ cat a.yaml
foo:
  bar: 1
  baz: 2
$ cat b.yaml
foo:
  bar: 1
  baz: 3
$ jd -yaml a.yaml b.yaml
@ ["foo","baz"]
- 2
+ 3
```

# ファイルのパッチ

2つのJSONの差分表示だけでなく、JSONに差分を適用して変更することも可能です。
JSON間の差分を記録して、別のJSONに適用することもできます。

```bash
$ cat a.json
{"foo": {"bar": 1, "baz": 2}}
$ echo diff.patch
diff.patch
$ jd -p diff.patch a.json
{"foo":{"bar":2,"baz":2}}
```

ただし、diffの元となる値が食い違うとエラーが発生するので注意が必要です[^1]。

```bash
$ cat a.json
{"foo": {"bar": 1, "baz": 2}}
$ cat diff.patch
@ ["foo", "bar"]
- 4
+ 2
$ jd -p diff.patch a.json
2022/09/10 10:23:33 found 1 at [foo bar]: expected 4
```

# おわりに

以上、`jd` でJSONのdiffを取得する方法の紹介でした。
ちょうど痒い所に手が届くので、`jq`、`yq` にならんでこのツールには今後たくさんお世話になると思います。

[^1]: 差分適用という意味では安全な機構だと思います。
現場で覚えたJava文法知識【備忘録】②

## 今回の備忘録
配列、リストについて取り扱うことが多いので、軽くまとめます。
ソートや参照について。

## ソートについて
### 配列の場合→「Arrays.sort」
以下は、昇順に並び替えた場合
```java:InputPractice2.java
import java.util.Arrays; // 参照

    // ① 配列ソート
    int[] array = {10, 30, 5, 2, 11, 90};
    Arrays.sort(array);　→ 実行
    System.out.println("① 配列ソート");
    // 配列でforEachを使うときにはStream APIを使う
    Arrays.stream(array).forEach(val -> 
        System.out.print(val + ",")
    ); 
    
    // 出力結果
    // ① 配列ソート
    // 2,5,10,11,30,90,
```

### リストの場合→「Collections.sort」
以下は、昇順に並び替えた場合

```java:InputPractice2.java
import java.util.Collections; // 参照
import java.util.List; // 参照

    // ② Listソート
    List<Integer> exList = Arrays.asList(55, 42, 33, 14); 
    Collections.sort(exList);　→ 実行
    System.out.println();
    System.out.println("② Listソート");
    exList.forEach(ex -> 
        System.out.print(ex + ",")
    );

// 出力結果
// ② Listソート
// 14,33,42,55,
```

## 内容のコピーについて
### （配列、List共通）「(配列/List).clone」（直接代入でも可能）
配列.clone→ディープコピー
直接代入→シャローコピー

※以下はディープコピーの場合
```java:InputPractice2.java
import java.util.Collections; // 参照
import java.util.List; // 参照

    int[] array = {10, 30, 5, 2, 11, 90};
    int[] exArray = {99, 100, 101};
    System.out.println();
    System.out.println("③　要素コピー");
    System.out.println("コピー前【array】" + Arrays.toString(array)); // Arrayを表示する際は変換
    array = exArray.clone();　→ 実行
    System.out.println("コピー後【array】" + Arrays.toString(array));

// 出力結果
// ③　配列のコピー
// コピー前【array】[2, 5, 10, 11, 30, 90]
// コピー後【array】[99, 100, 101]
```

## 内容の参照について
### Arrays.toString()
→1次元配列で取得する場合に使用
### Arrays.deepToString()
→2次元配列で取得する場合に使用
```java:InputPractice2.java
import java.util.Collections; // 参照
import java.util.List; // 参照

    int[][] multiList = {{99, 100, 101},{10, 30, 5, 2, 11, 90}};
    System.out.println();
    System.out.println("　複数の配列出力");
    System.out.print("Arrays.toString:");
    System.out.println(Arrays.toString(multiList));　→ 実行
    System.out.println("上記ではNGで、以下の出力方法");
    System.out.print("Arrays.deepToString:");
    System.out.println(Arrays.deepToString(multiList));　→ 実行
    System.out.println("1要素ずつ出力");
    System.out.print("Arrays.toString【１要素目】:");
    System.out.println(Arrays.toString(multiList[0]));　→ 実行
    System.out.print("Arrays.toString【２要素目】:");
    System.out.println(Arrays.toString(multiList[1]));　→ 実行
    System.out.println("1要素の中から、２番目を出力");
    System.out.println(multiList[0][1]);
    
    // 出力結果
    // 複数の配列出力
    // Arrays.toString:[[I@6b927fb, [I@3e58a80e]
    // 上記ではNGで、以下の出力方法
    // Arrays.deepToString:[[99, 100, 101], [10, 30, 5, 2, 11, 90]]
    // 1要素ずつ出力
    // Arrays.toString【１要素目】:[99, 100, 101]
    // Arrays.toString【２要素目】:[10, 30, 5, 2, 11, 90]
    // 1要素の中から、２番目を出力
    // 100
```
## 終わりに
配列とListは近いようで違うものなので扱い方については考える必要があることが再確認できました。