OmniAICreator/Qiita-1.07M huggingface dataset:
Rails6でBootstrapを使う

## はじめに
構築で少し迷ったので備忘録
Rails6にbootstrap 5系と4系それぞれの導入方法を記載します。


## 環境
M1 Mac
VScode
ruby 3.1.0
rails 6.0.4.7

## 注意点
bootstrapのversion違いで動かないケースがある
5系と4系ではsetupの仕方が若干違うので、installするversionに合わせて構築する必要がある。

エラーが出力されずbootstrapが動かない原因の多くは、bootstrapのversionと設定が噛み合っていないから

installしたのは5系だが、4系を前提とした設定をしているなど

## bootstrap version 5系
5系は`jquery`が必要なくなりました

## terminalで下記を実行
```shell
# 2022.03/10　時点では5系のbootstrapがinstallされる
# versionの指定は記事下部を参照
$ yarn add bootstrap@next
$ yarn add @popperjs/core
```

```shell
$ mkdir app/javascript/stylesheets
$ touch app/javascript/stylesheets/application.scss
```

## ファイルに設定を追加

```rb:application.html.erb
<%= stylesheet_pack_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %>
```


```rb:app/javascript/stylesheets/application.scss
@import "~bootstrap/scss/bootstrap.scss";
```

```rb:app/javascript/packs/application.js
import "bootstrap";
import "../stylesheets/application.scss";
```

## bootstrap version 4系

### terminalで実行

```shell
yarn add jquery bootstrap@4.5.3 popper.js
mkdir app/javascript/stylesheets
touch app/javascript/stylesheets/application.scss
```
### ファイルに設定を追加

```rb:app/views/layouts/application.html.erb
<%= stylesheet_pack_tag 'application', 'data-turbolinks-track': 'reload' %>
```

```rb:app/javascript/stylesheets/application.scss
@import '~bootstrap/scss/bootstrap';
```

```rb:app/javascript/packs/application.js
import 'bootstrap';
import '../stylesheets/application';
```

```rb:config/webpack/environment.js
const webpack = require('webpack')
environment.plugins.prepend(
  'Provide',
  new webpack.ProvidePlugin({
    $: 'jquery',
    jQuery: 'jquery',
    Popper: 'popper.js'
  })
)
```

## 特定のversionをインストールする方法
`yarn add bootstrap`した際はgemfileをみてどのversionをインストールしたのか確認すると良い
```rb
# 4.5.3をインストールする
yarn add bootstrap@4.5.3
```

## 終わりに
versionの違いで躓く経験をたくさんしました。
`minemagic` `Psych` `Bootstrap`
中でも`minemagic`は沼った。

こういったversion問題に揉まれて慣れていくんだろうなぁ 
`minemagic`さん私を強くしてくれてありがとう
`minemagic`さんはライセンス問題だけど

## 参考

### 5系

https://qiita.com/jibiking/items/d2ebb21db620f9cce887

https://www.srockstyle.com/develop/programming/ruby/3905/

### 4系

https://qiita.com/kazutosato/items/d47b7705ee545de4cb1a

https://medium-company.com/rails-bootstrap/
【TypeScript】 オプショナルチェーンについて【React】

## はじめに
　本記事は、プログラミング初学者、学習を進めていて疑問に思った点について調べた結果を備忘録も兼ねてまとめたものです。
　そのため、記事の内容に誤りが含まれている可能性があります。ご容赦ください。
　間違いを見つけた方は、お手数ですが、ご指摘いただけますと幸いです。

## オプショナルチェーンについて
オプショナルチェーンは`?.`演算子を用いて記述します。
`?.`に先行する変数やプロパティの値がnullまたはundefinedであれば、その後のプロパティは評価されず、undefinedが返ります。
使用例は以下の通りです。

```user.ts
export type User = {
  name: string;
  // specialtiesはない可能性もある
  specialties?: Array<string>;
}
```

```UserProfile.tsx
import React, { VFC } from 'react'
import { User } from './user'

type Props = {
  user: User;
}

export const UserProfile: VFC<Props> = (props) => {
  const { user } = props;
  return (
    <dl>
      <dt>名前</dt>
      <dd>{user.name}</dd>
      <dt>特技</dt>
      {/* specialtiesがnullまたはundefinedであれば、その後のプロパティは評価せず、undefinedを返す */}
      <dd>{user.specialties?.join(",")}</dd>
    </dl>
  )
}
```

```App.tsx
import React, { useState } from 'react';
import './App.css';
import { UserProfile } from './UserProfile';


const user = {
  name: "田中",
  // specialtiesはなし
}


function App() {
  return (
      <UserProfile user={user} />
  );
}

export default App;

```

上記の例の場合に、UserProfile.tsxの`<dd>{user.specialties?.join(",")}</dd>`の`specialties`の後に`?.`を記述しないとspecialtiesがundefinedであるため、`join(",")`が実行できず、エラーとなります。
`specialties`の後に`?.`を記述することでspecialtiesがnullやundefinedであれば、`join(",")`は実行されず、エラーなく表示されます。
Golang同じ文字列を繰り返して連結する方法

## Golang での同じ文字列を繰り返して連結する方法

- 環境

```bash
$ go version
go version go1.17.2 darwin/amd64
```

- 方法

```golang
package main

import (
	"bytes"
	"strings"
)

func main() {
	// repeat byte
	bufBytes := []byte("😺")
	println("repeat byte:" + string(bytes.Repeat(bufBytes, 3))) //😺😺😺

	// repeat strings
	str := "😺"
	println("repeat strings:" + strings.Repeat(str, 3)) //😺😺😺

	// repeat rune
	// rune 型のスライスにはrepeat関数が用意されていないため、for 文を使う必要がある。
	bufRunes := []rune("😺")
	for i := 0; i < 3; i++ {
		bufRunes = append(bufRunes, []rune("😺")...)
	}
	println("repeat runes:" + string(bufRunes)) //😺😺😺

}
```

```bash
repeat byte:😺😺😺
repeat strings:😺😺😺
repeat runes:😺😺😺😺

Program exited.
```

