OmniAICreator/Qiita-1.07M huggingface dataset:
Seleniumでページ読み込みのリトライを試す

## 概要
Seleniumでページの読み込みが終わらない現象が時々発生し、エラーとなってテスト実行が不安定となるため、リトライを試してみる。

## ページの読み込み最大待ち時間の指定する
とりあえず、読み込みを待つ最大の時間をセットして、
ページ読み込みが終わらない場合は終了させる。

```python3
from selenium import webdriver
 
driver = webdriver.Chrome("D:\chromedriver")
driver.set_page_load_timeout(10)　　# 10秒

try:
    driver.get("https://google.co.jp/")
    print("The page was loaded in time！")
except:
    print("time out!")
```

## リトライ処理を実装する
ページの読み込みに失敗したら、リトライするように実装してみる。

```python3
#!/usr/bin/python

import unittest, time
from selenium.common.exceptions import TimeoutException

class TestHoge(unittest.TestCase):

    RETRIES = 3
    TIMEOUT = 10

    """初期化"""
    def setUp(self):
        self.browser = Browser()

    """テスト終了"""
    def tearDown(self):
        self.browser.quitBrowser()

    """PCサイト"""
    def testPcSite(self):
        # ブラウザ起動
        self.browser.openChrome()
        driver = self.browser.driver
        driver.maximize_window()  # 最大化
        driver.implicitly_wait(2) # 暗黙の待機(2秒)

        # ページの読み込み待ち時間(10秒)
        driver.set_page_load_timeout(self.TIMEOUT)

        i = 0
        while i < self.RETRIES:
            try:
                driver.get("https://google.co.jp/")
                time.sleep(5)

            except TimeoutException:
                i = i + 1
                print("Timeout, Retrying... (%(i)s/%(max)s)" % {'i': i, 'max': self.RETRIES})
                continue

            else:
                return True

        msg = "Page was not loaded in time(%(second)s sec)." % {'second': self.TIMEOUT}
        raise TimeoutException(msg)


##### MAIN #####
if __name__ == "__main__":
    unittest.main()
```

