OmniAICreator/Qiita-1.07M huggingface dataset:
SQLServerでxp_cmdshellがブロックされた時の対処法

xp_cmdshellのコマンドを有効にするまでの備忘録をまとめました。

# あらすじ
DBサーバの移行作業時に動作確認をしていたところ、エラーメッセージが表示されました。

```
SQL Server によって、コンポーネント 'xp_cmdshell' の プロシージャ 'sys.xp_cmdshell' に対するアクセスがブロックされました。
サーバーのセキュリティ構成で、このモジュールが OFF に設定されているためです。
システム管理者は sp_configure を使用して、'xp_cmdshell' の使用を有効にできます。
'xp_cmdshell' を有効にする手順の詳細については、SQL Server オンライン ブックの「セキュリティ構成」を参照してください。    
場所 System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection)
```

# sp_configureを使ってみる

コマンドで実行しました。

```
EXEC sp_configure ‘show advanced options’, 1;
RECONFIGURE;
EXEC sp_configure ‘xp_cmdshell’, 1;
RECONFIGURE;
```

これで有効にできました。
途中の「RECONFIGURE」を実行しないと下記のエラーメッセージが表示されることがあるため注意。

```
構成オプション 'xp_cmdshell' が存在しないか、詳細構成オプションの可能性があります。
```


# ファセットの設定を変更

コマンド実行以外の方法でもできました。

1. SQLServer Management Studioでサーバーを右クリックする。
2. メニューからファセットをクリックする。
3. ファセットのコンボボックスから「Server Security」を選択する。
4. 一番下のほうにある「XPCmdShellEnabled」をFalse→Trueに変更する。
5. OKボタンをクリックする。

