OmniAICreator/Qiita-1.07M huggingface dataset:
PowerShell > 実行結果の変数への代入 | 型 | 参照

```txt:動作環境
Windows 8.1 Pro (64bit)
```

関連: [PowerShell > ログイン履歴の表示](https://qiita.com/7of9/items/9e48a79ec31dd6caa3c1)

上記の実行結果を変数に代入するにはどうするか。

参考: http://www.atmarkit.co.jp/ait/articles/0607/26/news118.html

以下にてresultに格納される。

```ps1
> $result = Get-Eventlog Security  -newest 100 | where {$_.InstanceID -like "4624"}
```

格納された型はSystem.Array。

```ps1
>$result.GetType()
IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Object[]                                 System.Array
```

以下のようにインデックス指定で中身を見ることができる。

```ps1
> $result[0]
   Index Time          EntryType   Source                 InstanceID Message
   ----- ----          ---------   ------                 ---------- -------
  169921 10 13 08:36   SuccessA... Microsoft-Windows...         4624 アカウントが正常にログオン...
```
PowerShell > ログイン履歴の表示

```txt:動作環境
Windows 8.1 Pro (64bit)
```

参考: https://social.technet.microsoft.com/Forums/lync/en-US/4f6815f1-2998-484c-a423-fe6507f1548c/powershell-script-to-fetch-logonlogoff-user-on-particular-server-getwinevent-geteventlog?forum=winserverpowershell

参考: https://ss64.com/ps/get-eventlog.html

### code > v0.1

最新10個のログインを見る方法は以下のようだ。

```ps1
> Get-Eventlog Security  -Source Microsoft-Windows-Security-Auditing -newest 10
```

```txt:結果
 169922 10 13 08:36   SuccessA... Microsoft-Windows...         4672 新しいログオンに特権が割り...
 169921 10 13 08:36   SuccessA... Microsoft-Windows...         4624 アカウントが正常にログオン...
 169920 10 13 08:34   SuccessA... Microsoft-Windows...         4672 新しいログオンに特権が割り...
 169919 10 13 08:34   SuccessA... Microsoft-Windows...         4624 アカウントが正常にログオン...
 169918 10 13 08:26   SuccessA... Microsoft-Windows...         4672 新しいログオンに特権が割り...
 169917 10 13 08:26   SuccessA... Microsoft-Windows...         4624 アカウントが正常にログオン...
 169916 10 13 08:26   SuccessA... Microsoft-Windows...         4672 新しいログオンに特権が割り...
 169915 10 13 08:26   SuccessA... Microsoft-Windows...         4624 アカウントが正常にログオン...
 169914 10 13 08:26   SuccessA... Microsoft-Windows...         4672 新しいログオンに特権が割り...
 169913 10 13 08:26   SuccessA... Microsoft-Windows...         4624 アカウントが正常にログオン...
```

### code > v0.2

InstanceID 4624だけ抽出は以下。

`> Get-Eventlog Security  -Source Microsoft-Windows-Security-Auditing -newest 10 | where {$_.InstanceID -like "4624"}
`
Ruby の putc は範囲外の数値でも表示できる

`putc` は数値を渡すと0-255の範囲の対応する文字を出力するメソッドですが、範囲外の数値でも最終的に `num & 0xff` された値になるので、問題なく表示されます。

```rb
putc(65)       #=> A
putc(65 + 256) #=> A
putc(65 - 256) #=> A
```


## 参考サイト

https://docs.ruby-lang.org/ja/latest/method/Kernel/m/putc.html
Angular tips(3)

# Angular 復習

## 1. Form

Angularでは、通常のHTMLフォーム機能を拡張し、バリデーションなどを実装することができる。
例えば、input要素やtextarea要素には、HTML5の検証属性オーバライドしたものや拡張した検証属性をもつことができる。novalidate属性をつけるとHTML5の検証属性を無効可することができる。


| 属性      | 動作                   |
|-----------|------------------------|
| required  | 入力必須               |
| minlength | 文字列の最小長         |
| maxlength | 文字列の最大長         |


検証結果は、

`要素名.errors?.検証属性`でtrueまたはfalseがかえり、*ngIf文でエラーメッセージを表示させたりできる。

検証エラーの場合は、`フォーム名.invalid`でtrueまたはfalseがかえり、フォーム全体がエラーかどうかをチェック、”送信ボタン”等の無効可、有効可をさせることができる。

### 入力状態プロパティ

入力要素単体で、フォーム全体で状態を管理できる。たとえば、変更が検知された場合は、リセットボタンを有効にするといったようなことができる。

|              |        |
|--------------|--------|
|要素名.pristine|変更なし|
|要素名.dirty   |更新あり|
|要素名.touched |フォーカスがあった|
|要素名.untouched|フォーカスがなかった|

また、上記のプロパティを示すスタイルクラスがあり、フォーカスが当たった場合にinput要素の色を変えるなどができる。

|||
|-----|-----|
|ng-vaild|入力値妥当|
|ng-invalid|入力値不正|
|ng-pristine|変更なし|
|ng-dirty|変更された|
|ng-touched|フォーカスがあたった|
|ng-untouched|フォーカスがなかった|


## 2. Reactive Form

Reactiveフォームとは、コンポーネント側(typescript)で制御できるフォームのこと
ReactiveFormModule をAppModule.tsにインポートして使う。

```
price = new FormControl('',
    Vaildators.required,
    Validators.minLength(4)
);
```

```
<input id="price" [formControl]="price">
```

FormControlの仕様は、下記を参照。
https://angular.io/api/forms/FormControl

### FormGroupオブジェクト

FormGroupを使うと、FormControlをまとめて管理することができる。

```
priceForm = this.builder.group({
    price:new FormControl('',
        Vaildators.required,
        Validators.minLength(4)
    )
});

```

```
<input id="price" [formControl]="priceForm.controls.price">
```
MySQLへのログインを簡単にする

# なんで前回こんな記事を書いたか？
[VagrantでAmazon EC2を使う〜おまけ編](https://qiita.com/yutaka_izumaru/items/ead9bbc2a8d775b00d00)
mysql_config_editorを使いたいから！MySQL5.6以上なんだよ！

# 表題の通り
いっつも忘れてググるからメモ。

```shell-session
$ mysql_config_editor set --login-path=user --host=[hostのエンドポイント] --user=[MySQLのユーザー名] --password
```
で、パスワードを入力しましょう。

ちなみにshellとかvagrantのprovisionに書く時は

```shell-session
# echo "MySQLのパスワード" | mysql_config_editor set --login-path=user --host=[hostのエンドポイント] --user=[MySQLのユーザー名] --password
```

これをしとくと、以下でMySQLにログインできるなりよ。

```shell-session
$ mysql --login-path=user
```

これでも長い。
ので、おもむろに以下

```shell-session
$ mkdir ~/bin
$ touch ~/bin/mysql_user
$ chmod 700 ~/bin/mysql_user
```

で、以下のように編集。

```bash
#!/bin/bash
mysql --login-path=user
```

そうすると、以下でログインできるなりよ

```shell-session
$ mysql_user
```

まぁ、パスワード平文で書いてもいいなら

```bash
#!/bin/bash
mysql -h [MySQLのエンドポイント] -u [MySQLのユーザー名] -p[パスワード]
```
でもいいんですけどね。

さらにさらにrailsだったら、database.yml書いておけば

```shell-session
$ rails dbconsole -p
```
で入れるんですけどね。

いじょー

by [株式会社Arrvis](http://www.arrvis.com/)
64bit/pixelなCGBitmapを読む


嘆き
====

全ては、内部処理が48bit-colorになったからって、それをスクショ時にそのまま書き出すiOSが悪い！
そんなあっさり48bit-colorのPNGなんて渡ってくると思わねえよ！

bitmapのpixel formatの基本
===
各ピクセルのRGBAのデータがひたすら並んでいる。
RGBAの順番については色々。
大概は24bit-color(RGB各8bit)+alpha(8bit)で32bit/pixel。


iOSでbitmap読むとき
====
`CGBitmapContextGetAlphaInfo()`と`CGBitmapContextGetBitmapInfo()`の値を見比べてやる

### AlphaInfo

```objc
typedef CF_ENUM(uint32_t, CGImageAlphaInfo) {
    kCGImageAlphaNone,               /* For example, RGB. */
    kCGImageAlphaPremultipliedLast,  /* For example, premultiplied RGBA */
    kCGImageAlphaPremultipliedFirst, /* For example, premultiplied ARGB */
    kCGImageAlphaLast,               /* For example, non-premultiplied RGBA */
    kCGImageAlphaFirst,              /* For example, non-premultiplied ARGB */
    kCGImageAlphaNoneSkipLast,       /* For example, RGBX. */
    kCGImageAlphaNoneSkipFirst,      /* For example, XRGB. */
    kCGImageAlphaOnly                /* No color data, alpha data only */
};
```

↑ 元のヘッダファイルのkCGImageAlphaNoneSkipLastのコメント、「R **B G** X」は奴らのtypoなので注意。 *（上の引用では修正済）*


- Aの位置がどこにあるか
- Aはあるのか
- premultiplied(アルファ乗算済み)かどうか

### ByteOrderInfo
```objc
typedef CF_ENUM(uint32_t, CGImageByteOrderInfo) {
    kCGImageByteOrderMask     = 0x7000,
    kCGImageByteOrder16Little = (1 << 12),
    kCGImageByteOrder32Little = (2 << 12),
    kCGImageByteOrder16Big    = (3 << 12),
    kCGImageByteOrder32Big    = (4 << 12)
};
```

- 区切りが16bitか32bitか。
- byteorderがbig（そのまま）かlittle（逆順）か


### BitsPer

```objc
size_t CGImageGetBitsPerComponent(CGImageRef image);
size_t CGImageGetBitsPerPixel(CGImageRef image);
```

これが今回のミソ。
普通に8bit/compoment、32bit/pixelが返ってくるものと思っていたが、いやいや。
ただスクショを撮って、それをImagePickerで読み込むだけで。
16bit/component、64bit/pixelのデータが来るわけですよ。まじかよ。さすが未来に生きてるな、Apple。


結論
====

|                         | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
|:------------------------|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
| 24bit-color RGBA        | R | G | B | A |   |   |   |   |
| 24bit-color RGBA / LE32 | A | B | G | R |   |   |   |   |
| 48bit-color RGBA        | R | r | G | g | B | b | A | a |
| 48bit-color RGBA / LE16 | r | R | g | G | b | B | a | A |


UInt8のポインタでアクセスして、以下な感じで済ますのが良さげだった


```objc
#define u16(p,i,le) (le?p[2*i]+(p[2*i+1]<<8):(p[2*i]<<8)+p[2*i+1])
```

あとpremultipiledな場合は

```objc
CGFloat fa = p[3] / UINT8_MAX;
UInt8 r = p[0] / fa;
UInt8 g = p[1] / fa;
UInt8 b = p[2] / fa;
UInt8 a = p[3];
```
な感じで使う前にalphaを逆算してあげてね

その他
====
他にも値がUnsigned intでなくfloating pointだったりすることもあるらしい(`kCGBitmapFloatInfoMask`)のだが、さすがに対応を割愛。
VagrantでAmazon EC2を使う〜おまけ編

# はじめに
先ほど、こんな記事を書きました。
[MacにRuby on Rails5の開発環境を作る（Vagrant+RubyMine）](https://qiita.com/yutaka_izumaru/items/088abeff36bfecb35b39)
これさ、boxが2017.03までしかないんだよね。
yum updateしても2017.09にならないんだよね。
でも2017.09使いたいよね。
で、試行錯誤を重ねた結果。

EC2でバージョン固定する方法があるんですがね。
それを試したらアップデートでけたw
provisionの最初に、以下を追加してあげましょう。

```shell-session
sudo sh -c "echo 'releasever=2017.09' >> /etc/yum.conf"
sudo yum clean all
```

これでmysql57がインストールできるぉ。
【Python】.zsh_historyの履歴のタイムスタンプを削除

## はじめに

<img width="1280" alt="history.png" src="https://qiita-image-store.s3.amazonaws.com/0/153964/6e410a89-30d7-0f01-7d5b-87bee2b3aee5.png">

`peco`などに利用される `.zsh_history`の履歴にはタイムスタンプが押されます。
`: 1507713777:0;`みたいなやつです。
~~これは`zplug`の機能によるものなので、`zplug`を入れてない人に表示されません。~~
**修正**
`zplug`によるものではなく、`.zshrc`に書いてある`setopt EXTENDED_HISTORY`によるものです。

で、今回はこのタイムスタンプを消し去りたいと思いました。
何故なら、**同じ内容がたくさん書かれていてキモいから**という個人的な理由です。

## 実装
### 環境
* python 3.6.0

### コード

```arrange_zsh_history.py
import subprocess
import re

contents = subprocess.check_output('cat .zsh_history', shell=True)
data_list_b = contents.splitlines()
s = r': [0-9]{10}:[0-9];'
data_list = [repr(l).lstrip('b').strip('\'') for l in data_list_b]

result_set = set([re.sub(s, '', d) for d in data_list])
f = open('.zsh_history', 'w')
for r in list(result_set):
    if r != '':
        p = re.compile(r'\\+')
        r = p.sub(r'\\', r)
        if r[0] == '\"':
            r = r.strip('\"')
        f.write(r+'\n')
f.close()



```

コードはこんな感じです。
`.zsh_history`と`arrange_zsh_history.py`を同じ階層に置いて、

```
python arrange_zsh_history.py
```
を実行すれば`.zsh_history`の中身が書き換わります。

### コードの説明
このコードは`.zsh_history`の中身を取ってきて、内容を編集した上で`.zsh_history`に上書きするコードです。
その際に

```
r': [0-9]{10}:[0-9];'
```
の正規表現にマッチしたタイムスタンプの文字列を

```
set([re.sub(s, '', d) for d in data_list])`
```
によって変換しています。
この時、`\n`などバックスラッシュを含めた文字列が`\\n`のような形に変換されてしまうので、

```
p = re.compile(r'\\+')
r = p.sub(r'\\', r)
```
の処理を行い、任意の数の`\`を一つに変換しています。

## おわりに
本当は`.zsh_history`の中身を取得するのに

```
contents = open('.zsh_history', 'r')
```
のようにして取得したかったのですが、上手くいかず(多分エンコーディングのせい？？)泣く泣く

```
contents = subprocess.check_output('cat .zsh_history', shell=True)
```
のように強引に取得しました。Pythonもっと勉強しなくては...
もし、「こっちの方がいいよ！」「こっちの方がクレバーだぜ!」という意見をくれる方がいらっしゃったらコメントを頂けると助かります。
Vim に typescript の環境を作る by dein

ドキュメントの通りだとうまく動かないのでメモ

## はまったところ 
- tsconfig.json 必須
- REAME.md にある \ 'cmd': {server_info->[&shell, &shellcmdflag, 'typescript-language-server', '--stdio']} だと --stdio が渡らない
- asyncomplete-lsp が asyncomplete とプラグインのファイル名が同じなので asyncomplete のファイルを上書きしてしまう．

# LSP サーバのインストール
```
npm install -g typescript typescript-language-server
```

# dein の設定

```
[[plugins]]
repo = 'leafgarland/typescript-vim'

[[plugins]]
repo = 'prabirshrestha/async.vim'

[[plugins]]
repo = 'prabirshrestha/vim-lsp'
hook_add = '''
if executable('typescript-language-server')
  au User lsp_setup call lsp#register_server({
      \ 'name': 'typescript-language-server',
      \ 'cmd': {server_info->[&shell, &shellcmdflag, 'typescript-language-server --stdio']},
      \ 'root_uri':{server_info->lsp#utils#path_to_uri(lsp#utils#find_nearest_parent_file_directory(lsp#utils#get_buffer_path(), 'tsconfig.json'))},
      \ 'whitelist': ['typescript'],
      \ })
endif
let g:lsp_log_verbose = 1
let g:lsp_log_file = expand('~/vim-lsp.log')
'''

[[plugins]]
repo = 'prabirshrestha/asyncomplete.vim'
hook_add = '''
let g:asyncomplete_log_file = expand('~/asyncomplete.log')
let g:asyncomplete_auto_popup = 1
imap <c-space> <Plug>(asyncomplete_force_refresh)
inoremap <expr> <Tab> pumvisible() ? "\<C-n>" : "\<Tab>"
inoremap <expr> <S-Tab> pumvisible() ? "\<C-p>" : "\<S-Tab>"
inoremap <expr> <cr> pumvisible() ? "\<C-y>" : "\<cr>"
'''

[[plugins]]
repo = 'prabirshrestha/asyncomplete-lsp.vim'
merged = 0
```
Nginxを使って、1つのサーバーで複数サイトを運用

# やりたいこと
１つのサーバーで複数のサイトを構築したい！

# nginxをインストール
[さくらVPSで、SSL+CentOS7+Nginx+PHP7+MySQLを構築する方法](https://qiita.com/hi-ro-to/items/542cfe43e6a214a84cf7#nginx) を参考にnginxをインストールします。

# 複数サイト用に設定ファイルのディレクトリ作成

各サイトの設定ファイルを置くディレクトリ（環境に合わせて好きな場所に）

```
$ mkdir /etc/nginx/conf.d/sites-available
```

メンテナンス性を高めるために、設定ファイルのシンボリックリンクを張るディレクトリ

```
$ mkdir /etc/nginx/conf.d/sites-enable
```

nginxに権限付与

```
$ sudo chown -R nginx.nginx /etc/nginx/conf.d/sites-*
```

# 運用したい各サイトのソースを置くディレクトリを作成

```
$ mkdir /var/www/html/{service_name}
$ chown -R nginx.nginx /var/www/
```

# 各サイトの設定ファイルを作成

```
vim /etc/nginx/conf.d/sites-available/{service_name}.conf
```

内容は、

```
server {
    listen       80;
    server_name  {ドメイン};
    index        index.php;
    access_log   /var/log/nginx/{service_name}.access.log; // 環境に合わせて指定
}
```

# 各サイトの設定ファイルのシンボリックリンクを張る

```
$ ln -s /etc/nginx/conf.d/sites-available/{service_name}.conf /etc/nginx/conf.d/sites-enable/
```

# 各サイトの設定ファイルを読み込むようにする

```
$ vim /etc/nginx/nginx.conf
```

以下を`http { ... }`の中に追記し、各サイトの設定ファイルをシンボリックリンクで読み込めるようにする。

```
include /etc/nginx/conf.d/sites-enable/*.conf;
```

`/etc/nginx/nginx.conf`と各サイトの設定ファイルの全体像はこのようになります。

`/etc/nginx/nginx.conf`の内容

```
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

include /usr/share/nginx/modules/*.conf;

events {
    worker_connections 1024;
}

http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 2048;
    server_tokens       off;

    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;

    index   index.php index.html index.htm;

    include /etc/nginx/conf.d/sites-enable/*.conf;
}
```

各サイトの設定ファイルの内容

```
server {
    listen       80;
    server_name  {ドメイン};
    index        index.php;
    access_log   /var/log/nginx/{service_name}.access.log;
}
```

# nginx再起動

```
$ systemctl restart nginx.service
```
Spring AOP Pointcutについて

Springframework 学習その3　AOPのPointcutについてです。

# Pointcutについて
## Pointcutとは
前回のまとめで記載しましたが、Pointcutについて今一度まとめてみます。 
Pointcutとは、Join Pointのグループを示します。 
例えば、以下のようなexecutionも、Join PointのPointcutとなります。 
`execution(* com.nanafushi.sample.*Controller.*(..))` 
Pointcutはパターンを指定してマッチングをすることができます。

## Pointcutの構成
`execution(* com.nanafushi.sample.*Controller.*(..))` 
上記を例として、左から順番に抽出して説明すると、

| パーツ               | 役割 |
|:-------------------:| :---|
| execution           | 指示子。メソッドの実行をトリガにする |
| *                   | 戻り値。voidのものだけ　とか |
| com.nanafushi.sample | パッケージ |
| *Controller         | クラス名。末尾がControllerのクラス |
| *                   | メソッド名 |
| (..)                | メソッドの引数。この場合は任意の引数 |

### ワイルドカード
Pointcutで利用できるワイルドカードは以下の通りです。

| ワイルドカード | 役割 |
|:-------------:|:---|
| *             | 原則は任意の文字列 <br /> パッケージの場合は任意の1階層 <br /> メソッドの場合は任意の1つの引数 |
| ..            | パッケージの場合は、任意の0以上のパッケージ <br /> メソッドの引数の場合は、任意の0以上の引数 |
| +             | クラス名の後に指定することで、そのクラスを含むサブクラス、実装クラス全てを含める |

## 指示子の種類
Pointcutには色々種類があります。 
よく使いそうなものを列挙してみます。

| Pointcut  | トリガ |
|:---------:|:---|
| execution | パターンにマッチするメソッドが対象 |
| within    | パターンにマッチするクラスのメソッドが対象 |
| bean      | パターンにマッチするBeanのメソッドが対象 |

以上です。お疲れ様でしたー。

# 参考書籍
[Spring徹底入門 Spring FrameworkによるJavaアプリケーション開発] (https://www.amazon.co.jp/Spring%E5%BE%B9%E5%BA%95%E5%85%A5%E9%96%80-Spring-Framework%E3%81%AB%E3%82%88%E3%82%8BJava%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E9%96%8B%E7%99%BA-%E6%A0%AA%E5%BC%8F%E4%BC%9A%E7%A4%BENTT%E3%83%87%E3%83%BC%E3%82%BF/dp/4798142476/)
どうせなら、SSHDでrsaキーの拒否をしてみないか?

もう、Linuxサーバーのssh-keygenでecdsaとed25519のキーが作成できるのだし、公開鍵認証に使用する鍵はセキュリティ的にもうあまり高くないrsaキーの4096bit以上ではなく、ecdsaかed25519に切り替えているとは思うけど、sshdの設定がそのままでは、結局、rsaが使用できるままなので、rsaが拒否できないかとおもったのでやってみた。

# 核心
/etc/ssh/sshd_config に　PubkeyAcceptedKeyTypesという項目が設定できるので、それに使用するキーを設定するだけ、 但し安易に設定ミスしリモート接続のみの環境でsshdをリスタートさせると、2度とssh接続できないという悲しい羽目にならないように、十分気をつけ、かつ、別のconigを使って別のプロセスで検証し確実にOKの確信を得てから本番をやるべき

## 検証前準備
あらかじめssh接続検証ユーザー(sshd_test)とssh-keygenで検証用の各種キーペア(rsa,ecdsa[256|384|521],ed25519)を作成し、authorized_keysに追加しておく

```shell-session
#ユーザー作成
useradd sshd_test

# ssh鍵作成 & 公開鍵認証設定

su - sshd_test
mkdir .ssh
chmod 700 .ssh
cd .ssh
ssh-keygen -t rsa -b 4096 -f id_rsa
ssh-keygen -t ecdsa -b 256 -f id_ecdsa256
ssh-keygen -t ecdsa -b 384 -f id_ecdsa384
ssh-keygen -t ecdsa -b 521 -f id_ecdsa521
ssh-keygen -t ed25519 -f id_ed25519
cat id_*.pub > authorized_keys
chmod 600 authorized_keys

```

## 設定検証

下記で、sshd_configファイルを新規に用意して

```shell-session

cd /etc/ssh
cp -p sshd_config sshd_config.1

vi sshd_config.1
```

ecdsaの256bitと384bitと521bit、ed25519のみに限定するので、ファイル末尾に下記を追加

```text:sshd_config.1

PubkeyAcceptedKeyTypes=ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521,ssh-ed25519
```

下記で、設定ファイルをsshd_config.1でport:23を使用するsshdプロセスを別途たてる

```shell-session

 /usr/sbin/sshd -f /etc/ssh/sshd_config.1 -p 23

```

## 接続テスト
検証用の各種の鍵でport:22とport:23とに接続テストして挙動を確認してみる

```shell-session

cd /home/sshd_test/.ssh

# port:22に接続テスト
ssh -i id_rsa      sshd_test@localhos
#=> 接続OK

ssh -i id_ecdsa256 sshd_test@localhost 
#=> 接続OK

ssh -i id_ecdsa384 sshd_test@localhost 
#=> 接続OK

ssh -i id_ecdsa521 sshd_test@localhost 
#=> 接続OK

ssh -i id_ed25519  sshd_test@localhost 
#=> 接続OK

# port:23に接続テスト
ssh -i id_rsa      sshd_test@localhost -p 23
#=> Permission denied (publickey).

ssh -i id_ecdsa256 sshd_test@localhost -p 23
#=> 接続OK

ssh -i id_ecdsa384 sshd_test@localhost -p 23
#=> 接続OK

ssh -i id_ecdsa521 sshd_test@localhost -p 23
#=> 接続OK

ssh -i id_ed25519  sshd_test@localhost -P 23 
#=> 接続OK

```

## 設定適用

挙動に問題がなければ

```shell-session

# sshd_configファイルを上書き
cd /etc/ssh
mv -f sshd_config.1 sshd_config 

#リブートかける
sync;sync; init 0

```
# 注意

rsaの拒否は、自己責任の下で、確実に検証と確認をして行いましょう
とくに、言語のsshモジュールの古いversionのものには、rsa形式までしかサポートしていないものもあるので、itamaeやansibleなどを使用している際に使えなくなる場合があるので、十分に気をつけてください。
[rails] modelでformからの値を取得・加工後に、DBに挿入する 

#はじめに
おそらく、基本中の基本のことではあると思います。。
最近、formからの値を加工し、データベースに保存することがあったため、備忘録として残しておきたいと思っています。
もっといい方法やそもそも間違っている内容がある場合は、どしどしコメントをお待ちしています！

#1.コールバックを設定
2012年の記事ですが、コールバックに関して大変わかりやくまとめていただいています。
http://www.techscore.com/blog/2012/12/25/rails%E3%81%AE%E3%82%B3%E3%83%BC%E3%83%AB%E3%83%90%E3%83%83%E3%82%AF%E3%81%BE%E3%81%A8%E3%82%81/

今回は、`before_save` をmodelに設定します。
before_saveは、paramsをDBに保存する直前に指定したプログラム(今回の例では、:change_date_format)を実施するコールバック関数です。
`before_save`を設定すると、createとupdateのどちらも場合にも、適用されます。

updateの時飲みに適用したい場合には、`before_update`を記述してください。

```hoge.rb
class Hoge < ActiveRecord::Base
  before_save :change_date_format
end
```

#2.formからの値を受け取る
こちらは、`self.published_at`のように記述します。
modelでは、selfはつまり、modelそのものを意味するらしいので、model_name.published_atでもいいかと思います。

`published_at`の箇所には、値を加工した後に入れたいDBのカラム名を指定してください。

self.column_name || model_name.column_name

```hoge.rb
class Hoge < ActiveRecord::Base
  before_save :change_date_format
  before_save :set_end_of_month

  private

  def change_date_format
    row_data = self.published_at
    fixed_data = row_data.in_time_zone('Tokyo')
    self.published_at = fixed_data
  end

  def set_end_of_month
    self.closed_at = self.published_at.end_of_month
  end
end
```



以上が、modelでformからの値をmodelで取得・加工して、DBに保存する方法です。

controllerでも[:published_at]で値を取得し、加工し、modelに飛ばす方法ができるのですが、
汚くなりそうなので、modelに記述しています。
WordPress 特定の投稿だけAMPにしたい

2018.2.14 追記
AMP for WordPress ver 0.6.0 からプラグインにこの機能が実装されたので、この記事にあるカスタマイズは必要なくなりました。

![スクリーンショット 2018-02-14 13.13.55.png](https://qiita-image-store.s3.amazonaws.com/0/18348/6ffae3a4-f132-e05c-94fa-79d24a130a8f.png)


- - - -

WordPress 記事の AMP ページ作成プラグインとしては [AMP for WordPress](https://ja.wordpress.org/plugins/amp/) プラグインがベターですが、もっと高機能なプララグインもあります。

が、その中でも [Facebook Instant Articles & Google AMP Pages by PageFrog](https://ja.wordpress.org/plugins/pagefrog/) がサーバーに負荷かけすぎ問題があって、その中の「特定の投稿だけAMPにする」機能を単独プラグインにしましたよ、というお話

# 仕様
- 投稿編集画面にメタボックスを作ってチェックの入った投稿のみAMPページを作る
- [AMP for WordPress](https://ja.wordpress.org/plugins/amp/) プラグインの利用が前提

# メタボックスを作って設定をカスタムフィールドに保存する

`add_meta_box()` 使ってよしなに作っておきましょう。
Codexのサンプルコードはテキストなのでチェックボックスに変えておきましょう。
https://wpdocs.osdn.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/add_meta_box

![スクリーンショット 2017-10-13 0.04.37.png](https://qiita-image-store.s3.amazonaws.com/0/18348/d8856b35-8823-72d9-cf9a-2e3d3e60d9d8.png)

# チェック入った投稿だけAMPに
AMP for WordPressプラグインのフィルターフック `amp_skip_post` を使いましょう。
https://github.com/Automattic/amp-wp/blob/master/includes/amp-helper-functions.php#L30

- デフォルトは `false` です。フィルター名の通り、AMPをスキップしたい場合は `ture` を返すようにしましょう
- 特に追加したカスタムフィールドがチェックボックスでデフォルトでチェックを入れていても、過去の投稿は自動で保存などされません。また「チェックの入っていない」「カスタムフィールドがない」などはDBの負担になるので、「カスタムフィールドの値が1のもの」のようにして条件分岐しましょう

```php
<?php
add_filter( 'amp_skip_post', 'my_amp_skip_post' 10, 3 );
function my_amp_skip_post( $flag, $post_id, $post ) {
	$flag = true;
	$checked = get_post_meta( $post_id, '_my_amp_post_control', true ); // カスタムフィールドの値取得
	if ( $checked == 1 ) {
		$flag = false;
	}
	return $flag;

}
```

これで、チェックボックスにチェックの入っていない投稿は `/amp/` エンドポイントでアクセスしても、オリジナルのURLに301リダイレクトされます。

AMP for WordPressプララグインが `/amp/` エンドポイントにアクセスがあった場合、どのように振る舞うかは
https://github.com/Automattic/amp-wp/blob/master/amp.php#L85-L111
になりますので、頑張ってソースコード読みましょう。

現場からは以上です。
React Nativeで任意のコンポーネントのサイズを取得する方法

React NativeでUI系のライブラリを使うと、そのライブラリに含まれるコンポーネントのサイズを取得して、そのサイズに合わせてその他のコンポーネントを配置したい、ということがあります。例えば、[React Native Element](https://react-native-training.github.io/react-native-elements/) でHeaderを使い、その下にメインのViewを配置する場合などです。

こういった場合にどうしたらいいかというと、サイズを知りたいコンポーネントの`onLayout` プロパティにコールバック関数を渡して、コールバック関数の引数からサイズを取得すればよいです。

簡単なサンプルを以下に示します。

```
import React, { Component } from 'react';
import { View } from 'react-native';

export default class App extends Component {
  constructor(props) {
    super(props);
    this.state = {height: 0};
  }

  onLayout = (e) => {
    /* コンポーネントの高さを取得し、stateに保存 */
    this.setState({
      height: e.nativeEvent.layout.height
    });
  }

  render() {
    return (
        <View>
          <View 
            onLayout={this.onLayout} /*ここでコールバック関数を渡す*/
            style={{ 
            backgroundColor:'powderblue', 
            position:'absolute', 
            height:130, 
            width:200 }}></View>
          <View style={{ 
            backgroundColor:'steelblue', 
            height:100,
            marginTop:this.state.height, /* 上のコンポーネントの高さの分マージンをとる */
            width:100 
            }}></View>
        </View>
    );
  }
}
```

実行結果

<img width="375" alt="IMG_0050.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/35175/1707c2f1-d24c-2c9c-bb95-7e3224e9fcd7.png">
How to set up Cocos2d-x On Mac

# Download Cocos2dx (latest v3.16)
 - http://www.cocos2d-x.org/download

# Command on the Terminal
 - open and move to the folder
 - python ./setup.py
 - enter to skip
 - excute command: "source /User.....
 - again python ./setup.py

# create new project
 - cocos new <project name> -p <package name> -l <develope language> -d <folder>
  ex)cocos new TestProject -p com.cocos.test -l cpp -d i:\CocosTest
[react]子要素に複数配置したinputのvalueを取得する

下記のようなコンポーネント構成のinput valueを親コンポーネントでこんな風に取得できた。


```react:sample.jsx
class Parent extends React.Component {
 constructor(props) {
  super(props);
  this.inputRefs = []; 
 }

 // ボタン押下処理で子要素のinput valueを全部取得したい
 clickEvent() {
   this.props.datas.forEach(function(data,index){
     this.inputRefs[index].inputA.value,
     this.inputRefs[index].inputB.value,
     this.inputRefs[index].inputC.value
   },this);    
 }

 render() {
    var childInputGroup = this.props.datas.map(function(data, index){
            return <ChildInput key={...} ref={(input) => {this.inputRefs[index] = (input)}}/>
        },this);
  
    return (
      <div>
        {childInputGroup}
      </div>
    );
  }

}

class ChildInput extends React.Component {

  render() {
    return(
      <div>        
        <input ref={(input) => {this.inputA = input}} />
        <input ref={(input) => {this.inputB = input}}/>
        <input ref={(input) => {this.inputC = input}}/>
      </div>
    );
  }

}
```
親コンポーネントのthis.inputRefsに、生成した子要素分の参照を入れておく。
子要素のinputにもそれぞれrefを付与しておくと、上記の形でinput valueが取れる。

map()の第2引数にthisを渡さないと、this.inputRefがundefinedになるので注意。
R言語でパッケージのインストールと読み込みを行うスニペット

R言語で、「パッケージがインストールされていれば読み込んで、なければインストールする」という書き方スニペット集。

案外「これだ！」という書き方が今までできていなかったので。

> 追記
> @hoxo_m さんの[同様の記事](https://qiita.com/hoxo_m/items/dbd560abc0080bb73e8f)もありましたが、一応複数指定対応版ということで公開します。

# 完成版

パッケージを複数指定して、読み込みorインストールを行う。

```R
libs <- c("magrittr","RSQLite")
requireLibs(libs)

requireLibs <- function(libs) {
  for(lib in libs){
    if(!require(lib, character.only = T)){
      install.packages(lib)
      require(lib, character.only = T)
    }
  }
}
```
## ハマりどころ
### libraryとrequire
library()とrequire()共にパッケージの読み込みを行いますが、requireは読み込み対象がなかった場合にfalseを返すのでインストールが必要かどうかの判定に使えます。

なお、libraryも引数に`logical.return = T`を指定すると同様の動きになります。

### パッケージ名の指定
```R
lib <- "RSQLite"
require(lib)
library(lib)
```
とすると、両方とも"lib"という名前のパッケージを探してしまうため、エラーになってしまいます。

引数に"character.only = T"を追加することで変数を展開して参照してくれます。

## おまけ

### evalで解釈させる
`character.only`を使わなくても、変数と解釈して展開してくれれば良いので、文字列を作って`eval`で読み込ませるという力技もできます。

```R
requireLibs_eval <- function(libs) {
  for(lib in libs){
    req.parse <- parse(text = paste0("require(", lib, ")"))
    if(!eval(req.parse)){
      install.packages(lib)
      eval(req.parse)
    }
  }
}
```
ええ、はい、`character.only`があることに気づくまではこうしてましたですとも。

### installされているかのチェックを先に行う

また、こちらの記事の@uriさんのコメントにあるような
現在インストールされているパッケージ一覧を取得して、ないもののみインストールするというやり方もいいですね。
3分で分かった気になる、PWA(Progress Web App)とは？

PWAという単語をよく聞くため、なんとなく話についていける程度に軽く調べた。

同じ題でブログの方にも書きました。
[PWA(Progress Web App)についてなんとなく知る](http://ryota0548.hatenablog.com/entry/2017/10/14/195154)

# PWA(Progressive Web App)とは

- 簡単に言うと、アプリっぽいWebサイト
- Googleが最近推している

機能でいうと、以下が利用可能に

- アイコン追加
- スプラッシュスクリーン
- オフラインキャッシュ
- プッシュ通知

オフラインキャッシュやプッシュ通知は【Service Worker】の機能が利用されている。
Service Workerとは、ブラウザの裏側で指定通りに働く「ワーカー」である。

- 他にもAMPとの併用可

AMPとは、モバイルのWebページを高速化するもの
詳しくはまた調べる必要がある。

# PWAのメリット

- App Store等のアプリストアから出す必要がない
  - リリース/アップデート時の審査が不要になる。
- OSごとの個別対応が不要
- HTML, Javascriptで実装可能

# PWAの注意点

- ブラウザに大きく依存
  - Service-Workerに対応しているかどうかが重要
  - ~~なんとsafariはService-Workerに対応していない~~
  - ~~アプリを推したいAppleの仕様？~~
  - **safariも対応中らしい**
  - [やばい、iOSにネイティブアプリ要らなくなるかも。SafariもPWAに対応する可能性](https://qiita.com/Yatima/items/b9f1962da1a304dc7604)

# 簡単なまとめ

ネイティブアプリをわざわざPWAに置き換える必要はないが、
これから新しくアプリを作る予定であれば、PWAも視野に入れてみては。
ChromeにVue.js devtoolsを導入する

# Chromeエクステンションのインストール
https://chrome.google.com/webstore/detail/vuejs-devtools/nhdogjmejiglipccpnnnanhbledajbpd?hl=ja

# デバッグ方法
## Vue.jsを導入しているページにアクセス
ChromeのURLバーの右に出るVue.jsのアイコンをクリックして「Vue.js is detected on this page. Devtools inspection is not available because it's in production mode or explicitly disabled by the author.」と出る場合はproduction版（minified版）のvue.jsを利用している場合が多い。minified版を使わないか、以下のようにする。（ここではLaravelのBladeを使っている事を想定）

``` php:vue_js_devtools_test.blade.php
        @if( App::environment(['local', 'staging']) )
        Vue.config.devtools = true;
        @endif

        var vm = new Vue({
            （省略）
        });
```

このようにすると、開発環境とステージングの場合のみVue.js devtoolsが利用出来るようになる（minified版でも）。
再度ChromeのURLバーの右のVue.jsのアイコンをクリックして「Vue.js is detected on this page. Open DevTools and look for the Vue panel.」と出れば成功。

## Chrome Developer Toolsを開く
Chrome Developer Toolsを開くと、"Vue"タブが出ている。そこを開くとリアルタイムでVue.jsの情報が閲覧できるようになる。
ターミナルでSQLiteを使う(1回目)

今回はターミナルでSQLiteをかるーく使ってみる

###データベースの作成
```ruby:terminal
 sqlite>.open [ファイル名]
```

[ファイル名]の部分は任意のデータベースの名前を入力する。次回からはこのコマンドで作成済みのデータベースをオープンする

###データベースが作られたか確認
```ruby:terminal
sqlite>.databases
main: /Users/[ユーザー名]/[ファイル名]
```

###テーブル作成


```ruby:terminal
sqlite>create table [テーブル名]([カラム名] [データ型], [カラム名] [データ型]...);

```

終わりには必ず**;(セミコロン)**をつけること
(例)

```ruby:terminal
sqlite>create table classroom(id integer, name text);

```
以下のようなテーブルがデータベースに作られる

| id               |       name        | 
|:-----------------|------------------:|
|                  |                   | 

###データ追加

```ruby:terminal
sqlite>insert into [テーブル名] values(値1, 値2 ...);
```

(例)

```ruby:terminal
sqlite>insert into classroom values(1, '太郎');
sqlite>insert into classroom values(2, '小太郎');
```

| id               |       name        | 
|:-----------------|------------------:|
|      1           |     太郎          | 
|      2           |     小太郎        | 


###データ削除

```ruby:terminal
sqlite>delete from [テーブル名] where (条件式)
```

(例)idが1のデータを削除

```ruby:terminal
delete from classroom where id == 1;
```

| id               |       name        | 
|:-----------------|------------------:|
|      2           |     小太郎        | 

###テーブルの確認

```ruby:terminal
sqlite>select [カラム名] from [テーブル名];
```

(例)classroomのデータ全てを抽出

```ruby:terminal
sqlite>select * from classroom;
```

ぼちぼち長くなってきたのでこれで一旦終わり
5分で【サーバ/インフラを支える技術】を読んだ気になる

最近は業務でシステム構成図を見ることが多くなってきた。
見てもよくわからないことが多いので、何か勉強しようと思い、
【サーバ/インフラを支える技術】を読んだ。
せっかくなので、目次に毛を生やした程度にまとめてみた。

## 【第１章】サーバ/インフラ構築入門

- システムは、障害がいつ起こってもいいように設計しなければならない
- そのためには、ルータ、ロードバランサ、サーバ、全てを冗長化する必要がある
- 冗長化した際に大切なことは、
  - 障害の検出（ヘルスチェック）
  - スムーズな切り替え（IPアドレスの引き継ぎ）
- スケジューリングアルゴリズム、VRRP、色んな仕組みが使われている

## 【第２章】ワンランク上のサーバ/インフラの構築

- キャッシュサーバをリバースプロキシとして使うと、APサーバへの負荷分散ができる
  - リクエストの内容によって、サーバを切り替えることができる（L7スイッチの役割）
  - HTML, CSS, JS, 画像等の静的コンテンツはキャッシュサーバから返す
  - [HTTPプロトコルレベル：Squid], [Webアプリのデータ：memcached]
- MySQLも冗長化（レプリケーション）し、かつスレーブを有効活用する
  - データを参照するだけのリクエストはスレーブを参照させると良い
  - もちろんスレーブも内部ロードバランサ(Linux)で捌けるようにしておく
- HTTPをストレージプロトコルとして利用することで、サイトが全停止する危険を回避
  - 単一故障点を防ぐために冗長化が必要
  - 複数台のサーバにファイルを同期さると不具合が起きやすい
  - これら２つの課題は第３章で

## 【第３章】止まらないインフラを目指すさらなる工夫

- DNSサーバの障害はなかなか起きないが、起こった時には原因特定がかなり難しく影響範囲が広い
  - ロードバランサにVIPを持たせ、Active/Active構成で冗長化する。(IPVS, keepalive)
- ストレージサーバの同期は困難 -> DRBDを用いて解決
  - DRBD:ファイル単位ではなく、ブロックデバイス単位でリアルタイムにレプリケートする
  - keepalivdをdaemontoolsで制御する
  - 誰かが間違えてファイルを消すと即座にバックアップに反映してしまうのが弱点
- Bondingドライバを用いて、L1,/L2も冗長化する（リンク、スイッチ）
  - 冗長化しすぎるとループができてしまう（ブロードキャストストーム）
  - RSTPで解決（自動的に冗長な接続を遮断する）
- VLANを用いてネットワークを柔軟に
  - ポートVLAN：スイッチのポートごとにVLAN識別子を割り当てる
  - タグVLAN：EthernetフレームにVLAN識別情報を挿入する。論理構成が複雑になりがち。
  - サーバファームでの利用は、タグVLANを使用することで、物理的な無駄を無くせる
  - ポートVLANを基本とし、必要なところにタグVLANの設定を行うのが理想
  - VLAN構成が複雑になっても、物理構成はシンプルさを求める

## 【第４章】性能向上、チューニング

- これまでの冗長化に合わせて、単一のホストの性能を引き出すことによって初めて負荷分散の意味がある
  - 負荷は推測するのではなく、計測する：ロードアベレージを見る
  - CPU負荷とI/O負荷の２種類あり、どちらがボトルネックかを調べる
  - ps, sar, vmstat, top,,,　様々なコマンドを使って確認する
  - カーネルコードを見ることで、負荷計算方法の理解をより深める
  - チューニングとは、ボトルネックを発見し、それを取り去ることのみ
- Webサーバ(Apache)にもチューニングはできるが、ほとんどの原因は別の場所に存在する
  - 強いてあげるなら、並列処理の際のMPMに何を選択するかが重要になる
  - サーバが搭載する物理メモリと1プロセスの平均メモリ消費量によってMaxClientsを決める
  - perfork:マルチプロセス。普段使いならこちらで良い。
  - worker:マルチスレッド。軽量で高速であるが、設定が複雑。
- MySQLのチューニングはテーブル設計やSQLの最適化が効果的
  - サーバサイドで出来ることは、メモリ関係のパラメータチューニング
  - バッファ：innodb_buffer_pool_sizeとかとか

## 【第５章】省力運用

- 省力運用のために様々なツールが用いられる
- Nagios：サービスの稼働監視
  - 死活状態
  - 負荷状態
  - 稼働率の計測
- Ganglis：サーバリソースのモニタリング
  - CPU使用率、メモリ使用率
  - ロードバランサ
  - ネトワークトラフィック
- Puppet：サーバ管理の効率化
  - 新規サーバの投入
  - 既存サーバの設定変更
  - 台数が多いところ、手動では設定漏れが発生しがちなところが優先
- deamontools：デーモンの稼働管理
  - プロセスが落ちた時に自動で起動しなおしてくれる
  - 手軽にデーモンを作れる
- PXE、initramfs：ネットワークブートの活用
  - ネットワーク上のサーバから読み出すため、二次記憶装置が必要ない
  - ロードバランサやDB,ファイルサーバに活用されることが多い
- リモートメンテナンス
  - SSHでリモートログインすると楽だけど、OSが起動していないと使えない
  - シリアルコンソール、IPMI等を用いて対処する
- Webサーバのログの扱い
  - ログを扱いやすくするためには、１つの場所に集約、収集する必要がある
  - アクセスの集計やトラブルの解析に利用される
ちょっとずつ読むドメイン駆動設計 第ニ部 モデル駆動設計の構成要素 第六章 ドメインオブジェクトのライフサイクル5(ファクトリ2)

# ファクトリ　その2

[ファクトリその１](https://qiita.com/YasuhiroKimesawa/items/f6fc33a46709cc0abe39)の続き

## 設計
### 1. 不変条件のどれかが満たされずに生成が失敗した場合どうなるかを決める

- 例外をThrow
- Nullを戻す

あまり、Nullは返したくないので、基本は例外を返すですね。

### 2. パラメータを慎重に選択する

特に、パラメータが新たな依存関係を作っていないかに注意。

安全なのは、構築するオブジェクトの構造の下位部分。

![クラス図3.png](https://qiita-image-store.s3.amazonaws.com/0/150455/92593d58-b5dd-e7de-1910-544e6e14cd1b.png)

こんなFactoryなら(注：図はValueオブジェクトなど便宜上端折ってます)Customerとか、Itemとか作成しようとしているオブジェクトの構成要素が候補ですかね。

もうひとつは既に集約内で依存関係が出来ている要素ですね。下のファクトリメソッドのような感じです。
(注：図はValueオブジェクトなど便宜上端折ってます)

![クラス図4.png](https://qiita-image-store.s3.amazonaws.com/0/150455/d51ca1dd-e571-701c-c30a-660b9e0aecef.png)


## 不変条件のロジックはファクトリが持つかオブジェクトが持つか?

オブジェクトを生成した後に不変条件のチェックが入る場合はオブジェクトが持つのがいいが、生成した後にもうチェックがない場合はファクトリが持つと生成したオブジェクトがシンプルになります。

## エンティティファクトリと値オブジェクトファクトリ

値オブジェクトファクトリは値オブジェクトが不変なので、完全にすべての要素を生成する必要があります。

エンティティファクトリは集約を生成するのに必要な本質的な属性だけを受け取ることが多い。その詳細は後から追加すればいいということです。

エンティティと言えば同一性。識別子はプログラムで生成することもユーザーが指定することもできますが、ユーザーが指定する場合はファクトリの引数で渡せばいいですね。

プログラムで生成する場合には、ファクトリの内部で制御するのがよいです。

明日に続く。意外とファクトリの話し深いわ・・・
Migration to Bootstrap v4

## はじめに
TrainStampRally https://train.ponkotuy.com/ をBootstrap v4にアップデートしたので、面倒くさかった点を中心に述べる。移行コストの概算をするのに役立つだろう。実際にMigrationするなら公式を見るべきである。 https://getbootstrap.com/docs/4.0/migration/

## v4の動向
現在のBootstrap v4はベータ版であるので、アップデートは時期尚早だと思われるかもしれない。しかしBootstrapのv3は長らくアップデートされておらず、バグ修正のPRが「v4では直っている」という理由でRejectされているという噂も聞く。

この点に関してはどう考えてもBootstrapのサポートは雑で、この機会に別のものに移行しても良いかもしれない。ただ、今後も付き合うという判断を下すのであれば早めの対応が必要となるだろう。

## Gridまわりのアップデート
Gridの仕様が大幅に変更された。基本的な設計思想が変更されている印象である。このためGridを積極的に活用・濫用したWebページは影響が大きいと思われる。

### offsetの廃止
個人的に最も影響が大きい非互換だと考えている。右詰めするために使われていたoffsetは親要素で右寄せを行うように `.justify-content-end` を付ければ良いが、左右位置を固定するためのoffsetは代替手段が少ない。デザインの変更を迫られたページも割とあった。

### `.form-horizontal`の廃止
非常に多用していたので作業量が多かった。各 `.form-group` 毎に `.row` を設定することで代替できる。柔軟になったのでメリットと言えなくはないが、offsetの廃止とかみあって作業量はとても多い。

### `.control-label`の廃止
不要になったと思われる。Gridを使ってる場合は `.col-form-label` を置く。

### `.dl-horizontal`の廃止
`.row`によって代替せよという話ではあるが、dlは雑に使うことが多いのであんまりうれしくはない。

### `.col-xs-*` -> `.col-*`
`.col-xs-*` 指定は事実上全ての場合でGrid分割することになるので、xsを外すという判断は分かるが、そんなことのために非互換突っ込んでくるな、というのが正直な気持ちとしてはある。

## glyphiconの廃止
マメに使っている人は壊滅的な変更かもしれない。似たようなものは別であるので、公式でサポートせずサードパーティー使えということである。

私はopen-ionicで置き換えたが、同じアイコンが無かったり名前が変わったりして地味に面倒くさかった。私がやった方法では、open-ionicのbootstrap互換版のcssを読み込んでclassを`.oi.oi-check`とかに変えれば良い。

純粋にアップデートしたいだけならもっと互換性の高いライブラリがあるかもしれないが、移行してしまった方が自由度は高まりそうである。

## Panelの廃止
Panelが廃止された。代替としてはCardがあるが、Cardは想定されている用途がPanelより幅広いので修正量は多くなる。

## Paginationの変更
子要素`li`と子要素`a`にclass指定が必要になった。真面目にカプセル化して展開できるようにしておかなかった場合は、数が多いだけに馬鹿みたいに手間が掛かる。

## Navbar/Tabの変更
子要素`li`と子要素`a`にclass指定が必要になった他にも、全体的にclass指定が変わっている。面倒くさいが数は少ないと思われる。

## ModalのCloseボタンの位置修正
ModalにCloseボタン(x)を付けている人は多いと思うが、今までサンプルでは最初にcloseボタンを置いていたが、headerの最後に書かないと適切な位置に来てくれないようになった。

## labelsの変更
badgeに統合された。分かれば簡単。

## 名前変更
- `.table-condensed` -> `table-sm`
ツイッターで見た「サンシャイン池崎ゲーム」をJavaで作ってみた。

こんなツイートがTLに流れてきて、なんか、ズンドコキヨシの時のアトモスフィアを感じたので、Javaで実装してみた。

>ムスメ5歳とゲームを考えた。
題して「サンシャイン池崎ゲーム」。
ルールはシンプル。歌を歌って「い」がついたら、「イェー！」に変えるだけ。
ムスメ5歳「おおきなのっぽの古どけイェー！、おじイェー！さんのとけイェー！！」
げらげら笑った。
https://twitter.com/ziuziu/status/918070729341587457

仕様としては
・入力された文字列に「イ」または「い」があったら「イェー」に置き換える。
・「イ」・「い」が連続する場合は、２回目以降を「ー」に置き換える。

その実装がこちら
仕事終わりの頭で、作ったせいか。なかなかの汚いコードですが・・・(~~これがお前の実力さ~~)

``` java
import java.util.Arrays;

public class Yeah {
    /**
     * 入力された文字列に「い」または「イ」が合ったら、「イェー」に置き換えてください。
     * ただし、連続する場合は2回目以降は「ー」に置き換えてください。
     */
    public String convert(String text) {
        boolean alwaysHit = false;
        String[] hit = {"い", "イ"};
        String[] strArray = toArray(text);
        for (int i = 0; i <= strArray.length - 1; i++) {
            if (Arrays.asList(hit).contains(strArray[i])){
                if (alwaysHit == false) {
                    strArray[i] = "イェー";
                    alwaysHit = true;
                } else {
                    strArray[i] = "ー";
                }
            }else{
                alwaysHit = false;
            }
        }
        return Arrays.toString(strArray).replace(" ", "").replace(",", "").replace("[", "").replace("]", "");
    }

    private String[] toArray(String str) {
        String[] returnStr = new String[str.length()];
        // 変数strの長さ分回す
        for (int i = 0; i <= str.length() - 1 ; i++) {
            // 配列に順番に格納する
            returnStr[i] = String.valueOf(str.charAt(i));
        }
        return returnStr;
    }
}
```


上記のコードを以下のテストコードを書いて、実行

``` java
import static org.junit.Assert.*;

import org.junit.Test;

public class YeahTest {

	@Test
	public void testConverter() {
		Yeah yeah = new Yeah();
		assertEquals("イェーーーーーーええええイェーーーーーー", yeah.convert("イイイイイイええええいいいいいい"));
		assertEquals("イェーえイェーーえええええイェーえイェーえイェーー", yeah.convert("イえイイえええええいえいえいい"));
		assertEquals("激唱イェーンフィニティ", yeah.convert("激唱インフィニティ"));
	}

}

```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/83578/0582e610-57a1-2063-e36c-37045bf26bd0.png)
やりたいことはやったので、これで・・・もう、寝ます。( ˘ω˘ )ｽﾔｧ
[Gradle] Createprocess error=206 への対処 [備忘録]

Gradle を使ってデバッグ実行する際に掲題のエラーがでて、その対処法について調べ方や対処の仕方がまずかったせいで一日ハマった。
で、今後同じ現象が発生したときに悩む時間や調べる時間が勿体無いので備忘録として残す。

もう本当の意味での備忘録で、なぜこうすることで対処できたのか、とかの検証やドキュメントの確認とかはしていない。


## 環境
* Windows7 64bit
* Java 8
* Gradle(バージョンは忘れた)

## 現象
前掲の通り。デバッグのためにビルド～デバッグ実行を Windows 環境で行ったところ、

```:例外メッセージ
... 前略 ...
java.io.IOException: CreateProcess error=206, ファイル名または拡張子が長すぎます。
... 後略 ...
```

が発生し、アプリが起動しない。
原因は例外メッセージのまんまで、Windows 環境で実行時に巻き込んでいるライブラリやらの階層が深すぎたりすると発生するらしい。

## 対処
次のコードを build.gradle に追加したらエラーは発生しなくなり、デバッグ実行が無事行えるようになった。

```:build.gradle
... 前略 ...
task pathingJar(type: Jar) {
    dependsOn configurations.runtime
    appendix = 'pathing'
 
    doFirst {
        manifest {
            attributes "Class-Path": configurations.runtime.files.collect {
                it.toURL().toString().replaceFirst(/file:\/+/, '/')
            }.join(' ')
        }
    }
}
 
bootRun {
    ... 前略 ...
    dependsOn pathingJar
    doFirst {
        classpath = files("$buildDir/classes/main", "$buildDir/resources/main", pathingJar.archivePath)
    }
    ... 後略 ...
}
... 後略 ...
```

### 参考
https://github.com/grails/grails-core/issues/9125
Visual Studio 2015 アクセスが拒否されました。

#新しいプロジェクトファイルをTFSに追加しようとしたら、「Visual Studio 2015 アクセスが拒否されました。」って言われたとき。

##見るポイント
1. Microsoft アカウントがきちんとログインされているか？
　Visual Studioの右上から確認できる。

2.ワークスペースがきちんとマッピングされているか？
ワークスペースのソース管理フォルダーとローカルフォルダーの設定がプロジェクト単位になっていなかったら、ダメ。
例）ソース管理フォルダー：$/　ローカルフォルダー：C:¥

#ちなみに・・・
私は、2つの目のやつでハマりました。笑
簡単だけど、記事が無かったので作成。
Oracle SQL Developer Tips

Oracle向けの無料のDBクライアント、[Oracle SQL Developer](http://www.oracle.com/technetwork/jp/developer-tools/sql-developer/overview/index.html)を仕事で使うようになって見つけたTipsの紹介です。
ほかの記事でも大体ヒットする情報も多いですが、同僚にまとめて伝えるためにも書いておきます。

# 環境情報

Oracle SQL Developer: 1.5.5 ビルドMAIN-5967
（スクリーンショットは1.5.5のものですが、後に[バージョンが古いよ！と突っ込まれ](https://twitter.com/thatjeffsmith/status/918481375660998657)、インストールし直した17.2.0.188でも確認しました）
OS: Windows 7

# 一つの接続に対して複数のテーブルを開く

デフォルトでは、接続一つに対して一つのテーブルしか開けない（複数開こうとすると同じウィンドウが切り替わる）ので不便だなぁと思っていたのですが、左上の方にある赤い画鋲マーク（画像の赤枠）をクリックして「ビューを固定」すれば複数開けるみたいです！

赤枠の画鋲の部分をクリックして、

![2017-10-oracle0.png](https://qiita-image-store.s3.amazonaws.com/0/12688/c781d6cd-d1bd-585d-96fc-d709d76d7603.png)

:point_down: のように変わったのを確認してから、

![2017-10-oracle1.png](https://qiita-image-store.s3.amazonaws.com/0/12688/5c970425-2840-2cef-6d16-ee13b123cca8.png)

ほかのテーブルをクリックすると、

![2017-10-oracle2.png](https://qiita-image-store.s3.amazonaws.com/0/12688/c9e1ba5e-8036-8e03-3f5b-86202e46c59f.png)

別窓で開かれました！

いちいち画鋲マークを押すのも面倒だ、という方は、
「プリファレンス」 => 「データベース」 => 「ObjectViewerパラメータ」で「オブジェクト・ビューア・ウィンドウの自動固定」
（ver. 17.2.0.188の場合は「プリファレンス」 => 「データベース」 => 「オブジェクト・ビューア」で「オブジェクト・ビューア・ウィンドウの自動固定」）
にチェックボックスをONにすれば自動で画鋲マークを押した状態になります！ :raised_hands:

# DATE型の値の時分秒も表示する

ほかにも多くの記事で紹介されているようですが一応ここでも。
SQL Developerは、デフォルトでは`DATE`型の値を表示する際、日付の部分しか表示してくれません。
これを変える場合、次のように設定を変えてください。
該当する設定画面を

「プリファレンス」 => 「データベース」 => 「NLSパラメータ」
（ver. 17.2.0.188の場合は「プリファレンス」 => 「データベース」 => 「NLS」）

の順で開いて、

「日付書式」の欄において「RR-MM-DD」と書かれているのを「RR-MM-DD HH24:MI:SS」などの、時刻を含んだ書式に書き換えましょう。

また、私の場合、使用する環境の都合で、設定が使用するたびに初期化される、という状態になることがあります。
そのような場合、設定画面をいちいち開くのも面倒なので、次の`ALTER`文をコピペした方が楽でしょう。

```sql
ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-DD-MM HH24:MI:SS'
```

# 環境毎に異なる設定で起動する

ターミナルエミュレーターの背景色を本番環境や検証環境、開発環境で切り替える、ということはよくやると思います。
どちらの環境にログインしているかはっきりとさせることで、作業時のミスを防ぐため、ですね。
SQL Developerについても、「プリファレンス」 => 「環境」 => 「テーマ」から見た目のテーマを変更することができるので、環境ごとに設定を切り替えることができれば、同様の効果が見込めそうです。
（ver. 17.2.0.188の場合は「テーマ」は設定できず、「プリファレンス」 => 「環境」から「ルック・アンド・フィール」のみが設定できました。
他にも、「プリファレンス」 => 「コード・エディタ」 => 「PL/SQL構文の色指定」から「スキーム」を変えてみるのもよいでしょう）

調べてみたところ、Oracle SQL Developerの設定は、`%APPDATA%\SQL Developer\system1.5.5.59.67\`以下のディレクトリーに保存されるようです。
テーマの情報だけでなく、接続先の設定もこのディレクトリーに入っているので、「本番環境向けのテーマと接続先設定」と、「検証環境向けのテーマと接続先設定」を同時に切り替えることができそうです。

で、いずれも`%APPDATA%`の中にあるので`%APPDATA%`環境変数を差し替えれば切り替えられるかな、と思いきや、そうはいきませんでした。
試してみたところ、`%USERPROFILE%`環境変数を差し替えることで、切り替えることができました。

なので、例えば次のようなバッチファイルによってSQL Developerをラップすれば、目的を達成することができます。
下記のバッチファイルのパスは、お好みやお使いの環境に合わせて、適宜書き換えてください。

```bat
@echo off

set USERPROFILE=C:\SQL-Developer-Production

C:\app\administrator\product\11.2.0\client_1\sqldeveloper\sqldeveloper\bin\sqldeveloperW.exe
```


画像のように、同じバージョンのSQL Developerを違うテーマで複数起動することができました！ :satisfied:
![2017-10-sql-developers.png](https://qiita-image-store.s3.amazonaws.com/0/12688/7b1d5bcc-92a2-1646-0036-10aa28ababcb.png)
【CSS】HTMLページの文字選択時の背景色・文字色（反転色）を変更する方法

HTMLページの文字選択時の背景色・文字色（反転色）を変更する方法についてです。

＜設定前＞（ブラウザの標準設定）
<a href="http://blog-imgs-36.fc2.com/t/e/a/teapipin/20130309222811fea.png" target="_blank"><img src="http://blog-imgs-36.fc2.com/t/e/a/teapipin/20130309222811fea.png" alt="設定前" border="0" width="600" height="120"></a> 
↓ 
＜設定後＞
<a href="http://blog-imgs-36.fc2.com/t/e/a/teapipin/20130309222812a33.png" target="_blank"><img src="http://blog-imgs-36.fc2.com/t/e/a/teapipin/20130309222812a33.png" alt="設定後" border="0" width="600" height="120"></a>
　
次のように<strong>CSSを</strong>記述します。 

```js
<style type="text/css">
<!--
::selection {
    background: #fad7d7; /*背景色*/
    color: #ffffff; /*文字色*/
}
::-moz-selection {
    background: #fad7d7; /*背景色*/
    color: #ffffff; /*文字色*/
}
-->
</style>
```


-moz-selectionはFirefox用です。 文字色は設定しなければ元のままの色ととなります。 （上の画像は文字色は未設定です）


　
<a href="http://teapipin.blog10.fc2.com/">ブログ（creativi.tea）</a>では他にもいろいろと掲載していますので、ご覧くださいね。
tensorflow-gpu ver1.3.0のインストール


主にCuDNNのインストールについての備忘録

## 環境
Ubuntu 16.04
Python 3.6.2 :: Anaconda, Inc.

## Cuda 8.0 のインストール
割愛

## tensorflowのインストール
```
pip install tensorflow tensorflow-gpu
```

ここでシェル上でtensorflowのインポートを試みたところ、以下のエラー。

```
ImportError: libcudnn.so.6: cannot open shared object file:
  No such file or directory
```

公式FAQ https://www.tensorflow.org/install/install_linux より、CudNNのバージョン違いが原因と判明

## CuDNNのインストール
バージョン6.0.0が必要
https://developer.nvidia.com/rdp/cudnn-download からダウンロード

```
sudo dpkg -i libcudnn6_6.0*+cuda8.0_amd64.deb
sudo dpkg -i libcudnn6-dev_6.0*+cuda8.0_amd64.deb
sudo dpkg -i libcudnn6-doc_6.0*+cuda8.0_amd64.deb
```

ここで、一行目の実行で以下のエラー

```
/sbin/ldconfig.real: /usr/lib/nvidia-375/libEGL.so.1 is not a symbolic link

/sbin/ldconfig.real: /usr/lib32/nvidia-375/libEGL.so.1 is not a symbolic link
```

/usr/lib(32)/nvidia-375/libEGL.so.1がシンボリックリンクでないといけない(?)ようなので、貼り直してldconfigを実行

```
sudo mv /usr/lib/nvidia-375/libEGL.so.1 /usr/lib/nvidia-375/libEGL.so.1.org
sudo mv /usr/lib32/nvidia-375/libEGL.so.1 /usr/lib32/nvidia-375/libEGL.so.1.org
sudo unlink /usr/lib/nvidia-375/libEGL.so
sudo ln -s /usr/lib/nvidia-375/libEGL.so.375.66 /usr/lib/nvidia-375/libEGL.so
sudo unlink /usr/lib32/nvidia-375/libEGL.so
sudo ln -s /usr/lib32/nvidia-375/libEGL.so.375.66 /usr/lib32/nvidia-375/libEGL.so
sudo ldconfig
```

これで無事動きました。
wgetでパスワード付きのページをダウンロードしてくる

#wget
ログイン付きのページのソースコードや画像を一括でダウンロードする必要があり、模索した結果。
同様な問題をか開けた人がQiita上にもいろいろなところにもいたが、全く同じ方法が見つからなかったためストックではなくメモを作成した。

【Agenda】
1. ログイン状態をクッキーに保存
2. 必要なページのソースをwgetで一括ダウンロード



【Procedure】
### クッキー保存

`wget --keep-session-cookies --save-cookies=cookies.txt --post-data 'login_email=email-address2emailaddress.co.jp&login_passwd=passwordpassword' https://ten-ki.jp/login?1507809062
`
ここで必要なのは<input>であればそれのname=""の部分
この場合は `login_email` と `login_passwd` を示す。
またそれぞれのイコール先に実際にインプットする値を。

これをコンソールで実行すると、`cookies.txt`としたログイン状態を表すファイルが実行ディレクトリに保管される。





### 続いて、ダウンロード

`wget -p -H -E -nH -k --load-cookies cookies.txt http://blahblahblahhhhh.jp/`

wgetとその他諸々の呪文で指定のページ（今回はhttp://blahblahblahhhhh.jp/) をダウンロード
使用したコマンドオプションは


|   オプション       |    説明（英語）      |    説明（意訳）       |
|:-----------------|:------------------|:-------------------|
|-p (--page-requisites)|This option causes Wget to download all the files that are necessary to properly display a given HTML page. This includes such things as inlined images, sounds, and referenced stylesheets.    |このページを表示する際に必要となる画像、音声ファイル、スタイルシートなどを同時にダウンロードする|
|-H (--span-hosts)       |Enable spanning across hosts when doing recursive retrieving.|再帰的検索を行う時別のホストからのデータもダウンロードする|
|-E (--adjust-extension) |If a file of type application/xhtml+xml or text/html is downloaded and the URL does not end with the regexp. [Hh][Tt][Mm][Ll]?, this option will cause the suffix .html to be appended to the local filename.|拡張子をそのままにしてダウンロードする|
|-nH (--no-host-directories)|Disable generation of host-prefixed directories. By default, invoking Wget with -r http://fly.srk.fer.hr/ will create a structure of directories beginning with fly.srk.fer.hr/. | ホスト名のディレクトリを新たに作成しない|
|-k (--convert-links) |After the download is complete, convert the links in the document to make them suitable for local viewing. |ファイル内のリンクをローカルに適した形に書き換える|
|--load-cookies *file*    |Load cookies from file before the first HTTP retrieval.  file is a textual file in the format originally used by Netscape's cookies.txt file.| 再帰的検索の前に指定したファイル名のテキストファイルからクッキーをロードする|

必要であれば再帰的ダウンロードの`-r`も使用可能


以上です！
Chainer(Cupy)をVisual Studio Express 2015 で使う方法

## 概要

この記事はVisualStudioのCommunityを使用できる個人の方や、
Professionalを購入できる方には関係ありません。
仕方がなく、Expressを使用し続けている方に向けた記事です。

CommunityやProfessionalでは、他の方が記事を書いているように、
簡単にChainer(Cupy)の環境を構築を構築できます。

しかし、ExpressではCUDAの仕様により、容易に環境を構築できません。

本記事では、Expressでの環境構築について説明します。

## 環境構築

CUDAのバージョンは8.0とします。CUDAとcuDNNをインストールします。
インストール方法に関しては他の記事を参照してください。

Expressの場合、様々なパスが設定されていません。
そのため、色々と設定する必要があります。

### 設定

環境はWindows10の64bitを想定しています。

PATH に ```C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\x86_amd64``` を追加します。

basetsd.hをVisualStudioから見つけられるようにするために、

INCLUDE に　``` C:\Program Files (x86)\Windows Kits\10\Include\10.0.14393.0\shared ``` を追加します。

kernel32.libを見つけられるようにするために、

LIBPATH に ``` C:\Program Files (x86)\Windows Kits\10\Lib\10.0.14393.0\um\x64 ``` を追加します。

``` C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\x86_amd64\vcvarsx86_amd64.bat ``` をリネームして

``` C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\amd64\vcvars64.bat ``` に配置します。

後は pip install chainer で cupy もインストールできます。

以上です。

## まとめ

素直にCommunityやProfessionalを使用しましょう。
TLSの通信手順ざっくり理解

# 通信手順

![TLS通信手順 (2).png](https://qiita-image-store.s3.amazonaws.com/0/137903/997decf2-207b-3751-9438-c7c3854dd18e.png)

# 解説

1, サイト主体者は、 [公開鍵証明書認証局](https://ja.wikipedia.org/wiki/%E8%AA%8D%E8%A8%BC%E5%B1%80)から事前に証明書を発行しておく。

2, 外部に公開されているサービスなら、証明書は誰でも取得できる。

3, 証明書に記載されている主体者と認証局が同一である証明書が出てきたらOK

4, クライアントが乱数を使って通信用の共通鍵を作成する

5, 4,で作った共通鍵を、証明書に含まれていた公開鍵で暗号化する

6, 暗号化された共通鍵を取得する

7, サーバーは自身が送信した公開鍵に対応した秘密鍵を持っているため、その鍵でデータを複合する
Androidアプリ開発をする上での勉強法

Androidアプリ開発をする上での勉強方法を挙げてみます。

#（１）前提
本は購入するのがよいと思います。
図書館で借りる方法もありますが必ず希望のものを借りることができるとはかぎりません。
借りた本には書き込みもできません。
必ず返却しないといけないので調べたいと思ったときに手元にないのは歯がゆいです。。。

本というのはたった数百円～数千円でいろいろな知識が体系的に手に入る貴重なものです。
ネットでの情報集めはリアルタイム性があっていいですが、情報が断片的になってしまいます。
初学者が一つのことを体系的に学ぶには向いていません。ある程度勉強が進んだら辞書的に使うのがよいでしょう。

それに比べ本はその中で体系的ですので勉強には最適です。


#（２）プログラムの勉強方法
もし学校やサークルやらでプログラムを教えてくれる人がいるなら、コンピュータの基礎から学ぶべきでしょう。
情報理論（ブール代数、集合論など）、バイブル的プログラム言語（アセンブラ、C言語など）などから。

でもこれはあくまで教えてくれる人がいるからできるものです。
独学でやる場合はこの方法ではかなりきついです。
だって基礎は難しいし、つまらないから。
Androidアプリ開発にどうつながるか先も見えませんし。。。

我らはAndroidアプリを作るために仕方なくPCやJavaを道具として使うだけです。
たかが道具です！！
紙を切るときにハサミの原理や材質を勉強してから使う人はいませんよね。
それと同じでiPhoneアプリ開発も独学でやるのなら難しい基礎は後回しにし、まずは手を動かし楽しめる順に学びましょう。


# （３）おすすめの参考書
以上を踏まえると、次のような順に進めるのがいいと思います。
> 1.難しいことは知らなくてもAndroidアプリが作れる本
> 　　↓
> 2.ある程度分かってきたらJavaやSDKに関する本
> 　　↓
> 3.ゲーム、特定のAPIなど専門に特化した本

難しいことは後回しにしてまずは手を動かして行きましょう。
先にあげたプログラムの基礎に当たるのは2.の箇所になります。
基礎の勉強は手を動かして感覚的に分かるようになってからが楽です。

そして必ずしも前の段階のことを完全に理解してから次の段階に進む必要はないですね。
分からないことが出てきたらそれは後回しにして次に進みましょう。
後になればいずれ分かる日が来ますよ。プログラムの勉強はそういうものです。
それまでの辛抱です！
パッケージのインストール

１．Visual Studioから
[ツール] → [ライブラリ パッケージ マネージャー] → [パッケージ マネージャー コンソール]

２．ネットで見つけた使用したいパッケージを設定する
PM> Install-Package 〇〇 -Version X.X.X

※csproj形式だとパッケージをインストールできない。
　sln形式で保存、起動後、上記パッケージインストール手順を実施する。