OmniAICreator/Qiita-1.07M huggingface dataset:
mac上にhomebrewでAdoptOpenJDK11をインストール

# インストール方法

2019/5/29現在、以下のコマンドを実行するとAdoptOpenJDK12がインストールされます。

```
brew cask install adoptopenjdk
```

LTS版を使用したいときなど、バージョンを指定して入れるにはどうすればいいかというのは、infoを出してみると表示されます。

```
brew cask info adoptopenjdk
adoptopenjdk: 12.0.1,12
https://adoptopenjdk.net/
Not installed
From: https://github.com/Homebrew/homebrew-cask/blob/master/Casks/adoptopenjdk.rb
==> Name
AdoptOpenJDK Java Development Kit
==> Artifacts
jdk-12.0.1+12 -> /Library/Java/JavaVirtualMachines/adoptopenjdk-12.0.1.jdk (Generic Artifact)
==> Caveats
More versions are available in the AdoptOpenJDK tap:
  https://github.com/AdoptOpenJDK/homebrew-openjdk

  brew tap adoptopenjdk/openjdk
```

というわけで、adoptopenjdk/openjdkをtapすればいいらしい。

```
brew tap adoptopenjdk/openjdk
```

これを実行後に検索してみると各バージョンが見えるようになりました。

```
brew search adoptopenjdk
==> Casks
adoptopenjdk                             adoptopenjdk12-openj9-jre
adoptopenjdk10                           adoptopenjdk8
adoptopenjdk11                           adoptopenjdk8
adoptopenjdk11-jre                       adoptopenjdk8-jre
adoptopenjdk11-openj9                    adoptopenjdk8-openj9
adoptopenjdk11-openj9-jre                adoptopenjdk8-openj9-jre
adoptopenjdk12                           adoptopenjdk8-openj9-large
adoptopenjdk12-jre                       adoptopenjdk9
adoptopenjdk12-openj9
```

無印がHotspot JVM版、openj9と付いているのが OpenJ9 JVM版のようです。
今回はAdoptOpenJDK11の、せっかくなのでOpenJ9版を入れてみることにします。

```
brew cask install adoptopenjdk11-openj9
Updating Homebrew...
(略)

==> Satisfying dependencies
==> Downloading https://github.com/AdoptOpenJDK/openjdk11-binaries/releases/download/jdk-11.
==> Downloading from https://github-production-release-asset-2e65be.s3.amazonaws.com/1404190
######################################################################## 100.0%
==> Verifying SHA-256 checksum for Cask 'adoptopenjdk11-openj9'.
==> Installing Cask adoptopenjdk11-openj9
==> Running installer for adoptopenjdk11-openj9; your password may be necessary.
==> Package installers may write to any location; options such as --appdir are ignored.
Password:
installer: Package name is AdoptOpenJDK
installer: Installing at base path /
installer: The install was successful.
🍺  adoptopenjdk11-openj9 was successfully installed!
```

# インストール確認

```
/usr/libexec/java_home -v 11
/Library/Java/JavaVirtualMachines/adoptopenjdk-11-openj9.jdk/Contents/Home
```

# JAVA_HOME、PATHの設定

bashな人はこんな感じで設定してください。

```
export JAVA_HOME=`/usr/libexec/java_home -v 11`
PATH=$JAVA_HOME/bin:$PATH
```

筆者はfish使ってるのでこんな感じ

```
set -x JAVA_HOME (/usr/libexec/java_home -v 11)
set -x PATH $JAVA_HOME/bin $PATH
```

# 設定後、バージョン確認

```
java -version
openjdk version "11.0.3" 2019-04-16
OpenJDK Runtime Environment AdoptOpenJDK (build 11.0.3+7)
Eclipse OpenJ9 VM AdoptOpenJDK (build openj9-0.14.0, JRE 11 Mac OS X amd64-64-Bit Compressed References 20190418_204 (JIT enabled, AOT enabled)
OpenJ9   - bad1d4d06
OMR      - 4a4278e6
JCL      - 5cc996a803 based on jdk-11.0.3+7)
```

というわけで、問題なく設定できていそう。

# 参考
https://github.com/AdoptOpenJDK/homebrew-openjdk
SceneKitでSCNNodeの `boundingBox` はそのノードのローカル座標系における値である

iOS の SceneKit で SCNNode の位置や大きさをだいたい把握するために `boundingBox` プロパティを参照することが多いと思いますが、このプロパティの指す値は公式ドキュメント（下記）にあるとおり、そのノードのローカル座標系における値となるため注意が必要です。

