OmniAICreator/Qiita-1.07M huggingface dataset:
Windows 10でCmder（Clink）のエイリアスが効かない（2017/11/04時点）

# 概況
[Cmder](http://cmder.net/)では、`config\user-aliases.cmd`にエイリアスを定義できるが、Windows 10では左記のファイルで定義したエイリアスが認識されない（2017/11/04時点）。

# 原因
Cmderでは、エイリアスについては[Clink](http://mridgers.github.io/clink/)というプログラムにまかせている。ClinkはWindowsの`doskey`コマンドを使用してエイリアスを定義している。
このClinkがWondows 10の`doskey`コマンドに対応できていない、と思われる（2017/11/04時点）。

[Fix broken doskey macro functionality with Windows 10 (15002)'s modern cmd #464](https://github.com/mridgers/clink/pull/464)

# 対応策
対応策は2通りあるっぽい。私は2を選択（1は試してない）。

1. コマンドプロンプトの設定を変更する
    * コマンドプロンプトのプロパティを開き、「オプション」タブの「従来のコンソールを使う」にチェックを入れる
1. `doskey`コマンドに対応したclinkに差し替える
    * [Clinkのリリースページ](https://github.com/Stanzilla/clink/releases)から、今回の問題が修正されているファイルをダウンロードする。2017/11/04時点だと「0.4.9」の「clink_DEV.zip」がそれ。
    * cmderのフォルダの`vender\clink`のファイルを、ダウンロードしたZIPファイル内のファイルで上書きする。
    * clink_x64.exeのプロパティを開き、「詳細」タブに記載されているファイルバージョンを確認する。
    * `vender\clink\.cmderver`に上述のファイルバージョンを記載する。

- [Aliases do not work under Win10 1703 (Build 15063.11) #1325](https://github.com/cmderdev/cmder/issues/1325)
- [Don't load alias configure on win 10 #1509](https://github.com/cmderdev/cmder/issues/1509)
Linux からWindows へリモートデスクトップ接続する

Arch Linux からWindows へリモートデスクトップしたときの備忘録。

# freerdp インストール 
Windows にリモートデスクトップ接続するには`freerdp` をインストールします。
Arch Linux の場合は`pacman` で公式リポジトリからインストールすることができます。


```text
# pacman -Sy freerdp
```


freerdp インストール後、`xfreerdp` コマンドが使用できるようになります。
コマンドの実行例は次の通りです。


```text:xfreerdpコマンド例(フルスクリーン)
# xfreerdp /u:tsutomu-nakamura /p:password /f +fonts +clipboard  /v:192.168.1.103:3389
```



```text:xfreerdpコマンド例(解像度指定)
# xfreerdp /u:tsutomu-nakamura /p:password /w:1366 /h:768 +fonts +clipboard /v:192.168.1.103:3389
```


その他オプションについては`man xfreerdp` コマンドを実行することで色々確認できます。

# 参考 

- awesome-freedesktop-git
    - https://aur.archlinux.org/packages/awesome-freedesktop-git/
QGISで空間演算ができないときに１

論文のデータを用意する中でなかなか検索してもヒットしなかったので、ここにメモ程度に。
ただ、これ以外に色々なところでエラーが出るので、万能薬ではないです。とりあえず試してみる的にお考えください。


#1: 環境
OS: WIndows 10
QGIS: 2.18.13

#2: 全体的な作業
作業自体はとても簡単です。特殊なプラグインは必要ありません。
プロセッシングツール内のものは使います。
全体的な作業は以下のような流れになります。

1. ジオメトリの確認（妥当性、整合性のチェック）
2. 不正なジオメトリを修正
3. 妥当なジオメトリと統合


#3.1: ジオメトリの確認
ここでは、どのジオメトリがおかしなことになっているか確認します。

ツールバー内にある、
*ベクタ＞ジオメトリツール＞妥当性のチェック*
（バージョンによっては”整合性のチェック”になっているかも？未確認です。。。）

を選択。
ここで、おかしなことになっているレイヤーを選択し、実行。

そのまま実行すると、レイヤーには
*妥当な出力、不正な出力、エラー出力*、の３つの一時的レイヤーができます。

#3.2: 不正なジオメトリの修正
3.1でできた*不正な出力*を修正していきます。

プロセッシングツールボックスで、*v.buffer.distance*を実行します。
（プロセッシングツールボックスで検索してみてください。GRASS GISコマンド＞Vector内にあるかと思います。）

ここで変更点は、**Buffer Distanceを0**に変更します。


実行後、Bufferレイヤーができて、不正なジオメトリ―を修正できました。

#3.3: 妥当なジオメトリと統合

3.1でできた妥当な出力と、3.2でできたBufferを、
*ベクタ＞空間演算ツール＞統合* で一つのレイヤーにしましょう。
完成です。

#4: 最後に

こちらの方法でも対処できないものも結構ありました。
徐々に更新できればと思ってます。
最後までありがとうございました。
Node.js(JavaScript)で可変長バイナリを書き出す方法

可変長のバイナリが作りたかったので、テストしてみました。

##コード
```test.js
function output() {
  var dataArray = [0,1,2,3,4,5,6,7,8,9];
  dataArray = dataArray.concat([0xaa,0xbb,0xcc,0xdd,0xff,0x1234,0x5678,0xff55]);
  console.log('output test');
  var ub = new Uint8Array(dataArray);
  fs.writeFileSync('outfile',ub);
}
```
##そして結果
![image.png](https://qiita-image-store.s3.amazonaws.com/0/86295/3bdefcd1-3458-f882-0112-9b7fa5b997a3.png)

下位のみが拾われる様子。
通常の配列の方が扱いやすいし、これが一番かなと。
AIXでISOマウント

# AIXでISOマウント

##AIX6から
```
loopmount -i [iso file name¥] -o "-V cdrfs -o ro" -m [mount point]
```

## AIX6以前だと
```
mklv -y cdlv -s n -L /dev/cdlv rootvg $(du -m [ISO image file] | awk ¥'{ print int($1+64)"M"}¥') hdisk0
lslv cdlv
dd bs=1M if=[ISO image file] of=/dev/cdlv
mount -v cdrfs -o ro /dev/cdlv [mount point] 
```

う～んloopmount便利ですね。
perl入学式in沖縄を終えて…

# 初めて参加したperl入学式
### 自己紹介

始めました。うにと申します。今年になってから、R大に編入してきたものです。
perl入学式は第二回から参加させていただきました。

### perl入学式に参加したきっかけ

私がR大に編入する前は専門学校に通っていたのですが、そのとき、中心にやっていたのがC言語、javaでした。正直言うと雰囲気だけで授業を乗り切っていた感はあります。
そして、R大に編入してからは周りを見渡してみると知らない言語がよく飛び交っていました。ここで、折角編入したのだから、自分の得意な言語が欲しい。そこで、お誘いをしてくれたのが[アナグラ君](http://anatofuz.hatenablog.com/)です。
~~perlを学ぶと彼女ができると教えてくれたので受講しました。~~
このときのperlについては何も知らなかったです。

###　perl入学式に参加して

perl入学式に参加して思ったのがperlってすごいって感じました。このとき、Cしか触ったことのなかった自分にはとても新鮮に感じました。とくに、第５回のperlのAcmeモジュールを使用して掲示板サイトを作るのが一番楽しかったです。また、perl入学式に参加して助かったことは参考書について教えてくれたことです。perl入学式も中盤になったところからperlの参考書どれ買ったらいいのか、と考えていたときに第五回に参考書の説明をしてくれました。こんな風にperl入学式を終わった後もperlの学習を後押ししてくれる情報はありがたかったです。

### 最後に…

perl入学式は第五回まで終わってしまたのでperlを自分の得意な言語として胸を張れるまで学習していきたいと思います。

今の目標としてはperlを使って最近はまっているtwitterに関連したものを作れたらいいと思っています。

もしかしたら、perlのスラックの方に質問しに行くこともあるかもしれないのでその時はよろしくお願いします。
シェルスクリプトの絶対パスを取得する方法の比較

シェルスクリプト内でスクリプト自身のファイルパスを絶対パスで取得するしたいことがあります。実現する方法はいくつかありますが、シンボリックリンクを解決するかどうかで違いがあります。

# スクリプトファイルを作成する

比較用に ```/tmp/hoge/a.sh``` というスクリプトファイルを作成します。

```bash:/tmp/hoge/a.sh
echo "$(readlink -f "$0")"

echo "$(realpath "$0")"

echo "$(cd "$(dirname "$0")" && echo "$(pwd)/$(basename "$0")")"
```

# シンボリックリンクを作成する

シンボリックリンクを含む場合も検証するため、以下のようにシンボリックリンクを作成します。

```
$ tree /tmp/
/tmp/
├── hoge
│   ├── a.sh
│   └── link-to-a.sh -> a.sh
├── link-to-hoge -> hoge/
:
```

# /tmp/hoge/a.sh を実行する

どの方法も同じ結果です。

```
$ cd /tmp/hoge/
$ bash a.sh
/tmp/hoge/a.sh
/tmp/hoge/a.sh
/tmp/hoge/a.sh
```

# /tmp/hoge/link-to-a.sh を実行する

最後の方法だけシンボリックリンクを解決しないパスを取得しています。

```bash
$ cd /tmp/hoge/
$ bash link-to-a.sh
/tmp/hoge/a.sh
/tmp/hoge/a.sh
/tmp/hoge/link-to-a.sh
```

# /tmp/link-to-hoge/a.sh を実行する

最後の方法だけシンボリックリンクを解決しないパスを取得しています。

```bash
$ cd /tmp/link-to-hoge/
$ bash a.sh
/tmp/hoge/a.sh
/tmp/hoge/a.sh
/tmp/link-to-hoge/a.sh
```

# /tmp/link-to-hoge/link-to-a.sh を実行する

最後の方法だけシンボリックリンクを解決しないパスを取得しています。

```bash
$ cd /tmp/link-to-hoge/
$ bash link-to-a.sh
/tmp/hoge/a.sh
/tmp/hoge/a.sh
/tmp/link-to-hoge/link-to-a.sh
```

# 結論

シェルスクリプト内でスクリプト自身のファイルパスを絶対パスを取得する場合、

 * シンボリックリンクを解決したパスが必要なら ```readlink``` か ```realpath``` を使う。
 * シンボリックリンクを解決しないパスが必要なら ```cd``` + ```pwd``` を使う。
自然言語処理用にYahooショッピングのレビューを大量に取得する

## はじめに
機械学習でテキスト分類や感情分析をしようと思って、オープンデータのコーパスを探したのですが、自分のやりたいことに合うものがなかったので、YahooショッピングのレビューからAPIでデータを取得することにしました。
コーパスとは、機械学習などの自然言語処理の素材データとして、文章やそれに対する付加情報を大量に集めたものです。  
コードはこちら。(Python)
https://github.com/nannoki/yahoo_reviews


## 取得できるデータ
1. 全部で100万レビューくらい取得できます。
1. 階層構造のカテゴリ分類。大分類(22種類)＞中分類(約330種類)＞小分類(約3,700種類)   
分類タスクの教師ラベルとして使えます。
1. 商品に対する評価点。1.00（悪い）から5.00（良い）   
感情分析の教師ラベルとして使えます。
1. 上記カテゴリと評価点以外にも分析しがいのある項目がありますが、かなり欠損も多いです。

**項目一覧**

|ヘッダカラム名|内容|
|:---|:---|
|Description|レビューの本文|
|ReviewTitle|レビューのタイトル文（例：購入しました！）|
|Rate|レビュー評価点 : 1.00（悪い）から5.00（良い）|
|Average|レビュー平均点|
|CountAll|レビュー数|
|Recommend|レビューを見て役立った人の数|
|ReviewType|レビューの種類 : buyer（購入者）/other（クチコミ）/all（全員）|
|Purpose|購入目的 : daily（購入者）/hobby（趣味用途）/gift（プレゼント）/business（仕事用）|
|SendTo|誰用に購入したか : self（自分用）/family（家族親戚用）/friend（友人へ）/lover（彼氏彼女へ）/business（取引先へ）|
|cat1_code|レベル1カテゴリid|
|cat2_code|レベル2カテゴリid|
|cat3_code|レベル3カテゴリid|
|cat1_title_short|レベル1カテゴリ名|
|cat2_title_short|レベル2カテゴリ名|
|cat3_title_short|レベル3カテゴリ名|
|cat3_title_long|親カテゴリを含むカテゴリ名|

詳細はリンク先のGithubを見てください。
文章を書いた人の年齢層、性別情報を取得するために、楽天レビューを収集するツールも作ったので、整理できたらそのうち公開します。
C#のオブジェクトの同値性をテストする

```csharp:UnitTest1.cs
using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace Sample.UnitTests
{
    [TestClass]
    public class UnitTest1
    {
        [TestMethod]
        public void TestMethod1()
        {
            Assert.AreEqual(new Dollar(5), new Dollar(5));
            // -> Success
        }
    }

    public class Dollar
    {
        private int amount;
        public Dollar(int amount)
        {
            this.amount = amount;
        }

        public override bool Equals(object obj)
        {
            return (obj is Dollar) && ((Dollar)obj).amount == amount;
        }
    }
}
```

参考
[オブジェクトの同一性を見分ける EqualityComparer](http://dora.bk.tsukuba.ac.jp/~takeuchi/?%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%2F%EF%BC%A3%EF%BC%83%2F%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%AE%E5%90%8C%E4%B8%80%E6%80%A7%E3%82%92%E8%A6%8B%E5%88%86%E3%81%91%E3%82%8B%20EqualityComparer)
[IEquatable と GetHashCode() はセットで実装](http://d.hatena.ne.jp/fyts/20071026/asp)
FizzBuzz（随時更新）

#問題
1～100までの整数において、**FizzBuzz**プログラムを実装してください。

#FizzBuzzって何
英語圏発祥の数値遊び。数字を1,2,3...の順で言っていくが。以下のルールを設ける。

・3の倍数は「Fizz」と言う
・5の倍数は「Buzz」と言う
・3,5の公倍数（＝15の倍数）は「FizzBuzz」と言う
・上のいずれも当てはまらなければ、その数をそのまま発言する

#書いたよ（Python）

```python:FizzBuzz.py
#Python3.5 (64bit)にて実装、動作。
for n in range( 1, 101 ):
     if n % 15 == 0:
             print('FizzBuzz')
     elif n % 3 == 0:
             print('Fizz')
     elif n % 5 == 0:
             print('Buzz')
     else:
             print(n)

```
```python:（出力）
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
...
```
#まとめ
反復とか条件分岐ですとか、基礎的な記述ができるかを確認しています。
もっと分かりやすい書き方とか、他の技法を見つけたら更新していきます。
学生向け勉強サイト、勉強会紹介サイト

#coursera
まずは結構有名になってきましたこのサービスを紹介します。"コーセラ（英名：Coursera）とは、スタンフォード大学コンピュータサイエンス教授Andrew NgとDaphne Kollerによって創立された教育技術の営利団体である。世界中の多くの大学と協力し、それらの大学のコースのいくつかを無償でオンライン上に提供している"
https://www.coursera.org/

特にこのサイトの"Machine Learning by Stanford University"は非常によくできた授業なのでまずはこちらから入られることをお勧めします。

#PyQ
https://pyq.jp/
がっつりpython を勉強したい方にお勧めのサイトです。環境構築が必要ないですし問題数が豊富なので短期間で密度が高い学習が可能です。

#paiza
https://paiza.jp/
もともとコードを書いて書類無しで就職活動を行うことを目的としたサイトですが、paizaラーニングといって一日3分で学習できるコンテンツがあります。ここを利用してランクを上げて就職活動を完了させましょう。

#侍エンジニア塾
https://www.sejuku.net/blog/
pythonのみならず様々な言語による学習プログラムがあるため自分の学びたい言語、得たいスキルを学べます。学習紹介のための記事も豊富なため情報収集にもたけていると思います。

#DataShip
http://www.data-ship.jp/
未経験からデータサイエンティストを養成するプログラムです。最近サービスが開始されたので認知度は低いと思いますがこのプログラムは文系など全く関係ない分野を学んでいる学生でも参加でき、インターンの提供もあるとのことなので、早いうちにぜひ参加を検討なさってください。

#Udacity
https://www.udacity.com/
英語での教材になってしまいますがプログラミングのみならずwebの知識全般が得られるので英語ともども勉強したい方におすすめです。特に社会人になると時間がなかなか取れないと思うため学生のうちから英語で勉強することに慣れておいたほうがいいと思います。

#edx
https://www.edx.org/
こちらも英語での学習サイトです。最近話題のブロックチェーンについての授業も開始されたのでこの辺りの知識を得たい方にもおすすめです。

#udemy 
https://www.udemy.com/
ベネッセが提供しているオンライン学習プラットフォームです。有料ですが定期的にセールを行い、セール中は学生でも比較的購入できるような値段でさまざまなスキルを学ぶことができます。

#connpass
https://connpass.com/
エンジニアの方なら常識だと思います。connpassは毎日ハッカソンや勉強会を紹介するサイトです。特に首都圏はほぼ毎日勉強会が行われています。プログラミングの勉強で重要なのはいいメンターを見つけることなので自分の学びたい言語のコミュニティに入ることは重要です。特に学生は参加費が無料であることが多いため利用しない手はないです。

#meetup
https://www.meetup.com/ja-JP/
meetupはプログラミングのみならず様々なイベント情報が掲載されています。海外に留学に行かれる方はこのサイトを利用して企業が開催する勉強会、最新情報が得られるカンファレンス等に参加されてみてはいかがでしょうか。
もしもアプリケーションエンジニアがネットワークエンジニアになったら

もしも、業務アプリケーションの開発に従事するエンジニアがネットワーク構築の業務を始めた場合、どうなるか書いてみます。
「もしも」のくだりで書いてますが実録です。ちなみに、もしドラもドラッカーも読んだことは有りません。


# 前提条件

##アプリケーションエンジニア（以下ＡＥ）の定義
業務用アプリケーションの開発を主な作業とする。

お金の話（見積りや決済、納品や検収）については立ち位置によって異なる為、除外します。
※社内SEと独立系ベンダーSEでは、お金の管理が異なる等、比較しても参考ならない為
保守の話も同様の理由で除外します。

ＡＥが業務遂行として行う一連の作業内容

- 要件定義
- 外部設計
- 詳細設計
- 実装／単体試験
- 結合試験
- 総合試験
- リリース（本番稼動）

## ネットワークエンジニア（以下ＮＥ）の定義
ネットワークケーブル（光／メタル）、ネットワーク機器(L3／L2スイッチ、ファイアフォール、DHCP、無線AP）の物理設計と論理設計、利用者がネットワークを使う状態にするためのconfig投入などを主な作業内容とする。

工事を伴うケーブルの敷設、電源の配線についてはエンジニアの範疇を外れると考えます。
※工事は工事業者に発注するスタンスです。

お金の話と保守の話は、アプリケーションエンジニアの定義の時と同様に除外します。

ＮＥが業務遂行として一連の作業内容

- 要件定義
- 物理設計
- 論理設計
- 物理的なネットワーク構築と試験 ※ここは外部発注
- 論理的なネットワーク構築と試験 
- 引き渡し

## 本題のＡＥがＮＥになった場合の知識の互換性について

注：ほとんど主観で書きます

- 目的の達成方法・・・互換性（小）
目的の達成方法については全く異なる手段を使います。
ＡＥはシステム化のスコープを定義し、開発手法やサービスを選定して実現可能性を示しますが、ＮＥはネットワークを利用する為の手段（主に物理的な手段）の提示になります。
例えば、有線LANを引いてケーブルを出す、無線のアクセスポイントを設置する、キャリア網を利用する等．．．共通する知識は無いに等しいと思います。
<br>

- プロジェクトマネージメント（仕事の進め方）・・・互換性（大）
作業の工程を理解すればWBSやガントチャートなど、同じ手法で管理することが出来ます。
ただし、資材の納入方法や各工程のリードタイムがアプリケーション開発と異なるため、そこを把握しておかないと案件をしくじります。
また、アプリケーション開発は残業して遅れを取り戻すことが出来ますが、ネットワークの機材購入は納期を縮められない事もあるのでリードタイムの把握は重要です。
<br>
 
- ソフトウェアスキル・・・互換性（極小）
ＡＥの知識はほとんど利用できません。
L3,L2 Switchのコマンドや設定についてはCisco（又はCisco互換）のＯＳを高頻度で利用します。
Cisco系のＯＳ(iOS)については開発言語やUnix系ＯＳのコマンドとは異なる為、新たに覚える必要があります。
私の場合、使える武器（コマンド）はpingだけになりました。
<br>

- ヒューマンスキル・・・互換性（大）
要件の抽出やコミュニケーションの手段（メール、会議体など）、合意形成については共通することが多いと思います。



# 総評
マネージメントする時のリードタイムの読み方と、技術面のスキルが違うぐらいで、プロジェクトが進む雰囲気にはついていける感じです。
※技術的なスキルアンマッチは業務遂行上、致命的な問題ですが．．．

# その他、気付いたこと
- フィジカルの要素が強い
良く歩きます。
ネットワークを提供する場所にもよりますが、ショッピングセンターや工場など広域にネットワークを導入する場合、配線経路やサーバーラックの置き場所、情報コンセントや無線アクセスポイントの配置場所を歩き回って確認します。
脚立を持って歩き回る事もありますし、テスト（＝ネットワークの接続検証）はケーブルを敷設した場所まで行くので、良く移動します。
「怪我をする」というリスクが出てきます。
<br>

- 残業して出来ることが少ない
物理設計や論理設計等、自分で行う作業は有りますが、成果物の量がアプリケーション開発より圧倒的に少ないと思います。
残業して成果物を作るという事は少なく、残業が多い（＝忙しい）という場合は案件を掛け持ちで進めているケースになると思います。
（追記）ラボテストは結構時間がかかる作業です。
<br>

- スキルとして共通することはほとんど無い、でも０からのスタートでは無い
ＡＥもＮＥもパソコンを利用して作業する事が多く、全く関係性の無い技術ではないため、素人より早く慣れることが出来ます。
某RPGで例えると、僧侶から魔法使いに転職してLvが１になり魔法（スキル）を覚えなおすことになってもHPとMP（基礎能力）は半分は残るので、戦闘（仕事）で即死することは無く、キャッチアップの早いと思います。
<br>

- L2 SwitchととHUBの違いを知ることが出来る
どちらもOSI参照モデルの第２層の制御と考えていましたが、L2 Switchの方が多機能で値段も段違いです。
Ciscoが提唱する3階層モデルのアクセススイッチに位置するのがL2 Switchになります。
<br>

- 「壊れる」というリスクヘッジをしなくてはいけない
アプリケーションでもハード（サーバー）が壊れるリスクと対処（冗長化等）が必要ですが、ＮＥは故障による通信の切断に対し、より多くの予防策や対処策を持っている必要があると思います。
雨漏りする、通行者に持ち去られる等、今まで想定したことのないリスクを考える必要があります。
<br>

- PCのスペックが作業効率に影響しなくなるが、ディスプレイの広さが作業効率に影響する。
PCが高負荷になる作業はあまり無いと思います。図面や構成図を俯瞰して見る場面が増えるため、ディスプレイの大きさが作業効率に影響してくると思います。


# 結局どれだけ時間があればＡＥはＮＥとしてやっていけるか。

- マネージメント（案件遂行）はしっかり修行して１年間
- スキル習得はしっかり修行して１年間
- マネージメントとスキル習得を、同時進行で覚えるのはハード
- アプリケーションが出来ないから、ネットワークに手を出すのは成功しない

以上です
Python で ERC20 Token を送金してみる

web3.js を Python で使えるようにした [web3.py](https://github.com/pipermerriam/web3.py) というのがあったので使ってみた。

```send_token.py
from web3 import Web3, HTTPProvider
import json

def load_abi(self, file_path):
    artifact = open(file_path, 'r')
    json_dict = json.load(artifact)
    abi = json_dict['abi']
    return abi

file_path = 'Token.json'
contract_address = ''
from_address = '0x...'
from_address_password = ''
to_address = '0x...'
amount = 10

web3 = Web3(HTTPProvider('http://localhost:8545'))
abi = load_abi(file_path)
Token = web3.eth.contract(abi=abi, address=contract_address)

# Get balance of Token
balance = Token.call().balanceOf(from_address)
print('balance:', balance)

# Send Token
if web3.personal.unlockAccount(from_address, from_address_password, duration=hex(300)): # 300秒後にロック
    print('Account unlocked')
    tx_hash = Token.transact({'from': from_address}).transfer(to_address, amount)
    print('tx_hash:', tx_hash)
    print('Transaction complete!')
else:
    print('Failed to unlock account.')
```

web3.js と地味に書き方が違うところがあるけど、ほぼそのまま Python で使える感じですな。感謝。
setを使って乱数作ってみた

#set型とは…
set型とは、集合を扱うための型で、listと同じように複数の値を入れれる型です。
listとの違いは

・要素が1個ずつしか入れられない(重複しない)
・要素に順番がつかない

などがある。

#早速本題へ
まず、0~9のリストを作る。

```py3
>>>l=[str(x) for x in range(0,10)]
#l=['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
```
次にsetにする。

```py3
>>>set(l)
{'7', '8', '5', '0', '4', '1', '6', '9', '2', '3'}
```

これで0~9がぐちゃぐちゃになったヤツができた。

#が、しかし

```py3
>>> set(l)
{'7', '8', '5', '0', '4', '1', '6', '9', '2', '3'}
>>> set(l)
{'7', '8', '5', '0', '4', '1', '6', '9', '2', '3'}
>>> set(l)
{'7', '8', '5', '0', '4', '1', '6', '9', '2', '3'}
>>> set(l)
{'7', '8', '5', '0', '4', '1', '6', '9', '2', '3'}
```
あれ？これ、まさか…何度やっても一緒になるのか…？？？

シェル上では何回やっても変わらないようなので、テキストファイルを作って読み取ってみることにした。

```py3
>>> l_text="\n".join(l)
>>> with open("a.txt","w") as w:
...     w.writelines(l_text)
```
これで`a.txt`を作って、

```py3:list2set.py
with open("a.txt") as f:
    lines=f.readlines()
lines=[str(i).replace("\n","") for i in lines]
X=set(lines)
print(X)
```
結果は

```
$ python list2set.py
{'5', '7', '3', '6', '1', '8', '4', '0', '9', '2'}
$ python list2set.py
{'9', '0', '3', '4', '7', '6', '8', '2', '1', '5'}
$ python list2set.py
{'2', '6', '0', '5', '4', '9', '8', '7', '3', '1'}
```

おっ、なんかそれっぽいやん！
でも確認のため`for`で回すと

```py3:list2set.py
for i in range(0,20):
    with open("a.txt") as f:
        lines=f.readlines()
    lines=[str(i).replace("\n","") for i in lines]
    X=set(lines)
    print(X)
```
```
$ python list2set.py
{'3', '2', '6', '5', '1', '8', '9', '0', '7', '4'}
{'3', '2', '6', '5', '1', '8', '9', '0', '7', '4'}
{'3', '2', '6', '5', '1', '8', '9', '0', '7', '4'}
{'3', '2', '6', '5', '1', '8', '9', '0', '7', '4'}
{'3', '2', '6', '5', '1', '8', '9', '0', '7', '4'}
{'3', '2', '6', '5', '1', '8', '9', '0', '7', '4'}
{'3', '2', '6', '5', '1', '8', '9', '0', '7', '4'}
{'3', '2', '6', '5', '1', '8', '9', '0', '7', '4'}
{'3', '2', '6', '5', '1', '8', '9', '0', '7', '4'}
{'3', '2', '6', '5', '1', '8', '9', '0', '7', '4'}
{'3', '2', '6', '5', '1', '8', '9', '0', '7', '4'}
{'3', '2', '6', '5', '1', '8', '9', '0', '7', '4'}
{'3', '2', '6', '5', '1', '8', '9', '0', '7', '4'}
{'3', '2', '6', '5', '1', '8', '9', '0', '7', '4'}
{'3', '2', '6', '5', '1', '8', '9', '0', '7', '4'}
{'3', '2', '6', '5', '1', '8', '9', '0', '7', '4'}
{'3', '2', '6', '5', '1', '8', '9', '0', '7', '4'}
{'3', '2', '6', '5', '1', '8', '9', '0', '7', '4'}
{'3', '2', '6', '5', '1', '8', '9', '0', '7', '4'}
{'3', '2', '6', '5', '1', '8', '9', '0', '7', '4'}
```
と、同じになった。(左端顔みたい)
時間とかメモリの状態とかが関係してんのかなー、知らんけど


#結果
乱数ジェネレーターっぽいものができた。
疑問はいくつか残るけど眠いのでまた今度調べます(( _ _ ))..zzzZZ
Ubuntu 16.04 iptables設定（基礎知識） 

#はじめに
iptablesの初期設定メモです。
(他の目的で作っていたのですが、断念したので記事再利用)

##事前準備

###インターフェースの確認

まずはインターフェースの確認
```ip link show
```
続けてIPアドレスの状態確認
```ifconfig
```
もし差異があれば、以下を実行してIPアドレス設定。
今回はubuntu16.04を使っているので、以下。

```
cd /etc/network/
sudo vi interfaces
```
staticでIPを追加する場合は、以下を追記

```
auto ens4
iface ens4 inet static
address 192.168.100.1
network 192.168.100.0
netmask 255.255.255.224
broadcast 192.168.100.31
gateway 192.168.100.1
```
再起動後、PINGで通信確認

参考記事：
[Linuxで固定IP設定（設定ファイル・コマンド）](https://qiita.com/routerman/items/4d19b3084fa58723830c)

##iptables設定

###「iptables」設定ファイル作成

ip tablesの設定をまとめた「iptables」を作成する
記載内容は以下。

```
# clear iptables and NAT tables

iptables -F
iptables -t nat -F

# Internet to LAN  -> DROP
# LAN to Internet  -> ACCEPT

iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

# icmp and lo -> ACCEPT

iptables -A INPUT -p icmp -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT

# DNS and http/https for github

iptables -A INPUT -p tcp --sport 53 -j ACCEPT
iptables -A INPUT -p udp --sport 53 -j ACCEPT
iptables -A INPUT -p tcp --sport 80 -j ACCEPT
iptables -A INPUT -p tcp --sport 443 -j ACCEPT
```
###設定反映

bashを使って設定を反映。
```sudo bash iptables
```
出力が長いので、logsファイルを作成してmoreで確認。

```
# sudo iptables -L -n > logs
# more logs
Chain INPUT (policy DROP)
target     prot opt source               destination
ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:53
ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0            udp dpt:53
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:80
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:443

Chain FORWARD (policy DROP)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
```

###サーバ再起動時のiptables反映

ubuntuさんはiptablesの内容が再起動時に保存されない。
以下の作業が必要。

設定の保存
```# sudo iptables-save | sudo tee /etc/iptables.rules
```
iptables復元用スクリプト作成

```
# cd /etc/network/if-pre-up.d/
# sudo vi iptables_start
```
スクリプトの内容はこんな感じ

```
#!/bin/sh
/sbin/iptables-restore < /etc/iptables.rules
exit 0
```
最後に実行権限を付与

```
# sudo chmod a+x /etc/network/if-pre-up.d/iptables_start
```

再起動して動作確認。
インターネット側からSSHでアクセスできなくなったことを確認するのが手っ取り早い。

動作確認が終わったら、コンソール/LAN からSSHの利用ポートを再設定すること。
Ruby Rails PG connection with Clound9

#Cloud9上でPostgresqlにローカル環境で接続する方法
通常RailsではSQLliteを使っているが、Herokuにアップするときは本番環境はPostgresqlをしようしているために、Heroku公式ページでも開発環境でも同じく、Postgresqlを推奨している。今回は、どうやって設定するのかをまとめようと思います。
##まずは、Postgresqlを起動させましょう。
Linux系の場合のコードを書いておきましょう。
```コマンドプロント
sudo -u postgresql
```
おそらくこれが回答になると思います。
[Rails Ubuntu14,04](https://www.digitalocean.com/community/tutorials/how-to-use-postgresql-with-your-ruby-on-rails-application-on-ubuntu-14-04)
[How to set up Ruby on Rails with Postgresql](https://www.digitalocean.com/community/tutorials/how-to-setup-ruby-on-rails-with-postgres)
[Postgresql on Cloud9](https://community.c9.io/t/setting-up-postgresql/1573)
Android Studio　古いバージョンをダウンロードする


<font color="DeepPink">Android Studio　古いバージョンをダウンロードする</font>

https://developer.android.com/studio/archive.html


1.日本語で表示すると、表示が崩れている
<img width="968" alt="スクリーンショット 2019-05-02 17.42.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93155/074826f6-fb6a-cf12-4356-f657445dbc40.png">


2.ご利用規約の時に、言語を「英語」にすると、表示が崩れない。
<img width="1006" alt="スクリーンショット 2019-05-02 17.43.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93155/b2f1e7f6-e335-9ce4-8198-e62e75b51cef.png">

Android Studio 古いバージョンが全て表示される
<img width="1019" alt="スクリーンショット 2019-05-02 17.44.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93155/1a7f3b19-ad48-b95a-f302-e15817f14f6b.png">

<br>
<br>

[![googleStoreLink.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93155/0687ddf4-3146-65bd-7ca5-45b6f70fb153.png)](https://play.google.com/store/apps/details?id=com.non.CherryCocktailGrass)


<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">⭐️Androidアプリ⭐️リリース<br>🍒CherryCocktailGlass🍒<br>Blenderで絵を描いてUnityで作成したミニゲームリリースしました😍<br>🍷カクテル🍷グラス🍷に<br>🍒チェリー🍒をのせるシンプルなゲームです。<br>✨（●＾o＾●）✨<br>【Android】<br>Google Play 無料Free<a href="https://t.co/I70R9QEDuq">https://t.co/I70R9QEDuq</a><a href="https://twitter.com/hashtag/CherryCocktailGlass?src=hash&amp;ref_src=twsrc%5Etfw">#CherryCocktailGlass</a> <a href="https://t.co/g8kCM9QVhL">pic.twitter.com/g8kCM9QVhL</a></p>&mdash; non (@nonnonkapibara) <a href="https://twitter.com/nonnonkapibara/status/1121818121323433984?ref_src=twsrc%5Etfw">April 26, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
Cloud9によるRuby on Rails環境の構築

# IDE
IDEとは、統合開発環境のことであり、ソフトウェアの開発の工程をひとつのソフトにまとめたものである。
今回使用するIDEはCloud9と呼ばれるもので、ブラウザ上でコードの編集や実行ができる。詳しい使い方は以下を参照していただきたい。
Cloud9：https://c9.io
Cloud9参考：https://www.sejuku.net/blog/385#Cloud9

# Rubyのインストール
ターミナルに以下のコマンドを実行するとインストール可能なrubyのバージョンを確認できる。
`$ rvm list known`

実行すると`[ruby-]2.0.0[-p648]`などの記述があると思うので、インストールしたいバージョンを確認してインストールを以下のコマンドで行う。
`$ rvm install 2.0.0-p999`

`$ rvm list`でインストールされているか確認できる。

# gemset
Railsのインストールをする前にgemsetについて少し触れておく。
複数のシステム開発をしていくと別々の環境が必要になることがあるらしい。
gemsetを使用すると開発環境の変更が容易にできる。
`$ rvm gemset create hoge`
hogeの部分は任意の名前。これでgemsetが作成される。確認するには`rvm gemset list`
作成したgemsetを使用するには
`$ rvm gemset use hoge`
で使用可能。また、作成と同時にすぐに使用するには以下のコマンドでできる。
`$ rvm use --create 2.0.0-p999@hoge --default`
`2.0.0-p999`の部分は使用するrubyのバージョンを明記する。

gemset参考：http://hrst.hatenablog.jp/entry/20110616/1308229846

# Railsのインストール
`$ rvm gemset install rails -v 4.0.5`
これで完了。

# まとめ
- rvm list knownでインストール可能なバージョンを確認。
- Rubyは`$ rvm install 2.0.0-p999`Railsは`$ rvm gemset install rails -v 4.0.5`
- `$ rvm list`でインストールされているか確認可能。

ローカル環境での構築はこれよりも面倒みたいだ。簡単に構築可能なCloud9をお勧めする。
Raspberry Pi から Mirakurun のストリームを再生


まずは Raspberry Pi の MPEG-2 Video Decoder のライセンスキーを購入してアクティベートしておく。

http://www.raspberrypi.com/mpeg-2-license-key/

## Rivarun 経由

```
$ npm install -g rivarun
```

```
$ rivarun --b25 --mirakurun 192.168.0.1:40772 --ch GR/14 - - | omxplayer --no-keys pipe:0
```

## 直接再生

どう見てもこっちのほうが簡単

```
$ omxplayer http://192.168.0.1:40772/api/channels/GR/14/stream
```

## BS/CS の場合

あらかじめサービス ID とかは `curl http://192.168.0.1:40772/api/channels/ | jq .` で調べておく。

```
$ omxplayer http://192.168.0.1:40772/api/channels/BS/BS9_0/services/400211/stream
```
Chatwork Webhookと無料で扱えるGASを使ってBotを作ってみる。

こちらにも同じ内容の記事を書きました。
https://www.pnkts.net/2020/04/26/chatwork-webhook-gas-bot


3日前の11月1日に、とうとうチャットワークでWebhookが使えるようになりました！
http://blog-ja.chatwork.com/2017/11/api-openbeta.html
ということで、サーバ費用が全くかからないGoogle Apps Script(GAS)を使ってChatwork Webhookを試してみました。

GASは、無料で簡単にウェブページの作成や、APIサーバの作成をすることができるので、個人的によく使っています。

チャットワークのAPI管理画面はこちらからアクセスすることができます
https://www.chatwork.com/service/packages/chatwork/subpackages/webhook/list.php
![APIドキュメント Webhook](https://qiita-image-store.s3.amazonaws.com/0/76916/10bf2565-1f09-f507-399d-dd4f92e42d9c.png)

# サーバの用意（GAS側にスクリプトを入力）

はじめにGASで新しいプロジェクトを作成する
※Googleドライブを開いて、新しく作成すればいい。今回は詳しくはこの記事では書かない。

今回作成したプログラムはオウム返しをするだけの簡単なボットです。

```js
var spreadsheetId = '***********';
var chatworkToken = '***********';
var myAccountId = '***********'

function doPost(e) {
  try {
    var json = JSON.parse(e.postData.contents);
    SpreadsheetApp.openById(spreadsheetId).getSheetByName('log').getRange(1, 1).setValue(json.toSource());
    
    var accountId = json.webhook_event.account_id;
    if (accountId == myAccountId) {
      return;
    }
    
    var message = json.webhook_event.body;
    var roomId = json.webhook_event.room_id;
    postChatwork(roomId, message);
    
  } catch(ex) {
    SpreadsheetApp.openById(spreadsheetId).getSheetByName('log').getRange(1, 1).setValue('error');
  }
}

function postChatwork (roomId, message) {
  var payload = {
    "body" : message
  };

  var headers = {
    "X-ChatWorkToken": chatworkToken
  };

  var options = {
    "method" : "post",
    "payload" : payload,
    "headers" : headers
  };

  return UrlFetchApp.fetch("https://api.chatwork.com/v2/rooms/" + roomId + "/messages", options);
}
```

このスクリプトで`***********`となっているところが3箇所あるので、そちらは人によって異なるので修正する必要がある。

**spreadsheetId**
こちらはログを出力する用にスプレッドシートを使っている。そのスプレッドシートのidをここに入力する。
logというシートを指定して出力しているため、空のスプレッドシートのプロジェクトを作成して、`log`というシートを作成する必要がある。

**chatworkToken**
オウム返しをするときの投稿するときに必要になる。
使っているチャットワークアカウントのトークンをここに入力する。

**myAccountId**
自分自身のチャットワークアカウントのidをここに入力する。
オウム返しで投稿した内容もwebhookで飛んできてしまって、オウム返しのオウム返しを投稿して無限ループになってしまうのを防ぐため。
確認の仕方は、自分宛てのToの`[To:*****]`の*****にあたるものになる。


# サーバの公開(GASの公開設定)

プログラムが完成したら、外部から叩ける用に公開する必要がある。
GASの上のメニューの「公開」→「ウェブアプリケーションとして導入...」を選択

以下の項目は間違えやすいので気をつけましょう。

| 項目 | 内容 |
|:-:|:-:|
| 次のユーザとしてアプリケーションを実行 | 自分(****@gmail.com)  |
| アプリケーションにアクセスできるユーザ  | 全員（匿名ユーザーを含む）  |

これで、公開をする。
公開が完了すると、URLが表示されるので、それをコピーする
>https://script.google.com/macros/s/******************/exec

# チャットワークのWebhookの設定

チャットワークの管理画面にログインする
↓おそらくこちらのURLでいけるはず
https://www.chatwork.com/service/packages/chatwork/subpackages/webhook/list.php

Webhookのタブを選択して、新規作成ボタンをクリックする。

| 項目 | 内容 |
|:-:|:-:|
| Webhook名 | わかりやすいように名前をつけてあげる。なんでも大丈夫 |
| Webhook URL  | GASの公開したときに表示されたURLをここに入力する  |
|イベント|今回は`ルームイベント`を選択してみる。|
|メッセージ作成|ルームイベントを選択すると表示される項目。チェックを入れておく|
|メッセージ更新|ルームイベントを選択すると表示される項目。チェックを入れておく|
|ルームID|ルームイベントを選択すると表示される項目。Botの部屋のURLの`https://www.chatwork.com/#!rid*****`の`*****`の部分|

これで作成ボタンを押してあげる。

# さいごに
これで完成なので、テキトーに入力して欲しい。
エラーにならなければオウム返しをしてくれるはずです。
スプレッドシートにもログがちゃんと吐かれるはずです。

これで、無料でチャットワークのWebhookが簡単に扱うことができました！
Unity 回転周りについて

#はじめに
この記事ではUnity（C＃）における回転系ついてです。



##インスペクター上の角度を取得するにはどうしたらいいの？？
<img width="276" alt="スクリーンショット 2017-11-04 0.42.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/184790/5e4e2d63-d1b3-6456-ffc0-d39f577b7d14.png">

ここのRotation部分の値を取得する時にはどうしたらいいのか。。
普段コードを書いている人、だったり勘がいい人は
```
Vector3 _Rotation = gameObject.transform.rotaion;
```
と思うかもしれませんがrotaionでの返り値はQuaternionであるためVector3には代入できません。
オイラー角（３０度とか）を取得したいけどどうするか。。

```
Vector3 _Rotation = gameObject.transform.localEulerAngles;
```
でうまくいきます。

##補足＆まとめ
Unity ではオブジェクトの回転量を表す値にQuaternion（四元数）を使っています。
Quaternionの各要素の値は、私たちが慣れ親しんでいる角度（オイラー角）ではないので気をつけてください。Unity インスペクター上での回転量はオイラー角が使われていますが、内部では四元数が用いられています。


QuaternionからEulerへの変換する方法
<img width="273" alt="スクリーンショット 2017-11-04 1.26.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/184790/b99269c9-5efa-40c0-74e3-840e0437c781.png">

```
void Start () {
		Quaternion quaternion = this.transform.rotation;
		Debug.Log (quaternion);
		float x = quaternion.eulerAngles.x;
		float y = quaternion.eulerAngles.y;
		float z = quaternion.eulerAngles.z;
		Debug.Log (x);
		Debug.Log (y);
		Debug.Log (z);
	}
```
eulerAngles プロパティを通すことでオイラー角を取得することが可能です。↓
<img width="432" alt="スクリーンショット 2017-11-04 1.27.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/184790/678a5cde-d4af-54e5-8d9d-941245dbee44.png">

Unity内部では四次元数を使って計算が行われているのでいちいちオイラー角に直してから計算すると負担がかかってくるので、出来れば四次元数を使いこなせるといいかもしれませんね。

#追記：手取り早く回転させたい場合
この記事を読んでくださってる方はきっと回転させたいけどどうしたらいいの？って方も多いかと思います。とりあえず難しいことは置いておいて回転させたいって方は下のコードで回転を実装をすることができます。回転には色々と方法がありますが、使いやすいものを紹介します。

###Rotateメソッドを使う
これはオイラー角を引数と取ります。
<img width="383" alt="スクリーンショット 2017-12-23 23.32.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/184790/f2d6c17d-c4cb-c6ba-4dbc-594626f90fbc.png">


###rotationに代入する
こちらはクウォータ二オンをオイラー角に変換してから代入しています。
ちょっと一手間？？
<img width="426" alt="スクリーンショット 2017-12-03 21.59.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/184790/26688a0c-c3a2-fbbe-9697-e41cdfd54858.png">

# 参考
https://www.f-sp.com/entry/2017/08/30/171353
vue.jsでpropsとしてコンポーネントを渡す

## 前置き
Vue.jsでコンポーネントをpropsとして渡せたら便利だなと思い調べてましたが、特に解説が見当たらなかったのでメモがてら書き残しておきます。

Vue.js のバージョンは2.5.2です。

## サンプル
:point_right: **[ここ](http://runstant.com/pentamania/projects/8d0c1f86)** :point_left:
selectタグで好きなコンポーネントを選んでマウントすることができます。

## 手順
まずpropsとして渡されるサブコンポーネントを定義・登録します。

```js
var subComp = Vue.extend({
  template: `<div class="sub">サブコンポーネントだよ</div>`,
});
Vue.component('sub-component', subComp); // 'sub-component'という名前で登録
```
特に変わったことはしてません。

次にpropsを受け取り、サブコンポーネントを描画するメインコンポーネントを定義します。

```js
var mainComp = Vue.extend({
  template: `<div class="main">
    <h1 class='topic'>メイン</h1>
    <div :is="contentComponent"></div>
  </div>`,
  props: {
    'contentComponent': String,
  },
});
Vue.component('main-component', mainComp);
```

ポイントはis属性のところです。
propsプロパティのcontentComponentは、サブコンポーネント（の名前）を受け取り、is属性値にセットされます。こうすることでdivはサブコンポーネントに置き換わります。

最後にHTMLとrootインスタンス部分です。
コンポーネント名を指定します。

```html
<div id="app">
  <main-component
    content-component="sub-component"
  ></main-component>
</div>
```

```js
new Vue({
  el: "#app",
})

```

マウント後、

```html
<div id="app">
  <div class="main">
    <h1 class='topic'>メイン</h1>
    <div class="sub">サブコンポーネントだよ</div>
  </div>`
</div>

```
こんな感じになってればOK。（[コード](https://goo.gl/hooYpt)）

## 参考
[https://forum.vuejs.org/t/how-to-pass-a-component-as-prop/11216](https://forum.vuejs.org/t/how-to-pass-a-component-as-prop/11216)
tmuxをインストールしてもbind-keyが動かない問題(Mac)

##Macにtmuxをインストール
`brew install tmux`

###しかし、bind-keyが機能しない...
色々調べてみると、reattach-to-user-namespaceをインストールしろとのこと
reattach-to-user-namespaceは、tmuxとMacクリップボード共有を使うときにも使用する
参考記事:[tmuxとMacのクリップボードを共有する（copy-mode, vim）](https://qiita.com/upinetree/items/cd80bc7865c52091be10 "タイトル")

##reattach-to-user-namespaceをインストール
`brew install reattach-to-user-namespace`

これでbind-keyが使えるようになりました。
メモ：文字列同士を上から重ねたいとき。

タイトルはテキトーにつけてます。
自分専用(かもしれない)競プロノウハウメモ

```{example1}
###..##....#............
+
..####...#######...##.##
↓
#######..#######...##.##

```
ってことをしたいとき実装パターンはどのようなことがある？

#標準入力
```{input.txt}
5 5
#....
##...
###..
....#
##...
```

#Pythonでの実装

```{example.py}
import numpy as np
s=input().split(" ")
x=int(s[0])
y=int(s[1])
shlist=[]
for i in range(x):
    shlist.extend(list(input()))
#この時点ですべての情報をInputした

sharray=np.array(shlist).reshape(x,y)
"""
sharray=
[['#','.','.','.','.'],
 ['#','#','.','.','.'],
...
 ['#','#','.','.','.']]
"""

#行列同士の足し算をnumpyでできる&True+False=Trueを利用

boolarray=sharray=='#' #booltype化
"""
boolarray=
[[True,False,False,False,False],
 [True,True,False,False,False],
...
 [True,True,False,False,False]]
"""
answer=np.sum(boolarray,axis=0)
"""
answer=
[True,True,True,False,True]
"""
#あとは表示だけ
for c in answer:
    if c:
        print('#',end='')
    else:
        print('.',end='')
    

 
```

#標準出力
```{a.out}
###.#
```

#ちなみに
```{example_2.py}
import numpy as np
s=input().split(" ")
x=int(s[0])
y=int(s[1])
sl=[]
for i in range(x):
    sl.extend(list(input()))
#この時点ですべての情報をInputした

a=np.sum(np.array(sl).reshape(x,y)=='#',axis=0)

#あとは表示だけ
for c in a:
    if c:
        print('#',end='')
    else:
        print('.',end='')
```
縮めると結構短くなる
C++でも作りたいので、それはまた明日にでも・・・(- _ - )...zzz

#参考にさせて頂きました

>http://y0m0r.hateblo.jp/entry/20130601/1370077334
>list(str)　で1文字ずつのリストに分割可能
Visual Studio Team Service で dotnet test の結果を表示する

VSTS で既定のまま Build プロセスを実行すると、テスト結果が表示されず。

dotnet test の引数に `--logger trx;logfilename=<FileName>.xml` を指定して実行して、Publish Test Results で発行することで結果が表示されるようになった。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/168283/c1a2df93-0316-3d2f-f412-48dfbc0f999c.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/168283/6caf109f-6537-7fce-bf52-69182baebffa.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/168283/e693a0ef-70da-d6da-ca6d-c72a5973d3ce.png)
【Rails】link_toをボタンにする。

`link_to`をボタンで表示。
ボタンの文字以外の空白部分も押せるようにする。

```html+erb
<%= link_to "戻る", hoge_path, class: 'btn btn-default' %>
```

`link_to`に`class`で`btn`をつけてリンクをボタン化。
こうすることで、ボタン内のどこを押しても動作するようになる。
<br>
<br>
ちなみにアイコンとか使う時はこんな風に書いてみたり。。。

```html+erb
<%= link_to  hoge_path, class: 'btn btn-default' do 
 %>
  <i class="fa fa-arrow-left"></i>
  <span>戻る</span>
<% end %>
```
Xcode 9でのexportOptions.plist

CIサービス(TravisCI)上でXcode9でビルドする場合、Xcode8の時より多くの設定をplistに設定しないといけないようです。

下記の様なShellで通りました。

```shell-session:generate_exportoptions_plist.sh 
TEAM_ID=$1
BUNDLE_ID=$2
PROFILE_NAME=$3
METHOD=$4
CER=$5

cat > "$(PWD)/script/exportOptions.plist" <<EOF
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
   <dict>
      <key>method</key>
      <string>${METHOD}</string>
      <key>teamID</key>
	  <string>${TEAM_ID}</string>
      <key>uploadBitcode</key>
      <false />
      <key>uploadSymbols</key>
      <true />
	  <key>provisioningProfiles</key>
      <dict>
        <key>${BUNDLE_ID}</key>
        <string>${PROFILE_NAME}</string>
      </dict>
	  <key>signingCertificate</key>
	  <string>${CER}</string>
      <key>signingStyle</key>
      <string>manual</string>
      <key>stripSwiftSymbols</key>
      <true/>
      <key>thinning</key>
      <string>&lt;none&gt;</string>
   </dict>
</plist>
```
| 引数 | シェル内変数 | 設定内容 |
|:-----------------|:------------------|:------------------|
| 第一引数 | TEAM ID | Xcode上で設定したチームID |
| 第二引数 | BUNDLE ID | Xcode上で設定したBundle ID |
| 第三引数 | PROFILE NAME | https://developer.apple.com で設定したProfile名（下記参照） |
| 第四引数 | METHOD | development, app-store, ad-hoc, enterpriseといった適切なものを設定 |
| 第五引数 | CER | "iPhone Distribution"という文字列 |


![profile名.jpg](https://qiita-image-store.s3.amazonaws.com/0/103647/157d9bd8-420b-0c33-f7a3-79942dcfc813.jpeg)
【Rails】Bootstrap 4 でラジオボタンの見た目をトグルボタンにする

# やりたかったこと
- ラジオボタンの見た目をかっこよくしたい（ザックリ）
- inputのtype属性はradioのままで実現したい
- CSSの編集は最低限にとどめたい

![bootstrap_radiobutton1.png](https://qiita-image-store.s3.amazonaws.com/0/141934/4006e2f5-178b-56b7-cdb6-1babba30a28b.png)

# やったこと
- Bootstrap 4の`Button plugin`を適用

![bootstrap_radiobutton2.png](https://qiita-image-store.s3.amazonaws.com/0/141934/ecd5a728-7d4d-174f-7645-98f7d4bfc66d.png)

# 詳細

## Bootstrap 4の導入

RailsにBootstrap 4を導入する手順については下記の投稿で解説してます。

[Railsアプリで Bootstrap 4 を利用する \- Qiita](https://qiita.com/NaokiIshimura/items/c8db09daefff5c11dadf)

## Button pluginの適用

Bootstrap 4の公式ドキュメントにチェックボックスやラジオボタンの見た目をボタンにするサンプルが掲載されていたので、こちらを参考に実装しました。

[Button plugin / Checkbox and radio buttons](https://getbootstrap.com/docs/4.0/components/buttons/#button-plugin)

## Before

![bootstrap_radiobutton3.png](https://qiita-image-store.s3.amazonaws.com/0/141934/09903c30-6183-b4d0-b5d2-551b0462d37e.png)

```html+erb:formのラジオボタン部分を抜粋
<div class="form-group row">
  <div class="col-sm-2">
    <%= f.label :sex, '性別', {class: 'form-label'} %>
  </div>
  <div class="col-sm-10">
    <%= f.radio_button :sex, 0, {checked: true} %> 男性
    <%= f.radio_button :sex, 1, {} %> 女性
  </div>
</div>
```

## After

![bootstrap_radiobutton4.png](https://qiita-image-store.s3.amazonaws.com/0/141934/7e218aed-64f7-7b94-7483-b6d3f6d774dc.png)


```html+erb:formのラジオボタン部分を抜粋
<div class="form-group row">
  <div class="col-sm-2">
    <%= f.label :sex, '性別', {class: 'form-label'} %>
  </div>
  <div class="col-sm-10 btn-group" data-toggle="buttons">
    <label class="btn btn-outline-secondary active" style="width:50%">
      <%= f.radio_button :sex, 0, {checked: true} %> 男性
    </label>
    <label class="btn btn-outline-secondary" style="width:50%">
      <%= f.radio_button :sex, 1, {} %> 女性
    </label>
  </div>
</div>
```
Javascript：半角混じり文章を全て全角にするスクリプト（習作）2

連想配列使ったほうが幾分マシかな？メンテナンス性はこっちのほうが良さそう.

```javascript:半角⇒全角変換習作2
function CnvHtoF(str){
  CnvArray = {"ｱ":"ア","ｲ":"イ","ｳ":"ウ","ｴ":"エ","ｵ":"オ",
              "ｶ":"カ","ｷ":"キ","ｸ":"ク","ｹ":"ケ","ｺ":"コ",
              "ｻ":"サ","ｼ":"シ","ｽ":"ス","ｾ":"セ","ｿ":"ソ",
              "ﾀ":"タ","ﾁ":"チ","ﾂ":"ツ","ﾃ":"テ","ﾄ":"ト",
              "ﾅ":"ナ","ﾆ":"ニ","ﾇ":"ヌ","ﾈ":"ネ","ﾉ":"ノ",
              "ﾊ":"ハ","ﾋ":"ヒ","ﾌ":"フ","ﾍ":"ヘ","ﾎ":"ホ",
              "ﾏ":"マ","ﾐ":"ミ","ﾑ":"ム","ﾒ":"メ","ﾓ":"モ",
              "ﾔ":"ヤ","ﾕ":"ユ","ﾖ":"ヨ",
              "ﾗ":"ラ","ﾘ":"リ","ﾙ":"ル","ﾚ":"レ","ﾛ":"ロ",
              "ﾜ":"ワ","ｦ":"ヲ","ﾝ":"ン",

              "ｳﾞ":"ヴ",
              "ｶﾞ":"ガ","ｷﾞ":"ギ","ｸﾞ":"グ","ｹﾞ":"ゲ","ｺﾞ":"ゴ",
              "ｻﾞ":"ザ","ｼﾞ":"ジ","ｽﾞ":"ズ","ｾﾞ":"ゼ","ｿﾞ":"ゾ",
              "ﾀﾞ":"ダ","ﾁﾞ":"ヂ","ﾂﾞ":"ヅ","ﾃﾞ":"デ","ﾄﾞ":"ド",
              "ﾊﾞ":"バ","ﾋﾞ":"ビ","ﾌﾞ":"ブ","ﾍﾞ":"ベ","ﾎﾞ":"ボ",

              "ﾊﾟ":"パ","ﾋﾟ":"ピ","ﾌﾟ":"プ","ﾍﾟ":"ペ","ﾎﾟ":"ポ",

              "ｧ":"ァ","ｨ":"ィ","ｩ":"ゥ","ｪ":"ェ","ｫ":"ォ",
              "ｯ":"ッ","ｬ":"ャ","ｭ":"ュ","ｮ":"ョ","ｰ":"ー",

              "ﾞ":"゛","ﾟ":"゜","｡":"。","､":"、","｢":"「","｣":"」"};

  strarray=[];
    CnvStr="";

    for(i=0; i<str.length; i++){
        if(str.substr(i,1)=="ﾞ"||str.substr(i,1)=="ﾟ"){
            strarray.pop();
            strarray.push(str.substr(i-1,2));
            continue
        }

        strarray.push(str.substr(i,1));
    }

    for(i=0; i<strarray.length; i++){
        if(/[ -~]/.test(strarray[i])){
            CnvStr = CnvStr + String.fromCharCode(strarray[i].charCodeAt(0)+0xFEE0);
        }else if(CnvArray[strarray[i]]!==undefined){
            CnvStr = CnvStr + CnvArray[strarray[i]];
        }else{
            CnvStr = CnvStr + strarray[i];
        }
    }

    return CnvStr;
}

//test Code
alert(CnvHtoF("１２３あｂｃアＢＣ,123ｱbcABC!\"\'@#$%^&*()-_=+\\|~`{}[]:;<>,.?\/"));
```
HEICファイルをJPGファイルに変換する

mac osの場合、画像変換コマンド`sips`を使えばいい。

```shell 
$ sips --setProperty format jpeg input.heic --out output.jpg
```

▼参考
- [HEIC から JPEG へ変換する備忘録](https://goo.gl/Ys3jPq)
自宅PCとIDCフロンティアとをVPN接続してsambaでファイル共有

# 概略

自宅のWindowsマシンをIDCフロンティアとVPN接続してsambaでファイル共有をしたい．
主にHugoのコンテンツ編集なんかを想定していて，テキストだけならssh接続+vimあたりで良いものの画像のアップロードなどをscpでやるのはちょっと面倒くさい．
また，同時に自宅PCでweb閲覧などを継続したい．

# 前提

- IDCフロンティア上にwebサーバは既に構築済とする
- webサーバは何でもいいが，とりあえずdebianとする
- 自宅PCはWindows10とする
- 自宅PCはNAT配下でも良いがproxyは通さずwww疎通するものとする

# 手順

1. IDCフロンティアのVPN有効化
    1. グローバルIPのVPNを有効化する
    1. ユーザ名とパスワードを追加する
    1. プリシェアードキーをコピーする<br>
<img src="https://qiita-image-store.s3.amazonaws.com/0/210798/2490eb8f-3485-f910-57c7-08d9a626ea98.jpeg" width="50%">
1. Windows10のVPN設定
    1. スタートメニュー→設定→ネットワークとインターネット→VPN→VPN接続を追加する
    1. 次の項目を埋める
        1. Windows（ビルトイン）
        1. 事前共有キーを使ったL2TP/IPSec
        1. 上でコピーしたプリシェアードキーをペースト
        1. 上で設定したユーザ名・パスワードを設定
        1. 保存<br><img src="https://qiita-image-store.s3.amazonaws.com/0/210798/b8b44841-501e-7567-04a9-ab608d2856f4.jpeg" width="50%">
    1. アダプターのオプションを変更する→上で追加したVPN接続を右クリック→プロパティ
        1. セキュリティ→暗号化が必要
        1. セキュリティ→次のプロトコルを許可する→Microsoft CHAPをチェックオン
        1. OK<br>![adpt_conf.jpg](https://qiita-image-store.s3.amazonaws.com/0/210798/40a706ad-9fb3-b418-a9b6-50766f3ca0fb.jpeg)
        1. ネットワーク→IPv4→プロパティ<br>
![NWconf.jpg](https://qiita-image-store.s3.amazonaws.com/0/210798/8d9d1b93-1d58-503e-bf47-f04e45fb87f3.jpeg)
        1. 詳細設定<br>![ipv4_conf.jpg](https://qiita-image-store.s3.amazonaws.com/0/210798/e6ecc1b1-094b-0b62-2119-b8c539803b2f.jpeg)
        1. リモートネットワークでデフォルトゲートウェイを使う，をチェックオフ<br>![ipv4_advanced.jpg](https://qiita-image-store.s3.amazonaws.com/0/210798/bb825a9b-9ddf-1d45-bc8c-3dfe4a27e3aa.jpeg)
    1. VPN接続することで，インターネット疎通を生かしたまま，IDCF内のプライベートアドレスでVPNへの通信が疎通するようになる
1. サーバにsambaを導入
    1. sambaインストール

        ```sh
        sudo apt-get install samba
        ```

    1. 設定変更．
       最低限のhomesのread onlyの変更のみ．他にprinterはいらんだろ，とかは好きにコメントアウトしたりはご自由に．

        ```diff
        --- smb.conf
        +++ smb.conf.orig
        @@ -190,7 +190,7 @@
        
         # By default, the home directories are exported read-only. Change the
         # next parameter to 'no' if you want to be able to write to them.
        -   read only = no
        +   read only = yes
        
         # File creation mask is set to 0700 for security reasons. If you want to
         # create files with group=rw permissions, set next parameter to 0775.
        ```

    1. samba再起動．なぜかsystemctlやserviceではうまくいかんかったので，古い方法で．
       ``sudo /etc/init.d/samba restart``
1. 接続
   Windows10側でVPN内のプライベートIPを指定してアクセスすればホームディレクトリが表示されるはず．
Macにrpy2をインストール


# rpy2をインストールしようとして失敗した

> pip install rpy2

上記実行時、下記エラーが出た。

>Collecting rpy2
  Downloading rpy2-2.9.0.tar.gz (193kB)
    100% |████████████████████████████████| 194kB 1.8MB/s 
    Complete output from command python setup.py egg_info:
    Error: Tried to guess R's HOME but no command 'R' in the PATH.
>    ----------------------------------------
>Command "python setup.py egg_info" failed with error code 1 in /private/var/folders/4p/8fbl0kss1k95g1jc8jy5_wlm0000gn/T/pip-build-mivm9li3/rpy2/

どうにも、Rが入っていないことが問題らしい。

# Rをmacにインストールする。

> brew install r

結構時間かかってる。。

# rpy2をインストールする。

> pip install rpy2

無事インストールできた。


 # 参考元
http://data-hacker.blogspot.jp/2014/02/pythonrrpy2.html
http://blog.amedama.jp/entry/2016/10/12/211749
nvidia-dockerにchainercvをインストールして動作確認するまで

# chainercvとは

[PFN様](https://www.preferred-networks.jp/ja/)がCV関係の有名な画像認識・検出ネットワーク構造をまとめてくださったありがたいPythonライブラリです。
matplotlib関係のパッケージとOpenCVがpythonで動く環境であれば、以下のコマンドでスルッと入ると思います。

```bash
$ sudo pip install chainercv
```

ですが、どんな環境でも学習用のプログラムが動くようにしたかったので、Docker（nvidia-docker）を使ってまとめることにしました。chainerは、公式で[nvidia-dockerのイメージ](https://hub.docker.com/r/chainer/chainer/)があるのですが、それを入れても私の環境ではtrainerがフリーズしたため、1から環境を作成しています(たぶん、CUDAのDockerイメージのバージョンが悪かったみたい)。


###実行環境

+ OS : Ubuntu 16.04 LTS
+ GPU: GeForce GTX 980 Ti (6GB)
+ docker : Docker version 17.09.0-ce
+ nvidia-docker : 1.0.1-1

以下は、私が行った作業手順です。

# nvidia-docker

Dockerとnvidia-dockerの入れかたは公式を参照してください。

[Docker install](https://docs.docker.com/engine/installation/#supported-platforms)
[nvidia-docker](https://github.com/NVIDIA/nvidia-docker)

# nvidia/cuda image

CUDAがインストール済みのDockerが公開されているので、nvidia-dockerでRUNします。
[nvidia/cuda docker hub](https://hub.docker.com/r/nvidia/cuda/)

```bash
$ nvidia-docker run -it nvidia/cuda:7.5-cudnn5-devel
```

作成したイメージを更新して、作業スペースを作成しておきます。

```bash
$ apt-get update && apt-get upgrade
$ mkdir /workspace
$ cd workspace
```

# python2.7

初期のイメージにはpythonが入っていないため、インストールします。
ついでに、`numpy,pip,python-tk`を一緒に入れておきましょう。

```bash
$ apt-get install python-dev python-numpy python-pip python-tk
```
インストール確認

```bash
$ python -V
Python 2.7.6
```

# opencv3.2

次に、OpenCVをインストールします。現時点で最新は3.3.1ですが、自分が使ったことないので、バージョンを下げています。
ほとんどの手順は公式の通りですが、3.2.0を[公式サイト](https://opencv.org/)からダウンロードしてきました。

```bash
$ apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
$ apt-get install libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev

```

念の為に、ビルドする際に、 `BUILD_opencv_python2`をONにしました。 

```bash
$ apt-get install unzip wget
$ wget https://github.com/opencv/opencv/archive/3.2.0.zip
$ unzip 3.2.0.zip 
$ cd opencv-3.2.0
$ mkdir build
$ cd build
$ cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local -D BUILD_opencv_python2=ON -D WITH_TBB=ON ..
```

インストール確認

```bash
$ python
> import cv2
> exit()
```

# pip install

あとは、pipで順にインストールします。
指定しているバージョンは、私が動作確認した際のバージョンです。

```bash
$ pip install matplotlib==2.1.0
$ pip install cupy==2.0.0
$ pip install chainer==3.0.0
$ pip install chainercv==0.7.0
```

# 動作確認

※動作確認なのでバッチサイズは適当です。

```bash
$ cd /workspace
$ wget https://github.com/chainer/chainercv/archive/v0.7.0.zip
$ unzip v0.7.0.zip
$ cd chainercv-0.7.0/examples/ssd
$ python train.py --model ssd512 --batchsize 4 --gpu 0 --out /workspace/result_chainercv
```

上記で、Pascal VOCの学習が始まれば、大丈夫です。
なお。Pascal VOCのデータセットが `~/.chainer` に自動的に保存されるので、
dockerの容量が大きくなります。docker imageが大きくなるのが嫌な方は、注意してください。
リファクタか、リライトか。それをどう判断するのか。 (レガシーソフトウェア改善ガイド)

リファクタか、リライト(作り直し)か。

この大きなテーマについてこの本で言及されています。

<a target="_blank" href="https://www.amazon.co.jp/gp/product/4798145149/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4798145149&linkCode=as2&tag=majackyy-22&linkId=0007cc7ae7cce37d7791983561000d3f">レガシーソフトウェア改善ガイド (Object Oriented Selection)</a><img src="//ir-jp.amazon-adsystem.com/e/ir?t=majackyy-22&l=am2&o=9&a=4798145149" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />

### リファクタか、リライトかの結論

結論からいうと

***「リライトしたい欲求と戦い、どうにかリファクタで解決できないか考えるべし。最善を尽くしてどうしても駄目であればリライトを検討しても良い」***

ということでした。

### リライトのリスク

>最初に明らかにしておくが、完全な書き直しは、ほとんど常によくないアイデアだと私は信じている。けれど「あなたも信じなさい」と言うのではない。できれば納得していただきたい。以下に、リライトに対する詳しい反論を書く。

から始まる"リライトへの反論"が以下の通りです。(だいぶ要約してあります)

#### リスク
大規模な開発プロジェクトで、何ヶ月、あるいは何年もかかることにより、以下のようなリスクを抱える

* 潜在的な数え切れないバグがあるかもしれない
* 計画より長い時間がかかり、予算を超過するかもしれない
* 新しいアーキテクチャが現プロダクションレベルを満たすかがわからず、途中で不可能であることが判明するかもしれない

#### オーバーヘッド
新規プロダクトのセットアップには非常に多くの実装が必要になり、技術者はそのオーバーヘッドを過小に見積もりがち。

#### リライト時の現行プロダクトへの対応策が難しい
以下の3つどれも現実的ではない。

* 元のソフトウェアの開発を、リライト期間は凍結する
* 仕様変更を許し、リライト期間常に追いつくようにする
* 仕様変更は許すが、リライトはどの変更も実装しない

#### 「まっさらな新天地」は長く続かない
リライトでは以下のような自体が起こりがち

1. 新鮮で素晴らしい設計でスタート
1. 実装してみたらモデルの不備に気づき、ヘルパーコードを追加
1. 古いコードにあった不必要だと思ったコードが使われていることが判明し、サポート機能を実装する
1. DBの中で、存在するはずのないデータに遭遇し、不必要なはずのチェックを実装する
1. この時点で、新しいコードと置き換えようとしているコードが驚くほど似ていることに気づく


### リライトの条件
これに対して、リライトをして良い条件で以下のものが挙げられています。

#### リファクタリングを試みたが失敗した
 一旦リファクタリングにある程度の時間と労力を注ぎ込んでから検討するべき

#### パラダイムシフト
テクノロジーの根本的な変化があった時。<br>
最も一般的な変化は、言語の変更。COBOLからJavaへの移植のように。

### 第3の道
また、リライトをする際にも以下のものを検討するべきだと書かれています。

#### 第3の道として、インクリメンタルな書き直し
全てのリライトはコストもリスクも大きすぎるので、リライトの単位を分割する。

機能を分割してそれぞれをコンポーネントとして分割して書き直すアプローチを試みる。詳細は本の5章「リアーキテクティング」に記載あり。

### 感想
自分のプロジェクト経験をかんがみた際に、心当たりがあることが非常に多く振り返っていろいろ考えるきっかけになりました。。

***「リライトしなくてもリファクタでこれだけやれることがある」***というのは心強いメッセージですね。この本にはその詳細も書いてあるので、そちらも参考にしたいと思います。
やってみようSCons: はじめに

# やってみようSCons: はじめに

SConsはPythonで実装されたmakeのようなビルドツールです。

## SCons公式

http://scons.org/

- [ユーザーガイド](http://scons.org/doc/production/HTML/scons-user.html)<br>
  使いそうな機能の紹介。これを読めば何となく使えるようになります。
- [マニュアル](http://scons.org/doc/production/HTML/scons-man.html)<br>
  コマンドラインオプションやツールの説明と関数リファレンス
- [APIリファレンス](http://scons.org/doc/HTML/scons-api/)

## セットアップ手順

#### 1. Python3.6.xをインストール

[python.org](https://www.python.org/downloads/) からインストーラをダウンロードしてインストール

#### 2. SConsをインストール

```bat
> python -m pip install --egg scons
DEPRECATION: --egg has been deprecated and will be removed in the future. This flag is mutually exclusive with large parts of pip, and actually using it invalidates pip's ability to manage the installation process.
Collecting scons
Installing collected packages: scons
Successfully installed scons-3.0.0
```

なんか `--egg` が廃止警告が出ていますが2017年11月現在、これを指定しないとエラーが出てインストールできないようです。[^1]

[^1]: [stackoverflowの関連する投稿](https://stackoverflow.com/questions/14296531/what-does-error-option-single-version-externally-managed-not-recognized-ind)

#### 3. PATHを通す

※Windows限定です。

環境変数PATHにPythonのインストールディレクトリにあるScriptsを追加します。Pythonのインストールパスは↓で調べられます。

````bat
> python -c "import sys; print(sys.executable)"
C:\Users\xxx\AppData\Local\Programs\Python\Python36\python.exe
```

Python3.6はLocalAppDataへインストールされるので、通常は `%LOCALAPPDATA%\Programs\Python\Python36\Scripts` になります。

```bat
> scons -v
SCons by Steven Knight et al.:
        script: v3.0.0.rel_3.0.0:4395:8972f6a2f699[MODIFIED], 2017/09/18 13:28:16, by bdbaddog on ubuntu-16
        engine: v3.0.0.rel_3.0.0:4395:8972f6a2f699[MODIFIED], 2017/09/18 13:28:16, by bdbaddog on ubuntu-16
        engine path: ['u:\\bee\\lib\\site-packages\\scons-3.0.0\\SCons']
Copyright (c) 2001 - 2017 The SCons Foundation
```

バージョンが表示されればインストールは成功です。