OmniAICreator/Qiita-1.07M huggingface dataset:
JavaScriptのrequestAnimationFrameでアニメーションを自由自在に操る

## はじめに
Webページをアニメーションさせようとしたときに、選択肢として楽なのは

* CSSアニメーション
* jQueryアニメーション

この辺だろうか。

これらは、以下の情報を指定することで、途中の状態を**よしなに**やってもらうものです。

* 始点
* 終点
* 時間
* 動かし方

ただ今回は、よしなにやってもらうのではなく、途中の状態も自分で指定する！という自由自在への道を開こうと思います。

## 自由自在の道にも更なる選択肢
よし、じゃあJavaScriptで自由自在アニメーションを実装しよう！ってなったときに、どういう風にするかっていうのざっくり言うと、

* ループを回す
* 経過時間や距離によって状態を算出し、要素に反映する

っていう感じに進むわけです。

じゃあ早速ループを回そー！・・・ん、ループ？
さあ、ここでループの回し方が複数あって迷うっていうイベントが発生します。

## 僕らを悩ませるループ
さあさあみんなで声を揃えてループを回しましょう。
わかるわかる、setTimeoutとかsetIntervalやろ？
ってなったあなたには朗報です。

ここに出でし、アニメーションループの申し子。
**requestAnimationFrame**

使うしかない。

### setIntervalとrequestAnimationFrameの違い
まあまあ違う箇所はありますが、アニメーションとして注目すべきは
こいつらに指定したメソッドが叩かれる**タイミング**です。

#### setIntervalの場合
指定時間毎

#### requestAnimationFrameの場合
ブラウザの描画タイミング毎

指定時間と描画タイミング毎だと、どっちの方がよりアニメーションに適しているかは一目瞭然かと思います。
描画のタイミングで状態を変更する方が、圧倒的に良さげですね。

## 実装
ということで、requestAnimationFrameを使って実装していくわけです。

今回の出演者は、以下の二名です。

* ループを司るもの: **Updater**
* 要素の状態を司るもの: **Animator**

ではでは、中身を見ていきましょう。

まずはUpdater

```JavaScript
class Updater {

  constructor() {
    this.targets = [];
  }

  // アニメーション対象を追加
  add(target) {
    this.targets.push(target);
  }

  // アニメーション対象を削除
  remove(target) {
    this.targets = this.targets.filter(element => element !== target);
  }

  // アニメーションループ開始
  start() {
    this.targets.forEach(element => element.start());
    window.requestAnimationFrame(this.update.bind(this));
  }

  // 各アニメーション対象に更新を通知
  update() {
    window.requestAnimationFrame(this.update.bind(this));
    this.targets.forEach(element => element.update());
  }
}
```

こんな感じ。

次に、Animator

```javascript
class Animator {

  constructor() {
    this.startTime = 0;
  }

  // アニメーション開始時の時間を取得
  start() {
    this.startTime = performance.now();
  }

  // 描画毎にここが呼ばれる
  update() {
    // ここで経過時間をもとに進捗を算出し、要素に反映
  }

  // 進捗算出
  // e: easingType
  // t: currentTime
  // b: startValue
  // c: endValue
  // d: totalTime
  getProgress(e, t, b, c, d) {
    let progress = 0;

    if (t < 0) return b;
    if (t > d) return c;

    switch (e) {
      case 'linear':
        progress = c * t / d + b;
        break;
      case 'easeInSine':
        progress = -c * Math.cos(t / d * this.PI) + c + b;
        break;
      default:
        break;
    }
    return progress;
  }
}
```

こんな感じ。

あとは、

* Updater, Animatorのインスタンスを作成
* UpdaterにAnimatorのインスタンスをaddする
* Updaterをstartする

という感じで準備が完了です。

Animatorのupdateメソッド内に、アニメーションの内容を書きます。

例えば、

```javascript
update() {
  const elapsed = performance.now() - this.startTime
      , opacity = this.getProgress('easeInSine', elapsed, 0, 1, 1000);

  $('#js-content').css('opacity', opacity);
}
```

といった形で、1000秒かけてopacityを0→1にするアニメーションができました。

このように、**経過時間を使って進捗を算出し、要素に反映する。**
単純、だけどかなり柔軟に作り込むことができます。

はいっ、自由自在なアニメーションのできあがりー！
【rails5】jsonファイル内のデータをブラウザに返す方法

#Jsonファイル内のデータをブラウザに返す方法

viewにindex.json.jbuilderというファイルを作成

下記のように記述

```
1,変数無しで単純にjsonとして返す
json.text "変数無しで単純にjsonとして返す"

2,複数続けて書く時は番号をふる
json.text1 "複数続けて書く時は番号をふる"
json.text2 "複数続けて書く時は番号をふる"

3,シンボルに値をセット出来る
json.set! :text, "シンボルに値をセット出来る"

4,キー:nameに値をまとめてセット出来る
出力例＝＞{"name": {"text": "テキスト"} }
json.set! :name do
json.text, "属性nameに値をまとめてセット出来る。"
end

5,上記の複数バージョン、番号を振る
キー:name1に対して、バリュー"テキスト２"を入れる

json.set! :name1 do
  json.text2 "テキスト２"
end
json.set! :name3 do
  json.text4 "テキスト4"
end
# 出力例 { "name1": {"text2": "テキスト２" },{ "name3": {"text4": "テキスト４"} }

# 6,複数バージョンの場合でキーが重複する場合、合成された値になる

json.set! :email do
  json.text2 "テキスト2"
end
json.set! :email do
  json.text4 "テキスト４"
end

# 出力例 { "email": {"text2": "テキスト2", "text4": "テキスト4"} }
```

controllerは下記のように記述

```
ProjectsController < ApplicationController
  def index
    render 'index', formats: 'json', handlers: 'jbuilder'
  end
end
```

そして、ブラウザでlocalhost:3000/projects/indexへアクセスすると、
json形式でレスポンスが返ってきて、画面が表示されます。

ポストマンの場合
sendの左側にlocalhost:3000/projects/indexと入力

httpリクエストgetに指定してsendすると、json形式でレスポンスが返ってくることが確認できました。

