OmniAICreator/Qiita-1.07M huggingface dataset:
新卒が書いたSQLおさらい

# 概要

研修のまとめ。普段何気なく使っているけれど、そもそもそれ自体に色々と種類とかあるよね？というおさらい。MySQLを前提に書く。

# DBの基本的な考え方

狭き門が良き。あとで変更するかもしれないな・・・と思って制限をゆるくするのはよろしくない。変更することが確実にわかっているのであれば、場合によってはよし。

# SQLのコマンド種別

- データを操作するための言語（データ操作言語：DML）
- データを定義するための言語（データ定義言語：DDL）
- データを制御するための言語（データ制御言語：DCL）


# DML：データ操作言語(Data Manipulation Language)

- INSERT INTO （行データもしくは表データの挿入）
- SELECT 〜 FROM 〜 WHERE （表データの検索、結果集合の取り出し）
- UPDATE 〜 SET （表を更新）
- DELETE FROM （表から特定行の削除）

## INSERT

```SQL
INSERT INTO テーブル名(カラム名1,カラム名2) VALUES(値1,値2)
```

### バルクインサート
１回のINSERT文で復数のデータを登録する方法。
１個１個INSERT文でデータを挿入していくよりも、データを挿入できる速度が高速になる。

```
INSERT INTO users (name, password, email, created_at, updated_at)
VALUES
    ('name_sample1', 'PassW0rd!','sample1@gmail.com', NOW(), NOW()),
    ('name_sample2', 'paSs-WoRd','sample2@gmail.com', NOW(), NOW()),
    ('name_sample3', 'paSS_W0rd!','sample3@gmail.com', NOW(), NOW()),
    ('name_sample4', 'paSS_Word!', 'sample4@gmail.com', NOW(), NOW())
```

PHP/MySQL でレコードを N 件ずつバルクインサート - Born Too Late
http://blog.yuyat.jp/archives/2018

バルクインサートとインサートで処理速度を比較してみた | ニクニクドットミー
http://nikuniku.me/?p=306

## UPDATE

```SQL
UPDATE テーブル名
 SET カラム名2=値2, カラム名3=値3
 WHERE カラム名1=値1
```

## DELETE

```SQL
DELETE FROM テーブル名
 WHERE カラム名1=値1
```

### 物理削除と論理削除
データベースのデータ削除として、物理削除 と 論理削除 の2つの方法がある。

### 物理削除
物理削除とは、SQLのDELETE文を使ってデータベース上からデータを削除してしまう方法。
データベースを触ったことがある人は、この方法でデータを削除していることが多かったのでは？

### 論理削除
論理削除とは、レコードに削除フラグを用意して、削除する際にフラグを有効にすることで、データベース上には 存在するが、システム的にデータが存在しないことにする方法。

論理削除を利用する場合のメリットとしては、データ自体は残っているため、何か問題が発生した際にデータを戻すことができる。逆にデメリットとしては、データが残り続けてるため、データベースのパフォーマンスが低下したり、データを参照する際にフラグを確認するなどがある。

### 物理削除？論理削除？どっちを利用する？
どちらを利用するかは、状況によるので、絶対的な正解はない。
大事なのは、それぞれのメリット・デメリットを理解して、何故そっちを選ぶのかを説明出来ること。

[DELETE_FLAG を付ける前に確認したいこと。@Jxck_](https://qiita.com/Jxck_/items/156d0a231c6968f2a474)


# DDL：データ定義言語(Data Definition Language)

- CREATE （データベースオブジェクト（表、インデックス、制約など）の定義）
- DROP （データベースオブジェクトの削除）
- ALTER （データベースオブジェクトの定義変更）

#### **昨今のフレームワークで "マイグレーション" と呼ばれているものはこの部分を扱うユーティリティ！**

# DCL：データ制御言語(Data Control Language)

- GRANT （特定のデータベース利用者に特定の作業を行う権限を与える）
- REVOKE （特定のデータベース利用者からすでに与えた権限を剥奪する）
- BEGIN （トランザクションの開始）
- COMMIT （トランザクションの確定）
- ROLLBACK （トランザクションの取り消し）
- SAVEPOINT （任意にロールバック地点を設定する）

# WHEREの指定で便利な奴ら

## LIKE(部分一致)

```SQL
SELECT *
 FROM テーブル名1
 WHERE カラム名1 LIKE '文字列%'
    AND  カラム名2 LIKE '%文字列'
    AND  カラム名2 LIKE '%文字列%'
 ORDER BY カラム名1
```

## IN(OR条件でまとめて値を指定して比較)

```SQL
SELECT *
 FROM テーブル名1
 WHERE カラム名1 IN(値1, 値2, 値3)
```

## BETWEEN(範囲指定)

```SQL
SELECT *
FROM テーブル名
WHERE カラム名 BETWEEN 2 AND 3
```

GROUP BYとHAVING
行のグループ化とグループ化したものに対する条件

```SQL
SELECT カラム名1
 FROM テーブル名1
 WHERE カラム名1 = '値1'
GROUP BY カラム名1
SELECT カラム名1, COUNT(カラム名1)
 FROM テーブル名1
 WHERE カラム名1 = '値1'
GROUP BY カラム名1, カラム名2
HAVING COUNT(カラム名1) > 2

```
Sass(SCSS) で CSSハックを使う方法


メディアクエリを含むSCSSで、CSSハックがすんなり使えなかったのでメモ。
(CSS-Grid を IE10/11 に対応させようとした時にハマった)


## まずは解決策

* @media を使ったCSSハックは使えないので、それ以外のものを採用する
* `unquote('') とインターポレーションを使う
* CSSハックの記述は各セレクタごとに必要 (入れ子構造は使えない)
* メディアクエリをブロック中に入れるのはOK

以下、IE10/11 用のCSSハックの記述方法

```scss
#{unquote('_:-ms-input-placeholder, :root')} セレクタ1 {
  // スタイリング
}
#{unquote('_:-ms-input-placeholder, :root')} セレクタ2 {
  // スタイリング
}
```

## 解説

### IE11のみ読み込ませる CSS Hack

[IE8〜11/Edge12〜の各バージョンに対応したCSSハックまとめ | SPYWEB](https://spyweb.media/2017/12/04/ie-edge-css-hacks/)

CSSハックの記述はここを参考にさせてもらった。
今回は、IE10/IE11用のCSSハックを適用したい。

CSSハックは、以下の２種類に分類される。

1. @media を使用したもの
2. _:-ms- で始まりカンマを含むセレクタを使用するもの

#### @media を含むコード には、@media を使うハックは使えない

@media を含まないコードなら@media を使ったCSSハックが問題なく使える。しかし、@mediaを含むコードの場合、@media を入れ子にすると、入れ子にした箇所が変換後に統合されてしまい、その箇所はCSSハックにならなくなる。

```scss
// 変換前
@media screen\0 {
  .selector {
    property: value;
  }
  @media (max-width: 768px) {
    .selector {
      property: value;
    }
  }
}
```

```scss
// 変換後
@media screen\0 {
  .selector {
    property: value;
  }
}
// CSSハックが効かない
@media screen\0 and (max-width: 768px) {
  .selector {
    property: value;
  }
}
```

よって、@media を含むコードには @media を使うハックは使えない。
@media を含まないCSSハックを採用する。今回は IE10/11に対応する以下コードを使う。
(※ただし、このままでは SCSSでは使えない)

```scss
_:-ms-input-placeholder, :root セレクタ {
  // スタイリング
}
```



### セレクタ部分にカンマを含む場合、変換で分割されてしまう

上記コードは、Sass 本来の挙動で以下のように変換される

```scss
// NG、変換後
_:-ms-input-placeholder セレクタ {
  // スタイリング
}
:root セレクタ {
  // スタイリング
}
```

これだともちろん CSSハックにならない。
カンマを含むセレクタ部をそのまま出力させるのに、`unquote('')` を使う必要がある。
さらにセレクタ部分で使うためにインターポレーションにする(そのまま使うとエラーになる)。
結果、以下のようなコードとなる

```scss
#{unquote('_:-ms-input-placeholder, :root')} セレクタ1 {
  // スタイリング
}
```

### ネストでCSSハック部分をまとめることはできない

このようにネストで書けたら見通しが良いのだが、それはできない。

```scss
// NG
#{unquote('_:-ms-input-placeholder, :root')} {
  セレクタ1 {
    // スタイリング
  }
  セレクタ2 {
    // スタイリング
  }
}
```

前段落の例のように、カンマで複数セレクタ記述と解され変換で分割される。
なので、一つづつ CSSハックを書いてやる必要がある。

```scss
// OK (= 冒頭のコード)
#{unquote('_:-ms-input-placeholder, :root')} セレクタ1 {
  // スタイリング
}
#{unquote('_:-ms-input-placeholder, :root')} セレクタ2 {
  // スタイリング
}
```


## 参考記事

* [IE8〜11/Edge12〜の各バージョンに対応したCSSハックまとめ | SPYWEB](https://spyweb.media/2017/12/04/ie-edge-css-hacks/)
* [css - Ignore parts of sass file for parsing - Stack Overflow](https://stackoverflow.com/questions/25136523/ignore-parts-of-sass-file-for-parsing?utm_medium=organic&utm_source=google_rich_qa&utm_campaign=google_rich_qa)
*
JavaでStringの配列をIntegerのListに一括でcastする

# 本記事のサマリ
タイトルの通りですが、例えば標準入力で空白区切りの数値群が与えられて、それをIntegerに一括で置換したいといった場合に使える小技です。
(補足ですが、Javaの場合は、java.util.ScannerのnextInt()を使うと、標準入力を直接Integerとして受け取れるので、標準入力から受け取るという文脈においてはありがたみは薄くなると思います。)

### 対象読者
Javaで標準入力で渡された数値群をList<Integer>にする方法が知りたい方

# String[]をList<Integer>に変換するには
結論：streamAPIを使えばできます

以下のように、streamApiをつかって、あげると実現出来ます。
ミソとしては、map(Integer::valueOf)で、Integerに変換することと、Collectors.toList()で、最終的な結果をListにしてあげること。

```Main.java
import java.util.Arrays;
import java.util.List;
import java.util.ArrayList;
import java.util.stream.Collectors;