[Golang Playground Demo](https://go.dev/play/p/IShpvN4pQWw)

注意：ちなみに、`strings`の場合は、`+` による連結もできますが、`Repeat()`の方がパフォーマンス的に良いです。

## おまけ

ご参考まで、他の言語の書き方もまとめますと、

| 言語    | 方法                   |
| :------ | :--------------------- |
| Go 言語 | strings.Repeat(str, 3) |
| Scala   | str \* 3               |
| Groovy  | str \* 3               |
| PHP     | str_repeat($str, 3)    |
| Python  | str \* 3               |
| Ruby    | str \* 3               |
| Perl    | $str x 3               |

## 参考記事

[同じ文字列を繰り返して連結するには(文字列の乗算みたいな)](https://hydrocul.github.io/wiki/programming_languages_diff/string/multiply.html)

- Cover の画像の元: [Unsplash](https://unsplash.com/photos/poK5c-QWy1E)


## 元記事
[Golang:同じ文字列を繰り返して連結する方法](https://aifan.jp/2022/03/10/golang-同じ文字列を繰り返して連結する方法/)
Java GUIの歴史と選択

Java言語でデスクトップアプリを開発するとき、GUI開発フレームワークの選択肢は以下の3つがあった。

* AWT(Abstract Windowing Toolkit)
* Swing
* JavaFX 

どちらを選ぶべきか迷っていたので、Java GUIの歴史を調べ、選択するための情報をまとめてみた。

## GUIの歴史

|年|GUIの出来事|
|---|---|
|1996|JDK1.0リリース。AWTは標準APIの一部として含まれる。|
|1996|Netscape社はIFC（Internet Foundation Classes）と呼ばれるGUIライブラリを開発。|
|1997|Sun Microsystems社とNetscape社は、IFCと他の技術を組み合わせ、Java Foundation Classesを形成する意向を発表した。コードネームはSwing。|
|1998|JDK1.2リリース。Swingは標準APIの一部として含まれる。|
|2007|JavaOneでJavaFXが公表された。Adobe Flex、Microsoft Silverlightに続いて3番目のRIAプラットフォームとなる。|
|2008|JavaFX1リリース。静的型付けされた宣言的言語であるJavaFX Scriptを用いて開発する。|
|2011|JavaFX2リリース。Javaコードで書けることになり、JavaFX ScriptはOracle社により廃止。|
|2014|JavaFX8がJDK8に含まれ、バージョン番号もそろえる。|
|2018|JavaFX11はJDK11に含まれず、OpenJFXを利用することになる。|

## GUIの選択

GUIを選択するために、それぞれの特徴を確認した。

### AWT

AWTは、GUI要素の生成と動作を各ターゲットプラットフォーム（Windows、Linux、Macintoshなど）のネイティブGUIツールキットに委ねる。出来上がったプログラムは、理論上はどのプラットフォームでも、ターゲットプラットフォームの「look-and-feel」で動作させることができる。
しかし、GUI要素はプラットフォームによって動作が微妙に異なることがある。そのため、このアプローチでは、ユーザーに一貫した予測可能な体験を提供することは困難だった。さらに残念なことに、AWTのライブラリには、プラットフォームによって異なるバグが存在していた。これは、「write once, debug everywhere」と揶揄されるものとなった。

### Swing

SwingはAWTの完全な代替品ではなく、AWTのアーキテクチャの上に構築されている。
Swingは、より高性能なUIコンポーネントを提供するだけです。Swingのプログラムを書くときは、AWTの基礎、特にイベントハンドリングを使用する。
SwingはUIのすべてのピクセルを描画するため、リリースされた当初はユーザーから「遅い」というクレームがあった。

### JavaFX

JavaFXは、FXML（Oracle社が作成したXMLベースのユーザインタフェースマークアップ言語）を使用してGUIの画面のデザインを記述する。動作などの論理的な処理（Javaクラス）と画面デザイン（FXML）を分離することによって、分散開発ができるようになる。
また、FXMLの定義には専用のGUIツールがあるので、画面を感覚的に作成できる。

### 選択

上記から、AWTはほぼ選択肢から外れることになり、SwingかJavaFXかの二択一になる。
SwingはJDK標準搭載でJava言語で完結できるが、画面デザインの面ではJavaFXの方が有利になる。
今回作成したいデスクトップアプリは複雑な画面を想定していないため、Swingを選択することにした。

## 参考情報

* [Abstract Window Toolkit - Wikipedia](https://ja.wikipedia.org/wiki/Abstract_Window_Toolkit)
* [Swing - Wikipedia](https://ja.wikipedia.org/wiki/Swing)
* [JavaFX - Wikipedia](https://ja.wikipedia.org/wiki/JavaFX)
* [FXML - Wikipedia](https://en.wikipedia.org/wiki/FXML)
git-flowを自分なりにまとめてみた

### git-flowって何？

git-flowはGitのブランチを作る際のルールを明確にしたツール。
ただ闇雲にブランチを切るのではなく、
こういったルールでブランチを設定した方が良いんじゃね？って感じで
幾つかブランチが分かれている。

### Git-flowのイメージ図

![git-flowブランチ図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1928016/0ccb1c13-c82f-e117-5708-a7acd18c94f2.png)

#### masterブランチ
masterブランチ。

#### developブランチ
developブランチは開発を行うブランチ。
全ての開発の基盤となるブランチ。

#### releaseブランチ
release直前のブランチ。
developブランチを元にしつつ、リリース前の修正などを行うブランチ。
基本的にdevelop側はreleaseブランチを介して、masterへマージされていく。

#### featureブランチ
新規機能を作成するときに使うブランチ。

#### hotfixesブランチ
リリース後の軽微な修正を行う際に使うブランチ。


このブランチ群以外にも2012年に追加されたbugfixブランチとsupportブランチが追加されていたりする。


### git-flowを使う(windows)

git-flowはGit for Windowsをインストールすると、git-flowも一緒にインストールされる。

```
git flow version
```
上のコマンドを入力すると、git-flowのバージョンを確認できる。


```
git-flow init
```

上のコマンドで初期化され、developブランチとmasterブランチが生成される。

```
git branch

* develop
  master
```

#### featureブランチを切る

```
git flow feature start branch_name
```

上のコマンドを打つと、featureブランチが作成される。
branch_nameを指定するのは、新しい機能を作成する毎にブランチを切る必要があるため。


今回は機能を確認するためにfeatureブランチにsample.txtというファイルを追加する。
```sample.txt
 hello world!
```

```
git flow feature finish branch_name
```
上のコマンドを入力すると、featureブランチがdevelopブランチにマージされ、featureブランチが削除される。

```
git branch


* develop
  master
```

この状態でgit branchコマンドを打つと、developブランチに遷移している。

```
git flow feature publish branch_name
```
上のコマンドを入力すれば、featureブランチがリモートリポジトリにpushできる。

releasブランチもfeatureブランチと同様に

```
git flow release start branch_name
```

上のコマンドでfeatureブランチを作成でき、基本的な流れはfeatureブランチと同じ。

**ただ、releaseブランチはマージする先がmasterブランチになる。**




#### 参考にした記事

https://dev.classmethod.jp/articles/introduce-git-flow/
基本情報技術者試験　午前対策　1日目

基本情報技術者試験　勉強　1日目
---
自己紹介
----
・23卒の就活生
・今年の5月に基本情報技術者試験を受ける
・ITパスポートの資格を所有

記事を書く内容、目的
----
毎日30問は問題を解き、分からなかった問題をまとめる。
分からなかった問題をまとめることで、頭の中を整理する。
記事に書くことで、モチベーションアップにつなげる。



できなかった問題
--

①ping(Packet InterNet Groper)は、TCP/IPネットワークにおいて接続相手につながっているかを確認する際に使用するコマンド

②BOOTP
Bootstrap Protocolの略。ネットワークに接続されたクライアントが、IPアドレスやホスト名、サブネットマスク等を自動的に取得するためのプロトコル

③MIB
Management Information Baseの略。ネットワーク機器が外部に自分の状態・情報を知らせるために公開している情報

④DHCP
Dynamic Host Configuration Protocolの略。TCP/IPで、ネットワークに接続するノードへのIPアドレスの割り当てを自動的に行うプロトコル

⑤ディスパッチとは、OSによるタスク管理の制御機能の1つで、実行可能状態のタスクの中から優先度順などによって次に実行すべきタスクを選択して、CPUの使用権を割り当てること



⑥コンカレントエンジニアリング
商品開発において、設計、生産計画などの工程を同時並行的に行う手法

⑦インダストリアルエンジニアリング
機能とコストとの最適な組み合わせを把握し、システム化された手順によって価値の向上を図る手法

⑧リバースエンジニアリング
対象のシステムを解析し、その仕事を明らかにする手法

⑨シーケンスエンジニアリング
設計、製造、販売などのプロセスを順に行なっていく製品開発の手法


振り返り
---
どういった構成にするとかもっと詳しく書こうと完璧にしようとして、最初の方で悩んでしまい、時間を多く使ってしまった。
次回からは、とりあえずまとめることや自分の言葉に置き換えて、まずは理解につなげる。あとは、徐々に書き方を修正していきたい。

>基本情報技術者試験ドットコム
https://www.fe-siken.com/
例外処理(Exception)を実生活に当てはめてみた

# 目次
1. [はじめに](#はじめに)
1. [エラーの種類](#エラーの種類)
1. [ランタイムエラーとは](#ランタイムエラーとは)
1. [実生活でのException](#実生活でのexception)
    1. [通勤・通学](#通勤通学)
    1. [ランチタイム](#ランチタイム)
    1. [帰宅後](#帰宅後)
1. [最後に](#最後に)
1. [今回のプログラム](#今回のプログラム)

# はじめに
どうも、とらべるめーかーです。
エンジニア始めました！っていう方に向けて、例外処理を実生活に当てはめてみようと思います。
例外をなんとなく避けている人は、これを機に例外に向き合ってみませんか？
なお、**学習目的での参照はおすすめしません**。痛い目を見ます。

# エラーの種類
C#に限った話ではないですが、プログラムにおけるエラーはざっくり以下の2つにわけられます。

1. コンパイルエラー（プログラムをPCが実行できる形式に変換するときに発生するエラー）
1. ランタイムエラー

そして、**例外はランタイムエラーのことを指しています**。

# ランタイムエラーとは
ランタイムエラーとは、プログラムの実行中に発生するエラーのことです。
例えば0除算をしたとき、nullの変数を参照してしまったとき、int変数に2,147,483,648が代入されてしまったとき・・・
様々なExceptionが発生して処理が中断されてしまいます。
ですので、開発の際は**例外処理にも気を配る**ようにしましょう！

…と、これはググればどこにでも記載されているものだと思います。
今回はもっと例外を身近に感じいてもらいたくて、私たちの生活に当てはめてみます。

# 実生活でのException
### 通勤・通学
この記事を読んでいる皆さんの多くは通勤・通学に勤しんでいることでしょう。お疲れ様です。
駅に着いたあなたは乗るはずの電車が大幅に遅延していることを知りました。

早速一つ目、”**電車遅延Exception**”です。
電車の遅延は通勤という処理の実行中に予期せず発生するエラーですので、立派なランタイムエラーです。
ただし、電車遅延Exceptionが発生しても通勤はしなければなりません。~~本当は異常終了して帰宅したいんですけどね。~~
そこで、「**電車遅延Excceptionはcatchして遅延証明書の発行をする**」わけです。これで無事？通勤処理を続行することができます。


あるいは、遅刻しそうなときに意図的に例外を発生させることもあるでしょう。
そう、”**道端で倒れてるおばあさんを助けていますException**”です。
この例外を意図的にthrowすることで異常終了させることができます、本来は。
たいていは会社や学校にcatchされて「言い訳すんな」がreturnされますよね。

ほかにも残高不足Exceptionだったり、迷子Exceptionだったり、通勤通学は例外だらけですね。
ちゃんと通勤通学できてみんなえらい！

### ランチタイム
お昼時になりました。
ただし、ここで重大な例外が発生してしまいました。
”**ミーティング・講義延長Exception**”です。質が悪いことに、この例外は私たちではcatchできないんですよね…
こうして我々の貴重なお昼休みは、がりがりと無残に削られていくわけです。

そのうち始まる「会議を減らすための会議」への参加も、まごうことなきExceptionです。こんなのが通常処理であってたまるか！
だからお願い、異常終了させて・・・

### 帰宅後
帰宅してきたあなたは一番に冷蔵庫を確認しましたが、ここでまた例外が発生してしまいました。
”**酒がない…Excception**”です。
その後も”**洗濯済みのシャツがない…Exception**”や”**隣の家からギシ音が聞こえてくるException**”を何とかcatchしつつ、ようやく就寝・・・
こうして明日も例外との終わりなき戦いに出向くのです…。えらい。

# 最後に
ここまで読んでくださり、ありがとうございます。
終始ネタに走ってしまった記事でしたが、こういう日常生活を通してもっとプログラムに対して親近感をもってもらえればと思います。
日常生活もプログラムの延長線上と考えれば、また違った視点でプログラムに向き合える・・・かもしれません。
以上、駄文失礼いたしました。

# 今回のプログラム
```c#:DayWork.cs
public class DayWork
{
    public void Execute()
    {
        GoToOffice();
        TakeRest();
        ExecuteAtHome();
    }

    private void GoToOffice()
    {
        try
        {
            // 通勤処理
        }
        catch(TrainDelayException ex)
        {
            GetProofOfDelay();
        }
        catch(HelpGrandmotherException ex)
        {
            Console.WriteLine("Shut up.");
        }
    }

    private void TakeRest()
    {
        try
        {
            // お昼休憩処理
        }
        catch(MeetingExtensionException ex)
        {
            DeleteRest();
        }
    }

    private void ExecuteAtHome()
    {
        try
        {
            // 帰宅後処理
        }
        catch(LiquorIsNothingException ex)
        {
            if(hasLifePoint)
            {
                GoToStore();
            }
            else
            {
                GoToBed();
            }
        }
    }
}
```
git@github.com: Permission denied (publickey). 解決方法

## 初めに
GitHubActionsで自動デプロイを実行させた際に「gitのアクセス権限が無い」と指摘されたので、その解決方法をご紹介します。

## 解決手順
エラーについて調べたところ、鍵の生成やconfigファイルの修正など似たような記事を複数見つけ、どちらも確認と実行をしましたが全く解決できませんでした。。

原因が全くわからないと困っていた際、こちらの記事に出会って無事解決しました！
どうやら原因は`SSHの秘密鍵がロードされていないこと`でした。。

https://engineer-ninaritai.com/gitpermission-denied/

解決は簡単で以下の手順で実行します。

### 1.秘密鍵がロードされていないことの確認。
→このエラーメッセージは、秘密鍵が無いことを示しています。

```
$ ssh-add -l -E sha256
→The agent has no identities.
```

### 2.秘密鍵追加

```
$ ssh-add ~/.ssh/id_rsa　 #ここは自身の環境で用意した秘密鍵で.pubではない方
```

### 3.接続確認
以下コマンドでgitにssh接続できるか確認します。
`Hi (account名)! You've successfully authenticated, but GitHub does not provide shell access.`とメッセージが返ってきたら接続成功。

```
$ ssh -T git@github.com
Hi (account名)! You've successfully authenticated, but GitHub does not provide shell access.
```
Google Cloud Professional Cloud Architect ケーススタディ【Helicopter Racing League】

Google Cloud Professional Cloud Architectのケーススタディ「[Helicopter Racing League](https://cloud.google.com/certification/guides/cloud-architect/casestudy-helicopter-racing-league?hl=ja)」の私なりの整理。
（あくまで私なりの整理です）

## ■会社概要
世界的なヘリコプターレースを主催している会社。
レースを世界中にストリーミングする有料サービスを提供。
各レースのテレメントリーと予測もしている。

## ■経営陣のメッセージ
・レース中のイベントの予測を取り入れた動画ストリーミングを強化したい
・レース中のリアルタイム予測に対応できる施設と、シーズン全体の結果を処理する
キャパシティが不足している。

## ■予測機能強化
レース予測は、VMで実行されるTensorFlowを使用している。
・AI、MLサービスの使用を拡大し、レースの予測に役立てたい。
・パートナー向け予測モデルを公開できるようにサポート。
・予測機能を向上
`【BigQuery】【VertexAI】`

テレメントリーを増やし、追加の分析情報を作成する
`【Pub/Sub→Data Flow→BigQuery】`

## ■レイテンシ低減
・リアルタイムと録画の両方のコンテンツについて、ユーザの居住地により近い場所での提供をしたい。
・放送のグローバルな可用性と品質向上
・同時視聴が可能なユーザを増やす
`【CDN】【グローバルLB】`

## ■運用
動画のエンコード、コード変換は、各ジョブ用に作成したVMで実施。
動画の録画と編集はレース現場で実施。クラウドでエンコードやコード変換を実施。
運用の煩雑さを最小化したい
`【Google推奨の運用】【マネージドサービス】【サーバレスサービス】`

## ■ネットワーク
モバイルデータセンタにより、エンタープライズクラスの接続とローカルコンピューティングを提供
`【Direct Interconnect】`

## ■データの保存
レース予測サービスは、既存コンテンツは既存のパブリッククラウドのストレージサービスに保存
`【Storage（マルチリージョンStorage）】`

## ■規制遵守
有料サービス→カード情報などのPIIの管理
`【Cloud Data Loss Prevention】`
lineログイン時の中身



# lineログイン時のAPIの中身 かなりマスキング済み


```
object(SocialiteProviders\Manager\OAuth2\User)#513 (11) {
  ["accessTokenResponseBody"]=>
  array(6) {
    ["access_token"]=>
    string(236) "eyJhbGciOiJIUzI1NiJ9.8iKzWo8sPt-6O9BkNcgnur2mY8I7MOyny6S-vLfve6vKdXe2RVvLcAOea4wPkJkaIfIGM4V0sNJ-b2bF1lIv2_Np9h4-ExGAvFC-91alpPVF2LiHnHWoSeca02Q9bOIKg"
    ["token_type"]=>
    string(6) "Bearer"
    ["refresh_token"]=>
    string(20) "gPLUNPKMW04DbEL"
    ["expires_in"]=>
    int(2592000)
    ["scope"]=>
    string(14) "profile openid"
    ["id_token"]=>
    string(507) "eyJ0eXAiOiJKV1QiLCJY_IcaqUqYHhSI"
  }
  ["token"]=>
  string(236) "eyJhbGciOiJIUzI1NiJ9.8iKyK2AyeoTX8zWoY48sPt-6MOyny6S-vLfIfIGM4V0sNJ-b2bF1lIv2_Np9h4-xrjr5-Kjal-EbPdkK2ZCjlxGAvFC-K7rYLt13aL3aGu7u2RyMRMSeca02Q9bOIKg"
  ["refreshToken"]=>
  string(20) "gPLUi5yOPNPKML"
  ["expiresIn"]=>
  int(2592000)
  ["approvedScopes"]=>
  NULL
  ["id"]=>
  string(33) "U9e51fd87818"
  ["nickname"]=>
  NULL
  ["name"]=>
  string(12) "吉岡なお"
  ["email"]=>
  string(20) "nXXX@gmail.com"
  ["avatar"]=>
  string(108) "https://profile.line-scdn.net/0htHMW7ugpK2dwLgCPnJRUMExrJQoH"
  ["user"]=>
  array(9) {
    ["iss"]=>
    string(22) "https://access.line.me"
    ["sub"]=>
    string(33) "U9e51fd878"
    ["aud"]=>
    string(10) "1656911"
    ["exp"]=>
    int(16469254)
    ["iat"]=>
    int(16469218)
    ["amr"]=>
    array(1) {
      [0]=>
      string(7) "linesso"
    }
    ["name"]=>
    string(12) "なお"
    ["picture"]=>
    string(108) "https://profile.line-scdn.net/0htHMW7ugp"
    ["email"]=>
    string(20) "@gmail.com"
  }
}
```
zsh: command not found: vue

## 背景
zsh: command not found: vue　にて　vue コマンドが使用できない際の対処法の備忘録です。

## 内容
vue-cli をインストールするためのコマンドを実施

```
npm install -g @vue/cli
```
vue-cliのバージョンを確認するためのコマンドを実施

```
vue -V
zsh: command not found: vue
```
vue コマンドを使用するためにパスを通す必要がある
※[username]は自分の登録されている名前を入力

```
export PATH=$PATH:/Users/[username]/.npm-global/bin
```
設定を反映させるためのコマンドを実施

```
source .zshrc 
```
再度、vue-cliのバージョンを確認するためのコマンドを実施

```
vue -V
@vue/cli 5.0.1
```
vue コマンドの使用ができました。
M12LANケーブル各社ラインナップ

D-cording(4芯)
X-cording(8芯)

産業用センサー類はまだ10BASE-Tで通信するものが主流。
最近の画像センサー等は100BASE-TXのものも増えてきて混在することが多い。
RJ45コネクタLANケーブルは4芯でも8芯でも刺さるのであまり気にする必要ないが、
防水、防塵のM12コネクタLANケーブルはコネクタ形状違うのでちゃんと選ぶ必要がある。
IEC 61076で規定されている。

- オムロン
https://www.fa.omron.co.jp/products/family/2715/lineup.html
- キーエンス
Phoenix Contact製にキーエンスシールを貼ってあるだけ。型番はOP-XXXXX
やや割高だが注文翌日届く。
事業部ごとにパンフレット作るせいで全く同じケーブルを画像処理事業部と安全機器事業部で別型番持ってる事象が多い。
- 三菱電機SC
1m刻み。末尾に-MVで対屈曲、-Lで対候
3社の中ではやや安いが、受注生産っぽく2週間くらい待たされる
https://www.melsc.co.jp/business/cc-linkie/sce5ew/price.html#sce5ew

## X-RJ45
SC-E5EW-SX3M
OP-88664(2 m）
OP-88665(5 m)
OP-88666(10 m)

## X-X
SC-E5EW-S3M	

## D-RJ45
標準　ストレート
OP-87907（1 m）
OP-87457（2 m）
OP-88086（2 m）
OP-87458（5 m）
OP-88087（5 m）
OP-87459（10 m）
OP-88088（10 m）
XS5W-T421-EMC-K
D側アングル
OP-88042（1 m）
OP-88043（2 m）
OP-88044（5 m）アングル
OP-88045（10 m）アングル
XS5W-T422-EMC-K
対屈曲　ストレート
XS5W-T421-EMC-KR
シールド　ストレート
XS5W-T421-EMC-SS

## D-D
OP-88089（2m）
OP-88091（10m）
ストレート
XS5W-T421-EM2-K
両アングル
XS5W-T422-EM2-K
対屈曲
XS5W-T421-EM1-KR
シールド
XS5W-T421-EM2-SS

## X-D
OP-88651(2 m）
OP-88652(5 m）
OP-88653(10 m）
キーエンスIVシリーズ本体がX-操作パネルがDという謎仕様。

数買うなら
Phoenix ContactとかHarting
アイビックス技研M12シリーズ
https://www.ivics.jp/product/connector-c/m12/list_m12_x.html
Expressフレームワークの使い方


# Expressとは
Expressとは、node.jsのWebアプリケーション・フレームワークです。

# Expressの始め方
express-generatorをインストールすると、アプリ開発の雛形を素早く生成することができます。
```
npm install -g express-generator
```

```
express アプリ名
```
で、開発フォルダを生成します。
```
express test      
```
今回はtestとします。
また、テンプレートエンジンを指定しないとこのように自動的にjadeを使用するという注意ができます。
```
  warning: the default view engine will not be jade in future releases
  warning: use `--view=jade' or `--help' for additional options
```
テンプレートエンジンを指定するときは、
```
express --view=pug test
```
のようにしなければいけません。
testディレクトリに入ると、
![スクリーンショット 2022-03-10 22.59.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/951920/55821b0d-8ea7-9157-cbc1-47f464805906.png)
このような状態になっています。
そして、自分が作ったディレクトリの中で、
```
npm install
```
依存関係をインストールしないといけません。
実際に、
```
DEBUG=myapp:* npm start
```
コマンドを実行し、localhost:3000を開くと![スクリーンショット 2022-03-10 23.04.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/951920/55d2b806-1314-0ce0-e3fa-6acaad47995f.png)
このような画面になっていると思います！
VBAでカスタム関数を作成してワークシートで使用する

# ワークシートでVBAで作成したカスタム関数を使用する

Function ＜関数名＞（＜引数...＞）で作成するとよい。
再計算などは必要ない。


~~~Visual Basic
Function DISCOUNT(quantity, price)
   If quantity >= 100 Then
     DISCOUNT = quantity * price * 0.1
   Else
     DISCOUNT = 0
   End If
 
 DISCOUNT = Application.Round(DISCOUNT, 2)
End Function
~~~

ワークシートへの入力
~~~
=DISCOUNT(D7,E7)
~~~

結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169982/3ad07b0c-cad9-a739-2cdd-a5040512c28d.png)

[参考](https://support.microsoft.com/ja-jp/office/excel-%E3%81%A7%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0%E9%96%A2%E6%95%B0%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B-2f06c10b-3622-40d6-a1b2-b6748ae8231f)
Raspberry Pi LibreELEC 10.0.2（Kodi 19.4）

## H.265
最新版がきた。
[LibreELEC (Matrix) 10.0.2 - LibreELEC](https://libreelec.tv/2022/03/09/libreelec-matrix-10-0-2/ "LibreELEC (Matrix) 10.0.2 - LibreELEC")
> Working (RPi4)
> ・H264 and H265 HW decoding
> 
> CHANGES SINCE 10.0.1
> ・support for RPi2, RPi3

こうやって見ると、H.265対応が`LibreELEC`のセールスポイントだよな。
それと今回は Pi2、Pi3 にも対応とのこと。まさかと思い、Pi3B+ に入れて確認したが、やはり H.265 には対応していなかった。H.265 のソフトウェアデコードはそれなりに重いそうで、Raspberry Pi のような非力なマシンでは無理らしい。
HWデコードに対応している Pi4 の特権ですな。

## 余談
Raspberry Pi ブートドライブの最初のパーティションは通常 FAT32 だが、`LibreELEC`では FAT16 なんだよな。よりディスクの使用量の効率化を図っているのか。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254888/8e8dddf7-2122-3e62-c195-0630ec729dfc.png" width=80%>

```shell
LibreELEC:~ # parted -l /dev/mmcblk0
Model: SD SD (sd/mmc)
Disk /dev/mmcblk0: 31.9GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:

Number  Start   End     Size    Type     File system  Flags
 1      4194kB  541MB   537MB   primary  fat16        boot, lba
 2      541MB   31.9GB  31.4GB  primary  ext4
```

もっとも、最初期の`Raspbian`もそうだったみたいだけど。
[Why my first partition is FAT16_ - Raspberry Pi Forums](https://forums.raspberrypi.com/viewtopic.php?t=18540 "Why my first partition is FAT16_ - Raspberry Pi Forums")
何だか優しい世界。

## 関連投稿
[kodi は H.265 の夢を見るか - Qiita](https://qiita.com/god19/items/99664a9a4261dfca89ff "kodi は H.265 の夢を見るか - Qiita")
LINE Messaging API  イベントの一覧 arrayの中身

一部マスキングしているのでご了承ください。

# 普通のメッセージ

``` 
array (
  'type' => 'message',
  'message' =>
  array (
    'type' => 'text',
    'id' => '1572159431XXX',
    'text' => 'あ',
  ),
  'timestamp' => 1646919340XXX,
  'source' =>
  array (
    'type' => 'user',
    'userId' => 'U9e51fd85724785aea379e265e833XXX',
  ),
  'replyToken' => '6ae34b3fde022e0XXX391011b29XXX',
  'mode' => 'active',
)
``` 


# 音声
``` 
 array (
  'type' => 'message',
  'message' =>
  array (
    'type' => 'audio',
    'id' => '15721629583907',
    'duration' => 1760,
    'contentProvider' =>
    array (
      'type' => 'line',
    ),
  ),
  'timestamp' => 1646919758377,
  'source' =>
  array (
    'type' => 'user',
    'userId' => 'U9e51fd8785aXXXXXXXXXXXX',
  ),
  'replyToken' => 'f00e580XXXXXXXXXXXXXX',
  'mode' => 'active',
)

``` 



# 写真
``` 
array (
  'type' => 'message',
  'message' =>
  array (
    'type' => 'image',
    'id' => '15721635823362',
    'contentProvider' =>
    array (
      'type' => 'line',
    ),
  ),
  'timestamp' => 1646919832956,
  'source' =>
  array (
    'type' => 'user',
    'userId' => 'U9e51fd8785aXXXXXXXXXXXXX',
  ),
  'replyToken' => 'f8e647aff7b6XXXXXXXXXXXXX',
  'mode' => 'active',
)

``` 





# 位置情報
``` 
 local.INFO: array (
  'type' => 'message',
  'message' =>
  array (
    'type' => 'location',
    'id' => '15721645647554',
    'latitude' => 35.686931,
    'longitude' => 139.712673,
    'address' => '日本、〒160-0022 東京都新宿区新宿１丁目１−５',
  ),
  'timestamp' => 1646919949804,
  'source' =>
  array (
    'type' => 'user',
    'userId' => 'U9e51fd8785a',
  ),
  'replyToken' => 'e7d1d38dc0',
  'mode' => 'active',
)

``` 

# スタンプ
``` 
local.INFO: array (
  'type' => 'message',
  'message' =>
  array (
    'type' => 'sticker',
    'id' => '15721649666261',
    'stickerId' => '6157897',
    'packageId' => '1151098',
    'stickerResourceType' => 'STATIC',
    'keywords' =>
    array (
      0 => 'Good morning',
    ),
  ),
  'timestamp' => 1646919997338,
  'source' =>
  array (
    'type' => 'user',
    'userId' => 'U9e51fd8785a',
  ),
  'replyToken' => '1763ef6',
  'mode' => 'active',
)

``` 



# ブロック
``` 

[2022-03-10 13:48:59] local.INFO: array (
  'type' => 'unfollow',
  'timestamp' => 1646920139358,
  'source' =>
  array (
    'type' => 'user',
    'userId' => 'U9e51fd8785',
  ),
  'mode' => 'active',
)

``` 



# ブロック解除 新規追加？
``` 
  'type' => 'follow',
  'timestamp' => 1646920153627,
  'source' =>
  array (
    'type' => 'user',
    'userId' => 'U9e51fd8785a8',
  ),
  'replyToken' => 'cac520d3b3464ce1',
  'mode' => 'active',
)

```
「多様性の化学」読書メモ

「多様性の科学」
https://www.amazon.co.jp/dp/B0957B1LD5/ref=cm_sw_r_tw_dp_1SY9ECCVQYXVZ4TJ0KDX
を読んだので読書メモ。

多様性が必要なのはわかっているが、実際問題として文化的・経験的バックグラウンドが共有できてない人との話ってすり合わせに時間がかかって非効率じゃない？みたいな疑問を解消するために読みました。

## 第1章 画一的集団の「死角」
9・11事件をCIAが防げなかったのは、当時のCIAはほとんどが白人男性で構成されており著しく多様性に欠けていて、ムスリムの視点が一切なかったのが一因である、という話から多様性の重要性を説いている。
多様性が生産性に直結する例がある。ある調査では、司法業務、保険サービス業務、金融業務において職員の人種的多様性が平均から1標準偏差上がっ ただけで、25％以上生産性が高まったという。

## 第2章 クローン対反逆者
また人頭税を導入した当時のイギリス政府は同様にほとんどが貴族階級から構成されており、そもそも税を徴収することが困難な人たちがいることに考えが及んでおらず、大変な失敗に終わった、という話など。そのほかいろいろな例。
一つの視点、一つの能力で解決に導けるような問題であれば、多様性は必要ない。しかし多くの視点で広い領域をカバーした方が解決に近づくような問題であれば、多様性はとても重要である。いくら優秀な人が集まっていたとしても、視点が似たり寄ったりであれば相乗効果は見込めない。
ただし人口統計学的な多様性が高くても、認知的多様性にあまり影響を及ぼさない場合がある。例えば製造会社において人種の多様性が生産性の向上に寄与しなかった例がある。多様性は高い集合知を生む要因となるが、それには根拠が必要となり、ただやみくもに多様であればいいと言わけではない。

## 第3章 不均衡なコミュニケーション
エベレスト大量遭難事件や、1978年の飛行機墜落事件を例に、ヒエラルキーのある環境ではコミュニケーションがうまくいかず、時として致命的な問題を引き起こすという話をしている。両者とも、問題に気が付いていた部下が「上司もきっと同じ問題に気が付いているだろう」と思い込んで問題を報告しなかった結果、死に至ったが、これは上司が高圧的だったからではなくて、ヒエラルキーの存在によって部下が勝手に抑圧的になったから。
ある研究では、地位の高いシニアマネージャーが率いるチームよりも、それほど高くないジュニアマネージャーが率いるチームのほうがプロジェクトの成功率が高かったという結果が出ている。これもリーダーに権威があるというだけで抑圧が発生し、意見が出にくくなるから。ているから。
ヒエラルキーは権威によって発生するだけではなく、例えば会議で1, 2人が主導権を握ると、もうほかの人は発言を控えてしまう。また順番に発言を行うと、発言者は前の人の発言に引っ張られたり真似をしたりすることが多い（情報カスケード）。つまり基本的に会議は機能不全に陥るものであり、何か工夫がない限りは会議という形態でアイデアを集めたり意思決定をするのはやめた方がいい。

## 第4章 イノベーション
キャリーケースの開発秘話や、当時大企業が集まっていたルート128という地域が廃れ代わりにシリコンバレーが発展した話を例に、イノベーションのためには多様な人との情報交換が必要であるという話をしている。

## 第5章 エコーチェンバー現象
白人至上主義の集団を例に、狭いコミュニティの中で意見がどんどん偏っていくエコーチェンバー現象の説明をしている。単にほかの人の意見を聞き入れないというだけでなく、他の人の意見を聞いたうえで、それに対して強いヘイトを向けることで逆に自分たちの持論を固めていくのがエコーチェンバー現象の特徴。

## 第6章 平均値の落とし穴
ダイエットの手法には様々なものがあるが、これは個人差が大きく同じ手法をとっても成功する人と成功しない人がいるからで、その個人差を考慮せずダイエットを続けても結果の出ない人がいるという話から、平均値をとることは時として意味をなさないという話をしている。また1940年代末期の米空軍は非常に事故が多かったが、これはパイロットたちの体格の寸法の平均値からコクピットの設計をした結果それによりすべての人にフィットしないコクピットになっていた（例えば10か所の寸法すべてが平均値に収まった人は4000人超の中で一人もいなかった）のが原因だったという話。
平均、標準化は基本的に役に立つし有効な基準値になるが、個々の値が重要になるケースも多々存在する。例えばすべての人のために標準化されたオフィスより、個々の自由に任せてカスタマイズ可能なオフィスのほうが生産性が高くなる。そういう平均が役に立たないケースに気が付けるようになる必要がある。

## 第7章 大局を見る
まとめの話。

## ポエム
多様性が重要なのは当たり前だが、どのように重要なのかを理論立てて説明してくれるのは純粋に面白かった。チームの人種的な多様性を上げるというのは採用の人にしかできないことだが、そうでなくてもチームメンバーそれぞれの能力や個性を生かす方向で仕事をすることは可能だし、それを意識するべきだと思った。
あと会議は基本的に構造的欠陥を抱えていてうまくいかないので、マジでできる限りやらない方がいいことを学んだ。
グラフ理論についてまとめてみた

# 目的
グラフ理論について、なかなか理解できなかったのですが、
つてつちさんのYoutubeの動画がかなりわかりやすかったので、Qiitaでアウトプットしようと思います。

# 参照
下記のつてつちさんの動画を参照させていただきました。わかりやすい動画を作成していただき、ありがとうございます。

https://www.youtube.com/watch?v=4-HgEp-imfg&t=372s

# グラフ理論とは？
グラフ理論は、関数や統計グラフなどではなく、下記のような頂点と線の２つで関係性を表したもの。

<img width="400" alt="グラフ" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201104/36609bb2-4a94-ae34-9c4d-0dfb6f0315d3.png">


# グラフ理論で嬉しいこと
最適解を求めるものによくグラフ理論は利用されています。
例えば、Google Mapで目的地までの行き方を調べられると思いますが、そういうときにも利用されています。
また、マーケティングなどでお客さんが次に何を購入するかを推測してレコメンドをするためにも利用されています。
意外とグラフ理論の考え方は、身近に使われています。

# 今回、グラフ理論の中で説明するところ
今回は、グラフ理論の中でも総当り数を求める方法について説明します。
(これ以外にも、アソシエーション分析だったり、マッチングアプリの組み合わせ候補を決めることにもグラフ理論は利用されています。)

# 総当たり戦の例
「あるサッカーチームが4チームありました。総当たりのリーグ戦をする場合は、全試合は何試合か？」

今回は、グラフ理論でこの問について考えてみることにします。
まず、下記のよう4チームを書きます。この点のことを、グラフ理論では頂点やノードと呼びます。

<img width="400" alt="グラフ" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201104/47fecb95-8cd5-1a4f-4f62-476e0e3d47d0.png">

試合とは、このチーム同士が集まって1試合をすることなので、点どうしをつなげる青い線のことを試合とみなすことができます。

<img width="400" alt="グラフ" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201104/016cee0e-a76a-55e1-e2ea-26abdcee151f.png">


この線のことをグラフ理論では辺やエッジと呼びます。
今回、辺の数は6つになります。
「あるサッカーチームが4チームありました。総当たりのリーグ戦をする場合は、全試合は何試合か？」
よって、この問の答えは6試合となります。

このようにグラフ理論は使われています。

こちらを抽象化した下記のお題にもグラフ理論は適用できます。
「あるチームがnチームありました。総当たりのリーグ戦をする場合は、全試合は何試合か？」

# Nチームの場合
一つのチームから出てくる辺の数は、n-1本になります。
チーム数はNチームです。
なので、
合計の試合数= n(n-1) / 2
と表すことができます。(n(n-1)だと、線を2回数えてしまうために、2で割ります。)


# 最適な日数
グラフ理論を用いることで、こんな問にも答えることができます。
「サッカーチームが5チームあり、総当たりのリーグ戦は最短で何日か？」
これがグラフ理論が最適化に使われている理由になります。

こちらはすでにグラフ理論で証明されており、
nが奇数のときは、 n日
nが偶数のときは、n-1日です。

よって、今回のチーム数は5つなので、5日になります。(詳しくはつてつちさんの動画を見てください。)

# まとめ
グラフ理論では、amazonのレコメンドや最短経路を求めるのにもよく利用されているものなので、より深く学んでいこうと思います。(知識が増え次第、更新していきます)
Unity　入門　自分用メモ　辞書

# Unity 編

### オブジェクトのコンポーネントを取得する方法１：GetCompornent
以下で取得できる。
```
[型] [名前A] = GetCompornent<"対象のコンポーネント名">();
[名前A]. [ コンポーネント内で使用されている関数] ();
```

#### オブジェクトのコンポーネントを取得する方法２：パブリックで宣言してUnity内で取得する

パブリックでGameObjectを宣言。
UnityのInspector側で、コンポーネントにアクセスしたいものをD＆Dで適応。
そののち、
```
[パブリック変数名].[型]
```
で呼び出せるようになるので、自由に使用する;

#### 当たり判定の設定方法
当たり判定をつけたいオブジェクトに対して、`collider`コンポーネントを適応(基本デフォでされてるっぽい)。
`Rigidbody`というものを処理させたいオブジェクトにつけて(Playerとか、処理されるスクリプトがつくオブジェクトに)以下の関数で処理ができる。これは決まった呪文。
```
private void OnCollisionEnter(Collision collision)
    {
        Debug.Log("");
    }
```
しかしこのまま実行すると、オブジェクトに物理演算である`Eigidbody`の数値適応されて摩擦とかが計算されて、すり抜けづらくなる。
ある一定の領域に入ったときに～という処理にする場合などは、`toriger`を活用する。
##### Triggerの適応方法
1. トリガー化したい(物理演算させたくない)オブジェクトのcolliderの項目から、Is Trigger のチェックボックスにチェックをいれる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236003/fc17ebf1-62c1-180d-2673-517623d75887.png)
2. 次に、コードでの指定を以下に修正する。
```
    private void OnTriggerEnter(Collider other)
    {
        Debug.Log("");
    }
```

###  オブジェクトの移動
```
transform.position += new Vector(0,0,0);
```

###  キーボード入力

```
Vec3f Hensu;
float Hensu.x = Input.GetAxisRaw("Holizontal"); //横矢印キー or "A"か"D"
float Hensu.z = Input.GetAxisRaw("Vertical"); //縦矢印キーor"W"か"S"
```


### シーンを読み込みなおしたい、シーン移動したい場合
冒頭に以下を宣言してシーン系を操作できるようにする。
```
using UnityEngine.SceneManagement;
```
そのうえで、
```
SceneManager.LoadScene("シーンの名前を宣言");
```
でいける。




-------------------------------------------------
# C# 編

##  ２で割り切れる数(偶数)の場合、という条件分岐
```
if([対象の変数] %2 == 0){}
```

##  ２で割り切れない数(奇数)の場合、という条件分岐
```
if([対象の変数] %2 == 1){}
```

##  Switchの分岐の作り方
```
##switch([変数]){
 case"[変数]=2"
 [処理を記載する]
 break;
case"[変数]=5"
 [処理を記載する]
 break;
```

##  for文内で、特定条件内で分岐を抜ける方法

`` break; ``という記述を入れればループが終了。
以下の場合、i=7の時、ループが終了する。
```
for(int i = 0; i <= 0; i++){
 if(i == 7){
 break;
 }
}
```

`` continue; ``という記述を入れればスキップする。
以下の場合、i=7の時、処理がスキップされる。
```
for(int i = 0; i <= 0; i++){
 if(i == 7){
 continue; 
 }
}
```


## メソッド化
### 機能をテンプレ化するもの。
[**GetCompornent**](https://qiita.com/drafts/a2ccdfdeaeda0ac23817/edit#%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%AE%E3%82%B3%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%8D%E3%83%B3%E3%83%88%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95%EF%BC%91getcompornent)でアクセスできるので、アクセス方法はGetCompornentの箇所にて記載。
```
private void [名前がはいる] (){
}
```

### その関数をたたくと、返り値[なにか]を出すようにしたい。
```
public void [名前がはいる] (){
  return [なにか]; //メッセージなどでも可
}
```


## 配列について
配列は、プレハブをたくさん生成する際に超便利。
生成した番号を管理すれば、プレハブ内に埋め込まれたスクリプトにアクセスして内容を変えたりできる。
１個１個処理をやろうとすると果てしないので、for文等を活用することで超簡素に処理をすることができるメリットがある。

宣言方法は以下。
```
List <変数の型> [名前] = new List<変数の型>;
```

配列に何かを足すとき。
```
[名前].Add(なにか);
```

配列にAddされたn番目のものを消したいとき。
```
[名前].RemoveAt(配列の番号);
```

配列にAddされた指定された内容をまるっと消したいとき。
ＮＧワードとかに便利かも？
```
[名前].Remove(指定された内容);
```


## 配列の中身を、手軽にすべて確認したいとき

`foreach` というものが活躍する（for文の記述が長くて面倒なので…）
ここで指定した変数名を`Debug.Log();`で見れるようになっている。
```
foreach(int 変数名 in 配列名){}
Debug.Log();
```


## Classの表記ルール
以下の形で記述すれば、他のスクリプトからクラスで関数をよびだすことができる。
```
public void なまえ (){
}
public void 処理(){
}
```
これで、別のスクリプトから以下のような形でＣｌａｓｓを流用できる。
```
なまえ 変数名 ＝ new なまえ();
変数名.処理();
```
「インターネット」と「Web」の違い。①インターネット

半年ほど前に業界未経験でエンジニアに転職しました。
研修中に「インターネットってなに？」「じゃあWebは？」と質問があったのですが、「・・・。」
上手く答えることができず悔しかったので頭の中を整理していくために記事にまとめてみました。

## 「インターネット」と「Web」は違う
**インターネット**とはネットワークであり、通信技術のことで、
世界中のパソコンをはじめとした様々な機器同士を相互に繋げているもの。
**Web**とは、インターネットを利用して文章や画像、映像、音声などのデータを送る仕組みで、普段見ているWEBサイトやアプリはWebのこと。

一度に多くの情報を頭に入れるとパンクしてしまうので、今回はインターネットについて掘り下げて調べていく。

## インターネットの歴史
1969年、世界初のインターネット「ARPANET（アーパネット）」がアメリカで誕生。
「ARPANET」は、4台のコンピューターをつないだ軍事用のネットワーク。各地のコンピューター同士をネットワークで繋げたいという目的で開発された。徐々に各地に拡大し、通信方式(プロトコル)を見直して世界中に広まってインターネットと呼ばれるようになる。しかし、当初は接続回線が高価で、インターネットは企業や研究機関のみで利用されるぐらい。

## 世界中で使えるようにするために共通のルールが作られる
インターネットを支える重要な仕組みが、インターネットプロトコル（IP）。
例えば、違う国の人同士が会話するとき、お互いの言語がわからないと何を言っているか理解できない。
それと同様に、コンピューター同士も国や機器が違うとお互いの通信内容を理解することができない。
その問題を解消するために開発されたのがインターネットプロトコル(IP)。
プロトコルは規則やルールという意味。
インターネットプロトコルという共通のルールによって、国や種類の違うコンピューター同士でも、インターネットを通じて会話することができるようになった。

## 参考
* [イラスト図解式 この一冊で全部わかるWeb技術の基本](https://www.amazon.co.jp/%E3%82%A4%E3%83%A9%E3%82%B9%E3%83%88%E5%9B%B3%E8%A7%A3%E5%BC%8F-%E3%81%93%E3%81%AE%E4%B8%80%E5%86%8A%E3%81%A7%E5%85%A8%E9%83%A8%E3%82%8F%E3%81%8B%E3%82%8BWeb%E6%8A%80%E8%A1%93%E3%81%AE%E5%9F%BA%E6%9C%AC-%E5%B0%8F%E6%9E%97-%E6%81%AD%E5%B9%B3/dp/4797388811/ref=asc_df_4797388811/?tag=jpgo-22&linkCode=df0&hvadid=295704876452&hvpos=&hvnetw=g&hvrand=15357321002661338070&hvpone=&hvptwo=&hvqmt=&hvdev=c&hvdvcmdl=&hvlocint=&hvlocphy=1009210&hvtargid=pla-526274317363&psc=1&th=1&psc=1)

小学生のとき数回PCを使う授業があったが、学校のパソコンが置かれている部屋だけエアコンがついていたり、精密機械だから慎重に扱ってと先生が気が張っていて、ビビりながらいじっていたのを思い出した。
インターネットとWebがごっちゃになってしまっていた。
何がどういう役割を持っているのか理解して、エラーがあったときにどこが原因なのか判断できるようにしていきたい。
VBAで正規表現で部分文字列を取得する

# VBAで部分文字列を取得するには

単純に正規表現文字列と一致するかどうかはTest()を使えばいい。
一致文字列を取得するにはExecute() からmatchを取得しValueを取得すればいい。
では部分文字列はどのようにして取得するか。

VBAのregexpは汎用的にできているので暗黙裡に繰り返しのパターンマッチ、部分マッチを処理するようにできている。
1回だけマッチしたい場合は繰り返しは必要ない。

~~~Visual Basic
Sub get_sub_match()
    'Microsoft VBScript Regular Expressions 5.5
    Dim re As New regexp
    
    re.Global = True
    re.IgnoreCase = True
    re.Pattern = "(c...y)[^0-9]+([0-9]+)"
    
    Dim mc As MatchCollection
    Set mc = re.Execute("don't tell me you love me candy for 777times")
    If mc.Count <> 0 Then
        Dim m As match
        Set m = mc.Item(0)
            
        Debug.Print "FirstIndex = "; m.FirstIndex
        Debug.Print "Length = "; m.Length
        Debug.Print "SubMatches.Count = "; m.SubMatches.Count
        Dim j As Integer
        For j = 0 To m.SubMatches.Count - 1
            Debug.Print "SubMatches = "; m.SubMatches(j)
        Next
        Debug.Print "Value = "; m.Value
    Else
        Debug.Print "not matched."
    End If
End Sub
~~~

結果は以下のようになる。
期待通りの部分文字列1と2を得ることができた。
~~~
FirstIndex =  26 
Length =  13 
SubMatches.Count =  2 
SubMatches = candy
SubMatches = 777
Value = candy for 777
~~~
Python VS EV3-G ~高速化~ ~ev3fast~

# Introduction
Most of people use EV3-G(also called "LEGO Mindstorms Education") for EV3 programing.  
However, some use "[Python(ev3dev)](https://www.ev3dev.org/)". I am one of them.

ほとんどの人はEV3のプログラムをするのにEV3-G(教育版EV3ソフトウェア)を使っているでしょう。ですが、私含め[Python](https://www.ev3dev.org/)を使う人もいます。

# Which is faster?  |どっちが速いか？
EV3-G is faster, because EV3-G is one of compiler languages, but Python is one of scripting languages.  
You should know compiler languages are faster than scripting languages. 
According to [this](https://www.aposteriori.com.sg/ev3fast-a-python-module-for-faster-ev3-interface/), EV3-G is about 13 times faster than Python.
This difference is never small.

結論から言ってしまうとEV3-Gのほうが早いです。EV3-Gがコンパイラ言語で実行されるのに対して、Pythonがスクリプト言語でLinuxを挟んでいます。
[これ](https://www.aposteriori.com.sg/ev3fast-a-python-module-for-faster-ev3-interface/)によるとEV3-Gの方がPythonの約13倍速いそう。

# Howerer…  |でも…
I am used to wiriting codes; therefore It was not exciting for me to arrange the blocks to make programs.

コードを書くのに慣れているから、コードでプログラムしたいんです。

# ev3fast
There is a module for faster performance.
It is "[**ev3fast**](https://github.com/QuirkyCort/ev3dev-lang-python-fast)".

It supports these classes.
* class Sensor (address=None)
* class TouchSensor (address=None)
* class ColorSensor (address=None)
* class UltrasonicSensor (address=None)
* class GyroSensor (address=None)
* class Motor (address=None)
* class LargeMotor (address=None)
* class MediumMotor (address=None)

[This article](https://www.aposteriori.com.sg/ev3fast-a-python-module-for-faster-ev3-interface/) says that ev3fast is about 6 times faster than ev3dev(Python).
However according my experiences, ev3fast is 2 times faster than ev3dev.
Your preformance can change depending on your code and your environment.

ev3devを高速化するのに[ev3fast](https://github.com/QuirkyCort/ev3dev-lang-python-fast)というものがある。
[この記事](https://www.aposteriori.com.sg/ev3fast-a-python-module-for-faster-ev3-interface/)によると、約6倍高速化されるそう。サポートされるクラスは以下の通り。
* class Sensor (address=None)
* class TouchSensor (address=None)
* class ColorSensor (address=None)
* class UltrasonicSensor (address=None)
* class GyroSensor (address=None)
* class Motor (address=None)
* class LargeMotor (address=None)
* class MediumMotor (address=None)

ただし、私は試した限りでは2倍程度しか高速化されませんでした。おそらく試行に用いたコードや環境に違いがあったのが原因だと思われます。
だとしても高速化されるのは確かなようです。ぜひev3devの処理速度に困っている人は試してみてほしいです。

# References  |参考文献
https://www.aposteriori.com.sg/ev3fast-a-python-module-for-faster-ev3-interface/

https://github.com/QuirkyCort/ev3dev-lang-python-fast
zshでcommand not foundが出たら小文字のpath変数を疑え

## TL;DR

zsh では小文字の変数 `path` は特殊な配列変数で、環境変数 `PATH` の内容と同期しています。そのため `path` を書き換えると `PATH` も書き換わってしまいます。`path` をローカル変数として使っていたりすると、意図せず `PATH` を書き換えてしまい、結果 command not found となってしまいます。

## 解説

例えば、現在の `PATH` の中身がこうだったとします。

```bash
$ echo "$PATH"
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
```

この時 `path`は以下のようになります。

```bash
$ for p in "${path[@]}"; do echo "> $p"; done
> /usr/local/sbin
> /usr/local/bin
> /usr/sbin
> /usr/bin
> /sbin
> /bin
```

環境変数 `PATH` と配列変数 `path` は同期しているので `PATH` を書き換えると `path` が、反対に `path` を書き換えると `PATH` が書き換わってしまいます。

```bash
$ PATH="a:b:c"
$ for p in "${path[@]}"; do echo "> $p"; done
> a
> b
> c

$ path=(d e f)
$ echo "$PATH"
d:e:f

$ path='dummy'
$ echo "$PATH"
dummy
```

`path` が特殊変数なのは zsh のみです。bash などではこのようなことは起きません。他にも `status` がよく使いがちな特殊変数です。その他の特殊変数は以下を確認してください。

- `man zshparam`
- [15.5 Parameters Set By The Shell](https://zsh.sourceforge.io/Doc/Release/Parameters.html#Parameters-Set-By-The-Shell)
- [15.6 Parameters Used By The Shell](https://zsh.sourceforge.io/Doc/Release/Parameters.html#Parameters-Used-By-The-Shell)
bind()とthisは、セットに理解するのがいい。

今回は `bind()` に関して理解を深めたいと思います。

### bind() について。

```html
bind() メソッドは、呼び出された際に this キーワードに指定された値が設定される新しい関数を生成します。
``` 
[Function.prototype.bind()](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Function/bind)

なるほど、`thisを指定するんだな、新しい関数を作るんだな` というのがわかりました。

### thisの中身を見ていく

bindはthisには深い関係にありますので、まずは `this` の中身について見ていきましょう。

```js
const testFunk = {
  name: '太郎',
  onClick() {
    console.log(this) // これな何になる？
    console.log(this.name + ' clicked');
  }
};

testFunk.onClick();
```

実行すると、このような結果が得られました。
![スクリーンショット 2022-03-09 13.54.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206790/a1421b2e-eacc-54e0-ccb4-03409d414557.png)
※choromeの開発者ツールで実行しています

`this`が参照しているオブジェクトは`testFunk`だとわかりました。


```js
[ここがthisの対象].showName();
```

続いて、`showName`を追加し、そちらから実行してみます。

```js
const testFunk = {
  name: '太郎',
  onClick() {
    console.log(this)
    console.log(this.name + ' clicked');
  },
  showName: { // 追加
    name: '二郎',
    onClick() {
        console.log(this)
        console.log(this.content + ' clicked your button')
    }
  }  
};

testFunk.showName.onClick();
```

![スクリーンショット 2022-03-09 14.02.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206790/0d426c2f-3c2c-241f-a789-5933e0d52cdd.png)

`this`が参照しているオブジェクトは、`showName`だとわかりました。

```js
[testFunk].[ここがthisの対象].showName();
```

続いて、メソッドを`別の変数に格納した`場合はどうなるでしょうか.

```js
const testFunk = {
  name: '太郎',
  onClick() {
    console.log(this)
    console.log(this.name + ' clicked');
  }
};

const animal = testFunk.onClick; // animalに格納する
animal(); 
```

![スクリーンショット 2022-03-10 21.32.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206790/b790121d-00ea-7d0d-6c6b-f7f0cbd90c75.png)

`this`が `グローバルオブジェクト(window)` になってしまいました。
`this.name`は`グローバルオブジェクト`に存在しないので `undefined` になっています。

```js
window.onClick();
```

このことから、`this`は実行する方法によって変わることがわかりました。
ここまで、`this`の理解が少しは深まったかと思います。

## bind()

やっと`bind`のお話です。
`bind`の説明を思い出してみましょう。

```
this キーワードに指定された値が設定される新しい関数を生成します。
```

つまり`何をthisとおくか指定する`ことができます。
先ほどグローバルが`this`になってしまった例に、`bind`を用いて`this`を操ってみます。

```js
const testFunk = {
  name: '太郎',
  onClick() {
    console.log(this)
    console.log(this.name + ' clicked');
  }
};

const animal = testFunk.onClick.bind(testFunk); // thisはtestFunkにしてくれ
animal(); 
```

![スクリーンショット 2022-03-10 21.40.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206790/afe47509-82ad-9eb3-9392-5d6e1e8ca2c0.png)

やりました！
`this`が`グローバル`になっていません。`testFunk`のままにすることができました！

---

続いて、`bind`に`showName`を入れてみます。

```js
const testFunk = {
  name: '太郎',
  onClick() {
    console.log(this)
    console.log(this.name + ' clicked');
  }
}

const showName = {
  name: '二郎',
};

const hoge = testFunk.onClick.bind(showName);
hoge();
```
![スクリーンショット 2022-03-10 21.48.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206790/6386ae4e-d6ae-87f9-e77f-17c18138100a.png)

`showName` を `this` とすることができました！

---

長くなってきたのでいったんここで切りますね！

次回は `bindをアロー関数で使用したらどうなるのか` を書いていきます。
Wordle がますますつまらなくなった

# grep で Wordle を作る

ちょっと前に、こういう記事を書いた。

https://qiita.com/kaz-utashiro/items/ba6696187f2ce902aa39

grep で Wordle の問題を解くと簡単すぎてつまらないので、grep で Wordle を実装してみたという内容だ。

このプログラムの趣旨は、Wordle が行っている正誤の判断を正規表現でできないかという実験的なものだ。実際、正解の単語から正規表現を生成して、ヒント情報の表示自体はツールの持っている基本的な機能で実現している。

しかし、隣に表示しているキーマップ情報については違って、実現するためには、わりと当たり前の方法を使って解析している。

# 便利機能を実装する

試しに作ったプログラムだが、案外使えるのでいろいろと改造していたら、どうも本来の趣旨とはかけ離れたものになってきた。前の記事にも書いたように、Wordle を解くために辞書と grep を活用するのは有効で、だったらわざわざ別の画面で入力したりするよりも、同じ場所で実行できた方が圧倒的に便利なのだ。

https://github.com/kaz-utashiro/greple-wordle

ということで、候補となる単語リストから正解のヒントを表示するインタフェースを作った。次の例を使って説明してみよう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36551/4f522c7b-a414-db46-41bf-793626835abf.png)

1. solid という単語を試す。
1. panic という単語を試す。
1. hint を表示する。
1. 案外たくさんあるので、もう少し絞り込みたい。
1. 次は、今までに出てきていない文字を試したいので、solid を含まず (`!solid`)、panic も含まない (`!panic`) 単語で、よく使われそうな文字 eft を含む単語 (`=eft`) の中から、重複文字を含まないもの (`u`, `uniq`) を表示する。
1. 4つのの中から wheft を選んで試したところ、候補は datum と tardy の2つに絞られた。
1. あとは、1つずつ試して正解の tardy が得られる。

こんな風にフィルターコマンドはパイプライン状に繋げてつかうことができる。grep を次のように使っている感じだ。

```shell
grep -v '[solid]' | grep -v '[panic]' | grep '[eft]' | ggrep -vP '(.).*\1'
```

はっきり言って滅茶苦茶便利である。

ちなみに、ここで候補となる単語を表示するために使われている正規表現は次のものだ。

```
(?=.*s)(?=.*l)(?=.*p)(?=.*a)(?!.*[oidnc])[^sp]a[^ln][^i][^dc]
```

上のような使い方以外にもいろいろと応用は効く。また、正解のシリーズを指定できるようになっているので、一日に何回でも練習することができる。デフォルトはシリーズ1で、シリーズ0はオリジナルと同じ。また `--randam` をつければ、毎回ランダムな問題になる。

# 結論

サポート機能を実装して滅茶苦茶便利になった代わりに、Wordle がいっそうつまらなくなった。とりあえず、試行回数のデフォルトは5にしていいような気がする。4にすると緊張感が出てくるかと思って試しにランダムに10問やってみたら、8勝2敗だった。

ところで、今となっては greple のモジュールとして実装する意味がほとんどなくなってしまった。逆に行編集が実装しづらいなどの弊害もある。単独のコマンドとして実装した方がいろいろな意味でいいのだが、そこまで手間をかける意味があるのかというのと、だったら perl でなくてもいいんじゃないかという話が...

# 追記

そうそう、前の記事でオプションハンドリングが面倒という話を書いたのだが、その後、このモジュールは、本体の greple コマンドとは完全に独立したオプション体系を持つ形に変更した。

https://github.com/kaz-utashiro/greple-wordle/blob/f8a9eb4/lib/App/Greple/wordle.pm#L18-L41

普通は、モジュールは本体の機能を拡張するために作るのだが、この場合は完全にバックエンドとしてしか使っていない。だから、本体とはまったく異なるオプション体系にしてしまっても問題ないだろうという判断だ。greple のオプションは、初期化の段階で設定するので問題はないし、モジュールが解釈しないオプションはそのままパススルーするようになっている。苦し紛れの小細工をするよりは、この方が潔く見通しもいい形になったと思う。

このモジュールを実装してみて、greple の機能をもっと柔軟に利用できるようになるといいと思った。コードはかなり書き換えたが、メインの流れの部分については30年前から変わらない構造になっている。これがポータブルなオブジェクトで、他のコードからも利用できるような形になっていれば、もっと違う利用の仕方があるのになあと感じた。メイン部分の大改修には腰が重いので考えどころだ。
rails consoleでメソッドの一覧や定義場所を確認する

# はじめに
Railsでコードを書いているときにメソッドの有無や定義場所を調べたい！となることがあったので、方法をまとめておきます。

# メソッドの一覧を確認する
メソッドの一覧は`methods`メソッドで確認できます。
使用可能なメソッドがシンボルの配列として返ってきます。

```irb
[1] pry(main)> user = UserController.new()
=> #<UserController:0x000000000069a0>
[2] pry(main)> user.methods
=> [:index,
 :show,
 :create,
 :update,
# ~省略~
```

# メソッドの定義場所を確認する
`method`メソッドと`Metho#source_location`メソッドで確認できます。
0番目の要素に定義ファイルの絶対パスが、1番目に行数が入った配列が返ってきます。

```irb
[3] pry(main)> user.method(:index).source_location
=> ["/home/user/workspace/sample_app/app/controllers/users_controller.rb", 5]
```
自然言語処理ライブラリspaCy/GiNZAのオンラインデモサイトを立ててみた

# はじめに

Mecabには[形態素解析ウェブアプリUniDic-MeCab](http://www4414uj.sakura.ne.jp/Yasanichi1/unicheck/)や[MeCab/Unidic Demonstration](http://www.edrdg.org/~jwb/mecabdemo.html) といったオンラインデモサイトがありますが、2022年3月現在[spaCy/GiNZA](https://github.com/megagonlabs/ginza)のデモサイトはなさそうなので~~Herokuで立てました。~~
2022年11月Herokuの無料枠が終了したため、[Render.com](https://render.com/)で立てました。

実際に動かしてみるとこんな感じです。
<img width="600px" src="https://raw.githubusercontent.com/chai3/spacy-ginza-online-demonstration/main/images/screenshot.png">

さっそく、オンラインで試したいという方は下記にアクセスしてみてください。
https://chai3.github.io/spacy-ginza-online-demonstration/


# spaCy/GiNZAとは
[GiNZA](https://github.com/megagonlabs/ginza) は、[Universal Dependencies(UD)](https://universaldependencies.org/)に基づいたオープンソースな日本語処理ライブラリです。
[spaCy](https://github.com/explosion/spaCy)というMITライセンスで商用レベルな自然言語処理フレームワークをベースに構築されています。

# ~~Herokuとは~~
~~HerokuはWebアプリケーションのためのクラウドプラットフォームです。無料プランもあり、簡単にWebアプリをホスティングすることができます。~~
~~[runtime.txt](https://github.com/chai3/spacy-ginza-online-demonstration/blob/main/runtime.txt)にPythonのバージョン、[Procfile](https://github.com/chai3/spacy-ginza-online-demonstration/blob/main/Procfile)にWebアプリの起動方法~~
~~requirements.txt([Pipfile](https://github.com/chai3/spacy-ginza-online-demonstration/blob/main/Pipfile)でも可)にpip依存関係を書けば、サーバーを立ち上げることができます。~~
~~また、Github連携で自動デプロイも簡単です。~~

# 工夫した点など

<img width="600px" src="https://github.com/chai3/spacy-ginza-online-demonstration/raw/main/images/architecture.drawio.svg">

~~Heroku無料プランでは30分未使用で停止され、コールドブートが発生してしまいます。~~
~~有料プランかHeroku公式提供のHeroku Schedulerで常時起動すれば回避できますが、今回は以下の緩和策を行い許容することにしました。~~
Render.comもHeroku同様に未使用で停止され、コールドブートが発生してしまいます。
今回は以下の緩和策を行い許容することにしました。

* htmlなど静的ファイルはGithub pagesによりホスティングする
* ユーザーがそのhtmlを表示した際/warmup APIを空打ちしてHerokuのDyno(コンテナ)を起動する
* /analyze API呼び出し時（RUNクリック時）はVuetifyの[v-progress-linear](https://vuetifyjs.com/ja/components/progress-linear/#striped)で処理中をアピールする
  * このときDyno起動処理中であっても通信エラーにならず、キューにたまるためfetchのリトライ処理は不要のようです

また、spaCy/GiNZAのja-ginza-electraモデルは精度は高いものメモリ使用量が高いため、従来のja-ginzaモデルを利用しました。

# 参考サイトなど
* [自然言語処理ライブラリGiNZAの解析結果を解りやすく表示してみた - Qiita](https://qiita.com/chai31/items/0c942b503881da053bde)
* [GiNZA v5.0.0 重要な変更](https://megagonlabs.github.io/ginza/#ginza-500)
* [ginzaコマンドのオプション](https://github.com/megagonlabs/ginza/blob/develop/docs/command_line_tool.md#options)
* Sudachi [The modes of splitting](https://github.com/WorksApplications/Sudachi#the-modes-of-splitting)
* ~~[無料で試せて月額固定ならHerokuがおすすめ - Qiita](https://qiita.com/oedkty/items/3a8efddc910c78655dd5)~~
* [Server Workers - Gunicorn with Uvicorn - FastAPI](https://fastapi.tiangolo.com/deployment/server-workers/)

# 最後に

ソースコードは[Github](https://github.com/chai3/spacy-ginza-online-demonstration/) にあります。
皆さんも[spaCy/GiNZA オンラインデモ](https://chai3.github.io/spacy-ginza-online-demonstration/)で感触を試し、興味がある方はローカルでもspaCy/GiNZAを使ってみてください。
Lenovo B590 CPU換装 (Core i5→Core i7)

# 概要
自分が持っているノートパソコン（Lenovo B590 型番59394997）のCPUをCore i5→Core i7に換装したので、取り急ぎ報告します。

# 注意
Lenovo B590には今回の型番59394997のようにHM77 Chipsetを持つ機種とHM70 Chipsetを持つ機種があり、HM70 Chipsetの機種に今回のようなCore i5/i7などを換装すると30分で電源が落ちる現象にあたります。この回避方法を探しているのですがファームウェアを書き換えるやり方しか見つかっていません。なのでHM70 Chipsetの機種は下記のように換装してもまともに動きません。

# 換装前
![2022-03-08 (9).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101343/1b9b31b7-c9b5-2f3a-dad4-c4cc03d92566.png)
# 換装後
![2022-03-08 (12).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101343/44db5712-32a8-b606-cbcb-ecfdcf132ec6.png)


# 参考文献
Lenovo B590 製品仕様書
https://www.lenovo.com/jp/ja/static/catalog/nb-2013-b590_rt_1001_5

Lenovo B590 Hardware Maintenance Manual
https://download.lenovo.com/pccbbs/mobiles_pdf/b590_hmm_en.pdf
　
Ivy Bridgeマイクロアーキテクチャ(wikipedia）
https://ja.wikipedia.org/wiki/Ivy_Bridge%E3%83%9E%E3%82%A4%E3%82%AF%E3%83%AD%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%81%E3%83%A3

Lenovo B590の分解作業(rhodiola 日記)
https://www.npaso.com/%e3%83%8e%e3%83%bc%e3%83%88%e3%83%91%e3%82%bd%e3%82%b3%e3%83%b3%e5%88%86%e8%a7%a3/2016/04/15/post-326/

モバイル インテル® HM70 Express チップセットにCore i3/i5/i7を入れると30分で落ちる原因と回避するための施策（me_cleaner、今回の換装の対象外）
https://github.com/corna/me_cleaner/blob/master/README.md#what-can-be-done
MySQL  -- でコメントアウトするときに注意する

MySQLのコメントアウト方法が間違っていてエラーが出たので、個人の教訓として。

--を使用してコメントアウトしようとしていましたが半角スペースが不足していることに気づかず躓いたので、同じポイントでエラー直面した方の参考になると幸いです。

エラーが出た際に付近の文言チェックは繰り返しましたが、コメントアウトしている部分は意識が向いていなかったので今後エラーが出た際はコメントアウトも含めてしっかりチェックすることに努めます。


https://dev.mysql.com/doc/refman/5.6/ja/comments.html

```SQL

SELECT * FROM table;
--NGパターン
-- OKパターン

```