OmniAICreator/Qiita-1.07M huggingface dataset:
[Unity]StandaloneWindowsでIL2CPPを使うために必要だったモノ

# [Unity]StandaloneWindowsでIL2CPPを使うために必要だったモノ

## 環境類
 - Windows10(64bit)
 - Unity 2018.1.0f2
   - Player Settings
     - Scripting Runtime Version:.NET 4.x Equivalent
     - Scripting Backend:IL2CPP
     - Api Compatibility Level:.NET 4.x
   - Build Settings
     - Platform:PC, Mac & Linux Standalone
     - Target Platform:Windows
     - Architecture:x86_64
 - Visual Studio 2017 community

## 準備せずに起きる事
 - 以下のようなログと共にビルドが失敗する。

```
il2cpp.exe didn't catch exception: System.InvalidOperationException: C++ code builder is unable to build C++ code. In order to build C++ code for Windows Desktop, you must have one of these installed:
        Visual Studio 2010 with C++ compilers and Windows 7 SDK (it cannot build C++ code because it is not installed)
        Visual Studio 2010 installation is found by looking at "SOFTWARE\Microsoft\VisualStudio\10.0_Config\InstallDir" in the registry
        Windows 7 SDK is found by looking at "SOFTWARE\Wow6432Node\Microsoft\Microsoft SDKs\Windows\v7.0A\InstallationFolder" in the registry

        Visual Studio 2013 with C++ compilers and Windows 8.1 SDK (it cannot build C++ code because it is not installed)
        Visual Studio 2013 installation is found by looking at "SOFTWARE\Microsoft\VisualStudio\12.0_Config\InstallDir" in the registry
        Windows 8.1 SDK is found by looking at "SOFTWARE\Wow6432Node\Microsoft\Microsoft SDKs\Windows\v8.1\InstallationFolder" in the registry

        Visual Studio 2015 with C++ compilers and Windows 10 SDK (it cannot build C++ code because Windows SDK is not installed)
        Visual Studio 2015 installation is found by looking at "SOFTWARE\Microsoft\VisualStudio\14.0_Config\InstallDir" in the registry
        Windows 10 SDK is found by looking at "SOFTWARE\Wow6432Node\Microsoft\Microsoft SDKs\Windows\v10.0\InstallationFolder" in the registry

        Visual Studio 2017 with C++ compilers and Windows 10 SDK (it cannot build C++ code because it is not installed)
        Visual Studio 2017 installation is found using Microsoft.VisualStudio.Setup.Configuration COM APIs
        Windows 10 SDK is found by looking at "SOFTWARE\Wow6432Node\Microsoft\Microsoft SDKs\Windows\v10.0\InstallationFolder" in the registry
```

## 対応
 - AndroidのIL2CPPでもNDKが必要だったようにWindows用のツールなどを追加する。
 - Visual Studio 2017 の メニューから ファイル/新規作成/プロジェクト 開いたダイアログからインストーラを開ける。
![VSInstaller.gif](https://qiita-image-store.s3.amazonaws.com/0/103037/fe695a69-64b1-6308-5628-8821438d0bfb.gif)
 - 関連ツールの追加を行う。（「C++によるデスクトップ開発」を追加すれば済む想定。ビルドするだけならオプションはおそらくもっと減らせると思います。)