public class Main {
    public static void main(String[] args) throws Exception {
        String[] strArray = "1 2 3 4 5".split(" ");
        for( Integer i : strArrayToIntList(strArray) ) {
            System.out.println(i * i);
        }
    }
    
    private static List<Integer> strArrayToIntList(String[] strArray) {
        List<Integer> intList =
          Arrays
            .stream(strArray)
            .map(Integer::valueOf)
            .collect(Collectors.toList());;
        return intList;
    }
}
```
Scrapboxコンテンツを画像つきで編集可能なフォーマットに変換（エクスポート）するには


プロジェクト単位（複数ページ）の一括エクスポートは難しそうですが、ページ単位なら簡単にできたので紹介します。

#概要
　　Scrapbox形式 ⇒ Markdown形式 ⇒ HTML形式 ⇒ 適宜エディタに貼り付け

#手順

１．ScrapboxをMarkdownに変換するブックマークレット
　　https://daiiz.hatenablog.com/entry/2017/02/17/074508
　　でMarkdown形式に変換、表示

２.　表示されたMarkdownを、Gists（https://gist.github.com/ ）で拡張子を「.md」にして保存
　（secret gistでもOK） ※１

3.　表示されたコンテンツを画面上でコピー

4.　Macならメモアプリ等、WindowsならOneNoteやWord等のエディタに貼り付けて、保存



　　　　　　　　　　　　※１ GistsではなくPandoc等でもHTMLに変換できるようです。
【ブロックチェーン論文まとめ②】Performance Benchmarking and Optimizing Hyperledger Fabric Blockchain Platform

#はじめに

昨日に引き続き2報目。

#Title
Performance Benchmarking and Optimizing Hyperledger Fabric Blockchain Platform
https://arxiv.org/abs/1805.11390


#内容
最近、ブロックチェーンプラットホームの人気が高まっている。
Hyperledgerプロジェクトの一つであるHyperledger Fabricはスマートコントラクト、エンドーサ、コミッター、バリデーター、発注者などのさまざまなコンポーネントで構成されています。
ブロックチェーンプラットホームは企業におけるアプリケーションへの応用が期待されているため、我々はHyperledger Fabricのパフォーマンスを特徴付ける包括的な実証研究を実施し、潜在的なパフォーマンスボトルネックを特定してシステムをより深く理解しました。

我々は2段階のアプローチを取りました。


### 第1段階

ブロックサイズ、承認ポリシー、チャネル、リソース割り当て、トランザクションのスループットと待ち時間に関する状態データベースの選択、などのさまざまな設定パラメータの影響を理解し、これらのパラメータの設定に関するさまざまなガイドラインを提供することが目標です。さらに、パフォーマンスのボトルネックとホットスポットを特定することも目的としています。

それにより、以下のようなことが主要なボトルネックであるということが認められました。

- （1）承認ポリシーの検証
- （2）ブロック内のトランザクションの順次ポリシー検証
- （3）状態の検証およびコミット（CouchDBによる）


### 第2段階

第2段階では第１段階での知見を活用し、Hyperledger Fabric v1.0を最適化することに焦点を当てた。
まずは単純な最適化を行い、

- 暗号化コンポーネントにおける承認ポリシーの検証のための積極的なキャッシュ（性能の3倍の向上）
- 承認ポリシーの検証の並列化（7倍の改善）
- 状態検証およびコミットフェーズ中のCouchDBに対する既存のバルク読み取り/書き込み最適化の効果を強化（2.5x改善）
のような成果を得ることができた。

また、さらにこれら3つの最適化をすべて組み合わせることで、全体的なスループットを16倍改善しました（140tps⇒2250tps）。

#Future Work

異なる組織数や組織ごとのノード数など、さまざまなブロックチェーントポロジを使用して、Fabricのスケーラビリティとフォールトトレラント機能を検討予定。
また、さまざまなコンセンサス・アルゴリズムと注文サービス内のノード数が異なるワークロードのパフォーマンスに及ぼす影響を定量化する予定です。

今回の研究では、ネットワークはボトルネックではないと仮定したが、現実世界のセットアップでは、ノードは地理的に分散されている可能性があるため、ネットワークが影響を及ぼす可能性があります。そこで、今後、異なる到着率分布を持つWAN（Wide Area Network）のFabricのパフォーマンスを検討します。
[React Native]importを絶対パスで書く

# やりたいこと

- react-native initで作ったプロジェクトでimportのパスを絶対パスで書きたい
- vscodeの補完やeslintも今まで通り動いてほしい

```js
// bad
import SomeComponent from '../../components/SomeComponent';

// good
import SomeComponent from 'src/components/SomeComponent';
```

## ReactNative

- package.jsonのnameの値がrootパスになる

```json:package.json
{
  "name": "sample",
  ...
}
```

```js:src/components/Foo.js
export default ...
```

```js:src/components/Bar.js
import Foo from 'sample/src/components/Foo';
```

## ESLint

- 動くようになってもこのままだとESLintが警告を出してくる
- ESLintのプラグインを一つ追加する

```
yarn add -D eslint-import-resolver-reactnative
```

- .eslintrcに設定を追加

```yaml:.eslintrc.yaml
settings:
  import/resolver: reactnative
```

```json:.eslintrc.json
{
  "settings": {
    "import/resolver": "reactnative"
  }
}
```

## VSCode

- 最後に補完が効くようにVSCodeに設定を入れる
- `jsconfig.json`というファイルを作って以下のように書けばOK

```json:jsconfig.json
{
  "compilerOptions": {
    "target": "es2015",
    "baseUrl": "./",
    "paths": {
      "sample/*": ["./*"]
    }
  }
}
```
jQuery <form/> submit() の注意 on Firefox

jQueryで動的にFormタグを作成しpost()するというテクニックがありますが、どうもFirefoxでは動かなくなる書き方があるようです。

このような書き方はいずれも正しく動きませんでした。
Chrome/Firefox(モバイル)では動くのに、Firefox(PC)では**data_value**が0固定になってしまいます。

```javascript
	$('<form/>', {'action': 'program.php', 'method': 'post'})
	.append($('<input/>', {'type': 'hidden', 'name': 'data_value'}).val(n))
	.appendTo(document.body)
	.submit(); // NOT WORK
```

```javascript
	$('<form/>', {'action': 'program.php', 'method': 'post'})
	.append($('<input/>', {'type': 'hidden', 'name': 'data_value', 'value': n}))
	.appendTo(document.body)
	.submit(); // NOT WORK
```

```javascript
	$('<form action="program.php" method="post"/>')
	.append($('<input type="hidden" name="data_value"/>').val(n))
	.appendTo(document.body)
	.submit(); // NOT WORK
```

```javascript
	var post = $('<form/>', {'action': 'program.php', 'method': 'post'})
	.append($('<input/>', {'type': 'hidden', 'name': 'data_value', 'value': n}))
	.appendTo(document.body)
	post.submit(); // NOT WORK
```


しかし以下のようにformにidを付与し、idを使ってセレクタで選択し直し、ネイティブのsubmit()を呼ぶと正しく動作します。

```javascript
	$('<form/>', {'action': 'program.php', 'method': 'post', 'id': 'myForm'}) //書き方は自由
	.append($('<input/>', {'type': 'hidden', 'name': 'data_value'}).val(n)) //   ↑
	.appendTo(document.body)
	$("form#myform")[0].submit(); // WORK!
```

海外のフォーラムでもFirefoxでは確実に存在するFormしか受け付けない？
ID無しの**append()**や**appendTo()**ではネイティブのDOMメモリ上の**form[]**に反映されない？
などの憶測が飛び交っていますが、確たる証拠はなさそうです。
ソースコードのタイポを実行時に補正してくれる夢のようなモジュールを作った

Pythonでソースコードのタイポを実行時に補正する `typofixer` というモジュールを作りました。
これでタイポだらけのコードを書いても誰にも文句は言われません。

https://github.com/tag1216/typofixer

# 使い方

`typofixer` をインポートして `enable()`を呼び出せば準備完了です。

```python
import typofixer
typofixer.enable()
```

以下は正規表現を使ってURLの文字列からプロトコルを抜き出す処理を、タイポしまくりのコードで書いた例です。

```python
import typofixer
typofixer.enable()

import regex  # 正：re

p = regex.compairu('^(.+)://.*$')  # 正：compile
m = p.macchi('https://qiita.com')  # 正：match
if m:
    protocol = m.gruupu(1)  # 正：group
    print(protocol))
