OmniAICreator/Qiita-1.07M huggingface dataset:
GLFW on Rust 環境構築

### 1. 各種インストール

```shell-session:Rust
$ curl https://sh.rustup.rs -sSf | sh
```

```shell-session:GLFW
$ brew install cmake glfw
```

### 2. プロジェクト作成

```shell-session
$ cargo new hello_glfw --bin
$ cd hello_glfw
```

### 3. [glfw-rs](https://github.com/PistonDevelopers/glfw-rs) をプロジェクトに追加する

```toml:Cargo.toml
[package]
name = "hello_glfw"
version = "0.1.0"
authors = ["Seibe TAKAHASHI"]

[dependencies.glfw]
git = "https://github.com/bjz/glfw-rs.git"
```

### 4. [glfw-rs](https://github.com/PistonDevelopers/glfw-rs) のサンプルをビルド

```rust:src/main.rs
extern crate glfw;

use glfw::{Action, Context, Key};

fn main() {
    let mut glfw = glfw::init(glfw::FAIL_ON_ERRORS).unwrap();

    let (mut window, events) = glfw.create_window(300, 300, "Hello this is window", glfw::WindowMode::Windowed)
        .expect("Failed to create GLFW window.");

    window.set_key_polling(true);
    window.make_current();

    while !window.should_close() {
        glfw.poll_events();
        for (_, event) in glfw::flush_messages(&events) {
            handle_window_event(&mut window, event);
        }
    }
}

fn handle_window_event(window: &mut glfw::Window, event: glfw::WindowEvent) {
    match event {
        glfw::WindowEvent::Key(Key::Escape, _, Action::Press, _) => {
            window.set_should_close(true)
        }
        _ => {}
    }
}
```

```shell-session
$ cargo run
```

<img width="412" alt="スクリーンショット 2018-10-27 08.46.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/60718/2b81109b-80e8-d34f-68f9-8aa941dbff67.png">
KerasのImageDataGeneratorにおけるbrightness_rangeの挙動

自分の備忘録/メモも兼ねて。

画像認識系のDeep Learningする際に、訓練データ（画像）を回転させたり左右反転したり、とデータの水増し（data augumentation）することってよくあると思います。Kerasでは、ImageDataGeneratorクラスを使って簡単に水増しできちゃうわけですが、その際のオプション「brightness_range」の挙動について。

###Kerasのbrigtness_rangeとは
brightness_rangeは、画像データの水増しの際に、明るさをランダムに変更するオプションです。こんな感じでImageDataGeneratorのコンストラクタに、brightness_rangeのオプションとして、明るさ変更の強度の範囲をタプルかリストで渡すだけです。あとはflowとかflow_from_directoryとかに上記を渡してあげると、ランダムに明るさを変えた画像を返すジェネレータを作ってくれます。fit_generatorにそのジェネレータを渡せば学習しながら画像を水増ししてくれて大変便利です。
（ImageDataGeneratorについて：https://keras.io/ja/preprocessing/image/）

```
from keras.preprocessing.image import ImageDataGenerator

img_gen = ImageDataGenerator(brightness_range=(0.3, 1.0))
model.fit_generator(
        flow(img_gen), steps_per_epoch=100, epochs=10
)
```


###試してみたところおかしい
おかしいです。うまく学習が進みません。よく見てみると、brightness_rangeオプションを付けると、0-1値の範囲の画像を入力してるのに、どうやら0-255の範囲に変換されてしまっているよう… ちなみに使っているのは、Google Colabに最初から入っているバージョン2.1.6のKerasです。

※同様の指摘がこちらにありました。
https://github.com/keras-team/keras/issues/10366#issuecomment-449545374

とりあえず上記の現象を回避するために、ジェネレータから吐き出された画像を再度rescaleする処理を追加しましたが、うまく回避する方法ないものでしょうか。詳しい人教えてください。
Unity シェーダープログラムを始めて分かったこと

#はじめに
2018/10/19から2018/10/26までの１週間、Unityのシェーダープログラムを始めました。この期間中に分かったことをまとめます。

#1.何から始めたらいいのか分からない
ここは、ツイッターでtakaokaさんが発言していたツイートを思い出し、Boothで販売中の書籍「Unity Shader Programming Vol.01 」を購入して読みました。簡潔で小さな内容を順序だてて解説してくれます。
https://twitter.com/takaoka_hide/status/1027332007108341765

#2.Unityシェーダープログラムには、プログラムできる部分が沢山ある
SurfaceシェーダーとVertexシェーダーとFragmentシェーダーと固定関数シェーダーがある。
https://docs.unity3d.com/ja/current/Manual/ShadersOverview.html

#3.順序だてて学習することが難しい
知っておいたほうがいい知識、理解しておかないといけないことが沢山。
レンダリング回り？、DirectX？、構造体？、プログラムの基礎？
分からないを調べると、その先に分からないがあり、分からないが次から次へと増える。
知りたかったことはいったい何だったのか分からなくなりそうになる。。（諦めないでマイペースに！ちゃんと進んでるよ★）
唯一分かるのは、分からないことがドンドン分かっていく…

#上記を踏まえて
Unityのシェーダープログラムを学習するのに良いと思う流れを下記にまとめます。（私も現在進行形で勉強中ですので参考までにお願いします。）

##1.Boothで販売中の書籍「Unity Shader Programming Vol.01 」を２周読む
２周目は、他のサイトを回り苦しんだ後にもう１度戻って読み直す。

##2.自分の表現したいシェーダーのサンプルをネットで探してざっと見る

##3.分からないことをメモする
この時に、重要なことがSurfaceシェーダーとフラグメントシェーダーのプログラムには構文に違いがある事を知ることです。
構文の違いで必要なルールが沢山あります。
下記のqiitaにとても分かりやすくまとめられていました。
r-ngtm様、本当にありがとうございます。
https://qiita.com/r-ngtm/items/05eb20e230f3ebe2b19f

##4.コツコツマイペースで学習する
挫折しないように、マイペースに。

#１週間の学習でのオススメしたいと思ったサイトと書籍を紹介
繰り返し紹介する部分もありますがご了承ください。加えて、独断と偏見で選んでいますので参考までにお願いします。

##公式Unity　シェーダーを書く
https://docs.unity3d.com/ja/current/Manual/ShadersOverview.html

##Booth書籍：Unity Shader Programming Vol.01 　著者：XJINE's
https://booth.pm/ja/items/931290

##【Unity】Surfaceシェーダーとフラグメントシェーダーの違いを軽くまとめてみた
https://qiita.com/r-ngtm/items/05eb20e230f3ebe2b19f

##Unityのシェーダーセマンティクスまとめ
https://qiita.com/sune2/items/fa5d50d9ea9bd48761b2

##書籍：プログラムはなぜ動くのか　第２版　知っておきたいプログラムの基礎知識
https://amzn.to/2SpfU7k

##Unity のシェーダの基礎を勉強してみたのでやる気出してまとめてみた
http://tips.hecomi.com/entry/2014/03/16/233943

#おわりに
最後まで読んでくださりありがとうございます。
引き続き、シェーダープログラム学習していきます。
学習を続け、分かったことが増えましたら更新していきます。
SourceTreeで強制プッシュできない（サブモジュールの更新確認が一瞬表示されて戻される）

# 状況

pushダイアログの下部の"強制プッシュ"にチェックを入れて強制プッシュしようとしたとき、サブモジュールの更新確認ダイアログが一瞬表示されたあと何事もなかったかのようにダイアログに戻される

サブモジュールのリポジトリには特に変更を加えていない

同じ現象に2度遭遇したわけではないので、同じ状況を作れるかは分かんない

