OmniAICreator/Qiita-1.07M huggingface dataset:
Rubocopについて


##目次
- Rubocopとは
- 使い方
- エラーメッセージの読み方
- 便利な設定
- 代表的なエラーへの対処法
- Rubocopに学んだrails way


## Rubocopとは
Rubyのコーディング規約に準拠してるかをチェックするgem


## 使い方
1.  gemなので、 `$ gem i rubocop` とやるか、Gemfileに書いて `$bundle install`
2.  インストールしたら、 `$ rubocop` で実行（ディレクトリ以下全て読み込む）
3.  エラーを指摘されるので、1つずつ対処


##エラーメッセージの読み方
以下の例について説明

```
aaa@localhost:(abc*) $ rubocop [/Users/aaa/rails_workspace/board_plus]
Inspecting 62 files
.CC..CCCCCC.CCCCC....C.C..CCC.CC.C...C.CC..CCCCCCCCCCCCCC....C

Offenses:

Gemfile:4:69: C: Prefer single-quoted strings when you don't need string interpolation or special symbols.
repo_name = "#{repo_name}/#{repo_name}" unless repo_name.include?("/")
                                                                  ^^^
Gemfile:8:1: C: Extra blank line detected.
Gemfile:41:1: C: Extra blank line detected.
```

###説明
1, 2行目は、62個のファイルを読んで、そのうち何番目でどんなエラーが出たかを示している。
上の例だと'.'はエラーなし(clean)、'C'はconfigurarion(規約)違反。他には'W'(warning)や'E'(error)、'F'(fatal)がある。
Offences以降は、具体的なエラーの指摘。


##便利な設定（一部）
####1.  自動でやってもらう
いくつかのエラー、例えば

```
Prefer single-quoted strings when you don't need string interpolation or special symbols.
```
は自動で直してもらえる。この場合は""を''に直せば良いが、めんどくさいので、

```
$ rubocop
する時に
$ rubocop -a
あるいは
$ rubocop --auto-correct
```

とすれば、直してもらえる。これだけでエラーは半分以下になることも。

####2.  .rubocop.yml
例えば以下の(1)(2)のようなことをしたければ、アプリのディレクトリ直下に.rubocop.ymlを作ってそこに設定を記述する。具体的な設定は以下を参照。
http://wonderwall.hatenablog.com/entry/2015/08/17/213718

(1)自動生成されたコードは無視
rails new しただけでもかなりエラー（上のsingle quotationのエラーや、Line is too long.）を拾ってくる。
けれど、これらは自動生成されたものだし、rubocopにチェックしてもらう必要はないというときもある。

(2) 特定のエラーを無視
自動生成したコードでなくても、rubocopの基準だと引っかかるけどこれくらいは許容したいというエラーもある。Line is too long.は無視したいとか。


##代表的なエラーへの対処法
##### 1.  Line is too long.
1行80文字以上だとはじかれるので、設定を変える（例えば120字以上をはじくようにする）か、なんとかして短くする。
#####2.  Prefer single-quoted strings when you don't need string interpolation or special symbols.
" "を''にかえる。string interpolationは、" "の中に変数などを入れてそこにデータを入れること。special symbolsは、" "の中であれば例えば"こんにちは\n私の名前は~"と書けば \n のところで改行してくれる。けど、' 'だとそのまま バックスラッシュ+n が出力される

##### 3.  Missing top-level class documentation comment.
一行目にいきなり  class ~~  と書き始めると怒られる。その前にどういうクラスなのかcommentしろということ。これに関してはdisableするのも手。
##### 4.  Space inside square brackets detected.  あるいは  Space inside { missing.
[ ]の中は、文字列の前後にスペース不要。{ }の中は、文字列の前後にスペース入れる。つまり[:id]とか{ maximum: 50 }が推奨。
##### 5.  Method has too many lines.
5行以内で書くことが推奨されていて、10行を超えると警告が出る。if文を三項演算子使って簡略化するなど。
##### 6.  Extra blank line detected.
空行が2行続いてたりするので、消す。
##### 7.  Inconsistent indentation detected.
インデントがおかしいので、見直す。例えば、コントローラーのprivate以降のメソッドがインデントされてるとか（インデント必要ない）。


## Rubocopに学んだrails-way
### 1.  可読性を上げる
コードが長いと読みにくいしミスを見逃しやすくなるので、行数は少ない方が良い。
他には、無駄な行は消す、メソッドをなるべく簡略化、インデントを揃える、などすべき。
### 2.  コーディング規約に従う
*Convention over Configuration* と言われるように、規約に従う。そうすれば可読性も上がるしバグも減る。
VirtualBox, Vagrant, CentOS, phpMyAdminの環境構築

# 目的
Vagrant環境にphpMyAdminをインストールしたい．
（記事執筆時点では，既にVirtualBox, Vagrant, CentOS6.5の環境は出来ていた）

VirtualBox, Vagrant, CentOSの環境構築は下記を参照
http://qiita.com/washio12/items/1e263fe6ee7fd7d89af6

上記の記事でphpMyAdminをzipでダウンロードする手順があるので
こちらでもインストールは可能．

ただ全部コンソールで環境構築を行いたかったのでメモ

# phpMyAdminのインストールするまで
```
// apacheのインストール
$ sudo yum -y install httpd
// phpのインストール
$ sudo yum -y install php

// apacheの起動
$ sudo service httpd start

// 仮想マシン起動時にapacheを起動する設定
$ sudo chkconfig httpd on
// iptablesをstop & offにする (本番環境ではやらないこと）
$ sudo service iptables stop
$ sudo chkconfig iptables off

// phpMyAdminのインストール
$ sudo yum -y install phpMyAdmin
```

## phpMyAdmin.confの編集
ここまでで192.168.33.10のアドレスへ
ブラウザなどを使ってアクセス可能になっていることが前提の手順です．

対応するapacheのバージョンの `Allow from`のIPアドレスを書き換える

```
// phpMyAdmin.confの編集
$ sudo vim /etc/httpd/conf.d/phpMyAdmin.conf
```

デフォルトだと
`Allow from 127.0.0.1`

変更後
`Allow from 192.168.33`

詳細はスクリーンショットを参照

<img width="345" alt="スクリーンショット 2017-01-31 16.39.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/32950/86fec87e-54fc-099e-eb4d-89b003e6ca07.png">

confを保存して
`$ sudo service httpd restart`

http://192.168.33.10/phpmyadmin 
アクセスしてログインできればOK
色でハマったanimate()関数の使い方

## はじめに

イベントに従ってボタンの色を変える、
という単純な実装でハマったので、ここに残します。

animate()の簡単な使い方とともに。

## animate()とは

DOM上のどんな要素にもstyle属性が指定されています。
animate()関数は、そのstyleをどのように変更したいかを指定することで、
__初期値から指定地まで、styleを徐々に変化させる__ことのできる関数です。

## 何にハマったのか

[リファレンス][jQuery日本語リファレンス]をよく読めば書いてあったのですが、
animate()は数値型の値をとらない属性（background-colorなど）に対応していませんでした。
ドキュメントはよく読もう（反省）。

## どうすればいいのか

animate()でcolor関連のstyleを変更できるようになる、
jQueryのプラグインがありました。　→　_[jQuery Color]_
(各バージョンのminifiedからCDNが入手できます)

## 使い方

#### jQuery(CDN)
```HTML:jQuery
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
```

#### jQuery Color(CDN)

```HTML:jQueryColor
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-color/2.1.2/jquery.color.js"></script>
```

#### animate()

```js:animate()
animate(params, [duration], [easing], [callback])
```
| 引数 | 効果 | 
|:-----------|:------------|
| params   | 変化後のstyleを指定 |
| duration | アニメーションの動作期間を指定<br>”slow”、”normal”、”fast”、<br>もしくは完了までの時間をミリ秒単位で指定 |
| easing   | 値の変化量を調節する関数を指定<br>「徐々に速くなる」「最後にゆっくりになる」「上下しつつ進む」など |
| callback | アニメーション終了時に実行する関数のポインタを指定 |


#### animate()例

```js:animate()でid=hogeの要素の背景色と文字色を1.5秒で変化させる
$("#hoge").animate(
  {
    'color': '#FFFFFF',
    'backgroundColor': '#e10000'
  }, 150
);
```

「background-color」ではなく、
「backgroundCocor」とキャメルケースで表記しましょう。

paramsとdurationだけ指定した簡単な使い方ですが、
これだけでページに動きが作れます。
その他たくさんの使い方がありますので色々試すと面白いです。


## 参考
- [JQuery.animate()のbackgroundColorにハマった]
- [Color animation - 色や背景色をアニメーションさせられるjQueryプラグイン]
- [jQuery日本語リファレンス]

[JQuery.animate()のbackgroundColorにハマった]:http://tomotomosnippet.blogspot.jp/2009/12/jqueryanimatebackgroundcolor.html
[jQuery日本語リファレンス]:http://semooh.jp/jquery/api/effects/animate/params%2C+%5Bduration%5D%2C+%5Beasing%5D%2C+%5Bcallback%5D/
[Color animation - 色や背景色をアニメーションさせられるjQueryプラグイン]:http://blog.creamu.com/mt/2012/03/color_animation_-_jquery.html
[jQuery Color]:https://code.jquery.com/color/
Mavenを使ってリソースファイルをJARの外部に配置する方法