```

どう見ても動きそうにないコードですが、正常に動作します。

```:実行結果
https
```

タイポに対応しているのは以下の箇所です。

- import文でのタイポ
- インポートしたモジュールの属性

以下の箇所では未対応です。

- 組み込み関数・組み込み型の呼び出し
- ローカル変数

# 注意点

typofixer では指定の名前に最も近い名前を検索して使用しますが、意図したものと違う名前にマッチしてしまう事もあります。
例えば、上の例で `regex.compairu` の部分を `regex.conpyre`にすると `copyreg`にマッチしてしまい正常に動作しません。
この辺りは希望の結果になるようにうまくタイポして下さい。

# 技術解説

仕組みを簡単に説明すると、以下のような処理を行なっています。

- インポート処理をカスタマイズして、import文で指定された名前に最も近い名前のモジュールを検索してロードする
- インポートしたモジュールをラップして、属性にアクセスすると最も近い名前の属性を返す

## インポート処理のカスタマイズ

Pythonではimport文を実行すると先ず `sys.modules` からロード済みのモジュールが検索されます。
ここになかった場合に `sys._import()` が実行されてモジュールがロードされます。

この `sys._import()` を置き換えることでimport処理を書き換えたり、import前後に処理を追加することができます。

通常は完全一致した名前のモジュールがロードされますが、`typofixer` ではインポート可能なモジュールの中から最も近い名前のモジュールを検索してロードするように書き換えています。

参考

- https://docs.python.org/ja/3/reference/import.html

## インポート可能なモジュール一覧の取得

[pkgutil](https://docs.python.org/ja/3/library/pkgutil.html) モジュールではパッケージ・モジュールに関する情報を取得する機能が提供されています。
インポート可能なモジュールを調べるには [`pkgutil.iter_modules()`](https://docs.python.org/ja/3/library/pkgutil.html#pkgutil.iter_modules) を使用します。

## 近い名前の検索

[difflib](https://docs.python.org/ja/3/library/difflib.html) モジュールでは文字列の比較をする機能が提供されています。
文字列の集合から指定の文字列に最も近い文字列を検索するには [`difflib.get_close_matches()`](https://docs.python.org/ja/3/library/difflib.html#difflib.get_close_matches) を使用します。

## `__getattr__` で動的に属性を提供する

`__getattr__` はオブジェクトの属性にアクセスしようとした時にその属性がなかった時に呼ばれる特殊メソッドです。
このメソッドを実装して、指定の名前に最も近い属性を返すようにしています。
メモ：Ubuntu17.10でサスペンド


# 概要
Ubuntu16.04ではデスクトップから電源を停止ではなくサスペンドするボタンがあったが、17.10にアップデートしたら無くなっていた。

# 手順

パッケージをインストール。

```
sudo apt install pm-utils
```

サスペンド。

```
sudo pm-suspend
```


ハイバーネートというサスペンドに似た機能もあるが、そちらは動かなかった。なにか設定がいるのかもしれない。
shで連想配列もどきをする


与えられたキーから値を返す、書き込みはできない読み込みのみの連想配列をする。
似た記事があったら削除します。


```sh:sh
#! /bin/sh

MyData()
{
cat <<EOF
$.りんご Apple
$.ニンジン Carrot
$.レモン[0] Lemon
$.レモン[1].ソーダ Lemonsoda
$.いちご Strawberry
EOF
}

GetValue()
{
  MyData | grep -F "$.$1 " | cut -d' ' -f 2
}

GetValue レモン[1].ソーダ

#Result
#Lemonsoda
```

shで連想配列をしようとすると、変数名の後半部分をキーにする方法


```sh:エラー
Array_りんご=Apple
echo ${Array_りんご}
```

が定石だけれども、データの数が多くなればなるほど、メモリを食うし読み込みが遅くなるし、そもそも日本語の変数名はできないようなので、どうにかできないか考えた結果こうなった。

データ部分の形式はもちろん自由だが、あえてJSONPath-value形式にしておくことで、

```sh
MyData | makrj.sh
```
と、makrj.shに渡すことでJson形式のデータを出力させることができるのでお得。でもこれは別の話。


```JSON:JSON
{
    "りんご": "Apple",
    "ニンジン": "Carrot",
    "レモン": [
        "Lemon",
        {
            "ソーダ": "Lemonsoda"
        }
    ],
    "いちご": "Strawberry"
}
```
Unityで開発したアプリをXcodeでBuild出来ない、なぜならそのXcodeは最新のiOSに対応していない！

macOSが新しくないと最新のXcodeにアップデート出来ず、結果として最新のiOSに対応してくれません。

結果、エラーで
```Could not locate device support files```
とでます。

の、
解決の方法です。

[XcodeにサポートしていないバージョンのiOSを追加する【iOS】](http://kan-kikuchi.hatenablog.com/entry/Could_not_locate_device_support_files)
[Xcode8でiOS11beta端末の動作確認がしたい（iOS11実機ビルドしたい）Could not locate device support files.エラー](https://qiita.com/keroppi0_0/items/e18498956ef29d610a2d)
を見て、
DeviceSupportのみを更新します。

しかしそれだけではまだだめで、

[iOS11の開発環境Xcode9にiOS10やiOS9のSDKを入れる方法](http://blog.livedoor.jp/dodemo118/archives/65840606.html)
[ClipStudioPluginSDKのビルドが出来ない[mac]](https://qiita.com/kuranari/items/ed36c1806ac0fe9cae40)
こちらを見て、BaseSDKも更新します。

そして、
[Xcodeで自分のiPhoneで 起動出来ません。](https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q12156890217)
の通り、
**Build SettingのBase SDK**
と
**GeneralのiOS Deployment Target**
を自分のiPhoneと同じiOSに合わせたら、Build出来るはずです。
[Windows向け]Gitクライアント使い分け

それぞれいいところがあって絞りきれないので使い分けてます。

# Git Bash (Git for Windowsについてくるやつ)
コマンドラインツールとして過不足ないのでそのまま使用。
他のGUIがサポートしてない機能や、オプションを厳密に指定したい時などに使う。
git rebase -iなど。

# Git Gui (Git for Windowsについてくるやつ)
直前のコミットの修正(git commit --amend)に便利。
直前のコミットのメッセージと、コミットしたファイルが全て見える。
（他のツールでは前のコミットのファイルが見えないことが多い）

# TortoiseGit
ブランチごとの関係を見るのにRevision Graphがとても見やすい。
個人開発では使っていないが、チーム開発時のコンフリクト修正時の確認や、
放置されていたり、リベース無しで長期開発してるブランチの発見などにも使用。
![TortoiseGit](https://tortoisegit.org/docs/tortoisegit/images/RevisionGraph.png)
※画像はTortoiseGitの公式ページより

# Sourcetree
~~コミット時、行単位/hunk(コードブロック)単位で制御できるので便利(git add -p {path})。
うっかり空白行やデバッグ用コードをコミットしそうになった時など、エディタに戻らず修正できる。~~
追記：JetBrainsのIDEで可能になったため使わなくなりました。
![Sourcetree](https://qiita-image-store.s3.amazonaws.com/0/244191/8eec8d49-c007-6e77-d932-c91634809c55.png)
ブランチ移動やcheckoutも簡単。

# JetBrains系IDEのgit機能
・ファイルの行単位の変更確認
　バグの原因箇所を特定した時などに、何時から発生し、類似バグはあるか、どう修正するべきか、という調査に使用。
・ファイル単位の変更確認(git log -p {path} と git diff {path})
　上に同じ。
・ディレクトリ単位の変更履歴確認(git log -p {path})
　あまり詳しくない機能を触る時、過去に変更を入れた詳しそうな人をリストアップに使用。

# 最後に
常時全てを立ち上げてるわけではなく、ガッツリ使いたい時以外は他のツールで済ませることも多いです。
が、人に薦めるにはこの数は厳しいのでもう少し絞り込みたいところ。
他におすすめあれば教えていただけると幸いです。
Graphycally shows the GPU usage of the JetsonTX2（ GPUの使用率の表示with gtop）

jetsonTX2にて使用可能な，GPU/CPU使用率可視化ツールの宣伝です。
非日本語環境で書いたので仕方なく拙い英語で書いてありますがそこんとこはご勘弁。

# How to get access to GPU/CPU usage of jetson TX2
Suppose you are using Ubuntu16.04.

Ubuntu System monitor shows you the CPU usage but not GPU usage.

## run sudo ~/tegrastats
The related site is [here](http://www.robotech-note.com/entry/2017/08/27/000740).
Run following scripts:

```
$ sudo ~/tegrastats
RAM 4811/7851MB (lfb 268x4MB) cpu [5%@2032,off,off,4%@2033,6%@2033,2%@2034] EMC 4%@1600 APE 150 GR3D 1%@1134
```
- RAM : memory usage
- cpu : cpu usage@ cpu clock
- GR3D : gpu usage@ gpu clock 


## use gtop
You can use a visualization tool named [gtop](https://github.com/martinkersner/gtop).
Currently, this **original code has an error** so I updated [that code for jetson TX2](https://github.com/YoshiRi/gtop).

The output looks like following:
 
```
CPU 0 [||||||||||||||||||||||||||||                                    46%] 2031
CPU 1 [                                                                 0%] 0
CPU 2 [                                                                 0%] 0
CPU 3 [|||||||||||||||||||||                                           34%] 2030
CPU 4 [||||||||||||||||                                                26%] 2029
CPU 5 [|||||||||||||||||||||                                           34%] 2028
GPU   [|||||||                                                         12%] 1134
Mem   [|||||||||||||||||||||||||||||||||||                     4.40G/7.85G]
      

100


        *                                                     **
        *
        *                                                     **
                                       *                       *
                  *             **                       *     *
              *            *   **                             * **
      ** * *      *       *   **     * **      **    *     * *   *
 50    *    **  **   ***    *  **     *  *  * *         * * *   * *
    ** *  *   *   **    ** * *   ** *      *      *   **         *
      ** *     *  *       **   * *   ** * *    ***      *    *
      *  * **   ** * * ** * ***    ***     ******  *** ******     *
    ***   **** ***  *****    **    *  *   **** *  * * **  ***
    **    *  * **  **    *    *   ***    * **    ***
               *                                  * * *
                                                 *
