OmniAICreator/Qiita-1.07M huggingface dataset:
AWS EC2インスタンスの複製をしてみた。その5（備忘録）

前回の続きです。https://qiita.com/Bikeiken-IT/items/5b6d1e3ab5573c081ba8

本記事の本題であるEC2インスタンスの複製を行います。
それではAWSサービスのEC2画面に戻りまして、作成したEC2インスタンスのEC2-test-1を選択します。
![step28-create-image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550376/2b838f95-2b33-d4bb-73b1-8583e7acc88e.png)
そして、アクションからイメージの作成を選択してください。
![step29-create-image2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550376/4348a3fe-da86-2c28-0e69-a234a81faf46.png)
イメージの作成の画面が表示されます。イメージ名とイメージの説明を入力し、イメージの作成のボタンを押します。
![step30-create-ami-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550376/db40f46b-adea-5b24-66b8-1ae1a69345b5.png)
続いて、EC2の左のスクロールからAMIを選択して、先ほど作成したOSイメージを選択して、起動ボタンを押してください。
![step31-create-ami.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550376/4f92491c-cca4-2abb-1feb-ba8685521cda.png)
すると、EC2のインスタンスタイプの選択画面からとなります。これはAMIをEC2-test-1(EC2インスタンス)から作成したため、OSイメージが確定しているためです。
ここからはEC2-test-1を作成した時と同じ条件でEC2-test-2というEC2インスタンスを作成します。
![step32-created.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550376/75171b1b-53fc-b005-430a-1c3a9a6ade14.png)
EC2-test-2が作成されたことが確認できました。


その６に続きます。https://qiita.com/Bikeiken-IT/items/e1b80cc6cf2cbced5440
RailsでUTF-16のファイルを作成する

[01/17:追記]
コメントでいただいた意見を元に検証をしたところ`force_encoding`を使用しているのが問題でした。
`String#encode`を使用してエンコードを書き換えればそのままUTF-16のファイルとして出力出来ました。


####経緯
Ruby on RailsでUTF-16のファイルを作成する必要があったので、
その時の処理を備忘録として書き留めて置きたいと思います。

####ソース
```ruby:qiita.rb
/**
 * xml作成
 */
def create_xml
    view_context = ActionView::Base.new
    view_context.assign(data: "aaaaaaaaaa")
    tmp = File.read(Settings.template)
    # view_context.render(inline: tmp).force_encoding("utf-16")
    view_context.render(inline: tmp).encode("utf-16")
end
```

```ruby:create_file.rb
/**
 * ファイル作成（ローカルにファイルを作成する）
 * @param xml バイナリデータ
 * @param file_name ファイル名
 * @param upload_time 作成日時
 */
def put_string_file(xml, file_name, upload_time)
    # ディレクトリとファイルの定義
    dir = "#{Rails.root}/storage/#{upload_time}/"
    file = "#{dir}#{file_name}"
    # フォルダがなければ作成
    FileUtils.mkdir_p(dir) unless File.directory?(dir)
    
    # xmlをファイルに出力
    File.binwrite(file, StringIO.new(xml).read)
    # 作成されたファイルを読み込みUTF-16に変換する
    # File.open(file, 'r'){ |f|
    #  buffer = f.read();
    #  buffer = buffer.encode("UTF-16", "UTF-8", :invalid => :replace, :undef => :replace, :replace => '*')
    #  f = File.open(file, 'w:UTF-16:UTF-8')
    #  f.write(buffer)
    #}
  end
```

####まとめ
一発でUTF-16のファイルを作成できないかなと調べてみましたが、見つからず。
一旦UTF-8でファイルを作成し、UTF-16に変換してと手間をかける方法しか浮かばなかったです。
改善点などあれば情報求む。
PHP 変数のデータ型を出力しよう

# 目的

- 変数のデータ型を確認する命令`var_dump`を知ったので簡単にまとめる

# 書き方の例

- 下記に`var_dump`の使用方法をまとめる。

```
var_dump($変数名);
```

- 下記にプレビューイメージを記載する。

```
データ型(格納されている文字列の文字数) "格納されている文字列"
```
TableView と delegate を理解する（したい）

# 対象

Swift 初心者向け🐤
参考資料程度に呼んでください！

# どんなときに読むの？

TableView と delegate にハマったとき。
TableView 難しいよ〜 となったとき。

# TableView と delegate のはまりどころ

- 更新されない
    - `tableView.reloadData()` を呼んでいない
    - 配列に追加した後に、`tableView.reloadData()` を呼んでいない
- 表示されない
    - `tableView.dataSource = self` 書いていない.
    - numberOfInSection で `return 0` になっている
    - `class 〇〇ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate` にしていない
- アプリが落ちた
    - cell の名前を確認。間違ってないか
    - `tableView.register` で cell を登録しているか
    - 配列の範囲外（配列の要素数）の外にアクセスしているか
    - ( 配列は、0, 1, 2, 3...  と数が増える。 )
- cell をタップしても反応しない
    - `tableView.delegate = self` を書いていない
    - `class 〇〇ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate` にしていない
    - `didSelectRowAt` を呼んでない
- エラーが消えない
    - `class 〇〇ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate` にしていない
    


# 参考になる資料

### TableView 

