OmniAICreator/Qiita-1.07M huggingface dataset:
MacのM1チップReact-Native導入部分でのつまづきポイント

#参考書籍
Starting mobile app development with React Native and Expo (Japanese Edition)
上記を参考にやってみた所、私のMacがM1チップ搭載だったためか、ビルドにやたら苦労したので、後に続く人が同じ所で詰まらないようにそれを書いておきます。M1チップの環境構築に苦労してる人向けです。

#環境
・MacOS BigSir 11.4 Beta
・チップ Apple M1
・XCode 12.5

#流れ
・Node.js
・Homebrew
・Watchman
・react-native-cli

をインストールしていざ”react-native init hello_world”をしてみる。
すると、

```
To eliminate this warning, please install libyaml and reinstall your ruby.
```

このような文が出てくる。

##libyamlは簡単にインストールできたが・・・

```
$ brew install libyaml
```

しかし、以下のコマンドを打つとエラーになる。

```
rbenv install --verbose 2.7.2
```

エラー

```
BUILD FAILED (macOS 11.2 using ruby-build 20210119) Mac Big Sur
```
こんなメッセージが出てくる。
どうやらM1チップにはそのままRubyをインストール出来ないらしい。

##解決方法

以下のコマンドを打ち、Rubyをインストールして適用する。

```
RUBY_CFLAGS="-Wno-error=implicit-function-declaration" RUBY_CONFIGURE_OPTS="--with-openssl-dir=`brew --prefix openssl` --with-readline-dir=`brew --prefix readline`" sudo arch -x86_64 rbenv install --verbose 2.7.2

rbenv rehash 
rbenv global 2.7.2
```
Rubyの2.72を使用するのはM1と互換性のあるバージョンが2.72だかららしい。

参考→https://github.com/ffi/ffi/issues/869

#ここで終わったと思ったが・・・
Cocoapodsをインストールしてなかったのでインストールして、改めて

```
react-native init hello_world
```

を打ち込むと問題なく

```
Run instructions for Android:
    • Have an Android emulator running (quickest way to get started), or a device connected.
    • cd "/Users/yakiniku/hello_world" && npx react-native run-android
  
  Run instructions for iOS:
    • cd "/Users/yakiniku/hello_world" && npx react-native run-ios
    - or -
    • Open hello_world/ios/hello_world.xcworkspace in Xcode or run "xed -b ios"
    • Hit the Run button
    
  Run instructions for macOS:
    • See https://aka.ms/ReactNativeGuideMacOS for the latest up-to-date instructions.
    
```

ビルド出来ますよ画面が出てくる。
しかし、

```
cd hello_world
react-native run-ios
```
とすると以下のエラーが。

```
error Failed to build iOS project. We ran "xcodebuild" command but it exited with error code 65. To debug build logs further, consider building your app with Xcode.app, by opening hello_world.xcworkspace.
Command line invocation:
```

要約するとコマンドラインからビルドに失敗したから、XCodeから直接ビルドしてね、とある。

#解決策

![スクリーンショット 2021-05-02 12.53.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/976967/975d5ad3-09a0-d620-e483-a1cf69007408.png)
1.Pods→Podfile
2.最後の４行を最後の行以外コメントアウト。
3.Terminal上で以下のコマンドを打つ

```
cd ios && pod install --repo-update
```
これを打つことでflipperのライブラリがプロジェクトから読み込まれなくなる。


参考→https://github.com/oblador/react-native-vector-icons/issues/1144

#結果
![スクリーンショット 2021-05-02 12.57.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/976967/e3913970-5651-8bc4-a437-39dee7233e52.png)

対ありでした。

#追記
コメントアウトして対応したバグですが、どうやらXCode12.5の時に起こるバグらしいです。
下記の記事によると12.4にダウングレードするとFlipperが正常にビルドできるため、コメントアウトする必要はないようです。

https://github.com/facebook/flipper/issues/2215#issuecomment-829102757

又は以下のように変更することでビルドが通るようです。

https://github.com/facebook/react-native/issues/31179#issuecomment-830184757

そのうちパッチが出ると思うので、それを待つのも良いかもしれませんね。
Elmer のチュートリアルをやってみる

# はじめに
何事も挑戦です。

普段は、`AtCoder`とか`Ruby`のタグで記事を投稿していますが、それに比べ`Elmer`タグはviewsが伸びないけど、気にしない。
# チュートリアル１
やったチュートリアルはこちら
[Elmer チュートリアル 非線形・非定常の構造解析](https://www.xsim.info/articles/Elmer/tutorial-nonlinear-transient-stress-analysis/modeling1.html)

```solver.log
ElmerSolver: The end
SOLVER TOTAL TIME(CPU,REAL):        34.12       34.12
```
34秒かかるけど気にしない。
![20210502a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538241/2a1b8656-60b9-cdd9-713d-1f71f5a1b85b.png)
WSLの方は`Apply`ボタンが押せなかったけど、Windows版の方は押せるけど、気にしない。
# チュートリアル２
やったチュートリアルはこちら
[Elmer チュートリアル 2次元の流体・構造連成解析](https://www.xsim.info/articles/Elmer/tutorial-FSI-2D/modeling1.html)

```solver.log
ERROR:: SectionContents: Problem reading integer keyword: nonlinear system max iterations: 0.5
```
何やらエラーが発生。
`Elasticity Equation`の設定値を間違えた様子で、気にしない。

WSLの方はElmerのメニューから`ParaView`が起動したけど、Windows版の方は起動しないけど、気にしない。
![20210502b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538241/d5d3bf42-17c3-7068-919f-de161b144bb3.png)
# まとめ
+ Elmer さんありがとう
+ XSim さんありがとう
+ 情報が少ない故、あまり気にしない心構えが必要と感じました
「SolidityとEthereumによる実践スマートコントラクト開発―Truffle Suiteを用いた開発の基礎からデプロイまで」でハマった時の解決策

# truffle unbox reactが失敗する問題
「9.1.1 開発環境のセットアップ」
Nvmを使って、Nodeのバージョンを色々変えてみましょう

```
npm ERR! code 1
npm ERR! path /Users/kobayashitomoya/fundraiser/fundraiser-dapp/client/node_modules/sha3
npm ERR! command failed
npm ERR! command sh -c node-gyp rebuild
npm ERR! CXX(target) Release/obj.target/sha3/src/addon.o
npm ERR! gyp info it worked if it ends with ok
npm ERR! gyp info using node-gyp@8.0.0
npm ERR! gyp info using node@15.6.0 | darwin | x64
npm ERR! gyp info find Python using Python version 3.8.2 found at "/Library/Developer/CommandLineTools/usr/bin/python3"
npm ERR! gyp info spawn /Library/Developer/CommandLineTools/usr/bin/python3 
```

```
nvm install v12.1.0
nvm use v12.1.0 
```

# truffle develop → compileが失敗する問題
p.172
Solidityのバージョンが異なるのが問題
バージョンを合わせましょう

・fundraiser-dapp/contracts/Fundraiser.sol
・fundraiser-dapp/contracts/FundraiserFactory.sol
・fundraiser-dapp/contracts/Migrations.sol
・fundraiser-dapp/contracts/SimpleStorage.sol

``` diff
- pragma solidity >=0.4.21 <0.7.0;
+ pragma solidity >=0.4.21 <0.9.0;
```

・fundraiser-dapp/truffle-config.js

```js
  },
  // Configure your compilers
  compilers: {
    solc: {
      version: "0.8.0",    // Fetch exact version from solc-bin (default: truffle's version)
      // docker: true,        // Use "0.5.1" you've installed locally with docker (default: false)
      // settings: {          // See the solidity docs for advice about optimization and evmVersion
      //  optimizer: {
      //    enabled: false,
      //    runs: 200
      //  },
      //  evmVersion: "byzantium"
      // }
    }
  },

```


# Metamaskが繋がらない！
p.84 「9.2.4 Reactを使ってあいさつ文を設定する」
Metamaskを再インストールしましょう
https://chrome.google.com/webstore/detail/metamask/nkbihfbeogaeaoehlefnkodbefgpgknn?hl=ja
![スクリーンショット 2021-05-01 18.58.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247390/e1317a57-602e-a856-dd6a-8cc85fa701eb.png)
Effective Java(第3版) 項目4 privateコンストラクタでインスタンス化不可能を強制する

staticメソッド、staticフィールド(定数)だけからなるクラスを各場合、privateコンストラクタを作成し、
インスタンス化を不可能にする、という内容です。

# 記載内容
## 具体的なコンストラクタ定義
以下の様なコンストラクタを定義し、クラスの内部からも含めてインスタンス化が出来ないようにするべき。
```Java
// インスタンス化できないように、デフォルトコンストラクタを抑制する
private UtilityClass() {
    throw new AssertionError();
}
```

### Collectionsの様なインタフェースに対するユーティリティクラス
Java8からは、インタフェースにstaticメソッドを定義可能になっているため、
Collectionインタフェースにメソッドを直接定義可能になっている。

# 考察
privateコンストラクタは、既に一般化されてテクニックとなっており、特に疑問点等は無いと思います。
Java8からは、インタフェースに関するファクトリメソッドは、インタフェース自体に定義するべきと思います。
きぼうのゲーム作成日記1　タイトル作成

今回はぶっつけ本番のゲームを作ろうと思っているので、一度もゲームを作ったことがない人がゲームを作る日記となります。それをわかったうえでこの記事を見てください。
今回作っていくゲームの名前は、KibouTamokutekiGameです。
これからはKTGと言っていきます。
何すりゃいいのかわからないのでとりあえずテキストメッシュプロ使って、タイトル書いた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1148872/a2cd5645-835c-b719-f7bd-aa49ee13211c.png)
これはスマホゲームにするからタッチを認識する変数を置かないといけないと思い、変数を探したら、シーン切り替えというのがあり、どっちにした方がいいのかを、とりあえずヤフー知恵袋で質問しました。
回答してくれるまで待たないとね。回答してもらったはいいけど変数の書き方については教えてくれませんでした。自分なりに書いたらエラーがめっちゃ出てきました。皆さんどうすればいいかわかりますか？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1148872/9378e187-3a73-df34-98ba-1205125e4248.png)
友達に「助けて‼‼」と言ったら、教えてくれました。友達が張ってくれたURLがあるのでそれをこの記事に貼ろうと思います。
https://gametukurikata.com/ui/startbuttonui
明日の日記に解決したかどうかを書きたいと思います。最初はこんな感じになりましたがどうでしょうか？
次も見ていただけたらありがたいです。
PHP 関数呼び出し時に引数が指定されなかった場合のデフォルト値を設定する