```

###  Installation

```
git clone https://github.com/YoshiRi/gtop
cd gtop
make
sudo ./gtop
```
UnityでAndroidでBuildする際に失敗するSDK apk JDK等の問題。 「Failed to build apk」

Build and SettingでAndroidをクリック、してBuildを押すと
Android SDKのフォルダを聞かれます。
で、フォルダを指定して、待ってると…
```Failed to build apk```
と出ます。

[UnityでAndroidビルドができなかったときの対処方法](https://niketcha.com/application/unity/unity-android-build)
[unityでアンドロイドでビルドできない。](https://teratail.com/questions/100205)
こちらの記事でやっていることをやる必要があります。

つまり問題は、**JDKのパス**なのです。
JDKのパスがJDK9のパスになってるのを直す必要があります。

[macOS に Oracle Java 8 (JDK) をインストールする手順](https://weblabo.oscasierra.net/java-install-oracle-jdk8-macosx/)
こちらの記事に従いJDK8をインストールし、

![android-sdk.png](https://qiita-image-store.s3.amazonaws.com/0/111089/eb31ea1e-f9f9-46b1-4eea-edf3e0f19f80.png)

ここのJDKのパスをJDK9から8に変更します。
具体的には、
```Java/JavaVirtualMachines/jdk-9.0.1.jdk/Contents/Home```
を
```Java/JavaVirtualMachines/jdk1.8.0_171.jdk/Contents/Home```
にします。

**これでBuildできます。**

---
必要な並列プロセスに対してのみ集団通信をする(コミュニケーター操作の初歩の初歩)

#はじめに
[前回の記事](https://qiita.com/hikaruri/items/eb2e5b0cae38f63c3ff2)で任意の並列数に対応させる方法について触れました。
このとき**必要な並列数をプロセス数が超えたとき**にゼロサイズ配列をMPI_Gatherしてしまい、計算が止まるというヤバいバグに遭遇しました
(詳しい説明はコード公開に合わせて追記します)。

それの回避方法として**並列計算に必要なプロセス間でのみ集団通信を行う**という方法をとれば良いことはわかりましたが、それを実現するにはコミュニケーター操作をする必要があるということがわかり、メモ代わりに記事を書きました。

※2018/6/7追記
MPI_Gathervを使えばゼロサイズ配列のGatherも回避出来るらしい....早く知りたかった....
[参考URL](https://stackoverflow.com/questions/31890523/how-to-use-mpi-gatherv-for-collecting-strings-of-diiferent-length-from-different)

#コミュニケーターとは？
**データのやりとりをするプロセスの集まり**をコミュニケーターって言うらしいです。

`MPI_Init`した後に与えられる
`MPI_COMM_WORLD` は全プロセスを指すコミュニケーター
`MPI_COMM_SELF`　は自分プロセスだけを指すコミュニケーター

グループとはまた違うらしいです。ぶっちゃけ良くわかってません。以下のリンクを読めば詳しいことはわかるのでそちらでお願いします。

参考リンク
1.[http://www.r-ccs.riken.jp/r-ccssite/wp-content/uploads/2016/03/Sp16_MPI_Tsujita_part1.pdf](http://www.r-ccs.riken.jp/r-ccssite/wp-content/uploads/2016/03/Sp16_MPI_Tsujita_part1.pdf)
2.[http://www.hpci-office.jp/invite2/documents2/mpi_20170911.pdf](http://www.hpci-office.jp/invite2/documents2/mpi_20170911.pdf)

#やり方
**必要なプロセスサイズのグループを作る → そこからコミュニケーターが作れる**

という段階を踏む必要があるらしい。

詳しくはリンクを参照
[http://www.hpci-office.jp/invite2/documents2/mpi_20170911.pdf](http://www.hpci-office.jp/invite2/documents2/mpi_20170911.pdf)

#例題
並列数3の計算において
２つのプロセスのコミュニケーター:```comm1```
を作るC言語コード(OpenMPI)です。

```C:MPIcomm1.c
#include <stdio.h>
#include "mpi.h"

#define Host_ID   0

int main(int argc, char *argv[])
{
  int N = 2;
  int i;
 
  int myid, numprocs;
  
  int a = 0;
  
  MPI_Init( &argc, &argv );

  MPI_Comm_size( MPI_COMM_WORLD, &numprocs );
  MPI_Comm_rank( MPI_COMM_WORLD, &myid );

  printf("myid = %d of %d\n", myid, numprocs);
 
 
  /* Create size N group     */
  MPI_Group MPI_GROUP_WORLD, group1; 
  MPI_Comm_group( MPI_COMM_WORLD, &MPI_GROUP_WORLD ); 
  int ranks[N];
  for ( i = 0; i < N; i++ )
    ranks[i] = i;
  MPI_Group_incl( MPI_GROUP_WORLD, N, ranks, &group1 ); 

  /* group -> comm */
  MPI_Comm comm1;
  MPI_Comm_create( MPI_COMM_WORLD, group1, &comm1);

  if ( myid == Host_ID )
    a = 1;
  
  MPI_Barrier(MPI_COMM_WORLD);

  /* Bcast in size N comm   */
  if ( myid < N )
    MPI_Bcast ( &a, 1, MPI_INT, Host_ID, comm1 );
  printf("myid = %d, a = %d\n", myid, a);

  MPI_Barrier(MPI_COMM_WORLD);

  if ( myid == Host_ID )
    a = 2;

  MPI_Barrier(MPI_COMM_WORLD);

  /* Bcast in MPI_COMM_WORLD */
 
  MPI_Bcast ( &a, 1, MPI_INT, Host_ID, MPI_COMM_WORLD );
  printf("myid = %d, a = %d\n", myid, a);


  MPI_Finalize();   
  return 0;
}
```
唯一注意したい場所は
コミュニケーター```comm1```間でのみ```MPI_Bcast```
する時は
```if ( myid < N )　MPI_Bcast ( &a, 1, MPI_INT, Host_ID, comm1 );```
として、**```comm1```に属さないプロセスでは実行しない**ようにする必要があります。
(これを忘れるとエラーが出ます)

```mpirun -np 3``` での実行結果例は

```C:result
myid = 0 of 3
myid = 1 of 3
myid = 2 of 3
myid = 2, a = 0
myid = 0, a = 1
myid = 1, a = 1
myid = 0, a = 2
myid = 1, a = 2
myid = 2, a = 2
```
となりました。
#まとめ
コミュニケーター操作を使って必要なプロセスに対してのみ集団通信を行うことが出来ました。マジで極めるともっと難しいことが出来て超効率の良い計算(インターコミュニケーターとかなんちゃらかんちゃら)が出来るらしいですが、エラー回避の為ならこの程度の知識で十分かもしれません。
OpenFaaSをRubyで使ってみた

# OpenFaaSとは
FaaS(AWS Lambdaみたいな奴)が自前のサーバーで建てられるというフレームワークです。
https://github.com/openfaas/faas
Docker Swarmかkubernetesでクラスタを構築して、それぞれのクラスタ上で作成した関数を載せたDockerコンテナを建てて動かすという感じ。kubernetesの方がスケールするらしいので大規模サービス向け。オープンソースのモニタリングツールであるPrometheusがついてたり、関数管理用のダッシュボードがついてたり割と便利です。

# とりあえず使ってみる
* サーバー側

今回は個人サーバーで動かすのを想定しているのでkubernetesではなくDocker Swarm上でOpenFaaSを起動する。
大体のインストール方法は http://docs.openfaas.com/deployment/docker-swarm/ に書いてある。

* クライアント側

1, faas-cliをインストール

```
curl -sSL https://cli.openfaas.com | sudo sh
```
2, 関数の作成

```
faas-cli new --lang ruby FUNCTION_NAME
```

3, FUNCTION_NAME.ymlの書き換え

```FUNCTION_NAME.yml
provider:
  name: faas
  gateway: http://サーバーのホスト名:OpenFaaSゲートウェイのポート名

functions:
  FUNCTION_NAME:
    lang: ruby
    handler: ./FUNCTION_NAME
    image: Dockerhubのユーザー名/FUNCTION_NAME:latest