[SCNBoundingVolume - boundingBox](https://developer.apple.com/documentation/scenekit/scnboundingvolume/2034705-boundingbox)

> Scene Kit defines a bounding box in the local coordinate space using two points identifying its corners, which implicitly determine six axis-aligned planes marking its limits.

これについてボックス形状の SCNBox をジオメトリとした SCNNode を例に整理していきます

まず、各辺が 1 の立方体の SCNNode `boxNode` を定義してシーンに追加します。

```swift
let scene = SCNScene()
let box = SCNBox(width: 1, height: 1, length: 1, chamferRadius: 0)
let boxNode = SCNNode(geometry: box)
scene.rootNode.addChildNode(boxNode)
print(boxNode.boundingBox)
```

<img width="375" alt="Simulator Screen Shot - iPhone Xs - 2019-06-02 at 22.18.45.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16508/e9d2d713-7d1b-f856-813b-aef6581c7186.png">

この時、`boxNode` の `boundingBox` は次のようになっています。

```:console
(min: __C.SCNVector3(x: -0.5, y: -0.5, z: -0.5), max: __C.SCNVector3(x: 0.5, y: 0.5, z: 0.5))
```

原点を中心に配置されていることがわかります。それではこの `boxNode` の位置やスケールを変更してみます。

```swift
boxNode.position.x = 1
boxNode.scale.y = 2
print(boxNode.boundingBox)
```

<img width="375" alt="Simulator Screen Shot - iPhone Xs - 2019-06-02 at 22.25.36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16508/90d34285-1307-2ed8-8073-7aebf6d6b9ca.png">

X軸方向に +1 移動し、Y軸方向に倍に伸びた形状になりました。ここで`boundingBox` の値はどうなっているかというと...

```:console
(min: __C.SCNVector3(x: -0.5, y: -0.5, z: -0.5), max: __C.SCNVector3(x: 0.5, y: 0.5, z: 0.5))
```

はい、変更する前と同じです。

最初に述べた通り、`boundingBox` はその SCNNode のローカル座標系のものだからです。SCNNode の `position`, `scale` といったプロパティを変更すると、その親のノードの座標系での位置やスケールが変化していることになります（`position` プロパティの公式ドキュメントには次のように書かれています）。

[SCNNode - position](https://developer.apple.com/documentation/scenekit/scnnode/1408026-position)

> The node’s position locates it within the coordinate system of its parent,

次に、`boxNode` の親となる空の SCNNode `parentNode` をつくり `boxNode` のみを子として追加して `boundingBox` を見てみましょう。

```swift
let parentNode = SCNNode()
parentNode.addChildNode(boxNode)
scene.rootNode.addChildNode(parentNode)
print(parentNode.boundingBox)
```

```:console
(min: __C.SCNVector3(x: 0.49999997, y: -0.99999994, z: -0.49999997), max: __C.SCNVector3(x: 1.4999999, y: 0.99999994, z: 0.49999997))
```

計算の誤差のようなものは出ていますが、実際のカメラからの見た目上の位置と大きさに相当する値になりました。この値は SCNNode の各プロパティや `convert~` 系のメソッドで求めることはできると思いますが、一つ空の親ノードをかませてあげることで簡単に求めることができました。
XserverのSSH認証を使用してターミナルからログイン_ Permission deniedからの脱出

#「id_rsa」 は 「ユーザー名_rsaじゃない」

どうにもつながらん。アクセス拒否ばっかりされてげんなりしていました。

```mac:tarminal
$ ssh -l サーバーID -p 10022 サーバーID.xsrv.jp -v
```
-l オプションでdebugしてみます。すると以下内容が目に止まった。

```mac:tarminal
debug1: Trying private key: /Users/あなたのPCユーザー名が表示されています/.ssh/id_rsa
```
そうなんです。ハマった人の中には、**id_rsa** を **ユーザー名_rsa** に鍵のファイル名を変えてませんか？（私です）

ここはそのまま **id_rsa** でいいんです！！
**Permission denied**からの脱出ができたらGOODボタンを。

デバック大切ですね。
DockerでVueCliのプロジェクトを作成するコンテナを作ってみる

#開発を行う環境を構築する。

## Vue開発に必要最低限のパッケージをインストールしたイメージを作成

※　前提としてDockerが導入されていること
※　docker-composeは使用しません（実力不足）  

```dockerfile:Dockerfile

# ubuntuベース
FROM ubuntu

# 各環境変数を設定
ENV USER vuejs
ENV PASS vuejs

# aptコンテナのupdate&upgrade
RUN apt update && apt upgrade -y

# curl・nodejs・npm・sudo・vimのインストール
RUN apt install -y curl  && \
    apt install -y nodejs npm && \
    apt install -y sudo && \
    apt install -y vim

# n package を導入
RUN npm install n -g

# n package を使って最新nodeをインストール
RUN n stable

# 古いnodeとnpmを消す
RUN apt purge -y nodejs npm

# vue-cli3インストール
RUN npm install -g @vue/cli

# 一般ユーザーアカウントを追加
RUN useradd -m ${USER}
# 一般ユーザーにsudo権限を付与
RUN gpasswd -a ${USER} sudo
# 一般ユーザーのパスワード設定
RUN echo "${USER}:${PASS}" | chpasswd

# 一般ユーザに切り替える
USER ${USER}

# 作業するディレクトリの変更
WORKDIR /home/${USER}

# portを指定する
EXPOSE 8080
```
Vue開発に必要最低限のパッケージをインストールしたイメージを作成します

```docker:imageの作成

docker build -t vuejs:ver1.0 .
```

イメージができたか確認します

```shell:確認
docker images
```
```shell:結果
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
vuejs               1.0                 9933666865dd        4 minutes ago       707MB
ubuntu              latest              7698f282e524        2 weeks ago         69.9MB
```
vuejsというimageができていれば成功です。  

## プロジェクトの雛形を作成しimage化する

作成したvuejsのimageからコンテナを作成する
-pオプションを使用してportを指定しておいてください  

```shell:コンテナの作成
docker run --rm --name VueJS -itd -p 8080:8080 vuejs:ver1.0
```
```shell:コンテナが作成されたか確認する
docker ps
```
```shell:結果
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES
f1ee5532e7a1        vuejs:ver1.0        "/bin/bash"         36 minutes ago      Up 36 minutes       0.0.0.0:8080->8080/tcp   VueJS
```
PORTS：0.0.0.0:8080->8080/tcp
NAMES：VueJS
こんな感じで作成されます。  

プロジェクトの雛形を作成するためにコンテナの中に入る

```shell
docker exec -it VueJS /bin/bash
```

ワークスペース直下にVueCliでプロジェクトを作成する  
cliでプロジェクト作成を行う時の設定はお好みで

```shell
vue create .
```
プロジェクトの作成が終わったら確認を行います。

```shell
npm run serve
```

App running atにあるリンクからアクセスできる事を確認する

```shell
App running at:
  - Local:   http://localhost:8080/
```
<img width="1080" alt="vuejs.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398252/480fd5f0-0288-9e90-4031-8afa8a4a60d6.png">


起動しているnodeサーバーをcommand(ctrl)+shiftで停止する
VueJSコンテナからexitしhostのターミナルに戻ります

## 現在起動しているVueJSコンテナをimage化する。

```shell
docker commit VueJS vuejs:ver1.1
```

今後このimageでコンテナを作成する事でCliで作成されたプロジェクトが出来上がった状態のコンテナが作成されます。

## 参考資料
[Yarn+VueCLI環境をDockerで構築する](https://qiita.com/kawadumax/items/ee73304579254f4398ad)
[Dockerfileを書いてみる](https://qiita.com/nl0_blu/items/1de829288db2670276e8)
【視聴メモ】Demystifying Speed Tooling (Google I/O ’19)

この記事は Google I/O '19 のセッションの視聴メモです。
想定読者は自分なので正確性や網羅率には問題があるかもしれません。

---

## References

https://www.youtube.com/watch?v=mLjxXPHuIJo
Speaker(s): Elizabeth Sweeny, Paul Irish, Amir Rachum

## Abstract

> This talk will provide strong guidance on how to effectively assess and optimize site performance. In collaboration with the Search Console Team, the session will showcase how to methodically diagnose, benchmark against both lab and field metrics, and monitor your site speed using Google's tools. A Chrome performance expert will demonstrate live when and how to use various tools at different stages of development, providing analysis and tips along the way.

訳

> このトークではサイトのパフォーマンスを計測し最適化するための効率的な方法をお伝えします。Search Consoleチームとの協力で、このセッションではサイトを分析するための方法論や実験環境と実際のベンチマーク、Googleのツールを用いたパフォーマンス監視についてご紹介します。Chromeのパフォーマンスエキスパートがライブデモで様々な開発ステージにおける様々まツールの使い方を紹介し、分析のためのチップスをご覧に入れます。

## Contents

* PageSpeed Insights
    * FCPやTTIなどのデータをField Data（実測値）とLab Data（Lighthouseによる計測値）に分けて計測できる
* Lighthouse v5
    * Stack Packs: 使用しているライブラリごとのベストプラクティスを推奨してくれる
* CrUX Dashboard
    * OriginごとのFCPの変化を見れる
* 新しい（ユーザー中心の）メトリクス
    * FCPとかTTIとかと同様に計測すべきメトリクス
    * Layout Stability
        * 広告のせいでコンテンツの位置がずれてクリックできなかったりするのをなんとかしよう
    * Largest Contentful Paint
        * 最も大きいコンテンツが描画されるまでの時間

**様々な計測ツール**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3387/bbae8a46-6865-b3db-d64c-9a1278a34e94.png)

* 結局重要なのは「テクニカルチャレンジ」をすることではなく「ビジネスの課題」を解決すること
    * サイトパフォーマンスがどれだけビジネスに影響を与えるかを考えよう

**Search Console's Speed Report**

* FCP等の実測値をパスごとに確認できる
* まだBeta

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3387/0b24bdec-949d-5b7c-e7e7-1c4bb164a5a6.png)

**Performance Budgets**

* Lightwallet
* Performance BudgetsがLighthouseで計測可能に
* Performanceタブ（Chromeの）
* どうやって一番重い処理を見つける？
    * ページのロードをレコーディングしてメソッドコールのスタックから時間がかかっているところを見つける
* 何回も実行したくない、自動化したくない？
    * CalibreとかSpeedCurveとか
* PSI API
    * PageSpeed Insights のAPI版
* Firebase web performance monitoring
    * 国ごとにFCPの違いを見れたりする
* 競合分析
    * パフォーマンスの計測を競合にたいしても行うことができる
* RUM (Real-time User Mesuring) metrics
    * 代表的なページを選んで、継続的に観察する
* 3rd party tag
    * https://requestmap.webperf.tools
        * サードパーティのリソースがネットワークにどれだけ影響しているか可視化してくれる
    * https://www.thirdpartyweb.today
* 自分のサイト特有のメトリクスを作っても良い
    * imgに`elementtiming`アトリビュートを追加してそれが表示されるまでの時間を図れる
    * `PerformanceObserver`を定義して時間を見れる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3387/9149a5f3-6739-144d-d144-65a482987050.png)

* Lighthouse Plugins
    * AdSpeed plugin
* CIでパフォーマンス計測
    * Lighthouse CI

**まとめ**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3387/00166ad2-f657-46a7-0ca0-b1733d784a4e.png)

## Memo

* 新しく提案されたメトリクスがとてもいい
    * https://bit.ly/layout-stability
* Firebase web performance monitoring
    * 数あるモニタリングツールの中でも頭抜けて使いやすそう
* elemnt-timing アツくない？
【AtCoder】ABC086C - Traveling

# これは何？
AtCoderという競技プログラミングサイトの練習問題についての私の解答です。
残念ながら自力で解けず、参考サイトを大いに参考にして書きました。

（参考サイトのコードをRubyコードに置き換えて申し訳程度に修正しただけとも言う）


問題はこちら。
https://atcoder.jp/contests/abs/tasks/arc089_a

# 解答
```ruby
n = gets.to_i
 
t_list = [0]
x_list = [0]
y_list = [0]
 
n.times do
  t, x, y = gets.chomp.split.map(&:to_i)
  t_list << t
  x_list << x
  y_list << y
end
 
i = 0
reachable = true
while i < n do
  dt = t_list[i + 1] - t_list[i]
  dist = (x_list[i + 1] - x_list[i]).abs + (y_list[i + 1] - y_list[i]).abs
  
  if (dt < dist) or (dt % 2) != (dist % 2) then
    reachable = false
    break
  end
  
  i += 1
end
    
if reachable then
  puts 'Yes'
else
  puts 'No'
end
```

## 基本的な考え方
* 次に到達するべき座標への距離と、移動距離との兼ね合いで到達可否が決まる
  * 座標への距離に対して移動距離が足りなければもちろんNG
  * 座標への距離と移動距離が同じならもちろんOK
  * 座標への距離に対して移動距離が大きければ、それぞれの偶奇が一致していればOK、そうでなければNG（偶奇が一致していれば、同じ場所で行ったりきたりして移動距離を調節できるため）

## 実装について
* dtが移動距離
  * 時間が1増えた際に移動する距離は1なので、tは移動距離に等しい
* distが座標への距離
* t_list、x_list、y_listについてダミーデータとして0を先頭に入れている
  * i + 1というアクセスをするため、配列の要素数はnより1大きくないといけない

