OmniAICreator/Qiita-1.07M huggingface dataset:
AWS EC2 EBSボリューム増設手順


#概要

ボリューム増設、GUIでボタン押すだけだろうと思ったら違ったので手順メモ

##GUI作業
GUIからボリューム増設実施

###EC2からボリューム選択
![volume1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532885/469a3744-d95e-ce3e-01ba-6b6febfcf3a5.png)

###増設したいボリュームを選択し「ボリュームの変更」を押下
![volume2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532885/66e3af45-dcca-7cc9-de06-a009250aeece.png)

###ボリュームの変更で変更したいサイズを選択して変更
**※【注意】一度増やすと減らすことはできません。**
・増設にはある程度時間がかかります。
![volume3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532885/1035764d-ffd1-be78-6f8c-9a5d4a09a49b.png)

##CUI作業
SSH接続して下記コマンドを実行

###lsblk && df -h
・ボリューム状態の確認

```shell:コマンド
    # ボリューム増加しているがファイルシステムは変更していないことを確認
    $ lsblk && df -h
    NAME    MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
    xvda    202:0    0  16G  0 disk
    └─xvda1 202:1    0   8G  0 part /
    Filesystem      Size  Used Avail Use% Mounted on
    /dev/xvda1      8.0G  1.0G  7.0G  13% /
```

###sudo growpart /dev/xvda 1
・ファイルシステム拡張
※拡張後にlsblkで拡張確認する

```shell:コマンド
    # 拡張実行
    $ sudo growpart /dev/xvda 1
    CHANGED: partition=1 start=4096 old: size=16773087 end=16777183 new: size=33550303,end=33554399
```

###パーティション拡張（2パターン）
※一部OSではresize2fsが使えない場合がある

```shell:コマンド
    # パーティション拡張１
    $ sudo resize2fs /dev/xvda1
    
    # パーティション拡張２
    $ sudo xfs_growfs /dev/xvda1
```

###lsblk && df -h
・変更を確認

```shell:コマンド
    $ lsblk && df -h
    NAME    MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
    xvda    202:0    0  16G  0 disk
    └─xvda1 202:1    0  16G  0 part /
    Filesystem      Size  Used Avail Use% Mounted on
    /dev/xvda1       16G  1.0G   15G  7% /
```

完了

##参考リンク

[【amazon公式】EBSボリューム](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ebs-volumes.html)

[【amazon公式】EBS ボリュームのサイズ、パフォーマンス、またはタイプの変更](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ebs-modify-volume.html)

[【amazon公式】ボリュームサイズ変更後の Linux ファイルシステムの拡張](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/recognize-expanded-volume-linux.html)