解決する問題はタイトル通りです。通常のJavaプログラムではリソースファイルはsrc/main/resources 以下に置かれ、ビルド時にこれらのリソースファイルがJARに組み込まれます。
しかし、これらのリソースファイルをJARの内部ではなく、外部フォルダに置きたいケースがあります。例えば、プロパティファイルをJARの外部に置くことで、DB接続情報のような環境依存の設定が変更された場合でも、ビルド無しにプログラムの動作を変えることができます。本記事では、Mavenを使用して、そのようなビルドを実現する方法を説明します。

# 外部リソースフォルダを指定する
maven-jar-pluginを使用して、src/main/resourcesに替わり、外部フォルダをclasspathに通すことでリソースを外部に置くことができます。以下ではJARファイルと同パスにあるsettingsフォルダを相対パス指定で設定するサンプルです。

前提条件として、JARファイルのインストール先フォルダ構成は次のようであるとします。

```:インストール先フォルダ構成
install_dir
 L MY_JAR_FILE.jar
 L settings
 　 L my_resource.properties
```

pom.xmlに次のように記述します。

```xml:pom.xml
<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-jar-plugin</artifactId>
      <configuration>
        <archive>
          <manifest>
            <mainClass>com.gmail.greencoffeemaker.MainApp</mainClass>
            <addClasspath>true</addClasspath>
          </manifest>
          <manifestEntries>
            <!-- フォルダ指定の場合、パスの最後に / をつけるのを忘れないこと -->
            <Class-Path>./settings/</Class-Path>
          </manifestEntries>
        </archive>
      </configuration>
    </plugin>
  </plugin>
</build>
```

JavaプログラムからはResoruceBundleクラスを使用して、特にパスを意識することなくリソースを扱うことができます。

```Java:リソース取得サンプル
ResourceBundle res = ResourceBundle.getBundle("my_resource");
String val = res.getString("mykey");
```

# デバッグを簡単にする
上記の方法でリソースフォルダを外部に指定すると、Eclipseでデバッグ実行する際に実行構成で外部フォルダを設定しなくてはならず、面倒になります。
これを回避するため、リソースファイルはJavaの作法に則り、src/main/resources 以下に配置し、ビルド時にリソースファイルをtarget 以下に出力するようにビルド構成を変更します。このようにすることで、デバッグ実行時の煩わしさがなくなります。（デプロイはtarget以下のリソースファイルを使ってください）

リソースファイルの出力は、maven-antrun-pluginを使用して、antコマンドを実行することで行います。実行するコマンドは「出力先のディレクトリ作成」と「リソースファイルのコピー」の２つです。

前提条件として、プロジェクト構成は次のようであるとします。

```:プロジェクト構成
my-project
　L src/main/java
　L src/main/resource
　   L my_resource.properties
　L target
```

pom.xmlに次のように記述します。

```xml:pom.xml
<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-jar-plugin</artifactId>
      <!-- 中略 -->
    </plugin>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-antrun-plugin</artifactId>
      <executions>
        <execution>
          <phase>package</phase>
          <configuration>
            <target>
              <!-- コピー: /src/main/resources => /target/settings -->
              <mkdir dir="${project.build.directory}/settings" />
              <copy todir="${project.build.directory}/settings">
                <fileset dir="${project.basedir}/src/main/resources" />
              </copy>
            </target>
          </configuration>
          <goals>
            <goal>run</goal>
          </goals>
        </execution>
      </executions>
    </plugin>
  </plugin>
</build>
```

Mavenでビルドを行うと、target 以下にJARファイルが作成されると同時にsettingsフォルダが作られて、リソースファイルがコピーされます。

```shell-session:ビルドコマンド
$> mvn clean package
```

```:プロジェクト構成（ビルド後）
my-project
　L src/main/java
　L src/main/resource
　   L my_resource.properties
　L target
　   L MY_JAR_FILE.jar
　   L settings
        L my_resource.properties
```

以上です。
Unity - 入力されたキーの情報を取得する

# はじめに
キー入力において、入力したキーの情報を取得するシステムがなかったので書きました。
今回は押されたキーのKeyCodeを取得していきます。

必要な知識
- foreach
- enum
以上二つです。知らない方は軽く調べてから読んでいただけると理解が深まるかと思います。
※知らなくてもいけます。
# 方針
1. まずキーが押されているかどうかを確認します。
2. 特定のキーであれば押されているかチェックできるのでそれを全キーについて行います。
3. 押されたキーに応じて処理を行います。  
以上の3ステップで行います。重要なのは2.ですね。


# 解説
先に全体のコードを記載します

```
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

//enumを使うために必要
using System;

public class DownKeyChecker : MonoBehaviour {

	void Update () {
		DownKeyCheck ();
	}


	void DownKeyCheck(){
		if (Input.anyKeyDown) {
			foreach (KeyCode code in Enum.GetValues(typeof(KeyCode))) {
				if (Input.GetKeyDown (code)) {
                  //処理を書く
					Debug.Log (code);
					break;
				}
			}
		}
	}

} 
```

以上が全体です。細かく見ていきます。
<br>

```
using System; 
``` 
これはenum型を使うのに必要なのでおまじないして書いておきましょう。 
<br>

```
if (Input.anyKeyDown)
```

ここで何かキーが押されているかの判定をします。ここを書かないと毎フレームごとに全てのキーをチェックしてしまうので処理が重くなります。書いておきましょう。
<br>

```
foreach (KeyCode code in Enum.GetValues(typeof(KeyCode)))
```

ここが命ですね。
foreach文はある配列やリストに格納されている要素一つ一つに一回ずつアクセスすることのできる分です。
今回の場合は__codeという変数にKeyCodeを一つずつ取り出して代入__してきます。

<br>

```
if (Input.GetKeyDown (code))
```

ここで押したキーがcodeと同じであるかをチェックしています。
全てのKeyCodeに一回ずつアクセスしてくれますから、必ずどれかには引っかかってくれるわけですね。

<br>

```
Debug.Log (code);
```

今回は押されたときの処理として簡潔かつわかりやすいようにDebug.Log()を選択しました。

<br>

``` 
break;　
```

一度処理に入ればこれ以降処理に入ることは無いのでここでbreakし、foreach文を抜けます。


# 終わりに
最後まで読んでいただきありがとうございます。
ここで書いたコードがいずれどこかのコードで活躍してくれれば幸いです。
間違いや修正箇所等あればコメントまでお願いします。
How to add number to Number Set in DynamoDB



[AWS\.DynamoDB\.DocumentClient](http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB/DocumentClient.html) does not provide a way to add number to Number Set.
Need to use lower api [Class: AWS\.DynamoDB — AWS SDK for JavaScript](https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB.html).

I've tried few times and figured out the sytax of `ADD` operaion <strike> which is not desctibed in [UpdateItem reference](http://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateItem.html). Just put `ADD`, column name and value</strike>. 

See [Modifying Items and Attributes with Update Expressions \- Amazon DynamoDB](http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.Modifying.html) for `ADD` syntax.

Following code appends given numbers without making dupes.

```
dynamodb.updateItem({
  "TableName" : "mytable",
  "Key" : {
    "Id": {"S": uuid},
  },
  "UpdateExpression" : "ADD setname :valuesToAdd",
  "ExpressionAttributeValues" : {
    ": valuesToAdd" : { "NS": ["440"] }
  },
  ReturnValues:"UPDATED_NEW"
});
```


# Refs