# 参考サイト
* https://blog.simnet.co.jp/%E3%82%84%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%88%E3%81%86%EF%BC%81%E7%AB%B6%E6%8A%80%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0/
* https://qiita.com/drken/items/fd4e5e3630d0f5859067#%E7%AC%AC-10-%E5%95%8F--abc-086-c---traveling-300-%E7%82%B9
同じものを含む円順列（数学A)　その２

# 同じものを含む円順列　その２
同じものを含む円順列について，前回は『白玉4個，黒玉4個』で考えてみました。今度はこの個数を変えてみます。

### 問題
1. 白玉7個，黒玉3個を円形に並べる方法は何通りか？
2. 白玉6個，黒玉4個を円形に並べる方法は何通りか？

###解答
1. まず，白玉7個，黒玉3個，合計10個を一列に並べます。並べる方法は
$${}_{10}\text{C}_3=120\text{（通り）}$$


7と3の公約数は1のみです。（互いに素となっています）

- 公約数1...$\frac{10}{1}=10個で1通り$

これしかありません！なので，10で割ればいいことになります!


$$\frac{120}{10}=12\text{（通り）}$$

2. まず，白玉6個，黒玉4個，合計10個を一列に並べます。並べ方法は
$${}_{10}\text{C}_4=210\text{（通り）}$$
となります。


6と4の公約数は1，2なので，

- 公約数1...$\frac{10}{1}=10個で1通り$
- 公約数2...$\frac{10}{2}=5個で1通り$


#### 5個をまとめて1通り

○○⚫︎⚫︎⚫︎を並べて，${}_{5}\text{C}_2=10\text{（通り）}$

円形に並べると，2と3は互いに素なので，5で割ればよく，
$$\frac{10}5=2\text{（通り）}$$


#### 10個をまとめて1通り

全体から『5個をまとめて1通り』のケースを除いて，10で割ります。
$$\frac{210-10}{10}=20\text{（通り）}$$


以上より，白玉6個，黒玉4個を円形に並べる方法は
$$2+20=22\text{（通り）}$$
となります。
Python  型判定で使える組み込み関数　type()とisinstance()をまとめた

型を調べたいときに使える組み込み関数として、type()とisinstance()があります。
それぞれの使い方、違いについて簡単にまとめました。
※実行したバージョンはPython3.7.3です。

## type()

引数に調べたいオブジェクトを渡すと結果が返ってきます。

``` python
>>> a = 1
>>> type(a)
<class 'int'>
```
型判定するとこんな感じ

```python
>>> type(a) == int
True
>>> type(a) == list
False
```
型が一致するとTrue、一致しなければFalseになります。
引数で指定したオブジェクトが判定対象のサブクラスだった場合はどうなるのでしょうか？


試してみる

```python
>>> class MySuperClass(object):
...     pass
...
>>> class MyClass(MySuperClass):
...     pass

>>> my_class = MyClass()
>>> type(my_class) == MyClass
True
>>> type(my_class) == MySuperClass
False
```
引数で指定したオブジェクトがサブクラスのインスタンスだった場合、Falseが返ります。
サブクラスの場合は一致しないと判断されるのですね。

## isinstance()
引数を2つとり、判定結果がboolで返ります。

```python
>>> a = 1
>>> isinstance(a, int)
True
```

第一引数で指定したオブジェクトが第二引数のサブクラスのインスタンスの場合はどうなるのでしょうか？

試してみる

```python
>>> class MySuperClass(object):
...     pass
...
>>> class MyClass(MySuperClass):
...     pass
...
>>> my_class = MyClass()
>>> isinstance(my_class, MyClass)
True 
>>> isinstance(my_class, MySuperClass)
True
```

第一引数が第二引数のクラスのインスタンス、またはサブクラスのインスタンスだった場合、Trueが返ります。

ちなみに、第二引数ではオブジェクトのタプルを指定することもできます。
タプル内クラスのいずれかのインスタンス、またはサブクラスのインスタンスだった場合Trueが返ります。

```python
>>> b = True
# bはboolオブジェクトなのでTrue
>>> isinstance(b, (bool,str))
True
>>> isinstance(b, (float,str))
False
# boolはintのサブクラスなのでTrue
>>> isinstance(b, (int,str))
True
```

##使い分け
使い分けのポイントはやはりサブクラスの判定ですね。サブクラスをTrueにしたいならisinstance()，そうでないならtype()といったところでしょうか。

ちなみにPythonの公式リファレンスでは型の判定にはisinstance()の使用を推奨すると書かれれているようです。
https://docs.python.org/ja/3/library/functions.html#type
【5分でできる】Unityで作成したアプリをOculusQuestで動かす！

## 本記事について

Unityで作成したアプリをOculus QuestでBuildする方法について書いていきます。
基本的には他のHMDと同じなのですが一応書いておこうと思いました。

※JDKやAndroidSDKは入っている前提で進めていきます。


## 作業開始
まずアセットストアでoculusと検索して「Oculus Integration」をインポートしましょう!
![無題3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201127/7cbe7f76-a065-6e6a-d689-d4b03b224243.png)

とりあえずPlaneだけ置いておきます。
![無題2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201127/5ebf4837-7d61-d00d-3e6d-9f70522414e6.png)

BuildSettingsを選択して、プラットフォームをアンドロイドに変更しましょう。
![無題4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201127/9a55af12-fb7d-8514-623f-8b8e847b2008.png)
![無題5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201127/e9e5a2f8-1caa-c895-c35a-31a1a4bdfad9.png)

PlayerSettingsのXRSettingsからOculusを選択しましょう。
![無題6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201127/405222bd-15b9-b7ce-d55c-e4ebca6f7188.png)



OVRCameraRigをヒエラルキーに置きます。
既存のcameraは削除しておきましょう。

OVRCameraRigの構成は画像の通りです。
![無題7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201127/5303af3f-5933-7bd7-2561-7a71007ead91.png)

LeftHandAnchorとRightHandAnchorにOVRControllerPrefabdをドラッグアンドドロップします。
左右のコントローラーはそれぞれ設定で合わせておきましょう。
![無題8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201127/79f4281f-8525-72ec-561e-dc199ee90c20.png)
![無題9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201127/7381c972-f45b-6206-9bbd-d9a3018fd6d8.png)


ここまでできたらBuild and runでビルドしましょう。
画像のようにコントローラーが出てくると思います。
![com.Company.test2-20190602-215548.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201127/978d7816-dba6-256b-3949-b1fb2831a904.jpeg)



## サンプルプロジェクトを参考にする
Oculus Integrationの中には沢山のサンプルプロジェクトが入っているので参考にしてみると良いでしょう。

ベーシックなコントローラーのサンプルで指の動きなども反映されます。
![com.Company.test2-20190602-192351.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201127/f322aa02-15e9-1a4b-76e4-bca976920a9b.jpeg)

Avaterがたくさん並んでいる。
![com.Company.test2-20190602-192622.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201127/cd6f6a7e-8b1b-9305-400f-026743c795d4.jpeg)

リップシンクのサンプルでマイクをオンにして喋るとキャラクターの口も動きます。
![com.Company.test2-20190602-193642.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201127/f4749c97-3808-90f7-aa4a-a22105357ad3.jpeg)

Roomというサンプルで並んでいる箱は掴んで投げたりできます。
![com.Company.test2-20190602-193951.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201127/eccd6650-5881-c884-7381-86a2f886f43d.jpeg)

### 次回はもう少し本格的なアプリの作り方について書いていこうと思います！
Jetson TX2 性能情報

#目的
Jetson TX2は、電力値として7.5(watts)とか小さい数字が示されている。
NVIDIAのサイトから情報を拾う。

出典：
https://www.nvidia.com/en-us/autonomous-machines/embedded-systems/jetson-tx2/

#Jetson Nano 性能情報

## size
>50 mm x 87 mm size

## performance

（このページにGFLOPSとかGOPSとかの情報がない。）

## power

>At just 7.5 watts

#GPUスペック

>NVIDIA Pascal™ architecture with 256 NVIDIA CUDA cores

動作周波数は？？？