[【遂に来た！】EBS でボリュームサイズを変更できるようになりました](https://dev.classmethod.jp/cloud/aws/release-change-ebs-volume-size/)

[EBSボリューム変更方法](https://qiita.com/mangano-ito/items/629b10ea5d1ab80f2cc6)
ts-node で Optional Chaining コンパイルエラー解決法

## Optional Chaining とは
**TypeScript 3.7** から導入される新機能で、`?.`という新しい構文です。より簡潔なコードが書けます。


```typescript:従来の方法
// データ取得
if (adventurer.dog) {
  console.log(adventurer.dog.name);
}

// 関数実行
adventurer.someNonExistentMethod & adventurer.someNonExistentMethod();
```

```typescript:Optional-Chaining
// データ取得
console.log(adventurer.dog?.name);
// expected output: undefined

// 関数実行
console.log(adventurer.someNonExistentMethod?.())
// expected output: undefined
```

## ts-nodeで実行すると...
```
return this.agent.context?.contexts[name]?.parameters[key];
                         ^
SyntaxError: Unexpected token '.'
    at Module._compile (internal/modules/cjs/loader.js:892:18)
    at Module.m._compile (C:\Project\VirtualAssitant\dxc\backend\node_modules\ts-node\src\index.ts:814:23)
    at Module._extensions..js (internal/modules/cjs/loader.js:973:10)
    at Object.require.extensions.<computed> [as .ts] (C:\Project\VirtualAssitant\dxc\backend\node_modules\ts-node\src\index.ts:817:12)
    at Module.load (internal/modules/cjs/loader.js:812:32)
    at Function.Module._load (internal/modules/cjs/loader.js:724:14)
    at Module.require (internal/modules/cjs/loader.js:849:19)
    at require (internal/modules/cjs/helpers.js:74:18)
    at Object.<anonymous> (C:\Project\VirtualAssitant\dxc\backend\src\fulfillment\index.ts:4:1)
    at Module._compile (internal/modules/cjs/loader.js:956:30)
```

## 解決方法

### Webpack使う場合
`@babel/plugin-proposal-optional-chaining` プラグインをインスタンスする

```typescript:webpack.config

const configs: Configuration = {
  ...
  module: {
    rules: [
      {
        test: /\.(tsx|ts)$/,
        exclude: /node_modules/,
        use: [
          {
            loader: 'babel-loader',
            options: {
              plugins: ['@babel/plugin-proposal-optional-chaining']
            }
          },
          {
            loader: 'ts-loader',
            options: {
              transpileOnly: true,
              happyPackMode: true
            }
          }
        ]
      },
  },
  ...
};
```

### Webpack以外の場合
`tsconfig.json`の`target`を`ES2018`に修正する

```json:tsconfig.json
{
  "compilerOptions": {
    "target": "ES2018" 
    ...
  },
  ...
}
```

### それでも解決できない場合
`typescript`や`ts-node`などのライブラリバージョンアップをおすすめです。
VuePress の regularPath と path の違い



|プロパティ|説明|
|:--|:--|
|`this.$page.regularPath`|ファイルへのそのままパス|
|`this.$page.path`|`this.$page.frontmatter.permalink` を使用して、もし無ければ`this.$page.regularPath` を使用する。|




## 背景

`this.$page` 配下に `regularPath` と `path` があって、違いがよくわからなかったので調べました。

```js
{
  "title": "Global Computed",
  "frontmatter": {},
  "regularPath": "/guide/global-computed.html", // <--- これと...
  "key": "v-d4cbeb69eff3d",
  "path": "/guide/global-computed.html",        // <--- これ
  "headers": [
    {
      "level": 2,
      "title": "$site",
      "slug": "site"
    },
    {
      "level": 2,
      "title": "$page",
      "slug": "$page"
    },
    ...
  ]
}
```

* [$page < Global Computed < VuePress](https://vuepress.vuejs.org/guide/global-computed.html#page)


## regularPath

> `$page.regularPath` への参照
> Access: `$page.regularPath`
>
> ディレクトリ構造によって生成された URL に基づく現在のページ
> The current page is based on the URL generated by the directory structure.
>
> ビルド期間中に動的にルートを生成するとき、ページのURL（ `$page.path`）は最初に` $page.frontmatter.permalink`を使用し、存在しない場合は `$page.regularPath` を使用します。
> When dynamically generating routes during the build period, a page’s URL (`$page.path`) will use `$page.frontmatter.permalink` first, and if it doesn’t exist, it will be downgraded to `$page.regularPath`.


* [regularPath < Glossary < VuePress](https://vuepress.vuejs.org/miscellaneous/glossary.html#regularpath)


## permalink

ファイル名とは別に frontmatter に permalink を設定できるらしい。

* [Permalink < VuePress](https://vuepress.vuejs.org/guide/permalinks.html#permalinks)
React Nativeを書いててCSSの設計についてすごく考えたときの小話

# React Nativeを書いててCSSの設計についてすごく考えたときの小話

HTML5 を書いているみなさんは、以下のようなコンポーネントがあったときにフォントサイズをどこに定義しますか？

```html
<li>
  <a href="/home">home</a>
  <a href="/about">about</a>
  <a href="http://google.co.jp/">google</a>
</li>
```

継承したらいいので `li` に書くぜ :raised_hand: :raised_hand: :raised_hand: :raised_hand: 

```css
li {
    font-size: 20px;
}
```

文字列のすぐ上の要素の `a` に書くぜ :hand_splayed: :hand_splayed: :hand_splayed: :hand_splayed: 

```css
a {
    font-size: 20px;
}
```

さてReact Nativeではどう書くのでしょうか。それを見ていきます。


## 環境構築

ここを参考に構築しました。React Native for WEB
[react-native-web を試す](https://qiita.com/propella/items/4cfd01506c72dc3d63ea)


```shell
# プロジェクト作成
npx create-react-app react-native-web-simple

# ディレクトリ移動とnpmモジュールのインストール
cd react-native-web-simple
yarn add react-native-web

# リンク先に書かれているように2ファイルを編集
vim src/index.js
vim src/App.js
```

でいろいろ試せると思います。

## いろいろ見てみる

エラーとかわかる人は自分でみてみてください！！こんな感じ。

<img width="1680" alt="スクリーンショット 2020-03-11 2.33.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112929/929863fe-0009-9cfc-4f5f-a03ba50de7cf.png">

`<View>` というコンポーネントは文字列を入れるためのコンポーネントではないので `Unexpected text node: ここはエラーがでる. A text node cannot be a child of a <View>.` って言われます。

```js
<View style={[{ fontSize: '50px' }]}>ここはエラーがでる</View>
```

なので以下のように書きます。

```js
<View>
  <Text>ここはエラーがでない</Text>
</View>
```

list形式の `FlatList` というコンポーネントにフォントサイズを渡しても文字は大きくなりません。

```js
<FlatList
  style={[{ fontSize: '50px' }]} // style効かないよ！！
/>
```

## 簡単にまとめ

MECEではないかもしれませんが `<Text>` に代表されるように文字列をいれるコンポーネントと、 `View` に代表されるような文字列は入らずに箱の大きさなどを調整するマークアップ用のコンポーネントがある感じがあります。

ReactNativeを少し書いたおかげで、HTML5を書いている時に `div` `li` `a` とかをスタイリングするときは少しだけ考えるようになりました。


こちらの [React Native for Webをプロダクションで使ってみました](https://watercelldev.hatenablog.jp/entry/2018/07/18/122604) というブログでもReact Native for Webを使ってWeb系の方が苦戦しているのが垣間見れます。

## おわりに

ReactNative では li 要素にフォントサイズは効きませんでした。ですが、HTML5としてはどっちでもいいと思います。新しい技術を触ると今までの考え方が更新されるのでとても新鮮な気持ちになれますよね。これからは同じ `<div>` でも `スタイルを整えるため` に入れたのか `文字を入れるため` に入れた要素なのか意識していきたいです。

お試しで書いていたらすごく考えさせられたのでその時のことを書いていきます。ありがとうございました。！！！！
（Webだけで生きていたので、ギブス巻かれたようにエラー出しまくりました。React Nativeはいまでも初心者です。）



.
MAXScriptでコメントを書く方法

# 概要
- MAXScriptでコメント（メモ書き）を書く方法と、その使い方を説明します。

# 難易度
- 入門

# 閲覧想定ユーザー
- 3dsMaxの操作をある程度行えるデザイナー
- これからMaxScriptを始める方
- プログラミング経験がゼロの方

# 想定所要時間
- 15分

# もくじ
- コメントとは
- 一行コメントの書き方
- 複数行コメントの書き方
- コメントアウト
 - TODO

# コメントとは
**コメントとは、コード内にメモ書きを行うための機能です。**

**付箋を貼って、後から見た人に分かりやすく説明を書いておくイメージです。**

**コメント内に書かれた文字は、MAXScriptの式として扱われません。**

したがって、自由に文章を書く事ができます。

## 一行コメントの書き方

コメントは、ハイフン記号を2つ連続で記載（ `--` ）した箇所よりも右側が、コメントとして扱われます。

```
a = 10 -- a に 10 を代入
print a
```

上のコードを実行すると、 `-- a に 10 を代入` の部分は無視されて、 `10` が表示されます。

## 複数行コメントの書き方

**コメントは、複数行をまたいで適用することも可能です。**

その場合は、コメントにしたい文章を `/*` と `*/` で囲みます。

```
a = 10

/*
長文コメント1
長文コメント2
長文コメント3
*/

print a
``` 

## コメントアウト

**コメントによって特定の行を無視させることで、開発中の動作確認にも用います。**

**これをコメントアウトと呼びます。**

必要な機能確認が終わったらコメントアウトを外すか、不要であればそれ自体を削除しましょう。

以下の例では、 a = 100 がコメントとして無視されて、 10 が結果として返されます。

```
a = 10
// a = 100

print a
``` 

### TODO

今は手が付けられないが、後で実装予定の機能を ToDo(次にやるべき作業) として書き残す場合もあります。

```
a = 10
// TODO ティーポットに毛を生やす処理を加える
print a
```

[コメントが無くても読みやすいコードを書く事が良しとされます](https://kitsune.blog/comment)が、習得を進める間は、処理の一つずつにコメントを書いても良いと思います。

私自身の場合は、他人のMAXScriptを読み解く際に、そのようなコメントの付け方をやって勉強していました。


# 参考
- 「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典
 - [コメント行](https://wa3.i-3-i.info/word16503.html)
 - [コメントアウト](https://wa3.i-3-i.info/word11017.html)

- 3dsMax公式リファレンス
 - [ソースコードのレイアウトと継続行](http://help.autodesk.com/view/3DSMAX/2018/JPN/?guid=__files_GUID_779C94C1_87B6_46D4_80E5_9737689FD182_htm)
 - [C++スタイルのブラケット付きコメント](http://help.autodesk.com/view/3DSMAX/2018/JPN/?guid=__files_GUID_CD5DD388_588A_4D03_8946_38534058791D_htm)
Vue.js、マウスホイールのスムーススクロール

メモです。

`inertiaScroll`＝慣性スクロール
`jQuery`の場合は`jQuery-inertiaScroll`がある。
Vue.js専用に作られたものは、見つけられなかった。

####■luxy.js
https://min30327.github.io/luxy.js/

```
npm install luxy.js --save
```

```App.js
<template>
  <div id="app">
    <div id="luxy"> //←囲む
      <img alt="Vue logo" src="./assets/logo.png">
      <HelloWorld msg="Welcome to Your Vue.js App"/>
    </div>
  </div>
</template>

<script>
import HelloWorld from './components/HelloWorld.vue'
import luxy from "luxy.js" //←読み込む
export default {
  name: 'App',
  components: {
    HelloWorld
  },
  mounted(){
    luxy.init(); //←初期化する
  },
}
</script>

```
##ちょっとカスタム
`<div id ="luxy"></div>`で囲むの、なんか面倒。`#app`の中身をスクロールしてくれれば良いのに。

```App.js
<template>
  <div id="app">
    <img alt="Vue logo" src="./assets/logo.png">
    <HelloWorld msg="Welcome to Your Vue.js App"/>
  </div>
</template>
```

##（追記）そういうoptionがあるよ。
と、教えてもらいました。

```javascript
luxy.init({
  wrapper: '#app'
});
```

##（追記）この下はもう読まなくて良い。
（追記）上記オプションでとてもスマートに解決したので。

`VSCode`で`node_modules`の`luxy.js`を開いて、
中身を一括変換しちゃう。`#luxy`→`#app`。
簡単なスクリプトなので一括置換でも、影響はでない。と思う多分。
また、そのままにしておくと、他の人に共有できないので、
ホームディレクトリにコピーしてGithubに上げておく。
名前は、うーん、そうだな、適当に`luxy-vue.js`にしておこう。

```
git init
git remote add https://github.com/YourGithubAccount/luxy-vue.js.git
git push -u origin master
```
```package.json
"dependencies": {
    "core-js": "^3.6.4",
    "luxy.js": "https://github.com/YourGithubAccount/luxy-vue.js.git",//←書き換える
    "vue": "^2.6.11"
  },
```
コレで動くと思うよ。以上
[UE4] いつもどんな時もフルクラッシュダンプ

クラッシュ原因の調査に有用なのがフルクラッシュダンプ。
ミニダンプでは変数の中身などが見えず、解決に有用な情報を得られないことも多い。

なので私は、

エディタを起動するときも

```
/path/to/UE4Editor.exe /path/to/project/MyGame.uproject -fullcrashdump
```

ビルドするときも

```
/path/to/engine/Build/BatchFiles/Build.bat ... -fullcrashdump
```

パッケージするときも

```
/path/to/engine/Build/BatchFiles/RunUAT.bat ... -fullcrashdump
```

クックやコマンドレットを起動するときも

```
/path/to/engine/Binaries/Win64/UE4Editor-Cmd.exe ... -fullcrashdump
```

常に `-fullcrashdump` をつけて作業していた。

それでも `BuildSteps` を利用した外部スクリプトが呼び出しているコマンドレットのクラッシュダンプは自動で取る手段がなかったので、デフォルトの出力をフルクラッシュダンプにしてみた。

```cpp:Engine/Source/Runtime/CrashReportCore/Private/CrashDescription.cpp
FPrimaryCrashProperties::FPrimaryCrashProperties()
    ... // Initialize list
{
#if UE_BUILD_SHIPPING
	CrashDumpMode = ECrashDumpMode::Default;
#else
	CrashDumpMode = ECrashDumpMode::FullDump;
#endif
}

FCrashWERContext::FCrashWERContext( const FString& WERXMLFilepath )
	: FPrimaryCrashProperties()
{
	...
#if UE_BUILD_SHIPPING
	CrashDumpMode = CommandLine.AsString().Contains( TEXT( "-fullcrashdump" ) ) ? ECrashDumpMode::FullDump : ECrashDumpMode::Default;
#else
	CrashDumpMode = CommandLine.AsString().Contains( TEXT( "-minicrashdump" ) ) ? ECrashDumpMode::Default: CrashDumpMode;
#endif
	...
}
```

```cpp:Engine/Runtime/Core/Private/GenericPlatform/GenericPlatformCrashContext.cpp
void FGenericCrashContext::Initialize()
{
	...
#if UE_BUILD_SHIPPING
	NCached::Session.CrashDumpMode = (int32)ECrashDumpMode::Default;
#else
	NCached::Session.CrashDumpMode = (int32)ECrashDumpMode::FullDump;
#endif
	if (FPlatformMisc::SupportsFullCrashDumps() && FCommandLine::IsInitialized())
	{
		const TCHAR* CmdLine = FCommandLine::Get();
		if (FParse::Param(CmdLine, TEXT("fullcrashdumpalways")))
		{
			NCached::Session.CrashDumpMode = (int32)ECrashDumpMode::FullDumpAlways;
		}
		else if (FParse::Param(CmdLine, TEXT("fullcrashdump")))
		{
			NCached::Session.CrashDumpMode = (int32)ECrashDumpMode::FullDump;
		}
		else if (FParse::Param(CmdLine, TEXT("minicrashdump")))
		{
			NCached::Session.CrashDumpMode = (int32)ECrashDumpMode::Default;
		}
	}
	...
}
```

これでテストビルド以外ではデフォルトでフルダンプが出ているので、バグ報告に対し「`-fullcrashdump` で再現してみて」というやりとりが減ることを期待する。
GradleでAntを実行する方法

Javaを使っているプロジェクトで既にAntの資産がある場合など、GradleからAntのbuild.xmlのtargetを実行したい場合などあるかと思います。

そのためのやり方を調べたのでメモがてら綴ります。

# build.xmlをインポート

インポートするにはant.importBuild()メソッドを使います。

▼build.xmlにはechoするtargetを1つ用意

```xml:build.xml
<?xml version="1.0" encoding="utf-8" ?>

<project name="antsample" default="target01">
    <target name="target01">
        <echo message="message01" />
    </target>
</project>
```

▼build.gradle側でbuild.xmlを使えるようインポート

```gradle:build.gradle
ant.importBuild 'build.xml'
```

▼build.xmlで定義したtargetが使えるようになっている

```
$ gradle tasks --all
〜省略〜
Other tasks
-----------
prepareKotlinBuildScriptModel
target01

$ gradle target01
> Task :target01
[ant:echo] message01

BUILD SUCCESSFUL in 846ms
1 actionable task: 1 executed
```

# Antのtarget名とGradleのtask名が重複する場合
注意点として、build.xml上のtargetとにGradleに用意されているタスク名が重複するとエラーになります。
そのため、以下のようにantのtargetはant.【target名】で実行できるようにしておくと良さそうです。

```gradle:build.gradle
ant.importBuild('build.xml') {
    antTaskName -> "ant.${antTaskName}".toString()
}
```

```
$ gradle tasks --all
〜省略〜
Other tasks
-----------
ant.build
prepareKotlinBuildScriptModel
```

# プロパティ設定方法

Ant実行時は-Dで引数を指定できましたが、Gradleでも同じことができます。

▼build.xml側でpropertyを定義します

```xml:build.xml
<?xml version="1.0" encoding="utf-8" ?>

<project name="antsample" default="target01">
    <property name="message" value="default message"/>
    <target name="target01">
        <echo message="${message}" />
    </target>
</project>
```

▼Gradle側はbuild.xmlのインポートだけで大丈夫です

```gradle:build.gradle
ant.importBuild 'build.xml'
```

▼メッセージを指定してechoさせることができました

```
$ gradle target01 -Dmessage='message param'
> Task :target01
[ant:echo] message param

BUILD SUCCESSFUL in 726ms
1 actionable task: 1 executed
```

# まとめ
引数を指定してGradleからAntを実行させるだけでしたが、結構苦労しました。
最初はgradle.build側でant.propertiesとか使って引数渡したりしたてのですが、それは使わなくてもコマンドラインから直接「-D」でtargetを実行できたので、かなりスッキリしました。

GradleやGroovyは触ってて面白いので、また学んだことがあったら投稿していきます。

# 参考
[Gradle User Guide](http://gradle.monochromeroad.com/docs/userguide/userguide.html)
[Gradle (build.gradle) 読み書き入門](https://qiita.com/hatimiti/items/a127311d739c9d3e0045)

以上、ありがとうございました。
コサイン類似度

##はじめに
リコメンドシステムを作っている時に、類似度はどうせ**ユークリッド距離**を使っているものだと思っていました。しかし、レコメンドシステムの実装例を眺めていたら、ユークリッド距離ではなく、**コサイン類似度**というものを用いてました。気になったので、記事にしてみます。
ちなみにこれは、**アイテムベース**向きの尺度であります

##コサイン類似度とは
コサイン類似度は、ベクトル同士の成す角度の近さを表現するため、三角関数のコサインの通り、1に近ければ類似しており、0に近ければ似ていないことになる。
![スクリーンショット 2020-03-11 10.24.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554960/b843bf19-897b-1912-a4be-4b71c1527fae.png)

[出典]:https://blog.brainpad.co.jp/entry/2017/05/23/153000

以下の式で計算できる。
![スクリーンショット 2020-03-11 10.30.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554960/3accb0e8-f40d-809e-d1cd-076f5f2c15ed.png)

##Pythonでの実装例

```python
def cosin_similarity(x, y):
    return np.dot(x, y)/(np.sqrt(np.dot(x, x))*np.sqrt(np.dot(y, y)))
```

##最後に
コサイン類似度は、高校で習った内積の定義を使っているのですね。改めて、高校数学というものは大事であったと痛感しますね。
MacのターミナルでUSBを再認識させる


MacBookPro(OSX10.14)でUSB抜き差しを行わずArduinoを再認識させたかった

## USB Proberをインストールする

### USB Proberとは

USB Proberは、USBの情報を見たり操作したりできる便利なツール

**!!注意!!** 
**下記でダウンロードしたIOUSBFamilyのインストーラを動かすとUSBドライバ全体がバージョンダウンされ、**
**USB系列のデバイスが全て動かなくなります。インストールは慎重に**

### 手順

1. [Apple Developers](https://developer.apple.com/download/more/)からIOUSBFamilyをダウンロードする
2. iousbfamilyxxx.x.xxx.dmgをマウントする
3. IOUSBFamilyxxx.x.x.pkgを右クリック -> [パッケージ内容を表示]を選択
4. Contents/Archive.pax.gzを解凍
5. USB Proberは解凍したArchiveフォルダの DevTools/Hardware の中にある

## 使い方

USB Proberはアプリケーションを普通に開くとUSBの情報が見られる
USBデバイスを再認識させるにはUSB Prober.app内にあるreenumerateを使う

reenumerateではUSBのVendorIdとProductIdを指定する

	$ USB\ Prober.app/Contents/Resources/reenumerate -v 0x2A03,0x0043

## 参考
https://qiita.com/urakarin/items/e4a90b25218ae0bebbb2
https://www.handy-dandy.net/archives/1540.html
東芝SBMと古典アニーラーを比較する（TSPは量子アニーリングで解けるのか? その2）

#はじめに
この記事は前回の記事 ([東芝SBMでTSPを解く（TSPは量子アニーリングで解けるのか? その1）](https://qiita.com/lynalogics/items/50d1912de76c06a5f5ec) の続きです。

前回の記事では東芝シミュレーテッド分岐マシン（SBM）を用いてTSPを解いてみましたが、15頂点ぐらいで解けなくなりました。今回の記事では、（量子）アニーラー用にイジングモデルに変換されたTSPを、シミュレーテッド・アニーリングを用いて解いてみます。

東芝SBMは厳密には量子アニーラーではありませんが、ここでは簡単のため同じような働きが期待されるこれらのアニーラーをまとめて量子アニーラーと呼ぶことにします。

#TSPのイジングモデル変換
ざっくりとイジングモデルとQUBO、TSPの表現について説明します。

量子アニーラーでは、コスト関数が以下のイジングモデルと呼ばれる形式で表される必要があります。

```math
\mathcal{H} = \sum_{i,j} J_{ij} x_i x_j + \sum_{i} h_i x_i
```

ここで、$x_i, x_j \in \\{-1,+1\\}$です。ここで、変数を置き換えることで、$x_i, x_j \in \\{0,1\\}$ にすることができます。0も1も何乗しても値は変わらないので、$x_i = x_i^2$と置き換えることができ、以下の形式に書き換えられます。

```math
\mathcal{H} = \sum_{i \ge j} Q_{ij} x_i x_j
```

この形式をQUBO (Quadratic Unconstrained Binary Optimization)と呼びます。東芝SBMでは問題をこの形式に変換して入力する必要があります。

TSPは$N$個の頂点とその頂点間の距離$d_{u,v}$に対し、$N$個の頂点すべてを1度ずつ巡り、最初の頂点に戻るルートのうち、総移動距離が最小となるものを求める問題です。QUBO形式で表現するにあたり、以下の変数を導入します。

```math
x_u^i = \begin{cases}
1 & (頂点uをi番目に通る) \\
0 & (otherwise)
\end{cases}
```

このとき、総距離は以下のコスト関数で計算できます。

```math
\mathcal{H}_d = \sum_{u, v} \sum_{i} d_{u,v} x_u^i x_v^{i+1}
```

しかし、このままだと一般に正の距離しかない場合、すべての変数を0にするのが最適解となりますが、それはTSPの解とはなりません。したがって以下の制約が必要となります。

```math
\forall u \ \sum_i x_u^i = 1,  \forall i \ \sum_u x_u^i = 1
```

現在の量子アニーラーにおいては、制約はコスト関数に組み込むことによって表現するしかありません。したがって、以下の項をコスト関数に足し上げます。

```math
\mathcal{H}_c = A \sum_u \left( \sum_i x_u^i - 1\right)^2 + A \sum_i \left( \sum_u x_u^i -1\right)^2
```

ここで、Aが制約項にかかる十分大きい正の係数です。以上より、TSPは以下のQUBO形式で表されます。

```math
\mathcal{H} = \mathcal{H}_d + \mathcal{H}_c = \sum_{u, v} \sum_{i} d_{u,v} x_u^i x_v^{i+1} + A \sum_u \left( \sum_i x_u^i - 1\right)^2 + A \sum_i\left( \sum_u x_u^i -1\right)^2
```


この係数をMatrix Marketと呼ばれる形式で表現し、東芝SBMに入力すると、アニーラーが動いて解を出力してくれます。制約をコスト関数に載せる以上、アニーラーはあくまで近似解しか出力できないので、出力された解が制約を満たすかは確認する必要があります。

#シミュレーテッド・アニーリング
量子アニーリングが登場する前にも、「アニーリング」（焼きなまし法）と呼ばれる手法がありました。ある状態からその近くにあるコストの小さい方向に遷移していけば、いつかはそれ以上小さくならない状態に至ります。ただし、それは局所最適解であり、全体最適解であるかは保証されません。シミュレーテッド・アニーリングでは、近くの状態がもし現在よりもコストが高い場合でも、「温度が高」ければ遷移し、だんだんとその温度を下げていく手法になります。これにより、局所最適解に陥っても最初のうちは抜け出しながら、よりよい最適解を目指して探索することができます。シミュレーテッド・アニーリングは古典コンピュータで実装可能なので、これを古典アニーラーと呼ぶことにしましょう。

擬似コードはWikipediaにも載っているので参考にしてください（[焼きなまし法 - Wikipedia](https://ja.wikipedia.org/wiki/%E7%84%BC%E3%81%8D%E3%81%AA%E3%81%BE%E3%81%97%E6%B3%95)）。今回は量子アニーラー用にQUBO形式に変換された多項式コスト関数に対し、0/1変数の値の組を状態として持ち、コスト関数を計算できるように実装しました。量子アニーラー関係なくTSPをシミュレーテッド・アニーリングで解く場合には、もう少し別の状態表現・（より高速な）コスト計算が可能になるでしょう。

#実験・結果
前回の記事と同じグラフに対してシミュレーテッド・アニーリングを行います。シミュレーテッド・アニーリングにはイテレーション回数・初期温度・最終温度（初期温度×xのxとして）がパラメータになります。いくつか試してみたなかで良かったものの結果を示すことにします（すなわち割とパラメータに結果が影響されます）。

|頂点数	|計算時間	|イテレーション	|初期温度	|最終温度パラメータ|
|-------|---------------|---------------|---------------|----------------|
|10	|0.018sec	|45/100		|1.0		|0.0001		|
|15	|0.3sec		|1270/1500	|1.0		|0.99		|


いずれも東芝SBMを用いたときよりも良い結果が得られました。

#まとめ
- 量子アニーラーはイジングモデル (QUBO形式) で表現された問題を解くことができる
- TSPはイジングモデル (QUBO形式) で表現できる
- シミュレーテッド・アニーリングを用いてTSPを解いたところ、東芝SBMを用いたときより良い結果が得られた

次回の記事でなぜこのような結果が得られたかについて考察していこうと思います。
【WSL】Powerline入れたら死ぬほど遅くなった人へ

# TL;DR

* powerline にgitの処理が入っている
* WSLはwindows側のディレクトリへのgitコマンドめっちゃ遅い
* よってpowerlineを使うテーマでgitをOffにするか、WSLのファイルシステム内にリポジトリを置けばよい

# WSLとは

* Windows Subsystem for Linuxのこと
    * [公式](https://docs.microsoft.com/ja-jp/windows/wsl/about)
    * [Qiita記事](https://qiita.com/rubytomato@github/items/fdfc0a76e848442f374e)
    * [WSL2を使うとDockerもいい感じに動かせる](https://www.publickey1.jp/blog/20/wsl_2docker_desktopwindows_10_home.html)
* windowsでubuntuとか簡単に動かせる
* Windowsのファイルシステムにはディレクトリ共有してアクセスしている。
    * これが根本の遅い原因
    * これとgitの仕組みが相性悪い

# powerline 

* temrinalをイカした感じにしてくれるやつ
* powerline themeとかも多く合って、zsh/fishなら簡単に導入できる
* gitの情報とかも出してくれるので、かなりありがたい
* だが、gitの情報を出すために、temrinal表示のたびに内部でgitコマンドを打っている様子。
    * 参照 [Purelineを軽くするconfig](https://qiita.com/sptea/items/84a6af594d4b807312b3)

# 使用環境

* WSL2 ubuntu16.04 + fish
    * 参照: [WSLでお手軽にオシャレfish環境構築 - Qiita](https://qiita.com/sugimount/items/ff80f9ba481ec81b5600#bobthefish%E3%81%AE%E8%A8%AD%E5%AE%9)
    * themeは[bobthefish](https://github.com/oh-my-fish/theme-bobthefish)を入れた
* WSL2 ubuntu18.04 + zsh
    * 参照: [[WSL2] Win10でzsh+preztoを使ってPowerline環境を作る](https://qiita.com/mtsgi/items/8a844870f30b30ef21e4)
    * themeはagnoster

# どれくらい遅いの

* fish + bobthefish のデフォルトの設定で、/mnt/c/User/{ユーザー} 以下のリポジトリにアクセス
    * 8MBぐらいのリポジトリで20秒ぐらいかかる
    * これが、コマンド打つたびにかかる
    * ボリュームのあるリポジトリだともう使い物にならない
* zsh + agnoster も同様

# 解決策① gitの読み込みをOffにする

* fish + bobthefish の場合、テーマの設定でgitの使用をoffにできる
* ~/.config/fish/config.fish を編集。
* `set -g theme_display_git no` を記載
* git関連はほかにもあるので[bobthefish](https://github.com/oh-my-fish/theme-bobthefish) 参照
    * けど`theme_display_git no` 以外はあまり効果ない
* 自分が設定したやつ

* ```
cat ~/.config/fish/config.fish
set -g theme_newline_cursor yes
set -g theme_display_git_master_branch yes
set -g theme_color_scheme dracula
set -g theme_use_abbreviated_branch_name yes
set -g fish_prompt_pwd_dir_length 0
set -g theme_show_exit_status yes
set -g theme_title_use_abbreviated_path no
set -g theme_display_git no
set -g theme_display_git_dirty no
set -g theme_display_git_untracked no
set -g theme_display_git_ahead_verbose no
set -g theme_display_git_dirty_verbose no
set -g theme_display_git_stashed_verbose no
```

* 結果： 一応使えるレベルになったが、git見れないのであまり使い道ない

# 解決策② WSLのファイルシステム内にリポジトリ置く

* これが一番シンプルかつ早い
* 今までWindowsファイルシステム内にリポジトリ置いてた人は移行がつらいかも

### VScodeとか使っているんですけど。。って人は
* Remote Development入れて、WSL内で `code .` って打つと幸せになれるかも
    * 拡張機能とかは入れ直しになるけど、ほとんどLocalでの使用感と変わらずできる。おすすめ
    * [VS Code Remote Development](https://code.visualstudio.com/docs/remote/remote-overview)
* またはWSLのディレクトリにWindowsでアクセスしてVScodeで開くのもあり
    * WSL内で `explorer.exe .` でカレントディレクトリをエクスプローラーで表示
    * これでWSL内のディレクトリにWindowsでアクセスできる

# 感想

* WSLかなりいいけど、ここだけネックですね。。。
* 仕組み上仕方ない感じあるので、なんとかこれで我慢
* 何かほかのイケてる解決策されば教えてください！

# おまけ

* powerline使うならRustで書いたpowerline-rsが早くておすすめ。↑で書いたテーマよりかなりサクサク
    * https://github.com/jD91mZM2/powerline-rs
[ReactNative]  日本語フォントの中央揃え（縦方向）がどうしてもずれる

# 問題
タイトルの通り、日本語フォントの中央揃えがなんか微妙にずれてる。。。
英語は問題ないのに。。。

具体的な状況としては、以下の画像の通り。
![スクリーンショット 2020-03-11 8.24.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131286/8259fad9-b845-9677-94c2-ad9f9e1bbf75.png)

右側のfalseはちゃんと真ん中にきてるのに、
左側の「アイテムA」や「その他」はなんか微妙にずれている。

# 確認1
デバッガーで適用されているCSSを見たところ、不自然なCSSは適用されていない。

# 確認2
テキスト要素に { backgroundColor: 'lightgreen'} を適用してみて、テキスト要素の大きさを確認してみる。
![スクリーンショット 2020-03-11 8.33.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131286/aed2c24e-75d5-29bd-3c0a-e8760e074c86.png)

なんか日本語の方、、、勝手に余白がbottomに作られてる、、、中央寄せはできてるけど、<b><font color='red'>この余白が邪魔</b><font>して微妙にずれているわけですね。。。

# 解決

Textのheightを文字サイズと同じ大きさに設定する。
以下参考のコードです(色々端折ってます。。。）

```jsx
import { Left, Right } from 'native-base';

...
return (
  ...
  <Left style={{ alignSelf: 'center' }} >
    <Text style={{ fontSize: 16, height: 16 }}>アイテムA</Text>
  </Left>
  <Right style={{ alignSelf: 'center' }} >
    <Text style={{ fontSize: 16, height: 16 }}>false</Text>
  </Right>
  ...
);
```

これで余白が消え、ちゃんと中央揃えができました。
![スクリーンショット 2020-03-11 8.45.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131286/c1c92f5b-192e-d4b7-fddc-5b0e63d489d5.png)
ABAP基礎

# ABAPのプログラムの種類（Dynpro/インクルード.etc）
<機能的な観点>
1.レポート
#### レポート
<実行方式>※イベントブロックで制御
1.ユーザ選択以後PG実行か(実行→入力→実行)
2.実行条件なしにいきなり実行か
3.intaraciveReport ユーザと対話式で処理が進むか
対話型というのは、ユーザの入力に応じて画面が遷移していくような画面制御のことを指します。
「こっちがこうすれば」「画面がこうなる」、つまり画面と人と対話するようなイメージで次々に変わっていくような画面制御を「対話型の画面入力」

2.バッチインプット
3.ディンプロ


<システム的なPGタイプ>
1.実行可能PG
レポート、バッチインプット」が該当します
2.INCLUDE　PG
3.モジュールプールプログラム
ディンプロが該当します。

?SAPのシステム構成
?トランザクションコードとは？
?ABAPプログラム開発時に必要なツール
?ABAPプログラムのデバッグ方法
?RICEFについて

         
SELECTION-SCREEN―選択画面作成
1) POPUP（モーダルダイアログボックス）画面
その画面が表示されている間、他の画面を操作できなくなる画面」がモーダルダイアログボックスです。
[begin of screen][as window]

	～BEGIN OF SCREEN(Dynpro番号) AS WINDOW.

	～END OF SCREEN(Dynpro番号) AS WINDOW.

	AT SELECTION-SCREEN でイベントを起こすタイミング
	、「CALL SELECTION-SCREEN命令」で呼び出す

2)従属画面
従属画面とは、ある画面の項目値に応じて表示したりしなかったりする画面です。
[begin of screen][SUBSCREEN]

	SELECTION-SCREENBEGIN OF SCREEN (Dynpro番号) SUBSCREEN.
	・・・・
	SELECTION-SCRENNEND OFSCREEN(Dynpro番号) SUBSCREEN.
	

3)BLOCKで枠線、タイトルをつける
[begin of block]
[with frame]
title



5)画面内容はBLOCKごとに入力可入力不可ごとに制御したい場合
SELECT-OPTIONS　デバッグに役立つ

SELECT-OPTIONS (選択基準) FOR (データ型)or(データオブジェクト).

選択基準
簡単に言うとユーザが入力する項目のお名前（8文字以内）です。
[表示効果]
画面上の入力項目に値レンジの箱効果が表示される。
そのレンジ効果はキーワードの[FOR]
FORに続く型は全て「レンジテーブル」


/****************************************
その前[Data]命令　(vbaのDimと似ている)

①通常命令の場合
DATA (変数名)TYPE(データ型).
※最後に.がある

②チェーン命令の場合
DATA:
(変数名１)TYPE(データ型),
 (変数名２) TYPE(データ型),
 (変数名３) TYPE(データ型).
 
※知識点
完全ABAPデータ型    (データの長さが決まっている）
	データ型 意味 データ長 
	D 日付（YYYYMMDD） 8文字 
	T 時刻（HHMMSS） 6文字 
	I 整数 4文字 
	F 浮動小数点形式 8文字 
	・ ・・・ ・・ 
不完全ABAPデータ型  (不完全データ型の場合、DATA命令のコーディング中にデータ長を明示する必要があります。)
	C 文字列 ― 
	N 数値 ― 
	P 数値（小数点あり） ー 
	・ ・・・ ・・ 

例1) 不完全ABAPデータ型
DATA: W_NUM(16) TYPE N.  "16桁の数値"
あるいは
DATA: W_NUM TYPE N LENGTH 16.  "16桁の数値"

例2) 完全ABAPデータ型
DATA: W_NUM TYPE I.  "4桁の数値"

DATA: W_NUM(1) TYPE t エラーになる
tpye t は時刻HHMMSS６桁のため、長さが1に変更できない


@DATAでインライン宣言
使うときデータ型をその場で定義ときもある。
SELECT SINGLE
　VKORG
　FROM TVKO
　INTO @DATA(LV_VKORG)
　WHERE VKORG = @P_VKORG.

### ABAPデータ型（ 変数、構造、インナーテーブル）
 以下のTYPEキーワードの直後を注目
DATA END_DT type D.  // 変数
DATA Row type テーブル名.  // 構造（行単位）
DATA TBL typetable of テーブル名.  // 内部テーブル
上記のものがオブジェクトとしてみる
だから、初期化するときに、CLEAR命令
解放するとき、FREE命令


★TYPEとTYPES命令の違い
TYPESは構造化型を定義
TYPEはデータ型を指定

★TYPESは新しいデータ型を生み出す

TYPES:
　BEGIN OF (構造化型データ型名),
　　　　(項目名) TYPE (データ型),
　　　　(項目名) TYPE (データ型),
　　　　・・・・・・・・・・・・・・
　END OF (構造化型データ型名).


DATA命令⇒変数、構造、インナーテーブルを宣言
TYPES命令⇒変数、構造、インナーテーブルの基となる「型」を定義

★TYPES命令に、TYPEとLIKEオプション
TYPES A TYPE D
↓
TYPES B LIKE A

TYPEオプション
⇒既に定義済のデータ型を参照する
LIKEオプション
⇒既に定義済の変数などを参照する












STEP1：案件データを取込

STEP2：A列の値をリセット

STEP3：A列に対象案件番号を取込
SAP基礎(一時メモ）

## 基礎知識

#### クライアント

一つのシステムでclient1,client2,client3...など違う環境を用意できる


いろんなObjectは画面から設定するので、各画面の呼び出しキーコードを覚える必要がある
OFFICEの設定を行うとき、メニューの各設定を覚えることと同じです。
	
[テキストシンボル]
	MSTオブジェクトでメッセージを登録しとき、IDで各画面で呼び出す。
	[トランザクションコード]：SE32
	[ルール]
		ID：必ず3文字
	[コード]
	TEST-×××（IDを入れる）

[VIEW]
	●【重要！】データベースビュー
		特徴：内部結合
	●【重要！】更新ビュー
		ビューのデータを更新できる
		メンテしやすいために、更新してほしい項目だけをViewに設定し、Viewの全体はその更新項目のビューと外部結合項目
	● 射影ビュー
	● ヘルプビュー

[ショットキー]
F4ボタン：入力の検索HELP

・ｸSE10：移送オーガナイザ
・ｸSE11：ABAPディクショナリ 
・ｸSE16：データブラウザ
・ｸSE30：SQL実行時間分析
・ｸSE37：汎用モジュールビルダ
・ｸSE38：ABAPエディタ
・ｸSE51：スクリーンペインタ
・ｸSE80：オブジェクトブラウザー（開発ワークベンチ）


[SE11拡張]
	一元化された巨大なObject Dictionnary
	[データベースの定義]
	●　DB_obj TBL 
	●　DB_obj VIEW
	●　DATA_type tbl (データ型グループ）
	●　DATA_type struct	
	●　DATA_type element
		ドメインが、「データ型」「桁長」などシステム的な制約情報を持つのに対して、
		データエレメントは「会社コード」や「メッセージ変数」など業務に近い意味を保持します
		TYPES Z_STATUS TYPE CHAR2. 
	●　DATA_type domain
		ドメインでは、許容値を設定することも可能です。入力できる値を直接指定するか、間隔で指定することができます。
	●　Other schHelp 
		検索ヘルプObject定義（入力検索HELP画面の仕様はここで定義）
	●　Other lockObj
	オブジェクト参照に（データの中身（レコード)の管理）「SE16/SE16N」

[SE16拡張]
	データ検索のSQLについて
	① オープンSQL　（データベースインターフェースODBを経由してデータサーバーを訪問）
	② ネイティブSQL (直接データベースサーバに命令を発する)
	基本は①が便利だが、多機能なデータベースインターフェースのおかげて、訪問機能が拡張された一方で
	データベースインターフェースに提供されていない機能もあるので、その時、ネイティブSQLを使うしかない。
	また、オープンSQLはABAPディクショナリで定義されているテーブルだけしか対象とならない。


[SE37拡張]
	●　汎用モジュール作成
	画面のTABラベル「IMPORT」、「EXPORT]、「例外：MSGのRAISINGエラーテキスト定義」、ソースコード
	●単体テスト（実行ドライブを用意する必要なし）
	SE37→F8ボ実行
	
[SE38拡張]
	●　プログラムのコピーやプログラムの実行を行うことが可能
	SE38　⇒　実行可能プログラムの実装　＆　実行
	SE80　⇒　すべてのプログラムの実装

[SE80拡張]
	●Dynproの登録や編集を行います。もちろん、照会することも可能です。
Nuxt Authモジュールページアクセス制限

# 各ページごとに制限
```
export default {
    middleware: 'auth'
}
```
# 各ページごとに許可
```
export default {
    auth: false
}
```
# すべてのページに一括で制限  
nuxt.config.js

```
router: {
	middleware: ['auth']
},
```
PHP 生年月日のselectタグ　値保持

##生年月日の入力フォームの作り方メモ

selectタグでプルダウンの形で作りました。その際、バリデーションエラー等で元の画面に戻ったときに入力値が保持される様に処理しました。簡単ですがメモしておきます。

#####まず関数を作ります。
引数に始まりと終わりの年月日を指定し、プルダウンに一覧表示するようにします。第３引数は保持したい値を指定します。
?演算子はとっても便利で、issetで値を確認するときなども良く使います。


```php:function.php
function birthdayLoop($start, $end, $selection=''){
    echo '<option value="">選択してね</option>';
    for($i=$start; $i<=$end; $i++){
        $i = sprintf('%02d', $i);
        $selected = $i==$selection?'selected':'';
        echo "<option value=\"{$i}\" $selected>{$i}</option>";
    }
}
```
####htmlに関数を埋め込みます。

```php:birthday_tpl.php
<label>生年月日</label>
<select name="year">
<?php birthdayLoop('1950', date('Y'), $year); ?> 
</select>年
<select name="month">
<?php birthdayLoop('1', 12, $month); ?> 
</select>月
<select name="day">
<?php birthdayLoop('1',31, $day); ?> 
</select>日
```

バリデーションチェックなどは割愛してます。
最後は3つの変数(`$year`, `$month`, `$day`)の値を`$birthday`にまとめて代入してDBに保存しました。

極々一般的な処理ですが、値保持のところでつまづきかけたのでメモしておきました（早く初心者脱したいので勉強頑張ります）。
React Hooksをおさらい - UseState

# UserState 
classのstateの代用関数でfunction component内でもstateを持たせる事が可能になった（react 16.8より)
https://reactjs.org/docs/hooks-intro.html

## 使用例

```
const [currentCount, setCount] = useState({count: 0}); 

const onClickHandler = () => {
    setCount({count: currentCount + 1 })
}
```

### useStateは複数回使っても良い
複数回使っても良い事を踏まえると、同時にアップデートしないStateに関しては別けると読みやすい。

// 例えば以下のClass Componentを

```
state = {
  count: 0, 
  name: 'kondo',
}

onClickIncrementHandler() => {
 this.setState({count : count + 1});
}

onChangeNameHandler() => {
  this.setState({name : 'honda'});
}
```

// function componentに変えると以下の様にも書き換えれるが

```
[currentState, setState] = useState({
  count: 0, 
  name: 'kondo',
})

const onClickIncrementHandler = () => {
 setState({...currentState, count : count + 1});
}

const onChangeNameHandler = () => {
  setState({...currentState, name : 'honda'});
}
```

// 以下の方が各関数がそれぞれの役割りが分かりやす

```
[currentCount, setCount] = useState(0);
[currentName, setName] = useState('kondo')

const onClickIncrementHandler = () => {
 setCount(currentCount + 1);
}

const onChangeNameHandler = () => {
  setName('honda');
}
```


**良かったらJSBinで遊んで見てください。**
https://jsbin.com/puriregedi/3/edit?js,output
Google Cloud Platform (GCP)サービスの正式名称・略称・読み方まとめ#9(医療とライフ サイエンス)

Google Cloud Platform (GCP)のサービスで正式名称や略称はともかく、読み方がわからずに困ることがよくあるのでまとめてみました。


クラウド コンピューティング サービス  |  Google Cloud
https://cloud.google.com/?hl=ja


## まとめルール

まとめルールについては下記を参考ください。

Google Cloud Platform (GCP)サービスの正式名称・略称・読み方まとめ#1(AI と機械学習/AI ビルディング ブロック) - Qiita
https://qiita.com/kai_kou/items/fa930eef23470c2f8f0b


## Amazon Web Services (AWS)のまとめはこちら！

Amazon Web Services (AWS)サービスの正式名称・略称・読み方チートシート - Qiita
https://qiita.com/kai_kou/items/cb29d261c8acc49fd22a

Amazon Web Services (AWS)サービスの正式名称・略称・読み方まとめ #1 (コンピューティング) - Qiita
https://qiita.com/kai_kou/items/a6795dbab7e707b0d1a6


## 概要について

サービス一覧ベージの概要を引用しています。

プロダクトとサービス  |  Google Cloud
https://cloud.google.com/products?hl=ja#product-launch-stages


間違いや、こんな呼び方あるよーなどありましたらコメントお願いします！


## Healthcare and Life Sciences - 医療とライフ サイエンス

### Apigee healthcare APIx

FHIR API ベースの新しいデジタル サービスの構築を加速させます。

- 正式名称: Apigee healthcare APIx
- https://cloud.google.com/apigee/solutions/healthcare-apix/
- 読み方: アピジー ヘルスケア エーピーアイ
- 略称: なし
- 俗称: なし


### Cloud Healthcare API

医療に関する実用的な分析情報を引き出すセキュアな API。

- 正式名称: Cloud Healthcare API
- https://cloud.google.com/healthcare
- 読み方: クラウド ヘルスケア エーピーアイ
- 略称: なし
- 俗称: なし


### Cloud Life Sciences (beta)

コンテナ化されたワークフローで、大規模なゲノムデータや生物医学データを処理、分析、アノテーション付けします。

- 正式名称: Cloud Life Sciences
- https://cloud.google.com/life-sciences
- 読み方: クラウド ライフ サイエンス
- 略称: なし
- 俗称: なし
VPNについて簡単に調べてみた

# 目的

- 恥ずかしながらVPNについてしっかりと理解出来ていなかったためまとめる

# そもそもVPNって？

- Virtual Private Networkの略称である。
- インターネット上にプライベート回線を用意するしくみの事を指す。
- プライベート回線を用いることで簡単にセキュリティの高いデータ通信を可能とする。
- 自宅と会社のネットワークをトンネルで繋ぐイメージである。

# 主なVPNの種類

- インターネットVPN
    - 通信に使用する回線は既存のインターネット回線を使用する。
    - 既存の物を使用するので安価で用意である。
    - インターネットVPNにはさらに細かく分類される。分類を下記に記載する。
        - IPsec-VPN: IP Security Architectureの略である。ネットワーク層において通信の暗号化などの技術が使用されている。受信者と送信者に同一の専用ソフトをインストールする必要がある。データ送受信に送信用、受信用のトンネルを用いる。
        - SSL-VPN:セッション層において通信の暗号化などの技術が使用されている。アプリケーション毎にSSLに対応させることが可能である。
        - L2TP/IPsec(Layer 2 Tunneling Protocol over IPsec VPN): VPN接続を行う際のトンネリングプロトコル(通信プロトコル)とIPsecを併用して、VPN専用通信プロトコルを用いてかつIPsecで暗号化を行セキュアな通信を行うVPNのことである。L2TPには暗号化技術は含まれず、あくまで通信プロトコルとしての位置付けである。
        - PPTP(Point to Point Tunneling Protocol): データの送受信を単一のトンネルで行う。Microsoftで開発され、Windowsとの親和性が高い。
- IP VPN
    - 通信事業者が用意している独自の専用通信網を使用する。
    - 独自の専用通信網なので、通信スピードが高速、情報漏洩リスク低減などのメリットがある。
requests

```py
#pip intall requests
import requests

payload = {'key1': 'value1', 'key2': 'value2'}

#1秒経過してもサーバーから結果が返ってこないときはエラーが出る
r = requests.get('http://httpbin.org/get', params=payload, timeout=1)
#r = requests.post('http://httpbin.org/post', data=payload)
#r = requests.put('http://httpbin.org/put', data=payload)
#r = requests.delete('http://httpbin.org/delete', data=payload)

print(r.status_code)
print(r.text)
print(r.json())
```
出力：

```text
200
{
  "args": {
    "key1": "value1", 
    "key2": "value2"
  }, 
  "headers": {
    "Accept": "*/*", 
    "Accept-Encoding": "gzip, deflate", 
    "Host": "httpbin.org", 
    "User-Agent": "python-requests/2.22.0", 
    "X-Amzn-Trace-Id": "Root=1-5e682022-f3f210e8d7f8b036364f33b8"
  }, 
  "origin": "118.158.151.210", 
  "url": "http://httpbin.org/get?key1=value1&key2=value2"
}

{'args': {'key1': 'value1', 'key2': 'value2'}, 'headers': {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Host': 'httpbin.org', 'User-Agent': 'python-requests/2.22.0', 'X-Amzn-Trace-Id': 'Root=1-5e682022-f3f210e8d7f8b036364f33b8'}, 'origin': '118.158.151.210', 'url': 'http://httpbin.org/get?key1=value1&key2=value2'}

```
[Kaggle] ep.X - パラメータチューニング

# tldr

パラメータチューニングについて勉強しまいした。

# ハイパーパラメータの探索手法

- 手動での調整  
計算時間は比較的かからないが、作業者がチューニングする手間がかかる
- グリッドサーチ／ランダムサーチ  
グリッドサーチは、各パラメータに対して候補を定め、それらの組み合わせをすべて計算する方法です。ランダムサーチは、各パラメータに対して候補を定め、パラメータごとにランダムに選んだ組み合わせを作り、それを計算することを設定した回数だけ繰り返す方法です。BergstraandBengioによると、グリッドサーチよりもランダムサーチの方が効率が良いとのことです。
- ベイズ最適化  
以前に計算したパラメータの履歴に基づいて、次に探索すべきパラメータをベイズ確率の枠組みを用いて選択する方法

# チューニングで設定すること

- ベースラインとなるパラメータ
- 探索する対象となるパラメータ
- 手動か自動か
- 評価の枠組み

# ベイズ最適化でのパラメータ探索
[Kaggle] ep.X - バリデーション

# tldr

バリデーションの手法について勉強しました。

# バリデーション手法

## hold-out法

学習データの一部を学習に使わず、バリデーション用に取っておく方法。
学習データとテストデータがランダムに分割されているということを前提とした方法。
時系列データは別の方法をとる。

## クロスバリデーション (CV)

学習データを分割し、hold-out法の手続きを複数回繰り返すことで、各回のバリデーションの学習に用いるデータの量を保ちつつ、バリデーションの評価に用いるデータを学習データ全体とする方法。

分割されたデータをfoldと呼び、分割数をfold数と呼びます。
fold数を増やすほど学習データの量を確保できる。反面、計算時間が増える。だいたいの場合、fold数は4-5で良い。

## stratified k-fold

分類タスクの場合に、foldごとに含まれるクラスの割合を等しくすることがしばしば行われ、これを層化抽出 (stratified sampling) と呼ぶ。

## group k-fold

分析コンペによっては、学習データとテストデータがランダムに分割されていない場合があります。

## leave-one-out

データ数が多い場合にfold数を極端に大きくすることでバリデーションデータが各1件になる手法。

# 時系列データのバリデーション手法

時系列データのタスクでは、学習データとテストデータは時系列に沿って分割されているケースが多い。
つまり、学習データにはテストデータと同じ期間のデータが含まれない。
このようなケースでは、単純にランダムに分割してしまうと、バリデーションデータと同じ期間のデータで学習できてしまい、モデルの性能を過大評価する可能性が高い。

## hold-out法

テストデータに近い期間のデータをバリデーションデータとする。

## クロスバリデーション

#
urllib.request

```py
import urllib.request
import json

payload = {'key1': 'value1', 'key2': 'value2'}

url = 'http://httpbin.org/get'+ '?' + urllib.parse.urlencode(payload)
print(url)
with urllib.request.urlopen(url) as f:
#バイナリで返ってくるのでデコードし、jsonから辞書型に変換
    print(json.loads(f.read().decode('utf-8')))

payload = json.dumps(payload).encode('utf-8')
req = urllib.request.Request(
    'http://httpbin.org/post', data=payload, method='POST')
with urllib.request.urlopen(req) as f:
    print(json.loads(f.read().decode('utf-8')))

req = urllib.request.Request(
    'http://httpbin.org/put', data=payload, method='PUT')
with urllib.request.urlopen(req) as f:
    print(json.loads(f.read().decode('utf-8')))

req = urllib.request.Request(
    'http://httpbin.org/delete', data=payload, method='DELETE')
with urllib.request.urlopen(req) as f:
    print(json.loads(f.read().decode('utf-8')))
```
出力：

```text
http://httpbin.org/get?key1=value1&key2=value2
{'args': {'key1': 'value1', 'key2': 'value2'}, 'headers': {'Accept-Encoding': 'identity', 'Host': 'httpbin.org', 'User-Agent': 'Python-urllib/3.7', 'X-Amzn-Trace-Id': 'Root=1-5e681895-882b69b4d459c90c94c8b1f4'}, 'origin': '118.158.151.210', 'url': 'http://httpbin.org/get?key1=value1&key2=value2'}
{'args': {}, 'data': '', 'files': {}, 'form': {'{"key1": "value1", "key2": "value2"}': ''}, 'headers': {'Accept-Encoding': 'identity', 'Content-Length': '36', 'Content-Type': 'application/x-www-form-urlencoded', 'Host': 'httpbin.org', 'User-Agent': 'Python-urllib/3.7', 'X-Amzn-Trace-Id': 'Root=1-5e681895-8ec97c2f22fbed1d1dfe27c6'}, 'json': None, 'origin': '118.158.151.210', 'url': 'http://httpbin.org/post'}
{'args': {}, 'data': '', 'files': {}, 'form': {'{"key1": "value1", "key2": "value2"}': ''}, 'headers': {'Accept-Encoding': 'identity', 'Content-Length': '36', 'Content-Type': 'application/x-www-form-urlencoded', 'Host': 'httpbin.org', 'User-Agent': 'Python-urllib/3.7', 'X-Amzn-Trace-Id': 'Root=1-5e681895-034fdaec2f567cc8ce08b10f'}, 'json': None, 'origin': '118.158.151.210', 'url': 'http://httpbin.org/put'}
{'args': {}, 'data': '', 'files': {}, 'form': {'{"key1": "value1", "key2": "value2"}': ''}, 'headers': {'Accept-Encoding': 'identity', 'Content-Length': '36', 'Content-Type': 'application/x-www-form-urlencoded', 'Host': 'httpbin.org', 'User-Agent': 'Python-urllib/3.7', 'X-Amzn-Trace-Id': 'Root=1-5e681896-2b40064de4e8f1e24e881d8d'}, 'json': None, 'origin': '118.158.151.210', 'url': 'http://httpbin.org/delete'}

```
Ansibleのモジュールまとめてみた-Linux編

SEあるあるだと思いますが、何度も同じことを調べてしまうので、まとめてインデックス的なものにしようかなと思います。
(何度も利用しないものもまとめておきます)

# 環境
以下で動作確認しています。
RHEL 7.1
Ansible 2.9


# Linux関連

## ホスト名変更

[hostname](https://docs.ansible.com/ansible/latest/modules/hostname_module.html)

### 使用例
```bash
- name: Modify hostname
  hostname:
    name: johnn
```

## serviceマネジメント

動作に制限がありますが、systemdコマンドで実施しているようなことができます。
使用例では、httpdをリスタートしています。

[systemd](https://docs.ansible.com/ansible/latest/modules/systemd_module.html)

### 使用例

```
- name: Restart httpd
  systemd:
    name: httpd
    state: restarted
```

## ユーザ情報の変更

以下の例では、パスワード変更に利用していますが、ユーザの起動シェルなども変更したりできるみたいです。
詳しくは以下リンク先参照

[user](https://docs.ansible.com/ansible/latest/modules/user_module.html)

### 使用例
```
- name: Modify root password
  user:
    name: root
    password: "{{ ここにパスワードを入力します | password_hash('sha512') }}"
```

## オブジェクト作成

fileという名前のモジュールですが、ディレクトリの作成もできます。
削除することも可能です。

[file](https://docs.ansible.com/ansible/latest/modules/file_module.html?highlight=file)

### 使用例
```
- name: create directory
  file:
    path: /johnn
    state: directory
```

## コマンド実行

基本的にAnsibleのモジュールを利用するのがベストですが、ないものもありますので、
そういう項目については、このモジュールを使って、コマンドを実行しています。

commandとshellでも少し違いがありますので、要件に合った使い方をすればよいかと思います。

[command](https://docs.ansible.com/ansible/latest/modules/command_module.html)
[shell](https://docs.ansible.com/ansible/latest/modules/shell_module.html)

### 使用例
```
- name: Set locale LANG
  command: localectl set-locale LANG=en_US.UTF-8
```

## タイムゾーンの設定

[timezone](https://docs.ansible.com/ansible/latest/modules/timezone_module.html)

### 使用例
```
- name: Set timezone
  timezone:
    name: Asia/Tokyo
```

## ファイルのコピー

ファイルのコピーに使えます。
コピー先のパスとコピー元のファイルに差分があれば、コピーしてくれます。

[copy](https://docs.ansible.com/ansible/latest/modules/copy_module.html)


### 使用例
```
- name: copy file
  copy:
    src: コピー元のパス
    dest: コピー先のパス
    owner: root
    group: root
    mode: "0644"
```

## 再起動

メッセージの設定を入れていますが、表示されませんでした。

[reboot](https://docs.ansible.com/ansible/latest/modules/reboot_module.html)

### 使用例

```
- name: Reboot test
  reboot:
    msg: "Rebooting."
```

気が向けば、ディスクの追加についても投稿しようと思います。
UnityでScriptをアタッチしたオブジェクトを削除したい。



## やりたいこと：落ちゲーのようにたくさんの同一オブジェクトを作ってぶつかった物だけを消したい

ググってもうまい回答を探すのが難しかったので個人的にうまくいったことだけを載せています。

※余裕があったら何でそうなるのかは調べますが、ご存知の方がいればコメントしていただけると嬉しいです。

## 結論

`Destroy(gameObject);`で設定するとうまくいった。 


## 変更した実装

今までの実装

今までは、インスペクターで自分のオブジェクト名を指定して削除する仕様にしていた。
この場合はすでにGameObjectがscene内内にいる場合は有効
でも、ファクトリーっぽく自動生成される場合はちょっと困った。

```
	void OnCollisionEnter2D(Collision2D collision)  { // 衝突したとき
		// もし、衝突したものの名前が目標オブジェクトだったら
		if (collision.gameObject.name == targetObjectName) {
　　　　　　//今までは一個だけのオブジェクトを削除していたのでオブジェクトの名称を直接してしていた。
			GameObject DestroyObject = GameObject.Find(DestoryObjectName);
			Destroy(DestroyObject);	
		}
```

うまくいった実装

こっちの実装ではアタッチしているgameobjectを取得して削除する、という仕様に切り替えた
でも、何で公式に書いているように`Destroy(this);`で消さないの？ということもあると思うが、thisの場合だとなぜかうまく消えなかったのでこっちを採用した。
その辺りは、バージョンなどが関係するのかな、わからんけど

```
	void OnCollisionEnter2D(Collision2D collision)  { // 衝突したとき
		// もし、衝突したものの名前が目標オブジェクトだったら
		if (collision.gameObject.name == targetObjectName) {
                //複数の同じオブジェクトを生成してぶつかった物を削除するのであれば
                //シンプルにgameObjectをさして削除するとオブジェクトが消える
			Destroy(gameObject);	
		}
	}
}
```
参考リンク

[ScriptReference/Object.Destroy](https://docs.unity3d.com/ja/2018.4/ScriptReference/Object.Destroy.html)
heatrapyで1.5次元非定常伝熱解析をやってみる

 opensourceのheatrapyを使用して一次元非定常伝熱解析をやってみました。
最近、仕事で熱関係をやっています。

## 環境構築
```
pip install heatrapy
```

## やれること
以下の事が出来ます。かなり色々できますね！

- 非定常
- 材料の温度依存性
- 材料を任意で追加可能
- コンポーネント間の接触
- 境界条件は、温度指定か断熱条件
- 任意の位置での系外への熱移動（入熱、出熱）←　熱伝達率や輻射での熱の出入りを設定可能

####【モデル】  
- Ta,insulations　：境界条件
- Q : 熱の授受（任意の位置で可能）
- h : 接触条件（任意の位置で可能）
- Q0 : 温度に依存する熱の授受（任意の位置で可能）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274127/f11ac327-999b-bf46-906a-3eb75a6d0a15.png)


## 論文
理論的なものは下記論文にまとまってます。ありがたや
https://www.sciencedirect.com/science/article/pii/S2352711018301298#!

## 1コンポーネントの一次元非定常熱解析
[ドキュメント](https://djsilva99.github.io/heatrapy/example/)にある例です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274127/2c88a931-d0d8-ad9e-f0d7-06ef1e7f85ad.png)

#### 【解析条件】
- コンポーネントの長さ：0.5m
- 材料(materials)：Gd(ガドリニウム)
- 初期条件(amb_temperature)：293K
- 境界条件(boundaries)：左側は温度条件（300K)で、右側は断熱(0で断熱条件）
- 時間ステップ(dt)：1秒（ここの設定を間違うと、変になるので注意！←伝熱速度の関係です）
- 分割数(borders)：10分割
- 空間ステップ(dx)：0.05m（コンポーネント長さ/分割数 = 0.5/10 = 0.05m)
- 時間(timeInterval)：30000s


#### 【材料】
材料データは、インストールフォルダ/heatrapy/database　の中にあります。ここに追加していけば、材料の追加が可能です。
材料フォルダ内の各ファイル名は、下記の物性値を意味しており、値は温度依存を入れる事ができます。

- cp:比熱[J/kg ℃]
- k:熱伝導率[W/m K]
- rho:密度[kg/m3]

####【実行】
ドキュメントのまま、動かそうとしても動きません。。。（メンテしてないのだろうなぁ）
そこで、ソースコードを見て、修正しました。

下記コードを実行すると、example.txtに解析結果が出力されます。write_intervalは何秒毎に結果を出力するかの指定です。
solverは4つ用意されていて、適宜選択するようです。

```run.py
import heatrapy as ht

example = ht.single_object(amb_temperature=293, materials=('Gd',), borders=(1,11),materials_order=(0,),
                            dx=0.05, dt=1., file_name='example.txt',boundaries=(300,0), Q=[], Q0=[],initial_state=False)

example.compute(timeInterval=30000, write_interval=300, solver='implicit_k(x)')
```

####【結果の可視化】
ドキュメントには、physplotlibで結果を見るとありますが、pandasを使って結果を見ていきます。

```read_data.py
df = pd.read_csv("example.txt")
```
上記で出力ファイルを読み込みます。下記のように、各節点での温度が時刻歴で出力されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274127/f27403a8-4ee4-1404-192e-cae2de29432b.png)

グラフで見てみましょう

```graph.py
df = pd.read_csv("example.txt")
df=df.drop("heat[1](W)", axis=1)
df=df.drop("heat[-2](J)", axis=1)
df = df.set_index("time(s)")
df.plot(figsize=(15,8))
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274127/efd91953-9ac4-7114-08bd-966600883eb7.png)

ザ、一次元非定常熱解析のグラフですね！

## 感想
なかなかに素晴らしいライブラリです。論文にもあるように、熱解析とオブジェクト指向プログラムは大変相性がよいです！
こういうライブラリが増えてくれると、製造業でも”車輪の再発明”しなくて済むのですが、それは未だ先の話。
yarn導入

# はじめに
Node開発する時に、個人的には`npm`より、`yarn`の方がよかったので、導入手順をまとめてみた。
以前は、非推奨手順となる`npm install`で導入したけど、`Homebrew`使うとすごく簡単だったので、
今回の手順で導入するのがおすすめ

# 環境
- macOS Catalina(10.15.3)
- Homebrew(2.2.10)

# yarnインストール
基本的に[公式サイト:インストール](https://classic.yarnpkg.com/ja/docs/install/#mac-stable)のコマンドを実行するだけ。

```terminal:ターミナル
~ % brew install yarn
```

バージョン確認コマンドを実行してバージョンが表示されたらOK

```terminal:ターミナル
~ % yarn -v
1.22.4
```

# 最後に
`npm`で導入したときは、パスを通すために`.bash_profile`に追記とかしたけど、今回は不要で非常に楽ちん。
やっぱり非推奨じゃなくて、公式サイト通りにやるべきですね。
json

```py
import json
j = {
    "employee":
        [
            {"id": 111, "name": "Mike"},
            {"id": 222, "name": "Nancy"}
        ]
}

print(j)
print("###########")

#python内で読み書きするときはsがつくので注意
print('jsonの場合ダブルクォートで囲まれる\n' + json.dumps(j))
a = json.dumps(j)
print('@@@@@@@@@@')
print(json.loads(a))

#ファイルを読み書きするときはsがつかない
with open('test.json', 'w') as f:
    json.dump(j, f)
print('###########')
with open('test.json', 'r') as f:
    print(json.load(f))
```
出力：

```text
{'employee': [{'id': 111, 'name': 'Mike'}, {'id': 222, 'name': 'Nancy'}]}
###########
jsonの場合ダブルクォートで囲まれる
{"employee": [{"id": 111, "name": "Mike"}, {"id": 222, "name": "Nancy"}]}
@@@@@@@@@@
{'employee': [{'id': 111, 'name': 'Mike'}, {'id': 222, 'name': 'Nancy'}]}
###########
{'employee': [{'id': 111, 'name': 'Mike'}, {'id': 222, 'name': 'Nancy'}]}

```
初心者によるプログラミング学習ログ 259日目

#100日チャレンジの259日目
twitterの100日チャレンジ#タグ、#100DaysOfCode実施中です。
すでに100日超えましたが、継続。
100日チャレンジは、ぱぺまぺの中ではプログラミングに限らず継続学習のために使っています。
259日目は、

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">おはようございます<br>259日目<br>・過去につくった自作ポートフォリオ改造　1.5h<br><br>cssをsassで書く練習もしてます<a href="https://twitter.com/hashtag/%E6%97%A9%E8%B5%B7%E3%81%8D%E3%83%81%E3%83%A3%E3%83%AC%E3%83%B3%E3%82%B8?src=hash&amp;ref_src=twsrc%5Etfw">#早起きチャレンジ</a><a href="https://twitter.com/hashtag/%E9%A7%86%E3%81%91%E5%87%BA%E3%81%97%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%A8%E7%B9%8B%E3%81%8C%E3%82%8A%E3%81%9F%E3%81%84?src=hash&amp;ref_src=twsrc%5Etfw">#駆け出しエンジニアと繋がりたい</a><a href="https://twitter.com/hashtag/100DaysOfCode?src=hash&amp;ref_src=twsrc%5Etfw">#100DaysOfCode</a></p>&mdash; ぱぺまぺ@webエンジニアを目指したい社畜 (@yudapinokio) <a href="https://twitter.com/yudapinokio/status/1237468783830110208?ref_src=twsrc%5Etfw">March 10, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>