# 目的

関数呼び出しされる時に引数を指定しなかった時のデフォルト値を設定する方法をメモ的にまとめる

# 説明

1. 下記のようなPHPの関数があったとする。

    ```php
    public function foo($str_flag)
    {
        if (is_null($str_flag)) {
            echo "$str_flagにはnullが格納されています";
        } else {
            echo "$str_flagにはnull以外が格納されています"
        }
    }
    ```

1. 上記の関数を実行する際に$str_flagを引数として渡さないとエラーになってしまう。
1. 下記のように記載することで関数を実行する際に引数として$str_flagを渡さなかった場合にデフォルト値を設定することが出来る（下記はデフォルト値をnullとしている）

    ```php
    public function foo($str_flag = null)
    {
        if (is_null($str_flag)) {
            echo "$str_flagにはnullが格納されています";
        } else {
            echo "$str_flagにはnull以外が格納されています"
        }
    }
    ```

1. デフォルト値をtrueとしたいなら下記のように記載する。もちろんbool値以外もデフォルト値として設定することが可能である。

    ```php
    public function foo($str_flag = true)
    ```
React連携（２）



```j:app/javascript/packs/hello_react.jsx
// Run this example by adding <%= javascript_pack_tag 'hello_react' %> to the head of your layout file,
// like app/views/layouts/application.html.erb. All it does is render <div>Hello React</div> at the bottom
// of the page.

import React from 'react'
import ReactDOM from 'react-dom'
import PropTypes from 'prop-types'

const Hello = props => (
  <div>Hello {props.name}!</div>
)

Hello.defaultProps = {
  name: 'David'
}

Hello.propTypes = {
  name: PropTypes.string
}

document.addEventListener('DOMContentLoaded', () => {
  ReactDOM.render(
    <Hello name="React" />,
    document.body.appendChild(document.createElement('div')),
  )
})
```

import
-

importはファイルの読み込みです。

【１】react
「react」はユーザーインターフェースを構築するためのJavaScriptライブラリで、Reactのコンポーネントを定義するために必要な機能のみが含まれています。

【２】react-dom
「react-dom」は、Reactのための、DOMの操作とサーバーレンダリング機能を提供します。

【３】prop-types
「prop-types」は、Propの型情報をチェックできるようにするツールです。

定数の宣言
-

constを利用して定数を宣言します。

```javascript:hello_react.jsx
const Hello = props => (
  <div>Hello {props.name}!</div>
)
```
Helloという定数に、＜div＞Hello {props.name}!＜/div＞が代入されます。

**`つまり「定数Helloにアロー関数を代入している（引数がprops）」
→引数が1つなら(　　)も不要 (引数0なら()は必要)。なのでpropsは(　　)なし`**

|通常関数|function (　) {　}|
|:--:|--|
|アロー関数arrow function|(　) => {　}|
＊書き換え可能

デフォルトpropsの宣言
-

以下のコードでは、propsのデフォルト値に‘David’を設定しています。（**コンポーネントの属性設定**）

```javascript:hello_react.jsx
Hello.defaultProps = {
  name: 'David'
```

propTypesにて型の制約の指定
-

propsのnameに入る型を指定しています。指定することによって、値を受け取った際に、肩のチェックを行ってくれます。
（**コンポーネントの属性設定**）

```javascript:hello_react.jsx
Hello.propTypes = {
  name: PropTypes.string
}
```

*PropTypesで渡された値の型チェックを行い、stringに限定している

「Hello React!」の表示
-

```javascript:hello_react.jsx
document.addEventListener('DOMContentLoaded', () => {
  ReactDOM.render(
    <Hello name="React" />,
    document.body.appendChild(document.createElement('div')),
  )
})
```
|ReactDOM.render( レンダリングする内容【第１引数】,表示を割り当てる場所【第２引数】)|
|--|

addEventListener(  )は、様々なイベント処理を実行することができるメソッド。上記はDOMContentLoadedとあるので、DOMツリーの構築が完了した時点(ロードされた時点)で呼ばれます。（=WEBページの読み込みが終わってJavaScriptのスクリプトが実行できる状態になったら）Helloオブジェクトのpropsのnameに「React」という文字列が代入されます。
 最後のdocument.body.appendChild(document.createElement(‘div’))により、divタグで囲まれた＜Hello name=”React” /＞の内容が、bodyタグが終了する直前に追加されます。
＊document.createElement(‘div’)はdiv要素を生成
＊body.appendChildはbodyの最後にbodyの子要素追加するというもの。

ここがむっちゃ詳しいです
>@kouheiszkさんRailsチュートリアル幻の15章 React編
>https://qiita.com/kouheiszk/items/c85e70e331ba75841818
pycryptoを入れようとするとRuntimeError: autoconf errorが出る


自分用メモ

# 発生したこと
```
pip install pycrypto
```
を実行すると

```
raise RuntimeError("autoconf error")

RuntimeError: autoconf error
```

と、他にも色々エラーが出て入れられない。

## 環境
AWS Linux

# 解決策
## Step1. gccをインストール
pycryptoをインストールするにはgccが必要なようなので、以下のコマンドでインストール

```
sudo yum install gcc
```

## Step2. python3-develをインストール
```
sudo yum install python3-devel
```


# 再び
```
pip install pycrypto
```
で行けた。

# 参考
他にも

```
pip install python-dev-tools
```
もしたのでもしかしたらいるかもしれない（問題の切り分けができていません:bow_tone5:）


## お世話になった先人の知識たち
https://techacademy.jp/magazine/23338
http://y0m0r.hateblo.jp/entry/20130707/1373192687
Laravelのフォルダ構成

Laraelでアプリケーションを作成したときに一気にできるフォルダについて、何をどこに記載すればいいかわからなくなることがあるため、参考程度にフォルダやファイルの役割を記載しておきます。

##動作環境
macOS Big Sur
MacBook Air (M1, 2020)

##Laravelで新規プロジェクトを作成する
terminalからコマンドを打つことでlaravelを使った新規プロジェクトを自動で作成することができます。
プロジェクトを作成したいディレクトリに移動し、以下のコマンドを打ちます。

```terminal:新規プロジェクト作成
compsoer create-project laravel/laravel sampleapp --prefer-dist
```

##Laraelのフォルダ構成
###作成したプロジェクトの直下のファイル群
|ファイル名|ファイルの内容|
|---|---|
|[.editorconfig]|テキストファイルを編集・保存する際にインデントや改行コードを設定したものに統一するための設定情報|
|**[.env] [.env.example]**|**動作環境に関する設定情報**|
|[.styleci.yml]|PHPやJS、CSSのフォーマットをチェックし、自動で整形可能なサービスの設定情報|
|[.gitattributes] [.gitignore]|git利用に関する情報|
|[artisan]|artisanコマンド(php artisan serveで使ったもの)|
|[composer.json] [composer.lock]|composerの利用に関するもの|
|[package.json]|JavaScriptのパッケージ管理ツール(npm)で利用するもの|
|[phpunit.xml]|PHPUnit(ユニットテストプログラム)に関するもの|
|[server.php]|サーバー起動時に利用されるプログラム|
|[webpack.mix.js]|webpackというJavaScriptパッケージツールで使うもの|

###作成したプロジェクトの直下のフォルダ群
|フォルダ名|フォルダの内容|
|---|---|
|**app**|**アプリケーションのプログラム部分がまとめられるところ。アプリケーションの開発時には、ここに必要なスクリプトファイルを追加していきます。**|
|bootstrap|アプリケーション実行時に最初に行われる処理がまとめられています。|
|config|設定関係のファイルがまとめられています。|
|**database**|**データベース関連のファイルがまとめられています。**|
|public|公開フォルダです。JavaScriptやスタイルシートなど、外部にそのまま公開されるファイルはここにまとめられています。|
|**resources**|**リソース関係の配置場所です。プログラムが利用するリソースファイルが用意されます。プログラムのテンプレートファイルなどが用意されます。**|
|**routes**|**ルート情報の保存場所です。アクセスするアドレスに割り当てられるプログラムの情報などがが記されています。**|
|storage|ファイルの保存場所です。アプリケーションのプログラムが保存するファイルなどが置かれます。ログファイルなどはここに保存されます。|
|tests|ユニットテスト関係のファイルが用意されます。|
|vendor|フレームワーク本体のプログラムがまとめられています。|