(出典：　https://en.wikipedia.org/wiki/Nvidia_Jetson　）

<img width="697" alt="tx2_clock.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342207/e15020ae-278f-031e-0a14-fdd73884f437.png">

→　演算性能は、（半精度浮動小数点演算にて）
　1302(MHz) × 256(CUDA コア) × 4(半精度だから) 　→　1.333 TFLOPS
となる。


？？　世代は、Maxwell → Pascal → Volta の順のはずだが、なぜ、発売が後のNANOが
　　　　Maxwell　なのか？　


#その他の情報

リリース時期は、以下。

(出典：　https://en.wikipedia.org/wiki/Nvidia_Jetson　）
>was announced in March 2017

#NVIDIA GPU 共通情報
世代など。

(出典： https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html )

|  世代   |  EMBEDED   | COMSUMER DESKTOP,<br>LAPTOP    | PROFESSIONAL<br>WORKSTATION    | DATA <br>CENTER    |     
|:---:|:---:|:---:|:---:|:---:|
|  Turing<br>CC7.x   | Xavier    |     |     |     |     
| Volta<br>CC7.x | Xavier    |     |     |     |     
|  Pascal<br>CC6.x   | Tegra X2<br>[jetson TX2]    |     |     |     |     
| Maxwell<br>CC5.x    |Tegra X1<br>[Jetson NANO]     |     |     |     |     
| Kepler<br>CC3.x    |Tegra K1     |     |     |     |     
※CC: Compute Capability。
※[ ]内、機種名
※ニンテンドースイッチは、Tegra X1。
※半精度浮動小数点演算は、CC5.3以上でサポート。
    以下の引用のところに書かれています。
(図　引用： https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html  )
<img width="564" alt="16bit.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342207/9f5dcc69-0b7b-6e3d-00dd-c180b9f4f34d.png">


#まとめ
GFLOPs の数字は、このページにはない。。。。

#今後
適宜、記載を追加します。
コメントなどあれば、お願いします。:candy:

#関連（本人）
[Jetson NANO 性能情報](https://qiita.com/enoughspacefor/items/8fd50402224351bbd085)
[良書 「GPUを支える技術　超並列ハードウェアの快進撃[技術基礎]」を読む](https://qiita.com/enoughspacefor/items/31e9461b6a07b484b643)

#関連（本人以外）
以下を参考にしました。
[NVIDIA Teslaスペック](https://qiita.com/yukoba/items/10d0ba3fb1d19a6ab6a5)
Jetson Nano 性能情報

#目的
Jetson Nanoは、電力値として5(watts)とか小さい数字が示されている。
NVIDIAのサイトから情報を拾う。

出典：
https://www.nvidia.com/en-us/autonomous-machines/embedded-systems/jetson-nano/

#Jetson Nano 性能情報

## size
>At just 70 x 45 mm

## performance

>Jetson Nano delivers 472 GFLOPs for running modern AI algorithms fast. 

## power

>high-performance computing at just 5 to 10 watts.

#GPUスペック

>NVIDIA Maxwell™ architecture with 128 NVIDIA CUDA® cores

動作周波数は？？？
（出典：　 https://en.wikipedia.org/wiki/Nvidia_Jetson 　）


<img width="301" alt="nano_clock.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342207/8efda6a2-a64f-11a4-eb32-195e6ab86664.png">

→　演算性能は、（半精度浮動小数点演算にて）

　921(MHz) × 128(CUDA コア) × 4(半精度だから) 　→　**472 GFLOPS**


となる。
注）計算式からわかるように、上記の**472GFLOPSは、10(watts)のときの数字**です。


？？　世代は、Maxwell → Pascal → Volta の順のはずだが、なぜ、発売が先のTX2が
　　　　Pascal　なのか？　

#その他の情報

リリース時期は、以下。
>NVIDIA Jetson Nano modules will be available from distributors worldwide starting **June 2019**.

以下は、wikiより
( https://en.wikipedia.org/wiki/Nvidia_Jetson )
>wide availability in "June 2019"


#NVIDIA GPU 共通情報
世代など。

(出典： https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html )

|  世代   |  EMBEDED   | COMSUMER DESKTOP,<br>LAPTOP    | PROFESSIONAL<br>WORKSTATION    | DATA <br>CENTER    |     
|:---:|:---:|:---:|:---:|:---:|
|  Turing<br>CC7.x   | Xavier    |     |     |     |     
| Volta<br>CC7.x | Xavier    |     |     |     |     
|  Pascal<br>CC6.x   | Tegra X2<br>[jetson TX2]    |     |     |     |     
| Maxwell<br>CC5.x    |Tegra X1<br>[Jetson NANO]     |     |     |     |     
| Kepler<br>CC3.x    |Tegra K1     |     |     |     |     
※CC: Compute Capability。
※[ ]内、機種名
※ニンテンドースイッチは、Tegra X1。
※半精度浮動小数点演算は、CC5.3以上でサポート。
    以下の引用のところに書かれています。
(図　引用： https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html  )
<img width="564" alt="16bit.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342207/9f5dcc69-0b7b-6e3d-00dd-c180b9f4f34d.png">

#まとめ
472 GFLOPs の数字は、特別、高い数字でない気がする。。。。

#今後
適宜、記載を追加します。
コメントなどあれば、お願いします。:candy:

#関連（本人）
[Jetson TX2 性能情報](https://qiita.com/enoughspacefor/items/76423f7442e675515fa5)
[良書 「GPUを支える技術　超並列ハードウェアの快進撃[技術基礎]」を読む](https://qiita.com/enoughspacefor/items/31e9461b6a07b484b643)

#関連（本人以外）
以下を参考にしました。
[NVIDIA Teslaスペック](https://qiita.com/yukoba/items/10d0ba3fb1d19a6ab6a5)
Nuxtでサイト側で設定した環境変数を読み込む方法

# はじめに
私は今まで、`API_KEY`などは`dotenv`や`cross-env`を使って、ローカルの`.env`ファイルに記述して、管理していました。でも実はNetlifyやHerokuなどのサイト側で設定ができるんですね！知らなかった・・・。

今日それを知ったので、備忘録として。

# サイト側の設定
Settingページへ行って、設定をしてみましょう。

Netlifyの場合
![スクリーンショット_2019-06-02_21_17_59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252687/89b73d01-8837-2dd8-cb56-10a1f90657cc.png)

Herokuの場合
![スクリーンショット_2019-06-02_21_21_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252687/a986138d-b9b0-c49f-5641-18504ccc4ac9.png)


*公式にも載っていますが、既に設定住みの環境変数は、使えませんのでご注意を。
参考：[Netlifyで環境変数を設定する方法](https://www.suzu6.net/posts/149-netlify-environment-variables/)


# Nuxt側の設定
さて、これで終わりかと思い`console`で出してみても`undefined`となります。

```js
console.log(process.env.API_KEY) // undefined
console.log(process.env.NODE_ENV) // production
```

(上記の`process.env.NODE_ENV`の場合、自動で`development`もしくは`production`が環境に応じて入ってきます)

なので、Nuxt側でも設定が必要になります。

```nuxt.config.js
const { NODE_ENV, API_KEY } = process.env
module.exports = {
  ...
  env: {
    NODE_ENV,
    API_KEY
  },
  ...
}
```

分割代入で、`process.env`からそれぞれのキーを取得し、それを`env`キーに設定しなければなりません。
これで、晴れてNuxt側からこれらにアクセスすることができるようになります。

設定が終わったら保存して、pushしておきましょう。

ビルドが終わったら、もう一度`console`でみてみます。

すると、無事に読み込めていることが確認できるでしょう。

```js
console.log(process.env.API_KEY) // hogehoge
console.log(process.env.NODE_ENV) // staging
```

やったー！！:raised_hands:
無事にサイト側で設定した環境変数がNuxt側で読み込めているのがわかります。
こうすれば、`cross-env`を使ってファイルを環境用に作る必要も無くなりますね！
micro:bit＋電流センサで電気調理器具のON→OFFを可視化する

#概要
電気調理器具がON→OFFになった時に通知する仕組みを作る

#背景
調理器具のタイマーのアラーム（例：電子レンジの「チン」音）は聴覚障害者は気づくことが出来ないため、視覚的に通知する仕組みを作りました。

#処理の流れ
1.電流がON→OFFになる
2.micro:bitが上記を検知して、アニメーションで表示

#動画
調理器具の
　電源ON:音符マーク♪
　電源ON→OFF：ハートマークのアニメーション
　　完了に気付いてBボタンを押すまで点滅
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">micro:bit＋電流センサで電気調理器具のON/OFFを感知する仕組みを作成<br>電源ON:音符マーク♪<br>電源ON→OFF：ハートマークのアニメーション<br>Bボタンを押すまで点滅 <a href="https://t.co/hWQKI73Yq6">pic.twitter.com/hWQKI73Yq6</a></p>&mdash; keicafeblack (@keicafeblack) <a href="https://twitter.com/keicafeblack/status/1135158129254027264?ref_src=twsrc%5Etfw">2019年6月2日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

#主要部品
* micro:bit
* 電流センサ：SCT-013-000
* 抵抗：33Ω、1kΩ*2
* コンデンサ（10μF）
* [基板取付用３．５ｍｍステレオミニジャック　スイッチ付　ＭＪ－４９５](http://akizukidenshi.com/catalog/g/gC-12478/)

#回路
下記を参考にさせてもらいました。
[YHDC SCT-013-000 CT とArduinoで家庭内の電流を測定す](http://spice-cabinet.cocolog-nifty.com/blog/2018/05/yhdc-sct-013-00.html)

#コード

■MakeCode
https://makecode.microbit.org/_hCz5T7DFsX7w

■javascript版

```javascript:vChecker.js
let StateOFF: number[] = []
let DMY = 0
let IsON = 0
let tempV = 0
let TimeList: number[] = []
let count3 = 0
let AveV = 0
input.onButtonPressed(Button.A, function () {
    FuncIsONAve()
    basic.showNumber(AveV)
    basic.pause(1000)
})
function FuncIsONAve() {
    AveV = 0
    for (let i = 0; i < 3; i++) {
        tempV = Math.round(Math.map(pins.analogReadPin(AnalogPin.P0), 0, 1023, 0, 3300))
        AveV = AveV + tempV
        basic.pause(100)
    }
    AveV = AveV / 3
    if (AveV < 1600 || AveV > 1700) {
        IsON = 1
    } else {
        IsON = 0
    }
}
AveV = 0
count3 = 0
TimeList = [0, 0, 0]
StateOFF = [0, 0, 0]
IsON = 0
basic.showIcon(IconNames.Yes)
basic.forever(function () {
    FuncIsONAve()
    if (IsON == 1) {
        basic.showIcon(IconNames.EigthNote)
    }
    TimeList.push(IsON)
    DMY = TimeList.shift()
    basic.pause(2000)
    if (100 == TimeList[0] * 100 + TimeList[1] * 10 + TimeList[2] * 1) {
        while (!(input.buttonIsPressed(Button.B))) {
            basic.showIcon(IconNames.Heart)
            basic.pause(500)
            basic.showIcon(IconNames.SmallHeart)
        }
        basic.showIcon(IconNames.Yes)
    }
})

```
iframe(インラインフレーム)の使い方

この記事は、iframeタグについてまとめたものです。

想定読者：
* iframeタグを知らない人
* iframeタグの使い方が分からない人

#iframeタグとは
iframeはhtml内に別のhtmlを埋め込むタグです。
以下、iframeの使い方例を3つ紹介します。

##シンプルにiframeタグを使う例
同じ階層にindex.htmlとabout.htmlがある場合の例を紹介します。
以下、index.html内でabout.htmlを埋め込む例です。(bodyタグの中身のみ記述します。)

```html
 <p style="color:blue;">indexページです</p>
 <iframe src="./about.html">同じ階層にあるabout.htmlを埋め込む</iframe>
   
```
pタグはindex.html内に埋め込んでいることを分かりやすくするために記述しただけですので、iframeの使用には全く関係がありません。
以下、index.htmlを実行した結果です。

![example1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355738/eeb26423-04f2-cdf7-0ca5-e640a86a2d11.png)

実行結果1

「indexページです」と書かれた文の下に枠で覆われた部分(aboutページですと書かれてある部分)が埋め込まれている箇所になります。
iframeタグの開始タグと終了タグで挟んだ記述は実行結果には出力されていません。この位置にある文は、htmlの埋め込みに失敗した場合に出力されます。

##iframeタグの大きさ等を指定する例
iframeタグはタイトルや高さ、幅などを指定することもできます。
上記の例の下に、下記を追加してみましょう。

```html
    <iframe title="about" width="500" height="500" src="./about.html">幅、高さを指定して埋め込む</iframe> 
```
このhtmlの実行結果は以下のようになります。

![example2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355738/9aa43170-5afb-2b8c-37f1-3a1cf02a481c.png)
実行結果2

##iframeタグで外部のhtmlを埋め込む例
iframeタグで指定するhtmlは外部のhtmlでも参照可能です。
上記のhtmlに以下を追加してみましょう。

```html
<iframe title="qiita" width="800" height="500" src="https://ja.wikipedia.org/wiki/Qiita">Qiitaとは</iframe>
```
以下、実行した結果です。Qiitaのウィキペディアページが埋め込まれました。

![example3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355738/18d0d2dc-47c8-0d81-59c7-b3d58692eebf.png)
実行結果3

##iframeタグでyoutubeの動画を埋め込む例
iframeタグはYoutube動画の埋め込みも可能です。
埋め込む手順について説明します。

1. 埋め込みたい動画のページを開く
2. 共有ボタンをクリック(以下の画像の青枠部分のことです)
![share.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355738/e2c3bbe2-943c-2c37-f2cc-9fbea23d01c8.png)
3. 埋め込むボタンをクリック(以下の画像の青枠部分のことです)
![embed.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355738/cbfd2f47-d96c-fbdc-4d23-878d2be58b8a.png)
4.iframeのソースをコピーする(以下の画像の青枠部分のことです)
![copiedIframe.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355738/56071227-68e0-8979-997e-d8134e21f847.png)
5. 自分のhtmlに貼り付ける

今回は例としてapple社の動画を自分のhtmlに表示させます。
上記のhtmlに以下のを追加してみましょう。

```html
<iframe width="560" height="315" src="https://www.youtube.com/embed/T-fXzUsPZtM" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen>youtubeの動画を埋め込む</iframe>
```

以下、実行結果です。apple社の動画が埋め込まれました。

![example4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355738/e0831284-3560-b925-053d-fdb95933e8dc.png)
実行結果4

#参考にしたサイト一覧
https://www.youtube.com/user/Apple
iframeの説明のために用いたappleの公式youtubeです。
#まとめ
今回はiframeタグの以下のことについて説明しました。
　・iframeタグの利用によるhtml内に別のhtmlを埋め込む方法
　・iframeタグの利用によるyoutubeの動画を埋め込む方法
Raspberry PiにVNC接続できない時の対処法

# 前提

接続方法は知っているけど、なぜか接続できない人のための記事です。接続方法は簡単にしか書きません。

また、一応確認ですが、PCとRaspberry Piは同じネットワーク内になければなりません。つまり、PCとRaspberry Piを同じWi-Fiに繋ぐか、PCとRaspberry Piを直接LANケーブルでつなぐ必要があります。

LANケーブルを使う場合は、ストレートケーブル（通常のLANケーブル）でもクロスケーブルでも構いません。これは、Raspberry Pi内部に自動的に変換する仕組みがあるためです。

# ダメな接続方法

PC側のVNC Viewerを起動して、ウィンドウ内上部のテキストボックスに``raspberrypi.local``（またはRaspberry PiのIPアドレスでも可）と入力します。

しばらくすると、ユーザーネームやパスワードの入力を求められるので、それぞれ入力します。デフォルトは、それぞれ ``pi``と``raspberry``です。そして [OK] をクリックすれば接続できるはずなのですが...

**何度やっても失敗します。**

# 解決法

接続する前に、初回のみ次の作業をする必要があります。

Raspberry PiでVNC Serverを起動します。ウィンドウ右上のメニューボタン（横棒が縦に3つ並んだマーク）から [Option] を開き、 [Security] タブの [Authentication] を``Unix password``から``VNC password``に変更します。

[OK] をクリックするとパスワードの設定を求められるので、適切に設定してください。

設定したパスワードでもう一度接続を試みると、無事接続できるようになっています。
働き方改革第２弾。どうやって改善するか!!

# 働き方改革第２弾。どうやって改善するか！！
さて、いくつかiPad Proにしてもやりたいことがあるのだが、それができる方法を調べる
- iPad appをCloudでビルドできる環境を調べる
- MacをCloudで使えるサービスを調べる
さて、この２つは取り急ぎ調べたい。

## iPad appをCloudでビルドできる環境を調べる
以前、同じことを調べ挫折したが、今回は働き方改革のために必須となった。
やらなければ、、、ということで、いろいろとサービスを調べた

以前調べたもの
- Adobe PhoneGap Build <https://build.phonegap.com/>
- Unity Cloud Build <https://unity3d.com/jp/unity/features/cloud-build>
で、この２つで試したがエラーとなった為、諦めていた、、、。
そして、今回、新しいサービスを見つけた
- Bitrise <https://www.bitrise.io/>
なんか、これも挫折しないか心配だったが、Free Planで実験。

### Bitrise <https://www.bitrise.io/>
まず、サイトに登録。
その後、とりあえずアプリの設定を進める。
とりあえずソースはbitbucketにあったので上から順番にいろいろ設定していく。
（ここまでは順調。というか、わかりやすいUIでスイスイ進む！！）
で、一通り設定を完了し、Build！！！！

きたーーーーーーーーーーーーーーーーーーーーーー、エラー、、、。

Buildのログを見たらこんな感じ
「Code signing is required for product type 'Application' in SDK 'iOS 10.3'」
こんなエラーが出た。
とりあえずググった。

その結果、「Xcode 上での Signing の設定が原因になっているようだ。」ということが発覚。
Build後に設定の編集機能があり、単純に証明書や、プロビジョニングファイルの設定が漏れていただけだった。
あっ、、、ただ、そのあと１回エラーが出た。
https://qiita.com/a_jike/items/f3c87845da8456e26526
こちらのサイトにお世話になりました。
「Codesigning Style」のところで躓きました。
でも、これで完璧！！
今後は、プロビジョニングファイルさえ更新して、RebuildすればipaファイルがCloud上で生成される。
しかも、FreePlan内に収まる！！素晴らしい！！

## MacをCloudで使えるサービスを調べる
さて、ipaファイルはCloudでできるようになったけど、今後、修正する可能性もあるため、Macbookがいざ使えなくなった場合に、、、と言うのを考慮しなければならない。
さて、MacのCloudサービスを調べるか

|ServiceName|Price|
|:-----------------|------------------:|
|Xcloud MINI|CHF79/mo|
|HostMyApple Basic|USD49.99/mo|
|vmOSX Lite|USD24.75/mo|
|MacStadium　<https://www.macstadium.com/pricing>|USD59/mo|
|macincloud　<https://www.macincloud.com/>|USD20+/mo|
参考サイト：https://shunirr.hatenablog.jp/entry/2012/12/18/150100

調べてみたが、macincloudは１時間から借りられるらしい、、、。
まぁ、ここにメモっておいて、必要な的に契約しよう。

ということで、今日は終了。
今後の記事はiPad Proから書き込む予定。(現在は、Macbook Airから）
キーボードについて（メリット・メーカー・配列・設定）

**【注意：編集中】**
もし職場で使えそうだったら職場で。難しそうだったら自宅で使うようの新しいキーボードを購入し、せっかくなので以前から興味があったQiitaを使って新キーボードに慣れてみようと思い1本めの記事として書き始めました。
しかし、打つのが楽しくてただただダラダラと書き続けるだけの記事になってしまい、作成に時間がかかりすぎています。
Qiitaのナレッジコミュニティとしての特色としても、まとまりのないこの記事はよろしくない。
とはいえ、記念すべき一本目の記事。お蔵入りさせたくもない。
というワガママでそのうち編集投稿します。
もっと書いておきたい話の方を優先して書いていきます。

----

以前からQiitaで投稿された様々な記事を読ませていただいており、非常にありがたい情報をたくさん頂いておりました。
個人メモや後輩社員用の読み物として、私自身も記事を投稿する側にいつか回りたいと思いながらも、仕事中は時間の確保が難しい。家に帰ってからはすぐに寝たい。そんな事情で腰を上げていなかった私がQiitaを始めようとしたきっかけの話。
これを１件目の投稿にしようと思います。

# はじめに
この記事ではキーボードの

- 良いものを使ったほうが良い理由
- 選び方
- メーカー・種類
- 配列
- 実際にWindowsPCに接続して使う場合の設定

について私の経験してきたことを書かせていただきます。
おすすめキーボード紹介のような記事ではありません。
私の経験値不足もありますが、人によって合う合わないがありますし、実際に使ってみるのが一番です。
良記事がネットにたくさんありますので、そちらを探してみてください。
職場によると思いますが、キーボードを選べる環境にいるのであれば、*自分の体に合うキーボードを使うことに一定のメリットがある*ことをお伝えできれば大変嬉しく思います。

# キーボードを選ぶようになったきっかけ
プログラマー・システムエンジニアといった職種の方はキーボードを叩くことが日常になっていると思います。
順調に仕事が進んでいるときは、思っている以上にキーボードを叩いている時間は短いものです。
しかし、いざ納期は迫っている。バグが発生した。修正。テスト。とにかく工程を消化しなければいけない（いわゆるデスマ）という状況に追い込まれたとき。キーボードを叩く量とペースは激増します。このとき、仕事の相棒への信頼度が高いことは非常に大切なことです。

というのも、私、開発→テストを通常の３倍ぐらいのペースで
tabをリズミカルに叩いて、データを入力してtabを叩いてOKボタンまで進んで、Enterキーをターン！！！
というテストをしばらく実施していたら、手首の痛さから湿布とバンテリンが手放せなくなりました。

当時使っていたのはDELLのデフォルトで付いてきたメンブレンキーボード。
秋葉原とかで買おうとしたら、１０００円しないでおそらく買えます。

なんでこの忙しい時期にキーボードを叩くのが痛いなんてしょうもない理由で作業効率を低下させているんだ…

という状況のなか、キーボード・腱鞘炎で検索して、良いキーボードを使うことの大切さを学びました。
後に紹介させていただきますが、キーボードを交換することで、治らなかった腱鞘炎が解消し、テストの作業効率は戻り、プロジェクトは最悪の事態をなんとか回避しました。

# キーボードの選び方
使いやすさを基準にすると、おそらくこのあたりを基準にして選んでいくことになると思います。

- 予算
- 使用感（打感・打音）
- 配列（US配列・JIS配列）
- 接続方法
- サイズ
- 使用感（マクロ機能など）

が、キーボードは本当にいろいろな種類があるので、私は上記の条件で絞ろうとすると大変な目に会いました。
また、現実的な問題として、いくら使い勝手が良くても、使いたいと思っている場所で使えないようなものもあります。
選ぶ時間も楽しい時間ではありますが、結局道具なので使ってなんぼ。
最初に書いた内容を決める前に、制約事項を確認しておけば選定時間を短縮できます。

- 今のキーボードへの不満はなにか
- カタカタうるさいキーボードを使えるか
- 持ち歩きの可能性はあるか
- 机の上は広いか（サイズの問題）
- テンキーの使用頻度は高いか
- 新しいキーボードを練習する時間はあるか

私の場合、最初の高級キーボード選びの基準はこれでした。

- 今のキーボードへの不満はなにか
    * 腱鞘炎
- カタカタうるさいキーボードを使えるか
    * 職場で使うのでうるさいものは使えない
- 持ち歩きの可能性はあるか
    * あっても一年に2回ほど
- 机の上は広いか（サイズの問題）
    * フルサイズキーボードを2つ置けるだけの広さがある
- テンキーの使用頻度は高いか
    * Excel、開発物ともに数字を入力する頻度が多くテンキーを多用する
- 新しいキーボードを練習する時間はあるか
    * 繁忙期のため、不慣れなキーボードを使いこなせるようになるまで練習することはできない


### 予算
ピンきりですが、安いものは1000円から。


### 使用感（打感・打音）
### 接続方法
### サイズ
### 使用感（マクロ機能など）
Raspberry pi に繋いだ USBカメラで画像撮影する

家に転がっていたRaspberry Pi と、USBカメラ を使って簡単な定点カメラの実験をしました。

`fswebcam` コマンドを使うと良さそうなのでインストール

```
$ sudo apt install fswebcam
```

これだけで撮影できるようになるという情報が多かったけれど
`sudo raspi-config` から `Interfacing Option` > `Camera` で カメラを有効にする必要がありました。
設定後、促されるとおり再起動をして、撮影できるようになりました。

```
$ fswebcam image.jpg
```

任意のディレクトリで、このコマンド一発、webカメラの映像をjpg画像に保存することができました。
Raspberry pi にはGUIを入れていなかったので、Macへscpで画像を転送して確認しました。


※監視カメラという点だけ考えれば、Raspberry pi より安い価格からコンパクトで高性能なものが売られているので、製品を購入したほうが楽だと思います。
updateアクションをコントローラに定義する時の記述法

#updateアクションの定義方法
編集機能を実装する時、コントローラーにupdateアクションを定義する。
この時のコントローラーのupdateアクションの記述方法について述べる。

以下のような記述をapp/controllers/controller.rbに記述する。

```Ruby
   def update
     tweet = Tweet.find(params[:id])
     if tweet.user_id == current_user.id
       tweet.update(tweet_params)
   end

private
   def tweet_params
    params.permit(:image, :text)
   end
```
処理の流れとしては、
1.ビューから受け取ったパラメーターからidを受け取る。
2.それを元にtweetsテーブルからレコードを取得する。
3.if文でログイン中のユーザーと取得したツイートを投稿したユーザーが、一致しているか判定する。
4.それらが一致した場合、ストロングパラメーターであるtweet_paramsに、新たな情報がレコードの値として更新されるようになる。
「PythonとKerasによるディープラーニング」の６章6.3.1(P.217)の気象データ

「PythonとKerasによるディープラーニング」の６章6.3.1気温予測問題(P.217)の気象データ
がどこにあるかわからなかったので、載せておこうと思います。
（URLにアクセスしてもわかりにくかったので・・・）

https://s3.amazonaws.com/keras-datasets/jena_climate_2009_2016.csv.zip
より、ダウンロードできました。
参考サイト:https://medium.com/@jon.froiland/advanced-use-of-recurrent-neural-networks-part-1-91ff1b36af25
インラインボックスが微妙に下にずれてしまう

#インラインボックスが微妙に下にずれる問題の解決方法
原因はvertical-alignプロパティはデフォルトではベースラインに設定されているからである。以下のように設定したら解決した。
 [参考にしたサイト](https://qiita.com/kiyoami/items/74f2fb1c30d475d35144)

~~~css
div {
    display: inline-block;
    vertical-align: top;
}
kaggleのkernelコンペを快適に過ごす方法

# 概要
colaboratoryをkaggleのnotebookみたいに扱って, kaggleのkernelコンペに挑戦する際にできるだけ快適に過ごしたい.
僕が実践している方法を紹介します.

# kaggleのkernelここがつらい

kaggleのkernel(notebookの方)使っててここがつらいなーと感じます. 逆に僕が無知でここらへんがふつうにkernelでできるならもうこの記事の意味がないので, 解決法あったら教えてほしいです.

- 処理に時間がかかる前処理をpickle化して置いておけない(またkernel再開するとき消えちゃう)
- セルのコピペやマージができない

大きくはこの二点です.
別にGPU使わないコンペとかなら手元とかでjupyterで作ったものをuploadすればいいだけなのですが, GPU使いたいからkernelで...と思っても上記の理由でしんどかったのです.
そんなときに「あ, colaboratory使えばいいじゃん」ってなったわけです.

# colaboratoryとは?
- google driveに保存されるjupyter notebookだよ
- google様の力でGPUも使えるよ
- RAMは13GBくらいでオーバーするとセッションがリセットされるよ
- くわしくはこちらの[動画](https://youtu.be/inN8seMm7UI)を見てね

kernelのnotebooksと似たような環境(若干colaboratoryのほうが強いのかな?)なのでcolaboratoryで死ぬとか, 実行時間が足りないならkernelの方もだめって考えてます.
手元のjupyterとまではいかなくてもセルの操作のショートカットとかもあるし, google driveにpickleを保存すればあとから呼び出して, 前処理の時間等を削減できるしいいかんじです.
あとダークモードもあるよ.みんなダークモード好きだよね.

# 実践
## データの準備とディレクトリ構成
google driveにディレクトリを作ります.
僕はkaggleというディレクトリの配下にコンペごとにディレクトリを用意しています.
hogeコンペとfugaコンペがあったらこんな感じです.

```
My Drive/
  ├─ kaggle/
      ├─ hoge_competition/ 
      │   ├─ input/
      │   └─ working/
      └─ fuga_competition/
          ├─ input/
          └─ working/ 
```

今回はhogeコンペに参加することを想定してさらに詳しくディレクトリ構成を説明します.
ノートブックとinputはこんな感じ.

```
My Drive/
  ├─ kaggle/
      └─ hoge_competition/ 
          ├─ input/
          │   ├─ hoge_competition
          │   │    ├─ train.csv
          │   │    ├─ test.csv
          │   │    └─ sample_submission.csv
          │   └─ other_datasource/
          │          └─hogehoge.vec
          └─ working/
               └─ hoge.ipynb
```

input配下は外部のdatasetを使うかどうかで少し変わりますので注意してください(使わない場合input配下にtrainやらがいるようになる).
notebookはinputと同じ階層にある`working`配下にできるようです.
以上でディレクトリ構成が完成です.

## Google Driveをマウントする
colaboratory側から自分のgoogle driveを認識できるようにします.
これはcolaboratoryで,

```python
use_colaboratory = True
if use_colaboratory:
    import os
    from google.colab import drive
    drive.mount('/content/drive')
    os.chdir('drive/My Drive/kaggle/hoge_competition/working')
```

このセルを実行すると「どのアカウントのgoogle drive使うか」ってのを聞かれて, 選んで認証すると, 認証コードが画面に表示されます.
それをコピペして, 上記のセルに戻ると実行待ちになっているので, そこに認証コードを貼り付けてエンターキーでマウントされて, working配下のnotebookと認識されます.
毎日この認証しなきゃいけないのなんとかならないかなぁと若干思っております.
`use_colaboratory`フラッグをオフにすれば, kernelでも使えます.
他にpickle等からロードするかどうかのフラッグも使うようにして, kernelではオフにして使っています.

## kernelにupload
kernelのnotebookを開いて, 左上の`File`からuploadできます

<img width="228" alt="スクリーンショット 2019-06-02 20.56.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139991/c309bf32-30e6-9ebd-5d3f-5bfd34bb434b.png">


# 注意点
- 繰り返しになりますが, 外部ソースを使う場合 `input`配下のディレクトリ構成が変わるのは注意してください
- けっこう大きなデータセットを使う場合, あっという間にgoogle drive無料の範囲の15GBまで行くので注意してください(gmailが届かなくなるかもとか怖いこと言われます)

# まとめ

以上が現在僕が実践しているkernelコンペを快適に過ごす方法です.
他にもいい方法があったら教えてほしいです!
kernelコンペがんばるぞ!
(Ryby)to_○メソッドの種類と処理をまとめてみました

<p>to_○メソッドの種類と処理内容をAからまとめてみました</p>

<h2>範囲オブジェクト・ハッシュを配列に変換</h2>

```
to_a

(1..5).to_a => [1,2,3,4,5]
(a..e).to_a => [a,b,c,d,e]

currencies = {japan: "yen" , us: "dollar" , india: "rupee"}
currencies.to_a  
=>[[:japan,yen],[:us,dollar],[:india,rupee]]
```


<h2>文字数を複素数に変換</h2>
[複素数とは](https://www.buildinsider.net/language/rubytips/0007)

```
to_c 

"0.3-0.5i".to_c
=>(0.3-0.5i)
```

<h2>整数を少数に変換</h2>
```
to_f

10.to_f =>10.0
10.to_f / 4  => 2.5 
```

<h2>配列をハッシュに変換</h2>
```
to_h

arry = [[:japan,yen],[:us,dollar],[:india,rupee]]
arry.to_h
=>{japan: "yen" , us: "dollar" , india: "rupee"}
```

<h2>文字列を数値に変換</h2>
```
to_i

10 + "3"  =>  103
10 + "3".to_i  => 13
```

<h2>文字列を有理数に変換</h2>
```
to_r

"3/2".to_f
=> (3/2)
```

<h2>オブジェクトを文字列に変換</h2>
```
to_s

10.to_s  => "10"
nil.to_s => ""
true.to_s => "true"
```

<h2>文字列をシンボルに変換</h2>
```
to_sym

string = "apple"
string.to_sym  => :apple
```
参考文献
＝＞プロを目指す人のためのRuby入門
Vuetifyの規定アイコンを変更する。v-ratingとか

##Vuetify記事少なさすぎ問題

とりあえず、vuetifyでraring(評価)のアイコンの規定が星のアイコンになってたので、
丸に変更したかったが、記事全然ない。

もちろん公式もない

[vuetify公式 ratingページ](https://vuetifyjs.com/ja/components/ratings)

...ファイルを検索してなんとか見つけた。
`js/app.js`に定義されてたので、これを変更して完了。

```js:/app.js
    //'ratingEmpty': 'star_border',
    //'ratingFull': 'star',
    //'ratingHalf': 'star_half',

    //↓に変更すると丸になる

    'ratingEmpty': 'lens',
    'ratingFull': 'lens',
    'ratingHalf': 'lens',

```

と、思ったらまたアイコンが戻る！！！

どうやら`resources/app.js`で規定アイコンを変更するみたいです。

```js:app.js
Vue.use(Vuetify, {
    icons: {
        'ratingEmpty': 'lens',
        'ratingFull': 'lens',
        'ratingHalf': 'lens'
    }
});

```

これで本当に完了！

この場合は半分の時も丸アイコンになるので注意。
他のアイコンにしたければ[こちら](https://material.io/tools/icons/?icon=fiber_manual_record&style=baseline)からどうぞ
Androidのライフサイクル

Androidのライフサイクルを実際にログに出力して試してみました。

各メソッドの説明はドキュメントの説明を読んでもらったほうがいいです。
[アクティビティのライフサイクルを管理する](https://developer.android.com/guide/components/activities.html#ImplementingLifecycleCallbacks)

#ソースコード
```kotlin:LifecycleActivity.kt
private const val TAG = "LifecycleActivity"

class LifecycleActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        Log.d(TAG, "onCreate(Bundle) called")
        setContentView(R.layout.activity_lifecycle)
    }

    override fun onRestart() {
        super.onRestart()
        Log.d(TAG, "onRestart() called")
    }

    override fun onStart() {
        super.onStart()
        Log.d(TAG, "onStart() called")
    }

    override fun onResume() {
        super.onResume()
        Log.d(TAG, "onResume() called")
    }

    override fun onPause() {
        super.onPause()
        Log.d(TAG, "onPause() called")
    }

    override fun onStop() {
        super.onStop()
        Log.d(TAG, "onStop() called")
    }

    override fun onDestroy() {
        super.onDestroy()
        Log.d(TAG, "onDestroy() called")
    }
}
```

#アプリを立ち上げたとき

```
D/LifecycleActivity: onCreate(Bundle) called
D/LifecycleActivity: onStart() called
D/LifecycleActivity: onResume() called
```

#バックグランド状態になったとき
HomeボタンやOverviewボタンを押した場合

```
D/LifecycleActivity: onPause() called
D/LifecycleActivity: onStop() called
```
(OSの判断によっては破棄されることもある)

#バックグラウンド状態から状態フォアグラウンドになったとき

```
D/LifecycleActivity: onRestart() called
D/LifecycleActivity: onStart() called
D/LifecycleActivity: onResume() called
```

#バックグラウンド状態からアプリ消去したとき

```
D/LifecycleActivity: onDestroy() called
```

#起動中にアプリを回転させたとき

```
D/LifecycleActivity: onPause() called
D/LifecycleActivity: onStop() called
D/LifecycleActivity: onDestroy() called
D/LifecycleActivity: onCreate(Bundle) called
D/LifecycleActivity: onStart() called
D/LifecycleActivity: onResume() called
```

#戻るボタンでアプリを消したとき

```
D/LifecycleActivity: onPause() called
D/LifecycleActivity: onStop() called
D/LifecycleActivity: onDestroy() called
```

#参考文献
[Understand the Activity Lifecycle](https://developer.android.com/guide/components/activities/activity-lifecycle?hl=ja)
[Android Programming: The Big Nerd Ranch Guide (3rd Edition) (Big Nerd Ranch Guides)](https://amzn.to/2K8OlO7)
機械学習,DeepLearning,AIの違い

私は今回、機械学習、DeepLearning、AIの違いについて私なりに述べていきたいと思います。まずはそれぞれがどのようなものかといったことについて述べていきます。

#機械学習
機械学習はこの3つの中では一番初歩的な考え方であり、シンプルなものです。
機械学習は人間の脳をモデルにしたものであり、画像の判断であったり、様々な識別を行うことができるといったものです。
機械学習のモデルを図にしたものが以下のようなものです。
<img width="620" alt="スクリーンショット 2019-06-02 20.08.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423140/e993fc9b-ef37-679b-584c-437788a05be9.png">

左側から入力→出力といった流れになっています。
図のようにりんごを入力すればこれはりんごであると判断するようなものが機械学習です。この図のようなモデルを作成し、様々な特徴点の学習を行います。

#DeepLearning
<img width="620" alt="スクリーンショット 2019-06-02 20.07.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423140/fcabd1bf-ede7-ca24-46a2-f52d5cb5b33f.png">


DeepLearningも機械学習と似たモデルで表すことが出来ます。機械学習との違いとしては学習器の中身の部分が細かく分かれているため、より細かく特徴点を細かく学習することができるため機械学習よりも精度が上がると考えられます。

#AI
私はコンピュータ自体が人間のような考え方をできるものがAIであると考えています。
AIの例としてはfacebookが作成したAIやIBMのWatsonなどがあります。
facebookが作成した二台のAIは人間の理解することのできない独自言語で話し始めたという事例があります。
（このニュースは有名なので「facebook AI」などで検索すればすぐに出てきます。）
私はこの事例のようにコンピュータ自身が人間のように学んでいき、大げさに言えばコンピュータ自身が文明を作るものがAIであると考えます。
AIが日常的に使われるようになればターミネータのような映画の世界が現実になるかも...?

#機械学習、DeepLearning、AIの違いって結局何？
機械学習やDeepLearningはあくまでも上記で述べたようなモデルを数学を用いて作成したものであり、様々な問題に対して方程式の最適解を求めるようなものなのでコンピュータ自身が考えを持つAIとは異なると考えられます。
しかし、これら3つは全く異なるものかと言われればそうではないと考えています。


#まとめ
最近ではテレビなどでAIとして取り上げられているニュースが多いですが私自身はそのほとんどが機械学習やDeepLearningではないかと疑問に思っています。
これから本格的にAIが世の中で使われるようになった時にAIに人間は支配されないように気をつけなければならないかもしれないですね。
RustのVecをキーとしてHashMapを初期化するコードで初心者が詰まった点

初心者なのでやっていく．

- やりたいこと
  - Vec型でHashMapのキーにしたい要素が与えられる
  - HashMapを与えられたキーに対して初期化したい


# 最初に書いたコード

- for文のところでおいている _i_ が **&usize**になってしまい，insertできない


```rust
use std::collections::HashMap;
use bit_set::BitSet;

fn main() {
    let list_of_keys: Vec<usize> = vec![0, 1, 2, 3];
    let mut map: HashMap<usize, BitSet> = HashMap::new();

    for i in &list_of_keys {
        map.insert(i, BitSet::new());
    }
    
    println!("{:?}", map);
}
```

# とりあえず解決するために書いたコード2種

- 動作理由はよく分からなかったけど，&つけたら動いた（悪い）

```rust
for &i in &list_of_keys {
    map.insert(i, BitSet::new());
}
```


- VS CodeのRSを見ると，この _i_ は **&usizeですよー**と出てくるので，**逆に***を付けて実体化（~~正しい日本語か不明~~ (コメントから追記)これをdereferencing=参照外しと呼ぶ）すると動いた

```rust
for i in &list_of_keys {
    map2.insert(*i, BitSet::new());
}
```


# よく分からないこと

- 例えばinsertじゃなくてprintln!()にすると*iみたいにしなくてもiを自動でreferenceを取ってくれるのに，mapにinsertする（コピーする？）ときに*iと書く必要があるのか分からない
C も新しくなっていた

もはや自分の備忘録でしかない今日のメモ。
2008 - 2014 くらいの間仕事していたあの現場の C は、厳密にはどの規格の C だったのだろうか…

# きっかけ

- [sizeof PHP vs C](https://qiita.com/terra_yucco/items/6918aeb57de54a4ed134)

>sizeof 演算子が返す値の型はsize_tなので、printf()で出力されたい場合は%dではなく%zuを使われるべきでしょう。

上記の記事にて頂いたコメントより。
コーディングしてた当初 `%zu` なんて使えなかったようなと思って WikiPedia を見てみた。

## WikiPedia の記載

`%z WikiPedia C` を検索ワードに入れたところヒットしたのは以下のページ。

- [printf](https://ja.wikipedia.org/wiki/Printf)

`z` については長さ修飾子の欄に以下のようにありました。(表をそのまま引用)

修飾子|意味|導入バージョン
:--|:--|:--
hh|実引数は char 型|C99以降
h|実引数は short 型|全バージョン
l（エル）|実引数は long 型または wchar_t 型または double 型[3]|wchar_t についてはC95以降、double についてはC99以降
ll（エルエル）|実引数は long long 型|C99以降
j|実引数は intmax_t 型|C99以降
z|実引数は size_t 型|C99以降
t|実引数は ptrdiff_t 型|C99以降
L|実引数は long double 型|全バージョン

`l (エル)` は使ってましたが、それ以外は見覚えが無いので、C99 より前だったんだなあと予想。

## C のバージョン履歴

ほぼ WikiPedia から持ってきた自分の備忘録です。

- [C言語](https://ja.wikipedia.org/wiki/C言語)

### K&R

K&R で定められた最初の仕様。
拡張可能でそこまでかっちりしていない。

### C89/C90

ANSI と ISO がそれぞれ規格を定めたもの。
関数プロトタイプもあり、`void` や `enum` も使っていたので、おそらくこの規格に沿っていたんだろうなと思い出す。
WikiPedia にあるような `CHAR_BIT` マクロを見た覚えがないままバイナリ電文を扱っていたけど、今でもあのシステムは無事に動いているのだろうか。

### C99

ご指摘いただいた `%z` が使えるようになった版。
主な追加機能は WikiPedia を見るべし。確かに C++ っぽくなっている。

### C11
### C17

更に 2 度の規格の更新が入っているらしい。
なお paiza.IO は最新の C17 だった。

>	clang 6.0 / LLVM 6.0 (C17)

機会があれば、思い出す＆知識のアップデートのため、paiza の問題でも C で解いてみようと思いました。
[初級]Python for文の練習問題

# 目的
Pythonの基本文法を得ること(初心者向け)

# 内容

for文を使う練習問題4問を解いてみた。
簡単な解説付き。

# 練習問題一覧
- 1問目. 以下の出力になるようプログラムを書いてください.

```
1
12
123

1
21
321
```

- 2問目. 1〜100までの偶数・奇数をそれぞれリストに入れて表示する
- 3問目. input()で数字を受け取り、合計値を出力(0が入力されたら終了とする)
- 4問目. 以下のような出力になるプログラムを作成

```
*
**
***
****
*****
```
以上の問題です。頭の体操程度にやってみてください。

# 答え

　※答えは一例です。

- 1問目の答え

```python:.py
moji = ""
for i in range(3):
  num = i + 1
  moji += (str(num))
  print(moji)
  
print("                 ")

ijom = ""
for i in range(3):
  num = i + 1
  ijom = (str(num)) + ijom
  print(ijom)
```
- **ポイント** : 数字だと足してしまうため、**文字**として連結する。

```
1
12
123
                 
1
21
321
```
　1の練習問題で与えられた出力結果と同じ答えが表示される。

- 2問目の答え

```python:even_odd.py
even = []
odd = []

for i in range(1, 101):
  if i%2 == 0:
    even.append(i)
  elif i%2 == 1:
    odd.append(i)
    
print("偶数", even)
print("奇数", odd)
```
- **ポイント** : リストは```append()```メソッドで末尾に追加する。

```
偶数 [2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100]
奇数 [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41, 43, 45, 47, 49, 51, 53, 55, 57, 59, 61, 63, 65, 67, 69, 71, 73, 75, 77, 79, 81, 83, 85, 87, 89, 91, 93, 95, 97, 99]
```
- 3問目の答え

```python:total.py
total = 0
while True:
  num = int(input())
  if num != 0:
    total += num
  elif num == 0:
    break
print("合計 : ", total)
```
- **ポイント** : 0が入力されるまでループを続ける記法が必要である。

```
50
100
350
-250
0
合計 :  250
```

- 4問目の答え

```python:pyramid.py
star = "*"
stars = ""
for i in range(5):
  stars += star
  print(stars)
```
- **ポイント** : for文の中のブロックで使いがちな**繰り返し変数**を使わなくていい。

```
*
**
***
****
*****
```
　4問目の練習問題で与えられた出力結果と同じ答えが表示される。

# 筆者のコメント
　break文をちゃんと覚えてないから復習しよう。