OmniAICreator/Qiita-1.07M huggingface dataset:
Office 2019オフラインインストール用batファイル(32ビット版のみ)

ボリュームライセンスでOffice Standard 2019を購入し、オフラインでインストールを行う方法です。
インストールは、32ビット版を対象としています。
[Office 2019オフラインインストール用batファイル(32ビット版/64ビット版の両方)](https://qiita.com/ssCARO/items/d64ed50c27207587c1fb)
[Office 2019オフラインインストール用batファイル(64ビット版のみ)](https://qiita.com/ssCARO/items/d0a23a557e446c471151)

# インストールファイルのダウンロード
VLSCからOffice Standard 2019のダウンロードでOffice 2019 Deployment Toolのexeをダウンロードする。

ダウンロードしたexeを実行し、展開先に適当なフォルダ(`C:\Office2019`)を指定する。
展開先のフォルダにはsetup.exeとサンプルのxmlがある。

展開先のフォルダに次のファイルを作成する。

```configuration-x86.xml
<Configuration>
    <Add SourcePath="C:\Office2019\Download_x86" OfficeClientEdition="32" Channel="PerpetualVL2019">
        <Product ID="Standard2019Volume">
            <Language ID="ja-jp" />
        </Product>
    </Add>
</Configuration>
```

コマンドプロンプトを実行し、`setup.exe`がある展開先のフォルダに移動して次のコマンドを実行する。
32ビット版のダウンロードが始まる。
ダウンロード中の進捗メータは表示されないので、コマンドが終わるまで待つ。

```:コマンドプロンプト
setup /download configuration-x86.xml
```
これで次のフォルダにインストールに必要なファイルがダウンロードされている。
- C:\Office2019\Download_x86

# インストーラーファイルの作成
次の2つのファイルを作成する。(シフトJISで作成)

```configuration-template.xml
<Configuration>
    <Add SourcePath="$SourcePath$" OfficeClientEdition="$OfficeClientEdition$" Channel="PerpetualVL2019">
        <Product ID="Standard2019Volume">
            <Language ID="ja-jp" />
        </Product>
    </Add>
</Configuration>
```

```Office_Setup.bat
rem Office 2019 のオフラインインストールを実行します。
rem DVDメディアにオフラインデータを書き込んでいることを想定しています。
@echo off
cls

echo.
echo 32ビット版 Office のインストールを行います。
echo.

rem 構成ファイルのテンプレートのパス
set TemplatePath=%~dp0configuration-template.xml
rem Tempフォルダに出力した構成ファイルののパス
set ConfigurationPath=%temp%\configuration.xml

rem 32ビット版を選択
set SourcePath=%~dp0Download_x86
set OfficeClientEdition=32

rem 既に構成ファイルがあれば削除
if exist %ConfigurationPath% del %ConfigurationPath%
rem テンプレートを読み込みパラメータを置き換えて
rem Tempフォルダに構成ファイルを出力する。
setlocal enabledelayedexpansion
for /f "delims=" %%a in (%TemplatePath%) do (
    set line0=%%a
    set line1=!line0:$SourcePath$=%SourcePath%!
    set line2=!line1:$OfficeClientEdition$=%OfficeClientEdition%!
    echo !line2!>>%ConfigurationPath%
)
endlocal

rem setup.exeを実行
start %~dp0setup.exe /configure %ConfigurationPath%
```
作成した2つのファイルとダウンロードしたインストール用データをDVDメディア等に書き込む。
- Download_x86
- Office_Setup.bat
- configuration-template.xml
- setup.exe

# オフラインインストールの実行
DVDメディア等に書き込んだ`Office_Setup.bat`を実行するだけ。
WP All Export pluginで出たエラーを解決する with php72

## 背景
最近、Wordpressの制作依頼が多い。
Wordpressは開発だけではなく、コンテンツもセットで納品する前提なのが辛いですが、大量のコンテンツ入稿に役立つcsv入力・出力ができると、大量のコンテンツの操作が楽になります。
昔は、[Really Simple CSV Importer](https://wordpress.org/plugins/really-simple-csv-importer/) にお世話になってましたが、最近は、メンテされていないため、使えなそう。。。

そこで、探したらありました。

[WP All Import](http://www.wpallimport.com/)
**WordPress XML Import. WordPress CSV Import. Easy.**

[WP All Export](http://www.wpallimport.com/export/)
**Export anything in WordPress to CSV, XML, or Excel.**

## 問題
WP All Export の方は、有効にしたところ、私の環境では、下記のエラーが発生してました。

**■ Error 1**
PHPのZipArchiveクラスが見当たりません

```
ZipArchive class is missing on your server.

Please contact your web hosting provider and ask them to install and activate ZipArchive.
```

**■ Error 2**
XML系のパッケージがないです

```
Required PHP components are missing.

WP All Export requires XMLReader, and XMLWriter PHP modules to be installed.

These are standard features of PHP, and are necessary for WP All Export to write the files you are trying to export.

Please contact your web hosting provider and ask them to install and activate the DOMDocument, XMLReader, and XMLWriter PHP modules.
```

## 対応...の前に前提

私の環境

AWS - EC2(Amazon linux)
PHP - PHP 7.2.x
WebS - Apache 2.4.x

## 対応

**■ Error 1**

```
$ sudo yum remove libzip
$ sudo yum --enablerepo=remi install php72-php-zip
```

1. Amazon core パッケージに入っているlibzipがコンフリクトするため、最初に削除
2. このコマンドで `php72-php-pecl-zip.x86_64` をインストール
3. Apache リロード
4. OK > 完了

**■ Error 2**

```
$ sudo yum -y install php72-php-xml
```

1. OK > 完了


## 最後に

私の環境では上記で解決しました。
GCEインスタンスの起動/停止をローカルマシンと同期する

この記事は，[マイナビ Advent Calendar 2019](https://qiita.com/advent-calendar/2019/mynavi) 3日目の記事となります.

# やりたいこと
クラウド(GCP)上のマシンを作業に使っています。作業を行っていない期間にインスタンスの停止をしないと料金がかさんでしまうのですが、いちいちコンソールを開いたりコマンドを叩くのはめんどうでした。
ローカルのPCを立ち上げるとGCEインスタンスが立ち上がり、シャットダウンすると同様にシャットダウンするようにしたい！
windowsのローカルグループポリシーを使うことで、簡単に設定をすることができました。

# ローカルグループポリシー
ローカルグループポリシーはその名の通り、ローカルなコンピュータに設定を行う方法です。
スタートアップ・シャットダウンスクリプトの設定や、パスワードの長さ制限などを行うことができます。

#手順

## Google Cloud SDKのインストール
[ここ](https://cloud.google.com/sdk/docs/quickstart-windows?hl=ja)を参考に。gcloudコマンドが実行できることを確認してください。

## ローカルグループポリシーの設定
[ここ](http://pineplanter.moo.jp/non-it-salaryman/2018/07/03/win10-gpedit/)を参考に。「ファイル名を指定して実行」で「gpedit.msc」を実行し、ローカルグループポリシーエディタを起動。今回は作業用ユーザーでのみスクリプトを実行したいので、「ユーザーの構成」→「Windowsの設定」→「スクリプト(ログオン/ログオフ)」を選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216940/9a4999ee-5716-031c-cba8-6cc480ba1e2e.png)
起動の設定方法は「ログオン」→「追加」から、「スクリプト名」にgcloud.cmdのパスを「スクリプトのパラメーター」に起動用のパラメータ(`compute instances start インスタンス名 --async`)を設定。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216940/40121ae4-fd38-7b9b-e97c-40af7b5b9e57.png)

ログオフのも同様に停止用スクリプト(`compute instances stop oz-sample --async`)を設定。
`--async`しないとインスタンスの起動/停止を確認するまでコマンドが停止しないため、2分ぐらい待つことになるので注意。

# 動作確認
GCEインスタンスが立ち上がっていることを確認
![起動中.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216940/ec2e5953-c239-b4ee-302b-53aa51b61941.png)
ローカルPCをシャットダウンして、スマホアプリで停止を確認
<img width="320" alt="停止.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216940/0e2f7b1e-0f50-defa-9e72-04149bc68a79.png">
ローカルPCを立ち上げて、スマホアプリ上で起動していることを確認
<img width="320" alt="再起動.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216940/7ebfed8c-da6d-fd5a-37d9-78e91240c57f.png">
ちゃんと起動/停止してくれているようです！(スマホアプリ便利)

# 雑感
ログオン・ログオフのスクリプトを設定すれば、ほかにもいろいろはかどるかもしれません。たとえばログオフ時に自動でタイムカードに打刻したりでしょうか？いろいろできそうですね。

# リンク
https://cloud.google.com/sdk/docs/quickstart-windows?hl=ja
http://pineplanter.moo.jp/non-it-salaryman/2018/07/03/win10-gpedit/
SwiftUIでNukeを使ってリモートの画像を表示する

# はじめに

SwiftUIを使い始めました。全てSwiftで宣言的にLayoutを記述でき、ReactiveXを使わなくてもデータをバインディングできて、すごくいいなと感じています！

さて、アプリを作るときは多くの場合画像ライブラリを使って画像を表示すると思います。私はNukeを使っているので、ここでは、Nukeを使ってリモートの画像を表示するSwiftUIのCustomViewを作成する方法を説明します。（Nuke以外も同じようにできると思います。)

# CustomView

```RemoteImageView.swift
import SwiftUI

struct RemoteImageView: View {
    @ObservedObject var remoteImage: RemoteImage
    var body: some View {
        Image(uiImage: remoteImage.image)
            .resizable()
            .aspectRatio(contentMode: .fit)
    }
}

struct RemoteImageView_Previews: PreviewProvider {
    static var previews: some View {
        RemoteImageView(remoteImage: RemoteImage(url: URL(string: "https://upload.wikimedia.org/wikipedia/commons/thumb/1/1c/JRE-E231-500-for-JRyamanote-line.jpg/2560px-JRE-E231-500-for-JRyamanote-line.jpg")!))
    }
}
```

# ObservableObject
ここで画像を読み込みます。
`image`が変わるたびに変更がpublishされ、上のCustomViewに反映されます。


```RemoteImage.swift
import Foundation
import SwiftUI

import Nuke

class RemoteImage: ObservableObject {
    @Published var image: UIImage
    
    private let url: URL

    init(url: URL, placeholder: UIImage = UIImage()) {
        self.image = placeholder
        self.url = url
        
        loadImage()
    }
    
    private func loadImage() {
        ImagePipeline.shared.loadImage(with: url) { [weak self] result in
            guard let self = self else { return }
            switch result {
            case .success(let response):
                self.image = response.image
            case .failure(let error):
                print(error.localizedDescription)
            }
        }
    }
}
```


# 使い方

SwiftUIのプロジェクトを作成すると自動生成される`ContentView`で、`RemoteImageView`を利用します。

```ContentView.swift
import SwiftUI

struct ContentView: View {
    var body: some View {
        RemoteImageView(remoteImage: RemoteImage(url: URL(string: "https://upload.wikimedia.org/wikipedia/commons/thumb/1/1c/JRE-E231-500-for-JRyamanote-line.jpg/2560px-JRE-E231-500-for-JRyamanote-line.jpg")!))
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}
```

表示はこんな感じです。山手線です。

![スクリーンショット](https://i.imgur.com/ZkytWjk.png)

以上です。
マンガでわかる Factory Method

![136D975D-2C6E-4860-A523-C1EBB89B976E.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11525/9f3c67b2-0fa4-5c1c-f064-6612df9e3a84.png)

ミニ四駆も実はなかなか難しいんだけど、基本キットや難しいところは模型屋のおじさんが準備してくれてるとおりにやればいいので、小学生でも参加できる体験教室ができるんですね。

おじさんが渡してくれるキットのように、作り方の大枠はあらかじめ準備された抽象 (ただしそれだけでは目的物は完成しない) とし、難しい工程はおじさんがやるってことになってる、そんな生成フレームワークを考えるんですよ。

体験教室の各参加者は、そのしくみを継承したファクトリになりきって、誰でもできるパーツを選ぶ工程 (簡単だけど重要) と、走行性能に関係しない塗装工程 (これもオリジナル感を出すのにとても重要) を、自分好みで実装したらオッケー。

これならオリジナルミニ四駆でも生産性が安定するし、模型屋さんもカスタムパーツじゃんじゃん売れますね。

Factory Method は、多様な具象クラスを抽象クラスのメソッドの穴埋めで完成させる [Template Method](https://qiita.com/tanakahisateru/items/2dbeb7e5bdd3af8ec3d0) のファクトリ版とも言えます。

で、ここ注意! 名前は似ているけれど、作り方より先に使い方に着目する [Abstract Factory](https://qiita.com/tanakahisateru/items/af019c95295469c6606b) とは違い、こっちは、終始作り方に着目するのがポイントですよ。この差がめちゃくちゃ重要。

意味が排他的な関係じゃない、というかむしろ補完関係なので、 「クライアントコードが求める Abstract Factory を、Factory Method パターンで提供する」なんてことも普通にあります。このコードは何のパターンか、ではなく、コードの関係に着目してどうパターンを見出すか、なのです。
Kotlin 1.3のCoroutineのコンテキストとディスパッチャ⑥（デバッグのためのコルーチンの命名）

# 検証環境
この記事の内容は、以下の環境で検証しました。

* Intellij IDEA ULTIMATE 2018.2
* Kotlin 1.3.0
* Gradle Projectで作成
* GradleファイルはKotlinで記述（KotlinでDSL）

# 準備
詳細は下記の準備を参照してください。
https://qiita.com/naoi/items/8abf2cddfc2cb3802daa

# Naming coroutines for debugging
[前回](https://qiita.com/naoi/items/0ea18effdbf29f591eee)に引き続き、[公式サイト](http://kotlinlang.org/docs/reference/coroutines/coroutine-context-and-dispatchers.html#naming-coroutines-for-debugging)を読み解いていきます。

今回のタイトルはわかりやすいです。
これまで、デバッグではスレッド名とIDが表示されることについて学習してきました。
多分、その部分の名前を変えられるのでしょう。

早速読み進めてみます。

> Automatically assigned ids are good when coroutines log often and you just need to correlate log records coming from the same coroutine. However, when coroutine is tied to the processing of a specific request or doing some specific background task, it is better to name it explicitly for debugging purposes. CoroutineName context element serves the same function as a thread name. It'll get displayed in the thread name that is executing this coroutine when debugging mode is turned on.

訳します。

> 頻繁にログをとり、調査する際、自動で付加されるIDはとても便利です。しかし、コルーチンが特定のバックグラウンド処理や特定のプロセスに紐付いている場合は、名前を明示的に指定することをお勧めします。
> [CoroutineName](https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-coroutine-name/index.html)クラスのコンテキスト要素はスレッド名と同じ役割をもちます。CoroutineNameを指定するとデバッグモードでスレッド名を変更することができます。

なるほど、確かにこれまではmainとか寂しい感じですが、それが変更できるということですね。
サンプルコードがあるので見てみましょう。

```kotlin
import kotlinx.coroutines.*

fun log(msg: String) = println("[${Thread.currentThread().name}] $msg")

fun main() = runBlocking(CoroutineName("main")) {
    log("Started main coroutine")
    // run two background value computations
    val v1 = async(CoroutineName("v1coroutine")) {
        delay(500)
        log("Computing v1")
        252
    }
    val v2 = async(CoroutineName("v2coroutine")) {
        delay(1000)
        log("Computing v2")
        6
    }
    log("The answer for v1 / v2 = ${v1.await() / v2.await()}")
}
```

CoroutineNameクラスのコンストラクタにスレッド名を指定していますね。
では、実際に実行結果がどうなるかも確認しておきます。

```text
[main @main#1] Started main coroutine
[main @v1coroutine#2] Computing v1
[main @v2coroutine#3] Computing v2
[main @main#1] The answer for v1 / v2 = 42
```

確かに、コンストラクタで指定した名前が表示されています。


# まとめ
このブロックで理解できたことは以下のことだと思います。

* CoroutineNameのコンストラクタにスレッド名を指定し、async関数の引数に渡すとスレッド名を変更できる
今がかえどき！？SketchからAdobeXDへ！

PhotoshopでデザインしていたのをこれからはSketchでデザインするぞ〜！となったのが、2018年2月。
そして、Sketchにも慣れてきた2019年9月。
また鶴の一声で今度はSketchからAdobeXDに移行することになりました。。。

# SketchからAdobeXDへの移行
SketchのデータはAdobeXDで開く事ができるので元のデータを開くのは何の問題もありませんでした。
が、画像に関しては部分的なサポートのみなので、崩れているものもありました。

**崩れたもの**
・アイコン：SVGで書き出すとネガポジが逆転しているものがあった。
・シャドウ：シャドウが別レイヤーになっていた。

▽ Sketchで作成していたデータをAdobeXDで開く方法
https://helpx.adobe.com/jp/xd/help/working-with-external-assets.html#sketch

▽ Sketch ファイルを XD で開くときにサポートされる機能一覧
https://helpx.adobe.com/jp/xd/kb/open-sketch-files-in-xd.html


# SketchとAdobeXDの違いを知る
### SymbolsとMaster Componentsの違い
まず、SketchのデータをAdobeXDで開いた時に戸惑ったのは、Sketchではレイヤーで分かれていたアートボードとSymbolsが同じ画面に表示されていたことです。Sketchで「Symbols」だったものは「Master Components」になっていました。

- **複製したパーツの色を一括で変更する**
**Symbols**：可能
**Master Components**：可能

- **複製した３つのパーツのうち１つだけ色を変えたい**
**Symbols**：Symbolsを階層分けし、変更したい色のパーツを作成して変更。
**Master Components**：方法は２種類。１つ目はパーツを選択し個別に変更する方法。ただし、例えば複製したパーツの色を変更した場合、Master Componentsにしたパーツの色を変更しても反映されない。２つ目はコンポーネントのステート編集機能で新規ステータスに色を変更したものを追加する方法。

- **パーツの管理**
**Symbols**：シンボル化したものはSymbolsレイヤーに複製される。
**Master Components**：アートボードで選択したパーツがそのままMaster Componentsになりそのままにしてしまうと、取れがマスターかわからなくなるため、自分で管理する必要がある。

### プラグイン
**Sketch**：サードパーティー製のプラグインマネージャーを使わないとインストールできない
**AdobeXD**：直接インストール

### プロトタイプ
**Sketch**：prottのプラグインをインストールし同期させて使用していましたが、同期させないと変更されないのでオンタイムの情報ではなくなってしまう。
**AdobeXD**：最新の状態のものを常に見る事ができる。

### 共同編集（2019年11月時点）
**Sketch**：不可能
**AdobeXD**：可能！！


# 最後に
正直なところ、せっかく使い慣れてきたSketchをAdobeXDに切り替えるのは少々抵抗がありましたが、切り替えて正解だったと思います。
なんといっても11月のアップデートはすごかった！

**AdobeXDで11月にアップデートされたもの**
- リアルタイム共同編集
- バージョン管理機能
- コンポーネントのステート編集機能
- ホバートリガー

 これがなされたことによって、Sketchの一歩先行くツールになったように思います。
11月にアップデートされた機能はまだちょっと不安定な部分もありますが、それは今後のアップデートに期待です。
機能的にもサポート面的にもオススメなのはAdobeXDです。
一度試してみてはいかがでしょうか？
Google APIとPythonで低コストRPA -表データをスライドに転記：ユースケース概要-

# 概要
本記事ではSpread Sheetsから抽出したデータをPythonで加工しSlidesに転記するユースケースを例に、実際にGoogle APIとPythonを組み合わせるとどんなことが自動化できるのかの一例を説明します。

※Spread SheetsはGoogle版Excel、SlidesはGoogle版Power Pointです

なぜ、Google APIとPythonを使用して自動化をしているかは以下の記事をご参照ください。
[Google APIとPythonで低コストRPA -はじめに-](https://qiita.com/ken0078/items/cfee26366a2cdc2a6328)

具体的なコードに関しては後続の記事にて記載します。



# ユースケース
### (概要)
1. あなたはあるPJのPMOです。
2. PJは3チーム(要件定義/プロトアプリ検証/インフラ検討)から構成されており、各チームのリーダーが日次で各タスクの以下の項目をガントチャート(図1)にて更新します。
 - 担当者
 - 期限
 - 進捗率
 - コメント
3. 毎週金曜日、PMOであるあなたはガントチャートを読み取り、週次進捗報告資料(図２)にチームごとの以下の項目を転記しPJ全体会議で共有しています。
 - チーム名
 - 担当者(各チームごとの全担当者)
 - 各チームの各タスクの進捗率(%)の平均値
 - 各チームで記載されているリスク(記入されていれば)
4. あなたは今までこの仕事を全て手動で実施していましたが、タスク量の増加に伴い、工数と転記時のミス軽減を目的としてRPAに取組む必要性が出てきました。

#### (図1：ガントチャート)
<img width="989" alt="Spread Sheet.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517973/533b5147-41af-5d23-0057-7f424a8c712e.png">


#### (図2：週次進捗報告資料)
<img width="1140" alt="Slides.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517973/dca23c0c-ef3f-654c-9946-7f90984186be.png">

# 本ユースケースにおける転記プロセスの詳細説明

以下の各項目を転記する各プロセスのロジックは以下の通りです。各項目内の数字(①〜④)は下図にナンバリングしています。

 - チーム名
  - 灰色のチーム名(Spread Sheets①)を確認し、Slides①に転記
 - 担当者(各チームごとのタスクオーナー)
  - 各チームごとに記入されている人名(Spreas Sheets②)を確認し、Slides②に重複が無いよう転記
 - 各チームの各タスクの進捗率(%)の平均値
  - 各チームの進捗率(Spread Sheets③)の合計を項目数で割った値をSlides③に転記
 - 各チームで記載されているリスク
  - コメントが入力されているところ(Spread Sheets④)を確認し、Slides④に転記

#### (図3：転記のイメージ)
<img width="801" alt="データの流れ.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517973/776819fe-880a-c018-5353-85d1873ee144.png">

# プロセスを自動化する際のアプローチ
こういったユースケースではGoogle APIとPythonを使用し、以下のプロセスに分解して転記を自動化します。
基本的にはGoogle APIはデータの読み書きのインターフェースに使用し、読み書きとデータ変換の全ての手順はPythonで実施します。

1. PythonでSheets APIとSlides APIをCallできるようセットアップする
2. PythonでSheets APIをCallし、図1のガントチャートから表データをpythonにすべて抽出する(二重list)
3. 前項2.で取得した表データをチームごとにグループ化する
4. 自動算出するロジックを作成/利用してデータを変換する
5. PythonでSlides APIをCallし、図2の週次進捗資料の"進捗サマリーリスト"の空欄に変換した表データを転記する

# 最後に
今回は一般的なPJでもルーティンワークとして発生しうる週次進捗報告をユースケースとして定義しました。自動化したプロセスの具体的なロジックは後続の記事にて紹介します。
VSCodeのスニペット機能をより便利にする方法

Visual Studio Codeのスニペット機能の中で、デフォルト設定のままだと不便だと感じる点の解消方法をまとめてみました。

## 1. 不要なスニペットを無効化する

何かの拡張機能を入れたら自分にとっては必要のないスニペットまで大量登録されて、入力補完候補がノイズだらけになって鬱陶しいみたいなことはありませんか？
そんな場合は以下の拡張機能を入れることで、拡張機能ごとにスニペットの有効・無効を切替可能になります。

[Control Snippets \- Visual Studio Marketplace](https://marketplace.visualstudio.com/items?itemName=svipas.control-snippets)

![Control Snippets](https://raw.githubusercontent.com/svipas/vscode-control-snippets/master/images/control-snippets.png)


## 2. ファイル名のパターン別にスニペットを登録する

Visual Studio Codeのスニペット機能はデフォルトで言語ごとにスニペットを作成することが出来ます。
ただしこれだと同じ言語でも、複数の種類のファイルが存在する場合にノイズだらけになって困ります。（例えば、Railsプロジェクトでマイグレーション用のスニペット登録をしたら、全ての`.rb`ファイルで入力補完として表示されてしまう等…）
本体にも要望としては出ているのですが、当分対応されそうな気配はありません。
[Snippets: Scope by specific file or pattern · Issue \#75955 · microsoft/vscode](https://github.com/microsoft/vscode/issues/75955)

そこで上記の問題を解消する為の拡張機能を作りました。

[Snippets by pattern \- Visual Studio Marketplace](https://marketplace.visualstudio.com/items?itemName=aki77.snippets-by-pattern)

現状ではsettings.jsonに対して、パターン毎にスニペットを記述していく形式になります。

設定例

```settings.json
{
  "snippetsByPattern.snippets": {
    "**/db/migrate/*.rb": {
      "add_column": {
        "prefix": "add_column",
        "body": [
          "add_column :${1:table_name}, :${2:column_name}, :${3|boolean,date,datetime,decimal,float,integer,primary_key,references,string,text,time,timestamp|}, null: false, default: ${4:value}"
        ],
      },
      "remove_column": {
        "prefix": "remove_column",
        "body": [
          "remove_column :${1:table_name}, :${2:column_name}"
        ],
      },
    },
    "**/*_spec.rb": {
      "it": {
        "prefix": "it",
        "body": "it '$1' do\n  $2\nend"
      },
      "describe": {
        "prefix": "describe",
        "body": "describe '$1' do\n  $2\nend"
      },
      "context": {
        "prefix": "context",
        "body": "context '$1' do\n  $2\nend"
      }
    }
  }
}
```

![Image from Gyazo](https://i.gyazo.com/d5b6115df75798bfc605b0a0b1ca67d2.gif)



## 3. 入力補完時にスニペットを優先して表示する

1と2をやることで入力補完時のスニペットによるノイズはほぼ無くなるので、そうすると入力補完時にはスニペットを優先して表示したくなります。
settings.jsonに`"editor.snippetSuggestions": "top"`と設定することで優先して表示されるようになります。

## 4. タブストップ中にも入力補完を有効にする

デフォルト設定のままだと、例えば`add_column :${1:table_name}, :${2:column_name}`というスニペットを選択して、タブで`${1:table_name}`まで移動した場合に入力補完が効きません。
settings.jsonに`"editor.suggest.snippetsPreventQuickSuggestions": false`と設定することで、タブストップ中にも入力補完が有効になります。

[![Image from Gyazo](https://i.gyazo.com/6068e4f7fa73b6dca2520c640b4680c9.gif)
EUC-JP環境でphpのstr_replaceを使い全角スペースの置換でバグが発生する件

#はじめに  

表題の通り、本記事は以下の状況にて発生する現象のTipsとなります。
- 文字コードがEUC-JPである環境で
- phpのstr_replace関数を使用し
- 全角スペースを置換した場合
- 想定していない単語まで置き換わってしまう

#発生した現象
DBに入っている値がなんだかおかしい、というところからスタートした。
「ァー」が「ゼ」に代わって保存されているらしい。
クリストファーがクリストフゼといった具合。
プログラムを追っていくと、どうやらDBに値を投入する前の処理がおかしくなっている模様。

```
$trimmed_str = str_replace("　", "", $str);
```

結論として、「全角スペースを置換すると'ァー'という文字列が影響を受ける」という現象だった。

#原因
環境の文字コードがEUC-JPであることが原因だった。
EUC-JPはマルチバイト文字であり、全角文字は複数の16進数の組み合わせによって表現される。
参考: https://qiita.com/mpyw/items/a8dba1b80fe68523b8eb

下記のURL先の表のようなマッピングがされている。
http://charset.7jp.net/euc.html
表に当てはめると、「ァ」は'0501'、「ー」は'01bc'となる。
そして全角スペースは'0101'...
要するに、'050101bc'から'0101'を除外していしまい、'05bc'、つまり「ぜ」に変換されてしまったのだ。

#対策
この状況を脱却するために、以下の対処をすることで解決できる。
##EUC-JPを脱却する
環境の文字コードをEUC-JPからUTF-8に変更することで解決できる。
UTF-8では先頭バイトと後続するバイトで領域が分かれているため、今回の現象のようにほかの文字の組み合わせと混同することがない。
原因の箇所で紹介させていただいた記事に詳細が書かれているので、詳しくはそちらを参照してほしい。

##マルチバイト文字対応の関数へ修正する
とはいえ、軽々に文字コードを修正できないケースもある。
（古の環境を修正せざるを得ないつらい状態の方もいるだろう）
この場合、マルチバイト対応の関数へ移行することで解決する。

```
$trimmed_str = mb_ereg_replace("　", "", $str);
```
mb_ereg_replaceはマルチバイト対応なので、文字の組み合わせをその文字と混同しない。
https://www.php.net/manual/ja/function.mb-ereg-replace.php

誤った説明の箇所があれば、コメントいただけると嬉しいです。
#curl で -X POST オプションを指定しなくても POST になる場合 ( Note: Unnecessary use of -X or --request, POST is already inferred. ) #API 

-d ( --data ) や --request をつけた場合は勝手に POST になるみたいだ。

重複指定すると教えてくれる。

```
$ curl -X POST -v "https://httpbin.org/post" -H "accept: application/json" -d "XXX"
Note: Unnecessary use of -X or --request, POST is already inferred.
*   Trying 34.193.212.251...
* TCP_NODELAY set
* Connected to httpbin.org (34.193.212.251) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* successfully set certificate verify locations:
*   CAfile: /etc/ssl/cert.pem
  CApath: none
* TLSv1.2 (OUT), TLS handshake, Client hello (1):
* TLSv1.2 (IN), TLS handshake, Server hello (2):
* TLSv1.2 (IN), TLS handshake, Certificate (11):
* TLSv1.2 (IN), TLS handshake, Server key exchange (12):
* TLSv1.2 (IN), TLS handshake, Server finished (14):
* TLSv1.2 (OUT), TLS handshake, Client key exchange (16):
* TLSv1.2 (OUT), TLS change cipher, Change cipher spec (1):
* TLSv1.2 (OUT), TLS handshake, Finished (20):
* TLSv1.2 (IN), TLS change cipher, Change cipher spec (1):
* TLSv1.2 (IN), TLS handshake, Finished (20):
* SSL connection using TLSv1.2 / ECDHE-RSA-AES128-GCM-SHA256
* ALPN, server did not agree to a protocol
* Server certificate:
*  subject: CN=httpbin.org
*  start date: Feb 17 00:00:00 2019 GMT
*  expire date: Mar 17 12:00:00 2020 GMT
*  subjectAltName: host "httpbin.org" matched cert's "httpbin.org"
*  issuer: C=US; O=Amazon; OU=Server CA 1B; CN=Amazon
*  SSL certificate verify ok.
> POST /post HTTP/1.1
> Host: httpbin.org
> User-Agent: curl/7.64.1
> accept: application/json
> Content-Length: 3
> Content-Type: application/x-www-form-urlencoded
>
* upload completely sent off: 3 out of 3 bytes
< HTTP/1.1 200 OK
< Access-Control-Allow-Credentials: true
< Access-Control-Allow-Origin: *
< Content-Type: application/json
< Date: Sun, 01 Dec 2019 23:00:21 GMT
< Referrer-Policy: no-referrer-when-downgrade
< Server: nginx
< X-Content-Type-Options: nosniff
< X-Frame-Options: DENY
< X-XSS-Protection: 1; mode=block
< Content-Length: 382
< Connection: keep-alive
<
{
  "args": {},
  "data": "",
  "files": {},
  "form": {
    "XXX": ""
  },
  "headers": {
    "Accept": "application/json",
    "Content-Length": "3",
    "Content-Type": "application/x-www-form-urlencoded",
    "Host": "httpbin.org",
    "User-Agent": "curl/7.64.1"
  },
  "json": null,
  "origin": "218.224.69.65, 218.224.69.65",
  "url": "https://httpbin.org/post"
}
* Connection #0 to host httpbin.org left intact
* Closing connection 0
```

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2798








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
サンダーバードとドローンバード

### 「サンダーバード」と「ドローンバード」

#### 戦隊ものはなぜカッコよい？

昔からヒーローもの映像作品では、チームが一丸となって悪や災害と立ち向かう「○○戦隊」や「〇×レンジャー」、などが単体、孤高のヒーローと並んで人気を博した。（ウルトラマンシリーズのように複合的になっている場合もあるが）

そのひとつにオジサンたちには人形劇で、最近では3DCGで再現された「サンダーバード」がある。

世界各地で発生した事故や災害で絶体絶命の危機に瀕した人々を、国際救助隊［IR］（International Rescue）と名乗る秘密組織がスーパーメカを駆使して救助する活躍を描く物語である（Wikipediaより引用）。

サンダーバードは9人のメインキャラクターが5機の機体に様々なメカを搭載・追加してミッションをこなしていく。
役割は、各機のパイロットとしてのトレーシー兄弟、開発者のブレインズ、エージェントのペネロープと運転手のパーカー。

さらにはトレーシー兄弟も

	・状況把握　　　　　　　　：スコット
	・救助メカ輸送・後方支援　：バージル
	・宇宙空間での調査・救助　：アラン
	・水中での調査・救助　　　：ゴードン
	・情報の司令塔　　　　　　：ジョン


秘密基地、宇宙ステーション、6輪リムジン（移動型基地？）などのロケーションと各メカの出動シーケンス（2号にメカが格納され、カタパルトとジェットブラストディフレクターが上がるシーンは何度見てもカッコよかった！）と役割の連携でミッションを達成する充実感が伝わってきたものだ。

<div align="center">
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539556/b30b6e66-bef7-a407-c7ae-bd8782306314.jpeg" alt="DRONEBIRD" title="DRONEBIRD">
</div>
<div align="center">
dronebird.orgより
http://dronebird.org
</div>


#### リアル版サンダーバード！

このアプローチを「ドローンバード」に当てはめてみると

	・司令官
	・情報伝達（隊内伝達、対外交渉）
	・オペレータ（シチュエーションによって、固定翼、回転翼、水中）
	・補助員（現場アシスト、安全管理、現地交渉）
	・開発（機体、公開サイト）
	・データ解析、出力（さらに使い方のレクチャーなども）

と分担されてくる。

メカについても長距離飛行、搬送飛行、水中、追加デバイスの拡張なんてのは、まさにここ数年のUAVに求められてきたスペックだ。（宇宙ステーションについては、衛星写真で代用ってとこでしょうか）
もし、サンダーバードとドローンバードの比較に差異や過不足があるとしたら、それらの要否を考えていくことがドローンバードを成長させるファクターになっていくのではないだろうか？

#### 3つの自然災害後の行動を通じて

この秋に日本列島を襲った3つの自然災害後のドローンバードのミッションに参加させていただき、その可能性、必要性を十分に感じました。

また、いつ来るかわからない、同等もしくはそれ以上の災害に対応・協力するための課題は山積みながら明確になって来ています。

「dronebird.org」のページトップにあるコピー

 **自然災害や政治的暴動などが起きた際に、被災状況を詳細かつ迅速に取得できる最新鋭ドローンを現地に送り、現地の災害状況をマップ上に反映し、人命救助や支援活動のサポートを行います。最新鋭のドローンを正確に操縦できるパイロットを、市民の中から育成する計画を立ち上げました。それが災害ドローン救援隊「DRONE BIRD」です。** 

この文中では「市民パイロットの育成」とありますが、それらを統括・制御・後方支援できる体制をつくり、自衛隊や消防・警察機関でもない一般市民である我々が、得意なやり方で貢献するプロジェクトとして活動協力していきたいと思います。
新卒デザイナーが、ちょっとだけコードが分かるようになった話

[Ateam Lifestyle Advent Calendar 2019](https://qiita.com/advent-calendar/2019/ateam-lifestyle)の8日目は株式会社エイチームライフスタイル @snd-07 が担当します！
初めてのQiita投稿です。ぜひ最後まで読んでください♩
## 自己紹介
2019年4月に入社しました。
マーケター、デザイナー、エンジニアで構成されたチームで、サイト改善をしています。 
デザイナーである私は、ビジュアルデザイン作成〜マークアップまでが業務範囲です。

今回は、**私がちょっとだけコードがわかるようになった経緯、やったこと**を話します:grinning:

## 伝えたい人
- 新卒
- コードあまり触らないデザイナー
- 上記の人と関わるエンジニア

## 入社したての私
- 入社したての頃は、一人で困らず書けるものはHTMLとCSSだけでした。
- 他の言語は、ほぼ呪文・・:imp:
- 「少しは勉強した方がいいよなぁ」と思いつつ、行動にうつせないまま過ごしていました。

## 今の私
- 半年で、ソースコードを見てもわかることが増えた！
- 今までだったらエンジニアに頼んでいた作業も、自分でやれるように。
- プログラミングに興味がわき、プライベートでも勉強したりするようになりました。

## どうやって今の私になったの？それは・・・
- **なんでもTRYしてみた**から！
- 最初はたった一行を変える所からはじめました。
    - チャレンジするハードルを下げる。
    - チャレンジできるようになってから、やるレベルを上げていきました。
    
## 例えば、こんなことにTRYしました
- ERB→Reactにコードを変更する作業
    - サイトをReactに変更することになり、調整が必要になった。
    - 「やってみてもいいですか？」と手をあげてみた。

- サイトのコード変更に応じての、e2eテストコード（Cypress）の修正
    - 今テストコードを書き直さないと、自動テストができない。
    - 「自分で直してみます！」と言ってみた。

## どうやってやりきったのか？
- 最初は、教えてもらうがまま＆調べたままに書く。
    - 素直にそのまま書いてみます。

- わからなくなったら、聞きにいく。
    - 他の例などを真似てみればできるものもあれば、真似するだけじゃうまくいかないこともあります。
    - ひとまずエラーが出たらgoogle翻訳してみました。
    - それでもわかなかった時は、聞きに行きました。

- 土日は、Progateで基礎を勉強しました。
    - 少しでも基礎的なことは知っておこうと思い、Progateの有料会員に登録。
    - 「あの時教えてもらったことはこれか！」、「これ、Progateでやった！」というタイミングがあり、やってよかったと思いました。

- 自分でやれることはやって、分からないことは詳しい人に聞くことで、やりきりました。

## エンジニアは、こんな風にわかりやすく教えてくれました
- 「～～っていう言葉はわかる？」「ここまでわかる？」と、段階を踏んで教えてくれました。
    - デザイナーは、１つ１つの単語から分からないこともしばしば。
    - どこまでなら分かるか？とコミュニケーションを取りながらだと、うまくいきました。

- 紙に書きながらだったり、実際のコードで説明してくれました。
    - 口頭だと、認識のずれが起きることもありました。
    - 説明にもらった紙を貰うことで、復習にもなりました。

- 「覚えるもの」なのか「背景まできちんと知るべきものなのか」分けて教えてくれました。
    - 「ここは、覚えるもの」「ここは、こういう仕組み」と、区別してくれるおかげで、「なんで？」の疑問が減りました。

- その場でコードを触りながら教えてくれると、再現性がありました。
    - どうやってエラーを見ているのかなどがわかったからです。
    - そうやって調べるんだな、という発見も。調べ方の幅が広がりました！

## そうやって、やってみた結果
- **教えてくれると、わかる！**:relaxed:
    - 感覚的に、理解できるようになりました。
        - １からは書けないけど、書いてあることをなんとなくわかるようになった、という感じ
    - もう、コードを見ても怖気付きません。

- できることが増えたので、普段の業務も幅が広がった。
    - 作業効率がアップした。スピードが早くなった。

- 自分が「できること」をやる→今「やるべきこと」をやる、という動きに
    - 小さい修正を、エンジニアの手を煩わせずに、デザイナーだけでやれるようになりました。

- エンジニアへのリスペクトがさらに強まった
    - こんなに（これ以上に）難しいことをいつもやっているんだ・・と実感することができました。
   
## 伝えたいこと
- とりあえず、やってみる！
    - やってみたら、意外とできることもあります。
    - できなかったとしても、必ず何か新しい学び・知識が増える。

- 実際に手を動かすことの大切さ
    - 聞いてるだけ・読んでるだけより、理解が深まることを実感しました。

## 今後
- もっともっと「できること」を増やしていきます！
    - 何でもチャレンジさせてくれる、教えてくれる環境に感謝し、大切にしていきます。
    - 教える方の立場になれるくらい、インプットをしていきたいです。
    - いつか誰かに相談されたらいいなぁ。。その時は、今を思い出して親身に応えたいです。

- チームみんなで最大成果を出す！:fire:
    - うまくチームで分担しながら良いサービスを作って行きます！

## まとめ
最後まで読んでくださりありがとうございました！:grinning:

[Ateam Lifestyle Advent Calendar 2019](https://qiita.com/advent-calendar/2019/ateam-lifestyle)の10日目は、@hurikake06 がお送りします。
明日もぜひ読んでくださいね！

“挑戦”を大事にするエイチームグループでは、一緒に働けるチャレンジ精神旺盛な仲間を募集しています。興味を持たれた方はぜひエイチームグループ採用サイトを御覧ください。
https://www.a-tm.co.jp/recruit/
新人Webディレクターに最低限必要なスキルはこれだ！ツールではなく、業務で行うべき3つのこと。

この記事は[Digital Identity Creative Div. Advent Calendar 2019](https://adventar.org/calendars/4714)の3日目です。

さて、ウェブディレクターという日本にしかない職業がありますが、なかなか定義も難しいものです。**案件の進行管理や課題管理、はたまた提案書や見積作成、折衝業務をこなしつつ、インフラ構築したりCMS構築したり、バグの原因を見つけたり、コード書いたり、見えない要件を果敢にさばいていくというのが、屈強なウェブディレクターによくあるパターン**だと思います。
しかし、最初からそんな人はいないので、この記事では**IT業界未経験でウェブディレクターを目指す人が最初に覚えるべき3つのこと**を書いていきます。

# 1. 課題を管理しよう
ディレクターの本質でもある「**課題解決**」をするために、日々増え続ける課題を管理することが重要です。
現在は[Redmine](http://redmine.jp/)や[Backlog](https://backlog.com/ja/)、[Trello](https://trello.com/)などさまざまな課題管理ツールが存在しています。これらのツールを使っても良いですし、エクセルや[スプレッドシート](https://www.google.com/intl/ja_jp/sheets/about/)でも構いません。重要なことは**課題を管理すること**なのです。
![スクリーンショット 2019-12-02 21.42.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237054/db38baa2-8087-cf02-9ae9-fc320d0bf66a.png)
制作チームでは、入力する項目は少なめにしています。

規模がある程度になってくる場合は、Backlogを使用する事が多いです。規模が小さい案件や、課題が少ない場合は、課題管理票がサクサク利用できて便利です。起票日とか起票した人がわからない！という方は、追加すればOKです。


# 2. スケジュールを管理しよう
進行管理や進捗管理に代表される日付ベースの管理です。なにをいつまでに行うかを計画し、それが実行されているかどうかをチェックします。**自分たちの作業だけではなく、クライアントの作業も入れておくと、確認期間が抜けることもなく、いい感じにスケジュールを俯瞰する**ことができます。
また、巷では**WBS(Work Breakdown Structure)**というタイプの進行管理がありますが、あまりおすすめしません。ウォーターフォール型の開発ではとても有効ですが、現在のような圧縮できるところは圧縮して進める開発方法では、概算のスケジュールと、直近3ヶ月の詳細スケジュールがわかれば十分ではないかと思います。
おすすめのツールは、[brabio](https://brabio.jp/)です。操作がとてもかんたんで、スケジュールの変更が簡単にできます。
![スクリーンショット 2019-12-02 21.49.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237054/921737f2-e77a-f631-ec2a-7b863f85210d.png)
brabioは本当に使いやすいツールなので、未経験の方でも直感的に利用できます。**スケジュールは作ることよりも変更に強いツールがおすすめ**です。

# 3. アジェンダを作ろう
クライアントとの会議、社内の会議、それぞれに共通する事柄としてはアジェンダを作って抜け漏れなく会議をしようということです。アジェンダのない会議は開催しない、というくらい自分では徹底することもあります。
というのも、**会議は複数人が参加し、参加者の大切な時間を過ごしています。5人で2時間の会議をした場合、5*2=10時間の価値を見出す必要**があります。有意義な会議を行うためにも、会議前にアジェンダを作るようにしましょう。
アジェンダは、リスト形式でまとめることで、それぞれの議題の構造化が見えてきます。また、追加や変更しやすいのもリスト型の利点ですね。

#### 参考
1. プロジェクト
    1. todoの確認
    2. スケジュールの確認
    3. 課題管理票の確認
2. インフラ環境について
    1. インフラ選定結果のご報告
    2. ベンチマークのご確認

こんな感じでリストで書いておくと、誰がみても議題がわかりやすくなります。アジェンダに、そのまま議事録を書いていくと便利ですし、Googleドキュメントなら会議終了とともに議事録作成完了→共有ということもできるので大変便利なのです。

# 最後に

いかがでしたでしょうか。ウェブディレクターは多忙を極めることも多い職業ですが、案件を回すためには欠かせない人たちです。また、案件を回せない人にディレクションを教えるのではなく、未経験でも案件を回せる素質を持った人を育てるフェーズがつづているいるのも事実です。
デジタルアイデンティティでは、ウェブディレクター、アシスタントディレクターを募集していますので、ご興味を持っていただいた方はぜひぜひご応募をお待ちしております！

[デジタルアイデンティティ採用情報 ウェブディレクター](https://www.wantedly.com/projects/156939)
libphonenumberで国際電話番号をバリデーション

今年もAdvent Calendarの時期なので、久しぶりに記事を書くことにしました。

今回は、海外の方向けの、問い合わせフォームを作成した際に、
国際電話番号をjavascriptで、バリデーションした際に色々調べたことを、
まとめたいと思います。

<h2>国際電話番号とは?</h2>
日本から海外の固定電話・携帯電話にかける場合、
相手の国番号を先頭に指定する必要があります。(日本の国番号は+81)

その国の国番号を含めた電話番号が、国際電話番号となります。
国際電話番号の決まりについては、[こちら](http://eedu.jp/blog/2015/02/14/call_philippines_from_japan/?gclid=Cj0KCQiAiZPvBRDZARIsAORkq7dOH-GCvvg4WYA5mdYDbN62086_gDX0FkRbuaIoqplB4-08aFQ_VYsaAoKvEALw_wcB)の記事が、とても参考になりました。

<h2>国際電話番号のバリデーション</h2>
最初は国番号を含んだ文字列を、正規表現で判定しようと思ったんですが、
世界各国の国番号の判定や、桁数の法則など、調べてもわからないことが多く、途方にくれていたところ、
[こちら](https://qiita.com/the_red/items/fcedd5033530b7ff7ee7)の素晴らしい記事で紹介されている、`libphonenumber`を使えばなんとかなりそうなことがわかりました。

導入方法などは上記記事でわかりやすく、書いてくれているので割愛します。

上記記事内では日本国内の電話番号をバリデーションしていますが、
↓で国際電話番号のバリデーションも可能になっています。

```javascript
var internationalCallCheck = function (value) {
  return libphonenumber.isValidNumber(value)
}

internationalCallCheck('+81928321133'); // true
internationalCallCheck('+87928321133'); // false +87の国番号は存在しない
```

`isValidNumber`の第2引数に「'JP'」などを国を識別するコードを渡すと、
国番号を省略した場合の、バリデーションが有効になります。

```javascript
libphonenumber.isValidNumber('0928321133') // false

libphonenumber.isValidNumber('0928321133', 'JP') // true
libphonenumber.isValidNumber('0928321133', 'CN') // false
```

ちなみに、第2引数を指定していても、有効な国際電話番号であれば、
指定している国コードに関係なく、バリデーションを通すようです。

```javascript
libphonenumber.isValidNumber('+81928321133', 'JP') // true 'JP'は日本
libphonenumber.isValidNumber('+81928321133', 'CN') // true 'CN'は中国
```

また、`isValidNumber`は、ハイフンが適切な箇所に入ってない場合や、
市外局番の先頭にゼロがない場合でも、バリデーションを通すようになっています。

ハイフンに関しては、上記記事にある通り、`isValidNumber`でバリデーションチェックした後、
`AsYouType()`を使ってフォーマットしてあげる事で、きれいに区切られた電話番号が取得できます。

```javascript
var internationalCallFormat = function (value) {
  return new libphonenumber.AsYouType().input(value);
}

internationalCallFormat('+819--2----8321--133'); // '+81 92 832 1133
```

ゼロを許容してしまうのは、[こちら](http://eedu.jp/blog/2015/02/14/call_philippines_from_japan/?gclid=Cj0KCQiAiZPvBRDZARIsAORkq7dOH-GCvvg4WYA5mdYDbN62086_gDX0FkRbuaIoqplB4-08aFQ_VYsaAoKvEALw_wcB)の記事にもありますが、国際電話番号を使って国外に電話するときは、
市外局番先頭の0は省略するという決まりがあるため、国際電話番号をバリデーションする際は、正しい動きとなるようです。

間違いやもっとこうしたほうが良いなどありましたら、
ご指摘いただけると嬉しいです！
Amazon SNS → AWS Lambda → Slack → AWS ChatbotでAWSコマンドを実行する

AWSからSlack上でAWSコマンドが実行できる、という発表があったので、直接入力ではなく他のサービスからの書き込みでも対応しているのか確認してみた。

https://aws.amazon.com/jp/blogs/devops/running-aws-commands-from-slack-using-aws-chatbot/

![Product-Page-Diagram_Chatbot-How-it-Works_Console_FINAL@2x_cropped-1024x433.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102769/c5a1a90c-1985-4b1d-8e41-1d0ef3ff1f29.png)

# 事前準備はスキップ
SlackとAWS Chatbotの紐付け設定などは本家サイトにあるのでスキップ。

# Lambdaの実装
こんな感じのシンプルなもの

```python
import json
import os
import logging
import urllib.request

logger = logging.getLogger(__name__)

SLACK_URL = os.environ['SLACK_URL']

def lambda_handler(event, context):
    logger.info('Start Slack message sending.')
    message = event['Records'][0]['Sns']['Message']

    params = {
        "text": message,
        "icon_emoji": ":heavy_exclamation_mark:"
    }
    text = "payload=" + json.dumps(params)
    request = urllib.request.Request(
        SLACK_URL, 
        data = text.encode("utf-8"), 
        method="POST"
    )
    with urllib.request.urlopen(request) as response:
        response = response.read().decode("utf-8")
        return response
```

`message`変数にはSNSから送られてきたメッセージが入っているので、それを抽出しています。eventに格納されるSNSからのデータは以下の通り。

```json
{
  "Records": [
    {
      "EventSource": "aws:sns",
      "EventVersion": "1.0",
      "EventSubscriptionArn": "ARN内容",
      "Sns": {
        "Type": "Notification",
        "MessageId": "メッセージID",
        "TopicArn": "SNSのトピックARN",
        "Subject": "タイトル",
        "Message": "メッセージ内容",
        "Timestamp": "送付時刻",
        "SignatureVersion": "1",
        "Signature": "XXX",
        "SigningCertUrl": "https://XXX",
        "MessageAttributes": {}
      }
    }
  ]
}
```

# SNS側の設定
以下のようなSNSの設定をしてLambdaに情報を流すようにする。（とてもシンプルで、特に特殊な設定はしていないです）

![スクリーンショット 2019-12-03 8.54.54_deco.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102769/fe1cc848-ef75-ceba-fb8b-e9829bd46579.png)

# メッセージをSNSから送付してみる
以下のようなメッセージをSNSからPublishしてみます。

```sh
<@aws> help
```
※```<XXX>```はSlackでメンションを送る際の記法。

しばらくするとSlack側にメッセージが投稿され、AWSコマンドの発行結果が返ってきました。

![スクリーンショット 2019-12-03 8.54.54_deco.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102769/a816332d-c847-2598-32df-08f42b5300e3.png)

# まとめ
簡単にですが、AWS Chatbotを通じてAWSコマンドを発行することは、Slackへの他サービスからの書き込みでもできることが確認できました。Slack -> AWS Chatbot -> AWSコマンド発行の可能性がまた広がりました。
matrixを用いてlocalのコンストレインを再現する

[前回の記事](https://qiita.com/YokoU/items/c7cf4da57e07acca679c)では、worldMartixを用いてコンストレインを再現していました。
今回は、localのmatrixでコンストレインを再現してみることにします。

# 支点における目的箇所の位置・回転をlocal座標を用いて再現する

具体例がないと、この見出しは、なんのこっちゃ？？？　なので、お題を設けたいと思います。
**お題："spineD_prx"支点における"hand_prx_L"(左手首)の位置と回転情報を、locatorを用いて再現する**

## multMatrixを用いてlocal座標のmatrixをつなぐ
```
import pymel.core as pm
pm.createNode("multMatrix", n=u"hand_prx_L_spineD_prx_multMat")
```

transformノードのlocal座標を意味するアトリビュートは.matrixです。
hand_prx_Lからさかのぼってshoulder_prx_Lまでのlocal座標を足していくと、
おのずとspineD_prxにおけるhand_prx_Lの位置関係がmatrixで取得できるわけです。

下図のように各transformのmatrixをmultMatrixのmatrixIn[0]からつないでいきます。
![2018-12-12_14h27_45.png](https://qiita-image-store.s3.amazonaws.com/0/324697/f8fc7b06-01bc-74e3-f028-cb0f9de03b13.png)

ここで重要なのは、さかのぼった順番に.matrixInへコネクションをする、という事です。

## decomposeMatrixでtranslate, rotateを出力しやすくする
前回の記事で既にお分かりかと思いますが、
matrixのままだと位置・回転情報を出力しにくい為、decomposeMatrixを用います。

```
pm.createNode("decomposeMatrix", n=u"hand_prx_L_spineD_prx_decMat")
```
![2018-12-12_14h43_08.png](https://qiita-image-store.s3.amazonaws.com/0/324697/102bd9fc-d97c-8945-7ce9-e25319c27b9f.png)

## locatorへコネクト！
decomposeMatrixから下図のようにhead_pos_Lへコネクトを行う
![2018-12-12_14h50_36.png](https://qiita-image-store.s3.amazonaws.com/0/324697/7441821f-dbc0-7dea-0e63-ef11cffba8ed.png)


## 結果
hend_pos_Lを見ると、なんだか関係のない場所にあるように思えます。(下図)
![2018-12-12_15h23_28.png](https://qiita-image-store.s3.amazonaws.com/0/324697/decb8d7e-9577-757c-5541-23fab13219c0.png)
これはspineD_prxを支点として取得したmatrixの結果なので、spineD_prxの位置が原点だとすると、そうなることになります。

理解できない場合は、spineD_posをspineD_prxの位置に用意し、hand_pos_Lを子供にすれば一目瞭然です。(下図)
![2018-12-12_15h26_57.png](https://qiita-image-store.s3.amazonaws.com/0/324697/a64f5f00-cce8-0825-5dc6-e66a73378715.png)

jointの最上位にあたる箇所、hipTranslation_prxを移動させてみましょう。
hand_pos_Lはついてきません。(下図　赤い箇所)
![2018-12-12_15h29_06.png](https://qiita-image-store.s3.amazonaws.com/0/324697/169d4660-6fc8-f62b-bc68-258c5021dc7a.png)

shoulder_prx_Lを回転させてみましょう。
![2018-12-12_15h36_22.png](https://qiita-image-store.s3.amazonaws.com/0/324697/36e3bf96-4b2b-b1c1-abe3-c4e3cb29963b.png)

hand_pos_Lも同期して回転しました。

## 何に使うか？
この仕組み、様々な使い道があると思いますが、私はこれをデフォームやシミュレーション要素を含むリグでよく用いています。

なぜなら、local座標系でmatrixを使うという一見カッコいい小技が使えるからです！
...うそです、ごめんなさい。
それだけの面倒な小技、できることならば私は使いたくありません。

これを使う大きな要因の1つの、ある条件下におけるエラーを除外するためです。

例えば、原点からのリグへの位相が大きい場合、Mayaの計算制度が落ちてパーツなどがズレる事があります。皆さん経験ありませんか？
それを回避するためです。

映像系の制作過程ではよく起こることですが、
ゲーム系ではどうなのでしょう?
ゲームだとその物全体をフィールド上で動かす要素は別となってると思うので、そういうエラーには陥らないのかな?
特に宇宙や大海原のような広大な敷地でアニメーションする必要がある場合、
髪の毛が頭皮からズレてたりするんですよね。。。

そんなエラーを回避するのにmatrixの理解が必要なんて、ですよね！

12月10日に公開されたMaya2020のヘルプでは、
offsetParentMatrixのinput行列が追加されると記載がありました。
恐らく、今回記載したdecomposeMatrixを介すことなく、直接matrixでトランスフォーム制御ができるという事なのかな。少し楽になりそうですね!

そういう意味では超ギリギリセーフの記事となってしまいました（汗）
RustのPostgreSQLでエラーを扱う

# 目的
RustでPostgreSQLのエラーを扱いたい。特にsql_stateは自前のコードを定義して使うことが多いので、個人的に重要視しています。

# プログラム
```rust:Cargo.toml
[package]
name = "pg"
version = "0.1.0"
edition = "2018"

[dependencies]
r2d2_postgres = "^0.14"
```

```rust:main.rs
fn main() {
    let manager = r2d2_postgres::PostgresConnectionManager::new(
        "postgres://user:pass@localhost:5432/test",
        r2d2_postgres::TlsMode::None).unwrap();
    let pool = r2d2_postgres::r2d2::Pool::new(manager).unwrap();
    let conn = pool.get().unwrap();
    let sql = r#"
        SELECT * FROM dummies
    "#;
    let rows = conn.query(sql, &[]);
    if let Err(err) = rows {
        print_typename(&err);
        println!("debug\n{:?}\n\nstring\n{}\n\ncode\n{}\n\nmessage\n{}\n\ndetail\n{}",
            err,
            err,
            err.code().map(|sql_state| sql_state.code()).unwrap_or(""),
            err.as_db().map(|db_error| &db_error.message).unwrap_or(&"".to_string()),
            err.as_db().and_then(|db_error| db_error.detail.as_ref()).unwrap_or(&"detail not found".to_string()),
        );

    }
}

fn print_typename<T>(_: &T) {
    println!("type\n{}\n", std::any::type_name::<T>());
}
```

```text
type
postgres_shared::error::Error

debug
Error(Db(DbError { severity: "ERROR", parsed_severity: Some(Error), code: SqlState("42P01"), message: "relation \"dummies\" does not exist", detail: None, hint: None, position: Some(Normal(24)), where_: None, schema: None, table: None, column: None, datatype: None, constraint: None, file: Some("parse_relation.c"), line: Some(1194), routine: Some("parserOpenTable") }))

string
database error: ERROR: relation "dummies" does not exist

code
42P01

message
relation "dummies" does not exist

detail
detail not found
```
Fullstaq Ruby を投入してみた（結果編に続く）

こんにちは。

以前見かけた [Fullstaq Ruby](https://fullstaqruby.org/) を試してみようと思います。

## Fullstaq Ruby

### 触れ込みについて

[公式サイト](https://fullstaqruby.org/) の触れ込みでは

> Ruby, optimized for production
> A new Ruby distribution, with the Ruby you know and love, but better.

本番環境向けに調整されたより優れたRubyとのことです。

> Less memory — save 30-50%

メモリ消費を3～5割抑え

> Faster

高速で

> More secure

セキュアで

> Fully open source, based on MRI

MRIベースの完全なオープンソース

とのこと。

### 作者について

サイトをみていると、創設者は Hongli Lai と Fullstaq という会社のようです。
Hongli Lai はそこに記載があるように、 Passenger や Ruby Enterprise Edition の作者だそうですね。

最近の方は Ruby Enterprise Edition をご存じないかもしれません。

Ruby 1.8系の時代にメモリ使用率が激減することで、よく本番環境で用いられていたRuby処理系でした。

- [Ruby Enterprise Edition](http://www.rubyenterpriseedition.com/)
- [Ruby Enterpriseエディションが終わる。Phusionは、Passengerに注力。](https://www.infoq.com/jp/news/2012/03/ruby-eee-eol/)

Rubyおじさんとしては「まじか、使えるんじゃないか」という気持ちにもなってきますね。

### しくみ

週刊Railsウォッチで取り上げられていたのでそちらをお読みください。

[週刊Railsウォッチ（20190821-2/2後編）11のgemにバックドア、ruby-jp Slackがとてもアツい、Fullstaq Rubyでチューンアップ、HTTPサービス監視chaoほか](https://techracho.bpsinc.jp/hachi8833/2019_08_21/79266#3-3)

## 導入

Server Edition 、Container Edition 、Heroku Edition と提供する予定のようですが、2019年12月3日現在は Server Edition のみのようです。

[GET STARTED - Installation](https://github.com/fullstaq-labs/fullstaq-ruby-server-edition/blob/master/README.md#installation) に RHEL/CentOS と Debian/Ubuntu のパッケージマネージャを使った方法が載っているので、そちらを読んで導入してみます。

今自由にできる環境がDocker環境しかなかったので、既存のDockerfileを手直しして入れてみました。
2019年12月3日現在、[最新の Debian 10 buster 向けのパッケージは用意されていない](https://dl.bintray.com/fullstaq/fullstaq-ruby-apt/)ようだったので、Debian 9 stretch をベースに使いました。

```Dockerfile
FROM buildpack-deps:stretch

ENV RUBY_VERSION 2.6.5

# Install dependencies
RUN apt-get update -qq \
  && apt-get install -y gnupg apt-transport-https ca-certificates curl

RUN echo 'deb https://apt.fullstaqruby.org debian-9 main' > /etc/apt/sources.list.d/fullstaq-ruby.list \
  && curl -SLfO https://raw.githubusercontent.com/fullstaq-labs/fullstaq-ruby-server-edition/master/fullstaq-ruby.asc \
  && apt-key add fullstaq-ruby.asc \
  && apt-get update -qq \
  && apt-get install -y fullstaq-ruby-${RUBY_VERSION} \
  && apt-get clean

ENV PATH $PATH:/usr/lib/fullstaq-ruby/versions/${RUBY_VERSION}/bin

# (省略）
```

## 結果

まだデータ不足。
１、２週様子を見て載せます。

動作には問題なく、テストはすべてパスし、エラートラッカーには特に情報は上がってきていません。
3にまつわる話

LIGアドベントカレンダー一日目を華々しく飾ってくれたまさくにさんの記事は読んでいただけただろうか。
とてもいい記事だったね。しかし、もしかしたら勘のするどい方は気付いてしまったかもしれない。

そう、このアドベントカレンダーにはポツポツと空席が存在している。
まるで売れ残ってパサパサになってしまったスーパーの刺身のようにね。

特に前半に空白が多い。まぁしようがない。後半の方が記事を書く時間を確保できるのだから。
私も12日に書きますねと宣言をして、じっくりくだらない記事でも書こうかしらなんて余裕ぶっていたのだけれど、
パサパサの刺身達が売れる気配はいっこうに無い。

それならばと、サイバイマンに立ち向かうヤ○チャよろしく「俺にやらせてくれ」と息巻いて本日の枠を任せてもらったのだ。
しかし、言ってみたはいいものの特に書けるようなネタがあるわけでもない。
「どうしたものか」と考えながらネタ探しという名のネットサーフィン。
気づけば公開当日の午前3時をまわろうとしている。そうだ「3」という数字について書こうと考えていたのだった。



以下、本文。


## はじめに
「3」という数字にどのような印象をもっていますか？
Googleで検索してみると、『安定感』や『中立的』など【均衡を象徴する存在】というイメージが強いようです。
『椅子の脚の数は3本がもっとも安定する』というのは有名な話しですね。
『三権分立』のように相互間の抑制・均衡を図るシステムなど、バランスがとれた多くの構成は3つから成り立つモノが多いようです。

さらに、『朝・昼・夜』や『過去・現在・未来』など、時の概念を構成する言語も3つから成り立つモノが多くあります。
また、我々が存在する空間が3次元で成り立っていると一般的に考えられています。
こういった事から時間と空間には「3」という数字が大きく関わっている気がします。
そして時間や空間の話しになると宇宙まで広がっていきそうですね。
平日の深夜に考察するには少々大きなテーマになってしまいそうなので、このあたりで時空間についてはstashしておきます。


## システム環境における「3」
何かしらのシステムを開発するにあたり、システムを動作させるための環境を準備しなければなりません。
運用方法や予算等によって変わってくると思いますが、３つの環境を準備するのが良いとされています。
3つの環境はそれぞれの用途に合わせ、下記のように呼称されています。

### プロダクション環境：Production Environment
実際にシステムが稼動するための環境

### ステージング環境：Staging Environment
プロダクション環境と同じ構成（が望ましい）で最終検証するための環境

### 開発環境：Develop Environment
開発を進める中で確認をするための環境


プロジェクトによっては上記以外にも別途検証環境等の準備をする事もあると思いますが、コスト面等を考慮するとベターな構成になっていると思います。
また、予算の都合のためステージング環境と開発環境を一つにしてしまう場合もあります。
最低限、本番環境ともう一つ環境があればなんとかなる場合もありますが、３つの環境が揃っていると安定した運用が可能になると思います。

## おわりに
本当は「3」という数字の魅力に迫る記事を投稿したかったのですが、お茶を濁すような記事になってしまった事を反省しています。
そして、アドベントカレンダーにちなんで『３卓ロース！』みたいなくだらないオチに走らないように必死の形相で7時を迎えました。
もちろん、自爆したサイバイマンにやられたヤ○チャさんのポーズをキメながら。。。
【Android】license-tools-pluginで出力したlicenses.htmlで、URLが長いと改行位置がずれてしまう

#はじめに
アプリでライセンス表示を埋め込む際、色々な方法があるかと思います。
今回クックパッドさんが開発された<b>[license-tools-plugin](https://qiita.com/nissiy/items/b0c98cf210b7fe8833a7)</b>を使わせていただくこととなり、
実際に表示まで行なった際に表題の問題が発生してしまいました。
その原因と対応方法を自分用のメモとして残しておきたいと思います。

<b>license-tools-plugin</b>の詳細な使い方については、
他の方がわかりやすくまとめられている為、本記事では割愛させていただきます。
※[あの素晴らしいlicense-tools-pluginをもう一度](https://qiita.com/toranoko0518/items/dff1d1ad0afa9f5a733f#%E5%BF%85%E8%A6%81%E3%81%AA%E9%A0%85%E7%9B%AE%E3%81%8C%E4%B8%8D%E8%B6%B3%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B)

#どういう現象か
以下のように、横幅（width）より、リンクの文字列が長くなってしまった場合、
少しはみ出た状態での改行になってしまいます。
<img width="300" alt="ずれ.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106030/e93050fd-83b3-d72b-70f3-c336d8546b42.png">

#原因と対応方法
出力したlicenses.htmlを確認してみると、はみ出ていた部分は以下のようになっていました。

```html
<p><a href="https://developer.android.com/topic/libraries/architecture/index.html">https://developer.android.com/topic/libraries/architecture/index.html</a></p>
```

HTMLをあまり詳しく知らなかったため、調査したところ、CSSの設定が足りていないことが原因であることが判明。
※[URLが自動改行してくれない問題](https://qiita.com/gonshi_com/items/b38780d1f3e31d1c0a84)

`<style></style>`の中に、`<a>`タグ用の設定として以下を追記することで、ずれなくすることができました。

```html
<style>
  a {
  word-break: break-all;
  }
</style>
```

#補足
尚、出力するたびに上記の設定を追記する必要があるため、面倒であるのと対応するの忘れそう…
流石に他にlicense-tools-pluginを使っている方も同じ現象に陥っているのでは…？と思い、
公式のGitHabリポジトリを確認すると、なんと以下のプルリクエストを発見。
https://github.com/cookpad/license-tools-plugin/pull/124

出力時に以下の設定を追加するようにされており、
手動で試してみたところ、こちらでもずれが発生しないことを確認できました。

```html
  a {
  overflow-wrap: break-word;
  }
```

ですので、クックパッドさんがlicense-tools-pluginを次回アップデートされる際には修正されたものが上がってくるかと思います。

修正版が上がるまでは面倒ですが、以下のどちらかを手動で追記して対応するようにしましょう。
word-break: break-all;
overflow-wrap: break-word;
ファクターについて

# ファクター投資
マーケットのファクター（要因）を見つけ出し，そのファクターが大きい銘柄に投資することで適当に投資するよりも多くの利益を得ることを考えるのがファクター投資です．
株価のチャートなどで投資判断を決定するテクニカル分析よりも，長期的な投資決定に利用します．

# アノマリーとファクターの違い
市場では9~10月株安，サザエさん効果，ジブリ法則など多くのアノマリーがあります．アノマリーとファクターの違いは，それらに「持続性」「普遍性」「安定性」が存在するかです．（ファクター投資入門より）

# 有名なファクター
有名なファクターモデルにはFama・Frenchの3ファクターモデルがあります．
3ファクターモデルでは，マーケットインデックス，サイズファクター，バリューファクターを用いて解析しています．ここではサイズファクター，バリューファクターを見ていきます．

## サイズファクター
サイズファクターは簡単に言うと小型株は大型株よりも大きい利益をもたらすのということです．リターンとリスクはトレードオフの関係にあるため，大きいリターンを得るにはそれなりのリスクを背負う必要があります．サイズファクターでは，小型企業は大企業と比べて潰れやすいです．その会社が潰れるというリスクに対する期待リターンの恩恵によってサイズファクターが効いてきます．
サイズファクターは小型株:Smallと大型株:BigからSMB(Small Minus Big)と書きます．

## バリューファクター
割安株は割高株よりも大きい利益をもたらすのがバリューファクターです．バリューファクターはPBR(Price Book-value Ratio)の逆数で計算できます．つまり，1株あたりの純資産を株価で割ります．


# 実験
日本市場において実験してみます．
## SMB
SMBの月足の収益率です．
<img width="712" alt="Screen Shot 2019-12-02 at 12.39.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290596/f2ad9847-03ae-746a-2641-d121f1401ce2.png">

累積収益率も見てみます．
<img width="707" alt="Screen Shot 2019-12-02 at 12.39.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290596/13b30c6f-70c2-afb2-1b54-c35787bd625a.png">

累積収益率をみても時期によってはプラスの期間やマイナスの期間が入れ替わるので，サイズファクターは日本市場では効かないのだと思います．

## HML
HMLも同様にプロットしてみます．
<img width="709" alt="Screen Shot 2019-12-02 at 12.42.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290596/b8ff354c-2e7f-23d2-38bb-2ef72cc41513.png">


<img width="717" alt="Screen Shot 2019-12-02 at 12.43.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290596/09ec9f21-5f34-1869-81f1-2722bb5e797f.png">

HMLは日本市場ですごく効いていることが分かります．バリュー株を選択するのとしないのとで，10年間で2倍近く変わります．

# まとめ
アメリカの市場と比べて日本市場においては3ファクターが効きづらいと言われていますが，バリューファクターは日本市場でも役に立つことが分かりました．

明日はMaruyamaくんによる「Kent Beckの"Test-Driven Development by Example"を読んだので要約する」です。
シェルスクリプトについてメモ

シェルスクリプトについてメモ。

# シバンについて　#!
シェルスクリプトを作成する際は、
冒頭に #! で始まる行を追加する必要がある。これはシバンと呼ばれている。


```./test.sh
#!/bin/bash
mkdir test
```

### #!/bin/bash という行は、/bin/bashで動かすという宣言をしている

このシェルスクリプトの実行方法は、こちら

```
./test.sh
```

シェルから実行命令を受けたLinuxカーネルが、対象ファイルの先頭を確認して
もし#!があったら、その後に書かれたコマンドを実行するよという流れ

実質的には

```
/bin/bash ./test.sh
```
このようなコマンドラインとして実行される




#sourceコマンドでファイルを実行
その他にsourceコマンドを利用して、シェルスクリプトを実行することができる。

```
source ./test.sh
```

sourceコマンドは、指定したファイルの内容をそのままコマンドラインとして実行する。


シバン（#!) が表記されていても、# はコメントアウトとして扱われるので無視される


ちなみにsourceコマンドと同様の意味をもつ、ドットコマンドもある

```
. ./test.sh
```

ドットだと、見落としやすいので、sourceコマンドの方がベターかもしれない。

こういう基本はしっかりと抑えたい。
Kotlinの変数宣言

Kotlinでの変数宣言を超ざっくりまとめてみました。

```Main.kt
fun main() {
    // var 変数名: 型 = リテラル　の形が基本的な形
    var a: Int = 1

    // varは再代入可能な宣言
    a = 3 // このように再代入可能

    // varではなくvalも使える。valで宣言した場合は再代入不可
    val b: Int = 2
    b = 3 // bはvalで宣言しているため再代入不可、このコードはコンパイルエラーとなる

    // 型推論もあるため以下のようにも書ける(型の省略が可能）
    var c = 10

    // Kotlinではデフォルトでnullを許容していない（null安全）
    var d: String = null // このコードはコンパイルエラーとなる

    // nullで初期化したい場合は、型の後ろに?を付ける
    var e: String? = null
}
```
Emscriptenの導入メモ(Windows)


開発環境はWindows 10です。
参考にしたのは主に以下の2つのWebページです。

* [C/C++からWebAssemblyにコンパイルする](https://developer.mozilla.org/ja/docs/WebAssembly/C_to_wasm)
* [emscripten.org - Download and install](https://emscripten.org/docs/getting_started/downloads.html)

Emscriptenのインストールは以下のコマンドを順に叩くだけなのでとても簡単ですが、`install`&`activate`コマンドの実行はかなり時間がかかりました。タピオカでも飲んで待ちましょう。

```
git clone https://github.com/emscripten-core/emsdk.git
cd emsdk
git pull
emsdk install latest
emsdk activate latest
```
ちなみに、[C/C++からWebAssemblyにコンパイルする](https://developer.mozilla.org/ja/docs/WebAssembly/C_to_wasm) のコマンドをコピペ実行していくと `activate` コマンドに `--global` というフラグをつけて実行していますが、これは注意が必要でした。これを実行すると以下のようなEmscriptenのコンパイル時に必要な環境変数の変更が行われます。

```
PATH += C:\emsdk
PATH += C:\emsdk\upstream\emscripten
PATH += C:\emsdk\node\12.9.1_64bit\bin
PATH += C:\emsdk\python\2.7.13.1_64bit\python-2.7.13.amd64
PATH += C:\emsdk\java\8.152_64bit\bin
EMSDK = C:/emsdk
EM_CONFIG = C:\Users\RYOSKATE\.emscripten
EMSDK_NODE = C:\emsdk\node\12.9.1_64bit\bin\node.exe
EMSDK_PYTHON = C:\emsdk\python\2.7.13.1_64bit\python-2.7.13.amd64\python.exe
JAVA_HOME = C:\emsdk\java\8.152_64bit
```

nodeもpythonもjavaも使わない人であれば良いでしょうか、そうでなければPATHの競合や混乱が起こるためやめておきましょう。

代わりに、Emscriptenインストールディレクトリ`emsdk`の`emcmdprompt.bat`をコマンドプロンプトから実行すると、ウィンドウを閉じるまでは上記環境変数が設定された状態になります。

ここまででEmscriptenの準備は完了です。参考ページのサンプルプログラムなどで動作確認してみると良いと思います。
サーボモーターを使用する 

こんにちは、
やましょうです。

通常のサーボモーター
たとえば、
http://akizukidenshi.com/catalog/g/gM-01968/
このサーボの制御方法です。



サーボモータは規定周期15ms～20ms毎にパルスを与えて
このパルス幅で右か左に何度かがきまります。

ちなみに規定周期でパルスを与えないと前置保持のものが多いと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31412/fb55c677-b229-8d85-197e-329584db327a.png)




さて、この処理を行う場合、基本的に15msのタイマを１本用意しておけば良いのです。
そのあとはNOPで合わせ込めばよいので適当にやれば、
モーター1個だけの制御は簡単にできます。

フローチャートを書いておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31412/85a3f159-05e5-2544-d27a-2f8b8d72198c.png)

ということで通常のサーボモータはタイマ1本あれば簡単に制御できますね。


以上

やましょうでした。