OmniAICreator/Qiita-1.07M huggingface dataset:
【二分法とは】pythonプログラムを用いて具体的に解説する


## 二分法とは
二分法は、**方程式 $f(x) =0$ を数値計算で機械的に解くための計算手法**のこと。
解が含まれる区間を何度も二分して狭めていくことで、数値的に解を求められる。

### 前提条件
- 関数 $f(x)$が連続であること
→連続なら必ず解を求められる

### 視覚的に考えてみる
![IMG_57C5984A625B-1.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2932655/a0f3e200-2dab-1d35-ff42-8a0bc2c63faf.jpeg)

解が含まれる区間$[a,b]$を適当に取る。
区間内で$f(x)$の符号が反転するため、$f(a)$と$f(b)$は必ず異符号になるはずである。
$aとb$の中点を新たに$c$とし、区間を二分する。
二分された区間のうち解が含まれている方をさらに二分し、これを繰り返す。
どんどん区間が狭くなり、やがて収束する。

### アルゴリズム
1. 解が含まれる$x$の区間$[a, b]$を$f(a)\times f(b)<0$となるように適当に定める
2. 許容誤差$\varepsilon$を定める（許容誤差：どのくらいの精度で解を求めるか）
3. $c = \frac{a + b}{2}$とし、区間を$[a,c]$と$[c,b]$に二分する
4. $|f(c)|<\varepsilon$なら$x=c$を解とし、終了。そうでなければ5へ。
5. 解が含まれる法の区間を採用し、3へ。
    - $f(a) \times f(c)<0$なら bにcを代入
    - $f(c) \times f(b)<0$なら aにcを代入

### 二分法の特徴
::: note info
**長所**
- 必ず解が求まる
- 導関数の計算が不要（ニュートン法などは導関数の計算が必要）
:::

::: note alert
**短所**
- 収束が遅い（1次収束）
- 初期値が2つ必要
:::

## pythonで動かしてみる
```python:bicection.py
import math
import pandas as pd

# 関数f(x)=x^2+2x-1
def f(x):
    return x*x + 2*x - 1

# f(x)=0の解 (0.41くらい)
ans = -1 + math.sqrt(2)

#　許容残差
eps = 0.001

# 初期値
a = 0
b = 1

# 表の作成
col_names = ['n', 'x', 'f(x)', '誤差']
df = pd.DataFrame(columns=col_names)

# 二分法
n = 1

while True:
    c = (a + b)/2
    df1 = pd.DataFrame(data=[[n, c, f(c), ans-c]], columns=col_names)
    df = pd.concat([df, df1], axis=0)
    if f(a) * f(c) < 0:
        b = c
    else:
        a = c
    if abs(f(c)) < eps:
        break
    n += 1

print(df.to_string(index=False))
```
コピペで動きます。
while文のところが理解できればOK。

``` 実行結果.
n         x      f(x)        誤差
1       0.5      0.25 -0.085786
2      0.25   -0.4375  0.164214
3     0.375 -0.109375  0.039214
4    0.4375  0.066406 -0.023286
5   0.40625 -0.022461  0.007964
6  0.421875  0.021729 -0.007661
7  0.414062 -0.000427  0.000151
```
実行結果はこんな感じ。
誤差が減少し、$x$が解がだんだん近づいているのがわかると思います。
$n=2$で誤差が大きくなってますが、初期値によってこんなこともあるらしい。
【完走賞ゲット-3】p5.js Web Editor で p5.func を使ったイージング

## はじめに