###appフォルダ直下のフォルダについて
主に作業することになるappフォルダについてはさらに詳しく記載しておきます。

|フォルダ名|フォルダの内容|
|---|---|
|[Console]|コンソールプログラムを配置するところです。|
|[Exceptions]|例外に関する処理を配置するところです。|
|[**Http**]|**これが、Webアプリケーションにアクセスしたときの処理をまとめておくところです。アプリケーションの基本的なプログラムはここに作成します。**|
|[**Providors**]|**プロバイダと呼ばれるプログラムを配置します。**|
|[**Models**]|**モデルと呼ばれるプログラムを配置します。**|


###作成したプロジェクト直下のroutesフォルダについて
apiを作るにあたって重要になるルーティングという機能についての設定情報はこちらにまとめます。
バックエンドの開発では頻繁に作業することになるので詳しく記載しておきます。

|ファイル名|ファイルの内容|
|---|---|
|[**api.php**]|**APIのルーティングです。例えばユーザー認証などのように、プログラムないから利用するAPIの機能を特定のアドレスに割り当てるの利用されます。**|
|[channels.php]|ブロードキャストチャンネルのためのルーティングです。|
|[console.php]|コンソールプログラムのためのルーティングです。|
|[**web.php**]|**これが、一般的なWebページとしてアクセスするためのルーティングです。**|
pymatgenの中のMPResterがimport出来ない時の対処

これが初投稿になります。お手柔らかにお願いします。