## 参考サイト
- [Set up a default exception handler when unable to locate an element in selenium?
](https://stackoverflow.com/questions/9221583/set-up-a-default-exception-handler-when-unable-to-locate-an-element-in-selenium)
- [【Python】set_page_load_timeout](http://www.seleniumqref.com/api/python/time_set/Python_set_page_load_timeout.html)
- [Selenium webdriver with python- how to reload page if loading takes too long?
](https://stackoverflow.com/questions/25173217/selenium-webdriver-with-python-how-to-reload-page-if-loading-takes-too-long)
- [Python selenium refresh if wait more than 10s
](https://stackoverflow.com/questions/43003924/python-selenium-refresh-if-wait-more-than-10s)
- [Pythonでタイムアウト処理](http://uyamazak.hatenablog.com/entry/2016/11/16/160326)
- [Pythonでリトライ処理を考える](http://uyamazak.hatenablog.com/entry/2017/01/17/170235)
nginxで、connect() failed (111: Connection refused) while connecting to upstreamってエラーにハマった。

#エラーは突然に
ある瞬間、ステージ環境（EC2）にアクセスすると５０２を返すようになった。
昨日まで難なく動いていたのに。結合環境は動くのでソースのせいではないようだ。
受入試験真っ只中、どうする、私。



##とりあえず、エラーは？
nginxのエラーは以下の通りです。

```error.log
2018/02/06 04:31:01 [error] 3107#0: *3318 connect() failed (111: Connection refused) while connecting to upstream, client: xxx.xxx.xxx.xxx, server: localhost, request: "GET / HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "hoge.com"
```
キーワードは「**upstream**」と「**fastcgi**」なんじゃないかなぁと推測。

#解決方法
php-fpm.confの「listen」とnginx.confの「fastcgi_pass」は同じでなければなりません。

- php-fpm.confの確認
 - listen = /var/run/php-fpm.sock
- nginx.confの確認
 - fastcgi_pass   127.0.0.1:9000;

あってなくね？

nginx.confのfastcgi_passの部分をphp-fpm.confと揃えてあげればいいので

```nginx.conf
 fastcgi_pass   unix:/var/run/php-fpm.sock;
```
ってして、reloadしてあげれば解決。
（nginxのreloadって本当に便利）
自分用 laravelのDB設定用メモ

```ruby:config/database.php
   'mysql' => [
            'driver' => 'mysql',
            'host' => 'localhost',
            'port' => env('DB_PORT', '3306'),
            'database' => 'DB名',
            'username' =>'MySQL Login用ID',
            'password' => 'MySQL Login用pw',
            'unix_socket' => env('DB_SOCKET', ''),
            'charset' => 'utf8mb4',
            'collation' => 'utf8mb4_unicode_ci',
            'prefix' => '',
            'strict' => true,
            'engine' => null,
        ],

```

後々調べるのがめんどうなので書いておく
fzf.vimを使ってctags検索をしてみる

ctagsの検索にfzfが良いよと教えてもらったので、試してみました。

# Install

## fzf
https://github.com/junegunn/fzf

まずはHomebrewでfzfをインストール

    $ brew install fzf

.vimrcに追記

    set rtp+=/usr/local/opt/fzf

## fzf.vim
https://github.com/junegunn/fzf.vim

fzf.vimのGithubを見ながらインストール。
上記サイトではvim-plugを使用していたけど、私はNeoBundleを使っているので下記のよう.vimrcに記述してインストール

```
NeoBundle 'junegunn/fzf', { 'dir': '~/.fzf', 'do': './install --all' }
NeoBundle 'junegunn/fzf.vim'
```
## 設定

.vimrcに下記を追加しました。

```
" deniteと合わせて上部に表示
let g:fzf_layout = { 'up': '~40%' }

" <C-]>でタグ検索
nnoremap <silent> <C-]> :call fzf#vim#tags(expand('<cword>'))<CR>

" fzfからファイルにジャンプできるようにする
let g:fzf_buffers_jump = 1
```

良さげなのでしばらく使ってみます。
systemd-networkでstatic route設定

# 概要
coreosでルーティング設定を行うときにstatic routeの設定に手間取ったので記載
固定IP設定しつつstatic route設定を行おうとする場合に注意が必要


# 環境
CoreOS 1632.2.1
systemd 235

# 設定
## 最初に行った設定
```
localhost ~ # cd /etc/systemd/network/
localhost network # cat 10-eth0.network
[Match]
Name=eth0

[Network]
Address=XXX.XXX.XXX.XXX/XX
Gateway=YYY.YYY.YYY.YYY
LinkLocalAddressing=no
IPv6AcceptRA=no


localhost network # cat 20-static.network
[Route]
Destination=xxx.xxx.xxx.xxx/xx
Gateway=yyy.yyy.yyy.yyy
```
再起動して`ip r`してみるも、static routeが設定されていないのでログを確認する

```
localhost ~ # journalctl -u systemd-networkd

-- Reboot --
Feb 06 11:55:46 localhost systemd[1]: Starting Network Service...
Feb 06 11:55:46 localhost systemd-networkd[599]: Enumeration completed
Feb 06 11:55:46 localhost systemd[1]: Started Network Service.
Feb 06 11:55:46 localhost systemd-networkd[599]: lo: Could not set route: Network is unreachable

```
loに対して設定しようとしてる！
ってことでデバイス指定するように修正

## デバイス指定してみたver
```
localhost network # cat 20-static.network
[Match]
Name=eth0

[Route]
Destination=xxx.xxx.xxx.xxx/xx
Gateway=yyy.yyy.yyy.yyy
```
再起動後`ip r`してみるが、やはりstatic routeが設定されていない。。。
ログを確認するとエラーは出なくなっており、設定ファイルの読み込み自体がスキップされたっぽい
gateway違うしファイル分けていたけど分けないように設定してみる

## ファイル一緒にしてみたver
```
localhost ~ # cd /etc/systemd/network/
localhost network # cat 10-eth0.network
[Match]
Name=eth0

[Network]
Address=XXX.XXX.XXX.XXX/XX
Gateway=YYY.YYY.YYY.YYY
LinkLocalAddressing=no
IPv6AcceptRA=no

[Route]
Destination=xxx.xxx.xxx.xxx/xx
Gateway=yyy.yyy.yyy.yyy
```
再起動後ipコマンド叩く

```
localhost ~ # ip r
default via YYY.YYY.YYY.YYY dev eth0 proto static
XXX.XXX.XXX.XXX/XX dev eth0 proto kernel scope link src XXX.XXX.XXX.XXX
xxx.xxx.xxx.xxx/xx via yyy.yyy.yyy.yyy dev eth0 proto static
```
無事追加されました！
IBM Watson Conversationを利用して、無料でコーディングせずにLINE BOTを作ってみた

IBM Cloud（Bluemix）を利用して、無料でコーディングせずにWatsonを使ったLINE BOTを作成する手順を紹介します
※基本的には私がチャットボットを作成した際に、参考とさせて頂いたリンク先の紹介になります
　ご了承ください

##本記事の内容
<ul>
 	<li>IBM「Watson Conversation」AI機能の仕組み体験</li>
 	<li>LINE BOTアカウント作成</li>
 	<li>Node-REDを用いたアプリケーション作成</li>
</ul>

#作成手順概要
<ol>
 	<li>IBM Cloudへの登録</li>
 	<li>環境構築（Node-RED）</li>
 	<li>環境構築（Watson Conversation）及び対話シナリオ構築</li>
 	<li>LINE BOTアカウント作成</li>
 	<li>Node-REDを用いて、WatsonとLINE BOTをつなげる</li>
</ol>


#作成手順詳細
##1.IBM Cloudへの登録
　2017年11月よりIBM Cloudを無償かつ無期限で使えるライト・アカウントが導入されています。事前クレジットカード登録も不要なので、誰でも簡単に登録できます。以下のリンクを参考に登録してみてください

[IBM Cloud (Bluemix) ライト・アカウント作成手順](https://qiita.com/KenichiSekine/items/249d2ff691b6565fb127)


##2.環境構築（Node-RED）
事前に利用する環境を構築します。まずは、Node-REDを使えるようにしましょう
以下のリンク先の手順２を参考にしてください

[Watsonに博多弁をしゃべらせてみた](https://qiita.com/asasaki/items/15e22f359da193669408)

※Node-RED StarterボイラープレートはInternet of Things Platform Starterボイラープレート」に読み代えてください
理由はこちら：[IBM Cloud（Bluemix）のライトアカウントでNode-REDを利用する](https://qiita.com/mk57move/items/d25a504ebc5acdef66c8)

##3.環境構築（Watson Conversation）及び対話シナリオ構築
それではいよいよWatson Conversationの構築です。この手順が完了すれば、Watson ConversationのAI機能の仕組みがある程度分かるはずです
先ほどと同様のリンク先の手順４．５を参考にしてください
[Watsonに博多弁をしゃべらせてみた](https://qiita.com/asasaki/items/15e22f359da193669408)

##4.LINE BOTアカウント作成
それでは次に、LINE BOTのアカウント作成をしていきます。以下のリンク先より手順に沿って実施してください
[LINE Messaging APIを使ってBotを作成する](https://simple-it-life.com/2017/08/20/line-bot/)


##5.Node-REDを用いて、WatsonとLINE BOTをつなげる
いよいよ大詰めです、作成したチャットボットとLINEアカウントをNode-REDで紐づけましょう
まずは下記リンク先を開いてください

[LINE BOTからWatson Conversationを使ってみる](https://simple-it-life.com/2017/09/03/line-watson/)

リンク先の中段くらいにある「Node-REDでWatson Conversationを使用する」以降を参考に、設定をします
※ここではjsonファイルで設定されたものをベースに、値だけ変更する手順としています
※設定完了後のデプロイは忘れずに！


<hr />

以上で手順は終了です、お疲れさまでした。
【Laravel】メアド以外でログインしたい

標準の

```shell-session
$ php artisan make:auth
```
でログインを作るとメアドとパスワードでログインするようになる。
メアドではなく name でログインする方法
LoginController に以下の関数を追加する。別のフィールドをログインに使う場合はそのフィールド名を記述

app/Http/Controllers/Auth/LoginController.php

```php
+    public function username()
+    {
+        return 'name';
+    }
```

ログイン画面をカスタマイズする。
resources/views/auth/login.blade.php

```haml
-                        <div class="form-group{{ $errors->has('email') ? ' has-error' : '' }}">
-                            <label for="email" class="col-md-4 control-label">メールアドレス</label>
-
-                            <div class="col-md-6">
-                                <input id="email" type="email" class="form-control" name="email" value="{{ old('email') }}" required autofocus>
-
-                                @if ($errors->has('email'))
-                                    <span class="help-block">
-                                        <strong>{{ $errors->first('email') }}</strong>
-                                    </span>
-                                @endif
-                            </div>
-                        </div>
+                        <div class="form-group{{ $errors->has('name') ? ' has-error' : '' }}">
+                            <label for="name" class="col-md-4 control-label">名前</label>
+
+                            <div class="col-md-6">
+                                <input id="name" type="text" class="form-control" name="name" value="{{ old('name') }}" required autofocus>
+
+                                @if ($errors->has('name'))
+                                    <span class="help-block">
+                                        <strong>{{ $errors->first('name') }}</strong>
+                                    </span>
+                                @endif
+                            </div>
+                        </div>
```

この他にもユーザー名が重複しないようバリデーションチェックを入れるとかの対応は必要だが、とりあえずこれで name でログインが可能になる。

usersテーブルのemailフィールド同様、nameフィールドも unique にしておいた方が良いかもね。

[- 目次 -](https://qiita.com/search?q=laravel+nekyo)
【Rails】タグ付け機能を一対多で実現する方法

# はじめに
ツイートにタグ付け機能を付与する際、多対多、一対多のどちらで実装するかでそれぞれのメリットが存在するかと思います。
・多対多のメリット：タグ一覧ページ、タグの詳細ページを実装しやすい。
・一対多のメリット：create,updateが実装しやすい。中間テーブルを作る必要が無い。

今回は一対多での実装の際にネックとなる、tags_controllerにおけるindex action, show actionの作成について投稿させていただきます。
多くの参考記事で多対多による実装が載っていますが、この点さえクリアできれば、一対多の方が簡単に実装できると感じています。)

# コード
```db/migrate/xxxxx_create_tags.rb
class CreateTags < ActiveRecord::Migration
  def change
    create_table :tags do |t|
      t.string :name, index: true
      t.references :tweet, foreign_key: true
    end
  end
end
```

```app/models/tweet.rb
class Tweet < ActiveRecord::Base
  has_many :tags, dependent: :destroy
end
```

```app/models/tag.rb
class Tag < ActiveRecord::Base
  belongs_to :tweet
end
```

```app/controllers/tags_controller.rb
class TagsController < ApplicationController
  def index
    @tags = []
    Tag.order("name ASC").each do |tag|
      i = 0
      @tags.each do |t|
        if tag.name != t.name
          i += 1
        end
      end
      if i == @tags.length
        @tags << tag
      end
    end
  end

  def show
    @tag = Tag.find(params[:id])
    @tweets = []
    Tweet.all.each do |tweet|
      tweet.tags.each do |tag|
        if tag.name == @tag.name
          @tweets << tweet
          break
        end
      end
    end
  end
end
```
# 終わりに
indexのviewページでは、作成されたタグの一覧を表示、showのviewページでは、該当のtagが付けられたツイートの一覧を表示します。
それぞれ、@tags、@tweetsを用いることで、タグ,ツイートを被らせることなく表示することを実現できます。
(なお、配列から重複を取り除く際、rubyではuniqというメソッドが存在しますが、配列の中身がハッシュの際に上手く使用できないようなので、今回は上記のようなコードを書きました。また、本記事はgem:acts-as-taggable-onを使用しないことを前提としています。)

以上、内容に不備がございましたら、コメントいただけますと幸いです。
Digital Ocean で Discourse 立てた

# Discourse を Digital Ocean で立てたときのメモ

立ててる途中に気づきましたが，Digital Ocean にはワンクリックで Discourse などのアプリケーションを立てられるイメージもあります。月1000円，時間料金2円からのやつ。

以下は[公式ドキュメント](https://github.com/discourse/discourse/blob/master/docs/INSTALL-cloud.md)に従って作成。

## デプロイ環境

安いのと，Discourse 公式のおすすめになってることから DigitalOcean で。

- Droplets の最小構成で立てた
    - 月500円くらい，時間1円くらい
    - Ubuntu 16.04.3 x64
    - 1 GB メモリ
    - シンガポールリージョン
    - バックアップON
        - 料金が月額料金の20%ぶん固定で増える。今回なら月100円固定
    - droplet name はなんでもいい
    - DNS機能にドメインを追加
        - Aレコードは必ず追加
        - DNSレコードは割りと一瞬で浸透するので、 https://www.whatsmydns.net/ とか使うとよくわかる。なんかつながらないなと思ったらDNSレコードの設定ミス


## ドメイン

お名前.com にした。

- ドメイン>初期設定>ドメイン詳細>ネームサーバー設定に「その他のネームサーバー」として ns1.digitalocean.com./ns2/ns3 を登録
    - これやらないとDigitalOceanのDNSが働かない
- モダンな人は Google domains とかでやるのでしょうか。

## メールプロバイダ

これも公式おすすめ筆頭のMailgunで。

- 毎月10,000通まで無料
- SPFとDKIMが発行されるので DigitalOcean のコントロールパネル/Network/Domains のDNSレコードから設定
    - DigitalOcean の DNS レコード追加の HOSTNAME 欄ではドメイン欄が自動補完されるので注意。
- "Check DNS" ボタンを連打しても反映されない場合はたいていDNSレコードに設定された内容がおかしい
- Settings にタイムゾーン設定あり

## discourse installation

基本的に `./discourse_setup` で終わる。

- Hostname: フルドメイン
- Email address for admin: 管理者のアカウント作成用メールアドレス
- SMTP address: smtp.mailgun.org
- SMTP port: 587 (default)
- SMTP username: スクリプトでやるとなぜかドメイン先頭の `mail.` が削られるので、1回スクリプトまわしたら `/var/discourse/container/app.yml` を直接編集してリビルドするほうが良い
- Let's Encrypt account email: 
    - 最初はOFFでないとサイトにアクセスできない
    - あとで有効にして rebuild する
    - メルアドはこの時点で Let's Encrypt 登録されてなくてよい

## ビルド後の初期セットアップ
TOSとプライバシーポリシーは適当でも名前を入れて生成しておいたほうがあとで楽。
VSCodeでタスク実行時に複数コマンド実行

[Visual Studio Code: Task 機能に複数の任意のコマンドを簡単に仕込む方法 - Qiita](https://qiita.com/usagi/items/5a0f4edc99420173abb3) という投稿がありましたが、最近のversionでは`"dependsOn"`プロパティを使って各タスクの依存関係を記述できます。

```json:tasks.json
{
  "version": "2.0.0",
  "tasks": [
    {
      "label": "cmake",
      "type": "shell",
      "command": "cmake",
      "args": [
        "."
      ]
    },
    {
      "label": "make",
      "type": "shell",
      "command": "make",
      "dependsOn": [
        "cmake"
      ]
    },
    {
      "label": "test",
      "type": "shell",
      "command": "make",
      "group": {
        "kind": "build",
        "isDefault": true
      },
      "dependsOn": [
        "make"
      ],
      "args": [
        "test"
      ]
    },
  ]
}
```

このほうがよりクリアかつ保守性もよいかと思います。
AndroidでもMay'nちゃんで嵌まった

先日、SeleniumでXpathを使って特殊記号を使った文字列の検索に嵌まったことを書いたが、今度はAndroidアプリの名前にシングルクォート(アポストロフィ)を使おうとして嵌まってしまった。

何が問題だったかと言えば、Androidアプリでアプリの名称やホーム画面に表示されるアイコン下のキャプションを設定するには `app/src/main/res/values/strings.xml` に値を設定するわけだが、ここにXMLでの文字参照(エンティティ参照)のルールに従ってエスケープ処理して値をセットしてみる。
ちなみに設定したい文字列は前回のSeleniumの時と同じく “`May'n ちゃん "Love" & <1>`” という文字列です。

```xml:strings.xml
    <string name="app_name">May&apos;n ちゃん &quot;Love&quot; &amp; &lt;1&gt;</string>
```

ところがこの文字列リソースをコンパイルしようとすると以下の様にエラーになってしまう。

```console:
..../app/build/intermediates/data-binding-layout-out/debug/values/values.xml:XXX: error:
 Apostrophe not preceded by \ (in May'n ちゃん "Love" & <1>)
```

そこで注意された様にシングルクォート(アポストロフィ)は文字参照のルールに従ってエスケープした上に更にバックスラッシュでエスケープするとエラーは出なくなる。

```xml:strings.xml
    <string name="app_name">May\&apos;n ちゃん &quot;Love&quot; &amp; &lt;1&gt;</string>
```

という罠…

実は、この罠には続きがあってシングルクォート(アポストロフィ)だけではなくてダブルクォートの方にも罠が仕掛けられていて、ダブルクォートを単純に `&quot;` でエスケープすると何故か摩訶不思議な変換を行われてしまい、文字列が予期せぬ場所で途切れたりとエラーは出ないまでも思った通りの結果にはなってくれない。

これはどうやらユーザーによって記述されたリソース情報のXMLファイル中の情報を集めて一つの中間ファイル`values.xml`を作るらしいのだけど、この時に一旦エスケープされた文字が展開されてしまうらしく、この展開された文字列が含まれるXMLファイルをさらに解析処理しようとした際にエラーとなってしまうらしい。

```xml:values.xml
    <string name="app_name">May\'n ちゃん $quot;Love" &amp; &lt;1></string>
```

で、結局ダブルクォートを文字列に入れたいときはどうするか？というと、以下の様に `&quot` でエスケープするのではな `\"` (バックスラッシュとダブルクォート)でエスケープすると大丈夫らいです。

```xml:strings.xml
    <string name="app_name">May\&apos;n ちゃん \"Love\" &amp; &lt;1&gt;</string>
```

上記のように `strings.xml` に値を記述しておけば、それは以下のように展開され、これが更に解析された結果期待した文字列が得られるようです。
それでも未だ数字の `1` の後の `>` の処理とかに一抹の不安を覚えるのですが…

```xml:values.xml
    <string name="app_name">May\'n ちゃん \"Love\" &amp; &lt;1></string>
```

誰か、この辺りの正しい記述方法や正式なドキュメントの在り処をご存知ないでしょうか？
nodebrewとyarnを導入する場合の注意点

[Homebrew](https://brew.sh/index_ja.html)を使って[nodebrew](https://github.com/hokaccha/nodebrew)と[Yarn](https://yarnpkg.com/lang/en/)とを導入しました。
でもnodebrewで複数バージョンのNode.jsを入れて`$ nodebrew use v7`とかやっても **切り替わらない。**
おかしいと思って調べてたんですが、どうやらYarnを入れた際に、Yarn付属（？）のNode.jsが入ってたようで、それが原因のようでした。
nodebrewもYarnもアンインストールした上で、以下のようにしたら解決。

## Yarnを「Node.js抜きで」インストール

```console
$ brew install yarn --without-node
```
## nodebrewをインストール

```console
$ brew install nodebrew
```

## `.bashrc`にパス記述追加


```Bash:~/.bashrc
export PATH="/usr/local/bin:$PATH"
#追加したのはこちらの一行↓
export PATH=$HOME/.nodebrew/current/bin:$PATH
```

## `.bashrc`再読み込み

```console
$ source ~/.bashrc
```

これで動くようになりました！
ウェブキャッシュサーバ性能比較 nuster vs squid


テスト環境、ソフトウェアやハッドウェアスペック、システムパラメータ、コンフィグなどはここ: [https://github.com/jiangwenyuan/nuster/wiki/Web-cache-server-performance-benchmark:-nuster-vs-nginx-vs-varnish-vs-squid](https://github.com/jiangwenyuan/nuster/wiki/Web-cache-server-performance-benchmark:-nuster-vs-nginx-vs-varnish-vs-squid)　と同じです。

テスト通りnusterはsquidよりほぼ４倍はやい

nusterは最近v1.7.9.4をリリースしたので、ぜひ試して見てください、よければStarもください:)

NusterはHAProxyを元に開発したキャッシュサーバーで、HAProxyと互換性がある。
そしてHAProxyのACLを利用して細かいキャッシュルールを定義できる。

 * HAProxyのすべての機能や特徴がサポート、100%互換性
 * 動的キャッシング機能
   * HTTP method, URI, path, query, header, cookiesなどでキャッシング
   * HTTP request or response contentsなどでキャッシング
   * environment variables, server stateなどでキャッシング
   * SSL version, SNI　などでキャッシング
   * connection rate, number, byte　などでキャッシング
 * スーパー速い
 * キャッシュ purging
 * フロントエンドとバックエンド両方HTTPS
 * HTTP圧縮
 * HTTPリライトやリダイレクト
 * などなど


Squid config:

```
LimitNOFILE=1000000

### squid.conf

workers 12
http_port 10.0.10.13:8089 accel defaultsite=10.0.10.13
cache_peer     10.0.10.10 parent 8000 0 no-query originserver name=hp
cache_mem 500 MB
access_log none
cache_log /dev/null
logfile_rotate 0

via off
reply_header_access X-Cache deny all
reply_header_access X-Cache-Lookup deny all
reply_header_access Age deny all
```

squid 3.5.20 result

```
wrk -c 1000 -d 30 -t 100 http://10.0.10.13:8089/helloworld
Running 30s test @ http://10.0.10.13:8089/helloworld
  100 threads and 1000 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency    12.87ms    6.33ms 300.73ms   99.42%
    Req/Sec   796.69     49.06     2.00k    97.15%
  2380125 requests in 30.10s, 578.82MB read
Requests/sec:  79074.30
Transfer/sec:     19.23MB
```

squid 4.0.23 result

```
wrk -c 1000 -d 30 -t 100 http://10.0.10.13:8088/helloworld
Running 30s test @ http://10.0.10.13:8088/helloworld
  100 threads and 1000 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency    12.65ms    5.29ms 264.42ms   99.10%
    Req/Sec   806.15     54.14     2.18k    97.98%
  2408271 requests in 30.10s, 585.66MB read
Requests/sec:  80010.56
Transfer/sec:     19.46MB
```

nuster 1.7.9.4 result

```
wrk --timeout 300 -c 1000 -d 30 -t 100 http://10.0.0.13:8081/helloworld
Running 30s test @ http://10.0.10.13:8081/helloworld
  100 threads and 1000 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency     2.85ms    1.93ms 205.00ms   99.32%
    Req/Sec     3.58k   222.52     5.61k    74.26%
  10729455 requests in 30.10s, 2.55GB read
Requests/sec: 356469.04
Transfer/sec:     86.69MB
```

nginx cacheやvarnish cacheとの比較はここ：
[https://github.com/jiangwenyuan/nuster/wiki/Web-cache-server-performance-benchmark:-nuster-vs-nginx-vs-varnish-vs-squid](https://github.com/jiangwenyuan/nuster/wiki/Web-cache-server-performance-benchmark:-nuster-vs-nginx-vs-varnish-vs-squid)
サーバ　ディレクトリ用途

|ディレクトリ名|用途|
|---|---|
|bin|必須コマンドバイナリ|
|boot|ブートローダーの静的ファイル|
|dev|デバイスファイル|
|etc|ホスト固有のシステム構成|
|lib|必須共有ライブラリとカーネルモジュール|
|media|リムーバブルメディアのマウントポイント|
|mnt|一時的にファイルシステムをマウントするためのマウントポイント|
|opt|アドオンアプリケーションソフトウェアパッケージ|
|sbin|基本的なシステムバイナリ|
|srv|このシステムによって提供されるサービスのためのデータ|
|tmp|一時ファイル|
|usr|第2階層|
|var|可変データ|
Linux KVMについて(テスト投稿)

# Linux KVMについて  
自分なりにまとめたメモ

## KVMを構成する3つの要素
- QEMU
- KVM
- libvirt

### KVMって？

CPUの持つ仮想化支援機能を利用して、QEMUを高速化するためのカーネルモジュールだよ

### QEMUって？

仮想化のためのソフトウェアで、KVMモジュールとやり取りしてホストOSのCPUの仮想化支援機能を利用するよ

### libvirtって？

仮想環境を管理するためのライブラリ郡で、管理ツール(※1) を介してVMの作成や起動などの操作をすることができるよ

> (※1)libvirtの管理ツールには、  
virsh・・・CLIベース
virt-manager・・・GUIベース
oVirt・・・WEB UIベース　　　　　　　　｡｡｡などがあるよ


＜イメージ＞
【復習】Rubyの復習〜ビューファイルとかもろもろ〜

<h1><%= yield %>の意味
<h3>aplication.html.erbは全てのビューファイルを表示している
その中の<%= yield %>で各ビューファイルが表示される。
そのため、<%= yield %>の上にヘッダーを記述することで、各ビューファイルに共通したレイアウトを設定することができる。

<h1>params[:id]の意味
<h2>ルーティングを以下のように記述したとする
<h3>```get "posts/:id" => "posts#show"```
アクションで```params[:id]```と記述すると、URLに書かれた:idの部分を取得する

<h1>bcryptのインストール
<h3>Gemfileに```gem 'bcrypt'```と記述し、```bundle install```。
ここまではうまくいきました。

しかし、ブラウザ上で「Can't loading」をなってしまった。

ぐぐったりしたけど、うまくいかず、証明書がないとかSpringがうまく動作しないとかいろんな２次障害が起こった。
Githubで過去のコミットに戻り（果たしてこれも成功したのか危うい...)再挑戦したらなぜか成功。

bcryptのバージョンのせいでもなく、、、Gemfile.lockにbcrypt-Rubyの記述が無くなってたからこれが原因かも。

パスワードはハッシュ化しちゃったしいろいろ戻すのが面倒だったから、直ってよかった。
原因不明のまま進むのは危険だし、ちゃんと明確にしないと知識にならないんだけどね。

勉強のために作成してるWEBアプリを一通り作り終えてからまたやるつもり。bcryptの出番はこれからもたくさんあるだろうし。
MYSQLのパーティションテーブルを使ってみる

レコード種別によるパーティションを行う場合のメモ

# テーブル定義
動作確認のために, 以下のようなテーブルとデータを用意する

```sql
DROP TABLE IF EXISTS cards;

CREATE TABLE cards (
    card_id int (11) NOT NULL AUTO_INCREMENT
    , card_name varchar(255) NOT NULL
    , card_type  TYNYINT NOT NULL
    , PRIMARY KEY (card_id, card_type)
) PARTITION BY HASH(card_type) PARTITIONS 5;
```

パーティショニングするカラムをプライマリキーに含めなければならない.
パーティション対象のカラムは数値型でなければならない.
今回はMySQLで用意されたハッシュ関数をもとにして各テーブルへの割り振りを行っているが
`RANGE COLUMNS` や `LIST COLUMNS`を使うことで, 割り振りのルールを自分で定義することもできる.


# 実行計画の確認
実行計画を調べるときは`explain`ではなく`explain partitions`を使う

```
MariaDB []> explain partitions select * from p_cards where card_type=2;
+------+-------------+---------+----------------+------+---------------+------+---------+------+------+-------------+
| id   | select_type | table   | partitions     | type | possible_keys | key  | key_len | ref  | rows | Extra       |
+------+-------------+---------+----------------+------+---------------+------+---------+------+------+-------------+
|    1 | SIMPLE      | p_cards | p2             | ALL  | NULL          | NULL | NULL    | NULL |   212 | Using where |
+------+-------------+---------+----------------+------+---------------+------+---------+------+------+-------------+
1 row in set (0.00 sec)

```

`partitions`カラムで探索対象となったパーティションを知ることができる.


# 参考
[MySQLマニュアル](https://dev.mysql.com/doc/refman/5.6/ja/partitioning-limitations.html)
[パーティショニングの使用例 - カーディナリティが低いカラムを使って検索する場合](http://nippondanji.blogspot.jp/2009/04/1.html)
deferのclosureではまった話。あるいはちょっとしたクイズ

deferのclosureではまってしまったのでメモ。カウントした結果を出力したかった。以下はダメなコード。

## ダメなコードその1

```go
func ng() {
	c := 0
	defer fmt.Println("ng", "c=", c)
	for i := 0; i < 10; i++ {
		c++
	}
}
```

これは0が出力される。

```
ng c= 0
```

## ダメなコードその2

forのときと同じ気持ちで関数で受け渡す形にしてもダメ。

```go
func ng2() {
	c := 0
	defer func(n int){fmt.Println("ng", "c=", n)}(c)
	for i := 0; i < 10; i++ {
		c++
	}
}
```

scopeの問題ではないのでそれはそう。

```
ng c= 0
```


## 動くコード

```go
func ok() {
	c := 0
	defer func(n *int) { fmt.Println("ok", "c=", *n) }(&c)
	for i := 0; i < 10; i++ {
		c++
	}
}
```

はい。

```
ok c= 10
```
IE11(互換表示)でLightbox2を使う

jQueryの画像表示系plug-inの「Lightbox2」をサポート外のブラウザ「IE11(互換表示モード)」で動かした話です。
とりあえず動いた程度の話で、完全な表示/動作を保証するものではありません。

#環境
使用したブラウザ: IE11 (11.192.16299.0) 「互換表示モード(IE5相当)」
使用したLightbox2: v2.10.0

#背景
Lightbox2は(jQuery1.xなら)IE6以降をサポートしています。
使ったブラウザはIE11でしたが、残念ながら「互換表示」機能がON(IE5相当)だと正常に表示されませんでした。...ふつう。具体的には画像表示サイズが0になってしまい、画像が見えませんでした。
どうにかして互換表示モードでも最低限動くようにしたい。(Lightboxを使いたい)(本当はIEを使いたくないし互換表示とかなんでだよとは思っているけれど)

#表示がおかしくなる原因
調査してみたところ、$(window).widthの値が0になってたために画像サイズの決定ロジックがうまく動いていなかった。

#対応方法
`$(window).width`のところを代替コードにしても良かったんだけど、なるべくLightbox.modとか作りたくなかったので、そのままのコードでも動くようなオプションを指定することにしました。
具体的には`fitImagesInViewport`の指定を`false`にする。

```html
<script src="js/lightbox.min.js"></script>
<script type="text/javascript">
	//IEの互換表示で表示させるためのオプション指定
	lightbox.option({
		'fitImagesInViewport': false
	});
</script>
```

#結果
特に問題なく動きました。今回必要としていた機能が十分動くことは確認できました。
PHP(PDO) でかんたん mysql 接続

```php
/**
 * DB接続
 */
function pdo_connect() {
  // PDO
  try {
    $connection = new PDO('mysql:host=localhost;dbname=test', 'root', 'password');
  }
  catch (PDOException $e) {
    exit('データベース接続失敗。'.$e->getMessage());
  }

  return $connection;
}
```
Windowsのロングファイルパスに関して

#免責事項
この記事は個人メモとして書き留めておいたものを、分かりやすく纏めてみたものです。記事内容に間違い・補足事項等の指摘があれば適宜修正したいと思いますが、記事の内容を100%保証するものではありません。予めご了承ください。

#はじめに
Windowsのロングファイルパスは、その仕様を把握しておかないとバックアップがきちんと取得できないなどの問題が発生する可能性があります。

#ロングファイルパス仕様
MSサイトから
https://msdn.microsoft.com/ja-jp/library/930f87yf%28VS.80%29.aspx

![bbbb1.png](https://qiita-image-store.s3.amazonaws.com/0/234814/54e2bfbf-db60-9889-eaf8-68a5309e8477.png)

後部のメモ欄に非常に重要な情報が散りばめられています。

本題から逸れますが、Windows95から対応した『ロングファイルネーム』は最大250文字となっています。（※これが『ファイルパス』ではないことに注意してください。）それ以前のDOS環境では、ABCD1234.txt といったファイル名が最大の、いわゆる8.3形式でした。

対して、『ファイルパス』はOSとしては32768文字までサポートしています。
ただし互換性保持のため、通常は、WindowsAPI仕様による、_MAX_PATH=260では、最後のNUL文字を加味し、「ファイルのフルパス指定」のアクセスは259文字以下である必要があります。（以降、MAX_PATH制約と記載します。）
ファイルへのフルパスがMAX_PATH制約を超えた場合のエラーはWindows7や10のエクスプローラーでも発生し、コピーやリネーム等の操作でもエラーになります。（そのファイルへ、そのパスではアクセスできないため。）
つまり、エクスプローラーをはじめ、多くのソフトは、ロングファイルパスに対応していません。

# いくつかのソフトの対応状況

| ソフト名称等     |ロングファイルパス対応 | 備考  |
|:-----------------|:---------------------:|:------------------|
| Explorer         |        ×             | |
| BunBackup        |        ×             | |
| BunBackup L版    |        ○             | ロングファイルパス対応版 |
| ArcServe         |        △             |500文字前後までOK   |
| WinMerge         |        ×             | |
| 7-Zip            |        ○             | ファイルマネージャで操作可能 |


・BunBackupのロングファイルパス対応版は、別に用意されています。
これはバックアップ先などで階層が深くなり、長いパスになった場合に、バックアップしたファイルの操作がエクスプローラーなどからは出来なくなるため、標準版とは別に用意しているのではないかと思います。

・ArcServeではバージョンによって異なるようですが、およそ500文字前後のパスをサポートしています。通常、ファイルサーバーなどに於いて、一般ユーザーなどが、エクスプローラーなどで共有フォルダのファイルを操作する場合は、基本的にはMAX_PATH制約の範囲内でしか操作できないので、余程バックアップ先の階層を深くしない限りは、500文字もあれば十分かと考えられます。（厳密には、一般ユーザーでも、階層の途中のフォルダ名をより長いものに変更することで、MAX_PATH制約を超える状態は生み出せますが。）
Wiki系などでのタイトル名からの自動ファイル生成などでも、単体ファイルは250文字なので、ある程度注意を払えば、500文字を超える状態は回避できるかと思います。

・Explorerのフォルダのプロパティ画面で表示される「ファイル数やフォルダ数」はMAX_PATH制約の影響を受け、MAX_PATH制約を超えるファイルパスが配下にある場合は、正しく表示されないことがあります。またOSのバージョンによって挙動が異なるようです。

# あとがき
あるファイルサーバーの移行作業準備のため、BunBackup L版にてバックアップし、そのファイル数（100万ファイル程度）が正しいかを確認していた際、エクスプローラーでのファイル数表示では一致せず、WinMergeでも差異を正しく確認できませんでした。
このため、他の原因（内部で何かがファイルを自動更新しているのか等）を探ったり、他の原因を想定したりと、余計な時間をかなり費やしました。やっと確認手段側の問題ではないかという推測にたどり着き、7-Zipのファイルマネージャにて、ファイル件数のみの確認ではありますが、一致を確認できました。
この手の問題は、（特に自分のような技術力不足の者にとっては、）一度トラブルに陥ると、解決までに長い時間、混乱という名の海を彷徨うことになります。
備忘録として留めておいたものを、他の方の役に立てばと推敲しました。（まだまだ読みにくい部分があるかとは思いますが。）
Railsで複数行のテキストを表示する

方法が色々ありすぎていつも迷うのですが、simple_formatとsanitizeの組み合わせが今の所ベストな予感（別解が出てきたら追記します）。注意点はsanitizeでpタグも許可しておかないと、改行がおかしくなってしまうところでしょうか。

pとbrを許可:

```
> helper.sanitize(helper.simple_format("1\n2\n\n3\n"), tags: %w(p br))
=> "<p>1\n<br>2</p>\n\n<p>3\n</p>"
```

brだけ許可した場合(うまくいかない):

``` 
> helper.sanitize(helper.simple_format("1\n2\n\n3\n"), tags: %w(br))
=> "1\n<br>2\n\n3\n"
```

pタグを混ぜたくない場合は、普通に `gsub` に頼るのがシンプルかも。

```
> helper.sanitize("1\n2\n\n3\n".gsub(/\n/,"<br>"), tags: %w(p br))
=> "1<br>2<br><br>3<br>"
```

参考URL:

https://qiita.com/t_oginogin/items/0164ad76b753fdff9902
iTerm2にpreztoを入れたけど、見づらい

[prezto](https://github.com/sorin-ionescu/prezto)を導入したんだが、どうも見づらい。
Themeはsorinが気に入っていてそれを使っているが、プロンプトの表示とlsの青がとっても見づらい。

今までは設定で、灰色に変えていたんだけども、もっと良いのが
iTermのPreferenceからProfiles > Colors で色のコントラストを上げると簡単に解決した。

<img width="570" alt="スクリーンショット 2018-02-06 11.12.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/39632/cd80089b-1b01-278f-e7f5-1c8634712ad9.png">


簡単！
esModuleInterop オプションの必要性について


個人的にちょうど該当の問題を取り扱ったので、TypeScript 2.7.1 で導入された
 esModuleInterop　オプションの役割と背景についてまとめておく。

なお、本来は export と import の両方に影響するオプションだが、この記事では外部の npm パッケージを import する状況のみを取り上げる。

## TL;DR

Node.js 環境で import/export を使う場合、

* esModuleInterop オプションを積極的に有効にする。
* 関数や class を export するモジュールを import する場合、`import * as _ from '_'` のかわりに `import _ = require('_')` を使う。

## モジュールの互換性

先に[TypeScript の ES6 modules の解釈と allowSyntheticDefaultImports の整理](
https://qiita.com/bouzuya/items/edf5274241b50f32c621)という記事を読んでおくとよい。

バックグラウンドとして知っておくべきは以下の2つ：

1. ES6 Modules は Node.js のモジュール（CommonJS）との互換性について規定がない。
2. ES6 Modules で import/export できるものは TypeScript でいう名前空間（ざっくりいうと識別子として使えるプロパティを持つプレーンなオブジェクト） にかぎられるが、CommonJS はそうした制限がない。

### Babel V.S. TypeScript

上の事情のため、Node.js のモジュールをどう扱うかはビルドツールごとに独自の仕様が設けられている。

例えば、つぎのような math モジュールを取り込もうとすると、TypeScript と Babel で異なる書き方が必要だった。

```js:node_modules/math/index.js
var math = {
  min: function (lhs, rhs) { ...}
};
module.exports = math;
```

Babel:

```js:babel.js
import math from 'math';

math.min(1, 2);
```

TypeScript:

```js:tsc.ts
import * as math from 'math';

math.min(1, 2);
```

いいかえると、 export 側のコードはそれぞれ以下の ES6 Module として解釈されている。

Babel:

```js:
function min(lhs, rhs) { ...}

export default {
  min,
};
```

TypeScript:

```js:
export function min(lhs, rhs) { ...}
```

esModuleInterop オプションはこの振る舞いを Babel に近づけるものと考えてよい。

## 関数やクラスの export 問題

では TypeScript 式の何が問題だったのかというと、すでにある CommonJS モジュールが class や function を export している場合に手詰まりになること。

例えば

```node_modules/min/index.js
function min(lhs, rhs) { ... }
module.exports = min;
```

というモジュールがあったとして、以下のコードを babel に通して実行すると、**実行時エラー**になる。

```js:
import * as min from 'min';

min(2, 3);
```

### どう解決されるのか

これに対して上のオプションをつけるとどうなるのか。

まず `import *` と 関数呼び出しの組み合わせがコンパイルエラーになるようになる。

正しく動かしたい場合、選択肢は二つある。

一つは、以前からある syntheticDefault オプションを使用すること。ただしこのオプションはあらゆるモジュールの import/export の振る舞いを変えてしまうため、おすすめしない。

もう一つは　`import =` を使うこと。つまり以下のようにする。

```ts:
import min = require('min');
```

もともと互換性がない以上、これが妥当だろう。実際、DefinitelyTyped は[そうしている](//github.com/DefinitelyTyped/DefinitelyTyped/commit/422003f3c5208c181c724ac507025bb4f8bd86bc)。

## 参考

* [TypeScript 2.7.1 変更点](https://qiita.com/vvakame/items/3a1e628e53a5dd99dfe0)
* [Synthesize namespace records for proper esm interop](https://github.com/Microsoft/TypeScript/pull/19675)
* [Module Namespace Objects, ECMAScript® 2015 Language Specification](http://www.ecma-international.org/ecma-262/6.0/#sec-module-namespace-objects)
* [Node.jsのES Modulesサポートの現状確認と備え](http://teppeis.hatenablog.com/entry/2017/08/es-modules-in-nodejs)
Macで使うiTerm2のショートカットキーいろいろ

ほとんど備忘録
許してヒヤシンス
Emacs見たく Ctrl - X みたいに読む。
(↑の場合はCtrlを押しながらXを押すって意味)

## ほかのアプリケーションでもそうなってるやつ
* `CMD - t` => タブを増やす
* `CMD - w` => タブを消す
* `CMD - n` => 新しいウィンドウを作成する
* `CMD - q` => iTerm2を終了する
* `CMD - p` => プリントアウトする
* `CMD - 数字` => タブを切り替えていく。タブをよく見ると書いてあるので気がついたら使ってる
<img width="364" alt="スクリーンショット_2018-02-06_10_16_26.png" src="https://qiita-image-store.s3.amazonaws.com/0/189219/0c2fa2ae-0731-591c-823b-325518209519.png">

* `CMD - +` => 画面の文字を大きくしていく
* `CMD - -` => 画面の文字を小さくする

## なんでそれが割り当てられてるの？って思ったやつ
* `CMD - Enter` => なぜかフルスクリーンを切り替える。大抵のMacアプリは`CMD - F` になってるがiTerm2は`CMD - Enter`。なんでやねん
* `CMD - r` => `Ctrl - l`あるいは`clear`したのと同じ扱い。コンソールがスッキリする
* `CMD - }` => 右隣のタブへ移動する
* `CMD - {` => 左隣のタブへ移動する

## 随時更新

他にもあった気がするけど殆ど使わないので忘れてしまった
思い出したら追記します
【Azure】PowerShellでSSL証明書をApplicationGatewayにアップロードするまで

#前提
- 作業PCにPowershellインストール済み
- 対象AzurePortalにログイン済み
- SSL証明（pfx）を作成済み


#最終的にうまくいったPowershellはこちら（上から順番に実施！）

##①PasswordをSystem.Security.SecureString型に変換し変数に入れる
```
$pass = ConvertTo-SecureString "<任意のパスワード>" -AsPlainText -Force

例）$pass = ConvertTo-SecureString "SSLpassword123!" -AsPlainText -Force
```

##②Application Gateway名をMicrosoft.Azure.Commands.Network.Models.PSApplicationGateway型に変換し変数に入れる
```
$AppGW = Get-AzureRmApplicationGateway -Name "<アプリケーションゲートウェイ名>" -ResourceGroupName "<アプリケーションゲートウェイのあるリソースグループ名>"

例）$AppGW = Get-AzureRmApplicationGateway -Name "AppGateway" -ResourceGroupName "Azure-Test"
```

##③証明書をアップロードする

```
$Add-AzureRmApplicationGatewaySslCertificate -ApplicationGateway ②の変数名 -Name "<Portal上で表示されるSSL証明書名>" -Password ①の変数名 -CertificateFile <SSL証明書（拡張子がpfxのもの）のファイルパス（ローカルPC）>

例）$Add-AzureRmApplicationGatewaySslCertificate -ApplicationGateway $AppGW -Name "HWS_Certificate2" -Password $pass -CertificateFile C:\Users\takahashi\Desktop\files\01.SSL\TEST_Certificate.pfx
```
<br>



##作業時のエラー
###①実行時のエラー（"System.String" 型から "System.Security.SecureString" 型に変換できません。）

```
$Add-AzureRmApplicationGatewaySslCertificate -Name AppGateway -CertificateName TEST_Certificate2 -Password SSLpassword123! -CertificateFile C:\Users\takahashi\Desktop\files\01.SSL\TEST_Certificate.pfx

Add-AzureRmApplicationGatewaySslCertificate : パラメーター 'Password' をバインドできません。"SSLpassword123!" の値を "System.String" 型から"System.Security.SecureString" 型に変換できません。
発生場所 行:1 文字:110
+ ... eway -CertificateName TEST_Certificate -Password SSLpassword123! -Certif ...
+                                                      ~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [Add-AzureRmAppl...ySslCertificate]、ParameterBindingException
    + FullyQualifiedErrorId : CannotConvertArgumentNoMessage,Microsoft.Azure.Commands.Network.AddAzureApplicationGatewaySslCertificateCommand
```

####**解決策**
**ConvertTo-SecureStringコマンドで平文のパスワードを変換する**


###②実行時のエラー（"System.String" 型から "Microsoft.Azure.Commands.Network.Models.PSApplicationGateway" 型に変換できません。）

```
$Add-AzureRmApplicationGatewaySslCertificate -ApplicationGateway "AppGateway" -Name "TEST_Certificate" -Password $pass -CertificateFile C:\Users\takahashi\Desktop\files\01.SSL\TEST_Certificate.pfx

Add-AzureRmApplicationGatewaySslCertificate : パラメーター 'ApplicationGateway' をバインドできません。"AppGateway" の 値を "System.String" 型から "Microsoft.Azure.Commands.Network.Models.PSApplicationGateway" 型に変換できません。
発生場所 行:1 文字:65
+ ... ionGatewaySslCertificate -ApplicationGateway "AppGateway" -Name " ...
+                                                  ~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [Add-AzureRmAppl...ySslCertificate]、ParameterBindingException
    + FullyQualifiedErrorId : CannotConvertArgumentNoMessage,Microsoft.Azure.Commands.Network.AddAzureApplicationGatewaySslCertificateCommand
```

####**解決策**
**ApplicationGateway名をPowershellで取得し変数に格納する**


#参考URL
VMware workstation,player windowsupdate後にteratermが繋がらない

### VMがブリッジ接続できなくなった（vmnet0が消えた）

去年ぐらいから悩んでた件でやっと解決できた。
今まで普通に接続できていたのに
windowsupdate後にpingが通らず、teratermに接続できなくなりました、

下記で復旧

1. 起動しているVMがあれば全て停止する。
2. VMWare Workstationのメニュー「編集」→「仮想ネットワークエディタ」を開く。
3. フォームの右下「設定の変更」を押す。
4. フォームの左下「デフォルトに戻す」を押す。
[覚書]lightline.vim の カラースキーマの1つ Tomorrow のカスタマイズ

(追記:2018/4/26)
https://github.com/itchyny/lightline.vim/issues/286#issuecomment-361253234 に記載されている内容が正しいようです。ですので、以下の設定をvimrcに記述すればOK。Thank you for @itchyny -san.

```vim:~/_vimrc
let s:palette = g:lightline#colorscheme#Tomorrow#palette
let s:palette.tabline.tabsel = [ ['#d0d0d0', '#000000', 7, 0, ''] ]
unlet s:palette
```


**(以下、旧記事。参考までに掲載)**
# 注意

このポストは自分に対する覚書です

# 内容

ステータスライン/タブラインのカスタマイザプラグインとして`lightline.vim`を常用しており、カラースキーマは`Tomorrow`を使っている。理由は、デフォルトで提供されているカラースキーマの中で一番コマンドプロンプトと相性がよい為。しかし、タブラインがちょっとみづらいので`Tomorrow.vim`を直接編集して対応した結果をここに記す。

```vim:~\dotfiles\vimfiles\plugged\lightline.vim\autoload\lightline\colorscheme\Tomorrow.vim
" ...
" 黒文字、白背景を、白文字、黒背景に変える（環境によっては色は違うかもしれない)
" let s:p.tabline.tabsel = [ [ s:base2, s:base023 ] ] これがオリジナル
let s:p.tabline.tabsel = [ [ s:base023, s:base2 ] ]
```

本来自分用のカラースキーマを定義してそっちでやるべきなんだろうけど、一行だけだし、直接いじってしまったほうが楽チンかなと。んで、いろんな環境にlightline.vim入れるときに何度もどこをどう編集するんだっけ？となってしまったので、覚書としてここに記しておく。
ATOMって行番号指定してコマンドラインから開けなくね？引数ないし。 => 開けるらしい。

# 概要
vimみたいに行番号指定してatomで開きたい！！！と思っていたので、プルリク漁ってみた。
=> 見つかって指定の仕方もわかったので、色々できそう。


# どうやって指定するのか

## Vimの場合

```bash
vim - c 45 test.php
```

と指定するとコマンドラインから行を指定して開くことができる。

## ATOMの場合

```bash
atom test.php:45
```

とこうして、ファイル名の後に「:」(コロン)を入れてその後に行番号を指定するとその行にカーソルを合わせてできるそう。その変更を取り込んだプルリクエストは以下の通り。なんなら2015/9/4である。気づくの遅かったな・・・。

[行番号指定をできるようになった該当プルリクエスト](https://github.com/atom/atom/pull/8661/commits/ed62685c7875f3482a60c7833d70c9413b550791)

# これができるようになったことでやりたかったことをできるのである。

今まではSilver Searcherで検索したものをさらにPecoで絞るといったことをやっていた。
なぜならAtomではできなかったことだからである。ではできるとわかったので作ってみた。
エラー処理書いてないのであとで追記する予定。

```bash:.bashrc
function agatom () {                                                                                                                                                                     
  out=$(ag $@ --ignore-dir caches_ux | peco --query "$LBUFFER" | awk -F : '{print $1":"$2}');                                                                                            
  atom $out;                                                                                                                                                                             
} 
```
※ PecoとSilverSearcher依存。
会社で少し盛り上がった Project Euler をやってみる 012

# Problem 012

> 三角数の数列は自然数の和で表わされ, 7番目の三角数は 1 + 2 + 3 + 4 + 5 + 6 + 7 = 28 である.

```
角数の最初の10項は:

1, 3, 6, 10, 15, 21, 28, 36, 45, 55, ...
となる.

最初の7項について, その約数を列挙すると, 以下のとおり.

 1: 1
 3: 1,3
 6: 1,2,3,6
10: 1,2,5,10
15: 1,3,5,15
21: 1,3,7,21
28: 1,2,4,7,14,28
```

> これから, 7番目の三角数である28は, 5個より多く約数をもつ最初の三角数であることが分かる.
では, 500個より多く約数をもつ最初の三角数はいくつか.

---

# Answer 012 (Python)

数学的な面白さもない完全な力技でごめんなさい。
もう少し考えたい...

```python3
import functools
from collections import defaultdict

class Problem12:

    PRIME = []

    def main(self, num):
        i, s, count = 0, 0, 0
        while(count < num):
            i += 1
            s += i
            primes = self.primeFactorize(s)
            count = self.divisorCount(primes)
        print(s)

    def primeFactorize(self, num):
        data = []
        i = 1
        while(i < num ** (1/2)):
            i += 1
            if i in self.PRIME:
                pass
            elif self.isPrime(i):
                self.PRIME.append(i)
            else:
                continue
            if num == i:
                break
            if num % i == 0:
                data.append(i)
                num //= i
                i -= 1
        data.append(num)
        return data

    def isPrime(self, num):
        for i in self.PRIME:
            if i > num ** (1/2):
                return True
            if num % i == 0:
                return False
        return True

    def divisorCount(self, primeList):
        data = defaultdict(lambda: 0)
        for i in primeList:
            data[i] += 1
        return functools.reduce(lambda x, y: x * y, (i + 1 for i in data.values()))

import sys
if __name__ == '__main__':
    num = 500
    if len(sys.argv) == 2:
        num = sys.argv[1]
    p = Problem12()
    p.main(int(num))
```
---

# (参考) Project Euler とは

[Project Euler](https://projecteuler.net/) はプログラミングで数学の問題を解くサイトです。問題は600問以上あるので、勉強に使うのも良し、楽しむのも良しです。

サイトに登録すれば、解答を submit することができ、その場であっているか判定してくれます。

また、問題だけであれば、日本語に翻訳された Wiki もあるのでそちらを見ながらやると捗ると思います。

[Project Euler(日本語訳)](http://odz.sakura.ne.jp/projecteuler/)
- vFRC

### Prerequisite

- enable Managed Object Browser

https://kb.vmware.com/s/article/2108405

To enable or disable the Managed Object Browser by using the vSphere Web Client, complete the following steps:

    Browse to the host in the vSphere Web Client navigator.
    On the Manage tab and click Settings.
    Under System, select Advanced System Settings.
    Select the Config.HostAgent.plugins.solo.enableMob option and click Edit to enable or disable the Managed Object Browser.

![2018-02-06_113050.jpg](https://qiita-image-store.s3.amazonaws.com/0/114634/4e52009d-073b-75de-fdd8-008c88cb4344.jpeg)




### How to 

```
[root@localhost:~] esxcli storage vflash device list

Name                    Size  Is Local  Is Used in vflash  Eligibility                    
--------------------  ------  --------  -----------------  -------------------------------
naa.55cd2e404c6e42c4  114473      true              false  No, there are other filesystems
naa.55cd2e404c6e433f  114473      true              false  Yes, this is a blank disk.     
[root@localhost:~] partedUtil getptbl /vmfs/devices/disks/naa.55cd2e404c6e433f 
gpt
14593 255 63 234441648


[root@localhost:~] partedUtil setptbl /vmfs/devices/disks/naa.55cd2e404c6e433f "gpt" "1 2048 234436544 AA31E02A400F11DB9590000C2911D1B8 0"

gpt
0 0 0 0
1 2048 234436544 AA31E02A400F11DB9590000C2911D1B8 0

[root@localhost:~] vmkfstools -C vmfsl /vmfs/devices/disks/naa.55cd2e404c6e433f:1
create fs deviceName:'/vmfs/devices/disks/naa.55cd2e404c6e433f:1', fsShortName:'vmfsl', fsName:'(null)'
deviceFullPath:/dev/disks/naa.55cd2e404c6e433f:1 deviceFile:naa.55cd2e404c6e433f:1
Device:'/vmfs/devices/disks/naa.55cd2e404c6e433f:1' is allowed to be formatted as VMFSL 
Checking if remote hosts are using this device as a valid file system. This may take a few seconds...
Creating vmfsl file system on "naa.55cd2e404c6e433f:1" with blockSize 1048576 and volume label "none".

Successfully created new volume: 5a78f605-a2501dea-8a60-901b0e6e4600

[root@localhost:/vmfs/volumes] vmkfstools -Ph /vmfs/volumes/5a78f605-a2501dea-8a60-901b0e6e4600/
VFFS-1.00 (Raw Major Version: 14) file system spanning 1 partitions.
File system label (if any): 
Mode: public
Capacity 111.8 GB, 110.8 GB available, file block size 1 MB, max supported file size 62.9 TB
UUID: 5a78f605-a2501dea-8a60-901b0e6e4600
Partitions spanned (on "lvm"):
	naa.55cd2e404c6e433f:1
Is Native Snapshot Capable: NO
```

```
[root@localhost:~] vim-cmd hostsvc/storage/refresh

```
MacBookでHHKB Proを使うときにやったこと

## 前提
- MacBook Pro US配列 (OSX El Capitan 10.11.6)
- Happy Hacking Keyboard Professional BTを使用

## 0. ペアリング
公式サイトの手順に従ってMacBookとペアリング
https://www.pfu.fujitsu.com/hhkeyboard/bt/feature.html

電源スイッチ長押しでペアリングモードにならなかったので、電源を入れてからFnキー＋Qキーを同時押しでペアリングモード（青色点滅）にしました。

## 1. 設定モードの切替
説明書に書いてあるので詳細は割愛（Mac/iOSモードにしただけ）

SW1: OFF
SW2: ON
SW3: OFF (Mac/iOSモードでは無視される)
SW4: OFF
SW5: OFF
SW6: OFF

## 2. MacOS向けのドライバインストール
電源供給とペアリングが終わったら、いよいよ本題のキー割当変更！
と思ったらControlキーなど一部のキーが効かない。

公式サイトに行ってみたらドライバインストール必須とのこと。
https://www.pfu.fujitsu.com/hhkeyboard/macdownload.html

ドライバをダウンロードして、無事インストール完了。

## 3. キー配列変更 [追記あり]
いよいよ本題

やりたいことは以下の通り

1. [Control]キーを[⌘コマンド]キーに変更
2. 無くなった[Control]キーを別のキーに割り当て

1は簡単で[システム環境設定]→[キーボード]→[修飾キー]から、
[キーボードを選択]で"HHKB-BT"を選んで、
[Control]キーを[⌘コマンド]キーに設定して[OK]を押すだけ。

2については、

- [Control]キーは使用頻度が低いのである程度どこでもいい
- 入れ替えるために別途アプリなどは入れたくない

という条件があり、結局先ほどの[システム環境設定]で[Caps Lock]キーを[Control]キーに変更しました。

[Caps Lock]キーはMac/iOSモードのHHKB Proでは[Fn]キー＋[Tab]キーというちょっとめんどくさい位置にありますが、一旦これで様子をみてみようと思っています。

他のHHKB使いの方はどこに置いているんでしょうか？

### 追記 2018.02.07
すいません、嘘つきました。[Control]キー使用頻度高いです。

というわけで以下を決行しました。

- Karabiner-Elementsをインストール ([.dmgファイルのダウンロード](https://pqrs.org/latest/karabiner-elements-latest.dmg))
- Karabiner-Elementsで右の[⌥Opt]を[Control]キーに置き換え
- ⌘英かなをアンインストール
- ⌘英かながやってくれていた分をKarabiner-Elementsで設定

また、なぜかシステム環境設定でやっていた[Control]キーから[⌘コマンド]キーへの変換が効かなくなっていたので、こちらもKarabiner-Elementsで設定。

<img width="1010" alt="スクリーンショット 2019-05-07 12.00.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114828/2d983007-dc69-40b8-d28a-4d15a6ee20af.png">

### 追記 2019.05.16
上記の画像のように[Target Device]を[For all devices]にしたまま設定してしまうと、HHKBなしで操作したときにCtrlキーがなかったり、CapslockキーがCommandになっていなかったりといった問題が出てしまう。

[Target Device]ごとにちゃんと設定するのがおすすめです。

![スクリーンショット 2019-05-16 10.41.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114828/d5ec647c-dc91-e2bc-0a3c-7c0c970d34f8.png)
![スクリーンショット 2019-05-16 10.41.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114828/c2e656e3-8f2c-2835-cb3a-10d723a5bc45.png)
![スクリーンショット 2019-05-16 10.41.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114828/a3a15c2c-2645-fc80-a844-2442254e59cc.png)
![スクリーンショット 2019-05-16 10.41.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114828/2f52f6f1-58ec-5441-25d0-1c124fc6d49a.png)

ちなみに[システム環境設定]->[キーボード]->[修飾キー]から設定したキー配置変更は、PCを再起動したら効かなくなったようなので、基本的にKarabiner-Elementsですべて設定した。

参考：
- [macOS Sierra で外付けキーボード設定ツール Karabiner と Seil が使えなくなった際の対処法 - Qiita](https://qiita.com/kamoc/items/93550dd7f5bbae15e70f#karabiner-elements-%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)
- [Karabiner-Elements が超絶怒濤に進化している。今も! - Qiita](https://qiita.com/hanamiche/items/d6b9a7397a91caaa017d)


## 感想
設定はちょっとめんどくさいけど、この打鍵感の良さには変えられない！
メソッドチェインの終端で自動的に何かする小技

```php
(new Chain)->push(1)->push(2)->push(3);
```

のようなメソッドチェインの最後が実行された後に自動で処理を入れたりします。

```php
<?php
class Chain
{
    private $last = false;

    private $arr = [];

    public function __destruct()
    {
        if ($this->last) {
            $this->fire();
        }
    }

    private function fire()
    {
        var_dump(implode(',', $this->arr));
    }

    public function push(int $val)
    {
        $this->last = false;
        $obj = clone $this;
        $obj->last = true;
        $obj->arr[] = $val;
        return $obj;
    }
}

// 最後の push(3) が返したオブジェクトのみ fire() が実行されます
(new Chain)->push(1)->push(2)->push(3); //=> 1,2,3

// 変数に入れると実行されません
$a = (new Chain)->push(1)->push(2)->push(3);
$b = $a->push(4);

// ↑の $a の続きです
$a->push(5); //=> 1,2,3,5

// ↑の $a の後に push(4) した $b の続きです
$b->push(6); //=> 1,2,3,4,6
```

内部 DSL のようなものを作るときに使えるかも？
React-Router v4を使って認証状態でリダイレクトする処理

ログインが完了したらトップページにリダイレクト、未ログインで認証が必要なページにアクセスしたらログインページへリダイレクト、という処理がある。  
[react-router](https://reacttraining.com/react-router/)のv4でルーティングするとこんな形である。

```jsx:App.js
import React, {Component} from 'react'
import {
  BrowserRouter as Router,
  Route, Switch
} from 'react-router-dom'

import Auth from './containers/Auth'
import Top from './containers/Top'
import Login from './containers/Login'
import Signup from './containers/Signup'
import Page from './containers/Page'

class App extends React.Component{
  render(){
    return(
      <Router>
        <Switch>
          <Route exact path="/login" component={Login}/>
          <Route exact path="/signup" component={Signup}/>
          <Auth>
            <Switch>
              <Route exact path="/" component={Top}/>
              <Route exact path="/page" component={Page}/>
            </Switch>
          </Auth>
        </Switch>
      </Router>
    )}
}

export default App
```

このとき、Authコンポーネントでは  
1. 認証済みなら何もせず、配下のルーティングに処理をプロキシする（バケツリレーする）
2. 認証がされていない（未ログイン）なら `/login` ページにリダイレクトする
ということをする。  
stateの `props.currentUser.isLoggedIn` に認証状態を保持しているとして、  

```javascript:components/Auth.js
import React from 'react'
import { Redirect } from 'react-router-dom'

const Auth = (props) => (props.currentUser.isLoggedIn ? props.children : <Redirect to={'/Login'}/>)

export default Auth
```

結果は非常にシンプルなのだが、1. のバケツリレーがうまくいかず手間取った。NG集としては、  

```javascript
const Auth = (props) => (props.currentUser.isLoggedIn ? <Route children={props.children} /> : <Redirect to={'/Login'}/>)
const Auth = (props) => (props.currentUser.isLoggedIn ? <Route {...props} /> : <Redirect to={'/Login'}/>)
```
のように、プロキシのためにRouteコンポーネントを介すべきと思っていたら、これでは認証後のページでリダイレクトループが発生してしまう。props.children自体が、App.jsでAuthコンポーネントでラップしているSwitchコンポーネントだと気づいてうまくいった。  
なお、Authコンポーネントの直下は単一のコンポーネントにしておく必要がある。今回はSwitchコンポーネントが該当する。バケツリレーするprops.childrenが直下に複数のコンポーネントを持ってしまうと、renderされるコンポーネントは単一の要素でなければいけないという[reactの制約](https://reactjs.org/docs/rendering-elements.html#rendering-an-element-into-the-dom)に怒られてしまうからだ。