OmniAICreator/Qiita-1.07M huggingface dataset:
Vim におけるプラグイン管理についてまとめてみた

## 概要

最近 Xcode で iPhone アプリを開発したり Unity で VR アプリ開発をする生活から、 ターミナルで Rails や Python を書く生活に変わったので、vim 周りを再調査しました。自分が以前環境整備していた頃とは大きく環境が変わってそう。

vim のプラグインをどう管理して、どう探すかについて簡単にまとめました。

## プラグインマネージャー

vim のプラグイン管理はサードパーティー製のプラグインマネージャーを使うのが一般的。

人気どころのプラグインマネージャーを以下に列挙した。github のスター数で比較すると Vundle が一番使われてそう。今回は Vundle に絞って以下、導入について説明するが、他も github の README に大抵導入方法が書いてあるのでそちらを参考に。

ちなみに NeoBundle は日本製で、国内での人気は高かったが、最近作者さんが dein.vim を作って、今は NeoBundle のメンテをしていないそう。

| プラグインマネージャー | スター数 | 備考 |
|---|--:|---|
| [Vundle](https://github.com/VundleVim/Vundle.vim) | 15,768 | スター数が一番多い |
| [vim-pathogen](https://github.com/tpope/vim-pathogen) | 9,435 |  |
| [vim-plug](https://github.com/junegunn/vim-plug) | 8,495 | .vimrc への記述が少なくて済む |
| [NeoBundle](https://github.com/Shougo/neobundle.vim) | 2,098 | 日本製 |
| [dein.vim](https://github.com/Shougo/dein.vim) | 1,432 | NeoBundle の後継 |

### Vundle のインストール

[Vundle Quick Start](https://github.com/VundleVim/Vundle.Vim#quick-start) を参考に説明する。

#### 1. .vim/bundle 以下に Vundle.vim を配置する

```console
$ git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim
```

#### 2. .vimrc の先頭に以下を記載

Plugin 'VundleVim/Vundle.vim' 以下の行に導入したいプラグインを追加していけば良い。

```vim
set nocompatible
filetype off
set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()

Plugin 'VundleVim/Vundle.vim'

" 導入したいプラグインを以下に列挙
" Plugin '[Github Author]/[Github repo]' の形式で記入
Plugin 'airblade/vim-gitgutter'

call vundle#end()
filetype plugin indent on

"　その他のカスタム設定を以下に書く
```

#### 3. プラグインのインストール

インストール方法は 2 つ。

* vim を開いた状態で、以下を入力して Enter

```
:PluginInstall
``` 

* ターミナル上で以下のコマンドを実行

```console
$ vim +PluginInstall +qall
``` 

## Vim プラグインの探し方

### [vim.org](https://vim.sourceforge.io/scripts/index.php)
* vim 本家のサイト
* プラグイン数: 5476

![スクリーンショット 2017-09-17 15.44.10.png](https://qiita-image-store.s3.amazonaws.com/0/19698/2ce903af-bc32-2ae1-2b5b-a1fb7f995f83.png)

### [Vim Awesome](https://vimawesome.com/)

* プラグイン検索サービス
* プラグイン数: 15621
* インストール数、 github　スター数が見れるので人気のプラグインが分かりやすい

![スクリーンショット 2017-09-17 15.44.25.png](https://qiita-image-store.s3.amazonaws.com/0/19698/db2293a2-3c55-146a-bbd4-5838a41d085b.png)

圧倒的に本家より、 Vim Awesome が使いやすく、プラグイン数も多いので Vim Awesome 一択な気がする。他にもツールあれば教えてください。

## 複数 PC 間のプラグイン同期

.vimrc など、 PC の設定系のドットファイル (.bashrc や .tmux.conf など)はまとめて github のリポジトリにしておくのが管理上ラク。新しいプラグインマネージャーを入れた時に git に push して、自分の開発環境の最新の状態を保てる。

簡単なシェルスクリプトを書いて、ホームディレクトリ間でコピーできるようにすればインストールや更新も簡単にできる。

## まとめ
プラグインの探し方、管理の仕方についてまとめました。
なにか間違い等あればご指摘ください！

## 関連記事
* [意外と知らない Vim でできること](http://qiita.com/tanabee/items/a9e80aeee4261501bdd6)
* [Vim でブラウザのようにファイル間で進む、戻る操作をする方法](http://qiita.com/tanabee/items/8675580c07c58a3db990)
OWASP ZAPを使い始めるまでのメモ

# なぜFirefoxを使うの？

- デフォルトでXSS対策がされないため、検査がやりやすいから。
- Proxy設定がOSのProxy設定に依存する。そのため。Windows等で利用する場合は設定の調整が必要。

# OWASP ZAPの設定

利用前に設定したほうがよさそうなもの

## モード

意図しない検査対象へスキャンをしないように、プロテクトモードにするのがよさそうだ。

- セーフモード
    - コンテキストに入っていても、攻撃を行えない
- プロテクトモード
- 標準モード
- 攻撃モード

プロテクトモードの場合、検査対象を指定する必要がある。

- 一旦アクセスすると、左ペインに「サイト」が増える
- これを右クリックし[コンテキストに含める]がでるので、選択する
    - [セッション・プロパティ]画面で、[コンテキストに含める]に当該のURLが登録されるので、OKで追加し、閉じる
- 元の画面で[コンテキストに含める]に含まれるURLは、赤丸？のアイコンがつく

## ローカルプロキシ設定

ZAPのproxy待ち受けポートを設定する

- [ツール][オプション]で[ローカル・プロキシ]を選択
- AddressやPortを設定する
    - localhostや8080など

## スパイダー

[ツール][オプション]の[スパイダー]を選択。クローリングの調整を必要に応じて実施する。

- クロールする最大の深さ
  - デフォルト5階層まで辿る。
    - 深くすると、パフォーマンスが落ちる場合がある。
    - 延々と階層をたどれるようなシステムの場合、終わらない。
    - サイトの作りに応じて調整をする。
- 並列スキャンスレッド数
    - 同時リクエスト数にも関連する
    - ZAPを起動しているPCの性能や、検査対象サーバの構成により、調整する
    - 1でもいいのかもしれない。

対象のURLを右クリック[攻撃][スパイダー…]

- オプションチェックボタン
    - 再帰的
    - Spider Subtree Only
        - 指定のディレクトリから下だけを見る
            - http://xxx/dirs/ を開始位置にしていれば、dirs/ 以下のみ対象とする
    - 詳細オプションを表示　は[詳細オプション]タブが増える
        - 最大継続時間で、全体のクロール時間の制限を行う
        - [xxを解析]は、.gitや.svnやHTMLのコメントなどを確認し、リンクがあればそれをたどる
        - とりあえず全部入れといてもいいかも

Spider実行後のタブ

- Flag
    - Seedは、そこからリンクをたどり始めたもの
    - なしは、Seedから発見されたもの
    - User Rulesは、例えばgif等の検査しないとしたもの
    - out of contextは、診断対象としていないサイト
 

# スキャン

Spiderで静的スキャンは行われている。

- Active scan
    - XSS等を試す(動的スキャン)のため、自サイト以外へは利用しないこと
- Passive scan
    - 静的スキャンであり、ZAPで確認できたものを検査する。passive scan自体は、サイトへのアクセスはしない。

動的スキャン

- [ポリシー][スキャンポリシー…]を選択
- ポリシー名を選択し[変更]で設定を変える
    - 診断するカテゴリ(XSS、Injection等)を制限する
    - [ヘルプ][アップデートのチェック]の[マーケットプレイス]で、追加のルールを導入可能
- [ツール][オプション…]の[動的スキャン]での調整
    - 並列スキャンするホスト数
    - 並列スキャンスレッド数
    - スキャン中のミリ秒単位の遅延(サーバ側の負荷削減として)

スキャンするカテゴリを選択する

- [ポリシー][スキャンポリシー]で変更を押す
- [カテゴリ]で、規定をすべて　[オフ]にする
- 左の[スキャンポリシー]以下を選択し、必要なものを有効にする(オフをLowなどにする)
-
pythonの正規表現というか、マッチオブジェクトのメモ

<!-- リンク -->
[1]:https://docs.python.jp/3/library/re.html#match-objects

# 参考
[6.2. re — 正規表現操作 — Python 3.6.1 ドキュメント][1]

```pycon
>>> m = re.match(r"(\w+) (\w+)", "Isaac Newton, physicist")
>>> m.group(0)       # The entire match
'Isaac Newton'
>>> m.group(1)       # The first parenthesized subgroup.
'Isaac'
>>> m.group(2)       # The second parenthesized subgroup.
'Newton'
>>> m.group(1, 2)    # Multiple arguments give us a tuple.
('Isaac', 'Newton')
```

# シンボリックグループ(名前付きグループ, 名前付きキャプチャ)
[6.2. re — 正規表現操作 — Python 3.6.1 ドキュメント][1]

> |グループ “quote” を参照するコンテキスト|参照方法|
|:---|:---|
|同一パターンへの参照|・`(?P=quote)`(そのまま)<BR>・`\1` |
|マッチオブジェクト `m` の処理時|・`m.group('quote')`<BR>・`m.end('quote')`(etc.)|
|re.sub() の repl 引数へ渡される文字列|・`\g<quote>`<BR>・`\g<1>`<BR>・`\1`|


## `match.group()`, `match.groupdict()`の挙動

挙動を調べるサンプル

```example.txt
 .text            000c4342+000000f0 _ccc
```

`000c4342+000000f0`にマッチさせるように、正規表現(`"(?P<addr>[0-9A-Fa-f]{8})\+(?P<size>[0-9A-Fa-f]{8})"`)を使うと、

```py3
In [217]: with open("example.txt") as f:
     ...:     for s in f:
     ...:         m = re.search("(?P<addr>[0-9A-Fa-f]{8})\+(?P<size>[0-9A-Fa-f]{8})",s)
     ...:         if m:
     ...:             print("m.groups()        : " + str(m.groups()))
     ...:             print("m.group()         : " + str(m.group()))
     ...:             print("m.group(0)        : " + str(m.group(0)))
     ...:             print("m.group(1)        : " + str(m.group(1)))
     ...:             print("m.group(2)        : " + str(m.group(2)))
     ...:             print("m.groupdict()     : " + str(m.groupdict()))
     ...:             print("m.group(\"addr\")   : " + str(m.group("addr")))
     ...:             print("m.group(\"size\")   : " + str(m.group("size")))
     ...:
     ...:
m.groups()        : ('000c4342', '000000f0')
m.group()         : 000c4342+000000f0
m.group(0)        : 000c4342+000000f0
m.group(1)        : 000c4342
m.group(2)        : 000000f0
m.groupdict()     : {'addr': '000c4342', 'size': '000000f0'}
m.group("addr")   : 000c4342
m.group("size")   : 000000f0
```
railsのrakeタスクについて

# rakeとは

rubyで処理内容を書けるビルドツール。

# rakeの設定方法

## インストール

```
$ gem install rake
```

## rakefile

rakefileにrakeが実行する処理内容を書く。下記の４項目が主。

* 名前・・・タスクを識別するための名前。rakeコマンドで実行するタスクを指定する場合などに使用します。
* アクション・・・タスクで行われる一連の処理です。省略可です。
* 事前タスク・・・前提として実行するタスクの一覧です。指定された事前タスクは、タスクの実行前に実行されていなければ実行されます。
* パラメータ・・・タスクに渡されるパラメータ名です。rakeコマンドの引数で

```ruby
task タスク名 do
処理内容
end

# "hello" を表示するだけのタスク
task :hello do
  puts 'hello'
end
```
## タスクをグループ化するために名前空間でくくる

```ruby
# ネームスペースの中にタスクを定義する。
namespace :test do
  task :hello do
    puts 'hello'
  end
  task :hello_world=>[:hello] do
    puts 'world'
  end
end
```

# rakeを定期的に実行する方法

* wheneverにてrakeコマンドを実行
    * http://qiita.com/yumiyon/items/388fbb84450f49a6ab0d

# rakeコマンド

http://qiita.com/you88/items/c500fbe7cedbdc9cd04b#rake
gem uninstall railsでRailsのダウングレードができない

## 起きた問題
Railsをダウングレードしようとして

```shell-session
$ gem uninstall rails -v 5.1.1
```
したらrailsコマンドが使えなくなりました

```shell-session
$ rails -v
/Users/kenichi/.rbenv/versions/2.3.1/lib/ruby/2.3.0/rubygems/specification.rb:2274:in `check_version_conflict': can't activate activesupport-5.1.1, already activated activesupport-5.0.4 (Gem::LoadError)
	from /Users/kenichi/.rbenv/versions/2.3.1/lib/ruby/2.3.0/rubygems/specification.rb:1403:in `activate'
	from /Users/kenichi/.rbenv/versions/2.3.1/lib/ruby/2.3.0/rubygems/core_ext/kernel_require.rb:89:in `block in require'
.
.
.
```
バージョン5.1.1のactivesupportがあるのに5.1.1のrailsがないからコンフリクト起こしてるみたい。

## 解決法
とりあえずバージョンの確認

```shell-session
$ gem list | grep activesupport
activesupport (5.1.1, 5.0.4, 5.0.3, 5.0.2, 5.0.0.1, 4.2.6, 4.2.5, 4.2.4, 4.2.1, 4.1.6)

$ gem list | grep rails        
autoprefixer-rails (7.1.1.2, 6.7.5)
capistrano-rails (1.2.3)
coffee-rails (4.2.2, 4.2.1, 4.1.1, 4.1.0, 4.0.1)
compass-rails (2.0.0)
dotenv-rails (2.2.1)
factory_girl_rails (4.8.0, 4.4.1)
font-awesome-rails (4.7.0.1)
haml-rails (0.9.0)
jquery-rails (4.3.1, 4.2.2, 4.2.1, 4.0.5, 4.0.3, 3.1.4)
less-rails (2.8.0)
pry-rails (0.3.6, 0.3.5, 0.3.4)
rails (5.0.4, 5.0.3, 5.0.2, 5.0.0.1, 4.2.6, 4.2.5, 4.2.4, 4.2.1, 4.1.6)
rails-controller-testing (1.0.2, 1.0.1)
rails-deprecated_sanitizer (1.0.3)
rails-dom-testing (2.0.3, 2.0.2, 1.0.8, 1.0.7, 1.0.6)
rails-html-sanitizer (1.0.3, 1.0.2)
rails_12factor (0.0.3)
rails_serve_static_assets (0.0.5)
rails_stdout_logging (0.0.5)
rspec-rails (3.1.0)
sass-rails (5.0.6, 5.0.4, 4.0.5, 4.0.4, 4.0.2)
sprockets-rails (3.2.0, 2.3.3, 2.2.4, 2.0.1)
twitter-bootstrap-rails (3.2.2)
```

activesupportもアンインストールする。

```shell-session
$ gem uninstall activesupport -v 5.1.1
Successfully uninstalled activesupport-5.1.1
```

うまくいった。

```shell-session
$ rails -v
Rails 5.0.4
```

5.1.1のrails gemを入れた時に一緒に`activesupport`gemもインストールするみたいですね

調べてみたら、railsリポジトリでissue作られてました。
https://github.com/rails/rails/issues/29113

## 追記
`railties`をアンインストールすればOK

```shell-session
$ gem uninstall railties -v 5.1.1
```
http://qiita.com/Hassan/items/eef26c870eb26a0c68e0
Xcode 9の動かせないシミュレータ

#Xcode 9でシミュレータの枠を持って動かそうとしても動かないとき困ります。

動かす向きが内側だと無理です。（枠が太いデバイスなら内側へも大丈夫です）
右に動かしたい時は右枠をつかんで下さい。もしくは、左枠をつかんで少し左へ動かしてからそのまま右に動かして下さい。

![Slice.png](https://qiita-image-store.s3.amazonaws.com/0/46631/54bb32c4-cfaf-225a-a291-562d56239763.png)

##追記
コメントで指摘を受けました。シミュレーター下にある「iPhone X - iOS 11.0」のラベルをドラッグしても動かせます。
![Slice 3.png](https://qiita-image-store.s3.amazonaws.com/0/46631/6cf7eddd-06b3-929b-3f93-7f95f64df25b.png)

#Xcode 9でシミュレータの枠を持って縮小しようとしても縮小しないとき困ります。

このときは、いったん外に大きくしてから小さくすると出来ます。
このとき途中で指を離さないで下さい。

![Slice 2.png](https://qiita-image-store.s3.amazonaws.com/0/46631/e4d42bd8-4cf5-986d-81fd-63f26f8ebf12.png)
Python のモジュール探索パス追加の仕方

プログラム内部でのやりかた

```
import sys,os
sys.path.append('モジュールをインストールしたディレクトリ')

(例)
sys.path.append('/tmp/hoge/lib/python2.7/site-packages')

```

コマンドライン

```
export PYTHONPATH=モジュールをインストールしたディレクトリ

(例)
export PYTHONPATH='/tmp/hoge/lib/python2.7/site-packages'

```
LaravelのBladeを拡張する（@alert( )）

## 概要

LaravelのBladeで短い記述で入力エラーのメッセージを表示できるようにしたい。

## エラーメッセージのテンプレート作成

下記のようにエラーメッセージの表示を担当するビューを作成する。

```php:resources/views/shared/alert.blade.php
@if($errors->has($key))
    <p class="alert">{{ $errors->first($key) }}</p>
@endif
```

## Include読み込み
Bladeのビューで普通にincludeで読み込んでみる

```php:resources/views/users/create.blade.php
<dl>
    <dt><label for="name">ユーザー名</label></dt>
    <dd>
        <input name="name" value="" placeholder="テスト　太郎" id="name">
        @include('shared.alert', ['key' => 'name'])
    </dd>
</dl>
```

まあ、これでも悪くはないですが、「shared.alert」を毎回書くことになり、
もし、このファイル名を変更することがあれば、書き直す場所が多くなるので、関数化を検討する。

## ServiceProviderを追加する
Bladeを拡張し、alert関数を作る。

```php:app/Providers/BladeServiceProvider.php
<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Blade;
# use Illuminate\View\Compilers\BladeCompiler;
# use Illuminate\View\Compilers\Concerns\CompilesIncludes;

/**
 * Blade拡張
 *
 * @package App\Providers
 */
class BladeServiceProvider extends ServiceProvider
{
    /**
     * コンテナ結合の登録
     *
     * @return void
     */
    public function boot()
    {
        /**
         * 入力エラーメッセージ出力
         *
         * @param   string $name ビュー名
         * @return  string
         */
        Blade::directive('alert', function ($name) {
            $expression = "'shared.alert', ['key' => {$name}]";
            return "<?php echo \$__env->make({$expression}, array_except(get_defined_vars(), array('__data', '__path')))->render(); ?>";
        });
    }

    /**
     * サービスプロバイダー登録
     *
     * @return void
     */
    public function register()
    {
        //
    }
}
```

新規に作ったクラスを読み込む

```php:config/app.php
    'providers' => [

               ・
               ・
               ・

        App\Providers\BladeServiceProvider::class,

    ],
```

## 実行してみる
下記のように各Bladeのテンプレート内で実行してみる

```php:resources/views/users/create.blade.php
<dl>
    <dt><label for="name">ユーザー名</label></dt>
    <dd>
        <input name="name" value="" placeholder="テスト　太郎" id="name">
        @alert('name')
    </dd>
</dl>
```

以上

## 参考サイト
- [Laravelでウェブアプリケーションをつくるときのベストプラクティスを探る (5) テンプレート編](http://qiita.com/nunulk/items/343688311472b7855437#blade-%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%86%E3%82%A3%E3%83%96%E3%81%A8-html-%E3%83%9E%E3%82%AF%E3%83%AD)
途中から.gitignoreでファイルごとにGit管理対象を設定する

.gitignoreという名前のファイルをGit管理対象外にしたいファイルの同階層以上に作成する
↓
.gitignoreにGit管理対象外にしたいファイル名を記述する
↓
git rm -r --cached .
↓
いつも通りadd commit push

igonoreするファイルはプッシュされチームに共有されるわけだが、問題ないのか
はたまた全員ignoreするべきファイルをigonreしているのか
Python モジュールを任意のディレクトリにインストール

諸事情により、/usr 配下にモジュールをインストールできない(したくない)場合に

```
export PYTHONUSERBASE=インストールしたいディレクトリ
pip install パッケージ名 --user
```

--user: インストール先をユーザ環境に。デフォルトは ~/.local 配下にインストールされる

PYTHONUSERBASE 環境変数を設定しておくと、プログラム実行時のモジュールの探索パスに ${PYTHONUSERBASE}/lib/python[ver]/site-packages ディレクトリを追加してくれる
HP spectre x360セットアップ ハマりポイントの回避と開発環境の構築

## はじめに
自宅での開発用PCとしてHPのspectre x360を購入したのですが、開封後の初期セットアップからいろいろハマり、3度ほどリカバリーをかける羽目に。また同じことをやることになったときのためにメモ。

## Windows 10のセットアップ
### ログインアカウントの設定
何も問題なければ無線LANに接続してMSアカウントを指定・・・とすればよかったのですが、この方法だとユーザーのホームディレクトリ名がMSアカウント名全部ではなく、変に後ろが切れた名前になってしまうようです。

C:\Users\johndoe → C:\Users\jhond

一度作ってしまうと変更するのに別のローカルアカウントつくって・・・と面倒なので、最初から作りたいフォルダ名でローカルユーザーを作成し、それをMSアカウントに切り替えます。

Windows Helloに変更する設定も作業中は「スキップ」し、MSアカウントへの切り替えが完了して求める環境になったかを確認してから行ったほうがよいと思います。

### Windows Update
~~2017/9/17時点で、HP社よりWindows UpdateとAppRedinessサービスがバッティングしてログイン後真っ黒画面になってしまう事象が報告されています。（自分のPCでも発生。もっと早く原因と対処を後方してくれていれば・・・）~~

~~公式の対処方法は[こちら](https://twitter.com/HPSupportJPN/status/908986316934836224)です。~~
オフィシャルなサービスパックが配信され解消しました。

## 開発ツールのセットアップ
今回クリーンなPCで構築するので、まかなえるものは基本chocolateyベースで構築することにしました。
### chocolateyのインストール
公式のセットアップ手順にしたがって、管理者権限でコマンドプロンプトを起動してインストールコマンドを実行。

### chocolatey-guiのインストール
chocoコマンドでの管理でも良いのですが、パッケージ探したりが楽になりそうだったので、GUIツールをインストール。
```
cinst -y chocolateygui
```
ここから以下のパッケージをインストールしました。
- Git
- TortoiseGit
- nodist
- Graphviz
- jdk8

![image.png](https://qiita-image-store.s3.amazonaws.com/0/146181/2b1c5ef7-60cd-be40-b9a3-bb62835b802a.png)

### Atom, Visual Studio Codeのインストール
これらは普通のインストーラーで各々セットアップ。プラグインはお好みでインストールします。

今回はここまで。また何かトラブったら追記します。
LaravelでBladeを拡張する(@asset( ))

## 概要

css, js, imgなどの外部ファイルのキャッシュ対策として、フィンガープリントを入れたい。
ただし、ファイル名を変えるとなると大変なる。
そのため、更新日時のクエリパラメータを付けることにしたので、メモとして残します。

## ServiceProviderを追加する

「AppServiceProvider.php」にBladeの拡張を書く記事を見かけるが、
ちょっと微妙な感じがするので、新設する。

```php:app/Providers/BladeServiceProvider.php
<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Blade;

/**
 * Blade拡張
 *
 * @package App\Providers
 */
class BladeServiceProvider extends ServiceProvider
{
    /**
     * コンテナ結合の登録
     *
     * @return void
     */
    public function boot()
    {
        /**
         * JS,CSSなどのパスにフィンガープリント(更新日時)を追加する
         *
         * @param   string $file ファイルパス
         * @return  string
         */
        Blade::directive('asset', function ($file) {
            $file = str_replace(["'", '"'], "", $file);
            $path = public_path() . $file;
            try {
                // [注意] view:cacheにならないようPHPのスクリプトを返す
                $opt = "?<?php echo \File::lastModified('{$path}') ?>";
            } catch(\Exception $e) {
                // ファイルが無い場合はスキップ
                $opt = '';
            }
            return secure_asset($file).$opt;
        });
    }

    /**
     * サービスプロバイダー登録
     *
     * @return void
     */
    public function register()
    {
        //
    }
}
```

新規に作ったクラスを読み込む

```php:config/app.php
    'providers' => [

               ・
               ・
               ・

        App\Providers\BladeServiceProvider::class,

    ],
```

## 実行してみる

下記のように各Bladeのテンプレート内で実行してみる

```php
<link rel="stylesheet" href="@asset('/css/app.css')">
<script src="@asset('/js/jquery.min.js')"></script>
<img src="@asset('/img/sample.png')" alt="sample">
```

以上

## 参考サイト
- [ブラウザのキャッシュを活用する](https://developers.google.com/speed/docs/insights/LeverageBrowserCaching)
- [仕組みから理解するブラウザキャッシュ](http://satoyan419.com/browser-caching/)
- [Laravelで、JSやCSSを更新した際にちゃんと反映されるようにする](http://www.sd-milieu.net/blog/484)
- [Laravelのアセットに関するTips](http://qiita.com/sakuraya/items/411dbc2e1e633928340e)
Swiftで空のOptional Stringの扱いについて (Handling empty optional strings in Swift)

[Original Link](https://medium.com/ios-os-x-development/handling-empty-optional-strings-in-swift-ba77ef627d74)
by [Nathan Chan](https://medium.com/@nathanwchan)
translated Korean by [pilgwon](https://pilgwon.github.io)

Swiftの String Optionalはちょっと変なところがあります ```String?``` typeは “不可能”な値を二つ持っています: ```nil```と ```""```. これはバグと予想外の動作を処理しにくくなる時があります。

例えば ```UITextField```の ```text```属性の ```String?```です。テキストフィールドが空の時に適切にユーザー知らせられるし、後で利用できるようにテキストStringのラッピングを解除する間、次のコードを作成します:

```swift
if let title = textField.text else {
    if title.isEmpty {
        // alert: テキストフィールドが空いてます!
    }
    // タイトルStringが現在ラッピングが外れており、空いてもなく、利用可能な準備ができました
}
```

```textField.text?.isEmpty ?? true```のように ```guard let```かoptional chainingを利用することもいいと思います。どちらにしても実装方法はやりにくく、様々なネストした条件文を使わないといけません。

その時、[Swift Extension](https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Extensions.html)に救われるでしょ!

Extensionは既に存在するclass, structure, enumeration, またはprotocol typeに新たなfunctionの追加が可能になります。 ```where```を利用することで、Extensionを特定タイプまたは適切なタイプに制限することも可能です。

だとするとどうやって ```String?```に対して空 Stringの値を処理するところに適用するのでしょうか？　これからExtensionの中で ```nilIfEmpty``` 属性を定義してoptional Stringを制限してみましょう。これは空の Stringを ```nil```で変更するか```String?```の元の値を返します。

```swift
extension Optional where Wrapped == String {
    var nilIfEmpty: String? {
        guard let strongSelf = self else {
            return nil
        }
        return strongSelf.isEmpty ? nil : strongSelf
    }
}
```

現在は上記のコードを整理してテキストフィールドが空いてる時を検知してユーザーにアラートし、テキストStringのラッピングを解除することができます:

```swift
guard let title = textField.text.nilIfEmpty else {
    // アラート: テキストフィールドが空いてます!
    return
}
// タイトルStringが現在ラッピングから解除されていて、空いてもなく、利用する準備ができました
```

どうでしょうか?

このExtensionはユーザーが ```map```か ```flatMap```という高次元のFunctionを実装する時に簡単に利用できます:

```swift
let stuff = ["nate", "", nil, "loves", nil, "swift", ""]

let a = stuff.map { $0.nilIfEmpty }
print(a) // [Optional("nate"), nil, nil, Optional("loves"), nil, Optional("swift"), nil]

let b = stuff.flatMap { $0.nilIfEmpty }
print(b) // ["nate", "loves", "swift"]
```

##最後に…
もし空のOptional Stringを使うための違うアクセス方法がありましたら[Original Link](https://medium.com/ios-os-x-development/handling-empty-optional-strings-in-swift-ba77ef627d74)
に書き込んでいただくかTwitter @nathanwchanでメンションをお願い致します。
Rails 5.1 からは tag(:br) より tag.br を推奨

- `tag(:br)` の書き方は、将来のバージョンのRailsで[廃止予定](https://github.com/rails/rails/blob/9c35bf2a6a27431c6aa283db781c19f61c5155be/actionview/lib/action_view/helpers/tag_helper.rb#L193)だそうです
- Rails 5.1 から `tag.br` 形式で書いた方がよいそうです
- その方法は Nokogiri::HTML::Builder を使う方法に似ています
- tag.br と書くと `<br>` が生成されて `<br />` にならないのはダメなんじゃ？ と思いましたが HTML5 だとどっちでもいいそうです
- tag メソッドと、tag インスタンスが共存しているような違和感がありましたが、tag メソッドに引数がないと TagBuilder.new を返す仕組みでした。(なので tag.br は TabBuilder.new.br を実行していることになる)

```ruby:使用例
require "action_view"
include ActionView::Helpers::TagHelper
singleton_class.class_eval { attr_accessor :output_buffer }

tag(:br)                          # => "<br />"
tag.br                            # => "<br>"
tag.p                             # => "<p></p>"
tag.p class: "a"                  # => "<p class=\"a\"></p>"
tag.p "content", class: "a"       # => "<p class=\"a\">content</p>"
tag.p(class: "a") { "content" }   # => "<p class=\"a\">content</p>"
tag.xxx                           # => "<xxx></xxx>"
```

content_tag の方はレガシーではありませんが tag で書く方がわかりやすいです。
HTMLの予約語を内部で把握しているので br と違って p だと閉じタグを生成してくれます。
HTMLタグに応じて**tag と content_tag の使い分けをしなくていい**のがほんま楽です。

```ruby
content_tag(:p, "xxx")            # => "<p>xxx</p>"
tag.p "xxx"                       # => "<p>xxx</p>"
```

class だけを指定したい場合も tag の方が自然[^1]に書けます。

```ruby
content_tag(:div, "", class: "a") # => "<div class=\"a\"></div>"
tag.div class: "a"                # => "<div class=\"a\"></div>"
```

content_tag だとこう書いてしまってなんじゃこれってなる罠があるので、この点でも tag の方が使いやすそうです。

```ruby
content_tag(:div, class: "a")     # => "<div>{:class=&gt;&quot;a&quot;}</div>"
```

## 参照

The following format is for legacy syntax support. It will be deprecated in future versions of Rails. https://github.com/rails/rails/blob/9c35bf2a6a27431c6aa283db781c19f61c5155be/actionview/lib/action_view/helpers/tag_helper.rb#L193

`<br />` じゃなくて `<br>` だよ
http://qiita.com/irxground/items/dc3e688d7d48c01c3988

RailsでのHTML生成は、Nokogiri::HTML::Builderを使えばキレイに書ける(かも)
http://qiita.com/EastResident/items/140fafe234c7ee011391

[^1]: slim で書いた方がもっと自然ですが
Jinja2の基本的な使い方


# 目的

Jinja2利用の際の超基本的な部分の備忘録

# 前提

Python 3.5.2
Jinja2 2.9.6

# 手順

こんな感じでファイルをおきます。

```text:ファイル配置
./
 ├template.txt.j2
 └friend_builder.py
```

## テンプレートファイルの準備

テンプレートファイルの中に特定のパラメータを埋め込むことができます。
繰り返しの構文を記述したりといったことも可能です。


```text:template.txt.j2
すごーい！
きみは
    {{character}}
が得意なフレンズなんだね!
たーのしー！
```

## テンプレートに値を突っ込むためのスクリプト

```python:friend_builder.py
from jinja2 import Template, Environment, FileSystemLoader


env = Environment(loader=FileSystemLoader('.'))
template = env.get_template('template.txt.j2')

data = {
    "character": "料理",
}

rendered = template.render(data)

print(str(rendered))
```

処理内容としては、

1. template.txt.j2をテンプレートとして取得
2. テンプレートに記述されている {{character}} に値(料理)を突っ込む
3. 値を突っ込んだ結果をレンダリングして表示

というこれ以上、シンプルにしようにもできないよ!な内容です。


実行結果は以下の通り。


```bash:出力結果
$ python friend_builder.py
すごーい！
きみは
    料理
が得意なフレンズなんだね!
たーのしー！
```

テンプレートの```{{character}}```部分に```料理```が無事、埋め込まれてますね。
【python】enumerate zip 複合パターン

zipで2配列を束ねてループ、かつ、添え字番号を出力させたい場合の記述。忘れないようにメモメモ。

```python3
a = [111, 222, 333]
b = [444, 555, 666]

>>> for i, (j, k) in enumerate(zip(a, b)):
...   print(i, j, k)
...   
0 111 444
1 222 555
2 333 666
```
pyvmomiでGuestOSのファイル操作をするツールを作ってみた

ネットワークが繋がっていなかったり、接続に限りがある状態で対象仮想マシンに対してファイルのアップロードやダウンロードが出来ないか確認したところ [fileManager](http://qiita.com/sky_jokerxx/items/9685b19e5a82a4d5f90e) を使って出来たのでツールを作ってみました。

# vmware-guest-file-operation

[https://github.com/sky-joker/vmware-guest-file-operation](https://github.com/sky-joker/vmware-guest-file-operation)

# 使い方

## ファイルをダウンロード

`centos` という仮想マシン内にある `output.txt` というファイルをダウンロードして `hoge.txt` というファイル名で保存した時の例です。

```bash
$ ./vmware-guest-file-operation.py -vc vcenter01.local -tvm centos -gu root download -dpth /root/output.txt -spth hoge.txt
vCenter Password:
Guest OS Password:
file download success.
```

ファイルが保存されたか確認します。

```bash
$ ls
hoge.txt
```

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

`centos` という仮想マシン内へ `requirements.txt` をアップロードして `/root/requirements` として保存した時の例です。

```bash
$ ./vmware-guest-file-operation.py -vc vcenter01.local -tvm centos -gu root upload -upth ./requirements.txt -spth /root/requirements
vCenter Password:
Guest OS Password:
file upload success.
```

アップロードしたファイルが保存されたか確認します。

```bash
$ ls
requirements
```

# 仕組み

`fileManager` オブジェクトの `InitiateFileTransferFromGuest(ファイルをdownload)` または `InitiateFileTransferToGuest(ファイルをupload)` メソッドに仮想マシンのオブジェクトやGuestOSの認証情報、ファイル情報を渡すとアクセス可能なURLを発行してくれます。
URLはvCenterのもので、やりとりするファイルはvCenter経由で行われます。
vCenter内ではGuestOSのVMware toolsと連携してファイルのやりとりが行われます。
ここでは、発行されたURLに対して `requests` の `get` や `put` をしてファイルのやりとりをしています。
そのため、大量に処理をするとvCenterに負荷がかかることが懸念されます。

# 最後に

今まで、ネットワークが繋がっていない構築中・検証環境の仮想マシンにフィアルのアップロードしたりするのが面倒でしたがひとまずこれで対応できそう :grin:
PowerCLIだと、Windows用意しなくてはいけなかったけどpythonで実装できたからLinuxでも大丈夫になった :grin:
SVGの描画内容を表示領域にフィッティングさせる（ViewBox)

# どれだけずらせば良いかわかっている場合
```html
<style>svg{border: 1px solid orange}</style>
  
<svg width="100" height="100">
  <circle cx="0" cy="0" r="30">
</svg>
  
<svg viewBox="-30, -30, 60, 60" width="100" height="100">
  <circle cx="0" cy="0" r="30">
</svg>
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/202198/0542844a-715a-82ed-43fb-5abbea47cece.png)

この場合はviewBoxで指定するよりも、\<circle>のcx/cy属性でずらすのが普通かも

# ずらす量がわからない場合
例えば、次のような場合

```html
<svg width="200" height="70">
  <text text-anchor="start" x="40" y="20">
    Left alignment
  </text>
  <text text-anchor="end" x="40" y="50">
    Right alignment
  </txt>
</svg>
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/202198/f9c17ec8-bdd1-d779-21c0-2db80478d205.png)

表示している内容の実サイズがわからないのでviewBoxの値を指定できない。
なので、とりあえず描画してからgetBBoxでサイズを取得してviewBoxを指定する。


```html
<svg id="fit" width="200" height="70">
  <text text-anchor="start" x="40" y="20">
    Left alignment
  </text>
  <text text-anchor="end" x="40" y="50">
    Right alignment
  </txt>
</svg>
```
```js:JavaScript
var fit = document.getElementById("fit");
var bbox = fit.getBBox();

fit.setAttribute(
  "viewBox", bbox.x + ", " + bbox.y + ", " + bbox.width + ", " + bbox.height
);

```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/202198/d97a65fe-c8e3-457c-a7bf-84398c1a1b50.png)
PIXI.jsで描画を行う その２（HTML5でブラウザゲームを作る）

前回のスプライトを表示の続きです。

Pixi.jsを使用しWebGLで描画することが出来ましたが、何が凄いのかが良くわからない人も多いと思います。
WebGLの利点はそのパフォーマンスです。通常のWebではなかなか実現できない描画速度が得られます。


速度を実感するにはアニメーションサンプルを作ってみます。
今回はパフォーマンスを知るためのサンプルなので実際にスプライトを動かしそのフレームレートを表示したいと思います。

#フレーム処理
まず、描画更新を行うためのフレームループを作ります。この中で各フレームの処理を行う事になります。
JavaScriptで時間単位のループといえばsetTimeout、setInterval等が思い浮かびますが、これらは精度が出ず高速ループには全く向きません。
今回は「**requestAnimationFrame**」を利用します。これはブラウザ側が提供してくれている描画更新用の仕組みで、処理したい関数を渡すことで1/60間隔のタイミングでそれを実行してくれるという物です。（厳密には少し違います）
実行は一度のみなのでsetInterval的な動きではなくsetTimeoutの様な動きです。
連続で実行したい場合はその関数の中で自分を再度キックする処理を記述する必要があります。

```js:
// 1/60間隔で処理を実行
var animationLoop = function () {

	// ※ここに実際のフレーム処理を記述

	window.requestAnimationFrame(function () {
		animationLoop();　// 1/60のタイミングで自分自身を実行
	});
};
```
この例だと、最初にanimationLoop関数を一度呼ぶだけで、1/60間隔で処理（フレーム処理）が実行され続けます。
この処理の中でスプライトを動かします。
スプライトを動かす方法はx,y座標（プロパティ）を更新するだけです。
例えば、1/60間隔で1pxずつ右に移動させたいのであれば、sprite.x += 1; という処理をこのループで実行すればOKです。
そして忘れてはいけないのはPixi.jsの描画更新は基本的に手動だということです。
なので、renderer.render(stage);でステージの更新を行う必要があります。
これもフレーム処理内で実行されるようにします。

#FPSの表示
**stats.js**という便利なライブラリがありますのでそちらを使用します。
https://github.com/mrdoob/stats.js/

```js:
var stats = new Stats();
stats.setMode(0);

// 表示用エレメントのスタイル指定
$(stats.domElement)
	.css("position", "absolute")
	.css("z-index", 9999)
	.css("top", 0)
	.css("right", 0)
	;

// DOMへ追加　※$parentは追加したい親
$parent.append(stats.domElement);
```

これで画面右上にFPS表示用の枠が表示されます。
そして実際にFPSを更新するためのメソッドを先ほどのフレーム処理内に記述します。

　　**stats.update();**

これだけです。

ここまで用意できれば後は、実際にフレーム毎のアニメーション処理を書くだけです。
サンプルとしてトランプカード54枚ほどスプライト化してステージに追加してランダム方向に移動させました。

>>**実際の動くサンプルはこちらでご覧いただけます。**
http://hasemonmon.net/blog/01/
※10秒後にアニメーションが止まるようにしています。画面クリックで時間をのばせます。

![01_a.png](https://qiita-image-store.s3.amazonaws.com/0/198186/99f98c65-2e54-47d7-e444-4cc14dfca756.png)

最近のスマホであれば問題なく60fps出ると思います。



**PIXI.jsを利用して作成したブラウザゲーム(ハイブリッドアプリ)**
>>**[リバーシ](https://play.google.com/store/apps/details?id=net.hasemonmon.rev "リバーシ")**
>> Mine Reversi
![apple-touch-icon-180x180.png](https://qiita-image-store.s3.amazonaws.com/0/198186/4a5eb89b-ab47-8d82-8cae-9de1200d4934.png)
実際にインストールしてプレイ後にストアでレビューしてもらえると嬉しいです。
Gradle TIPS集 (自分用)

# 実行系

```bash:マルチプロジェクト構成で、サブプロジェクトのタスクを実行する方法
# gradle :＜subproject名＞:＜タスク名＞
$ ./gradlew :doxer-core:clean :doxer-core:build :doxer-core:install 
```

# 設定系

```bash:依存関係バージョンを範囲指定／最新指定
dependencies {
  compile 'aaa:bbb:1.4+' // 1.4 以上
  compile 'ccc:ddd:latest.integration' // 最新バージョン
  compile 'eee:fff:latest.milestone' // マイルストーンバージョン
  compile 'ggg:hhh:latest.release' // リリースバージョン
}
```

```bash:依存バージョン競合が起きた場合はエラーとする設定／依存バージョンを強制固定する設定
configurations.compile {
  resolutionStrategy {
    failOnVersionConflict()
    force 'aaa:bbb:1.4'
  }
}
```

# Java

```bash:実行時にシステムプロパティを設定する(applicationプラグイン)
applicationDefaultJvmArgs = ["-Djava.library.path=./hoge"]
```



# 参考
* [GradleでMavenリポジトリにデプロイする時のメモ](http://wadahiro.hatenablog.com/entry/2012/07/24/234727)
*
RaspBerryPi3でLEDをPWMで光らせる (Pi4j)

#**１、LEDの明るさを調整する！**
　LEDをPWMで光らせることで明るさが調整できるらしいです。

　注意
　・私は電子機器については電圧=抵抗×電流がわかる程度の全くの素人です。

#**2、本題**
##　(1)接続
　220Ωの抵抗器とLEDを接続しています。
　①全体画像
![image.png](https://qiita-image-store.s3.amazonaws.com/0/164812/f91cc618-9b2f-9721-8ce0-75ac99439892.png)

　②詳細
　![image.png](https://qiita-image-store.s3.amazonaws.com/0/164812/536731f4-2407-df0c-d1f3-179e84daae69.png)
##　(2)Raspberry piの設定
　シリアルを有効にすることで、ピンを制御できるようになります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/164812/6b8e44a3-9e95-87c5-cc8b-d4d1fab423d2.png)
##　(3)実行プログラム
```java:TestPwmLed.java
import com.pi4j.io.gpio.GpioController;
import com.pi4j.io.gpio.GpioFactory;
import com.pi4j.io.gpio.GpioPinPwmOutput;
import com.pi4j.io.gpio.Pin;
import com.pi4j.io.gpio.RaspiPin;
import com.pi4j.util.CommandArgumentParser;




public class TestPwmLed {

	public static void main(String[] args) throws InterruptedException {
		pwm(args);
	}


	/**
	 * 100Hzで出力
	 * @param args
	 * @throws InterruptedException
	 */
	public static void pwm(String[] args) throws InterruptedException{

		final GpioController gpio = GpioFactory.getInstance();
		
		Pin pin = CommandArgumentParser.getPin(
		RaspiPin.class,    
		RaspiPin.GPIO_00,  
		args);             
		GpioPinPwmOutput pwm = gpio.provisionSoftPwmOutputPin(pin);
		pwm.setPwmRange(100);//出力時間を100分割

		    
		int sleep = 1000;
		for(int i = 0 ;i<10;i++){
			//常にON
			pwm.setPwm(100);//デューティー比100
			System.out.println("PWM rate is: " + pwm.getPwm());
			Thread.sleep(sleep);
			//半分ON
			pwm.setPwm(50);//デューティー比50
			System.out.println("PWM rate is: " + pwm.getPwm());
			Thread.sleep(sleep);
			//一瞬ON
			pwm.setPwm(10);//デューティー比10
			System.out.println("PWM rate is: " + pwm.getPwm());
			Thread.sleep(sleep);
			//常にOFF
			pwm.setPwm(0);//デューティー比0
			System.out.println("PWM rate is: " + pwm.getPwm());
			Thread.sleep(sleep);
		}
		gpio.shutdown();		
		
		System.out.println("pwm end");

        
	}
}
```
##　(4)実行結果
　見事に4段階の明るさをPWMで作り出すことに成功しました。
![1505438587QQR95GLDchGaVx81505438578.gif](https://qiita-image-store.s3.amazonaws.com/0/164812/4a8a6b3f-9da9-4780-629f-b0d58a3b7c0a.gif)


#**3、おわりに**
　本当はハードのPWMを使用したかったのですが、どうしてもうまくいきませんでした。
　javaから制御ができていないように思います。権限の問題でしょうか・・・。
　疑似的ではありますが、PWMを操れたので、次はモータを制御したくなります。

参考
[SoftPwmExample.java](https://github.com/Pi4J/pi4j/blob/master/pi4j-example/src/main/java/bananapro/SoftPwmExample.java)
　参考にしてプログラム作成しました。
【Windows】コマンドプロンプトをLinuxライクに設定

linux系に慣れてしまった後でコマンドプロンプトを使うとかなり使いにくいことってありません？
ということでコマンドプロンプトをlinuxライク風に使えるようにカスタマイズしました！

## **linux のコマンドを使えるようにする** 
Gowを入れる(インストールするだけでOK）
※1 入ったコマンドを確認するには「gow -l」を打つ
※2 lsの結果の日本語化はまだできていない（誰か教えてください。）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/202761/7c37ca3b-0b48-d348-39fb-4ff7c334b6fe.png)


##**git**を入れる
以下をインストールするだけでOK
https://git-scm.com/download/win
入ったことを確認するには「git --version」を打って確認
![image.png](https://qiita-image-store.s3.amazonaws.com/0/202761/c080a51a-38d4-b418-1bae-568a6b243f2a.png)

##**nodeを入れる**
以下をインストールするだけでOK
https://nodejs.org/ja/
入ったことを確認するには「node -v」を打って確認
![image.png](https://qiita-image-store.s3.amazonaws.com/0/202761/19158200-0fdd-ea74-1336-74cd59112360.png)

##**Tabを2回押したときに候補が一覧で出るようにする**
- 以下の方法でClinkをインストールする
https://github.com/mridgers/clink/releases
- 「C:\Users\[ログインユーザー]\cmdrc.bat」に以下を追加する
    ※cmdrc.batが存在しない場合は、新規でファイルを作成する

```bat:C\Users\[ログインユーザー]\cmdrc.bat
@call "C:\Program Files (x86)\clink\0.4.8\clink.bat" inject --autorun --profile ~\clink
: historyコマンドで履歴を表示するように設定
@doskey history = cat C:\Users\[ログインユーザー]\AppData\Local/clink/.history
```

- コマンドプロンプトの初期実行時に2のcmdrc.batが実行できるようにする
    - Win + Rで「regedit」を入力してクリック
    - 「HKEY_CURRENT_USER\Software\Microsoft\Command Processor\AutoRun」を右クリック > 修正で値のデータを"%HOMEDRIVE%%HOMEPATH%\cmdrc.bat"とする

- historyコマンドがリアルタイムで表示されるように「C:\Users\[ログインユーザー]\AppData\Local\clink\etting」のhistory_io = 0をhistory_io = 1に変更する

```bat:C\Users\[ログインユーザー]\AppData\Local\clink\etting
(省略)
history_io = 1
(省略)
```
- clinkのバグでdoskeyコマンド(Unixでいうaliasコマンド)が使えなくなるようです。そこで以下のURLからclink_x64.exeとclink_dll_x64.dllをインストールして、C:\Program Files (x86)\clink\0.4.8の既存のファイルを置き換える
https://drive.google.com/drive/folders/0B9NoUudepr_uLWdVTmE5aEJhMFU

##**コマンドプロンプトのタイトルを現在のディレクトリ名にする**
- 「C:\Users\[ログインユーザー]」にmycd.batを以下の内容で作成する。

```bat:C\Users\[ログインユーザー]\mycd.bat
@echo off
if %1. == . cd /d %HOMEDRIVE%%HOMEPATH% && goto end
cd /d %1
:end
title %CD%
```

- 「C:\Users\[ログインユーザー]\cmdrc.bat」の内容に以下を追加する。
存在しない場合は新規でファイルを作成する

```bat:C\Users\[ログインユーザー]\cmdrc.bat
@title %CD%
@doskey cd="%HOMEDRIVE%%HOMEPATH%\mycd.bat" $*
```

##**GOWで入れたコマンド以外のコマンドを作る**
- C:\Users\[ログインユーザー]\cmdrc.batの内容に以下を追加する。

```bat:C\Users\[ログインユーザー]\cmdrc.bat
@doskey [コマンド名] = [コマンドプロンプトのコマンド]
:例
@doskey ps = tasklist
```
【追記更新型投稿】NextEngineのAPIを触るときのTips

NextEngineAPIのruby版のAuthorが開発時に重要なTipsを共有していく流れ

## 受注ステータスが受注区分とあってない
いい加減にしろって感じなのですが、「受注区分」という内部のステータスと、顧客がみる「受注状態」が違っていて、「受注状態」があってないというほんとねーって感じなのですがエンドユーザーは受注区分を無理矢理対応してみるとこうなる

|受注状態|受注区分|APIの詳細検索　  |
-----------|------------|--------------------|
|新規受付|0:取込情報不足/1:受注メール取込済|order_status_idが0or1で検索する|
|確認待ち|2:起票済(CSV/手入力)|receive_order_confirm_check_idが1で検索する|
|入金待ち|2:起票済(CSV/手入力)|確認済み(0,2)で、deposit_type_idが0,1ときは入金待ち|
|引当待ち|2:起票済(CSV/手入力)|確認済み及び入金済み(2)で、receive_order_row_quantity(受注数）とreceive_order_row_stock_allocation_quantity(引当数)の差が0以上のとき|
|発売日待|2:起票済(CSV/手入力)|確認済みで入金済みで引当済みで、receive_order_rowsのgoods_release_dateが今日以降|
|印刷日待|2:起票済(CSV/手入力)|確認済みで入金済みで引当済みで、発売日を超えていて、receive_order_statement_delivery_instruct_print_dateが今日より前|
|印刷待ち|20:納品書印刷待ち|
|印刷済み|40:納品書印刷済|
|出荷済み|50:出荷確定済（完了）|

じゃあ、APIにある30:納品書印刷中ってなんやねん・・・
JQueryでFormのsubmitを調整する


Form内にbuttonを複数用意して
それぞれで送信先の変更と
押されたボタン毎に異なった情報を付加する必要があったので
その時の対応をメモ

## buttonにクラスとデータの設定

classを適当に指定(今回はsubmit_button)
data属性を使って各ボタン毎のデータを設定します。

```html
    <form action="actionURL" method="post">
        ...
        <button class="submit_button" data-action="actionURL_A" data-hoge="hage">遷移先A</html>
        <button class="submit_button" data-action="actionURL_B" data-hoge="piyo">遷移先B</html>
        ...
    </form>
```

## JQueryでbuttonのonclickイベントを設定

JQueryのreadyで対象のclassに対して
onclickのイベントを設定する

```js
    $(function(){
        $('.submit_button').on('click', function(){
            var form = $(this).parents('form');
            form.attr('action', $(this).data('action'));
            var hoge = $(this).data('hoge');
            $('<input>').attr({
                'type': 'hidden',
                'name': 'hoge',
                'value': hoge
            }).appendTo(form);
            form.submit();
        });
    })
```

### やっている事

対象ボタンの親のForm取得

```js
var form = $(this).parents('form');
```

data属性から値を取得してactionの書き換え

```js
form.attr('action', $(this).data('action'));
``` 

追加したいデータをdata属性から取得

```js
var hoge = $(this).data('hoge');
```

取得したデータをformに対してhiddenタグで追加する

```js
$('<input>').attr({
    'type': 'hidden',
    'name': 'hoge',
    'value': hoge
}).appendTo(form);
```

formを送信する

```js
form.submit();
```

## 2017/09/17追記

というか、button毎に送るデータが1種類だけなら
別に無理にhiddenタグ追加しないで

```html
        <button class="submit_button" data-action="actionURL_A" name="hoge" value="hage">遷移先A</html>
        <button class="submit_button" data-action="actionURL_B" name="hoge" value="piyo">遷移先B</html>
```

にすりゃあいいですね。
もしnameとvalueを複数設定する必要があるのなら
その時はhiddenで追加する事で対応可能、という事で。
Get-Aclで取得したファイル・フォルダのアクセス権(FileSystemRights)が、数字表記される場合の変換スクリプト

```ps1
# get-aclで取得したアクセス権限（FileSystemRights）が、
# 32ビット整数(例:268435456)だった時の変換を行う関数
function map-acl ($aclnumber) {

  # 権限と32bit整数の紐付けハッシュ
    $accessMask = [ordered]@{
   [uint32]'0x80000000' = 'Generic_Read'    # 2147483648(読み込み同等)
   [uint32]'0x40000000' = 'Generic_Write'   # 1073741824(書き込み同等)
   [uint32]'0x20000000' = 'Generic_Execute' # 536870912(実行同等)
   [uint32]'0x10000000' = 'Generic_all'     # 268435456(フルコン同等)
   [uint32]'0x02000000' = 'MaximumAllowed'  # 33554432(詳細不明。予約済みビット)
   [uint32]'0x01000000' = 'AccessSystemSecurity' # 監査ログ出力設定
#  [uint32]'0x00100000' = 'Synchronize'
   [uint32]'0x00080000' = 'TakeOwnership'
   [uint32]'0x00040000' = 'ChangePermissions'
   [uint32]'0x00020000' = 'ReadPermissions '
   [uint32]'0x00010000' = 'Delete'
   [uint32]'0x00000100' = 'WriteAttributes'
   [uint32]'0x00000080' = 'ReadAttributes'
   [uint32]'0x00000040' = 'DeleteSubdirectoriesAndFiles'
   [uint32]'0x00000020' = 'Traverse/ExecuteFile'
   [uint32]'0x00000010' = 'WriteExtendedAttributes'
   [uint32]'0x00000008' = 'ReadExtendedAttributes'
   [uint32]'0x00000004' = 'CreateDirectories/AppendData'
   [uint32]'0x00000002' = 'CreateFiles/WriteData'
   [uint32]'0x00000001' = 'ListDirectory/ReadData'
    }

   # 2032137の場合フルコントロール。それ以外は
   switch ($aclnumber) {
   "2032127" {echo "FullControl";return}
   }

  # 入力された番号と配列を論理積でマッピング
  $accessMask.Keys | ? { $aclnumber -band $_ } | % { $accessMask[$_] }

}

# 使用例
PS > map-acl 2032127
FullControl

PS >map-acl 268435456
Generic_all



```
* 詳細は下記リンクにて説明
  * http://gottsu.hatenablog.com/entry/2017/09/17/132835
NANDゲートだけで、NOT・AND・ORゲートを作る

オライリーの
「[コンピューターシステムの理論と実装](https://www.amazon.co.jp/コンピュータシステムの理論と実装-―モダンなコンピュータの作り方-Noam-Nisan/dp/4873117127)」を読んでの理解を記事にしています。

# NOT

```
NOT x = x NAND x
```

## x = 0

```
NOT x = 1
```

```
x NAND x
= 0 NAND 0
= 1
```

## x = 1

```
NOT x = 0
```

```
x NAND x
= 1 NAND 1
= 0
```

# AND

```
x AND y = (x NAND y) NAND (x NAND y)
```

## x,y = 0

```
x AND y = 0 AND 0 = 0
```

```
(x NAND y) NAND (x NAND y)
= (0 NAND 0) NAND (0 NAND 0)
= 1 NAND 1
= 0
```

## x = 1, y = 0

```
x AND y = 1 AND 0 = 0
```

```
(x NAND y) NAND (x NAND y)
= (1 NAND 0) NAND (1 NAND 0)
= 1 NAND 1
= 0
```

## x = 0, y = 1

```
x AND y = 0 AND 1 = 0
```

```
(x NAND y) NAND (x NAND y)
= (0 NAND 1) NAND (0 NAND 1)
= 1 NAND 1
= 0
```

## x,y = 1

```
x AND y = 1 AND 1 = 1
```

```
(x NAND y) NAND (x NAND y)
= (1 NAND 1) NAND (1 NAND 1)
= 0 NAND 0
= 1
```

# OR
```
x OR y = (x NAND x) NAND (y NAND y)
```

## x,y = 0

```
x OR y = (0 OR 0) = 0
```

```
(x NAND x) NAND (y NAND y) 
= (0 NAND 0) NAND (0 NAND 0)
= 1 NAND 1
= 0
= x OR y
```
## x = 1, y = 0

```
x OR y = 1 OR 0 = 1
```

```
(x NAND x) NAND (y NAND y) 
= (1 NAND 1) NAND (0 NAND 0)
= 0 NAND 1
= 1
```

## x = 0, y = 1

```
x OR y = 0 OR 1 = 1
```

```
(x NAND x) NAND (y NAND y) 
= (0 NAND 0) NAND (1 NAND 1)
= 1 NAND 0
= 1
```

## x,y = 1

```
x OR y = 1 OR 1 = 1
```

```
(x NAND x) NAND (y NAND y) 
= (1 NAND 1) NAND (1 NAND 1)
= 0 NAND 0
= 1
```
g++でiotaを使う時のコンパイルオプション


g++でiotaを使ったプログラムのコンパイルをしたら，

error: 'iota' was not declared in this scope

って言われた．インクルードファイルが足りないのかと思ったがそうではなかった．コンパイラオプションをつけなければいけない，ということでした．時分の利用しているg++はバージョンは5.4.0でこの場合，-std=c++14をつけてコンパイルしたらうまくいきました．
pythonのlistを速く書くvim tips

書きたいもの

```python
classes = ('plane','car','bird','cat','deer','dog','frog','horse','ship','truck')
```

まずはじめに、以下のように打つ

```python
classes = ('plane,car,bird,cat,deer,dog,frog,horse,ship')
```

のあとにvimの置換で

```
:s/,/','/g
```

とすればいい。

もっと簡単な方法あったら、vimmerの方達教えてください。
Laravelでpublicフォルダを移動する

## 概要

publicフォルダを通常の場所から移動させないといけない要件があり、
その時に調べた内容をメモしておく。

## publicフォルダの構成

通常、下記のような構造になっている

```:フォルダ構造
┗ laravel
   ┣ app
   ┗ public
```

これを、下記のようにするだけであればシンボリッックリンクを貼る

```sh:ターミナル
$ ln -s laravel/public public_html
```

だけで対応可能と思われる。

```:フォルダ構造
┣ laravel
┃  ┣ app
┃  ┗ public
┃
┗ public_html -> laravel/public/
```

## フォルダ階層を変更する目的

ただし、他のフレームワークなどが混在しているなど、
シンボリックリンクを貼ることが困難な場合もある。

```:フォルダ構造
┣ cakephp2
┣ codeigniter2
┣ fuelphp1.7
┣ laravel5.4
┣ wordpress
┗ public_html -> laravel/public/
   ┣ .htaccess
   ┣ article
   ┣ index.php
   ┣ index_cake.php
   ┣ index_codeigniter.php
   ┣ index_fuel.php
   ┗ index_laravel.php
```

こんな構造はあまり運用したくないですが、大人の事情（笑）で、
新・旧フレームワークが一時的に混在する場合もあるかと思います。

そういった場合に、publicフォルダを移動せざるを得ないので移動を検討する。

## フォルダ階層の移動

### 物理的にフォルダを移動
mvコマンドにてpublicフォルダをリネームしながら移動する

```
$ mv ./laravel/public ./public_html
```

### index.phpファイルのパスを修正
「./public_html/index.php」内のパスを2つ修正する

```php:Register_The_Auto_Loader
# require __DIR__.'/../bootstrap/autoload.php';
require __DIR__.'/../laravel/bootstrap/autoload.php';
```

```php:Turn_On_The_Lights
# $app = require_once __DIR__.'/../bootstrap/app.php';
$app = require_once __DIR__.'/../laravel/bootstrap/app.php';
```

## 公開フォルダのパスのズレを修正

laravel内で公開フォルダ(public)のパスを取得するものがある。
そのパスが、デフォルトのままとなっており、下記のような処理で不具合が発生する。

### 不具合
確認できているだけでも下記のような不具合が発生する

**public_path関数のパスがおかしい**

```php
echo public_path();
結果： ****/laravel/public
```

**サーバが起動しない**

```
$ php artisan serve

  [ErrorException]
  chdir(): No such file or directory (errno 2)
```

### 改善方法

app/Applicaiton.phpを作成し、Applicaitonクラスの「publicPath」メソッドを上書きする。

```php:app/Applicaiton.php
<?php

namespace App;

class Application extends \Illuminate\Foundation\Application
{
    public function publicPath()
    {
        return dirname($this->basePath) . DIRECTORY_SEPARATOR . 'public_html';
    }
}
```

上記ファイルを適用する

```php:laravel/bootstrap/app.php
# $app = new Illuminate\Foundation\Application(
$app = new App\Application(
    realpath(__DIR__.'/../')
);
```

また、「server.php」にもパスがあるので修正

```php:laravel/app/server.php
# if ($uri !== '/' && file_exists(__DIR__.'/public'.$uri)) {
if ($uri !== '/' && file_exists(dirname(__DIR__).'/public_html'.$uri)) {
    return false;
}

# require_once __DIR__.'/public/index.php';
require_once dirname(__DIR__).'/public_html/index.php';
```

以上です。

## 参考サイト
- [Laravel の publicフォルダの階層を移動させたい](http://qiita.com/matsuoshi/items/b0dceb9b380a9282719a)
Nodenv環境を用意する

良記事がすでにありますが（http://qiita.com/1000ch/items/41ea7caffe8c42c5211c など）、公式のReadmeをもとにコマンドの投入順序を少し整理しています。
記事執筆にあたってMacOSX 10.11.6で確認していますが、Bash利用のLinux系OSであれば同様の手順でいけると思います。

## Nodenvのインストール

nodenv の実行ファイル群をホームディレクトリにコピーする

```bash
git clone git://github.com/nodenv/nodenv.git ~/.nodenv
```

node環境構築用プラグインのnode-buildをnodenv環境のプラグインフォルダにコピーする

```bash
git clone git://github.com/nodenv/node-build.git ~/.nodenv/plugins/node-build
```

nodenvへパスを通す設定を.bash_profileへ追加
（対象ファイルや書き方は環境に応じて要変更）

```bash
echo 'export PATH="$HOME/.nodenv/bin:$PATH"' >> ~/.bash_profile
```

nodenvの利用開始コマンドを.bash_profileへ追加

```bash
echo 'eval "$(nodenv init -)"' >> ~/.bash_profile
```

追加内容を適用する
（公式はシェルの再起動としている）

```bash
source ~/.bash_profile
```

## 作業フォルダへ個別のNode環境を構築

インストール可能なNodeのバージョンを確認

```
nodenv install --list
```

インストールしたいバージョンのNodeを取得

```
nodenv install <listで確認したバージョン>
```

取得したバージョンのNodeをカレントディレクトリに適用

```
nodenv local <installで取得したバージョン>
```

nodeのバージョンを確認

```
node -v
```

インストールしたバージョンが表示されればOK
コードで理解するRedux入門

[コードで理解するReact入門](http://qiita.com/shuzootani/items/94e902bcab86509e06d9) の続き

前回までのコード
<img width="516" alt="スクリーンショット 2017-09-17 11.46.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/132777/fdf57114-9f44-1ca0-8e2b-ade9eda3eb07.png">

state名をgreetings -> usersに変更。
入力したユーザー名をstate.usersに追加するコードを追加
<img width="562" alt="スクリーンショット 2017-09-17 11.55.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/132777/50a682b2-8c50-d530-b78c-5fddd23a3050.png">

inputに入力した文字列を配列に追加していくシンプルな実装
<img width="299" alt="スクリーンショット 2017-09-17 14.31.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/132777/91f5d560-0290-bef0-a562-52ce36048abb.png">

## Reduxのためのディレクトリ構成

<img width="160" alt="スクリーンショット 2017-09-17 12.09.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/132777/422cb5a2-5c18-9348-398a-591cfa51583d.png">

```
src/
  actions/
  components/
  containers/
  reducers/

を追加

index.jsはディレクトリのデフォルトエクスポートファイルになるので、インポートの際ディレクトリのパスを指定するだけでいい。
```

## 必要なライブラリをインストール
redux : reactとは独立していて、React以外のAngularやVueなどでも使える。
react-redux : reactとreduxを連携するために必要(Providerコンポーネント, connect関数)

```
$ yarn add redux react-redux // or npm install --save redux react-redux
```

## Storeの生成
エントリーポイントであるsrc/index.jsでstoreを生成する。
`import App from './components/App'`じゃなくて、`import App from './containers/App'`が正しい

<img width="415" alt="スクリーンショット 2017-09-17 12.35.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/132777/8ff33e94-82b8-c0cb-8584-e462af246e09.png">

## Action
stateが決まったら、そのstateに対して考えられるアクションを洗い出す。

ユーザーを追加するアクション
<img width="535" alt="スクリーンショット 2017-09-17 13.48.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/132777/2c375f4f-f718-861a-8d9b-0e35a738005c.png">

## Reducer
reducer : 受けたactionのタイプをもとに、storeに新しいstateを渡す

userに関するreducerに
<img width="716" alt="スクリーンショット 2017-09-17 13.48.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/132777/fa77b04d-1b6d-8839-2a66-69be86812836.png">

複数あるreducerをまとめて、それをstore生成時に渡す。
そうするとstoreのstateがreducerごとにツリー構造になる。（シンプルなstateツリーを心がける）
state.reducer名.プロパティで取得できる。
<img width="301" alt="スクリーンショット 2017-09-17 13.59.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/132777/33b7751e-16a9-fefc-2169-e3d01899236f.png">

## connect関数
Appコンポーネントにstateと関数を渡すためのコンポーネント(ContainerComponent)
<img width="472" alt="スクリーンショット 2017-09-17 13.58.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/132777/99996c0b-6230-67a5-7572-79e0630fe7a5.png">

## Presentational Component
state-lessなAppコンポーネント(Presentational Component)
<img width="462" alt="スクリーンショット 2017-09-17 13.51.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/132777/f999a9b5-e16b-6fb9-a1f2-feb7b0448ef7.png">

## おまけ
### React-dev-tools

Webコンソールからコンポーネント構造や渡っているオブジェクトなどがわかりやすくなる。

https://chrome.google.com/webstore/detail/react-developer-tools/fmkadmapgofadopljbjfkapdkoienihi?hl=ja

<img width="568" alt="スクリーンショット 2017-09-17 14.32.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/132777/bd0dd4e8-9fac-d68e-5d25-95ee59fd546f.png">
iptables 標準設定

1. データを持たないパケットの接続を破棄する 
2. SYNflood攻撃と思われる接続を破棄する 
3. ステルススキャンと思われる接続を破棄する
4. 特定ポートの接続を許可する SSH,HTTP,HTTPS,SMTPS
5. 特定ポートの接続を許可する （Localhost限定）


```bash
# iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP               # ------① 
# iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP       # ------② 
# iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP                # ------③
# iptables -A INPUT -p tcp -m tcp              --dport 22   -j ACCEPT # ------④
# iptables -A INPUT -p tcp -m tcp              --dport 80   -j ACCEPT # ------④
# iptables -A INPUT -p tcp -m tcp              --dport 443  -j ACCEPT # ------④
# iptables -A INPUT -p tcp -m tcp              --dport 465  -j ACCEPT # ------④
# iptables -A INPUT -p tcp -m tcp -s localhsot --dport 8009 -j ACCEPT # ------⑤
## iptables -A INPUT -p tcp -m tcp              --dport 8009 -j DROP   # ------⑤
```

※ ポート番号 22 は適宜変えてください。　標準設定では危険です
変更しない場合は hosts.deny 等で制限して下さい