OmniAICreator/Qiita-1.07M huggingface dataset:
scapy で仮想 IP を作成し ping の応答を得る。

## はじめに

Scapy は、ネットワークパケット操作のツールで、パケットの生成からデコードまで、色々な事ができます。
例えば、通信エラー発生時のパケットを同じように作成して動作確認するなど、問題の再現テストなどにも利用できると思います。
ここでは、単に仮想的なアドレスに対しての ping 応答を得るだけの環境を作成してみましたので、その説明です。

## scapy のインストール

・RedHat
　https://access.redhat.com/solutions/3759961
　（How to install scapy for network troubleshooting in Red Hat Enterprise Linux 7? ）

## arp 応答プログラム

IP 通信を行うためには、まずは arp の問い合わせに対して応答を返さないといけません。
そのためのプログラムとして以下。※どこかの URL を参考にしたのですが、もう思い出せない。

```
#!/usr/bin/python3

from scapy.all import *

# Your network broadcast address
broadcastNet = "192.168.1.255"

macDict = { "192.168.1.123" : "01:01:01:01:01:01" }
            
# Use MAC address of this machine as source. If not eth0, change this:            
myMAC = get_if_hwaddr('eth1')

def handle_packet(packet):
    if packet[ARP].op == 1:     # who-has
        print("Someone is asking about " + packet.pdst)
        print(packet.summary())
        
        if packet.pdst in macDict:
            print("Sending ARP response for " + packet.pdst)
            reply = ARP(op=2, hwsrc=macDict[packet.pdst], psrc=packet.pdst, hwdst="ff:ff:ff:ff:ff:ff", pdst=broadcastNet)
            # reply = ARP(op=ARP.is_at, hwsrc=macDict[packet.pdst], psrc=packet.pdst, hwdst="ff:ff:ff:ff:ff:ff", pdst=broadcastN
et)
            go = Ether(dst="ff:ff:ff:ff:ff:ff", src=myMAC) / reply
            sendp(go)
    return

# Sniff for ARP packets. Run handle_packet() on each one
sniff(filter="arp", prn=handle_packet, store=0)

```

## ping を打って arp テーブルを確認

つまり、こういう事。
ping の応答は、まだ得られませんが arp テーブルは出来ていることがわかります。

![arp.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246034/3ec15869-08bf-e6b8-ca77-93e23770f124.jpeg)


## ping の応答プログラム

```
#!/usr/bin/python3

from scapy.all import *

def handle_packet(packet):
    if str(packet[ICMP].type) == "8":
        if packet[IP].dst == '192.168.1.123':
            # packet.show()
            echoReply = IP(dst=packet[IP].src, src='192.168.1.123')/ICMP()/Raw()
            echoReply[ICMP].type = 0    # echo reply
            echoReply[ICMP].id = packet[ICMP].id
            echoReply[ICMP].seq = packet[ICMP].seq
            echoReply[ICMP][Raw].load = packet[ICMP][Raw].load
            send(echoReply)
    return

# Sniff for icmp packets
sniff(filter="icmp", prn=handle_packet, store=0)
```

## 実行してみる

こんな感じ、めでたく 192.168.1.123 へ ping が飛びました。

![ping.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246034/af8376eb-00f0-fe8f-4030-d8886a055cd1.jpeg)
【調べ方】AWS セキュリティグループに定義している IP (CIDR) をサクッと洗い出す

# 経緯