![1.png](https://qiita-image-store.s3.amazonaws.com/0/183992/9d2ba8e0-e79b-0446-9249-b8375a899c11.png)


![2.png](https://qiita-image-store.s3.amazonaws.com/0/183992/36ae8115-e808-617e-ebf3-159e72ba53ca.png)


以上
フォネティックコードによるスペル説明

# コードの一例

| 文字 | 単語 | 読み方 | 発音 |
|:----:|-----|-------|-----|
|A| Alpha    |アルファ       |AL FAH|
|B| Bravo    |ブラボー       |BRAH VOH|
|C| Charlie  |チャーリー     |CHAR LEE|
|D| Delta    |デルタ         |DELL TAH|
|E| Echo     |エコー         |ECK OH|
|F| Fox-trot |フォクストロット|FOKS TROT|
|G| Golf     |ゴルフ         |GOLF|
|H| Hotel    |ホテル         |HOH TELL|
|I| India    |インディア     |IN DEE AH|
|J| Juliet   |ジュリエット   |JEW LEE ETT|
|K| Kilo     |キロ          |KEY LOH|
|L| Lima     |リマ          |LEE MAH|
|M| Mike     |マイク        |MIKE|
|N| November |ノベンバー    |NO VEM BER|
|O| Oscar    |オスカー      |OSS CAH|
|P| Papa     |パパ          |PAH PAH|
|Q| Quebec   |ケベック      |KEH BECK|
|R| Romeo    |ロメオ        |ROW ME OH|
|S| Sierra   |シエラ        |SEE AIR RAH|
|T| Tango    |タンゴ        |TANG OH|
|U| Uniform  |ユニフォーム   |YOU NEE FORM|
|V| Victor   |ビクター      |VIK TAH|
|W| Whisky   |ウィスキー    |WISS KEY|
|X| X-ray    |エックスレイ  |ECKS RAY|
|Y| Yankee   |ヤンキー      |YANG KEY|
|Z| Zulu     |ズール        |ZOO LOO|

# hoge と伝えたいとき
Hotel, Oscar	Golf	Echo
Javascript の try-catch 構文の例

jQuery プラグインを利用したなど、Javascript のエラーに悩まされることがある。
が、エラーが発動して止まってしまうのは避けたい。

エラーが発動する箇所がわかっている場合、try-catch 構文を利用する。

```javascript
try {
  // エラーの可能性のある処理  
  var nativeJSON = localStorage.setItem('xxxx',nativeJSON);  
} catch(e) {
  // エラー発生時の処理
  alert('ローカルストレージ対応のブラウザが必要です');  
} finally {
  // 必ず実行される処理  
} 
```

# 参考サイト
http://www.kaasan.info/archives/1727
StreamRelay.NET.exe で入力ダイアログで暗号鍵を与える

### StreamRelay.NET.exe で入力ダイアログで暗号鍵を与える

「EncryptCipherPasswordHexFromGUI」 (netstreamスキーム中)「DecryptCipherPasswordHexFromGUI」 (netstreamスキーム中)
「CipherPasswordFromGUI」 (netstreamスキーム中)
「EncryptCipherPasswordHexFromGUI」 (netstreamスキーム中)「DecryptCipherPasswordHexFromGUI」 (netstreamスキーム中)
「CipherPasswordHexFromGUI」 (netstreamスキーム中)


というオプションを指定すると、起動時に GUI の入力ダイアログが表示されて、そこに暗号鍵を与える事ができる。

![暗号鍵の入力を促す入力ダイアログ](http://rocketeer.dip.jp/sanaki/free/free119c.png)

### Windowsの右クリックメニュー

「Sample\Cipher.reg」にあるようなレジストリキーを用意すれば、下記のような右クリックメニューでファイルの暗号化/復号ができるようになる。

![右クリックメニュー](http://rocketeer.dip.jp/sanaki/free/free119b.png)

実際には「Sample\Cipher.reg」をテキストエディタでStreamRelay.NET.exe のパスを指定する必要があると思う。
(環境変数「PATH」に追加してあればいいけど)

また「Sample\Cipher.reg」を編集する事で、別の暗号アルゴリズム/モード/パディング/パスワード攪拌アルゴリズム/IV等、お好きなものに変更してもよいだろう。

黒い画面(コマンドプロンプト)が消えないのだけど、なんでだろう。
とりあえず適当なタイミングで手動で消せばよい

### StreamRelay.NET.exe で入力ダイアログでIVを与える

「-EncryptCipherIVFromGUI」
「-DecryptCipherIVFromGUI」
「-CipherIVFromGUI」
「-EncryptCipherIVHexFromGUI」
「-DecryptCipherIVHexFromGUI」
「-CipherIVHexFromGUI」

オプションをnetstreamスキームで与えればよい

---
### ファイル暗号化コマンドとしてのStreamRelay.NET.exe

[ファイル暗号化コマンドとしてのStreamRelay.NET.exe](https://qiita.com/tomoki0sanaki/items/f58ac77662b194cb562a)

---
### 目次へ戻る

[目次というか最初の一歩](http://qiita.com/tomoki0sanaki/items/85f20cbe18378e33cd6f)
[メモ]CSS プロパティ記述順の参考例

# 1. 表示や配置など「視覚整形モデル」に関するプロパティ

- display
- list-style**
   1. list-style-type
   2. list-style-image
   3. list-style-position
   4. marker-offset（CSS2.1勧告候補では削除）
 
- position**
 1. top
 2. right
 3. bottom
 4. left
 
- float
- clear
- z-index
 
# 2. ボックスモデルに関するプロパティ

- width**
 1. min-width
 2. max-width
 
- height**
 1. min-height
 2. max-height
 
- line-height
- vertical-align
- overflow
- clip
- visibility
- margin**
 1. margin-top
 2. margin-right
 3. margin-bottom
 4. margin-left
 
- padding**
 1. padding-top
 2. padding-right
 3. padding-bottom
 4. padding-left
 
- border**
 1. border-width
 2. border-top-width
 3. border-right-width
 4. border-bottom-width
 5. border-left-width
 6. border-color
 7. border-top-color
 8. border-right-color
 9. border-bottom-color
 10. border-left-color
 11. border-style
 12. border-top-style
 13. border-right-style
 14. border-bottom-style
 15. border-left-style
 16. border-top
 17. border-bottom
 18. border-right
 19. border-left
 20. border-radius

- box-shadow
- box-sizing
- transform

# 3. 背景と前景に関するプロパティ

- background**
 1. background-color
 2. background-image
 3. background-repeat
 4. background-attachment
 5. background-position
 
# 4. フォントとテキストに関するプロパティ

- color
- font**
 1. font-family
 2. font-style
 3. font-variant
 4. font-weight
 5. font-stretch
 6. font-size
 7. font-size-adjust（CSS2.1勧告候補では削除）
 
- text-indent
- text-decoration
- text-align
- vertical-align
- white-space
- other text**
 1. text-shadow（CSS2.1勧告候補では削除）
 2. letter-spacing
 3. word-spacing
 4. text-transform
 5. white-space
 
# 5. 表に関するプロパティ**
 1. caption-side
 2. table-layout
 3. border-collapse
 4. border-spacing
 5. empty-cells
 
# 6. 生成内容に関するプロパティ**
 
 1. content
 2. counter-increment
 3. counter-reset
 4. quotes
 
# 7. UIに関するプロパティ**
 
 1. outline
 2. outline-width
 3. outline-style
 4. outline-color
 5. cursor
 
# 8. 印刷に関するプロパティ**
 
 1. size
 2. marks
 3. page-break-before
 4. page-break-after
 5. page-break-inside
 6. page
 7. orphans
 8. widows
 
# 9. 音声に関するプロパティ**
 
 1. speak-header
 2. volume
 3. speak
 4. pause-before
 5. pause-after
 6. pause
 7. cue-before
 8. cue-after
 9. cue
 10. play-during
 11. azimuth
 12. elevation
 13. speech-rate
 14. voice-family
 15. pitch
 16. pitch-range
 17. stress
 18. richness
 19. speak-punctuation
 20. speak-numeral
 
# どこかのサイトを参考にしたのだけど・・・

どこだったか忘れてしまった・・・出展元どこだ・・・
$a == 'a' && $a == 'b' && $a == 'c'がtrueになるPerlスクリプト

タイトルから出落ち感タップリですが…

```perl
$a = 0;
say "yes" if $a == 'a' && $a == 'b' && $a == 'c';
```

Perlでは文字列に対して`==`演算子を使うと、数値に変換できない場合に`0`として比較されるので、`'a'`も`'b'`も`'c'`も`0`と評価されてしまいます。
文字列に対しては`eq`を使いましょうというのは基本ですが、いざ`==`を使うとどういう挙動をするかって意外と覚えてないので記事にしてみました。

# 元ネタに対する回答
## クロージャを使う方法

実は[元ネタ](https://qiita.com/Morichan/items/4894d7d92ecab7a3afd8)に対してクロージャを使った解法を考えたのですが、[より上位の解法](https://qiita.com/Morichan/items/cc4e426b5128fac4a61b)が出ていたので、単体で記事にするのは微妙だったので、出落ち記事にしました。

```perl
{
    my $i =1;
    sub a
    {
        return $i++;
    }
}
say "hoge" if a ==1 && a == 2 && a == 3;
```

「その2」の方の複数回呼ばれても、に寄せるなら、

```perl
{
    my $i =0;
    sub a
    {
        return ($i++)%3+1;
    }
}
say "hoge" if a ==1 && a == 2 && a == 3;
say "piyo" if a ==1 && a == 2 && a == 3;

```
みたいな書き方もありかなと思います。
ただ、クロージャで突破する系は3回セットで呼ばれる前提になるので、`==`演算子書き換える系よりは安定性に劣ってしまいますね…
overload使えばいけるのかな…
StreamRelay.jar で入力ダイアログで暗号鍵を与える

`java.exe -Djava.security.policy=StreamRelay.policy -jar StreamRelay.jar`
⇔
`StreamRelay.bat`

### StreamRelay.jar で入力ダイアログで暗号鍵を与える

「-LocalCipherPasswordFromGUI」
「-RemoteCipherPasswordFromGUI」
「CipherKeywordFromGUI」 (JavaStreamスキーム中)

というオプションを指定すると、起動時に GUI の入力ダイアログが表示されて、そこに暗号鍵を与える事ができる。

![暗号鍵の入力を促す入力ダイアログ](http://rocketeer.dip.jp/sanaki/free/jfree11b.png)

### Windowsの右クリックメニュー

「Sample\Cipher.reg」にあるようなレジストリキーを用意すれば、下記のような右クリックメニューでファイルの暗号化/復号ができるようになる。

![右クリックメニュー](http://rocketeer.dip.jp/sanaki/free/jfree11a.png)

実際には「Sample\Cipher.reg」をテキストエディタでStreamRelay.batのパスを指定する必要があると思う。
(環境変数「PATH」に追加してあればいいけど)

また「Sample\Cipher.reg」を編集する事で、別の暗号アルゴリズム/モード/パディング/パスワード攪拌アルゴリズム等、お好きなものに変更してもよいだろう。

黒い画面(コマンドプロンプト)が消えないのだけど、なんでだろう。
とりあえず適当なタイミングで手動で消せばよい

---
### 暗号化コマンドとしてのStreamRelay.jar

[暗号化コマンドとしてのStreamRelay.jar](https://qiita.com/tomoki0sanaki/items/a5971199d7f20806280b)

---
### 目次へ戻る

[目次というか最初の一歩](http://qiita.com/tomoki0sanaki/items/85f20cbe18378e33cd6f)
[もう使わない]Internet Explorer 11 から 10 にダウングレードさせる方法

# ダウングレード
1. Internet Explorer はすべて終了しておく。
1. [コントロールパネル]-[プログラムのアンインストール] を選択する。  
※カテゴリ表示の場合。アイコン表示の場合は [プログラムと機能] を選択する。
1. 左メニューの [Windowsの機能の有効化または無効化] を選択する。
1. [Windowsの機能の有効化または無効化]画面より、[Internet Explorer 11] の項目のチェックを外す。
1. 「Internet Explorerを無効にすると～」ダイアログが表示された場合、[はい] ボタンを押下する。
1. チェックが外れたことを確認して、[OK] ボタンを押下する。
    <!> ここで再起動を促されたとしても、再起動は行わない。
1. 左メニューの [インストールされた更新プログラムを表示] を選択する。
1. 右上の検索ボックスに「internet」と入力する。
1. 更新プログラム一覧から [Microsoft Windows]-[Internet Explorer11] を選択し、
    アンイストールを実行する。

    > <!> 言語パックはアンインストール不要。

1. 「コンピュータからこの更新プログラムを～」ダイアログが表示された場合、[はい] ボタンを押下する。
1. アンインストールが開始される。
1. アンインストール完了後、「これらの変更を適用するには～」ダイアログが表示された場合、[今すぐ再起動する] ボタンを押下する。

    > <!> 他のプログラムを開いていた場合は終了してから、OS再起動を行う。
    > <!> ダイアログが表示されなかった場合でも、OS再起動を行う。

1. 再起動完了後、Internet Explorer を起動し、「Internet Explorer 10」にダウングレードされている
     ことを確認する。

# IE10 が自動的に IE11 更新されるのを防ぐ方法

- IE10の [設定]-[バージョン情報] より、[新しいバージョンを自動的にインストールする] のチェックを外す。
- Windows Update より、[Windows 7 向け Internet Explorer 11] の更新プログラムのチェックを外す。
※同様の手順で IE10→IE9→IE8(初期インストール状態が IE8 である場合)のダウングレードが可能。
MySQL チューニング Optimize 注意点

# 概要
Mysqlのチューニングの一環でoptimizeというのがあるのを知った。
そのため、その辺りについてツールなどをまとめておこうと思い立った次第。

# そもそも
MySQLというのはDELETEなどを実行しても、削除したはずのデータのディスク領域が何故か解放されなくて困ってしまうことがある。これはそもそもMySQLのそのため、何もしないとMySQLが占有するストレージが膨らみ、いつかストレージが満杯になって弾けるといった現象が発生する。(実際に遭遇した)

# やること
### 一月に一度程度Optimizeをかける
 * それ以上は多すぎると思われる。場合によるので、サービス自体の特性も鑑みた上で行う。
 * シェルスクリプトにしてcronあたりでよしなにしてあげる。
 * 大規模なサーバーとかになって来ると全部やると負荷が危ない場合もあるかもなので、後々レコード数が大幅に変わったDBのみにOptimizeをかけるといったことをやると良いかも。


# 参考

[たった12行で全テーブルにOPTIMIZE TABLEできるシェルスクリプト @ykawasaki683 さん](https://qiita.com/ykawasaki683/items/c03e235b167095f951cc)
RealSense D400シリーズのインストール方法(Windows編)

#TL;DR
- 以下のgithubからIntel.RealSense.SDK.exeをダウンロード
    - https://github.com/IntelRealSense/librealsense/releases/tag/v2.9.0
- Intel.RealSense.SDK.exeをインストールする
- RealSense D400シリーズをUSB3.0に刺す
- おしまい！（場合によっては再起動する）

#おまけ
d415だとこんなポイントクラウドがとれます。

![d415.PNG](https://qiita-image-store.s3.amazonaws.com/0/78052/6615eb32-fe09-acd8-fff6-7c9d132ad76a.png)

以上です。


需要があったら詳細を書きます。
Python: 文字列について（超基礎）

# 文字列について

* 文字の値は，文字列またはストリングという
* ダブルクォートまたはシングルクォートで囲って作る
    * 例：`"文字列"`　または　`'文字列'`
* 文字列の中に改行やタブを埋め込みたいときは，エスケープシークエンスを用いる
    * 改行：`\n`
    * 水平タブ：`\t`
    * キャリッジリターン（一番前に移動）：`\r`
    * ダブルクォート：`\"`
    * シングルクォート：`\'`
    * バックスラッシュ：`\\`
* 複数行の文字列はクォートを３個続けて囲めば良い
    * `"""文字列"""`  または `'''文字列'''`

# 型の変換について

* `"大きさ12.3m"` のように文字列と数値を連結したいとき，+演算子ではエラーが起きる
* `str()`を用いて数値を文字列に型変換すれば良い

```py
>>> num = 12.3
>>> a = "大きさ" + str(num) + "m"
>>> a
'大きさ12.3m'
```

* 同様に，整数値への型変換は`int()`，浮動小数点への型変換は`float()`，論理値への型変換は`bool()`で行える

# `format()`を用いて文字列に値を埋め込む
* Python 3.6からは，f"{値}"またはF"{値}"で，値を文字列に埋め込めるようになった
* fを付けた文字列には変数を埋め込める

```py
>>> a = "斎藤"
>>> b = 25
>>> c = 165.0
>>> ans = f"{a}さん，年齢{b}歳，身長{c}cmです．"
>>> print(ans) 
斎藤さん，年齢25歳，身長165.0cmです．
```
ファイルのアイコンの変更

# きっかけ
md ファイルが ATOM 起動アイコンと同じになってしまって、たまに間違える。

# 注意
レジストリの修正はくれぐれも慎重に。

# 拡張子の関連付け情報は下記に存在するみたい
|キー|内容|
|-----------------|------------------|
| HKEY_CLASSES_ROOT|現在システムで使用している関連付け情報|
| HKEY_LOCAL_MACHINE\SOFTWARE\Classes|PC上での拡張子の関連付け情報|
| HKEY_CURRENT_USER\Software\Classes|現在のユーザーの拡張子の関連付け情報|

# やりかた
1. registryエディタを起動

    ```  
    regedit
    ```

1. 変更したいものにうつる
    とりあえす、HKEY_CLASSES_ROOT あたり攻めてみる  

    ```
    HKEY_CLASSES_ROOT\md_auto_file
    ```  

1. DefaultIcon キーを作成する

    ```
    HKEY_CLASSES_ROOT\md_auto_file\DefaultIcon
    ```
  
1. 値を修正する

    |名前|種類|データ|
    |---|---|---|
    |(既定)|REG_SZ|D:\markdown.ico|
  
1. ログオフして再度ログイン。
【PHP】メソッドのスコープについて

##理解したいこと
- public, protected, privateの違いと意義

##そもそもスコープとは
より安全性の高いシステムを開発するために、アクセス修飾子(public, protected, private)をクラスやメソッドに用いる。使用できる範囲を制限してあげるという意味でスコープ。

##publicを知る
どこからでもアクセスが可能。

##protectedを知る
定義したクラス内、継承クラスからアクセス可能。

##privateを知る
定義したクラス内でのみアクセス可能。

##アクセス修飾子をつける意義
- クラス内でしか見せたくない情報を守る。
- 外部から呼び出す必要のないメソッドを制限できる。 
- 誤ったメソッドの使い方を防ぐことができる。
    - ModelからQueryを掃くだけのメソッドはpublicでなくてもいいなど
CodePen とは？（さくっと）

# CodePenとは

* Webブラウザ上でコーディングできる
* プレビューがすぐ確認できる
* ソースコードが共有できる
* 他人のソースも編集できる
* ソースをWebサイトに埋め込むのが簡単にできる
* 対応言語：HTML, CSS, JavaScript など

---

* [QiitaにCodePenが埋め込めるようになった](https://qiita.com/Qiita/items/edae7417214c8e957f54?utm_source=Qiita%E3%83%8B%E3%83%A5%E3%83%BC%E3%82%B9&utm_campaign=5182d85711-Qiita_newsletter_295_01_24_2018&utm_medium=email&utm_term=0_e44feaa081-5182d85711-33849153)
mail()関数で「sh: -t: command not found」となりメール送信出来ない問題対応

* [【php】mail()関数で sh: -t: command not found のエラー at softelメモ](https://www.softel.co.jp/blogs/tech/archives/2325)

## 現象

自分でソースからビルドしたphpにて遭遇。
phpのmail()関数でメールを送信しようとしたら以下エラーでメール送信できなかった。
メール送信のログ /var/log/maillog にも出力なし。

```
sh: -t: command not found
```

## 現状確認

```sh:悪い例
$ php -i | grep sendmail_path
sendmail_path => -t -i => -t -i
```

## 修正

* /etc/php.ini
* /etc/php-cli.ini

```diff
+ sendmail_path = /usr/sbin/sendmail -t -i
```

httpdを再起動。
もしphpプロセスで動かしっぱなしのものがあればそれも落としあげし修正完了。

```sh:以下であればok
$ php -i | grep sendmail_path
sendmail_path => /usr/sbin/sendmail -t -i => /usr/sbin/sendmail -t -i
```
関連先baseのエラーを関連元のfull_messagesで表示しようとするとおかしなことになる。

アソシエーション先のカスタムエラーメッセージとしてbaseのエラーをアソシエーション元のfull_messagesで表示しようとするとおかしなことになる。

具体的には、

```ruby
# parent has_one childの関係があるとし、(has_manyでもよいが便宜上has_oneにしてる)
# 今childにカスタムバリデーションエラーがあるとする。
class Child < ApplicationRecord
    #...
    def hoge_validation
        errors.add(:base, :some_validation)
    end
    #...
end

# そのときparentからfull_messagesを呼ぶと...
parent.errors.full_messages
# => [ "Child basesome_validation_message" ]
# このように "モデル名 エラー属性" がエラーメッセージの先頭に含まれてしまう
# (これを避けたくてカスタムバリデーションにしたのに...)


# 直接childからfull_messagesを呼ぶと...
parent.child.errors.full_messages
# => [ "some_validation_message" ]
# 本来こうなって欲しい
```

なんやこれと思ってfull_messagesの実装を見ると...

```ruby
# なるほどfull_messageでメッセージを生成している
def full_messages
  map { |attribute, message| full_message(attribute, message) }
end

# attributeが:baseならただメッセージを返す。もしや...
def full_message(attribute, message)
  return message if attribute == :base
  attr_name = attribute.to_s.tr(".", "_").humanize
  attr_name = @base.class.human_attribute_name(attribute, default: attr_name)
  I18n.t(:"errors.format",
    default:  "%{attribute} %{message}",
    attribute: attr_name,
    message:   message)
end
```

attributeが:baseならただメッセージを返す、というところでもしや...と思いerrorsを確認すると、

```ruby
# parent.errors.detail
=> {:"child.base"=>[{:error=>:some_validation}]}

# parent.child.errors.details
=> {:base=>[{:error=>:some_validation}]}
```

アソシエーション元のparentからみると、childのbaseにセットされたエラーは`:"child.base"`に変更されるため、`full_message`の1行目でreturnされなくなっているようだ。

解決策を諸先輩に伺ったところ、localeファイルにbase属性を追加して、それを空文字にすればひとまず動きそうと分かった。

```yaml
# parent.ja.yml
ja:
  activerecord:
    models:
      parent: アソシエーション元
    attributes:
      parent:
        base: '' # ここを空文字にするのがポイント
```

これで理想通りの動きになった。

`full_message`の実装を見るに、 `"%{attribute} %{message}"` の頭半分に空文字入ることで想定した表記になるのかな...でもそれだと空白が先頭に入って嫌だなと思ったところ、 gemとしてrails-i18nを入れておくと、rails-i18n自体が持っているlocaleファイルのja.ymlに

```yml
  errors:
    format: "%{attribute}%{message}"
```

とあって空白問題も解決。
gemを入れて無くとも自前のja.ymlに上記を追記すればOK.

とりあえずこれで対応することにするけど、なんとなくhackyでもやっとする。


## 参考
https://github.com/rails/rails/issues/19863
https://github.com/rails/rails/pull/20962

該当箇所の修正issueとprもあるがcloseされており、修正は結局出なかった模様...
背景が知りたい.
anyenvを使う


基本は[本家](https://github.com/riywo/anyenv)を参考に。

いろいろな言語を使うのでanyenvを利用することになした。私の用途でバージョンの変更・管理が必要な言語はpythonとnode.jsで、あとはおまけでPHPという感じでしょうか。

既に**envを利用している人は、いままでの設定フィルを削除するか移動します。[こちら](https://qiita.com/sutoh/items/0894f0895a5f6264faee)の記事が参考になります。

## anyenvのインストール

### 環境

macOS Hight Sierraです。XcodeとかHomebrewとかは入った状態。

### 本体

インストールはgitから直で。

```bash
git clone https://github.com/riywo/anyenv ~/.anyenv
```

.anyenv/binを見るようにPATHを調整。これで各**env毎の設定が不要になります。

```bash
export PATH="$HOME/.anyenv/bin:$PATH"
eval "$(anyenv init -)"
```

シェルをリフレッシュ。


```bash
exec $SHELL -l
```

動作確認兼、インストールできる**envの種類を確認。


```bash
anyenv install -l
```

### プラグイン

各**env環境をUpdateするためのプラグインをインストール。

```bash
mkdir -p $(anyenv root)/plugins
git clone https://github.com/znz/anyenv-update.git $(anyenv root)/plugins/anyenv-update
```

下記のようにすることでUpdateが可能に。

```bash
anyenv update
```

## pyenv

では、本命のpyenvをインストール。

```bash
anyenv install pyenv
exec $SHELL -l
```

後はpyenvの世界。
とりあえずインストールできるバージョン一覧表示。

```bash
pyenv install -l
```

最新のAnacondaを入れてみる。

```bash
pyenv install anaconda3-5.0.1
```

インストールされたバージョンの確認。

```bash
pyenv versions
```

バージョンの切り替え。

```bash
pyenv global anaconda3-5.0.1
```

元々のバージョンに戻す。

```bash
pyenv global system
```

以上。


## ndenv

node.jsも。たまに「node.jsのバージョンが違うのでインストールできない!」とか言われるので切り替えたい。

インストール。

```bash
anyenv install ndenv
exec $SHELL -l
```

インストール可能なバージョン一覧。

```bash
ndenv install -l
```

とりあえずLTSの8.x系をインストール。


```bash
ndenv install v8.9.4
```

プレインストールされていないので「知らん」と言われる。

```bash
ndenv: node: command not found

The `node' command exists in these Node versions:
  v8.9.4
```

バージョンを指定。


```bash
ndenv global v8.9.4
```

あとはnode.jsの世界。


## phpenv

おまけながら一番面倒。Web利用で5.xと7.xを切り替えるだけならMAMPとかの方がいいかも。

インストール。これは普通に終わる。

```bash
anyenv install phpenv
exec $SHELL -l
```

最新版をインストール。エラーがいくつも出ます。

>以下で解決はしています。

まずは最新版のPHPインストール。

```bash
phpenv install 7.2.0
```

### エラー1 (OpenSSL)

enp.hが無い！と怒られる。

```bash
configure: error: Cannot find OpenSSL's <evp.h>
```

最近のOpenSSLをライブラリが配布されていないよう。下記のようにPKG_CONFIG_PATHを指定する。
.bash_profile等に下記を追記。追記後は忘れずにsource .bash_profileとかやる。

```bash
export PKG_CONFIG_PATH=/usr/local/opt/openssl/lib/pkgconfig
```

で、再度install実行。

### エラー2 (libz)

今度はlibzが無いと怒られる。

```bash
configure: error: Cannot find libz
```

これはXcodeのコマンドラインツールをインストールすればよいらしい。

```bash
xcode-select --install
```

で、再度install実行。

### エラー3 (jpeg)

今度はjpeglib.hが無い！と怒られる。

```bash
error: jpeglib.h not found
```

jpegライブラリをインストール。


```bash
brew install jpeg
```

### エラー4 (libpng)

続いては、libpngが無い！と怒られる。

```bash
configure: error: png.h not found.
```

おとなしくインストール。


```bash
brew install libpng
```

### エラー5 (ICU prefix)

さらに、ICU prefixがどうたらと怒られる。

```bash
configure: error: Unable to detect ICU prefix ...
```

インストール。


```bash
brew install icu4c
```

ここで再度installを実行するとコンパイルまでは進むように。。。が、下記のエラーでコケる。

### エラー6 (autoconf)

autoconfが無い！と怒られる。

```bash
Cannot find autoconf.
```

インストール。

```bash
brew install autoconf
```

これでようやくインストールが完了しました。。。

```bash
phpenv versions
```

>phpenvを入れたらターミナルの起動（初期化）にすごく時間がかかるようになったのでanyenv uninstall phpevnとし、アンインストールしました（あまりバージョン切り替えないので）。
Docker ComposeのLinuxへのインストール

2018/01/24時点
本家documentのコマンドのみの簡易版
作業メモ

# 手順

## インストール
```
$ sudo curl -L https://github.com/docker/compose/releases/download/1.18.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
```
```
$ sudo chmod +x /usr/local/bin/docker-compose
```

## 確認
```
$ docker-compose --version
docker-compose version 1.18.0, build 1719ceb
```

# 備考

## 要件
### OS
64bit

### docker
インストール済

## Proxy設定(必要であれば)
### curl
オプション

```
--proxy http://username:password@your.proxy.address:yourport
```


## 要件確認
### OSbit
```
$ getconf LONG_BIT 
```


# 引用
https://docs.docker.com/compose/install/
Javaでのbitフラグっぽいもの色々おぼえがき

## bitフラグとはなんぞや

もう詳しい人が書いてくれてるので以下のリンクを見てください。
[ビット演算によるフラグ管理](http://promamo.com/?p=999)
[ゲームのフラグ管理はビット演算で効率かつ簡単に管理する](http://lambdalisue.hatenablog.com/entry/2013/12/22/041347)

## 何の話がしたいのか

+ 一つの変数で
+ 排他でない複数のフラグをまとめて管理する

話をしたい。

## あとはコードで

### int

```java
    // 定義.
    // 書き方は自由だけどシフト演算で書くと次に定義する値が一目で分かる.
    final static int COM_LOLI = 1 << 0;
    final static int COM_MOM = 1 << 1;
    final static int COM_SIS = 1 << 2;

    /**
     * next flag:0x0008
     * <p>
     * AndroidFrameworkで見かけたコメントの書き方.
     * 次に定義する値をこうやって書いておくとイケメン.
     */


     // 作成.
     int flags = COM_LOLI | COM_SIS;

     // フラグを立てる.
     flags |= COM_MOM;

     // フラグを下ろす.
     flags &= ~COM_SIS;

     // フラグをチェックする.
     boolean isOn = (flags & COM_LOLI) != 0;

     // ログ出力の際はせめて101010...の形式で出す.
     Integer.toBinaryString(flags);

    /**
     * ログ出力用のメソッドを作るとメンテナンスめんどくさいがイケメン.
     */
    static String decodeFlags(final int flags) {
        StringBuilder builder = new StringBuilder();

        if ((flags & COM_LOLI) != 0) {
            builder.append("LOLI").append(" ");
        }
        if ((flags & COM_MOM) != 0) {
            builder.append("MOM").append(" ");
        }
        if ((flags & COM_SIS) != 0) {
            builder.append("SIS").append(" ");
        }
        return builder.toString();
    }
```

### BitSet

```java
    // BitSetなんて代物もある.
    BitSet bitSet = new BitSet();

    // フラグを立てる.
    bitSet.set(2);

    // フラグを下ろす.
    bitSet.clear(1);

    // フラグをチェックする.
    boolean isOn = bitSet.get(3);

    // でもこれは本格的にビット演算を行うときに使うクラスなので
    // フラグとして使うのはちょっと扱いづらい.
    // toIntegerとかtoLongとかあったら嬉しかったけど
    // クラスの目的である可変長ビット配列を担保できないからないのかも.

```

### EnumSet

```java

    /**
     * まずenumを定義する.
     */
    enum Complex {
        LOLI("ぅゎょぅι゛ょっょぃ"),
        MOM("ママー！"),
        SIS("12人いる！");

        public final String cry;

        Complex(final String cry) {
            this.cry = cry;
        }
    }

    // 作成.
    EnumSet<Complex> flags = EnumSet.of(Complex.LOLI, Complex.SIS);

    // フラグを立てる.
    flags.add(Complex.MOM);

    // フラグを下ろす.
    flags.remove(Complex.SIS);

    // フラグをチェックする.
    boolean isOn = flags.contains(Complex.SIS);

    // 要素全体でループとか
    for (Complex complex : Complex.values()) {
        Log.d("allCry", complex.cry);
    }

    // 現在の要素だけでループとか回せて便利
    for (Complex complex : flags) {
        Log.d("limitedCry", complex.cry);
    }

    // 「そのフラグが立っていた場合なにをするのか」という情報を
    // 即座に取り出せるのでとても便利 

```

## 結論

速度とか省メモリとかintでDBにそのまま出し入れしたいとかの理由がない限りはEnumSetを使うべし。
速度に関してはEnumSetも十分早いぜってEffectiveJavaに書いてあった。

あと同じ状態を表すintフラグの定数を *いろんなクラス* に *別の進数表記で定義* した奴、**ゆ゛る゛さ゛ん゛!!**
Docker CEのubuntu:Trusty 14.04(x86_64)へのインストール 

リポジトリによるインストール 
2018/01/23時点
本家documentのコマンドのみの簡略版
作業メモ
# 手順
## 古いバージョンのアンインストール

```
$ sudo apt-get remove docker docker-engine docker.io
```

## ストレージドライバのインストール
```
$ sudo apt-get update
```
```
$ sudo apt-get install \
    linux-image-extra-$(uname -r) \
    linux-image-extra-virtual
```
## Dockerインストール
```
$ sudo apt-get update
```
```
$ sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    software-properties-common
```
```
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
```
```
$ sudo apt-key fingerprint 0EBFCD88

pub   4096R/0EBFCD88 2017-02-22
      Key fingerprint = 9DC8 5822 9FC7 DD38 854A  E2D8 8D81 803C 0EBF CD88
uid                  Docker Release (CE deb) <docker@docker.com>
sub   4096R/F273FCD8 2017-02-22
```
```
$ sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"
```
```
$ sudo apt-get update
```
```
$ sudo apt-get install docker-ce
```
CEのバージョン確認

```
$ apt-cache madison docker-ce
docker-ce | 17.12.0~ce-0~ubuntu | https://download.docker.com/linux/ubuntu xenial/stable amd64 Packages
```
**\<VERSION\>を「上記2列目の文字列」**
として以下のコマンドに代入
上記では
17.12.0~ce-0~ubuntu

```
$ sudo apt-get install docker-ce=<VERSION>
```
## 評価
```
$ sudo docker run hello-world
```
# 備考
## 要件
### OS
Trusty 14.04 (LTS)
### OSbit
64bit
### アーキテクチャ
x86_64
 
 
## Proxy設定(必要であれば)
### apt-get
`~/.bashrc`などに以下を記述
`export http_proxy=http://username:password@your.proxy.address:yourport`
`export https_proxy=http://username:password@your.proxy.address:yourport`

### curl
オプション

```
--proxy http://username:password@your.proxy.address:yourport
```

### docker run

`/etc/default/docker`に以下記述
`export http_proxy=http://username:password@your.proxy.address:yourport`
`export https_proxy=http://username:password@your.proxy.address:yourport`

再起動

```
$ systemctl restart docker
```

## 要件確認
### OSバージョン
```
$ cat /etc/lsb-release
```
### OSbit
```
$ getconf LONG_BIT 
```
### アーキテクチャ
```
$ arch
```

# 引用
https://docs.docker.com/engine/installation/linux/docker-ce/ubuntu/


# 関連
[Docker ComposeのLinuxへのインストール](https://qiita.com/nodatom/items/30dc02520fea7162a99a)
a == 1 && a == 2 && a == 3がtrueになるRubyスクリプト

[a == 1 && a == 2 && a == 3がtrueになるRubyスクリプト](https://qiita.com/shiozaki/items/53c66cea655bef08b9ea)見て面白そうだったので書きました

## `==`が呼ばれたタイミングでレシーバーを変えてやり直す

```rb
require 'continuation'

def a
  callcc do |c|
    Object.new.tap do |o|
      o.define_singleton_method(:==) do |other|
        c.call(other)
      end
    end
  end
end

puts a == 1 && a == 2 && a == 3
# true
```

ぱっと見で動作が分かりづらいと思いますが`==`を確認するコードを差し込むとちゃんと`1 == 1 && 2 == 2 && 3 == 3`が実行されてることがわかります、順番的には以下のような感じです。

1. `a == 1`の`a`が呼ばれる
2. オブジェクトがかえる
3. `object == 1`でオブジェクトの`==`メソッドが呼ばれる
4. 引数の1を`a`の返り値として継続(`a == 1`の`== 1`部分)を実行する、`a`の返り値が1になっているので`1 == 1`が実行され`true`がかえる

```rb
require 'continuation'

def a
  callcc do |c|
    Object.new.tap do |o|
      o.define_singleton_method(:==) do |other|
        # 確認用
        puts "object == #{other}"
        c.call(other)
      end
    end
  end
end

# 確認用
using Module.new { refine(Integer) { def ==(o); puts "#{self} == #{o}"; super; end } }

puts a == 1 && a == 2 && a == 3
# object == 1
# 1 == 1
# object == 2
# 2 == 2
# object == 3
# 3 == 3
# true
```

わかりやすいですね :smile:
このスクリプトなら`a == 4 && a == 5 && a == 6`と続けても`true`が返ります、便利!

## `a`の`==`メソッドをRefinementsで上書き

`a.class`のメソッドを上書きするので`a`にどんな値が来ても動きます。Refinementsを使って上書きするとこのスクリプトの外では`true`にならないので便利ですね。

```rb
a = :hi

using Module.new { refine(a.class) { def ==(*); true; end } }

puts a == 1 && a == 2 && a == 3
# true
```

## 呼ばれるたび`a`が返す値をかえる

順番よく値を返していくならFiberか`Enumerator`を使うとべんりです!

```rb
f = Fiber.new do
  Fiber.yield 1
  Fiber.yield 2
  Fiber.yield 3
end

define_method(:a) do
  f.resume
end

puts a == 1 && a == 2 && a == 3
# true
```

```rb
e = Enumerator.new { |y| y << 1 << 2 << 3 }

define_method(:a) do
  e.next
end

puts a == 1 && a == 2 && a == 3
# true
```
brew updateで'unable to access'

brew updateしようとしたら下記のようエラーがでました。

```
$ brew update
fatal: unable to access 'https://github.com/Homebrew/brew/': Could not resolve host: github.com
fatal: unable to access 'https://github.com/Homebrew/homebrew-core/': Could not resolve host: github.com
fatal: unable to access 'https://github.com/caskroom/homebrew-cask/': Could not resolve host: github.com
```

色々探してたところ、githubのissueに上がってました。
どうやらproxyを削除すれば良さそう。。

ということで下記を実行

```
git config --global --unset http.proxy 
git config --global --unset https.proxy
```
実行した後、一回ターミナルを閉じます。

そして、brew updateを実行

```
$ brew update
Updated 5 taps (caskroom/cask, heroku/brew, homebrew/core, homebrew/php, homebrew/versions).
==> New Formulae
```
無事アップデートできました。

# 参考URL
[Could not resolve host: github.com, but I can access it without problem](https://github.com/Homebrew/brew/issues/1414)
[プロキシ (proxy)とは](http://wa3.i-3-i.info/word1752.html)
[git config --global で設定した値を削除する方法](https://qiita.com/hijion/items/ae2cccebf5d28ff733f3)
jwtの中身を見る

jwtの文字列は https://jwt.io/ から拝借しました。
ライブラリを利用する場合は [PyJWT](https://pypi.python.org/pypi/PyJWT/1.4.0) をどうぞ。

※ライブラリを利用しないケースは、署名の検証はしていません。

```python3
import base64
import json

jwt_ = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ'

tmp = jwt_.split('.')

header = json.loads(base64.b64decode(tmp[0]).decode())
payload = json.loads(base64.b64decode(tmp[1]).decode())

# >>> header
# {'alg': 'HS256', 'typ': 'JWT'}
# >>> payload
# {'name': 'John Doe', 'admin': True, 'sub': '1234567890'}
```

以下、PyJWTを利用したケース。
署名はHS256で、シークレット値="secret"です。

```Python3
# pip install PyJWT

import jwt

jwt.decode(jwt_, verify=False)
# {'sub': '1234567890', 'admin': True, 'name': 'John Doe'}

# PyJWTライブラリのバージョンが新しい（2.0.1で確認)場合、上記はエラーになるので、以下のように書きます。
jwt.decode(jwt_, options={"verify_signature": False})


jwt.decode(jwt_, 'secret', algorithms=['HS256'])
# {'sub': '1234567890', 'admin': True, 'name': 'John Doe'}

jwt.decode(jwt_, 'fuga', algorithms=['HS256'])
# ...
#    raise DecodeError('Signature verification failed')
# jwt.exceptions.DecodeError: Signature verification failed
```

作成と検証

```Python3
>>> header
{'alg': 'HS256', 'typ': 'JWT'}
>>> payload
{'sub': '1234567890', 'admin': True, 'name': 'John Doe'}
>>> result = jwt.encode(payload, 'secret', algorithm='HS256', headers=header)
>>> result
b'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwiYWRtaW4iOnRydWUsIm5hbWUiOiJKb2huIERvZSJ9.9IELajTU43KKXdIpYMyiS0ARBsngz3EiLAT-3tZGDLY'
>>> jwt.decode(result, 'secret', algorithms=['HS256'])
{'sub': '1234567890', 'admin': True, 'name': 'John Doe'}
```
Expected response code 220 but got code "", with message ""

# Mailerがエラーしてる

Laravelのメーラーを使おうとするとエラーでる。

## 基本的には、smtpなどの設定見直せばいける

```
MAIL_DRIVER=smtp
MAIL_HOST=smtp.gmail.com
MAIL_PORT=465
MAIL_ENCRYPTION=ssl
MAIL_FROM_ADDRESS=your_address@gmail.com
MAIL_FROM_NAME=your_name
MAIL_USERNAME=your_address@gmail.com
MAIL_PASSWORD=your_password
MAIL_PRETEND=false
```

このアドレスとパスワードを自分のものに書き換えれば大丈夫。

## AWSの場合は少し面倒

僕の環境下は、AWSでの送信を試みていたので、ちょっと面倒な感じに。
まずは、AWSからメールが送信できるように、設定しないといけない。

多分だけど、AWS→他サービスのサーバー→メール
みたいな感じで、経由するのは厳しそう。多分。

↓を参考にして欲しい。
[独自ドメインのメール送受信をAWSで。メールサーバーレスアーキテクチャーを構成]
(http://ryoichi0102.hatenablog.com/entry/2016/12/29/015017)
k-平均法

packageを使用しないでk-平均法を実装してみました。
平均10と-10の正規乱数のサンプルが3000個ずつ発生し、その重心となる三次元の2つのクラスター(10,10,10),(-10,-10,-10)を計算します。表示されるＬはコスト関数で、実際に動かすと、徐々に収束します。

```{r}

#k-mean method

library(dplyr)

n=1000;
x=c(rnorm(n,mean=2,sd=2),rnorm(n,mean=-2,sd=2))

cluster_num=1

C=sample(x,cluster_num)

ite=20

Data=data.frame(num=0,C=t(C),L=0)
for(k in 1:ite){

 X=data.frame(x=x,c=0,L=0)
 
for(j in 1:length(x)){
  x_one=x[j]
  c_x=data.frame(num=1:length(C),c=C) %>% dplyr::mutate(L=(x_one-C)^2)
  X$c[j]=c_x$num[c_x$L==min(c_x$L)]
  X$L[j]=min(c_x$L)
}
 
XX=X %>% group_by(c) %>% summarise(Center_of_gravity=mean(x),L=sum(L)) 

C=XX$Center_of_gravity

data=data.frame(num=k,C=t(C),L=sum(XX$L))
Data=rbind(Data,data)
print(paste0("C=",C))
print(paste0("L=",sum(XX$L)))
}

mean_sd_data=X %>% group_by(c) %>% summarise(ave=mean(x),sd=sd(x),n=n())


```

```{r}

#k-mean method(multi dimension)

library(dplyr)

n=3000;dim=3

x=rbind(matrix(rnorm(n*dim,mean=10,sd=10),ncol=dim,nrow=n),matrix(rnorm(n*dim,mean=-10,sd=10),ncol=dim,nrow=n))

cluster_num=2

C=x[sample(1:n,cluster_num),]

Data=data.frame(num=rep(0,cluster_num))

for(j in 1:dim){
  
  C_D=data.frame(C=C[,j])
  
  colnames(C_D)=c(as.character(paste0("c.",j)))
  
  Data=cbind(Data,C_D)
  
}

Data=Data %>% mutate(L=0)


ite=50

for(k in 1:ite){

 X=data.frame(x=x,c=0,L=0)
 
for(j in 1:nrow(X)){
  
  x_one=x[j,]
  
  c_x=data.frame(num=1:nrow(C),c=C,L=0) 
  
  for(l in 1:nrow(C)){
    
  c_x$L[l]=sum((x_one-C[l,])^2)
  
  }
  
  X$c[j]=c_x$num[c_x$L==min(c_x$L)]
  
  X$L[j]=min(c_x$L)
  
}
 

XX=data.frame(c=1:cluster_num)

for(j in 1:dim){
  
  x_c=data.frame(c=X$c,x=X[,j])
  
  x_c=x_c %>% group_by(c) %>% summarise(center_of_gravity=mean(x))
  
  colnames(x_c)=c("c",as.character(paste0("c.",j)))
  
  XX=left_join(XX,x_c,by="c")
  
} 

x_c=X %>% group_by(c) %>% summarise(L=sum(L))

XX=left_join(XX,x_c,by="c")

C=XX[,2:(1+ncol(C))]

data_c=data.frame(num=1:cluster_num)

for(j in 1:dim){
  
  C_data=data.frame(num=1:cluster_num,c=C[,j])
  
  colnames(C_data)=c("num",as.character(paste0("c.",j)))
  
  data_c=left_join(data_c,C_data,by="num")
  
}

data=data_c %>% mutate(L=sum(XX$L))

data$num=k

Data=rbind(Data,data)

print(paste0("C=",C))

print(paste0("L=",sum(XX$L)))

}

library(scatterplot3d)

if(dim==3 & cluster_num==2){
  c_1=X %>% dplyr::filter(c==1)
  c_2=X %>% dplyr::filter(c!=1)
  z1<-c_1$x.3;y1<-c_1$x.2;x1<-c_1$x.1
  z2<-c_2$x.3;y2<-c_2$x.2;x2<-c_2$x.1
  
  scatterplot3d(x1, y1, z1,  col.axis="blue",col.grid="lightblue", main="k-means;c1_red,c2_green", pch=20,xlim=c(min(x1,x2),max(x1,x2)),ylim=c(min(y1,y2),max(y1,y2)),zlim=c(min(z1,z2)-10,max(z1,z2)+10),color=2,xlab="X",ylab="Y",zlab="Z")
  
  par(new=T)
  
  scatterplot3d(x2, y2, z2,  col.axis="blue",col.grid="lightblue", main="k-means;c1_red,c2_green", pch=20,xlim=c(min(x1,x2),max(x1,x2)),ylim=c(min(y1,y2),max(y1,y2)),zlim=c(min(z1,z2)-10,max(z1,z2)+10),color=3,xlab="X",ylab="Y",zlab="Z")
}


```
Pymolでトラジェクトリの最初の構造を取り除く方法

はじめに：PymolでのMDトラジェクトリの読み込み
==============================

これは，[銀すみ先生の記事](http://blog.livedoor.jp/ag_plusplus/archives/67932265.html)に述べられている通りに実行すれば簡単に行うことができます。しかしながら，最初に読み込んだ構造が残ってしまいます。

Pymolではそもそも，[PymolWiki](https://pymolwiki.org/index.php/States)に述べられている通り，stateとしてトラジェクトリをロードしています。stateを操作する関係のコマンドをみると，`split_state`のようなそれらしいものがありますが，これはNMR向けのコマンドで残念ながら，今回の目的には沿いません。

こういったことを念頭に置き，Pymolでトラジェクトリの最初の構造を取り除く方法を調べてみました。その結果，次のような方法が考えられることがわかりました。
1. <ベストプラクティス>  stateオプション
2. <堅実>  一枚目切り出し
3. <ゴリ押し>  createコマンド


1. <ベストプラクティス>  stateオプション 
===================================
今回の調査でベストプラクティスとなったのは，`load_traj`コマンドを実行するとき，`state=1`とすることです。

```
load ayase.pdb
load_traj traj.trj, ayase.pdb, state = 1
```

[wikiの関連箇所を](https://pymolwiki.org/index.php/Load_Traj)抜き出しますと，
> __USAGE__
> `load_traj filename [,object [,state [,format [,interval [,average ]
                   [,start [,stop [,max [,selection [,image [,shift 
                   [, plugin ]
                   ]]]]]]]]]`
> __ARGUMENTS__
__filename__ = str: trajectory file path
__object__ = str: name of the molecular object where the trajectory should be appended as states {default: guess from filename}
__state__ = int: object state where to start appending states. To discard the currently loaded coordinates, use state=1. To append new states, use state=0 {default: 0}
__format__ = str: specify file type instead of guessing from file extension (only affects AMBER .trj format, use "plugin" argument for Molfile Plugin types) {default: }

`state=1`のとき現在読み込んでいる座標を破棄しますとあります。これで目標達成です。ちなみに，`load_traj`ではなく，`load`でも同じ挙動になるようです。

2. <堅実>  一枚目切り出し
======================

こちらは，堅実に，最初に読み込む構造を，トラジェクトリの最初のスナップショットから切り取ったものにするという方法です。一見ひと手間多いように見えますが，トラジェクトリの変換は必要になる工程であるので，そのスクリプトに埋め込むことで，自動化することができると思います。[銀すみ先生の記事](http://blog.livedoor.jp/ag_plusplus/archives/67932265.html)に大体の方法は書かれています。



3. <ゴリ押し>  createコマンド
===========================

最後に，「state=1 するの忘れた！読み込み直さずどうしても一枚目を消したい！」という場合に使えるかもしれないゴリ押しの方法です。使うのは`create`コマンドです。詳細は[wiki](https://pymolwiki.org/index.php/Create)を参照していただき，使い方を抜き出すと，こんな感じです。

```
create name, (selection) [,source_state [,target_state ] ]
```
> create name = (selection) [,source_state [,target_state ] ]    # (DEPRECATED)
> name = object to create (or modify)
> selection = atoms to include in the new object
> source_state (default: 0 - copy all states)
> target_state (default: 0)

発想としては，`source_state`と`target_state`を使って全てのスナップショットを一枚ずつずらしていくというものです。そのためのpymolスクリプトは，例えばこんな感じのものを用意します。

```{del_first.py}
from pymol import cmd

first = 2
last  = 100
gro = 'nowat'
for s in range(first, last):
    cmd.create('new'+ gro, gro, s, s - 1)
```
これで，最初のstateをdeleteすることができると思います。

まとめ
=====

3つの方法を提案してみましたが，基本的には方法1と方法2が良いのかなと思います。方法3については，細かい挙動など不明なので，調査し次第書き加えたいと思います。
また，他にも良い方法ご存知でしたらぜひ教えて頂きたいと思います。
最大エントロピー法（メディア情報処理の基礎数理　尾関和彦先生）

packageを使用しないで最大エントロピー法に挑んでみました。
この方法は、エネルギー量とそのエネルギー量を持つ粒子の数に対して、それらの総エネルギー量が決められている場合に、各エネルギー量をもつ粒子の頻度を最適化するパラメータ(ボルツマン-ギブス分布)を決定することでエントロピーを最大化する方法です。ここでは最後にエントロピーの区間推定を行っています。

```{r}

#最大エントロピー法

library(dplyr)

classes=100

N_vec=sample(classes)
E_vec=sample(classes)
N=sum(N_vec);E=sum(E_vec*N_vec)


if(round((1/N)*(sum(log(c(1:N)))-sum(log((factorial(N_vec))))))==round(-sum((N_vec/N)*log(N_vec/N)))){
  print("Result is right!")
}

ave_energy=sum(E_vec*(N_vec/N))

times=100
newton_raphson=data.frame(times=1:times,value=0,f=0,df=0)
value=0
for(j in 1:nrow(newton_raphson)){
f<-sum((E_vec-ave_energy)*exp(-value*E_vec))
df<-sum((E_vec-ave_energy)*exp(-value*E_vec)*(-E_vec))
  
  newton_raphson$f[j]=f
  newton_raphson$df[j]=df
  value=-f/df+value
  
  newton_raphson$value[j]=value
}

solution=newton_raphson$value[nrow(newton_raphson)]

prob=array(0,dim=c(1,length(E_vec)))

for(j in 1:length(prob)){
  prob[1,j]=exp(-solution*E_vec[j])/sum(exp(-solution*E_vec))
}

if(signif(sum(prob),10)==1){
  print("Result is right!")
}


print("probabilities are")
print(prob)

entropy=-signif(sum(prob*log(prob)),10)

#interval estimation for the entropy values
n=length(E_vec);m=1
diff_H=(1/N)*qchisq(1-0.05,n-m-1)
print(paste0("Interval is [",entropy-diff_H," , ",entropy,"]"))
```
液体とゲル状化の予備知識

# はじめに
前回までは総合数理アドベントカレンダーをやるために記事を書いていましたが、それだけのために記事を書くのも寂しいので、今後は趣味として自分が楽しいと思った科学現象を書きます。今回は現在放送中である「仮面ライダービルド」第17話に登場したスクラッシュゼリーについてです。

# そもそもの疑問 (という名のただの番組紹介)
主人公の桐生戦兎が変身する仮面ライダービルドと万丈龍我が変身する仮面ライダークローズはベルトである「ビルドドライバー」と「フルボトル」というさまざまな成分が入ったボトルを用いて敵と戦います。フルボトルの組み合わせによってフォームチェンジができ、相性のいいボトルの組み合わせは「ベストマッチ」として強力な力を発揮します。
![maxresdefault-3.jpg](https://qiita-image-store.s3.amazonaws.com/0/223549/d2d8dd7f-7a04-2e69-fba6-a549e314cf98.jpeg)
図1:フルボトルとビルドドライバー


第17話からは新展開が訪れ、強力な敵であるハードスマッシュが登場します。彼らに対抗するにはビルドドライバーでは勝つことが出来ません。そこで戦兎が完成させたスクラッシュドライバーとスクラッシュゼリーを使い、龍我を仮面ライダークローズチャージへとパワーアップさせハザードレベルを上昇させました。

このスクラッシュゼリーは「液体にして入れているフルボトルのさまざまな成分を、ゲル状化させてパワーを最大限に発揮できるようにしている」というのが劇中の設定なのですが、「液体をゲル状にするとエネルギーが増大するというのは本当にあるのだろうか?」という疑問が出てきたので真面目に調べました。
![1000121588_1-e1514077936283-560x326.jpg](https://qiita-image-store.s3.amazonaws.com/0/223549/aac06918-8e7d-a712-88a1-22159bf8212f.jpeg)
図2:スクラッシュゼリーとスクラッシュドライバー

# 液体をゲル状化した時の変化
そもそもゲルは液体にある流動性が失われ、固体になったものです。高い粘性を持ち、成分の中でネットワークとして繋がる架橋構造を持つという性質もあります。多くの物質の流動は構成物質の性質や様子が異なったとしてもマクロな視点で見ると全てNavier-Stokes方程式
$\frac{Dv}{Dt}=-\frac{1}{\rho}gradp+\frac{\mu}{\rho}\Delta v+\frac{\lambda+\mu}{\rho}grad\theta+\theta+\frac{\theta}{\rho}grad(\lambda+\mu)+\frac{1}{\rho}grad(v・grad\mu)+\frac{1}{\rho}rot(v×grad\mu)-\frac{1}{\rho}v\Delta \mu+g$
($v$:流れの流速場、$\rho$:密度場、$g$:加速度場、$p$:圧力、$\mu$:剪断粘性率、$\theta$:速度場の発散)
に従っています。この方程式はミクロから導かれていますが、多糖類をたくさん集めて合成させた高分子ゲルの流動方程式は複雑な挙動のためこの方程式には従いません。流動性を失ったゲルは巨大な網目状のネットワークを形成するのです。

# ゲルの種類と形成
ゲルの形成方法は高分子の種類によってさまざまです。澱粉や寒天など均一な分散媒を固めたものは高温の状態から低温にすることで分子間の相互作用度が上昇し架橋点ができることで網目構造が完成します。それに対して低温状態では液体でも高温化させることでゲル化する物質も存在します。これは水溶液中では水と結合することで溶解していますが、高温度になると熱運動のために水和状態が減り、疎水基の結合が起きることでゲル化するといわれています。加熱によって分子構造の変化が起こり、分子間にネットワークを形成することで起きると考えられているからです。

物質によってさまざまですが

<エッグボックスモデルに多い性質>
・加熱して溶解することでイオン化させたゲル→耐熱性に優れやすい
![img04.jpg](https://qiita-image-store.s3.amazonaws.com/0/223549/365466d3-b25a-50cc-db53-581572b8f978.jpeg)
図3:エッグボックスモデルの可視化

<分子間相互作用に多い性質>
・加熱や冷却などの温度変化で生成された固体の高分子ゲル→耐酸性に優れやすい

といった優れた点があります。

# 架橋の立場から
物理的架橋の数や強度は合成する物質の重合度とゲルに転移するまでの時間が関係します。物質の重合度は架橋剤という架橋構造を作りやすい物質を投与したり、二重結合や三重結合を切り離して、開環重合によってくっつけることで強度が増します(重合度がますということはエネルギーも当然高くなる)。ゲルへの転移の時間はゲル中に占める反応物質の量子数と反応度が関係していて、これもエネルギーの変動を考慮するために分子のネットワークを為す結合の長さで判定します。


# 終わりに
ざっくりと液体のゲル化について見てきたわけではありますが、まだ本質的な(というか自分の興味ある)ところまでは到達していません。ゲル化を語る上で大事な性質で「熱可逆ゲルのレオロジー」という固体と液体の両方の性質を見せるゲルのネットワーク構造を調べるものがあります。
今回は期末試験前日の1.5時間で書き上げた記事なので導入で内容が薄いですが、今後はこのゲルのネットワーク構造を学んでいこうと思います。
AWSのubuntuでbitcoind起動(testnet)

# Ubuntuにbitcoindを入れよう

[Bitcoin Core を AWS で動かしてみる](https://qiita.com/sqrtxx/items/6e95926ac29ac27728e8)

↑鬼参考になります。

## ストレージが足りないので、mountしよう。

初期設定だと基本ストレージ足りませんので、ストレージ追加します。

EBSでストレージを追加、インスタンスにアタッチします。

その後

(xvdg)は各自切り替え

```
sudo su -
mkdir /data2
mount /dev/xvdg /data2
```

## 書き込みできるかチェック

```
mkdir -p /data2/test/file/to/ 
echo "this is text file" > /data2/test/file/to/test.txt
cat /data2/test/file/to/test.txt
```

```
this is text file
```

## 自動マウントの設定

>このままだとEC2インスタンスをSTOP等をした際に、マウントが外れてしまうので、自動マウントするように設定しておく。
意外と忘れがち。
以下を/etc/fstabの末尾に追加する。

```
/dev/xvdg /data2 ext4 defaults 1 1
```

## bitcoindを起動

まずは、bitcoin.confのdatadirで/data2(さっき指定したディレクトリ)を指定

```bitcoin.conf
rpcuser=root
rpcpassword=bitroot

HOST=localhost

server=1
txindex=1

rpcport=18332
testnet=3

datadir=/data2
```

ディレクトリを/usr/binにうつして、bitcoidを起動しよう

```
cd /usr/bin
./bitcoind -testnet -daemon
```

これで起動してもいいけど、最初のうちはコンソール出力したほうがいいかも。

```
./bitcoind -testnet -printtoconsole
```

##　結果

```
00000 in blk00004.dat
2018-01-23 15:13:40 UpdateTip: new best=000000000bf873bfec3b2ed7fe9feaca4d119eb6d584cdcd2387c27460f6e388 height=207360 version=0x00000002 log2_work=58.246667 tx=1290276 date='2014-03-23 05:51:29' progress=0.076149 cache=311.8MiB(2239277txo)
2018-01-23 15:13:40 UpdateTip: new
...
best=00000000000b6365327c7e408c22ea27ae43199c9813bb876ad82925859b0b31 height=207437 version=0x00000002 log2_work=58.250024 tx=1291019 date='2014-03-23 07:21:58' progress=0.076193 cache=316.7MiB(2279164txo)
2018-01-23 15:13:41 UpdateTip: new 
...
```

そりゃストレージ死にますな。
僕の場合、デフォルトで650MiBくらいに到達したタイミングで

```
Disk space is low!
```
とか言われました。ですよねー。

## 参考

- [既存EC2インスタンスにEBSボリュームを追加（アタッチ）する](https://qiita.com/yuppi/items/ceed29f19e2b38fd0a79)
- [Bitcoin Core を AWS で動かしてみる](https://qiita.com/sqrtxx/items/6e95926ac29ac27728e8)
- [bitcoindのブロック保存先ディレクトリを指定する]
(https://endoyuta.com/2017/05/14/bitcoind%E3%81%AE%E3%83%96%E3%83%AD%E3%83%83%E3%82%AF%E4%BF%9D%E5%AD%98%E5%85%88%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E3%82%92%E6%8C%87%E5%AE%9A%E3%81%99%E3%82%8B/)
pandasの要素抽出　個人メモ

pandasにおけるデータの取り出し方についてメモ。
DataFrame型に絞ります。
都度更新して行きます。

# 1.columnの指定
DataFrame型のデータに対して、カラム名を指定することでそのカラムに属するデータを抽出できる。

```python:columnの指定
import pandas as pd
sample = pd.DataFrame({'A':[1,4,6],'B':[2,5,7],'C':[3,6,8]})
sample
sample['A']
```
*→ sample*

|  |A  |B  |C  |
|---|---|---|---|
|0  |1  |2  |3  |
|1  |4  |5  |6  |
|2  |6  |7  |8  |

*→ sample['A']*

|   |A  |
|---|---|
|0  |1  |
|1  |4  |
|2  |6  |


また、複数のカラム名を指定してデータを抽出することも可能。
ただし、その場合抽出されるデータが二次元となるため、
[ ] を一段増やすことを忘れてはいけない。

```python:複数のカラム指定
sample[['A','B']]
```

|   |A  |B  |
|---|---|---|
|0  |1  |2  |
|1  |4  |5  |
|2  |6  |7  |


# 2.iloc系による抽出
## iloc
カラム名ではなく、行列の要素番号を指定してデータを抽出する場合には iloc を用いる。

```python:ilocによる抽出
sample.iloc[[1],[2]]  #１行目の２列目(０行目、０列目があることに注意)、を指定
sample.iloc[:,1:]     #全ての行の1列目以降、を指定
sample.iloc[[1]]      #１行目を指定
```

*→ sample.iloc[[1],[2]]*

|   |C  |
|---|---|
|1  |6  |

*→ sample.iloc[:,1:]*

|   |B  |C  |
|---|---|---|
|0  |2  |3  |
|1  |5  |6  |
|2  |7  |8  |

*→ sample.iloc[[1]]*

|   |A  |B  |C  |
|---|---|---|---|
|1  |4  |5  |6  |


## loc
要素番号ではなく、列名または行名を用いてデータを抽出する場合には loc を用いる。
なおsampleでは行名が[0, 1, 2 ]となっているが、これはindexではなく名前だと認識する。

```python:locによる抽出
sample.loc[[0], ['A']]  #「０」という名の行のA列
sample.loc[[2], ['C']]　#「２」という名の行のC列
sample.loc[[1]]         #「１」という名の行を指定
```

* → sample.loc[[0] , ['A']]*

|   |A  |
|---|---|
|0  |1  |

* → sample.loc[[2] , ['C']]*

|   |C  |
|---|---|
|2  |8  |

*→ sample.loc[[1]]*

|   |A  |B  |C  |
|---|---|---|---|
|1  |4  |5  |6  |


## ix
要素番号、カラム名のいずれも使用してデータを抽出する場合には ix を用いる。


```python:ixによる抽出
sample.ix[[2],[2]]
sample.ix[[0],1:]
```

*→ sample.ix[[2],[2]]*

|   |C  |
|---|---|
|2  |8  |

*→ sample.ix[[0],1:]*

|   |B  |C  |
|---|---|---|
|0  |2  |3  |


## iloc,loc,ix まとめ
- ilocは index を用いてデータを抽出する
- locは 列名または行名 を用いてデータを抽出する
- ixは index,列名,行名 の両方を用いて（あるいは一方だけを用いて）データを抽出する


###抽出に成功するパターンと失敗するパターン

```python:iloc,loc,ixにおける成功と失敗パターン
sample.iloc[[0],[0]]        #成功
sample.iloc[[0],['A']]      #失敗。iloc はindex(要素番号)でしかアクセスできない

sample.loc[[0],['A']]       #成功
sample.loc[[0],[0]]         #失敗。loc は名前でしかアクセスできない

sample.ix[[0],[0]]          #成功
sample.ix[[0],['A']]        #成功

```
Kotlin コード規約（ Coding conventions for libraries ）

[公式](http://kotlinlang.org/docs/reference/coding-conventions.html)の和訳（意訳）です．

- [IDEでスタイルを設定する, ソースコード構成](https://qiita.com/hmiyado/items/2531be40b3369173a2cd)
- [命名規約](https://qiita.com/hmiyado/items/feea2cdd196ef53b1a1a)
- [フォーマット 前半](https://qiita.com/hmiyado/items/2ad86df1d0cb842beee6)
- [フォーマット 後半](https://qiita.com/hmiyado/items/4667994ea71fe4c76484)
- [ドキュメントコメント，冗長な記述を避ける](https://qiita.com/hmiyado/items/05cae7df64d6d0138594)
- [慣用表現の使用](https://qiita.com/hmiyado/items/94792e428e5993bc8fc6)
- ライブラリのコード規約(この記事)

# ライブラリのコード規約

ライブラリを書くときは，APIを安定させるために，追加で以下の規約に従うことを推奨する．

- メンバの可視性を明示する（不用意に public API として宣言することを避ける）
- 関数の返り値やプロパティの型を明示する（実装を変更するときに，不用意に型も変えてしまうことを避ける）
- すべての public なメンバに KDoc コメントをつける．ただし，新しいドキュメントが不要なオーバーライドを除く（ライブラリのドキュメント生成をサポートする）
XSLTでXMLの属性を変更・削除・追加する

###XSL
```xml:test.xsl
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:x="http://www.w3.org/1999/xhtml">

  <xsl:output method="xml" encoding="utf-8" />

  <!-- 要素・属性をコピー -->
  <xsl:template match="/|node()|@*">
    <xsl:copy>
      <xsl:apply-templates select="node()|@*" />
    </xsl:copy>
  </xsl:template>

  <!-- 属性値を変更 -->
  <xsl:template match="x:div[@id='a_modify']/x:p/@style">
    <xsl:attribute name="style">color:blue;</xsl:attribute>
  </xsl:template>

  <!-- 属性を削除 -->
  <xsl:template match="x:div[@id='a_delete']/x:p/@style">
  </xsl:template>

  <!-- 属性を追加 -->
  <xsl:template match="x:div[@id='a_add']/x:p">
    <xsl:copy>
      <xsl:attribute name="style">color:red;</xsl:attribute>
      <xsl:apply-templates select="node()|@*" />
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>
```
###XML(in)
```xml:test_in.xml
<?xml version="1.0" encoding="utf-8" ?>
<?xml-stylesheet type="text/xsl" href="test.xsl"?>
<html xml:lang="jp" lang="jp" xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"></meta>
<title>XSLTメモ (002)</title>
</head>
<body>
<div id="a_modify">
<h1>XSLTでXMLの属性の値を変更する</h1>
<p style="color:red;">style属性のcolorプロパティを変更する</p>
</div>
<div id="a_delete">
<h1>XSLTでXMLの属性を削除する</h1>
<p style="color:red;">style属性を削除する</p>
</div>
<div id="a_add">
<h1>XSLTでXMLの属性を追加する</h1>
<p>style属性を追加する</p>
</div>
</body>
</html>
```
###XML(out)
```xml:test_out.xml
<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="test.xsl"?>
<html xml:lang="jp" lang="jp" xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"></meta>
<title>XSLTメモ (002)</title>
</head>
<body>
<div id="a_modify">
<h1>XSLTでXMLの属性の値を変更する</h1>
<p style="color:blue;">style属性のcolorプロパティを変更する</p>
</div>
<div id="a_delete">
<h1>XSLTでXMLの属性を削除する</h1>
<p>style属性を削除する</p>
</div>
<div id="a_add">
<h1>XSLTでXMLの属性を追加する</h1>
<p style="color:red;">style属性を追加する</p>
</div>
</body>
</html>
```
XSLTでXMLの要素・属性をコピーする

###XSL
```xml:test.xsl
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:x="http://www.w3.org/1999/xhtml"
  >

  <xsl:output method="xml" encoding="utf-8" indent="yes" />

  <!-- 要素・属性をコピー（空要素タグが展開されない） -->
  <xsl:template match="x:hr|x:br">
    <xsl:copy-of select="."/>
  </xsl:template>

  <!-- 要素・属性をコピー -->
  <xsl:template match="/|node()|@*">
    <xsl:copy>
      <xsl:apply-templates select="node()|@*" />
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>
<!--
msxsl test_in.xml test.xsl -o test_out.xml
-->
```

空要素タグのうち、`hr`タグと`br`タグは、`xsl:copy-of`でコピーする。
`meta`タグは、`xsl:copy`でコピーする。

###XML(in)
```xml:test_in.xml
<?xml version="1.0" encoding="utf-8" ?>
<?xml-stylesheet type="text/xsl" href="test.xsl"?>
<html xml:lang="jp" lang="jp" xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>XSLTメモ (001)</title>
</head>
<body>
<h1>XSLTでXMLの要素・属性をコピーする</h1>
<p style="color:red;">XSLTでXMLの要素・属性をコピーする</p>
<p>XSLTでXMLの<br/>
<b>空要素タグ</b>
<br/>をコピーする</p>
<hr/>
</body>
</html>
```

`xsl:copy-of`でコピーされた`hr`タグと`br`タグは、展開されていない。
`xsl:copy`でコピーされた`meta`タグは展開されている。
**※今のところ、`msxsl`でのみ確認**

###XML(out)
```xml:test_out.xml
<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="test.xsl"?>
<html xml:lang="jp" lang="jp" xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</meta>
<title>XSLTメモ (001)</title>
</head>
<body>
<h1>XSLTでXMLの要素・属性をコピーする</h1>
<p style="color:red;">XSLTでXMLの要素・属性をコピーする</p>
<p>XSLTでXMLの<br />
<b>空要素タグ</b>
<br />をコピーする</p>
<hr />
</body>
</html>
```