```

docker loginしておかないとDocker Hubにプッシュ出来ないので注意。

4, Docker Imageの作成 & プッシュ


```
faas-cli build -f FUNCTION_NAME.yml && faas-cli push -f FUNCTION_NAME.yml
```

5, デプロイ

```
faas-cli deploy -f FUNCTION_NAME.yml
```

うまくいけば　http://サーバーのホスト名:OpenFaaSゲートウェイのポート名/ui/　にアクセスすれば関数一覧にFUNCTION_NAMEが出てくる。
Visual Studio 2017 の表示を英語にしたい

ここでは、Visual Studio 2017 の画面を英語にする方法を紹介します。

なぜそれが必要になったかについて一応説明しておきます。最近 CMake を使い始めたのですが、CMake でコンパイルするときのログが日本語の部分を中心に文字化けして読めないためです。（そのバグさえ直れば日本語に戻しても良いかも。）

## 手順

1. まず、Visual Studio は閉じて Visual Studio Installer を開きます。
2. 更新の表示がある場合は更新をして、変更ボタンをクリックします。（更新しないと変更ボタンが使えません。）
3. 上のタブの言語パックを選択します。
4. 英語にチェックを入れ、右下の変更ボタンをクリックします。
5. インストールが終わったら Visual Studio を開きます。
6. Visual Studio で ツール -> オプション を開きます。
7. 環境の中に国際対応の設定がありますので、そこから言語を English に変更します。
8. Visual Studio を再起動します。
9. （CMake 使用者のみ）C:\Users\(ユーザー名)\CMakeBuilds フォルダの中身をすべて消す。

CMake を使っている場合、最後のをしないとコンパイル時に大量の「Note: including file: ～」が表示されて困ることになります。（日本語のときの情報が残ったままになるのが原因）

## 結果

![image.png](https://qiita-image-store.s3.amazonaws.com/0/229492/91da82a1-8e17-f27d-3a61-dcc6926c2633.png)

表示が英語になりました。
Slack Bot でチャンネル作成等のイベントを通知

会社でSlackを使っていてやっぱり誰かがチャンネルが作成したことが分からないので作成。
同じことを思ってインターネット上で既に色々な人が作成しているので、技術的には目新しくなく、アウトプットの管理として。

※次のようなページ等を参考にさせて貰いました。
http://coxcox.hatenablog.com/entry/2017/08/16/163719

#概要
パブリックチャンネルに関するイベントを指定したチャンネルに通知。
下記は、チャンネル作成を #general に通知している例
![image.png](https://qiita-image-store.s3.amazonaws.com/0/97877/40dd1e92-fcb2-3131-4ae1-4c23de825329.png)

他に、次のようなイベントに対応

* チャンネル削除
* チャンネル名の変更
* チャンネルのアーカイブ
* チャンネルのアーカイブからの復元

SlackのEvents API
https://api.slack.com/events-api

## 構成
上のページと同じ次の構成。ステートレス。
Slack <---> API Gateway <---> Lambda

## AWS側
Node.js は 8.10。
Lambdaはコール元がどこであるかに依存せず汎用的に作成して、APIの利用側とのインタフェースは API Gateway で吸収するのが良いかなと思っていたので、API Gateway では Lambdaプロキシ統合を使用していないが、VTLでの定義そのものや、エラーレスポンスのマッピングが綺麗ではないことを考えると、プロキシ統合してしまった方がいいのだろうか。

# 制限的なこと
* 削除は、通知されたチャンネルIDでチャンネル情報が既に取得できないので、チャンネル名等が取得できない。  
  Bot側でチャンネル情報を保持しておく必要がありそう。ステートレスと相性が悪い。
* プライベートチャンネルは、Bot Userが含まれていないと通知されない。  
作成イベントは通知を確認できなかった。

# Slack Web API
チャンネル名やユーザ名を取得するのに、Web APIを使っている。 
（Eventsでは、基本的にSlack内部で管理されるチャンネルIDやユーザIDが通知されるため ※Eventによる）
https://api.slack.com/web

使用したAPI
`channels.info`＊
`users.profile.get`＊
`chat.postMessage`

# 気づいたこと
Slack APIのTokenには、`OAuth Access Token`、`Bot User OAuth Access Token` の2つがある。

* `OAuth Access Token`：管理画面にログインしているユーザのToken
* `Bot User OAuth Access Token`：Bot UserのToken

管理画面の Scopes から、スコープを設定しても、＊のAPIは、`Bot User OAuth Access Token` だと、パーミッションエラーとなった。
Bot Userで OAuth を行えば良いのだろうけど、どう行えば良いのかわからなかった。
ログインユーザで`OAuth Access Token`を生成してそれを使用した。
逆に自分以外のユーザ情報も取れるのかな？と思ったけど、取得できていた。

# ソースコード
https://github.com/nilesflow/SlackBot

Slack、API Gateway、Lambdaのセットアップ

Lambda コードは、一部を node_modules で 別リポジトリ にしてみた
なので、`git clone` 後、`npm install` を行って zip アップロードする必要がある。

# やりたいこと
* 盛り上がっているチャンネルを通知させたい  
メッセージ全てをイベント通知すると費用もかかりそうなので、どうかなと思った。
今のステートレス構成でそれ以外の Events API だけだと難しそう。  
Cloud Watch でスケジュールイベントと連動して、とかならできそう。（でも、全チャンネル分の情報を取得する必要がある。ので、イベントトリガにできた方がシンプル）
Twitter APIのレートリミットを1日単位に書き直してみる

Twitter APIのレートリミットは公式には15分単位の値が記載されているのですが、実際にAPIを使うとなると1日単位でどのくらいのリクエストを発行できるのか、どのくらいの量のユーザやツイートを検索できるのかまとめてあると便利だなと思ったのでまとめます。

ちなみに僕が使ったエンドポイントのみ記載していくので都度追加していきます。

15分ごとの量はSyncerさんが[こちらのページ](https://syncer.jp/Web/API/Twitter/REST_API/)でまとめているので参照してください。僕がいつもAPIを利用するときに参照している神ページです。

| 項目 | ユーザ認証(/1日) | アプリ認証(/1日) |
|-----------|------------|------------|
| ツイート検索       |        17280回 (最大1728000ツイート) |     43200回 (最大4320000ツイート)     |
|ユーザー検索| 86400回 (最大172800ユーザ)| -|
|フォロワーID| 1440回 (最大7200000ユーザ) | -|
|フォロワーオブジェクト|1440回 (最大28800ユーザ) |-|
|フォローID| 1440回 (最大7200000ユーザ) | -|
|フォローオブジェクト|1440回 (最大28800ユーザ) |-|

随時更新していきます
ターミナルを自分好みにカスタマイズするメモ

# Icebergをダウンロード

ここの
http://cocopon.github.io/iceberg.vim/
`Iceberg for OS X Terminal` をダウンロードして解凍

![スクリーンショット 2018-06-01 11.23.06.png](https://qiita-image-store.s3.amazonaws.com/0/186046/18804f79-5649-d3dd-53d5-0038e1bc0d41.png)





# ターミナルにIcebergを設定

参考：https://qiita.com/kinchiki/items/57e9391128d07819c321

![スクリーンショット 2018-06-01 11.22.32.png](https://qiita-image-store.s3.amazonaws.com/0/186046/cd18a2ca-2869-deec-5a62-e769c4b71ad5.png)

![スクリーンショット 2018-06-01 11.25.17.png](https://qiita-image-store.s3.amazonaws.com/0/186046/9549f7a1-e54f-ad20-bd4f-1abd56f5c4ba.png)

フォントサイズ16pt
カーソルを垂直バー、点滅カーソル
Icebergをデフォルトに変更





# $ の前の部分を変更

参考：https://qiita.com/think-a-lot/items/91c607919b8fcc29c55b

```
$ sudo vim /etc/bashrc 
i //インサートモードに変更
```

`PS1='\h:\W \u\$ '` の箇所を
`PS1="\n\[\033[36m\]\t \w $ \[\033[0m\]"` に変更

```
esc //モード変更
:wq! //上書き保存して終了
```
![スクリーンショット 2018-06-01 12.01.17.png](https://qiita-image-store.s3.amazonaws.com/0/186046/5f2bf2ea-6e4f-aa70-9bd4-668c39b02503.png)

頭に空行が入り、$以前が水色になって見やすい。

※後日さらに改行を足して、深い階層に入っても見やすいようにしました。
`PS1="\n\[\033[36m\]\t \w\n$ \[\033[0m\]"`

![スクリーンショット 2018-06-04 0.54.17.png](https://qiita-image-store.s3.amazonaws.com/0/186046/d8792611-ebb3-b62c-2eae-1799144e8587.png)
スプラッシュウィンドウの実装

さて、とりあえず実際に"ワンドロ開発"をやる･･･前に
サポート用のアプリケーションを作ってしまおう。
機能は簡単で、且つ手間をかけずに･･･


_ところでスプラッシュウィンドウ作ったこと無かったね。_
とか思いついてしまったので実装してみる。


# スプラッシュウィンドウとは？

一言で言うと「起動直後に出てくる小さいロゴっぽいやつ」。
何やってるでもないんだけど、なんかあると気分が上がる。

本来の目的を一応述べておくと
「起動から操作可能になるまで時間がかかる場合に起動してること、起動シーケンスが走ってることを示す」のが目的。
今回の目的だと起動してからUI出るまで1秒かからないので本来必要なかったり。


でもやってみたいからやってみるっていうアグレッシヴさは大事だと思います。

# 実装に向けた調査結果

実装のために色々調べてみたところ、基本的な実装方針は以下の通り。

1. 適当なフォーム作る
1. プログラムのエントリーポイントからスプラッシュウィンドウを呼び出す。

うん。シンプル。

## まずそれっぽいフォームをVisualStudioで作る。

![それっぽいフォーム](https://qiita-image-store.s3.amazonaws.com/0/259679/d1de8515-e7d8-f931-bfb7-45217fade4a4.jpeg)

で、それっぽいフォームがそれっぽい所以はこちら

<details><summary>フォームの枠が無い</summary>
<div>

* コードで実装する場合
  [Form名].FormBorderStyle = FormBorderStyle.None を設定。
* 　VisualStudioのGUIの場合
  [Form名]のプロパティから[表示]-FormBorderStyleを選択し、Noneを設定する。(画像参照)
![スプラッシュフォームのプロパティ](https://qiita-image-store.s3.amazonaws.com/0/259679/e39b25fb-89e3-db91-58f9-e90ac3f6ebd6.jpeg)

</div>
</details>

<details><summary>画面の真ん中に表示される</summary>
<div>

* コードで実装する場合
  [Form名].StartPosition = FormStartPosition.CenterScreen を設定。
* 　VisualStudioのGUIの場合
  [Form名]のプロパティから[表示]-StartPositionを選択し、CenterScreenを設定する。(画像参照)
![スプラッシュフォームのプロパティ](https://qiita-image-store.s3.amazonaws.com/0/259679/e39b25fb-89e3-db91-58f9-e90ac3f6ebd6.jpeg)

</div>
</details>

* 中央にロゴっぽい漢字が出る。（ちなみに「くぐい」と読みます。白鳥のこと。古い呼び方なんだそうな。）
フリーフォントの[衡山毛筆フォント/武蔵システム様](https://opentype.jp/kouzanmouhitufont.htm)をお借りしました。

で、一定時間経ったら消す仕様にしたかったんですが
_そういえばプログレスバー使ったことないね。_
って思ったので以下略

今回はwindows.FormsのTimerとかデリゲート使って色々やってます、が、本筋から思いっきり外れるので割愛。


で、見事（無駄に長い時間）表示されるスプラッシュウィンドウが出来ました。

後はエントリーポイントに仕込むだけですね。
<details><summary>･･･の一文だけで済ますのもアレなので説明。</summary>
<div>
エントリーポイントとは、「プログラムが呼び出された際に初めに実行される関数/メソッドのこと」を言います。
で、通常はMain関数で、古いwindows用アプリケーションだとWinMain()だったりするそうな。
ちなみにVisualStudio2015で新規にWindowsフォームアプリケーションを作成した場合、
エントリーポイントはProgram.csのMainメソッドです。

そのうちエントリーポイントの確認方法とか記事書いた方がいいかも？

</div>

</details>

エントリーポイントに仕込むのは簡単で
フォームをNewしてRunの前にドーン！でOK。
（本来はほかの処理を裏でやってたりするのでモーダル表示じゃなくていいんだけど、今回はモーダルにして無理やり同期させてます。）

![ドーン！](https://qiita-image-store.s3.amazonaws.com/0/259679/91727367-6cc0-afd6-0433-b89abf823ee9.jpeg)

Application.EnableVisualStyles()とかApplication.SetCompatibleTextRenderingDefault()の前に仕込むと怒られます。
ここで描画の設定してんのね。

結果、起動後に見事スプラッシュ画面が（長々と）表示されるようになりましたとさ。

![これが大体10秒続く](https://qiita-image-store.s3.amazonaws.com/0/259679/954af358-9cb6-39bf-0ac7-3c3786ec78b2.jpeg)

---

ちなみに、あまりに表示が長くてめんどくさかったのでGitHubに上げたソースだとここコメントアウトしてます。
~~作ってるときは楽しかったんだけどなぁ･･･~~

18/06/04 追記
編集リクエストありがとうございます！
nuget.org を進化させたサイト fuget.org


[fuget.org](https://www.fuget.org/) というサイトに関するツイートを見掛けてちょっと触ったのですが、病みつきになりそうなほど素晴らしいものでした。

作者さんはこちら。つい先日リリースされたばかりのようです。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="en" dir="ltr">Introducing <a href="https://t.co/S8x80WZiYU">https://t.co/S8x80WZiYU</a> - I built a new nuget package browser that lets you explore APIs and really get to know your libraries. I hope you like it! <a href="https://t.co/1HES5TWgdv">https://t.co/1HES5TWgdv</a></p>&mdash; Frank A. Krueger (@praeclarum) <a href="https://twitter.com/praeclarum/status/1002247165182279680?ref_src=twsrc%5Etfw">2018年5月31日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# fuget.org でできること

[作者さんのブログ](http://praeclarum.org/post/174440517348/introducing-fugetorg) を参考にしつつ、一例として [Newtonsoft.Json](https://www.fuget.org/packages/Newtonsoft.Json/) のページを使って紹介します。

## ライセンスや対応フレームワークが一目でわかる

[nuget.org](https://www.nuget.org/packages/Newtonsoft.Json/) では、ライセンスはいちいち `License Info` のリンク先に飛ぶ必要があるなど、決して解りやすい UI ではありませんでした。
対する [fuget.org](https://www.fuget.org/packages/Newtonsoft.Json/) では必要な情報はページ上部にまとめられています。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/9730/28a8dbdc-5a9e-4209-f2d1-88c1da0984e6.png)

## DLL 内部の名前空間～メソッドが参照可能

ご覧の通りです。
タブを切り替えれば、なんとソースコードも読めます。（デコンパイルしてる？）

![image.png](https://qiita-image-store.s3.amazonaws.com/0/9730/b659ab53-5650-58a1-78b5-2ed00a7bf716.png)

## バージョン間の API の差分が見れる

任意のバージョン間で差分が見れます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/9730/c7e6b530-cdfb-e77e-4b1a-3ab74af788d2.png)

## nuget.org からすぐに移動できる

nuget.org を開いた後に「fuget.org で見たかった」と思っても大丈夫。
nuget.org の URL 体系を踏襲しているようなので、アドレスバーの `nuget` を `fuget` に一文字書き換えれば、検索不要で移動できます。
作ったものまとめ

#はじめに
作ったもの、twitterに上げたもののまとめを備忘録として残して置きます。
ブログにあまり乗っていないような問題の解決策を見つけたりしたら詳細な解説記事も書きたいです。
# FinalIK+HololensでUnityちゃんに手を握ってもらう


<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">Hololens＋FinalIKでUnityちゃんに手を握ってもらった<br>手にホログラムが重なって見えないけど手の位置を認識して追いかけてます<br>色々荒い点もたくさんあるけどまず作ってあげようってGOROmanさんも言ってたので <a href="https://t.co/mB0Pj5nW4s">pic.twitter.com/mB0Pj5nW4s</a></p>&mdash; saga (@tarakkun) <a href="https://twitter.com/tarakkun/status/1000941865976283136?ref_src=twsrc%5Etfw">2018年5月28日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

## 参考にさせて頂いたサイト
HoloLensで俺のこの手が光ってうなる
https://qiita.com/yuujii/items/0d13e963914e1143cebe
FinalIK Tutorial
https://www.youtube.com/watch?v=-eFO8q-I6xI&index=4&list=PLVxSIA1OaTOu8Nos3CalXbJ2DrKnntMv6


# Vuforiaで自宅に電脳少女シロを呼び出してみた 
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">シロちゃんにうちの特設ステージ(58円)で極楽浄土を踊ってもらった(•͈⌔•͈⑅)ﾐﾃﾈﾐﾃﾈ<br><br>yurieさんのモーション<br>LCDさん、hamasuhoさんのモデルをお借りしました<br>＜(c)Siro YouTuber＞ <a href="https://twitter.com/hashtag/SiroArt?src=hash&amp;ref_src=twsrc%5Etfw">#SiroArt</a> ・・・? <a href="https://t.co/Pq435mpLxw">pic.twitter.com/Pq435mpLxw</a></p>&mdash; saga (@tarakkun) <a href="https://twitter.com/tarakkun/status/1002874284342050816?ref_src=twsrc%5Etfw">2018年6月2日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

## 参考にさせて頂いたサイト
[Unity][vuforia]立体をARマーカーとして認識させる ～その1 ARマーカーを登録する～
https://qiita.com/chano2/items/2940f2793d761c5564a4
[Unity][vuforia]立体をARマーカーとして認識させる ～その2 Unityで実装する～
https://qiita.com/chano2/items/6adc323a334abaa254ac
オブジェクト指向

#オブジェクト
オブジェクトとは様々な値や処理などをひとまとめにしたものです。
それぞれのオブジェクトには役割がありますオブジェクトとは部品です。様々な「○○なオブジェクト」、「○○なオブジェクト」。その部品を利用するために必要なもの全てが用意されています。その部品を利用するにはその部品の中に入っている機能を呼び出すだけです。例えば「ウインドウを移動するならそのウインドウの部品にある「移動する」という機能を呼び出します。
複雑な「オブジェクト」という値を利用する仕組みがC#にはあります。
こうした言語を「オブジェクト指向プログラミング言語」と呼びます。

#クラス
クラスとはオブジェクトの「設計図」です。オブジェクトを利用するのに最も重要な機能です。
#クラスの基本の書き方

```csharp
class クラス名
{
    クラス内容
}
```
「Class」という単語の後にクラスの名前を書き、その後にある*{  }*の間に具体的な内容を書きます。
*{ }*のなかには「フィールド」「メソッド」を書きます。

#フィールド
フィールドというのはそのクラスで必要となる情報（様々な値）を保管する変数です。

```csharp
class Person
{
    string name;
    int age;
}
```
「Person」という名前のクラスを作っています。「name」と「age」というフィールドを用意します。これで名前ですと年齢を保管しておくクラスができます。フィールドというのは、基本的にクラスの{}内に変数の宣言文を書きます。

#メソッド
メソッドはさまざまな処理を組み込むのに用いられるものです。

```csharp
返値 メソッド名(引数)
{
    処理;
};
```
**返値**・・・何らかの結果が得られるメソッドではどんなタイプの値が得られるのかを
　　　　　指定します。何の値を得られない時は「void」を指定します。

**引数**・・・メソッドを実行するときに必要となる値があったら、ここで指定します。
　　　　　　　そうすると、メソッドを実行するときに値が受け渡せるようになります。
　　　　　　　この引数は変数の宣言と同じようなか書き方をします。
[ メモ ]  laravel5.6 Seederでデータベース初期データを入れる ログイン情報 ダミーデータ

#Seeder（Seeding）を使い、データベースに初期データを入れる

ログインする為の情報をSeederに書き、データベースに入れることで
ログイン出来るようにする:dancer:
（動作確認でデモデーターをDBに流し込むときに使用することが多い？）

##Seederファイルはどこにあるのか

Seederファイルは、database :arrow_right: seeds :arrow_right: の中にある

###Seederファイルを作成 [:eyes:laravel](https://readouble.com/laravel/5.6/ja/seeding.html)

- Seederはartisanコマンドを叩くと、下記のSeederが生成される

```
php artisan make:seeder シーダー名（TestUsersTableSeeder等の名前）
```


```ruby:TestUsersTableSeeder.php
<?php

