OmniAICreator/Qiita-1.07M huggingface dataset:
CentOS7 ネットワーク設定



# 概要
CentOS7のネットワーク設定は、CentOS6以前と設定方法やコマンドが変更されているので、設定手順を記録しておく。


# IPv6の無効化

以下の設定ファイルを修正し、IPv6を無効化する。

```bash:IPアドレスの確認
ip address show

<出力結果>
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 08:00:27:9d:b0:9e brd ff:ff:ff:ff:ff:ff
    inet 192.168.10.xx/24 brd 192.168.10.255 scope global enp0s3
       valid_lft forever preferred_lft forever
    inet6 2407:c800:531e:d200:a00:27ff:fe9d:b09e/64 scope global mngtmpaddr dynamic
       valid_lft 86387sec preferred_lft 86387sec
    inet6 fe80::a00:27ff:fe9d:b09e/64 scope link
       valid_lft forever preferred_lft forever
```

```bash:設定ファイルのバックアップ
sudo cp -piv /etc/sysctl.conf /etc/sysctl.conf.`date "+%Y%m%d"`

<出力結果>
`/etc/sysctl.conf' -> `/etc/sysctl.conf.YYYYMMDD`
```

以下の「IPv6 Disable」のように設定ファイルに追記する。

```text:/etc/sysctl.conf
# System default settings live in /usr/lib/sysctl.d/00-system.conf.
# To override those settings, enter new settings here, or in an /etc/sysctl.d/<name>.conf file
#
# For more information, see sysctl.conf(5) and sysctl.d(5).
### IPv6 Disable begin
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
### IPv6 Disable end
```

```bash:設定ファイルの反映
sudo sysctl -p

<出力結果>
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
```

以下のコマンドで、inet6の設定が消えていることを確認する。

```bash:IPアドレスの確認
ip address show

<出力結果>
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 08:00:27:9d:b0:9e brd ff:ff:ff:ff:ff:ff
    inet 192.168.10.xx/24 brd 192.168.10.255 scope global enp0s3
       valid_lft forever preferred_lft forever
```


# 次の手順
[CentOS7 パッケージ管理（yum）の設定](http://qiita.com/mattsun/items/9161be22ace84182ccad)

以上
Travis CIのbuild結果をSlackに通知する

# 前準備
- Travis CIで対象リポジトリを自動ビルドする
- Slackに通知先となるchannelを作る

# Travis CI設定
SlackのTravis CI integrationの`Setup Instructions`に従って進める。
一番簡単にやると

1. `Integration Settings`の`Post to Channel`に通知先channelを記載する
2. `.travis.yml`に以下を記載する

```yaml
notifications:
  slack: <team name>:<token>
```

tokenは`Integration Settings`の`Token`欄に記載されている。
ただ、このままだとpublicなリポジトリの場合はtokenが誰にでも見えてしまう。

```
Your integration token is semi-secret, but we recommend encrypting your credentials using the Travis command line client.
```

ということらしいので、以下の手順に従ってtokenを暗号化する。

Encryption keys - Travis CI
https://docs.travis-ci.com/user/encryption-keys/

travisのパッケージをインストール(ビルドに `ruby-dev`/`ruby-devel` が必要)

```console
$ sudo gem install travis
```

token暗号化付きコマンドを実行する:

```
travis encrypt "<Slack team name>:<Slack API token>" --add notifications.slack
```

```console
Building native extensions.  This could take a while...
ERROR:  Error installing travis:
        ERROR: Failed to build gem native extension.

    /usr/bin/ruby2.1 extconf.rb
mkmf.rb can't find header files for ruby at /usr/lib/ruby/include/ruby.h

extconf failed, exit code 1
```

ヘッダが無いと怒られたのでインストール。

```
$ sudo apt install ruby-dev
```

再実行し成功すると`.travis.yml`に以下のSlack通知項目が追記される:

```
notifications:
  slack:
    secure: 
        XXX/XXX...
```

リポジトリの情報を見ているようなので、各リポジトリで個別に実行する必要あり

最後に対象リポジトリに`.travis.yml`をコミットする。


# 通知結果
正しく通知設定がされている状態でビルドが成功すると↓のようにSlackチャンネルに通知してくれる:

![slack_travisci_ss.PNG](https://qiita-image-store.s3.amazonaws.com/0/107537/a96c7db2-5bc7-9c4a-a70f-d6215cfeb65a.png)
【Vimperator】GitHubからgit cloneするコマンド:GitCloneを作った

「Clone or download」をポチって、コピーして、`git clone コピペ`するのが面倒なので、Vimpertorで`:GitClone`と打てばブラウザで今見ているリポジトリを`git clone`できるコマンドを作った。
環境はMacを想定。

「Clone or download」に書いてあるURLを取得する関数を書く。

```javascript:.vimperatorrc
javascript <<EOT
function getGHUrl() {
  var input = content.document.querySelector('input.input-mini.input-monospace.js-url-field.js-zeroclipboard-target') || content.document.querySelector('input.form-control.input-monospace.input-sm.js-zeroclipboard-target.js-url-field');
  return input.value;
}
EOT
```

現状のGitHubでも、更新が遅いGitHub Enterpriseで対応できるように、querySelectorを書いておく。

後は、コマンドを書く。

```vim:.vimperatorrc
command! -nargs=0 -description="git clone" GitClone js io.system('(output=$((test -d ~/git || mkdir ~/git) && cd ~/git && git clone ' + getGHUrl() + ' 2>&1) && osascript -e "display notification \\\"$output\\\" with title \\\"Vimperator\\\"") &')
```

~/git以下にgit cloneする設定。git cloneが終わったら出力を通知する。ブラウザが固まらない様に全体を()で囲み、&を付けてバックグラウンドで実行している。
`:GitClone`で実行する。

自分は[ghq](https://github.com/motemen/ghq)を使っているので、`:Ghq`というコマンドも作っておく。

```vim:.vimperatorrc
command! -nargs=0 -description="ghq" Ghq js io.system('(output=$(~/bin/ghq get ' + getGHUrl() + ' | /usr/local/bin/gsed -r "s/\\x1B\\[([0-9]{1,3}(;[0-9]{1,3})*)?[mK]//g") && osascript -e "display notification \\\"$output\\\" with title \\\"Vimperator\\\"") &')
```

ghqは`~/bin/ghq`とする。ghqの出力はカラーなので、そのシーケンスを

```
/usr/local/bin/gsed -r "s/\\x1B\\[([0-9]{1,3}(;[0-9]{1,3})*)?[mK]//g"
```

の部分でとっている。Macに標準で入っているsedは拡張正規表現を使う`-r`オプションがないので、`brew install gnu-sed`で入れておく。

## 関連

- [pecoる - Qiita#ghqでpecoる](http://qiita.com/tmsanrinsha/items/72cebab6cd448704e366#ghq%E3%81%A7peco%E3%82%8B)
Spring Boot 1.4でThymeleaf 3.0系を使うための設定方法

Spring BootでThymeleafを使おうと思うとデフォルトではThymeleaf 2.1系が使われますが、Spring Boot 1.4からは、Thymeleaf 3.0系もサポートされ自動コンフィギュレーションされます。

# Thymeleaf 3.0系の適用方法

[Spring Bootの公式サイト](http://docs.spring.io/spring-boot/docs/1.4.0.RELEASE/reference/htmlsingle/#howto-use-thymeleaf-3)で紹介されている通り・・・・

* Thymeleaf本体 + (Thymeleaf Spring)
* Thymeleaf Layout Dialect
* Spring Security Dialect （※利用する場合のみ）
* Data Attribute Dialect （※利用する場合のみ）
* Java 8 Time API Dialect （※利用する場合のみ）

のバージョン管理用のプロパティ値を変更するだけです。以下は、投稿時点(2016/8/11)の最新バージョンを利用する際のプロパティ値の設定例です。

```xml:pom.xml
<properties>
    <!-- ... -->
    <thymeleaf.version>3.0.1.RELEASE</thymeleaf.version>
    <thymeleaf-layout-dialect.version>2.0.1</thymeleaf-layout-dialect.version>
    <thymeleaf-extras-springsecurity4.version>3.0.0.RELEASE</thymeleaf-extras-springsecurity4.version>
    <thymeleaf-extras-data-attribute.version>2.0.1</thymeleaf-extras-data-attribute.version>
    <thymeleaf-extras-java8time.version>3.0.0.RELEASE</thymeleaf-extras-java8time.version>
</properties>