[参考１]
(https://qiita.com/ryouzi/items/06cb0d4aa7b6527b3645)

[参考２]
(https://qiita.com/u_kan/items/582a367a5a6adef365a8)
FlutterでSplashScreenとflutter_launcher_iconsを共存させる

# 問題

FlutterでSplashScreenを設定した際、flutter_launcher_iconsプラグインを導入すると、AndroidManifestのSplashScreen側アイコン名が修正されてしまう。

# 解決方法

[ここ](https://github.com/fluttercommunity/flutter_launcher_icons/blob/master/lib/android.dart)を修正すればいいのですが、いい解決方法が浮かばなかったので、小手先で解決しました。

```xml
# 修正前
<meta-data
    android:name="io.flutter.app.android.SplashScreenUntilFirstFrame"
    android:label="flutter_splash"
    android:icon="@mipmap/hoge_logo"
    android:value="true"/>

# 修正後（android:icon=の後に半角スペースを入れる）
<meta-data
    android:name="io.flutter.app.android.SplashScreenUntilFirstFrame"
    android:label="flutter_splash"
    android:icon= "@mipmap/hoge_logo"
    android:value="true"/>
```
untracked fileを削除するためにはgit cleanを使う

#はじめに
mergeするためにbranchからmasterに戻った際、誤ってbranchで新規作成したファイルを保存してしまいmergeできなくなってしまいました。
いろいろググって解決はしましたが、この状況に対してピンポイントな対応方法についての記事がなかったので解決手順をメモします。
（こんなミスはなかなかしないでしょうからピンポイントな記事がないのもしょうがないですね。。。といいますかエラーを見れば原因がすぐわかりますからね）

#mergeできなくなった際の状況
masterに戻って`git merge ブランチ名`を実行したら以下のエラーが出ました。

```
$ git merge ブランチ名
Updating 67b73c9..98ba96a
error: The following untracked working tree files would be overwritten by merge:
　　　　　　　　　　　　　　　　（省略）
        spec/features/categories_spec.rb
Please move or remove them before you merge.
Aborting
```
`git status`では以下のようになっていました。

```
On branch master
Your branch is ahead of 'origin/master' by 32 commits.
  (use "git push" to publish your local commits)

Untracked files:
  (use "git add <file>..." to include in what will be committed)

        (省略)
        spec/features/categories_spec.rb

nothing added to commit but untracked files present (use "git add" to track)
```
つまりはuntracked fileを削除しないとmergeできない状況になっているということですね。

#対応方法
###[untracker file](https://git-scm.com/book/ja/v1/Git-%E3%81%AE%E5%9F%BA%E6%9C%AC-%E5%A4%89%E6%9B%B4%E5%86%85%E5%AE%B9%E3%81%AE%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E3%81%B8%E3%81%AE%E8%A8%98%E9%8C%B2)
まずuntracked fileについて理解します。
詳細な内容は上記リンク先に譲りますが、簡単にまとめると
untracked fileとは、前回のcommitの時点では存在しなかった新たに作成したfileであり、かつ`git add`してステージさせていないfileのことです。

###[git clean](https://git-scm.com/docs/git-clean)
untracked fileを削除するためには`git clean`を使います。
使用したコマンドは以下です。

・`git clean -n`
untracked fileを削除する前に、削除の対象となるファイルを確認できます。
ディレクトリを確認したい場合は`git clean -dn`で確認できます。

・`git clean -f`
untracked fileを削除します。
先ほどと同様にディレクトリを削除する場合はdをつけます。 `git clean -df`

#その他参考サイト
・https://ja.atlassian.com/git/tutorials/undoing-changes/git-clean
突然認識しなくなったREGZAのHDDを修復

# 背景
REGZAに外付けHDDを使用していた所、突然以下メッセージが表示されました。
「新しいUSBハードディスクを検出しました。
登録を行いますか？
登録時にハードディスクは初期化されます。」

```memo
※修復する場合にはこのメッセージが表示されても「はい」は押さない事、全てのデータが削除されます。
```

# REGZAの録画に使われるファイルシステムはxfs
WindowsやMacからは録画ファイルを見ることすら出来ませんが、
Ubuntuからはxfsのマウント、xfs_repair（ファイルシステムの修復）やREGZA HDD Repairが使用可能です。

# 目的
- ハードディスクの物理故障等の確認
- 既存の録画データをREGZAにて視聴できる状態に戻す

# 確認した事

1,2は必ず確認を行ってください。

## 1. 動作中のHDDから異音がしないか確認

動作中にｶﾁｯｶﾁｯと音がする場合は物理故障の可能性が高く、
以降の手順ではデータの復旧・修復は不可能

## 2. HDDの健康状態を確認

該当HDDをPCに接続した状態で、CrystalDiskInfoを実行します。
「正常」と表示されている場合は健康状態には問題なく、xfs_repairやREGZA HDD Easy Repairを実行してもよい状態です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/266455/670014e7-ecf2-5174-c73b-7910d40264e2.png)

「注意」と表示されている場合には、不良セクタの修復を行う必要があります。

```memo
不良セクタの修復とは、不良セクタを使用できる様にするのではなく、不良セクタを使用しない様にマーキングしておく事
```

## 3. Ubuntu 12.04 Desktop環境を用意する

xfs_repair , REGZA HDD Easy Repair を実行するためにUbuntu12.04環境を準備します。
また、REGZA HDD Easy Repairは32bit向けのツールのため、Ubuntuも32bit版を使用します。
Ubuntu18.04で32bitパッケージを取得して試しましたが、パッケージの互換が取れず苦労したため諦めました。

### USBにUbuntuをインストールする

[Rufus 1.1.1](https://rufus.ie/) と [Ubuntu 12.04 Desktopイメージ](http://releases.ubuntu.com/12.04/) をダウンロードし、USBメモリへインストールを行いました。
ここでは今後このUSBメモリを UbuntuUSBと呼びます。

USBメモリは手頃な価格のCruzer Spark16GBを使用しました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/266455/7331a10b-219e-5a7d-472b-1bb4babeced0.png)

```memo
最新のRufusを使用しインストールをすると起動できなかったため、
Rufus 1.1.1を使用してください。
```

## 4. UbuntuUSBを起動

UbuntuUSBを起動し、「Try Ubuntu」又は「Try Ubuntu without installing」を選択する事で、UbuntuLive環境が起動されます。

ここで行ったUbuntuの設定変更等はシャットダウン時に削除されます。

デスクトップが表示されたら、次の手順を行います。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/266455/4d2b01c6-316e-c318-5e21-94b4d4bbf10f.png)

### 5. UbuntuUSBでデバイスファイルを確認

ファイルマネージャで /usr/share/applications/に移動します。
そこにあるterminalをダブルクリックして実行し、以下コマンドを実行します。

```shell
$ sudo su # ubuntuユーザーからrootユーザーに切り替え
$ parted -l 
# 出力された内容を確認し
# 該当のHDDのデバイスファイルを確認する
# デバイスファイル ・・・ sda、sdb、sdcと表示されている部分
```

## 6. UbuntuUSBでマウントできるか確認

ファイルマネージャで /usr/share/applications/に移動します。
そこにあるterminalをダブルクリックして実行し、以下コマンドを実行します。

```shell
$ sudo su # ubuntuユーザーからrootユーザーに切り替え
$ mount /dev/sde1 /mnt # デバイスファイルを指定してマウントする
```

### マウントに失敗した場合

マウントに失敗する場合には、ファイルシステムの故障が疑われます。
xfs_repairを実行して修復を行います。

```shell
$ xfs_repair /dev/sde1 # デバイスファイルを指定してxfsファイルシステムを修復
```

エラーが出ずにコマンドが終了した場合には、マウントできるかもう一度確認します。

マウント出来る様になった場合、REGZAに接続しなおす事で使用できる様になっている可能性があります。

## 7.REGZA HDD Easy Repairを実行

編集中

# 手順がうまくいかない、復旧できなかった

[ヤフオク](https://auctions.yahoo.co.jp/seller/QWF03312?ngram=1)で代行作業をしてくれる方がいるため、代行依頼を行うのも一つの手です。（私とは無関係です）

# 参考
- [REGZAに接続するHDDを修復してみたメモ](https://tenderfeel.xsrv.jp/mistyrose/2013/04/07/184938/)
- [レグザHDD復旧ソフト「REGZA HDD Easy Repair」の使い方](http://www.4682.info/repair/easy)
- [「HDD認識しない」パソコンでレグザUSBハードディスクを復旧・修復](http://www.4682.info/repair)
- [REGZA〈レグザ〉認識しないハードディスクのベストな復旧方法](http://www.4682.info/repair/bestrepair)
Rubyのインストールからバージョンの切り替え(Mac OS)

**環境：macOS Mojave 10.14**

#Xcodeのインストール
Xcode必要みたいです。
AppStoreから入手→https://itunes.apple.com/jp/app/xcode/id497799835?mt=12

#homebrewのインストール
パッケージマネージャーのhomebrewをインストールします。
コレ使ってrbenvインストールするので...

ターミナルにて以下を投入。
`/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"`

インストールできたら
`brew update`と`brew -v`投入しときましょう。
バージョン出力されたらOK！

#rbenvのインストール
rbenvのインストールの説明などなど...→https://github.com/rbenv/rbenv

rbenvのインストール
`$ brew install rbenv`

インストール完了したら、初期設定。
`$ rbenv init`

`eval "$(rbenv init -)"`
が出力されたら...
Finderでホームディレクトリを開き
`cmd+shift+.`で`.bash_profile`を表示する。
コレをテキストエディタで開き、ファイルの末尾に
`eval "$(rbenv init -)"`
を貼り付ける。
んで保存。

rbenvのセットアップができたかの確認をします。
`$ curl -fsSL https://github.com/rbenv/rbenv-installer/raw/master/bin/rbenv-doctor | bash
`
#Ruby2.5.0のインストール(Udemyの録画時期では最新らしい)
インストール可能なrubyの一覧表示
`$ rbenv install -l`

インストールは(2.5.0の場合)
`$ rbenv install 2.5.0`

インストールしたRubyに切替可能にするコマンド
`$rbenv rehash`

インストールされているRubyのリスト表示
`$ rbenv versions`
「＊」がついているバージョンが現在使用中のバージョン

バージョンの切り替えは(2.5.0の場合)
`$ rbenv global 2.5.0`

Rubyのバージョン確認
`$ ruby -v`

#Rubyの実行
###ターミナル上で対話的に実行する場合
`$ irb`

###Rubyファイル(*.rb)を実行する場合
ファイルがあるディレクトリに`$ cd`で移動。
実行は、
`$ ruby sample.rb`
(sample.rbを実行する場合)

#pryのインストール
###pryとは
PryはRuby標準的なIRBシェルの強力な代替手段です。
シンタックスハイライトや、フレキシブルなプラグインアーキテクチャ、実行時の呼び出しやドキュメントの閲覧を備えています。
>参考:https://qiita.com/kotazi_/items/2c32731ad14bfec331b0

インストールのコマンド
`$ gem install pry`

`$ pry`で起動
![スクリーンショット 2019-02-12 21.34.37.png](https://qiita-image-store.s3.amazonaws.com/0/275686/86b0dd46-2adb-68ef-63d6-9d0b7c1245f4.png)
色分けしてくれている。
画像認識を使用したバナナ迎撃システム

#概要
obnizで簡単に画像認識を使用したIoTデバイスを作ることが出来るようになったので、お試しとしてバナナ迎撃システム（バナナを画像認識で感知するとロケットを発射）を開発しました。

下の方にあるコードの通り
・コーディング無し（ブロックを使用した視覚的なプログラム）
・20ブロック以下で完成
と簡単につくれるようになっています。

#仕組み
①カメラ＠スマホ／PC：バナナを感知
　　↓
（Internet）
　　↓
②obniz
　　↓
③サーボモータ：④百均ロケットのトリガーを押す
![全体図２.JPG](https://qiita-image-store.s3.amazonaws.com/0/181708/9a4706c1-1fe3-9aa5-86d7-adb010c41711.jpeg)

#動画
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">anti-banana missile<br>バナナ迎撃システム<br>システム：カメラ<a href="https://twitter.com/pc?ref_src=twsrc%5Etfw">@PC</a>／＠スマホ→（Internet）→obniz→サーボモータ<br><br>画像認識でバナナを検知して、百均ロケットを発射。<br>obnizを使うとこれが20個ほどのブロックを使用したプログラミングで出来て簡単。<a href="https://twitter.com/hashtag/obniz?src=hash&amp;ref_src=twsrc%5Etfw">#obniz</a> <a href="https://twitter.com/hashtag/AI?src=hash&amp;ref_src=twsrc%5Etfw">#AI</a> <a href="https://twitter.com/hashtag/IoT?src=hash&amp;ref_src=twsrc%5Etfw">#IoT</a> <a href="https://t.co/OAOyY9T9mz">pic.twitter.com/OAOyY9T9mz</a></p>&mdash; keicafeblack (@keicafeblack) <a href="https://twitter.com/keicafeblack/status/1086759438889803776?ref_src=twsrc%5Etfw">2019年1月19日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

■全体図
![KIMG4314.JPG](https://qiita-image-store.s3.amazonaws.com/0/181708/eed9a5e4-0be2-d2fa-5b4a-e97175b9facf.jpeg)

■拡大写真
![KIMG4315.JPG](https://qiita-image-store.s3.amazonaws.com/0/181708/57b630a0-911d-d7de-a554-4914ebf6247f.jpeg)

■プログラム全体
![BlockPGバナナ迎撃システム.JPG](https://qiita-image-store.s3.amazonaws.com/0/181708/8df3c31e-ce6d-9afa-de14-b5eb93272f4d.jpeg)

■プログラム全体＋距離センサー対応版
![BlockPGバナナ距離.JPG](https://qiita-image-store.s3.amazonaws.com/0/181708/56abc295-2b75-fa02-0955-0ee232ca46f7.jpeg)


■バナナ以外を認識させるには？
![ブロックの選択肢は少ない.JPG](https://qiita-image-store.s3.amazonaws.com/0/181708/0f5e6ff4-68bf-cb7c-3421-4165bf86152d.jpeg)

コード表示して、下記のbanana部分を書き換えればOK
![コード表示をして書き換え.JPG](https://qiita-image-store.s3.amazonaws.com/0/181708/d9ea4045-9b53-1080-bcbc-fba0954e9d63.jpeg)
システムコールをstraceで確認する

* straceはLinuxのシステムコールをトレースできるコマンド

## Linux環境を用意する

ちなみにDockerで起動するときは、`--security-opt seccomp:unconfined`がないとstrace実行時に怒られる。

```
docker run -it --name php-strace --security-opt seccomp:unconfined php bash
```

## Ubuntuでのインストール

```
apt-get update
apt-get install strace
```

## straceのバージョン

```
strace -V
strace -- version 4.15
```

## straceの使い方

```
strace {コマンド}
```

例:

```
# strace touch file
execve("/usr/bin/touch", ["touch", "file"], [/* 18 vars */]) = 0
brk(NULL)                               = 0x55fa6ed51000
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
mmap(NULL, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fdf2ff1f000
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=13994, ...}) = 0
mmap(NULL, 13994, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fdf2ff1b000
close(3)                                = 0
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
open("/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\0\4\2\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=1689360, ...}) = 0
mmap(NULL, 3795296, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fdf2f960000
mprotect(0x7fdf2faf5000, 2097152, PROT_NONE) = 0
mmap(0x7fdf2fcf5000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x195000) = 0x7fdf2fcf5000
mmap(0x7fdf2fcfb000, 14688, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7fdf2fcfb000
close(3)                                = 0
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fdf2ff19000
arch_prctl(ARCH_SET_FS, 0x7fdf2ff19700) = 0
mprotect(0x7fdf2fcf5000, 16384, PROT_READ) = 0
mprotect(0x55fa6d993000, 4096, PROT_READ) = 0
mprotect(0x7fdf2ff22000, 4096, PROT_READ) = 0
munmap(0x7fdf2ff1b000, 13994)           = 0
brk(NULL)                               = 0x55fa6ed51000
brk(0x55fa6ed72000)                     = 0x55fa6ed72000
open("file", O_WRONLY|O_CREAT|O_NOCTTY|O_NONBLOCK, 0666) = 3
dup2(3, 0)                              = 0
close(3)                                = 0
utimensat(0, NULL, NULL, 0)             = 0
close(0)                                = 0
close(1)                                = 0
close(2)                                = 0
exit_group(0)                           = ?
+++ exited with 0 +++
```
Elixir~Enum.mapとfilterの複合〜

# いままでわからなかったこと

Enum.mapやFilterやパイプライン演算子はElixirドキュメントの写経で出てきた。
しかしそれを自分の頭で考えてコードを組み立てることができない。赤子のようだ！

# 本題


設問1
最初に[3, 9, 27]のリストをもとにして各要素を3倍したあとで、30より大きい要素を出力する

```elixir
iex> [3, 9, 27, 81] |> Enum.map(& &1 * 3) |> Enum.filter(& &1 >= 30)
[81, 243]
```

mapでの乗法とfilterでのソートも、パイプライン演算子を数珠つなぎにすることで可能になっています。


設問2
1から10までの整数のリストをもとにして、各要素を２倍したあとで10より小さな値を抜き出してさらに各要素を二乗して出力する

```elixir
iex> 1..10 |> Enum.map(& &1 *2) |> Enum.filter(& &1 <= 10) |> IO.inspect |> Enum.map(& &1 * &1)
[2, 4, 6, 8, 10]
[4, 16, 36, 64, 100]
```

途中でパイプライン演算子を挟みデバッグに使うIO.inspectを入れて[2,4,6,8,10]の途中経過を表示させています。

# パイプライン演算子について

設問２をシンセサイザーに例えてみましょう。IO.inspectはここでは省略します。2段目のmapと3段目のfilterを入れ替えて結果を見てみましょう。

```elixir
iex> 1..10 |> Enum.map(& &1 *2) |> Enum.filter(& &1 <= 10) |>  Enum.map(& &1 * &1)    
[4, 16, 36, 64, 100]

iex> 1..10 |> Enum.map(& &1 *2) |>  Enum.map(& &1 * &1) |> Enum.filter(& &1 <= 10)
[4]
````

驚くべきなのか当然と片付けるべきかわからないのですがmapとfilterの内容を入れ替えると結果が変わりました。
これは、左辺のリストをエレキギターのコイルやシンセサイザーのオシレーターとしたら、のちにかけるフィルター(filter)やオーバードライブ(map)の順番によっていかようにも出音が変わることと共通しています。

# ここまでの気づき

このエントリ自体はなんてことのないEnumの四則演算のパイプライン演算子ごとの順番入れ替えによって結果が変わることを図示したものですが、わたし自身音楽家であることもあり、"オシレーターとフィルターとLFOの順番違ったら音違うじゃん！それとElixirも一緒！って言われたら納得するな"と思い記事をしたためた次第です。
BitLockerの回復キー保管場所一覧

## 前程
この記事は BitLocker設定時に　`Microsoftアカウントに保存する` を選択した場合における回復キーの保管場所を一覧にしただけの記事です。
細かいところまで調査ができていません。
そのため、とりあえず次の一覧にアクセスすれば見つかるかも。くらいの記事になります。



## 経緯
BIOS更新したときなどに、回復キーが必要になる。次の記事を参考にしたが、情報が不十分で手間取ってしまった。
[BitLocker 回復キーを探す](https://support.microsoft.com/ja-jp/help/4026181/windows-10-find-my-bitlocker-recovery-key)


## 回復キーが保管されている可能性がある場所
- OneDrive
 - https://onedrive.live.com/recoverykey
- MicrosoftAccount
 - https://go.microsoft.com/fwlink/p/?LinkId=237614
- Azure Active Directory アカウント（管理者しかみれません）
 - https://manage.windowsazure.com
 - `Azure Active Directory > (会社名を選択) > (ユーザーを選択) > デバイス`

### 保管場所の仮説
BitLockerを設定したときのアカウントが次のどれかで保管場所が変わりそうです。
ただ、実際に検証したわけではなく調査時の仮説にすぎません。（どなたかご指摘いただけたら助かります…！）

| アカウント | 保管場所 |
|:--|:--|
| Microsoft Account  | MicrosoftAccount  |
| Office365（個人）  | OneDrive  |
| Office365（会社）  | Azure Active Directory  |
git コマンド

・最初

```shell:git
git init   //リポジトリ作成
git remote add origin https://github.com/ユーザー名/ファイル名.git
git add  [ ファイル名 ]
or
git add .   //ファイル全て
git commit -m "コメント"  //コミット (-aオプションは変更を自動検出してくれる)
git push -u origin master  //-uがあると次回から(origin master)がいらなくなる
```
・二回目から

```shell:git
git add [ ファイル名 ] //追加ファイル名
or
git add .　//全てのファイル
git commit -a -m "任意のコメント"  //コミット (-aオプションは変更を自動検出してくれる)
git push origin master  //masterを更新
```
・git addの使用例

```shell:git
git add . //すべてのファイル・ディレクトリ
git add *.css //すべてのCSSファイル
git add -n //追加されるファイルを調べる
git add -u //変更されたファイルを追加する
git rm --cached //addしてしまったファイルを除外
```
・git commitの使用例

```shell:git
git commit -a //変更のあったファイルすべて
git commit --amend //直前のコミットを取り消す
git commit -v //変更点を表示してコミット
```
・コミットの取り消し

```shell:git
git reset --soft HEAD~2 // 最新のコミットから2件分をワークディレクトリの内容を保持し取り消す
git reset --hard HEAD~2 // 最新のコミットから2件分のワークディレクトリの内容とコミットを取り消す
```
貼って使う Azure CLI スニペット（Virtual Machine編）

## 概要
* Azure リソースのメンテナンス等で使えそうなコマンドのスニペット（PowerShell ベース）をまとめました
* PowerShell コンソールに貼って使えます
* 今回は **Virtual Machine** に関するスニペットをまとめます

## 前提
* [Azure CLI](https://docs.microsoft.com/ja-jp/cli/azure/install-azure-cli?view=azure-cli-latest) がインストールされている前提です
* 実行するには、事前に `az login` コマンドで 認証する必要があります（参考：[Azure CLI の概要 - サインイン](https://docs.microsoft.com/ja-jp/cli/azure/get-started-with-azure-cli?view=azure-cli-latest#sign-in)）
* 環境情報：
    * Azure CLI（v.2.0.57）
    * PowerShell（v.5.1.17134.407）
* 安全に試せるよう 情報取得系 中心にまとめます（一部注意事項あります）
* 一部のスニペットは実行時にパラメータが必要となります

---


## VM の一覧を取得したい

```
az vm list
```


## VM名 だけ一覧取得したい

```
(az vm list | ConvertFrom-Json) | % {$_.name}
```


## Windows VM だけ、名称・リソースグループ を一覧表示したい

```
(az vm list | ConvertFrom-Json) | where {$_.storageProfile.osDisk.osType -eq "Windows"} | % {$_.name + " (" + $_.resourceGroup + ")"}
```


## Linux VM だけ、名称・リソースグループ を一覧取得したい

```
(az vm list | ConvertFrom-Json) | where {$_.storageProfile.osDisk.osType -eq "Linux"} | % {$_.name + " (" + $_.resourceGroup + ")"}
```


## 全VM の状態を一覧取得したい

* **【注意】１件１件 VMの状態を取得するため時間がかかります**

```
$st = @{
    "VM starting" = "開始中";
    "VM running" = "実行中";
    "VM stopping" = "停止中";
    "VM stopped" = "停止済み";
    "VM deallocating" = "割り当て解除中";
    "VM deallocated" = "割り当て解除済み";
}; `
(az vm list | ConvertFrom-Json) | `
    % { (az vm get-instance-view -g $_.resourceGroup -n $_.name | ConvertFrom-Json) | `
        % { $_.name + " (" + $_.resourceGroup + ") `n" + `
        "  状態：" + $st[$_.instanceView.statuses[1].displayStatus]  + "`n" + `
        "  OS：" + $_.storageProfile.osDisk.osType }};
```


## 追加のデータディスク容量（があれば）を一覧取得したい

```
(az vm list | ConvertFrom-Json) | `
    % {$_.name + " (" + $_.resourceGroup + ") `n" + `
    (($_.storageProfile.dataDisks) | % {"  データディスク: " + $_.diskSizeGb + " GB`n  "} )}
```
* データディスクがない：VM名の下になにも表示されない
* データディスクが複数ある：その分だけディスクサイズが表示される


## 全VMのIPを一覧取得したい
```
az vm list-ip-addresses --output table
```


## 特定のIPがどのVMで使用されているか確認したい

```
Param(
    [Parameter(Mandatory=$true)] $ipAddress
); `
(az vm list-ip-addresses | ConvertFrom-Json) | `
    % {
        if ($_.virtualMachine.network.privateIpAddresses -contains $ipAddress) { $_.virtualMachine.name + " (" + $_.virtualMachine.resourceGroup + ") で使用中" };
        if ($_.virtualMachine.network.publicIpAddresses -contains $ipAddress) { $_.virtualMachine.name + " (" + $_.virtualMachine.resourceGroup + ") で使用中" };
    }
```
貼って使う Azure CLI スニペット（App Service Plan編）

## 概要
* Azure リソースのメンテナンス等で使えそうなコマンドのスニペット（PowerShell ベース）をまとめました
* PowerShell コンソールに貼って使えます
* 今回は **App Service Plan** に関するスニペットをまとめます（≠ App Service）

## 前提
* [Azure CLI](https://docs.microsoft.com/ja-jp/cli/azure/install-azure-cli?view=azure-cli-latest) がインストールされている前提です
* 実行するには、事前に `az login` コマンドで 認証する必要があります（参考：[Azure CLI の概要 - サインイン](https://docs.microsoft.com/ja-jp/cli/azure/get-started-with-azure-cli?view=azure-cli-latest#sign-in)）
* 環境情報：
    * Azure CLI（v.2.0.57）
    * PowerShell（v.5.1.17134.407）
* 安全に試せるよう 情報取得系 中心にまとめます（一部注意事項あります）
* 一部のスニペットは実行時にパラメータが必要となります

---


## App Service Plan の一覧を取得したい
```
az appservice plan list
```


## App Service Plan名 だけ一覧取得したい

```
(az appservice plan list | ConvertFrom-Json) | % {$_.name}
```


## Windows OS のプラン名を一覧取得したい

```
(az appservice plan list | ConvertFrom-Json) | where {$_.kind -eq "app"}| % {$_.name}
```


## Linux OS のプラン名を一覧取得したい

```
(az appservice plan list | ConvertFrom-Json) | where {$_.kind -eq "linux"}| % {$_.name}
```


## Azure Function で使用しているプラン名を一覧取得したい

```
(az appservice plan list | ConvertFrom-Json) | where {$_.kind -eq "functionapp"}| % {$_.name}
```


## 有料であるプラン名を一覧取得したい

```
(az appservice plan list | ConvertFrom-Json) | where {$_.sku.size -ne "F1"} | % {$_.name}
```
* フリープランのみ取得するには `-ne` を `-eq` へ変える


## 特定のプランに載っている App Service(Web Apps) 名の一覧を取得したい

```
Param(
    [Parameter(Mandatory=$true)] $planName
); `
(az webapp list | ConvertFrom-Json) | where {$_.appServicePlanId -match "$planName$"} | % {$_.name}
```
* App Service プロパティ `appServicePlanId` は 以下の通り末尾にプラン名が含まれるため、その様に正規表現検索する
    * `/subscriptions/<サブスクリプション>/resourceGroups/<リソースグループ名>/providers/Microsoft.Web/serverfarms/<プラン名>`


## 状態が「準備完了」以外の（プロビジョニング中 など）プラン名と その状態を一覧取得したい

```
(az appservice plan list | ConvertFrom-Json) | where {$_.status -ne "Ready"} | % {$_.name + " (" + $_.status + ")"}
```
* `Isolated` プラン等、占有環境にプランをデプロイするまでに時間がかかる場合、状態が「プロビジョニング中」となっている
貼って使う Azure CLI スニペット（リソースグループ編）

## 概要
* Azure リソースのメンテナンス等で使えそうなコマンドのスニペット（PowerShell ベース）をまとめました
* PowerShell コンソールに貼って使えます
* 今回は **リソースグループ、および汎用リソース関連** に関するスニペットをまとめます

## 前提
* [Azure CLI](https://docs.microsoft.com/ja-jp/cli/azure/install-azure-cli?view=azure-cli-latest) がインストールされている前提です
* 実行するには、事前に `az login` コマンドで 認証する必要があります（参考：[Azure CLI の概要 - サインイン](https://docs.microsoft.com/ja-jp/cli/azure/get-started-with-azure-cli?view=azure-cli-latest#sign-in)）
* 環境情報：
    * Azure CLI（v.2.0.57）
    * PowerShell（v.5.1.17134.407）
* 安全に試せるよう 情報取得系 中心にまとめます（一部注意事項あります）
* 一部のスニペットは実行時にパラメータが必要となります

---


## リソースグループ一覧を取得したい

```
az group list
```


## リソースグループ名だけ一覧取得したい

```
(az group list | ConvertFrom-Json) | % {$_.name}
```


## リソースグループ名で検索し、名称とロケーションを一覧取得したい

```
Param(
    [Parameter(Mandatory=$true)] $keyword
); `
(az group list | ConvertFrom-Json) | where {$_.name -like "*$keyword*"} | % { $_.name + " @ " + $_.location}
```


## リソースグループが存在するか確認したい

* 存在する場合は `true` が、存在しない場合は `false` が出力される

```
Param(
    [Parameter(Mandatory=$true)] $resourceGroup
); `
az group exists -g $resourceGroup
```


## 総リソース数を知りたい

* 特定リソースグループの総リソース数を取得

```
Param(
    [Parameter(Mandatory=$true)] $resourceGroup
); `
@((az resource list -g $resourceGroup | ConvertFrom-Json)).Count
```

* サブスクリプション全体の総リソース数を取得

```
@((az resource list | ConvertFrom-Json)).Count
```


## デプロイ進行中のリソースがいくつあるか知りたい

```
Param(
    [Parameter(Mandatory=$true)] $resourceGroup
); `
@((az group deployment list -g $resourceGroup | ConvertFrom-Json) | where {$_.properties.provisioningState -eq "Running"}).Count
```


## リソースグループにデプロイされている全リソースの ARMテンプレート を出力したい

* **【注意】<リソースグループ名>-template.json ファイルが作成されます**

```
Param(
    [Parameter(Mandatory=$true)] $resourceGroup
); `
az group export -g $resourceGroup > .\$resourceGroup-template.json
```

* 上記で取得したテンプレートはそのままの状態で正常動作しない可能性あり（適宜修正が必要となるケースあり）


## ARMテンプレートをデプロイしたい

* **【注意！】認証済みのAzureサブスクリプションに対し、リソースが作成されます！**

```
Param(
    [Parameter(Mandatory=$true)] $resourceGroup,
    [Parameter(Mandatory=$true)] $templateFile
); `
az group deployment create -g $resourceGroup --template-file $templateFile
```

* 上記実行すると必要なパラメータを尋ねられるので入力していく
* 上記は **テンプレートファイルが正しく作成されて** いなければならない
    * 単に `az group export` でエクスポートしただけのJSONファイルでは、正常に動作しない可能性あり
Azure CLI + PowerShell 利用時にハマったこと

# はじめに
* Azure CLI を PowerShell ベースで利用したときにハマったことをまとめます
* 環境情報：
    * Azure CLI（v.2.0.57）
    * PowerShell（v.5.1.17134.407）

---

## `az` コマンドで取得したオブジェクトのプロパティにアクセスできない

### やりたいこと
* リソースグループ一覧を取得し、名前だけ抜き出して一覧表示したい

### 間違ったコマンド
```
az group list | % {$_.name}
```
* 結果：なにも出力されない

### 正しいコマンド
```
(az group list | Convertfrom-Json) | % {$_.name}
```

### 詳細
* `az` 各種コマンド・サブコマンドの実行結果は基本的に **JSON 文字列が戻り値** となる
* PowerShell 側で プロパティにアクセスできるようにするには
    * `| ConvertFrom-Json` と続け PowerShell で扱えるオブジェクト形式に変換してやる必要がある
    * その際には 必ず全体を `()` でくくる 例：`(az group list | ConvertFrom-Json)`

---

## `where` した結果 1件はデータがあるはずなのに `.Count` で件数が出力されない

### やりたいこと
* リソースグループ `test-rgp` の総リソース数を取得したい

### 間違ったコマンド
```
((az resource list -g test-rgp | ConvertFrom-Json) | where {$_.name -like "*"} ).Count
```
* 結果：
    * リソースグループ内に 1つもリソースがない場合：`0` が出力される
    * リソースグループ内に 1つリソースがある場合：なにも出力されない
    * リソースグループ内に 2つ以上リソースがある場合：正しい件数が出力される
    * → **1件の時だけ なにも出力されない**

### 正しいコマンド
```
@((az resource list -g test-rgp | ConvertFrom-Json) | where {$_.name -like "*"} ).Count
```

### 詳細
* **正しいコマンド** では `@().Count` とし `where` で絞り込んだ件数が 1件だけであっても **配列化し** 件数を計上している
* 上記コマンドから @ を外すと、絞り込み結果が 1件の場合 `where` は `Array` 型でなく `PSCustomObject` 型 で結果を返却する
* `PSCustomObject` 型 には `Count` プロパティが存在しないため `$null` が返却される
    * これにより実際には１件ヒットしても コンソールに何も出力されないという事象が発生してしまう
atomの空白文字、コメント、カーソル行などが読みにくすぎる。

atomエディタの「空白文字」や「コメント」などが読みにくすぎる。

```sass
atom-text-editor.editor {
  // コメント
  .syntax--comment {
    color: #888;
  }
  // インデントのルーラ（縦線）
  .indent-guide {
    box-shadow: inset #555 1px 0;
  }
  // 空白文字（半角スペース、タブ、改行）
  .invisible-character {
    color: #777;
  }
}

atom-text-editor .gutter {
  // 行数
  .line-number {
    color: #888;
    // カーソル行の行数
    &.cursor-line {
      color: #FFF;
    }
  }
}
```

こうやって簡単に変更できるのがatomのいいところですね。
Nuxt.jsのPWAにて画面遷移時にTOPから表示されない時の対処

##環境
Nuxt.js v2.3.4
mode:history
##フォルダ構成
-layoutフォルダ
　　|
　　|-layouts.vue

-pagesフォルダ
　　　|
　　　|-page1.vue
　　　|
　　　|-page2.vue

##事象
vue-routerでcomponent間遷移　

page1.vue

```vue
<template>
    <div id="page" class="">
        <input type="button" id="go"  @click="go">いけいけ</input>
    </div>
</template>
<script>
import CONSTANTS from '../mixin/constants.js'
import * as COMMON from '../utils/common.js'
export default {
    layout:'function',
    methods:{
        go(){
            this.$router.push('page2')
        }
    }
}
</script>
<style>
 #go{padding-top:1000px;}
</style>

```

page2.vue

```vue
<template>
    <div id="page" class="">
        <input type="button" id="back"  @click="go">もどれもどれ</input>
    </div>
</template>
<script>
import CONSTANTS from '../mixin/constants.js'
import * as COMMON from '../utils/common.js'
export default {
    layout:'function',
    methods:{
        back(){
            this.$router.push('page1')
        }
    }
}
</script>
<style>
 #go{padding-top:1000px;}
</style>

```

こうして画面遷移すると前のスクロール位置を継承して画面が表示されてしまいます。

##調べてみると…２つ方法がありました

###対策1
　各コンポーネントにscrollTop:trueを記述
https://ja.nuxtjs.org/api/pages-scrolltotop/

デフォルトはfalseになっており継承してしまうようです。

###対策2
対策1でできなければ、nuxt.config.jsにscrollBehaviorを追加

```
export default {
  router: {
    scrollBehavior: function (to, from, savedPosition) {
      return { x: 0, y: 0 }
    }
  }
}
```

##これでもできませんでした…

苦肉の策で各コンポーネントにこれを追加して解決できました。

```
    mounted(){
        document.getElementById('対象のid').scrollTop = 0
    }

```

##参考
https://ja.nuxtjs.org/api/configuration-router#scrollBehavior
nRF52でリセットボタンをGPIOに使う

nRF52840 では RESET は GPIOの P0.18 に割り当てられている。RESETの機能は他のピンに移動できないらしい

https://devzone.nordicsemi.com/f/nordic-q-a/24490/nrf52-dk-changing-reset-pin-from-p0-21-to-somewhere-else

が、リセット機能を無効にして通常のGPIOとして使うことはできる。


# 環境

- Raytac MDBT50Q-DB ( Nordic nRF52840 SoC )
- Nordic nRF5 SDK v15.2.0
- SEGGER Embedded studio for ARM V4.10a
- J-link v9(中華製)

# プロジェクト設定

サンプルプログラムのblinkyを例に取ると、

( examples/peripheral/blinky/pca10056/mbr/ses を使うとして )

blinky_pca10056_mbr.emProject 内の c_preprocessor_definitions に指定されている

```

CONFIG_GPIO_AS_PINRESET;
```

を削除

# ALLERASE

これだけでプロジェクト設定はOKだが、既にリセット設定が書き込まれた nRF52840 を使う場合は過去のレジスタ設定をクリアしておかないといけない。

Segger Embedded Studio の、Target - Connect J-link すると、Target - Erase All ができるようになる。
Erase Allを実行すると（数十表かかる）、過去の設定を無効にできる。

なお、リセットが有効なプロジェクトから、無効に変更した場合は Build - Clean Solution も忘れないこと

# 使用例

```

  // プルアップ付きインプットモードに設定
  nrf_gpio_cfg_input(NRF_GPIO_PIN_MAP(0,18),NRF_GPIO_PIN_PULLUP);  

・・・

  if( 0 == nrf_gpio_pin_read(NRF_GPIO_PIN_MAP(0,18))){
         // ボタンが押された処理
  }
```

これで、P0.18をGNDに接続すると元々はリセットがかかるが、うまく設定ができていれば「// ボタンが押された処理」が実行される。
P4Vでサブミットを取り消す方法について

# P4V (Perforce Visual Client)とは？
いわゆるバージョン管理ソフトウェアのことです。
私はUE4を使用するときに運用しました。
詳しくは[P4Vの公式ドキュメント](http://www.toyo.co.jp/files/user/img/product/ss/help/perforce/r14.3/manuals/p4v/introduction.about.html)を読んでいただければと思います。

UE4での使用方法はこちらです。
[ソース コントロールとして Perforce を使用する](http://api.unrealengine.com/JPN/Engine/Basics/SourceControl/Perforce/)

# サブミットを取り消したいケース
サブミットを取り消す方法についてケースごとに記載します。
具体的な例でいうと以下のようなものがあります。

## 誤ってサブミットしてしまった:scream:
よくあるケースですが、
**「あっ！動かないものサブミットしちゃった…！」**
という編集中のコードや動作不良のあるアセットを誤ってサブミットしてしまったケースです。

また、不要なサブミットだったので取り消すこともあると思います。

### 対処方法
履歴から該当のリビジョン（チェンジリスト）を探し、
右クリックした後に**「サブミット済みチェンジリスト"XXXX"を取り消す」**で取り消せます。
取り消した後はそのチェンジリストをサブミットしてください。

### リビジョンの状態
<font color="Crimson">サブミット（チェンジリストA）</font>
↓
<font color="RoyalBlue">サブミット（チェンジリストB）</font>
↓
<font color="DimGray">チェンジリストBを取り消す（チェンジリストC）</font>
↓
***<font color="Crimson">チェンジリストAの状態</font>に戻る***


## "取り消したもの"を取り消したい（戻したい）:persevere:
誤って取り消しを行ったときや、
いったん取り消したものをローカル上で復元したいときなどに使用します。

私の場合は、
**「あ～この前無くした仕様、また復活するから:relaxed:ﾆｺｯ」**
と仕様変更を頂いたときにいったんローカル上に復元して、
前にあった機能をマージさせるときにも使いました。

### 対処方法
これもサブミットミスの取り消し時と同じように戻すだけですが、
**取り消したリビジョン（チェンジリスト）自体を戻す**ことで、
**取り消したことを取り消す（戻す）**ことができます。
ややこしいので下記の状態を参考にしてみてください。

### リビジョンの状態
<font color="Crimson">サブミット（チェンジリストA）</font>
↓
<font color="RoyalBlue">サブミット（チェンジリストB）</font>
↓
<font color="DimGray">チェンジリストBを取り消す（チェンジリストC）</font>
↓
<font color="Crimson">チェンジリストAの状態</font>に戻る
↓
<font color="DimGray">チェンジリストCを取り消す</font>
↓
***<font color="RoyalBlue">チェンジリストBの状態</font>に再度戻ります。***

# まとめ
- 誤ってサブミットしても**慌てない**:confounded:
- 周りの人がミスったら**優しく教えてあげる**:blush:
- 仕様変更があっても**泣かない**:joy:

~~（全部私自身に言ってることです）~~
128×64 OLED LCDディスプレイSSD1306液晶モジュールを動かす

128×64 OLED LCDディスプレイSSD1306液晶モジュールをArduinoに繋げて動かす際の手順を記載します。

# 準備
・[Arduino UNO R3 互換品](https://www.amazon.co.jp/スイッチサイエンス-SSCI-GettingStartedArduinoKit-Arduinoをはじめようキット/dp/B0025Y6C5G/ref=sr_1_4?s=toys&ie=UTF8&qid=1548518133&sr=1-4&keywords=Arduino+正規品)
・[I2C シリアル 128×64 OLED LCDディスプレイSSD1306液晶  ブルーイエロー](https://www.amazon.co.jp/gp/product/B071ZPGWHL/ref=ppx_yo_dt_b_asin_title_o04__o00_s01?ie=UTF8&psc=1)
・ジャンパーワイヤ　４本（メス-オス）
# 回路図
下記モジュールにジャンパーワイヤを接続してArduinoと繋ぎます。
![002.png](https://qiita-image-store.s3.amazonaws.com/0/344880/f360c0a3-bea1-bfd2-6e97-06c8b4682c2d.png)

SSD1306液晶 ----- Arduino 間を下記の通り配線する。
VCC <---> 5V
GND <---> GND
SDA <---> SDA
SDC <---> SCL

# コード
参考記事記載の通り下記ライブラリをインストールします。
・Adafruit_SSD1306のインストール
・Adafruit-GFX-Libraryのインストール

バージョン1.2.9では、 Adafruit_SSD1306.h ヘッダファイルの修正は下記１点のみ実施しました。
![002.png](https://qiita-image-store.s3.amazonaws.com/0/344880/e75c4b3e-43b3-8bb0-9631-7ba284f2ae0e.png)
・ディスプレイ解像度を128×64に変更

```
   #define SSD1306_128_64
//   #define SSD1306_128_32
//   #define SSD1306_96_16
```

またサンプルスケッチ「ssd1306_128x64_i2c」では初期化時のI2Cアドレスを下記の通り0x3D→0x3Cへ変更しました。

```
display.begin(SSD1306_SWITCHCAPVCC, 0x3C))
```

# テスト
サンプルスケッチ「ssd1306_128x64_i2c」の書き込みを行うと液晶にサンプル画像が表示されました。
![001.png](https://qiita-image-store.s3.amazonaws.com/0/344880/ebfb1cbf-6b48-ddf9-9268-f2f0ea33f6cb.png)

<blockquote class="twitter-tweet" data-lang="en"><p lang="en" dir="ltr">play ssd1306 module <a href="https://t.co/J9raNcMXdS">pic.twitter.com/J9raNcMXdS</a></p>&mdash; st (@st17890027) <a href="https://twitter.com/st17890027/status/1092818472986234880?ref_src=twsrc%5Etfw">February 5, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 



# 参考
・[ArduinoでOLEDディスプレイを試す](https://qiita.com/jakalada/items/8f83d07291d984a31633)
・[組み込みエンジニアでなくても週末にArduinoを使って遊ぶ](https://qiita.com/seigot/items/958d3f2817a4bdac8754)
・[Arduino Uno 互換品を使おうとした際に、Mac(OS:Siera)上のArduino IDEからシリアルデバイスが見つからない問題を解決した件について](https://qiita.com/seigot/items/1515082a09224563b148)
AWS LambdaからDynamoDBにput_itemしようとしたら'Task timed out after ~'となってハマった話

# 事の発端
AWS LambdaとDynamoDBのお勉強で色々弄ってた時のこと。
以下はDynamoDBにテーブルを作成後、Itemを登録するコードです。


```python:lambda_function.py
import boto3


def lambda_handler(event, context):
  try:
    dynamoDB = boto3.resource("dynamodb", region_name="ap-us-west-2")
    table_name = "my_table_name"
    table = dynamoDB.Table(tabale_name)
    table.put_item(
      Item = {
        'id: 1',
        'name': 'taro'
      }
    )
  except Exception as e:
        print(e)
```

これを実行するとこんなエラーが。。。

```json:log
{
  "errorMessage": "2019-02-12T08:25:26.977Z '***************' Task timed out after 3.00 seconds"
}
```
このエラー自体は、Lambdaに設定してあった実行制限時間になっても処理が終わらなかったよ、という事。

でも、Item登録するのそんなに重い処理じゃない筈だし、そんなに時間かかってたら使いもんにならんぞと思いながらもLambdaの実行時間制限を10秒にしてもう一度実行するもまたタイムアウトした。

# 原因はRegion名のtypo
単純なタイプミスでした。

```python
dynamoDB = boto3.resource("dynamodb", region_name="ap-us-west-2")
```
を

```python
dynamoDB = boto3.resource("dynamodb", region_name="us-west-2")
```

に直して実行するとうまくいった。

# 原因特定のきっかけ
もうどうすることもできなくて途方にくれていた時、実行制限時間をもっと伸ばしたら何か変わるだろうかという天の声が聞こえて試して見た結果、なんとエラーの内容が変わった。

```
Could not connect to the endpoint URL: '**************'
```

このエラーを見て初めて自分がregion名の指定の仕方を間違えているのではと気づいた。
DynamoDBがエラーを返すまでの時間がかかりすぎたためにこの事実に気付くのが遅れてしまった訳だ。

# 教訓
### <font color="Red">**100回叩けば開くドアはちゃんと100回叩け**</font>
  
DB接続に関して知識が薄かったと思い知らされた。
Lambdaの実行制限時間は30秒以上に設定しておいたほうが無難だと思う。
ArduinoにServoモータを繋いで動かす

Servoモータを接続して動かした手順を記載します。

# 準備
・[Arduino UNO R3 互換品](https://www.amazon.co.jp/スイッチサイエンス-SSCI-GettingStartedArduinoKit-Arduinoをはじめようキット/dp/B0025Y6C5G/ref=sr_1_4?s=toys&ie=UTF8&qid=1548518133&sr=1-4&keywords=Arduino+正規品)
・[マイクロサーボ SG90](https://www.amazon.co.jp/gp/product/B07L1LGNSJ/ref=ppx_yo_dt_b_asin_title_o03__o00_s00?ie=UTF8&psc=1)
・ジャンパワイヤ３個（オスーオス）

届きました。


# 回路
Arduino Servoモータ
5V <--> Vcc
GND <--> GND
PIN9 <--> 制御ピン

![servo.png](https://qiita-image-store.s3.amazonaws.com/0/344880/af4a849c-9b3e-f557-ff72-bddbe0cdc91a.png)


# コード
Servoライブラリのsweepを使用します。

```
#include <Servo.h>

Servo myservo;  // create servo object to control a servo
// twelve servo objects can be created on most boards

int pos = 0;    // variable to store the servo position

void setup() {
  myservo.attach(9);  // attaches the servo on pin 9 to the servo object
}

void loop() {
  for (pos = 0; pos <= 180; pos += 1) { // goes from 0 degrees to 180 degrees
    // in steps of 1 degree
    myservo.write(pos);              // tell servo to go to position in variable 'pos'
    delay(15);                       // waits 15ms for the servo to reach the position
  }
  for (pos = 180; pos >= 0; pos -= 1) { // goes from 180 degrees to 0 degrees
    myservo.write(pos);              // tell servo to go to position in variable 'pos'
    delay(15);                       // waits 15ms for the servo to reach the position
  }
}

```

# テスト
サーボモータが180度回転すればOKです。
<blockquote class="twitter-tweet" data-lang="ja"><p lang="en" dir="ltr">play servo motor <a href="https://t.co/QLJ84OldD7">pic.twitter.com/QLJ84OldD7</a></p>&mdash; st (@st17890027) <a href="https://twitter.com/st17890027/status/1094802960557568000?ref_src=twsrc%5Etfw">2019年2月11日</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 

# 参考
・[組み込みエンジニアでなくても週末にArduinoを使って遊ぶ](https://qiita.com/seigot/items/958d3f2817a4bdac8754)
Mojaveのvimでruby書いていると incompatible library version エラーが出るようになったときの対応


# 背景
Mojaveにして、ファイルタイプをrubyにしてvim起動すると、みたいなエラーが出た。
ローカル環境ではrbenvを使っており、system配下の2.3系のrubyバージョンを使うことなど無いはず。

```
/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/lib/ruby/2.3.0/rubygems/specification.rb:17:in
`require': incompatible library version - 
/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/lib/ruby/2.3.0/universal-darwin18/stringio.bundle (LoadError)
```

調べると以下のようにissueが上がっていた。

https://github.com/skwp/dotfiles/issues/802

# 対応
.vimrcに以下の一行を入れる

```
set rubydll=''
```

僕の場合は rubydllが悪さをしているようだった。調べてみるとvimが読み込みに行くrubyファイルのpathらしい。(https://vim-jp.org/vimdoc-ja/if_ruby.html)

とりあえず、エラー消したかったので上の対応を入れた。
[Python] Matplotlib を使用してグラフを書いてみた！

#Matlplotlib を使用してグラフを書いてみた！
今回はpythonとライブラリーMatplotlib,numpyを用いて簡単なグラフを書いいてみました！
以下にサンプルコードを記述します。
##一次関数
```python:sample
 
import numpy as np
import matplotlib.pyplot as plt

# 描画範囲の指定
# x = np.arange(x軸の最小値, x軸の最大値, 刻み)
x = np.arange(-10, 10, 0.1)

# 計算式
y = 2 * x + 1

# 横軸の変数。縦軸の変数。
plt.plot(x, y)

# 描画処理
plt.show()

```

実行結果が以下のようになります。

<img width="639" alt="スクリーンショット 2019-02-12 15.27.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/310283/49be3c1d-68c1-0a12-83de-8adb6b5ef2a2.png">

##二次関数

```python
import numpy as np
import matplotlib.pyplot as plt

# 描画範囲の指定
# x = np.arange(x軸の最小値, x軸の最大値, 刻み)
x = np.arange(-10, 10, 0.1)

# 計算式
y = 2 * (x**2)

# 横軸の変数。縦軸の変数。
plt.plot(x, y)

# 描画処理
plt.show()


```
<img width="645" alt="スクリーンショット 2019-02-12 17.40.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/310283/6562448f-5817-147d-4bfe-29ac6cb66e3a.png">

##三角関数

```python

import numpy as np
import matplotlib.pyplot as plt

# 描画範囲の指定
# x = np.arange(x軸の最小値, x軸の最大値, 刻み)
x = np.arange(-3.14 , 3.14, 0.1)

# 計算式
y = np.sin(x)

# 横軸の変数。縦軸の変数。
plt.plot(x, y)

# 描画処理
plt.show()


```

実行結果
<img width="623" alt="スクリーンショット 2019-02-12 17.46.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/310283/e1168f01-1c5f-98be-e7d7-dc710b420797.png">

###終わりに

今回はpythonとライブラリーMatplotlibを用いて簡単なグラフを書いてみました。
個人的には、plt.plot(x,y)などのコードをよく忘れてしまうので、備忘録としてお使いください。
いつか、マトラボで記述したものも記事に書きます。
jQueryのmodalプラグインmodaalを使ってみた。

#modaalで簡単なモーダル実装
フロントをやっていると何かとモーダルが必要になります。
自前で組んでも良いですが、スマホ対応など意外とめんどくさかったりします。

そこで今回はmodaalというやつを使ってみました。

モーダル自体はむちゃくちゃ簡単に実装できるのですが、ajaxでのデータ取得ですこし詰まったのでログとして残します。

ダウンロードや基本的な使い方はこちらから
https://github.com/humaan/Modaal

coffeeで普段書いているので読み替えてください。

## modalの実装
```html:index.html
<a href="#modal_id" class="js-trigger-modal-open">モーダルオープン</a>

<div id="modal_id">
 <h1>モーダルタイトル</h1>
 <p>モーダルコンテンツ</p>
<div>
```
```coffee:modal.coffee
$('.js-trigger-modal-open').modaal()
```

以上です。
超簡単！閉じるボタンすらいらない。

##ajaxで取得してモーダルの中身を書き換える

今回はボタンに付与されている変数で簡単にurlを叩きたいと思います。

```html:index.html
<a href="#modal_id" class="js_trigger_modal_open" var="1">モーダルオープン</a>

<div id="modal_id">
 <h1 class="js_modal_title">モーダルタイトル</h1>
 <p class="js_modal_content">モーダルコンテンツ</p>
<div>
```
```coffee:modal.coffee
id = ""
$('.js_trigger_modal_open').click ->
 id = $(this).attr("var")
      
modal_setting = (id) ->
 url = location.pathname + "/hoge/" + id
 $.ajax(
  type: 'GET',
  url: url
 ).done (data) ->
  modal_title = data.title
  modal_content = data.content
  $(".js_modal_title").text(modal_title)
  $(".js_modal_content").text(modal_content)
      
$('.js-trigger-tiny-pattern-modal').modaal({
 before_open: ->
  modal_setting(id)
  return
})
```
before_openのオプションを使うことでモーダルを開く前にajax取得からmodalの中身書き換えまで行っています。

ポイントはmodaalメソッドを使う前に必要な情報をすべて入れることです。
ページがロードされるとすぐにmodaalがモーダルのパーツをDOMに追加するので関数の中でつかう変数などが定義されていないとエラーになってしまうからです。
Azure Stream Analytics Jobsで文字列を数字に変換する方法 + その他

How to convert string data into number via Stream Analytics Jobs.

AzureのStream Analyticsで受け取ったデータの変換方法について説明します．

ここでは特に，「文字列」の形式で受け取ったデータを「数字」へ変換する方法について紹介しようと思います．

この前時刻情報の変換方法についても書きました．

https://qiita.com/_tokina23/items/a8ae0d55d97752ea8d93

先日AzureのStream JobsでAzure IoT Hubから取得したデータが文字列だったため，それをMicrosoft Power BIで数値として取得して折れ線グラフを表示する方法について調査した際のメモを残します．

## Azure Stream Analytics Jobsについて

Azure Stream Analyticsとは

> Azure Stream Analytics は、デバイスからの大量のデータ ストリームを分析することができるイベント処理エンジンです。 受信データは、デバイス、センサー、Web サイト、ソーシャル メディア フィード、アプリケーションなどから得ることができます。 また、データ ストリームから情報を抽出し、パターンや関係を把握することもできます。 これらのパターンを使用して、アラートの作成、レポート ツールへの情報のフィード、後で使用するための情報の保存など、別のアクションをダウンストリームでトリガーすることができます。

*https://docs.microsoft.com/ja-jp/azure/stream-analytics/stream-analytics-introduction*

AWSのKinesis StreamのAzure版のStreamデータを扱うサービスだと私は捉えています．

今回，Azure IoT HubとAStream Analyticsを繋ぎ，その際に取得できるJSON形式のデータ中の時刻情報の変換について触れます．

## フロー

![image.png](https://qiita-image-store.s3.amazonaws.com/0/211407/e843d75d-39d7-79cc-c20e-7ffe9eb3f1ca.png)

このようにIoTデバイスから流れてきたJSONにAzure IoT Hubがさらにいくつかの情報を追加で付与したものがStream Analytics Jobsで流れてくるので，これを変換します．

データラベル内の情報が「”」で囲われたStringデータなので，これをラベル”Temperature"のFloatデータへ変換します．

## 変換クエリを書く場所

Stream Analyticsには「クエリ」を書くことができます．ここで，「流れてくるデータ」から必要なデータを抽出，必要に応じて変換して他のサービスに流すことができるというすぐれものです．

![StreamJobs.png](https://qiita-image-store.s3.amazonaws.com/0/211407/430e50bb-8075-7ac8-6435-78d5afb49fb9.png)

「クエリ」はStream Analyticsの左のメニューのジョブトポロジ（Job Topology）の中にあります．


## 文字列を数字に変換する

流れてくるデータは以下を想定しましょう．

```
{
"EventProcessedUtcTime": xxx-xxx-xxx-xxx,
"EventEnqueuedUtcTime": xxx-xxx-xxx-xxx,
...
"mod":{
   "fq": 920.3
   "port": 1700,
   "data":"1398",
   ...
}
```

IoT Hubなどから流れてくるStream Dataのフォーマットはこちらを参照してください．

https://docs.microsoft.com/en-us/azure/stream-analytics/stream-analytics-define-inputs

データの型については以下を参考にします．

https://docs.microsoft.com/en-us/stream-analytics-query/data-types-azure-stream-analytics

データの流し先（今回はPower BI）にて必要となる型を想定します．折れ線グラフが描画できる形式は数値なので，Float型もしくはInt型に変換してみましょう．

今回は13.98のようなFloat型なので，これに変換します．


- Float型への変換(例："1398" -> 13.98)

```SQL
SELECT
    CAST (mod.data AS float) / 100 as Temperature
INTO
    [YourOutputAlias]
FROM
    [YourInputAlias]
```
- Int型への変換(例："1398" -> 1398)

```SQL
SELECT
    CAST (mod.data AS bigint) as Temperature
INTO
    [YourOutputAlias]
FROM
    [YourInputAlias]
```

これでPower BI上で「Σ」のマークがつけばグラフとして描画できます．

### そもそもなんでそんな状況になるのか？

送信元（今回の場合だとAzure IoT Hubにデータを投げるサービス）のデータ送信フォーマットが固定の場合があるためです．

自分ですべて開発している場合や，もしくは受信側の開発を行う場合ではこうしたフォーマットのずれは問題ないのですが，データの受け入れ先と，送信元が既存のサービスに依存しているようなサーバレスの環境では，Stream Analyticsが非常に便利になってくるのではないでしょうか．
micro:bitでロト7の乱数マシーンをつくってみた

micro:bitはお気軽にプログラミングが楽しめ、入力装置もついているし、出力用のLEDもあるので案外楽しめます。

公開講座のネタなどに良いかと思い、使い出しましたが、とても楽しくハマってしまいました。

遊びで　ロト７の乱数発生器を作ってみました。

Aボタンを押すと、１から３７までの乱数を表示します。
一応、同じ番号が出ないように作ったつもりです。

７回発生するとGood Luck!と無限表示になります。

<img width="517" alt="スクリーンショット 2019-02-12 17.30.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/237044/6e71df75-2642-f78d-9a7f-5691b8ecdcd6.png">

[上のプログラムを公開してみました](https://makecode.microbit.org/_7mX2PwaXu31v)

公開するとブラウザ上で動作確認できるのですね。
micro:bitがなくても、スマフォのブラウザ上で使えそうです！
micro:bitでIoT 現在進行系 2019.02.12学習開始

#[micro:bitでIoTの元記事](http://mag.switch-science.com/2018/12/25/letsiot-13-14/)

関連記事

- [ambient](https://ambidata.io)

#[micro:bit editor](https://makecode.microbit.org)
micro:bitのプログラム
<img width="746" alt="スクリーンショット 2019-02-12 8.30.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/237044/cd7ab927-b29f-7529-321a-70ccd396614f.png">
#[BLE Scanner](https://www.facebook.com/blescanner/)
#[ラズパイ側のプログラムの元記事](http://pages.switch-science.com/letsiot/blegw_rpi/)

- [ラズパイ ZEROのセットUP](https://qiita.com/hishi/items/8bdfd9d72fa8fe2e7573)
簡単、絶品！3分アナリティクス

SPSS ModelerとDb2 Warehouse on Cloudを組み合わせた大規模データの分析のメリットを、楽しく紹介しているビデオが公開されました。

簡単、絶品！3分アナリティクス
IBMのスターシェフがキッチンスタジオから「1億件のデータをパソコン1台で機械学習」する秘伝のレシピをご紹介
前編: https://www.youtube.com/watch?v=OT5m87fMz-8&feature=youtu.be&list=PL97CF7A9CC2DCCA6C
後編: https://www.youtube.com/watch?v=uNtoQc_BS7k&list=PL97CF7A9CC2DCCA6C&index=3
PHPのquotemetaは空文字列に対してfalseを返す

タイトル通りですが、[php-master-changes 2019-02-11](https://qiita.com/sj-i/items/f71dd92b38dbb077fd58)で見かけてちょっとびっくりしたので。

perlあがりなものでPHPの`quotemeta`についてはどうせ同じようなものだろうと今までまじめにマニュアル読んで無かったのですが、[quotemetaのマニュアル](http://php.net/manual/ja/function.quotemeta.php)を確認したところ

> 空文字を str に渡した場合は FALSE を返します。

とはっきり書かれていました。ということで、PHPの`quotemeta`の仕様がこうであることは確かなのですが、どうしてこんな変な独自仕様にしたのだろう??

ちなみに元ネタになったと思われるPerlの`quotemeta`はもちろんですが、Pythonの`re.escape(s)`もRubyの`Regexp.escape(s)`もそのまま空文字列を返します。

#追記

[Doc Bug #54539 quotemeta('') returns false](https://bugs.php.net/bug.php?id=54539)によると、一旦はバグとして報告されたものの「11年このままだったんだから後方互換性を犠牲にしてまで動作を直すよりはマニュアルを直す」ということになったようですね。よくあるPHPの闇だ...
You must use Bundler 2 or greater with this lockfile.

#herokuデプロイ時やmodel作成時に現れたerror:You must use Bundler 2 or greater with this lockfile.への対処法
2019年に入ってからbundlerのversionが2.0.1になってから現れた問題のようなのですが、あまり日本語記事がなかったので自分の問題解決経緯を共有させていただきます。

##herokuへのデプロイ時
localにてbundler2.0.1でgem等をinstallしている人に出てくる問題みたいなのですが、
(自分のbundlerのversionをcheckしたいと言う人は、terminal等アプリケーションのディレクトリで、`$vi Gemfile.lock`、最後の文に書いてあります。)
herokuにデプロイしようとすると、`You must use Bundler 2 or greater with this lockfile.`のような警告文が出ます。
これは`$heroku buildpacks:set https://github.com/bundler/heroku-buildpack-bundler2`とすれば解決します。herokuのbuildpacksが新しいbundlerに対応していないっぽいのでサードパーティ(?)でできるようにしたものみたいです。

##model生成時
僕の場合、さらにherokuへのdeploy時だけでなく、model生成の時にも、`bundle exec rails g model ...`とすると、`You must use Bundler 2 or greater with this lockfile.`と出てきたので、これはもしやlocalのbundler -v2.0.1自体がダメなのかなと思い、とりあえずversionを変えることにしました。変え方は、
1.gemfile.lockを消す
2.`$gem install bundler -v 1.17.3`などとして前のversionのbundlerをinstall
3.`$bundler _1.17.3_ install`などとして再度gemを入れ直す
4.新しくできたgemfile.lockを確認して、`BUNDLED WITH 1.17.3`みたいなことが書いてあれば、多分できます
すると、普通にできました。

##補足知識
Gemfile.lockは最初の`bundle install`で作成され、そこにはinstallしたgemとそのversionが書かれている。
Gemfileを書き直して、`bundle install`したら、gemfile.lockも書き換わる
`bundle update`すると、gemfile.lockを無視して最新のgemがinstallされるので、`bundle update`はあまりしないこと。
また、bundle installの際は`--path vendor/bundle`を書けば、railsアプリのルートディレクトリの下のvendor/bundleディレクトリにインストールされ、MacPCにインストールせずに、そのアプリケーションの中だけ(vender/bundleのところ)にインストールされる。次回以降`--path vendor/bundle`を書く必要はない。
bundlerのgemを使う際は、`bundle exec`を忘れないように

##参考
https://stackoverflow.com/questions/54387674/trying-to-deploy-you-must-use-bundler-2-or-greater-with-this-lockfile
Integer#truncateを使って１の位を切り捨てる

環境
---
ruby 2.5.1

たとえば人の年齢で、
29歳 -> 20代
14歳 -> 10代
みたいに１の位を切り捨てたい場合はこうする :point_down: 

```rb
29.truncate(-1)
#=> 20
14.truncate(-1)
#=> 10
```

ちなみに今回の要件だと、`floor`でも良い。（負数の挙動が異なる）
切り上げる場合は`ceil`、四捨五入の場合は`round`を使う。

以上 :hugging: 

## 参考
- [instance method Integer#truncate (Ruby 2.6.0)](https://docs.ruby-lang.org/ja/latest/method/Integer/i/truncate.html)
- [instance method Integer#floor (Ruby 2.6.0)](https://docs.ruby-lang.org/ja/latest/method/Integer/i/floor.html)
- [instance method Integer#ceil (Ruby 2.6.0)](https://docs.ruby-lang.org/ja/latest/method/Integer/i/ceil.html)
- [Rubyで数値の切り捨て・切り上げ・四捨五入する | UX MILK](https://uxmilk.jp/43388)
馬鹿の一つ覚え: SVG

#### SVGの書き方
```XML
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">

<!-- SVGの書き方 -->

<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">

  <circle cx="70" cy="64" r="50" fill="black" />
  <circle cx="180" cy="64" r="50" fill="gray" />

</svg>
```

#### SVGをHTML5の中に書き込む
```HTML
  <img src="./graphics/bar.svg" alt="bar">
```

#### 画像のサイズを指定
```XML
<svg width="640" height="480" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http:ww.w3.org/1999/xlink">
  <line x1="4" y1="472" x2="633" y2="7" stroke="darkgreen" stroke-width="5"/>
</svg>
```

#### 矩形
```XML
  <rect x="32" y="64" width="320" height="240" fill="deeppink" stroke="none" />
  <rect x="370" y="64" width="160" height="40" fill="none" stroke="darkslateblue" stroke-width="4" />
```

#### 文字列
```XML
  <text x="12" y="32" font-family="Arial" font-size="23" fill="darkslategray">文字列</text>
```

#### 楕円
```XML
  <ellipse cx="80" cy="80" rx="50" ry="30" stroke-width="3" stroke="black" fill="none" />
```