use Illuminate\Database\Seeder;

class TestUsersTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        //
    }
}
```

- run( )メソッドの中にデータを入れる<br>
（run( )メソッドはdb:seed artisanコマンドが実行された時に呼び出される）<br>
（使用するテーブルの中に入っている項目に好きなデータを入れていく）

```ruby:TestUsersTableSeeder.php
<?php

use Illuminate\Database\Seeder;

class TestUsersTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        DB::table('users')->insert([
            'name' => 'ユーザー',
            'email' => 'user@test.mail',
            'password' => bcrypt('123456'),
        ]);
    }
}
```

- DatabaseSeederクラスの中のcallメソッドでシーダクラスを呼び出す<br>
:question:特定のファイルを個別に実行したい場合はこの作業をしなくともいいのかな？

```ruby:DatabaseSeeder
<?php

use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        $this->call(TestUsersTableSeeder::class);
    }
}

```

- 上記のデータをデータベースに入れる

:exclamation:データベースにテーブルがまだない場合
マイグレーションを実行しないとテーブルができないので、コマンドで実行
（vagrant ssh → cd ファイル名の中で実行しないとエラーに）

```
php artisan migrate
```

データベースへ初期値を設定するためにdb:seed Artisanコマンドを使用

```
php artisan db:seed

//特定のファイルを個別に実行したい場合
php artisan db:seed --class=追加したSeeder名
```

これでデータベースにデータが入るので、ログイン出来るようになる:grin:


- insert( )メソッド
データベーステーブルにレコードを挿入するためのメソッド
挿入するカラム名と値の配列を引数に取る
（レコードとは、DB内のテーブルを構成する単位のひとつで、一行分のデータを指す）

- bcrypt( )メソッド
BCryptは、パスワードを暗号化にする。DBの中には（$2y$10$Sc）このようにパスワードが表示される
Laravel の Faker に独自にプロバイダーを適用する

## 目的

今まで経験した xUnitで データベースのテストを行うために必要なデータ投入には fixutre を使っていました。
Laravelでは(どこかのバージョンから) Databaseを使うテストにおいて、データを投入する方法に [`Faker`](https://github.com/fzaninotto/Faker) を使います。

https://readouble.com/laravel/5.6/ja/database-testing.html#writing-factories
https://laravel.com/docs/5.6/database-testing#writing-factories

Faker が提供するプロバイダーを使えば多くのデータを準備できますが、データの意味の分かりやすさでいえば、独自のデータを作れると便利です。

Fakerのプロバイダーを作成して、 `database/factories` 配下のファクトリーで使える様にします。下の CategoryFactory.phpが使っている `categoryName` が Fake の独自のプロバイダーです。

```php5:database/factories/CategoryFactory.php
use Faker\Generator as Faker;