```

# Thymeleaf 3.0を適用してSpring Bootを起動してみると・・・

以下のようなWARNログがでます :sweat_smile: 

```text:コンソール
...
2016-08-11 11:21:11.924  WARN 56624 --- [  restartedMain] org.thymeleaf.templatemode.TemplateMode  : [THYMELEAF][restartedMain] Template Mode 'HTML5' is deprecated. Using Template Mode 'HTML' instead.
...
```

これは、Spring BootのデフォルトがHTML5になっているためです・・・（Spring BootのデフォはあくまでThymeleaf 2.1系なので・・・）

# テンプレートモードをHTMLにする

Thymeleaf 3.0系では"HTML5"というモードが非推奨ということなので、ログメッセージどおり推奨の"HTML"に変更しましょう。テンプレートモードを変更する場合は、以下のような設定を加えるだけです :v: 

```properties:src/main/resources/application.properties
spring.thymeleaf.mode=HTML
```

> **Note: HTML5自体が非推奨というわけではない**
>
> あくまで"HTML5"というモードが非推奨になっただけで、HTML5が非推奨というわけではないので誤解しないでくださいね :sweat_smile: 
> http://www.thymeleaf.org/doc/articles/thymeleaf3migration.html#full-html5-markup-support

# まとめ

Thymeleaf 3.0系では、テンプレートを記載するマークアップ言語としてXHTMLじゃない普通のHTMLが利用できるようになったり、HTML系以外のモード(TEXT、JAVASCRIPT、CSS、RAW)が追加されていたりします。また、大幅なパフォーマンス改善が行われたらしいので、Thymeleaf 2系から乗り換えることを検討した方がよさげです。

テンプレートモードとしてTEXT指定すると、テキストメールを送る時のテンプレートエンジンとしてThymeleafが使えるのかな？ FreeMarkerとかVelocityはもう不要！？（VelocityはSpring的に非推奨になったので使う気全くないけどw）

# 参考サイト

* http://masatoshitada.hatenadiary.jp/entry/2016/08/10/132137
* http://docs.spring.io/spring-boot/docs/1.4.0.RELEASE/reference/htmlsingle/#howto-use-thymeleaf-3
* http://www.thymeleaf.org/doc/articles/thymeleaf3migration.html
* https://github.com/spring-projects/spring-boot/tree/master/spring-boot-samples/spring-boot-sample-web-thymeleaf3
React移行メモ


Rails4アプリのjQueryフロントエンドをReact.jsに置き換えるリファクタ活動を始めたので、これまでの理解をメモ

## コードの臭い
- (jQueryによる)DOM操作・クラス操作の累積
- addしてremoveしてaddしてhide...本当に意図通り動いているのか、何か忘れてないか
- 特殊なDOM構成の存在を前提とした操作
- DOMがどこから操作されているのか不明

## 移行指針
- 問題の変換
    - 状態変化に伴うDOM操作の処理を自分で計算せず、すべて`render`に押し付ける
    - HTML差分計算・再描画に関する問題・思考を最小化し、stateの操作に集中することでビジネスロジックの整合性を確認する
- 双方向の思考を一応念頭に置く
    - ボトムアップ、コンポーネント指向（？）
        - 小さいコンポーネントを先に置き換えて、大きいコンポーネントでそれを使う
    - トップダウン、インターフェース指向（？）
        - 大きいコンポーネントを先に置き換えて、途中で出てきた再利用性の高い部分をどんどん別コンポーネントに分割する
- ついでにいろいろできそうだが、最小の工数で移行する

## 入り口
- どこから導入すべきか
- 修正の必要が発生したが、DOM操作がすでに溢れ、次の修正でバグが入りそうな箇所
    - DOM操作を追加・修正せざるを得ない箇所
    - API経由の遅延描画に置き換えたい箇所
- 壊れていないものを直そうとしない
    - もし静的解析で定量化できたら、複雑な箇所から置き換える

## 準備
- `gem 'react-rails'`
- Chromeプラグイン https://fb.me/react-devtools
![Screen Shot 2016-10-10 at 12.01.54 PM.png](https://qiita-image-store.s3.amazonaws.com/0/281/15b37532-5c2e-7e10-10b5-158c0bbeb6e9.png "Screen Shot 2016-10-10 at 12.01.54 PM.png")
	- React関連の詳細なエラーの確認がしやすくなる
	- Reactが生成しているDOMのstateなどの確認ができる

- Reactチュートリアルを読む
- このQiitaエントリがすごく参考になる
    - [react-railsを使ってReactのTutorialをやってみる](http://qiita.com/joe-re/items/96f12dda4a62470d1d7c)

## コンポーネント作成
以下、`React.Component`ベースでなく`React.createClass`でコンポーネントを作る前提。

- 置き換えたいDOM構造の現状を把握する
    - せっかくリファクタするのであれば必要十分な数のDOMになるのが理想

	- ここではとりあえず置き換えるのをゴールとして、既存のHTMLのコピペでJSXを構成する
- コンポーネント作る
    - `rails g react:component`
    - テンプレートで既にpartial使っているなら、感覚としては似ている。淡々とpartial単位でおきかえていくイメージ
- 一思いにブラウザでouter htmlをコピー、beautify https://ctrlq.org/beautifier/ とか
- `render`にhtmlをペーストする
- `class`となっているところを`className`にもれなく置き換える
- HTML内にstyleが記述されているところはひとまずinner styleに置き換える
- 一応、もとのslimなどと見比べて自分を納得させる

## コンポーネント修正
- `componentDidMount``getInitialState`などだいたい必要になるので書く
- レンダリング内容取得のAPIが必要になればそれも書く
- スクロール位置などのDOM属性を参照したくなったら`ref`を使う
- 必要に応じてJSのcallbackやclosureなどをうまく使って構造化する

## ハマりどころ
- 出現する条件がレアなDOMを見落として移行から漏れる
    - これを防ぐのがReact化の目的の一つだが、できればこのタイミングでもなんとかしたい
- `setState`は即座にstateを変更してくれるわけではない
    - 直前の`setState`でstateが変更された前提でstateへの参照をしているとハマる
    - `this.state`を参照する処理は最小限にするか、renderに押し込む？
- 何も考えずにReactコンポーネントとしてラップするとDOM階層が一つ増える
    - 子セレクタに依存するスタイル命名規則をつかっているとCSS/JSの挙動が変わる
    - たとえば、RSCSSを使わない
	    - もしくは階層に関する命名制約を外す
- `map`などで同じ要素を複数並べるときは`key`で一意性を保つようにする
    - 一意性が保たれていない場合、二つ目以降の要素が描画されない
- `render`内で`return`したくなったときは`return null`する

## 効果
- 人力DOM操作によるバグが減る
- データ取得の処理がコンポーネント自身にカプセル化される
	- アプリのどこでコンポーネントを呼び出してもだいたい正しく動く
- 共起するあらゆるDOMを同一コンポーネントのJSXでほぼ説明できる

## 宿題
- 荒療治でも案外素直に動くので、やり残していることがいっぱい
- 無駄なバリデーション
    - prop typesを使いたい人生
- mixin
    - たとえばrenderだけがちがう複数のコンポーネントをどう綺麗に実装すべきか
    - overrideしたい
    - デザインパターンをうまく使いたい
- redux
    - スタンダードになりつつあるようだが理解が追いついていないので保留
    - どのような問題が解決されるのか
    - どのような依存が発生するのか
- テスティング?
- `React.createClass`から`React.Component`ベースへの書き換え



## 葛藤
- DOM操作の複雑さがstate操作の複雑さへ保留される
    - とはいえ、単なるデータ構造の問題へ縮小している
- DOM構造やinline styleをJS内に書くことになる
    - 今まで守ってきたHTML/CSS/JSの分離とはなんだったのか
- サーバー > クライアント、クライアント > サーバのデータの流れが同じところで行われ、依然見通しが悪い
- comfort zoneからの巣立ち
    - CoffeeScriptで書きたかった
    - Slimで書きたかった


解決済の問題が多そう・Reactの恩恵を100%受けていなさそうなので、引き続き勉強する
Node.js+Express.js でformの中身がjsonで取得できない時

なぜかこうなった時は、

```
input.form-control(type="text",name="values[][customer_id]", placeholder="Customer ID")
input.form-control(type="text",name="values[][customer_name]", placeholder="Name")
input.form-control(type="text",name="values[][customer_email]", placeholder="email")
```

```
{"values[1][customer_id]":"a",
 "values[1][customer_name]":"b",
 "values[1][customer_email]":"c"}
```

ここが原因ぽかった。

```
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
```

falseをtrueにしたら解決。

```
{"values":[
 {"customer_id":"a",
  "customer_name":"b",
  "customer_email":"c"}
]}
```
直線位置調整 > Link > ミニリレー > G5V-2 > 定格電流 166.7mA for 3V

関連 http://qiita.com/7of9/items/0256996d9cf94fd2abc8
関連 http://qiita.com/7of9/items/6bcce4bf70154d89c4b5

S-12の駆動に関して1A出力のリレーでは安定して動作しなかった。
別途購入していた2A出力のリレーで試そうとした。

購入したものは以下のリレー
https://www.omron.co.jp/ecb/products/pdf/g5v_2.pdf

ESP8266のGPIO14で駆動しようとしたが、動作しなかった。

GPIO14でなくCR123A(3V)を直接与えるとリレーの動作音が聞こえる。

上記のデータシートp1に以下の記載がある。

> 定格
> 操作コイル
> 基準計 DC 3V 166.7 :定格電流(mA)

定格電流は170mAとして、動作するための必要な電流は何mAなのだろうか。
電流が足りていないような感じがする。

http://www.fa.omron.co.jp/guide/faq/detail/faq02234.html
> 定格電流: 定格電圧を加えた時に、コイルに流れる基準となる電流。

やはり3Vだと170mA程度の電流が流れる（必要）ということなのかもしれない。
このリレーはESP8266では扱えそうにない。
AHY121 (定格消費電力 200mW)に戻そう。
プロキシ環境と非プロキシ環境でEmacsのpackage.el設定を共有する

https://masutaka.net/chalow/2015-10-03-1.html
を参考にpackage.elの設定をinit.elに書いておくと、起動時に未インストールのパッケージを自動でインストールしてくれるので、init.elを複数環境で共有するときに便利。
でも、package.elはプロキシ設定をinit.elに書く必要がある。

Github等で管理しているinit.elをプロキシ環境（例えば会社）と非プロキシ環境（例えば自宅）で共通利用したい。

```..emacs.d/init.el
;; ロードパスの追加
(setq load-path (append
                 '("~/.emacs.d/private-conf")
                 load-path))