- [node\.js \- How to update an item in Dynamodb of type String Set \(SS\)? \- Stack Overflow](http://stackoverflow.com/questions/37194794/how-to-update-an-item-in-dynamodb-of-type-string-set-ss)
- [UpdateItem \- Amazon DynamoDB](http://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateItem.html)
GPUなしではじめるディープラーニング

ディープラーニングは，GPU付きのPCがないと学習に数週間以上かかったりして，気軽に試しづらかったりします．また，学習データ数も数万以上必要になることが多いことも更にハードルを挙げる要因となっています．
そこで今回はGPUなしのPCかつ少ないデータ数で学習させる方法について紹介します．

## 対象読者
- GPU付きのPCは持ってないし，AWSとかでGPU付きのインスタンスとか借りるのも嫌だけど，CNNとかで遊んでみたいという方．
- 既製のネットワークではなくて別の目的に特化したネットワークを作りたい方．(例: 顔認識とか流行りそうな絵か判断等)

## ディープラーニングの問題点
- GPUなしのPCだと，MNISTやCIFAR10ぐらいしか学習時間的に解ける問題がない．
- 簡単な画像分類問題でも5万枚〜の学習データが必要．
- ネット上に上がっている既存の学習済みネットワークが実際に分類したい項目と異なって使えない．(例: 顔や車種，病気を判別したいのに，どうでも良い分類項目に対して最適化されている)

こういった問題を解決するための手法として転移学習[^1]と呼ばれる手法があります．
転移学習はImageNetなど別の問題で学習済みのネットワークの一部のみを学習させる手法です．
様々な手法が考案されていますが，実用上大事なことは，別の画像分類問題に流用しても上手くいくことが多いということです．[^2]
(例: 草や鳥の分類，顔認識，感情判断など)

## 転移学習の利点
また以下の利点があるため，気軽に試したいときの有効な手段となっています．

- データ量が少なくて済む(少ない学習データで学習器を作ることができる)
- ある程度大きな画像まで取り扱える．(224x224x3の画像データを処理するCNNとか作ろうとすると学習に数週間以上かかります．)
- GPUがなくても現実的に計算可能な時間で処理できる.

手法は様々ですが，私は最近だと下記手法を使っています．

1. 分類したい画像を集める．(頑張って集めてください)
2. 間違っている画像を除外する．
3. 全結合層を除いた学習済みのネットワークを用いて画像を低次元の空間に落とし込む．
4. 低次元の空間と正解との関係をSVM[^3]や勾配ブースティング[^4]を利用して求める．

注). Google画像検索とかで収集すると3割ぐらい間違っているので，注意が必要です．

このように低次元の空間に落とし込むところだけディープラーニングを使うようにすることで，
時間の掛かるネットワークの学習を行わずに，別の高速な学習手法で解くことができるので，GPUなしのPCでも解けるようになります．

## 数値実験
某アニメのキャラを分類する問題を下記3パターンで解いてみました．
A). チュートリアルで大体登場するシンプルなCNN，(32x32x3)
B). ResNet-50層(32x32x3, 最近の分類問題はだいたいこれが使われている気がします)
C). ResNet-50層(学習済みのネットワーク) + SVM
正答率は，それぞれA). 94.33%, B). 94.57%, C). 93.83%となり，
純粋にCNNで解く場合とほとんど変わらない結果となりました．
注). 学習データの作成時にいくらか間違えてそうなので，真面目な人がやればもう少し性能は上がるかと．

## リポジトリ
- https://github.com/namakemono/keras-anime-face-recognition

手法3,4を記述したコードがあります．参考になれば幸いです．

## まとめ
転移学習によってGPU付きのPCがなしでも，そこそこ良い性能が出せる転移学習と呼ばれる方法を紹介しました．
用途によりけりかと思いますが，この方法ならGPUなしのPCでも分類できますので，試してみてはいかがでしょうか？

## References
[^1]: CNNs in Practice, <http://cs231n.stanford.edu/slides/winter1516_lecture11.pdf>
[^2]: CNN Features off-the-shelf: an Astounding Baseline for Recognition, <https://arxiv.org/pdf/1403.6382v3.pdf>
[^3]: サポートベクターマシン, <http://www.sist.ac.jp/~kanakubo/research/neuro/supportvectormachine.html>
[^4]: 勾配ブースティング, <https://github.com/dmlc/xgboost>
Dialogの黒透過背景をなくす方法

ダイアログの背景をなくしたい時には下記でできました。

```java
if (dialog.getWindow() == null) {
    return;
}
WindowManager.LayoutParams lp = dialog.getWindow().getAttributes();
lp.dimAmount = 0.0f;
dialog.getWindow().setAttributes(lp);
```
WP-CLI で WordPress を日本語パッケージと同じ構成にする


すでにお気付きのかたも多いと思いますが、WP-CLI には、英語版の最新バージョンがリリースされた後、日本語版がリリースされるまでのタイムラグの間に、以下のコマンドに不具合があります。

* `wp core download` - WordPress のダウンロードが失敗する
* `wp core verfy-checksums` - `wp-config-sample.php` の内容が違うとエラーが出る。
* `wp core check-update` - すでに最新版なのに最新版をインストールしてくださいと、管理画面にしつこくでる。