- ToDo リスト
    - [ToDoリストを作ってみよう！ | FLY-WEST](https://flywest.tokyo/category/ios-app/todolist-create/)
    - 作っていく過程が書いてあり、結構詳しく書いてあるので良いと思います。
- Udemy のおすすめのセクション（購入していれば）
    - [セクション19: Local Data Persistance - User
Defaults, Core Data and Realm  ：iOS 13 & Swift 5 - The Complete iOS App Development Bootcamp | Udemy](https://www.udemy.com/course/ios-13-app-development-bootcamp/learn/lecture/10929418#overview)
    - [セクション11:
おしゃれなTodoアプリでTableViewの基礎を学ぼう【iOS13対応】未経験者がiPhoneアプリ開発者になるための全て iOS Boot Camp | Udemy](https://www.udemy.com/course/ios13_swift5_iphone_ios_boot_camp/learn/lecture/15758752#overview)



### delegate

いろんなアプローチの解説があるので自分に合うものを探しましょう！

- [【swift】イラストで分かる！具体的なDelegateの使い方。 - Qiita](https://qiita.com/narukun/items/326bd50a78cf34371169)
- Udemy のおすすめのセクション（購入していれば）
    - [セクション13: Networking, JSON Parsing, APIs and
Core Location iOS 13 & Swift 5 - The Complete iOS App Development Bootcamp | Udemy](https://www.udemy.com/course/ios-13-app-development-bootcamp/learn/lecture/16253654#overview)
    - [セクション7: デリゲート&プロトコル Swift5Keyboard: 【iOS13対応】未経験者がiPhoneアプリ開発者になるための全て iOS Boot Camp | Udemy](https://www.udemy.com/course/ios13_swift5_iphone_ios_boot_camp/learn/lecture/15758752#overview)
変数

![girl01_laugh.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563190/692ee5ed-be96-ac24-81aa-2e766a453354.png)
　メルカリで稼いだ時のスナカワさん
## 変数
Railsひとまわりやってみたのですが、
正直、ちょっと何言ってるかわからなかったです。
そこで、変数に関して出てきた単語の再確認をしました。

### スコープと変数は一緒に説明してあげたほうが分かりやすいかも
　👉変数の種類によってスコープできる範囲が異なる、という理解に至りました。

### ローカル変数
小文字で始まり、そのスコープに属する変数のこと

### インスタンス変数　＠
特定のオブジェクトに属する変数のこと

### クラス変数　＠＠
クラス、そのサブクラス、それらのインスタンス、いずれをまたいでも共有できる変数のこと


## 最後に
簡単な内容ですが非常に重要な内容と認識したのでおさらいしました。

これを分かりやすく受講生と共有するためには、を常に考えたい。
ESXi の root パスワードがわからなくなった時の対処

VMware の KB を見てみると、ESXi6 の手法が記載されていないが、リセット手順は ESXi5 と同じ。

- [（参考）ESX/ESXi ホストで root パスワードを忘れた場合の変更]( http://kb.vmware.com/selfservice/microsites/search.do?language=en_US&cmd=displayKC&externalId=2078942)

# パスワードをリセットする
パスワードを忘れるとシャットダウンすらできないので、仮想マシンをどこかに移動するか停止させ、ESXi ホストの電源を落とす。
[![Image from Gyazo](https://i.gyazo.com/3e1d63604f40c1b3cecfdc29c01b764f.png)](https://gyazo.com/3e1d63604f40c1b3cecfdc29c01b764f)

リセットするには、ESXi のCDかUSBなどのインストールメディアを用意し、サーバーの電源を入れ、用意したメディアから起動し、インストール画面に進む。  
ハイパーバイザーの再インストールを行うことでリセットを行うが、今回の手順ではESXiの設定は消えるが、仮想マシンは消えない。

一先ずインストールを進め、下記の画面でESXiがインストールされていたディスクを選択する。
[![Image from Gyazo](https://i.gyazo.com/1fef9f8ceb4000495e1d25d601ae2760.png)](https://gyazo.com/1fef9f8ceb4000495e1d25d601ae2760)

次にデフォルトは"Upgrade ESXi , preserve VMFS datastore"が選択されていると思うが、
必ず **"Install ESXi , preserve VMFS datastore"** を選択して次に進む。
[![Image from Gyazo](https://i.gyazo.com/f98a33ff42e8ad72569ab50423536b8e.png)](https://gyazo.com/f98a33ff42e8ad72569ab50423536b8e)
インストール時のオプションについては下記参照。

1. ***Upgrade ESXi , preserve VMFS datastore***  
ESXiのアップグレード。
同じバージョンのESXiのメディアであってもこのメニューは表示される。  
これを選択した場合、ESXiの設定と既存VMFSデータストアのデータは保持される。  
2. ***Install ESXi , preserve VMFS datastore***  
ESXi のみを新規でインストールし、既存VMFSデータストアは、そのまま保持する。  
ESXi の root パスワードは、ESXi の設定に含まれるため、今回のようなパスワードをリセットする目的の場合は、ESXi のみを再インストールし、データストアの情報(仮想マシンとか)を保持したいため、これを選択する。
3. ***Install ESXi , overwrite VMFS datastore***  
完全に新規インストールするパターン。  
ESXi の情報もデータストアの情報も消えるので、検証環境の再構築や引き上げ機の交換などのケースで利用されたりする。

あとは下記画面で新しい root パスワードを決める。
[![Image from Gyazo](https://i.gyazo.com/29b880c0966d27c3ff6179d613096093.png)](https://gyazo.com/29b880c0966d27c3ff6179d613096093)

インストールを進めて再起動して終わり。
[![Image from Gyazo](https://i.gyazo.com/5c38a2d61c76982af3d149fb79979903.png)](https://gyazo.com/5c38a2d61c76982af3d149fb79979903)
[![Image from Gyazo](https://i.gyazo.com/52e430eb49870c8d58d71d2dc5330978.png)](https://gyazo.com/52e430eb49870c8d58d71d2dc5330978)
DartのGenericsの判別方法

generics で型を判別する時に、ちょっとハマったのでメモ
genericsな型(以下 `T` )をプロパティとして持ったクラスにintを渡し、その型をif文で判別しようとしたところハマってしまった
やったことは以下の通りである。

```dart

class GenericsModel<T> {
  final T type; // set or get される場合の型
  PrefKeyModel(this.type);
}

main() {
  final model = GenericsModel(int);
  if (model.type is int) {
    // Int! 
  } else {
    // Error! <- こっちが来る
  }
}

```

とするとErrorになってしまう
これはintが入っていたとしても `T` 型が設定されているためで `is` を使ってもtrueにはならない

```dart

class GenericsModel<T> {
  final T type; // set or get される場合の型
  GenericsModel(this.type);
}

main() {
  final model = GenericsModel(int);
  if (model.type == int) {
    // Int! <- こっちが来る
  } else {
    // Error! 
  }
}

```

こうやって判別するのが正解
Windows Server の評価版から製品版にライセンスを変更する

Windows Server 20xxを評価版ライセンスから製品版に変更する方法。
ライセンス購入が間に合わない・・・でも構築しないとスケジュールが・・・という時に使ってる。  
なお、ActiveDirectory が構築された評価版は ActiveDirectory をアンインストールしないと駄目なので注意。  

## 変更可能なライセンス
評価版から下記の製品版にすることができる。

* [マイクロソフト公式](https://docs.microsoft.com/ja-jp/windows-server/get-started/supported-upgrade-paths)
 *  一般的に販売されている製品版
 * ボリュームライセンス版
 * OEM版

実際に評価版からボリュームライセンス版に変更は確認済み。

## 手順
管理者権限でコマンドプロンプト(PowerShellでもいい)を起動する。
起動後、下記コマンドを実行し、現在のエディションを確認(`Eval`が評価版)。

```powershell
C:\Users\Administrator>DISM /online /Get-CurrentEdition

展開イメージのサービスと管理ツール
バージョン: 10.0.14393.0

イメージのバージョン: 10.0.14393.0

現在のエディション:
現在のエディション : ServerStandardEval

操作は正常に完了しました。
```

製品版のライセンス認証を実施(プロダクトキー及びインターネット接続が必要)。
インターネット接続がない場合は電話認証などを検討する。

```powershell
DISM /online /Set-Edition:<エディション ID> /ProductKey:XXXXX-XXXXX-XXXXX-XXXXX-XXXXX /AcceptEula
```

エディションIDは下記参照。

| エディション | エディションID |
|:-----------|:-----------|
| Standard   | ServerStandard | 
| DataCenter | ServerDataCenter|

※認証エラーが発生した場合は「トラブルシューティング」で再度認証を実施し、再起動を実施すると上手くいくらしい。

### 参考画像
[![Image from Gyazo](https://i.gyazo.com/6be9ec6253eb56f355bd6bc778892e08.png)](https://gyazo.com/6be9ec6253eb56f355bd6bc778892e08)
サーバーが起動しない時の対処法

A server is already running.が出てrails s が起動しない時

```terminal
#lsof -i

COMMAND  PID    USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
ruby2.5 2722 vagrant   15u  IPv4  23988      0t0  TCP ubuntu-bionic:3000->_gateway:52166 (CLOSE_WAIT)
ruby2.5 2722 vagrant   16u  IPv4  23985      0t0  TCP *:3000 (LISTEN)

```
この2722が邪魔。なので

```terminal
#kill -9 2722

killed
```

これで動かせる。
アプリ/tmp/pids/server.pidのファイルを削除してもいけるらしい。
初学者は教材選びが大事

#前回のあらすじ
・新人プログラマ向けの本が分かりづらすぎて学習効率が下がってた
#今日やったこと
・if文とswitch文を使って、コンピューター様とじゃんけんするプログラムを作った
（今回の教科書『いちばんやさしいJavascriptの教本』)
（学習環境　エディタ→メモ帳　ブラウザ→EDGE）
#困ったこと
・エラーが２箇所出て、場所の特定に難航した
特定方法→ブラウザのコンソールツールを見つつ、前後４行くらいを教本と見比べていく
・原因その１
===記号のつけ忘れ
・原因その２
教本の誤植（プラス記号の抜け落ち）
本のHPを見て判明
#感想
古めの版年に出た本を使って学習すると、誤植に振り回されるなぁと思った。
ランダムに数を生成するメソッド「Math.random()」は応用が利きそうだなァと思った。
エラーがでたとき、落ち着いて対処できるようになりたいと感じた。
#次回の目標
・関数について再学習しよう
[flutter]キーボードが隠れてしまう問題

解決策は下のイシューに書いてあった。
https://github.com/flutter/flutter/issues/20042

Formのキーが再生成されるのが問題のようだ。なぜかキーボードのレンダリングが止まるみたい。

```
final _formKey = GlobalKey<FormState>();
```

上のソースを下に書き換えたら直った。

```
static GlobalKey<FormState> _formKey = new GlobalKey<FormState>();
```
atomic designとは

#ページ単位ではなく、コンポーネント単位でデザインを考える手法
・Atoms
・Molecules
・Organisms
・Templates
・Pages

の5つの単位に分けて、ページを作っていきます。

または日本語で、

・原子
・分子
・有機体
・テンプレート
・ページ

とも言われています。

##Atoms
ボタン1つやフォーム1つなど

例）テキスト
![818f81e08b73d262c11dce25abd2397a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529651/5a138ae9-1210-3d81-2da6-9b8990130604.png)

例）フォーム
![2ceca238355bc9a9828dfb5f8158fe4d.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529651/951ce740-41ec-76c0-8000-3b5c8af44f8e.png)

例）ボタン
![68a81c6eacaccb643b8286fa4fbff68a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529651/24a24be5-e833-3db2-63b2-5e41c9dce4ae.png)


##Molecules
Atomsを組み合わせたもの

例）フォームとボタンとテキストを組み合わせたもの
![6730c3783a6356e206db752538996915.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529651/593e82ec-fe0a-005e-d361-195303c4b84f.png)

##Organisms
Atoms、Molecules、他のOrganismsを組み合わせたもの

例）ヘッダー
![d3a256d116b373ecba73574d450c2338.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529651/6e327d8a-245f-b568-993c-7e91829ea651.png)


##Templates
Atoms,Molecules、他のOrganismsを組み合わせ、ページ構造を表す

##Pages
Templatesに実際の文章や画像が入ったもの

<br>
#atomic designのメリット
・変更に強い
・再利用性が高い

<br>
>参考
https://blog.kubosho.com/entry/using-atomic-design

<br>
ではまた！
React TypeScript で Propsに HTMLタグを入れる方法

Propsで渡すデータに改行タグを入れたかったので、
このように設定してみました。


```tsx
import React from 'react';

// 型を定義する
type HeadlineType = {
  en: string | Array<string|JSX.Element>;
  ja: string;
}

// 子コンポーネント
const TheHeadline: React.FC<HeadlineType> = props => {
  return (
    <h1 className="headline">
      <div className="headline__en">{props.en}</div>
      <div className="headline__ja">{props.ja}</div>
    </h1>
  );
};

// 親コンポーネント
const App: React.FC = () => {
  return (
    <div id="app">
      <TheHeadline en={["Long Long", <br key="Some key" />, "Long Title"]} ja="長いタイトル" />
    </div>
  );
};

```

ポイントは、定義する型は、`Element` ではなく、`JSX.Element` ということ。
ここで時間かかってしまった。

----------
[追記] 
どうやら `props` で渡す引数にHTMLのタグがある場合、HTMLタグには任意の`key` を指定しないと、
`Warning: Each child in a list should have a unique "key" prop.`
と警告が出るようです。

----------

これでうまくいきました！

参考：https://stackoverflow.com/questions/33381029/react-how-to-pass-html-tags-in-props
nuxtでページ遷移時にフェードイン・フェードアウト

- デフォルトでページ遷移のトランジションに `page` というトラジション名が付いているため、page トラジションに css を設定する。
  - https://ja.nuxtjs.org/api/configuration-transition/

``` .assets/css/main.css
.page-enter-active, .page-leave-active {
  transition: opacity 0.1s
}
.page-enter, .page-leave-active {
  opacity: 0
}
```
``` .nuxt.config.js
css: [
  '~/assets/css/main.css'
],
```
Node.jsを用いた定期ツイートbot作成メモ

すぐ忘れるのでメモ。

もっと無駄の少ないやり方なんて知りません、、、
#まずTwitterAPIの取得
申請の際の作文はbotにしか使わないという趣旨を書けばすぐに通るはずです。

API keyとToken keyが得られれば勝ち。
#ツイート内容のコードを作る
用意するのは`npm i Twitter`と`npm i node-schedule`



ツイート
https://yukimonkey.com/js-application/twitter-bot-2/

画像ツイート
https://qiita.com/n0bisuke/items/6b269f61152e9f336c35

時間指定はNode-scheduleを使う


#Heroku
###アカウント作成

タイムゾーンについて、途中で気づいてめんどくさかったのでソースコードの時間を-9hしました。

###Herokuへデプロイ

コマンドはこの記事を参考にしました。
https://qiita.com/daiki7nohe/items/035c39c1e538551b1f6c#git%E3%82%B3%E3%83%9F%E3%83%83%E3%83%88
この二つの記事を参考にapp.jsと、起動するためのコマンドをpackage.jsonに記述するか、procfileを作る
https://qiita.com/yfujii01/items/d675f654f1fcce3b9098
https://www.webprofessional.jp/building-facebook-chat-bot-node-heroku/

###サーバーが寝ないようにする
Heroku Scheduler
https://miyabi-lab.space/blog/23
F#とは「無血」で「人民の人民による人民のためのプログラム」の書ける「希少」で「高速」な言語です。

#F#を知ってますか？
F#は.net系言語です。.netで有名なのはC#ですが、それを知るためには、C,C++,Java,VB,Pythonを知る必要があります。そのうち、手続き型(構造化プログラム)としてはC,VBが有名でオブジェクト指向はJavaやC++やPythonが有名です。また型付けの面ではC,C++,VBは比較的弱い型付け(明示的なキャストが不要)で,JavaやPythonは比較的強い型付けです(明示的なキャストが必要)。C#はオブジェクト指向で比較的強い型付けです。C#はC++という直接OSやハードウェアを操作できるという特性を捨て見やすいコードを作ったことによりC++の生ポインタによる血生臭さを捨てることができましたが、ポインタによる副作用の排除を捨てた(変更できる生の値を副作用という)ことにより生の値を操作することが多くなりました。C++はCよりも副作用の原因となる部分は少ないのでCより大規模開発が向いている(Cよりモジュールが小さいので副作用のない関数を定義しやすい/副作用の温床である#defineを使わなくていいtemplateやinline等,コンストラクタがあるので初期値の不定値という副作用ができづらい)ため最近では組み込み系でも多く使われています。

```ex.cpp
#include<iostream>
using namespace std;

void sum (int* eroge,int* eroge2)
{
	(*eroge) +=  (*eroge2);
}

int main(void)
{
	int eroge = 5;
	int eroge2 = 3;
	sum(&eroge, &eroge2);
	cout << eroge; //8
	return NULL;
}

```

以上のsum関数には副作用はありません。少し回りくどい表現に見えますが(メリットは大きいです)...

#さてF#です。
F#は関数型でとても強い型付けです。F#はそのような血生臭さや変数による副作用の最小化、C#の互換性.net固有の機能(LINQ等)が使える非常に魅力的な言語です。なおF#はとても型付けが強いですが型推論も強いという魅力があり、変数、関数の型は変わることが無い安心感と最適化のしやすさもまた魅力的です。コンパイラで実行するとC#(Javaと同じくらい高速)と同速とも言われるので、高速です。オフサイドルールや関数型の特性から、見やすくコーディングできます。以上の特性から、C++と比べて非常に大規模開発に向き(物にもよるが2000人以上/100万行以上だとF#以外難しいと思う)、今後の主流になると思うので取得して損はないです。あと身近な所ではVtuberの開発にF#が使われること多いといわれています(沢山のメディアを使うので.netを使って色々な所からコードを持ってこれるため/並列処理等複雑な処理がしやすいため)。なおオブジェクト指向もサポートされているのでそちらに慣れている人も入りやすいというメリットもあります。なおOCaml/Haskell/C#から影響を受けている言語なのでそれらの知識があるとなお良いです。

#よく比較されるF#とScala
どちらもVM(仮想機械)言語(scalaはJVM,F#はdotnetのVM)ですができることが違います。
Web開発やCuiアプリ、業務系アプリケーション開発、国の情報インフラや構文解析等をする場合はscalaが向いています。
なおWindowsアプリ、画像解析、Ai、Vtuberやゲーム(2D、3D、4D全てできる。scalaでは2Dさえほとんど不可能な場合も多い)、大規模開発、VR、AR、MR、音楽を使ったアプリケーションを作る場合はF#が向いています。
GPUをあまり使わない処理はscalaが向いていてGPUをぶん回す処理はF#が向いている模様
なお組み込み/制御系に関いてはCとC++くらいしか選択肢がないので省略します。
master以外のブランチからherokuにpushする方法

#railsアプリを作って、herokuをデプロイする(masterブランチ以外からデプロイする方法も同時に載せています。)

##1 コミット
```
$ git add .
$ git commit -m "heroku"
$ git push origin ブランチ名
```

##2 herokuにアプリケーションを新規作成する
```
$ heroku create
```

##3-1 herokuにデプロイする(masterブランチにいる時)
```
$ git push heroku master
```

##3-2 herokuにデプロイする(master以外のブランチにいる時)
```
$ git push heroku <現在いるブランチ名>:master
```

###※3-1 or 3-2　どちらかを実行してください

##4　herokuにデータベースを作成する
```
$ heroku run rails db:migrate
```

##5 アプリケーションを開く
```
$ heroku open
```

以上で、完成です。
Redis の WebAPI (Ruby CGI)

こちらで定めた仕様を満たすサーバーサイドのプログラムです。
Nginx + fcgiwrap で動作を確認しました。
[Redis の WebAPI を作成](https://qiita.com/ekzemplaro/items/1746b31beef382023f2d)

```rb:redis_read.rb
#! /usr/bin/ruby
# -*- coding: utf-8 -*-
# ---------------------------------------------------------------------
#	redis_read.ruby
#
#					Jan/16/2020
#
# ---------------------------------------------------------------------
require 'redis'
require	"cgi"
require	"json"
#
STDERR.puts	"*** 開始 ***"
#
$cgi=CGI.new
key = $cgi["key"]
# key = "t1852"

redis = Redis.new(:host => "localhost", :port => 6379)
value = redis.get key

puts "Content-type: text/json; charset=UTF-8\n\n"
puts value
#
STDERR.puts	"*** 終了 ***"
# ---------------------------------------------------------------------
```

```rb:redis_insert.rb
#! /usr/bin/ruby
# -*- coding: utf-8 -*-
# ---------------------------------------------------------------------
#	redis_insert.ruby
#
#					Jan/16/2020
#
# ---------------------------------------------------------------------
require 'redis'
require	"cgi"
require	"json"
#
STDERR.puts	"*** 開始 ***"
#
$cgi=CGI.new
key = $cgi["key"]
value = $cgi["value"]

redis = Redis.new(:host => "localhost", :port => 6379)
redis.set key,value

puts "Content-type: text/json; charset=UTF-8\n\n"
#
puts value
#
STDERR.puts	"*** 終了 ***"
```

```rb:redis_list.rb
#! /usr/bin/ruby
# -*- coding: utf-8 -*-
# ---------------------------------------------------------------------
#	redis_list.ruby
#
#					Jan/16/2020
#
# ---------------------------------------------------------------------
require 'redis'
require 'json'
#
STDERR.puts	"*** 開始 ***"
#

redis = Redis.new(:host => "localhost", :port => 6379)
keys = redis.keys
json_str = JSON.pretty_generate(keys)

puts "Content-type: text/json; charset=UTF-8\n\n"
puts json_str
#
STDERR.puts	"*** 終了 ***"
# ---------------------------------------------------------------------
```
パワポのメモをAmazon Pollyで読み上げる

Qiitaでも人気な　https://qiita.com/search?q=+Amazon+Polly　
自分なりのメモです。

#料金

>[料金について](https://qiita.com/uenohara/items/f53b7c319b427e8f50d7)
Amazon Polly は従量課金制で、文字あたりの変換のコストが低く、無制限に再生できるため、実質的にどのアプリケーションでも音声の合成を可能にする費用対効果の高い方法です。
AWS 無料利用枠の一環として、Amazon Polly を無料で開始できます。サインアップしていただくと、Amazon Polly を初めて使用するお客様は、最初の 12 か月間は 1 か月あたり最大 500 万文字を無料で利用できます。

最初だけ無料です。

#アカウント
AWSアカウントです。アマゾンプライムとは関係ありません。

#とりあえず話すだけ、プレーンテキスト
入力したものを読み上げてくれます。最初は読み上げただけで感動しました。



##小学生の国語が大事
書いている文章と発音されたときの印象がちがうので、普段からの国語力が大事だと痛感する。
「、」区切りとして発音も途切れます。
「。」発音の終わりとして「、」よりも長めに音が途切れている印象です。
「【」いろんな括弧です。括弧でくくられた文字列を特定の単語として認識しているようで、音の区切りもあります。

#SSML
ミカンのサイズじゃない。マークアップ言語でいろいろと加工ができます。
[音声合成マークアップ言語（SSML）のリファレンス](https://developer.amazon.com/ja-JP/docs/alexa/custom-skills/speech-synthesis-markup-language-ssml-reference.html)

##1行の終わり
おなじようなことができるけど、微妙に違うっぽい。

```
<p>ああ</p>
いい。
<break time="1s" />
```
スライドごとに文章を作成していたので、文章の最後に「`<break time="1s" />`」を挿入して余韻っぽく使用しました。


##特殊な発音
1/3とかは分数と指定しないといけない。

```
<say-as interpret-as="fraction">1/3</say-as>
```
他にもsay-asでいろいろと指定ができる。

##漢字の発音
「工場棟」とかいて「こうじょうとう」と発音してほしいのに「こうじょうむね」みたいに意図しない発音がされることがありました。同音の「塔」で対処しましたが、プレーンテキストだけをみると違和感があるのでマークアップします。

```
<sub alias="塔">棟</sub>
```


#特別な語句
自分は使用しませんでしたが、[Speechconリファレンス（感嘆詞）: 日本語](https://developer.amazon.com/ja-JP/docs/alexa/custom-skills/speechcon-reference-interjections-japanese.html)を使うと楽しそうです。

```
<speak>
    speechconの例を示します。
　　じゃんけんぽん。
    <say-as interpret-as="interjection">じゃんけんぽん</say-as>.
</speak>
```

※川に桃が流れてくるときにしか使わない「どんぶらこ」も含めてほしい。

#作業手順
1.パワポのスライド作成
2.パワポのメモ作成
3.メモをSSMLとしてテキストとして別名で保管
4.Amazon PollyでMP3作成
メモを作成しないといけなかったので、面倒だった。

面倒だったけど、録音場所を確保して誰かに喋らせるよりかは各段に早い＆修正も気が楽なので満足しています。
ELBからALBに変更したら初回の接続が遅くなった(igwの設定を見直して解消)

# 事象

ELBでは遅くなかったのに、ALBを利用すると初回の接続が遅くなるケースに相対しました。
データ量が重いという感じではなく、接続までに時間がかかっている、という感触です。

その後は、一定期間は遅さを感じなくなり、また一定時間後に遅くなる、という挙動でした。

# 原因と解決策

VPCのルーティングテーブルの関連付けに問題がありました。
ALBは最低二つのpublicなsubnetを指定する必要がありますが、両方ともigwを設定している必要があるようです。


私の場合は、以下のルーティングになっていました。

- ap-northeast-1a:public
    - デフォルトゲートウェイ: インターネットゲートウェイ
- ap-northeast-1c:public
    - デフォルトゲートウェイ: なんとNATゲートウェイを指定
        - ここを1aと同じインターネットゲートウェイを指定することで解消した。
        - おそらく、新しくigwを作っても解消する。

もともとMulti AZ構成を取っていればこのようなことにはならなかったのでしょうが、Single AZ構成で運用していたため変なルーティングテーブルになっていたのに気づいていませんでした。


# 参考

- https://qiita.com/TakenoriHirao/items/a3ace404d785e6a4db22
- https://stackoverflow.com/questions/35523421/aws-elastic-load-balancing-seeing-extremely-long-initial-connection-time
- https://stackoverflow.com/questions/48287348/aws-application-load-balancing-seeing-extremely-long-initial-connection-time/48287350#48287350
仮想無線NICを生成するmac80211_hwsim


## mac80211_hwsimとは？
* カーネルモジュールの一つで、仮想の無線インターフェイスを作ることができる
* 2つの仮想インターフェイスを作り、一方をアクセスポイント、もう一方をクライアントにして通信のテストを行うことができる


## 使い方
```
# Load the module
$ sudo modprobe mac80211_hwsim
```

モジュールを読み込むと、仮想インターフェイスが生成される

```
$ ip a
45: wlan0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 02:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff
46: wlan1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 02:00:00:00:01:00 brd ff:ff:ff:ff:ff:ff
47: hwsim0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ieee802.11/radiotap 12:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff
```

wlan0とwlan1が生成された。数を指定しなければ、２つのNICが生成される。hwsim0は全てのチャンネルのフレームを観測できるインターフェイスらしい。
モジュールを解除すると、仮想インターフェイスは消える

```
# Load the module
sudo modprobe -r mac80211_hwsim
```

radiosというパラメータが存在し、生成する仮想NICの数をしていすることができる

```
$ sudo modprobe mac80211_hwsim radios=5
$ ip a
~~略~~
48: wlan0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 02:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff
49: wlan1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 02:00:00:00:01:00 brd ff:ff:ff:ff:ff:ff
50: wlan2: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 02:00:00:00:02:00 brd ff:ff:ff:ff:ff:ff
51: wlan3: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 02:00:00:00:03:00 brd ff:ff:ff:ff:ff:ff
52: wlan4: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 02:00:00:00:04:00 brd ff:ff:ff:ff:ff:ff
53: hwsim0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ieee802.11/radiotap 12:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff
```

https://wireless.wiki.kernel.org/en/users/drivers/mac80211_hwsim
WRF / WPS > Jupyter Notebook > OI SST(NetCDFファイル)を読込みMatplotlibで画像表示

```txt:動作環境
Xeon E5-2620 v4 (8コア) x 2 
32GB RAM 
CentOS Linux release 7.7.1908 (Core)
Python 3.6.8 (default, Aug  7 2019, 17:28:10) 
IPython 7.9.0 -- An enhanced Interactive Python. Type '?' for help.
```

### 関連

- [2020-01-15 WRF > NCEP SST Analysisデータ終了後のSSTデータの選択 > OI SSTデータの使用](https://qiita.com/7of9/items/39ae638926341b73c769)

### 実装

OI SSTファイル(NetCDF形式)を読込んで画像表示する。

```python:ReadNetCDF_200116.ipynb
import netCDF4
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.cm as cm

INFILE = '20200111120000-NCEI-L4_GHRSST-SSTblend-AVHRR_OI-GLOB-v02.0-fv02.0.nc'
nc = netCDF4.Dataset(INFILE, 'r')
nlat = len(nc.dimensions['lat'])
nlon = len(nc.dimensions['lon'])
lons = nc.variables['lon'][:]
lats = nc.variables['lat'][:]
ssts = nc.variables['analysed_sst'][:]
print(nlat, nlon)
#print(lons)
#print(lats)
#print(ssts)
nc.close()

grid = ssts.reshape((nlat, nlon))
plt.imshow(grid, interpolation='nearest', cmap=cm.gist_rainbow)
plt.colorbar()
```

### 結果

![200116.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32870/b1b5e47d-af8e-b28d-c138-20f6bfe62d63.png)

上下反対になったが、実際にはlat, lon情報をもとに後続の処理で使う予定。
lats, lonsは0.25刻みのデータであった。

### 参考

- [PythonでNetCDFの読み書き](https://qiita.com/okadate/items/954574a95545b06ca257)

情報感謝です。
Redmine test でmocha/setupがないエラー(cannot load such file -- mocha/setup (LoadError))

####環境
Redmineのローカル開発環境
MacOS 10.15.2
Rails 5.2.3

####エラー内容
testを実行しようとすると下記のエラーが出る。

```Bash:
cannot load such file -- mocha/setup (LoadError)
```

####原因
.bundle/configを確認してください。

```Bash:.bundle/config
BUNDLE_WITHOUT: "development:test"
```

となっている場合、GemfileのtestグループのGemがインストールされません。

####解決
.bundle/configを下記のように変更してください。

```Bash:.bundle/config
BUNDLE_WITHOUT: "development"
```

再度bundle installを実行してください。

```Bash
bundle install
```

エラーが出なければGemfile内のtestグループに記載されている"mocha"がインストールされます。

```Bash:Gemfile
gem "mocha"
```

これで、testを実行した時mocha/setupがないというエラーは出ないと思います。

####参考
https://qiita.com/mana-bin/items/4e24247dc074ccee3a4f
nohupと一緒に使うと便利なあれこれ

`nohup コマンド &` : コマンドをバックグラウンドで実行
`less +F nohup.out` : 標準出力とエラー出力のログを流す
`ps aux` : プロセスの確認

puttyのバックグラウンドカラー変更
設定の変更＞ウィンドウ＞色＞Default Bacgroundの値変更＞セッションを選択＞保存
１本目：【備忘】Virtual BoxでホストOSからゲストOSにSSH接続

#環境
ホストOS：Windows 10
ゲストOS：Ubuntu (16.04.6)
#試したこと
〇VirtualBoxに以下のネットワーク設定
　今回は社内環境にある端末を利用したので、NAT＋ホストオンリーアダプタ方式でセットアップ実施。
　・アダプター１：NAT　
　　基本的にはデフォルト設定。
　　ポートの干渉を防ぐために念のためポートフォワーディング。
　　(ホストOS：50022　→　ゲストOS：22)
　・アダプター２：ホストオンリーアダプタ
　　デフォルトで設定。

〇ゲストOSにssh-serverをインストール

〇TeraTermでゲストOSにアクセス
　enp0s8(ホストオンリーアダプタ)のデフォルトゲートウェイのIPアドレスにアクセスする。
　
⇒以上の手順で無事接続できた。
#反省
　・TeraTermでゲストOSにアクセスするときに誤ったIPアドレスを設定しておりかなり長い時間ハマった
　　Virtual Boxのネットワークをよく理解せず、ネット上の手順を追いながら実施したことが悪かった。
　　ゲストOSからは外部に接続できるが(クライアントPCが外部ネットワークのWebサーバにアクセスするのと同等)、
　　ホスト側からはゲストOSは見えないので、ホストオンリーアダプタという仕組みを利用して接続する必要があった。
GitHub Actions で README の目次の生成を自動化する

## はじめに
CI/CDに注目されがちなGitHub Actionsですが、OSS開発のちょっとした作業を自動化することも可能です。
ここでは README の目次の生成を自動化する方法を紹介します。

## 対象
GitHubを利用している開発者

## 実装
1. 目次を入れる箇所を指定

    ```md:README.md
    <!-- START doctoc -->
    <!-- END doctoc -->
    ```

1. [TOC Generator](https://github.com/technote-space/toc-generator) を利用する Workflow を作成

    ```yml:github/workflows/toc.yml
    on: push
    name: TOC Generator
    jobs:
      generateTOC:
        name: TOC Generator
        runs-on: ubuntu-latest
        steps:
          - name: TOC Generator
            uses: technote-space/toc-generator@v2
            with:
              GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
    ```

## 動作確認

![screenshot.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264159/5f7f1dbc-63ce-c084-1923-0fe2ae382596.gif)

## 補足
[指定可能なオプション](https://github.com/technote-space/toc-generator/blob/master/README.ja.md#%E3%82%AA%E3%83%97%E3%82%B7%E3%83%A7%E3%83%B3)

### GITHUB_TOKEN
GitHub Actions から提供される `GITHUB_TOKEN` は連続するイベントを作成する権限がありません。
したがってこのアクションによって目次の変更がプッシュされてもプッシュでトリガーされる他のWorkflowは実行されません。
これはブランチプロテクションを設定している場合に問題になる場合があります。
これを避けたい場合は `personal access token` を使用します。

1. public_repo または repo の権限で [Personal access token](https://help.github.com/en/github/authenticating-to-github/creating-a-personal-access-token-for-the-command-line) を生成
(repo はプライベートリポジトリで必要)
1. [Secretsに保存](https://help.github.com/en/actions/automating-your-workflow-with-github-actions/virtual-environments-for-github-hosted-runners#creating-and-using-secrets-encrypted-variables) (例：ACCESS_TOKEN)
1. `GITHUB_TOKEN` の代わりに `ACCESS_TOKEN` を使用

    ```yml:.github/workflows/toc.yml
    on: push
    name: TOC Generator
    jobs:
      generateTOC:
        name: TOC Generator
        runs-on: ubuntu-latest
        steps:
          - name: TOC Generator
            uses: technote-space/toc-generator@v2
            with:
              # GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
              GITHUB_TOKEN: ${{ secrets.ACCESS_TOKEN }}
    ```

### プルリクエストの作成
直接プッシュする代わりにプルリクエストを作成することも可能です。

```yml:.github/workflows/toc.yml
on:
  pull_request:
    types: [opened, synchronize, reopened, closed]
name: TOC Generator
jobs:
 generateTOC:
   name: TOC Generator
   runs-on: ubuntu-latest
   steps:
     - name: TOC Generator
       uses: technote-space/toc-generator@v2
       with:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
```

![create_pr.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264159/16fb674e-17cf-ba4e-8367-e642fc12a49d.png)

### 実際に使用している例
- Release GitHub Actions
 - [toc.yml](https://github.com/technote-space/release-github-actions/blob/master/.github/workflows/toc.yml)
 - https://github.com/technote-space/release-github-actions/actions?query=workflow%3A%22TOC+Generator%22
【メモ】migrate

rails db:migrate

・model
1  rails generate controller StaticPages home help

2  rails generate model User name:string email:string

3  rails generate model Article content:text user:references


4  rails generate model Relationship follower_id:integer followed_id:integer

5　rails g model Like user_id:integer article_id:integer


・add
2  rails generate controller Users new

2  rails generate migration add_index_to_users_email
   rails generate migration add_password_digest_to_users password_digest:string
   rails g migration add_image_column_to_users
   rails g migration add_image_name_to_users
   rails generate controller Sessions new

3  rails generate controller Articles  
   rails generate uploader Picture
   rails generate uploader Image
   rails generate migration add_picture_to_articles picture:string

5 rails g migration add_likes_count_to_articles likes_count:integer
  rails g migration add_article_tag_to_articles
UE4でUTextureをPNGのTArray<uint8>に変換する

オンメモリでテクスチャをPNG形式にしてアップロードしたかったのでUTextureをPNGのTArray<uint8>形式に変換してみました。
UE4.27.2、UE5.1.1で確認しています。
以下のコードを参照しています(ほぼそのままです)。

* [Engine/Source/Runtime/ImageWriteQueue/Private/ImageWriteBlueprintLibrary.cpp](https://github.com/EpicGames/UnrealEngine/blob/4.24/Engine/Source/Runtime/ImageWriteQueue/Private/ImageWriteBlueprintLibrary.cpp#L132)
* [c++ - How to export FTexture2DRHIRef to png? - Stack Overflow](https://stackoverflow.com/questions/45239108/how-to-export-ftexture2drhiref-to-png)

ENQUEUE_UNIQUE_RENDER_COMMAND_ONEPARAMETERを使うとENQUEUE_RENDER_COMMANDを使えと怒られたので以下のページを参照して対応しました。

[How to use ENQUEUE_RENDER_COMMAND instead of ENQUEUE_UNIQUE_RENDER_COMMAND_ONEPARAMETER - Unreal Engine Forums](https://forums.unrealengine.com/development-discussion/engine-source-github/1608365-how-to-use-enqueue_render_command-instead-of-enqueue_unique_render_command_oneparameter)

```c++
#include "ImageUtils.h"
#include "GenericPlatform/GenericPlatformProcess.h"

void HogeHoge::Convert(UTexture* Img, TArray<uint8>& ImgData)
{
	if (!Img || !Img->Resource || !Img->Resource->TextureRHI)
	{
		UE_LOG(LogTemp, Warning, TEXT("Upload Texture is invalid"));
		return;
	}

	FTexture2DRHIRef Texture2D = Img->Resource->TextureRHI->GetTexture2D();
	if (!Texture2D)
	{
		UE_LOG(LogTemp, Warning, TEXT("Upload Texture2D is invalid"));
		return;
	}

	TArray<FColor> OutPixels;
	struct FReadSurfaceContext
	{
		FTexture2DRHIRef Texture;
		TArray<FColor>* OutData;
		FIntRect Rect;
		FReadSurfaceDataFlags Flags;
	};

	FReadSurfaceContext ReadSurfaceContext =
	{
		Texture2D,
		&OutPixels,
		FIntRect(0, 0, Texture2D->GetSizeXY().X, Texture2D->GetSizeXY().Y),
		FReadSurfaceDataFlags(RCM_UNorm, CubeFace_MAX)
	};

	FReadSurfaceContext Context = ReadSurfaceContext;
	ENQUEUE_RENDER_COMMAND(ReadSurfaceCommand)(
		[Context](FRHICommandListImmediate& RHICmdList)
	{
		RHICmdList.ReadSurfaceData(
			Context.Texture,
			Context.Rect,
			*Context.OutData,
			Context.Flags
		);
	});

	FlushRenderingCommands();

#if ENGINE_MAJOR_VERSION >= 5
	TArray64<uint8> ImgData64;
	FImageUtils::PNGCompressImageArray(Context.Rect.Width(), Context.Rect.Height(), OutPixels, ImgData64);

	ImgData.AddUninitialized(ImgData64.Num());
	FMemory::Memcpy(ImgData.GetData(), ImgData64.GetData(), ImgData64.Num() * sizeof(uint8));
#else
	FImageUtils::CompressImageArray(Context.Rect.Width(), Context.Rect.Height(), OutPixels, ImgData);
#endif
```
SourceTree for Windows の設定を新しいマシンに移行する

# SourceTree for Windows の設定を新しいマシンに移行する

以下のファイルをコピーする。

- C:\Users\\&lt;username&gt;\AppData\Local\Atlassian\SourceTree\bookmarks.xml
- C:\Users\\&lt;username&gt;\AppData\Local\Atlassian\SourceTree\opentabs.xml
- C:\Users\\&lt;username&gt;\AppData\Local\Atlassian\SourceTree\userhosts
- C:\Users\\&lt;username&gt;\AppData\Local\Atlassian\SourceTree.exe&lt;random_string&gt;\\&lt;version_number&gt;\user.config

SourceTree for Windows 3.3.6 で移行できることを確認.

公式のソースでは [How to Wipe SourceTree Preferences](https://confluence.atlassian.com/sourcetreekb/how-to-wipe-sourcetree-preferences-412484640.html) が参考になる. (SourceTree の設定をクリアする手順)
Eclipseの設定をエクスポートして違うワークスペースにインポートする方法



# 設定全般
- 環境
    - CentOS Linux release 7.7.1908 (Core)
    - Eclipse IDE for Enterprise Java Developers Version: 2018-12 (4.10.0)

## 設定をエクスポートする
1. [File] > [Export]でダイアログを表示する
1. [General] > [Preferences] > [Next]ボタンで次画面へ
1. [Export all]チェックボックスにチェックが入っていることを確認する![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159761/dec1b1a5-ad10-3551-858c-87e502582c6a.png)
1. [To preference file:]の[Browse...]ボタンで保存先ディレクトリとファイル名を設定する
    - ファイルを作成するのにコマンドでは`sudo`が必要な場所(`/opt`ディレクトリ等)を指定するとパーミッションエラーのダイアログが出る。 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159761/41be592f-9756-38ef-dad0-d422a0b5729b.png)
1. [Finish]ボタンでエクスポートする

## 設定をインポートする
1. [File] > [Import]でダイアログを表示する
1. [General] > [Preferences] > [Next]ボタンで次画面へ
1. [From preference file:]の[Browse...]ボタンでエクスポートしたファイルを設定する
1. [Import all]チェックボックスにチェックが入っていることを確認する
    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159761/38c90b4f-caaa-c7cb-db4d-b4f1cb67d238.png)
1. [Finish]ボタン > 再起動を促されるのでEclipseを再起動する
    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159761/3d490773-6a85-83b1-4276-6b4dab2add02.png)

## この方法でインポートできないもの
- Checkstyleでインポートしておいた設定


# Javaのフォーマッタ
- 参考 : [Eclipseの設定をインポート&#12539;エクスポートする](http://wada811.blogspot.com/2012/04/eclipse.html)

1. エクスポートする
    2. [設定] > [Java] > [コード・スタイル] > [フォーマッター] > 対象のフォーマッタを選択 > 編集 > [エクスポート]ボタン
1. インポートする
    2. [設定] > [Java] > [コード・スタイル] > [フォーマッター] > [インポート]ボタン
App Store Connect の Missing Compliance をなくす方法

## 問題
TestFlight配信するために IPAファイルをApp Store Connectへアーカイブしているのですが、アーカイブ後の処理（長い）が終わったあとで毎回「Missing Compliance」というワーニングがでて、毎度アーカイブ後にApp Store Connect開いて対処する必要がありました。

## Missing Complianceとは
これが何のかというと、独自の暗号方式を利用している場合は適切なドキュメントを提出する必要がありますよ、という話で、独自の暗号化しないならNOを選ぶという事になると思います。それなら毎回聞かれたくないですよね。

## 方法
`Info.plist` に 下記を加えるだけです。

```xml
<key>ITSAppUsesNonExemptEncryption</key>
<false/>
```

Xcodeからの追加だと、Keyの名前は `App Uses Non-Exempt Encryption`となるので気をつけましょう。

## 参考
https://stackoverflow.com/a/35842359/6891441

https://developer.apple.com/documentation/bundleresources/information_property_list/itsappusesnonexemptencryption
random.randint(a,b) と np.random.randint(a,b)  を入れ替えると分析結果が正反対になってしまった！

#実は違っていた！random.randint(a,b) と np.random.randint(a,b) 
  
Pythonでよく使われているライブラリでこんなことがあるのかとハマってしまった件。
次のGoogle Collaboratory で実行可能な単純なコードを見てもらいたい。
広く使われている一般的なライブラリを呼び出しているだけだし
式的には全く同じように見えるのですが、
出力結果が似ていて実は異なる結果になっていることを。

We need some caution when using randint whether this function is called from random library or numpy library. The result will be very different !!

```
import random
import numpy as np
 
for i in range (500):
 print (np.random.randint(0,37))

for j in range (500):
 print (random.randint(0,37))
```

numpyをつけて呼び出したrandomの場合は0~36しか出力されない。
一方でnumpyをつけずにrandomを呼び出した場合は0~37になってしまうのだ！

なぜ気づいたかというと
以前、カジノで儲けられないかを検証した記事を投稿したのですが、
ランダム結果が違うのではないかとの指摘があり、
調査したところ
np.random.randint(a,b) と random.randint(a,b)
の分析結果が全く違うことが判明！正反対の結果になり（ ; ; ）(T.T)
普段から使われていそうなこんな単純な式で
全く異なる分析結果が生まれることになってしまう紛らわしいことってあるんだ！
注意喚起資料をネットで見たことがなかったのだが。

皆さんも普段から使われているコードで少し先頭に何かついただけで挙動が変わってしまうということがあるかもしれない。いや、ライブラリ使っていると絶対にあるはず！
良い勉強になりました！

元の記事：
https://qiita.com/mnoda/items/3a0d1f6e21b52bbf79d0#comment-904693840460457f4ae3
GitHubのプルリクエストで差分が更新されない時

お疲れ様です。

GitHubでプルリクエストが乱立していて、
片っ端からdevelopブランチにマージしていく作業で1日が終わる、そんな日もあります。


## プルリクエストのFiles Changedが更新されない・・・
ふと、子ブランチをdevelopにマージしたのに、
孫ブランチのプルリクエストを見ると、子ブランチ分の差分が更新されていないことに気づきました。
孫ブランチに子ブランチをマージしてもダメ、developもマージ済みの状態でした。

参考：[GitHubのプルリクエストの差分はどこと比較しているか？(git diffの".."と"..."の違い)](https://qiita.com/m-yamazaki/items/e57e357116e95ae370dc)
この記事を見たところ、GitHubのヘルプに、以下のように記載されていて、差分はトリプルドットとのことでした。
>
By default, pull requests on GitHub show a three-dot diff, or a comparison between the most recent version of the topic branch and the commit where the topic branch was last synced with the base branch.

参考: [About comparing branches in pull requests](https://help.github.com/articles/about-comparing-branches-in-pull-requests/#three-dot-and-two-dot-git-diff-comparisons)

## マージしても更新されない状態・・・
しかし、本来、ベースブランチとの差分は孫ブランチの修正しか無い状態なのに、
子ブランチの差分が出てしまっていてどうもおかしい。
トリプルドットでも子ブランチの差分は無くなるはずです。

プルリクエストを作りっぱなしの状態のため、差分がキャッシュされていると思い、
試しにプルリクエストを作り直したところ、期待通り現状のベースブランチとの差分が検出されました。
やはりプルリクエスト作成時のベースブランチをキャッシュしているようです。
ちなみに一時的にプルリクエストのベースブランチをmasterにするなどしてから戻しても、差分が更新されました。

## ベースブランチを変更する時のメッセージにヒントが
ベースブランチを変更する時、以下のようなダイアログボックスが表示されていました。

> Some commits from the old base branch may be removed from the timeline, and old review comments may become outdated.

つまり
> 古いベースブランチからの一部のコミットはタイムラインから削除され、古いレビューコメントはoutdatedになる可能性があります。良いですか？

と聞いてきていました。
レビューコメントのために、古いベースブランチをキャッシュしているんですね。
コメントの仕組みを考えてみれば納得でした。

## まとめ
* プルリクエストのFiles changedのベースブランチ情報は保存されている
* プルリクエストを作成した時点のベースブランチを保存している
* ベースブランチが更新されてもプルリクエストのベースブランチ情報は更新されない
* プルリクエストのベースブランチを変更しても情報が更新される
UnityとiPhoneでリアルタイムフェイシャルモーションキャプチャー

PC上のUnityとiPhoneでリアルタイムフェイシャルモーションキャプチャーするアプリ「iFacialMocap」と、ソフトウェア＆スクリプトを公開しました。
https://ifacialmocap.jimdofree.com/
![UnityGif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492401/c5083fc9-0975-794e-6ccc-f770c22dd0d9.gif)

現状の3DCG系のVTuberの多くは、おそらく人間の顔の動きをキャプチャせずに「リップシンク」と呼ばれる「声の音」に反応して表情が動いているものと思われます。

現状のVTuberの動きは、「あ」という声を出したら「a」のブレンドシェイプを動かして、「い」という声を出したら「i」のブレンドシェイプを動かして....といった感じで、現実の人間の動きを取り込んでいるわけではなく、音に反応しているだけです。OVRLipSyncというのを使っている方が多いのではないかと思います。また、VTuberの目・眼球の動きはEyes Animatorというアセットを使っている方も多いのではないかと思います。
他に、バーチャルモーションキャプチャというソフトに搭載されているリップシンク機能などを使っている場合もあるかもしれません。

アニメ調のデザインのVTuberならそれでも良いのですが、ちょっと前にTwitterで伸びていた、以下のようなリアル寄りの3DCGを動かそうと思うと、リップシンクだけでは実現できません。

<blockquote class="twitter-tweet"><p lang="en" dir="ltr">Digital Human based on Unity HDRP.<br>AR remote, Realtime Raytracing SSAO.<br>it can follow user&#39;s facial moving by iphone.<br><br>Individual works by Hyeong-il Kim / Gyutaek Lee<a href="https://twitter.com/hashtag/unity?src=hash&amp;ref_src=twsrc%5Etfw">#unity</a> <a href="https://twitter.com/hashtag/hdrp?src=hash&amp;ref_src=twsrc%5Etfw">#hdrp</a> <a href="https://t.co/n1TKZt2m8w">pic.twitter.com/n1TKZt2m8w</a></p>&mdash; illu (@illustor) <a href="https://twitter.com/illustor/status/1211688875237601280?ref_src=twsrc%5Etfw">December 30, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

しかし、iFacialMocapを使用すると、人間の動きを取り込めるので、上記のツイートのようなモーションキャプチャーも可能です。(モデリングとシェーダーの技術さえあればの話ですが)
上記のツイートの動画はiPhoneXのモーションキャプチャの機能を使って作られています

ダウンロードは以下から
https://ifacialmocap.jimdofree.com/download/

ホームページで使用方法をテキストで紹介しています。
https://www.ifacialmocap.com/tutorial/unity/japanese

YouTube動画でも使用方法を確認できます。
https://youtu.be/7zUSQ0tVZco
[![IMAGE ALT TEXT HERE](http://img.youtube.com/vi/7zUSQ0tVZco/0.jpg)](http://www.youtube.com/watch?v=7zUSQ0tVZco)
プロキシ環境下でBot Framework Emulatorでローカル確認できない問題への対処

# TL;DR

- Bot Frameworkを利用した[Azure Bot Service](https://docs.microsoft.com/ja-jp/azure/bot-service/?view=azure-bot-service-4.0)の開発時、プロキシ環境下では、[Bot Framework Emulator](https://github.com/microsoft/BotFramework-Emulator)のローカルでの確認ができない問題への対処方法

# 環境

- Visual Studio 2019 16.4.3
- .NET Core 2.1
- Microsoft.Bot.Builder.AI.QnA 4.7.1
- Microsoft.Bot.Builder.Integration.AspNet.Core 4.7.1

# 事象

Visual StudioでBot Serviceを起動し、Bot Framework Emulatorでサービス（`http://localhost:3978/api/messages`）を確認しようとした場合、以下のようなメッセージが表示されサービスに接続できない

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204150/130194b7-b824-c774-b93a-a2fb3041bcd0.png)


```:ログの表示
[12:31:18]Emulator listening on http://[::]:65043
[12:31:18]ngrok not configured (only needed when connecting to remotely hosted bots)
[12:31:18]Connecting to bots hosted remotely
[12:31:18]Edit ngrok settings
```

# 原因

Bot Framework EmulatorでBot Serviceに接続する際、環境変数にプロキシ（`HTTP_PROXY`、`HTTPS_PROXY`）関連設定がある場合は、プロキシを経由して接続しようとする。

しかし、Visual Studioで実行したローカルのサービスアドレスにはプロキシ経由では接続できない。

# 対策

環境変数`no_proxy`を追加設定する。

以下の例は、すでにAzure DevOps Server（オンプレ版Azure DevOps）がある環境での設定となる。
（Gitを使用した場合も同様の問題がある）

## 変更前

|変数名|変数値|
|:--|:--|
|HTTP_PROXY|`http://(プロキシサーバーのホスト名 or IPアドレス):(ポート番号)`|
|HTTPS_PROXY|`http://(プロキシサーバーのホスト名 or IPアドレス):(ポート番号)`|
|no_proxy|`(Azure DevOps Serverのホスト名 or IPアドレス)`|


## 変更後

no_proxyにlocalhostを追加。

|変数名|変数値|
|:--|:--|
|HTTP_PROXY|`http://(プロキシサーバーのホスト名 or IPアドレス):(ポート番号)`|
|HTTPS_PROXY|`http://(プロキシサーバーのホスト名 or IPアドレス):(ポート番号)`|
|no_proxy|`(Azure DevOps Serverのホスト名 or IPアドレス),localhost`|
Pythonのpyqtgraphを使う

##経緯
グラフを描画するにはmatplotlibを使えばいいが、リアルタイムでグラフを更新する際はより高速なpyqtgraphを使った方が良さそう.
matplotlibも工夫次第では、高速処理ができるみたいだが、よく分からない.
##環境
python 3.7
##ソースコード
三つのデータをそれぞれ表示し、１秒後にデータの先頭要素が消えていき、その流れを描画する.

```py
from pyqtgraph.Qt import QtGui, QtCore
import pyqtgraph as pg
import sys

R = [255,   0,   0]
G = [  0, 255, 255]
B = [  0,   0, 255]

win = None
plt = None
data = [[1,-1,2,-2,3,-3,4,-4],[10,-10,9,-9,8,-8,7,-7],[0,1,0,2,0,3,0,4]]
curve = list()
app = QtGui.QApplication([])


def init():
    global curve
    global plt
    global win
    win = pg.GraphicsWindow()
    #windowのタイトル
    win.setWindowTitle('Window Title')
    #windowの大きさ
    win.resize(1280,800)
    #アンチエイリアスをOn
    pg.setConfigOptions(antialias=True)

    plt = win.addPlot()
    #グラフのタイトル
    plt.setTitle('<font size=\'4\' color=\'#FFFFFF\'>'+ 'plot Title' +'</font>')
    #目盛り線の設定
    plt.showGrid( True, True, 1 )

    #表示する際にグラフをどのぐらい拡大するか設定
    plt.setXRange( -20, 20 )
    plt.setYRange( -20, 20 )

    #左側に軸ラベルを設定
    label = '<font color=\'#' + 'FFFFFF'+'\'>'+ 'y' +'</font>'
    unit = '<font color=\'#' + 'FFFFFF'+'\'>' + 'cm' +'</font>'
    plt.setLabel('left', label, unit)
    #凡例を表示する
    plt.addLegend()

    tmp = 0
    #グラフを追加する
    while tmp < len(data):
        #penとnameは凡例に適応される
        curve.append(plt.plot(pen = (R[tmp],G[tmp],B[tmp]), name = ('data' + str(tmp+1)) ))
        tmp += 1


def update():
    global data
    i = 0
    if(len(data[0]) > 0):
        while i < len(data):
            curve[i].setData(data[i])
            del data[i][0]#頭から要素を消す
            i += 1


if __name__ == '__main__':
    init()

    timer = QtCore.QTimer()
    timer.timeout.connect(update)
    timer.start(1000)#ミリ秒単位

    # Start Qt event loop unless running in interactive mode or using pyside.
    if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'):
        QtGui.QApplication.instance().exec_()
```

##結果
![スクリーンショット 2020-01-16 12.47.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177825/5c1be46c-fe68-5b27-8749-06448ca0fcae.png)

文字のフォントなどはhtmlみたいにタグで書けるのいいですね
migrationがさっぱりピーマンだったのでまとめてみた

migrate
テーブルとかカラムの設定を書くやつ

nullは空の値を許さない制約(falseで制約する)。
例）t.string :name, null: false # nameの中身は空の値が許されない。
uniqueは一意性で、同じ値を許さない制約（trueで制約）。
例)add_index :users, :email, unique: true # （usersはOK）emailの同じ値を許さない。
foreign_keyは外部キーの先の値が空なのを許さない制約（trueで制約）。
例)t.references :user, foreign_key: true #userテーブルにあるuser_idが送られるの先のレコード(横の（フィールド）データ)の値が空なのを許さない。

add_indexは検索速度向上させるための各カラムのデータの保存の仕方をするようにさせる命令。
例）add_index :score, :name, :scores
因みに[]でくくるとその組み合わせで検索した時速度が上昇するようになる。
例)add_index :users [:name, :email]
注意）何でもかんでもやれば良いというものではない。この設定は検索速度が早くなる代わりに保存、更新速度が下がり、さらにデータベース容量も使うことになる。
【初心者】データベースが作成できない時の対処法（create database dotinstall_todo_app;）

mysqlをいじっていたらデータベースが作れなくなる事態に陥りました^^;

```
create database dotinstall_todo_app;

ERROR 1006 (HY000): Can't create database 'dotinstall_todo_app' (errno: 2)
```

#エラーに対して試したこと



ネットで解決方法を調べていると<b>$ mysql.server restart</b>すればいいと記載が！
しかし、上記コマンド通りmysqlを再起動しても<b>ERROR! MySQL server PID file could not be found!</b>

またもエラー・・・・

#解決方法

```
$ ps ax | grep mysql

sudo kill -TERM 17259 //mysqldを削除

```



その後、mysql.server restartではなく
sudo mysql.server restartを実行する

```
rooter:var neko$ sudo mysql.server restart
Password:
Sorry, try again.
Password:
 ERROR! MySQL server PID file could not be found!
Starting MySQL
.. SUCCESS! 
```

これでcreate database dotinstall_todo_app;が作成できた。
MYSQLでユーザー作成が出来ない方対象！（ERROR 1290 (HY000):～）



```
mysql> CREATE USER dbuser@'localhost' IDENTIFIED BY 'test';

ERROR 1290 (HY000): The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement
```

見かけないエラー文が表示されて困りました・・・
しかし、調べたらすぐに解決したので共有させて頂きます。

#解決方法

```
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

mysql> CREATE USER dbuser@'localhost' IDENTIFIED BY 'test';
Query OK, 0 rows affected (0.03 sec)
```

これだけで無事解決しました。
EC2にファイルをアップロードする

`EC2`に圧縮して置きたいけれど、`FTP`のポートが空いてない。
`cyberduck`使えないじゃん〜。という時の方法。
ちなみにMacBookでのやり方です。

##ファイルを用意
とりあえずデスクトップに`test.txt`を作り保存します。
これはやり方なので、テキストでもなんでも構いません。

##ターミナルを開きます。
今回は`ssh`でファイルをアップします。

##デスクトップに移動
`YourName`は適宜打ち替えて下さい。

```sh
$ cd /Users/YourName/Desktop
```

##圧縮する
デスクトップに`test.tar.gz`というファイルができていると思います。

```sh
$ tar zcvf test.tar.gz test.txt
```

##アップロードする
`scp`でアップします。

```sh
$ scp  test.tar.gz  ●●●-dev-1:/var/www/
```
この「●●●-dev-1」って何だ？と思うかもですが、
それは`.ssh > config`に、この設定名で書いておいて下さい。

（補足）`.ssh`が見えない？そういう時は、隠しファイルを見えるようにして下さい。
（補足）`bastion`（踏み台サーバー）がない場合は`ProxyCommand`はいらない。

```config
Host ●●●-dev-1
  HostName XX.XX.X.XXX
  User ec2-user
  ProxyCommand ssh -W %h:%p ●●●-dev-bastion
  IdentityFile ~/.ssh/●●●-dev.pem
```

##EC2にログインして移動する。
普通にログインする。置きたい場所に移動する。

```sh
$ ssh ●●●-dev-1
$ cd /var/www
```

##解凍する
ファイルがあるか確認して、解凍する。同じ階層に「test.txt」ができる。

```sh
$ ls -l
$ tar zxvf test.tar.gz
```

##圧縮したファイルは削除する
```sh
$ rm -r test.tar.gz
```

どうですかね？うまく行きましたかね？
Mac の terminalでTab 補完を有効にする2020年版

Macのterminal/iTerm2でTab補完をずっと前から有効にしたかったのですが、意外と古い情報ばかりでどれを信頼していいかわからなかったのでメモがわりに記載します。

## 結論

- bash-completionというパッケージをhomebrewでインストール
- .bash_profileを書き換える
- source .bash_profile　で更新
- terminal　再起動

という感じでできるようになりました。参考した記事は
>http://neos21.hatenablog.com/entry/2017/03/16/194231

となります。

## 環境

macOS Mojave Version 10.14.6
Homebrew 2.2.3

##実際の手順

#### bash-completionというパッケージをhomebrewでインストール

homebrewがない場合は以下のサイト（これまた古いですが）からダウンロードしましょう。

> http://neos21.hatenablog.com/entry/2016/05/21/000000

ある場合は以下のコードをterminalで打ち込みます。

```
brew install bash-completion
```

#### .bash_profileを書き換える

ない場合はホームディレクトリで

```bash

touch ~/.bash_profile
```

ある場合は

```bash
vi ~/.bash_profile

======================
#bash_profileに以下をコピペで記入する

if [ -f $(brew --prefix)/etc/bash_completion ]; then
  . $(brew --prefix)/etc/bash_completion
fi
```

として編集します。

#### source ~/.bash_profileで更新

最後にsourceで更新します。

```bash

source ~/.bash_profile
```

#### terminal再起動でできるはずです。
以上となります。

＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝

### （蛇足ですが）他のウェブサイトの失敗した情報

他のウェブサイトだと（もう5年以上前のですが）、このような情報をホームディレクトリの```.inputrc```というファイルに書けばよいとも書かれていました。

さっそく```.inputrc```ファイルを作りまして

```
touch .inputrc
```

```vi ~/.inputrc```で開き、以下の内容を記入しましたが。。。

```bash
set completion-ignore-case on
TAB: menu-complete
```

結局Tab補完されなかったので、古い情報なのかな？とも思いました。

以下のサイトに書かれてある情報でした。
> https://qiita.com/fantm21/items/7e9b23ddd8a958a93679
> https://ameblo.jp/nekocat2/entry-11539657198.html

## 最後に

もっと効率的な方法、確実な方法があるかもしれないので、コメント等でフィードバックいただけると嬉しいです。
【Laravel】リレーション先で検索する方法

Laravelでリレーション先で検索することがあったため備忘録。

例えば下記のようなモデルがあったとします。

```User.php
class User extends Model
{
    public function project()
    {
        return $this->belongsTo('App\Project');
    }
}
```

```Project.php
class Project extends Model
{
    public function organization()
    {
        return $this->belongsTo('App\Organization');
    }
}
```
※主キーはidとします。

# リレーション先で検索

Userからリレーション先であるProjectのorganization_idで絞り込みたいとします。

- whereHasを使用する場合

```UserController.php
$Users = User::whereHas('project', function ($query) use ($request) {
    $query->where('organization_id', $request->organization_id);
})->get();

```

- whereHasを使用しない場合

```UserController.php
$Users = User::whereIn('project_id', function ($query) use ($request) {
    $query->from('projects')
        ->select('id')
        ->where('organization_id', $request->organization_id);
})->get();
```

# リレーション先のリレーションで検索

Userからリレーション先であるProjectのリレーション先のOrganizationのnameで絞り込みたいとします。

- whereHasを使用する場合

```UserController.php
$Users = User::whereHas('project', function ($query) use ($request) {
    $query->whereHas('organization',  function ($query) use ($request) {
        $query->where('name', $request->organization_name);
    }
})->get();

```

- whereHasを使用しない場合

```UserController.php
$Users = User::whereIn('project_id', function ($query) use ($request) {
    $query->from('projects')
        ->select('id')
        ->whereIn('organization_id', function ($query) use ($request) {
            $query->from('organizations')
                ->select('id')
                ->where('name', $request->organization_name);
        });
})->get();
```

---
他により良い方法などありましたらご教示いただけますと幸いです。