;; proxy設定
;; private-conf/myproxy.elがあるときだけプロキシ設定をロード
;; 第2引数のtをつけると、ファイルが存在しなくてもエラーにならない
(load "myproxy" t)

;; package.el関係
(require 'package)
(add-to-list 'package-archives '("melpa" . "http://melpa.org/packages/"))

(package-initialize)
(package-refresh-contents)

;; 追加したパッケージ
(package-install 'js2-mode)
(package-install 'helm)
(package-install 'company)
(package-install 'company-tern)
```

プロキシの設定は別ファイルに置く。
プロキシ環境ではファイルを配置。
非プロキシ環境ではファイルなし。

プロキシの設定方法。
http://yoshimov.com/tips/emacs-package-list-with-proxy/

プロキシ認証情報は\*scratch\*などで

```
(base64-encode-string "username:password")
```

して生成した文字列を、以下のbase64stringに設定する。

```..emacs.d/private-conf/myproxy.el
;; proxy
(setq url-proxy-services
      '(("http" . "proxy.example.com:8080")
        ("https" . "proxy.example.com:8080")))
(setq url-http-proxy-basic-auth-storage
      '(("proxy.example.com:8080" ("Proxy" . "base64string"))))
```
Ubuntu 16.04にLeapMotion導入

ちょっとめんどくさかったのでメモ

## 問題

[公式](https://developer.leapmotion.com/v2?id=skeletal-beta&platform=linux&version=2.3.1.31549)からもろもろをダウンロードして，debパッケージをインストールした．

```bash
$ cd PATH_TO_DOWNLOADED_FOLDER  
$ sudo dpkg -i Leap-2.3.1+31549-x64.deb
```

が，このとき自分の環境が下のようなエラーが出た．

```
Leap Motion installed under /usr/bin and /usr/sbin
Failed to start leapd.service: Unit leapd.service not found.
dpkg: パッケージ leap の処理中にエラーが発生しました (--install):
 サブプロセス インストール済みの post-installation スクリプト はエラー終了ステータス 5 を返しました
ureadahead (0.100.0-19) のトリガを処理しています ...
処理中にエラーが発生しました:
 leap
```

READMEをみてると```On Ubuntu the Leap Daemon should already be running.```と書いているので，LeapMotion挿したらdaemonが走ってほしいが，
```$ LeapControlPanel```で確認しても，Leapが実行されていない．
（＝LeapControlPanelのアイコンが緑になってくれない．Leap見ても赤外線でてない．でも緑ランプはついているので，電源は入っている状態．）

```$ sudo leapd```すればLeapMotionが実行されるが，daemonで動かそうと```$ sudo service leapd start```しても動かない．


## 方針

まぁインストールしたときのエラーで```Failed to start leapd.service: Unit leapd.service not found.```と言われているので，作ってやる．

## 手順
1.  serviceファイルを作る

    ```bash
    $ cd /lib/systemd/system
    $ sudo gedit leapd.service
    ```
1. 出てきたエディタで，下をコピペ

    ```
    [Unit]
    Description=LeapMotion Daemon
    After=syslog.target

    [Service]
    Type=simple
    ExecStart=/usr/sbin/leapd

    [Install]
    WantedBy=multi-user.target
    ```
1. リンクを貼って，認識させる

    ```bash
    $ sudo ln -s /lib/systemd/system/leapd.service /etc/systemd/system/leapd.service
    $ systemctl daemon-reload
    ```

これで，```$ sudo service leapd start```すればdaemonで動くようになる．

\# 自動で起動はしないが，そこはあきらめました...
\# ```/etc/init```にleapd.confがあるので動いてくれるんでないの...??

## 参考

https://community.leapmotion.com/t/leap-motion-sdk-fails-to-install-properly-on-ubuntu-15-04/2973

https://community.leapmotion.com/t/tip-ubuntu-systemd-and-leapd/2118
ターミナルのよく使うコマンド


##現在のディレクトリのファイルを表示
```
$ ls
```

##ディレクトリの移動
```
$ cd ディレクトリ名
```

##現在置のパスを表示
```
$ pwd
```

##ディレクトリを作成
```
$ mkdir ディレクトリ名
```

##空のファイルを作成
```
$ touch ファイル名
```

##ファイルのターミナルに表示
```
$ cat ファイル名
```

##ファイルへのテキスト記載
```
$ echo "記載内容" > ファイル名
```
ファイルがまだがない場合はエラーが返される。また、「>」でファイルへの記載を行うと前に記載された内容はすべて消されて新しく記載された内容のみとなってしまう。
記載されている内容に追記する場合は「>>」を使う

```
$ echo "記載内容" >> ファイル名
```

##ファイル・ディレクトリの削除
```
$ rm ファイル名
```
ディレクトリの削除も許可する場合は「-r」オプションをつける

```
$ rm -r ファイル名
```

##ファイル名の変更
```
mv 変更するファイル名 変更したいファイル名
```

##ファイルのコピー
```
cp コピーするファイル名 新しいファイル名
```
もしディレクトリをコピーする場合は
「-r」オプションをつける
```
cp -r コピーするファイル名 新しいファイル名
``

##ファイルの移動
```
mv 移動したいファイル名 移動後のディレクトリ
```


##viエディタの使い方
###viエディタの開始
```
//開始
$ vi
//ファイルを指定して開始
$ vi ファイル名
```

###コマンドモードと入力モード
コマンドモードでは文字入力ができない。入力モードのみで可能。
切り替えは・・

```
//カーソルの位置で入力モードに切り替え
i
//コマンドモードに切り替え
esc
```

##編集の保存と終了
escでコマンドモードに切り替えて実行する

```
//保存
:w
//名前をつけて保存（新しくファイルをつくる）
:w ファイル名
//終了
:q
//保存して終了
:wq
```
heroku Client APIを使ってherokuの環境コピーツールを作成した話

# コピー出来ない
Herokuの環境はコピーができない、ということにストレスを感じることが多々あったので、ツールを作ってみることにしました。
`heroku fork`だと細かいチューニングができないのと何がコピーされるのか前もって見れないので画面を作りました。
そのうちHerokuのダッシュボードに搭載されるのでは、という淡い期待もありつつ、様々なSIerさんなどの社内ではこういうツールは既にありそうだなーと思いつつ。

## 作ったものをご紹介
HAM
[https://hamumai.com/](https://hamumai.com/)

私は牛肉より豚肉が好きです。分厚いハムステーキが好きです。

### ログイン画面
ログイン自体は前回ご紹介した、[heroku OAuthを使ったログイン画面を作る](http://qiita.com/kuniken/items/c48853758ea8b6ec519f)の内容で実装しています。
<img width="1096" alt="スクリーンショット 2016-08-11 9.04.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/89819/cb7439fc-37ab-064f-208e-4bb51e6f50de.png">

### アプリ一覧
ログインすると、アプリ一覧に遷移します。
Organizationごとにアプリが表示されるようになっています。
dashboardボタンからはherokuの各アプリのdashboardに遷移するようになっています。
<img width="1096" alt="スクリーンショット 2016-08-11 10.31.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/89819/0b3a1084-7fef-6e3c-22ca-d1160d16fd73.png">

### コピー
各アプリのコピーボタンからどのような内容でコピーして作成するのかを指定します。
別の組織に作るとか、どのアドオンだけコピーするか、ということも指定できます。
環境変数はアドオン依存のものは設定できないようにしています。
（時間の都合でいろいろ実装機能を絞りました。今後実装予定。）
<img width="1102" alt="スクリーンショット 2016-08-11 10.36.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/89819/f4200d6c-3c88-4f3e-c0d2-4230da62bda1.png">

## 実装の概要
クライアント：reactjs（react-router、redux、superagent、react-bootstrap）
サーバー：nodejs(express)

API実装については、以下のモジュールを使用しました。

### node-heroku-client
herokuはダッシュボード上でポチポチ操作しなくても様々なことがプログラム上から行うことができます。
なぜならAPIが公開されているからです。
[Platform API Reference | Heroku Dev Center](https://devcenter.heroku.com/articles/platform-api-reference)

そんなAPIをnodejs上で簡単に実装できるモジュールも公開されています。
それが`node-heroku-client`です。

node-heroku-client
[https://github.com/heroku/node-heroku-client](https://github.com/heroku/node-heroku-client)

#### 使い方

##### インストール

```
$ npm install heroku-client --save
```

##### サンプルソース

機能も少ないので簡単な内容になってしまいますが、以下のように使います。

```js
var Heroku = require('heroku-client');

/**
 * アプリのリスト取得 'GET /apps'
 */
exports.getAppList = function(req, res, next){
  var accesstoken = req.user.accessToken;
  var client = new Heroku({ token: accesstoken });//ログインユーザーのアクセストークンを使用してデータを取得する。
  client.get('/apps')//getのほかにpostとかpatchとかメソッドが用意されている
  .then(function(apps){
    var result = [];
    apps.map(function(app){
      try{
        result.push({id: app.id, name: app.name, web_url: app.web_url});
      }catch(e){
        console.log(e);
      }
      return null;
    })
    return res.send(result);
  })
  .catch(function(err){
    return res.status(400).send(err);
  });
}
```

シンプルな内容になっており、使いやすかったです。あとはherokuさんのご機嫌が良ければ。。
直線位置調整 > ユニバーサル基板実装 / code v0.1

関連 http://qiita.com/7of9/items/0256996d9cf94fd2abc8

S-12を使用した直線位置調整装置。

以下の構成とした。

- 3V電池 : ESP8266用
- 1.5V電池 : S-12用
- 3Vリレー : 1.5Vの電池のON/OFF
  - AHY121 HYリレー ([HY1Z-3V](http://www3.panasonic.biz/ac/j/search_num/index.jsp?c=detail&part_no=AHY121))

### 基板実装

ユニバーサル基板で実装した。

写真左側の黒色直方体が3Vリレー (1A出力)。

![qiita.jpg](https://qiita-image-store.s3.amazonaws.com/0/32870/2418a9bf-1d6c-9370-8dc3-cbe027973b20.jpeg)

基板裏面の写真。
L型ピンヘッダを出すようにしている。このピンヘッダがS-12の電池用端子に接触することで、S-12自体を加工しなくても使えるという公算。

![qiita.jpg](https://qiita-image-store.s3.amazonaws.com/0/32870/b66fd508-2e95-76ed-9079-661e4413c8e4.jpeg)

S-12にマウントした状態。
4点ほどのpoint of contactがあるので、ある程度安定している。

![qiita.jpg](https://qiita-image-store.s3.amazonaws.com/0/32870/85930049-8308-5f07-d364-73ae2680dff1.jpeg)


L型ピンヘッダの接触の様子。
写真右側がプラス端子。左側がマイナス端子。
この両端に1.5Vかかるのは、リレーがONの時。

![qiita.jpg](https://qiita-image-store.s3.amazonaws.com/0/32870/8c9e607b-cb76-16ef-d51f-352398d10b4c.jpeg)

### code v0.1

GPIO14をリレーのON/OFF用ピンとした。
コードは以下のものを用意した。

```c:esp8266_160811_s12position.ino
#include <ESP8266WiFi.h>

/*
 * 
 * v0.1 2016 Jul. 11
 *   - handle relay pin
 *   - add loop()
 *   - add setup()

 */

static const int kRelayPin = 14;

void setup() {
  WiFi.disconnect();
  Serial.begin(115200);

  pinMode(kRelayPin, OUTPUT);
  digitalWrite(kRelayPin, LOW);
}

void loop() {
  char szbuf[] = "hello";

  Serial.println(szbuf);

  digitalWrite(kRelayPin, HIGH);
  delay(300); // msec
  digitalWrite(kRelayPin, LOW);
  
  delay(3000);
}
```

### 動作

Analog Discovery 2では1.5Vの電圧がL型ピンヘッダの両端に定期的にかかっている。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/d1dfaec8-3c76-7071-50b2-78596319fc4b.png)


S-12で試したが、安定してギアが回転しない。少し配置を変えるとギアが回り出したが、その状態では基板が安定設置していない。

L型ピンヘッダの接触部分を適正にし、かつ基板が安定設置するように工夫しないといけない。

あとは1A用のリレーで本当に問題ないかが要検討かもしれない。

### S-12の加工について

一番安定しているのはS-12自体をはんだ加工してしまうことだろう。
でも、そうするとS-12に何かあった時点でメーカー修理ができなくなる。

例として、60cmほどのテーブル上で直線レールで試験走行して、うっかりテーブルから落として、連結部分を割ってしまった、というような場合。。。

![qiita.jpg](https://qiita-image-store.s3.amazonaws.com/0/32870/5ea42fe1-67d4-ae32-7f76-346ae60ea4d7.jpeg)

### 負荷

S-12の電池端子にL型ピンヘッダが接触した状態で、1.5Vの電圧の波形を見てみた。

まともに出力されていない。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/3adb6674-0f22-51c4-d13f-bd2442cfcafb.png)

電池を単3から単2に変更してみたが、上記と同じ波形となった。

リレーの選定のやりなおしが必要そう。
あるいは設計の根本からの変更が必要かもしれない。
shell入力中に打ち間違えた内容を一気に消去する方法


## 消去する方法
shell入力中にたくさん打ち間違えてしまったら`ctrl + c`を押すと一気に入力文字が消去出来る

## 環境
- windows10
- teraterm

## まとめ
今までは`delete`で必死に消していました。知ってる人は常識なのかもしれないけど、今更、気付いた感動があったので共有しておきたいと思います！
[Swift]KingFisherで画像URLから画像データをダウンロード


`KingFisher`を利用して、画像URLから画像データ（UIImage型やNSData型）をダウンロードする方法

```swift
var images = [UIImage]
var datas = [NSData]

let kf = KingfisherManager.sharedManager.downloader

for file in files {
  kf.downloadImageWithURL(NSURL(string: file.url!)!,
      progressBlock:nil,
      completionHandler: { (image, error, imageURL, originalData) -> () in
        images.append(image)
        datas.append(originalData)
  })
}
```

　
ちなみに、下記のように`UIImageView.kf_setImageWithURL`で`completionHandler`からコールバックする方法では、一度`UIImageView`で画像表示され、メモリにキャッシュされた場合のみ、`completionHandler`が実行されるみたいで、一度も表示されていない画像については`completionHandler`で画像データを扱うことができないので注意。（結構ハマった）

```swift
imageView.kf_setImageWithURL(NSURL(string: "your_image_url")!,
   placeholderImage: nil,
        optionsInfo: nil,
      progressBlock: { (receivedSize, totalSize) -> () in
        print("Download Progress: \(receivedSize)/\(totalSize)")
      },
  completionHandler: { (image, error, cacheType, imageURL) -> () in
    // ★１回表示した画像のみ実行される！
    print("Downloaded and set!")
  }
)
```


## 参考
https://github.com/onevcat/Kingfisher/issues/227
https://github.com/onevcat/Kingfisher/issues/94
[Kingfisher Reference ](http://cocoadocs.org/docsets/Kingfisher/2.4.2/)
日本語キーボードでのバインドがおかしい => Keyboard-localizationを使う【Atom Editor】

タイトルがほぼ全て。メモ的投稿。

普段Macを使っていると気づきにくいが、Windowsマシンの日本語105/108キーボードでAtomを使うと、一部のキーバインディングが何やら想定通り動作しないことに気づく。

私がエンカウントしたのは以下。Language-markdownパッケージのキーバインド。

- `*`または`shift-*`
- `_`または`shift-_`

`ctrl-.`を押してキーリゾルバを起動した状態で該当するストロークを打ってみると、

```
* -> : (shiftなしと同じ)
_ -> â
```

こうなった。どうやらキーレイアウトが誤認識されている模様。

ということで調べたところ、大本としてはChromiumにバグがあり、外国語キーボードのレイアウトがやはり正しく認識されていない様子。

今のところ未解決なので、[Keyboard-localization](https://atom.io/packages/keyboard-localization)パッケージを入れて該当キーボードレイアウトを選択すると、だいたい正しくなる。

日本語の場合は`ja_JP`を選択してから、キーリゾルバを起動して確かめると、

```
* -> shift+*
_ -> shift+_
```

OKのようだ。Language-markdownも`shift+`つきでマップしなおせば正しく動くようになった。
Pythonでローソク足チャートの表示（Plotly編）

[Pythonでローソク足チャートの表示（matplotlib編）](http://qiita.com/toyolab/items/1b5d11b5d376bd542022)
の続きです。

[Plotly](https://plot.ly/)は、Python専用のパッケージというわけではなく、RやMatlab、JavaScriptなどにも対応しています。オンラインモードだとアカウントを作る必要がありますが、オフラインで使う場合、特にアカウント作る必要はありません。以下はオフラインでの説明です。

# 準備

PlotlyのPythonパッケージのインストールは、[このページ](https://plot.ly/python/getting-started/)にあるように

````bash
$ pip install plotly
````
でOKです。

では、[前回の記事](http://qiita.com/toyolab/items/1b5d11b5d376bd542022)と同様、架空の４本値データを作っておきます。ただし、今回は１年分のデータとします。

````py
import numpy as np
import pandas as pd

idx = pd.date_range('2015/01/01', '2015/12/31 23:59', freq='T')
dn = np.random.randint(2, size=len(idx))*2-1
rnd_walk = np.cumprod(np.exp(dn*0.0002))*100
df = pd.Series(rnd_walk, index=idx).resample('B').ohlc()
````

# Plotlyを使ったローソク足チャート

参考にしたページはこちらです。
[Candlestick Charts in Python](https://plot.ly/python/candlestick-charts/)

まずは、標準の設定のままローソク足チャートを表示させます。

````py
from plotly.offline import init_notebook_mode, iplot
from plotly.tools import FigureFactory as FF

init_notebook_mode(connected=True) # Jupyter notebook用設定

fig = FF.create_candlestick(df.open, df.high, df.low, df.close, dates=df.index)

iplot(fig)
````
`create_candlestick`の引数にOpenデータ、Highデータ、Lowデータ、Closeデータ、日時データを渡すだけです。

こんな感じのチャートになります。

![newplot.png](https://qiita-image-store.s3.amazonaws.com/0/131169/368371e4-d448-9dab-5e4b-c3068c3be529.png)

実際にはチャートのズームやパンが自由にできるので、下のように拡大表示させることもできます。

![newplot.png](https://qiita-image-store.s3.amazonaws.com/0/131169/a2b440a5-2466-ceca-f8e2-e7a9b6e7b49e.png)

# 営業日のみのローソク足チャート

Plotlyのチャートはインタラクティブチャートでとても便利なのですが、やはり、そのままでは土日のスペースができてしまい、営業日で連続していません。
そこで、営業日のみが連続するようにx軸データを細工します。やり方はmatplotlibの場合と同じです。`create_candlestick`の引数`dates`を省略すると、x軸のデータは整数インデックスとなります。なので、x軸の目盛としてインデックスに対応する日時データを表示させます。

````py
fig = FF.create_candlestick(df.open, df.high, df.low, df.close)

xtick0 = (5-df.index[0].weekday())%5 #最初の月曜日のインデックス
fig['layout'].update({
    'xaxis':{
        'showgrid': True,
        'ticktext': [x.strftime('%Y-%m-%d') for x in df.index][xtick0::5],
        'tickvals': np.arange(xtick0,len(df),5)
    }
})

iplot(fig)
````

これで表示させたチャートは以下のようになります。

![newplot.png](https://qiita-image-store.s3.amazonaws.com/0/131169/58f9a5d9-e13c-c675-3cb6-1fe1d1878612.png)

x軸の目盛が１週間間隔で表示されるのでちょっと細かいですが、拡大すると見やすくなります。

![newplot.png](https://qiita-image-store.s3.amazonaws.com/0/131169/481d8d60-1011-be3d-cebb-1405043c458d.png)

これで営業日のみのローソク足チャートとなっていることがわかります。
R言語 - Chord diagram を描画する

# はじめに

本 Tips では、データ間の相関の可視化手法の一つである、Chord diagram を描画する手法をご紹介します。描画には、"chorddiag" パッケージを使用します。

# 本Tipsで使用するデータ
以下のデータを、ファイル名 "yamate-line.txt" で、作業ディレクトリ配下に保存します。データは、山手線の駅間の所要時間です。

```R:サンプルデータ
品川 目黒 渋谷 原宿 新宿 高田馬場 池袋 巣鴨 田端 日暮里 上野 秋葉原 東京 新橋
品川 0 7 12 14 18 22 25 28 24 21 17 14 10 7
目黒 7 0 5 7 11 15 18 23 31 28 24 21 17 14
渋谷 12 5 0 2 6 10 13 18 22 25 29 26 22 19
原宿 14 7 2 0 4 8 11 16 20 23 27 28 24 21
新宿 18 11 6 4 0 4 7 12 16 19 23 26 28 25
高田馬場 22 15 10 8 4 0 3 8 12 15 19 22 26 29
池袋 25 18 13 11 7 3 0 5 9 12 16 19 23 26
巣鴨 28 23 18 16 12 8 5 0 4 7 11 14 18 21
田端 24 31 22 20 16 12 9 4 0 3 7 10 14 17
日暮里 21 28 25 23 19 15 12 7 3 0 4 7 11 14
上野 17 24 29 27 23 19 16 11 7 4 0 3 7 10
秋葉原 14 21 26 28 26 22 19 14 10 7 3 0 4 7
東京 10 17 22 24 28 26 23 18 14 11 7 4 0 3
新橋 7 14 19 21 25 29 26 21 17 14 10 7 3 0
```

# Chord diagram を描画する

▼サンプルスクリプト

```R:R
# 環境情報
# R version 3.2.5 (2016-04-14) - Very, Very Secure Dishes
# 作業ディレクトリの指定
setwd( "working_dir" )

# 必要に応じて、パッケージをインストール
install.packages( "RColorBrewer" )
install.packages( "devtools" )
install_github( "mattflor/chorddiag" )

# ライブラリの読み込み
library( RColorBrewer )
library( devtools )
library( chorddiag )

# データの読み込み
yamate-line <- as.matrix(read.table('yamate-line.txt', header=T, row.names=1))

# Chord diagram を描画する
groupColors <- brewer.pal(14, "Set3")
chorddiag(yamate-line, groupColors = groupColors, groupnamePadding = 20)
```

# 実行結果
![image](https://qiita-image-store.s3.amazonaws.com/0/106773/2b199e98-69d8-ea8f-5903-50097806a43b.png)


# リファレンス
https://github.com/mattflor/chorddiag
http://data-steve.github.io/d3-r-chord-diagram-of-white-house-petitions-data/
Docker + Chef で本物の Hello World!

Chef(正確には chef-zero + knife-zero) で、本当に短い Hello World! 的なものを作ってみた。

## 前提
[Chef 動作確認用 Docker イメージ](http://qiita.com/mdew150/items/978b3d65f3879201cc15)を使う。

## Docker コンテナ起動
### Chef ワークステーション(構成管理する側）
```
$ docker run -it --name chef_ws ubuntu_chef
```
### Chef ノード(構成管理される側）
```
$ docker run -it --name chef_node ubuntu_chef
# service ssh start
# ifconfig eth0
=> IP アドレスを取得（例:173.17.0.3)
```

## 準備するファイル

chef_ws コンテナの適当なディレクトリに置く。

```sh:hello.sh
mkdir -p hello
cd hello

echo 'local_mode true' > ./knife.rb

mkdir -p ./cookbooks/hello/recipes
cat > ./cookbooks/hello/recipes/default.rb <<END
file '/tmp/hello.txt' do
  content "Hello World!\n"
end
END

knife zero bootstrap 172.17.0.3 -x root --overwrite
node=`knife node list`
knife node run_list add $node hello
knife zero converge name:$node --attribute ipaddress -x root
```

### Chef 実行
chef_ws で、

```
# ls
hello.sh
# sh hello.sh
```

### 結果確認
chef_node で、

```
# cat /tmp/hello.txt
Hello World!
```
GitでSSH秘密鍵の設定方法[Windows]

# はじめに
たまに設定する必要があるが、よく忘れるのでメモ

# 指定方法一覧

## Git for Windows (Git Bash)

 - 秘密鍵形式：OpenSSH形式

 - 秘密鍵を格納する場所：

```
// %userprofile% = ユーザのホームフォルダ
%userprofile%\.ssh\id_rsa
```

## TortoiseGit

 - 秘密鍵形式：PPK形式
 - 秘密鍵配置場所：自由
 - 配置場所指定方法：

```
TortoiseGit > Settings > Git >Remote > [リモートリポジトリ名] > PUtty Key 

// or

.git\configで
remote.origin.puttykeyfile=[配置パス]
```
ECサイト運営に便利なMagentoのインストール

今日はMagentoを導入しました。
日本ではあまり普及していないらしいのですがECサイト用の便利なパッケージのようなものです。
今回も導入の手順と詰まったところの解決策のメモです。
(ver.2が公開されていますが今回使用するのはver.1.8なのでご了承ください)

###まずはダウンロードとインストール

[Magento公式サイト](https://www.magentocommerce.com/)

productから必要なバージョンをインストールするのですが、with sample dataとwith no sample dataバージョンがあります。
sample dataだけも置いてあるので必要に応じてどちらでも良いと思います。

※ダウンロードには新規登録が必要になりますので登録もしてくださいね。


###サンプルデータをインポートする
サンプルデータを含まない状態であった場合、または別のデータをデータベースに入れたい場合はデータベースへインポートが必要になります。
Terminalを使用しても良いですし、今回はphpMyAdminを使用しました。

![スクリーンショット 2016-08-10 15.45.20.png](https://qiita-image-store.s3.amazonaws.com/0/109034/8962e121-8154-6940-913a-eb2abffe6833.png)
適当なデータベースを選択した状態で、画像真ん中らへんにあるインポートを押してデータをインポート。


###XAMPP上で表示させる
[前回の投稿](http://qiita.com/M_amourr/items/c9c781c9ca9a6b84fbf7)でXAMPPを入れているのでデータベースやサーバーはこれを使用します。
ここからは`http://localhost`でXAMPPのトップに接続できる状態であることを前提にして書きます。

インストールしたmagentoフォルダはxamppのフォルダの下に移動させることで閲覧できます。
デフォルトの場所はMACなら`/Applications/XAMPP/xamppfiles/htdocs`の下です。


###インストール
`http://localhost/magento`に接続すると初回の利用規約の同意や設定が必要となるので適宜行えばインストールは完了です。
Go to BackendまたはGo to Frontendを選択して、管理画面や店舗画面を見ることができます。
RaspberryPi3のWiFi設定ファイルをSDに置いて起動時に読み込んで自動接続する


ヘッドレスでRaspberryPiを使うときにWiFiの設定するのにまずイーサネットやシリアルコンソールを繋がないといけないのが理不尽だし苦痛で仕方がないので、SDカードの`/boot`パーティション（vfatなのでWindowsでもMacでも読み書きできる）にWiFiのSSIDとWPAキーを書いたファイルを置いて、起動時にそれを読み込むようにしてみた。

MacでもWindowsでもSDカードさえ読み書きできれば設定できる（RPiいじってる時点でSD読み書きはできるはずだと思われる）。
ディスプレイもキーボードもsshもシリアルコンソールケーブルも必要ない。

## スクリプトと設定ファイル

__/etc/systemd/system/wpa_conf.service__

```systemd
[Unit]
Description=Read config file from SD then apply it
After=network.target

[Service]
ExecStart=/bin/sh /home/pi/wpa_conf/write_config.sh
Type=oneshot
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target
```

__/home/pi/wpa_conf/base_conf__

```
country=JP
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
```

__/home/pi/wpa_conf/write_config.sh__

```sh
#!/bin/sh

WIFI_CONF=/boot/wifi.conf
WPA_SUPPLICANT_CONF=/etc/wpa_supplicant/wpa_supplicant.conf
SCRIPT_DIR=`dirname $0`
BASE_CONF=$SCRIPT_DIR/base_conf

cat $BASE_CONF > $WPA_SUPPLICANT_CONF

cat $WIFI_CONF |
grep -v '#' |
while read line; do
  wpa_passphrase $line >> $WPA_SUPPLICANT_CONF
done

sudo ifdown wlan0
sudo ifup wlan0
```

## 有効化

```bash
sudo systemctl enable wpa_conf.service
```

ここまでできたら、いったんRaspberryPiの電源を落とす。

## 使い方

`/boot`パーティションがFinder（Macの場合）やエクスプローラ（Windowsの場合）で`boot`という名前のSDカードとして認識されるはずなので、これを開く。

![スクリーンショット 2016-08-11 7.09.02.png](https://qiita-image-store.s3.amazonaws.com/0/26038/961f424e-7221-4727-f775-760854264d50.png "スクリーンショット 2016-08-11 7.09.02.png")

`wifi.conf`をテキストエディタで開いて（無ければ新規作成する）、

```
SSID WPAキー
```

の形式で1行ずつ記述する。

![スクリーンショット 2016-08-11 7.12.00.png](https://qiita-image-store.s3.amazonaws.com/0/26038/a5395134-bdfb-c3e7-da9c-3e92c932f614.png "スクリーンショット 2016-08-11 7.12.00.png")

Mac/WindowsPCからSDカードを取り外してRPi3に挿して、電源を入れる。


## その他

- 言うまでもなくセキュリティを思うとあんまり良い方法とはいえない
  - けどご家庭のWPAキーとかどうせAPの筐体に貼ってあるシールに書いてあるだろ
- MacのテキストエディットとかWindowsのメモ帳で編集する前提なら`wifi.txt`みたいなファイル名にしといたほうがよかったか
- WiFi繋がったかどうか確認する手段がないのでどうにかしたい
GTX-1080搭載PCで、Ubuntu 16.04 LTS, CUDA-8.0RC インストール備忘録

# インストールした環境

・ Windows10 と Ubuntu 16.04 のデュアルブート環境
・ UEFI

# インストール作業で主に読ませて頂いたURL

http://qiita.com/hidenorly/items/a3eb3a0375e6703d163b
・ cudaは run ファイルでインストールしました

https://ja.unflf.com/dualboot-ubuntu-windows/
・ Windows の高速スタートアップを無効
・ isoファイルをUSBに書き込んで、インストール

# 作業ではまった時に参考にさせて頂いたURL

http://qiita.com/bohemian916/items/8c7f0c4b3d3ea0958559
・ quiet splash を nomodeset に、手で編集。人によっては不要らしい。

# その他ではまったこと
・ 私の環境は、ASUSのbiosだったのですが、bios の Secure boot を disable にしないと、GUIログインできませんでした。

# GPU 動作確認

```
$ nvidia-smi
```
を実行して、communication error などが出なければOKなようです。
私の場合は、CUIログインしても上記コマンドでエラーが出ていましたが、
ASUS bios の Secure boot を disableにすることで、解決できました。

# CUDNN インストールで読ませて頂いたURL

http://qiita.com/tetchi821/items/614ea4ceb4c193e14c6c
・ cuDNN v5.1 Library for Linux をダウンロード
Chef 動作確認用 Docker イメージ

Ubuntu をベースに Ruby 2.3.1 + chef(knife-zero) + openssh-server が入っている Docker イメージを作ってみた。例によって、sshd を走らせると、root のパスワードも公開鍵もなしでログインできる。

## 注意
これは、Chef 動作チェック専用のイメージであって、実運用を念頭に置いていない。セキュリティ関係の処理が簡略化されていることに注意すること。

## 準備するファイル

```file:Dockerfile
FROM ubuntu:trusty

ENV PATH /usr/local/rvm/bin:$PATH

RUN export DEBIAN_FRONTEND=noninteractive \
  && gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 \
  && apt-get update \
  && apt-get install -y curl \
  && \curl -L https://get.rvm.io | bash -s stable \
  && rvm install 2.3.1 \
  && bash --login -c 'rvm use 2.3.1 --default' \
  && echo "install: --no-document\nupdate: --no-document" > /etc/gemrc \
  && bash --login -c 'gem install bundler chef knife-zero berkshelf' \
  && apt-get install -y openssh-server \
  && passwd -d root

COPY sshd_config /etc/ssh/sshd_config

CMD ["bash", "--login"]
```

```file:sshd_config
PermitEmptyPasswords yes
PasswordAuthentication yes
UsePAM no
Subsystem sftp /usr/lib/openssh/sftp-server
```

## イメージ作成

```
$ ls
Dockerfile sshd_config
$ docker build -t ubuntu_chef .
```

## コンテナ実行

```
$ docker run -it ubuntu_chef
# service ssh start
# ifconfig eth0
=> IP アドレスを取得（例:173.17.0.2)
```

## 雑感

Dockerfile の作り方も若干慣れてきた。
次から sshd_config も Dockerfile に組み込んでしまおうかな？
ファイル一つで Docker イメージが作れるのは気持ちいいよね。

RUN コマンドの中で && を使うのは、必須なんだろうか？
レイヤーを減らして、最終的なイメージを小さくするのに役立つらしい。
ただ、実際ちょっと RUN を多用して同じイメージを作ってみたけど、そんなにイメージサイズは変わらなかったなあ(数％大きい程度）。Docker hub の Dockerfile はだいたい、RUN を一つにまとめているから、私もそれに倣ってこうしているわけだけど。

実は、knife-zero のクライアント側（構成管理される側）は sshd だけが条件で、Ruby はあらかじめインストールされている必要はないし、chef のワークステーション側（構成管理する側）は、ssh のクライアントだけあれば十分なはずなので、上の Docker イメージはちょっと冗長ではあるのだが。

sftp server は必要かどうかわからないがいちおう組み込んでみた。

## 後日談
あとで気がついたのだが、本家から [Chef Development Kit(ChefDK)]
(https://downloads.chef.io/chef-dk/ubuntu/) を落として使うのが今風らしい。あとで Docker イメージを作りなおすかも。ただ "Hello World!" する程度なら現状でも十分な気がする。
直線位置調整 > Link > 1cリレーのピン

関連 http://qiita.com/7of9/items/0256996d9cf94fd2abc8

以下のリレーを入手した。
http://www3.panasonic.biz/ac/j/search_num/index.jsp?c=detail&part_no=AHY121

> 定格制御容量（抵抗負荷）: 1A,30V DC

電流が微妙かもしれない。別途2A品も購入したが、2接点ものだ。

ピンの使い方を調べようとデータシートを見たりしたが、リレー入門者にはよく分からなかった。
http://www3.panasonic.biz/ac/j/dl/catalog/index.jsp?series_cd=1206&part_no=AHY121

分かりやすかったのは以下のページ。
[秋月リレー(Y14H-1C-5DS Y14H-1C-3DS)の使い方](https://yasjournal.wordpress.com/2013/12/30/%E7%A7%8B%E6%9C%88%E3%83%AA%E3%83%AC%E3%83%BCy14h-1c-5ds-y14h-1c-3ds%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9/)

L1とL2間に無極性で電圧をかけることで、IN1&IN2とOUT1が導通するようになる。L1,L2間の電圧がない場合は、IN1&IN2とOUT2が導通している。

データシートにNO(Normally Open)とNC(Normally Close)の記載があり、それと上記のblogの内容から理解した。

ブレッドボードで試して動作することを確認した。

1cリレーというのは1aと1bが両方あるもので、それぞれがNO,NCに相当する、というのも勉強になった。
技術英語 > This information is [invaluable] to the person who reads the exception message.

@ Code Complete (No. 6969 / 36077)

> This information is <font color=red>invaluable</font> to the person who reads the exception message.

http://ejje.weblio.jp/content/invaluable
> 評価できないほどの、非常に貴重な

http://ejje.weblio.jp/content/valuable
> 高価な、貴重な、大切な、貴重で、役立って、金銭的価値のある、価格を有する

valuableの前に否定の[in]がついて、「価値のない」と思えてしまうinvaluableだが、その意味は反対に「非常に貴重な」となる。

valuableを「金銭的価値を評価できる」とすると、否定の[in]がついて「金銭的価値を評価できない」から転じて「非常に貴重な」となる、とするとなんとなくではあるが覚えられるかもしれない。

<hr>
上記のCode Completeの文章の何がinvaluableかというと

> Include in the exception message all information that led to the exception.
XenServer 7.0 で PCI-Passthrough


# はじめに
基本的には[PCI Passthrough in Xenserver 7 “Dundee”](https://techblog.jeppson.org/2016/06/pci-passthrough-xenserver-7-dundee/)の補足というか、そんな感じです。
出てくる資料が少ない上に6系のが多かったので個人的なメモを兼ねて。


以下環境

* XenServer 7.0.0を仕様
    * XS7004適用済み
* sshでXenServerに接続して作業します
* 間違いとかツッコミ歓迎
* 自己責任でお願いします
* ~~オタクはすぐに鯖にWintermuteとかつける~~


# 目的のハードウェアを見つける

```bash
lspci
```

いろいろ出てくるだろうけれどgrepなりで目的のデバイスを引っ掛ける

```bash
# lspci | grep VGA
01:03.0 VGA compatible controller: Advanced Micro Devices, Inc. [AMD/ATI] ES1000 (rev 02)
```

**01:03.0** の部分があとで必要になるのでメモしておく
元の記事でB:D.fと読んでいるのでここでもそう呼びます。

# VMにパラメータを渡す
VMの一覧とUUID取得

```bash
xe vm-list
```

こんな感じでリストが取れるので必要なVMのUUIDをメモ
今回はWS2012R2を使ってみる

```bash
uuid ( RO)           : d436e5d4-964c-47b1-a8b7-657f6f1cb1e3
     name-label ( RW): Control domain on host: Wintermute
    power-state ( RO): running


uuid ( RO)           : 22eb15fb-169c-ec9b-0ad4-231dc7210376
     name-label ( RW): Windows Server 2012 R2
    power-state ( RO): running


uuid ( RO)           : 5bd4e662-5b08-bd5b-896f-bc39c1f4248c
     name-label ( RW): XOA 4.15 Free
    power-state ( RO): halted

```

パラメータをセット 以下が書式

```bash
xe vm-param-set other-config:pci=0/0000:[B:D.f] uuid=[対象のUUID]
```
実際に渡してみる

```bash
xe vm-param-set other-config:pci=0/0000:01:03.0 uuid=22eb15fb-169c-ec9b-0ad4-231dc7210376
```

正常に通ると何も帰ってこないのでパラメータを取得してみる

```bash
xe vm-param-list uuid=22eb15fb-169c-ec9b-0ad4-231dc7210376 | grep pci
```

いろいろ帰ってくるけどこんなのが書かれていればOK

```bash
other-config (MRW): vgpu_pci: ; pci-0/0000:01:03.0: ;
 ```
 
# PassthroughできるようにXenServerに手を入れる

 /boot/grub/grub.cfgに手を入れて上げる必要があるので適当なエディタで編集
 EFIな人は
 
 ```path
 /boot/efi/EFI/xenserver/grub.cfg
 ```
 
 らしいよ、うちはEFIで起動していないのでそんなファイルはなかった。
 
 ```bash
 vi /boot/grub/grub.cfg
 ```
 
 自分の立ち上げている環境のパラメータを編集
 まぁ他のはSafe Modeとか書かれてるし無印を使っている人が多いでしょう、多分。
 module2の場所に
 **xen-pciback.hide=(B:D.f)** を追記 複数ある場合は(B:D.f)を連続して書く
 
```text
 menuentry 'XenServer' {
        search --label --set root root-cafyeg
        multiboot2 /boot/xen.gz dom0_mem=2048M,max:2048M watchdog ucode=scan dom0_max_vcpus=8 crashkernel=128M@256M vga=mode-0x0311
        module2 /boot/vmlinuz-3.10-xen root=LABEL=root-cafyeg ro nolvm hpet=disable xencons=hvc console=hvc0 quiet vga=785 splash plymouth.ignore-serial-consoles xen-pciback.hide=(0e:00.0)(01:03.0)
        module2 /boot/initrd-3.10-xen.img
}
```
 
# XenServerの再起動
XenCenterからでもなんでもお好みの方法でXenServerを再起動
 
```bash
reboot
```
 
 再起動後VMを起動してPassthroughされていればOK されていなかったらパラメータの名前とかを要チェック
 
# Passthroughしたくなくなった時
 
```bash
xe vm-param-remove param-name=other-config param-key=pci uuid=[UUID]
```
 あとは追加時と同じように確認して消えてればOK
 
# おわり
今回オンボードなグラフィックチップをPassthroughさせたけど効果があるのかは謎、なぜなら元からWindowsに突っ込むと「Microsoft 基本ディスプレイ アダプター」と言われてしまうため。
ただまぁ、WS2012R2とか入れた時にCPUが常時50%食われている問題(レンダリング周りでソフトウェアが頑張ってた?)が解決されたのでまぁいいかといった感じ。XenCenterのコンソールはそのまま使えている。
chaliceでapp.py 見通し悪い問題にアナログに対応する

※ ミスって記事消してしまった。。。ので再投稿。

# chaliceやってるとapp.pyの見通しが悪い

chaliceは現状**app.py**ファイルしかサポートしておらず全ロジックを1ファイルに書かないといけないため、ちょっと規模が大きくなるとすぐに見通しが悪くなります。
それについてはissue( https://github.com/awslabs/chalice/issues/21 )も上がっていて、そう遠くない未来に何らかの対応がされるかと思います。

が、待てないので以下のような対応をしてみました。

## 対策

* modules ディレクトリを掘って、route単位で.pyファイルを置く
* config ディレクトリを掘って、共通の設定とかを置く
* build_app というシェルスクリプトを用意して、上記ファイル群をcatしたapp.pyを作る

## githubで公開しました
https://github.com/douhashi/chalice-template

## 感想

chaliceはシンプルでいいなぁ。
今後に期待。
Firefoxでファイルのダウンロード、日時の0埋めなど

```html:
<script>
function _fill_zero4(num) {
        return ('0000' + num).slice(-4);
}
function _fill_zero2(num) {
        return ('00' + num).slice(-2);
}
function _get_date() {
        var myTbl = new Array("日","月","火","水","木","金","土");
        var myD = new Date();
        var myYear = _fill_zero4(myD.getFullYear());
        var myMonth = _fill_zero2(myD.getMonth() + 1);
        var myDate = _fill_zero2(myD.getDate());
        var myDay = myD.getDay();
        var myHours = _fill_zero2(myD.getHours());
        var myMinutes = _fill_zero2(myD.getMinutes());
        //
        var ymd = myYear +""+ myMonth +""+ myDate;
        var w = myTbl[myDay];
        var Hi = myHours +""+ myMinutes;
        return ymd + w + Hi;
}

function _textarea_download() {
    var content = document.form1.textarea1.value;
    var blob = new Blob([ content ], { "type" : "text/plain" });
    var filename = _get_date() + ".txt";

/*
    if (window.navigator.msSaveBlob) { 
        window.navigator.msSaveBlob(blob, filename); 

        // msSaveOrOpenBlobの場合はファイルを保存せずに開ける
        window.navigator.msSaveOrOpenBlob(blob, filename); 
    } else {
*/        document.getElementById("download").href = window.URL.createObjectURL(blob);
//    }
}
</script>

<a id="download" href="#" download="download.txt" onclick="_textarea_download()">テキストエリアの中身をダウンロード</a>
```

* ファイル名指定はaタグのdownload="ファイル名"でのみ指定可能なのかな・・・
SwiftLintを使ってみた話1

#はじめに
SwiftLintを使ってみました。
今回は、インストールからプロジェクトに適応するまでの流れを備忘録としてまとめます。

#SwiftLintとは？
Swiftの静的解析ツールです。コードのチェックをして警告なりエラーなりを吐いてくれます。

ただ、チェック基準がなかなか厳しい。。
デフォルトの設定のままだと、プロジェクト作成したばかりの状態でもエラーや警告を20以上も吐かれます。

#まずはインストール
Homebrewでさくっとインストールしましょう!
(Homebrewのインストールについては割愛させていただきます。)

ターミナルで以下を入力するだけでSwiftLintをインストールできます。

`brew install swiftlint`

#Xcodeのプロジェクトに適応する
TARGETS -> Build Phasesで「+」を押して、New Run Script Phaseを選択します。

<img width="789" alt="スクリーンショット 2016-08-11 2.06.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/103695/f9d90faa-2387-761b-cf62-975ca6869103.png">

新しくRun Scriptが追加されるので、そこに以下のスクリプトを書くことでSwiftLintをプロジェクトに適応できます。
(参考: https://github.com/realm/SwiftLint#configuration)

```
if which swiftlint >/dev/null; then
swiftlint
else
echo "warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint"
fi
```

<img width="632" alt="スクリーンショット 2016-08-11 2.07.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/103695/24272c2a-2600-ed92-69fd-ecad7ceadfba.png">

#Buildしてみる
SwiftLintで解析されることを試すために
普段通りcommand + 「B」 でビルドしてみましょう。

プロジェクト作成して、コードは何も編集してない状態でビルドしたのですが。。
<img width="1255" alt="スクリーンショット 2016-08-11 2.08.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/103695/c2882ac3-d71b-b603-f003-87e8d1e07156.png">
AppDelegate.swiftの怒られ方がものすごいですね。
AppDelegate.swiftでは1行の文字数が多過ぎるということでいろんな箇所で怒られているようです。

<img width="1268" alt="スクリーンショット 2016-08-11 2.44.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/103695/df81a5d8-7a6e-9d0d-a343-aab4c2c4bee3.png">
ViewController.swiftでは、末尾の改行に違反があるとのこと。
末尾の改行が2行あったので1行だけにしたらこの警告は消えました!

#さいごに
今回はインストールして、Xcodeのプロジェクトに適応するところまでまとめました。
次回は、Configureファイルで静的解析の設定をカスタマイズしてみます。
簡単なMySQLクエリのメモ

XAMPPを使用しているのでまず`cd /Applications/XAMPP/xamppfiles/bin`に移動
この後、データベース作成の練習で使用したクエリをメモしていきます。


###データベースを作る
- `show databases;`
データベースの一覧を見ます。


- `use データベース名;`
show databases;で見られるデータベースの中で、選択したいもののところに移動します。


###テーブルを作る
- `create table テーブル名 ();`
()の中にはカンマ区切りでカラム名(半角スペース)型と記入します。
例はこのようになります。

```php:Query
create table table1(
               id int,
               name varchar(128)
             );
```

- `alter table テーブル名 modify カラム名 型;`  
テーブルを作る時に型の設定を間違えてしまった時の修正です。
間違えてしまったカラムの名前と、新しい型を書きます。  


###テーブルに中身を入れる
- `insert into テーブル名(id, name) values(数字, '文字');`
create tableで作ったテーブルに内容を1行ずつ挿入します。

- `select * from テーブル名;`
作成したテーブルの中身の確認です。

- `update テーブル名 set カラム名=新しい値 where 条件文;`
insertした内容が間違っていた時に使用します。


今回使用したのは以上です。
[Swift]AlamofireでArrayで囲まれたJSONデータをPOST送信


### 以下のような、Arrayで囲まれたJSONデータ

```json
[
    {
    	"name":"山田",
    	"email":"yamada@example.com"
    },
    {
    	"name":"高橋",
    	"email":"takahashi@example.com"
    }
]
```

### AlamofireでPOST送信

```swift
let users:[[String:AnyObject]] = [
    ["name":"山田","email":"yamada@example.com"],
    ["name":"高橋","email":"takahashi@example.com"]
]

let request = NSMutableURLRequest(URL: url)
request.HTTPMethod = "POST"
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
request.HTTPBody = try! NSJSONSerialization.dataWithJSONObject(users, options: [])

Alamofire.request(request)
    .responseJSON { response in
        switch response.result {
        case .Failure(_, let error):
            print(error)
        case .Success(let responseObject):
            print(responseObject)
        }
}
```

## 参考
[Sending json array via Alamofire](http://stackoverflow.com/questions/27026916/sending-json-array-via-alamofire)
Javaを学ぶ


# この文章は何か？

私がJavaを用いた開発において共同作業するに「よくわからん」と調べたことを記す。俺的チートシートとして用いる。随時更新する。

# Java 中間操作って何？

終端操作の対義語

## Stream API

コレクションを操作するAPIと手法、中間操作と終端操作があり、中間操作で都合のいいストリームに抽出・変換し、終端操作で文字通り最後の処理を行う。


http://qiita.com/potsunen/items/369dd3fcb9ccb8fcfa44


# スーパータイプ バウンド

`<? super クラス名>`

http://java.keicode.com/lang/generics-super-bounded.php


ワイルドカードとしてクエスチョンマーク (?)
`Box<? extends Person> bp`

# ラムダ式の書き方

http://www.atmarkit.co.jp/ait/articles/1403/17/news105.html

# 関数定義の throws 句がよくわからん

http://www.media.osaka-cu.ac.jp/~matsuura/2008-PP/Exception.html

> 上位のメソッドに投げる場合は，メソッドを定義するときに，「このメソッドがどのような例外を投げる可能性があるか」を宣言する必要があります．それは，throwsを使って次のように書きます．

> ただし，いちいち投げる可能性がある全ての例外を書くのは大変なので，RuntimeExceptionのサブクラス(RuntimeExceptionから継承されたクラスのこと)は特に throws で宣言しなくても良いことになっています．

## RuntimeException とは何か？

https://docs.oracle.com/javase/jp/8/docs/api/java/lang/RuntimeException.html

Effective Java 第二版 第9章例外 項目58 回復可能な状態はチェックされる例外を、プログラミングエラーには実行時例外を使用する

- チェックされる例外(checked exception)
- 実行時例外(runtime exception)
- エラー(error)

呼び出し側が適切に回復できるような状況に対してはチェックされる例外。そもそも規約を守れずに呼び出したなど、は runtime exception を投げて死ぬべきである。

つまり、致命的なもうどう動いても回復不能であろうとするのは RuntimeException を継承して作るべき。catchしてもらうこと前提なロジックは Exception を継承して作るべき。
ブラウザからExcelにコピペした結果の違いについて


Webシステムを開発しております。
「ブラウザに表示されている内容をExcelにも出力して欲しい」という要望を承りました。
しかし時間がかかりそうなので、「とりあえずはコピペでお願いします」とお客様に提案。
JavaScripで「コピペ対象の内容を範囲選択する」機能までは作り、コピペ操作(Ctrl+C, Ctrl+V)はお客様に実施していただく、ということで一件落着。
と思いきや、Excelに貼り付けた結果がブラウザごとに違うじゃありませんか。

そんな訳で、Excelにコピペした結果の違いをまとめてました。



# 調査の結果

### 調査環境
* Firefox 46
* Internet Explorer 11
* Chrome 52
* Windows7
* Excel2003

基本的なCSSを検証しました。


## CSS

| スタイルの指定方法 | Firefox | IE|Chrome|
|:-----------|:------------:|:------------:|:------------:|
|style属性|OK|OK|OK|
|`<style>`要素|NG|OK|OK|
|外部CSS|NG|OK|OK|

Firefoxはstyle属性で指定したスタイルしかコピペできませんでした。
この時点で、「Excelへのコピペ結果がブラウザと同じ」であることを期待しない方がよさそう。。。

以下、スタイルの確認はstyle属性で指定します。

## フォントのスタイル

```html
<span id="font-test" 
 style="font-weight:bold;font-size:48px;font-style:italic;text-decoration: underline;color:red;">
   font test
</span>
```



|項目 | CSS|Firefox | IE|Chrome|
|:----|:----|:------------:|:------------:|:------------:|
|太字|`font-weight:bold;`|OK|OK|OK|
|フォントサイズ|`font-size:48px;`|OK|OK|OK|
|イタリック体|`font-style:italic;`|OK|OK|OK|
|下線|`text-decoration: underline;`|OK|OK|OK|
|フォントの色|`color:red;`|OK|OK|OK|


問題なくコピペできました。
フォントサイズはピクセル数からポイントに変換されました。

## リンク要素

```html
<a href="sample.html">link test</a>
```

|項目 | Firefox | IE|Chrome|
|:-----------|:------------:|:------------:|:------------:|
|ハイパーリンク|OK|OK|OK|

# 画像要素

```html
<img src="sample.jpg" style="width:100px; height:100px;">
```

|項目 | CSS|Firefox | IE|Chrome|
|:----|:----|:------------:|:------------:|:------------:|
|画像表示|-|OK|OK|OK|
|幅|`width:100px;`|OK|OK|OK
|高さ|`height:100px;`|OK|OK|OK

画像はコピペできましたが、原寸大で表示されました。


## tableの罫線関係

```html
<table>
    <tr><td style="border:solid 1px;">1</td><td style="border:solid 3px;">Alice</td></tr>
    <tr><td style="border:double 1px;">2</td><td>Bob</td></tr>
</table>
```

|項目 | CSS|Firefox | IE|Chrome|
|:----|:----|:------------:|:------------:|:------------:|
|実線|`border:solid 1px`|OK|NG|OK|
|二重線|`border:double 1px`|OK|NG|OK
|線の太さ|`border:solid 3px`|OK|NG|OK

IEでは罫線はコピペできませんでした。


## tableのセル関係

```html
<table>
    <tr><td style="background-color:red;">1</td><td style="width:100px; text-align:center;">Alice</td></tr>
    <tr style="height:100px;"><td style="vertical-align:bottom;">2</td><td>Bob</td></tr>
</table>
```


|項目 | CSS|Firefox | IE|Chrome|
|:----|:----|:------------:|:------------:|:------------:|
|背景色|`background-color:red;`|OK|OK|OK|
|行揃え|`border:double 1px`|OK|OK|OK
|縦方向の位置揃え|`vertical-align:bottom;`|OK|OK|OK

## tableの非表示

```html
<table>
    <tr><td>1</td><td style="display:none;">Alice</td></tr>
    <tr style="display:none;"><td>2</td><td>Bob</td></tr>
</table>
```

|項目 | CSS|Firefox | IE|Chrome|
|:----|:----|:------------:|:------------:|:------------:|
|tr要素の非表示|`display:none;`|OK|NG|OK|
|td要素の非表示|`display:none;`|OK|NG|OK

IEでは非表示にしてもコピペできました。

# まとめ

|項目 |Firefox | IE|Chrome|
|:----|:------------:|:------------:|:------------:|
|style要素 or 外部CSS|NG|OK|OK|
|罫線|OK|NG|OK
|tr要素, td要素の非表示|OK|NG|OK


基本的にExcelで指定できるスタイルは、ブラウザからExcelにコピペできそうです。
ただIEで罫線がコピペできないこと、Firefoxで外部CSSのスタイルがコピペできないのは、注意が必要です。

「Excelへのコピペ結果がブラウザと同じ」であることを、期待しない方がいいですね。。。