OmniAICreator/Qiita-1.07M huggingface dataset:
DevideEventEmmiterを使ってみる


DevideEventEmmiterを利用すると任意のタイミングでイベントを発生させ、Listenerで対応処理をすることができるようです。

私はreact-navigationのStackNavigatorで戻りのタイミングでEventを処理したかったのですが、汎用的にいろいろ利用できそうです。

>移動のときにただパラメータを渡したいだけなら、[こちら](https://qiita.com/zaburo/items/f65def90c70b08a10a2c)を参考にしてください。

## 実装

StackNavgatorでHome→Detailと移動し、Ditail側から戻るときにHome側で値の更新が行われるようにしています。

>Redux利用のための余計なコードも入ってますが、動作には関係ありません。


### Home.js

Listener名と処理を定義して待ち受けます。

```diff:Home.js
import React from 'react';
+import { View, Text, Button, DeviceEventEmitter } from 'react-native';
import { connect } from 'react-redux';
import { updateName } from '../actions/userAction';

class Home extends React.Component {

    state = {
        name: ''
    }

+    componentWillMount() {
+ 　　　　//リスナー（イベント待受）
+        DeviceEventEmitter.addListener('handleEvent', (e) => {
+            console.log(e);
+            this.setState({ name: e.name });
+        })
+    }
	
	//無くても動きますが、メモリリーク等を想定すると消したほうが良いらしい。
+    componentWillUnmount() {
+        DeviceEventEmitter.removeListener();
+    }

    render() {
        return (
            <View style={{ flex: 1, alignItems: 'center', justifyContent: 'center' }}>
                <Text>Home</Text>
                <Button
                    title='Link to Detail'
                    onPress={() => this.props.navigation.navigate('Detail')}
                />
                <Text>{this.props.state.userData.user.name}</Text>
+                <Text>state.name:{this.state.name}</Text>
                <Button
                    title='updateName'
                    onPress={() => this.props.updateName('foo@Home')}
                />
            </View>
        );
    }
}

const mapStateToProps = state => (
    {
        state: state,
    }
);

const mapDispatchToProps = dispatch => (
    {
        updateName: (name) => dispatch(updateName(name)),
    }
);

export default connect(mapStateToProps, mapDispatchToProps)(Home);
```


### Detail.js

emmit()を利用してEventを発生させます（同時にHomeに戻っていますが、戻らなくてもHome側でEventは発生するようです）。

```diff:Detail.js
import React from 'react';
+import { View, Text, Button, DeviceEventEmitter } from 'react-native';
import { connect } from 'react-redux';

class Detail extends React.Component {
    render() {
        return (
            <View style={{ flex: 1, alignItems: 'center', justifyContent: 'center' }}>
                <Text>Detail</Text>
                <Text>{this.props.state.userData.user.name}</Text>
                <Button
                    title='back'
                    onPress={()=>{
                        this.props.navigation.navigate('Home');
+                        DeviceEventEmitter.emit('handleEvent',{name:'foo'}); //イベント発生
                    }}
                />
            </View>
        );
    }
}

const mapStateToProps = state => (
    {
        state: state,
    }
);

export default connect(mapStateToProps, null)(Detail);
```

## 参考

* https://github.com/react-navigation/react-navigation/issues/684
AWS DeepRacerまとめ


# 関連Qiita

- [Donkey Carの作り方(RasPi側)
](https://qiita.com/akira-sasaki/items/c37468e88c9bbd739a65)
- [Donkey Car PS3 Joystick(RasPi側)](https://qiita.com/akira-sasaki/items/987ba17060637cff2c3e)
- [Donkey Carで動きそうなラジコン](https://qiita.com/akira-sasaki/items/753106d6ad9f62a31a40)
- [Donkey Carの作り方(Mac側)
](https://qiita.com/akira-sasaki/items/66f31a969712d8dea758)
- [Donkey Carの作り方(Windows側)](https://qiita.com/akira-sasaki/items/dc06b0ca21821fc8ef48)
- [Donkey Car Emulator(Mac側)](https://qiita.com/akira-sasaki/items/5e838b4f5125e25b4523)
- [Donkey Car学習(Mac側)](https://qiita.com/akira-sasaki/items/e0cc64dae5565b38987d)
- [Donkey Car Commandメモ](https://qiita.com/akira-sasaki/items/4097f9bdea46fb654a04)
- [Donkey Car Officialのドキュメント(リンク)](https://docs.donkeycar.com/)
- [AWS DeepRacerまとめ](https://qiita.com/akira-sasaki/items/c29282c281ca274d2691)

# AWS DeepRacerとは？
AWSが発表した1/18スケールのDeepLearningベースのRobotCar。DeepLearningの勉強教材。来年の3月発売。

# マシンスペック

| 項目 | 内容 |
|:--|:--|
| CAR | 1/18スケールのMonster truckタイプのシャーシ |
| CPU | Intel Atom™ Processor |
| MEMORY | 4GB RAM |
| STORAGE | 32GB (expandable) |
| WI-FI | 802.11ac |
| CAMERA | 4 MP camera with MJPEG |
| SOFTWARE | Ubuntu OS 16.04.3 LTS, Intel® OpenVINO™ toolkit, ROS Kinetic |
| DRIVE BATTERY | 7.4V/1100mAh lithium polymer |
| COMPUTE BATTERY | 13600mAh USB-C PD |
| PORTS | 4x USB-A, 1x USB-C, 1x Micro-USB, 1x HDMI |
| SENSORS | 加速度、ジャイロ |

## 価格

定価 399ドル, キャンペーン中は249ドル。
Unsigned right shift operatorはなぜC/C++にないのか

[静大情報AC(IT)](https://adventar.org/calendars/3386) 6日目です。
前日(5日目)は欠員です。
前々日(4日目)はasdfg0280氏の[「Nuxt.js使ってみた」](https://sakecraft.mydns.jp/docs/IT/hello_nuxt.html)です。
# はじめに
JavaとJVMのSpecificationを引用する際には、それぞれ"Java§1.2.3"、"JVM§4.5.6"のように記述します。
Java/JVMのバージョンは11とします。

#Unsigned right shift operator?
Javaにはunsigned right shift operator(unsigned右シフト演算子)なる演算子があります。

```java
int i = -4 >>  1; // -2         (signed right shift)
int j = -4 >>> 1; // 2147483646 (unsigned right shift)
```

通常のシフトが符号拡張により符号を保存する(算術シフト)のに対し、unsigned右シフトにおいては符号ビットを気にせずそのままシフト(論理シフト)します。([Java§15.19](https://docs.oracle.com/javase/specs/jls/se11/html/jls-15.html#jls-15.19))

C/C++にはないこの演算子、なぜJavaにはあるのでしょうか。

#Javaにはunsigned数値型がない
[Java§4.2.1](https://docs.oracle.com/javase/specs/jls/se11/html/jls-4.html#jls-4.2.1)によれば、Javaの組み込み整数型は以下の4つです。

- `byte`(-128 ~ 127)
- `short`(-32768 ~ 32767)
- `int`(-2147483648 ~ 2147483647)
- `long`(-9223372036854775808 ~ 9223372036854775807)
- `char`(`'\u0000'` ~ `'\uffff'`、すなわち0 ~ 65535)

値の範囲からわかるように`char`以外はすべてsignedです。([JVM§2.3](https://docs.oracle.com/javase/specs/jvms/se11/html/jvms-2.html#jvms-2.3)にも`char`のみがunsignedとの記述があります)
また、`char`でさえもシフト演算時には内部的に`int`に変換されてから演算に使われます。("Unary numeric promotion", [Java§5.6.1](https://docs.oracle.com/javase/specs/jls/se11/html/jls-5.html#jls-5.6.1))
[JVM§2.11.1](https://docs.oracle.com/javase/specs/jvms/se11/html/jvms-2.html#jvms-2.11.1)によればJVMのシフト演算命令は`int`と`long`にしか定義されていないことから、シフト演算に限って言えば、Javaにはunsigned整数型はないと言えます。

# Unsignedなシフトの必要性
さて、unsigned整数型がないとどのように困るのでしょうか。
次のコードを見てみましょう。

```Java
String toBits(int val) {
    var builder = new StringBuilder();
    for(int j = 0; j < Integer.SIZE; j++, val >>>= 1) {
        builder.append((val & 1) == 1 ? "1" : "0");
    }
    return builder.reverse().toString();
}
```

これは、`int`型引数を取りそのビット表現を`String`で返す関数です。
例:
`-1` -> `"11111111111111111111111111111111"`
`20181206` -> `"00000001001100111111000011010110"`

3行目で`>>>=`(`>>>`しつつ代入する演算子)を使っています。

仮にJavaの世界に`>>>`がなくても、この関数が書けないというわけではありません。
ただ、負の値を算術右シフトすると符号拡張で上位ビットを1が埋めてしまうので、負の数に対しては特別な操作が必要となります。

このように、Javaにおいてはunsigned right shift operatorはなくても死にはしないけれど、あったほうが便利だということがわかりました。

# C/C++にはなぜright shift operatorがないか
C/C++では符号なし整数型があり、これらの型に対するシフトは論理シフトになることが規格で定められています。
したがって、right shift operatorがなくても同様の操作を行うことができます。

# おわり
翌日(7日目)は欠員です。
翌々日(8日目)はhi97_ia16氏の[「Node.jsで大学の成績を自動取得するシステムを開発した話」](https://hi97.hamazo.tv/e8275388.html)です。
(両脇に人がいない……)
DonkeyCar PS3 Joystick(RasPi側)

# 関連Qiita

- [Donkey Carの作り方(RasPi側)
](https://qiita.com/akira-sasaki/items/c37468e88c9bbd739a65)
- [Donkey Car PS3 Joystick(RasPi側)](https://qiita.com/akira-sasaki/items/987ba17060637cff2c3e)
- [Donkey Carで動きそうなラジコン](https://qiita.com/akira-sasaki/items/753106d6ad9f62a31a40)
- [Donkey Carの作り方(Mac側)
](https://qiita.com/akira-sasaki/items/66f31a969712d8dea758)
- [Donkey Carの作り方(Windows側)](https://qiita.com/akira-sasaki/items/dc06b0ca21821fc8ef48)
- [Donkey Car Emulator(Mac側)](https://qiita.com/akira-sasaki/items/5e838b4f5125e25b4523)
- [Donkey Car学習(Mac側)](https://qiita.com/akira-sasaki/items/e0cc64dae5565b38987d)
- [Donkey Car Commandメモ](https://qiita.com/akira-sasaki/items/4097f9bdea46fb654a04)
- [Donkey Car Officialのドキュメント(リンク)](https://docs.donkeycar.com/)
- [AWS DeepRacerまとめ](https://qiita.com/akira-sasaki/items/c29282c281ca274d2691)

コンテンツは、
https://faboplatform.github.io/DonkeyDocs/4.etc/08.bluetooth/
にUpdateしています。
Vuetifyで、APIから選択肢を検索して呼び出せるドロップダウンリストをつくる

# APIから選択肢を検索して呼び出せるドロップダウンリスト
こういうドロップダウンリストを作りたいとき、ありますよね。
プロトタイピングなどでさくっと実装したいと思っても、一から自分で作るとなると苦しい要素が満載ですが、Vuetifyを使ってみたらあっという間で感動しました。
![temp.gif](https://qiita-image-store.s3.amazonaws.com/0/80956/f7798660-23c7-7c6a-74af-dc8b9fb37659.gif)
コードはこちら
https://codepen.io/kokky/pen/eQwvZM?editors=1010

# そもそもVuetifyとは
マテリアルデザインを採用したvue.jsのUIコンポーネント集です。Bootstrapのマテリアルデザイン版。かゆいところに手が届く！つよい！

今回利用するのは、Vuetifyのautocomplete componentです。導入・ドキュメントはこちらから。日本語版だと、なぜかドキュメントの説明が表示されないので、英語版でアクセスしてください。
https://vuetifyjs.com/en/components/autocompletes

なんとなくコピペしていろいろいじると動きます。すごい！

# HTML解説（抜粋）


```html
<v-autocomplete
    v-model="model"
    :items="items"
    :loading="isLoading"
    :search-input.sync="search"
    color="white"
    item-text="Description"
    item-value="API"
    cache-items
    hide-no-data
    hide-selected
    placeholder="入力できます"
    prepend-icon="mdi-database-search"
    return-object
></v-autocomplete>
```
各プロパティの意味は以下の通りです。

- items：APIでfetchした選択肢を持つ
- item-text, item-value：選択肢で表示上のテキストと、値をバラバラに持つためのプロパティ
- loading：APIを読み込み中、テキスト入力欄の下線をいい感じでアニメーションさせる
- search-input.sync：この検索クエリに基づいて、APIからデータを読み込む
- cache-items：一度でもitemsに入った値を、ローカル変数で保持する
- hide-no-data：これがあると、検索結果が見つからないときに「no data available」と表示される
- hide-selected：現在選択中の選択肢が、ドロップダウンリストに表示されなくなる
- return-object：このオプションがあると、選択肢をクリックした際に「クリックしたitemのvalue」ではなく「itemオブジェクトそのもの」が返る

# JS部分解説（抜粋）
検索部分に入力した内容「search」が更新されるごとに、以下の処理が行われて、APIからデータを読み込んでいきます。

```javascript
watch: {
    search(val) {
        // すでに読み込み済みの場合は、何もしない
        if (this.items.length > 0) return
        // 読み込み中の場合も、何もしない
        if (this.isLoading) return

        this.isLoading = true

        // APIから、選択肢をfetchする
        axios.get('https://api.publicapis.org/entries').then(res => {
            const {
                count,
                entries
            } = res.data
            this.count = count
            this.entries = entries
        }).catch(err => {
            console.log(err)
        //読み込みが完了したので、loadingをfalseに
        }).finally(() => (this.isLoading = false))
    }
}
```

HTML・JS合わせたコード全編はこちらです
https://codepen.io/kokky/pen/eQwvZM?editors=1010

# おまけ：Vuetifyを導入するか迷ったら
autocomplete component以外にも、

- ウィンドウサイズに応じていい感じにサイドメニューを開閉するコンポーネント
- ページ読み込みのローディングエフェクト
- ツールチップやダイアログ

など、一から作るにはちょっと面倒だな…と思うようなコンポーネントが集まっているので、とにかくスピード重視で開発したい方におすすめ。新コンポーネント追加やバグフィックスのためにすごい頻度でバージョンアップするので、体感的には安定したβ版、といった心づもりで使うのが良さそうです。

今のところ唯一感じているデメリットは、Vuetifyのコンポーネントが持つデフォルトスタイルを上書きしづらいこと（stylusで記述されているのでひと手間かかる）。stylusからscssに切り替えるロードマップが進んでいるので、バージョンアップを祈るばかりです。なむなむ。
LINE ビーコンでアイドルとファンの距離を近づけたい

### はじめに
すっかり自分の担当日を勘違いしておりました。許してください
LINE Developer Day2016で頂いたビーコンを使ったお話です。
ちょっと古いですが学生にも楽しんでいただけたらと思いましたので書きます


### 背景
実は僕の妹がアイドルをやってたりするんですが、その妹の最大の悩みである
`「もっとお金をかせぎたい」`
という願いをかなえるために、妹とLINEビーコンを使って握手会に来てくれたファンに妹からだけのメッセージを送り特別感を与え、他のアイドルの子ではなく妹のインセンティブにつながる商品を買ってもらおうと考えました

### LINE BEACONとは
LINE Beaconは、LINE社が提供するビーコン機能です。 スマートフォンのBluetoothをONにしておけば、たとえば対応店舗を訪れたときに、コンテンツが配信されたりポイントが付与されたりします

（僕が今回使ったのは2016に配布されたものですが、このようなビーコンだと思ってください）
![代替テキスト](https://engineering.linecorp.com/wp-content/uploads/2017/2/16/1487234872103.jpg)
引用元: https://engineering.linecorp.com/ja/blog/line-beacon-raspberry-pie-line-simple-beacon-specification/


### 仕組み
握手会の日にビーコンを所持した妹の近くにファンが近づくことで、ビーコンの近づいたイベントを発火し、ファンに熱いメッセージを送ろうというシンプルなものです

### 準備
##### ファンにメッセージを送るためのLINE Botを用意する
https://at.line.me/jp/ からLINEのBotアカウントを作成してください

##### LINEビーコンとLINE Botの連携
https://admin-official.line.me/beacon/register にアクセスし、上記で作成したボットと連携をしてください

###### 実装する
以下がビーコンイベントのリファレンスです
https://developers.line.biz/ja/reference/messaging-api/#anchor-fb4abbd10cc4cb9325d24af83f310fdb00d2063d

近づいた・離れたという情報が取れそうですね
好き勝手実装してください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/320138/641c1834-3737-25cd-7453-d0af383ab290.png)


とりあえずさらっと作ってみました。しっかりイベントが取れてそうです
後は、文章をアイドルっぽく買ってほしい商品のアピールなどをしていきましょう
![image.png](https://qiita-image-store.s3.amazonaws.com/0/320138/342b3c3b-948c-534f-9a64-8263dcebc06c.png)


##### 最後の設定: LINE側の設定をする（最大の敵）
1. スマホのBlueToothをONにする
2. LINEの設定画面から、LINE ビーコンの使用を許可（設定→プライバシー管理）
3. Botアカウントと友達になる


### 大きな課題
さっと作ってみて、私のためにスマホの設定するのか????という課題が現れまいした。
そして大前提であるはずの今回のようなことをするための許可をとったものではないため、やめようという話になってしまったのでここで終了という形になってしまって本当に申し訳ないです。どこかで復活できたらまた書きます


### 終わりに
こんな感じで5日目ちょうどよく皆様のハードルを下げれたと思います
学生の皆さん楽しい大学生活を過ごしてください:+1:
C#の拡張メソッドでVector3 にオレオレメソッドを追加する

たとえば三次元空間上のオブジェクトの位置情報を地図などのUIに表示したい時など、オブジェクトのx,zを地図のx,y上に変換するために

```
Vector2 mapPos = new Vector2(playerPos.x,playerPos.z);
```
のようにすることがあるかと思いますが、
```Vector3(x,y,z)->Vector2(x,z)```
```Vector2(x,y)->Vector3(x,0,z)```
を頻繁に行う必要がある場合、毎回 ```new Vector2(v.x,v.z)``` のようにするのは面倒です。
そんな時はVector3にC#の拡張メソッドを追加すると便利です。

```[OreOreExtensionMethods.cs]
public static class OreOreExtensionMethods
{
    /// <summary>
    /// To Vector2(x,z) from Vector3(x,y,z) 
    /// </summary>
    public static UnityEngine.Vector2 ToVec2XZ(this UnityEngine.Vector3 v)
    {
        return new UnityEngine.Vector2(v.x, v.y);
    }

    /// <summary>
    /// To Vector3(x,0,y) from Vector2(x,y) 
    /// </summary>
    public static UnityEngine.Vector3 ToVec3X0Y(this UnityEngine.Vector2 v)
    {
        return new UnityEngine.Vector3(v.x, 0f, v.y);
    }
}
```

こんなファイルをプロジェクトに入れておくと、
![2018-12-06_040201.png](https://qiita-image-store.s3.amazonaws.com/0/59911/23f3e1b2-6525-cae1-ace8-01b6c42ae702.png)


こんな感じでオレオレメソッドが使えるようになります。
【ハンズオン】Ruby support for AWS Lambdaを使ってみる

※2019/7/3追記
AWS Lambda(for Ruby2.5)で画像合成をやってみた！
https://praha-inc.hatenablog.com/entry/2019/02/22/143721

こちらも執筆しています。より詳細な手順を記載していますので、参考になりましたら幸いです。

---

こんにちは、[@shino_tp](https://twitter.com/shino_tp)です。

AWS re:Invent 2018でAWS LambdaがRubyを公式サポートが発表されましたね！

これを期にLambdaでRubyを使ってみたところ、Lambdaに標準でインストールされていないライブラリ(gem)を使用する方法が不明だったため手順をまとめます。

詳細な手順は公式のドキュメントに記載されているので、備忘録になります。

公式ドキュメント
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/ruby-package.html


## 前提環境
### awscli
awsコマンドを使うのでawscliのインストール＆セットアップが必要です。
参照: https://qiita.com/maimai-swap/items/999eb69b7a4420d6ab64

### Ruby2.5
rbenv、rvmなどを使ってRubyをインストール。

#### 注意
AWS LambdaのRubyバージョンは2.5です(2018年12月6日現在)
※Rubyのバージョンが2.5以外の状態で`bundle install` を実行後、デプロイを行っても `no such file` などのエラーになるため注意。


## AWSコンソール上で対応すること
### Lambda関数を作成
AWSコンソールにアクセスし、Lambda関数を作成します。
デプロイ時に関数名を指定しますので、適当な名前で作成しましょう。

![スクリーンショット 2018-12-06 3.57.38.png](https://qiita-image-store.s3.amazonaws.com/0/32950/ddc7fdcd-86da-0426-1a8f-503a99b83141.png)


## ローカル環境で対応すること
### Gemfileを作成
```Gemfile:Gemfile
source 'https://rubygems.org'
gem 'aws-sdk-s3'
gem 'mini_magick' # AWS Lambdaが標準サポートしていないgem
```

### bundle install
```
$ bundle install --path vendor/bundle
```

### ディレクトリ構造
今回のディレクトリ構造です。

```
.
├── Gemfile
├── Gemfile.lock
├── lambda_function.rb
└── vendor
    └── bundle
```

## Lambdaにデプロイ
ローカルでインストールしたライブラリを作成したプログラムファイルと一緒にzipに固めてデプロイをします。
### デプロイ対象のファイルをzipファイルに圧縮
```bash
# zip -r [圧縮ファイル名].zip [ファイル名1] [ファイル名2] [ディレクトリ名1] [ディレクトリ名2]...(以降含めたいファイルorディレクトリを記述する)
$ zip -r function.zip lambda_function.rb vendor
```

### ローカルからLambdaにデプロイ
```bash
$ aws lambda update-function-code \
--function-name [関数名] \
--zip-file fileb://[圧縮ファイル名].zip
```

`--function-name`オプションには、Lambdaの関数名
`--zip-file`オプションには、圧縮したzipファイルの名前
を指定

以上です。

# 参考資料
https://aws.amazon.com/jp/blogs/compute/announcing-ruby-support-for-aws-lambda/
最近のmacOSでは一瞬でファイルがコピーできるという話

この記事は [KLab Engineer Advent Calendar 2018](https://qiita.com/advent-calendar/2018/klab) の6日目のエントリです。

最近のmacOSでは新しいファイルシステムが採用されていて、ファイルコピーが一瞬でできますよ、性能改善やストレージの空き容量を増やすのに役立つかもしれませんよ、という話を紹介します。

## 最近のmacOSのファイルシステム：APFS

まず最近のMacのファイルシステムについて紹介します。2017年9月リリースのmacOS 10.13 (High Sierra) 以降、macOSでは標準のファイルシステムとしてAPFS (Apple File System) が採用されています。これはコピーオンライトファイルシステムというジャンルに属するもので、同じファイルを作成する際に実体を共有して、どちらか一方が更新された時に初めてファイルコピーを行うような仕組みを持つ、モダンなファイルシステムです。同様のファイルシステムとしてはZFSやBtrfsが挙げられます。

## APFS上で実体を共有したファイルコピーを行う

そんな特徴を持ったAPFSですが、単にcpコマンドでファイルコピーをしても従来通りに別の実体を作ってしまい、APFSのメリットは生かせません。実はmac OS 10.13以降、標準のcpコマンドにAPFSのためのオプションが一つ追加されています。

```
$ man cp
（略）
     -c    copy files using clonefile(2)
```

cpコマンドに `-c` オプションをつけると `clonefile` システムコールを使ってコピーしてくれるんだそうです。これはまさに我々が求めている、実体を共有した形でのコピーです。

これを使ってコピーを行うと、ファイルのコピーは一瞬で終わります。約300MBのファイルをコピーしてみましょう。

```
$ /usr/bin/time cp -c pycharm-community-2018.3.dmg f1
        0.00 real         0.00 user         0.00 sys
$ /usr/bin/time cp -c pycharm-community-2018.3.dmg f2
        0.00 real         0.00 user         0.00 sys
$ /usr/bin/time cp pycharm-community-2018.3.dmg f3
        1.60 real         0.00 user         0.29 sys
$ /usr/bin/time cp pycharm-community-2018.3.dmg f4
        0.96 real         0.00 user         0.23 sys
```

`-c` オプション付きで2回、 `-c` オプションなしで2回、ファイルのコピーを行ってみました。前者は0.01秒未満で実行終了しているのに対し、後者は約1秒から1.5秒ほどかかっています。どうやら2桁くらい速度が違いそうですね[^1]。

また、`df` コマンドでディスクの空き容量を観察していると、 `cp -c`では空き容量が1バイトも減りませんでした。コピーが速くてストレージ容量も消費しないということですから、いいことづくめですね。

[^1]: 我が家の古いMacBookAirで実験しているので、読者の皆さんの手元ではもう少し違う結果になるかもしれません。

## cp -cの利用シーン

さて、この `cp -c` による速いコピーは何に使えるでしょうか。

まず、バイナリビルドやアセットビルドの際にファイルコピーがボトルネックになっているような部分があれば、コピーを`cp -c`に変更することで性能改善になる可能性があります。

また、UnityプロジェクトだとSwitch Platformを避けるため同一プロジェクトのコピーを複数持つようなことをされている方も多いかと思います。このような場合に、ワーキングコピー全体を `cp -cr` でコピーすればストレージにはずいぶん優しくなるはずです。

存在する重複ファイルを検出し、`cp -c`によって実体を共有することでディスク容量を削減することもできるでしょう。すでにそのような試みも行われています[^2]。

[^2]: 例えば https://github.com/ranvel/clonefile-dedup 。これ自体は利用者も多くなさそうなので、もう少し定評のあるツールが `clonefile(2)` をサポートしてくれればそれが一番良さそうです。


## まとめ

- 最近のmacOSではAPFSというファイルシステムが採用されている
- APFSでは `cp -c` でファイルの実体を共有したコピーが実現できる
    - 実体を共有したファイルのどれか1つが変更されると、そのタイミングで初めてファイルコピーが行われる
- `cp -c`を利用すれば性能改善やディスク空き容量増加などのメリットが得られるのでは

ハードリンクを使えば同様のディスク容量削減は実現できるのですが、ハードリンクだと編集する際に注意しないと全ファイルを書き換えてしまって事故につながる可能性があります。ファイルシステムの機能で「安全なハードリンク」を実現できるのは嬉しいですね。

APFSはまだ登場から歴史が浅いので、全面的に信用していいかどうか判断が難しいところかもしれません。とはいえ魅力的な機能を提供しているように思いますので、使えるところでは積極的に使っていきたいと個人的には考えています。
Play以外のScalaいろんなウェブフレームワーク


##はじめに
「ScalaのフレームワークってPlayしかないよね」ってよく言われたりします。その場では「いや他もいろいろあるよ」って答えますが、自分もPlayしか使ったことが無いので実は他のフレームワークについて全く詳しくて…なのでこの機会で、Play以外他のいろいろについて調べてみました[^1]！

[^1]: 2018/12/4までの情報をもとに書いています

（以下アルファベット順になります）
## [Chaos](https://github.com/mesosphere/chaos)
Mesosphere社が出しているRESTサービスを作るためのフレームワーク。最後のコミットがもう一年以上になるのでもう開発止まっているだろうと思いますが~~名前がすごいのでどうしても書きたくて~~ScalaでRESTサービスを開発するPlayはやりすぎた感がある＋他にScalaとの親和性がいいフレームワークがないため作られたそうです。

## [Colossus](https://github.com/tumblr/colossus)
Tumblr社が開発しているI/Oがフレームワーク。いろんなユースケースできますが一番基本とオススメのはマイクロサービスの構築らしいです。
一番基本のコンポネートがInitializer（サーバを起動するための環境設定やセットアップのロジックを持つ）とRequestHandler（リクエストの処理をする）になり、それでサービスを作る感じです。確かにシンプルで単機能のサービスを作るのには向いてそうです。
あと気になるのはI/Oが頻繁に起こるアプリケーションに向いてるという記載があるので、実際のパーフォマンスを検証してみたいですね。今まだ正式版出てないので実際の運用に載せるのは厳しそうですが正式版が楽しみです。

## [Finatra](https://github.com/twitter/finatra)
Twitter社が出してる、Rubyのフレームワーク[Sinatra](https://github.com/sinatra/sinatra)からインスピレートされた軽量ウェブフレームワーク。自社で作った[Finagle](https://github.com/twitter/finagle)と[TwitterServer](https://github.com/twitter/twitter-server)の上で動きます。Twitter自社のサービスでも使われていることで信頼性が高く、あとTwitterスタイルでウェブアプリケーションを開発できるのも魅力の一つらしいです。ドキュメントを見るとテスト重視な感じで、[Feature Tests](https://twitter.github.io/finatra/user-guide/testing/feature_tests.html)という、サービスのFeatureにするホワイトボックステスティングとブラックボックステスティングがサポートされます。

## [Lift](https://github.com/lift/framework)
一番の特徴はコントローラーがないことです。（MVCに慣れた人からするとなかなか想像できないかもしれないですね）Viewを先に作って、そこからサーバーサイドで行い処理をsnippetというものに実装して、viewから呼び出し感じです。完全に画面から作っていくview firstのアプローチなので個人的にすごく面白いと思います。


## [Scalatra](https://github.com/scalatra/scalatra)
Rubyのフレームワーク[Sinatra](https://github.com/sinatra/sinatra)に似せたScala用のウェブフレーム。こちらも知名度が高いフレームワークだと個人は思っています。わかりやすく、小さく作るのがコンセプトで、7行からアプリケーションを作れるのです（笑）。Playと同じようにMVCウェブアプリケーションを作ることができますが、Playより軽量でパフォーマンスに優れるらしいです。

## [Skinny Framework](https://github.com/skinny-framework/skinny-framework)
「Scala on Rails」がコンセプトとなるフルスタックウェブフレームワークです。[Ruby on Rails](https://rubyonrails.org/)のようにMVCパータンで、簡単にすぐアプリケーションを作れるように必要なコンポネートが揃えていますし、環境設定もHomebrewでinstallして終わりますので[^2]、scalaで何か作ってみたい時一番気軽にスタートできるのではないかと思います。
[^2]: http://skinny-framework.org/documentation/getting-started.html

## [Xitrum](https://xitrum-framework.github.io/index.html)
オフィシャルドキュメントからそのまま引用すると「 [Netty](https://netty.io/) と [Akka](https://akka.io/) をベースに構築された非同期でスケーラブルなHTTP(S) WEBフレームワークです。」また[Scalatra](https://github.com/scalatra/scalatra)よりパワフル、 [Lift](https://github.com/lift/framework)より簡単であることで両者の間のギャップを埋めるのが目的だそうです。

## 参考したもの
 [awesome-scala](https://github.com/lauris/awesome-scala) 
ウェブフレームワーク以外もScalaのプラグインやライブラリが用途別でまとめられていますので、わかりやすかったです。あと多分一番網羅されていますので大変参考になりました。

## 終わりに
本当にざっと調べてみただけですが、思った以上にScalaのフレームワーク色々ありました（笑）。[Akka Http](https://github.com/akka/akka-http), [http4s](https://github.com/http4s/http4s), [Unfiltered](https://github.com/unfiltered/unfiltered)など一応フレームワークではないので（そこの定義が難しいですね）今回入れていませんが、そちらも含めてウェブアプリケーション作る時実は選択肢たくさんあるのがわかりました。Playはすごく便利かつ強力なフレームワークですが、実際開発している時要件によって機能が過剰になってしまうとかの場合もありますので、要件に合わせて一番適切なフレームワーク/ライブラリ選びも必要だと思います。ここで書いているフレームワークも触ったことがないものが多いのでまたどこかの機会で試してみたいです！
UE4プラグインビルド時に対処したネタ集

備忘録として。あまりプラグインは関係ないかも。


# UE4でwindows.hを利用する
```cpp:win.cpp
#if PLATFORM_WINDOWS

//最低限であればこちら
#include "Windows/WindowsSystemIncludes.h"

//全部読むならこちら
#include "AllowWindowsPlatformTypes.h"
#include <windows.h>
#include "HideWindowsPlatformTypes.h"
#endif
```
実装例はよく見かける。元ネタは不明…

# 外部ライブラリに日本語パスを渡す
外部ライブラリでファイルが読めなかった時の対処。
FPathsやFStringに格納されているパスを、そのままstd::stringに渡すと読めないことがあった。

変換に`WideCharToMultiByte`を利用すると読めた。`windows.h`が必要。
https://qiita.com/yumetodo/items/453d14eff41b805d8fc4

UE4のマクロは色々あるが、どれも駄目だった。あまり深追いしていない。
http://api.unrealengine.com/INT/Programming/UnrealArchitecture/StringHandling/CharacterEncoding/index.html

# プラグインを他のプラグインに依存させる

```json:MyPlugin.uplugin
{
  "FileVersion": 3,
  "Version": 1,
  "VersionName": "1.0",
  "FriendlyName": "test",
  "Description": "",
  "Category": "Rendering",
  "CreatedBy": "",
  "CreatedByURL": "",
  "DocsURL": "",
  "MarketplaceURL": "",
  "SupportURL": "",
  "EnabledByDefault" : true,
  "CanContainContent": true,
  "IsBetaVersion": false,
  "Installed": false,
  "Modules": [
    {
      "Name": "MyPlugin",
      "Type": "Runtime",
      "LoadingPhase": "PreDefault"
    },
  ],
↓↓↓↓↓　これを追加する
  "Plugins": [
     {
       "Name": "ProceduralMeshComponent",
       "Enabled": true
     }
 ]
↑↑↑↑↑
}
```
参考：
https://answers.unrealengine.com/questions/745416/plugins-can-not-user-another-plugins.html

# コマンドラインでUE4バージョンを切り替えてビルドする
複数のUE4バージョンを対象にしたプラグインを作成するために。

##手順まとめ
.uprojectのEngineAssociationを書き換えた後、UnrealVersionSelector.exeでslnを作り直す

```json:MyGame.uproject
{
    "FileVersion":  3,
    "EngineAssociation":  "4.19",   ←　ここを書き換える
    "Category":  "",
    "Description":  "",
    "Enterprise":  false,
    "Modules":  [
        {
            "Name":  "MyGame",
            "Type":  "Runtime",
            "LoadingPhase":  "Default"
        }
    ]
}
```
##具体的な手順
以下のようなスクリプトを作成して、

```powershell:changeEngineVer.ps1
$a = Get-Content ./MyGame.uproject -Encoding UTF8 | ConvertFrom-Json

$a.EngineAssociation = $Args[0]

$a | ConvertTo-Json > ./MyGame.uproject
```
batファイルから呼び出す

```bat:change.bat
powershell -ExecutionPolicy RemoteSigned .\changeEngineVer.ps1 \"4.20%\"
```
sln作り直す

```bat:generate.bat
set UNREALVERSIONSELECTOR="C:\Program Files (x86)\Epic Games\Launcher\Engine\Binaries\Win64\UnrealVersionSelector.exe"
UNREALVERSIONSELECTOR /projectfiles MyGame.uproject
```
なぜ`GenerateProjectFiles.bat`が削除されたんだ？ 不便になった。

参考：
https://usagi.hatenablog.jp/entry/2017/10/27/074110
https://answers.unrealengine.com/questions/275271/change-the-engine-version-of-a-project-via-command.html
https://qiita.com/cd01/items/82829ba0ec0f59e1b04d
https://win.just4fun.biz/?PowerShell/%E3%83%8F%E3%83%83%E3%82%B7%E3%83%A5%E3%81%8B%E3%82%89JSON%2CJSON%E3%81%8B%E3%82%89PSCustomObject%E3%81%AB%E5%A4%89%E6%8F%9B%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95
RailsエンジニアがUnix周りの知識をつけるために勉強したときの話

Railsアプリケーション開発をしてるとき、Railsプロセスが止まることってありますよね。
そのとき、呪文のように`kill -9 プロセスID`を実行している人っていませんか。

はい。僕です。理解しないでやるのはよくないのはわかってるけどやっちゃうよね。

## 背景

そもそもUNIX周りを勉強しようと思った背景としては、
RubyやRailsのコードはそれなりに書けるようになったけど、Railsエンジニアとしてキャリアを積むためには
まだまだ知らないといけないことってたくさんあるなって思ったからです。

例えば、Railsってなんで`rails s`したらサーバが起動するの？とかUnicorn使ってるけどどうやって動いてるのよ。と業務で何か問題が起きない限りそこのコードをわざわざ辿ることが日常業務でなかったからです。

とはいえ、Railsアプリケーションを1人で運用することってざらにある話なので勉強したいなと。


## 忙しい人向けのやったこと目次
- ゆううきブログの「2015年Webサーバアーキテクチャ序論」を読む
  - https://blog.yuuk.io/entry/2015-webserver-architecture
- 「なるほどUnixプロセス ― Rubyで学ぶUnixの基礎」を読んでみた
  - https://tatsu-zine.com/books/naruhounix
- 別件 Rackを実装してみた
  - [x] Rackを動かす
  - [x] routingっぽいものの実装
  - [x] アクセスログっぽいものの実装

## それではやってみた
### ゆううきブログの「2015年Webサーバアーキテクチャ序論」を読む
https://blog.yuuk.io/entry/2015-webserver-architecture

読めない。わからない。
土地勘がなさすぎて読めない


という訳で挫折した結果。Rubyで学べるUnixプロセスからはじめようと。
### 「なるほどUnixプロセス ― Rubyで学ぶUnixの基礎」を読んでみた
内容がすごいわかりやすい。


分からなかった点を社内の人に聞いてみた

Q. なんでforkした際の子プロセスは、一番最初の行が読み込まれないんですか？
A. fork は fork したところから動くので3行目からしか動かないですね
イメージとしてはプログラムカウンタ(実際にいまどこを実行しているのか)というものまで全部子プロセスにコピーされる感じ
-> わかりやすい。実際にいまどこを実行しているのかまでコピーされるのか。

Q. rackがどのリクエストの階層でどんなことがわかるか全然分からないです。(web application firewall とか)
A. とりあえず hello world するやつと、pathが `/secret` だったら hello world する層までいかせないようなミドルウェアとか


### 別件 Rackで遊んでみた
具体的には　下記で遊んでみた

``` チェックリスト
  - [x] Rackを動かす
  - [x] routingっぽいものの実装
  - [x] アクセスログっぽいものの実装
```

## やってみて
普段使ってるRubyで学べたのがよかったのと、普段Railsアプリケーション運用する上で使ってるライブラリの挙動を知ることは大事だなと再認識しました。

Keepとして、今後も継続して勉強する予定で、
次のTryはrack_middleware周りを葬ってみようと思ってる。
OpenFOAMエラー：attempt to read beyond EOF

# OpenFOAMのエラーメッセージ

OpenFOAMのエラーメッセージはわかりやすいものもあれば、わかりにくいものもある。
今回は「attempt to read beyond EOF」についてメモする。

# attempt to read beyond EOF

このメッセージは0ディレクトリのファイルをいじっていた後、計算を実行した際に発生した。
ソルバ―ログでは計算イタレーション開始前に発生していた。

```shell:log~Foam
--> FOAM FATAL IO ERROR: 
attempt to read beyond EOF

file: /User/sample/0/U.boundaryField.wall.value at line 32.
```

#　原因と対処方法

今回出したエラーの場合はファイル内での「｝」の閉じ忘れが原因。
エラーメッセージで指定されたライン近くの括弧を調べて修正する。


# まとめ

括弧の閉じ忘れは、括弧の中に括弧が入るdictファイルではよく発生する。計算が開始されず、よくわからないエラーメッセージが出たと思ったら、記述ミスも疑ったほうがいい。
ナイーブベイズでニュース記事を分類する

この記事は[JX通信社Advent Calendar](https://qiita.com/advent-calendar/2018/jxpress)の6日目です。

JX通信社で機械学習エンジニアとしてインターンしている[andmohiko](https://twitter.com/andmohiko)です。
機械学習でよくある、ニュース記事をカテゴリーで分類するやつをやりました。
偏った学習データにナイーブベイズを使った時に陥る問題とその解決策の話です。

# 目的
ニュース記事のタイトルからカテゴリーに分類します。
カテゴリーはエンタメ、グルメ、国内、国際、政治、経済、スポーツ、テクノロジーの8つがあります。

# 手法
ナイーブベイズを使います。
詳しいコードはこちらに載っているので割愛します。
[scikit-learnとgensimでニュース記事を分類する](https://qiita.com/yasunori/items/31a23eb259482e4824e2#5%E6%9C%AA%E7%9F%A5%E3%81%AE%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AE%E3%82%AF%E3%83%A9%E3%82%B9%E3%82%92%E5%BD%93%E3%81%A6%E3%82%8B)
4.機械学習 でRandomForestClassifierを使っているところを、自分はMultinomialNaiveBayesを使いました。


## スムージング問題
学習データが大きく偏っていると、カテゴリーの出現頻度を考慮しないよう(class_prior=None)にしても、謎の学習をしてしまう問題があります。俗に言うスムージング問題です。
これは端的に言うとスムージングの値が不適切だからです。
スムージングとはナイーブベイズで未知単語への対処法で、コーパスにない単語も学習データ中に一度は出現したとして扱うために微小な値を加算するものです。
このスムージングの値alphaが大き過ぎても小さ過ぎても発生するのがスムージング問題です。

スムージングが大きいときに、学習データの偏りがあまりにも大きいと、ある単語についてのカテゴリーの尤度の分母が小さく、分子がスムージングによって大きくなってしまいます。
その結果、尤度が逆転し、なぜかそのカテゴリーに出現していない単語ほど、そのカテゴリーの尤度が高くなってしまいます。


これを回避するためにはスムージングを小さくすればよく、小さくすればするほど未知語への誤った学習が軽減されます。しかし、ここで第2の問題が発生します。
スムージングをあまりにも小さくすると、未知語が出現するたびにそのカテゴリーの尤度が大きく下がり、今度は減点されないゲームになってしまいます。
これはこれで問題であり、スムージングを小さ過ぎず大き過ぎない値に設定することが大切です。

例えば、「スーパーで“豊洲”の魚・野菜のセール 新市場オープンで」というタイトルの記事はグルメに分類されるべきですが、
スムージングが小さいと、学習データに登場しなかった「豊洲」という単語へのペナルティが大きくなってしまい、結果的にgourmetよりもmoneyやnationalの対数尤度の方が大きくなってしまっています。
<img width="746" alt="low_alpha.png" src="https://qiita-image-store.s3.amazonaws.com/0/314160/3a9bb558-32d6-aeda-2710-c5f19f361598.png">

そこで、スムージングを小さ過ぎない値にすることでペナルティーを小さく抑えられ、無事gourmetカテゴリーの対数尤度が最も大きくなりました。
<img width="748" alt="high_alpha.png" src="https://qiita-image-store.s3.amazonaws.com/0/314160/2e67da92-73d8-cdac-ba06-0aed405900d6.png">


# 最後に
スムージングは大き過ぎても小さ過ぎてもよくないですね。
そのうち数式で説明したものを書きたいな...
Unity開発するにあたって知っておきたいコンパイラのすゝめ(Part1～Mono編～)(Unity2018.1対応)

#最初に

この記事はUnityで使用されているコンパイラについてまとめた記事のうちの、基本的に使われている部分である**Mono**について簡単にまとめた記事です。

- [Part0.5〜.NET Frameworkの概要編〜](https://qiita.com/4_mio_11/items/89fd91ef8ede02bfdd46)
- [Part0.7～JITとAOT概要編～](https://qiita.com/4_mio_11/items/f58fedbf2a7721c3df58)
- [Part2～IL2CPP編～](https://qiita.com/4_mio_11/items/d5d7b4e879a8341595cd)
- [Part3～Burst編～](https://qiita.com/4_mio_11/items/cda0c8aa4c77a7748418)

## Monoとは？

.NET Framework互換の環境を実現するオープンソースのソフトウェアです。
UnityではMonoをコンパイラの一つとして取り入れています。

Monoはマルチプラットフォームであり、**JITコンパイラを搭載**しています。JITは前回の記事でも説明した通り、実行中にILコードをネイティブコード化し、そのコードをキャッシュして2回目以降高速に実行ができる方式です。ただしMonoは**AOT方式も可能**で、実行前にネイティブコード化しキャッシュしておくこともできます。

JITコンパイラが対応するプロセッサは

- x86
- x86-64
- IA-64
- SPARC
- PowerPC
- ARM
- S/390（32ビットおよび64ビット）
- MIPS

となっています。それ以外ではネイティブコードに変換するのではなくインタプリタによって逐次バイトコードが実行されます。

またMonoではSIMDへの対応も行っており、独自の機能が多く取り込まれています。

## Monoの構成

Monoを構成するコンポーネントは以下の通りです。

- **C#コンパイラ**：MonoのC＃コンパイラは、version 5.10.0以降NET 4.7.1・C# 7.2が使用できます。ただし現在Unityでは.NET4.6対応となっているので、C#6までの機能が使用できる。

- **Mono Runtime**：ランタイムはCommon Language Infrastructure（CLI）を実装しています。ランタイムは、JITコンパイラ、AOTコンパイラ、ライブラリローダ、GC、スレッドシステム等を提供します。

- **.NET Frameworkクラスライブラリ**

- **Monoクラスライブラリ**：Monoは、Microsoftが提供するBCL以上に多くのクラスも提供しています。特にLinuxアプリケーションを構築する際に便利な機能を提供します。

- **共通言語ランタイム（Common Language Runtime（CLR））**：CLRを使用すると、他のCLR言語で書かれたコードと相互運用が可能です。例えば、C＃でクラスを作成した後にVB.Netでクラスを継承して使用することも可能です。

ちなみにMonoのランタイムとJITコンパイラはC言語で記述されているようです。

## Unityでの立ち位置

Unity2017.3以降ではIL2CPPかMonoを選択することができます。ただし、WebGLではIL2CPPのみ使用可能となっています。 (@Ash_Yin(デコシ) さんより、UWPでIL2CPPしか使えなくなるのはUnity2019からとご指摘頂きました)

IL2CPPに比べると

- ビルド時間が短い。
- JITのため、より多くの管理系ライブラリをサポートする。
- ランタイムの実行をサポートする。
- dllファイルが配布時に必須となる。

このIL2CPPに関しては次回の記事でもう少し詳しく見ていこうと思います。

# 最後に
今までMonoに関してここまで調べたことがなかったため、どのような役割を担っているのか詳しく知りませんでした。また、Unityでは現在どういった扱いになっているのかも知れて良かったです。

# 参考
- [IL2CPP & Mono](https://unity3d.com/jp/learn/tutorials/topics/best-practices/il2cpp-mono)
- [初心者のための Unity と C# 関係まとめ](https://yukuto.net/blog/201707unitywithcsharphistoryandsummury/)
- [Mono (ソフトウェア)](https://ja.wikipedia.org/wiki/Mono_(%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2))
- [Mono(公式サイト)](https://www.mono-project.com/)
Raspberry pi3でUSBデバイスブートができなかった方へ

## 結論:筆者も起動できませんでした。

何回Etcherでraspbianを焼き直したことか。

### 現状
不本意ながら2つのファイルを格納したマイクロＳＤカード+USBメモリの組み合わせで起動できています。

起動時のみ使用されるものの前述のファイルはリードオンリーでのアクセスですから、「書き込み回数の点で不安なマイクロSDカードをファイルの保存先にしない」という目的は達成できています。
USBメモリを使用しているのはSSDやHDDを買う前にUSB起動を試したかったからです。

さらにこの方法ならば__pi2でもUSB起動__できます。
うまくいかなかった方はお試し下さい。


### やったこと
+ USB boot mode を有効に

[How to boot from a USB mass storage device on a Raspberry Pi]
(https://www.raspberrypi.org/documentation/hardware/raspberrypi/bootmodes/msd.md)


+ bootcode.binとtimeoutをFAT32フォーマットしたマイクロSDカードに格納

[Raspberry Pi boot modes - Raspberry Pi Documentation](https://www.google.co.jp/url?sa=t&source=web&rct=j&url=https://www.raspberrypi.org/documentation/hardware/raspberrypi/bootmodes&ved=2ahUKEwift8zPzYjfAhVYMd4KHUV8ABYQFjAAegQIAxAB&usg=AOvVaw3NeIq9nAPwxed4WAn4Sk87)

あとはraspbianを書き込んだUSBメモリがあればOKです。
ネットにはcmdline.txtの編集が必要との記事もありますが現在のraspbianでは不要なようです。


### 残念な推測
本来ならばOTPのフラグを書き換えることでUSBデバイスのOSを読み込み、起動となるはずです。

それに対しマイクロSDカードに2つのファイルを配置してやっと起動出来ている現状から推測するに、__うちのpi3はバグ持ち__であり__SDなしでは起動できない__のです。

ロットで本体の内容が違うのかなぁ。
pointer-eventsの本当の意味

`pointer-events: none` を扱った記事も、リンクを無効にするとか、クリックを無効にするとか書かれていて、`pointer-events`についての説明として間違いとまでは言えないですが、正確ではないので、できるだけ正確な解説をします。

まず[MDNの解説](https://developer.mozilla.org/ja/docs/Web/CSS/pointer-events)は

> 特定のグラフィック要素がマウスイベントの対象になる可能性のある環境 (存在する場合) を設定します。


いまいちよくわかりませんね。
自分なりに説明すれば

**その要素のマウスやタッチで反応する範囲を定義するプロパティ**

ってところです。

[参考用のデモ](https://ksk1015.github.io/pointer-events-demo/)

htmlより細かい指定のできるsvgを例にすると直感的でわかりやすいです。
`pointer-events: fill` を指定すると、塗られた部分のみポインターに反応します。

つまり `pointer-events: none` はポインターに反応する範囲は一切無し、見えてはいるけどポインターに対しては存在しないかのようにふるまいます。
そのためポインターによるホバーやクリックには反応しませんが、キーボードのタブによるフォーカスとエンターによるクリックはできます。
ポインターでクリックしても、ないものとされるので配下がクリックされることになります。

イベントまわりを理解してたら、一見、内部的には`preventDefault`,`stopPropagation`してイベントを無効してるようにも見えますが、そもそもイベントの発火自体していません。
Excel VBAのソースコードをバージョン管理しやすくする

# 概要
Excel VBAのソースコードを、gitやSVNで管理したいです。
そのために、ソースコードをエクスポート/インポートするアドインを作りました。
同じような目的でvbacというものがありますが、こっちはコマンドラインを使わずに操作できます。

以下で公開しています。
https://github.com/minoru-nagasawa/VbaImportExportAddIn

# 使い方
## エクスポート
1. Excel VBAが書かれているExcelブックを開きます。
2. "Export"をクリックします。  
![export.png](https://qiita-image-store.s3.amazonaws.com/0/178867/7874cf0f-575a-1311-fef8-b655fb19f1ec.png)
3. すると、Excelブックと同じ場所にフォルダが作成され、その下にVBAのソースコードがエクスポートされます。  
下記の例は、Book1.xlsmに対してエクスポートした例です。  
Book1.xlsm.srcというフォルダが作成され、その下にソースコードがエクスポートされています。

```
./
├─ Book1.xlsm
│
└─ Book1.xlsm.src
    ├─ Classes
    │      Class1.cls
    │
    ├─ ExcelObjects
    │      Sheet1
    │      ThisWorkbook
    │
    ├─ Forms
    │      UserForm1.frm
    │      UserForm1.frx
    │
    └─ Modules
            Module1.bas
```

## インポート
1. ExcelブックとExcel VBAのソースコードを、エクスポートと同じ構成で置きます。

```
./
├─ Book1.xlsm
│
└─ Book1.xlsm.src
    ├─ Classes
    │      Class1.cls
    │
    ├─ ExcelObjects
    │      Sheet1
    │      ThisWorkbook
    │
    ├─ Forms
    │      UserForm1.frm
    │      UserForm1.frx
    │
    └─ Modules
            Module1.bas
```

2 . Excelブックを開きます。
3. "Import"をクリックします。
![import.png](https://qiita-image-store.s3.amazonaws.com/0/178867/13d2e154-d3c7-5382-705b-566906725521.png)

# インストール方法
1. 起動しているExcelを、全て終了してください。
2. VbaImportExportAddIn.xlamをダウンロードしてください。  
https://github.com/minoru-nagasawa/VbaImportExportAddIn
3. ダウンロードしたファイルを"C:\Users\[Username]\AppData\Roaming\Microsoft\AddIns"にコピーしてください。
4. コピーしたファイルのプロパティを開いて、「許可する」にチェックして、[OK]してください。  
![kyoka.png](https://qiita-image-store.s3.amazonaws.com/0/178867/4e81eec2-4697-9d4a-bf1a-fb5e6f9c2871.png)
5. Excelを起動してください。
6. アドインダイアログを開いてください。 ([Alt] -> [t] -> [i] で開きます)
7. "VbaImportExportAddIn"にチェックを入れて[OK]してください。  
![select-add-in.png](https://qiita-image-store.s3.amazonaws.com/0/178867/9eff9b69-0467-9e2b-9bdc-c4f87b0e17ba.png)
8. [ファイル]-[オプション]→[セキュリティセンター]-[セキュリティセンターの設定]→[マクロの設定]-[VBAプロジェクト・・]にチェックを入れて[OK]してください。  
![security.png](https://qiita-image-store.s3.amazonaws.com/0/178867/5f9c3a58-5a70-33ae-1345-f123793b0eac.png)


# 注意点
エクスポートは、出力フォルダの"マクロ名.src"フォルダを空にしてからエクスポートします。
また、インポートは、ExcelブックのVBAを全削除してからインポートします。
つまり、ExcelブックのVBAと、フォルダ下のソースコードの片方にだけ残すことはできないので注意してください。
【Python】【追記あり】lightgbm の plot_importance のようなグラフを作った際のメモ

## はじめに
最近の git は web サイト上で .ipynb ファイルがレンダリングされます。

そのため、社内の某チームでは分析履歴として gitlab 上で管理しているのですが、
lightgbm の plot_importance で出力したグラフがレンダリングされませんでした。

そこで、自力でどうにかしようと頑張った際の記録となります。

## ゴール
こういうグラフを作りたい(項目名は隠しています)

<img width="696" alt="スクリーンショット 2018-12-07 13.31.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/78126/864200d3-7001-6246-7f39-0825c09b5f5f.png">


予測に使った変数とその重要度を、棒グラフで上から重要な順に表示したものです。


## やったこと

### 準備

```python
import matplotlib.pylab as plt
%matplotlib inline

x = ['a', 'b', 'c', 'd']
y = [1,3,4,2]
```

### ステップ1
とりあえず何も考えず棒グラフ(横)にしてみます。

```python
plt.barh(x,y)
```

<img width="356" alt="キャプチャ.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/78126/43ea572f-4717-a7b6-905c-9e313da3ecc7.png">

もちろん並び順そのままのグラフが出来ます。

### ステップ2
次に、値でソートしたグラフにしてみます。

```python
dict_y = {i: val for i, val in enumerate(y)}
sorted_tmp = sorted(dict_y.items(), key=lambda x: -x[1])
idx = []
vals = []
cols = []
for i, j in enumerate(sorted_tmp):
    idx.append(i)
    vals.append(j[1])
    cols.append(x[j[0]])

plt.barh(idx, vals, tick_label=cols)
```

<img width="356" alt="キャプチャ.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/78126/96e02aa8-2581-036e-1e0c-e0e1649ca49e.png">

降順ソート(下に行くほど重要)のグラフが出来ました。

ちなみに上記のように、一旦 index 順に項目を並べてから、tick_label で項目名を
index → cols に塗り替えてやらないと、ソートされたグラフにはなりませんでした。

`plt.barh(cols, vals)` のようにすると、ステップ1 と同じグラフが出来ました。

### ステップ3
人それぞれだと思いますが、なんか昇順になっているのが気に食わない…
できるなら値が大きいものを上に表示させたい、という気持ちがありました。
（特に今回は何の変数が重要かを示したいので、上に持ってきたかった）

調べたところ、反転させるには `ylim` が使えそうだったので使ってみました。

`ylim` は y 軸の表示範囲指定に使うもので、例えば `ylim(0, 10)` とすれば
y = 0~10 の範囲にグラフ表示が限定されます。

しかし、これを `ylim(10, 0)` のように大きい方の値を第 1 引数にもってくれば
値が反転するらしいのでやってみました。

```python
plt.ylim(max(vals), -1)
plt.barh(idx, vals, tick_label=cols)
```

<img width="363" alt="キャプチャ.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/78126/6dfa8b4a-1dc8-7c50-3e7a-d75976e1fb96.png">

想定通り。lightgbm の plot_importance と同じようなグラフが出来ました。

## まとめ

今回やったことをまとめると以下のようになります。

```python
import matplotlib.pylab as plt
%matplotlib inline

x = ['a', 'b', 'c', 'd']
y = [1,3,4,2]

dict_y = {i: val for i, val in enumerate(y)}
sorted_tmp = sorted(dict_y.items(), key=lambda x: -x[1])
idx = []
vals = []
cols = []
for i, j in enumerate(sorted_tmp):
    idx.append(i)
    vals.append(j[1])
    cols.append(x[j[0]])

plt.ylim(max(vals), -1)
plt.barh(idx, vals, tick_label=cols)
```

## 感想
グラフのソートと軸反転はいつか役立つかもしれないので覚えておきたいと思います。
でも、 pandas とかでもっと簡単にできそうな気もする。。。

あと、そもそもの話になりますが

> lightgbm の plot_importance で出力したグラフがレンダリングされませんでした。

こう言ったけど、本当にレンダリングしてくれないのかなぁ…

## 追記
`lightgbm.plot_importance` に関しては、 `plt.show()` を明示的に入れるだけで
グラフ表示されました。ﾊﾊﾊ

また、1つのセルでグラフ表示と print をしようとすると、片方（先に実装される方）だけが
git 上では表示されるようです…
例えば以下の場合。 グラフは出力されますが print は出力されませんでした。

<img width="720" alt="スクリーンショット 2018-12-18 17.21.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/78126/6674d681-58d9-91a1-357c-70ed564bf153.png">
ネストしがちなRSpecの可読性を高める

# はじめに
私はRailsを最近学びだして実際に簡単な業務からさせていただいている初心者です。
チュートリアルレベルの学んだことから、よりスキルアップするため
実際に動いているサービスのコードを触って気づいたことをまとめたいと思います。
あくまでまだまだ初心者である自分自身の理解を高めるためのアウトプットですので
間違いや勘違い等あればご指摘いただけますと幸いです。
また少しでも同じようなレベルの方の助けになればと思います。

# ネストしがちなRSpecの可読性を高める
タイトル通りですが、（自分にとって）複雑なモデルやメソッドのRSpecを記述している際、どうしてもネストが深くなりすぎることがありました。
特に条件ごとに検証する際の`describe`や`context`あたりが多くなるとどんどん見づらくなって仕方ないので自分なりにまとめてみました。

## 同じ結果を条件ごとに検証するならsubjectにまとめる
例えばこのような、商品のnameが仮に10文字でバリデーションをかけている場合だとかは

```ruby:product.spec
described 'product is valid?' do
 context '0文字の場合' do
  let(:product) { FactoryBot.create(:product, name: 'a' * 0)

  it { is_expected.to be_invalid }
 end

 context '9文字の場合' do
  let(:product) { FactoryBot.create(:product, name: 'a' * 9)

  it { is_expected.to be_invalid }
 end

 context '10文字の場合'do
  let(:product) { FactoryBot.create(:product, name: 'a' * 10)

  it { is_expected.to be_valid }
 end
end
```
のようにすべてのケースでproductを作成していくよりも、
結局検証したい結論(≒subject)はproductが保存できるかどうかなので

```ruby:product.spec
described 'product is valid?' do
 subject(:product) { FactoryBot.create(:product, name: name) }

 context '0文字の場合' do
  let(:name) { '' }

  it { is_expected.to be_invalid }
 end

 context '9文字の場合' do
  let(:name) { 'a' * 9 }

  it { is_expected.to be_invalid }
 end

 context '10文字の場合'do
  let(:name) { 'a' * 10 }

  it { is_expected.to be_valid }
 end
end
```

のように`subject`で事前に共通の処理を定義して、`context`ごとに条件を分けたい部分を渡していく方が見た目的にもスッキリする。

## 使い回す結果はshared_examplesにまとめて呼び出す
また上記のコードの中の

```
it { is_expected.to be_valid }
it { is_expected.to be_invalid }
```

これら含め、例えば

```
it { is_expected.to eq 200 }
```

だとか、正しくレスポンスを受けられているか等の結果は何かと使い回すことが多いので、そういった結果は`shared_examples`にまとめて、`it_behaves_like`で呼び出すと1つ1つのテストコード内での期待する結果がわかりやすい。
さっきのをさらに修正すると

```ruby:product.spec
described 'product is valid?' do
 subject(:product) { FactoryBot.create(:product, name: name) }

 shared_examples '商品は保存できる' do
  it { is_expected.to be_valid }
 end

 shared_examples '商品は保存できない' do
  it { is_expected.to be_invalid }
 end

 context '0文字の場合' do
  let(:name) { '' }

  it_behaves_like '商品は保存できない'
 end

 context '9文字の場合' do
  let(:name) { 'a' * 9 }

  it_behaves_like '商品は保存できない'
 end

 context '10文字の場合'do
  let(:name) { 'a' * 10 }

  it_behaves_like '商品は保存できる'
 end
end
```

のように1つ1つの`context`内での条件と結果がわかりやすくなる。
今回は簡単なテストなのでこれだけですが、`shared_examples`内でもう少し検証が増える場合は

```ruby
 shared_examples '商品は保存できる' do
  it '商品の持つ情報は妥当である' do
   is_expected.to be_valid
  end

  it '商品の名前がhoge' do
   is_expected.to hoge
  end
 end

 shared_examples '商品は保存できない' do
  it '商品の持つ情報は妥当ではない' do
   is_expected.to be_invalid
  end

  it '商品の名前がhoge' do
   is_expected.to hoge
  end
 end
```

のように`shared_examples`内の検証にも文章入れた状態で呼び出せば、
`shared_examples`の中のどの検証で落ちているのかエラーメッセージから読み取りやすくなる。
全体的に文章とかはざっくりアテているので適宜適切な文章に修正してください。

---
大体今気をつけていることはこの辺りかな、と思います。
手元でさっと検証できないので頭に入っていることを書き出したのですが間違い等あればご指摘ください。
またコントローラのrequest specとかでクエリパラメータが正しく渡っているか/渡っていないかのような検証時にも
今回のような条件分けをするとスッキリ見やすくて良かったです。
テストコードが綺麗になるだけでテストコードを書くモチベーションがかなり上がったのと、エラーを拾いやすくなったのでぜひ。
dotnet.exeはどこから来ているのか

# はじめに

.NET Coreでは、ほとんどのコマンドの起点にdotnet(.exe)というものを使う。
しかし、このdotnet.exe、どこから来ているのか、coreclrやcorefxを見てもさっぱりわからなかった。
確かに、実際知らなくてもほとんど問題はないようなものではある。だが、そこは一旦気になりだすと落ち着かなくなる性分なので、色々調べてみたら、最近この辺りかなという所が見えてきたので、書いておく。

# リポジトリ

簡潔に言うと、[core-setup](https://github.com/dotnet/core-setup)というリポジトリで管理している。

## dotnetプロジェクトはどこか

さて、ではどこにdotnet.exeをビルドするプロジェクトがあるかというと、[core-setup/src/corehost/cli/dotnet](https://github.com/dotnet/core-setup/tree/master/src/corehost/cli/dotnet)という場所にcmakeプロジェクトが存在していた。名前からしてこれで間違いないだろう。

## 実装はどこか

[dotnetプロジェクトのCMakeLists.txt](https://github.com/dotnet/core-setup/blob/master/src/corehost/cli/dotnet/CMakeLists.txt)の他に、includeしている*.cmakeを辿っていくと、大体以下のようなファイルを読み込んでいることがわかった。

* [corehost.cpp](https://github.com/dotnet/core-setup/blob/master/src/corehost/corehost.cpp)
    * main関数が存在
* [fx_ver.cpp](https://github.com/dotnet/core-setup/blob/master/src/corehost/cli/fxr/fx_ver.cpp)
* [trace.cpp](https://github.com/dotnet/core-setup/blob/master/src/corehost/common/trace.cpp)
* [utils.cpp](https://github.com/dotnet/core-setup/blob/master/src/corehost/common/utils.cpp)
* [pal.windows.cpp](https://github.com/dotnet/core-setup/blob/master/src/corehost/common/pal.windows.cpp)
    * windowsの場合
* [longfile.windows.cpp](https://github.com/dotnet/core-setup/blob/master/src/corehost/common/longfile.windows.cpp)
    * windowsの場合
* [native.rc](https://github.com/dotnet/core-setup/blob/master/src/corehost/cli/native.rc)
    * windowsの場合
* [pal.unix.cpp](https://github.com/dotnet/core-setup/blob/master/src/corehost/common/pal.unix.cpp)
    * windows以外のOSの場合

もしかしたら他にもあるかもしれないが、大体こんなところだろう。CMakeLists.txt等を見る限りでは、ほとんど準備なしにビルドできそうに見える。

それぞれのファイルが何をしているかについては、書くと結構な分量になることが予想されるので、この記事では書かない。

# 終わりに

core-setupリポジトリを見てみると、self-contained-appをどのように起動しているか、あるいは、dotnet.exeがどのようにパスを解決しているか、という、今までなんとなくブラックボックスにしていた部分もなんとなく見えてくるので、時間があるときに見てみれば、より深くdotnetの内部が見えてくる、かもしれない。
AWS CodeDeployで最新のデプロイ済みの成果物を取得する

# モチベーション
現在の最新のデプロイ済みの成果物の状態を見て処理を分ける必要があり、awscliでサクッと取得できるのか調べたところ、どうやら１発では引けませんでした。
なのでshellにしました。
# スクリプト
```shell
#!/bin/bash
APP_NAME=<set application name>
DEPLOYMENT_GROUP=<set deployment group>

DEPLOY_ID=$(aws deploy list-deployments --application-name ${APP_NAME} --deployment-group-name ${DEPLOYMENT_GROUP} --include-only-statuses Succeeded --max-items 1 --query 'deployments[0]' --output text | head -n1)

BUCKET=$(aws deploy get-deployment --deployment-id ${DEPLOY_ID} --query 'deploymentInfo.revision.s3Location.bucket' --output text)
KEY=$(aws deploy get-deployment --deployment-id ${DEPLOY_ID} --query 'deploymentInfo.revision.s3Location.key' --output text)

aws s3 cp s3://${BUCKET}/${KEY} .
```

s3のバケットとキーをそれぞれ取得するためにapiを２度呼んでるのはjqに依存したくなかったからです。sedも環境に依存するので説明を省略するためにやりませんでした。
1発で情報を取得するなら以下に置き換えれば可能です。

```shell
aws deploy get-deployment --deployment-id ${DEPLOY_ID} --query 'deploymentInfo.revision.s3Location' --output json
```

# 最後に
同じようなシチュエーションで誰かの役に立ったら幸いです。
また、もっとスマートにいけるよ！という方は教えてください :smile:
チーム開発時にお世話になるgitチートシート

今まで実質的に個人でしかコードを書いていませんでしたが、10月に入ってチームで動くようになりgitを用いた開発が増えてきました。元々はSourceTreeでgit管理していたのですが、ソースコードやブランチ量が多くなると動作が重くなり、ブランチの切り替えやgitの修正などを気軽に行うにはちょっと扱いづらくなったため、本格的にCLIのgitを覚える必要性が出てきました。

ここでは、自分がよく使うgitをまとめて、用途別で適切にgitのコマンドを引き出せるようになることを目指します。

## git周りのよく使う基本コマンド
・新しいブランチを作成

```git
$ git checkout -b new-branch
```

・既存のブランチに切り替え

```git
$ git checkout exist-branch
```

・リモートの新しいブランチを取得

```git
$ git fetch -a
```

・ブランチを更新

```git
$ git pull
```

・ブランチ名の変更

```git
$ git branch -m new-name-branch
```

ここから特に使うユースケースについて列挙します

## 一個前のコミットの名前修正したい

```git
$ git commit --amend
```

もし既にリモートにプッシュしている場合はforce pushする必要があります

```git
$ git push -f origin develop
```

## オリジナルのブランチが更新された！変更分を今の開発ブランチに取り込みたい

```git
$ git pull rebase origin develop-branch
```

この時、コンフリクトした場合はエディタで修正して

```git
$ git add .
$ git rebase --continue
```
しましょう。やばくなったら

```git
git rebase --abort
```
でキャンセルできます

## コミットログが汚いのでコミットをまとめて綺麗にしたい
### rebaseを使う方法

```
$ git rebase -i HEAD~3
```
これの場合は3つ前のコミットまで修正。不要なものをfixupして除くことで必要なコミットのみ取り出すことができる。
ただし、自分のコミット以前のコミットまでrebaseに含めるとそこも変更対象になるため注意。
一個一個確実にcommitを取り出す・修正できるがやや面倒

### reset softを使う方法

```
$ git log --oneline
```
まず、gitのlogを出して、自分のまとめたいコミットのログの一番昔地点のポイントをログを確認してチェックする

次に、

```
$ git reset --soft old-branch
```

これにより、old-branchのポイントにHEADを動かすことができる。
ここで、HEADをまとめる

```
$ git commit --amend
```

この結果をpushする。こっちの方法だと、いちいちfixupとかエディタでブランチをどうするか指定する必要がないので楽は楽です。ただし、一部のコミットは残したいなどある場合は前述のrebaseの方が柔軟かと思います。

こうした修正をpushする場合は普通のpushでは弾かれるのでforce pushする必要があります

```
$ git push -f origin develop  
```

## pullrequestを投げたけどなぜか過去の人のコミットが混ざってしまっている

先程のリベース間違いなどで発生します。

この場合は

```
$ git cherry-pick old-branch
```

によって必要なcommitのみを再抽出できます

## ミスって必要なブランチが消えてしまった

```git
$ git reflog
$ git checkout XXXX(logのid)
```

gitの変更履歴・アクションを記録している。そのため、消したブランチなどは上記reflogで確認してからgitcheckoutする必要があります。

## 結論

今日はあっさりめでしたが、チーム開発時のgitの各々のやり方のまとめを行いました。
gitというとなんとなくsource treeとかGUIでやってしまいがちでしたがCUIも覚えておくとプロジェクトが大きい時には結構便利だと感じました。

## 参考文献

[最新のdevelopの取り込みはgit pull --rebase派](https://qiita.com/yanutetsu/items/bdafe41594327a422b00)
[ワーキングツリー、インデックス、HEADを使いこなす方法](https://qiita.com/shuntaro_tamura/items/db1aef9cf9d78db50ffe)
当たり前だけど気持ち良く書けたインクリメントとif文

**※追記**
コメントありがとうございます。とりあえず、qiita書くために例を書いただけで、実際の処理などは確認していませんでした。次からはきちんと確認するようにします。すみません。

#はじめに
今回はコードを書いてて、**自分にとって**気持ちの良いコードが書けたのでなんとなく記事にしてみました。

今回の記事ではインクリメントに関する知識を事前に備えていて欲しいです。デクリメントは、主旨が異なるので触れませんが似たようなものです。

どれも利点はあるのでどれが良いとかはその都度変わってくると思います。
先に言うと私が今回欲しかったのは例３のものです。

また、処理速度に関することは何も考えていません。

#コード内容
do-whileループ内で0~60を繰り返してほしいとします。



#例１
大体が最初こういったコードを書くと思います。

ここでは「**{}**」の中では一つの処理しかしていないですが、それぞれで複数の処理を行うことを想定した場合はこの書き方が一番堅実だと思います。

```cpp:A.cpp
static int timer = 0;
if(timer < 60)
{
	++timer;
}
else
{
	timer = 0;
}
```

#例２
ここでは例１と違い、ただループ用の変数としてtimerを加算し、実際の処理は別空間で行うなどといった場合に使うと思います。

また、コメントアウトで書きましたが、このような形でelseにて複数の処理は特定の場合においてできます。

```cpp:B.cpp
static int timer = 0;
timer < 60 ? ++timer : timer = 0;
// timer < 60 ? ++timer : timer = 0, std::cout << "test" << std::endl;
```

#例３
そんなことより自分が気持ちよくなってしまったコードがこれです。
もうインクリメントとかいうのif文の中で行おうっていうものです。

自分はこの**{}**内でオプション画面にてSE調整のための確認SEの再生を行わせています。

```cpp:C.cpp
static int timer = 0;
if(++timer > 60)
{
	// fujitanozomuさんのコメントのようにここでtimerが61になります。
	timer = 0;
}
```


#最後に
…記事を書き終えた上で言わせてもらえるのであれば言わせてもらいたいのですが…本当にただの自己満です。最後まで読んでくださりありがとうございます。
micro:bitの音を大きな音で楽しもう・アンプ内蔵スピーカーの改造

![2018-12-06_00-12-06_411.jpeg](https://qiita-image-store.s3.amazonaws.com/0/71746/4cac6ee3-ca67-7f79-199d-e1e0e4d54fd8.jpeg)


#内容
micro:bitに付けるタイプのスピーカーの音は小さい！でもそのために別電源は使いたくない！ということでmicro:bitから電源を取れるアンプ内蔵スピーカーを作りました。

#必要なもの
100円ショップで売っている300円のアンプ内蔵スピーカー(本来はUSBケーブルで電源を取る)

#改造方法
—開ける
![2018-12-05_18-14-36_543.jpeg](https://qiita-image-store.s3.amazonaws.com/0/71746/8bc7faff-cfbd-34e3-aeaf-382df12105f9.jpeg)

—VCCとGNDにはんだ付け
![2018-12-05_18-45-31_581.jpeg](https://qiita-image-store.s3.amazonaws.com/0/71746/a18a25fd-4819-bf9f-37d0-f40cddfa6bc0.jpeg)

以上です。
あとはmicro:bit拡張ボード上の3.3VとGNDに接続すればOK!
スピーカー用の電源なしに大音量で楽しめます！

#動作の様子
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">micro:bit用スピーカー改造 <a href="https://t.co/XwIbZMe63G">pic.twitter.com/XwIbZMe63G</a></p>&mdash; Takeshi (@hal2000_jp) <a href="https://twitter.com/hal2000_jp/status/1070346150249562112?ref_src=twsrc%5Etfw">2018年12月5日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
BigQueryで日付ごとに作られたテーブルを検索する Legacy SQL を Standard SQL に変換する

BigQueryで日付ごとに解析したいデータを入れるときの第一オプションは日付によるテーブルパーティショニングだと思います。しかし、テーブルパーティショニングの日付として扱えるフィールドがデータの中にない場合や、テーブルパーティショニングが公開される以前は `table_20181206` のように日付の入ったテーブルを作成することがよく行われていました。

BigQueryではこのようなテーブルを作成すると、従来のコンソール画面では[^1]UI上で日付のプルダウンが作成され、スキーマとプレフィックスが一致していて日付だけが違うテーブルはあたかも同一テーブルであるかのように扱えます。

![スクリーンショット 2018-12-06 00.35.17.png](https://qiita-image-store.s3.amazonaws.com/0/14918/e88e3183-ae21-8dd6-54c1-9dd3ebaab218.png)

しかし、これはあくまでUI上の話で実際には別テーブルなので複数テーブルを扱うクエリを書く必要があります。以前関わっていた仕事では長らく Legacy SQL を使って日付ごとに分割されたテーブルにクエリを書いていましたが、現在では Standard SQL が使えるのでこれを書き換えてみたいと思います。

[^1]: 新しいコンソール画面に慣れていないので今どうなっているかわかりません。

## Legacy SQL と Standard SQL

### Legacy SQL

```sql
SELECT
  spam
FROM
  TABLE_DATE_RANGE([project-999:dataset.table_], TIMESTAMP('2018-12-01'), TIMESTAMP('2018-12-25'))
WHERE
  egg >= 1
```

Legacy SQL では `TABLE_DATE_RANGE` を使って `project-999:dataset.table_` とプレフィックスのついたテーブルを検索しています。`[]` で囲っているのはこれがなければ `:` がシンタックスエラーになるためです。

### Standard SQL

```sql
SELECT
  spam
FROM
  `project-999.dataset.table_*`
WHERE
  _TABLE_SUFFIX BETWEEN '20181201' AND '20181225'
AND
  egg >= 1
```

Standard SQL では `TABLE_DATE_RANGE` が使えないので `_TABLE_SUFFIX` を使っています。プロジェクト名・データセット名・テーブル名は `.` で区切り `[]` ではなくバッククォートで囲います。

### 手作業で変換すべきなのか？

未だ Legacy SQL で書かれているクエリは数多く存在していると思うのでそれがすぐに使えなくなる未来は想像したくありませんが、 "Legacy" と名前がついているので今後は Standard SQL を使ったほうが良いのかと思います。どこかのイベントで Google の中の人に「Legacy SQL を Standard SQL に変換するツールを作らないのか」と質問が投げられていましたが、「Legacy SQL は"スタンダードなSQL" には無い機能があり、単純に変換するのは簡単ではなくできたとしても100%ではない」というニュアンスのことを言っていた気がします。なのでそのようなツールがあったとしてもある程度自分で変換する作業が必要かもしれません。