[VCCW](https://vccw.cc/) もこの不具合の影響をうけており、数日前にプロビジョニングに失敗するという現象があったと思います。

現在この問題については、WP-CLI チームのほうで対処方法を検討しているのですが、修正が必要な範囲が WordPress.org の API、WordPress 本体、WP-CLI というかんじで広範囲なので、うーん困ったなという感じになっているのが実情です。

そこで、これらの問題をフィックスするための暫定的な対処方法について紹介します。

あくまでも暫定的な方法なので、本家版がリリースされたあとローカライズ版がリリースされるまでのタイムラグの間にどうしても WP-CLI で WordPress をインストールしないといけないマニアックな人のみ、この方法をお使いください。

対処方法の考え方を説明しますと、一度英語版をインストールして、そのあとで WP-CLI コマンドを使用して日本語パッケージと同等の内容にするという感じです。

## WP-CLI で WordPress を日本語パッケージと同等の構成に変換する

まず以下のコマンドでWordPress本体をインストールしてください。

```
$ wp core download
$ wp config create ... --skip-check
$ wp db create
$ wp core install
```

次に以下の4つのコマンドを順番に実行してください。
かならず最初に `wp core language install ja --activate` を実行するようにきをつけてください。


```
$ wp core language install ja --activate
$ wp plugin install wp-multibyte-patch --activate
$ wp option update timezone_string $(wp eval "echo _x( '0', 'default GMT offset or timezone string' );")
$ wp option update date_format $(wp eval "echo __( 'M jS Y' );")
```

コマンドの内容を簡単に説明しますと...

1. 日本語の言語ファイルをインストールして有効化
2. WP Multibyte Patch プラグインをインストールして有効化
3. タイムゾーンを”東京”に変更（日本語が有効化されている場合）
4. 日付のフォーマットを”2017年1月31日”というフォーマットに変更（日本語が有効化されている場合）


以上が完了したら WordPress の管理画面へ移動して、以下のスクリーンショットのようになっているかを確認してください。

![](https://www.evernote.com/l/ABXb0ZZzq6lFL4gDzyg_J-U-tYXMILkxRw0B/image.png)

この状態で本番環境で使用しても問題ないと考えていますが、もし何か問題があれば教えてください。

心配な場合は、日本語パッケージがリリースされた後で、以下のコマンドで日本語パッケージを入れ直すといいかもしれません。

```
$ wp core download --locale=ja --force
```

このコマンドを実行しても既存のプラグインやテーマが上書きされたりデータベースがリセットされることはありません。
CentOS 7でOpneVPNを動かすために必要な設定

#はじめに
　CentOS7固有の問題で（知識不足だっただけですが）OpenVPNを動作させる際に少しはまったので、その事を共有したいと思います。

#SELinuxの無効化
　OpenVPNを起動させる際は```# systemctl start openvpn.service```のような感じで、systemdで動作させると思うのですが、SELinuxが有効になっているとOpenVPNはrunningにならずにexited、つまり終了状態になってしまいます。CentOS7でOpenVPNを起動する際は、SELinuxを無効化してください。（SELinuxの設定を変える方法もあるかと思いますが、面倒なので無効化をしています。）

#ファイアウォールの設定
　ここが一番はまった点です。OpneVPNの設定をガイドしている殆どのサイトではiptablesのファイアウォール設定について触れていると思いますが、CentOS7が使用しているファイアウォールは、firewalldです・・・・firewalldです。firewalldではOpenVPNが定義（UDP/1194として）されています。ですのでこちらでOpenVPNを許可する設定をしてください。
BottomSheetDialogがスクロールして消えるのを防ぐ方法

BottomSheetDialogを下にスクロールするとBottomSheetがいなくなってしまって再表示できないという現象が起こってしまいます。

次のコードで解決できました。

```
bottomSheetDialog.setContentView(view);
BottomSheetBehavior behavior = BottomSheetBehavior.from((View) view.getParent());
behavior.setHideable(false);
```
Office2013で"プロキシ サーバー store.office.com に接続しています"を出なくしたい


Office2013使っていて、毎回"プロキシ サーバー store.office.com に接続しています"なるメッセージがでて、
ストレスを感じる人も多いはず。私もその一人。

ネットワーク上に自動アクセスしなくするための設定を行うと、表示されなくなるらしい。

手順は以下の通り　※レジストリをいじるので自己責任でお願いします:alien:

①regedit.exeを起動(スタートボタン押下、regeditを入力してEnter)
②以下のパスを開く
HKEY_CURRENT_USER\Software\Microsoft\Office\15.0\Common\Internet
※office 2010だと　15.0→14.0とかなってるはず

③以下の図の用に　キーを登録する
![レジストリoffice2013.png](https://qiita-image-store.s3.amazonaws.com/0/160956/a1a0d725-0ecf-b784-c036-f96f423ab62b.png)

参考：https://support.microsoft.com/ja-jp/help/951704
Debian unstable の Gnome 環境で git-credential-gnome-keyring を使う

# 概要

Debian unstable の環境で、httpsでcloneしたレポジトリのパスワードの入力が毎回あるので
なんとかなるか調べたら、以下の記事が見つかった。

* [git を https 経由で使うときのパスワードを保存する - Qiita](http://qiita.com/usamik26/items/c655abcaeee02ea59695)

cacheでことが足りそうだなと思ったのですが、
せっかくなので、Gnomeのkeyringを使ってみようとした。


# 結論

できた

# やったこと

まずは、上のサイトを参考に、以下を見る。

* [shugo/git-credential-gnomekeyring: A git credential helper for GNOME keyring](https://github.com/shugo/git-credential-gnomekeyring)

さらに読むと、Debianでは、すでにソースなどは入っているようだ。

* [shugo/git-credential-gnomekeyring: A git credential helper for GNOME keyring](https://github.com/shugo/git-credential-gnomekeyring#debianubuntumint-linux)


ユーザーで、適当なディレクトリを作り、そこへ移動

```
cp -r /usr/share/doc/git/contrib/credential/gnome-keyring .
```

とりあぜず、

```
make
```

エラーがでた

```
Package gnome-keyring-1 was not found in the pkg-config search path.
Perhaps you should add the directory containing `gnome-keyring-1.pc'
to the PKG_CONFIG_PATH environment variable
No package 'gnome-keyring-1' found
Package gnome-keyring-1 was not found in the pkg-config search path.
Perhaps you should add the directory containing `gnome-keyring-1.pc'
to the PKG_CONFIG_PATH environment variable
No package 'gnome-keyring-1' found
gcc -g -O2 -Wall   -o git-credential-gnome-keyring.o -c git-credential-gnome-keyring.c
git-credential-gnome-keyring.c:29:18: fatal error: glib.h: No such file or directory
 #include <glib.h>
                  ^
compilation terminated.
Makefile:19: recipe for target 'git-credential-gnome-keyring.o' failed
make: *** [git-credential-gnome-keyring.o] Error 1
```

`glib.h`
がない

* [Package gnome-keyring-1 was not found · Issue #1172 · brave/browser-laptop](https://github.com/brave/browser-laptop/issues/1172)

を参考に

```
apt-get install libgnome-keyring-dev
```

再び

```
make
```

できあがった `git-credential-gnome-keyring` を
PATHが通っているところにコピーする

# 設定

* [shugo/git-credential-gnomekeyring: A git credential helper for GNOME keyring](https://github.com/shugo/git-credential-gnomekeyring#configuration)

`.gitconfig` を編集するなどする。


上の github のところだと、`gnomekeyring` となっているが、`gnome-keyring` にしないと自分のDebianの環境では動かなかった。

```
[credential]
        helper = gnome-keyring
```

# あとは


# 参考情報

* [How to use git with gnome-keyring integration - Stack Overflow](http://stackoverflow.com/questions/13385690/how-to-use-git-with-gnome-keyring-integration)
Vagrant コマンド実行時の詳細なログの出し方

# Vagrant コマンド実行時の詳細なログの出し方

ターミナルなどで `vagrant` コマンド 実行時に、なにかよくわからずコマンドが終了してしまう場合。
たとえば、こんなエラー状況。

```sh
$ vagrant box add --name NewMyBox ./mybox-CentOS7.2-x86_64.box 
==> box: Box file was not detected as metadata. Adding it directly...
==> box: Adding box 'NewMyBox' (v0) for provider: 
    box: Unpacking necessary files from: file:///Users/precure/projects/magical/mybox-CentOS7.2-x86_64.box
An error occurred while downloading the remote file. The error
message, if any, is reproduced below. Please fix this error and try
again.



$ # なにもエラーメッセージがないやんけ！！
```

## 方法

環境変数 `VAGRANT_LOG` に値を設定すればよい。


### Mac

```
$ VAGRANT_LOG=debug vagrant somecommand ...
```


### Windows 

```shell-session
> set VAGRANT_LOG=DEBUG
> vagrant somecommand ...
```
ubuntu16.04LTSで外付けnvidia GPU利用中、Xでログインできなくなった

ubuntu16.04のソフトウェアの更新をして
再起動したら、Xでログインできなくなった。
とりあえず、以下の対策でうまくいった。
（nouvauの無効化は以前にしていた）

対応概要：コンソールでログインして、
　　　　　nvidiaのドライバーを再インストールして再起動

使用環境：
ubuntu 16.04LTS
GPU GTX1050

具体の手順：
１　[ctrl]+[alt]+[F1]でコンソールを切り替えて、ログイン

２　$sudo service lightdm stop
   でXのサービスを停止

３　nvidiaのGPUドライバーのあるディレクトリに移動

４　$sudo sh NVIDIA-Linux-x86_64-375.26.run
　　を実行

５　適当に答えて、再起動
Ubuntu 16.04 LTSにVirtualboxをインストールする方法

Ubuntu 16.04 LTSにVirtualboxをインストールする方法についてまとめます。

#手順
1. `/etc/apt/sources.list`の末尾に以下を追記します。

```
deb http://download.virtualbox.org/virtualbox/debian xenial contrib
```

1. 以下のコマンドを実行し、Virtualbox用のkeyを追加します。

```bash
$ wget -q https://www.virtualbox.org/download/oracle_vbox_2016.asc -O- | sudo apt-key add -
```

1. 以下のコマンドを実行し、パッケージ一覧を更新します。

```bash
$ sudo apt update
```

1. 以下のコマンドを実行し、Virtualboxをインストールします。

```bash
$ sudo apt install virtualbox-5.1
```

#参考文献
* [Linux_Downloads – Oracle VM VirtualBox](https://www.virtualbox.org/wiki/Linux_Downloads)
多重構造の中で UIScrollView.scrollsToTop を一気に設定するやつ

```swift:UIView.swift
import UIKit

extension UIView {
	
	func findScrollViews() {
		if self is UIScrollView {
			print(#function, "scrollsToTop: \((self as! UIScrollView).scrollsToTop), \(self.hash), \(self.frame)")
		}
		for v in subviews {
			v.findScrollViews()
		}
	}
	
	func resetScrollsToTop(_ targetScrollView: UIScrollView) {
		if self is UIScrollView {
			(self as! UIScrollView).scrollsToTop = self == targetScrollView
		}
		for v in subviews {
			v.resetScrollsToTop(targetScrollView)
		}
	}
	
}
```
```swift
view.resetScrollsToTop(currentScrollView)

// 検証
view.findScrollViews()
print("-----")
```
FileMaker レコードのインポートで失敗するケースについて

# 「レコードのインポート」という機能

FileMaker でよく使う機能の一つに「レコードのインポート」という機能があります。

これは、名前のとおりの機能なのですが、テーブルAからテーブルA'にデータを

移行する時などに使う機能となります。

基本的な機能ですね。

# 「レコードのインポート」の困る点
基本的な機能ゆえに使う機会は多いのですが、一点困ったことがあります。

それは、、、

## インポートに失敗した時に原因が分からない

特に、スクリプトステップで「レコードのインポート」を使ったときも、

「エラーが起きた」ということしか分からない、というのにはがっかりします。

※スクリプトステップなら、より詳細なエラーコードとか欲しいですよね。



# よくある原因：実例

私自身がよく躓くので、よくある原因をメモ的に記録しておきます。

参考になれば幸いです。



## １．テーブル定義の差分：NotNull制約の罠

これはMySQLとの連携の際にあったことですが、

例えば、

* MySQL側　：NotNull制約
* FileMaker側　：フィールドに値がない

というレコードが、インポートの対象になっているとエラーになります。

「当たり前」と思われるかもしれませんね。


### 一点の罠

罠だと思ったのは

* MySQL側で Default値 を設定していてもエラーになる

という点です。

「値が渡されなければ、Default値が入るだけだから問題ないでしょ」

と思っていると、嵌ります。


### エラー詳細

MySQLのquery_log を出力してみて分かったのは、上記の場合FileMakerは、

当該カラムについて明確に NULL を設定したINSERT文を生成するのです。

こんなイメージです。
```sql:hoge.sql
 INSERT hoge(col1, not_null_col2) values ('hoge', NULL)
```

### 一点の救い
この場合、原因はSQLエラーですので、MySQLのquery log に

発行されたSQLが出力されます。

なのでMySQLに聞けば、何が悪いのかは教えてもらえます。

多少の手間はありますが、原因がわかるならそれに越したことはないですね。



## ２．フィールド定義に反するデータの存在：不適切なデータ

これも、MySQLとの連携の際にあったことです。


まったくもって不思議なのですが、FileMakerには

* フィールドの種類を「数字フィールド」に設定していても、英字・マルチバイト文字が登録できる

という、謎仕様があります。

例えば「金額」というフィールドがあるとして、

「500」と入力されることを期待して、数字フィールドに設定していても

「500円」と入力することができてしまいます。

このレコードが、インポートの対象になっているとエラーになります。


### 切り分けのヒント

この場合、MySQLのquery log にSQLが出力されませんでした。

ということは、原因の所在は・・・

* 「レコードのインポート」スクリプトステップの開始以後

* SQLの発行前

ということになります。

あくまでも妄想ですが、FileMakerがSQLを生成する際、

* 数字フィールドの値をString型に変換する

という処理をしていたら、このエラーに合致しそうです。

より正確には、

* int型として扱うobject(実体はString型)に対して、Stringへのキャストを試みた

という感じでしょうか。

（あくまで妄想です。悪しからず）




# 結論：原因を切り分ける方法について

上記に示したのは、いずれもMySQLのテーブルへのインポートでした。

そのため、MySQL の query log を足掛かりに原因を探ることができました。


## いっそ原因追究に使えないか？？

いつでも使える方法ではない気がしますが、

* MySQL(PostgreSQL)に理由を尋ねる

という方法は、今回とても有効でした。


手間ではあるのですが、


* インポート先と同じ定義でMySQLにテーブルを作る

* general log の出力設定をする

* MySQLに対してインポートしてみる。

というステップを踏むことで、

「SQLが発行されるか？？」を足掛かりにすることができます。

　⇒発行された
　　SQLエラーです。
　　インポート先とテーブル定義が異なる、などが考えられます。

　⇒発行されない
　　SQLの生成時にエラーが出ています。
　　インポート元のデータに不備がある、場合が考えられます。



参考になれば幸いです:sunny:
畳み込みニューラルネットワークとは〜Pooling編〜

前回はConvolutionについて書きました。

今回はPoolingについて書きます。

#Pooling

![image](https://qiita-image-store.s3.amazonaws.com/0/28622/90fd156c-df4d-9b93-39b3-ff578d97bb1f.png)
引用（https://thinkit.co.jp/story/2015/09/09/6399 図6：Convolutional Neural Network（CNN）の処理）

前回書いたのが図の畳み込み層で、今回のPoolingはプーリング層で行う処理です。

![cross_10.png](https://qiita-image-store.s3.amazonaws.com/0/28622/0492e025-6914-854a-1cc3-10a6daf3b7e0.png)

Convolution（畳み込み）は、上の図のように対象画像がその特徴とどれだけ類似するか評価した特徴マップを得るための処理でした。

Poolingでは、さらにこの特徴マップから必要な情報だけ抜き出して、特徴マップを縮小してあげます。

![Pooling.png](https://qiita-image-store.s3.amazonaws.com/0/28622/52f4d0a7-6288-96ea-6d4b-84d68e43be21.png)

手法は、図のように例えば2×2の範囲での最大値を取るというものです。
こうすることで元の特徴マップの4分の1まで縮小することができます。

Poolingすることで計算の負荷を下げることができます。

#参考
山下隆義
イラストでわかるディープラーニング 講談社

斎藤康毅
ゼロから作るDeep Learning

畳み込みニューラルネットワークの仕組み
http://postd.cc/how-do-convolutional-neural-networks-work/
LaravelでCould not open input file: artisanって言われたら

Laravelでmigrationファイルとか作成する時に

```
php artisan hogehoge...
```

というコマンドを叩くと思います。その時に、

```
Could not open input file: artisan
```
ってエラーを吐かれたら、コマンドを叩いてるディレクトリが違う可能性があります。
そのコマンドを自分のLaravelアプリのホームディレクトリで叩いてみてください。
rmtrashのすすめ〜誤削除を防止する〜

iOSエンジニアに転職して５週目に突入しました。
前職はWindowsのアプリエンジニアでCUIを使う機会はほとんどありませんでしたが、
今はTerminalバリバリ使ってます。

ただ、Mac初心者が気をつけなければならないのは`rm`コマンドです。
`rm`コマンドで削除されたファイルは、ゴミ箱ではなく消えてしまいます。
なので、<b>うっかり誤削除してしまっても、もとに戻すことができません・・・</b>。

こんなときにも慌てないように、`rmtrash`をおすすめします。

##rmtrashとは
ファイルを削除するのではなく、ゴミ箱に移すコマンドです。

##インストール手順

###1. homebrewでrmtrashインストール

```bash
$ brew install rmtrash
```

###2. aliasの設定
インストールが無事終われば、`.bashrc`にaliasを設定します。

```bash
$ vim ~/.bashrc
```
aliasを追加して、`rm`の代わりに使えるようにします。

```bash
alias rm='rmtrash'
```

設定を読み込みます。

```bash
$ source ~/.bashrc
```

##動作確認
```bash
$ ls
sample.txt
$ rm sample.txt
```

<img width="554" alt="スクリーンショット 2017-01-31 14.03.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/22680/1814684e-8e7e-77f9-3855-3237adc9b026.png">

ゴミ箱に移動します。

ディレクトリの削除も可能です。

```bash
$ ls rmtrash_test
test.txt
$ rm rmtrash_test
```

<img width="562" alt="スクリーンショット 2017-01-31 14.06.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/22680/1669b32f-15b9-4eb4-c47f-517316e2560e.png">


###参考にした記事
- [必ずやっておく設定、rmコマンドを「ゴミ箱」機能に置き換える方法](http://tukaikta.blog135.fc2.com/blog-entry-214.html)
Xamarin.iOS アプリに HockeyApp を導入したらビルドエラーになった

Xamarin.Forms で作ったアプリの iOS 側に HockeyApp(まあ DeployGate みたいなもの) を導入しようとしています。

HockeyApp は Xamarin Component として配布されています。今では Xamarin.Forms 向けのコンポーネントもあります。

* [HockeyApp for Xamarin Forms / Components / Xamarin](https://components.xamarin.com/view/hockeyappforms)

これを iOS プロジェクトに追加してビルドしたところ、以下のビルドエラーが発生するようになりました。

```
MTOUCH: Error MT5212: Native linking failed, duplicate symbol: '_plcrash_async_image_list_new_empty'. (MT5212)
```

「クラッシュに関するシンボルが重複している？」 というヒントで、そういえばまだプロジェクトに Xamarin.Insights が使用されていた事に気づきました。

Xamarin.Insights は Microsoft による買収より前から存在していたクラッシュリポートサービスで、 HockeyApp と同じく、アプリで発生した全てのクラッシュを収集しようとします。が、現在はサービス終了しているので、これの使用はまったくの無意味です。

Xamarin.Insights の nuget パッケージをプロジェクトから削除、リビルドしたところ、エラーは解消されました。
Windowsレジストリ操作（リダイレクトと仮想化）

Windowsのレジストリについて調べる機会があったので、そのメモです。

# 1.64bit/32bitの相違

64bit Windows OSでは、一部のレジストリエントリについてのビューを提供しており、64bit アプリと 32bit アプリで見え方が異なる。ビューの切り替えは /reg:xx オプションで指定する。

なお、レジストリを操作する reg.exe コマンドについても、64bit 版と 32bit 版の両方がインストールされている。

```cmd
C:\>reg query HKLM\Software\Example
エラー: 指定されたレジストリ キーまたは値が見つかりませんでした

C:\>reg query HKLM\Software\Example /reg:64
エラー: 指定されたレジストリ キーまたは値が見つかりませんでした

C:\>reg query HKLM\Software\Example /reg:32

HKEY_LOCAL_MACHINE\Software\Example\App1

C:\>c:\Windows\SysWow64\reg query HKLM\Software\Example

HKEY_LOCAL_MACHINE\Software\Example\App1
```

# 2.32bitアプリケーションにおけるリダイレクト

　64bit Windows OS上で32bit アプリからアクセスされた場合、一部のレジストリエントリについてはリダイレクトされる。

| アクセス先 | リダイレクト先 |
|:--|:--|
|HKLM\Software|HKLM\Software\Wow6432Node|
|HKCR|HKCR\Wow6432Node|

　また、REG_SZ|REG_EXPAND_SZ 型の値については、内容の自動的な置換が行われる場合もある。

|書き込んだ値|自動置換後|
|:--|:--|
|%ProgramFiles%|%ProgramFiles(x86)%|
|%commonprogramfiles%|%commonprogramfiles(x86)%|


- ※ レジストリのリフレクション（本来の位置とリダイレクト先との自動同期）
  - → Window 7 / 2008 R2 以降で廃止。

# 3.UAC環境におけるレジストリの仮想化

　Vista/2008 以降で、UAC(User Access Control)配下において、レジストリへのアクセスが権限不足により失敗した場合の救済措置。32bitの会話型アプリケーションでのみ有効。

## 3.1.書き込み時

　書き込みに失敗した場合、代替位置に書き込む。


| 書き込み希望位置 | 代替位置（迂回先） |
|:-:|:-:|
|HKLM\Software|HKUS\(SID)_Classes\VirtualStore\MACHINE\Software|

ただし以下のエントリは仮想化対象外：

- HKLM\Software\Classes
- HKLM\Software\Microsoft\Windows
- HKLM\Software\Microsoft\Windows NT

## 3.2.読み込み時

以下の順に読み込む

1.迂回先エントリ
2.本来のエントリ（迂回先がなかった場合のみ）

## 3.3.仮想化の状態確認

```cmd
C:\>reg flags HKLM\Software\Example query /reg:32

HKEY_LOCAL_MACHINE\Software\Example
        REG_KEY_DONT_VIRTUALIZE: CLEAR　←ここで識別する
        REG_KEY_DONT_SILENT_FAIL: CLEAR
        REG_KEY_RECURSE_FLAG: CLEAR
```

- CLEAR:	仮想化されている
- SET:		仮想化されていない

# 4.レジストリ内容の表示

```cmd
C:\>reg query HKLM\Software\Example\App1\System /reg:32 /s

HKEY_LOCAL_MACHINE\Software\Example\App1\System
    Database    REG_SZ
    InstallDir    REG_SZ    C:\Example\App1\
    LastUser    REG_SZ
    AppType    REG_DWORD    0x0
    UseClient    REG_BINARY    00
    TempPath    REG_SZ    C:\Example\App1\Temp
    User    REG_SZ    sa
    ProgPath    REG_SZ    C:\Example\App1\Bin
    Server    REG_SZ    COMPUTERNAME\ExampleINSTANCE
    ProductType    REG_SZ    1
    OEM    REG_SZ    アプリケーション名称
    No    REG_DWORD    0x0
    LogPath    REG_SZ    C:\Example\App1\Data
    Micr    REG_DWORD    0x1
    LoginMode    REG_DWORD    0x2
    DbPath    REG_SZ    C:\Example\App1\Data
```


# 5.レジストリのコピー

HKLM\Software\Example 配下を HKLM\Software\Example-32 に再帰的にコピー。

```cmd
reg copy HKLM\Software\Example HKLM\Software\Example-32 /s /f /reg:32
```

# 6.レジストリの書き換え

接続先 SQL Server の値を書き換える例

```bat
set REG_KEY=HKLM\Software\Example\App1\System
set SERVER=xxx.yyy.ap-northeast-1.rds.amazonaws.com
reg delete %REG_KEY% /v Server /reg:32 /f
reg add %REG_KEY% /reg:32 /f /v Server /t REG_SZ /d %SERVER%
```


（参照）
- [第6回　レジストリのリダイレクトと仮想化およびレジストリ操作ツール](http://www.atmarkit.co.jp/ait/articles/1502/19/news120.html)
-  [レジストリ・リダイレクタ(MSDN)](https://msdn.microsoft.com/ja-jp/library/aa384232.aspx)
「Swiftの自前ログクラス」のSwift3対応版

Swift3でのロギングどうしようかな、ライブラリを使うべきかなというところ「[Swiftの自前ログクラス](http://qiita.com/VirgomanBros/items/0e1bc3b0073057f607bb)」を見つけ試したところ、例によってSwift3ではコンパイルが通らなかった部分がありましたので、Swift3対応版をば。

```swift:Usage
Logger.info(message: "init")
>> [INFO] => "init" 2017/01/31 11:11:11 init() MyViewController.swift:(37)

Logger.debug(message: "deinit")
>> [DEBUG] => "deinit" 2017/01/31 12:12:12 deinit() MyViewController.swift:(45)
```

```swift:Logger.swift
import Foundation

class Logger{
    class func debug(
        message: String,
        function: String = #function,
        file: String = #file,
        line: Int = #line) { Logger.write(loglevel: "[DEBUG]", message: message, function: function, file: file, line: line) };
    class func info(
        message: String,
        function: String = #function,
        file: String = #file,
        line: Int = #line) { Logger.write(loglevel: "[INFO]", message: message, function: function, file: file, line: line) };
    class func warning(
        message: String,
        function: String = #function,
        file: String = #file,
        line: Int = #line) { Logger.write(loglevel: "[WARNING]", message: message, function: function, file: file, line: line) };
    class func error(
        message: String,
        function: String = #function,
        file: String = #file,
        line: Int = #line) { Logger.write(loglevel: "[ERROR]", message: message, function: function, file: file, line: line) };
    class func write(
        loglevel: String,
        message: String,
        function: String,
        file: String,
        line: Int) {
        
        let now = NSDate() // 現在日時の取得
        let dateFormatter = DateFormatter()
        dateFormatter.locale = NSLocale(localeIdentifier: "ja_JP") as Locale!
        dateFormatter.timeStyle = .medium
        dateFormatter.dateStyle = .medium
        
        let nowdate = dateFormatter.string(from: now as Date)
        
        var filename = file
        if let match = filename.range(of: "[^/]*$", options: .regularExpression) {
            filename = filename.substring(with: match)
        }
    
        print("\(loglevel) => \"\(message)\" \(nowdate) \(function) \(filename):(\(line))")
    }
}
```

もっとリッチなロギングが欲しくなったらそのとき考えるということで。
PDFファイルのタイトルにファイル名を自動入力

##Acrobat Pro DCのツールから、アクションウィザードを選択

![SnapCrab_NoName_2017-1-31_13-11-22_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/129553/63d4d54d-1caf-8b54-56a8-5598305315e3.png)


##新規アクション > その他のツール
![SnapCrab_NoName_2017-1-31_13-12-33_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/129553/e20991ba-bbe1-b9b7-6096-8f6cd5b61216.png)


##アクションステップに「JavaScriptを実行」を追加
![SnapCrab_NoName_2017-1-31_13-15-32_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/129553/bb116a1d-7ce1-af0b-562e-664913fccfd2.png)

　→　ユーザー確認のチェックを外す

##「JavaScriptを実行」の設定を指定をクリックし以下を入力しOKで閉じる
```vbnet
/* ファイル名をタイトルにする */
var reg=/(.*)(?:\.([^.]+$))/;
myFileName=this.documentFileName;

this.info.Title = myFileName.match(reg)[1];
```
![SnapCrab_NoName_2017-1-31_13-17-9_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/129553/027e5ccc-a240-7bd6-1eaa-593cfbf541eb.png)


##アクションステップに「保存と書き出し」から「保存」を追加する
![SnapCrab_NoName_2017-1-31_13-20-0_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/129553/3a488741-5422-9b94-bb10-4114f3c0bb7a.png)

##処理するPDFを入れたフォルダを指定して、アクションに名前をつけて保存する
![SnapCrab_NoName_2017-1-31_13-22-24_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/129553/9af6e1f5-ded9-22b0-6b99-3bfc069d66ad.png)

　例→　「PDFフォルダ」をいうフォルダを指定した例です。


##アクションリストに作成したアクションがあることを確認できたら、いつでもそのアクションを実行できます。


フォルダの中のPDFが何個あろうとすべてのファイルに対して実行されます。

以上です。
[端末依存問題] iOS 10.2 以降で momentjs を使ってる人必見

## 対象プロダクト
プロダクトが iOS 10.2 以降をサポートしていて、 momentjs 2.17.1 を使っているケース

## 衝撃の新事実
### Chrome 55.0.2883.95 (64-bit) で momentjs を実行した場合

```javascript
moment('2016-12-08').format('YYYY')
// => "2016"
moment('2016-12-8').format('YYYY')
// => "2016"
```

### iOS 10.2 で momentjs を実行した場合

```javascript
moment('2016-12-08').format('YYYY')
// => "2016"
moment('2016-12-8').format('YYYY')
// => "Invalid date"
```

まじかよ Σ(ﾟДﾟ!!
Python requestsモジュールを使用してKINTONEに添付ファイル付きレコードを作成する

#フロー
1. KINTONEで入れ物を作る
2. Pythonで添付ファイルを送信する
   - fileKeyを取得する
   - レコードに結合する
3. うれしい

#KITONEの入れ物
フィールドコードが"Attch"の添付ファイルの入れ物を作ります。

#Pythonで添付ファイルを送信する
KINTONEでレコードにファイルを添付するには、

- ファイルをアップロード
- レコードと結合

という手順を踏みます。

それをPythonで書くと↓

```python
#!/usr/bin/python
# coding:utf-8

import requests
import json

URL = "https://xxxxx.cybozu.com:443" # kintoneのサブドメイン(xxx.cybozu.com)
APP_ID = "ID" # kintoneのアプリID
API_TOKEN = "APP TOKEN" # kintoneのAPIトークン
KNT_PASS = "xxxxxx" # ログインネーム:パスワード をbase64でエンコード

#KINTONEアプリのフィールドコード
#添付ファイル   Attch


class KINTONE:
    def UploadToKintone(self, url, knt_pass,path,filename):
        img = open(path + filename, 'rb')
        files={'file':(filename,img,'image/jpeg')}

        headers = {"X-Cybozu-Authorization": knt_pass , 'X-Requested-With': 'XMLHttpRequest'} 
        resp=requests.post(url+"/k/v1/file.json",files=files,headers=headers)

        return resp 
    
    def PostToKintone(self,url,appId,apiToken,filekey):
        record = {
            "Attch":{'type':"FILE","value" :[{'fileKey':filekey}]}
            #他のフィールドにデータを挿入する場合は','で区切る
        }
        data = {'app':appId,'record':record}
        headers = {"X-Cybozu-API-Token": apiToken, "Content-Type" : "application/json"}
        resp=requests.post(url+'/k/v1/record.json',json=data,headers=headers)
        
        return resp

if __name__ == '__main__':
    Path='/tmp/' #ファイル保存パス
    FileName='image.jpg' #ファイル名
    
    knt=KINTONE()
    resp=knt.UploadToKintone(URL, KNT_PASS,Path,FileName)

    txt=json.loads(resp.text)
    FileKey=txt['fileKey']
    resp=knt.PostToKintone(URL, APP_ID, API_TOKEN,FileKey)
    print resp.text
```

アウトプットは

```script
{"id":"1","revision":"1"}
```

となり幸せな気分になりました。
シェルからお手軽にSSL証明書の失効期限をチェックする方法

Webサーバで現在絶賛使用中のSSL証明書の期限をチェックしたくなった場合以下のコマンドを実行すると良いらしいです。

```bash
$ echo | openssl s_client -connect [site:port] 2>/dev/null | openssl x509 -noout -dates
```

具体的には以下のような結果が返ってきます。

```bash
$ echo | openssl s_client -connect qiita.com:443 2>/dev/null | openssl x509 -noout -dates
notBefore=Mar 15 03:55:03 2015 GMT
notAfter=May 16 01:59:04 2017 GMT
```

- `notBefore` には証明書の有効期間の開始日　　
- `notAfter` には証明書の有効期間の終了日

がそれぞれ表示されます。

また、シェルスクリプトで証明書の失効するx日前であるかどうかをチェックしたいという場合には以下のコマンドが役に立ちます。


```bash
$ echo | openssl s_client -connect [domain:port] 2>/dev/null | openssl x509 -checkend [seconds] -noout
```

上記のコマンドの終了コードをチェックすることによって結果を知ることができます。

- `0` が返ってきた場合は [seconds] 秒以内には証明書は**失効しません**
- `1` が返ってきた場合は [seconds] 秒以内に証明書が**失効します**

例えば失効の **30日** 前になったときに警告を出したいといったときにはワンライナーで以下のように記述をすることができます。

```bash
echo | openssl s_client -connect qiita.com:443 2>/dev/null | openssl x509 -checkend $((30 * 24 * 60 * 60)) -noout  || echo "この証明書は30日以内に失効します" >&2
```

以上、Qiita初投稿でした。
Docker for Macでdocker0インターフェースが無い件

ホストのMacからコンテナへネットワークアクセスしようとしてみたら、

```
> ping 172.17.0.2
PING 172.17.0.2 (172.17.0.2): 56 data bytes
Request timeout for icmp_seq 0
Request timeout for icmp_seq 1
...
```

となり、できない。ホスト側のifconfigでdocker0インターフェースを見ようとしたらそもそも存在しない。調べたら、MacOS固有の制限事項で、docker runする時に--publish でポートフォワードするしか解決策が無いみたい。

参照: [Networking features in Docker for Mac](https://docs.docker.com/docker-for-mac/networking/)
SourceTreeとBitbucket。エラーですCAPTCHAをしなさいよ！？と怒られたときはmacのkeychainを見直しましょう。

皆様パスワードの更新は、行っているでしょうか。僕はあまりやってません（IT技術者としてあるまじき）。Bitbucketのパスワードを変えたところ、何やら以下のメッセージでよく怒られるようになったのですが、機械じゃないことを証明することが飽きたので対処しました。

```
fatal: remote error: CAPTCHA required
Your Bitbucket account has been locked. To unlock it and log in again you must
solve a CAPTCHA. This is typically caused by too many attempts to login with an
incorrect password. The account lock prevents your SCM client from accessing
Bitbucket and its mirrors until it is solved, even if you enter your password
correctly.

If you are currently logged in to Bitbucket via a browser you may need to
logout and then log back in in order to solve the CAPTCHA.

```

原因としては、macのkeychainがSourceTreeと紐付けてるパスワードが更新されていないせいでこれが起こってた（らしい）。

macのkeychainからSourceTreeのパスワードを削除して、再度SourceTreeにログインすると解決した。誰かのためになれば幸いでござった。
【git rebase -i】gitのcommitをまとめる

似た記事は沢山あるが、
忘れたころに調べると、
いろいろな記事を回ることが多いため、
自分なりにまとめる。

# やりたいこと
「ぎゃー！細かくcommitしすギター！」

とか

「コミットログ見づれー！」

って時にcommitをまとめたい。
**※リベースするって言うらしいですよ。**

# 作業手順
## commitログを確認
```bash:コマンド
git log --oneline
```

```bash:コマンド結果
commit_id_3 commitメッセージ(2017/03/01)
commit_id_2 commitメッセージ(2017/02/01)
commit_id_1 commitメッセージ(2017/01/01)
```

※コミットの履歴が多い場合「q」キーで終了

## リベース指示書を作成
```bash:コマンド
git rebase -i コミットid
```

**※注意**
指定するコミットidは、リベースしたいところの一つ前。
例えば「commit_id_2」「commit_id_3」をリベースしたい場合、
指定するのは「commit_id_1」になる。

```bash:コマンド実行後(viで下記の指示書が開く)
pick commit_id_2 commitメッセージ(2017/02/01)
pick commit_id_3 commitメッセージ(2017/03/01)

# ~~省略~~
# 指示書の
# 書き方説明
```
**※指示書の詳細**
「指示コマンド コミットid コミットメッセージ」が昇順で並んでいる。
デフォルトで指示コマンドは「pick = コミットをそのまま残す」になっているので、
「squash」か「fixup」にする必要がある。

**※指示コマンド**

|コマンド|説明|
|:--|:--|
|(p)pick|コミットをそのまま残す。|
|(r)reword|コミットメッセージを変更。|
|(e)edit|コミット自体の内容を編集。|
|(s)squash|直前のpickを指定したコミットに統合。<br>メッセージも統合。|
|(f)fixup|直前のpickを指定したコミットに統合。<br>メッセージは破棄。|

```bash:指示書修正例
pick commit_id_2 commitメッセージ(2017/02/01)
s commit_id_3 commitメッセージ(2017/03/01)

# ~~省略~~
# 指示書の
# 書き方説明
```

## リベース後のコミットメッセージ編集(squashの場合)
指示書の保存後、自動的にコミットメッセージ編集に移る。
編集して保存でおｋ。

## リベース後のpush
リベース後の状況によっては、
pushしたい内容は、originよりもcommitが前になり、
pushできないよ！と怒られる時がある。

originのcommitを破棄して、
リベースした内容を反映させて良い場合は、

```bash
git push -f origin master
```

のように強制的にpushすればよい。

# 追加：間違ったrebaseを削除したい
```bash
git rebase --abort
```
SQLServer のミラーリングが接続できなくなったので解消したメモ


* SQL Server 2008R2
* ミラーリング監視は無し
* ネットワークハブの電源を抜かれてプリンシパル/ミラーの通信ができなかった
* データベース プロパティのミラーリング `状態` は `接続なし: ミラー サーバー インスタンスに接続できません`
* ネットワークの問題は解消し、プリンシパル/ミラー間の通信ができるようになってもミラーリングが再開されない

## 解決方法

```sql
ALTER ENDPOINT <Endpoint Name> STATE=STOPPED
```

を実行し、一度 ミラーリングを止める。その後、


```sql
ALTER ENDPOINT <Endpoint Name> STATE=STARTED
```

を実行すると、無事ミラーリングが再開され、

* (プリンシパル、同期中)
* (ミラー、同期済み / 復元しています...)

になった

以前もめちゃくちゃググってつまづいたのでメモ。

## 参考

https://support.microsoft.com/ja-jp/help/2490051/mirrored-databases-are-disconnected-after-you-restart-the-database-mirror-in-sql-server-2005,-sql-server-2008,-or-sql-server-2008-r2
kintone データをTableau でビジュアライズ by CData ODBC Drivers

[CData ODBC Driver for kintone](http://www.cdata.com/jp/drivers/kintone/odbc/) は、Tableau でライブkintone data へのアクセスを可能にします。kintone data のカラムをデータビジュアライゼーションにドラグ&ドロップすると、Tableau はクエリを作成しkintone に直接要求を出します。この記事ではkintone data をダッシュボードに統合します。
![kintoneTableau.png](https://qiita-image-store.s3.amazonaws.com/0/116843/2df99005-d9d0-1905-e8b7-c1f66af198f9.png)

##kintone ODBC DSN を設定##
kintone ODBC Drivers をダウンロードし、インストールを行います。
[http://www.cdata.com/jp/drivers/kintone/download/odbc/](http://www.cdata.com/jp/drivers/kintone/download/odbc/)
接続プロパティの指定がまだの場合は、DSN （データソース名）で行います。Microsoft ODBC データソースアドミニストレーターを使ってODBC DSN を作成および設定できます。一般的な接続プロパティは以下のとおりです：
- Username
- Password
- URL

Microsoft ODBC データソースアドミニストレーターで必要なプロパティを設定する方法は、ヘルプドキュメントの「はじめに」をご参照ください。
![ODBCDSNConfig.png](https://qiita-image-store.s3.amazonaws.com/0/116843/ce155701-347a-5fe5-da48-1c2dff42ab1c.png)

##Tableau でのデータソース設定##
［新しいデータソース］>［サーバーへ］>［その他データベース(ODBC)］をクリックします。
![13.png](https://qiita-image-store.s3.amazonaws.com/0/116843/59695758-63ab-019a-f4af-7958a053ce68.png)

DSN からすでに設定したCData のODBC データソースを選択します；CData driver は64ビットおよび32ビットアプリケーションの両方をサポートしています。選択したら［接続］をクリックして接続を確立します。そして［サインイン］を押します。
![14.png](https://qiita-image-store.s3.amazonaws.com/0/116843/66959c0b-1f64-55a1-c639-0a3136dc47b1.png)

データベースでCDATA を設定します。［表］の検索バーの右側の検索マークをクリックするとCData ODBC で接続したテーブル一覧が表示されます。
![スクリーンショット (1201).png](https://qiita-image-store.s3.amazonaws.com/0/116843/1a73302e-8286-4d4d-5f9d-e075a719bc60.png)


テーブルを右ペインにドラグします。データを表示するとkintone のデータがテーブル状になって表示されます。
![17.png](https://qiita-image-store.s3.amazonaws.com/0/116843/ab732c7d-1a2f-9406-51de-a33471e2cb70.png)

あとは、シートでそれぞれディメンションとメジャーをドラグ＆ドロップしてDB を扱うようにTableau でビジュアライゼーションを作成することができます。
![18.png](https://qiita-image-store.s3.amazonaws.com/0/116843/90df8256-db57-7026-e4b2-e19650d70f27.png)

##CData ODBC テーブル内のJOIN##
CData ODBC Drivers では、同じデータソース内のJOIN が可能です。
Tableau から複数のkintone アプリ間のJOIN をしてみましょう。

データベース設定画面で、kintone ODBC を設定して、複数のテーブルをドラグ＆ドロップします。
![19.png](https://qiita-image-store.s3.amazonaws.com/0/116843/4dc07acf-fa15-ac8a-c0e2-91f2a9261a92.png)

テーブルとテーブルの間のJOIN アイコンをクリックして、結合するカラムを各データベースから選択し、JOIN 種類を選択します。
![20.png](https://qiita-image-store.s3.amazonaws.com/0/116843/c1bd8a58-a198-29a3-1aca-432740a9abba.png)

データを更新するとJOIN されたデータセットが表示されます。これをシートでビジュアライズに使用しましょう。
![21.png](https://qiita-image-store.s3.amazonaws.com/0/116843/f4cebd98-87e8-bf84-e32a-142ef6c7ff7f.png)
GitHub Releases にアップロードしてある最新バージョンの成果物を取得するワンライナー

e.g. [dtan4/s3url](https://github.com/dtan4/s3url) 最新バージョンの Linux 64bit バイナリが入った tarball を取得する

```bash
$ curl -s https://api.github.com/repos/dtan4/s3url/releases | jq -r '.[0].assets[] | select(.name | test("linux-amd64.tar.gz")) | .browser_download_url'
https://github.com/dtan4/s3url/releases/download/v0.3.1/s3url-v0.3.1-linux-amd64.tar.gz
```

サーバに Go バイナリを配置していて定期的に更新したい場合は、このワンライナーと展開処理を行うスクリプトを cron とかで回しておけばよさそうです。

## `curl -s https://api.github.com/repos/dtan4/s3url/releases`

[dtan4/s3url](https://github.com/dtan4/s3url) リポジトリの Releases を取得する GitHub API です。
Public リポジトリなら認証無しで叩けますが、[その場合の呼出回数は1時間あたり最大60回となってる](https://developer.github.com/v3/#rate-limiting)ので、Access Token を付与するほうが安心です。

[Releases | GitHub Developer Guide](https://developer.github.com/v3/repos/releases/#list-releases-for-a-repository)

## `jq -r`

`-r` オプションをつけると、ダブルクオートで囲まずそのまま文字列を返します。

### `.[0].assets[]`

上記 API のレスポンスは Release 作成時刻 `created_at` 降順になっているので、先頭の要素が最新の Release となります。`assets` に成果物 (asset) のメタデータが配列で格納されてます。

### `select(.name | test("linux-amd64.tar.gz"))`

`name` フィールドが `linux-amd64.tar.gz` にマッチする asset を抜き出します。`test` は与えられた正規表現にマッチするかどうかを true/false で返す jq 関数です。

[jq Manual (development version)](https://stedolan.github.io/jq/manual/#RegularexpressionsPCRE)

ここまでで、こういう JSON が得られます。

```json
{
  "url": "https://api.github.com/repos/dtan4/s3url/releases/assets/2505550",
  "id": 2505550,
  "name": "s3url-v0.3.1-linux-amd64.tar.gz",
  "label": "",
  "uploader": {
    "login": "dtan4",
    "id": 680124,
    "avatar_url": "https://avatars.githubusercontent.com/u/680124?v=3",
    "gravatar_id": "",
    "url": "https://api.github.com/users/dtan4",
    "html_url": "https://github.com/dtan4",
    "followers_url": "https://api.github.com/users/dtan4/followers",
    "following_url": "https://api.github.com/users/dtan4/following{/other_user}",
    "gists_url": "https://api.github.com/users/dtan4/gists{/gist_id}",
    "starred_url": "https://api.github.com/users/dtan4/starred{/owner}{/repo}",
    "subscriptions_url": "https://api.github.com/users/dtan4/subscriptions",
    "organizations_url": "https://api.github.com/users/dtan4/orgs",
    "repos_url": "https://api.github.com/users/dtan4/repos",
    "events_url": "https://api.github.com/users/dtan4/events{/privacy}",
    "received_events_url": "https://api.github.com/users/dtan4/received_events",
    "type": "User",
    "site_admin": false
  },
  "content_type": "application/gzip",
  "state": "uploaded",
  "size": 1773482,
  "download_count": 3,
  "created_at": "2016-10-20T15:58:38Z",
  "updated_at": "2016-10-20T15:58:38Z",
  "browser_download_url": "https://github.com/dtan4/s3url/releases/download/v0.3.1/s3url-v0.3.1-linux-amd64.tar.gz"
}
```

### `.browser_download_url`

成果物そのものの URL を抜き出します。
EDIまとめ

シンタックス
ＣＩＩシンタックスルール 1.11
http://www.ntt-logisco.co.jp/cpsd/CII.htm

物流ＥＤＩ標準ＪＴＲＮ
http://www.logistics.or.jp/data/edi.html
http://www.logistics.or.jp/pdf/data/jtrn/jtrn_3c_japan.pdf
Golang echoフレームワークでのレスポンスヘッダのセット方法

備忘録を兼ねて。
Go+echoでのレスポンスヘッダのセット方法。

例としてクロスドメインの許可設定を。

# net/http
Goのパッケージ net/http の場合は以下です。

```go
func saveHandler(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Access-Control-Allow-Origin", "*")
}
```

# echo
echoフレームワークでの記述は以下になります。

```go
e.GET("/foo", func(c echo.Context) error {
    c.Response().Header().Set(echo.HeaderAccessControlAllowOrigin, "*")
}
```

#### 追記
Middelwareを使った書き方を教えていただきました！
コメントを参照ください。そちらの方が綺麗に書けます！！
ActiveDirectoryのバックアップの取り方

お世話になっております。

WindowsServer2012R2を使用しています。

イベントビューアー＞カスタムビュー＞管理イベントに
下記の警告が溜まってます。
＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿
ディレクトリ パーティション: 
DC=ForestDnsZones,DC=hogehoge,DC=local 
 
'バックアップ潜在期間' (日): 
30 
 
不意のデータの損失から回復するため、できるだけ頻繁にバックアップをとることを お勧めします。しかしながら、'バックアップ潜在期間' で表示されている期間、バッ クアップがとられていない場合には、バックアップがとられるまでこのメッセージが毎 日、ログに記録されます。このパーティションを保持するレプリカのバックアップをと ることができます。 
 
既定では 'バックアップ潜在期間' は '廃棄 (Tombstone) の有効期間の間隔' の半 分に設定されています。次のレジストリ キーを追加すると 'バックアップ潜在期間' の既定値を変更できます。 
 
'バックアップ潜在期間' (日) レジストリ キー: 
System\CurrentControlSet\Services\NTDS\Parameters\Backup Latency Threshold (days) 
＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿

レジストリを弄って期間を延ばしてもしょうがないので
バックアップの取り方を探していた所

https://japan.zdnet.com/article/35029640/3/
を見つけたのでこちらでバックアップを取ろうとしているけど
大丈夫なのかな？？？

システム状態データ
しか取ってないのに
容量がめちゃくちゃ多くなったので怖くてキャンセルしてしまいました……

D:\WindowsImageBackup
にちょっと出来ている……

容量ってどれくらいなのでしょうか？
博識な方はお教え頂きますと嬉しく思います。
imgだけどサイズをbackground-size: cover;みたいにしたい

## imgをcover化させる！
スライダーとかでバックグラウンドじゃなく、imgタグで入れたいけど、画面いっぱいにやりたい！
ってときに役に立つかと思います。

今回の例ではスライドを画面いっぱいにするので、クラス名はそんな感じで

``` html:index.html
<div class="slide">
  <img src="sample.png" alt="sample" width="150" height="100">
</div>
```

``` css:cover.css
.slide {
  position: relative;
  height: 100vh;
}
.slide img {
  position: absolute;
  top: 0;
  left: 0;
  width: auto;
  height: auto;
  min-width: 100%;
  min-height: 100%;
  max-width: inherit;
}
```

imgタグの親にposition: relativeを入れて、imgタグにもろもろを入れていく感じになります。

これでimgタグが`background-size: cover;`と同じような感じになります。

## object-fit
IEを対応にしない場合は`object-fit`というのが使えます

``` css:cover2.css
.slide img {
  object-fit: cover;
  width: 100%;
  height: 100%
}
```
モバイル対応だけの場合はこちらでもいいかもしれませんね！