$factory->define(App\Category::class, function (Faker $faker) {
    return [
        'category_name' => $faker->categoryName(),
    ];
});
```

## 環境
PHP 7.1.16
Laravel 5.6.11

## 実装

### プロバイダーを作成
`php artsian` で新しいプロバイダーを作成します。

```bash
$ php artisan make:provider FakerServiceProvider
```

追加したプロバイダーは `config/app.php` の `providers` で読み込ませます。

```php:config/app.php
'providers' => [
    // ～ 省略 ～ 
    App\Providers\FakerServiceProvider::class,
]
```

### プロバイダーに実装

標準のFakerは `Illuminate\Database\DatabaseServiceProvider` の `registerEloquentFactory()` メソッドで Laravel のDIコンテナに登録しています。 これを上書きすることで、ファクトリーで使うことができます。 

`Illuminate\Database\Eloquent\Factory` に渡している Fakerのインスタンスとは異なるけどいいのかな :thinking: 

```php5:App/Providers/FakerServiceProvider.php
namespace App\Providers;

use App\Faker\CategoryFaker;
use Illuminate\Support\ServiceProvider;

class FakerServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap services.
     *
     * @return void
     */
    public function boot()
    {
        //
    }

    /**
     * Register services.
     *
     * @return void
     */
    public function register()
    {
        $this->app->singleton(\Faker\Generator::class, function($app) {
            $fackerLocale = $this->app['config']->get('app.faker_locale', 'en_US');
            $faker = \Faker\Factory::create($fackerLocale);
            $faker->addProvider(new CategoryFaker($faker));
            return $faker;
        });

    }
}
```

続いて 値を生成する `App\Faker\CategoryFaker` を実装します。

### fakerのプロバイダー CategoryFaker を実装する

新しい namespace を定義して、プロバイダーを実装します。

```php5:app/Faker/CategoryFaker
namespace App\Faker;

class CategoryFaker extends \Faker\Provider\Base
{
    public function categoryName($nbWords = 5)
    {
        $sentence = $this->generator->sentence($nbWords);
        return substr($sentence, 0, strlen($sentence) - 1);
    }
}
```

### ついでにFakerのローケルを日本語にする

マニュアルにもある通り、 `config/app.php` に定義を追加します。折角なので、 `.env` で変更できる状態にしておきます。

```php5:config/app.php
'faker_locale' => env('APP_FAKER_LOCALE', 'en_US'),
```

```php5:.env
APP_FAKER_LOCALE=ja_JP
```

## 参考

* https://stackoverflow.com/questions/38250776/how-to-implement-your-own-faker-provider-in-laravel
* [Laravelでfakerのlocaleを常時日本固定にする方法](https://qiita.com/shima_6_you/items/83af3b9fe79387d82286)
ライブラリの効率的な勉強法(Reactを例にとって)

# ライブラリの効率的な勉強法(Reactを例にとって)

##はじめに
最近会社に入社したので会社で使われているフレームワークとライブラリ理解する必要がありました。
私はとりあえず先輩方が書いたコードを普通に1から読んでいました。
そして、わからないコードや概念にぶつかるたびにググったり、人に聞いたりということをしていました。

やってみるとわかるのですがこのやり方でフレームワークやライブラリを理解することは非常に難しいものでした。
なのでやり方を変えなければという発想にいたり、試行錯誤して良さげなやり方を見つけました。

過去の自分に見せてあげたい一心で書きました。
おそらく何あたりまえのこと言ってるのという感じの内容だと思いますが、誰かの役にたてれば嬉しいです。

##簡単なアプリを実際に作ってみる。
これにつきます。理解しなければならないコードを読むのもいいですが、本当に0から新しいライブラリを学ぶ場合は読んで理解するのは非常に時間がかかります。
「このファイルはどういう役割なの？」
「実際にいじるファイルはどこなの？」
「逆にいじったらダメなファイルはどこなの？」
というように溢れてくる疑問にはコードをただ読むだけでは答えることができないと思います。

その疑問に答えつつ根本からライブラリを理解するには
実際に作ってみるのが近道だと思います。
具体的な方法を書いていこうと思います。

##公式サイトを見てインストールからやってみる。
公式ドキュメントを読んでインストールからやります。
僕の場合はReactを学ぶ必要があったので
https://reactjs.org/docs/add-react-to-a-new-app.html
このサイトにしたがってインストールを進めていきました。

サイトを読んでいくとオンラインでReactを試すことができるページを紹介してくれたり、
自分のPCに環境はつくらずにとりあえずReactを学ぼうぜというような記述にも出会いますが
今回の目的は実際に自分でゼロから作ってみるということなのでそういう部分はスルーしていきます。

このReactのサイトの例でいくと

```
$ npx create-react-app my-app
$ cd my-app
$ npm start
```

こういう部分をしっかりと自分で手を動かしてやっていく感じです。
この作業をすることで、
「このタイミングでこのファイルができるのか」
「ああこのコマンドこのタイミングで使うのね」
といったことが体系的にわかっていきます。

また、中心人物となるライブラリ(この例ではReact)を先に押さえておくことで周辺のライブラリ（サブキャラ）を中心人物であるReact様の上で試すことができるようになるのでその後の学習も捗ります。

核となるライブラリ(React)のHello World的なアプリを作ることができたので、
次はReactの中で使う他のライブラリの学習方法を見ていきたいと思います。


##他のライブラリの学習方法

**GithubのREADME.mdを読んで実際に試してみる。**
これも当たり前かもしれませんがすごく大事だと思いました。
README.mdを読むと「わかったような気」にはなるのですがいざ書こうという時に
「これってそもそもどういうことだっけ。。」という状態に陥ってしまいます。

また、読むだけで自分で実際にそのライブラリを**導入する**という作業をしていないので
実際に自分でそのライブラリを使って0からアプリを作るというレベルには達しないのかなと思いました。

例をあげます。
僕の場合はReactの中でCSSを使うためのライブラリである[aphrodite](https://github.com/Khan/aphrodite)を学習しようとした段階で詰まりました。

これはaphroditeのリンクです。
https://github.com/Khan/aphrodite
このリンク先のREADME.mdを読めばなんとなく文法などはわかるようにはなるのですが
導入方法をしらないので自分でこのaphroditeを使ってアプリを作るというレベルには達することができません。

そのレベルに達するためにやはりREADME.mdを表面的に読むのではなく
導入からやっていくことが大事なのかなと思いました。

この記事でいうと

```
$ npm install --save aphrodite
```

このような部分です。
これを先ほど作ったReactの簡易アプリの上で試すことで
「どのようにReactにaphroditeを導入するのか」
「実際にaphroditeを使うときの手順」
といったことがわかるようになるので理解度が跳ね上がります。

## まとめ
なんだかんだ一番下にある土台を作ってその土台の上でコツコツ
ライブラリを動作検証しながら試していくのが近道なのかなと思いました。

公式ドキュメントを英語で読まざるをえないから英語もうまくなるし一石二鳥ですね。

「他にこんな勉強法あるよーー」
「ライブラリはこうやって学ぶといいよーー」
というのがあったらぜひ教えてください！
Electronのshell.moveItemToTrashが失敗する時に試すこと

# 環境

- デスクトップアプリ制作フレームワーク Electron 1.3.1
- OS: Windows7

# 経緯

Electronでファイルをゴミ箱に入れるメソッド、`shell.moveItemToTrash`を初めて使ったのですが、常にfalseが返ってきてしまい、うまくいきませんでした。

```javascript
import shell from 'electron';