会社の IP が変わるような場合、どのセキュリティグループに該当する IP が適用されているのか調べる必要がでてきます。
[aws-cli](https://aws.amazon.com/jp/cli/) と [jq コマンド](https://stedolan.github.io/jq/) を使って簡単に洗い出す方法を備忘録としてメモしておきます

# 前提

- aws-cli をセットアップ済み
- jq コマンドをセットアップ済み

# 実行コマンド

事前に確認したいIPを定義 (CIDR)

```
CIDR=8.8.8.8/32
```

## インバウンドのセキュリティグループ名確認

```
for region in us-east-2 us-east-1 us-west-1 us-west-2 ap-south-1 ap-northeast-2 ap-southeast-1 ap-southeast-2 ap-northeast-1 ca-central-1 eu-central-1 eu-west-1 eu-west-2 eu-west-3 eu-north-1 sa-east-1
do
  echo region... $region;
  aws --region $region ec2 describe-security-groups \
  |jq -r \
    '.SecurityGroups[] | select((.IpPermissions[].IpRanges[].CidrIp == "'$CIDR'")
    or (.IpPermissions[].IpRanges[].CidrIp == "'$CIDR'")) |  .GroupName' \
  |sort \
  |uniq
done
```

## アウトバウンドのセキュリティグループ名確認


```
for region in us-east-2 us-east-1 us-west-1 us-west-2 ap-south-1 ap-northeast-2 ap-southeast-1 ap-southeast-2 ap-northeast-1 ca-central-1 eu-central-1 eu-west-1 eu-west-2 eu-west-3 eu-north-1 sa-east-1
do
  echo region... $region;
  aws --region $region ec2 describe-security-groups \
  |jq -r \
    '.SecurityGroups[] | select((.IpPermissionsEgress[].IpRanges[].CidrIp == "'$CIDR'")
    or (.IpPermissionsEgress[].IpRanges[].CidrIp == "'$CIDR'")) |  .GroupName' \
  |sort \
  |uniq
done
```

## 結果サンプル

`hogehoge-sg` と `fugafuga-sg` のセキュリティグループのインバウンドで `8.8.8.8/32` が定義されていることがわかりました。

```
mac48:~ s-urabe$ CIDR=8.8.8.8/32
mac48:~ s-urabe$ for region in us-east-2 us-east-1 us-west-1 us-west-2 ap-south-1 ap-northeast-2 ap-southeast-1 ap-southeast-2 ap-northeast-1 ca-central-1 eu-central-1 eu-west-1 eu-west-2 eu-west-3 eu-north-1 sa-east-1
> do
>   echo region... $region;
>   aws --region $region ec2 describe-security-groups \
>   |jq -r \
>     '.SecurityGroups[] | select((.IpPermissions[].IpRanges[].CidrIp == "'$CIDR'")
>     or (.IpPermissions[].IpRanges[].CidrIp == "'$CIDR'")) |  .GroupName' \
>   |sort \
>   |uniq
> done
region... us-east-2
region... us-east-1
region... us-west-1
region... us-west-2
region... ap-south-1
region... ap-northeast-2
region... ap-southeast-1
region... ap-southeast-2
region... ap-northeast-1
hogehoge-sg
fugafuga-sg
region... ca-central-1
region... eu-central-1
region... eu-west-1
region... eu-west-2
region... eu-west-3
region... eu-north-1
region... sa-east-1
mac48:~ s-urabe$ 
```
.present?はnilかそうじゃないか、という場合は不要

キャンペーンコードから適用されるキャンペーンとプランに紐づくキャンペーンがあるんだけど、キャンペーンコードからのキャンペーンを配列の一番最初に表示させたかった時の実装。

辞書型（hash型）なのが注意。
`key`でキャンペーンコードからのものを探して一旦削除して`unshift`で先頭にpushしてるんだけどいまいち納得いってない。。もっといい方法ないのかな？

修正前

```order_base_decorator.rb
  def order_campaigns
    c = options['campaigns'].to_a
    cc = c.find{|x| x["key"] == "campaign-code"}
    c.delete(cc) if cc.present?
    c.unshift(cc)  if cc.present?
    if c.present?
      unless c.first == {} || cc
        return c.unshift({}).to_a
      end
      return c
    end
    return c
  end
```

修正後

```order_base_decorator.rb
  def order_campaigns
    c = options['campaigns'].to_a
    cc = c.find{|x| x["key"] == "campaign-code"}
    # cのなかで見つからなかったらccはnil 
    if cc
      c.delete(cc)
      c.unshift(cc)
    end
    if c.present?
      unless c.first == {} || cc
        return c.unshift({}).to_a
      end
      return c
    end
    return c
  end
```





















#メソッド修正された

```order_base_decorator.rb
  def order_campaigns

    campaigns = options['campaigns'] || []
    cc = campaigns.find{|hash| hash["key"] == 'campaign-code'}
    if cc
      campaigns.select{|hash| hash["key"] != 'campaign-code'}.unshift(cc)
    end

    campaigns
  end
```
システム開発とデザイン思考（アイデアを創造する）

#はじめに
Advent Calendar19日目です。
前回、[システム開発とデザイン思考（潜在的なニーズを発見する）](https://qiita.com/dize_rs/items/c8ac076bfc27c0e30909)という記事を書かせていただいたのですが、その後編の記事となります。デザイン思考の３つのプロセス(着想、発案、実現)の中で、今回は**発案**と**実現**について記事を書きます。
#発案
発案とは、アイデアを創造、構築、検証するプロセスです。具体的には次の２つの作業を行います。
　**1. 潜在的なニーズを満たす良いアイデアを考案する**
　**2. 考案したアイデアを検証しブラッシュアップする**

###1. 潜在的なニーズを満たす良いアイデアを考案する(創造)
ブレインストーミング(以下BS)を行い、潜在的なニーズを満たすアイデアを出しまくり、その中から良さそうなアイデアを選びます。デザイン思考では、BSが多様で多数のアイデアを出す最良の手段と考えられており、独自のルールと秘訣があります。

✔︎BSを成功させるポイント
　1. アイデアの「質」より「量」にこだわる
　2. 他社のアイデアをもとにして飛躍する
　3. 上下関係による影響を排除する
　4. 自己防衛心を取り除く
　5. 支配欲に気を付ける（自分の意見の正しさを証明する場ではない）
　6. 制限時間を1時間、目標アイデア数１００個
　7. 簡単なクラフトツールを用意する(段ボール/はさみ/粘土/セロハンテープ)
　8. どの案を採用するかは多数決で決める

###2. 考案したアイデアを検証しブラッシュアップする(構築、検証)
プロトタイピングで構築、検証を行います。リスクを想定するよりも、実物を作って目の前で起きた問題に対処する方が簡単だという考えが前提にあるからです。以下、重要なポイントです。
　**・できるだけ安く早く何度も失敗すること**
　**・必要な部分だけ作る。潜在的なニーズを満たすか？が検証できればOK**

モノ・サービスを創り上げていく中で３つの要素を意識する必要があります。
　✔︎技術的実現性：現在または近い将来に実現可能な技術であるか？
　✔︎経済的実現性：コスト的に実現・存続可能なビジネスか？
　✔︎有用性：人間の欲求を捉えており、ポジティブな感情をもたらすか？
 
全ての要素を満たすのは難しいため、**有用性を中心に他の２つのバランスを取る**ことが重要なコツだそうです。プロトタイピングは、試作品を作る中でこれらのバランス配分を検討するプロセスでもあります。
例）
X：すごく安くて**(経済)**、すごく提供が早い**(技術)**が、味がイマイチ**(有用性)**なレストラン
◯：そこそこ安くて**(経済)**、提供が早く**(技術)**、そこそこおいしい**(有用性)**牛丼屋


#実現
実現とは市場へ導入して成功させるためのプロセスで、以下２つのプロセスで構成されます。
　**1. モノ・サービスを市場に小規模に投入して検証する**
　**2. 開発したモノ・サービスを市場へ導入する承認を得るプロセス**
###1. モノ・サービスを市場に小規模に投入して検証する
小規模で市場に投入し、ユーザーの反応を見て改善を行うプロセスを繰り返し、製品をブラッシュアップしていきます。
![Pictures-Copy of Page-6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314356/2a3537e5-eb35-e160-3e05-38bb67f815ba.png)
###2. 開発したモノ・サービスを市場へ導入する承認を得るプロセス
潜在的なニーズをもとに創り上げたイノベーティブなモノ・サービスは過去の実績・前例が無いため、承認する側にとってはリスク強いることになるためハードルが高くなります。承認者から「理解を得る」＞「共感してもらう」という２つのハードルをクリアする必要があります。

**理解を得る**
実物を見てもらうのが一番。ブラッシュアップしたプロトタイプを見せることにより更に理解を得やすくなります。
**共感してもらう**
ユーザーがこの製品を使い、どのような感情を生み出すのか？というところまで共感してもらう必要があります。
ユーザーが製品を利用して満足するまでの紙芝居や、実際利用しているところを撮影して動画にするなど、視覚情報を持つ「物語」にして提供するのが有効な手段だそうです。
#最後に
デザイン思考のポイントをかいつまんで説明してきました。
後は実践あるのみですが、デザイン思考を組織に組み込むのは簡単ではないと感じています。デザイン思考を導入するためにデザイン思考を使い、小規模投入から始めてみようと思います！
[iOS] IPAファイルのプロビジョニングプロファイルを差し替え

## [iOS] IPAファイルのプロビジョニングプロファイルを差し替え

**iPAファイルを展開する。**

```
unzip *.ipa
```

**再署名に必要になるentitlementsファイルを作成**

```
codesign -d --entitlements :- Payload/*.app > entitlements.plist
```


**再署名に必要になるentitlementsファイルを作成**
「○○○○○○.mobileprovision」は、Apple Developerから更新したプロビジョニングプロファイル

```
cp -p  ○○○○○○.mobileprovision ./Payload/*.app/embedded.mobileprovision
```
「replacing existing signature」で成功

**再署名を実施**
「'iPhone Distribution: ○○○○○○'」は、キーチェーンアクセス.app から確認できる証明書の名称

```
codesign --force --sign 'iPhone Distribution: ○○○○○○' --entitlements entitlements.plist 'Payload/*.app'
```

**バージョン番号を更新**
Payload/*.appファイル内のInfo.plistを編集

**iPAファイルを作成**
「○○○.ipa」は、任意のIPAファイル名

```
mkdir new-ipa
zip -ry new-ipa/○○○.ipa Payload
```

new-ipaフォルダにプロビジョニングプロファイルを差し替えたIPAファイルが作成されています。
Terraform(やその他CLIツール・コマンド)でMFA対応する

# TL:DR

- AWSではMaster AccountにIAM Userでログインし、他のアカウント(OU)へアクセスできる権限をもったRoleへSwitch/AssumeRoleして必要な作業を行うケースが多いです。
- ポリシーとしてSwitch/AssuemRoleの際に、"MFAが有効化"されていることを必須としていることも多いです。
- terraformは公式にAssumeRoleへの対応をしていますが、MFAへの対応はされていません。
- MFAまわりはaws-vaultでカバーしました。


# aws-vaultでterraformをMFA対応させる

aws-vault
https://github.com/99designs/aws-vault

## aws-vaultのインストール

リポジトリのREADMEにある通りに。

```:Macの場合
brew cask install aws-vault
```

## aws-vaultでMFAするための設定

- 事前に必要なもの
  - terraformが利用するIAM UserのAccess KeyとSecrets(A)
  - (A)に紐付いたMFAデバイスのARN(B)
      - こういうやつ → arn:aws:iam::xxxxxxxxxxxx:mfa/yourIAM


- aws-vaultで使うprofile追加

```
$ aws-vault add hoge-prov
※Access KeyとSecretsを聞かれるので(A)を登録する
```

- profileにmfa_deviceのARN(B)を追加登録

```:~/.aws/config
~(snip)~

[profile hoge-prov] ← 先程追加したprofileの項
mfa_serial = arn:aws:iam::xxxxxxxxxxxx:mfa/yourIAM ←ここに(B)を登録する
```

## aws-vaultでMFAしつつterraformを実行してみる

```
$ aws-vault exec hoge-prov -- terraform plan -out=apply.plan -target=module.compute.aws_instance.hogefuga
Enter token for arn:aws:iam::xxxxxxxxxxxx:mfa/yourIAM: 
※^ MFAデバイスのTokenを入力してあげましょう
```



## terraformの処理に時間がかかりすぎてセッション切れしちゃう場合

execの下記オプションでセッションの有効期限を変更できるようなのでお試しあれ

```
$ aws-vault exec --help
~(snip)~

  -t, --session-ttl=4h           Expiration time for aws session
      --assume-role-ttl=15m      Expiration time for aws assumed role

~(snip)~
```
C++で許されるけど、Rustで怒られること(スコープ、借用)

# C++とRustを比較する

C++やってるけど、「Rustって安全だよ」って言われて興味を持った人向け。
用語はC++視点で。


## 関数に文字列を渡す

### C++

```c++:main.cpp
#include <iostream>

void say(std::string str){
    std::cout << "say: " << str << std::endl;
}

int main()
{
    
    auto str = "hello";
    say(str);
    std::cout << "main: " << str << std::endl;
    
}
```

Output

```
say: hello
main: hello
```


### Rust

```rust:main.rs
fn say(str: String){
    println!("say: {}", str);
}

fn main() {

    let str = String::from("hello");
    say(str);
    println!("say: {}", str);
    
}
```

### error[E0382]: borrow of moved value: `str`

```
  --> src/main.rs:10:25
   |
8  |     let str = String::from("hello");
   |         --- move occurs because `str` has type `std::string::String`, which does not implement the `Copy` trait
9  |     say(str);
   |         --- value moved here
10 |     println!("say: {}", str);
   |                         ^^^ value borrowed here after move
```

Rustでは参照ではない値に渡すと所有権が移動する(say呼び出しの時点でmainではstrが使えなくなる)



### Rustに黙らせるコード(参照で渡す)



```rust:main.rs
fn say(str: &String){
    println!("say: {}", str);
}

fn main() {

    let str = String::from("hello");
    say(&str);
    println!("say: {}", str);
    
}
```

### Rustに黙らせるコード(所有権を返してもらう)

Rustは代入時に文字列を勝手に再確保＆コピーしたりしません。


```rust:main.rs
fn say(str: String) -> String{
    println!("say: {}", str);
    str
}

fn main() {

    let str = String::from("hello");
    let str = say(str); //シャドーイングと言って、同名で上書きできる
    println!("say: {}", str);
    
}
```


### 逆にRustっぽいことを、C++で書いてみる

所有権を１つに限定する（C++11以上）

```c++:main.cpp
#include <iostream>
#include <memory>
#include <utility>


std::unique_ptr<std::string> say(std::unique_ptr<std::string> str){
    std::cout << "say: " << *str << std::endl;
    return str;
}


int main()
{

    std::unique_ptr<std::string> str(new std::string("hello"));

    auto str2 = say(std::move(str));

    std::cout << "str@main: " << str << std::endl;
    
    //コメントアウトしないと落ちます
    //std::cout << "*str@main: " << *str << std::endl;
    std::cout << "*str2@main: " << *str2 << std::endl;

    return 0;
}
```

Output

```
say: hello
str@main: 0x0
*str2@main: hello
```

C++では

- unique_ptrを使っても、コメントアウトした行のようにアクセスが可能、そして死ぬ
hub コマンドが補完されなくなった件について

# 結論

[hub](https://github.com/github/hub) のaliasに一行追加する。

```bash
alias git="hub" # eval "$(hub alias -s)" と等価
alias __git="hub" # ここに追加する。
```


### 環境確認

```bash
$ hub --version
git version 2.24.0
hub version 2.13.0

 $ bash --version
GNU bash, バージョン 5.0.11(1)-release (x86_64-apple-darwin18.6.0)
```

### 参考

Issue
https://github.com/github/hub/issues/1792#issuecomment-518227676
ファイルパスのリストだけ取り出す

カレント以下の全フォルダのファイル名のみ取り出す。

コミット対象の資産リストを相対パスでよこせって言われた場合などに。

```powershell
ls -Name -Recurse -include "*.*"
```

こんな感じでディレクトリを除ける。

```powershell
PS C:\Users\aoi\Desktop\Pocker> ls -Name -Recurse -include "*.*"
.settings
.classpath
.project
.settings\org.eclipse.jdt.core.prefs
bin\Main.class
bin\pocker\Card.class
bin\pocker\CardComparator.class
bin\pocker\Game.class
bin\pocker\Suit.class
bin\test\GameTest.class
src\Main.java
src\pocker\Card.java
src\pocker\CardComparator.java
src\pocker\Game.java
src\pocker\Suit.java
src\test\GameTest.java
```

フルパスはResolve-Pathをパイプでつなぐ。

```powershell
PS C:\Users\aoi\Desktop\Pocker> ls -Name -Recurse -include "*.*" | Resolve-Path

Path
----
C:\Users\aoi\Desktop\Pocker\.settings
C:\Users\aoi\Desktop\Pocker\.classpath
C:\Users\aoi\Desktop\Pocker\.project
C:\Users\aoi\Desktop\Pocker\.settings\org.eclipse.jdt.core.prefs
C:\Users\aoi\Desktop\Pocker\bin\Main.class
C:\Users\aoi\Desktop\Pocker\bin\pocker\Card.class
C:\Users\aoi\Desktop\Pocker\bin\pocker\CardComparator.class
C:\Users\aoi\Desktop\Pocker\bin\pocker\Game.class
C:\Users\aoi\Desktop\Pocker\bin\pocker\Suit.class
C:\Users\aoi\Desktop\Pocker\bin\test\GameTest.class
C:\Users\aoi\Desktop\Pocker\src\Main.java
C:\Users\aoi\Desktop\Pocker\src\pocker\Card.java
C:\Users\aoi\Desktop\Pocker\src\pocker\CardComparator.java
C:\Users\aoi\Desktop\Pocker\src\pocker\Game.java
C:\Users\aoi\Desktop\Pocker\src\pocker\Suit.java
C:\Users\aoi\Desktop\Pocker\src\test\GameTest.java
```
Notionでストーリーポイントを集計する

[アルプ株式会社](https://thealp.co.jp/)でエンジニアをしています、集約のエンティティ@pictinyです。
これは[Notion Advent Calendar 2019](https://qiita.com/advent-calendar/2019/notion) 18日目のエントリです。
17日目は[Notionでデータベースを関連付ける](https://qiita.com/pictiny/items/49dad45f0457e6c4a11d)でした。

# ストーリーポイント
スクラム開発における作業量の見積もりの単位にストーリーポイントがあります。
一般的なプロダクトバックログにはストーリーポイントが用いられるかと思います。

Notionのデータベースでバックログを作った場合にもストーリーポイントを入力したくなりますし、スプリント毎のストーリーポイントを集計したくなるでしょう。

# プロパティの計算
Notionのデータベースにはプロパティの入力値を集計する機能があります。
**Table View**で計算したいプロパティを表示し、プロパティの列の下部の`Calculate`から計算式を選択することで計算結果が下部に表示されます。
ストーリーポイントを集計したい場合には`SUM`を選択することで集計できます。

<img width="392" alt="ストーリーポイント" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427952/ff4cf884-3a8e-0604-782c-29e126cee9b3.png">

計算は表示されているデータに対して行われるので、計算に含めたくないデータがあればフィルターしましょう。

## プロパティタイプ
プロパティに対して使える計算式はプロパティタイプによって変わります。
例えば`SUM`を使いたい場合、プロパティタイプは`Number`にしなければなりません。

ストーリーポイントをプランニングポーカーで求める場合、1、2、3、5、8、13、、、と決まった値になります。
有限集合なのでプロパティタイプを`Select`にしたくなりますが、そうすると`SUM`が使えなくなります。
ストーリーポイントのように集計したいデータであればプロパティタイプは`Number`にしておきましょう。

# まとめ
データベースで入力したプロパティを集計する例を紹介しました。
ストーリーポイントのために`Number`の有限集合しか持たなくて`SUM`が使えるプロパティタイプ、`Number Select`ってのがあれば便利だと思うのですが、それは今後のアップデートに期待です！
Angular Materialの雛形を作成する手順

1.新しいAngularプロジェクトを作る

`ng new myNewProject`

2.新しいComponent (ページ的なもの)を作る

`ng generate component pages/home`


3.このコマンドを実行

```
ng add @angular/material
```

4.style.cssにこれを追加

```
* {
    box-sizing: border-box;
    font-family: 'Roboto', sans-serif;
}

body, html {
    height: 100%;
}

body {
    padding: 0;
    margin: 0;
}
```

5.ネットで見たすごいおじさんのコマンドを実行
`ng generate @angular/material:material-nav --name=main-nav`

6.app-routing.module.tsのroutesをこんな感じにする

```
const routes: Routes = [
  { path: '', component: HomeComponent },
];
```

7.App.component.htmlの中身をこれに書き換える

```
<app-main-nav>
  <router-outlet></router-outlet>
</app-main-nav>
```

8.main-nav.component.htmlの<!-- Add Content Here -->ってところに

```
<ng-content></ng-content>
```

を書き加える。
docker-composeでexit status 1

#はじめに
``macOS Mojave 10.14.6``
``Docker 2.1.0.5``

#とりあえず

```bash
$ docker-compose up
...
front_nuxt  | npm ERR! Exit status 1
front_nuxt  | npm ERR! 
front_nuxt  | npm ERR! Failed at the Musclers@1.0.0 dev script.
front_nuxt  | npm ERR! This is probably not a problem with npm. There is likely additional logging output above.
front_nuxt  | 
front_nuxt  | npm ERR! A complete log of this run can be found in:
front_nuxt  | npm ERR!     /root/.npm/_logs/2019-12-18T01_41_30_431Z-debug.log
front_nuxt  | front_nuxt exited with code 1
```
といってフロントくん(nuxt)が起動しない

```bash
$ docker-compose ps
   Name                 Command               State           Ports         
----------------------------------------------------------------------------
api_rails    bash -c rm -f 'tmp/pids/se ...   Up      0.0.0.0:8080->8080/tcp
db_psql      docker-entrypoint.sh postgres    Up      5432/tcp              
front_nuxt   docker-entrypoint.sh npm r ...   Exit 1      0.0.0.0:3000->3000/tcp
```

まぁ、だよね

#原因
これがイマイチわからない。

#やったこと
``prune``でimageを一括削除した。

```bash
$ docker-compose down
$ docker system prune --volumes
# docker system pruneではvolumeまで削除してくれない
$ docker-compose up --build
# build忘れないようにね
```
で、buildが終わった後、無事起動しました。

#最後に
最後にって書く必要あるのかわからないけどrailsとか使ってるなら、
``db:create``、``migrate``、``db:seed``忘れないようにね。
DB空っぽだから何もできずに発狂した人もいるらしい←
ADCから現在の電源電圧を知る方法

#はじめに
電源電圧にバッテリーなどを使用しているときに、マイコンからバッテリー電圧を知りたいことがあります。STM32でそれを行う方法です。

#基礎
STM32の中にはVrefintという基準電圧があります。これはSTM32F401REの場合は電源電圧がいくつであっても（もちろん動作保証範囲内です）以下の電圧に収まるようになっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263486/5e12bb48-7f8d-7888-4308-be183175334b.png)

またSTが工場出荷するときに、Vddを3.3VにしたときにVrefintをADCで計測して、その値をFLASH上に書き込んであります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263486/0798c1ac-fc8b-f339-176b-d3620aae55eb.png)

これを使って現在の電源電圧を計算する式がSTのレファレンスマニュアルに記載されています。残念ながらSTM32F401のリファレンスマニュアルには記載がなく、STM32F0x1のリファレンスマニュアルから引っ張ってきました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263486/2b0a5404-5fda-0db1-48df-c11a8f8cc93b.png)

#電源電圧を変える準備
ここの記事に詳細があります。
https://qiita.com/kotetsu_yama/items/2c5c38a708f45184a57b

#コード
以下のように修正します。

```
/* USER CODE BEGIN 0 */
uint32_t VrefValue;
float V;
__IO uint16_t *VrefCal = (__IO uint16_t*)0x1FFF7A2A;
/* USER CODE END 0 */
```
```
    /* USER CODE BEGIN 3 */
	  // Get ADC Value
	  HAL_ADC_Start(&hadc1);
	  HAL_ADC_PollForConversion(&hadc1,1000);
	  VrefValue = HAL_ADC_GetValue(&hadc1);
	  HAL_ADC_Stop(&hadc1);

	  // Get actual Vdd Voltage
	  V = 3.3f * (float)*VrefCal / (float)VrefValue;
	  __NOP();

  }
  /* USER CODE END 3 */
```
全コードはgithubにあげてあります。
https://github.com/kotetsuy/STM32forWindowsDemos/tree/master/ADCmesureVdd

#実験結果
電源を1.8Vにしたとき
![1_8v.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263486/eca13443-053c-b39f-1797-0c027b348d6a.png)
電源を2.4Vにしたとき
![2_4v.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263486/8524b87f-aaca-a5a4-1d84-1e9745b0dadf.png)
電源を3.3Vにしたとき
![3_3v.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263486/d18273ec-bcfa-3fd1-6e26-39bb133b2f90.png)

#おわりに
これでバッテリー駆動の時にバッテリー電圧を外部回路なしで計測できます。
Xcode11でiPadの画面回転設定を行う



iOSアプリを新たに横画面に対応させようとした時にハマったのでメモ。

#問題点

通常、画面回転を行いたい場合はTargetのGeneralタブの「Device Orientation」部分のチェックボックスで設定を行うのだが、ここでの設定変更はiPadでは反映されない。（特にエラーメッセージも出ないので、ユーザーのレビューで指摘されるまで気付けなかった…）

<img width="618" alt="スクリーンショット 2019-12-18 11.01.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170294/d0a243c3-c53c-aba1-7831-e168221afffe.png">


#解決策

Info.plist を直接編集する。

```
    <key>UISupportedInterfaceOrientations</key>
	<array>
		<string>UIInterfaceOrientationPortrait</string>
		<string>UIInterfaceOrientationLandscapeRight</string>
		<string>UIInterfaceOrientationLandscapeLeft</string>
	</array>
	<key>UISupportedInterfaceOrientations~ipad</key>
	<array>
		<string>UIInterfaceOrientationPortrait</string>
		//ここに追記
	</array>
```

#終わりに

Info.plistが自動で追記されないのは仕様なのか不具合なのか…？

自分の見落としがあるかもしれないので、もっと簡単な解決方法があればコメントで教えていただけると助かります。
Redhat Swap領域

# RedhatのSwap領域のサイズ

|システム内の RAM の容量  |推奨される swap 領域|ハイバネートを許可する場合に推奨される swap 領域|
|---|---|---|
|⩽ 2 GB |RAM 容量の 2 倍 |RAM 容量の 3 倍 |
|> 2 GB – 8 GB|RAM 容量と同じ|RAM 容量の 2 倍 |
|> 8 GB – 64 GB|最低 4GB|RAM 容量の 1.5 倍 |
|> 64 GB|最低 4GB|ハイバネートは推奨されません |

情報元URL
https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/storage_administration_guide/ch-swapspace
今さら聞けないWindowsでプリンタドライバを使わない印刷

#Windowsのプリンタドライバを使わない印刷
具体的には以下の用途です。
　　PC-PR201、ESC/P、LIPSなどのプリンタ言語を、プログラムで生成するなどして直接プリンタに送信するケース。
　　PDFファイルを、PDFダイレクト印刷対応のプリンタ・複合機（リコーMP C4503など）にPDFファイルを直接送信しての印刷を行う。

##プリンタドライバとは
プリンタ本体が印刷するのに使うデータ形式があり、それをプログラマが知らなくてもよい、というのが成り立ちでした。
現在では、Windows仕様の印刷データ（プリンタドライバがWindowsから受け取る形式としては1つですが、Windowsがプログラムから受け入れ仕様が厳密には数種類あります）を生成するだけで済み、それをプリンタドライバが変換してくれます。

ここでは、プリンタ本体が印刷するのに使うデータ形式のデータを『プリンタRAWデータ』と呼びます。

なので、プログラムで「A」を印刷というのは、
　　「A」を　Win32Apiや.Netオブジェクト　＞　Windowsの受け入れ仕様　＞　プリンタドライバで変換　＞　プリンタRAWデータ　＞　ポート番号　＞　プリンタ本体
となります。
一般にはこの最初のステップで、Windowsの標準印刷では、GDI+系といわれるもの、.Netのオブジェクトを利用するなど複数あり、ネットに多くの情報があるのはここです。

##プリンタRAWデータの取得方法
プリンタドライバの出力先ポートの設定で、「ファイル」というのがあります。この設定でWindows標準印刷をするとバイナリファイルを保存することができます。
このバイナリファイルこそが、プリンタ本体が印刷するのに使うデータです。
これはメーカーごとに異なるのと、EPSON ESC/P、NEC N201、CANON LIPS IIIといった旧世代のものと、PDF 程度しか仕様が公開されていないので、事実上はWindowsプリンタドライバを利用せざるを得ません。
ただ、この「ファイル」の利用方法がwindows2000の時代からよくわからない、というのが私の認識でした。メーカーはわかる、という表現をされていましたが。
数年前にわかったことですが、この「ファイル」を「そのまま(RAW)」プリンタへ送信すると、プリンタが印刷をします。
当然のように思えますが、プリンタドライバはWindows印刷データを変換する仕様です。
そして、プリンタドライバ（厳密にはプリンタスプーラ）を経由しないで、プリンタへ「ファイル」を「そのまま(RAW)」する、というのが逆に難かったのです。
具体的にはLPTポートをDOSプロンプトからリダイレクト・・・という気の遠くなる方法でやっていました。
このとき、openしてwriteでは相手がファイルではないので（ファイルのように扱うクラスライブラリで可能なだけなので）不安定でした。
##ファイルのようにopenしてwriteできるなら、ファイルコピーしてしまえば！？
ということで、1ページ分のデータをバイナリファイルに書き出して、それをDosプロンプトからLPTポートへファイルコピーしました。
そしたら、あっけなく成功！！！

この発見が非常に重要でした。

##プリンタに来るデータの経路の種類
簡単に利用できる順
１．Windowsのプリンタドライバを共有設定にする
２．LANのIPアドレス
３．LPTリダイレクト
４．LPT（パラレルポート）

１番の「Windowsのプリンタドライバを共有設定にする」について、詳しく書きます。
共有にすると共有名を設定します。ここでは「P1」とします。
もちろん、印刷先ポートもWindowsで設定します。（USBでもLANでも仮想でもOK）
そして印刷先を「ファイル」にしたバイナリファイルなり、ESC/Pの１ページ分のファイルを用意します（数行分でも、数ページ分でも、もちろんOKです）

Dosプロンプトで
copy TESTDATA.BIN ￥￥127.0.0.1￥P1
ただ、これだけです。
127.0.0.1は自分のPCのIPという意味の固定値です。（仕様です）
これをすることで、【プリンタドライバが変換しないだけ】で、他の動作は通常に行われます。
プリンタスプールにデータが溜まり、プリンタへデータが送信されます。

最近のプリンタや複合機ではPDFダイレクト印刷対応のプリンタがあります。
そのプリンタに対してはPDFファイルをコピーしてあげると、そのまま印刷してくれます。
ちなみに、メーカーにPDFダイレクト印刷をしたいので、プリンタに直接PDFをWindowsから送信する方法を教えてください、といっても回答不可で、USBメモリのPDFを複合機本体に差し込むと印刷できますよ・・・という回答になってしまいます。
私がこの手法でのPDFダイレクト印刷を確認した複合機はリコーのMPC4503、MPC5503でした。この世代以降はPDFダイレクト印刷に対応しているようです。

##プリンタからするとファイルが複数であっても、純粋に「命令が順番にくる」だけ
なので、プリンタはこちらが想定した動作をしてくれます。（最近はなかなかそういうケースが無いので、感無量です）
先の複合機、MPC4503だったりはRPJLに対応しています。Ricoh仕様のPJLという意味です。
PDFそのものものがこういった各社PJL（HPが仕様策定したもの）にPDFの仕様として対応しているので、普通にPDFビューワで見れます。
PJLそのもはXMLのタグで「３番トレイの用紙を使って、フィニッシャーで左２か所ステープルをする」という命令を付加するだけです。プリンタ設定情報ですね。
この情報をプログラムで生成して、バイナリファイルに書き出す。それをファイルコピーする。
Windowsも複合機も何のメッセージも出さずに印刷が完了する。
私は感動する。（笑）

こんな感じです。
業務では番号を押したら黙って印刷が始まる、というように、プリンタ等は単純道具としての振る舞いが重要です。
高機能なんだけれど、毎回用紙サイズを設定する必要はないし、ドライバ設定の保存という手法では、ドライババージョンやOSのバージョンで互換性が無いですし、さらには
【最初の１度だけとはいえ、何十台もあるパソコンで、何台分ものプリンタの設定をするという、阿保なことをしなくてすむということです。今は21世紀です。】

RPJLの仕様は「ファイル」に保存したら平文で（PJLが平文仕様なので）書かれていたので、それをコピペ的に再現して利用できるようになったので、今ではリコー押しではありますが、
複合機ではcanonもPJLに対応しているので、やりようはあると思います。
ただ、インクジェットの機種でPDFダイレクト対応のもののが無いので、角２などの封筒印刷はちょっと面倒だなと思います。

また、ドットインパクト プリンタはESC/PかN201対応の機種が現在でも販売されているので、バイナリデータを作れる、もしくは旧来の移植を・・・というケースでも、このファイルコピーはおすすめです。
私のところでは500万円のラインプリンタもこの方法で毎日印刷しています。
学生にプログラミングを教えるときのカンニングシート（Cloud9 ショートカットキー編）

# 対象
- 普段は使わないけど、たまたまCloud9を使うことになった人（←自分）
- そもそもエディタとか本格的に使ったことがない人（←入門者さんとか学生さんとか？）
- ショートカットキー？なにそれ？な人（←入門者さんとか学生さんとか？）

# 目的
学生にプログラミングを教えることがあるけど、そういうときにいちいちローカル（学生のPC）に環境を作ってられないので、AWS Cloud9を利用する。
ただ、普段、ディターはRubyMine（もしくはVScode）、GitはSourcetreeを使っているから、Cloud9で作業するときに、
「コマンド忘れたー」「あー、あの機能はこのショートカットキーじゃないのー？」
ってなってる人を救いたい。（←自分）

# Cloud9 ショートカットキー編
前回の記事は[こちら(gitコマンド編)](https://qiita.com/yamatokun9/items/9ab73a22ebb9b63b2415)

## 前提
Macのキーボードを使っている
（Windowsのイメージで補完してください。。。多分そんなに違わない。。。）

コマンドの記号はこちら

```
command ⌘
shift ⇧
option ⌥
control ⌃
caps lock ⇪
fn
```

## 開いているタブを閉じる

`⌥ + w`

正直これを書きたいがためにこの記事が存在しているようなもの。
普段良く使う、
> ⌘ + w

ではブラウザのタブそのものが消えてしまうので、
間違って消したときは**ガッデム!!!**ってなる。

## ファイル内の文字列を置換する(検索する)
`⌘ + f`
2つ目の**ガッデム！！！**ポイント
ネイティブアプリのエディタでは大体「⌘ + r」を使用することから、
置換ボックスを開こうとして、誤って画面リロードをしてしまう。
cloud9では検索ボックスと置換ボックスが一緒に出るので、上記でOK。

## 検索・置換ボックをたたむ
`[esc]`キー

## プロジェクト内のファイルを検索
`⌘ + p`

## 文字列をプロジェクト全体から検索(置換)
`⌘ + ⇧ + f`


## マルチカーソルの追加
`⌃ + ⌥ + →`
選択した文字列と同じものを探し、そこにカーソルをもう一つ追加してくれる。
開発のときになにげに使用する。

## カーソル移動系
ターミナルのショートカットキーがほぼ使用できるが、注意しないといけないのは、
一行上に移動（⌃ + p）と一行したに移動(⌃ + n)が使えないところ
### 行頭に移動
`⌃ + a`
### 行末に移動
`⌃ + e`
### 一文字右に移動
`⌃ + f`
### 一文字左に移動
`⌃ + b`
### 単語の先頭に移動
`⌥ + ←`
### 単語の末尾に移動
`⌥ + →`
### 単語を選択状態に
`⌥ + ↑`
### 単語の選択状態解除
`⌥ + ↓`

## その他は
なにか注意したほうが良いものがあったら追記するかも。。。

## おわり
書いていて思ったけど、学生はWindowsメインだからやっぱりWindows用の記事にした方が良かったかなーと思いつつ。。。まぁ、いいか。

[Cloud9のショートカットを変更して作業を効率化する](https://yskoht.hatenablog.com/entry/2018/01/01/163950)
というやり方も見つけたから、ストレスフリーを目指す人は参考に。
おぼえがき - postgresで詰まった話

# 何が起きたか
- テーブルの作り直しバッチを流したところ複数あるうちの1テーブルで処理が止まった
- そのテーブルの定義等も見れなくて混乱した
- ログにもろくなものが吐かれて無くて自分一人なら詰んでた

# どうしたか
- [これ](https://blog.longkey1.net/2012/11/08/postgresql-practice-when-deadlock/)をやった

# 何が原因だったか
- たぶんDELETE文流すにあたってロックかけたときにデッドロック状態になった？
- あまりに処理が帰ってこなくてバッチの強制終了などしたけどどっちが先かわからない
- 直接的な原因はなんなのかもし分かったら追記します

# 今後
- とりあえずプロセスを見てみる癖をつける
- ログに書く内容を増やすなど
制御工学　機械と電気とソフト　制御(12)

制御工学、メカトロニクスの科目では、
機械と電気とソフトを対象とすることがある。

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

電気系、情報系の制御工学だと、電動機は扱うが、制御対象の機械は詳細に取り上げないことがある。


メカトロニクスとは？
https://okwave.jp/qa/q9691409/a27071390.html

への解答例

>
電気科で、現代制御理論の研究室を卒業したものです。
別の大学の機械工学の研究室で、日本機械学会のロボット制御の教材の確認のために１週間常駐しました。その時に、機械工学の教授の説明では、機械工学の制御理論と電気工学の制御理論の主たる違いは、時定数の値であるとのことでした。
電気系の制御工学では、ロケット、原子炉なども題材として扱いますが、同じ理論を電力網、通信網などの電気だけで制御できる対象も扱いいます。
機械科と電気科の違いは、力学の電磁気学の違いとか、確率モデルの違いとか、熱力学との関係とか、いろいろありますが、なんといっても時定数の値だそうです。
科目名は大学によってさまざまで、機械系で制御工学という名称を使っているところもあると思います。自動制御、制御理論など、、、。
https://www.jsme.or.jp/news/News200805.pdf
該当する講座では、機械の構造設計、ボルトやナットの設計から、表面仕上げの指定まで幅広く学べる教材でした。電子部品だけでなく、電子部品を制御する論理回路の設計（HDLによるプログラミング）またはCPUによるソフトウェア制御までを含んでいます。
ところで、数式的に全く同じモデルを、経済学部でも扱っています。おおきな違いは、入出力が社会統計であるため、確率の分布、精度が違うことと、大きな時定数も扱うことです。

# 参考資料
MATLAB 完全に理解するには, OSEK(82)　制御（１）https://qiita.com/kaizen_nagoya/items/867e8743fa813be9b37c
制御対象状態を減らして，状態遷移試験をし易くするためのMISRA-C 制御（２）https://qiita.com/kaizen_nagoya/items/eecc6246e6fbe3b96123
輸送機器安全、自動車安全　制御（３）安全(41) https://qiita.com/kaizen_nagoya/items/f2540c6ee1dd2dd098b3
AUTOSAR 「完全に理解した」 OSEK(40), 制御（４）https://qiita.com/kaizen_nagoya/items/51983798ad7902b33cb1
博論の乗りで、ラプラス変換を論文にするには。制御（５）https://qiita.com/kaizen_nagoya/items/f02d48a611685390417b
模型駆動開発(Model Driven Design)への道、OSEK(81) 制御（６）https://qiita.com/kaizen_nagoya/items/bb4d73bfb3cbba88727f
電動機制御算譜（プログラム）設計における３つの罠６つの教訓（実機）OSEK(95) 制御（７）https://qiita.com/kaizen_nagoya/items/b39b6b7ba0d90dff471d
博論の乗りで、制御工学を論文にするには。制御（８）https://qiita.com/kaizen_nagoya/items/feb4a70692e66d82076d
機械工学便覧＜エンジニア夏休み企画>【読書感想文】制御（９）https://qiita.com/kaizen_nagoya/items/629e9665e4df8207054b
製造業における機械学習, OSEK(83) 制御(10) https://qiita.com/kaizen_nagoya/items/fbe846de16f74bea1d6f
連立微分方程式のPade近似と、Cコンパイラとモデルに基づく設計。制御(11) https://qiita.com/kaizen_nagoya/items/5e50b3c9c0004fe92bd9

機械制御ソフトウェアの制約条件「機械安全」安全（１）
https://qiita.com/kaizen_nagoya/items/a5d9eef7ad1d39652304

機械の制御システムの設計における安全分析の事例報告。安全（5）
https://qiita.com/kaizen_nagoya/items/55c6701f81a3d2742796

機械工学便覧＜エンジニア夏休み企画>【読書感想文】
https://qiita.com/kaizen_nagoya/items/629e9665e4df8207054b

自動車工学とBosch Vehicle Handbook
https://qiita.com/kaizen_nagoya/items/d13ff6b0e4d7c8907c0d

名刺代わりの技術書10選
https://qiita.com/kaizen_nagoya/items/dc497dcaa5a304fc96c8

一覧の一覧( The directory of directories of mine.) Qiita(100)
https://qiita.com/kaizen_nagoya/items/7eb0e006543886138f39

プログラマが知っていると良い「公序良俗」
https://qiita.com/kaizen_nagoya/items/9fe7c0dfac2fbd77a945

小川清最終講義、小川清最終講義（再）計画, Ethernet(100) 英語(100) 安全(100)
https://qiita.com/kaizen_nagoya/items/e2df642e3951e35e6a53

 ＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞
### 文書履歴(document history)
ver. 0.01 初稿 20221209
ver. 0.02 URL追記　20230210
### 最後までおよみいただきありがとうございました。
いいね　💚、フォローをお願いします。
####  Thank you very much for reading to the last sentence.
Please press the like icon 💚　and follow me for your happy life.
Chromeでアドレスバーに表示される候補を増やす

### 標準動作
<img width="400" alt="スクリーンショット 2019-12-18 10.46.47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213392/acbf462e-d95e-ff6a-7320-0a9be2ce6cd5.png">
### 変更後動作
<img width="400" alt="スクリーンショット 2019-12-18 10.44.43.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213392/b8bc420a-6633-14a1-3f1d-66d1398f7078.png">

## 設定方法
`chrome://flags/#omnibox-ui-max-autocomplete-matches` 
を開き、表示個数を設定する。最大12個まで表示可能です。
<img width="731" alt="スクリーンショット 2019-12-18 10.48.43.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213392/cb8d7845-0c06-4193-4323-0efa58f7ef0b.png">

## 操作感
候補が増える為、履歴やお気に入りをアドレスバー(検索バー)から追いやすくなり便利です。
Mac miniの音声・映像入出力

Mac miniを現在は

 I/O dataのLCD HC241XD

https://www.iodata.jp/lib/manual/pdf2/lcd-hc241xd_m-manu201546.pdf

をつないでいる。

マイクはLCDディスプレイにつないでいる。

スピーカーはダイソーで300円で購入したスピーカーをつないでいる。
直接Mac miniにつないでもいいが、USBポートがLCDにもあるので、LCDにつないでいる。

映像入力はまだ、よさげなものが見つかっておらず、つないでいない。
【AWS】APサーバー用のセキュアなネットワークを作る【備忘録】

# APサーバー用のセキュアなネットワークを作る
AWSでこんな感じのネットワークを作りたい。

<img width="688" alt="network.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553053/4ac30b10-ade8-350f-37a8-b3964d935100.png">

手順書をまとめたが、途中詰まった部分があったので、勉強ついでにいろいろメモしつつまとめます。
設定項目キャプチャ撮ってたのですが、マスクするのが面倒だったので画像無しです。

## ネットワーク作成の流れ
1. VPCの作成
2. サブネットの作成
3. インターネットGWの設定
4. NATゲートウェイの作成
5. ルートテーブルの設定
6. セキュリティグループの作成（おまけ）

## ネットワーク作成の手順

### 1.VPCの作成
1. VPCダッシュボードを開く
2. 「VPCの作成」ボタンを押下する
3. 設定項目に下記を入力し、「作成」ボタンを押下する

> 名前タグ：任意のVPC名
> IPv4CIDR ブロック：任意のIPアドレス
> IPv6CIDR ブロック：IPv6CIDR ブロックなし
> テナンシー：デフォルト

メモ

- VPC＝Virtual Private Cloud＝論理的に分離されたクラウドネットワーク
- 自分の IP アドレス範囲の選択、サブネットの作成、ルートテーブルやネットワークゲートウェイの設定などができる

### 2.サブネットの作成
1. VPCダッシュボード―サブネットメニューへ移動する
2. 「サブネットの作成」ボタンを押下する
3. 設定項目に下記を入力し、「作成」ボタンを押下する

> 名前タグ：任意のサブネット名
> VPC：「1.VPCの作成」で作成したVPC
> VPC CIDR：自動入力
> アベイラビリティーゾーン：任意のアベイラビリティーゾーン
> IPv4CIDR ブロック：任意のIPアドレス


メモ

- 各リージョンにpublic用のサブネットとprivate用のサブネットを作成する
- ブロックの振り方等に特に決まりはないが、サブネットマスクの値は小さいほうが割り振れるIPアドレスが多い（一度、28で設定したためIPアドレスが10個しか割り振れなかった）
- AWSのIPアドレスは普通のネットワーク設定と違って、設定した時点で5個使われるらしい（普通はネットワークアドレスとブロードキャストアドレスの2個）
- アベイラビリティーゾーン＝物理的に分けられたデータセンター

### 3.インターネットGWの設定
1. VPCダッシュボード―インターネットゲートウェイメニューへ移動する
2. 「インターネットゲートウェイ」の作成ボタンを押下する
3. 設定項目に下記を入力し、「作成」ボタンを押下する
> 名前タグ：任意のインターネットゲートウェイ名

4. 再度、VPCダッシュボード―インターネットゲートウェイメニューへ移動し、「アクション」タブから「VPCにアタッチ」を選択する
5. 設定項目に下記を入力し、「アタッチ」ボタンを押下する

メモ

- インターネットゲートウェイが通信の出入り口となる

### 4.NATゲートウェイの作成
1. VPCダッシュボード―NATゲートウェイメニューへ移動する
2. 「NATゲートウェイの作成」ボタンを押下する
3. 設定項目に下記を入力し、「NATゲートウェイの作成」ボタンを押下する

> サブネット：public用に設定したサブネット
> Elastic IP 割り当てID：新しいEIPの作成

メモ

- NATゲートウェイはprivateサブネットのIPアドレスを割り振られたノードが外へ通信する際に必要
- 今回、NATゲートウェイの作成を失念していたため、ロードバランサとAPサーバ間の通信を許可していてもWebからアクセスできなかった
- 気付くのに一番時間がかかった

### 5.ルートテーブルの設定
1. VPCダッシュボード―ルートテーブルメニューへ移動する
2. 「3.インターネットGWの設定」で自動作成されたルートテーブルを選択し、「ルート」タブの「ルートの編集」ボタンを押下する
3. 「ルートの追加」ボタンを押下し、設定項目に下記を選択する
> ターゲット：Internet Gateway ▸ 「3.インターネットGWの設定」で作成したインターネットゲートウェイ
> 送信先：0.0.0.0/0

4. 再度、「3.インターネットGWの設定」で自動作成されたルートテーブルを選択し、「サブネットの関連付け」タブの「サブネットの関連付けの編集」ボタンを押下する
5. 「2.サブネットの作成」で作成したサブネットを選択し、「保存」ボタンを押下する

メモ

- ルートテーブルを作成することで通信経路を登録できる
- public用のルートテーブルとprivate用のルートテーブルを作成する
- private用のターゲットはNATゲートウェイを指定する（外向きの通信を行う際にNATゲートウェイを経由するから）

### 6.セキュリティグループの作成（おまけ）
ネットワークはできたので、ここにAPサーバなり、DBを作成する際に必要なセキュリティグループの作成方法をEC2へのSSH接続許可を例に記載します。
1. EC2ダッシュボードのセキュリティグループメニューを開く
2. 「セキュリティグループの作成」ボタンを押下する
3. 設定項目に下記を入力し、「作成」ボタンを押下する

>セキュリティグループ名：任意のセキュリティグループ名
>説明：任意の説明
>インバウンド/タイプ：SSH
>インバウンド/ソース：マイIP
>インバウンド/説明：任意の説明

メモ

- セキュリティグループ＝ファイアウォールの設定
- インバウンド/ソースにマイIPを設定することで、自分のIPアドレスのSSH接続だけ許可することができる

## まとめ
目標としていたネットワークを作成することができた。
今後は、NATインスタンスやまだ使ったことのないサービスを使用して、よりよいものを作りたい。
みんながUnityを触りやすい環境にするためにやっている5つのこと

本記事は、サムザップ [Advent Calendar 2019 #2](https://qiita.com/advent-calendar/2019/sumzap2)の12/19の記事です。

#はじめに
株式会社サムザップでUnityエンジニアをしている佐藤です。
主に新規開発をしています！
ということで、今回は自分が今のプロジェクトで試している、みんながUnityを触りやすい環境づくりについて書いていきます。
ここでいうみんなというのは、エンジニアのみならずプランナー、デザイナーも含めたプロジェクト全体の人たちという意味です。

#なんでこうしているか？
色々なプロジェクトを経験してきて

* エンジニア向けに依頼や指示書を書くより各自でUnity触れた方が効率がよい(はず)

と思うことが多かったです。
なので新しいプロジェクトでは、みんなが気軽にUnityを触れるようにしたいなーと。
ただ最近のプロジェクトは規模も大きく、なかなか取っつきづらくもあります。
しかしコミュニケーションコストを減らして効率化して、みんなハッピーを目指すのがエンジニア的な正義かなと思い、今回のプロジェクトでは色々な業種の人たちが気軽に触れるように色々と試しています＆普段から気をつけていることをここに書いていこうと思います。


#アクセスしやすく
Assets以下に色々なフォルダがそのまま置かれていると、初見で辛くなってきます。
またあるアセットを探すのにディレクトリがAssets直下に全て置かれていると、けっこうわかりづらいです。
なのでなるべくなるべくアクセスしやすく、Assets以下は整理して、見やすい構造を心がけています。
### Createメニューの拡張
プロジェクト独自のボタンやImageコンポーネントなどはCreateメニューを拡張してアクセスしやすくしています。これでプレハブを探したり、Imageコンポートネントを貼り付けるたびにraycastTargetのチェックボックスを外したりしなくてすみます。

### カラーやフォントサイズなどの定義
カラーはよく使う色を、フォントサイズなどもあらかじめ定義しておいて、カラーパレット上で確認できたり、インスペクター上で直接設定できるようにしています。1つのところに定義してあるので、変更も簡単にできますし、いちいち頭を使わなくてすみます。

### ディレクトリ構造を整理
なんでもかんでもAssets以下に置かないようにしています。

* 外部アセットはExternalAssets以下に
* デザイナーが編集している項目はCreative以下に
* アニメーターやアニメーション、画像素材などはDatas以下に

こうすることで、パッと見で、すぐに理解できるようなディレクトリ階層にしています。

#演出とロジック、個別に確認できる機能
ゲーム上の演出とゲームを行う上でのロジックを個別に確認できるように実装しています。
###演出の確認方法
実機でもEditorと同じように確認できるように、デバッグシーンを用意しました。
そこでは以下のようなことができます。

* 各演出の確認
* Timelineを用いた演出の編集
* 一時停止や再生スピードの変更、補助線などの機能

###ロジックの確認
Editor拡張を用い、データを入力してロジックを呼び出して、結果を出力するシミュレーション機能を用意しました。

* ScriptableObject化したデータを編集することで、色々なパターンを試せる。
* 結果の詳細なログをtxt形式で保存。全体ログから個別ログまで出力。
* シミュレーションのハイライト情報をUnityEditor上に表示。

また実際のゲーム画面でも、この2つを利用して進行するようにしました。
こうすることでプランナー、デザイナーそれぞれがお互いを意識することなく、レベルデザインや演出を作り込むことができます。

#Nested Prefabを活用する
これは複数人で作業する上で非常に強力だと思います。
まず汎用的な部品は基底となるprefabを作り、各シーンにはその派生となるプレハブを置いています。
基底となるprefabにスクリプトをアタッチしておいて、デザイナーさんやプランナーさんが派生先のprefabにパラメータを設定する、配置する、振る舞いを与える、というような使い方をしています。こうすればお互いの作業が競合することがないので、非常に便利です。

ただ派生先のprefabだけでは構造を変更できない点は注意が必要かなと思います。つまり、あまり複雑な構造のprefabのvaliantを作成しても、結局元のprefabをいじらないといけない、という事態になることがありました。

#1機能1シーンの原則
1つの機能を1つのシーンで実装することで、単体での起動とすぐに各機能を確認できるようにしています。
またPrefabが必要以上に大きくなりすぎないという利点もこの中には含まれています。
そのシーンをひらけば、すぐにその機能を確認できるので、例えば

* デザイナーさんがUIを調整する。
* プランナーさんが各シーンの遷移先を変更する。
* 試しにエフェクトを導入してみる

ということを簡単にできるようにしています。

#小さい単位でのスクリプトの作成
プランナーさんやデザイナーさんの中には、簡単なC#スクリプトならへっちゃらという人もいます（すごい！さすが！）。なのでシステム周りの複雑な部分はエンジニアが、表面的な実装はプランナーさんが行うということもやっています。そのために小さい単位の演出的なスクリプトを再生できるようなシステムを作りました。


#おわりに
現在進行形のプロジェクトで、なかなか具体的なことは言えず、わかりづらくて申し訳ないです・・・。

ただスマートフォン向けゲームも日々進化していって、プロジェクトの内容もどんどん大きくなっていきます。
放っておいても勝手に複雑になっていくので、なるべく誰にでも扱いやすいものを目指しています！

明日は@yoshihiko_kさんの記事です。
Googleスプレッドシートでメール文面を自動生成する

いわゆる差し込み印刷的なものです。

Googleスプレッドシートでお客さんであったり、スポンサーなどを一覧で管理していることって多いかと思います。例えばこんな感じ。

![Screenshot_ 2019-12-18 10.23.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/38b0c1ad-a7a7-5a89-e84c-aab3ae2bc647.png)

で、この相手にメールを送りたいとして、メールの文面を相手の情報によって置き換えながら作成したいことがよくあります。例えば最初のデータの場合はこんな感じ。

```
ここはメール文面。

AAA ナカツガワアツシ さん宛のメールです。
```

会社名とか、名前を置き換えているイメージです。手作業でやるのは面倒なのでGoogle Apps Scriptで実現します。

## メールの文面を作る

例えばメールの文面は次のようになります。これは別なシートに作成します。

```
ここはメール文面。

%会社名% %名前% さん宛のメールです。
```

ここの `%〜%` で囲まれている部分が置き換わるイメージです。

## Google Apps Scriptの作成

Google Apps Scriptの関数を作成します。

```js
function template(cell) {
  // 現在のスプレッドシート
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  // 現在のシート
  var sheet = ss.getActiveSheet()
  // 現在の行数
  var row = ss.getActiveCell().getRow();
  // 一行目（置き換えるキーワード）の列数を取得
  var lastCol1 = sheet.getRange(1, 1).getNextDataCell(SpreadsheetApp.Direction.NEXT).getColumn();
  // 置き換えるキーワードを全部取得
  var ary = sheet.getRange(1, 1, 1, lastCol1).getDisplayValues()[0];
  // 置き換わる文字列を全部取得
  var values = sheet.getRange(row, 1, row + 1, lastCol1).getDisplayValues()[0];
  // 置き換え実行
  for (var i in ary) {
    var r = new RegExp('%' + ary[i] + '%', 'g');
    cell = cell.replace(r, values[i]);
  }
  return cell;
}
```

## やっていること

シートの一行名をキーワード（会社名など）として、取得します。後はアクティブなセル（関数を実行しているセル）がある行に並んでいるデータを置き換え後の文字列としています。置換を正規表現にしているのは、キーワードが複数回使われている場合に備えています。カラム名に微妙な正規表現的な文字列があると誤動作するかも…。

## 関数を実行

関数は次のように実行します。!を使って行、列を固定しておかないと下方向コピーした時にセルがずれてしまうので注意してください。 `'シート2'!A1` にはメールの文面が入っています。

```
=template('シート2'!$A$1)
```

![Screenshot_ 2019-12-18 10.32.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/145cc154-9fee-a885-8f41-3803addd57ea.png)

## メール送信

メール送信は手元のメーラーでもいいですし、[Google Apps Scriptからメールを送信するには - Customers Mail Cloud ブログ](http://blog.smtps.jp/entry/2019/12/17/103029)を参考にGoogleスプレッドシートからメール送信することもできるでしょう。
LINEのBOTを作って運営してみて得られた知見

この記事は信州大学のものづくりサークル「kstm」のアドベントカレンダーの12/24分として書かれました。

[kstmアドベントカレンダー2019](https://qiita.com/advent-calendar/2019/kstm)

## 知見
最初に得られた知見の概要を書いておきます

- GitHubEducationは最高
- テストコードを書こう
- 書き始める前にドキュメントを書こう
- モチベを上げる手段を用意しよう

## はじめに 
夏休み期間中暇だったので、LINEのbotを作ってリリースしてました。
MtGのカード名をダブルクオートとかコロンで囲んでチャットするとカード画像とかカードの金額とかが出力されます。


↓友達登録はこちら↓
<a href="https://lin.ee/mXKyCfX"><img src="https://scdn.line-apps.com/n/line_add_friends/btn/ja.png" alt="友だち追加" height="36" border="0"></a>

![S.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296342/5f3718d1-3d10-abd9-560e-de04f26a5c04.png)

そこそこbotを動かしてみて、いろいろバグ修正や機能の追加もやりましたし、ありがたいことに300人近い利用者の方に使っていただきました。この記事ではbot運営で得られた知見and感想を書いていきます。

## 仕様
Python3で書かれたbotをherokuにのっけて動かしてます。

動きとしては、DMとかグループチャットで飛んできたメッセージ全部見て、もしダブルクオートかコロンで囲まれたメッセージが来たらそこだけ取り出してAPIに投げてカード画像とか持ってくる、という風になっています。

あいまい検索にも対応しており、例えば「のたうつウンパス」というカードなら、「うつ　ウンパス」みたいに打ってものたうつウンパスが出力されます。すごいですね


## 得られた知見

### GitHubEducationは最高
GitHubEducationに登録すると貰えるクーポンが最高です。２年くらいタダで使えるDynoがもらえます。

このBOTを動かしてた当初はお金がありませんでした。今もないですが...
当時はDiscordのbotも運営しており、それはherokuではなくAWSにのっけていました。herokuもAWSも無料枠の上で運用していたのですが、AWSの方がメンテが非常に面倒くさく、やってられなかったので常々herokuに移行したいなと思っておりました。でも無料枠超えちゃうし...お金ないし...というジレンマがありました。

そこでいろいろ調べてたら[GitHubEducation](https://education.github.com/pack)の存在を知りました。詳細はリンク先をご覧ください。herokuじゃなくてほかのサービスの特典もあるので是非。

### テストコードを書こう
このbotはいろんな関数に値をポイポイ渡して作られています。
ぶっちゃけ潜在的なバグが多く、手でデバッグしてたので抜けも多いです。
なのでいまだにポコポコとバグ報告がやってきます。
バグ報告は後述するモチベにつながるので嬉しいんですが、それだけ利用者の人が不便を感じているということなのであまり褒められたものではないです。mtgのカードはとても種類が多く、３年くらいmtgやってる僕ですら把握していないカードが多くあります。[^test]

また、今後新しいカードタイプが発表されないとも限りませんし、今後のためにもテストコードは書いておくべきだと感じました。

### 書き始める前にドキュメントを書こう
テストコードを書こうってところと関係します。
何かを作るという行為には目的とゴールが必要であり、作ってる最中にそれらが歪むことがあります。このbotも途中で目的がどっかいきそうになったので、

- 作った目的
- 目標
- 関数の仕様
- 考慮すべき事案

みたいなものをあらかじめリストアップしておく必要があると考えました。
このbotでは考慮すべき事案について全く考えておらず、[^test]で言及したカード群を入力するとbotが水面下で爆発するという残念なことになってしまいました。目下修正中です。

### モチベを上げる手段を用意しよう
これが一番大事かもしれません。

モチベが維持できなければ開発なんて続きません。何故貴重な大学生活を切り崩してこんなクソコードを書いているのか？何故...人とは...人生とは...どうして...

僕はほしいものリスト公開したりtwitterのDM開放したりするとモチベが維持できました。[^motibe]

~~厄介な~~バグ報告もいろいろ頂きましたが、どれも「便利です」「いつも使ってます」という温かい言葉が後ろについており、大変励まされると同時に作ったbotが誰かに使ってもらってるという実感を得ることが出来ました。ですので、何らかの手段で自分のモチベを維持するツールを用意する必要があると思いました。

## 最後に
GitHubEducationは最高なので皆さん使いましょう。


[^test]: 両面カード、反転カード、合体カード。こいつら例外なくバグってます。
[^motibe]: ゴツ盛りが送られてきたりはげましのメッセージをいただいたりしました。バグ報告も...
SQL レコードをコピーする

SQLでレコードを追加する際に、似たレコードを複製しそれを編集して完成させる、というやり方をしたかったので俺用メモ。

## すること
id が 100 のレコードを、data列 を abcdefg に変更して複製する。

## 条件

|データベース名|テーブル名|
|-----------------|------------------|
| myDatabaseName|myTableName |

## SQL文

```sql
-- 確認
SELECT * FROM myDatabaseName.myTableName;

-- 一時テーブルに、idが100のレコードをコピー
CREATE TEMPORARY TABLE myDatabaseName.tmp SELECT * from myDatabaseName.myTableName where id=100;

-- テーブルからid列を削除する
ALTER TABLE myDatabaseName.tmp drop id;

-- data列を変更する
SET SQL_SAFE_UPDATES = 0;
UPDATE myDatabaseName.tmp SET data='abcdefg';

-- レコードを挿入する
INSERT INTO myDatabaseName.myTableName SELECT 0,myDatabaseName.tmp.* FROM myDatabaseName.tmp;

-- 一時テーブルを削除
DROP TABLE myDatabaseName.tmp;

-- 確認
SELECT * FROM myDatabaseName.myTableName;
```

## 参考
- [ある列の値だけを変えてレコードをコピーしたい](https://qiita.com/amay077/items/ba27030e7009c16971ee)
nuxt-ts のビルドが終わらない or 重い

# 事態は突然に
[公式](https://typescript.nuxtjs.org/guide/setup.html)通りに `npx nuxt-create-app` して Nuxt2.9 に TypeScript を導入，試しに `npm run nuxt-ts` すると当然のように成功した :blush:
ちょっと MacBook Air が熱っぽい気がしたけど空気は保温効果高いし仕方ない．

安心して今度はこう

```bash
npm run nuxt-ts generate
npm run nuxt-ts build
```

ーーいつもよりちょっとだけ賑やかな雰囲気の MacBook Airーー
ーー待つ私ーー
ーーついに喋り出したMacBook Airーー
ーー待つ私ーー
ーー唸り始めたAirーー
ーー待つ私ーー
ーー唸りをあげるAirーー
ーー待つ私ーー
ーーAirーー
ーー待っ

`^C` `^C` `^C` バチバチバチ

(訳：ファン全開にしてプロセス走っているのにビルドが95%から全く進まなかったので怖くなって途中で止めた

# 何が起きていたのか

とりあえず中断したが，なんかまだ裏で動いているっぽくてファンがうるさい．空気の癖に．
うるさいので強制終了させた

```bash
$ ps
  PID TTY           TIME CMD
45314 ttys000    0:01.45 /bin/bash -l
35311 ttys000    0:37.78 /hogehoge/node/v12.14.0/bin/node --max-old-space-size=2048 /hogehoge/node_modules/fork-ts-checker-webpack

$ kill 35311

$ ps
  PID TTY           TIME CMD
45314 ttys000    0:01.46 /bin/bash -l
```

ググった
これっぽい　[https://blog.johnnyreilly.com/2019/05/typescript-and-high-cpu-usage-watch.html](https://blog.johnnyreilly.com/2019/05/typescript-and-high-cpu-usage-watch.html)

記事にあるように，nuxt.config.jsに環境変数を追加

```diff:nuxt.config.js
   mode: 'universal',
+  env: {
+    TSC_WATCHFILE: 'UseFsEventsWithFallbackDynamicPolling'
+  },
   head: {
```

もう一度 `npm run nuxt-ts`．さっきよりは静かになったが，`ps` で確認するとプロセスは動いてる．

`npx run nuxt-ts build` はさっきと一緒で成功しない．

しかし，Nuxt2.9 + TypeScript でこの現象に遭遇している人はあまりいないようだ．変だ．


# 直るのも突然(原因不明)
ググっても見つからないエラーって，関係ないところに原因があったりするよね

とりあえずで `node_modules/` と `.nuxt/` を削除しました (追記: 多分 `dist/` も消してた)

```bash
rm -r node_modules
rm -r .nuxt
```

んで `.eslintrc.js` をこんな感じにした

```js:.eslintrc.js
module.exports = {
  root: true,
  env: {
    browser: true,
    node: true
  },
  extends: [
    '@nuxtjs/eslint-config-typescript',
    'plugin:prettier/recommended',
    'prettier/vue',
  ],
  plugins: ['vue']
}
```

んで `npm install` してもう一回ビルドかけたら直った．

どれが原因でプロセスが死ななかったのかはわからなかったが，(自分含め) 誰かがいつか別のバージョンとかで引っかかるかもしれないので一応記事にしておく．

# 追記 (2020/1/2)

案の定引っかかりました．
今回は再現しやすかったので，ちょっと真面目に原因特定しようとしました．

[こういうの(fork-ts-checker-webpack-plugin の issue についたコメント)](https://github.com/TypeStrong/fork-ts-checker-webpack-plugin/issues/357#issuecomment-569874366) も見つけましたが，少なくとも develop ブランチではビルド時に型チェックしたかったので，この方法は採用しないことにしました．

~~### 解決策(?原因は不明のまま(恐らくwebpackの設定)~~

- ~~`dist/` フォルダを消す~~

~~`build` にしろ `generate` にしろ，`nuxt-ts generate` で生成される `dist/_nuxt` フォルダ内の js ファイルを見ているようで，それを消したら fork-ts-checker-webpack-plugin の暴走はとまりました．~~

~~webpack の設定真面目にしなくていいのが nuxt の売りの一つだと勝手に思ってたのですが，ちゃんと勉強しないといけないなと思いました．
ちゃんと理解したらまた追記します．~~

# 追記（2020/3/19） 原因特定

ありがたいことにコメントをいただきました。記事にしておくとこういうのが嬉しいですね。
typecheck に eslint を使っているのですが，eslint の `ignorePath` を通していなかったため，生成された `dist/_nuxt` や `public/`，フォルダまで型チェックがなされており，そこで循環参照を起こして無限ループしていたようです。
上記で `/dist` を消したり `/node_modules` を消したりするとうまくいっているのはそのためでしょうね。

## 解決策

- `.eslintignore` ファイルに `node_modules/`,`dist/`,`public/` を記述してそれらフォルダを無視する
- `.eslintrc` で `ignorePattern` に `node_modules/`,`dist/`,`public/` を設定してそれらフォルダを無視する  
https://eslint.org/docs/user-guide/configuring#ignorepatterns-in-config-files

これで typecheck 時に無限ループに陥ることが防げるようです。
C++で許されるけど、Rustで怒られること(参照)

# C++とRustを比較する

C++やってるけど、「Rustって安全だよ」って言われて興味を持った人向け。
用語はC++視点で。


## ポインタが指している内容を変更する

### C++

```c++:main.cpp
#include <iostream>

int main()
{
    int num = 123;
    int *num_p = &num;
    
    num = 234;
    
    std::cout << "num = " << num << std::endl;
    std::cout << "num_p = " << *num_p << std::endl;
}
```

Output

```
num = 234
num_p = 234
```


### Rust

```rust:main.rs
fn main() {

    let mut num = 123; //mutって書かないと変更できないよ！
    let num_p = &num;
    
    num = 234;
    
    println!("num = {}", num);
    println!("num_p = {}", num_p);
    
}
```

### error[E0506]: cannot assign to `num` because it is borrowed

```
 --> src/main.rs:6:5
  |
4 |     let num_p = &num;
  |                 ---- borrow of `num` occurs here
5 |     
6 |     num = 234;
  |     ^^^^^^^^^ assignment to borrowed `num` occurs here
...
9 |     println!("num_p = {}", num_p);
  |                            ----- borrow later used here
```

num_pポインタはnumを指しているから、numを書き換えてしまうと、num_pが意図したものでないかもしれない。



### Rustに黙らせるコード(C++的にする)

**unsafe**です。C++erの理解のためです。
できるだけ使わないようにしましょう。

```rust:main.rs
fn main() {

    let mut num = 123;
    let num_p = &num as *const i32;
    
    num = 234;
    
    println!("num = {}", num);
    
    unsafe{
        println!("num_p = {:?}", *num_p);
    }
}
```

### Rustに黙らせるコード(Cloneする)



```rust:main.rs
fn main() {

    let mut num = 123;
    let num_p = num.clone();
    
    num = 234;
    
    println!("num = {}", num);
    println!("num_p = {}", num_p);
    
}
```

もちろん別の値になる
Output

```
num = 234
num_p = 123
```


### RustでもC++と似たような挙動にする

コンパイルは通るし、動く。使うところは考えましょう。

```rust:main.rs
use std::cell::Cell;

fn main() {

    let num = Cell::new(123);
    let num_p = &num;

    num.set(234);

    println!("num = {}", num.get());
    println!("num_p = {}", num_p.get());

}
```

Output

```
num = 234
num_p = 234
```
RaspberryPiでディープラーニング ～Tensor Flowのインストール～

# ディスプレイの設定について
1. 左上のメニューを開き、「設定」 → 「Paspberry Piの設定」という項目を選択
2. 「解像度を設定(R)」をクリック
3. 自分の解像度に合わせて変更してください。

# 日本語入力システムを設定
1. RaspberryPiのターミナルを起動し、`sudo apt-get -y install -y ibus-mozc`
を実行し、日本語入力システムをインストールします。
2. 再起動を行う。

# Raspberry PiへTensorFlowをインストール
[TensorFlow](https://www.tensorflow.org/install)のページを確認すると「pip」にてインストールできる事がわかります。

[こちら](https://www.tensorflow.org/install/pip)のサイトを参考に進めていきます。


## Pythonのバージョン確認
ターミナルでバージョンの確認をおこないます。
- Python3系のバージョン確認  
`python3 --version`を実行
※現時点では「Python> 3.4」が要件となっています。

## pip3コマンドの確認
ターミナルでバージョンの確認をおこないます。
`pip3 --version`を実行してください。
※ 現時点では、「pip> = 19.0」が要件となっています。

## virtualenvの確認
ターミナルでバージョンの確認をおこないます。
`virtualenv --version`を実行

## 上記のいずれかがインストールされていなかった場合
下記のコマンドを実行し、インストールをおこなってください。

```
sudo apt update
sudo apt install python3-dev python3-pip
sudo apt install libatlas-base-dev        # required for numpy
sudo pip3 install -U virtualenv           # system-wide install
```

## 仮想環境を作成
以下のコマンドで、「venv」という新しい仮想環境を作成します。

```
virtualenv --system-site-packages -p python3 ./venv
```

仮想環境をアクティブにします。

```
source ./venv/bin/activate
```

仮想環境のpipをアップデートします。
こうする事で、仮想環境ないのpipがシステムに影響を及ぼさなくなります。

```
pip install --upgrade pip
```

仮想環境内のパッケージ一覧を確認します。

```
pip list
```

全ての作業が完了し、仮想環境を無効化したい場合は、`deactivate`を行います。

## TensorFlow本体のインストール
TensorFlowのインストールコマンドについて
- tensorflow : CPUのみを使用する、最新の安定バージョン
- tensorflow-gpu : GPUをサポートした、最新の安定バージョン(Ubuntu及びWindows）
- tf-nightly : プレビュービルド（不安定なこともある）（Ubuntu,WindowsにはGPUサポートが含まれる）

今回は、CPUのみを使用するため、下記のコマンドでインストールを行います。

```:上手く動作しなかったコマンド
pip install --upgrade tensorflow
```
って記載がありましたが、うまく動作しなかったので、

**仮想環境にインストールできなかったので、`deactivate`で仮想環境を抜け、システムに直接インストールしました。**

```:上手く動作したコマンド
pip3 install tensorflow
```

## TensorFlowが正常にインストールされたかの確認
ターミナルで下記のコマンドを実行する

```
python3
import tensorflow
```

WARNINGが出るが、動作に問題は無いため、今回は、そのまま続行する。
気になるので、後日[警告を削除した人の話](https://qiita.com/ktooi/items/48a8d18839cae7246c0b)を参考にして、WARNINGを解消してみようと思います。


[](https://www.kkaneko.jp/tools/raspbian/pikeras.html#4)
SAP CP MultiTargetApplicationの作成方法　その①

###CloudFoundry環境でUI⇆Java⇆S/4を実現するために必要なMultiTargetApplicationを作成する方法

Workspaceを右クリックしNew→Project from Templateを選択
<img width="773" alt="スクリーンショット 2019-12-18 10.03.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543287/aebb56cf-499a-6dd5-a4c3-6a7c692906ee.png">

Multi-Target Applicationを選択
SAPUI5 VersionはInnovationを選択するとアップデートが自動で行われるので選択しない方が良いと思われ。
<img width="1219" alt="スクリーンショット 2019-12-18 10.05.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543287/ca5ce248-5439-b4ba-4365-9b3152561fc7.png">

Project Name は任意（今回はhoge）
<img width="1220" alt="スクリーンショット 2019-12-18 10.05.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543287/2a7a1917-9a08-9f11-8638-fc51a91762e7.png">

Use HTML5 Application Repositoryにはチェックボックスをつける（つけないとapprouterとdeployerが作成されない）
<img width="1222" alt="スクリーンショット 2019-12-18 10.05.34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543287/0a168abd-2c9d-90ca-d981-d9a742aeb3d4.png">

プロジェクトが作成されappRouterとdeployerがプロジェクト内に存在することが確認できる
※右上の目のマークを押してないと見えない
<img width="571" alt="スクリーンショット 2019-12-18 10.14.20.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543287/58a04ef7-3633-6675-075e-14bddbc5c509.png">

今回はここまで。
次回はUI5 Applicationを追加していきます。