OmniAICreator/Qiita-1.07M huggingface dataset:
HoloLens開発環境構築

# 概要
HoloLensの開発環境構築方法を解説

# 詳細
ここみればわかる
https://developer.microsoft.com/en-us/windows/mixed-reality/academy
が、それではあんまりなので要点だけ

## 開発環境
- [Visual Studio 2017](http://dev.windows.com/downloads) or [Visual Studio 2015 Update 3](http://go.microsoft.com/fwlink/?LinkId=691129)<br>(2015でもいいけど、特に理由ないなら2017がよい)
- [HoloLens Emulator](http://go.microsoft.com/fwlink/?LinkID=823018)<br>
実機あるならなくてもいいけどあったほうがいいかもね<br>
動かすには[Hyper-V](http://www.vwnet.jp/Windows/w10/Hyper-V/Enablew10Hyper-V.htm)（Windows上で仮想化環境を作るシステム的なもの）を有効化する必要があるので注意
- [Unity 5.5](https://store.unity.com/download)<br>
Unity5.6でも動いていることは確認済み、5.5以降なら大丈夫
- [Vuforia](https://developer.vuforia.com/downloads/sdk)<br>
マーカー認証など使うのであれば必要

## PCスペック
### Minimum PC Spec
 
- Processor
    - Notebook: Intel Mobile Core i5 (e.g. 6200U 7th generation CPU), Dual-Core with Hyper Threading
    - Desktop: Intel Desktop i5 (e.g. 6th generation CPU), Dual-Core with Hyper Threading OR AMD FX4350 4.2Ghz Quad-Core equivalent
- GPU
    - Notebook: NVIDIA GTX 965M, AMD RX 460M (2GB) equivalent or greater DX12 capable GPU
    - Desktop: NVIDIA GTX 960/1050, AMD Radeon RX 460 (2GB) equivalent or greater DX12 capable GPU
    - WDDM 2.2 driver
- Thermal Design Power: 15W or greater
- Display
    - Headset connectors: 1x available graphics display port for headset (HDMI 1.4 or DisplayPort 1.2 for 60Hz     - headsets, HDMI 2.0 or DisplayPort 1.2 for 90Hz headsets)
    - Resolution: SVGA (800x600) or greater
    - Bit depth: 32 bits of color per pixel
- Memory: 8 GB of RAM or greater
- Storage: >10 GB additional free space
- Connectivity:
    - 1x available USB port for headset (USB 3.0 Type-A) Note: USB must supply a minimum of 900mA
    - Bluetooth 4.0 (for accessory connectivity)
 
### Recommended PC Spec
- Processor
    - Desktop: Intel Desktop i7 (6+ Core) OR AMD Ryzen 7 1700 (6 Core, 12 threads)
- GPU
    - Desktop: NVIDIA GTX 980/1060, AMD Radeon RX 480 (2GB) equivalent or greater DX12 capable GPU
    - WDDM 2.2 driver
- Thermal Design Power: 15W or greater
- Display
    - Headset connectors: 1x available graphics display port for headset (HDMI 1.4 or DisplayPort 1.2 for 60Hz headsets, HDMI 2.0 or DisplayPort 1.2 for 90Hz headsets)
    - Resolution: SVGA (800x600) or greater
    - Bit depth: 32 bits of color per pixel
- Memory: 16 GB of RAM or greater
- Storage: >10 GB additional free space
- Connectivity:
    - 1x available USB port for headset (USB 3.0 Type-A) Note: USB must supply a minimum of 900mA
    - Bluetooth 4.0 (for accessory connectivity)

## 開発環境構築
- Unityをインストール
- おわり（すごーい）

便利にするならほかにもいろいろいるが本当の最小構成ならUnityだけで問題ない
本格的なプロジェクトの作成方法は後書く
1行のコマンドでTypeScriptのコンパイル環境が全部整うスターターキットを作りました

2019/02/02 追記

「Parcel」というツールの台頭により、本記事で紹介しているツールは更新を停止しました。Parelを使う方が手軽に最新のTypeScriptのコンパイル環境を整備できるので、筆者の次の記事を参照ください。

- [設定ファイル不要のParcelでTypeScriptをコンパイル・バンドルしたら拍子抜けするほど簡単だった \- Qiita](https://qiita.com/tonkotsuboy_com/items/20ee57c6bb2762746fce)

***


Microsoftの開発した[TypeScript](https://www.typescriptlang.org/)は型を設定しつつJavaScriptを記述できる言語です。しかし、モダンなコンパイル環境を整えるには、モジュール問題の解決やソースマップの出力など、やや難易度が高いです。

今回、**1行のコマンドでTypeScriptのコンパイル環境を整えられるよう、「[kano-ts-starter](https://github.com/tonkotsuboy/kano-ts-starter)」というスターターキットを作りました**。

- [kano-ts-starter](https://github.com/tonkotsuboy/kano-ts-starter)

ダウンロード後、コマンドラインで次を実行するだけで、コンパイル環境が整います。[Yarn](https://yarnpkg.com/lang/en/)にも対応しています。

```bash:コマンド
npm i
```

次のコマンドで、`src/ts/Main.ts`というTypeScriptファイルがコンパイルされ、`src/js/script.js`が出力されます。

```bash:コマンド
npm run start
```

# 特徴
本スターターキットは次の機能を備えています。

- ウォッチ機能
- TypeScriptの構文チェック
- モジュールの対応（サンプルファイルでは、[SubModule.ts](https://github.com/tonkotsuboy/kano-ts-starter/blob/master/src/ts/sub/SubModule.ts)を読み込んでいます）
- ソースマップの出力
- [Promise](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Promise)、[await](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/await)/[async](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/async_function)の、ES 5ブラウザ向けへの出力(IE 11でも動作します)

モジュールは全てローカルで動作するので、グローバルを汚染することはありません。

## ローカルサーバーについて
ローカルサーバーと連携する機能はマスターブランチでは実装していませんが、[variation/with-browsersync](https://github.com/tonkotsuboy/kano-ts-starter/tree/variation/with-browsersync)のブランチで使用できます。

ファイルをダウンロード後、下記コマンドを実行することで、ローカルサーバーを起動させつつ、TypeScriptのコンパイルができます。

```bash:コマンド
npm run start
```

## parcelバージョンについて
設定ファイル不要で各言語のコンパイルやバンドルができるparcel（参考記事「[設定ファイル不要のParcelでTypeScriptをコンパイル・バンドルしたら拍子抜けするほど簡単だった](https://qiita.com/tonkotsuboy_com/items/20ee57c6bb2762746fce)」）を用いたバージョンです。ブランチ「[variation/with-parcel](https://github.com/tonkotsuboy/kano-ts-starter/tree/variation/with-parcel)」で試せます。

```bash:ローカルサーバーの起動とTypeScriptコンパイル
npm run start
```

なお、parcelの問題のためソースマップと自動リロードは動作しません。


# 主な使用技術

- typescript
- gulp (ver4)
- webpack
- Yarn

# 何故作ったのか？
あるエンジニアと話している際、「TypeScriptを始めてみたいが、開発環境を整えるのが難易度が高い。Webpack? Gulp? モジュール？？ 俺はTypeScriptがやりたいだけなのに、何故環境構築に時間をかけなきゃいけないんだ！？」という声を聞きました。

この声に答え、**できるだけ手軽にTypeScriptを始めることができ、かつ必要な機能を揃えたスターターキットがほしい**と思い、開発しました。TypeScriptをこれから始める方、使っている方も、是非試してみてください。

- [kano-ts-starter](https://github.com/tonkotsuboy/kano-ts-starter)

スターターキットのプルリクエストもお待ちしております。
mastodonのカスタマイズについて

|マストドン紹介|
|---|
|![about.png](https://qiita-image-store.s3.amazonaws.com/0/2567/a5adc221-38e8-ac3f-9a14-88a66167d15e.png)|
|URL: [文具丼(https://co-mastdn.ga/about)](https://co-mastdn.ga/about)|
文具丼の管理者のふじけん(fk2000)です。

今日はカスタマイズについて書きたいと思います。

## 文具丼とは
文具好きがあつまるマストドンです。

ご寄付は<a href="http://amzn.asia/iZd4Djh">こちら</a>から
本気の支援は<a href="https://enty.jp/sReXLfDqAzmy">こちら</a>から

## カスタマイズ例

### faviconのカスタマイズ

publicディレクトリにあるfavicon.icoを入れ替えます。

favicon.icoはサイズごとに準備するのが面倒なので便利なWebツールを利用しました。


- 便利なWebツール
    - [ファビコン favicon.icoを作ろう!](https://ao-system.net/favicon/)

ファイルを差し替えた後、nginxのリロードで反映されました。

```
$ sudo systemctl reload nginx
```

### 注意
![bfcbd2f89161e532.jpeg](https://qiita-image-store.s3.amazonaws.com/0/2567/61072cba-5e32-6d69-e0f7-2f8efd957305.jpeg)

- apple-touch-icon.pngについては何をやっても反映されず、機種やブラウザによっては「C」と表示されたり、デフォルトのアイコンのままだったりしました。
    - このあたり、わたしの理解不足、勉強不足もあると思うので、やり方わかる人は教えてください＞＜。


## aboutに表示される画像（500×531）

app/asset/imagesにあるfluffy-elephant-friend.pngを入れ替えます。

サイズはある程度幅があると思いますが、500×531のサイズをPNGで作成しました。

ファイル名を変える場合は当該ディレクトリのファイルを差し替えた後、以下のファイルを編集します。

```
$ vi app/views/about/show.html.haml
```

25行目に以下の記述があるので、ファイル名を差し替えます。
```
25    .mascot= image_tag 'fluffy-elephant-friend.png'
```

ファイル修正が終わったら、liveフォルダに移動して、下記コマンドで反映させます。

```
$ bundle exec rails assets:precompile RAILS_ENV=production
```

※dockerをお使いの方はDockerコマンドで。

アセットのリコンパイルを実行したら、mastodon系サービスを再起動してあげます。
```
$ sudo systemctl restart mastodon-*
```

これでabout画像が反映されます。

## 編集後記
これ以外にもreactやtranspileの知識不足で断念しているカスタマイズがあります。
できるようになったらまた記事を書きたいと思います。
What is HoloLens

# 概要
そもそもHoloLensとはどのようなものか軽く解説

# 詳細
## Microsoft Mixed Reality
HoloLensはMicrosoftが発売したMicrosoft Mixed Realityプラットフォーム対応の端末

Microsoft Mixed Reality
https://developer.microsoft.com/ja-jp/windows/mixed-reality 

今はMicrosfot Mixed Realityに対応した端末はHoloLensだけだが、今年夏ごろにはいろいろともっと安い端末が発売される予定

## HoloLensでできること
###　機能ベース
- 空間認識
- 空間に対してコンピュータオブジェクトを配置
- Windows10コンピュータなのでWindowsでできることはたいていできる（ただし32bitなのでそこはいろいろと制限がある）

###　プロダクトベース
画を見たほうが早い
平面を認識してゲームオブジェクトを置いたり・・・
https://youtu.be/IgtHnCJJUMU

ハローキティと遊んだり
https://youtu.be/NQaHvrdyHJ8

他に知りたい人はここらへんからどうぞ
https://www.youtube.com/channel/UCT2rZIAL-zNqeK1OmLLUa6g

## HoloLensができないこと
- 視野角は１００度なので視界のすべてを覆えるわけではない、VRのような没入感は突然訪れない
- かなりがんばっているが（４７０ｇ）やはり長時間つけるのは慣れるまで大変
- 操作方法に慣れるまで大変
AzureにOpenVPNサーバを立ててMacからVPN接続する

#背景
Azureはポイント対サイト接続でVPN接続ができるが、サポートされているクライアント端末がWindowsのみ[^1]。
Mac端末からVPN接続するために、OpenVPNサーバをAzure上に立ててみる。

#手順
## OpenVPNテンプレートのデプロイを実行
* OpenVPNテンプレートサイト[^2]から、```Deploy to Azure```をクリック
* 必要事項を入力して、```購入```をクリック

## OpenVPNサーバに接続
* ```https://<VM's public ip or dns name>:943``` に接続する
* ユーザ名・パスワードを入力する。クライアント端末にOpenVPNクライアントがインストールされていない場合は、ダウンロードされたインストーラでインストールする。

## VPN接続
* OpenVPNクライアントを起動し、```Connect...```
* ユーザ名・パスワードを入力する。
* 接続完了

## その他
* ```MyVNET```という名称の仮想ネットワークが作成されているので、そこに仮想マシンを追加すればVPN経由で接続することができる。

#参考

[^1]: [ポイント対サイトを使用してコンピューターを Azure 仮想ネットワークに接続する: ポータル \| Microsoft Docs](https://docs.microsoft.com/ja-jp/azure/vpn-gateway/vpn-gateway-howto-point-to-site-resource-manager-portal#a-nameuploadfileaパート-8---ルート証明書-cer-ファイルのアップロード)

[^2]: [azure\-quickstart\-templates/openvpn\-access\-server\-ubuntu at master · Azure/azure\-quickstart\-templates · GitHub](https://github.com/Azure/azure-quickstart-templates/tree/master/openvpn-access-server-ubuntu)
IEでbackground-imageにSVGを指定した要素を削除するとそのSVGが表示されなくなる

タイトルが何を言っているのか分からない感じですが、要はページのロード時にAJAXで取ってきたリストに差し替えるみたいなことをやると、IE10、IE11ではそのリストに表示されるべきアイコン等がなぜか表示されないということが起こります。

具体的には下記のことを行うと、指定したSVGが表示されなくなります。

- ``background-image``にSVGが指定された要素をHTMLに入れておく
- ``DOMContentLoaded``のタイミングでそれを削除する
- 指定されているSVGの読み込みが終わった後に同じような要素を追加する

```html:再現コード
<html>
<head>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<title>テスト</title>

<style>
#svg {
	background-image: url(https://upload.wikimedia.org/wikipedia/commons/f/f1/Android_sample.svg);
	width: 262px;
	height: 372px;
	border: solid 1px #000;
}
</style>

<script src="https://code.jquery.com/jquery-3.2.1.js"></script>
<script>
$(function(){
	$('body').html('');
	setTimeout(function(){ $('<div id="svg"></div>').appendTo('body'); }, 1000)
})	
</script>
</head>
<body>

<div id="svg"></div>

</body>
</html>
```

| 期待した結果 | 実際の結果 |
|:-----------:|:---------:|
| ![capture1.png](https://qiita-image-store.s3.amazonaws.com/0/42710/50ae404e-d626-1435-3b63-9005a0fd70bb.png) | ![capture2.png](https://qiita-image-store.s3.amazonaws.com/0/42710/12722c05-c19b-4634-1e90-c06425160391.png) |

# 原因の推測

IEはCSSが参照している画像のうち、HTMLから使われているものだけをロードするという挙動になっているようで、それらの画像のロードは``DOMContentLoaded``から始まります。したがって``DOMContentLoaded``のタイミングで要素を削除すると、ほぼ確実に「SVGのロードは始まったがまだ終わってはいない」という状態で要素を削除することができます。

そしてそのSVGのロードが終わった時に本来それが表示されるべき要素が存在していない場合に、何か中途半端な状態になって表示されなくなってしまうようです。PNG画像などでは発生しないので、SVGのパースか何かなのでしょうか。F12開発者ツールで表示されなくなったSVGを指定した``img``要素を挿入すると、なぜか``background-image``の方のSVGも表示されるようになるのが興味深いところです。

# 回避方法

どうやら要素を消すのに``.html('')``しているのがまずいようです。jQueryの``remove()``メソッドや``empty()``メソッドで削除するとこの現象は発生しなくなります。``innerHTML``でガッと置き換えるという乱暴なことはしてはいけないということなのでしょう。

```js
$('body').html('');  // NG
$('#svg').remove();  // OK
$('body').empty();   // OK
```
ということで、横着しないでちゃんとDOM操作で処理しましょうという話でした。
360liveしようよ！〜YouTube, Facebook, Periscopeの現状メモ〜

全天球カメラ＋PCで360liveするためのメモになります。全天球カメラ＝equirectangular形式の映像がリアルタイムに出せるものを想定しています。（RICOH THETAとか、RICOH R Development Kitとか/宣伝です:stuck_out_tongue:）

# 配信までのステップ

## YouTubeへの360live

1. https://www.youtube.com/my_live_events からイベント作る
2. 詳細設定のところで「このライブストリーミングは360°です」のチェックを入れる<img width="785" alt="youtube360.png" src="https://qiita-image-store.s3.amazonaws.com/0/19712/092a4152-53ef-1824-c30e-f84a3aacaafe.png">
3. RTMPサーバの情報とストリーミングキーをメモって配信機材にセットアップ


## Facebookへの360live

1. https://www.facebook.com/live/create からライブ作る
2. <img width="509" alt="fb360.png" src="https://qiita-image-store.s3.amazonaws.com/0/19712/49a5ecec-4b61-5e73-5344-fdb6550bd872.png">
3. RTMPサーバの情報とストリーミングキーをメモって配信機材にセットアップ


## Periscopeへの360live

1. https://www.periscope.tv/account/producer からソースを追加する
2. ここで360の方を選ぶ<img width="1076" alt="periscope.png" src="https://qiita-image-store.s3.amazonaws.com/0/19712/3b24ade2-bce5-4ab6-543d-5679a048704f.png">
3. RTMPサーバの情報とストリーミングキーをメモって配信機材にセットアップ

----

# ポイント

## 各配信先の状況について

* 全体的に一番最初に360liveであることを指定する必要があるようです、途中から360にするとかのハイブリッドはなさそう。
* YouTubeが現状では一番高画質で長時間映像を送って大丈夫な場所です（RICOH R Development Kitの展示会会場からのライブでは8時間オーバーで配信できていました）
* Facebookは4時間までのようです＞ https://fb360video.files.wordpress.com/2017/03/live-360-getting-started-guide.pdf
* Periscopeは解像度が『Output Resolution: 1280 x 720 (higher resolution) or 960 x 540 (for best low latency)』で小さめです＞
 https://help.pscp.tv/customer/en/portal/articles/2600293-what-is-periscope-producer
* 再生の環境なども各環境で様々です（XXブラウザはぐりぐり自由に視点を動かせるとか、アプリ使わないとただのequirectangular形式垂れ流しだとか）
* ちょいちょい変更されます。おかしくなったら最新版を確認しにいきましょう

## RICOH THETAを利用した場合のポイント

* LiveShell XなどはHDMI出力時、THETA側にスティッチング処理がないので使えません:cry:（RICOH R Development Kitはカメラ内でスティッチングされるので利用できます）
* PCから360liveするにはまずスティッチング処理のために　https://theta360.com/ja/support/download/ にある「ライブストリーミング用アプリ」のダウンロードが必要です。
* OBS( https://obsproject.com/ )などの配信アプリを利用してください

## その他360ライブポイント

* 配信するときの解像度はMAX（カメラの最高）がおすすめです、映像の一部を集中する感じになるので解像度を落としてしまうとすごく汚くみえやすいです
* OBSなどの配信アプリでは隙間なくカメラ映像を送る必要があります（映像をマッピングするので左右の端同士をつなげるときに1pxでもずれているとつなぎ目がおかしくなります）
* （360liveに限りませんが）スマホで配信してるとすぐにパケットを使い切る可能性が高いです、お気をつけて…
* カメラは固定するか、あまり揺らさないような対策があると視聴者さんも酔いにくくなります！
* RTMPサーバへ送る設定については、カスタムのストリーミングサーバを選択してURLとキーを入れる方法がオススメです（環境ごとの設定を覚えるとか、最新のAPI変更があった時とか考えずにすむので）ちなみにOBSだとこんな感じ<img width="979" alt="オBS.png" src="https://qiita-image-store.s3.amazonaws.com/0/19712/b8be755e-a5f3-0bb8-9f47-144cd0752224.png">
* たくさん書きましたが、色々めんどーという方は自分が配信しようと思っている場所の対応機種となっているカメラを買うという手もあります。


ざっくりとしたメモですが、何かのお役に立てば:laughing:
制御文字がDBに入らないようにする

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/33722/413edb3b-0a29-fbb4-4c5c-387007a46c88.png)
何だこの文字は！？ECサイト構築のお手伝い中こんな文字がDBに入ってしまうという問題にぶち当たりました。
BS・BEL・EM？どうやって入力されたんだろうｗ
どうやらこれASCII制御文字というらしい。
多分、バイナリエディタとか特殊なエディタで作成した文字をコピペでフォームに貼り付けることで発生するのでは？
（僕は、Sublime Textで文字コードをHexadecimalで08とか入れて、UTF8に変換して再現しました。）
完璧な原因は分かってないけど、多分そんな感じなんだろう・・・。
ということで、こんな関数を作ってバリデーション時に制御文字を削除する対応を入れました。

```php
// PHP
function deleteHexadecimalString($str) {
    $result = "";
    $exclusions = ["00","01","02","03","04","05","06","07","08","09","0a","0b","0c","0d","0e","0f","10","11","12","13","14","15","16","17","18","19","1a","1b","1c","1d","1e","1f","20","7f"];
    for ($i=0; $i<mb_strlen($str); $i++) {
        $t = mb_substr($str, $i, 1, "UTF-8");
        if (!in_array(bin2hex($t), $exclusions)) {
            $result .= $t;
        }
    }
    return $result;
}
```
この問題、色んなサービスで頻発してそうだけど情報が探し方が悪いのか見当たらず・・・何方かもっといい方法あれば教えてくださーいm(_ _)m


教えてもらった通り正規表現使ったら簡単にできたのでこっちがおすすめです！

```php
preg_replace('/[\x00-\x09\x0B\x0C\x0E-\x1F\x7F]/', '', $text)
```
技術書読書会 #11 Infrastructure as Code

# 技術書読書会 #11 Infrastructure as Code

## 読書会とは

「良書を読むための条件は、悪書を読まないことである。」と、ドイツの哲学者が言っていました。

それが難しいんだよ。。。

技術書を最後まで読み切る事は意外と大変です。一人なら無理だけどみんなの力があればできるかも・・・。
そんなことを誰が思たのか、ともあれそんな気持ちに賛同したメンバーが１冊の技術書を読み込むという結構ハードルの高いことにチャレンジをしていきます。

## 技術書読書会の進め方
eXtreme Readingの方式で進めていきます。

### 実施方法
以下の流れで読書をしていきます。

```
1. 0分～5分間で、今回読み進める章/節を発表する
2. 15分～30分間で、読書
3. 5分～10分間で、ディスカッション
4. 1～3を時間分繰り返す
5. まとめ
```

今回の読書会は、所要時間30分で以下の配分で行いました。

```
1. 5分間で、今回読み進める章/節を発表する
2. 15分間、読書
3. 5分間、ディスカッション
4. 10分間、まとめ
```

### 利点
eXtreme Readingの利点です。

- 事前の準備がいらない。
- ディカッションをすることにより理解を深める事ができる。参加者全体の理解度の底上げが期待できる。
- 時間を区切って進行するので、読書の進捗が一定となり本の読み終わり時期を予測することができる
- みんなでやればなんとかなる


## 今回読む書籍
[Infrastructure as Code ―クラウドにおけるサーバ管理の原則とプラクティス](
https://www.amazon.co.jp/Infrastructure-Code-%E3%82%AF%E3%83%A9%E3%82%A6%E3%83%89%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E3%82%B5%E3%83%BC%E3%83%90%E7%AE%A1%E7%90%86%E3%81%AE%E5%8E%9F%E5%89%87%E3%81%A8%E3%83%97%E3%83%A9%E3%82%AF%E3%83%86%E3%82%A3%E3%82%B9-Kief-Morris/dp/4873117968/ref=sr_1_1?ie=UTF8&qid=1491455639&sr=8-1&keywords=Infrastructure+as+Code)

## 参加人数
4人

## 所要時間
30分

## 進捗
5- 5.2.1

## ディスカッション

### 5.1 インフラストラクチャサービス、ツールが満たすべき条件
岡　これって、復習ですよね。これまでに出てきた内容

### 5.1.1 外部定義を使えるツールを選ぶ
岡　これも今まで出てきた内容
浜　定義ファイルがバイナリーだったりした場合の事が書いてあります

### 5.1.2
浜　これは選びますよね。今後は
浜　能力増強の購入プロセスについて、ＡＷＳとかは制限が決められていて上げたければ問い合わせが必要
岡　ある程度見積もる必要がある
峯　ＡＷＳって結構緩い制限なので、それ以上に使うならあらかじめ問い合わせできるでしょと
峯　クライアントを守っているという側面もあるのかも
峯　知らないうちに料金ががんがん発生するのを防ぐみたいな

### 5.1.4 
岡　モニタリングだとしたら、全サービスが一つのモニタリングサービスを利用していた場合、モニタリングサービスの設定を変えたらどこかのサービスでモニタリングできなくなるとか、そういったことを言いたいのでは

### 5.2 チーム間でのサービスの共有
峯　こちらは、インスタンスのお話し
浜　確かにCIサーバーは共有できそうなイメージがあるけど、ただ、実際にはプラグインを入れたらＵＩに影響が出て、こっちではうまくいくけど、他でうまくいかなくなる、なりそう。
浜　サーバーを減らしたい欲みたいのがあって、一緒にできるんじゃないのみたいなのはよくある。けど、気を付けないと
岡　結局、クラウドを使うってことなのかな？ベアメタルでもできると以前に書いてあったような気がするけど

## 気づき

## まとめ
テキストレイヤーのプロパティ構造を理解する

少し自分の中でややこしかったのでメモです。

#やりたい事
テキストレイヤーにアニメーターの不透明度を設定する

![bandicam 2017-04-28 11-42-56-735.jpg](https://qiita-image-store.s3.amazonaws.com/0/178061/38064c66-2843-e5a1-498d-f4d357dd6a84.jpeg)

このAE画面上の通りプロパティを辿ると
コンポジションの中のテキストレイヤーのテキストプロパティーのアニメーターの不透明度という事になるはず。
##まずは間違っているコード

```js
var myComp = app.project.activeItem;
var myLayer = myComp.selectedLayers[0];
var text_ani=myLayer.property("ADBE Text Properties").property("ADBE Text Animators").addProperty("ADBE Text Opacity").setValue(50);
```
###実行結果
![bandicam 2017-04-28 11-49-53-070.jpg](https://qiita-image-store.s3.amazonaws.com/0/178061/aa46b560-56c9-0055-a9cb-85e47b0f8bb8.jpeg)

<font color="Red">このPropertyGroupには「ADBE Text Opactiy」というプロパティを追加できません。</font>となる。


りょ！（了解の略）ってなるわけで
ふぅ～（ため息）・・・
じゃあ一度手作業でアニメータの不透明度を追加してみる。

![bandicam 2017-04-28 11-57-42-171.jpg](https://qiita-image-store.s3.amazonaws.com/0/178061/28b81713-cd64-aff9-240d-8d707e997483.jpeg)

#何かおかしくありませんか？
アニメーター１という項目が出てきて、ここにもまた追加というプロパティを持ったものが出てきてます。

![bandicam 2017-04-28 11-59-58-888.jpg](https://qiita-image-store.s3.amazonaws.com/0/178061/3ffeb864-cb56-6094-5589-75634ac03cfc.jpeg)

#今回の勘違いをまとめると
テキストのプロパティから透明度を追加してもアニメーター１というグループを作らないとダメだという事です。
それがmyLayer.property("ADBE Text Properties").property("ADBE Text Animators")<font color="Red">.addProperty("ADBE Text Animator");</font>
この赤文字の部分でアニメーター１を追加しその中に

```js
text_ani.property("ADBE Text Animator Properties").addProperty("ADBE Text Opacity").setValue(50);
text_ani.property("ADBE Text Selectors").addProperty("ADBE Text Selector");
```
を書かないと駄目なんですね。。。
このコードは透明度を50に設定して範囲セレクター１も追加しています。
myLayer.property("ADBE Text Properties").property("ADBE Text Animators")<font color="Red">.addProperty("ADBE Text Animator");</font>
この中にアニメーター１のプロパティーやセレクターを追加していく感じですね！

#正しいコードはこうなります

※アンドゥグループで囲ってます。

```js
app.beginUndoGroup("textProperty");//アンドゥグループ開始

var myComp = app.project.activeItem;
var myLayer = myComp.selectedLayers[0];
var text_ani=myLayer.property("ADBE Text Properties").property("ADBE Text Animators").addProperty("ADBE Text Animator");
text_ani.property("ADBE Text Animator Properties").addProperty("ADBE Text Opacity").setValue(50);
text_ani.property("ADBE Text Selectors").addProperty("ADBE Text Selector");

app.endUndoGroup();//アンドゥグループの終わり
```

この結果を見てみれば、当然の事なんですが、何もない状態からAEの画面上でプロパティを辿って行くとこうなってしまいました。
2017-04-28 bash > 前のコマンドの引数を指定して使う > !:2 > 直前のコマンドの2つ目の引数 / !998:2 > 過去のコマンド(998番目)の2つ目の引数

```txt:動作環境
Xeon E5-2620 v4 (8コア) x 2
32GB RAM
CentOS 6.8 (64bit)
openmpi-1.8.x86_64 とその-devel
mpich.x86_64 3.1-5.el6とその-devel
gcc version 4.4.7 (とgfortran)
NCAR Command Language Version 6.3.0
WRF v3.7.1を使用。
Python 2.6.6 (r266:84292, Aug 18 2016, 15:13:37) 
Python 3.6.0 on virtualenv
```

### 直前のコマンドの引数を取る

bashにて長い引数を使った処理をするとする。
次のコマンドで、同じ引数の文字列を別の引数位置で使いたい場合にどうするか調べた。

http://stackoverflow.com/questions/4009412/how-to-use-arguments-from-previous-command

`!:2`のように書くと「前のコマンドの2つ目の引数」を得ることができる
( 複数の引数を取る方法も記載されている )

```
$ echo 3.1415926535 6.022 10^23
3.1415926535 6.022 10^23
$ echo !:2
echo 6.022
6.022
$ echo !:2 !:3
bash: :2: bad word specifier
```

「直前の」コマンドの引数を使うという点では問題がない。

実際に使う場面として

1. テンプレートファイルをPREFIXをつけてコピー
2. コピーしたファイルをシンボリックリンク
3. そのファイルを編集
4. 処理開始


```
$ cp namelist.input namelist.input.test170428
$ ln -fs !:2 LN-target
ln -fs namelist.input.test170428 LN-target
$ ls -l LN-target 
lrwxrwxrwx 1 xxx xxx 25 Apr 28 12:05 LN-target -> namelist.input.test170428
```

### 過去のコマンドの引数を取る
(追記 2017/05/11)

```
$history
...
  997  history 
  998  history | grep mpirun
...
```

```
$ echo !998:2
echo grep
grep
```

```
$ echo !998:3
echo mpirun
mpirun
```

上記の方法で、過去のコマンドの引数を取れることに気づいた。
一見、NYAGOSの不具合に見える事例について（随時追記）

お願い
=====

* 問題が確認されたら、気兼ねなく [issue](https://github.com/zetamatta/nyagos/issues) を立ててください。
     * 日本語で書いてもらっても、まったく問題ありません
     * 間違い、勘違いの類があっても構いません。問題解決を支援します。
     * 詳しい症状の報告もなく、SNSでだけ「単にダメ」と言われるのが一番つらいです。
* できれば、CMD.EXEで実行した時にどうなるかを確認して、問題の所在を確認してください。
     * ConEmu、msysGit 側の問題を、NYAGOS に起因する問題と誤解されることが多く、困っています。

実績を積んでいきたいのですが、その前に「使いものにならない」という評判が定着してしまうのを懸念しています（実際、使いものにならないのかもしれませんが）

個別事例（随時追記します）
======================

環境設定コマンドが効かない (2018.01.18)
------------------------

**(2018.04.09追記)** NYAGOS 4.2.5 よりバッチファイルでの環境変数の変更が自動で取り込めるようになりました。→ 参考：[NYAGOS 4.2.5βが、いかにしてバッチファイルでの環境変数の変更取り込みを可能としたか](https://qiita.com/zetamatta/items/efff93d92ac2150192fb)

<DEL>環境変数を設定するバッチファイルが実行されていると思われますが、CMD.EXE と違い、バッチファイルの実行は子プロセスで行われているため、そのまま実行しても NYAGOS 本体へ反映させることができません。</DEL>

<DEL>そのため `source` コマンドを用います。詳しくは「[NYAGOS で環境設定系バッチファイルが期待どおり動かない原因と対策](https://qiita.com/zetamatta/items/f62bafd711755a4cf8d7)」をご覧ください</DEL>

画面の桁数が多く設定すると、画面が乱れる (2018.01.18)
-------------------------------------
これは NYAGOS で用いているライブラリの不具合が原因でした。

* [Garbage appears on the screen · Issue #264 · zetamatta/nyagos](https://github.com/zetamatta/nyagos/issues/264)

300桁など、画面の桁数を多くすると、画面クリア時のセル数計算でオーバーフローして、画面全部をクリアしきれず、スクロールするとゴミが現れることがあります。

本不具合は NYAGOS 4.2.3_1 にて修正されています。

ConEmu + NYAGOSで画面が乱れる
---------------------------
* 「+ NYAGOS」と書いていますが、NYAGOSは関係なく、ConEmu + CMD.EXE でも発生します。
* 画面幅を超えるテキストをCRLF無しで連続して出力すると、折り返し処理が走るタイミングでフォント幅の見積もり計算がおかしくなる（[詳細](http://qiita.com/zetamatta/items/698efdabecae8bbbcbd9)）
    * ConEmu側の設定：`Setting` → `Main` → `Compress long string to fit space` を無効にすることで治ります
* 中国語、日本語などをタイプするとカーソル位置がおかしくなる
    * ConEmu側の対応待ちです（対応 issue は下記のとおり）
        * [wrong cursor position when typing chinese · Issue #1051 · Maximus5/ConEmu]( https://github.com/Maximus5/ConEmu/issues/1051)
        * [When I input Japanese characters, cursor was shown far away from the text I inputted. · Issue #1111 · Maximus5/ConEmu](https://github.com/Maximus5/ConEmu/issues/1111) （← #1051 と重複するためクローズ）

msysgit でエディターが起動しない
-----------------------------
![image](https://qiita-image-store.s3.amazonaws.com/0/29454/d9a3764c-0712-c547-5a90-0e3c9092c8e8.png)

* msysgitでcommitログを編集するエディタをフルパスで指定する時は「`GIT_EDITOR="C:/Program Files/vim80-kaoriya-win64/vim.exe"`」のように
    * 空白を含まれる場合は、環境変数GIT_EDITOR に「**二重引用符が含まれる形**」になるように指定してください。
    * パス区切り文字は`/`を使ってください

この仕様は git に含まれる msys-bash に起因するものです。

grep がない
----------

* NYAGOS は MSYS や Cygwin のような、総合 UNIX エミュレーション環境ではなく、同プログラムは同梱していません。
* Windows には findstr.exe という grep 的なプログラムがありますので、これを使っていただくのがよいと思われます。
    * 基本的に現在のコードページの言語、つまり、日本語系では Shift-JIS(CP932)テキストが前提になります
    * オプション指定文字が「-」（マイナス）ではなく「/」（スラッシュ）になっています。
* [jvgrep](https://github.com/mattn/jvgrep) という処理系もあります。こちらは UTF8対応、正規表現が Perl 準拠（単語の区切りは `\<`～`\>` ではなく、`\b` になっている）、カラー表示対応となっています。

NYAGOS 4.0.9 が落ちる
-----------------------

**4.0.9 は安定版でも何でもありません！**

4.0系列はマルチスレッドでの Lua インスタンスの取り扱いに問題があり、クラッシュが起こりやすくなっています。少なくとも、根本解決されている 4.1系列以降にアップデートいただかないと、サポートできません。
任意のスニペットを実行するChrome Extensionを作りました

# [run-snippets](https://github.com/re-fort/run-snippets)
任意のスニペットを実行するChrome Extensionです。
v0.3.0からContent Scriptsによる自動実行も対応しています。
ただし、実行するスニペットは自身の手で書き、ビルド、パッケージを読み込む必要があります。
即座に使える拡張機能ではなく、スニペットをまとめるのに役立つboilerplateという感じです。
Firefoxでも同様に使用可能です。

## デモ
![screenshot](https://user-images.githubusercontent.com/3705391/31721937-aef4056e-b455-11e7-892e-23726725dc14.gif)

[run-snippets](https://github.com/re-fort/run-snippets)

## 作ったきっかけ
- ブックマークレットを作成&修正するのはだるい
- Chromeのスニペット機能を使おうにも`jQuery`とかを呼べるようにするのはだるい
- 簡単に`npm packages`を利用したい

## 利点
- `npm packages`が利用できる
- スニペットをコード管理できる
- スニペットを実行可能なドメインを指定できる(`github.com`以外では実行不可など)
- チームでスニペットを共有する使い方もできそう(->実際にチームで利用し始めた)

## 更新履歴
使っていて不便なところは機能追加していってます。
詳しくは[ここ](https://github.com/re-fort/run-snippets/releases)を参照してください。

## 感想
- `chrome.tab.executeScript`は最後に評価された式の結果を返すため、`Promise`の結果を評価することはできない。そのため、`chrome.runtime.sendMessage`を使うように:blush:
- Chrome Extensionは初作成だったんですが、Firefoxでもほぼコード変更なしで使えたので便利!!
- Firefoxは`xpi`ファイルを署名しないと拡張機能として使えないですが、署名してない状態で読み込もうとすると、この拡張は壊れていますとしか言わなくて凶悪:imp:
- 最近、`Vue.js`と`bulma`の組み合わせを選ぶことが多いなー（´-`）.｡oO
Ruby・Railsを使って開発しているときに使ったメソッドをいくつかまとめてみた

# はじめに
自分が本格的にチーム開発にjoinしてから今まで使ってきたメソッドについて自分へのメモ的な感じでまとめてみました。随時編集、追記致します。

## pluck
こちらは僕自身一番お世話になった気がします。DBから欲しいデータのidを取り出すためによく使いました。

```example.rb
sorted_ids = Product.
  where(id: ids).
  where('shipping BETWEEN ? AND ?', Time.now, Time.now + 1.month).
  order(:shipping).
  pluck(:id)

# =>[4, 57, 87, 5, 46, 35]
```
おすすめ参考リンク先→https://techacademy.jp/magazine/7692

## is_a
これは条件分岐の際に使いました！例えば運営側で選択したタグの製品を表示したいときに、一つしか選ばれていなくてもちゃんと配列になるようにしたいときに使いました。

```example.rb
tags = tag.is_a?(Array) ? tag : [tag]
```

## try
こちらは自分が書いたメソッドが万が一が空だった際にnilが返ってくるようにするために使いました。

```example.rb
Product.where(status: 2).
  pluck(:id).
  try(:id)
# 中身が空だった場合nilが返ってくる
=> nil
```

僕はよくこんな感じで書いてました、、

```example.rb
Product.pluck(:id).where(status: 6).try(:first)
```

## index_by
こちらもリファクタリングしている際によくindex_byを使えば記述量減るねみたいな指摘を受けました。。指定したカラム名をkeyに、オブジェクトをvalueとして扱いたい時はこのメソッドを使います。

```example.rb
Travel.where(id: ids).index_by(&:name)
#=> {"流しそうめん体験"=>
  #<Travel id: １, name: "流しそうめん体験", ・・・>,
"芋掘り体験"=>
  #<Travel id: ３, name: "芋掘り体験",・・・>
}
```
おすすめ参考リンク先→http://qiita.com/QUANON/items/c3582a55949d1e6a1e84


## slice,slice!
これは配列から指定した要素を削除できるというものです。slice(選択範囲)だと戻り値は削除されたものが返ってきますが、元の配列は削除されていないです。slice!(選択範囲)と書いた場合は元の配列の要素も削除されます。

```example.rb
date = [1, 2, 3, 4, 5, 6, 7]
date.slice!(0, 6)
print date
#=> [2, 3, 4, 5, 6] 

date = [1, 2, 3, 4, 5, 6, 7]
date.slice!(1..5)
print date
#=> [1, 7] 
```

## uniq,uniq!
これは配列から重複している要素を取り除けるというものです。uniqだと戻り値は取り除かれたものが返ってくるが元の配列は変わらないです。uniq!と書いた場合は元の配列自身が重複した要素を取り除かれます。

```example
ids = [1, 37, 4, 65, 4, 21, 21, 78, 13, 37, 56]
travel_ids = ids.uniq!
p travel_ids
#=> [1, 37, 4, 65, 21, 78, 13, 56]
```


## inject
これは計算系の処理を書くために使いました。引数に初期値を与えないと、先頭にある一つ目の要素が初期値となります。

```example.rb
array.inject(0.0) { |sum, score| sum + score.average_score } / array.size
#=> 4.7
```
iOS 10時代であっても3.5inchスクリーンは無視しない方が良い話と、古い実機なしでさっとレイアウトを確認する方法

# 3.5inchスクリーンは生きていた

手元には実機がiPhone 6/7 Plusしかないとします。さらにDeployment TargetがiOS 10以降で、完璧なモダン開発体制を整えました。例によりiPadはシカトです。だからUniversal Appではなく、iPhoneのみを対象にします。こうなるとiPhone 4s以前の3.5inchスクリーンサイズは完全無視でも良さそうですよね。iOS 10だから古い端末のシミュレーターももはやないので、2017年の世界ではあんな小さな画面は存在しないも同然だと思われました。この時点では。

しかし大きな落とし穴があって、iPad向けに最適化せずともiPadはiPhone互換モードでiPhone Appを動かすことができます。そしてApp StoreのレビュアーはこのiPhone互換モードでアプリをレビューするため、たとえiPhone向けのアプリであってもiPadでレイアウトが崩れているとリジェクトを食らいます。

さらに厄介なことに、iPad 9.7inch系やminiのiPhone 互換モードではiPhone 3GS/4/4s の **320×480** の比率と一致するサイズになるため、もう絶滅したと思われた **3.5inch** がここでゾンビの如く襲いかかってくることになります。2017年にもなって、3.5inchです。でもこれは事実なので対処するしかありません。

App Store レビューガイドラインでも「**iPhone向けのアプリケーションは可能な限りiPadでも実行できるようにしてください**」という記載がありますが、これは可能な限りUniversal Appにしろ、という意味ではなく、iPhone互換モードでも適切に動作するよう保障せよ、という意味になるのかと思われます。ハードウェアの互換性としてはスクリーンサイズ以外にも色々考慮すべき点があるため、本来的にはより注意深く検討する必要があります。
> 2.4 ハードウェアの互換性 (2.4.1)
> https://developer.apple.com/app-store/review/guidelines/jp/

# 実機がないがさっと古い端末のスクリーンサイズを再現する方法

UIWindowのframeを書き換えれば簡単にサイズを変えられます。AppDelegateあたりにコードを数行追加するだけです。でも解像度は動作機器に依存するのでPlus系なら3xになります。

```swift
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
	let screenBounds = UIScreen.main.bounds
	let targetSize = CGSize.init(width: 320, height: 480)
	window?.frame = CGRect.init(x: screenBounds.width / 2 - targetSize.width / 2, y: screenBounds.height / 2 - targetSize.height / 2, width: targetSize.width, height: targetSize.height)

	return true
}
```

## 320×480@iPhone 6 Plus

iPhone 無印/3G/3GS/4/4s サイズの再現。iPad 9.7inchなどのiPhone互換モードはこの比率を拡大したものになる。iPad 12inchはまた異なる。

<img width="414" src="https://qiita-image-store.s3.amazonaws.com/0/3603/169ba53e-f23b-e4af-50ce-cb69ef093b71.png">

以下はLandscape時。昔はこんなちっさい画面だった。

![Screen Shot 2017-04-28 at 10.54.36.png](https://qiita-image-store.s3.amazonaws.com/0/3603/38f29f99-524d-ee2b-3db8-1f4668a12d95.png)

## 320×568@iPhone 6 Plus

iPhone 5/5s/5c/SE サイズの再現。

<img width="414" src="https://qiita-image-store.s3.amazonaws.com/0/3603/e4d7d176-6734-82d0-5a5a-96d8b22b01af.png">

## 375×667@iPhone 6 Plus

iPhone 6/7 サイズの再現。

<img width="414" src="https://qiita-image-store.s3.amazonaws.com/0/3603/6727a65a-7915-8a08-6c35-5c74e0a47422.png">
murmurhash3とmd5とsha1を速度比較する

ハッシュ関数の速度が気になったのでメモ。

古典的（？）なmd5とsha1とmurmurhash3を比較する。それぞれ10万回を100セット実行して結果を比較。実行したマシンはMacBook Pro Late 2016でIntel Core i7 2.6GHz Quad Coreのやつ。

| ハッシュ関数 | 時間(s) |
|:-:|:-:|
| md5 | 12.7691998482 |
| sha1 | 13.9324979782 |
| murmurhash3 | 2.75016593933 |

比較用のコードはこれ。

```python
#!/usr/bin/env python
import timeit


def mmh3_test():
  import mmh3

  for i in range(0, 100000):
    mmh3.hash(str(i))


def md5_test():
  import hashlib

  for i in range(0, 100000):
    hashlib.md5(str(i)).hexdigest()


def sha1_test():
  import hashlib

  for i in range(0, 100000):
    hashlib.sha1(str(i)).hexdigest()


if __name__ == '__main__':
  import timeit
  print(timeit.timeit("mmh3_test()", setup="from __main__ import mmh3_test", number=100))
  print(timeit.timeit("md5_test()", setup="from __main__ import md5_test", number=100))
  print(timeit.timeit("sha1_test()", setup="from __main__ import sha1_test", number=100))
```
SSIを用いたコンテンツ出し分けがApache 2.4でエラーになる

SSIを使うと正規表現マッチで条件分岐ができるので、PC/スマホの出し分け用に以下のような記述が使われることがあります。

```html
<!--#if expr="${HTTP_USER_AGENT} = /(iPhone)|(iPod)|(Android)|(Windows Phone)/" -->
スマホ用の記述
<!--#else -->		
PC用の記述
<!--#endif -->
```

が、これはApache 2.4ではエラーになり動きません。なぜかというと``expr``に指定する条件式の構文が「ap_expr[^1]」という新しい構文に変わっているためです。演算子が増えたり組み込みの関数が呼び出せるようになったりといろいろ変わっているのですが、上記の例だと以下の内容が引っかかります。

- 変数の表記が``$NAME``から``%{NAME}``に変わった
- 正規表現マッチの演算子が``=~``になった

なので、今後は以下のように記述する必要があります。

```html
<!--#if expr="%{HTTP_USER_AGENT} =~ /(iPhone)|(iPod)|(Android)|(Windows Phone)/" -->
スマホ用の記述
<!--#else -->		
PC用の記述
<!--#endif -->
```

あるいは``SSILegacyExprParser``ディレクティブ[^2]に``on``を指定することで古い構文に戻すことができます。

```apache
SSILegacyExprParser on
```

ちなみにデフォルト値は``off``です。気軽にバージョンアップすると動かなくなってはまります。互換性を取ってデフォルトは``on``にしてほしかったですね……

[^1]: https://httpd.apache.org/docs/2.4/en/expr.html
[^2]: https://httpd.apache.org/docs/2.4/en/mod/mod_include.html#ssilegacyexprparser
WRF / WPS > namelist.wpsのコメント表記 > !

```txt:動作環境
Xeon E5-2620 v4 (8コア) x 2
32GB RAM
CentOS 6.8 (64bit)
openmpi-1.8.x86_64 とその-devel
mpich.x86_64 3.1-5.el6とその-devel
gcc version 4.4.7 (とgfortran)
NCAR Command Language Version 6.3.0
WRF v3.7.1を使用。
```

WRF(Weather Research and Forecasting Model)関連。

WPSの処理に使う`namelist.wps`ファイルのコメントには!を使う。

行コメントのようだ。

複数行コメントについては未調査。

http://docs.cray.com/books/S-3693-50/html-S-3693-50/i5lylchri.html

```
!THIS IS COMMENT ZERO
$NMLA !THIS IS COMMENT ONE
!THIS IS COMMENT TWO, IVALUE = 1
IVALUE = 2 !THIS IS COMMENT THREE IVALUE = 3
RVALUE = !THIS IS COMMENT FOUR 4.0
5.0 !THIS IS COMMENT FIVE RVALUE = 6.0
/
```
Macでファイルを分割する

#Macでファイルを分割する方法
##split / cat コマンドの使用
###1. ファイルの分割

```
split -b 分割したいデータ容量 分割するファイル名 分割後のファイル名
```

###2. ファイルの結合

```
cat 分割後のファイル名.* > 結合後のファイル名
```
Windows > 無線マウスの動作が不安定 > 複数のドライバが見える、の対応

```txt:動作環境
Windows 7 Pro (32bit)
```

無線マウスの動作が不安定とのこと。

デバイスマネージャを見ると「HID準拠マウス」が2つある。

以下で対応した。

1. デバイスマネージャを開いてマウス関連の部分を表示
   - HID準拠マウス
2. 無線マウスのUSBアダプタを抜く
   - HID準拠マウスの１つが消える
3. 残った方の「HID準拠マウス」を無効にする
   - キーボードで操作

(追記 2017/05/16)
上記対応後、同じ症状が再発した。
対応方法は未確認。
OOP的中国語講座

### 注意
Markdownの練習を兼ねたネタ投稿です。

```Chinese.java
public class Chinese implements Weedable{
    @Override
    public String weed(){
        return "Fxxk";
    }
}
```
```Japanese.java
public class Japanese implements Weedable{
    @Override
    public String weed(){
        return "LOL";
    }
}
```
```Main.java
public Class Main{
    public static void main(String[] args){
        Weedable chinese = new Chinese();
        Weedable japanese = new Japanese();
        System.out.println(chinese.weed()); // "Fxxk"
        System.out.println(japanese.weed()); // "LOL"
    }
}
```
MySQLでWindowsの共有フォルダからLOAD DATAする

## はじめに

MySQLの`LOAD DATA LOCAL INFILE`を使って、ファイルサーバ上のファイルを取り込む方法について説明します

## 取り込み先のフォルダをネットワークドライブとしてマウントする

結論から言うと取り込みたいファイルが存在する共有フォルダをネットワークドライブとしてマウントして、`LOAD DATA`では、ドライブレターから始まるパスを指定すればOKです。

### ドライブの割り当て

割り当て方法の詳細はググったり、[ネットワークドライブの割り当て方法（Windiws版　※Windows 10対応)](http://www.tku.ac.jp/iss/guide/network/tool/networkdrive/windiwswindows-10.html)を参照してください

### LOAD DATA

通常通り`LOAD DATA`コマンドを実行します
(ここではZドライブにマウントしたとします)

```
LOAD DATA LOCAL INFILE 'Z:\\foobar.csv' INTO ...
```
gitコマンドTips

## addとcommit

```git
git add -u
```
-uつけると更新されたオブジェクトを全てaddするが新規ファイルはaddしない

```git
git add -A
```
-Aつけると更新されたオブジェクトと新規ファイルを全てadd

```git
git commit -a
```
更新されたオブジェクトのコミット。add -u / commitのショートカット

```git
git log --all --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --date=relative
```
このログをaliasにすると完璧。

##取り消し・リセット
いろんな状況に応じて、適切なやり直し方がある。
超まとまってるサイト↓
[gitでアレを元に戻す108の方法](http://labs.timedia.co.jp/2011/08/git-undo-999.html)
[さっきの取り消したい！って時のGitコマンドまとめ](http://qiita.com/kansiho/items/2bacecdb95d752cb38b7)

---
 
```git
git checkout ファイル名`
```
**add前**の作業ツリー内の変更の取り消し
=最新のコミット状態からやり直し

```git
git checkout HERD　ファイル名
```

**add後commit前**の変更の取り消し

```git
git commit --amend -a -m '〇〇'
```
--amendは、**直前のコミットを訂正**する。
=新しくコミットするのではなく、直前のコミットを置き換える
※ログメッセージの変更が必要ない場合、`-C HEAD`オプションを指定。

```git
git reset HEAD~2
または
git reset HEAD^^
```
2個**前のコミット状態に戻る。**1個前だったら、`HEAD~1 もしくは HEAD^`となる。
なお、**ワーキングツリーの状態は変更されない。**プロジェクトの歴史を消すことになるので、実行には注意が必要。
**`--hard`オプション**をつけると**ワーキングツリーすらそのコミット状態に同期される。**怖いコマンド。
ただ、ワーキングツリーのファイルを謝って削除してしまった場合は

```git
git reset --hard HEAD
```
ですぐに元どおりになる。




## .gitconfigファイルの設定
以上にあげたオプションを頻繁に利用する場合は、いちいち打つ（orコピペする）のが面倒であるため、~/.gitconfigファイルにaliasとして登録すればいい。

参考:
- [gitで便利なエイリアス達](http://qiita.com/peccul/items/90dd469e2f72babbc106)
- [その他の.gitconfigファイルの設定のすすめ](http://qiita.com/wnoguchi/items/f7358a227dfe2640cce3)
- [RevertとBlameを使いこなして安全性の高い開発を推進しよう](https://thinkit.co.jp/article/8436)
- [gitコマンドチートシート](http://qiita.com/sutetotanuki/items/1700343852e863ba63a0)
- [git tagの使い方まとめ](http://qiita.com/growsic/items/ed67e03fda5ab7ef9d08#%E5%BE%8C%E3%81%8B%E3%82%89tag%E3%82%92%E3%81%A4%E3%81%91%E3%82%8B%E5%A0%B4%E5%90%88)
無料で使えるガントチャート作成ツールgantterを使ってみた。

#gantterとは
gantterはgoogleの拡張機能。無料で使えるスケジュール作成ツールです。
![スクリーンショット 2017-04-27 14.41.08.png](https://qiita-image-store.s3.amazonaws.com/0/174392/31cd7011-5b59-f9cc-be0a-f9bde80d978d.png)

#早速追加してみる

ChromeのWebストアで【gantter】と検索し、追加します。

アプリの一覧からgantterを検索、追加します。

![gantter01.png](https://qiita-image-store.s3.amazonaws.com/0/174392/c8064783-f466-edb5-39d9-4bfcba9007b5.png)

アプリ一覧にgantterが入っているので、早速開いてみます。

![gantter02.png](https://qiita-image-store.s3.amazonaws.com/0/174392/7ae0a880-a99c-839e-9fd3-259bbb9a53d5.png)

全体的な見た目はこんな感じ。

![gantter03.png](https://qiita-image-store.s3.amazonaws.com/0/174392/6ea673a6-4467-07b1-a81a-9cb153c7d3f3.png)

編集するプロヘクトの名前や詳細を設定します。
無題と書かれている部分をクリックするとプロパティが表示されるので、必要な部分を入力。

![gantter04.png](https://qiita-image-store.s3.amazonaws.com/0/174392/f98c9200-09a3-aed7-fde7-818166b2e529.png)

タスク入力前にカレンダーとリソースの設定を行っておくのがオススメ。

##カレンダーの設定

デフォルトで設定されているのは【標準型、24時間、夜型】の３つ。
新規作成する場合は4以降に登録したいカレンダー名を入力します。カレンダーの詳細内容の設定は右上の歯車マークをクリック。
![gantter05.png](https://qiita-image-store.s3.amazonaws.com/0/174392/cb4e9e4d-8f75-1462-641b-3333d0137faa.png)

営業日と営業時間の詳細を設定できます。

![gantter06.png](https://qiita-image-store.s3.amazonaws.com/0/174392/531946ad-2b86-0f85-7fc9-0b165ba02c6b.png)

少し面倒ですが、営業曜日ごとに時間を入力していきます。

![gantter07.png](https://qiita-image-store.s3.amazonaws.com/0/174392/108e6f5d-3e09-98d3-e694-8cdc3859f804.png)


#リソースの設定
カレンダー設定と同じような感じで、リソースの設定をします。
ここでは社内メンバーのイメージで登録をしていますが。自社、お客様という形で登録をする場合もあるかと思います。
![gantter08.png](https://qiita-image-store.s3.amazonaws.com/0/174392/96fae93b-007e-bfce-c81b-96db96a4f9cc.png)

#タスクの入力
ざっとテスト用に項目を追加してみました。

![task.png](https://qiita-image-store.s3.amazonaws.com/0/174392/9a84e72b-ce19-f38c-0cdd-e87903f54a9c.png)

ここから見やすく調整します。
右上の歯車マークをクリックしてタスクのプロパティへ。

前提タスクのタブを開くと、タスクの順序を調整できます。
![gantter-zentei-task.png](https://qiita-image-store.s3.amazonaws.com/0/174392/e0dc47de-bdcb-25ab-1c39-bcdad77cf920.png)

colorのタブを開くと、グラフの色を変更できます。
![gantter-color.png](https://qiita-image-store.s3.amazonaws.com/0/174392/885fb8ac-a94b-48e5-0c06-4b6d706c159f.png)

完成したものがこちら。

![装飾後.png](https://qiita-image-store.s3.amazonaws.com/0/174392/f0bed5ee-c56b-9fa3-797c-29107600f383.png)

GoogleDriveに保存すればメンバーへの共有も簡単です。
シンプルなつくりなので、直感的でわかりやすい印象でした。GoogleDriveに保存できるところも便利ですね。
Swift3 で配列の値をTableViewのセルに表示する方法

#備忘録

ふと、「あれ？配列の値をTableViewのセルに表示させるにはどういう書き方すればええんやったっけ？」となったので書き記しておきます...orz

# 配列の要素

```swift

var Array:Array = ["a", "aa", "aaa", "aaaa"]
```

# 下記のように記述すれば配列の値がセルに入ります


```swift

cell.textLabel?.text = Array[indexPath.row] 
```

<img width="277" alt="スクリーンショット 2017-04-28 10.45.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/135794/2313f662-83fe-47a8-2d76-2df808f5663f.png">


# 参考

[丁寧解説！SwiftでUITableViewの使い方](http://yuu.1000quu.com/how_to_use_uitableview)

[Swift3 で配列の値をTableViewのセルに表示する方法](http://off.tokyo/blog/2017/04/28/swift3-%E3%81%A7%E9%85%8D%E5%88%97%E3%81%AE%E5%80%A4%E3%82%92tableview%E3%81%AE%E3%82%BB%E3%83%AB%E3%81%AB%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/)
「サーチ・インサイド・ユアセルフ」3行まとめ

# 読んだ本
[サーチ・インサイド・ユアセルフ――仕事と人生を飛躍させるグーグルのマインドフルネス実践法](https://www.amazon.co.jp/%E3%82%B5%E3%83%BC%E3%83%81%E3%83%BB%E3%82%A4%E3%83%B3%E3%82%B5%E3%82%A4%E3%83%89%E3%83%BB%E3%83%A6%E3%82%A2%E3%82%BB%E3%83%AB%E3%83%95%E2%80%95%E2%80%95%E4%BB%95%E4%BA%8B%E3%81%A8%E4%BA%BA%E7%94%9F%E3%82%92%E9%A3%9B%E8%BA%8D%E3%81%95%E3%81%9B%E3%82%8B%E3%82%B0%E3%83%BC%E3%82%B0%E3%83%AB%E3%81%AE%E3%83%9E%E3%82%A4%E3%83%B3%E3%83%89%E3%83%95%E3%83%AB%E3%83%8D%E3%82%B9%E5%AE%9F%E8%B7%B5%E6%B3%95-%E3%83%81%E3%83%A3%E3%83%87%E3%82%A3%E3%83%BC%E3%83%BB%E3%83%A1%E3%83%B3%E3%83%BB%E3%82%BF%E3%83%B3/dp/4862762271)

## 3行まとめ
- 瞑想とは心の運動
- 2分間、目を瞑り呼吸に意識を集中する
- 逸れた意識を元に戻す訓練
JScriptでアクティブウィンドウを指定したバッチファイルを作成する


# 1. 概要
[前回](http://qiita.com/yuji_miyano/items/b82b3399a4bc97b8635b)、Windows起動時にNode.js(Powershell上)とUnityを起動するバッチファイルを書きましたが、アクティブウィンドウの指定ができなかったためJScriptで書き直してみました。

# 2. 参考サイト
1. [WSH JScriptを使いこなそう ～アプリケーション操作～](http://3rd.geocities.jp/kaito_extra/Source/ApplicationCtrl.html#LINK3)
2. [WScript.ShellのRunでの、間にスペースのあるファイルパスの指... - Yahoo!知恵袋](https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1112123261)
	
# 3. 作業環境
* Windows 10

# 4. 手順

[参考サイト1](http://3rd.geocities.jp/kaito_extra/Source/ApplicationCtrl.html#LINK3)をベースにします。

1. JScriptと同じ階層にあるNodeフォルダをカレントディレクトリにします。(複数のPCでコードを共有していたので相対パスにしています。)

2. Nodeフォルダ内にあるapp.jsをPowershellで起動します。
引数で`app.js`を指定することでPowershellで起動するアプリを指定できます。その際`\"`でそれぞれをくくります。
非アクティブにするため`WS_NOTACT_NOMAL`とします。

3. `WScript.Sleep( 5000 );`で5秒待機します。

4. 今回はUnityのtest.exeファイルがデスクトップにあったので、カレントディレクトリをデスクトップに移動します。

5. `sh.Run( "test.exe", WS_ACT_NOMAL );`でexeファイルをアクティブウィンドウで起動します。

```javascript
// ウインドウスタイル
var WS_NOTVISIVLE   = 0;    //ウインドウは非表示
var WS_ACT_NOMAL    = 1;    //ウインドウはアクティブ、サイズは通常(規定値)
var WS_ACT_MIN      = 2;    //ウインドウはアクティブ、サイズは最小
var WS_ACT_MAX      = 3;    //ウインドウはアクティブ、サイズは最大
var WS_NOTACT_NOMAL = 4;    //ウインドウは非アクティブ、サイズは通常
var WS_ACT_DEF      = 5;    //ウインドウはアクティブ、サイズは前回終了時と同じ(アプリによって動作は異なる)
var WS_NOTACT_MIN   = 7;    //ウインドウは非アクティブ、サイズは最小

// Shell関連の操作を提供するオブジェクトを取得
var sh = new ActiveXObject( "WScript.Shell" );

// カレントディレクトリを設定
sh.CurrentDirectory = "../Node";
// PowershellでNode起動(非アクティブ)
sh.Run("\"C:/Windows/System32/WindowsPowerShell/v1.0/powershell.exe\" \"node app.js\"", WS_NOTACT_NOMAL );


// 5秒待機
WScript.Sleep( 5000 );

// カレントディレクトリを設定
sh.CurrentDirectory = "../../../../../Desktop";
// Unity起動(アクティブ)
sh.Run( "test.exe", WS_ACT_NOMAL );

//  オブジェクトを解放
sh = null;

```
pythonでx軸がlogスケールのヒストグラムを書く


X軸がlogスケールのグラフをpythonで書くメモ


```
import pylab as pl
import numpy as np
```

#二つの山を持つ分布の作成

```
data1 = (np.random.normal(size=100) + 10)* 1e-5
data2 = (np.random.normal(size=100) + 10)* 1e-10
data = np.r_[data1, data2]
#ヒストグラムの作成
print(data)
pl.hist(data)
```

![Unknown-6.png](https://qiita-image-store.s3.amazonaws.com/0/175646/d2a1a2c1-33b7-d03c-2018-08cf3d0b13a0.png)

#xをlogスケールにするだけではダメ
```
pl.hist(data)
pl.gca().set_xscale("log")
```
![Unknown.png](https://qiita-image-store.s3.amazonaws.com/0/175646/011e4e2c-2b7b-e64b-850c-a5d73b6b0c59.png)

それぞれの棒(binsとも言う)の幅が対数じゃないのね、なるほど

```
#ヒストグラムの作成
print(data)
pl.hist(data, bins=np.logspace(-11, -3, 500))
pl.gca().set_xscale("log")
```

![Unknown2.png](https://qiita-image-store.s3.amazonaws.com/0/175646/ecd09eac-9336-6584-7c7b-be90a9d87a9d.png)

いけた。np.logspaceのオプションは「10^-11から10^3の範囲で500個のbinを作ってね」っていう感じ。
注文詳細API　クーポン情報について

注文詳細APIの取得可能項目UseCouponDataについて、クーポン種別の値の一覧を教えていただけないでしょうか。
また、クーポンカテゴリも一覧をいただけると幸いです。
下記を参考にしていますが、コード一覧等を記載したページを探せませんでした。
https://developer.yahoo.co.jp/webapi/shopping/orderInfo.html

また、ストアクリエイターProのクーポン設定で表示されるクーポン種別は、ストア全体、単品商品等が表示されておりますが、注文詳細APIのクーポン種別とは別物との認識で合っているでしょうか。

ご教示の程、どうぞ宜しくお願い致します。
連続したデータの区切りで罫線を引く


シートで値が連続する場合に、その区切りで罫線を引くためのマクロ

```vbnet:ExcelVBA
Option Explicit

Sub Drawlines()
    Dim i As Integer
    Dim mc As Integer   '連続性を判定する列
    Dim bm As Variant   '一つ上のセル内容
    Dim am As Variant   'セル内容
    
    mc = InputBox("連続データが入力されている列を教えてください", "連続データの列")
    bm = 0
    For i = 2 To Cells(Rows.Count, mc).End(xlUp).Row + 1
        am = Cells(i, mc)
        If bm <> am Then
            Range(Cells(i, mc).Address(False, False)).EntireRow.Select
            Selection.Borders(xlEdgeTop).LineStyle = xlContinuous
            bm = am
        End If
    Next i

    Cells(1, mc).Select

End Sub

```
standerd SQL CRUD メモ

調べててもあんまり出てこないのに、クエリは普通だった

## insert
- OK

```sql

insert `dataset.target_table` (column1, column2, column3)
select column4, column5, column6 from `dataset.base_table`
```
- NG 1

```sql
insert `dataset.target_table`
select column4, column5, column6 from `dataset.base_table`
```
- NG 2

```sql
insert `dataset.target_table`
select column4 AS column1, column5 AS column2, column6 AS column3
from `dataset.base_table`
```

## read
```
select * from `schema.target_table`
```

## update
```sql
update `dataset.target_table` set column1 = 2 where column1 = 1
```
## delete
```sql
delete from `dataset.target_table` where column1 = 1
```
git reset --hard HEAD^ で編集中のファイルをすべて消してしまった際の復元方法

今回復元したファイルは一度`stash`してあったファイル。一度`add`または`stash`したファイルは復元できる可能性があるみたい。その他のファイルも復元できるかもしれないが、確認していない。

`add`の場合の参考記事:
[git add .; git reset --hard HEAD してしまったファイルのサルベージ](http://thinca.hatenablog.com/entry/20120923/1348340730)

今回の参考記事:
[git stash save で一時退避した変更を、誤って git stash clear で消してしまったときの回復法](http://thinca.hatenablog.com/entry/20120923/1348340730)
> git fsck で宙ぶらりんになっている変更の sha1 をリストアップし、 git show でその変更の中身を確認し、目的の sha1 を見つけたら git cherry-pick で適用する、という流れです。

```bash
$ git fsck | awk '/dangling commit/ {print $3}'
# git fsck で宙ぶらりんになっている変更の sha1 をリストアップする
```

標準出力されたsha1のリストをコピペして`ruby`スクリプトを実行。

```ruby
ids = %w(
  sha1のリスト
)

ids.each do |id|
  summary = `git show --summary #{id}`
  # 今回は一度 stash を探すので WIP on something で探す
  branch_name = summary.match(/WIP on (.+?):/)
  next unless branch_name
  # branch_name に対象のブランチネームを入れる
  p summary if branch_name[1] == 'branch_name'
end
```

`summary`に日付も含まれるので、一番新しいものを復元。

```bash
$ git cherry-pick -n -m1 見つけたsha1
```
R の パイプライン処理での return について

R って良いな♪ と思わせる要素の一つに
パイプライン処理があります（magrittrなどが必要ですが）

そんな便利なパイプライン処理ですが、
return 関数を用いる際は気を付けなければいけません。


# 注意
根本的に解決したとかではなく、こういった問題があるよといった注意喚起です。
むしろ詳しい方に教えてほしいです。

# 環境
Rstudio on Docker toolbox on Windows 10 です。

```
> version
               _                           
platform       x86_64-pc-linux-gnu         
arch           x86_64                      
os             linux-gnu                   
system         x86_64, linux-gnu           
status                                     
major          3                           
minor          3.3                         
year           2017                        
month          03                          
day            06                          
svn rev        72310                       
language       R                           
version.string R version 3.3.3 (2017-03-06)
```
パッケージは以下の通りです。

*  magrittr 1.5
*  dplyr 0.5.0 

# 問題
```{R}
library(dplyr)

samplefunc1 <- function() {
  TRUE %>% return
  FALSE %>% return
}

samplefunc2 <- function() {
  return(TRUE)
  return(FALSE)
}

samplefunc1()
samplefunc2()
```

上記を実行すると以下のようになります。

```
> samplefunc1()
[1] FALSE
> samplefunc2()
[1] TRUE
```

！？

パイプライン処理のreturnでは関数が終わらないことが確認できます。
なぜなになでしこです。

ググってみると、以下のようなissueが出てきましたが、まだクローズされてません…
https://github.com/tidyverse/magrittr/issues/32

もしくは何か実装方針（思想）があるのでしょうか…分かりません…

# 結論
以下のいずれかで統一したほうが混乱しなさそうです。

*  return 関数はパイプライン処理内に書かない
  * 例  ```return(x %>% group_by(a) %>% min)``` 
*  返す値を決めて関数の最後でのみreturn する

どちらにしろスッキリ度は下がりますね
golang 並列処理を動的に生成して同じ変数へ書き込む

## 目的
- 並列処理させたい処理(func) の動的生成
- 並列処理部分だけを関数化

## 感想
- chan使わなくてもできる
- chanとの使い分けはよくわからない

## コード

```go
package main

import (
	"math/rand"
	"sync"
	"time"
)

type result struct {
	param    int
	waitTime int
}

// 並列処理の結果入れる箱
var results = []*result{}

func main() {
	funcSize := randomInt()
	println("func size:", funcSize)

	//並列処理したいfuncの生成
	functions := createFunctions(funcSize)
	//並列処理
	goRoutine(functions)

	//結果確認
	println("result ############")
	waitSum := 0
	paramSum := 0

	for index, result := range results {
		println("index:", index, "waitTime:", result.waitTime, "param:", result.param)
		waitSum += result.waitTime
		paramSum += result.param
	}
	println("result size:", len(results), "wait sum:", waitSum, "param sum:", paramSum)
}

func randomInt() int {
	rand.Seed(time.Now().UnixNano())
	return rand.Intn(10)
}

func createFunctions(num int) (functions []func()) {
	for i := 0; i < num; i++ {
		functions = append(functions, createFunctionBase())
	}

	return functions
}

func createFunctionBase() func() {
	return func() {
		waitTime := randomInt()
		paramInt := randomInt()

		println("sleep ", waitTime, " started.")
		time.Sleep(time.Duration(waitTime) * time.Second)
		println("sleep ", waitTime, " finished.")

		results = append(results, &result{param: paramInt, waitTime: waitTime})
	}
}

func goRoutine(funcList []func()) error {
	println("started.")

	var waitGroup sync.WaitGroup

	// 関数の数だけ並行化する
	for _, function := range funcList {
		waitGroup.Add(1) // 待つ数をインクリメント

		// Goルーチンに入る
		go func(f func()) {
			defer waitGroup.Done() // 待つ数をデクリメント
			f()
		}(function)
	}

	waitGroup.Wait() // 待つ数がゼロになるまで処理をブロックする

	println("all finished.")
	return nil
}


```
golang struct の比較

structの比較はどのようにするのが良いのかわからなかったので色々実験してみた

## 結論
保持するパラメータで比較: `*object1 == *object2` 
hashで比較： `object1 == object2`
で良さそう。


## 実験コード

https://play.golang.org/p/3gB26JkPMm

```go

package main

type parent struct {
	name  string
	param int
	child
}

type child struct {
	name  string
	param int
}

func main() {
	childName := "foo"
	childParam := 1
	child1 := child{name: childName, param: childParam}
	child2 := &child{name: childName, param: childParam}

	println("###################")
	println("&child1", &child1)
	println("child2", child2)
	println("&*child2", &*child2)
	println("&child2", &child2)
	println("child equals result 1:", child1 == *child2)
	println("child equals result 2:", child1 == *&*child2)
	println("child equals result 3:", *&child1 == *child2)
	println("child equals result 4:", &child1 == *&child2)

	parentName := "tests"
	parentParam := 3
	parent1 := &parent{name: parentName, param: parentParam, child: child1}
	parent2 := &parent{name: parentName, param: parentParam, child: child1}

	println("###################")
	println(parent1)
	println(parent2)
	println("result:", *parent1 == *parent2)

}
```
[git] 戻したい時よく使っているコマンドまとめ

## はじめに

コミットのバージョンを戻す、ステージングしたものを編集内容ごと取り消す、ファイルのステージングを取り下げる...と戻すにも色々あります。

整理も兼ねて業務でよく使っているコマンドをまとめます。

## 目次

- 編集内容を取り消したい(addする前)
- ステージングを取り消したい
- コミットのバージョンを戻したい
- 特定のファイルのみ、コミットのバージョンを戻したい
- リモートリポジトリのコミットのバージョンを戻したい

## 編集内容を取り消したい(addする前)

`git checkout [ファイル名]`
 ファイル名のところを`.`にすると、ステージング前の全ての変更内容がなくなる。

## ステージングを取り消したい

`git reset [ファイル名]`
　ステージングを取り下げる。編集内容は残る
ファイル名を指定しないと全てのステージングが取り下げられる。

`git checkout HEAD -- [ファイル名]`
 ステージしたファイルを最後にコミットした状態に戻す
つまり編集内容は残らない。

`git reset --hard HEAD`
 編集・ステージングいずれの変更内容を取り消し、最後にコミットした状態に戻す

checkoutとresetの違いを説明しようとするとそれだけで記事が1つ書けそうなので今回はやりません。
ただざっくりとだけ説明すると、
大きく分けて違いは二つ

- 作業ディレクトリの未保存の有無をチェックする機能
checkout：ある。うまくやれば未変更のファイルを全て更新してくれる
reset --hard：ない。容赦無く上書きされる

- HEADの移動の仕方
checkout：HEADそのものが移動。HEADが付いていたブランチに変化はない
reset：HEADの示すブランチの方が移動

上の説明の図があります。
[7.7 Git のさまざまなツール - リセットコマンド詳説](https://git-scm.com/book/ja/v2/Git-%E3%81%AE%E3%81%95%E3%81%BE%E3%81%96%E3%81%BE%E3%81%AA%E3%83%84%E3%83%BC%E3%83%AB-%E3%83%AA%E3%82%BB%E3%83%83%E3%83%88%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E8%A9%B3%E8%AA%AC#_チェックアウトとの違い)


## コミットのバージョンを戻したい

`git reset --hard [コミットid]`
 コミットidは`git log`コマンドで調べて、戻りたいコミットのidを指定してあげる。

※非推奨(個人的に)
`git revert [コミットid]`

`reset --hard`が戻った以降のコミットをなかったことにする(コミットログが消える)のに対して、`revert`はコミットログを残したまま戻る。
そのままpushしたりmergeされたりすると、反映されていない変更履歴が残ってしまい、メンバーを混乱させることがある。不要になったコミット履歴に気をつけましょう。

## 特定のファイルのみ、コミットのバージョンを戻したい
`git checkout [コミットid] [ファイルパス]`

## リモートリポジトリのコミットのバージョンを戻したい

結論から言うとそれ用のコマンドはない。
なので以下の手順で
リモートリポジトリを消す→ローカルのを反映させる
ということをする。

念のためバックアップを作成
`git push origin master:master_bak`

remoteのmasterを一旦消す。ローカルを一つ戻す。

pushして反映させる。
`git push -f origin HEAD^:master`


無事に戻せたのを確認できたら

`git push origin :master_bak`
でバックアップを消す。

以前やらかした時に助けられました...:pray:

参考
[Gitでリモートリポジトリを巻き戻す | @tmtms のメモ](http://tmtms.hatenablog.com/entry/20101221/git)



## おわりに

resetとrevertよりもresetとcheckoutの違いの方が難しかった。