マテリアルズインフォマティクスの勉強を進めるに当たり、[こちら](https://qiita.com/oki_kosuke/items/6be3d1dbe1c7e16a5276#%E7%92%B0%E5%A2%83 "Materials Projectとは？（概要とデータの取得）")の記事を参考にしていたのですが、

```
from pymatgen import MPRester
```
のところでエラーが起きました。
試行錯誤した結果、どうやらpymatgenのバージョンの違いが原因のようです。


[こちら](https://pymatgen.org/change_log.html#v2022-0-6)がpymatgenを提供している公式サイトのバージョンに関するページですが、これによると、バージョン2021.3.4からは

```
from pymatgen import Composition  => from pymatgen.core.composition import Composition
from pymatgen import Lattice  => from pymatgen.core.lattice import Lattice
from pymatgen import SymmOp  => from pymatgen.core.operations import SymmOp
from pymatgen import DummySpecie, DummySpecies, Element, Specie, Species  => from pymatgen.core.periodic_table ...
from pymatgen import PeriodicSite, Site  => from pymatgen.core.sites ...
from pymatgen import IMolecule, IStructure, Molecule, Structure  => from pymatgen.core.structure ...
from pymatgen import ArrayWithUnit, FloatWithUnit, Unit  => from pymatgen.core.units ...
from pymatgen import Orbital, Spin  => from pymatgen.electronic_structure.core ...
from pymatgen import MPRester  => from pymatgen.ext.matproj ...
```

になるようです。...はimport以下の略です。

ご参考までに。
Next.jsでcssのクラス名にケバブケースを使う方法

# 前提
Next.jsのバージョン10.2.0
スタイリングにsassを使用。

# 問題
以下のようにケバブケースで書こうとするとエラーが出てしまう。

```
className={styles.company-logo}
```

# 解決策
以下のように書くと上手く動作します。

```
className={styles['company-logo']}
```

参考
https://stackoverflow.com/questions/61794899/using-kebab-case-css-classnames-in-css-sass-modules-when-using-next-js
数値解析　~Python Tips~

# 0. はじめに
数理計画の内点法を実装する際に線形方程式$Ax = b$を解くことがあり、Pythonでの実装例を調べた。本記事では線形方程式$Ax = b$を解くモジュールの使用例を記載する。


# 1. 線形方程式Ax=b
# 1.0 逆行列
素直に逆行列から演算する。

```python
import numpy as np

A_inv = np.linalg.inv(A)
x = np.dot(A_inv,b)
```

# 1.1 LU分解
LU分解は、線形方程式を高速に解く手法である。

```python
import scipy.linalg as linalg

LU = linalg.lu_factor(A)
x = linalg.lu_solve(LU, b)
```

# 1.2 QR分解
QR分解は、線形方程式を高速に解く手法である。

```python
import scipy.linalg as linalg
import numpy as np

Q, R = linalg.qr(A)
t = np.dot(Q.T, b)
x = linalg.solve(R, t)
```

# 1.3 コレスキー分解
コレスキー分解は、線形方程式を高速に解く手法である。
行列Aが正定値対称行列であるときに適用できる。

```python
import numpy as np

L = np.linalg.cholesky(A)
t = np.linalg.solve(L, b)
x = np.linalg.solve(L.T.conj(), t)
```

# 2　数値実験

線形方程式$Ax=b$を解いた時の各手法の実行時間を比較する。
ただし、行列$A$は正定値実対称行列である。

```math
A = 
\left(
    \begin{array}{ccc}
      6 & 4 & 1 \\
      4 & 8 & 2 \\
      1 & 2 & 1
    \end{array}
  \right)
, \ \
b = 
\left(
    \begin{array}{c}
      7  \\
      6  \\
      8 
    \end{array}
  \right)
```

実行時間を下記に示す。コレスキー分解が高速に演算していることがわかる。

|手法|実行時間(ms)|
|---|---|
|inv|1.24|
|LU分解|1.45|
|QR分解|0.52|
|コレスキー分解|0.29|

# 補足　固有値と固有ベクトル
行列$A$の固有値$w$と固有ベクトル$v$を求めるには下記のようにすればよい。

```python
import numpy as np

w, v = np.linalg.eig(A)

#固有値
print(w)
#[11.57822322  2.953963    0.46781378]

#固有ベクトル
print(v)
#[[ 0.59437613  0.80399525  0.01756856]
# [ 0.7780667  -0.5694105  -0.26529962]
# [ 0.20329591 -0.17135727  0.96400594]]
```
npm ERR! spawn ENOENT

# 状況
Vueプロジェクトで、 `npm run serve` してブラウザで確認しようとしたら `Error: spawn ENOENT` が発生しました。

調べたところ、このエラーは　

　①コマンドが存在しない　
　②作業ディレクトリが存在しない　
　③ウィンドウズ特有のバグ　

のどれかであることがほとんど、との情報ありましたが、macなので③は無し。

# 内容

```
sh: run-p: command not found
npm ERR! code ELIFECYCLE
npm ERR! syscall spawn
npm ERR! file sh
npm ERR! errno ENOENT
npm ERR! project-name serve: `run-p dev api:doc mock:watch`
npm ERR! spawn ENOENT
npm ERR! 
npm ERR! Failed at the project-name serve script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

npm ERR! A complete log of this run can be found in:
npm ERR!     /Users/UserName/.npm/_logs/2021-05-01T09_53_04_840Z-debug.log
```

`run-p（npm-run-all --parallel のショートカット）` というコマンドは知らない。 と行頭にあります。 `package.json` 内のココの部分です。

``` .json
"scripts":     
    "serve": "run-p dev api:doc mock:watch"
}
```

ちなみに `/Users/UserName/.npm/_logs/2021-05-01T09_53_04_840Z-debug.log` のログにもっと情報がある、と上記エラー文でありますが、あまり手がかりになるものはなかったです。

# 対処

下記コマンドで npm-run-all のパッケージをインストールする必要があるようです。

```
$ npm install --save-dev npm-run-all
```

または、インストールしたパッケージを全て削除し、インストールし直すことで確実に解決します（今回この方法をとりました）

```
$ rm -rf node_modules
```

```
$ npm install
```
JS~DOM概要~

#概要
JavascriptではDOMの操作が必須になります。
DOMとは何かについての記事になります。
#JS復習

JSはどのように動くのかについて復習します。

詳しくはこちらの記事を参照していただけると幸いです。

https://qiita.com/akari_0618/items/caa15d26fda6412107de

>①HTML/CSSの情報を読み取る
②その情報をもとに加工
③HTML/CSSを書き換える

上記の引用がざっくりとした流れです。

DOM操作とは、③に当たります。
またJSでJSでDOMの中身を書き換えたとしてもHTMLを書き換えているわけではないことを覚えておきましょう。

#DOM
ブラウザが読み込まれるとDocument Object Model もしくは DOM と呼ばれるデータ構造が読み込まれます。

```index.html
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <div class="header">
    <h1 class="title">JavaScript</h1>
    <p class="sub-title">DOM操作について</p>
  </div>
  
</body>
</html>
```

DOMはWebページをツリー状に構造化したものです。そして、このツリーにある要素をNode（ノード）と言います。

![スクリーンショット 2021-05-02 10.53.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1033397/440b0b7c-30a8-5571-6565-8961c27b862b.png)
本当にMacはWindowsより優れているのか？Mac→Windowsに乗り換えてみた感想

エンジニアを始めたときからMacだったがいろいろありWindowsに変えてみました。
諸々開発環境を整えて1ヶ月たったので諸々感想を。
WSL2でUbuntu20.04を使用

## 使用しているツールの移行

### Docker
基本的には動いているが、WSL2が若干不安定なのが原因で問題が起きるときがあり。
ただ、若干不安定なのはDockerForMacも似たようなものかも.....

とはいえ環境によってはPermision問題がでるので注意

https://futureys.tokyo/how-permission-should-be-set-for-developing-inside-a-container-using-wsl-2/


### brew
Linuxでbrewが使えるlinuxbrewを使用しました。
linuxbrewの仕様上caskは使えませんがそれ以外は全く問題なく使えています。

### 開発環境
最も移行するときに問題になりました。
macOSではIntelliJ IDEAとvimそれぞれを使っていました。

まずIntelliJ IDEAはmacOSとWindowsでキーマップが全く異なります。
以下のプラグインで一応それっぽくはできますが、やはり完全に同じ動きにはできませんでした。

https://plugins.jetbrains.com/plugin/13258-macos-keymap


結局WindowsでIntelliJ IDEAを使うことは諦めてvim一本にすることにしました。


## やはりWSL2は癖が強い
WindowsでLinuxOSが仮想的に動くWSL2ですが、DockerもWSL2上で動くし意外に問題なく動いています。
ただ以下の特有の問題もあります。

### 仮想環境なのでホームディレクトリがWSL2とWindowsで別になる
Windows側のホームディレクトリにWSL2からアクセスもできるけど、読み書きが遅くなったりパーミッションが謎挙動することがあり非推奨

### WSL2側の時間設定がずれる
WindowsをスリープさせるとWSL2の世界では時が止まり、復帰してもそのままなのでたまにリセットをかけないと時間設定が過去にずれていきます。

### ネットワーク系の動きが独特
WSL1ではWindows側と仮想環境で完全に別のIPが振られて、localhostでアクセスしてもWSL1に到達できない仕様だったようですが、WSL2ではホスト側にフォーワードされるようになりました。

これで問題なくアクセスできるかと思いきや、127.0.0.1やlocalhostでサーバーを立ち上げると外部接続とみなされてアクセス拒否されることがあります。
0.0.0.0で立ち上げれば良いのですがなかなか原因がわかりませんでした。

## なぜ移行したか
今回の移行のそもそものモチベーションはMacBookProのCPUが遅くてきつかったことです。
IntelMacのMacBookPro13インチを全部盛りしていましたが、webpackやdocker buildが我慢できないくらい遅かったからです。
M1チップも検討しましたが、諸々のツールが安定するのはまだまだ先になると思ってWindowsに乗り換えてみました。

現状以下のRyzen5900hsが載ったゲーミングノートＰＣを使っていますが、3分の1ほどの時間でbuildが終わり非常に快適です。
https://kakaku.com/item/K0001335798/


## まとめ
罠は多かったですが、結局乗り換えてみるとWindowsでも快適に開発できているので満足です。
しかし、WSL2の癖の強さを考えると最初はMacのほうが向いていそうですね。
Next.js(next/link)にて、現在のページにアクティブクラス(active class)を設定する方法

Next.js(next/link)にて、現在のページにアクティブクラス(active class)を設定する方法になります。
ナビゲーションなので、ルートと一致するリンクのスタイルを変えたい時に便利かと思います。
（Vue.jsのactive-classのイメージです）

## Active Link componentsを作成

```tsx:ActiveLink.tsx
import { withRouter } from 'next/router'
import Link from 'next/link'
import React, { Children } from 'react'

const ActiveLink = ({ router, children, ...props }: any) => {
  const child = Children.only(children)

  let className = child.props.className || ''
  if (router.pathname === props.href && props.activeClassName) {
    className = `${className} ${props.activeClassName}`.trim()
  }

  delete props.activeClassName

  return <Link {...props}>{React.cloneElement(child, { className })}</Link>
}

export default withRouter(ActiveLink)

```

`next/link` には、デフォルトでアクティブクラスをつける機能は無いので、`next/link`をラップして新たなcomponentsを作ります。

## 作成したActive Link componentsを読み込む

```tsx
import ActiveLink from '../components/common/ActiveLink'

const Home = () => {
  return (
    <div>
      <ActiveLink href="/" activeClassName="bg-red-200"> // ルートが一致した時のstyle(active class)
        <a className="p-2">Home</a> // 共通のスタイル
      </ActiveLink>
      <ActiveLink href="/demo" activeClassName="bg-red-200">
        <a className="p-2">Demo</a>
      </ActiveLink>
      <ActiveLink href="/demo2" activeClassName="bg-red-200">
        <a className="p-2">Demo2</a>
      </ActiveLink>
    </div>
  )
}

export default Home

```

![next active class.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559347/839717ba-fb20-ce56-d492-60ad17ff1c1f.jpeg)

上記で作成した`ActiveLink.tsx`を使用します。
`activeClassName`にアクティブクラスを設定することができます。

## 参考
https://gist.github.com/remy/0dde38897d6d660f0b63867c2344fb59
UnityでOVR Playerが動かない場合

UnityでOculus向けVR開発を学んでいる途中で、ヘッドセット内で「問題なくビルドはでき、画面も見えるのに、コントローラーを押しても動かない」という状態になり、1週間ほどはまってしまいしました。

過去に参考にさせて頂いた以下の記事でも解決せず。
https://qiita.com/Ko-rin/items/6e18504081a6f39bd05d

なんとか解決したのでメモしておきます。

# 原因：Active Input Handlingの設定
原因はActive Input Handlingの設定でした。

「Input System Package（New）」になってしまっており、これを「Both」に変更したところ、無事に動きました。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/34650/91526755-63d2-1081-0e0f-c0b07d50e1ce.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/34650/ec6ebda4-40db-3dab-4c5f-2c47f00eb0ce.png)


Input Systemについては以下記事が参考になりました。
https://moon-bear.com/2020/08/20/unity-input-system/
sysutils/bsdstats インスコ→設定メモ

#何しよるん？
**マシンに関する匿名統計を報告するための月次スクリプト**
っま、インスコして統計に参加する単なる自己満足なヤツ

#インスコはぶち簡単
```text
# cd /usr/ports/sysutils/bsdstats/ && make install
===>  License BSD4CLAUSE accepted by the user
===>   bsdstats-7.0 depends on file: /usr/local/sbin/pkg - found
===> Fetching all distfiles required by bsdstats-7.0 for building
===>  Extracting for bsdstats-7.0
===>  Patching for bsdstats-7.0
===>  Configuring for bsdstats-7.0
===>  Staging for bsdstats-7.0
===>   Generating temporary packing list
/bin/mkdir -p /usr/ports/sysutils/bsdstats/work/stage/usr/local/etc/periodic/monthly
install  -m 555 /usr/ports/sysutils/bsdstats/work/300.statistics  /usr/ports/sysutils/bsdstats/work/stage/usr/local/etc/periodic/monthly
install  -m 555 /usr/ports/sysutils/bsdstats/work/bsdstats-send  /usr/ports/sysutils/bsdstats/work/stage/usr/local/bin/bsdstats-send
====> Compressing man pages (compress-man)
===> Staging rc.d startup script(s)
====> Running Q/A tests (stage-qa)
===>  Installing for bsdstats-7.0
===>  Checking if bsdstats is already installed
===>   Registering installation for bsdstats-7.0
Installing bsdstats-7.0...
You installed BSDstats: script reporting statistics about your machine.

To disable monthly reporting, add this line to /etc/periodic.conf:
        monthly_statistics_enable="NO"

To disable parts of reporting, add these lines to /etc/periodic.conf:
        monthly_statistics_report_devices="NO"
        monthly_statistics_report_ports="NO"

To limit which ports are being submitted:
        create /usr/local/etc/bsdstats.conf and list ports to report in
        the form ${category}/${portname}, one entry per line. It is also
        possible to use the special self explanatory keyword "all-ports".
Example:
        sysutils/bsdstats
        ports-mgmt/pkg

To enable reporting on bootup, add this line to /etc/rc.conf:
        bsdstats_enable="YES"

To run it manually any time:
        bsdstats-send

To view current statistics, go to:
        http://www.bsdstats.org/

You can build bsdstats with TOR port option to submit anonymously
```
これだけ(^_^)v

#野良 ports は統計に入れたくないよのぉ
インスコの最後にメッセージが出ちゃってるけ、その指示に沿ってファイルを作成するダケのお手軽さ👏
その際に、野良 ports のカテゴリと名前を書き入れるのじゃが現在インスコしよるのを表示させるワンライナーを実行して、そこから統計に参加させたくない野良 ports を探して書き入れちゃる。

```shell:/usr/local/etc/bsdstats.confに記述しよるports一覧するワンライナー
pkg info -ao | awk '{print$2}' | sort
```

#初回のおまじない
```shell
bsdstats-send
```
コレで、毎週勝手に[https://bsdstats.org/](https://bsdstats.org/)へ送信されて、統計に参加出来ちゃる。
JS~オブジェクトと参照~

#概要
JSには８つのデータ型があります。
７つのデータ型（プリミティブ型）これは、Number,string,Boolean,Null,Undefined,BigInt,Symbolがあります。
そしてもう１つはオブジェクトです。
プリミティブ型では、変数を直接代入しました。これに対しオブジェクトでは参照と言います。
この記事では参照について触れていきます。

#参照とは

```index.js
const menu = {
  name :'パンケーキ',
  price : '580円',
  set : '1000円' 
};

console.log(menu);
```
このmenuの中は１つの箱になります。箱の中には、一つ一つ名前が付けられた値が保存されています。
上記の例でいうと、nameと名前のついたパンケーキ。priceと名前のついた580円、setと名前がついた1000円です。
オブジェクトは内部にプロパティを持つデータの集合です。
変数に入れるのはデータの集合ではありません。
menuという内部データを見るためのパスワードです。これを参照と言います。
参照を代入する値をconstで宣言しているので書き換えはできないのではと考えます。
しかし、変数に代入するのはmenu(パスワード)であり、そこから先の{オブジェクト内}は定数では無いからです。
したがって、constで宣言しているにも関わらず値の書き換えができるということです。

#コード

上記の内容をコードにすると以下のようになります。

```index.js
console.log(menu); //{name: "パンケーキ", price: "580円", set: "1000円"}

const menu2 = menu; //参照の複製

menu2.price = '400円';　//複製でプロパティを書き換える

console.log(menu);

//{name: "パンケーキ", price: "400円", set: "1000円"}
```

#まとめ（擬人化）

独自の解釈でまとめます。
menuという家があります。
const = menu これはmenu家の鍵になります。
この鍵を使用してmenuという家に入ります。
menuという家には複数の人が出入りします。そこで、鍵の複製が必要になリます。その鍵を元にアクセスして値を書き換えることができるというわけです。
menuもmenu2も複製した鍵なので無効になることはなく、アクセスすることができます。


```index.js
const menu = {
  name :'パンケーキ',
  price : '580円',
  set : '1000円' 
};
console.log(menu);
//{name: "パンケーキ", price: "580円", set: "1000円"}

const menu2 = menu; //複製

menu2.price = '400円'; //書き換え

console.log(menu2); 
//{name: "パンケーキ", price: "400円", set: "1000円"
console.log(menu);
//{name: "パンケーキ", price: "400円", set: "1000円"}
```
「この接続ではプライバシーが保護されません」と 「Let's Encryptの更新エラー」


　ある日、ポートフォリオを作成していたサイトが突然開けなくなりました。
　SSLの設定に必要な*Let's Encrypt*で取得した証明書の期限が切れていたことに原因がありました。

![スクリーンショット 2021-05-02 3.56.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/807496/8d8c7b30-1c49-e3cb-a544-097574f7bb6a.png)


##　環境

・PC: Macbook Pro 2017
・OS: Big Sur 11.2.3
・Apache: 2.4.46
・AWS EC2 Amazon Linux 2

##　前提条件

・EC2にsshで接続できている
・EC2のセキュリティグループが作成できている
・SSLの設定に必要な証明書の発行を*Let's Encrypt*で行っている

##　解決までに行ったこと
1. ```su``` コマンドで *rootユーザに変更*
1. *Let's Encrypt* での証明書発行に必要な**Certbot**のアップデート
1. Appacheを停止する
1. 念の為```certbot renew --dry-run``` で証明書を更新

##　rootユーザに変更
　1. で記載してある通りです。パスワードはご自身のpcのパスワードになります。
　権限についての知見が少ないので、権限のエラーと見分けるために先にrootユーザーに変更しました。

##　Certbotのアップデート
　```yum -y --enablerepo=epel update certbot```
 
　このコマンドでアップデートできるようです。

##　Appacheを停止する
 ```systemctl stop httpd```

→Apacheを停止します。停止しないとポート80を解放しているのでエラーが起きます。

 ```service httpd status```

→activeの項目がinactiveになっているかを確認。

##　証明書を更新
--dry run はテストモード?のようなもの

```certbot renew --dry-run```

こちらが上手くいったら --dry run を外してからもう1度、実行してください。

```certbot renew ```


##　更新後


　Apacheを再起動します。

```systemctl restart httpd``` 

お疲れ様でした！これで、エラーが出たドメインを開けば表示されると思います！

## 　最後に 
　**cron** を設定すれば *証明書の自動更新*  ができるようです。

こちらは、**「let's encrypt 自動更新 cron」**などでググって頂ければわかりやすい説明がヒットすると思います。

下手くそな説明ですみません。もし間違っていたらご指摘して頂けると嬉しいです。

参考にさせて頂いた数々の記事に感謝します。


## 　参考にさせて頂いた記事
[2. Certbot アップデートに関して](https://qiita.com/goodevelop5323/items/bc3962a3c1234075d445)
[3. ポートの解放・編集に関して](https://www.acrovision.jp/service/aws/?p=1550)
[4,5. Certbot 新規発行・更新に関して](https://it-jog.com/khow/serv/renewletsencrypt)
[AWSによるサーバの構築からCertbotを自動更新にする一連の流れ関して](https://bluecode.io/basic/basic2/basic2-0/)
Raspberry Pi Picoでモータを動かす②（ユニポーラ2相,1-2相励磁）

[Raspberry Pi Picoでモータを動かす①（ユニポーラ１相励磁）](https://qiita.com/fmax/items/9e5e76d0718e28424fb5)でステッピングモータを1相励磁で動かしたが、1相励磁には以下の問題があり実はあまり使われない。

* トルク小
* 振動が発生しやすい

利点としては

* 消費電力（発熱）小

ということが挙げられるのだが、ステッピングモータはそんなに電力シビアじゃない使い方が主なので…。
という訳で2相励磁と1-2相励磁の登場となる。

# 2相励磁
### 特徴
* トルク大
* 振動が発生しづらい
* 消費電力大

分解能が要らんなら大体これ使ってればいいんじゃね？という制御方法
コード的には以下

```
from machine import Pin
import utime
IN1 = Pin(2, Pin.OUT)
IN2 = Pin(3, Pin.OUT)
IN3 = Pin(4, Pin.OUT)
IN4 = Pin(5, Pin.OUT)
wait_ms = 2
while True:
    # CW
    IN1.value(1)
    IN2.value(0)
    IN3.value(0)
    IN4.value(1)
    utime.sleep_ms(wait_ms)
    IN1.value(1)
    IN2.value(1)
    IN3.value(0)
    IN4.value(0)
    utime.sleep_ms(wait_ms)
    IN1.value(0)
    IN2.value(1)
    IN3.value(1)
    IN4.value(0)
    utime.sleep_ms(wait_ms)
    IN1.value(0)
    IN2.value(0)
    IN3.value(1)
    IN4.value(1)
    utime.sleep_ms(wait_ms)
```
なお、1相励磁のときは前のモータ28BYJ-48を手で無理やり止めることができたが、2相励磁では素手ではかなり難しいレベルでトルクが上がる。
（モータ破損覚悟の行動のため、真似しないで下さい）

# 1-2相励磁
### 特徴
* トルク中
* 振動が2相励磁より発生しづらい
* 消費電力中
* ステップ角分解能が倍になる（ハーフステップ）

1相と2相を混ぜて挙動がなめらかになるようにした制御方法。
分解能の向上や、なめらかになる=脱調しづらくなるため回転速度の限界ギリギリを攻めるならコレ。
と言っても最近ではそのような場合マイクロステップ（1/16や1/256など）を使うのが主流になりつつあり影が薄い。
注意すべきなのは**同じ速度を出そうとすると倍の処理が要る**ということ。マイコンに優しくない。

コードはこちら

```
from machine import Pin
import utime
IN1 = Pin(2, Pin.OUT)
IN2 = Pin(3, Pin.OUT)
IN3 = Pin(4, Pin.OUT)
IN4 = Pin(5, Pin.OUT)
wait_ms = 1
while True:
    # CW
    IN1.value(1)
    IN2.value(0)
    IN3.value(0)
    IN4.value(1)
    utime.sleep_ms(wait_ms)
    IN1.value(1)
    IN2.value(0)
    IN3.value(0)
    IN4.value(0)
    utime.sleep_ms(wait_ms)
    IN1.value(1)
    IN2.value(1)
    IN3.value(0)
    IN4.value(0)
    utime.sleep_ms(wait_ms)
    IN1.value(0)
    IN2.value(1)
    IN3.value(0)
    IN4.value(0)
    utime.sleep_ms(wait_ms)
    IN1.value(0)
    IN2.value(1)
    IN3.value(1)
    IN4.value(0)
    utime.sleep_ms(wait_ms)
    IN1.value(0)
    IN2.value(0)
    IN3.value(1)
    IN4.value(0)
    utime.sleep_ms(wait_ms)
    IN1.value(0)
    IN2.value(0)
    IN3.value(1)
    IN4.value(1)
    utime.sleep_ms(wait_ms)
    IN1.value(0)
    IN2.value(0)
    IN3.value(0)
    IN4.value(1)
    utime.sleep_ms(wait_ms)
```

速度が半分になっているのでwait_ms=1としている。
トルクは無理やり手で止められるレベルに収まる。

とりあえずマイコン制御なら2相励磁にして、分解能や速度を求めるならば専用のドライバIC使うのが吉だと思う。
CalculiX for Windowsのインストール

# Windowsで実行可能なCalculiXを入手

Convergent Mechanical社によってWindows用にビルトされたCalculiXをインストールします。

[bConverged CalculiX for Windows](http://www.bconverged.com/download.php)の[現行版](http://www.bconverged.com/data/content/CalculiX_2_10_win_002.zipl)を入手します。

![2021-05-02-09-11-06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201403/735e3a06-91d1-0712-8e38-d5fa8abf48e5.png)

# ダウンロードしたファイルを展開

ダウンロードした「CalculiX_2_10_win_002.zip」を任意のフォルダーに展開します。

展開した「CalculiX_2_10_win_002.exe」をダブルクリックします。

![2021-05-01-22-19-24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201403/a5fa0338-7348-26a7-8047-ffff95b2d9d2.png)

# インストール時の注意事項を確認

「I Agree」をクリックします。

![2021-05-01-22-20-47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201403/da818c97-c093-e0d3-0219-84b3519e1825.png)

# インストールフォルダーを選択

インストールフォルダーを選択し、「Next >」をクリックします。
（ここではデフォルト設定のフォルダーのまま進めます。）

![2021-05-01-22-21-28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201403/f816d4ca-853c-28e6-b956-cb1872468b02.png)

# インストールするコンポーネントを選択

インストールするコンポーネントを選択します。
（ここではデフォルト設定のまま進めます。）

![2021-05-01-22-27-22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201403/feba8b97-2c2c-b2c6-5247-7017c0e9f570.png)

# 作業フォルダーを選択

作業フォルダーを選択し、「OK」をクリックします。

![2021-05-01-22-28-19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201403/a267e37c-ae8e-becf-4a0b-94113bc83217.png)

# インストール作業を完了

インストール作業が完了してから、「Finish」をクリックします。

![2021-05-01-22-29-09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201403/3cc8d25c-d438-a979-da28-d35b94da26b8.png)

以上でインストール作業は完了です。
WSL2でHomebrewとFish shellを使おう

# はじめに
sudoやらなきゃいけないaptが嫌いになってきたので楽ちんなHomebrewを使いたくなりました。

fish?
前から使っていたからですね^^
あんまりいじるところがないまま満足しているので正直zshよりもこっちのほうが好きです。
研究関連はなんかいじるの怖すぎてzsh使ってるんですけどね。。。

# まずやること
準備です。
なんでやるかはよくわかんなかったです！！

```bash:bash
$ sudo apt update
$ sudo apt upgrade
$ sudo apt install build-essential
```

# Homebrewをいれよう
一番の目的のHomebrewです。

```bash:bash
$ sh -c "$(curl -fsSL https://raw.githubusercontent.com/Linuxbrew/install/master/install.sh)"
$ echo 'export PATH="/home/linubrew/.linuxbrew/bin:$PATH"' >> ~/.bashrc
$ . ~/.bashrc

$ brew doctor
Your system is ready to brew.
```

`brew doctor`でなんか言われたらその通りに実行してあげてください。
`Your system is ready to brew.`と言われたら勝ちです。

# fishをいれよう

```bash:bash
$ brew install fish
$ fish -v
fish, version 3.2.2

$ which fish
/home/linuxbrew/.linuxbrew/bin/fish

$ sudo sh -c "echo /home/linuxbrew/.linuxbrew/bin/fish >> /etc/shells"
$ chsh -s /home/linuxbrew/.linuxbrew/bin/fish
```

再起動して`Welcome to fish`とか出てたらOK

# fishで使うプラグインの紹介
プラグインマネージャーは`fisher`を使っています。
テーマは`agnoster`です。
`Powerline`というフォントをインストールし忘れないように！！(Source Code Proを使ってます)

プラグインは以下の通りになっています。
- `z` (ディレクトリ移動が楽すぎる)
- `fzf` (あいまい検索が思ったよりも使いやすかったのでpecoよりもfzfです！)
- `ghq` (gitの管理が楽になりました)

そのほかには`exa`はいれたほうがいいですよ，おすすめです。


# 感想
思ったよりも簡単でした。
ここよりも雑に作りすぎたdotfilesの移行のほうが大変そうですがそれはまた別のお話ですね ;(

ちなみに`fish_config`ができないことがあるんですけどなんなんですかね。。。
私の持ち運び用のSurfaceだとできないんですよね～

# 参考
- [WSL → Linuxbrew → fish → fisher → VSCode](https://qiita.com/noanoamn/items/508a6f51a6b1cc4ef46c)
- [【小ネタ】Windows10のWSLでbrewコマンドを使う](https://dev.classmethod.jp/articles/windows10_wsl_brew)
macOSのSwiftアプリをPKG化、DMG化してみよう

## 更新履歴
2021/5/13 参考文献の追加
内容: [Mac用Installerの作り方](https://qiita.com/ioue/items/9d1681286c50f8e7e98d)
2021/5/10 DMG化のコマンドを修正
内容: -format UDZOは、指定しなくてもデフォルトでUDZOのため削除

##  我のPCスペック
macOS Catalina

```shell
uname -v
# Darwin Kernel Version 19.6.0....RELEASE_X86_64
```

## PKG化

1. XcodeでSwiftアプリプロジェクトを作成し、リリースビルドまで行う。(DerivedDataをプロジェクトディレクトリ内に出力できる様に設定しておくと楽)
2. プロジェクトフォルダ直下にbuildフォルダを作成し、`DerivedData/[プロジェクト名]/Build/Products/Release/`にあるappファイルをコピー
3. プロジェクトフォルダ直下で、下記コマンドを実行し、.plistファイルを作成

    ```shell
    pkgbuild --analyze --root ./build [任意の名前 ].plist
    ```
4. 生成されたplistを開き、`BundlesRelocatable`を`<false/>`にする。[1]
5. プロジェクトフォルダ直下で、下記コマンドを実行し、.pkgファイルを生成。(公開用pkgではないらしい)

    ```shell
    pkgbuild --root ./build --component-plist [3.で生成した.plistファイル ] --identifier [アプリの識別子(ex: jp.co.hogeo) ] --version 0 --install-location /Applications [任意の名前 ].pkg
    ```

5. プロジェクトフォルダ直下で、下記コマンドを実行し、Distribution.xmlファイルを生成。

    ```shell
    productbuild --synthesize --package [「5.」のPKGファイル ] Distribution.xml
    ```

6. Distribution.xmlを開き、`<pkg-ref>...</pkg-ref>`の下に下記を追記。

    ```xml
    <title>[任意のタイトル]</title>
    ```
(もし、よくある企業ロゴをインストーラーに表記させたい場合は、上記に加え、下記を追記する。pngファイルは、Resourcesフォルダをプロジェクトフォルダ直下に配置し、その中においておく。)

    ```xml
    <background file="hoge-logo.png" alignment="bottomleft" mime-type="image/png"/>
    ```

7. プロジェクトフォルダ直下で、下記コマンドを実行し、公開用PKGを生成する。

    ```shell
    productbuild --distribution [「6.」のxmlファイル ] --resources [xmlファイルで追記したpngファイル入れたフォルダ ] --package-path . ./[任意の名前].pkg
    ```

8. Developer ID証明書の署名(いる人は)

    ```shell
    productsign  --sign "Developer ID Installer: xxxx Inc."  [「8.」のPKGファイル] [任意の名前].pkg
    ```

## DMG化
1. プロジェクトフォルダ直下にdmg-resourceフォルダを作成し、その中にREAD_ME.txtや上記で作成した署名PKG(又は未署名PKG)を入れる。
2. プロジェクトフォルダ直下で、下記コマンドを実行し、DMGファイルを生成する。

```shell
hdiutil create -srcfolder [「1.」のフォルダ] -fs HFS+ -volname [dmgをマウントした時にシステム側で出る名前] [任意の名前].dmg
```

## 最終フォルダ構成

```text
[test-hello-world_ProjectFolder]
   |
   |-- test-hello-world.xcodeproj
   |-- test-hello-world/
   |-- test-hello-worldTests/
   |-- test-hello-worldUITests/
   |-- DerivedData/
   |-- build/
   |-- Resources/
   |-- dmg-resources/
   |-- TestHelloWorld.plist
   |-- Distribution.xml
   |-- TestHelloWorld.pkg
   |-- Test-Hello-World-Release.pkg
   |-- test_hello_world.dmg
```

## 参考文献

[1][pkgbuildでインストーラ(.pkg)作ったけどあれ上手くアプリがインストールされないなーって時にはBundleIsRelocatableがfalseになっているかチェックしましょう](https://qiita.com/r9y9/items/6ce987ff34d1e2b8e06e)

[Mac package installer installs the folder “Contents” in /Applications instead of the bundle](https://apple.stackexchange.com/questions/176653/mac-package-installer-installs-the-folder-contents-in-applications-instead-of#)

[Mac用Installerの作り方](https://qiita.com/ioue/items/9d1681286c50f8e7e98d)

[macOSのインストーラーを作成するには](https://www.clear-code.com/blog/2020/9/8.html)

[hdiutilの使い方](https://qz.tsugumi.org/usage_hdiutil.html)

[Developer IDで署名したインストーラーパッケージを作る](https://genjiapp.com/blog/2015/05/27/making-developer-id-installer.html)

[Mac用Installerの作り方](https://qiita.com/ioue/items/9d1681286c50f8e7e98d)
GASでちょっとしたデータを保存したい場合の対処法 ~PropertiesServiceを利用する~

WEBサービスでいうCookieやローカルストレージのように、GASでちょっとしたデータを保存したいことがある。
そんなときに`PropertiesService`が利用できる。

# 利用方法

```javascript

# データの保存
## 単一のk-vペアで保存
PropertiesService.getDocumentProperties().setProperty("key", "value")

## オブジェクトまとめて保存
PropertiesService.getDocumentProperties().setProperties({ 
  "key1", "value1",
  "key2", "value2"
})


# データの取得
## 単一のk-vペアで取得 
PropertiesService.getDocumentProperties().getProperty("key")

## オブジェクトまとめて取得
PropertiesService.getDocumentProperties().getProperties()
```

# スコープ

`PropertiesService`のうちどのメソッドを用いるかで、ドキュメントの保存/利用のスコープを変更できる。
利用できるメソッドは以下３種類

- `getDocumentProperties()`
    - ドキュメント（spreadsheetやform)にアクセスした全てのユーザーがアクセスできる
- `getScriptProperties()`
    - ドキュメント（spreadsheetやform)にアクセスした全てのユーザーがアクセスできるが、GASスクリプトからのみ利用可能
- `getUserProperties()`
    - ドキュメント（spreadsheetやform)にアクセスしたcurrentUserのみアクセスできる
   

以下のように使う

```javascript
# getUserPropertiesを使う場合
PropertiesService.getDocumentProperties().setProperty("key", "value")

PropertiesService.getUserProperties().getProperty("key")
```

# 注意

全てのデータはstring型で保存される。
Goodby CSVライブラリのパース時のエラー

##はじめに
LaravelでCSVインポートし、DB登録する処理を実装するために、Goodby CSVライブラリを
インストールし、いざ実装したところ、以下のようなエラーが出てしまった。

```
Column size should be 7, but 6 columns given
```

## エラー解決方法
CSVファイルの中身を確認したところ、列数が通常だと7列あるべきところ、6列となっている
ところがあったため、エラーが返ってきたようだ。
[github](https://github.com/goodby/csv)にもしっかり書かれていました。英語読めるようになりたい、、、

### 解決方法①
unstrict()を追加すると厳密な列数のチェックが行われないようになる。

```php:
$interpreter = new Interpreter();
$interpreter->unstrict();    //追加
```

### 解決方法②
例外を投げる。こちらの方法のほうがより現実的？

```php:
use Goodby\CSV\Import\Standard\Exception\StrictViolationException

~省略~

try {
    $lexer->parse($tmpPath, $interpreter);
} catch (StrictViolationException $e) {
    // 例外処理を書く
}
```

## 参考
[https://github.com/goodby/csv](https://github.com/goodby/csv)
ネットワークACLとセキュリティグループの違い

## 勉強前イメージ

ネットワークACLはVPC？サブネット？で制御して、
セキュリティグループはEC2で制御するイメージ

## 調査

### 違い

- 適応場所
	- ネットワークACL : サブネット
	- セキュリティグループ : EC2インスタンス

- 制御されるタイミング
	- ネットワークACL : 通信の往復、両方に適応される (これをステートレスという)
	- セキュリティグループ : 往路のみで、復路は動的に開放 (これをステートフルという)

以下ネットワークACLの往復のイメージ図
![1# ネットワークACLとセキュリティグループの違い - diagrams.net - Google.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/67b3fca3-28ef-b570-aec0-b9f90958e755.png)


以下セキュリティグループの往路のみのイメージ図
![2# ネットワークACLとセキュリティグループの違い - diagrams.net - Google.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/68551090-d8ba-8e3a-891e-32941200ce99.png)


- ルールの方法
	- ネットワークACL : 許可のみ指定できる
	- セキュリティグループ : 許可と拒否を指定できる

- 同一サブネット内の通信制御
	- ネットワークACL : できない
	- セキュリティグループ : できる

## 勉強後イメージ

結構どちらもきちんと設定！！より、
セキュリティグループで細かく制御して、ネットワークACLで大まかに制御みたいなのをよく見る気がする

## 参考

- [なぜネットワークACLでなくセキュリティグループで細かいトラフィック制御を行なうのか](https://dev.classmethod.jp/articles/why-i-prefer-sg-to-nacl/)
- [【図解/AWS】ネットワークACLとセキュリティグループの違いと優先度、復路の制御について〜](https://milestone-of-se.nesuke.com/sv-advanced/aws/network-acl-and-security-group/)
オブジェクト指向とは

オブジェクト指向のメリット
-

役割ごとにオブジェクトを分けることで、実装がしやすくなる。
役割ごとにオブジェクトを分けることで、あとからコードを改変するときも、他のオブジェクトに影響しなくなる（コードの改変がしやすくなる）

オブジェクトとは、Rubyにおけるクラスやインスタンス、その他の値のことを意味します。例えば、文字列や数値、配列やハッシュなど、これまで値と呼んできたものも全てオブジェクトです。この他にも、Rubyでは様々な便利な特徴を持ったオブジェクトが用意されていて、組み込みライブラリという形やGemという形で使用できます。
クラスに含まれる値や処理のまとまり（= オブジェクト）を意識しながら、実装することが**オブジェクト指向**です。



オブジェクト指向はあくまで設計思想の1つ
-

オブジェクトを綺麗に切り分けなくてもとりあえず動くアプリケーションは完成してしまった
最初のアプリケーション設計から仕様変更が生じて、オブジェクトの切り分けを見直す必要がでてきてしまった
AさんとBさんの考えるアプリケーション設計が異なる
ということはよくあります。

オブジェクト指向を意識しないデメリット
-

オブジェクト内にさまざまな役割が入り組んでいて、どこに何があるのかわからない
1つの機能を変えた途端、その変更とは関係のないはずの機能が動かなくなってしまった
このような問題が生じるコードは、複雑に絡み合うことから「スパゲッティコード」と呼ばれます。

Ruby on Railsにおけるオブジェクト指向
-

######オブジェクトとして存在することは、オブジェクト指向に従えば 「ある役割」 をそれぞれ持っている事になる。
【Ruby on Rails】お気に入り済みを一覧表示する

## 目的
お気に入り済みの商品を一覧表示する機能を実装する

## 前提条件
- 既にお気に入り機能を実装済みであること
- itemsテーブル（商品情報）、usersテーブル（ユーザー情報）、bookmarksテーブル（お気に入り情報）が存在すること。
- 各テーブルとアソシエーションが組まれていること


## 手順
1.ルーティングのネスト
2.Usersコントローラーを定義
3.お気に入り済みをビューファイルに表示


### 1.ルーティングのネスト
ユーザーがお気に入りをした商品を表示するために、usersコントローラーにbookmarksコントローラーをネスト（入れ子構造）します。

```ruby:routes.rb
resources :users, only: [:show] do 
    get :bookmarks, on: :collection 
  end
```

## 2.Usersコントローラーを定義
Bookmarkモデルからwhereメソッドとpluckメソッドを使い現在ログイン中のuser_idとitem_idを引き出してbookmarksに代入します。
Itemモデルの引数に先ほど定義したbookmarksを指定して、インスタンス変数@bookmark_listに代入します。

```ruby:users_controller.rb
def show
    @user = User.find(params[:id])
    @items = @user.items

    bookmarks = Bookmark.where(user_id: current_user.id).pluck(:item_id)
    @bookmark_list = Item.find(bookmarks)
```
pluckの補足情報
https://railsdoc.com/page/model_pluck

## 3.お気に入り済みをビューファイルに表示
ユーザーのマイページにusersコントローラーで定義した@bookmark_listを使用して、お気に入りした商品を表示していきます。
if文とpresent?メソッドを使い、@bookmark_listにデータが保存されている場合に実行する様にします。
今回は商品の名前と画像を表示するように記述しました。

```ruby:users/show.html.erb
<% if @bookmark_list.present? %>
  <% @bookmark_list.each do |item| %>
    <%= item.name %>
    <%= image_tag item.image%>
    <% end %>
<% end %>
```

### さいごに
お気に入り一覧表示機能を実装出来たので投稿しました。
最後まで読んで頂きありがとうございます。
VMware Workstation Pro 16の最適化、高速化

# VMware Workstation つかってますか？
Hyper-Vを使用したいのですが、AMD製CPUを使用しているのでちょっとだけ制約があり最近は、VMware Workstation Pro 16を小型PCにいれて使ってます。便利ですね。

Vagrant ＋ VirtualBox でもよかったのですが、折角なので VMware を使って運用することにしてみました。若干の問題はあるも結果的に納得しつつ運用しています。

## 推奨スペック
SSDと多少メモリを必要とするも最近のPCであればほぼ問題ないですが、スロットに空きがあると全部埋めたい・・・漢のロマンですよね～

## 仮想マシン（ゲストOS）を作成するとき
デフォルトで仮想マシンを作成する再に気をつける必要があるのは、下記２点。これだけでも大分ちがってくるので初期に作成するときは留意しておいたほうがいい。

① ホストOSがインストールされているデバイスとは違うデバイスを指定する。
② ハードディスクを追加するとき `単一ファイル` にする。

特に①はトラブル時にも有用だと思う（実体験）。
②については `全ディスク容量を割り当て`の方が良いに決まっているが、SSD(M2)にしていれば、特にこだわりなくてもいいと思う（コスト高いし）。

## チューニングが必要
デフォルトで作成したゲストOSの設定で一番気になる点が「仮想マシンのメモリはホストOSのファイルに確保される」これSSDにストレス与えるし良くないのでチューニングしてみる。ほかにも設定した方がよい項目もあるのでついでに設定を見直す。

① 対象のゲストOSを停止する。
② vmdk ファイルがあるディレクトリ先の `vmxファイル` をコピーする。
③ `vmxファイル` をメモ帳などのテキストエディタで開き下記を追加する。

| パラメータ | 設定内容 |
|:-----------|:------------|
| mainMem.useNamedFile = "FALSE" | メモリファイルの停止（物理メモリを使用） |
| MemTrimRate = "0" | 物理メモリ解放の抑制（解放しない） |
| sched.mem.pshare.enable = "FALSE" | ページ共有機能の無効化 |
| prefvmx.useRecommendedLockedMemSize = "TRUE" | メモリ容量固定の有効化 |
| MemAllowAutoScaleDown = "FALSE" | ゲストOSメモリサイズ自動調整の無効化 |

④ ゲストOSを起動する。早くなっているのがわかる。

## トラブル？解決しない問題
`ThinkCentre M75q Tiny Gen2` の個体独特なのか有線LANをIP固定にするとLANが見えなくなる現象に悩まされています。しかも常に発生する訳でなく不定期に襲ってくる…。とりあえずLenovoに問い合わせても？？との回答だし、２台目を買ってみても同じ現象なのです。
とりあえずゲストOSの優先LANをDHCP化していれば問題は発生しないのでとりあえずそれで運用しています（前のTinyはこの現象、発生していないんですよね）。

# 仮想化プラットフォーム
本格的に仮想化をするなら ['Windows Server 2019'](https://www.microsoft.com/ja-jp/windows-server) か ['VMware vSphere'](https://licensecounter.jp/vmware/products/vsphere.html) あたりを導入すべきなのでしょうが、家庭内またはSOHOならフリーの Proxmox VE(以下PVE) がよさそう。最近のPVEは安定してきているのでお勧めともあるので今度遊べるPCができたら入れてみる予定。

・[お家で始める仮想化環境 Proxmox VE 環境構築編](https://blog.nishi.network/2020/08/12/proxmox-part1/)
・[Proxmox VE 6.1をインストールしてみた](https://fefcc.net/archives/1007)

# VMware Workstation 使ってみて
VMware Workstation Pro 16 軽くていいですね。それと昔より価格が安くなっているように思えますし商用利用もできるのでいいですね。これ。あとなんだかんだ言っても普段使いのPCのほかに、ホストOS以外にもWindowsが使えるのは嬉しい（普段使いのPC、買い替えたときとか壊れたとき非常用があるっていう意味でね）。

コロナ過もあってVDI/RDP経由で作業しているので慣れましたね。前は物理マシンがあった方がいい考えだったのですが、汚れていないWindowsを簡単にパワフルに使えるのは気持ちいいですね。

# 参考リンク
・[VMware の最適化、高速化](https://pmp-style.hatenablog.com/entry/2019/08/16/192233)
・[VMware Player 上の仮想OSを高速化させ軽快に作動させるチューニング](https://freesoft.tvbok.com/freesoft/virtual/vmware_tuning.html)
・[VMware Playerの仮想マシンを軽快に動作させる](https://neoblog.itniti.net/vmware-virtual-machine-nimble/)

・[家庭での仮想デスクトップ環境(VDI)を考える](https://yujilow1220.github.io/2014-06-17/virtual-desktop-infrastructure/)
・[お家で始める仮想化環境 Proxmox VE 環境構築編](https://blog.nishi.network/2020/08/12/proxmox-part1/)
AtCoder解法メモ作成の支援（問題文のスクレイピング）

## 動機
- AtCoderの問題を解いたあとにメモを残す際に問題文を併記したい
    - URLを貼る形式だと，問題文の確認にひと手間かかってしまうので
- 問題文の単純なコピペではフォーマットが崩れてしまうので，なんとかしたい

## やったこと
スクレイピングによって問題文を自動取得してマークダウンファイルに保存するコードを書いた。不完全なコードだがそれなりに実用に耐えそうなので，運用しつつ頃合いをみて改修していくつもり。

コードは[GitHub](https://github.com/koshka-tsu/AtCoder/blob/main/get_problem_md.py)に置いた。

## Prerequisites
- python 3.6+
- BeautifulSoup4
- markdownify

## Usage
ファイル名: `get_problem_md.py`

**単一の問題を取得する場合（例: ABC199のA問題 など）**

- 問題文のurlを引数として与えて実行する

``` python
python get_problem_md.py https://atcoder.jp/contests/abc199/tasks/abc199_a
```

**複数の問題を取得する場合（例: ABC199のA問題からF問題まで など）**

- 対象コンテストのいずれかの問題文のurlを引数として与える

- `-r (--range)`で範囲を以下のように指定する
    - 例: `-r abdf` (A, B, D, F問題を取得)
    - 例: `-r a-d` (AからD問題までを取得)
        - この指定法は`a-d`と`a-f`のみ対応

```python
python get_problem_md.py https://atcoder.jp/contests/abc199/tasks/abc199_a -r a-f
```

**カレントディレクトリ以外にmdファイルを保存する場合**

- `-d (--dir)`で指定する:  
    - 例: `-d ./hoge`

## 出力の例
[ZONeエナジー プログラミングコンテスト “HELLO SPACE”: A - UFO襲来](https://atcoder.jp/contests/zone2021/tasks/zone2021_a)

出力例の引用始まり

---

# A - UFO Invasion 
## URL: https://atcoder.jp/contests/zone2021/tasks/zone2021_a 

配点 : 100 点




### ストーリー

俺はマーフィ。プログラミングコンテストが趣味の MAD HACKER だ。  

ある晩、コンテストサイトでいつものように MAD な超絶解答を提出しようとしていたら、街の上空に巨大な UFO が現れた。
突然の事態に世界中は大混乱。楽しみにしていたプロコンも即中止になってしまった。  

それから 1 週間、UFO は解読不能のメッセージを発信しながら空中に鎮座している。
俺は、レーティングを上げるせっかくのチャンスが奪われた怒りに震え上がっていた。  

あの UFO... 絶対ハックしてやるぜ。  

まずは頭を働かせるため、俺はありったけの ZONe を買いに行くことにした。






### 問題文

長さ 12 の文字列 S が与えられます。S の中に ZONe という文字列は (連続する部分文字列として) いくつ含まれるでしょうか？






### 制約



* S は英字からなる長さ 12 の文字列









### 入力

入力は以下の形式で標準入力から与えられる。



``` 
S
``` 





### 出力

答えを出力せよ。








### 入力例 1


``` 
abcdZONefghi
``` 





### 出力例 1


``` 
1
``` 

S の 5 文字目から 8 文字目までが ZONe となっています。







### 入力例 2


``` 
ZONeZONeZONe
``` 





### 出力例 2


``` 
3
``` 






### 入力例 3


``` 
helloAtZoner
``` 





### 出力例 3


``` 
0
``` 

S の 8 文字目から 11 文字目までが Zone となっていますが、これは ZONe ではありません。

--- 

出力例の引用終わり

## 今後やりたいこと
- 空白行の除去 (マークダウンでは複数(n>2)の空白行は無視されるので問題はないが)
- 数式への対応
[BigQuery]配列間での和/積集合をとってくるUDF

# やりたきこと
２つarrayがあったときに、そのarray間での共通(積)の要素の集合or両方の要素(和)の集合をとってきたい
集合という型はないので配列の中身をユニークにすることで対応

# SQLサンプル

```
CREATE TEMPORARY FUNCTION array_and(array1 ARRAY<STRING>, array2 ARRAY<STRING>)
  RETURNS ARRAY<STRING> AS ((
    SELECT 
     ARRAY_AGG(DISTINCT a1)
    FROM
       (
        SELECT
            a1
        FROM
            UNNEST(array1) as a1,UNNEST(array2) as a2
        WHERE 
            a1=a2
        )
));


CREATE TEMPORARY FUNCTION array_or(array1 ARRAY<STRING>, array2 ARRAY<STRING>)
  RETURNS ARRAY<STRING> AS ((
    SELECT 
     ARRAY_AGG(DISTINCT(a))
    FROM
       (
        SELECT
            a1 as a
        FROM
            UNNEST(array1) as a1
        UNION ALL
        SELECT 
            a2 as a
        FROM
            UNNEST(array2) as a2
        )
));

SELECT 
    # andの例
    array_and(["a", "b","c"],["a"]) as a,
    array_and(["a", "b","c"],["a","b"]) as ab,
    array_and(["b","c"],["b","c","d"]) as bc,
    array_and(["a", "b","c"],["d","e"]) as na_1,
    array_and(["a", "b","c"],[]) as na_2,
    # orの例
    array_or(["a","b","c"],["a"]) as abc,
    array_or(["a","c"],[]) as ac,
    array_or(["b","c"],["b","c","d"]) as bcd,
    array_or(["a", "b","c"],["d","e"]) as abcde
```

配列の型を定義しないと動かないのでstringを指定しているが、他の型でも動く
JupyterLabをサクっと起動するバッチファイル

#はじめに
Windowsであるが、毎回コマンドラインプロンプトを開いてconda activateをして...というのが面倒なので作ってみた


#ソース
こんな感じ

```JupyterRun.bat
call conda activate <仮想環境名>
jupyter lab
```

これをファイルに保存してダブルクリックすれば起動する。