![rapture_20181027045450.png](https://qiita-image-store.s3.amazonaws.com/0/68544/1d8b2157-8d66-736a-3f07-29021d291955.png)


# 対処

とりあえずの対処でしかないけど、
sourcetreeのオプション->Git->コミットやプッシュの前にサブモジュールを調べる　のチェックを一時的に外した

# 原因と考えているもの

リベースでコミットを整えた後の強制プッシュなので、そこら辺が何か悪さをしているのかも...?
（和文用）Mac(Majave10.14)+VSCode(1.28.2)でupLaTeXの環境構築をしてみた(2018/10/27でエラーなし)

# Abstract
- (もしLaTeX初心者なら)[LaTeX入門](https://texwiki.texjp.org/?LaTeX%E5%85%A5%E9%96%80)で概要把握しよう．LaTeXが怖そうなものからかっこいいものにチェンジするはず．
- [ここ](http://doratex.hatenablog.jp/entry/20180501/1525144736#4)を参考にしてMacにTeXを突っ込もう．依存関係とかは調べきれてないので，MacTeXとか怖そうとか思ったら適当に頑張って．
- [ここ](https://qiita.com/SUZUKI_Masaya/items/7fb5509006163e7e671f)を参考にしてVSCodeのセットアップして．[ptex2pdf](http://www.preining.info/blog/software-projects/ptex2pdf/)とbibtexとかだけで十分な気がする．
- 先ほどのリンクの設定だけだと実はうまく動かなくて，[ここ](https://texwiki.texjp.org/?upTeX%2CupLaTeX)に書かれているように-no-guess-input-encオプションを入れよう．時間が溶ける．
- ポイントシステムに厳しいうちの学科みたいなところだと，secdotっていうのが使える．

# はじめに
こんにちは，しゅういちと言います．
普段は競技プログラミングをサボったり，Rustを始めたりしています．Rust最高ですね．
Qiitaは初めてで，[Twitter](https://twitter.com/hideh_1231)に生息したり，はてなさんで[ブログ](http://ups.hatenablog.jp)を書いたりしています．

さて，今回講義の実験レポートをLaTeXで書こうとしたら，色々と詰まって調べたので，同じことをする人が減ればと思い書かせて頂きました．

# 中身
## Macへの導入
[ここ](http://doratex.hatenablog.jp/entry/20180501/1525144736#4)を参考にしてMacにTeXを突っ込みましょう．
既存の別経由で導入したLaTeXとの依存関係はどうなのかとかは調べてないし，ディストリビューション怖そう...MacTeXとか怖そう...とか思ったら適当に頑張ってください．応援しています．
ただ，TeXShop以降の設定はいらないと思います．

## VSCodeに拡張機能導入
[ここ](https://qiita.com/SUZUKI_Masaya/items/7fb5509006163e7e671f)を参考にしてVSCodeのセットアップしましょう．
ここに書かれているpdflatexは最近後続のlualatexに置き換わるらしいので別に削除していいと思います．というより，他のエンジンと記法が違うので，あなたが万一autodetect-enginオプションを入れたときめんどくささが襲ってきます．
また普通のpLaTeXもUTF-8使えないし，後続のlualatexはドキュメント少なくてつらそうやし日本では流行ってないし...と思ったらupLaTexの方でいいと思います．[ここ](https://qiita.com/zr_tex8r/items/5c14042078b20edbfb07)とか詳しく載っていますね．githubの方を見るのもいいかもですね．
latexmk？そこまでこだわらないというかそのあたりの細々としたことはVSCodeさんがよしなにしてくれるので，そんなものより[ptex2pdf](http://www.preining.info/blog/software-projects/ptex2pdf/)の方がいいですね．詳しくわからない人にとってはありがたいです．

## 注意すべきところ
[ここ](https://texwiki.texjp.org/?upTeX%2CupLaTeX)に書かれているように，先ほど編集したsettings.jsonのptex2pdfのtoolのオプションのところに-no-guess-input-encオプションを入れましょう．時間が溶けます．

## upLaTeX（というよりjsarticle）記法について
[ここ](https://qiita.com/Aruneko/items/13e015bce0112143f277)とか[ここ](https://qiita.com/zr_tex8r/items/297154ca924749e62471#%E3%81%9D%E3%81%AE8%E7%94%A8%E7%B4%99%E3%82%B5%E3%82%A4%E3%82%BA%E3%81%AE%E6%89%B1%E3%81%84%E3%81%8C%E3%82%A2%E3%83%AC)とか[ここ](http://www.yamamo10.jp/~yamamoto/comp/latex/make_doc/insert_fig/index.php)が参考になりました．
他にも2段組で画像は段組をまたがるようにしたい場合は[こちら](https://www.lightstone.co.jp/latex/kb0069.html)なんかがよかったです．

# おわりに
初心者なりに調べてみて，その成果をせっかくなのでまとめてみました．他の人々が環境構築で消費してしまう無駄な時間を削除する一助になればと思います．
以上長文読んでくださりありがとうございました．

# 現在のテンプレ
```tex
\documentclass[uplatex, dvipdfmx, a4paper, twocolumn, dvipdfmx]{jsarticle}
\usepackage[dvipdfm, pass]{geometry}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage{graphicx}
\usepackage[hang,small,bf]{caption}
\usepackage[subrefformat=parens]{subcaption}
\captionsetup{compatibility=false}
\usepackage{exscale}
\usepackage{tocloft}
\usepackage{secdot}
\renewcommand{\cftsecaftersnum}{.}

\title{title}
\author{I\hspace{-.1em}Vグループ ?班 \\ ID Name}
\date{date}
  \begin{document}
  \twocolumn[
    \setcounter{tocdepth}{1}
    \tableofcontents
  ]
  \clearpage
```
Slackbotでwikipediaのランダムな記事を表示させる

なんとなくネットを眺めていたらPythonの[wikipediaモジュール](https://wikipedia.readthedocs.io/en/latest/code.html)なるものを発見しました。どうやらWikipediaのページを取得できるらしい…

ということで[こちら](https://qiita.com/croissant1028/items/8d6334b76576762df349)で作ったBotに組み込んで使ってみました。

```wikipedia.py
# coding: utf-8

from slackbot.bot import respond_to
import wikipedia

@respond_to('wikipedia')
def get_random_wikipedia_page(message):
    # set_langにjaを指定することで日本語の記事のみ取得します
    wikipedia.set_lang("ja")
    message.reply("https://ja.wikipedia.org/wiki/" + wikipedia.random())
```

以下、取得したページの一例。絶対自分では調べないようなページが出てきて、ちょっと楽しい。
<img width="660" alt="スクリーンショット_2018-10-27_3_35_31.png" src="https://qiita-image-store.s3.amazonaws.com/0/113160/1423b12a-5adb-6b8e-6d82-71aa64771caa.png">
<img width="652" alt="スクリーンショット_2018-10-27_3_35_47.png" src="https://qiita-image-store.s3.amazonaws.com/0/113160/428b8edb-53e7-b485-5179-bb2d3a95c06c.png">
<img width="640" alt="スクリーンショット_2018-10-27_3_36_12.png" src="https://qiita-image-store.s3.amazonaws.com/0/113160/519b23a4-4bf0-2ba6-f1b1-f3e6c5079864.png">
<img width="648" alt="スクリーンショット_2018-10-27_3_36_22.png" src="https://qiita-image-store.s3.amazonaws.com/0/113160/2c66579a-0736-00f5-1e60-fc04082d41e8.png">
<img width="643" alt="スクリーンショット_2018-10-27_3_39_00.png" src="https://qiita-image-store.s3.amazonaws.com/0/113160/153e660c-9a78-fd77-1da7-fe90a5fbcb13.png">
Vuex.store.stateの値をmutationsで変更しようとしたら、mutationsを使わずに値を変えるなと怒られた

タイトルの日本語がおかしい気もしますが、タイトル通りの状況で困ったので記録に残そうと思います。

## 状況説明

　Nuxt.jsでVueコンポーネントのinputフォームから入力された値を使って、Vuex.store に登録した stateの値を書き換える、シンプルな機能を実装しようとしたところ、下記のエラーがでて、動作が止まってしまいました。

```plaintext
null: Error: [vuex] Do not mutate vuex store state outside mutation handlers.
null: Object {statusCode: <accessor>, message: <accessor>, __ob__: Observer}
```

コンポーネントはこちら

```vue:inputComp.vue
<template>
	<div>
        <input text="Number" @input="inputedNum" />
        <button @click="updateStore" />
    </div>
</template>
<script>
    export default {
        prop: ['id', 'key'],
        data() {
            inputedNum: 0
        },
        methods: {
            updateStore() {
                $store.commit('updateStore', {
                    id: this.id,
                    key: this.key,
                    value: this.inputedNum
                })
            },
        },
    }
</script>
```

store/index.js はこちら

```javascript:store/index.js
export const state = () =>({
  ...
  data: [
	{ id: 0, piyo: 0, piyopiyo: 0 ... },
	{ id: 1, piyo: 0, piyopiyo: 0 ... },
	{ id: 2, piyo: 0, piyopiyo: 0 ... },
	...
  ],
})

export const mutations = {
  updateStore(state, payload) {
    state.data.forEach((el, index) => {
      if (el.id === payload._id) {
        data[index][payload.key] = payload.value
      }
    })
  },
}
```

この時点で、「あっ…（察し）」となった方も多いかと思います。



## 原因

　結局のところ、数値の値をもつ連想配列のvalueに対して文字列を代入していたことがエラーの原因でした。

inputされた値は文字列として扱われている（当然といえば当然）ので、これを数値に変換してあげる必要がありました。

~~じゃあmutations外から値を変えるなとか言うなよ…~~

## 学び

- TypeScriptを使え
- Vue DevTools をもっと上手に使え

実際のコードはもうちょっといろいろあるので、他の場所で勝手に値が変わってしまってるのかと思って、

いろいろ探し回っていたら2時間が経っていました。

そしてもう一度Vue devToolsをつかってVuex.store.stateにどんな値が入っているのかを確認したら、入力値が文字列になっていることに気づけました。。。

Vue DevTools は早く使いこなせるようになったほうがいいです。



## そして

そもそも迷う原因となったVuexのメッセージがどういう経路で出ているのか実装を追ってみたいなと思いました。適切なメッセージが出せるのであれば、ぼくみたいな初心者にももうちょっと優しくなれるかもしれませんし。みつけたらプルリクのチャンスかも。
yacc/lexで詰まったこと

##詰まったこと

readlineをincludeしようと思ったが，

```
Undefined symbols for architecture x86_64:
  "_readline", referenced from:
      _my_yyinput in lex-bb826e.o
ld: symbol(s) not found for architecture x86_64
```

というようなエラーが出た．


##解決策
コンパイル時にライブラリをリンクしてあげる必要があったようだ．
```-lreadline```オプションをつければ大丈夫！

##詰まったこと
readlineを使って文字列の読み込みを可能にしようとしたが，どうもうまくいかない．．
具体的には

```
>>1+1
1+1
>>fdsawf
fdsawf
>>fda
fda
>>1+1
1+1
syntax error
```

みたいなエラーが．．．

色々試したところ，どうやら改行記号が読めていなかったようだと結論．
構文規則を変更することに．．．

##解決策

とりあえず，改行はreadlineでは読めないようなので，改行を消して実行しようとした．
しかし，一向に正常化しない．

ここでかなり詰まってしまったが，ただ終端記号として働くものがなく，構文解析器が動作していないだけであった．．．自分の中では，まずlex側で処理されてyaccに運ばれるというイメージが強く，まずlex側で引っかかるよなあと思っていたが，ダメで，実際は協調的に働くようだ．
具体的には，字句解析器で字句解析がまず行われるが，確定ではなく，終端記号まで登場して確定したところで，処理を始める，という認識が一番良さそう（要確認）．
以下のようなコードでDEBUGしようとしていて，もし数字が入っていたら構文解析器の結果にかかわらずここの関数は実行されると思っていたが，どうやらそれが大きな間違いだったようだ．
ここでかなり時間を使ってしまった，，，

```
<INITIAL>[1-9][0-9]* {
	Tag *tag = malloc(sizeof(Tag)); 
	tag->type = INT_TYPE;
	sscanf(yytext,"%d",&tag->val.i);
	yylval.tag = tag;
    fprintf(stderr, "a number was read.\n",
	return INT_LITERAL;
}
```
月の絵文字で文字が書けるWebアプリ「月文字ジェネレータ」を作ってみた🌝

#できたWebアプリ
![bandicam 2018-10-21 23-43-58-526.jpg](https://qiita-image-store.s3.amazonaws.com/0/157806/c374e9da-849e-9d30-ff47-39d153fce017.jpeg)
###[月文字ジェネレータ](https://tsukimoji.com)
https://tsukimoji.com

例えばこんなかんじのアスキーアートがすぐ作れちゃいます。
🌑🌑🌑🌑🌑🌑🌑🌑🌑🌑🌑🌑🌑
🌑🌑🌕🌘🌕🌕🌕🌕🌘🌑🌒🌕🌑
🌑🌒🌕🌓🌕🌕🌕🌕🌒🌕🌒🌕🌑
🌑🌓🌕🌑🌓🌖🌑🌑🌒🌕🌒🌕🌑
🌑🌔🌖🌑🌔🌕🌕🌕🌒🌕🌒🌕🌑
🌒🌕🌖🌒🌕🌘🌒🌕🌒🌕🌒🌕🌑
🌓🌕🌖🌓🌕🌘🌒🌕🌒🌕🌒🌕🌑
🌓🌕🌖🌕🌕🌕🌕🌖🌒🌕🌒🌕🌑
🌑🌔🌖🌑🌑🌒🌕🌗🌒🌕🌒🌕🌑
🌑🌔🌖🌑🌑🌓🌕🌑🌒🌕🌒🌕🌑
🌑🌔🌖🌑🌒🌕🌘🌑🌑🌑🌒🌕🌑
🌑🌔🌖🌒🌕🌗🌑🌑🌑🌔🌕🌕🌑
🌑🌓🌗🌑🌑🌑🌑🌑🌑🌑🌑🌑🌑
「例」という文字をジェネレートしてみました。
文字のサイズや、横幅の文字等を調節できるようにもしてみました。

#なぜこれをしようと思ったか
Youtubeのコメント欄で、月の絵文字で文字のアスキーアートを作成したコメントを発見。
→[wataoka氏](https://qiita.com/wataoka)の記事 [月で絵を描きたいだと？それならpythonに任せなさい🌝](https://qiita.com/wataoka/items/261fc12c956a517049d8)を思い出す。
→あれ？もしかして、そんなWebアプリあったかな？と検索
→無かった
→手作業でアスキーアートを作るのすごい！！！と同時に
###→自動化したい！！！！！
と思い書いてみました。

#技術的バックグラウンド
wataoka氏が超絶技工にアスキーアートに変換するエンジンを書いていただいていたので特に特筆すべき点はありませんが、いい感じに画像で解説したいと思います。

エンジンについてはこちら:[月で絵を描きたいだと？それならpythonに任せなさい🌝](https://qiita.com/wataoka/items/261fc12c956a517049d8)

---

![bandicam 2018-10-21 23-28-08-200.jpg](https://qiita-image-store.s3.amazonaws.com/0/157806/4644527a-72cd-4e00-3723-afa0fc281166.jpeg)

入力された文字からPython Image LibraryことPILを使い文字画像を生成して、wataoka氏のAA変換エンジンに読み込ませてあげると、文字　→　月のAA　に変換する事ができます。

---

![bandicam 2018-10-21 23-34-15-461.jpg](https://qiita-image-store.s3.amazonaws.com/0/157806/341826f9-76fd-d806-3c98-a0121375ebfe.jpeg)
さきほどのPythonをFlask+BootstrapでWebアプリ化したあとに、お手軽webサーバことPaasのherokuにデプロイしてあげます。
flaskとheroku
シンプルすぎて最高。

---

![bandicam 2018-10-21 23-39-52-182.jpg](https://qiita-image-store.s3.amazonaws.com/0/157806/c25cb3e3-858c-a0db-b185-9fc30c23a92f.jpeg)
今回はドメイン取得+SSL化をしてみます。
お名前.comで1kお布施し、cloudflareを用いてSSL化してみました。

概念図はイマイチCloudFlareの役割がわからないので、やっつけです。間違ってたら教えてください。m(_ _)m

参考:[【完全無料】Herokuで独自ドメイン + HTTPSに対応する【Rails】](https://qiita.com/serinuntius/items/f7f08b2221f5ad068f5d)


#さいごに
月がきれいですね。。。

さいごまで見てくださりありがとうございます！

バックグラウンドを見て頂くとわかるように、このwebアプリは[wataoka氏](https://qiita.com/wataoka)の記事 [月で絵を描きたいだと？それならpythonに任せなさい🌝](https://qiita.com/wataoka/items/261fc12c956a517049d8)のおかげで書けたようなものなので、wataoka氏に感謝。。。


###[月文字ジェネレータ](https://tsukimoji.com)
https://tsukimoji.com
iOSアプリ「ショートカット」を使って音声入力でヘルスケア

## iOS12アプリ「ショートカット」[^1]
https://itunes.apple.com/jp/app/ショートカット/id915249334?mt=8

一言でいうと，macOS の automator みたいなもの．もっと近いのは Alfred.app の powerpack で使える ワークフロー．
例えば，engadgetの記事["iOS 12で「ショートカット」アプリを使ってみよう"](https://japanese.engadget.com/2018/09/28/ios-12-iphone-tips/)をざっと見てもらえばどんな感じのアプリか分かるかと思う．
使いこなせればかなり便利なのは想像に難くないけど，それまでが大変そうって感じだった．ライブラリは充実してるけど，イマイチ使う機会が少なかったり，あんまりラクになってなかったり[^2]．

[^1]: アプリ名「ショートカット」って，正直そのまんますぎるネーミングはググったときにノイズが多くて困る．もうちょっと識別性の高い名前にして欲しかった．
[^2]: なんか「できることをやった」の集まりで，「やりたいことをできるようにした」みたいな感じじゃないのよね．イマイチ．


## イケイケに Hey, Siri したい
たまたまGoogle Home miniを手に入れて，"OK, Google"のラクさに，逆に"Hey, Siri"のイケてなさに戸惑った．
仕方ないので，自分でイケてる尻にすることにした．
幸いなことに，iOS12アプリ「ショートカット」では，自分で作ったショートカットを自分の尻に突っ込むことができる．~~アッー！~~

例えば**「Hey, Siri! 体重を記録」と言うと，音声入力待受状態になって，「40.0」とか言うと，アプリ「ヘルスケア」の体重の欄に記録される**みたいな感じにできる．

けど，それが存外に簡単じゃなかったので記事にしておく．
今後アプリ「ショートカット」が改良されて，この記事が不要になることを願う．

## やったこと
下の方に動画埋め込んだ

### ショートカットとして使ったのは以下の3つ．
1. 「テキストを音声入力」で体重を取得
2. 「入力を要求」で 1のテキストを数字にキャスト
3. 「ヘルスケアサンプルを記録」で，2の数字を体重の項目に追加
<img src="https://qiita-image-store.s3.amazonaws.com/0/145069/9f0a030b-ba2a-e83c-37db-9aadc7e29365.jpeg" width="50%" />

注意点として，*2の処理を挟まないと，3で記録される体重が0になる*．

欲張って現在時刻まで込みで体重を記録させようとして，またハマったんだけど，タイムゾーンまで決まる書式で指定しておけば良いことは分かった．日本時間くらい自動判別してくれと思う．

### 設定で「Siriに追加」で適当にトリガーを設定する
右上のところにあるアイコンを押して，ショートカットの設定で「Siriに追加」を押しておけば，自分の尻がイケてる尻になる．ちょっとだけ．

### ざっくり動画にしてみた
<blockquote class="twitter-tweet" data-lang="ja"><p lang="und" dir="ltr"><a href="https://t.co/EmoIsgOPM8">pic.twitter.com/EmoIsgOPM8</a></p>&mdash; じぇしお GT (@jco_gt) <a href="https://twitter.com/jco_gt/status/1055866170866196481?ref_src=twsrc%5Etfw">2018年10月26日</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 

ただ，Siriに追加したままの状態で，作ったショートカットを削除しちゃうと，登録されてるトリガーを削除できなくて詰む．

## 使い方

画面ロック解除した状態（ここ重要かつ不本意）で，"Hey, Siri 体重を記録"と呪文を唱える．さすれば己の重さを知るであろう．（結局は画面を押して確定させないといけないんだけど）
RailsでDraperを使ってdecoratorを実装してみる

苦手意識が強かったDecoratorについて調べた

## decoratorとは
デザインパターンの一つ。既存のオブジェクトをdecorator層でラップすることで、機能を追加したり拡張したりできる。既存のオブジェクトに対して、何らかの実装をしたい場合、これを使えば、ビューファイルにロジックを記述せずにすむ

## Draperとは何か
[Draper](https://github.com/drapergem/draper)はRailsのプレゼンテーション層（viewとモデルの中間にある）の役割を担うgem

## decoratorとhelperとの違い
Decorator => 特定のモデルに関連した描画ロジックを実装
helper => モデルから独立し直接関係していない描画ロジックを実装
※helperのメソッドはグローバル空間で定義されるので、名前の重複なども起こりやすい

## 使い方
### Draperをinstall

```ruby:gemfile
gem 'draper'
```

```ruby
bundle install
```

### decoratorファイルを作成

```ruby:item_decorator.rb
class ItemDecorator < Draper::Decorator
  delegate_all

  def has_hashtag?
    object.hashtag.present?
  end
```
### controllerでオブジェクトをデコレートする

```ruby:item_controller.rb
@items = ItemDecorator.decorate_collection(Item.all)

# decorate_collection
コレクションの個々のオブジェクトをデコレートする
# decorate
単独のオブジェクトをデコレートする

```
### Viewで呼び出し

```ruby:index.html.erb
<% @items.each do |item| %>
  <% if item.has_hashtag? %>
    <%= item.hashtag %>
  <% else %>
    <%= item.type %>
  <% end %>
<% end %> 
```

いまいちうまいユースケースを載せられなかった..
kill -9(sigkill)する前に読んでほしい．(初投稿)

今回の本題はプロセスの終了操作についてです．

早速話は変わりますが，少しだけ前座を．
私この記事が初投稿でありまして，前々から情報発信も兼ねて
Qiitaさんの方で投稿をしてみたいと思っておりまして，何かネタがないかと思っていた次第でありました．

そこで最近プロセス操作系の記事で "kill-9 プロセスID" を使って終了しろという記事を見かけましたので今回はその話をしたいと思います．
(おかしなところがあれば是非ご指摘ください．私も成長の場として書いております)

この"kill -9"(通称sigkill)はいわゆる強制終了というやつでございまして，
イメージでいうとプロセスAが動いている途中で割り込んできてお前(プロセスA)消えろという感じです．本当に強制的に消します．

ただ，ここで注意しないといけないのがAというプロセスが消えるだけで生成された子プロセスや処理中のゴミは残ったままになります．
そのため，次回以降の起動に予期せぬ事態が起こりうる危険性も存在します．

なので余程のことがない限り，ctrl+c(sigint)や(引数なしのkillコマンド)sigtermを使うことをおすすめします．

この記事をみてプロセスってなに？って感じの人から情報初学者の方で安易に"kill -9"を使う人が減ってくれれば幸いです．

ご精読ありがとうございました．これからも随時投稿していきたいと思います．
MySQL Workbench単体でSSHポートフォワードしつつDB接続する

# MySQL Workbench単体でSSHポートフォワードしつつDB接続する

接続設定を↓の通りにする。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/299475/f81529ed-6398-cc6b-314c-3cdd750dc984.png)

## 接続方式設定（赤枠）

デフォだと、"Standard TCP/IP"になっているので、"Standard TCP/IP over SSH"へ変更

## 踏み台接続情報（青枠）

踏み台にするホストへのログイン情報を入力する。
秘密鍵が必要であれば、"SSH Key File"で指定する。

## SSHポートフォワード情報（緑枠）

"MySQL Hostname"には踏み台から見たDBのホスト名（IPアドレス）を入れる。
例として、RDSであればクラスターエンドポイントとかで表示されている↓を入れる。
dbinstance-cluster.cluster-xxxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com

## DB接続情報（黄色）

DBに接続する時のID/パスワード/スキーマ名を入力する。
PHPの復習　Part2

プログラミングのPHPを整理するために、いくつかポイントを書いてみました。

#PHPの基礎知識②

###if
true（正）またはfalse（偽）を評価するための構文です。
次のように表します。

<?php
if ($a > $b)
 echo "aはbよりも大きいです";
?>

また、グループ化もできます。

<?php
if ($a > $b) {
 echo "aはbよりも大きい";
　$b = $a; 
}
?>

これは、$aが$bよりも大きいとき、aはbよりも大きいことを示し、$aの値を$bに代入する意味を表します。


####else
ある条件文に対し、その条件が満たされていない場合の条件を記入するときに、else文を使用します。
そのため、if文がfalseになったときに使用します。

<?php
if ($a > $b) {
 echo "aはbよりも大きい";
}else {
 echo "aはbよりも小さい";
}
?>

これは、$aが$bよりも大きいとき、aはbよりも大きいことを示し、そうではないときは、aはbよりも小さいことを示しています。


#####elseif
これは、if文とelse文の組み合わせです。
elseはif文がfalseのとき、別の条件を満たすように指示を与えます。
しかし、elseif文は、trueのとき代わりの条件を満たすようになります。

<?php
if ($a > $b) {
 echo "aはbよりも大きい";
} elseif ($a === $b) {
  echo "aはbと等しい";
} else {
  echo "aはbよりも小さい";
}
?>

これで、aはbよりも大きい、aはbと等しい、aはbよりも小さいを表します。
【自分用】rails sしようとしたらAddress already in use

<h1>Address already in use - bind(2) for "0.0.0.0" port 3000 (Errno::EADDRINUSE)/h1>

###　問題点　

`rails　s`って打つとAddress already in use - bind(2) for "0.0.0.0" port 3000 (Errno::EADDRINUSE)って出てきた。

###　解決策

①`lsof -wni tcp:3000`
を打って

PIDの欄に書いてある数字を確認する

②`kill -9 PIDに書いてあった数字`

でおk
Rubyの===演算子って何？

# 概要
たのしいRubyやってて`===`演算子の説明が全然載ってなかったのでちょっと調べてみる。

# `===`演算子とは

とりあえず公式のリファレンスを覗いてみる。

> 特殊な等号演算子。Object#===での説明：「このメソッドは case 文での比較に用いられます。 デフォルトは Object#== と同じ働きをしますが、 この挙動はサブクラスで所属性のチェックを実現するため 適宜再定義されます」。たとえば、Range#=== はother が範囲内に含まれている時に真を返します。

> [Rubyで使われる記号の意味（正規表現の複雑な記号は除く）](https://docs.ruby-lang.org/ja/latest/doc/symref.html#eq)

んー、なんとなくは伝わったけど…

> ===演算子（メソッド）は、右辺のオブジェクトobjが左辺modクラスのインスタンスであればtrue、そうでなければfalseを返します。

> [Rubyリファレンス](https://ref.xaio.jp/ruby/classes/module/eqq)


わかりやすく説明してくれているサイトを発見。

他には
> 左辺が単独のStringやIntegerオブジェクトの場合 `==`と同じ動作

> [Rubyの===演算子についてまとめてみた](https://techracho.bpsinc.jp/hachi8833/2017_01_19/32941)


ふむふむ。とりあえず適当に試してみる。

## とりあえず何か書く

```ruby
p String === "foo"    #=> true
p Numeric === 12345   #=> true
p Symbol === :foo     #=> true
```
おー、なるほど。オブジェクトの属するクラスで真偽が調べられるのか。便利。
これを使えば配列やハッシュなんかを調べるときそれぞれのクラスで別の処理が簡単にかけそう…！


```ruby
p 100 == 100    #=> true
p 100 === 100   #=> true
```
これは納得。左辺が単独のオブジェクトの場合は`==`演算子と動き同じをする。
これは確かに`==`の緩い版って言われるのもわかる。

あとは

```ruby
p (1..10) == 5    #=> false
p (1..10) === 5   #=> true

p (a..z) === "z"  #=> true
```
おおー。これはなかなか便利そう。範囲から一致するものがあれば`true`を返してくれる。
とある集合に算出した値が属してるかとか調べるのに使えそう？

## `case`文の条件式
あとはこの`===`演算子は`case`文の条件式に使われている。
適当に書いてみる。

```ruby
array = ["hoge", 123, :foo]
array.each do |value|
  case value
    when Numeric
      puts "#{value} is a Numeric"
    when String
      puts "#{value} is a String"
    when Symbol
      puts "#{value} is a Symbol"
    else
      puts "#{value} is something"
  end
end

#=> hoge is a String  123 is a Numeric  foo is a Symbol
```
おおー！簡単にさっきいったような処理がかけました。これでいろんな処理が本当に楽になりそう…！

# 終わりに
ちょっと調べてみると`===`は`==`のゆるいバージョンっていい方がよくわかった。
Ruby独特の演算子で普段Cしか触ってない自分にはとてもおもしろい演算子だなー。と思ったりした。
使えそうな機会があれば是非使ってみたい。
2018年10月第4週　今週気になった記事まとめ

# 今週気になった記事まとめ
##■サンワ、手首の負担を軽減できる小型デザインのリストレスト
http://www.itmedia.co.jp/pcuser/amp/1810/22/news076.html
KickStarterで出てたWristCatとほぼほぼ一緒に見えるが、圧倒的にこっちのが安い・・・。

##■「読書中の目の動き」から個人を特定することを人工知能が可能にする
https://gigazine.net/news/20181022-ai-eye-identify/
目の動きとなると意識すれば変えれてしまうから個人の識別って意味だとどこまで信用性があるのか・・・？

##■脳がトロける「ASMR」ムービーはメンタルだけでなく身体的にも好影響が現れることが判明
https://gigazine.net/amp/20181020-asmr-mental-physical-health-benefit
寝るときに聞くのをやってみようか。

##■GitHubがダウン　「データストレージシステムに障害」
http://www.itmedia.co.jp/news/articles/1810/22/news080.html
相応のインフラを構えて運用しているとは思うのだけれど、その割にはダウンの影響が日本で話題になることが多いような気がする。
バージョン管理のサービスであるがゆえに徹底的に正常と言える状態以外はダウンとしてしまうような設計思想だったりするのかな？

##■企業サイトのHTTPS化は2割、大学や銀行では半数以上--JIPDEC調査
https://japan.zdnet.com/article/35127594/
国内企業サイトと考えると割合としては結構低いように思う。
一時期かなり強硬的に切り替わってくような雰囲気だったと思うのだが・・・。

##■複雑過ぎる契約書の審査、AIの力で24時間から1分に――リコーの新技術「ディープアライメント」を見てきた
http://www.itmedia.co.jp/enterprise/articles/1810/26/news036.html
そうそうじっくり契約書を見ることはないけれど、そこまで各社のフォーマットは似通っているものなのか。
記載順や細かい書きっぷりは違っても「これは載ってる」っていう条項が色々あるってことなのかな。

##■AmazonのCEOジェフ・ベゾスも愛する「静かな会議」はなぜ効率的なのか？
https://gigazine.net/news/20181026-why-silent-meeting-effective/
30分集まって資料確認する意味は？と思ったけど、結局事前に資料を見てはこないからそうしてるのかな。
整理や判断が求められる会議には良いのだろうけど、アイデアや掛け合いが重要そうな発想系の会議の場合にはどれくらい適しているのかな。
数字だけフォントを変える（Google Fonts）

数字だけフォントを変えたい時、Google Fontsだと簡単にできます。

Google Fonts
https://fonts.google.com/

## 普通にフォントを指定している時

```index.html
<body>
    <h1>October 2018</h1>
</body>

```
今回、Nunito フォントを使用しています

```style.css
@import url('https://fonts.googleapis.com/css?family=Nunito');
html {
  font-family: 'Nunito', sans-serif;
}
```
### 結果
すべてに Nunito フォントがあたります。
<img width="719" alt="スクリーンショット 2018-10-26 23.40.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/302304/2ec9ab0d-bef6-7e26-7594-6c532a8a84d2.png">



## 数字だけ指定したい時

`text=0123456789`を追加します

```style.css
@import url('https://fonts.googleapis.com/css?family=Nunito&text=0123456789');
html {
  font-family: 'Nunito', sans-serif;
}
```
### 結果
数字のみ Nunito のフォントが当たります
<img width="802" alt="スクリーンショット 2018-10-26 23.48.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/302304/0623d747-3194-89ef-b687-2acb2c4323d7.png">

## Google Fonts の使い方
こちらのサイトがとてもわかりやすいです。
https://saruwakakun.com/html-css/basic/google-fonts
webアプリケーションを作るPHPとRubyの違い

最近私はPHPとRubyの２つのプログラミングを平行して学んでいる。
正直頭がこんがらがっていてわけがわからない状態だが、基本的な概念（変数、四則演算、if文、繰り返し、クラス、インスタンス、継承）は共通することが多いので、どちらを勉強していても良い復習になる。

ところでPHPもRubyも共にWEBアプリケーションが得意分野である。
PHPで作られた有名なWEBサービスはブログ作成ができるWordpressである。
Rubyで作られた有名なWEBサービスはクックパッドなどがあげられる。

今回はそんな２つの言語を勉強していて気づいた違いは紹介する。

##PHPとRubyの違い

###変数宣言
どちらも型宣言は必要ないところが便利だなと思った。
型宣言とは、変数の前にint（整数）やreal（実数）など使う型を書かなければならないルールだ。
これはかなり煩わしい。

PHPの場合は
```$a=10;
```
と＄マークが必要である。
ちなみに　Rubyは
```a=10
```
これだけである。Rubyがおかしいくらい簡単に書けるので、PHPで＄マークをつけることすら面倒に感じてくる。

##（）や；の記号の有無
PHPでは各命令の後に必ず；（セミコロン）をつけなければならない。
Rubyは何もつけなくて良い。

またif分では
PHPは、
```if (条件式1) {
     命令１;}
elseif (条件式2) {
命令2; }
```
という風に書く。
Rubyは
```if 条件式1 
     命令１
elsif 条件式2 
命令2
end
```
なんと（）や；といった記号を使わない。これにはびっくりだ。
ちなみにRubyでは"else if" ではなく"elsif"なので注意が必要である。

クラス宣言や関数の時も同様で、（）や{}のような記号があまり登場しないのがRubyの特徴である。


Rubyの書きやすさを強調した記事になってしまったが、PHPにはPHPの魅力があるだろうしこれから発見していきたい。
しかしPHPは、独特な言語だと言われているのは事実。つまずかないように気をつけよう。

とにかく、シンプルな文法を作ってくれた”まつもとゆきひろ”さんに感謝したい。
dockerでpure-ftpdを立ち上げる

諸事情でftp環境を作りたい事案が発生したので、dockerで使えるpure-ftpdを試した記録。

# docker version

```console
$ docker -v
Docker version 18.06.1-ce, build e68fc7a
```

# stilliard/pure-ftpd

特にこだわりは無いのでサクッとしらべて出てきたこれを使う。

https://hub.docker.com/r/stilliard/pure-ftpd/

# マウントするFTP用のディレクトリを用意

```console
$ mkdir ./volume
$ echo "hello ftp" > volume/test.txt
```

# dockerでftpdを起動する

ホストの`volume`ディレクトリをマウントして、`example`というユーザでFTPにアクセスできるようにする。

```shell
docker run \
	-d \
	--rm \
	--name ftpd \
	-p 21:21 \
	-p 30000-30009:30000-30009 \
	-e "PUBLICHOST=localhost" \
	-e "FTP_USER_NAME=example" \
	-e "FTP_USER_PASS=example" \
	-e "FTP_USER_HOME=/home/example" \
	-v $(pwd)/volume:/home/example \
	stilliard/pure-ftpd
```

# テストしてみる

MacのFinderで`ftp://localhost:21`に接続。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/16262/0b2fca57-18e3-d8d3-3875-479e71bb3e5c.png)

認証を要求されるので設定したアカウントでログインする。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/16262/99be732f-fe1f-631d-54ba-2709f2280752.png)

作成したテスト用のファイルが見れるようになった。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/16262/6f4a1f5a-4445-d19b-cc88-7f4c8a294f5a.png)

お手軽。
スポーツをITする（１）フォーム tensoleflow.js

スポーツとITを融合させてみよう、と空いた時間に取り組み始めてから約2年。
これまで色々と試して来たことをQiitaに整理・まとめて、ご意見も聞きながら有効活用化まで持って行こうと思っています。

##命題
スポーツをITするにあたり、２つの命題を掲げて進めていきたいと思います。
1. 過去の自分と比較してどうなのか？＝上達の定義
2. 他人と自分を比較してどうなのか？＝勝利の方程式
この２つの命題をクリアするため、我流理論に基づきながら、過去に実践したデータ＆プログラムを検証していきたいと思います。

##上達の定義
上達の内容には、以下の２つの条件があると考えています。
1.過去よりもフォームが良くなること。
2.スコアやスタッツ、パフォーマンスが過去よりも良くなっていること。
単発的な状況に一喜一憂せず、長期間におよぶ練習・試行錯誤の結果が、実戦の対戦スコアや個人成績（スタッツ）にどのように影響するか、をデータ化し、次の方法を考えていくべきだと思っています。

##フォームをデータ化する
約１年半前に登場した「OpenPose」。これを見た時に、「スポーツ選手のフォームチェックが出来るかも」と考えました。ただしオリジナル「OpenPose」はGPU必須、またスポーツには利用できないポリシーとのこと。

とはいえ、試してみないことには実用性があるかわからない、と思い、結果的に行き着いた先は、最近Qiitaで教えて頂いた「Tensoleflow.js」の「posenet」でした。

https://github.com/tensorflow/tfjs-models/tree/master/posenet
＊demoではyarnを利用してますが、将来的に考えて、自分はローカルPCブラウザで動作するよう、少しだけ手を加えました。ほぼそのままで動作します。guiとstatsはカットしました。あとは、console.logを見て出たエラーを潰していけばローカルで動作します。

## Tensoleflow.js posenetの使用感
GPUの無い4core、8MBメモリーのカメラ付きノートPCで実験。GPUを使っているのかと思うくらいのスムーズ感です。ただ、少し誤検出が多い気がします。ターゲットが少し遠いと誤検出が多くなる感じがしました。GPU環境では誤検出が少なくなるのか、は不明です。

ともあれ、GPUの無いPCブラウザで、リアルタイム映像と静止画像から、ストレス無く簡単に姿勢ボーン座標検出が出来るようになったので、精度が上がれば活用シーンが多くなると思います。

そんなわけで、とあるトッププロゴルファーのアドレスフォームをposenetしてみました。
![スクリーンショット 2018-10-27 0.07.45.png](https://qiita-image-store.s3.amazonaws.com/0/74852/be2155fe-ab31-fbda-313c-0837b585be1b.png)

実際にスマフォ画面に映し出された自分のアドレスと、このトッププロの姿勢ボーンを重ねて表示すれば、同じような構えになった時に、画面が赤く反転する、などといったことが出来そうです。

また、様々なトッププロの姿勢ボーンを蓄積すれば、自分と似た構えのプロ、似たスイングのプロ、を判定することも可能と思います。

撮影アングルには要注意ですが、これらに加えて、自分個人の姿勢データが蓄積されれば、フォームが良くなっている、と比較しやすくなるのではないでしょうか。「上達の定義」において、この「posenet」が大きな役割を果たしてくれるでしょう。
enumでメンバ関数（風）呼び出し

# 方針
1. できるだけenum構文自体には手を加えない
2. メンバ呼び出しをできるだけ簡単にしたい

# 実装
```c++
namespace Foo
{
	struct Hoge
	{
		enum class Type : char
		{
			Bool,
			Integer,
			Float,
			String,
			Object,
		};

		// メンバ関数用インタフェースを取得するための関数
		friend constexpr auto _(Type t)
		{
			struct {
				// 数値型だったらtrueを返すメンバ（？）関数
				constexpr bool isNumber() const
				{
					return value == Type::Integer || value == Type::Float;
				}
				Type value;
			} tmp{ t };
			return tmp;
		}
	};
}

int main()
{
	// 定数を_()で囲んで関数を呼び出すスタイル
	static_assert(_(Foo::Hoge::Type::Float).isNumber());
}
```
できればenum型そのものにメンバ関数を付けたいがそうもいかない
だからと言ってenum風のクラスを作るのはキツイ↓

```c++
// 元のenum構文とあまりにもかけ離れた書き方
class Type
{
	char value;
	constexpr Type(char value):value(value){}
public:
	// 必ず手動で値を振っていかなければならない
	static inline Type Bool{0};
	static inline Type Integer{1};
	...
	// enumで普通に使える演算子もいちいち用意しないといけない
	// しかもconstexpr指定してても戻り値を定数展開できないっぽい
	bool operator==(Type type) const { return value == type.value; }
};
```
なのでenum自体は何もいじらずそのままにアクセスする部分をどうシンプルにするかということに終始しました。
今回のようにenum型を専用の構造体などで包んでから関数呼び出しをするのは割とある方法だとは思います。
ただ今回はADLとfriend指定付きフリー関数定義を利用してenum型と関数の記述位置をできるだけ近づけつつ
あらゆるenum型で共通の記述をできるようにしました。（しかもシンプル）
名前空間もできるだけ汚染しないようにしたつもりですが、_()がフリー関数なのでここではFoo空間にシンボルが
生成されてしまっています。そこだけちょっとわかりにくいところなので注意ですね。

# 愚痴
今のc++の文法だとenumにメンバ関数が定義できないのは理解できるんですが、正直何とかしてほしいですよね。
RubyでAWS Cognito UserPoolにユーザを登録

# 参考
https://qiita.com/yosi-q/items/4b3b2cc4ae82d0b41390

ほとんど同じ方法でできたが、こちらが約2年前の記事であること、他に参考になる記事があまり見当たらないことから少しは意味があるかなと思いメモしておく。

# IAMユーザ

プリセットポリシーの `AmazonCognitoDeveloperAuthenticatedIdentities` を当てたユーザを作成。

- アクセスキー
- シークレットキー

を発行し確認。

# Cognito ユーザプール作成
AWSコンソールのAmazon Cognitoからユーザプールを `デフォルトを確認する` から作成。

続いて作成したユーザプールの `アプリクライアントの追加` からアプリクライアントを追加する。
`クライアントシークレットを作成` のチェックは外しておく。

アプリクライアントを追加すると `アプリクライアントID` を見れるようになるので確認。

# デモ

Dockerでデモを行った。
RubyのAlpineコンテナを使う。

```
docker run -ti ruby:2.5.3-alpine sh
```

ここからコンテナ内での操作になる。
エディタがないので、とりあえずvimを入れる。

```:docker
apk add -U vim
```

`credential.yml` ファイルを作る。

```:docker
vi credential.yml
```

下のような内容で保存。

```yml:credential.yml
access_key_id: xxxxxxxxxxxxxx
region: ap-northeast-1
secret_access_key: xxxxxxxxxxxxxxxxxxxxxxx
client_id: xxxxxxxxxxxxxxxxxxx
```

念の為警告だが、間違ってもGitHubに上げたりしないこと。
本番環境では環境変数で読み込むべきだろう。

AWS Ruby SDKを入れる。

```:docker
gem install aws-sdk
```

[参考元](https://qiita.com/yosi-q/items/4b3b2cc4ae82d0b41390)では `aws-sdk-core` を用いているが、こちらでは動作させることができなかった。

準備が整ったのでirbでCognitoを叩いていく。

```:docker
irb
```

まずは `aws-sdk` を読み込む。

```:docker/irb
> require 'aws-sdk'
```

続いて先程のyamlファイルを読み込む。

```
> require 'yaml'
> props = YAML.load(File.read('./credentials.yml'))
```

clientインスタンスを作成。

```:docker/irb
> client = Aws::CognitoIdentityProvider::Client.new(region: props['region'], access_key_id: props['access_key_id'], secret_access_key: props['secret_access_key'])
```

ユーザ登録する。

```:docker/irb
> client.sign_up({client_id: props['client_id'], username: 'test', password: 'Pass_w0rd', user_attributes: [{name: "email", value: "sample@example.com"}, {name: "nickname", value: "example"}], validation_data: [],})
```

AWSコンソールをリロードするとユーザが追加されているのが確認できる。
Apple Developer Program　TeamAgentの移譲

Apple Developer ProgramのTeamAgentを別のユーザに移譲する作業を行ったのでメモ

# TeamAgentとは
AppleDeveloperProgramの全ての権限が付与されており、法律的にチームを代表し、Appleとの第一義的な連絡窓口になります。また、チームメンバーを加え、それぞれの権限レベルを変更できます。またTeamAgentは1人のみとなります。　　

# 事前準備
 - 移譲するAppleアカウント

# １. チームメンバーに加える
移譲するアカウントをチームメンバーに加えます。
AgentかAdmin権限のあるアカウントでログインし、People > invite Peopleをクリックします。
<img src="https://qiita-image-store.s3.amazonaws.com/0/298109/3ebdf9a0-e990-30ac-4f07-e29f0f225550.png" width=80%>  


追加したい人のメールアドレスを入力します。
「Invite as Admmins」に入力した場合はAdmin権限、「Invite as Membaers」に入力した場合はMember権限となります。今回はAdmin権限で招待しました。
<img src="https://qiita-image-store.s3.amazonaws.com/0/298109/03f4c77b-85aa-07d8-84fb-4f0296086174.png" width=80%>  

「Invite」ボタン押下後、参加を勧誘する電子メールが本人宛に送信されます。
メールに記載されているURLからログインするとチームメンバーへの加入が完了します。

# ２. TeamAgentを移譲する
追加メンバーにTeamAgentを移譲します。
TeamAgentユーザでログイン後、Membership画面　＞　Settings欄のTransfer Team Agent Roleをクリックします。
<img src="https://qiita-image-store.s3.amazonaws.com/0/298109/d221e58b-4272-3268-2847-5f1d6e525de7.png" width=80%>  

SELECTプルダウンで移譲したいメンバーを選択し、Continueをクリックします。
<img width=80% alt="スクリーンショット 2018-10-24 18.14.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/298109/cb56f8c6-993d-443d-e47a-01713929f332.png">

クリック後、再度移譲するかの確認ダイアログが表示されますので、OKでTeamAgentユーザでの設定は完了です。

移譲先ユーザにTeamAgentへの招待メールが送付されているので、チームメンバー追加と同じ要領でメールに記載されているURLからログインを行い、規約に承諾します。

念の為、Membership画面でTeamAgent欄に移譲したアカウントの名前に変更されていることを確認して終了です。

# 注意点
移譲するAppleアカウントは電話番号の登録と２ファクタ認証の設定が必要なようです。
設定していない場合はTeamAgentへの招待メールに記載されているURLからログインした際に画面上部のメッセージエリアにAppleIDの詳細を確認してくださいと表示されます。

電話番号の登録と２ファクタ認証を設定し、再度ログインを行うと先に進むことができました。
AtomのsyntaxUIでシンタックスエラーの警告が出たときの対処法



発生したもの
以前のバージョンからいろいろ更新されていなかったみたいで
左下の｛警告マーク｝が出てsyntaxの設定にエラーがあったらしい
エラー内容は以下

```
Starting from Atom v1.13.0, the contents of atom-text-editor elements are no longer encapsulated
within a shadow DOM boundary. This means you should stop using :host and ::shadow pseudo-selectors,
and prepend all your syntax selectors with syntax--. To prevent breakage with existing style sheets,
Atom will automatically upgrade the following selectors:
```

要するに、以前サポートしていた構文が使えなくなってますよーというものだった。

syntaxを使うこと自体には特に何か問題があったわけでもないけどずっと出続けるのが面倒なので廃止された箇所を修正

修正する箇所：
とりあえず、怒られている　::shadowと　::host　に該当する箇所を削除して修正した。

```
atom-text-editor::shadow => atom-text-editor.editor
::host .search-results .marker .region =>　atom-text-editor .search-results .syntax--marker .region 
```
こんな感じにするとうまくいきました。

修正前

```
atom-text-editor::shadow  {
  background-color: @syntax-background-color;
  color: @syntax-text-color;
```

修正後

```
atom-text-editor,atom-text-editor {
  background-color: @syntax-background-color;
  color: @syntax-text-color;
```

あと、自分で修正したあと、思ったけどすでにメンテナーの人が直していた。
[Fix deprecations](https://github.com/tukapai/mahou-shoujo-syntax/commit/8530d3a7195facaaedc54c7e0980b88fcce5b8ee)

別件でREADMEがリンク切れになっていたのでそのへんはプルリクを送ってちょっと待ち状態になってます。

ひとまず警告がなくなって安心
vue-loader v15でエラーが出てビルドできないときの解決法

`vue-loader`を使うため以下のような`webpack.config.js`を書きました。

```js
const path = require('path')

module.exports = {
  mode: 'production',

  entry: './src/main.js',

  module: {
    rules: [
      {
        test: /\.vue$/,
        loader: 'vue-loader'
      }
    ]
  }
}
```

しかし、これでビルドしてみると。。。

```
Module Error (from ./node_modules/vue-loader/lib/index.js):
vue-loader was used without the corresponding plugin. Make sure to include VueLoaderPlugin in your webpack config.
```

と出て失敗😢

参考記事を呼んでみると、`vue-loader`のv15は以前のバージョンと比べるとたくさんの変更点があるとのこと。
そのうちの一つとして、`vue-loader`を使うには`VueLoaderPlugin`を`webpack.config.js`に追加する必要があるようです。

それで以下のように修正したら無事にビルドできました😆

```js
const path = require('path')
const { VueLoaderPlugin } = require('vue-loader')

module.exports = {
  mode: 'production',

  entry: './src/main.js',

  module: {
    rules: [
      {
        test: /\.vue$/,
        loader: 'vue-loader'
      }
    ]
  },
  plugins: [new VueLoaderPlugin()]
}
```

# 参考

https://github.com/symfony/webpack-encore/issues/311
Windows7でPowerShell5.xを使う

今更必要になる情報でもないと思うけれど、2018の春に__新しく__Windows7(デフォルトではPowerShell2.0)を使う機会があったので備忘録。
個人的な意見だけど、PowerShell2.0だとできることはかなり限られるので、せめて`Invoke-WebRequest`とか`ConvertTo-Json`とかが使えるPowerShell3.0は欲しい。

~~なお、順番に1個ずつアップデートしていく必要がある。~~ (<-誤情報)

追記2 (10/29): (詳細はコメント欄) PowerShell2.0から5.1への飛び級アップデートは特に問題ないとのこと！(3.0からの飛び級は注意が必要)

追記1 (10/27): 要件に合っているのであれば、PowerShell Core 6.1を使う方法もありインストールも楽らしいので使ってみるのもよいかも！

# ver3にアップデートする

[Windows Power Shell 3.0 を Windows7 にインストールする手順](https://qiita.com/busonx/items/9e88804e6b85432e827a)

インストーラ: [Download Windows Management Framework 3.0 from Official Microsoft Download Center](https://www.microsoft.com/en-us/download/details.aspx?id=34595)

# ver4にアップデートする

[PowerShell/Windows7にPowerShell4.0をインストールする手順](http://win.just4fun.biz/?PowerShell/Windows7%E3%81%ABPowerShell4.0%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B%E6%89%8B%E9%A0%86)

インストーラ: [Download Windows Management Framework 4.0 from Official Microsoft Download Center](https://www.microsoft.com/ja-jp/download/details.aspx?id=40855)

(win7x86ならWindows6.1-KB2819745-x86-MultiPkg.msu)を実行して再起動する

```
PS C:\Users\zaki> $PSVersionTable

Name                           Value
----                           -----
PSVersion                      4.0
WSManStackVersion              3.0
SerializationVersion           1.1.0.1
CLRVersion                     4.0.30319.36450
BuildVersion                   6.3.9600.16406
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0}
PSRemotingProtocolVersion      2.2
```

# ver5にアップデートする

[Windows Power Shell をアップデート！Windwos7 に Power Shell 5.1をインストール](http://memories.zal.jp/WP/blog/20180208_2959.html)

インストーラ: [Download Windows Management Framework 5.1 from Official Microsoft Download Center](https://www.microsoft.com/en-us/download/details.aspx?id=54616)

zip(Win7-KB3191566-x86.zip)を落として中のInstall-WMF5.1.ps1を実行して再起動する

```
PS C:\Users\zaki> $PSVersionTable

Name                           Value
----                           -----
PSVersion                      5.1.14409.1005
PSEdition                      Desktop
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
BuildVersion                   10.0.14409.1005
CLRVersion                     4.0.30319.36450
WSManStackVersion              3.0
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1
```

Invoke-WebRequestのhttps接続(TLS1.2)がver3だとうまくいかなくて、もしやと思ってver5までアップデートしたら動いた。(ver4は未確認)
ポンコツPCでstyle2paintsによるAI自動着色を試す

最近は誰でもAIによる自動着色が手軽に試せるらしい

<blockquote class="twitter-tweet" data-lang="en"><p lang="ja" dir="ltr">AIによる自動着色が凄まじいことになってる（style2paints V4） <a href="https://t.co/tnPE7sKWZx">pic.twitter.com/tnPE7sKWZx</a></p>&mdash; 小鳥遊りょう(レベル2) (@jaguring1) <a href="https://twitter.com/jaguring1/status/1055103639323197441?ref_src=twsrc%5Etfw">October 24, 2018</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

デモページ https://style2paints.github.io/ があるらしいのでアクセスしてみたが死んでいて話にならない。
ソースは https://github.com/lllyasviel/style2paints で公開されているので自分でサーバを立てればいいらしい。

### インストール手順

基本的に http://miyako.hatenablog.jp/entry/2018/03/02/021544 に書いてある通りにすればいい。おしまい。
・・・のだが、CPUがCore i7 950のポンコツなので tensorflow==1.5 に落としてやらないと動かなかった。

- 事前準備
    - 仮想マシンに 8vCPU / 16GBメモリを割り当てておき CentOS 7.5 1804 をインストールしておく
    - モデルを https://drive.google.com/open?id=1fWi4wmNj-xr-nCzuWMsN2rcm0249_Aem から落として model.zip に詰めておく

```
$ sudo yum update -y
$ sudo reboot
$ sudo firewall-cmd --add-port=8000/tcp --permanent && sudo firewall-cmd --reload
$ sudo yum install -y git unzip
$ sudo yum install -y https://centos7.iuscommunity.org/ius-release.rpm
$ sudo yum install -y python36u python36u-libs python36u-devel python36u-pip python36u-tools
$ sudo yum install -y libSM-devel libXext-devel
$ sudo pip3.6 install --upgrade pip 
$ sudo pip3.6 install tensorflow==1.5 keras bottle gevent h5py paste opencv-python scikit-image
$ git clone https://github.com/lllyasviel/style2paints.git
$ unzip model.zip
$ cd ~/style2paints/server
$ mv ~/model/* .
$ python3.6 server.py cpu
Using TensorFlow backend.
2018-10-26 15:23:44.302276: I tensorflow/core/platform/cpu_feature_guard.cc:137] Your CPU supports instructions that this TensorFlow binary was not compiled to use: SSE4.1 SSE4.2
/usr/lib64/python3.6/site-packages/keras/engine/saving.py:292: UserWarning: No training configuration found in save file: the model was *not* compiled. Compile it manually.
  warnings.warn('No training configuration found in save file: '
Bottle v0.12.13 server starting up (using PasteServer())...
Listening on http://0.0.0.0:8000/
Hit Ctrl-C to quit.

serving on 0.0.0.0:8000 view at http://127.0.0.1:8000
```

何もヒントを与えない状態だと、どうやら女の子しか真面目に塗ってくれないらしい。
reference や color anchor や accurate point を使ってヒントを与えると、もっと綺麗に塗れるのかも知れない。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/242714/8c7e68d9-5c79-ae2a-f7c4-bac8b52e1487.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/242714/920c95ea-ffc1-a901-056f-447a079e94d9.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/242714/02ff14f3-4e27-fe43-1179-d36b166b7d4a.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/242714/d3b2bb43-d26f-0a31-efde-da0799a650db.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/242714/33ef032d-d765-284c-27a2-2bd322b3533f.png)
Lightningコンポーネント（DOM操作）


標準コンポーネントの組み合わせでは機能要件を満たせない場合は、DOMエレメントを直接操作する必要がある。

#### DOMエレメントの取得

```html
<div aura:id="items" class="slds-listbox__option slds-listbox__option_plain slds-media slds-media_small slds-media_inline" data-attr="123" /> 
```

```javascript

var item = cmp.find("item");
vat element = item.getElement();
var attr = element.getAttribute('data-attr')  //123を取得
```

Locker Serviceが有効になっていると各変数はProxyとなるため、Developer Consoleのようなデバッガー環境でも変数の属性を一覧表示することはできない。その場合はAPIのバージョンを39．0にするとLocker Serviceが外れるため、従来のように変数の属性を一覧表示できるようになる。
Android 4.4 (KitKat)でCardView内に余白が生まれてしまう問題

Androidアプリで`CardView`を使うと、Android4.4(KitKat)以前の端末でカード内に余白が生まれてしまう問題に遭遇したのですが、解決できたので共有します。

## 起きたこと
`CardView`を配置したアプリを動作確認していると、Android5.0(Lollipop)では問題なかったのですが、Android4.4(KitKat)では`CardView`の内側に、指定した角丸半径(`cardCornerRadius`)に合わせて余白が生まれてしまいました。

|Android5.0|Android4.4
:-:|:-:
![5.0-Lollipop.png](https://qiita-image-store.s3.amazonaws.com/0/94164/b89d3e77-f11d-d428-836b-f843e269c6d5.png)|![4.4-Kitkat.png](https://qiita-image-store.s3.amazonaws.com/0/94164/ee665931-93e8-310c-7069-b65d5be87d24.png)
※わかりやすさのために背景色を黒にし、角丸半径も大きめにしています。

## 解決法
`CardView`の[ドキュメント](https://developer.android.com/reference/android/support/v7/widget/CardView)(https://developer.android.com/reference/android/support/v7/widget/CardView
)を見ると、

>Due to expensive nature of rounded corner clipping, on platforms before Lollipop, CardView does not clip its children that intersect with rounded corners. Instead, it adds padding to avoid such intersection (See setPreventCornerOverlap(boolean) to change this behavior).

とあります。「Lollipop未満だと子要素の角丸切り取りはコスト高いから代わりに余白入れますよ！」的な意味だと思います。
親切にもその挙動は変えられるようになっているようで、文中に登場する`setPreventCornerOverlap`の説明を読んでみました。
すると、この問題を解決できそうだったのでxmlでの記述法も調べて[^1]試してみたらこうなりました。

|Android5.0|Android4.4
:-:|:-:
![5.0-Lollipop-no-padding.png](https://qiita-image-store.s3.amazonaws.com/0/94164/94d970ac-2e4d-4abc-f893-2fc8d4468ab5.png)|![4.4-KitKat-no-padding.png](https://qiita-image-store.s3.amazonaws.com/0/94164/d14caca8-4cd1-7a17-b0ff-28a7556608ea.png)
※上が`cardPreventCornerOverlap="true"`、下が`cardPreventCornerOverlap="false"`です。

Android4.4では子要素のオーバーラップした部分が切り取られていないので、ヘッダー用に色をつけた部分は角が四角くなっていますが、これはヘッダー用のView自体も角丸になるようにshapeも指定すれば[^2]解決するはずです（今回はやっていませんが…）。

GitHubリポジトリはこちらです。
https://github.com/remew/CardViewExample

[^1]: `card_view:cardPreventCornerOverlap="false"`でいけました
[^2]: 参考：https://qiita.com/masaibar/items/3df3ebbb981cd274fe78
safari, iOS で CSS アニメーションが動かない（不安定）

下記を参考に `keyframes` と `animation` を使って `transform: translateX` で横に移動するアニメーションを実装しました。

- [写真が画面の端から端へ流れる無限ループするアニメーション](https://chocolat5.com/tips/loop-image-animation/)

macOS High Sierra 10.13.6 の Safari 12.0 の環境で数回リロードして動作確認すると、数回1回アニメーションが動きませんでした。

iPhone8 iOS 12.0.1 でも同様にアニメーションが動きません。

iOSの場合は Safari だけではなく、Chrome でも同様に動作が不安定でした。（描画する前にCSSの値を計算できていない？）

原因は不明ですが、アニメーション関連（`@keyframes` と `animation`プロパティ）のCSSだけを別ファイルにして、jQuery でHTMLの読み込みが完了してからCSSを読み込むようにすると改善されました。

```html

<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script>
$(function(){
    var style = '<link rel="stylesheet" href="style.css">';
    $('head link:last').after(style);
});
</script>
```

参考：[HTMLの読み込みが完了してから実行](https://qiita.com/cervomansan/items/0873026853686503fc3a)

同じように safari, iOS 環境でアニメーションが動かない、または不安定の方は試してみてください。

これで5時間消えました...；；
DataRowからの値の取り出しについての備忘録

VB.NETにはnull合体演算子がなく
スマートな書き方に悩みましたのでメモ書き。

if二項演算子で似たようにセーフティな取り出しが実現できます。

```csharp:DataRow.cs
int id = dr.Field<int?>("id")?? 0
```


```vb:DataRow.vb
Dim id As Integer = If(dr.Field(Of Integer?)("id"), 0)
```

参考
---
[[C#][VB.NET] NULLの扱い(NULL合体演算子とNULL条件演算子)](https://webbibouroku.com/Blog/Article/null-net#outline__5)
[DataRowの値を取り出すときにDBNullでエラーを出さない](https://accelboon.com/tn/c-datarowの値を取り出すときにdbnullでエラーを出さない%E3%80%82/)
Ruby on Rails 環境構築メモ

## Install 環境
* macOS Mojave (10.14)

## Install 手順
### 前提
* brew が install 済み
* 既存の Ruby on Rails Project (Gemfile) がある

### Ruby
rbenv を install

```shell
$ brew install rbenv
$ rbenv -v
rbenv 1.1.1
```

rbenv は ruby の version 管理とかができるやつ (たぶん)

.bashrc に以下を追記。

```.bashrc
export PATH="$PATH:~/.rbenv/bin:~/.rbenv/shims"
eval "$(rbenv init -)"
```

.bashrc に追記したので新しい terminal を起動。

必要な version の Ruby を install

```shell
$ rbenv install 2.3.6
```

install された Ruby の version を確認

```shell
$ rbenv versions
  system
* 2.3.6 (set by /Users/xxx/.ruby-version)
```


### Bundler
bundler を install

```shell
$ rbenv exec gem install bundler
$ rbenv rehash
```

### Rails
Rails を install

```shell
$ gem install rails
$ rails --version
Rails 5.2.1
```

### postgres
postgres を install

```shell
$ brew install postgresql
$ postgres --version
postgres (PostgreSQL) 10.5
```

### その他
各種 gem を install
Project の root (Gemfile がある directory) に移動して以下を実行。
(Gemfile に各種 version 情報が記載されている)

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


## 起動
postgres を起動

```shell
$ postgres -D /usr/local/var/postgres
```

DB の作成と migrate

```shell
$ bundle exec rake db:create
$ bundle exec rake db:migrate
```

server 起動

```shell
$ rails server
```

http://localhost:3000 にアクセスして確認。
C# 用の CSV パーサーを書いた

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">なんかシンプルでちゃんと動いてクオーテーションマークをちゃんと処理できてライセンスを書かなくてよくて C# オンリーで Unity からも使いやすい CSV パーサーなかったので書いた。きっとググり力が足りないだけであるんだろうけど…探すのを諦めた。<a href="https://t.co/ZKtcKnkp5v">https://t.co/ZKtcKnkp5v</a></p>&mdash; ゆーとIPD62mm@VRファイルマネージャー (@yutoVR) <a href="https://twitter.com/yutoVR/status/1055135152072929280?ref_src=twsrc%5Etfw">October 24, 2018</a></blockquote>

ということで、

- C# と .NET / Mono の機能のみを使っており、環境に依存しない
- CSV の標準仕様である [**RFC 4180**](http://www.ietf.org/rfc/rfc4180.txt) に準拠している（たぶん）
- CC0 なので**無料**かつ仕事で使っても**ライセンス表記が要らない**

CSV パーサーを書きました。

ネットを探すといろんなコード片や、NuGet にも [CsvHelper](https://joshclose.github.io/CsvHelper/) はあるんですが、**ライセンス表記不要かつダブルクオーテーションやその中のカンマ、改行を正しく解釈できるもの**は無かったのでエイヤっと作りました。

音ゲー作りとかにどうぞ。

# ダウンロード

[**GitHub に最新版があります**](https://github.com/yutokun/CSV-Parser)

# 使い方

以下の関数が `List<List<string>>` を返すので、その後は煮るなり焼くなり。もちろんこれ自体を切ったり漬け込んだりしても良いです。

```c#
CSVParser.LoadFromString(string data)
```

または

```c#
CSVParser.LoadFromPath(string path, Encoding encoding = null)
```

コンソールで読み込みをテストするデモはこちら

```c#
var sheet = CSVParser.LoadFromString(csvString);

var log = "";
foreach (var row in sheet)
{
    log += "|";

    foreach (var cell in row)
    {
        log += cell + "|";
    }

    log += "\n";
}

Debug.Log(log);         // Unity
Console.WriteLine(log); // C#
```

良い開発ライフを！
Visual Studio Marketplaceのプロフィールを変更する

![c03.png](https://qiita-image-store.s3.amazonaws.com/0/196349/264f147d-f808-4e5b-eb3f-fb67e8b4c368.png)

[Visual Studio Marketplace](https://marketplace.visualstudio.com/)のこのプロフィールを変更したかったのですが、非常にわかりにくくて迷宮をさまよったので。

1. [Visual Studio Marketplace](https://marketplace.visualstudio.com/)のページにアクセスする。
2. 右上の**[Publish extensions](https://marketplace.visualstudio.com/manage)**をクリック。
![c01.png](https://qiita-image-store.s3.amazonaws.com/0/196349/8e38a933-278f-e017-9210-0338236c2c75.png)

3. 'Details'タブをクリックして編集。終わったらSave。
![c02.png](https://qiita-image-store.s3.amazonaws.com/0/196349/8da56707-aab6-9500-95e7-8f7e7be05373.png)


最初に'Publish extensions'の上にあるユーザー名をクリックしてしまうと迷宮入りになります。
個人的によく使うScoopコマンド

使おうとしたときはいつも忘れてるので備忘録。
[GitHub の Wiki][wiki] 見れば十分なんですが、日本語でメモしておきたかったので。

パッケージマネージャ `scoop` 自体の説明やインストール方法は以下を参考に。

- [Scoop（公式サイト）](http://scoop.sh/)
- [Scoop を使った Windows 環境構築のススメ - Super!!](https://qiita.com/rkbk60/items/12dc8fb14042888113d0)

## コマンドヘルプ

`$APPS` は適当なアプリ名に置き換えて。

```powershell
scoop help
scoop help $APPS
```

## インストール

```powershell
scoop install $APPS
```

## 検索

```powershell
scoop search $APPS
```

## インストール済みのアプリ一覧

```powershell
scoop list
```

## アップデート

まず `Scoop` の最新バージョンを取得してから各アプリのアップデートを行う。
`scoop status` でアップデート対象のアプリが確認できる。

```powershell
scoop update
scoop status
scoop update $APPS
```

インストール済みアプリをすべてアップデートしたい場合は、
ワイルドカード `*` を使用する。

```powershell
scoop update *
```

## 実行ファイル（shims）の再設定

Windows の大型アップデート時によってショートカットが消えたりした場合に有効。

```powershell
scoop reset $APPS

# もしくはすべて再設定
scoop reset *
```

## インストール/アップデート失敗時の対処

インストール or アップデート時にエラーが発生し失敗した時、
下記のように `failed to install` になっている。

```powershell
PS> scoop status
These apps failed to install:
    $APPS
```

この場合、一度 `uninstall` してから再度 `install` を実行する。

```powershell
scoop uninstall $APPS
scoop install $APPS
```

## バージョンの指定

指定の書式は `<アプリ名>@<バージョン>` となる。

バージョンについては各アプリで書式が異なるので先に確認しておくこと。
存在するバージョンの確認方法としては、GitHub リポジトリで各アプリのマニフェストファイルの履歴を確認するしかなさそう…。
（`scoop list` や `scoop info` コマンドは最新バージョンしか表示できないため）

### 指定バージョンをインストール

たとえば `git` の 2.19.0 をインストールしたいならば

```powershell
scoop install git@2.19.0.windows.1
```

### 使用するバージョンの切り替え

複数のバージョンをインストールしている場合に、使用するバージョンを切り替えるには `scoop reset` を使う。

```powershell
scoop reset git@2.23.0.windows.1
```

インストールしてないバージョンには切り替えれないことに注意。

## 参考

- [Scoop | github wiki][wiki]

[wiki]: https://github.com/lukesampson/scoop/wiki