const fullpath = getFilePath(); // 'c:/path/to/file.js'のような文字列を返す関数
const result = shell.moveItemToTrash(fullpath);
console.log(result); // -> false （失敗）
```


検索しても解決策が見つからないので色々と試したところ、パスの区切りがスラッシュになっていたのが原因で、バックスラッシュに置換したらちゃんと動作するようになりました。

```javascript
import path from 'path'; // 追加
import shell from 'electron';

const fullpath = getFilePath().replace(/\//g, path.sep); // 実行環境のパス区切り文字に置換
const result = shell.moveItemToTrash(fullpath);
console.log(result); // -> true （成功）
```

`shell.showItemInFolder`や`shell.openItem`はスラッシュのままで問題なく動いたので、気づくまでに少し時間がかかりました……。

※最新版のElectron2.0.2でも試してみましたが同様でした。
TouchDesignerでインタラクティブプロジェクション作品の制作プロセス

こちらのイベントでタイトルにあるようなオーディオビジュアル系インタラクティブコンテンツを作成した際のTouchDesignerを用いたプロジェクションマッピングのワークフローについて、備忘録兼ねて解説します。
[RCA-IIS Tokyo Design Lab](https://www.designlab.ac/single-post/TokyoGaikanExpressway)
[Kota Isobe / Future Tunnel](http://kotaisobe.com/portfolio_detail-8.html)

### ・音声の取得
##### マイク
複数チャンネルの入力が必要な場合はRolandのOCTA-CAPTUREなどを用います。
[Roland - OCTA-CAPTURE | 24-bit/192kHz Hi-SPEED USB Audio Interface [UA-1010]](https://www.roland.com/jp/products/octa-capture/)

### ・映像の出力
##### プロジェクター
プロジェクターの検索にはこちらのサイトが非常に便利です。
[Projector Database: Projector Feature Search](http://www.projectorcentral.com/projectors.cfm)
様々なプロジェクターの投影シミュレーションが行えます。最新のプロジェクターや日本でしか販売がないプロジェクターは掲載がない場合がありますが、カタログによくある300インチの大きさに投影できる投影距離が似た機種を探してシミュレーションできます。

予算と投影現場の寸法と投影したい範囲から逆算し、機種と台数でカバーできるか考えていきながら機種選びを行います。複数台用いる場合、レンタルは同じ機種が複数台見つからなかったり準備が不十分になったり適したスペックが見つかりにくかったりとあまり現実的ではありません。
11m*6mの断面のトンネルに投影する目的で今回は短焦点でthrow ratioが小さめのこちらの機種を選定しました。
[BenQ MW632ST Projection Calculator - Throw Distance and Screen Size](http://www.projectorcentral.com/BenQ-MW632ST-projection-calculator-pro.htm)
##### グラフィック環境
GeForce1080を用いると通常4画面出力ができますが、6台のプロジェクターを一枚のGeForce1080から制御したい場合はMatrox TripleHead2Go DP Editionを用意します（また、プロジェクターの調整を現場で確実に行っていくために角度調整機能を備えたスタンドを自作すると良いです。長いHDMIケーブルも用意しましょう）。
[Amazon.com: TripleHead2Go T2G-DP-MIF DP Edition Graphics Card: Computers & Accessories](https://www.amazon.com/TripleHead2Go-T2G-DP-MIF-DP-Graphics-Card/dp/B004FPTQTM)

##### ソフトウェア
フリー版TouchDesignerは最大解像度が1280*720なので、ライセンスを購入し制限を解除します。

### ・ワークフロー
・オーディオリアクティブな映像（投影する元絵）の制作
AudioDeviceInCHOPで音声を取得、現場の環境音を無視するアルゴリズムを組みます。
（ある一定以下の音量は無視するよう閾値を組んでおくとインタラクションが体験者にとって明確になります）
↓
GPGPUシェーダーのGeometryCOMPやParticleSOPのパラメータにCHOPを組み込み、TOPをCHOPと関連付けます。
↓
音声にインタラクティブなTOPを背景など他アセットのTOPにOverしていきます。

・完成した絵を適切にプロジェクターに分配していく
完成絵をプロジェクターの配置に従って分割していきつつ、プロジェクター同士のエッジブレンディングと形状の調整をソフト側で行っていきます。
↓
現場での調整作業を効率化するために、
1.操作するパラメータのコンポーネント群を最上階層に集約するか、独自のUIを作成します。
2.自動で各画面にボーダーレス全画面表示する機能を実装します
↓
現場で色味やモノの大きさや音声関係のパラメータ、ブレンディングpixel数、Stonerを調整しきちんと動くようにします。

・インスタレーションのアーカイブ
SpoutでUnityに映像を転送しVRで追体験できるようにします。

以上です。ワークフローについて、別記事で詳細を追加していきます。

##### おまけ
私事ではありますが、公益財団法人クマ財団よりクリエイター二期生として選出していただきました。3月に表参道スパイラルにて行われる展覧会での制作物発表に向けて技術を磨いていければと思います。
centosのデフォルトのvimで最新のdeinを使おうとしたらハマった話


# 環境
CentOS release 6.6 (Final)
vim 7.4.629
dein 1.5

# 概要
vimのプラグイン管理ツールのdeinの最新版(1.5)をCentOSのデフォルトのvimで使用したら使えなかった話です。

# エラー内容
```
Error detected while processing function dein#begin..dein#util#_begin..dein#util#_error..<SNR>11_msg2list:
line    1:
E121: Undefined variable: v:t_list
E15: Invalid expression: type(a:expr) ==# v:t_list ? a:expr : split(a:expr, '\n')
Error detected while processing function dein#begin..dein#util#_begin..dein#util#_error:
line    1:
E714: List required
Press ENTER or type command to continue
```

# 調査
`Undefined variable: v:t_list` がエラーの内容らしい。
調べたところvim7.4.2071から追加されたのが`v:t_xxx`らしい。CentOS6系や7系のデフォルトだとこれより古いバージョンが入っているのが原因みたいです。
（最新のCnetOSバージョンまで調べた訳ではないので例外はあるかもしれません）

# 結論
どうやらvim7.4のサポートをしなくなったらしいです。vim8系であればサポートがあるらしいです。
https://github.com/Shougo/dein.vim/issues/250
もしかしたら最新のvim7.4系なら動くかもしれませんが未検証&動いても今後のサポートがあるかは不明です。

# 解決方法
deinをインストールしたディレクトリに移動して以下を実行。

```
git checkout 1.0
```
deinを古いバージョンにすることでしのぎました。（投稿時の最新のtagは1.5）
0.0==-0.0はTrueだけど違う値だよという話

タイトル通りです。
bitを比較すると当然等値ではないですが、floatとして比較すると等値です。


```cpp
#include <iostream>
#include <bitset>
using namespace std;
union d {
    float f;
    bitset<32> b;
};
int main()
{
    d x{0}, y{0};
    y.f *= -1;
    assert(x.f == y.f); //等値
    assert(x.b != y.b); //等値ではない
    cout << x.f << endl;
    cout << y.f << endl;
}

//実行結果
0
-0
```
これはIEEEの浮動小数点に関する規格に**+0と-0は区別するけど、orderの比較では等価として扱うよ**と定められているからです。
https://en.wikipedia.org/wiki/IEEE_754


## そもそもなぜ0と-0なんてあるのか

整数型が補数で負の値を表すのに対して、浮動小数点型は最上位ビットの違いで符号を表します。
なので浮動小数点型では-0と0という２つの値を表すことができます。

```bash
floatだよ
x: 0 -> 00000000000000000000000000000000
y:-0 -> 10000000000000000000000000000000
```

これは1/xみたいに0周辺で不連続な関数において、0と-0の違いがあると実装が楽だからとか。

```cpp
#include <iostream>
#include <cmath>
using namespace std;    
int main()
{
    float a = 0, b = -a;
    //0と-0で結果の変わる演算
    cout << 1/a << endl;
    cout << 1/b << endl;
}

//実行結果
inf
-inf
```

##どうすれば区別できるの？
c++の場合はどうしても比較したいときは0周辺のときだけstd::signbitとかつかうと良いのですかね。

```cpp
float a = 0, b = -a;
cout << std::signbit(a) << endl; // 0
cout << std::signbit(b) << endl; // 1
```

pythonとかだとどうすればいいんでしょうか。。。わかりません！