こちらは、[完走賞ゲットのため小ネタを毎日投稿しようとチャレンジする Advent Calendar 2022](https://qiita.com/advent-calendar/2022/youtoy) の 3日目の記事です。

アドベントカレンダー初日・2日目と同様、3日目も 2記事を公開する日になっています（もう一つの記事はまだ完成してない...）。

## 本編
### 概要
今回の内容は、p5.js を使ったアニメーションでイージングを扱う話です。
「イージング」については、この「[イージング関数チートシート](https://easings.net/ja)」を見ていただくと、少し具体的な動きを体験することもできます。

p5.js でのイージングという話では、過去に Tweenアニメーションを扱えるライブラリの [anime.js](https://animejs.com/) で扱ったことがありました（※ 以下の記事や動画が一例）。

●p5.js と anime.js を組み合わせた Tweenアニメーション - Qiita
　https://qiita.com/youtoy/items/361282f1113d88ff5f05

https://twitter.com/youtoy/status/1560918730959634432

p5.js でのイージングという話題に関して、[p5.func](https://idmnyu.github.io/p5.js-func/)というライブラリを使う方法もあると知り、今回の内容を試しました。

### p5.func を利用したイージング
p5.func を利用したイージングという話を見かけたのは、以下の記事でした。

●p5.jsとProcessingでとにかくサクッとイージングをかけたい！ : だらっと学習帳
　http://blog.livedoor.jp/reona396/archives/55793526.html

上記の記事で、実例なども書かれています。

#### p5.func の仕様
p5.func の公式ページで、仕様の詳細を確認してみます。
イージングに関しては、[公式ページ](https://idmnyu.github.io/p5.js-func/)に書かれた「p5.Ease()」を使います。
![p5.Ease()](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/5d5553c8-1fca-e014-fd52-376b1b6126b3.png)

そして、さらに公式の情報を見ていくと、「p5.Ease()」で利用できるメソッドの種類がたくさんあります。
![メソッド](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/2cfec628-4dbc-13be-cf9f-eeb68df58404.png)

また、1つ以上の引数をとり（※ 2つ目以降はオプション）、0 から 1 の値をとるようです。
![仕様](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/88a2c75a-a5c2-f18c-01c8-66f01a6f8a15.png)

#### 実際に p5.Ease() を試す
それでは、実際に p5.js Web Editor で、p5.func の p5.Ease() を組み合わせます。

デフォルトでは p5.func は読み込まれないため、index.html でライブラリをロードする必要があります。読み込むライブラリは、p5.func の公式ページの以下からダウンロードしてください（以下は、Minimized library をダウンロードして利用している例です）。
![ダウンロードのリンク](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/a0d78d54-4d0e-2e46-2afb-1bab326ba03d.png)

そして、p5.js Web Editor にライブラリをアップロードします。その上で、index.html でライブラリをロードしている部分に p5.func の読み込みをする行を追加してください。
![p5.func を読み込む](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/b4960355-3609-d4b6-adac-b27d9d158bf7.png)

あとは、以下のようなブログラムを書いて試してみます。

```javascript:sketch.js
let ease;

function setup() {
  createCanvas(400, 400);
  ease = new p5.Ease();
}

function draw() {
  background(100);

  const ratio = map(frameCount % 100, 0, 100, 0, 1);
  const linearX = ease.linear(ratio);
  circle(linearX * width, height * 0.3, 50);
  const circularInX = ease.circularIn(ratio);
  circle(circularInX * width, height * 0.7, 50);
}
```

実行してみると、以下のような結果が得られます。
（GIFアニメ化したパラメータの関係で、少しぎこちない動きになっていますが...）
![イージングをお試し](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/99009ca7-bd41-c1af-083b-bacbe24b6d7b.gif)

引数は同じ値でも、p5.Ease() のメソッドを変更することで、単位時間あたりに動く量を変化させられることが分かります。

## おわりに
これで無事、p5.js Web Editor で p5.func を使ったイージングを使えるようになりました。
フラッシュストレージ とは

## 勉強前イメージ

SSD的なね....

## 調査

### フラッシュストレージ とは

不揮発性の半導体のメモリーで構成された記憶媒体で
代表的なものとしてはSSDのことを指したり、SSDを使ったストレージ製品のことを指したりします。
今まで使用してきたHDDと比較して小型で読み書きの高速が特徴です。

### フラッシュストレージの種類

- オールフラッシュアレイ

SSDのみを搭載したストレージのことを指します。
SSAとも呼ばれます。

- ハイブリッドアレイ

HDDとSSDのハイブリッドのストレージ。
以下のように使い分けることで効率よくストレージを利用します。
利用頻度高 → SSD
利用頻度低(長期データ等) → HDD

- サーバーサイドフラッシュ

サーバに大容量のフラッシュメモリーを搭載したPCIeカード型ストレージで
サーバ内部に直結するのでアクセス速度が向上します。

## 勉強後イメージ

HDDとSSDのハイブリッドってできんのや！
てっきりどっちかだけしか使えんと思ってた。

## 参考

- [フラッシュストレージ](https://mypage.otsuka-shokai.co.jp/contents/business-oyakudachi/words/flash-storage.html)
- [フラッシュストレージとSSDの違い](https://www.storage-channel.jp/blog/flash-storage-and-ssd.html)
Python と c++ の文法の比較

私が c++ の使い方を忘れないようにまとめておくのが主な目的です．頑張って拡充していきます．

# 入力
#### 整数の入力
```python
n=int(input())
```

```cpp
int n;
cin>>n;
```

#### 配列の入力
```python
A=list(map(int,input().split()))
```

```c++
vector<int> A(N);
for(int i=0;i<N;i++){
  cin>>A.at(i);
}
```
`A.at(i)` は `A[i]` でもいいらしい．

#### 入力高速化のおまじない
```python
from sys import stdin
input=lambda :stdin.readline()[:-1]
```
コードの先頭に書く．
```c++
ios::sync_with_stdio(false);
cin.tie(nullptr);
```
main 関数の先頭に書く．

# 出力
#### 小数を桁数を指定して出力
```python
print('{:.10f}'.format(x))
```

```c++
cout << fixed << setprecision(10);
```
※ main 関数の先頭に書く


# 配列
#### 要素の追加
```python
A.append(x)
```

```c++
A.push_back(x)
```

#### 配列の結合
```python
A+=B
```
※ リスト A の末尾にリスト B を結合する
```c++
A.insert(A.end(),B.begin(),B.rend())
```
※ vector A の末尾に vector B を結合する

#### 配列の反転
```python
A.reverse()

A=A[::-1]
```

```c++
reverse(A.begin(),A.end())
```


#### 2 次元配列の作成
```python
A=[[0]*W for i in range(H)]
```

```c++
vector<vector<int>> A(H,vector<int>(W,0));
```

# 文字列
#### 整数を文字列に変換
```python
str(n)
```
※ n は int 型

```c++
to_string(n)
```
※ n は int 型

# for 文
#### for 文
```python
for i in range(N):
```

```c++
for(int i=0;i<N;i++)
```

#### 配列の走査
```python
for i in A:

for x,y in xy:
```

```c++
for(auto i:A)

for(auto [x,y]:xy)
```
※ xy は pair 型の配列

# set
#### 要素が存在するか判定
```python
x in S
```
※ S は set 型

```c++
S.count(x)
```
※ S は set/unordered_set 型

#### 要素の走査
```python
for x in S:
```
※ S は set 型

```c++
for(auto x:S)
```
※ S は set/unordered_set 型

# 連想配列
#### 連想配列の走査
```python
for key,value in dic:
```
※ dic は dict 型

```cpp
for(auto [index,value]:dic)
```
※ dic は map/unordered_map 型



# ソート

#### 普通のソート
```python
A.sort()
```
```c++
sort(A.begin(), A.end())
```

#### 降順ソート
```python
A.sort(revese=True)
```

```c++
sort(A.rbegin(), A.rend())
```

#### ペア型のソート
```python
xy.sort(key=lambda x:x[1])
```

```c++
sort(xy.begin(), xy.end(), [](pair<int, int> A, pair<int, int> B){ return A.second < B.second; });
```

※ xy は pair 型の配列
※ c++ のラムダ式については https://t.co/ZybRlJsNiZ

```c++
bool cmp(pair<int,int> a,pair<int,int> b){
  return a.second<b.second;
}
sort(xy.begin(),xy.end(),cmp);
```

#### 重複を除いてソート
```python
A=sorted(list(set(A)))
```

```c++
sort(A.begin(),A.end());
A.erase(unique(A.begin(),A.end()),A.end());
```

# 優先度付きキュー
```python
from heapq import heappop,heappush
hq=[]
heappush(hq,x) # 要素の追加
hq[0] # 最小値を取得
heappop(hq) # 最小値を削除（しながら取得）
len(hq) # 要素数を取得
```

```c++
priority_queue<int,vector<int>>pq;
pq.push(x) // 要素の追加
hq.top() // 最大値を取得
hq.pop() // 最大値を削除
hq.size() // 要素数を取得
```

python はデフォルトが昇順，c++ はデフォルトが降順になっている．c++ で昇順にしたい場合は
```c++
priority_queue<int,vector<int>,greater<int>>pq;
```
のように greater を加えると良い．
DjangoとDocker練習[OA17o3o0] さくらVPS コンテナー起動

DjangoとDocker練習[OA17o3o0] さくらのVPS コンテナー起動

# 情報

この記事は Lesson 1. から順に全部やってこないと ソースが足りず実行できないので注意されたい  

| What is   | This is                                                                                                 |
| --------- | ------------------------------------------------------------------------------------------------------- |
| Lesson 1. | 📖 [DjangoとDockerでゲーム対局サーバーを作ろう！](https://qiita.com/muzudho1/items/eb0df0ea604e1fd9cdae) |

# 手順

## Step [OA17o3o_1o0] ドッカ―コンテナ起動

```shell
# cd src1

# Docker を実行する権限のあるユーザーで実行
sudo docker-compose up
```

### Dockerコンテナの停止の方法

```shell
# 停止したくなったときに
sudo docker-compose down
```

📖 [Dockerイメージとコンテナの削除方法](https://qiita.com/tifa2chan/items/e9aa408244687a63a0ae)  

## Step [OA17o3o0] 備忘録

`さくらのVPS` でドッカーコンテナを起動したら、外部に公開するまで　あと２つ設定が必要。

## Step [OA17o3o1o0] (1) ポートを開く

さくらサーバー側でポートを開きたい。  

ポートは、開けると危ないから閉じているわけだが、閉じていると外からサービスにアクセスできないので開けるしかない。  
真似れば上手くいくかもしれないが、こんな記事を鵜呑みにせず、本当は１つ１つの設定が何なのかを、自分で理解してからやってほしい。  

`さくらのVPS` - `サーバー` - `{サーバー名}` - `パケットフィルター設定`  

👇 カスタム と Web を追加  

```plaintext
    +----------+--------------+-------------------------------+
    | SSH      | TCP 22       | 送信元IPアドレス：すべて許可する  |
    +----------+--------------+-------------------------------+
👉  | カスタム  | TCP 8000     | 送信元IPアドレス：すべて許可する |
    +----------+--------------+-------------------------------+
👉  | Web      | TCP 80 / 443 | 送信元IPアドレス：すべて許可する |
    +----------+--------------+------------------------------+
```

`設定を保存する` をクリック  

## Step [OA17o3o2o0] (2) ホストを設定する

Django の settings.py に `ALLOWED_HOSTS = []` という文字列配列がある。  
ここに外部からアクセスさせる IPアドレスまたは ドメインを書くこと。  
ファイルを保存すると　自動で読込まれるので、ドッカーコンテナの再起動は必要ない。  

わたしは、ドメインは `Value Domain` のようなサービスを使って購入している  

📖 [Value Domain](https://www.value-domain.com/)  

# 次の記事

📖 [Djangoでゲーム対局部屋のモデルを定義しよう！](https://qiita.com/muzudho1/items/e1cf253dd6929bcd708d)
Shock absorbers and Vibration absorbers ボッシュ自動車handbook 11版(90) p.1136

Chassis systems,Shock absorbers and Vibration absorbers, ボッシュ自動車handbook 11版(86)

人生で影響を受けた本100冊。

https://qiita.com/kaizen_nagoya/items/16af53acbb147a94172e

に掲載した本のうち、「新人プログラマ応援」企画で「私の推薦書３３冊」として３３冊紹介した。

新人プログラマ応援　私の推薦書３３冊

http://qiita.com/kaizen_nagoya/items/98c62f051dbdb4f8aca2
残りの６７冊から、順に過去の読書感想を引用し、新たな読書感想文を追記する。

 <この項は書きかけです。順次追記します。>


# ボッシュ自動車ハンドブック version 11, 2022

Automotive Handbook  May 2, 2022

https://www.amazon.co.jp/dp/1119911907/

ボッシュ自動車handbook(英語)11版(0-1) 課題と記事一覧new

https://qiita.com/kaizen_nagoya/items/a9d2887bf2a7598dc8e5

# Contents
Motor vehicle, 28
Basic principles, 32
Mathematics and methods, 204
Materials, 258
Machine parts, 354
Joining and bonding techniques, 426
Vehicle physics, 462
Operating fluids, 538
Refrigerants for air-conditioning systems, 591
Drivetrain(駆動系), 594
Internal-combustion engines(内燃機関),642
Management for spark-ignition engines,800
Gasoline-engine operation with alternative fuels, 886
Management for diesel engines, 906
Electrification of the drive, 970
Emission-control and diagnosis legislation, 1042
Chassis systems, 1108
#  Shock absorbers and Vibration absorbers
p.1136
## Shock absorbers 
## Vibration absorbers

# Reference
[1]  B. Heissing, M Ersoy (Editors) Fahrweikhandbuch 4th Ed. Verlag Springer Vieweg 2013
[2] L. Eckstein Aktive Fahrzeugscherheit ika/tka 2010
[3] P. Zeiler (Editor) Hardbuch Fahrzeugakustik, Grundiagen, Auslegung, Berechnung, Versuch, 3rd Edition, Verlag Springer Vieweg, 22018


# 自己参考資料(self reference)

ボッシュ自動車ハンドブック 

https://qiita.com/kaizen_nagoya/items/8e330ce57880f04d71d9
ボッシュ自動車handbook(英語)10版　目次

https://qiita.com/kaizen_nagoya/items/57c799ff544c96efdea9

自動車工学とBosch Vehicle Handbook

https://qiita.com/kaizen_nagoya/items/d13ff6b0e4d7c8907c0d

 ＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞

# 文書履歴(document history)
ver. 0.01 初稿 20221101
【DVA対策】DynamoDB リクエストユニット数計測について

# はじめに
リクエストユニット数計測についてわけわからんかったのでまとめる

# DynamoDB 読み込みリクエスト種類
 - 強力な整合性
 - 結果整合性
 - トランザクション
の３つの種類が存在する

# 4KB以下の項目の読み込み
 「強力な整合性のある読み込みリクエスト」には、1つのリクエストユニットが
必要
 「整合性のある読み込みリクエスト」には、1/2つのリクエストユニットが
必要
 「トランザクションのある読み込みリクエスト」には、2つのリクエストユニットが
必要

# 8KB項目の読み込み
 「強力な整合性のある読み込みリクエスト」には、2つのリクエストユニットが
必要
 「整合性のある読み込みリクエスト」には、1つのリクエストユニットが
必要
 「トランザクションのある読み込みリクエスト」には、4つのリクエストユニットが
必要
  ※上記の2倍

# 9KB項目の読み込み
 「強力な整合性のある読み込みリクエスト」には、3つのリクエストユニットが
必要
 「整合性のある読み込みリクエスト」には、1.5つのリクエストユニットが
必要
 「トランザクションのある読み込みリクエスト」には、6つのリクエストユニットが
必要
  ※上記の3倍(4kbの倍数に切り上げられる）

# まとめ
　- 4kbを基準として【強力な整合性のリクエスト】はリクエストユニット1つ必要
　- 4kbより大きい場合は4kbバイトごとに切り上げて掛け算
　- 強力じゃなけえばその2倍イける！ 
　- トランザクションは試験に出ないこと祈る（＞人＜）
UIViewをアニメーションさせるとタッチイベントが認識されない

## 問題

UIViewをアニメーションさせると、UIViewに配置したボタンなどのタッチイベントが認識されない。

### 例

* ポップアップを表示して、一定時間後にアニメーションしながら消す（スナックバー）

## 解決方法

* UIView.animateのdelayを指定する場合、animateを実行した時点からタッチイベントが発火しなくなるため、TimerでDelayする
 * アニメーション開始まではイベントの捕捉が可能 
* optionsにUIView.AnimationOptions.allowUserInteractionを指定する

```swift
Timer.scheduledTimer(timeInterval:  SnackBarView.Delay, target: self, selector: #selector(timerUpdate), userInfo: nil, repeats: false)

@objc private func timerUpdate() {
    UIView.animate(withDuration: SnackBarView.FadeInOutDurationInSeconds,
                   delay: 0,
                   options: [SnackBarView.Transition, .allowUserInteraction],
                   animations: {
                     self.alpha = 0
                     self.center.y += 100
                   },
                    completion: { _ in self.removeFromSuperview() })
}
```

## 参考

https://stackoverflow.com/questions/3614116/uiscrollview-touch-events-during-animation-not-firing-with-animatewithduration
Python Pandas基礎⑥ -データ集計（pivot_table）-

### 初めに
PythonのPandasについて初学者なりにまとめたいと思います。
学習に使っているのはこちらのキノコードです。

https://kino-code.com/category/introductory-course-pandas/

JupyterLabを使用します。

### 使用するExcelファイル
こちらを[リンク先を保存して](http://kino-code.com/wp-content/uploads/2020/08/sample.xlsx)ローカルに落として利用しています。

### データ集計
#### 前準備
jupyterlabを起動し、エクセルファイルをカレントディレクトリに格納。Pandasをimportし、表示数を変更します。
その後、read_excelで読み込みます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1744893/bd52b8bf-f76b-bad0-883c-e427e9faa7e8.png)

#### pivot_tableの基本
pivot_tableメソッドにindex,columns,values, aggfuncを渡します。
この時、columnsを渡さなかった場合はgroupbyと同じような挙動になります。
aggfuncに何も渡さなかった場合、デフォルトではmean(平均)が算出されます。
#### 氏名ごとに商品分類ごとの売上金額の合計を算出
aggfuncに'sum'を渡します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1744893/6b0f1da5-278f-c472-2cdc-b279ada90a8b.png)

#### 特定の列で並び替え
pivot_tableに対してsort_valuesを使用します。
降順で指定する場合はascending=Falseを指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1744893/fe616649-27af-a62d-7e56-4ade1d9d3dd9.png)

#### 氏名ごとに商品分類ごとの売上金額の平均を算出
aggfuncに'mean'を渡します。ただ、デフォルトで'mean'になっているので、明示的に指定しても、省略してもOKです。今回、小数点以下の切り捨てと区切り文字の指定も同時に行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1744893/0a74f8ec-8159-0513-d52d-220c5d255a0d.png)

#### 氏名ごとに商品分類の単価、数量、売上金額の平均を算出
集計するデータが複数ある場合には、リストで指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1744893/898dbdc0-50cc-eef7-d200-f5897cb6b805.png)
複数インデックスの場合も同じくリストで渡す。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1744893/8230d441-6857-3e2b-110d-203f9e0d53af.png)

#### 欠損値の処理
fill_value=0を指定することでNanを0として扱う
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1744893/b8da82b1-2989-d417-9d44-7f05faa027b3.png)
文字列を指定することも可能
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1744893/b5c822d6-0bdc-abc0-2ff6-9d5ed5a76b1f.png)

#### 集計行列の追加
margins=Trueを引数に追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1744893/76bd3572-121c-df9e-4ede-752a067be06e.png)

#### 複数の集計
合計、平均、個数などを同時に集計することもできます。
aggfuncに集計方法のメソッドをリストで渡します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1744893/faf2406f-e836-305e-129b-2803223b3556.png)

#### 自作関数での集計
消費税10%を加算する場合
関数を定義し、aggfuncに関数を渡すことで自作関数で集計できる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1744893/1a7ff491-411d-9535-2df9-67c3cd18c0a2.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1744893/31d48a2d-e717-5b24-2ff9-b1bbfcca9d8f.png)

#### 文字列の集計
pivot_tableではなく、pivotメソッドを使えば文字列の集計ができる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1744893/8cef3160-a971-d097-7175-a5f5eab9813a.png)

### 終わり
ピボットテーブルはエクセルでお世話になっているのでPythonでも似たような集計ができるのはありがたいです。
vscode 文字化け判定してみた

Shift-jisのファイルをUTF-8で開いてしまってそのまま保存...なんてことがないように。

自動判定する・しないの記事はたくさんあるが、結局のところ

* 日本語コーディング完全自動判定は無理?
* 拡張子ごとにコーディングを指定? 多分無理、拡張子で決められない

ちゃんと開くのはあきらめる。文字化けが判定できればいい。

じゃあvscodeのコーディング判定と正しいコーディングを比較したらいい。
ステータスバーに見えているのに、実際のコーディング判定結果は取得しにくい。

じゃあvscodeがコーディング判定して読み込んだ文字列と正しくコーディング判定をした文字列を比較すればいい。違っていたらメッセージ。

副作用で、\r\n と \nが混ざっているファイルも文字化け判定してしまう。vscodeは改行混在が扱えないかもしれない。そんなファイルそんなにないけど。

しばらくはこれで大丈夫。だと思う。

[encoding-japanese](https://www.npmjs.com/package/encoding-japanese) すごすぎ。


```typescript
async function handlerOnOpenRefreshModification(
  textDocument: vscode.TextDocument
) {

  // get vscode text on unicode
  const docText = textDocument.getText();

  // get file text on unicode
  const text = fs.readFileSync(textDocument.uri.fsPath);
  let docFile = Encoding.convert(text, {
    to: "UNICODE",
    type: "string",
  });

  // BOM
  if (docFile.charCodeAt(0) === 0xfeff) {
    docFile = docFile.substring(1);
  }

  const result = docText === docFile;
  // show result !!
}
```

とりあえずサンプル
[mojibake-hunter](https://marketplace.visualstudio.com/items?itemName=toramameseven.mojibake-hunter)
Flutter画像の表示(ビギナー向け短文)

# Flutterで画像を表示する方法

Flutterビギナー向け、かつメモ程度のものとしてお読みください！
ちなみにAndroid Studioで書いてます。

まずは`pubspec.yaml`に使用したい画像を格納するディレクトリを指定する
```pubspec.yaml
(省略)
dev_dependencies:
  flutter_test:
    sdk: flutter

  flutter_lints: ^2.0.0
  build_runner: ^2.3.2
  freezed: ^2.2.1
  json_serializable: ^6.5.4

flutter:
  uses-material-design: true
  // ここ！
  assets:
    - assets/image/
```
ちなみに勝手にアプリのルートディレクトリまでのパスはくっつけてくれるっぽいので、ここでは、ルートディレクトリよりも下のパスだけ入れればOK

ディレクトリ構造(比較にlibディレクトリだけ記載して、残りは省略) ↓
```
root
-assets
  - image
    - ここに画像を配置していく(あくまで例なので、お好きな場所へどぞ！)
-lib
  - main.dart
```

あとはWidgetで画像を呼び出してあげれば、表示できる(HookとかWidgetRefは初心者の方は気にしないでください)
```dart
class TopPage extends HookConsumerWidget {
  const TopPage({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context, WidgetRef ref) {
    return Scaffold(
      appBar: AppBar(
        centerTitle: false,
        // ここ↓
        title: Image.asset('assets/image/logo.png'),
        backgroundColor: Colors.white,
      ),
    );
  }
}
```

以上！！！！！！！！
本番環境で画像などを上手く反映する方法

開発環境では画像は表示されるが、本番環境では画像表示されない初歩的なミス


## 状態
開発環境では画像は表示されるのに本番環境にgit pullをすると画像などが反映されない問題

## 順序
```rb
git pull origin main
```
ここで勝手に本番環境で反映されるものだと思っていましたが本番環境には変更を取り込んだだけで、動作させるアプリケーションには反映されないそうです。


```rb
bundle exec rails assets:precompile RAILS_ENV=production
```
この一文を打ち込んであげる事で無事に反映されました。
とても初歩的なミスかもしれませんが慣れないデプロイでの作業であったので今後の教訓の為に残しておきます。

最後に補足としてCSSやJavaScriptを開発環境で追加した際にも上記に記載されているコードで本番環境に反映する事が出来るので是非試してみてください。
Macのユーザー辞書登録 → MacのGoogle日本語入力 → WindowsのGoogle日本語入力

# 全体像
1. Macのユーザー辞書登録のファイル形式をtxtにすることでGoogle日本語入力にインポートできる形にしてエクスポート
1. Google日本語入力にインポートする
1. WindowsのGoogle日本語入力

# 手順

# 1
Dropbox経由で行うことでWindows, Mac間で容易にできる → Dropboxインストールしておく！
U-Dictを使用することで拡張子.plist → .txtに変更する（普通に拡張子を手打ちで変更してもGoogleにインポートする際にうまくいかない）





# 【参考文献】
Power Query(Excel)でネイティブSQLを発行する

# はじめに

ExcelのPower QueryでネイティブSQLを発行しDBデータを取得します。
SQLと接続文字列はワークシート上のセル内に仕込み、M言語は必要最低限にします。

# M言語

PowerQueryエディターの詳細エディタで定義されるM言語のソースは以下のような感じです。

```m
let
    source = Excel.CurrentWorkbook(){[Name="Properties"]}[Content],
    settings = Table.TransformColumnTypes(source,{{"Property", type text}, {"Value", type text}}),
    connectionString = Table.SelectRows(settings, each ([Property] = "CONNECTIONSTRING")){0}[Value],
    sqlStatement = Table.SelectRows(settings, each ([Property] = "SQL")){0}[Value],
    result = Odbc.Query(connectionString, sqlStatement)
in
    result
```

- ODBCを使ってます
- Excel上でPropertiesという名前のテーブルを作成しM言語からアクセスします
- 新しいバージョンのExcelでは範囲でもいけるようです


# Propertiesテーブル

Excelのセル上に定義するPropertiesテーブルは以下のような感じを想定してます。内容は適当です。

|Property|Value|
|---|---|
|SQL|select saleId, productId, productName, saleDate, saleAmount from Sale join Product using(productCode)|
|CONNECTIONSTRING|Driver={Oracle in OraDb11g_home1};DBQ=HOGE|


以上です。（長くなるので実装手順は省略しました。知りたい人がいれば書くかもしれません...）

# 終わりに

ExcelからDBに接続する方式はいろいろありましたが、Power Queryはずいぶん簡単になりました。VBAを書かなく済むのもいい感じです。

ネイティブSQLはあまり推奨されてませんが、セル上のSQLで何やっているか確認できますし、AzureやPythonにロジックを外だしするときも移管が便利なケースがありますので、実装の選択肢の一つになります。

なおネイティブSQLはデフォルトではセキュリティ系のエラーが出ますので対応方法はマニュアルや他の方の記事をご参照ください。
Fly.ioのRailsアプリのデプロイエラー解決 for Mac


https://qiita.com/yuuki-h/items/ec23de152368d36672ea

以前はこちらの記事でデプロイできていたが、Flyの仕様の変更のためかデプロイができなくなった。Nodeのバージョン下げたら、デプロイできたので記録を残しておく。

# 手順
[Error: error:0308010C:digital envelope routines::unsupportedなエラー](https://penpen-dev.com/blog/error-error0308010cdigital-envelope-routinesunsupported%E3%81%AA%E3%82%A8%E3%83%A9%E3%83%BC/)
この記事のようなエラーが出るので同様にnodeのバージョンを14.18.1に下げる。下げ方は⏬

https://qiita.com/k3ntar0/items/322e668468716641aa5c


以前にFlyを使用したことがある人はDockerfileのNodeのバージョンを書き換える。
```ruby:Dockerfile
#変更後
ARG NODE_VERSION=14.18.1
```


あとは[参考記事](https://qiita.com/yuuki-h/items/ec23de152368d36672ea
)の通りにやればデプロイできた。
action_cableのbroadcastが特定の端末に送信されない

# 経緯
action_cableを利用してチャットシステムを作成
↓
開発環境で動作確認し、正常に動作
↓
社内環境に資産適用
↓
動作確認をしているとき、
[broadcast](https://railsguides.jp/action_cable_overview.html#%E7%94%A8%E8%AA%9E%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6-%E3%83%96%E3%83%AD%E3%83%BC%E3%83%89%E3%82%AD%E3%83%A3%E3%82%B9%E3%83%88)が特定の端末に送信されないことが判明
なんで？？？

# 原因&解決方法
[サブスクリプションアダプタ](https://railsguides.jp/action_cable_overview.html#%E3%82%B5%E3%83%96%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%A2%E3%83%80%E3%83%97%E3%82%BF)に「async adapter」を利用していたため。
production環境では「redis」もしくは「PostgreSQL」adapterを使用する必要がある。

※なぜ「async adapter」が推奨されないのかは下記サイトがわかりやすかった。
[railsのactivejobアダプターのAsyncAdapterって何？実装は？本番に使える？実用性は？調べてみました。](https://dev-pupuboku.hatenablog.com/entry/2020/01/01/102415)
Windows Mac風のカーソル移動ショートカットを使えるようにする


# 全体像
1. 必要なツールのインストール（AutoHotKey・ChangeKey）
1. ChangeKeyの設定
1. AutoHotkeyの設定



# 手順

## 必要なツールのインストール
1. ChangeKey
https://forest.watch.impress.co.jp/library/software/changekey/
から

2. AutoHotkey
https://www.autohotkey.com/
からDownload Current Version

## ChangeKeyの設定

1. 右クリック
1. 管理者として実行
1. CapsLockを任意のキーに変更する（私はF12を使用） 
1. 再起動する

## AutoHotkeyの設定

キーボードをカスタマイズできるフリーソフト

1. デスクトップで右クリック
1. 新規作成
1. AutoHotkeyScript
1. 作成したファイルを右クリック
1. プログラムから開く
1. メモ帳
1. 下記のコードをすでにあるコードを改行してコピペ
1. Ctrl＋sで保存
1. 閉じる
1. エクスプローラー開く
1. Windowsマーク＋Rでファイル名を指定して実行
1. shell:startup　でパソコン立ち上げ時に実行するファイルを格納するフォルダを開く
1. 先程作成した拡張子.ahkのファイルをドラッグ・アンド・ドロップ
1. 完了🎉今後再起動する時に自動的に実行されるようになる

```
F12 & p::Up
F12 & b::Left
F12 & n::Down
F12 & f::Right
F12 & a::Home
F12 & e::End
F12 & k::send +{End}{Del}
F12 & d::Del
F12 & h::BS
F12 & q::Send ^{Left}
F12 & w::Send ^{Right}
```




# 参考



http://jinsei1do.com/%E3%83%87%E3%82%B8%E3%83%A2%E3%83%8E/personal-computer/%E3%80%8Cchange-key%E3%80%8D%E3%81%A7%E3%80%8C%E3%82%AD%E3%83%BC%E3%83%9C%E3%83%BC%E3%83%89%E3%81%AE%E3%83%AC%E3%82%A4%E3%82%A2%E3%82%A6%E3%83%88%E3%80%8D%E3%82%92%E5%A4%89%E3%81%88%E3%81%A6%E5%85%A5/

https://mo22comi.com/2020/05/24/mac-fu-keyboard/

https://www.naporitansushi.com/autohotkey/#

https://kiryusblog.com/autohotkey-autorun/

https://www.tipsfound.com/windows11/07014
Flyデプロイエラー解決編（Windows）

今回はfly.ioのエラー解決に向けての記事です！

##  ①yarnについてのエラー解決
Dockerfileの25行目付近を以下のコードを追加
```ruby:Dockerfile
ARG NODE_VERSION=16.14.0
ARG YARN_VERSION=1.22.17 #追加コード
ARG BUNDLER_VERSION=2.2.32
```
同じくDockerfileの48行目付近を以下のコードに変更
```ruby:Dockerfile
#変更前
RUN volta install node@${NODE_VERSION} yarn
#変更後
RUN volta install node@${NODE_VERSION} yarn@${YARN_VERSION}
```
【GitHub】Dependabotの設定方法

## 設定方法

リポジトリのページを開き「Settings」をクリックします。  

サイドバーの「Code security and analysis」をクリックします。  

![CFA9C296-ABF1-40A7-A320-09AD1B5DC642のコピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/726cb33d-1d9f-b398-7cda-4be692fef0e6.png)

開いた画面の以下画像の箇所でDependabotの設定ができます。

![F0D50FAE-1E6E-47B4-9EB5-C6A8E86BBA23のコピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/8893dac0-0c1a-9d53-2154-aa74b96d5f02.png)

「Dependabot version updates」を有効にする場合には`.github/dependabot.yml`の作成画面が表示されます。  

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/99e2282e-fc19-8f79-a413-fce29250c3e5.png)

以下のページを参照しながら`.github/dependabot.yml`を作成します。  

https://docs.github.com/en/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file

作成できたら画面下の「Commit new file」からファイルをコミットします。  

![スクリーンショット 2022-11-01 21.36.10のコピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/b093f260-368c-19a2-b151-beb15efbbf3e.png)
openSUSEでRustの環境構築

## 使用環境
- WSL2
- openSUSE Leap 15.4

## rustupのインストール
ローカルのRust環境の管理には`rustup`というツールを用いる[^1]。

>一般によく採用されるRustのインストール方法は、Rustupというツールを介するものです。このツールはRustインストーラとバージョン管理ツールを兼ねたものです[^2]。

```shell
sudo zypper in rustup
```

## Rustのツール群をインストール

```shell
rustup toolchain install stable
```

`cargo`や`rustc`のバイナリは`~/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/bin`にインストールされる。


## PATHに追記
```shell
echo export PATH='$PATH:~/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/bin' >> ~/.zshrc
source ~/.zshrc
```


## コンパイル
```shell
rustc main.rs
```

[^1]: https://en.opensuse.org/Rust
[^2]: https://www.rust-lang.org/ja/learn/get-started
YouTuber（ユーチューバー）Coding Oceanの紹介

とても面白いユーチューバーを発見したので紹介します。
内容は、C言語を柱とし、ビットの数え方から、３D処理まで数学を絡めて扱っています。
何より、その人柄が好きです。


ホームページ　Coding Ocean
https://sites.google.com/view/coding-ocean/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E5%85%A5%E9%96%80-p5js?authuser=0

ユーチューブ　Coding Ocean
https://www.youtube.com/c/CodingOcean

決め台詞は、「やれ！」

プログラミング入門に最適です。
今時、C言語？と思うかもしれませんが、マイコンが好きな方にとっては、必須言語です。
IOTが普及する過程で、C言語は盛り上がるのではないかと思ったりします。
【Terraform】複数リソースを生成する方法(count, for_each)

# はじめに
Terraformで複数リソースを生成する方法として、```count```と```for_each```があるので使い方を簡単にまとめます。

# countの使い方
countを使うと、指定した回数、リソースを生成することができます。

https://developer.hashicorp.com/terraform/language/meta-arguments/count


試しにIAMユーザーを2個作成します。


```terraform
# ---------------------------------------------
# Terraform configuration
# ---------------------------------------------
terraform {
  required_version = ">=0.13"
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 4.0"
    }
  }
}

provider "aws" {
  profile = "terraform" # ご自身のaws profile
  region  = "ap-northeast-1"
}

# ---------------------------------------------
# IAM User
# ---------------------------------------------
resource "aws_iam_user" "user" {
  count = 2 
  name  = "testuser-${count.index}"
}
```

実行します。
```zsh
$ terraform apply
```

AWSコンソールを確認すると、countで指定した２個のIAMユーザーが作成されていることがわかります。
```${count.index}```は0から始まっていることがわかります。

![スクリーンショット 2022-11-01 18.10.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95954/067e93ad-c4e8-f3be-e898-4e9cb49b99dc.png)

# for_eachの使い方
for_eachを使うと、指定されたmapを展開しながら、複数リソースを生成することができます。

https://developer.hashicorp.com/terraform/language/meta-arguments/for_each

試しにサブネットを3個作成します。

for_eachは、キーバリュー形式で値を指定します。
```terraform
  for_each = {
    "192.168.1.0/24" = "ap-northeast-1a"
    "192.168.2.0/24" = "ap-northeast-1c"
    "192.168.3.0/24" = "ap-northeast-1d"
  }
```
each.keyとeach.valueで値を取得することができます。
```terraform
  cidr_block        = each.key
  availability_zone = each.value
```



実際のコードは、下記になります。
```terraform
terraform {
  required_version = ">=1.3"
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 4.0"
    }
  }
}
provider "aws" {
  profile = "terraform"
  region  = "ap-northeast-1"
}

# ---------------------------------------------
# Network
# ---------------------------------------------
resource "aws_vpc" "vpc" {
  cidr_block = "192.168.0.0/20"
}

resource "aws_subnet" "subnet" {
# キーバリュー形式で値を指定
  for_each = {
    "192.168.1.0/24" = "ap-northeast-1a"
    "192.168.2.0/24" = "ap-northeast-1c"
    "192.168.3.0/24" = "ap-northeast-1d"
  }
# each.keyとeach.valueで値を取得
  vpc_id            = aws_vpc.vpc.id
  cidr_block        = each.key
  availability_zone = each.value
}
```

実行します。
```zsh
$ terraform apply
```

特に問題がなければ、AWSコンソールを確認すると、for_eachを使って作成されたサブネットが３つ生成されていることがわかります。

![スクリーンショット 2022-11-01 18.28.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95954/ec04ec77-4b9c-d231-6d87-c55639ef6122.png)

以上です。Terraformのcountとfor_eachを使って、複数リソースを生成してみました。
[Flutter] Error: Can't access platform private library. import 'dart:_http';


たぶん自動補完でdart:_httpをimportしたと思うんですが、dart:_httpはプライベートなので使えません。

代わりにmore actionでdart.ioを選択すると使えると思います。

画像があった方がわかりやすいと思うので、そちらも載せておきますね。

![スクリーンショット 2022-11-01 20.21.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494487/0ee5cba6-d25e-d1df-1283-3063f55bd3a2.png)

![スクリーンショット 2022-11-01 20.21.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494487/9355de19-e096-2dca-ba73-907b5cb60795.png)

わかりやすい記事がなかったので、自身の忘備録も兼ねて投稿です。

どなたかの参考になれば幸いです。
Mac購入時の初期環境構築

# はじめに

長年愛用してきたMacbook ProがそろそろOSのアップデートが打ち切られたり、色々不便になってきたので、新たにヤフオクで中古のMacbookを購入した。せっかくなので移行なしで一から環境を作り直して手順を残しておく。SW等不足があったら適宜追記予定。

# クリーンインストールと初期設定

ショップから中古で購入した場合、すでにクリーンインストールされているはずだが、知らない誰かが初期セットアップを行なったPCをそのまま使うのは気持ち悪いので、自分でももう一度クリーンインストールを行う。

↓の記事が初期設定含め色々と書いてくれているのでそのまま「Finderの設定」まで実施

https://yama-itech.net/used-mac-setting

# ソフトウェアのインストール

まずはHomebrewをインストール
ターミナルを立ち上げて下記コマンドを実行

```bash
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
```

https://brew.sh/index_ja

[自分用にカスタムした`.Brewfile`](https://gist.github.com/r-ymgc/d7c0328a0067e357368a0468af76ef08)をダウンロードして`brew bundle`でまとめてインストール

```bash:.BrewfileをDL
cd ~
curl -OL https://gist.github.com/r-ymgc/d7c0328a0067e357368a0468af76ef08/raw/fa975dc6d7fa619355a0add181ed840477ae0c1a/.Brewfile
```

```bash:インストール実行
brew bundle --global -v
```

いらなくなったパッケージやアプリを`.Brewfile`から消したときは`cleanup`する

```bash:不要パッケージ&アプリ削除
brew bundle cleanup --global --force -v
```

# Git

公開鍵を作成してアカウントに登録
↓この辺の記事を見ながら

https://qiita.com/shizuma/items/2b2f873a0034839e47ce

ローカルの設定

```bash:設定追加
git config --global user.name "ユーザー名"
git config --global user.email "メールアドレス"
```

```bash:設定されたことを確認
git config --global user.name
git config --global user.email
```
AWS CLIのインストールと初期設定

# はじめに

* AWS CLIのセットアップはそれほど難しい作業ではありませんが、新しいPCを買った時など限られた機会にしか実施することがないため、備忘録として記事をまとめてみました。

# IAMの操作

## IAMユーザーの作成

* CLIで利用するアカウントとして、IAMユーザーを作成しておきます。
 * ここではバックアップ用のユーザーとして、`backup`という名前のユーザーを作成しておきます。
* IAMユーザー作成時にアクセスキーがダウンロード出来るため、**必ずアクセスキーのファイルをDLして安全な場所に保管**しておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312166/e5fe5cc8-2d45-f19e-8f8e-1b13f9cbba45.png)

## 権限の確認

* IAMのユーザー情報の画面を開いて、ユーザーに所望の操作をさせるために必要な権限が割り当てられていることを確認します。
* 今回はS3へのバックアップ操作ができれば良いので、S3の操作権限が割り当てられていることを確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312166/8a9dc8cf-24d8-3555-1cb0-ab3f3bb504af.png)



# AWS CLIの導入

## インストール

* [こちらのページ](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/getting-started-install.html)に書かれている手順でインストールします。
* Windowsの場合は.msiファイルによるインストールとなりますが、Linuxの場合は以下のようにスクリプトを実行してインストールします。

```shell-session:
// インストール
[nkojima@akagi ~]# curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
[nkojima@akagi ~]# unzip awscliv2.zip
[nkojima@akagi ~]# ./aws/install

// インストール後にバージョンを確認
[nkojima@akagi ~]# aws --version
aws-cli/2.8.7 Python/3.9.11 Linux/3.10.0-1160.71.1.el7.x86_64 exe/x86_64.centos.7 prompt/off
```

## セットアップ

* `aws configure`と入力した後、バックアップ用のユーザーを作成した際にDLしたアクセスキーの情報などを指定して、初期設定を済ませます。
* ここではデフォルトのリージョンとしてap-northeast-1（東京）を指定しています。

```shell-session:
[nkojima@akagi ~]# aws configure
AWS Access Key ID [None]: {アクセスキー}
AWS Secret Access Key [None]: {シークレットアクセスキー}
Default region name [None]: ap-northeast-1
Default output format [None]: json
```

# 動作確認

* 今回はS3を操作することが目的なので、`s3 ls`コマンドでS3に接続できることを確認しました。

```shell-session
[root@akagi ~]# aws s3 ls s3://{バケット名}
                           PRE cgi-bin/
                           PRE test/
2022-11-01 20:18:03       2236 image.png
2022-11-01 20:18:57       1138 index.html
```

# 参考URL

* [AWS CLI の最新バージョンをインストールまたは更新します。](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/getting-started-install.html)
* [オンプレのサーバーからS3にバックアップする方法](https://qiita.com/nkojima/items/330182972299c141b033)
TurboLinksでWindowのLoadイベントが発火できるようにする

## 環境
Rails5.2

## はじめに
Railsには、画面表示を高速に行うために、Turbolinksという仕組みが備わっています。Turbolinksを使うと、画面遷移を行うときに、HTML全体を置き換えるのではなく、Bodyタグだけを置き換えるため、高速に画面遷移ができるようになります。TurbolinksはRailsのオプションではなく、標準で備わっている機能になります。よって、Railsを使うときは、Turbolinksも一緒に使うことになります。しかし、Turbolinksが有効になっていると、何かと不便な状況が出てきてしまうため、TurbolinksはRailsから外すといった選択をしているエンジニアも多いようです。Turbolinksは、絶対に使わないといけないというものではなく、Railsから意図的に外すことができます。こういう話を聞くと、駆け出しのエンジニアであれば、このように考えるかも分かりません。「Turbolinksを使うとトラブルの元になるのなら、最初から使わない方が無難なのではないか」いきなり、このように考えるのではなく、まずは、Turbolinksありきで開発を行ってみて、どうしても、Turbolinksを使うと行き詰る状況に陥った時に、始めて、Turbolinksを外すという決断をしても、遅くはないと思います。Turbolinksを有効にすることで得られる恩恵も当然あります。Turbolinksの使い勝手について詳しく知るためにも、まずは、Turbolinksありきで開発をしてみるのもいいのではと思います。そこで、Turbolinksを使う場合の注意点について書いてみました。

Turbolinksの詳細についての記述は割愛します。Turbolinksについては、ググると沢山の記事が検索されます。いくつかの記事を掻い摘んで読んでみると、どの記事も大抵、同じようなことが書かれています。自分がTurbolinksについて書いたとしても、ググって出てくる記事以上のことを書くことができないため、詳しい内容については、そちらの記事をご参照ください。

## 事前準備
Railsでは標準で、JavaScriptではなく、CoffeeScriptを使うようになっています。今回はJavaScriptを使います。app/assets/javascriptsの中に、作成したコントローラーと同じ名前のcoffeeファイルがあるため、拡張子をjsに変更します。

## Turbolinksを有効にした場合の対応
Turbolinksを有効にした場合、windowsのloadイベントが動作しなくなります。つまり、発火しなくなります。最初の画面表示（ブラウザでリロードした時）では表示されますが、その後、link_toで画面遷移をすると、loadイベントは有効になりません。
>windowは省略できます。windowを付けても、省略してもどちらでもOKです。
```test.js
window.addEventListener('load', function() {
    alert("OK");
}, false)

addEventListener('load', function() {
    alert("OK");
}, false)
```

Turbolinksを有効にしても、windowsのloadイベントが動作するようにするには、次のようにします。最初の画面表示（ブラウザでリロードした時）でも、link_toで画面遷移をした時でも、loadイベントが有効になります。
```test.js
window.document.addEventListener('turbolinks:load', function() {
    alert("OK");
}, false)

document.addEventListener('turbolinks:load', function() {
    alert("OK"); 
}, false)
```

## 補足
下記の場合は、最初の画面表示（ブラウザでリロードした時）も、link_toで画面遷移したときも、動作しなくなります。Documentに対して、loadイベントを発生させるようなことはないため、通常、このような書き方をすることはありません。
```test.js
document.addEventListener('load', function() {
    alert("OK");
}, false)
```

## addEventListenerの書き方
addEventListenerは３種類の書き方があります。どの書き方でもOKではありますが、一般的には無名関数で書くことが多いように思います。
```test.js
// 無名関数
document.addEventListener('turbolinks:load', function() {
    alert("OK1");
}, false)

// アロー関数（ES2015）
document.addEventListener('turbolinks:load', () => {
    alert("OK2");
})

// 外部関数
document.addEventListener('turbolinks:load', hoge1, false);
function hoge1() {
    alert("OK3");
}
```

## window.onloadを使うこともできる
addEventListenerの他にwindow.onloadを使った書き方もできます。ただし、window.onloadを使った場合、画像ファイル読み込む時に速度が遅くなるといったデメリットがあるようです。

```test.js
// 無名関数
window.onload = function() {
    console.log("OK1");
}

// アロー関数
window.onload = () =>{
    console.log("OK2");
}

// 外部関数
window.onload = hoge;
function hoge(){
    console.log("OK3");
}
```
`docker-compose up`で"Attaching to"と表示されたままになる時はコンテナの起動方法が異なるかも。profilesでコンテナの属性を設定する。

Dockerコンテナを起動しようとしたところ、`docker-compose up -d`でコンテナが起動しない、ということがありました。分かってみれば簡単なことだったのですが、少し詰まったので記事にしておきます。

### 内容

```powershell
> docker-compose build --no-cache # 何も起きない
> docker-compose up # Attaching to と表示されたっきり反応無し
  Attaching to
```

### 原因・解決策

コンテナ起動方法が違いました。
コンテナの設定に「**profiles**」を使用しているため、それに合わせてコマンドを実行する必要がありました。

```powershell
> docker-compose --profile web up -d
Starting mockApi ... done
Starting app    ... done
Starting nginx ... done
```

開発に用いていた「docker-compose.yml」は他の方が作成したものだったので、「profiles」設定がされていることを把握できていませんでした。また、コンテナの起動もDocker DesktopのGUI上から行っており、コマンドでのコンテナ起動方法を把握できていなかったのも原因です。

### profilesとは？

dockerではコンテナの属性情報を「profiles(プロファイル)」として設定することができます。

例えば、フロントエンドの開発に関わるコンテナは`frontend`、バックエンドの開発に関わるコンテナは`backend`のように設定することができます。profilesを設定しなければ常に起動するので、他コンテナにも関わるコンテナであれば設定しない方が良いです。

> 参考
Compose でのプロファイル利用
https://matsuand.github.io/docs.docker.jp.onthefly/compose/profiles 

上記の中で今回引っかかったのが以下の2点でした。

1. docker-compose up する際に有効にするprofilesを指定する
1. プロファイルが有効になっていない場合はコンテナが起動できない
→`depends_on`で他コンテナに依存している場合は、そちらのコンテナで指定されているprofilesも有効にする必要がある。

### まとめ 起動しない時はdocker-compose.yml, Dockerfileを確認する

コンテナが起動しない時はymlファイルやDockerfileを確認しましょう。（自戒）
dockerは長いこと使っていますがprofilesは知らなかったので、今度使ってみようと思います。

それでは！
【まとめ】エンジニアを志すならば、まずやってみてほしいこと

## はじめに

「未経験だけど、エンジニアになりたい」という人に、僕がまずやってもらっていることを、この記事にまとめてみました。

「習得してほしい」というのももちろんですが、何よりも自分自身がエンジニアに向いているかを確かめる意味でも、これらを一通りこなすことがその試金石になるのでは...と考えています。

以下、やってみてほしいことと、その理由を書いていきます。それぞれ、無料で取り組めるサービスがあるものは、それも紹介していきます。

## ブラインドタッチの練習

初っ端からプログラミングと関係ない感じですが、この業界に携わる上での根幹部分になると思ってます。

タイピングスピードは、あらゆるタスクの解決スピードを底上げしてくれます。コーディングはもちろん、ちょっとした調べごと、メールやチャットでの相談など、仕事のあらゆる場面で、僕たちはキーボードを触ることを求められます。

エンジニアに限った話ではないですが、仕事をするならば、ブラインドタッチは最低限習得しておきたいところです。

無料で練習できるツールは世に溢れていますが、「e-typing」「寿司打」なんかが有名ですね。

- [e-typing](https://www.e-typing.ne.jp/)
- [寿司打](https://sushida.net/)


## 競技プログラミング

「競技プログラミングができる」ならば「開発ができる」とは限りません。

しかし、「開発ができる」人は、ある程度「競技プログラミングができる」コーディング力と思考力を備えています。

プログラミングを勉強し始めたばかりの人は、「反復」「条件分岐」といったプログラミングの基礎を、「知識としては習得」していると思います。

この、「知識として習得」している状態から、「自由自在に使いこなせる」ようになるまでに必要なこと、それは「数をこなすこと。すなわちたくさん練習をすること」です。

競技プログラミングの問題を、解けるレベルからガンガン解いていくことで、コーディングの基本が身体に染み付いてきます。

なんやかんやで結構考えさせる問題も多いので、論理的思考力が試される場面も多いでしょう。

最初は1問解くのにも、時間がかかるかもしれません。与えられたサンプルコードでは通るのに、提出したらWA(不正解)やRTE(実行エラー)まみれで絶望するかもしれません。

時間かけて良いです。たくさん間違えたって良いです。ここで根気よく考える力、地道にデバッグする力を身につけましょう。

別に競技プログラミングで上を目指せというわけではないのですが、やるならばコンテストが盛んなAtCoderやyukicoderが楽しいかもです。paizaのスキルチェックは、チェックサンプルが非公開なため勉強はしづらいかもしれませんが、ランク判定をしてくれるので、やりがいはあるかもしませんね。

- [AtCoder](https://atcoder.jp/?lang=ja)
- [yukicoder](https://yukicoder.me/)
- [paizaスキルチェック](https://paiza.jp/challenges)


## SQLの練習

データベースは、システム・アプリケーションの根幹とも言える重要な要素です。

SQLを練習しながら、リレーショナル・データベースがどんなものなのか、ある程度理解し、触れるようになっておきましょう。

簡単な文法を学ぶならば、SQL攻略くらいのレベルから始めると良いと思います。もう少ししっかりと書けるようになりたければ、SQL Tutorialなどがおすすめです。

- [SQL攻略](https://sql.main.jp/)
- [SQL Tutorial](https://sqlzoo.net/wiki/SQL_Tutorial)

## (特にWebアプリ開発をしたい人)Webアプリフレームワークのチュートリアル

「Web」「フレームワーク」「サーバー」「デプロイ」「コマンド」「Git」...などなど、実際にアプリを作ろうと思うと、プログラミング以外にも知らなければならないことが山のように出てきます。

もちろん座学で習得することも重要ですが、実際に手を動かして、自分で何かを作ってみると、より知識が血肉となってくれるはずです。

PHPのWebアプリフレームワーク「Cake」や、Pythonの「Django」には、無料でアプリ開発→公開まで学べるチュートリアルが存在しますので、それらを活用するのが良いでしょう。（もちろん、自分の好きな言語で良い題材があれば、それをやってみるのが良いと思います。）

- [CakePHP](https://book.cakephp.org/3/ja/index.html)
- [Django Girls](https://tutorial.djangogirls.org/ja/)

## まとめ

以上、「エンジニアを志すならば、まずやってみてほしいこと」をまとめてみました。

「これをやればエンジニアとして活躍できる」ことを保障するものではないですが、エンジニアならば身につけておかなければならない基礎の多くを身につけることのできるものだと思っています。

逆に、これらをやってみて「楽しくない」「全然意味がわからない...進まない」という人にとっては、エンジニアは辛い仕事かもしれません。

そういった、自分の向き不向きを考える上でも、まずはここで紹介したことから、始めてみることをおすすめします。


## おわりに

弊社では、経験の有無を問わず、社員やインターン生の採用を行っています。

興味のある方は[こちら](https://www.recruit.nuco.co.jp/)をご覧ください。
家庭教師がオンライン授業のためのホワイトボード共有サイトを作ってみた

## 前提
コロナ禍の状況で、zoomを使ってオンライン授業をしていたが、使いにくかったので、自分で作ることにしました。
[ボードミート](https://board-meet.com/ "ボードミート")

## 技術
**バックエンド**
-- 言語
- Python3

-- フレームワーク
- Django 3.0.6


**フロントエンド**
-- 言語
- CSS
- Javascript
- HTML

-- フレームワーク
- jquery
- materiallize.css

**インフラ**
- AWS EC2
- AWS S3 storage
- AWS Route53

## アーキテクチャー

![スクリーンショット 2022-11-01 18.48.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1860891/9ab885ca-2127-3908-bec2-4ce2e87d8942.png)

## 工夫した点
- webRTCを使ってシグナリングをする際に、複数人でシグナリングをすると、どの人にシグナルを送信しているかわからなくなるので、シグナリングデータにfrom, toを用いて、誰が誰にシグナルを送っているかを明確にした。

```javascript:myboard.html
window.onbeforeunload = function (event) {
                videoRoomSocket.send(JSON.stringify({
                    "type": "bye",
                    "from": user_name,
                    "to": "all"
                }));
            }

if (data.message == "join") {
                 console.log("join?");
                 if (data.user_name !== user_name) {
                    console.log("join!");
                     videoRoomSocket.send(JSON.stringify({
                         "type": "hello",
                         "to": data.user_name,
                         "from": user_name
                     }));
                     return;
                 }
                 return
             }
```

- whiteボードのデータを相手にリアルタイムで送信する際に、websocketかwebRTCのデータチャネルで送信するかを決める際に、webRTCのデータチャネルの送信スピードが、websocketよりも5倍ほど速かったので、webRTCのデータチャネルを採用した。

## 使い方
![スクリーンショット 2022-10-29 19.35.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1860891/1fb50f26-d284-79d1-0b4c-f9ba89981478.png)
- 左上のボタンはボードに記述するためのボタン、左下はリロード、退出、ヘルプ（未実装）ボタン、右下は画像貼り付けや全削除、記述したコンテンツを1つ前に戻すボタン、右上はボードをzoomしたり、動かしたりするボタンです。

- ユーザー登録をすると、自分のホワイトボードを使うことができ、他のユーザーと相互フォロー状態になると、他のユーザーのボードも編集できるようになります。

- 全て無料で使うことができますので、ぜひ一度使ってみてほしいです。できれば、アイデアや、感想などがあればコメントや、bm_admin@board-meet.comのメールアドレスに送信していただくと非常にうれしいです！

## これから実装するもの
- 使い方説明
- 文字のサイズ、色などを変更する機能
- ボードの画像情報をダウンロードすること
- electronでデスクトップアプリケーション化すること
- お問い合わせページの実装
- test codeの記述

## コード
GitHub: [esakiryota/my-second-blog](https://github.com/esakiryota/my-second-blog)
Google Apps Script（GAS）でメールを送信メモ


## メール送信

メール送信はびっくりするくらい簡単でした。

今までGASで試すを全然やってなかったけど早く知っておくべきだった... 

```js
function sendMail(to = 'hogehoge@hoge.com') {
  const subject = '~~件名~~'; // メールの件名
  const options = {
    name: 'のび'
  };
  
  let body = `メール本文`;
  GmailApp.sendEmail(to, subject, body, options);
}
```

optionsにfromを指定できるけど自身のアドレスかエイリアスじゃないとエラーになります。

```js
  const options = {
    name: 'のび',
    from: 'hogehoge@yahoo.co.jp' // これだとエラーになる。
  };
```

偽装できちゃいますからね。

## スプレッドシートから情報取得して送信

mailbodyシートのA1セルに本文を書いておく想定です。

```js
function sendMail(to = 'hogehoge@hoge.com') {
  const subject = '~~件名~~'; // メールの件名
  const options = {
    name: 'のび'
  };
  
  const SSID = `スプレッドシートID`;
  const sheet = SpreadsheetApp.openById(SSID);
  const range = sheet.getRange(`mailbody!A1`);
  const body = range.getValue();

  GmailApp.sendEmail(to, subject, body, options);
}
```
旧バージョンのVirtualBoxがMacにインストールできない（未解決）

# 概要

- 旧バージョン（6.0.8）のVirtualBoxをMacにインストールする際にインストーラーで下記の様になる。解決方法をまとめてみる。（「インストールできませんでした。」「エラーによってインストールできませんでした。ソフトウエアの製造元に問い合わせてみてください。」と出ている。）

    ![Oracle_VM_VirtualBoxのインストール.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/93e9f8b2-b190-2977-95ca-6a2130cb71b9.png)

# 情報

- 筆者は一度最新のVirtualBoxをインストールしており、Finderから最新のVirtualBoxを削除してからバージョン6.0.8をインストールしようとしてこの問題が発生した。
- MacのOSのバージョンは12.6でありMontereyである。

# 原因判明までの経緯

1. 下記の方法を参考にVirtualBoxを完全削除を試みる。
    - [VirtualBoxをMacからアンインストールする方法](https://qiita.com/miriwo/items/ce29e14a87e847a6239a)
1. 再度旧バージョンのインストールを試みたが結果は変わらずだった。
1. 下記の方法を参考にOracleのDeveloper IDを承認して見る。
    - [https://livethere.net/web_design/catalina-virtualbox-error](https://livethere.net/web_design/catalina-virtualbox-error)
1. 「command」 + 「R」を押しっぱなしで起動して、起動後の上部のバーで「ユーティリティ」から「ターミナル」をクリックし下記の内容を入力しEnterを押下した。

    ```shell
    spctl kext-consent add VB5E2TV963
    ```

1. 後は通常通り再起動した。
1. 上記作業を実施しても改善せず。
1. 下記の方法を参考に作業してみる。
    - [https://www.nemotos.net/?p=2619](https://www.nemotos.net/?p=2619)
1. 上記作業を実施しても改善せず。
1. バージョンを6.0.8以外のバージョンを試してみる。（6.1.30はインストールできて、6.1.28はインストールできない）

    | バージョン | 可否 |
    | --- | --- |
    | 7.0.2  | 可 |
    | 6.1.40 | 可 |
    | 6.1.30 | 可 |
    | 6.1.28 | 不可 |
    | 6.1.26 | 不可 |
    | 6.1.20 | 不可 |
    | 6.1.10 | 不可 |
    | 6.1.8  | 不可 |
    | 6.1.6  | 不可 |
    | 6.1.4  | 不可 |
    | 6.1.2  | 不可 |
    | 6.1.0  | 不可 |
    | 6.0.24 | 不可 |
    | 6.0.8  | 不可 |

1. 6.1.30のリリースノートを確認したところ気になる内容があった。「macOS ホスト: インストーラーおよびカーネル拡張機能の起動における macOS Monterey に固有の複数のバグを修正」と書いてある。もしかするとMontereyだとインストーラーに問題が発生してしまうのかもしれない。
    - [https://www.virtualbox.org/wiki/Changelog-6.1#v30](https://www.virtualbox.org/wiki/Changelog-6.1#v30)

        ![Changelog-6_1_–_Oracle_VM_VirtualBox.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/97970cab-9107-3485-a5c2-79980dd7bfe5.png)

1. 現在まだ未解決

# 参考文献

https://livethere.net/web_design/catalina-virtualbox-error

https://www.nemotos.net/?p=2619

https://www.recovery-angel.jp/soft_faq/24.html#:~:text=1.%E3%82%BF%E3%83%BC%E3%83%9F%E3%83%8A%E3%83%AB%E3%81%8B%E3%82%89%E3%80%81%E3%80%8Ccsrutil,%E3%83%A2%E3%83%BC%E3%83%89%E3%81%A7%E8%B5%B7%E5%8B%95%E3%81%97%E3%81%BE%E3%81%99%E3%80%82
MVCモデル

## MVCとは
Model (モデル）
View　（ビュー）
Controller　（コントローラー）

主に`データの処理`を行うModel、`入出力`を行うView、`ViewとModelを制御する`Controller。
								
それぞれ役割を持たせた3つのプログラムの総称をMVCと言います。
								
## 図解
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2851087/70049935-d1fd-20bf-53b2-9f933b9b4a8b.png)								
								
## ルーティング
ルーティングとは、ブラウザから送られてきたURLでMVCのどの部分のどのような処理をすれば良いのかを判断するプログラムです。
ブラウザからリクエストがきたら、そのトップページを呼び出す命令があるControllerを探してくれます。

## Model
Modelはデータの処理や操作を担当するプログラムで、データベースへのアクセスや、データベースを検索して任意のデータを取得するためのSQLを扱ったりします。
例えばデータベースの更新や削除、新規作成といった機能を実装します。

## View
Viewは最終的に出力を担当するプログラムです。
データベースから取得したデータをHTMLに埋め込んでアクセスするたびに、異なるHTMLを生成する事があります。このようなサイトを動的なサイトと呼び、HTMLを動的に生成する部分がViewになります。

## Controller
Controllerは、ViewとModelを繋ぎ、制御するプログラムです。
あくまでも自分自身では表示などの実行などは行わず、Viewからの入力に応じて必要な処理をModelに依頼する、というのがControllerの役割です。

## MVCの連携
ルーティングからMVCまでの全体の流れを整理してみます。
1. ブラウザからURLが送られてくる（リクエスト）
1. ルーティングが、URLからどのControllerを呼び出すか判断
1. 呼び出されたControllerがModelと連携してデータを処理
1. Modelからのデータベースからのデータを取得
1. 処理結果をViewに引き渡す
1. ブラウザにWebページが表示される

このような流れで、Webページは表示されています。

## MVCを使うメリット
機能ごとの独立性が高いので分業して作業を行う事ができます。

MVCは表示部分や処理部分が分かれています。なのでデザインなどの表示を変更したときでもModelやControllerの変更がない限りそのまま使う事ができます。
								
デザインを変更したければViewを修正すれば完了します。
								
___

フレームワークを使用するにあたり、MVCの理解はとても重要なので覚えてしまいましょう！！
長期インターンを通じて学んだこと

## **自己紹介**
- 関東私立大学に通う3年生
- インターン参加から半年程
- プログラミングは独学で基礎を勉強した程度
​
## **なぜ応募したのか**
- エンジニアの仕事の雰囲気を知るため
    - 個人でプログラミングをしたことがありますが、これがどのようにして仕事になるのか想像がつかなかったので長期インターンの応募を考えました。
​
## **体験した業務内容**
- 顧客情報のデータ分析
    - 膨大な顧客データから必要なデータを取り出し、SQLにて組み合わせて整形することが主な仕事です。
- アプリに用いられるレコメンドシステムの評価・開発
    - レコメンドシステムとは、利用者の興味のありそうなモノやサービスを推薦するシステムのことを指します。ユーザのデータを分析・抽出することでユーザの動向を解析し、システムに取り入れることが主な仕事です。pythonやSQLを使用しました。
- 動画配信サービスのサーバーサイドのシステム開発
    - AWSを利用して、動画配信サービスの機能の追加や修正をすることが主な仕事です。pythonにて実装しました。
​
上記を見て面白そうと感じる反面、どれも難しそうで自分にはできなさそうだと不安に感じる方も多いかもしれません。私もインターンシップを始めた当初はそう感じていました。しかし、実際は携わるプロジェクトに必要不可欠な知識やツールの使い方を初めにじっくりと学び、その後徐々にプロジェクトに携わることになっていたため、未経験の私でもスムーズに仕事をこなすことができるようになりました。このような流れでエンジニアの実務経験ができるのは、長期インターンシップならではの良さであると思っています。
​
## **業務の流れ**
基本的な流れは下のような感じです。
1. 業務指示を社員の方からいただく
2. 指示をもとに作業を行う
3. わからないことがあれば社員の方に聞く
    - 調べてわかることは自分で調べる
​
## **インターンを通して得られたもの**
- プログラミングスキル  
    - 個人でコードを書くときはコードのみやすさや処理速度等を考えたことがありませんでしたが、ここではさまざまな人が関わっているためコードを書くときにそれらを意識する癖がつきました。また、コードを書く前に一度処理の流れを整理してから書くようにしたため、以前より何倍も早く書けるようになりました。
​
- 質問の仕方
    - 作業に取り組んでいるときに調べてもわからないことに遭遇することはよくあります。これはエンジニア以外でも当てはまることですが、私は質問をするときに「わからないことがあるが、それが何かわからない」という状態になることが多くインターンシップを始めた当初はなかなかうまく質問ができませんでした。しかし、不明なことを整理してから質問するようにした結果、そのような状態を減らすことに成功しました。
​
- 課題解決力  
    - コードが動かなかったり、意図した動作をしなかったりすることは頻繁に発生します。その際に、エラーメッセージ等を見ることで上手く行かない箇所を特定し、修正する事で問題を解決する力が身についたと思います。
​
## **まとめ**
私はこのインターンシップに参加できて良かったと感じています。
エンジニアの仕事の雰囲気を知ることができたのもありますが、何よりプログラミングを個人で学んだだけでは得られないような経験やスキルを得られたことが個人的には大きいと考えています。

プログラミングに少し興味はあるが、インターンシップはハードルが高そうでなかなか参加する気にならない方は、とりあえず参加されてはいかがでしょうか。もちろん、最初はできるか不安かもしれませんが、案外始めてみるとその不安がなくなり、インターンシップを始めた当初では考えられないほどの力が身につくかもしれません。ですので、少しでもプログラミングに興味のある方は長期インターンシップに応募してみて欲しいです。
​
LPC812にLチカを書き込で遊ぶ(1)(ロング記事)(マイコンの組み立て)


目的
マイコンを半田付けしてブレッドボードに挿す


完成図



![o_cop206.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/d805a51c-cd48-dfc6-d0cf-6c7ed6b57ca5.jpeg)



部品

ＬＰＣマイコン　ＬＰＣ８１２Ｍ１０１ＪＤ２０
	通販コード　I-13497

ＳＳＯＰ２０ピン（０．６５ｍｍ）・ＳＯＰ２０ピン（１．２７ｍｍ）ＤＩＰ変換基板
	通販コード　P-10497

細ピンヘッダ　１×２０
	通販コード　C-04398

ミニブレッドボード　ＢＢ－６０１（白）
	通販コード　P-05155


![o_cop202.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/7b6e97d7-66c4-bc89-42b5-df6879600f70.jpeg)

![o_cop203.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/bd3f20be-0c79-5479-ab5b-c68a8827dd28.jpeg)

![o_cop204.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/185294a1-a8ba-8e6d-7f31-28bdc3e60d75.jpeg)

![o_cop205.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/9c5e21ef-cf0e-65e7-5876-f8168cebec9d.jpeg)


--------------------------------------------

1. マイコンと変換基板を半田付け
2. 細ピンを半分に割る
3. 細ピンを変換基板に半田付け
4. マイコンをブレッドボードに挿す
5. 終わり


注意　なんか、あってない。特に修正予定なし。


![o_cop207.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/79dff315-8499-286d-54a9-da41dfc40d05.jpeg)