![Workload.gif](https://qiita-image-store.s3.amazonaws.com/0/103037/44a80238-4f44-bc4c-60e7-d26810cd78aa.gif)

これでひとまずビルドは通りました。
やはり高速化とか見込めるんでしょうかね？いろいろ触ってみようと思います。
python pandas 統計 cross 集計とカイ二乗検定

1, scipyの出力の２番目がp値
chi2, p, dof, ex = stats.chi2_contingency(crossed)

2, クロス集計表を作る。
N(%)の形式のテーブルを作るのが目的だったが、これが大変。
DataFrameとDataFrameは足算するとブロードキャストできる。しかし、足す時に"("などの文字列を挿入することができない。（私にはできない）

NumpyのArrayも足算は基本的にブロードキャスト（たぶん）。しかし、同様に文字列挿入ができない。

こねくり回して、結局以下のようにデータフレームのセル（1マス？）要素に一つずつアクセスして、str()で文字列に変換して、合体。しんどい。
いいやり方見つけたら、修正する。

以下のcrはpandas はcross table(dataframe形式）

```py
def cross_table(df,colname1,colname2):
    cr = pd.crosstab(df[colname1],df[colname2])
    #%計算
    arr = np.array([
        [cr["FALSE"][0] / (cr["FALSE"][0]+cr["FALSE"][1]),cr["TRUE"][0] / (cr["TRUE"][0]+cr["TRUE"][1])],
        [cr["FALSE"][1] / (cr["FALSE"][0]+cr["FALSE"][1]),cr["TRUE"][1] / (cr["TRUE"][0]+cr["TRUE"][1])]
        ])
    arr = arr * 100 #%に
    arr = arr.round(2) #四捨五入
    #%のテーブルと合体
    new_cross_table = np.array([
            [cr.iloc[0, 0],str(cr.at[0,"FALSE"]) + "("+ str(arr[0][0]) + ")", str(cr.at[0,"TRUE"])+"("+ str(arr[0][1]) + ")"],
            [cr.iloc[1, 0],str(cr.at[1,"FALSE"]) + "("+ str(arr[1][0]) + ")", str(cr.at[1,"TRUE"])+"("+ str(arr[1][1]) + ")"]
            ])
    #形式をデータフレームにもどす
    df_cr = pd.DataFrame(new_cross_table,columns=["Defect","FALSE","TRUE"])
    df_cr.index.name = colname1
    df_cr.columns.name = colname2
    return cr,arr,df_cr
```

参考リンク
http://lagrange.univ-lyon1.fr/docs/scipy/0.17.1/generated/scipy.stats.chi2_contingency.html

http://web-analytics-or-die.org/2013/07/pandas/
Print Server Mini2

以前ハードオフで入手したPlanexのEthernet Print Srver Mini2というモジュールを調べてみました。

2000年前後の製品のようです。分解して基板に実装されている部品を確認してみました。

N80C188XL Intel CPU
UT621024 UTRON 128K X 8 BIT LOW POWER CMOS SRAM
M29F002 ST 2 Mbit 256Kb x8 / Boot Block Single Supply Flash Memory
RTL8019AS Realtek Full-Duplex Ethernet 
GAL16V8D x 2 GAL
74HCT273 LOGIC
74HCT373 LOGIC
20F001N YCL 10 Base T Filter with Common Choke 
PQ05RD11 sharp 1A Output, General Purpose Low Power-loss Voltage Regulators

電源は6V 800mAのようです。

Ethernet 10Mのプリンターサーバです。Planexのサイトにはマニュアルがあります。

この製品は台湾のZero One Technology社製で、この会社からスピンオフしたZonetでもプリントサーバを作っているようです。

PLCC32なFlashを剥がして中身を見てみようかとおもったのですが、マニュアルにTCPでのアクセスも可能と書いてあったので、まずは剥がさずに確認してみる事にしました。

通常この手のモジュールはRESETスイッチが付いていて、電源投入時にスイッチが押されてると工場出荷時の設定に戻すとかの機能がありますが、このモジュールにはスイッチがありません。これだと設定後にIPアドレスが不明になりアクセス不能になったときにどうするのでしょうか？

このモジュールは設定されたIPアドレスとは別に192.72.214.103という固定のアドレスが設定されています。ただしarpには応えないのでarpを設定してからでないとアクセスできません。このIPでtftpして設定のファイル(config.txt)を読み出して、修正して書き込むと新しいIPアドレスに設定できます。

```
% tftp 192.72.214.103
tftp> ascii
tftp> get config.txt
Received 316 bytes during 0.1 seconds in 1 blocks
tftp> quit
```

初期化ができないプリントサーバもあるので、このモジュールはお勧めです。

以下で設定されたIPアドレスでアクセスの確認ができます。rootで処理が必要です。

```
# echo -e "\004queue" | nc -w 2 -p 722 10.0.1.200 515
lp1 is available ! 
```

入っていたfirmwareはver3.21と設定ファイルにあったのですが、Planexのサイトにはver3.11のfirmwareしかありません。またHTTPの設定ができるのですが、その事もマニュアルにはありません。

テスターで確認したら220mAくらいの電流を食っていました。古いモジュールなので、結構大きいです。

lprな機能があるようなので、なにか用途考えてみたいと思います。
.bashrcと.bash_profileのどちらが先に読み込まれる？の罠


夜中にしょーーーーーもない罠にハマってしまったので、メモしておく。:tired_face:

## 環境
OS : Amazon Linux AMI release 2017.09
bash : GNU bash, version 4.2.46(2)-release (x86_64-redhat-linux-gnu)

## .bashrcやら.bash_profileやらの実行順序

正解はここらへんに。先人の記事を引用
http://oxynotes.com/?p=5418
https://qiita.com/yunzeroin/items/480a3a677f78a57ac52f

この記事のために端的に説明すると、.bash_profileが先、.bashrcがあと。

## 引っかかった罠
.bash_profileが先で、どうやらexportするPATHとかはこっちに書いておくのがいいっぽい？
とはいえ、ログイン時も対話実行時もどちらも結局ユーザの~/.bashrcが読み込まれるんだから、こちらに集約したほうがいいような気もするけど、ここらへんの正解はよくわかってない。
http://neos21.hatenablog.com/entry/2017/02/12/142817
https://qiita.com/magicant/items/d3bb7ea1192e63fba850

上記のような記事をみて、あー、環境変数は.bash_profileに書いたほうがいいのかなーと思い、これまで.bashrcに定義していた環境変数を.bash_profileに移植してみる。すると。

## 現れた問題

```bash
-bash: pyenv: command not found
-bash: pyenv: command not found
```
シェルログイン時に実行してるpyenvがcommand not foundに。
実行しているコマンドは、.bashrcに記載されたコレ

```bash:.bashrc
# pyenv
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
```

で、シェルログイン後に改めてpyenvをたたくと、ちゃんとpyenvは認識されている。

```bash
$ pyenv --version
pyenv 1.2.3
```

あれー？パスも通ってるし、.bash_profileが先ならなんで.bashrcのpyenvが動かないんだー？ってことで、よくわからなくなってしまい調査。

## 調査
.bashrcと.bash_profileの **末尾** に以下のechoを埋めてみる。


```bash:.bash_profile  
#test
echo "bash_profile"
```

```bash:.bashrc
#test
echo "bashrc"
```

実行順序通りに標準出力にechoされるハズ。すると。

```bash
-bash: pyenv: command not found
-bash: pyenv: command not found
bashrc
bash_profile
```
!!!
bashrcのほうが先に読み込まれてる？？あれーそういうもん？


　　
　　
　　
## 答え

.bash_profileの **先頭** にこんな文字列がありましたとさ。

```bash:.bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi

# User specific environment and startup programs
~
~
```

!!! 
.bash_profileの先頭で.bashrc読み込んでるやん！！そのあとにパス通してる部分あるんだから、そりゃそうでしょ！！！というお粗末な結論でした。


## ちなみに
.bash_profileが実行されたあとに.bashrcが実行される、というのは、.bash_profileが.bashrcを呼んでいるから、みたい。 .bash_profileに記載された  

```bash:.bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi
```

をコメントアウトしたら、そもそも.bashrcは読み込まれなくなった。
bashコマンドでbashを再度呼ぶと読み込まれる。


## 結び
というわけで、なにが正解なのかはよくわかってないのですが、以下のように運用しようと思いました。

* 環境変数は.bash_profileに書く
* 環境変数以外のシェル変数や関数、aliasなどは.bashrcに書く
* .bashrcの読み込みは、.bash_profileの最後で実行する


詳しい人、正解を教えてください。:weary:
Fedoraをバージョンアップすると日本語切り替えが死ぬ

Fedora27にするときにこの現象が起きて、案の定Fedora28にしても同じ現象が起こる(´・ω:;.:...
Fedora25からFedora26にしたときも起こってた気がしますね……

問題は、
/usr/share/ibus/component/mozc.xml
が上書きされて、ibus-mozc使用時にキーボードレイアウトが英語にされることにあるようで。

なので、このファイルの&lt;layout&gt;の中の default を jp に書き換えてやれば治るっぽいです。
日本であまり読まれないUML批判記事

オブジェクト指向言語の研究者らが記事[UML: The Positive Spin](https://archive.eiffel.com/doc/manuals/technology/bmarticles/uml/page.html)にて、「UMLはソフトウェア開発には何も役に立たない」と批判しています。以下、直訳では無く私の理解の混じった完全な意訳にてメモとして残します。

###<b>UMLの利点</b>
***
大学のGPAや会社での成績を助けることによる自尊心の向上, Rational(現IBM)の利益向上
補足：ソフトウェア開発に関しては誰にとっても全く利点は無い

###<b>UMLはコンピュータが実行不可能という事実</b>
***
プログラミング言語はどんなに酷いものでも共通してコンピュータが実行可能で、それがApplicationとして動作したりHardwareを制御したりします。しかしUMLはどんなに詳細に書いてもコンピュータは実行できません。

###<b>膨大で曖昧、謎めいた記法</b>
***
UMLでは三角形やひし形、実線、点線・・・といった記法が用いられます。UMLはこれらのシンボル同士の関係性を示すモデリングとしか見ることが出来ません。設計図から製品を作れる回路図とCADと同じレベルで、プログラミングの設計図にUMLを使うならば、その「記法概要欄」はぎっしり詰まった60ページ、70ページという膨大な量を費やすことになります。結果、UMLを書く間にコーディングを終えることができます。

###<b>オブジェクト指向と考え方が真逆</b>
***
例えばflight, seat, personという3つのパラメータがあったとします。UMLでは、これらを一つ一つシンボルとして関係性をモデリングします。対照的にオブジェクト指向ではこれらのパラメータは一つのクラスに属します。考え方が異なるにも関わらず、UMLはオブジェクト指向を意味しオブジェクト指向はUMLだという認識は、オブジェクト指向有識者からするとオブジェクト指向の技術革新を10年遅らせています。

###<b>正確性の欠如</b>
***
[Ariane 5の爆破事故](http://www-users.math.umn.edu/~arnold/disasters/ariane.html)は、Ariane 4の適切なアサーションの無いコードを再利用し、再利用部分で前回ちゃんと動いた機能についてはテストされなかったことが原因と一つとして発生しました。オブジェクト指向では「機能」のオブジェクトのタイプに集中して全ての操作に対してこれらのタイプを定義するのに対し、UMLでは「ユースケース(システムがどういった動作をしないといけないか)」という根本ではなく表面的な性質に着目してしまうため、結果そこに正確性を保障することはできていません。

###<b>変更にも再利用にも対処できない</b>
***
プログラムは堅牢で変更も再利用も容易でなければなりません。しかし、UMLにこれらを助ける何かはあるでしょうか。例えばコードの再利用について、インタフェースの規約の標準化、オプションとオペランドの分離、コマンドとクエリの分離などの、「再利用の課題に対処する何か」がオブジェクト指向の一貫性やモジュール性のように存在するようには思えません。

###<b>最後に</b>
***
以上、直訳では無く、私の理解の混じった完全な意訳による要約でした。
UMLを描くのには時間がかかります。時間がかかる分、それだけの付加価値があることを説明できないといけないと思います。大学で教えられたから、会社で皆やっているから・・という理由で記法概要が足りず良く分からない多くのUML図を書き残してきた自分にとっては良い記事でした。

###参考：国別で異なるモデリング手法の利用率と考え方
[経済産業省 組込みソフトウェア産業実態調査報告書](http://www.meti.go.jp/policy/mono_info_service/joho/downloadfiles/2010software_research/10kaigai_houkokusyo.pdf)(P26参照)では、米国でほとんどUMLを使用していないという結果になっています。実際に私は米国の大学で学びながら米国の会社でプログラムを書いていますが日本に比べて圧倒的にUMLを使いません。シーケンスもフローチャートも、状態遷移図もほとんど描かずにコードを書きます。

2019/05/07
上記、"経済産業省 組込みソフトウェア産業実態調査報告書" のリンク先が削除されている件について、当時公開されていたページのキャプチャを掲載しました。
![keisansyo-2010.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242768/d455ec36-32f8-753b-3d49-44fea7e9006d.png)
pythonからR 統計 t-testとstudent TとWelch

python から Rのt.testを利用。
r("t.test(data_t[,i],data_f[,i])")

var.equal=TRUE で Student T
var.equal=FALSE で Welch

以下はRのttestについて。
http://www.obihiro.ac.jp/~masuday/resources/stat/r_t-test01.html
MVCモデルについて

#MVCモデルに関するまとめ

##はじめに
自分の知識を記事にしてまとめたことがなかったので簡単に文字に起こしてみました。
間違いがありましたらご指摘お願いいたします。

##この記事の目的
1.MVCモデルとは何かを理解する
2.MVCモデルの利点がわかるようになる

##そもそもMVCモデルって何？
**プログラミング手法のアプローチの一つ。**
MVCとは**Model・View・Controller**の略で、**処理を３つの役割に分割**して実装する手法です。
各処理の説明を以下に記載します。

###Controller
Controllerは、**ModelとViewの仲介役**を担っています。Viewから受け取ったデータをModelに渡して、Modelによって処理されたデータをViewに渡す役割をしています。つまり、処理を制御しているのが、このControllerの役割になります。
Controllerのクラス構造はURLに直結するものです。
Controllerクラスとそのメソッドの組み合わせでURLが形成されると考えてください。
そして**リクエスト情報を直接処理するのがコントローラー**です。

###Model 
Modelは、システムの中で**ビジネスロジック、データアクセス**を担当しています。つまりシステムの本体部分にあたります。
具体的な機能としては、アプリケーションデータや関数、データベースへのアクセス、データ管理などの機能を担当します。

###View
Viewは、**レイアウト**の部分です。UIを表示するためのコンポーネントであり、データ入力フォームやグラフといったデザインやレイアウトに関わる部分を担当しています。
つまりは、HTMLの生成を担っています。

ModelやControllerによって作り出されたデータをもとにHTML生成を行います。
したがって、**Viewにはビジネスロジックを記載しませんし、逆に、Model,ControllerにもHTML生成ロジックを記載しません。**


##MVCモデルの利点って何？
大きく分けて2つあります。


**1.
　Model(ビジネスロジック部分)、View(レイアウト＆デザイン部分)、Controller(入力に対する制御部分)と役割分担することで、アプリケーション開発も効率的に分業することが出来る。
2.
　Model、View、Controller の役割分担によりプログラムの独立性が高くなり、仕様変更に対して影響を受けにくく、柔軟な対処が可能となる。**



1.に関しては、自分の得意分野に対してアプローチが可能であるということを指していて、簡単な例を挙げるとデザイナーがViewを担当している間に、プログラマーがModelを担当するといった分業ができるようになるというメリットがあります。

2.は一つ一つの機能が独立性を保つことで、Viewを大きく変更した場合にも、Modelではビジネスロジックのみを実装しているため影響を受けませんし、またその逆も言えます。
さらに、他の場所やアプリケーションで機能の再利用が可能であるし、エラーが発生した場合にはどこでエラーが発生したのかを容易に発見できるので保守性が高まるというメリットがあります。

##MVCモデルの基本的な処理フロー
上述した通り、MVCモデルでは機能をModel,View,Controllerに３分割していて、ユーザーの入力をControllerが受け取り、入力に沿ってModelに処理をさせ、処理されたデータをViewが表示するという流れになります。

それを図解すると以下のようになると思います。
<img width="572" alt="Screen Shot 2018-05-05 at 3.23.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/255007/57aa6788-d2d8-21d9-a2b6-4460068fcc6b.png">

_図　MVCモデルでのユーザーからの入力に対する処理のフロー_

示した通り、
Modelがデータの処理をおこない、Viewがユーザーに表示、ControllerがViewとModelの制御を行います。

##さいごに
この記事は以上になります。
記事を書くにあたり、MVCモデルについてもう一度調べたことで、自分の中にあったふわっとした理解をすこしは固めることができたかなと思います。
間違っている点や理解が不十分な点等，ご指摘いただければ幸いです．
Vue.jsで条件によって:classの値を変える

Aだったら赤文字、Bだったら黒文字にしたい、みたいな要件の時に、条件によって要素に適用するclassを変えたい時ありますよね。
以下のように`methods`内で場合分けして、結果をテンプレートの`:class`に適用することで、テンプレート内にロジックを書かずに済みます。
※引数が無い場合は`methods`でなく`computed`でOK

```html
<template>
    <ul>
        <li v-for="loop in loops" :class="fontColor(loop)"></li>
    </ul>
</template>
<script>
export default {
    data: function () {
        return {
            classGrey: '-grey',
            classRed: '-red',
            loops: [1,2,3,4,5]
        }
    },
    methods: {
        fontColor: function(loop) {
            if (loop === 1) {
                return this.classRed;
            } else {
                return this.classGrey;
            }
        }
    }
}
</script>

```
「データフレームの結合、空の列の追加、一行ずつデータを取り出して、値を入力。」がしたい。

「データフレームの結合、空の列の追加、一行ずつデータを取り出して、値を入力。」
がやりたいこと。
何度やっても、ググらないとできないので、メモ。

１、DFを結合するときにはいつもお世話になっています。
http://sinhrks.hatenablog.com/entry/2015/01/28/073327

３、空の列を追加して、
http://nekoyukimmm.hatenablog.com/entry/2015/04/10/133917

３、そして、Interrowをfor文で回して、１行ずつアクセスし、if条件書いて、空の列に値を埋めていく、

```py
for index, row in df.iterrows():
    if row[columnName] == something:
        df.at[index, columnName] = "What I want input"
```

https://stackoverflow.com/questions/16476924/how-to-iterate-over-rows-in-a-dataframe-in-pandas
Gitの基礎的な操作の仕方 マニュアル 初級

プログラミング初心者がRubyonRailsチュートリアルをして学んだGitの基礎的な操作の仕方を個人的にまとめました。
なにか、間違いがあればご指摘していただけると助かります!!



#まずは設定
- Gitをインストールしてからコンピュータ１台に付き最初に1回だけ行う設定

```bash:bash
git config --global user.name "Your Name"
$ git config --global user.email your.email@example.com
```


#基本的な操作

- 新しいローカルリポジトリの作成

```bash:bash
$ git init
```


- ファイルをステージング領域に追加　
 - -Aですべてのファイルを追加

```bash:bash
$ git add -A
```

- ステージング領域の中身を知る

```bash:bash
$ git status
```


- ステージング領域で控えている変更をにローカルリポジトリに反映 コミット 
 - -mでメッーセージを指定
 - -aで現存するすべてのファイルへの変更を一括でコミット git add -Aをしなくてもよくなる

```bash:bash
git commit -m "Initialize repository"
```


- ローカルリポジトリの中身（コミットの履歴）を確認

```bash:bash
$ git log
```



- 以前コミットした状態に戻す方法(変更を取り消してもとに戻す方法）

```bash:bash
$ git checkout -f
```


#ブランチ
ブランチは基本的にはリポジトリのコピーで、ブランチ上では元のファイルを触らずに新しいコードを書くなど、自由に変更や実験を試すことができる。通常、親リポジトリはmasterブランチと呼ばれ、短期間だけ使う一時的なブランチはトピックブランチという。masterブランチはトピックブランチで行った変更に影響されないので、たとえブランチ上のコードがめちゃくちゃになってしまっても、masterブランチをチェックアウトしてトピックブランチを削除すれば、いつでも変更を破棄する事ができる。
gitを使う場合は、masterブランチでずっと作業するのではなく、その都度トピックブランチを作成して作業するのがよい


- ブランチの新規作成

```bash:bash
$ git checkout -b ブランチ名
```


- ブランチの切り替え

```
$ git checkout ブランチ名
```



- すべてのブランチを一覧表示

```bash:bash
$ git branch
  master
* modify-README
```



- masterブランチにトピックブランチの変更をmerge

```bash:bash
$ git merge トピックブランチ名
```


- ブランチの削除

```
$ git branch -d ブランチ名
```
トピックブランチの削除は必須ではない。実際、トピックブランチを削除せずにそのままにしておくことはよく行われる。トピックブランチを削除せずに残しておけば、トピックブランチとmasterブランチを交互に行き来して、キリの良い所で変更をマージする事ができる。



#リモート

- リモートリポジトリの登録

```bash:bash
$ git remote add origin git@bitbucket.org:ユーザー名/hello_app.git
```



- リモートにローカルの変更をプッシュ
 - 大抵のシステムではgit pushだけ入力すると git push origin master が実行される

```bash:bash
$  git push リモートリポジトリ ローカルリポジトリ
```





参照: [Ruby on Rails チュートリアル](https://railstutorial.jp/chapters/beginning?version=5.1#sec-version_control)
guard-shellでソースコードの変更を監視して自動でmake＆実行させる

# 概要

C言語で開発するとき、せっかくMakefile作るなら自動でmakeして実行させたりしたいですよね。

ファイルの変更監視をする方法はいろいろあるようですが、Rubyの環境を持っているのであれば`guard-shell`を使ってこんなに簡単にできます、という記事です。

サンプルのファイル一式を[こちら](https://github.com/emergent/misc/tree/master/ruby/guard-shell-sample)に置いておきました。

# 前提
- RubyおよびRubygemsをインストール・実行できる環境は整っているものとします。
- makeするためのソースコードおよびMakefileはご準備ください。動かしてみるだけなら上記サンプルをダウンロードいただければ。

# guard-shell環境構築手順
## 1. gemのインストール

```
$ gem install guard
$ gem install guard-shell
```

## 2. Guardfile の作成

ファイル監視したいディレクトリに移動した上で、以下のコマンドを実行すると、`Guardfile`という名前のサンプルが記載されたファイルが生成されます。

```
$ guard init
```

Guardfileを以下のように編集します。``で囲まれた箇所はお好きなコマンドに変更してください。

```ruby:Guardfile
guard :shell do
  watch(/(.*)\.c/) {|m| `make && ./#{File.basename(m[0], ".c")}` }
end
```

## 3. 監視の開始

以下のコマンドを叩くだけです。

```
$ guard
```

監視対象や実行コマンドを修正したいとき、Guardfileを修正すれば自動的に再読み込みしてくれるので`guard`コマンドを途中で終了したりしなくてよくて便利です。

# 参考

- [Guardをつかってみた - くろねこ日記](http://kuroneko0208.hatenablog.com/entry/2014/12/29/231705)
PyTorchがWindows対応したのでインストールしようとしたらnot a supported wheel on this platform.

# さきに結論
インストールしてたPythonが32bitだった

# [Pytorch](https://pytorch.org/)
- Windows
- pip
- 3.6
- 8

```console:Run_this_command
pip3 install http://download.pytorch.org/whl/cu80/torch-0.4.0-cp36-cp36m-win_amd64.whl
pip3 install torchvision
```
```console:やってみたらこけた
torch-0.4.0-cp36-cp36m-win_amd64.whl is not a supported wheel on this platform.
```

# 4/22に環境再構築したてだった
- [python.org](https://www.python.org/)からインストーラ取得
- ![get_installer_from_python.org.png](https://qiita-image-store.s3.amazonaws.com/0/244948/52186aaf-85a2-a583-3994-9d07339edd47.png)

# Pythonを実行して32or64を確認
```sh:python_32_or_64
$python -c "import struct;print( 8 * struct.calcsize('P'))"
32
```
- がっくりしてアンインストールのため「アプリと機能」をみたらしっかりPython 3.6.5 (32-bit)てあった

# 改めて再構築
- [python/downloads/windows](https://www.python.org/downloads/windows/)
- ![64installer.png](https://qiita-image-store.s3.amazonaws.com/0/244948/a52300f5-cc6c-acb2-9550-b8c74af2f5e9.png)

おわり
FreeBSDはコンパイルできてなんぼ。

# コンパイルは正義。

これだけは知っておいたほうがいい。

どんなにバグがないと公式に開発チームから保証されたバイナリは、
その場のマシンでしっかりとコンパイルされたバイナリと比べて、
ソースコードが読める人間のインスペクトを受けられる、
「コンパイル可能性（お好みなら冪等性とでもなんとでも言って良い）」という
保証を得られるということを。

# FreeBSD ports つかってますか
 May the source be with you.
# 君とならできるんだ、ports でないと駄目なんだ
pkg で、こんなことが起きる。
<pre>
  FreeRadius3 を入れるよ！  
  OpenLDAPつかってるよ！
  ok!! rlm-ldap はいるよね？

     えー入ってねえよ 😨
</pre>
😓 ok! do it your self.

# 獣道(サポートのない道）の歩き方を知りたい。

例として、 mail/qmail-spamcontrol を上げる

 今や化石と貶されている、qmail　の奴隷の一人。
 www.fehcom.de　 には最新のがあるよね？
 なんで ports めんてなんすされてねーの
 作者はlinux使いだよ。
 qmailおっさん臭いださいからみんなつかわねーよ2010年代は
 限界集落
 Makefile の　2231->2233 に書き換えるだけ
 make makesum 
<pre>

qmail-spamcontrol-1.03.2733_2  >  succeeds port (port has 1.03.2731_2)
qmhandle-1.3.2_2            =  up-to-date with port
</pre>

 大体OK 気にしちゃいけない、こんなことぐらい大したことない。
余談だけど ucspi-ssl が最新鋭化されて TLS1.2まともに動きます。
余談2：ここから、派生して ucspi-sslが 0.7x->0.90b になったよ。

# FreeBSD-update　で、あのクソダサい 
あのクソダサい　機能縮小版、mergemaster 最弱ユーザインターフェイスを使いたくない。

 FreeBSDといえば、onlineでバージョンを逐次上げていけます。
 バイナリオンリーの世界観からだとほぼ気違い沙汰と思われますが、今はもう大丈夫です。
 昔は a.out -> elf / 32bit -> 64bit の越すに越されぬ壁がありました（今も？）
 FreeBSD-update で、更新することは不可能ではないです。ええできますとも　"ただし"
 死ぬほどクソダサい mergemaster と闘い続けなければなりません。ええ。
 
　10.3なんてまだ動かしているあなた、
　今からさっさと コンパイル⇨インストール⇨ mergemaster -UPiF　です。
 special thanks to 春木屋さん　⇨　http://d.hatena.ne.jp/flageo/20090501/p1
<pre>
# mv /usr/src /usr/oldsrc
# mkdir /usr/src
# svnlite co https://svn.freebsd.org/base/releng/11.1 /usr/src
# ( cd /usr/src; nohup make buildworld buildkernel 2>&1 >build.log & )
#  cd /usr/src && make installworld installkernel 
#  mergemaster -UPiF 
</pre>

 10.4->11.1 を　この数日（金欠週間）死ぬほどやってますが、失敗0です。
 FreeBSD-update の mergemaster は死んでも使いません。ええ。
 なんで full-buildでいくかお分りいただけるはず。

 may the source by with you.
pip でインストールしたライブラリの情報を調べる（ディレクトリの場所など）

```console
$ pip show <package>
```

こんなんが出る。

```shell-session
$ pip show slackbot
Name: slackbot
Version: 0.5.1
Summary: A simple chat bot for Slack
Home-page: ｈｔｔｐ://github.com/lins05/slackbot
Author: Shuai Lin
Author-email: linshuai2012＠gmail.com
License: MIT
Location: /usr/bin/.pyenv/versions/3.6.5/lib/python3.6/site-packages
Requires: websocket-client, slacker, six, requests
Required-by:
```

-f で詳細表示。

```console
$ pip show <package> -f
```

パッケージを構成する全てのモジュールが表示される

```shell-session
$ pip show slackbot -f
Name: slackbot
Version: 0.5.1
Summary: A simple chat bot for Slack
Home-page: http://github.com/lins05/slackbot
Author: Shuai Lin
Author-email: linshuai2012@gmail.com
License: MIT
Location: /usr/bin/.pyenv/versions/3.6.5/lib/python3.6/site-packages
Requires: slacker, websocket-client, six, requests
Required-by:
Files:
  slackbot-0.5.1.dist-info/DESCRIPTION.rst
  slackbot-0.5.1.dist-info/INSTALLER
  slackbot-0.5.1.dist-info/METADATA
  slackbot-0.5.1.dist-info/RECORD
  slackbot-0.5.1.dist-info/WHEEL
  slackbot-0.5.1.dist-info/metadata.json
  slackbot-0.5.1.dist-info/top_level.txt
  slackbot/__init__.py
  slackbot/__pycache__/__init__.cpython-36.pyc
  slackbot/__pycache__/bot.cpython-36.pyc
  slackbot/__pycache__/dispatcher.cpython-36.pyc
  slackbot/__pycache__/manager.cpython-36.pyc
  slackbot/__pycache__/settings.cpython-36.pyc
  slackbot/__pycache__/slackclient.cpython-36.pyc
  slackbot/__pycache__/utils.cpython-36.pyc
  slackbot/bot.py
  slackbot/dispatcher.py
  slackbot/manager.py
  slackbot/plugins/__init__.py
  slackbot/plugins/__pycache__/__init__.cpython-36.pyc
  slackbot/plugins/__pycache__/hello.cpython-36.pyc
  slackbot/plugins/__pycache__/upload.cpython-36.pyc
  slackbot/plugins/hello.py
  slackbot/plugins/upload.py
  slackbot/settings.py
  slackbot/slackclient.py
  slackbot/utils.py
```

なお、インストールされているパッケージ一覧は

```console
$ pip freeze
```
Python + Djangoで外部CSS,JSを使用する

DjangoのTemplateで、外部ファイルを使用するサンプルです。参照できるまで苦労したのでメモしておきます

アプリケーションは「useexternal」とします

1.環境

- windows10 home 64bit
- Python 3.6.5
- Django==2.0.4

・サンプルアプリケーションの作成
コマンドプロンプトで仮想環境(venv)をactivateして、アプリケーションを作成します。

```
c:\data\python\venv>Scripts\activate
(venv) c:\data\python\mysite>django-admin startapp useexternal
```

実行後は以下のファイル構成になっています。

```
C:\DATA\PYTHON\MYSITE
│  db.sqlite3
│  manage.py
├─mysite
│  │  settings.py
│  │  urls.py
├─static
│  ├─css
│  │      bootstrap.min.css
│  ├─js
│  │      jquery-3.3.1.min.js
├─templates
│  └─useexternal
│          index.html
└─useexternal
    │  urls.py
    │  views.py
```
※編集するファイルのみ記載しています。

2.mysite/settings.py

```settings.py
・・・
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'useexternal',
]
・・・
TEMPLATES = [
    {
        'DIRS': [
            os.path.join(BASE_DIR, 'templates'),
        ],
            ],
        },
    },
]
・・・

STATIC_URL = '/static/'

STATICFILES_DIRS = (
    [
        os.path.join(BASE_DIR, "static"),
    ]
)
```
*Point*
- INSTALLED_APPSに作成するアプリ名「useexternal」を追加
- TEMPLATES DIRSは「os.path.join(BASE_DIR, "templates")」とする
- STATICFILES_DIRSは「os.path.join(BASE_DIR, "static")」とする

3.mysite/urls.py

```urls.py
from django.conf.urls import url, include
from django.contrib import admin

urlpatterns = [
    url(r'^useexternal/', include('useexternal.urls')),
    url(r'^admin/', admin.site.urls),
]
```

*Point*
urlpatterns に「url(r'^useexternal/', include('useexternal.urls')),」を追加します

4.useexternal/urls.py
urls.pyは、ファイルを作成して以下のように編集します

```urls.py
from django.conf.urls import url
from . import views
urlpatterns = [
    url('', views.index, name='useexternal'),
]
```

5.useexternal/views.py

```
from django.shortcuts import render
def index(request):
    return render(request, 'useexternal/index.html')
```

6.templates/useexternal/index.html
Templateとするhtmlは、templates/「appname」の下に作成します

```index.html
{% load static %}
<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta http-equiv="Content-type" content="text/html; charset=utf-8" /> 
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>外部css,jsを使用する</title>
    <link href="{% static 'css/bootstrap.min.css' %}" rel="stylesheet">
  </head>
  <body>
    <script type="text/javascript" src="{% static 'js/jquery-3.3.1.min.js' %}"></script>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.1.0/js/bootstrap.min.js"></script>
  </body>
</html>
```

*Point*
- {% load static %}をつけます
- cssの外部ファイル名は```<link href="{% static '<cssファイル名>' %}" rel="stylesheet">
```とします

- jsの外部ファイル名は<```script type="text/javascript" src="{% static '<jsファイル名>' %}"></script>```とします

7.css,jsの配置
staticフォルダの下にcss,jsを作成します
```
├─static
│  ├─css
│  │      bootstrap.min.css
│  ├─js
│  │      jquery-3.3.1.min.js
```

8.実行して確認してみます
![image.png](https://qiita-image-store.s3.amazonaws.com/0/246741/78ed1e10-b834-317c-ce80-d0d029fe25f7.png)

問題ないようです。
通过quic访问google搜索 


首先感谢https://github.com/googlehosts/hosts 项目，下文所使用的hosts都来自这

###概要
系统hosts修改为此项目的hosts、chrome://flags/#enable-quic设置为Enabled、使用带UDP转发的VPN，访问https&#58;//www&#46;google.com/ncr，进行搜索活动，直到看到协议为QUIC后，即可关闭VPN。之后即可直连https&#58;//www&#46;google.com
详细情况请往下看




 ** ** ** **** ** ** **
###测试平台：
本文发布时(5月5日)的该项目的最新hosts仍然支持

Android 5.1 with SSR:
- Chrome 62
- Chrome Beta 66
- Brave 1.0.41(就这一个没有成功)

Win10 with SSTap:
- Chrome 63
- Chromium 63(来源于github.com/henrypp)

###关于Chrome版本
本人Android上测试过62.0.3202.66可用，版本在这之上的应该没问题，但Android端Brave 1.0.41内核版本为64.0.3282.137没有quic成功

接上，关于Chrome版本问题，观察到在成功QUIC的Chrome62和66中，chrome://net-internals/#quic中Supported Versions的Value都为QUIC_VERSION_39，所以想必Chrome的QUIC是39版本的话，就可以使用。Brave 1.0.41就算在flag中使QUIC为Enabled，在net-internals/#quic也显示为"QUIC is disabled"。此外，支持39版本的Chromium当然也是可以的

###关于VPN
Android平台，VPN可以为带UDP转发的SS或SSR。
Windows平台，VPN可为SSTap；若直接设置Chrome的ss或ssr端口代理的话，因无法转发UDP而不适用。除此之外，请确保SS或SSR服务器端支持UDP转发

###关于网络
网络的话，Android上测试过移动、联通、电信都没问题，QUIC应该连接到了www.google.com的UDP443端口，请确保所在网络环境没有限制UDP

###关于是否开启quic
我当初测试的时候，Android的quic开启Enabled才能看到QUIC协议，Windows上的则可以为默认的Default(Win上测试版本为63)

###.co.jp等
当然还可以自己手动更改hosts，把多国域名指向那个ip，在这些域名下实现QUIC，这样就可以不同域名下搜索不同语言，而不必频繁切换地区了。

###/ncr
大陆ip的话，不加ncr访问www.google.com会自动跳转到www.google.com.hk，而因该hosts内的www.google.com.hk未指定成那个ip，所以无法访问。(当然如上面一段所说，可以自己手动指定)

###存在问题
隔几天没用过后，不能直连，需要开VPN再次协商QUIC，猜测可能是QUIC Sessions过期了。希望未来可以不用VPN协商，直接像之前更改hosts就能用。
copyコマンドでワイルドカード使用時の注意

# はじめに
業務でファイルコピーをする単純なバッチファイルを作成していたところ、copyコマンドで１つ引っかかったので備忘録代わりに投稿でもしてみようかな、と思い立ちました。
※ベースはほぼ出来てたのに大分放置してた・・・。

# copyコマンド
ファイルAを複写してファイルBを作る、というのは説明するまでもありません。
#### ワイルドカード
今回のポイント。これも今更説明するまでも無いですが、ワイルドカード（\*、?）の用途としては

1.ファイル名が一部しか特定出来なくても指定出来る
ファイル\_20171005.txt を指定したいが、可変部の日付部分「20171005」は特定できないので

```cp.bat
copy ファイル*.txt ファイル.txt
```

のようにすると日付部分から拡張子の前までがどんな文字でも指定出来ます。

2.条件に一致する複数のファイルをコピー元に指定出来る
同ディレクトリ上に、ファイルA.txt・ファイルB.txt が存在する場合

```cp.bat
copy ファイル*.txt ファイルC.txt
```
を実行すると、**ファイルA.txtとファイルB.txtの内容が結合されたファイルC.txtが作成されます。**

```ファイルA.txt
fileA
```
```ファイルB.txt
fileB
```
↑の２ファイルの内容が結合されて

```ファイルC.txt
fileA
fileB
 
```
# 問題点
実際に作成されたファイルを確認してみると、何故か最後に**半角スペースが付与されています。**
ちなみに上記例では元ファイルの最後に改行があるため、ファイルCの３行目が半角スペースのみの行になります。
元ファイルに改行が無ければ

```ファイルC.txt
fileAfileB 
```
のように１行目の最後に半角スペースが付与されます。
（見た目でわかりにくくてすいません。どう書けばいいかわからなかったので・・・）

で、何が問題だったかというと、例えばシステムで読み込むテキストファイルをこの方法で作った場合、
この余計な半角スペースのせいでエラーになったりしてしまうんですね。

#解決策
copyコマンドでどうにかする方法が無かったので代替案として**xcopyを使いました。**
xcopyならほぼ同じ使い方で上記現象は発生しませんでした。
調べ方が悪いのもあるかもしれませんが、特にこれといった情報が出てこないんですよねー・・・。
もしご存知の方いれば教えて頂けると嬉しいです。
tmuxこれだけでも十分活用できそうまとめ。

はじめまして。Qiita初投稿です。

<a href="http://system-admin-girl.com/">まんがでわかるLinux シス管系女子</a>を読んで「便利そう！」と思ったので自分なりに使いそうな機能に限定してまとめてみました。

#tmuxとは
> **tmux - wikipedia**
> *tmuxは端末マルチプレクサであり、ユーザが単一の端末ウィンドウまたはリモート端末セッション内の複数の別々の端末セッションにアクセスできるようにします。*

簡単に言うと、コンソール環境の先に新しくセッションを作り(追加でブラウザを立ち上げるイメージ)、さらに複数のウィンドウを作り(新しいタブを開くイメージ)、それらを自由に切り替える事ができます。

また、vimでテキストを編集中に何らかの理由でssh接続が切断された場合・・・等でも、実行中のプロセスはtmuxセッションの中で続行され続けるので、セッションへ再接続し作業を再開することが可能です。

##使用方法
下記環境にて検証
<I>`vagrant box bento/centos-7.3 (virtualbox, 201708.22.0)`</I>

###tmuxインストール
```
$ sudo yum install tmux
```

###セッションを作成する
```
$ tmux
```
端末の画面の下に`[0] 0:root@localhost:~*`のようなものが表示されるかと思います。これで1つ目のセッションおよびウィンドウができました。
`[0]`はセッション名
その次の`0:`はウィンドウの番号
`root@localhost:~`はウィンドウ名
`*`は現在操作中のウィンドウであることを意味します

###ウィンドウを追加作成
```
ctrl+b 
c
```
新規ウィンドウを作成、移動します。
端末の画面の下は
`[0] 0:root@localhost:~- 1:root@localhost:~*`
こんな感じになります。


###前のウィンドウに移動
```
ctrl+b 
p
```

###次のウィンドウに移動
```
ctrl+b 
n
```

###ウィンドウをリスト化して移動
```
ctrl+b 
w
```

###ウィンドウ名の変更
```
ctrl+b 
,
```

###ウィンドウを閉じる
```
ctrl+b 
&
```
ウィンドウを全部閉じると、そのtmuxセッションを削除したことになります。

###現在のtmuxセッションをデタッチ(バックグラウンドでは引き続き稼働)
```
ctrl+b 
d
```
デタッチして再度`$ tmux`を実行すると、既存セッションへの接続ではなく新規セッションの作成になってしまいます。
既存セッションへの再接続(アタッチ)は次の方法で。

###tmuxセッションに再接続
```
$ tmux attach
```
最後に操作していたセッションに再接続します。

###tmuxセッションを一覧表示
```
$ tmux ls
0: 1 windows (created Fri May  4 15:29:58 2018) [140x49]
1: 1 windows (created Fri May  4 15:30:24 2018) [140x49]
2: 1 windows (created Fri May  4 15:30:31 2018) [140x49]
```
上記の例では`0` `1` `2`の3セッションが存在することを示していて、アタッチの際には

```
$ tmux attach -t 0
```
のように`-t`に続けてセッション番号を指定することもできます。



また、あるセッションに接続した状態で

```
ctrl+b 
s
```
とすると、既存セッションをリスト表示して移動することができます。

###現在のセッションの削除
```
$ tmux kill-session
```

###全セッションの削除
```
$ tmux kill-server
```

###現在の画面(ペイン)を上下に分割
```
ctrl+b 
"
```
ウィンドウを画面上で分割する。

###現在の画面(ペイン)を左右に分割
```
ctrl+b 
%
```

###ペイン間の移動
```
ctrl+b 
カーソルキー(↑↓←→)
```

###ペインサイズの変更
```
ctrl+b 
ctrl+カーソルキー(↑↓←→)
```
Macではデフォルトで`ctrl+カーソルキー(↑↓←→)`にショートカットが割り当てられているため、`システム環境設定`-`キーボード`-`ショートカット`で解除するとよい。

###ペインを閉じる
```
ctrl+b 
x
```
`$ exit`でもo.k.

###ペインに時計を表示する
```
ctrl+b 
t
```
ちょっとかっこいい(笑)

#おわりに。


お客様先にてKVM(Keyboard Video Mouse)はあるけどCUI(multi-user.target)オンリーという環境を多く見るのですが、そんな時に`/var/log/messages`を`tail -f`してエラーメッセージの出力を確認しつつ、ウィンドウを切り替えて他作業をする、という風に活用できそうです。

しかし、そのようなサーバはそもそもtmuxが入っていないかもですが；；
そんな時はscreenでしょうか。
Ubuntu 16.04 でログインループや low graphics mode, 画面ブラックアウトになる, nvidia-smi が出ないなどの原因と対策

OpenGL/Vulkan でグラフィックスアプリ開発しつつ OpenCL/CUDA で機械学習もするとなると, ベンダーのプロプライエタリなドライバをインストールするのが必須ですね.

しかしアップデートしたり GPU 入れ替えしたりするとログインループ(lightdm のウィンドウは出るが, パスワードを入力すると画面が一瞬切り替わるがもとに戻ってしまう)になったり, low graphics モードでうまく画面が出ない, そもそも画面が真っ黒になってしまう時があります.

いろいろ試行錯誤で 1, 2 日修復にかかったり, 結局治らず時間を無駄にしてしまうこともあります.

備忘録として, 原因と対策を記述します.

## 前提条件 

* lightdm を使っているものとします(Ubuntu のデフォルト)
* それほど古くない GPU を使っているものとします(2018 年 5 月現在, NVIDIA は Pascal 系, AMD は Polaris/VEGA 系)
* `openssh-server` をインストールしておいて, リモートログインできるようにしてある

## 原因リスト

### よくある?例

apt で nvidia ドライバの再インストールなどで治るケースがあります.

Ubuntuでログインループに陥ったときの対処法
https://qiita.com/musaprg/items/58d9dee4ef70e3882a9d

### GPU が新しすぎる

Linux のドライバがまだ対応していない場合があります. Linux の場合はあまり最新の GPU を使わないのがよいです(だいたい半年くらい経ってこなれてきたものがよい).

### CPU が新しすぎる

Ryzen が発売されたときにいくらか問題がありました.

Ryzen + GeForce 1080 Ti + Ubuntu もしばらく辛抱が必要?(2017 April 02 時点)
https://qiita.com/syoyo/items/c7f8b4724d542db64a92

Ryzen + amdgpu-pro + Ubuntu は 2017 年夏頃まで辛抱が必要(2017/08/03 時点)
https://qiita.com/syoyo/items/37c4eae70595ac1185bd

CPU も発売してから 6 ヶ月くらい時間が経っているものを選ぶのが良いです.

### カーネルが新しすぎる or 古すぎる

カスタムでカーネルを入れているなどする場合, dkms でドライバのコンパイルに失敗したりします.

### ディスプレイ用に AMD GPU のあとに NVIDIA GPU をマシンに挿した.


#### amdgpu-pro ドライバや rocm ドライバを消し忘れている

`/var/log/Xorg.0.log` で `EE` で grep して, nvidia ドライバが GLX 周りでエラーをレポートしている場合, 残っている AMD の GLX ドライバを見に行っているのが原因です.

`$ amdgpu-pro-uninstall`

で AMD のドライバを消し,

```
$ sudo service lightdm restart
```

します. 


#### nomodeset あたりのカーネルパラメータを設定している.

Pascal 以降? の NVIDIA ドライバだと KMS(kernel mode setting) が必須のようなので nomodeset などのカーネルパラメータを grub で指定していたら消して置きます.

### nvidia-smi コマンドが出ない.

nvidia ドライバをきちんと再インストールしても, `nvidia-smi` コマンドが `/usr/bin/nvidia-smi` に存在しない.

`nvidia-smi` などは実際は `/etc/alternatives` へのシンボリックリンクで, このファイルはさらに各ドライバパッケージ(たとえば `/usr/lib/nvidia-390`) へのシンボリックリンクになっています.

update-alternatives の設定がなんらかの原因で失敗していたり, mesa に切り替わっている可能性があります.


https://askubuntu.com/questions/847869/service-lightdm-modifing-etc-alternatives-x86-64-linux-gnu-gl-conf/907857

`sudo update-alternatives --config x86_64-linux-gnu_gl_conf`
`sudo update-alternatives --config x86_64-linux-gnu_egl_conf`

で, nvidia のものが設定されるように直します.

これで `nvidia-smi` が出るはずです.

.so が見つからないエラーが出たら,

```
$ sudo ldconfig
```

で .so 探索のキャッシュファイルを更新しましょう.

## その他

結局システム一式再インストールしたほうが手っ取りはやいというケースもあります.

NFS/NIS(今だと ActiveDirectory?)で `/home` や作業データはネットワーク上のサーバーに置いて, ユーザーもサーバで管理, ドライバ周りでおかしくなったらシステム再インストールで作り直ししやすくする, とするのが良さそうです.

## TODO

* Ubuntu の update-alternatives の挙動を理解する
* OpenStack, Terraform あたりでベアメタル環境をデプロイ&管理できるようにしたい.
動作確認用ウェブサーバを一瞬で立てる 

python の SimpleHTTPServer モジュールを使って動作確認用の簡易ウェブサーバを立てる方法のまとめです。

# 使い所

例えば index.html が

```html
<link href="/css/style.css" rel="stylesheet" type="text/css">
```

と絶対パスで css や javascript を読み込んでいるとします。

このときブラウザで `file:///Users/username/.../index.html` を表示すると、ブラウザは `file:///css/style.css` にアクセスを試み、見つけられずに表示崩れなどが起こります。
簡易ウェブサーバを立てて `http://localhost:8000/index.html` としてテストを行うと、 css のパスは `http://localhost:8000/css/style.css` となり、正常に読み込むことができます。

CGI が動く簡易ウェブサーバを立てることもできるので、CGIの開発がはかどります。

# 簡易HTTPサーバ

以下のコマンドをシェルに打ち込むと簡易ウェブサーバが立ちます。
python2 と python3 でモジュールが異なるところがやや落とし穴です。

python2:

```bash
python -m SimpleHTTPServer
```

python3:

```bash
python -m http.server
```

上記のコマンドで、手元の 8000 番ポートで待ち受ける HTTP サーバが起動し、起動したシェルのカレントディレクトリ以下が公開されます。
http://localhost:8000/ にアクセスすると index.html の内容、またはディレクトリのファイル一覧が表示されるかと思います。

なおコマンドライン引数にポート番号を与えると、待ち受けポートを変更することができます。

```
$ python -m SimpleHTTPServer 1234
Serving HTTP on 0.0.0.0 port 1234 ...
```

# 簡易CGIサーバ

たまに CGI を触ろうと思うとどうやって動かしたものか迷うのですが、これも CGIHttpServer モジュールを使うことで簡単に動作確認できます。

ディレクトリ構造:

```
.
├── cgi-bin
│   └── hello
└── index.html
```

hello:（`chmod +x hello` として実行権限を付けます）

```bash
#!/usr/bin/env bash

cat << __EOF__
Content-Type: text/html;charset=utf-8

<h1>CGI Works!</h1>
__EOF__
```

python2:

```bash
python -m CGIHTTPServer
```

CGI サーバも python2 と python3 で起動方法が異なります。

python3:

```
python -m http.server --cgi           
```

これで http://localhost:8000/cgi-bin/hello にアクセスすると CGI が実行されます。

# 公開範囲を限定する

python3 の http.server モジュールでは公開範囲を限定するオプションが存在します。

前述のコマンドで立てたウェブサーバはすべてのネットワークインターフェースで待ち受けるため、 localhost 以外からでもアクセスできます。
例えば自分のローカル IP アドレスが `192.168.10.a` の時、同一 LAN 内に存在しているすべてのホスト `192.168.10.*` に対して、起動したシェルのカレントディレクトリ以下のファイルを公開していることになります。

※この方法は同一 LAN 内の別のパソコンにファイルを渡す簡単な方法としても使えますが、経路上をファイルが平文で流れるので、セキュリティ的に第三者に見られてはだめなファイルがカレントディレクトリ以下にあるときには使えないです。

さて、動作確認用にウェブサーバを立てる時には、自分以外の誰かが見たり実行したりすることは想定していないはずです。
次のようにすれば公開範囲を限定することができます。

```
$ python -m http.server --bind localhost
Serving HTTP on 127.0.0.1 port 8000 (http://127.0.0.1:8000/) ...
```

bind オプションに待ち受けアドレスを書くことで、 `http://localhost:8000/` や `http://127.0.0.1:8000/` ではアクセスできるけれども、 `http://192.168.10.a:8000/` ではアクセスできない状態になります。
自作PC初心者がShuttle SZ270R9にESXi6.5を導入する

noteの記事に詳細な写真付きでアップしているのでそちらもどうぞ
https://note.com/morih90/n/nbc22b47d1398

個人用に検証環境が欲しいなと思っていて
以下理由から導入を決意しました。


#導入に至った経緯
①インフラエンジニアとして、VMの理解を深める
②会社の検証環境だと、好き勝手するのに気が引ける
　⇒実際以前いろいろ触ってたらリモートで全く繋がらなくなって先輩に迷惑かけたんで。。

#SZ270R9の組み立て

まずカバーを外すため、背面のねじ(3か所)を外します。

パかっと外れます。

ディスクを設置するラック？を取り外すので、ねじ(4か所)を外して、ラックを取り外します。

###①メモリの取り付け

まずFANを外すので、背面のねじ(4か所)を![error]()
外します。

FANコネクタを外します。

CPUはなんか取り付けられているので
はじの黒いねじを右にクリっと回すと、ぱこっととれます。
(ちょっと固いかもしれませんが、ゆっくり力をいれながらやると簡単にとれます)

FANごといったん取り出しましょう

CPUのご本尊のお出まし
(まだ中身を入れてないので空ですが)

今回導入するCPUはこちら

COREi5-7400　というもの
SZ270R9はCPUの規格、チップセットはLGA1151系のCPUが搭載できますが、
<b>対応しているのは第7世代までみたいです</b>

本当は7600にしようとしたが、GWで品切れとのこと。。入荷も未定といわれ
たまたま在庫であったこちらを購入。
スペックはググってください。。

FANもついてきますが、今回はSZ270R9についているFANを使用するのでこちらは使いません。


カバーを外します。
横っちょの金具をぐっと押しながら横に押し広げる感じでやると外れます。

シートをはがします。
ケースをパかっと開きます。

CPU設置するときは向きがあるので気を付けてください。
CPUの左下に▲のマークがあるのでこれを基盤の△マークと合わせるように設置します。
※CPUは非常にデリケート(らしい)なので、慎重にはめましょう！

はまった！

ケース閉じます。


SZ270R9に付属している冷却用グリスをつけます。
本来は米粒3粒程度、だそうです。


さっきとりはずしたFANをとりつけます。
自分はこのCPUのケースの黒いねじをはめるのに苦戦しましたが
ねじを右に回した状態ではめ込むとうまくいきました。

背面のねじもとめます。

###②メモリの取り付け
このSZ270R9は最大64GBまでメモリを搭載可能です。
でもいきなりそんなにはいらんやろ。
ってことで今回は16GB×2の32GBで実装することにしました。

メモリの溝と基盤の溝が合う方向を確認して、グッと差し込みます。
これを今回は2枚差し込みます。

###③SSDの取り付け
ディスクはHDDの方が容量多くて安価に変えますが、
今回は奮発して、SSDにしました。
＃圧倒的に起動が早いです！


はめ方がよくわからなかったのですが、ねじを4か所とめます。

SATAケーブルを接続します。(基盤側)

ディスクラックを取り付けて、


SSDにSATAケーブルを接続します

このケーブル(なんだっけな)もSSDに取り付けます。

そんでケースをもとのとおりにはめ直します。

で、電源ケーブルと、HDMIケーブルでモニタに接続して、キーボード取り付けて、
いざ電源ON！！


どきどき・・・

立ち上がってきました！！！

ってかこのSZ270R9はもともとゲーマ用PCとして売られているものらしいので、
こんな光を放ちます。(個人的にはいらない)
後ほど消し方もご紹介します。

あとは、ESXiのインストール手順に従ってインストールしていきます。

###最後に
今回手元での検証環境が欲しい！ってことで、自作PCなんてやったこともない自分が
メモリやらCPUやらを設置して、ちゃんと起動するところまで確認できました。
やってみて、結構面白かったし、ハードの知識はぶっちゃけ業務には必要ないんだけども、こういう世界もあるんだな、と知見も広がったし、何より自分が作った検証環境に今はめっちゃ愛着湧いてます。
VPNの設定もして、会社から手元の環境使ってちょっと検証、なんてのもやってます。
今の世の中クラウド化が進んでるので、もちろんAWSやAzureなんかをやったほうが今後の役に立つのはそうなんですが、仮想環境の知識や、自分で組み立てることで、より興味が湧くことは間違いないので、ぜひこのようなマシンを自分で組み立てることお勧めします。
PDIでDBからデータを取得する

PDIはPentahoのETLツールですので、データ統合用のツールとして、DBからデータを取得するという状況がよくあります。
ということで、DBからデータを取得する際の方法を簡単にまとめてみました。
※ PDIについては[こちら](https://qiita.com/mik/items/8a36e8efb06367c82b41)を参照してください。

# テーブル入力ステップ(Table input Step)
DBからデータを取得する方法の代表的なものがテーブル入力ステップです。
設定画面はこんな感じです。

![PDI_Table_01.png](https://qiita-image-store.s3.amazonaws.com/0/186651/49aa5dcc-050b-c2ec-5413-edae10ba66c3.png)

## データソースの設定する
まず、DBへの接続設定を行ないます。
設定画面の「データソース名」の右にある「新規作成」ボタンから以下の画面で設定します。
今回は、Spoon起動時にサンプルデータ用として内包されているH2DBに接続してみます。
<img src="https://qiita-image-store.s3.amazonaws.com/0/186651/56aac96c-430b-f18d-f247-32760b408ad6.png" width=70%>

接続テストがOKであれば、OKボタンを押して設定を保存します。
すると、データソース設定画面で設定した「接続名」が選択されています。
<img src="https://qiita-image-store.s3.amazonaws.com/0/186651/10d1f8c6-cdab-ee3f-eba2-f28d0beae03d.png" width=80%>

## SQLを書いてデータを抽出する
DBへの接続設定ができたら、あとは普通にSQLを書けばデータを取得することができます。
そのまま書いてもいいですが、今回はサンプルデータを使用しているため、テーブル名とかがわかりませんので、「データベースエクスプローラー」を使用して、テーブル名やカラムを選択したいと思います。
<img src="https://qiita-image-store.s3.amazonaws.com/0/186651/ffc14d93-b07c-3bfe-22fc-50b32a2b2daf.png" width=80%>

「フィールド名をSQLに追加しますか？」というポップアップが出てくるので「はい」を押すと以下のようにSQLが作成されます。
<img src="https://qiita-image-store.s3.amazonaws.com/0/186651/d6bdf2d6-37ee-9dda-792d-049de66d9374.png" width=80%>

最後に、上記画面の下方中央部にある「プレビュー」を押すと、実際にSQLを実行してデータが取得できるかを確認することができます。
![PDI_Table_06.png](https://qiita-image-store.s3.amazonaws.com/0/186651/61e90f08-7506-6884-78f0-cea43b04c66d.png)

# データ抽出後の設定
DBからデータが取得できたら、あとは通常のデータ操作をPDI上で行う事になります。
例えば、以下のように、DBから取得したデータとCSVから取得したデータをJoinし、特定条件でデータのフィルタリングを行ない必要のないデータを削除(テキストファイルに出力)し、最終的に必要なデータのみ別のDBに出力するみたいなことが可能です。
<img src="https://qiita-image-store.s3.amazonaws.com/0/186651/cea50120-2e60-fc24-c143-53207acc2186.png" width=80%>

# データベースエクスプローラーのその他の機能
今回の趣旨とはちょっと変わりますが、データベースエクスプローラーはテーブルを選択してSQLを自動的に作成するためだけではなく、別の機能も持っているので簡単にまとめておきます。
![PDI_Table_09_a.png](https://qiita-image-store.s3.amazonaws.com/0/186651/3d660f19-292f-4d7b-41d0-9ab2a5900967.png)

プレビュー系や行数カウントは、そのままの意味なので割愛します。

レイアウト表示は、テーブルを構成しているカラムやカラムの型等を確認することができます。
![PDI_Table_10.png](https://qiita-image-store.s3.amazonaws.com/0/186651/4d705d41-3ea5-fabf-03b9-12fae9f550cd.png)

DDLは、選択しているテーブルのCreate Table文を表示します。
SQLビューは、別途Windowを表示して、その中でSQLを自由に記述してプレビューすることができる機能です。
トランケートテーブルも上記のようなWindowが表示されますが、その中にあらかじめTRUNCATE文が記載されています。

データプロファイルは、以下のように、各カラムの最小、最大、合計、平均、標準偏差を出してくれます。中央値が取れないのが残念な気もしますが、必要であれば統計情報がとれるステップも用意されているのでそちらを使うのが良いかと思います。
![PDI_Table_11.png](https://qiita-image-store.s3.amazonaws.com/0/186651/f3364680-030f-ef90-3931-8f0f05d1bddc.png)
AWS(RHEL)環境でpython2と3の併存環境を整える

結論から言うと、下記記事をまんまRHEL環境でも行えば利用可能。

Amazon LinuxでPython3系を使う
https://qiita.com/michimani/items/fc64dcbe721d91579ccb

ちなみに現状のステイブル版は3.6.5だったので、バージョンはそれにした。

```console
python -V
Python 3.6.5
```

いぇい。
Haskellでコンパイル時に「(ファイル名):L(現在の行）」を埋め込む

# 結論
　あるファイルでそのコードの場所を文字列として埋め込みたい場合は、このように実現することができます。

```haskell
{-# LANGUAGE CPP #-}

let here = __FILE__ ++ ":L" ++ show (__LINE__ :: Int)
```

（コンパイル時と言ったな、あれは嘘だ。これは多分プリプロセス時に解決されます）

# 起
　Haskellでは、関数が単純に例外を出す可能性がある場合は`Either e`もしくは`Maybe`を使うと思います。

```haskell
readFooFromSomewhere :: Bar -> Either Text Foo
readFooFromSomewhere bar =
  let result = {a result of a some calculation}
  case result of
       Baz -> Left "残念"
       Poi -> Right {some}
```

　これに加え`IO`文脈下では関数`fail`などによって、`Left e`や`Nothing`でない、マジモンの例外を出すことができます。
（危険、多用厳禁。`main`関数以外での使用を推奨しません :sob:）

`fail`は主に非正常系で使われると思います。

```haskell
readFooFromSomewhere :: IO ()
readFooFromSomewhere =
  result <- {a result of a some calculation}
  case result of
       Baz -> fail "残念"
       Poi -> return {some}
```

　`fail`が使われる場所はだいたい非正常系の処理だと思いますので通常は現れないはずですが、
もし現れた場合にissueで報告して欲しい場合はこんな感じにすると思います。

```haskell
readFooFromSomewhere :: IO ()
readFooFromSomewhere =
  result <- {a result of a some calculation}
  case result of
       -- vvv ここは絶対に通らないよ！もしここを通ったら木の下に埋めてもらっても構わないよ！
       Baz -> fail "Main.readFooFromSomewhere: fatal error! sorry, please report an issue if you see this :("
       -- ^^^
       Poi -> return {some}
```

# 承
　でもいちいち`"Main.readFooFromSomewhere"`とか書くのは面倒なので、どうせならコンパイル時とかプリプロセス時あたりで、自動で埋め込んで欲しいと思うのは自然なことですよね。

それについて選択肢はいくつか考えられます。

- プログラムを`--profile`オプション付きGHCでビルドして、[GHC.Stack.HasCallStack](https://www.stackage.org/haddock/lts-11.7/base-4.10.1.0/GHC-Stack.html#t:HasCallStack)と`currentCallStack`を使う
- TemplateHaskellを使う
- CPPを使う

　今回はCPPを使ってみます。
しかしながらGCCの`__FUNC__`のようなマクロはないようですので、代わりに`__FILE__`と`__LINE__`で示します。

```haskell
{-# LANGUAGE CPP #-}

readFooFromSomewhere :: IO ()
readFooFromSomewhere =
  result <- {a result of a some calculation}
  let here = __FILE__ ++ ":L" ++ show (__LINE__ :: Int)
  case result of
       Baz -> fail $ here ++ " : fatal error! sorry, please report an issue if you see this :("
       Poi -> return {some}
```

できました。

# 参考

- [code generation - Haskell equivalent of C's \_\_LINE\_\_ - Stack Overflow](https://stackoverflow.com/questions/2314110/haskell-equivalent-of-cs-line)
PythonとR とウィルコクソン順位和検定とウィルコクソン符号順位検定

１、プログラミング以前の統計の話。ウィルコクソンの順位和検定、ウィルコクソンの符号順位検定。そもそもこの二つをきちんと分けて考えられていなかったことを反省して、メモ。
引用 
「ウィルコクソンの順位和検定 (Wilcoxon rank sum test) を行う．本検定法は，ウィルコクソンの符号順位検定 (Wilcoxon signed rank test) とは明確に異なる検定法である．」

https://qiita.com/s-wakaba/items/0e4f726e1e9bb5331fb5
http://data-science.gr.jp/implementation/ist_r_wilcoxon_rank_sum_test.html


２、ScipyとRで関数名自体を使い分けるか、引数に条件を追加するか、が違うことがさらにややこしい。


３、Scipy では 片側検定がデフォルト。なぜこんな仕様なの？
alternative='two-sided'を引数にいれないといけない。当然、値が大きく異なる。


4,連続補正の考え方、扱い方について
私が使ったデータセットは正規分布しない顧客年齢。
wilcox.testで連続補正有無、Exact引数の有無でほとんどP値に差はなかった。繰り返しだが、片側両側検定の違いが大きいので、Scipy使用時の引数には注意。
http://namelesscity.hatenadiary.com/entry/2018/01/10/114725


以下は連続補正(correct引数）や対応のある検定(paired引数）で混乱した質問者の質疑応答。
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q10121374345
[随時更新]機械学習の役立つサイト一覧

#37 Reasons why your Neural Network is not working

>https://blog.slavv.com/37-reasons-why-your-neural-network-is-not-working-4020854bd607

NNのaccが上がらない時に見る。

#【Deep Learning】 Batch sizeをどうやって決めるかについてまとめる
>http://st-hakky.hatenablog.com/entry/2017/11/16/161805

#Kerasと関数型プログラミングを使えば、深層学習（ディープ・ラーニング）は楽ちんですよ

>https://tail-island.github.io/programming/2017/10/25/keras-and-fp.html

#How To Improve Deep Learning Performance

>https://machinelearningmastery.com/improve-deep-learning-performance/
[MySQL]MySQLでrootパスワードを忘れた場合の対処方法（CentOS）


MySQLは扱いやすいDBのため比較的小規模なシステムや勉強用のDBとしてVagrantやVMware上にCentOS等のOSを立てて使われるケースが多くあると思います。
しかし、rootであまりログインしていなかったりするとパスワードを忘れてしまう事もしばしば。。。。。。

そのため、今回はrootパスワードの初期化方法を紹介します。

# 前提
* OS:CentOS 7.4
* MySQL:8.0.11

## MySQLの停止
MySQLが起動している場合、MySQLを停止します。
以下はroot権限で実施してください。

```Bash
# サービスが起動しているかの確認
systemctl status mysqld
```

サービスが停止している場合は、「Active: inactive (dead)・・・」と表示されますが、「Active: active (running) ・・・」と表示される場合はサービスが起動しているため次のコマンドで停止します。

```Bash
systemctl stop mysqld
```

## safe modeでの起動
パスワード入力なしでログインできるsafeモードでMySQLのサービスを起動します。

```Bash
systemctl set-environment MYSQLD_OPTS="--skip-grant-tables"
systemctl start mysqld
```

## MySQLへのログイン
MySQLへログインします。パスワードは不要です。

```Bash
mysql -u root
```

## 権限のリロード
一度flushを行います。

```sql
FLUSH PRIVILEGES;
```

## パスワードの再設定
以下のコマンドでパスワードを再設定します。
MyNewPassには変更後のパスワードを入力してください。
再設定したら一旦抜けます。

```sql
ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyNewPass';
exit;
```

## 通常モードでの起動
通常モードでサービスを上げ直します。

```Bash
systemctl stop mysqld
systemctl set-environment MYSQLD_OPTS=""
systemctl start mysqld
```

その後、変更したパスワードでログインができるようになっているはずです。

##参考リンク
B.5.3.2 How to Reset the Root Password:
　https://dev.mysql.com/doc/refman/8.0/en/resetting-permissions.html
　　
以上です。
静的サイト（性的ではない）をAWSで最速最安でホスティングする手順

## きっかけ
サイト入れ替えのため、ステージング用ドメインを作ろうと、さくらのレンタルサーバーのサーバードメイン管理画面をいじっていたら、突然つながらなくなり、１時間ほどサーバーが落ち、その後、すべてのドメイン設定が消えていたこと。笑

Oops!!!!!!!
目を凝らしても、逆立ちしても、同サーバーで運営していたサイトが一切見れませんねぇｗｗｗｗ
笑えるｗｗｗ

まさに気分は、
アンコントロールスイッチ！
ブラックハザード！
ヤベーイ！

なんとゴールデンウィークで鯖屋がサポート窓口連休中という始末。人間だから休んでくれるのは構わない。しかし水道屋が連休とったら、地域住民は大惨事！！

さて、どこのレンタルサーバーに乗り換えよう、
「そうだ、AWSへ移行！」

国産レンタルサーバーみたいにわかりやすい管理画面ではない一面はあれど、覚えちゃえば簡単に安定ホスティングできちゃうAWSってSUGEEEE!!

そのうちGCPも試してみたい。

## 条件

お名前.comのドメインを移管せずに使う。移管するのはそりゃいかん。
PHPなどのサーバーサイドスクリプトが無い、HTMLファイルやCSSファイルでできた完全に静的なサイト

## 手順

AWSのマニュアルを読んで、そのままやっただけ。
[独自ドメインを使用して静的ウェブサイトをセットアップする](https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/website-hosting-custom-domain-walkthrough.html)

### S3の設定
1つのサイトに対して、2つのバケットを作成する。名前は必ずURLのドメインと一致させる。
サイトが http://hogehoge.com なら、 hogehoge.com という名前のバケットと、 www.hogehoge.com という名前のバケットを作成する。

#### hogehoge.com

* Static website hosting設定で「このバケットを使用してウェブサイトをホストする」を選択
* このバケットにHTMLファイル等の一式を配置する（後述）
* アクセス権限にパブリックの読み取り権限（オブジェクトのリスト化）を付与する。
* パケットポリシーエディタで、下記を入力（ドメインはサイトごとに変更を忘れずに）

```json
{
  "Version":"2012-10-17",
  "Statement":[{
	"Sid":"PublicReadGetObject",
        "Effect":"Allow",
	  "Principal": "*",
      "Action":["s3:GetObject"],
      "Resource":["arn:aws:s3:::hogehoge.com/*"
      ]
    }
  ]
}
```

#### www.hogehoge.com

* Static website hosting設定で、「リクエストをリダイレクトする」を選択し、ドメインに「 hogehoge.com 」を入力し保存
* アクセス権限にパブリックの読み取り権限（オブジェクトのリスト化）を付与する。

### ファイルのアップロード

AWS CLIを使うのが手っ取り早いと思う。インストール方法はここでは書かない。

初めて使うときは、AWSでIAMユーザーを作成し、アクセスキーと秘密キーを```aws configure```コマンドで登録しておく。

該当のフォルダで同期コマンドを実行すると、一発でファイルが全てアップロードされる。

それも面倒なら一発実行リリース用のバッチファイル作っちゃうといいかも。

```shell
cd (別途作成したHTMLファイルのindexのあるフォルダへ)
aws s3 sync . s3://hogehoge.com/ --include "*" --acl public-read --cache-control "max-age=3600"
```

ここで、Static website hostingの設定にある、エンドポイントのURLに接続して、表示を確認しておく。

### Route 53の設定

1. ホスティングゾーンを作成
2. レコードセットを作成、hogehoge.com Aレコード、Aliasを選択してターゲットにS3なんちゃらってのが1つだけあるのでそれを選択。
3. レコードセットを作成 www.hogehoge.com 同上
4. NSレコードのValueにかかれているネームサーバーを、お名前.comのネームサーバー設定にコピペし、更新するとサイト公開。

お名前の方でDNS設定が他にある場合、それをコピーするそうな。ちなみにうちはなんにもしてなかった。


### その他役立つこと

#### DNSキャッシュクリア
ネームサーバを更新したあと、旧サイトが表示される場合は、キャッシュをクリアする。
Windowsならコマンドプロンプトで、

```shell
ipconfig /flushdns
```
VS Code1.23の新機能 - 検索ビューの検索結果のコピー機能

# Visual Studio Code 1.23の新機能
## 検索ビューの検索結果のコピー機能

https://code.visualstudio.com/updates/v1_23#_copy-results-from-search-context-menu

検索ビューの検索結果をコピーする機能が追加された。

![search_view.gif](https://qiita-image-store.s3.amazonaws.com/0/181011/a8431547-0373-9cb9-f1fa-a9239f6af019.gif)

- 検索結果を右クリックするとコンテキストメニューから「コピー」「パスのコピー」「すべてコピー」が選べる（「パスのコピー」はファイル名の行のみ）。
- ファイル名を選択して「コピー」すると、そのファイル内の検索結果すべてをコピーする。個々の検索結果を「コピー」するとその行のみコピーされる。
- 検索結果のコピー時に、一致箇所の行番号、カラム番号も付加される。
- 「パスのコピー」はフルパスがコピーされる。
- 「すべてコピー」は選択行に関係なく、検索結果すべてがコピーされる。

これはなんか便利そう。