OmniAICreator/Qiita-1.07M huggingface dataset:
AWS SDK for Java がデフォルトで参照する credential

[aws-sdk-java 1.11.179](https://github.com/aws/aws-sdk-java/tree/1.11.179) を参照して書いています。

AWS SDK for Java はデフォルトでいろんな場所から認証情報を読み込みます。
[DefaultAWSCredentialsProviderChain の JavaDoc](https://github.com/aws/aws-sdk-java/blob/1.11.179/aws-java-sdk-core/src/main/java/com/amazonaws/auth/DefaultAWSCredentialsProviderChain.java#L19-L38) を見ると結構書いてあります。これと各 Provider の実装を見ながらどうなっているか見ていきます。

次のものを順番に試して最初に見つかった認証情報を利用するようになっています。

1. 環境変数 [EnvironmentVariableCredentialsProvider](https://github.com/aws/aws-sdk-java/blob/1.11.179/aws-java-sdk-core/src/main/java/com/amazonaws/auth/EnvironmentVariableCredentialsProvider.java)
    - `AWS_ACCESS_KEY_ID` と `AWS_SECRET_ACCESS_KEY` 環境変数 (Java 以外の SDK でも利用しているのでこちらのほうがオススメ)
    - `AWS_ACCESS_KEY` と `AWS_SECRET_KEY` 環境変数
    - AWS STS を利用する場合は `AWS_SESSION_TOKEN` 環境変数
2. Java システムプロパティ [SystemPropertiesCredentialsProvider](https://github.com/aws/aws-sdk-java/blob/1.11.179/aws-java-sdk-core/src/main/java/com/amazonaws/auth/SystemPropertiesCredentialsProvider.java)
    - `aws.accessKeyId` と `aws.secretKey` システムプロパティ
    - AWS STS を利用する場合は `aws.sessionToken` システムプロパティ
3. プロファイル認証情報 [ProfileCredentialsProvider](https://github.com/aws/aws-sdk-java/blob/1.11.179/aws-java-sdk-core/src/main/java/com/amazonaws/auth/profile/ProfileCredentialsProvider.java)
    - デフォルトのファイルは `~/.aws/credentials`
    - ファイルの場所は `AWS_CREDENTIAL_PROFILES_FILE` 環境変数で指定できる
    - 昔使われていた `~/.aws/config` も一応読みこまれる
    - ファイル内には複数の認証情報を記載できる。デフォルトでは `default` プロファイルが読み込まれる
    - `AWS_PROFILE` 環境変数、あるいは `aws.profile` システムプロパティでプロファイルを指定できる
    - 再読込ロックが獲得できれば5分に一度再読込される
    - 再読込ロックが獲得できなくても10分に一度再読込される
4. EC2コンテナ内で利用可能な認証情報 [EC2ContainerCredentialsProviderWrapper](https://github.com/aws/aws-sdk-java/blob/1.11.179/aws-java-sdk-core/src/main/java/com/amazonaws/auth/EC2ContainerCredentialsProviderWrapper.java)
    - [AWS ECS タスク用の IAM ロール](http://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/task-iam-roles.html)。 `AWS_CONTAINER_CREDENTIALS_RELATIVE_URI` 環境変数が使われる。
    - [EC2 インスタンスプロファイル](http://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_roles_use_switch-role-ec2_instance-profiles.html)。 [InstanceProfileCredentialsProvider](https://github.com/aws/aws-sdk-java/blob/1.11.179/aws-java-sdk-core/src/main/java/com/amazonaws/auth/InstanceProfileCredentialsProvider.java) で実装される。

環境変数やシステムプロパティを使ってかなりの設定ができるので、ほとんどの場合でデフォルトのままで十分です。自前で Credentials provider chain を作ると却って柔軟性が落ちて辛いということになりかねません。環境変数やシステムプロパティが利用できず、どうしてもカスタムしたいときは `DefaultAWSCredentialsProviderChain` を鎖の最後につなげておけば良いでしょう。
gossを使ってみよう

# [goss](https://github.com/aelsabbahy/goss) って何？

簡単に言うと [goss](https://github.com/aelsabbahy/goss) は serverspec みたいな感じのサーバーなどの設定をテスト/検証するツールです。YAML でテストすることを書いて実行するだけで、簡単にサーバーのテスト/検証ができます。また現在のサーバーの状態を元にテスト項目を生成することができます。

以下の動画を見て頂ければどんなものかが簡単にわかると思います。

[Goss in 45 seconds](https://github.com/aelsabbahy/goss#goss-in-45-seconds)

# インストールしてみよう

https://github.com/aelsabbahy/goss/releases からバイナリをダウンロードしてきてパスの通っている場所に置くだけです。(現在、Linux 向けのバイナリのみ)
もしくは以下のように実行して設置します。(64bit 環境の場合)

```
$ GOSS_VER=v0.3.4 && sudo -E curl -L https://github.com/aelsabbahy/goss/releases/download/$GOSS_VER/goss-linux-amd64 -o /usr/local/bin/goss
$ sudo chmod +rx /usr/local/bin/goss
```

ちなみに dgoss っていうファイルは docker 環境下で goss を簡単に手早く使うためのラッパーだそうです。別の機会に説明します。

# 使ってみよう

テストするために YAML ファイルをバリバリと書くのもいいんですが、goss には自動でテスト項目を生成してくれるコマンドがあるので、まずはそれを使って YAML を生成してみます。

```
$ goss -g sshd_goss.yaml autoadd sshd
```

と実行すると以下のような内容が出力されます。

```
Adding Process to 'sshd_goss.yaml':

sshd:
  running: true


Adding Service to 'sshd_goss.yaml':

sshd:
  enabled: true
  running: true


Adding User to 'sshd_goss.yaml':

sshd:
  exists: true
  uid: 122
  gid: 65534
  groups:
  - nogroup
  home: /var/run/sshd
  shell: /usr/sbin/nologin
```

なお、同じような内容の YAML が -g オプションで指定したファイルに出力されます。

```
$ cat sshd_goss.yaml 
service:
  sshd:
    enabled: true
    running: true
user:
  sshd:
    exists: true
    uid: 122
    gid: 65534
    groups:
    - nogroup
    home: /var/run/sshd
    shell: /usr/sbin/nologin
process:
  sshd:
    running: true
```

この出力された YAML ファイルを使ってテストを実施するには以下のように実行します。

```
$ goss -g sshd_goss.yaml validate
.........

Total Duration: 0.017s
Count: 9, Failed: 0, Skipped: 0
```

テストにかかった時間とテスト結果が出力されます。

---
他のオプションについては追い追い追記していきます。
PostgreSQLでSQLファイルの実行速度を計測する

PostgreSQLでSQLファイルに記述したSQL文の実行速度を計測したかったのでメモ。

## \timingを使う
`\timing`を使えば簡単に実行速度の計算ができます。

```:command
db=# \timing \i select.sql
```
実行速度の計測を解除するには、もう一度`\timing`を実行します。

```:command
db=# \timing
タイミングは off です。
```

## 出力されるレコードが多いとき
上記のコマンドだと出力されるレコードが多いときに余計に時間がかかります。
そこで、実行結果を外部のファイル保存するようにします。
`\o`を使えば、出力するファイルを指定できます。

```:command
db=# \o out.log
db=# \timing \i select.sql
タイミングは on です。
時間: 2421.986 ms
db=#
```

外部のファイルへの保存を解除するには、もう一度`\o`を実行します。

```:command
db=# \o
```
SharePointのリスト・ライブラリの表示を常にクラシック表示にする

※ 管理者ではなくフルコントロール権限ユーザーを対象にしています。

1. 変更したいリスト・ライブラリを開く
2. 画面右上の歯車メニュー、もしくはリボンメニューのリスト・ライブラリから「リストの設定」または「ライブラリの設定」をクリック
3. 「詳細設定」をクリック
4. 「リストの表示」という項目を探して「クラシック表示」にチェック
5. 「OK」をクリック

必要なすべてのリスト・ライブラリに対して行う必要があります。

管理者であればSharePointの管理センターから既定の表示を変更できますが
自分が管理者ではないので・・・。
[JavaScript] 簡単にパスワード認証(のようなもの)を作る

自分用メモのようなもの。「こうすれば突破できちゃうよ！」みたいなのがあればコメントをください。

#使用用途
このパスワード認証はあくまで**簡易的**なものです。そのため、使用用途はクイズや、ただ単にURLを入力しただけでアクセスされたくないようなページに使うのがいいと思われます。ユーザー認証などには使わないでください。しっかりとしたパスワード認証を作るなら、( https://www.websec-room.com/2015/03/15/2153 )などのページを参考にしてください。

#このパスワード認証のメリット
+ コード内にパスワードを記述しない(コードを見てもパスワードがわからない)
+ もちろん毎回認証することが可能

#このパスワード認証のデメリット
+ パスワードが不正解だった場合、コンソールに ERR_FILE_NOT_FOUNDエラーが出力される。

#方法
まずはパスワード認証ページを作ります。適当に「index.html」として以下のようなHTMLを書きます。

```HTML
<input id="pass" type="passsword"></input>
<button id="enter">決定</button>
```

パスワード認証に成功した場合のHTMLファイルを**bodyの中身だけで**作成します。また、この**ファイル名をパスワード**にするところがポイントです。[パスワード].htmlという名前にしましょう。abcdというパスワードなら、「abcd.html」といった具合です。

パスワードとなるファイル名はハッシュ化した方が安全だというコメントを頂きました。JavaScriptにはハッシュ関数がないので、ライブラリを入れるなどして対応してください。そこまでの安全性は求めずに利用するのであればそのままでもよいかと思われます。

続いてスクリプトを書きます。jQueryを使います。

```js
$(() => {
    const $pass = $("#pass");
    const $enter = $("#enter");
    $enter.on("click", () => {
        $.ajax({
            url: $pass.val() + ".html"
        }).then(html => {
            $("body").html(html);
        }).catch(() => {
            alert("パスワード認証に失敗しました");
            $pass.val("");
        });
    })
    $pass.on("keydown", e => {
        if(e.keyCode === 13) $enter.trigger("click");
    });
});
```


見ての通り、スクリプト内にパスワードは記述していません。また後半はEnterキーを押した場合の動作で、パスワード認証には直接関係のないおまけみたいなものです。`alert("パスワード認証に失敗しました");`のところは各自書き換えてください。

##ES6の解説
ES6をガンガン使って書いています。一応軽く説明しておきます。

###`() => {}`と`html => {}`
アロー関数というものです。名前の通り関数です。引数が一つの時はカッコが省略できるので`html => {}`という記述になっています。

###`const`
変数宣言です。varと似たようなものですが、関数スコープからブロックスコープになっています。また、`const`は定数を宣言し、書き換えられなくなります。似たようなもので`let`があります。こちらは書き換え可能ですが、今回は必要なかったので使っていません。

##jQueryの解説
続いてjQueryの解説です。

###`$().on()`
これはイベントを追加します。第一引数にイベントの種類(この場合は"click"と"keydown")を、第二引数に関数を渡します。また、この関数には引数は渡されます。キー関係のイベントの場合、keyCodeプロパティでキーコードが取得できます。またEnterキーのキーコードは13です。

###`$.ajax`
ajax通信をします、引数に渡すオブジェクトに`url: XXXXX`を渡して、そのURLのファイルを取得し、メソッドチェーンで`.done()`で成功した場合の関数を渡します。また、その関数の第一引数でファイルの内容を取得できます。メソッドチェーンで`.fail()`に失敗した場合の関数を渡します。
MacOSのMySQLのmy.cnfの場所とその修正方法

```
$ ls $(brew --prefix mysql)/support-files/my-*
/usr/local/opt/mysql/support-files/my-default.cnf
```
こちらにある内容がデフォルトになる

```
$ cp $(brew --prefix mysql)/support-files/my-default.cnf /usr/local/etc/my.cnf
$ vi /usr/local/etc/my.cnf
```
で各種設定を行い

```
$ mysql.server stop
$ mysql.server start
```

参考: 
http://qiita.com/hkusu/items/cda3e8461e7a46ecf25d
http://stackoverflow.com/questions/7973927/for-homebrew-mysql-installs-wheres-my-cnf
MySQLに絵文字をINSERTする時にエラーが発生するときの対応方法

カラム `text` に絵文字が入ることがあり、そのままではMySQLに入らなかったのでその対応方法をメモ

```my.cnf
[client]
   default-character-set = utf8mb4
[mysqld]
   sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
   character-set-server = utf8mb4
   collation-server = utf8mb4_unicode_ci
   skip-character-set-client-handshake
```
を追加して、MySQLを再起動
※ `skip-character-set-client-handshake` は、SQLインジェクションになりかねないとのことで推奨しないという話もある

```SQL
CREATE TABLE `qc_abematv_deletetime` (
  `userID` bigint(20) DEFAULT NULL,
  `messageID` varchar(255) NOT NULL PRIMARY KEY,
  `title` varchar(128),
  `text` text,
  `status` varchar(16),
  `categoryName` varchar(128),
  `postTime` datetime NOT NULL,
  `lastOperate` datetime NOT NULL,
  `operatorName` varchar(64),
  `subcategoryName` varchar(32),
  `penaltyCategoryName` varchar(32),
  INDEX index_lastOperate(lastOperate),
  INDEX index_postTime(postTime),
  INDEX index_status(status),
  INDEX index_categoryName(categoryName),
  INDEX index_title(title),
  INDEX index_operatorName(operatorName),
  INDEX index_subcaegoryName(subcategoryName),
  INDEX index_penaltyCategoryName(penaltyCategoryName),
  INDEX index_multi1(lastOperate, categoryName)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci
```

```
$ mysql orion -uroot < create_table.sql
ERROR 1071 (42000) at line 2: Specified key was too long; max key length is 1000 bytes
```

```
messageID varchar(255)
```
が問題で、`messageID varchar(250)` にしたら問題なくなった

ちなみに、テーブル作成のオプションを
```
ENGINE=MyISAM DEFAULT CHARSET=utf8
```
にすると `varchar(255)` でも問題なくINDEX作成できた
`messageID varchar(333)` はOK、`messageID varchar(334)` はNG

ここからインデックスサイズは
- UTF8だとVARCHAR(N)とすると　N*3
- UTF8MB4だとVARCHAR(N)とすると　N*4
- インデックスサイズのリミットは1000（デフォルト）

これだとフィールド長をかえられない場合は詰んでしまう。
そこで

```
CREATE TABLE `qc_abematv_deletetime` (
  `userID` bigint(20) DEFAULT NULL,
  `messageID` varchar(333) CHARACTER SET utf8 NOT NULL PRIMARY KEY,
  (略）
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci
```

とすれば問題なくいけた。
テーブルに文字コードを設定する方法

なお、`varchar(333)`を`varchar(334)`にするとエラーが発生した。

最後に

```SQL
ALTER DATABASE tb_name DEFAULT character set utf8mb4 COLLATE utf8mb4_bin;
```

も必須
Windows10でスマホアプリのパケットキャプチャでハマった記録

# Windows10とSoftAP
Windows 7以降のWindowsには、「SoftAP」というPCを無線LANアクセスポイントとしてセットアップする機能があります。こいつを使ってPCでスマホのインターネット接続をブリッジして、あとは例の如くWiresharkでキャプチャする予定でした。



SoftApの設定はコマンドプロンプトから行うのですが、何度やっても
```
ホストされたネットワークを開始できませんでした。
グループまたはリソースは要求した操作の実行に適切な状態ではありません。
```
が出てアクセスポイントを起動できないんですね。

と、ググってたら、
```netsh wlan show drivers```
で、使用しているPCのワイヤレスアダプタがSoftAPに対応しているか確認できることでしたので、打ち込んでみると
```ホストされたネットワークのサポート: いいえ```
と「このPCじゃアクセスポイントは起動できない」通告です。こりゃどうしようもない…

#モバイルホットスポット

ワイヤレスアダプタのメーカーのページに情報がありました。
[Why Hosted and Ad-Hoc Networks are Not Working on Windows® 10](https://www.intel.com/content/www/us/en/support/network-and-i-o/wireless-networking/000023257.html?_ga=2.217507798.1702502667.1503019503-1024475767.1503019503)
どうやらWindows 10 Anniversary Update以降ではドライバの方式が変わり、従来のSoftAPは廃止していく方向みたいです。んで、代わりに新機能の「Mobile Hotspot」を使えとのこと。

モバイル化を推し進めるMicrosoftが、この辺の機能をスマホのテザリング的な仕様に近付けていってる感じですね。
コンパネではなくUAPの「設定」アプリから「ネットワークとインターネット」 > 「モバイル ホットスポット」からワンスイッチで起動できます。これをやると専用の仮想ネットワークアダプタが追加されます。Wiresharkではこいつをキャプチャします。（当方環境では「ローカル エリア接続* 6」）


あと、忘れずにモバイルホットスポットに使用するアダプタの共有設定を許可しておく必要があります。
同画面から「アダプターのオプションを変更する」を開き、該当のワイヤレスアダプタのプロパティから「共有」タブで「ネットワークのほかのユーザーに、このコンピューターのインターネット接続をとおしての接続を許可」しておくこと。
【Mac OS】import matplotlibした時にPython is not installed as a framework.と出た時の対処法

# 環境
Mac OS 10.12.9
Python 3.6.*
matplotlib 2.0.2

# matplotlibとは
pythonでグラフを描ける便利ツール

# Macユーザーが初めてmatplotlibを使う時に引っかかる罠
おそらく、なんの設定ファイルを作らずにmatplotlibを使おうとすると以下のようなエラーが吐かれるはずです。

```
RuntimeError: Python is not installed as a framework. The Mac OS X backend will not be able to function correctly if Python is not installed as a framework. See the Python documentation for more information on installing Python as a framework on Mac OS X. Please either reinstall Python as a framework, or try one of the other backends. If you are using (Ana)Conda please install python.app and replace the use of 'python' with 'pythonw'. See 'Working with Matplotlib on OSX' in the Matplotlib FAQ for more information.
```

# 解決法

このstack over flowを参考にしました。
[Installation Issue with matplotlib Python [duplicate]](https://stackoverflow.com/questions/21784641/installation-issue-with-matplotlib-python)

~/.matplotlib/以下にmatplotlibrcというファイルを作って以下のコードを追加します。

```python:matplotlibrc
backend: TkAgg
```
これを保存すればすぐに問題なくimportできるようになります。

2年前くらいにも同じところで詰まったのですが、
すっかり忘れて新しいmacでも同じエラーに引っかかりました。

お疲れ様でした。
railsのローカル環境のDBを確認する方法

railsをローカル環境で開発していてDBのカラムを確認したい時の方法。

# Browser for SQLiteのDL

http://sqlitebrowser.org/

まずGUIでDBを確認できるツールのBrowser for SQLitをDL

# ローカルのDB情報のあるところ

ローカルではdbのSqliteファイルにDBの情報があります。
余計なOptionalはやめてくれ


# Optional型

Optional型はSwift入門者には結構ハマる点のようで、Qiitaにもよく記事が上がっているのを見かけます。

もちろんかなり趣味も大いにあると思うけれど、「空にできるのがOptional！」などという表現には、本質的でないと感じます。あくまで、nilは「空である」ことを意味する値だと思っています。

先日こんなツイートがありました。とても的を射ていて、わかりやすいと思います。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">0とnullの違い <a href="https://t.co/MbZQEVXWSX">pic.twitter.com/MbZQEVXWSX</a></p>&mdash; こーすけ (@travelgray) <a href="https://twitter.com/travelgray/status/927749091731259395?ref_src=twsrc%5Etfw">2017年11月7日</a></blockquote>

ただし、Swiftでは少し違うと思っていて、
Swiftでのnullは、本当に何もない、看板すらない状態だと思います。
そしてこの看板がOptional<Int>であり、数字または `nil` がセットされます。

以降シチュエーションはすこし極端目に書きますが、もちろん似ていてもそうじゃないときも往々にしてあると思うので、ご容赦ください。

# Optionalはめんどくさい

そもそも、Optionalは面倒くさい。
Optionalを画面に反映したり、サーバーに送ったりするには、必ずUnwrapしなければいけないので、直接の値のほうが嬉しい。

もちろん、Optionalが必要なシーンも多くありますし、自分もかなりの頻度で使います。

# 例：`Bool?` 型

例えば、`Bool?` 型の値の意味ってなんだろう？

```swift
let isValid: Bool?
```

さて、このコードで `isValid` が `nil` だった時、その状態は果たしてvalidなのかinvalidなのか？

# nilの意味

Optionalはnilまたは値を入れられる型だと考えます。
nilは何かしらの意味を持つべきで、意味が無いならOptionalを使うべきではない。

例えば、サーバーからのレスポンスは、届くまでに時間がかかる。この時に `Bool?` 型を使うのであれば、以下のようにみなせます。

|値|意味|
|:-:|:-:|
|nil|通信前、通信中|
|true|通信の結果、true|
|false|通信の結果、false|

値を入力してもらう画面の場合、

|値|意味|
|:-:|:-:|
|nil|未入力|
|true|入力の結果、true|
|false|入力の結果、false|

もちろん、Bool以外についても同じことが言えるし、こういうOptionalは積極的に使うべきだと思います。

ただ、例えばオブジェクトがvalidかどうかはどんな状態かによらず分かりたいし、 `_isValid = nil` がvalidかinvalidかはビジネスロジック依存だと思うので、getterなどで、外部へのインターフェースは非オプショナルのほうが良い場合も多いと思います。
これで、意味がより明確になります。

```swift
private var _isValid: Bool?
var isValid: Bool {
    return _isValid ?? false
}
```

# デフォルト引数としてのnil?

```swift
init(color: UIColor? = nil) {
    if let color = color {
        self.color = color
    } else {
        self.color = .white
    }
}
```

引数がないことを表すnilです。が、これは本当に意味があるのでしょうか？

個人的にはプログラムの中で「引数がない」という情報はさほどどうでもよく、挙動の中で「どんな色であるか」という情報だけが大事だと考えます。
よって、以下のように書く方を好みます。

```swift
init(color: UIColor = .white) {
    self.color = color
}
```

`??` 演算子と同じで、「デフォルト値である」ことがわかりやすくて良い気がしています。

# `??` 演算子

`??` 演算子はアンラップを行うというより、Optiona -> 非Optionalへの変換だと感じています。

```swift
optionalValue ?? defaultValue
```

nilの時のデフォルト値を右辺に設定することで、非Optionalとみなせます。

# エラーの時にnil？

関数の返り値で、「エラーの時にnilになります」という運用はどうでしょうか。自分は、throwsのほうが良い場合が多いと思います。

まず、throwableなメソッドの呼び出し時に、Optionalに変換することは簡単です。

```swift
// エラーを無視してOptionalに変換する、エラー時はnil
let a = try? throwable()
```

更に、nilだけだとエラーの内容はわかりませんが、throwすればcatchして中身を見ることができます。

もちろん実装コストはかかるので、エラーが明らかなときや何でも良い時、忙しいときは、Optionalでよいです。

# でも結局あなたの趣味なんでしょ？

もちろん、その通りです。

例えばUILabelのtextはOptional型ですが、自分が実装するならOptionalにしないし、あまり何故かわかっていないです。

でも、自分は例えば登録後にサーバーに保存するユーザー名を `""` でなくて `nil` にする必要はないと思うし、 `""` にしてから保存します。

議論するの好きなので、どしどしお待ちしています！
rex0220 テーブル行複写プラグイン

kintone のテーブル行を複写できるプラグインです。

- 複数のサブテーブルに、行複写機能を追加
- 添付ファイル、計算項目以外のテーブル内項目を複写可能。
- 複写対象項目を指定。
- 行複写時、ルックアップ項目を自動取得します。
- PC・スマホ対応。

[rex0220 stores](https://rex0220.stores.jp)で、販売中です。

Ver.6 変更点
・プラグイン設定のダウンロード＆アップロードで、IE チェックを削除
・プラグイン設定のグリッドライブラリ変更

# PCの行複写例

テーブル行の右端にある行複写ボタンをクリックして、複写します。

<img width="781" alt="2017-08-18_09h57_33.png" src="https://qiita-image-store.s3.amazonaws.com/0/100572/3fb3d380-a9e9-fac7-9eca-c59832f608ae.png">

# スマホの行複写例

テーブルのボタンエリアに、行複写ボタンが表示されます。

<img width="281" alt="2017-08-18_10h32_21.png" src="https://qiita-image-store.s3.amazonaws.com/0/100572/f054c1e6-1e64-e49f-7614-84fdfe013807.png">


#プラグインの追加

- 「kintone システム管理 > プラグイン」で追加します。
- 「アプリの設定 > プラグイン」で、アプリに追加します。


<img width="1123" alt="2017-08-18_10h38_51.png" src="https://qiita-image-store.s3.amazonaws.com/0/100572/807ad522-b2a4-611b-c7c2-cbea4a8f2add.png">



#プラグインの設定

- 対象テーブルを選択し、編集ボタンをクリックして、複写項目を選択します。
- 「保存する」をクリックします。

※フォーム変更時は、本番環境にフォーム変更を反映後に、本プラグイン設定を行ってください。


<img width="1124" alt="2017-08-18_10h41_47.png" src="https://qiita-image-store.s3.amazonaws.com/0/100572/c7f84247-ed93-b298-6a2d-130c4bf9482a.png">


- 複写項目を選択後、保存ボタンをクリックします。


<img width="1127" alt="2017-08-18_10h44_15.png" src="https://qiita-image-store.s3.amazonaws.com/0/100572/507f62cb-3853-d12e-4df1-77a26560f386.png">



#注意事項
- 既に、JavaScript によるカスタマイズを行っているアプリの場合、処理が競合して、エラーになる場合があります。その場合は、該当するアプリでプラグインの使用を中止してください。
macOSのCH340/CH341ドライバのアンインストール方法

格安のArduino UNOクローンでよく採用されているCH340/CH341ですが、シリアルポート利用後にスリープ・レジュームを行ったときの挙動が不安定な気がします。このドライバが犯人かどうかはわかりませんが、アンインストール方法を紹介します[^1]。

[^1]: `ReadMe.pdf`にも書いてある内容です、念のため

- `/System/Library/Extensions/usbserial.kext`を削除 （古いドライバの場合）
- `/Library/Extensions/usbserial.kext`を削除 （新しいドライバの場合、V1.4はこちら）

上記、sudo権限が必要です。
Laravel で chunk を途中で止めたいとき。

今まで最後まで回してばかりで、気にもしていなかったのですが、昨日 `chunk()`で回している間に辛い出来事があって、途中で止めたくなったのでどうやって止めるのかをさらっと調べました。

## 結果

`chunk()` に渡しているコールバック関数内で `return false;` すれば途中で止めることができる。

``` php:sample.php
<?php
Flight::chunk(200, function ($flights) {
    foreach ($flights as $flight) {
        // 何か処理
    }
    return false; // 最初の200件で取得終了
});

```


## おまけ

API ドキュメントにも特に記載はないけれど、ソース見たらこんな感じでした。
[ソースへのリンク](https://github.com/laravel/framework/blob/5.4/src/Illuminate/Database/Concerns/BuildsQueries.php#L18)


```php:chunk.php
<?php
/**
 * Chunk the results of the query.
 *
 * @param  int  $count
 * @param  callable  $callback
 * @return bool
 */
public function chunk($count, callable lback)
{
    $this->enforceOrderBy();
    $page = 1;
    do {
        // We'll execute the query for the given  and get the results. If there are
        // no results we can just break and rn from here. When there are results
        // we will call the callback with the ent chunk of these results here.
        $results = $this->forPage($page, nt)->get();
        $countResults = $results->count();
        if ($countResults == 0) {
            break;
        }
        // On each chunk result set, we will  them to the callback and then let the
        // developer take care of everything in the callback, which allows us to
        // keep the memory low for spinning ugh large result sets for working.
        if ($callback($results) === false) {
            return false;
        }
        $page++;
    } while ($countResults == $count);
    return true;
}

```
Oracle Databaseのデータをcsv化するpythonスクリプト

#目的
Oracle Databaseのディクショナリ情報を、
pythonのライブラリ(cx_Oracle)を使用して
汎用データ取得スクリプトです。

#なぜ？
sqlplusのspoolで取得するのが一般的だと思いのですが
やはり遅いですよね？
毎回、取得データに合わせてスクリプトを書くのは面倒ですよね？
取得したは良いがフォーマットがガタガタで再取得なんて事も多いですよね？

#作成したスクリプト

```python:staticinfo.py
#!/usr/bin/python
import cx_Oracle
import os
import sys
import csv

USER='******'            #環境に合わせて変更してください(system)
PASS='********'          #環境に合わせて変更してください(manager)
HOST='***.***.***.***'   #環境に合わせて変更してください(192.168.0.1)
PORT='****'              #環境に合わせて変更してください(1521)
SERVICE_NAME='****'      #環境に合わせて変更してください(ORCL)
FETCH_ROWS=100           #環境に合わせて変更してください

argv = sys.argv
argc = len(argv)
if argc != 2:
  print('Usage: %s filename or tablename' % argv[0])
  quit()

print("execution..." + argv[1])

p1 = argv[1]
name, ext = os.path.splitext(p1)

if ext == ".sql":
  #SQL文取得
  f = open(p1)
  sql = f.read()
  f.close()

  out_file_name = name + '.csv'
else:
  #SQL文作成
  sql = 'select * from %s' % p1

  out_file_name = p1.replace('$','_') + '.csv'

with cx_Oracle.connect(USER,PASS,HOST+':'+PORT+'/'+SERVICE_NAME) as conn:
  #SQL文実行
  cur_detail = conn.cursor()
  cur_detail.execute(sql)

  #カラム名を取得
  csv_header = [str[0] for str in cur_detail.description]

  #データ部を取得
  f = open(out_file_name, 'w')
  writer = csv.writer(f, lineterminator='\n', quoting=csv.QUOTE_ALL)
  writer.writerow(csv_header)
  while 1:
    csv_detail = cur_detail.fetchmany(FETCH_ROWS)
    if len(csv_detail) == 0:
      break
    writer.writerows(csv_detail)
  cur_detail.close()
```

#実行方法

```shell-session
$ python staticinfo.py dba_users
```

・環境変数(ORACLE_HOME/LD_LIBRARY_PATH)等を指定する必要があります。
・カレントディレクトリに(dba_users.csv)という目的のファイルが作成されます。
・事前にスクリプトを用意しておけば、スクリプトの結果をcsvにするとこも可能です。


#面倒なので
下記のようなshellを作成して、一気に出力をします。

```sh:staticinfo.sh
#!/bin/sh
export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=$ORACLE_BASE/product/12.1.0.2/client_1
export LANG=ja_JP.UTF-8
export NLS_LANG=Japanese_Japan.AL32UTF8
export LD_LIBRARY_PATH=$ORACLE_HOME/lib

python staticinfo.py dba_users
python staticinfo.py dba_profiles
python staticinfo.py dba_data_files
python staticinfo.py dba_temp_files
python staticinfo.py dba_tablespaces
python staticinfo.py dba_segments
python staticinfo.py dba_roles
python staticinfo.py dba_role_privs
python staticinfo.py dba_sys_privs
python staticinfo.py dba_tab_privs
python staticinfo.py gv\$database
python staticinfo.py gv\$instance
python staticinfo.py gv\$log
python staticinfo.py gv\$logfile
python staticinfo.py gv\$controlfile
python staticinfo.py gv\$parameter2

python staticinfo.py 01_tablespace_capacity.sql
python staticinfo.py 02_datafile_capacity.sql
python staticinfo.py 03_tempfile_capacity.sql
```

#最後に
汎用的にしたかったので、こだわった点は、SQLファイルの実行とカラム名の自動取得です。
もちろんユーザデータの取得する事も可能ですので
カスタマイズ次第で、可能性を秘めているスクリプトになったと思っています。

#追記
「cx_Oracle」から「python-oracledb」に、なったので修正が必要
ある日突然cronの設定を行った

## 概要
サーバーのシャットダウンを忘れることがあるため、シャットダウンをするためのcronを設定してほしいとのことだった。:frowning2:
環境：centos 6.5

## cronとは
指定時間や時間毎（1時間単位など）にプログラムを実行することができる。
crontabコマンドで設定する方法と `/etc/cron.d/` 配下に設定ファイルを配置して設定する方法がある。
crontabで設定する場合、 `crontab -e` で設定を書いて、`crontab -l`で設定一覧を見ることができる。
`crontab -r` を使用するとすべての設定が削除される（タイプミスなどが怖い）ので、2番目のファイルに記載する方法のほうがよさげ。  

## crontabで設定する
### 1. helloを1分毎に出力する設定を書く
手始めに動作確認:point_up_tone2:
`crontab -e` を入力して編集モードにする。vimなどでファイルが開くので、設定を記載する

```
*/1 * * * * echo "hello" >> /home/vagrant/hello0101.txt
```
上記を保存して、cronを再起動すると/home/vagrantの配下のhello0101.txtに毎分書き込まれることが確認できる
### 2. 24時にシャットダウンする設定
ファイル権限は644とかに変更しておく。
/home/vagrant/shutdown.sh

```bash:shutdown.sh
#!/bin/bash
sudo shutdown -h now
```
crontab -e で下記を書き込む

```
00 * * * * /home/vagrant/shutdown.sh
```
cron を再起動する

## /etc/cron.d/ 配下に設定ファイルを置いて実行する
### 1. 24時にシャットダウンする設定
ファイル権限は644とかに変更しておく。

実行ファイル
/home/vagrant/shutdown.sh

```bash:shutdown.sh
#!/bin/bash
sudo shutdown -h now
```

/etc/cron.d配下にcronの設定ファイルを配置する		
名前は適当にいいっぽいので今回はshutdown
/etc/cron.d/shutdown ファイルをつくって下記を書き込む

```
SHELL=/bin/bash
MAILTO=""
00 * * * * root /home/vagrant/shutdown.sh
```

cronを再起動する

## ログの確認
```
cat /var/log/cron
```
## cron再起動
```
service crond restart
```
or

```
/etc/rc.d/init.d/crond restart 
```
or

```
/etc/init.d/cron restart
```
(debian?)

## 設定書式
crontabで設定

```
 分　時　日　月　曜日　コマンド
```

ファイルで設定

```
 分　時　日　月　曜日　ユーザー コマンド
```
portainer(CentOS7)構築メモ


## アーキテクチャ,OS,リソース確認

```
# uname -a #システム情報
# cat /etc/redhat-release #redhat系の場合、OSイメージ
# free -h #memory
# df -h #HDD
```

## useradd

```
# useradd hogehoge -g wheel -m #個人ユーザ作成
```

## /etc/hosts.allow /etc/hosts.deny
ここはまだ設定してない

/etc/hosts.allow

```
ALL : 127.0.0.1
sshd : ALL
```

/etc/hosts.deny

```
ALL : ALL
```

## network

```
# hostnamectl set-hostname tool_srv01 #host名
# nmcli d #device名確認
# nmcli c modify enp3s0f0 connection.autoconnect yes #起動時にnicをupする
# nmcli c modify enp3s0f0 ipv4.addresses 192.168.100.200/24 #nicのip設定
# nmcli c modify enp3s0f0 ipv4.gateway 192.168.100.1 #defaultgw
# nmcli c modify enp3s0f0 ipv4.dns 192.168.100.1 #nicのdns設定
# nmcli c modify enp3s0f0 ipv4.method manual #固定IP (DHCP auto)
# nmcli c down enp3s0f0; nmcli c up enp3s0f0 #nic毎の再起動
# nmcli d show enp3s0f0 #nic設定確認
# ip a #ipの設定確認 
# cat /etc/sysconfig/network-scripts/ifcfg-enp3s0f0 #こっちのファイルに反映されてる
```


## firewall

firewalled無効化

```
# systemctl stop firewalld.service
# systemctl mask firewalld.service #
# systemctl status firewalld

firewalld.service                           masked
```

iptables

```
# yum -y update #packageを最新化
# yum -y install iptables #install

# systemctl start iptables-services #centos7ではiptablesではなく、iptables-servicesをインストールする
# systemctl enable iptables
# systemctl list-unit-files | grep iptables
iptables.service                            enabled 
```

とりあえず起動だけ、設定は以下ファイルに実施後、restart
/etc/sysconfig/iptalbes


## ssh
/etc/ssh/sshd_config

```
PermitRootLogin no
```

sshd再起動

```
# systemctl restart sshd
```

## SELINUX
設定後rebootが必要

/etc/selinux/config

```
SELINUX=disabled   # disabled に変更
```

## install docker

```
# yum install -y epel-release #epelリポジトリ インストール
# yum install -y docker-io #docker install
# docker -v #version
Docker version 1.12.6, build 88a4867/1.12.6
# systemctl start docker #docker起動
# systemctl status docker
# systemctl enable docker #起動時にdockerを起動
```

## install portainer

```
# yum install -y git
# git --version
git version 1.8.3.1
# cd opt
# git clone https://github.com/portainer/portainer
# docker run -d -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock portainer/portainer
# docker ps -a #起動を確認
CONTAINER ID        IMAGE                 COMMAND             CREATED             STATUS              PORTS                    NAMES
9612d3054944        portainer/portainer   "/portainer"        59 minutes ago      Up 4 minutes        0.0.0.0:9000->9000/tcp   hopeful_murdock
# docker update --restart=always 9612d3054944 #再起動時にこのコンテナを立ち上げる,restartはrunのオプションで最初から指定も可
```

1. http://[IPアドレス]:9000 
2. adminパスワード設定画面
3. Connect Portainer to a Docker engine or Swarm cluster endpoint
	* Manage the Docker instance where Portainer is running →ローカルのdockerインスタンスを管理する場合はこちらを選択
	* Manage a remote Docker instance
bootstrap4での5カラム使用


bootstrap4で5カラムを使用する場合は、
以下scssを追加する。
bootstrap3のときとの違いはflexの記述も追加すること。

```
//5カラム定義
.col-15, .col-sm-15, .col-md-15, .col-lg-15 {
    position: relative;
    min-height: 1px;
    padding-right: 10px;
    padding-left: 10px;
}
.col-15 {
    width: 20%;
    flex: 0 0 20%;
    float: left;
}
@media (min-width: map-get($grid-breakpoints, sm)) {
    .col-sm-15 {
        width: 20%;
        flex: 0 0 20%;
        float: left;
    }
}
@media (min-width: map-get($grid-breakpoints,md)) {
    .col-md-15 {
        width: 20%;
        flex: 0 0 20%;
        float: left;
    }
    .col-md-offset-15 {
        margin-left: 4.3333333%;
    }
}
@media (min-width: map-get($grid-breakpoints, lg)) {
    .col-lg-15 {
        width: 20%;
        flex: 0 0 20%;
        float: left;
    }
}
```

あとは通常どおり使用する

```
<div class="row">
	<div class="col-sm-15">
		<p> 1 </p>
	</div>
	<div class="col-sm-15">
		<p> 2 </p>
	</div>
	<div class="col-sm-15">
		<p> 3 </p>
	</div>
	<div class="col-sm-15">
		<p> 4 </p>
	</div>
	<div class="col-sm-15">
		<p> 5 </p>
	</div>
</div>
```
postgresqlのpsqlのpager設定

たまに環境を再構築すると毎回調べなおしているので、Qiitaにメモ。

Ubuntuでpostgresql-clietnをinstallして、psqlを使う際に、
queryの結果が、そのままだらだらっと標準出力せずに、Enterを押すと消えてしまうようにデフォルトでなっています。

~/.psqlrc
に、
\pset pager off
にしておくと改行されなくなります。

\pset pager
を打つたびに、切り替わります。

~/.bashrc
に
set pager more
にしておくと、lessじゃなくてmoreを使うようになります。

同様に、.psqlrcの中でも環境変数が設定できるので、
~/.psqlrc
\setenv pager LESS
\setenv LESS -S
としておくと、pager onのときは、レコードごとの改行がされずに、右側が切れて表示されます。（terminalを横に広げると見れる）

参考ページ
[psqlのマニュアル](https://www.postgresql.org/docs/9.3/static/app-psql.html)
[OSSブログ](https://oss.sios.com/yorozu-blog/pgsqlcommand)
[fish]バックグラウンドで実行しているジョブの終了を待つ

bashなどでは`&`で実行したジョブを待つための`wait`がありますが
fish では `wait` コマンドが実装されていません。
そこでバックグラウンドで実行しているジョブを待つためのfunctionを自作してみました

# 作ったもの

```sh:fwait.fish
function fwait
  while true
    set -l bg_jobs (jobs -p $argv | string match -r "\d*")

    if test -z "$bg_jobs"
      break
    end
  end
end
```


`jobs -p` は 現在バックグランドで実行しているジョブのPIDのみを表示します

```
$ fish -c "sleep 15; echo OK" &
$ jobs
Job	Group	State	Command
1	65801	running	fish -c "sleep 15; echo OK" &
$ jobs -p 
Process
65801
```

`string match -r "\d*"` は 正規表現に一致するか判定し、
一致したものを返してます

```
$ jobs -p | string match -r "\d*"
65801
```

`test -z "$bg_jobs"`で bg_jobsが空か判定し、
空だったら(=バックグランドで実行しているジョブがなかったら)while文を抜けるようにしています


# 動作確認

動作確認用のコード。[こちらの記事](http://qiita.com/jbucaran/items/9e41da125a9ed3182141)を参考にさせていただいてます

```sh:test.fish
set -l urls "https://"{google,twitter,youtube,facebook,github,qiita}".com"

for url in $urls
    fish -c "curl -Lw \"$url: %{time_total}s\n\" -o /dev/null -s $url" &
end

zwait

echo "all OK!"
```

```shell-session
# fwaitあり
$ time -p fish test.fish
https://qiita.com: 0.345s
https://google.com: 0.515s
https://github.com: 1.085s
https://facebook.com: 1.237s
https://youtube.com: 1.725s
https://twitter.com: 2.084s
all OK!
real         2.46
user         1.39
sys          1.73

# fwaitなし
$ time -p fish test.fish
all OK!
real         0.11
user         0.04
sys          0.04
https://qiita.com: 0.363s
https://google.com: 0.596s
https://facebook.com: 1.055s
https://twitter.com: 1.422s
https://youtube.com: 2.045s
```


--------------------------------------
 参考: [fish-shellによる並行処理の方法](http://qiita.com/jbucaran/items/9e41da125a9ed3182141)
数値のカウントについて

プログラミング初心者です。お世話になります。

ボタンのクリックに応じて数値のカウントをするプログラムを書いています。

悩んでいるのが、

以下のプログラムにて、カウントした数値を代入する変数 "z" がメンバ変数であれば
カウントされるのですが、ローカルだとカウントされないということです。

そこで聞きたいのが、
なぜローカルだとカウントされないのかということです。

以下のことは理解しています。（合っているかわかりませんが）
メンバ変数はそのクラス全体で使えるもの。ローカルはそのメソッドでのみ使えるもの。
というように理解しています。

    public partial class Form1 : Form
    {
        int z;

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Form f = new Form();

            f.Click += new EventHandler(button1_Click);

            z += 1;

            richTextBox1.Text = z.ToString();
        }
    }
[fish] awkのスクリプト部分を履歴から補完する

## はじめに

`awk`の使い方がうろ覚えで，あれってどうやるんだっけ？　と検索し直すことが多かったので何とかしたい．

`peco`で過去の`awk`履歴を探すのもありだけど，`fish`なので補完で解決できたらいいんじゃないかな？ と思い立って補完書いてみました．

![complete_awk.mov.gif](https://qiita-image-store.s3.amazonaws.com/0/124405/2eae1aa5-664d-895b-0e8d-b41e2f46c122.gif)

## 補完設定

補完設定は以下のようにしました．

```sh:~/.config/fish/completions/awk.fish
function __complete_awk_is_quoted # 入力中の語は ' か？
    test (commandline -tc) = \'
end

function __complete_awk_quoted_expr # awk '...' を履歴から探して ...　の部分を返す
    builtin history \
    | string match -r "awk +'(?:\\'|[^'])+'" \
    | awk '{$1=""; print $0}' \
    | string trim \
    | string trim -c\'
end

complete -xc awk -n __complete_awk_is_quoted -a '(__complete_awk_quoted_expr)'  

# デフォルトの補完メッセージが長々しいので上書き
complete -c  awk -s f -d 'awk program file'
complete -xc awk -s F -d 'input field separator'
complete -xc awk -s v -d 'var=value'
```

最後の4行は本題と関係ないのでお好みで．
これを定義した状態で`awk '`と入力し，`Taｂ`を押すと過去に使ったawkスクリプトが補完されます．

## その他

### Q. `'`の入力は必須？

必須っぽいです．
本当は`awk `まで打って`Tab`を押したら補完できるようにしたかったのですが，補完候補に例えば`'{print $0}'`を設定すると`'`がエスケープされて`\'{print\ \$0}\'`になってしまったため断念．
`awk '`まで打っておく必要があります．

### Q. `peco`みたいな絞込みがしたいんだけど

`fish`だと，`Tab`の代わりに`Shift + Tab`で補完モードに入ると部分一致検索できます．

![shift_complete_awk.mov.gif](https://qiita-image-store.s3.amazonaws.com/0/124405/2bf4257d-fbdf-e63b-338e-fd8ee47c10f8.gif)

## おわりに
`awk`の部分を`sed`にすれば`sed`も同様に補完できそうです．ただ，今回の補完関数ではダブルクォーテーションで渡された引数は拾ってないので改良が必要かも．

`grep`の検索条件も補完できそうですが，`grep`はオプションも指定されていることが多いので，履歴からコマンドを抽出する部分にも改良が必要ですね...

## 追記 (2017/08/18)
`awk '{print `のように，途中までコマンドを打った状態からも補完が効くようにしました．`string`コマンド大活躍．

```sh
function __complete_awk_is_quoted # 文字列の入力中か?
    string match -- "'*" (commandline -tc)
end

function __complete_awk_quoted_expr # awk '...' を履歴から探して入力中の語を含む ... を返す
    set -l input (string sub -s 2 (commandline -tc))

    builtin history \
    | string match -r "(?<=awk ) *'(?:\\'|[^'])+'" \
    | string trim \
    | string trim -c\' \
    | string match "*$input*"
end

complete -xc awk -n __complete_awk_is_quoted -a '(__complete_awk_quoted_expr)'  
```
init.elにいつの間にかcustom-set-*が追加される件

長年、`init.el`にいつの間にか`custom-set-variables`や`custom-set-faces`が追加される現象に悩まされていました。

## init.elにいつの間にか追加され、削除してもまた復活する
M-x customizeをしていないにもかかわらず、
こんなかんじのコードがinit.elに追加されます。

```el
(custom-set-variables
  '(foo "bar"))
```

# 原因

私は、[init-loader](https://github.com/emacs-jp/init-loader)を使ってinit.elを分割しているのですが、init.el **以外** のファイルに`custom-set-variables`や`custom-set-faces`の記述を書いていたのでした。

- init.elが読まれる
- init-loaderから他のファイルが読まれる
- そのファイルに`custom-set-*`が記載されている
- これにより、customizeした状態になる
- Emacsがcustomizeした内容をinit.elに書き戻す

というような動作になっていたと思われます。

# 対応

よく理解せずにネットからコピってきたコード片に`custom-set-variables`や`custom-set-faces`があったので、`setq`に置き換えたり、不要なものは削除したりしました。


これで、init.elが意図せず書き換えられる事象は解消しました。

# おわりに

ずっと、Emacsがどこかに、`M-x customize`したときの情報を隠し持っていて、それをinit.elに反映しているのだと思いこんでいたので、なかなか解決に至りませんでした。

同じ事象に悩む人がひとりでも助かると幸いです。

```el
;; init.elを分割していない人は気にしないでいいと思います。
```
Chef Client+BerkshelfでJenkinsを入れてみた

## 久しぶりのChef

普段はCircleCIばかり使っているのですが、久しぶりにChefを使ってJenkinsをインストールすることになりました。久々すぎて完全に浦島太郎状態なのですが、今回はChef Client Local ModeとBerkshelfを使ってJenkinsをインストールしてみます。Chef Soloの時代が懐かしいです、、、

## 必要なファイル
最新のJenkinsを動かすには、Java8が必要です。Jenkinsのcookbookの中にもJavaのrecipeが入っているのですが、今回はJavaもBerkshelfを使ってインストールしてみます。
また、/etc/sysconfig/jenkinsファイルを編集して、タイムゾーンをJSTに設定するようにします。

ディレクトリ構成はこんな感じです。

```
Berkshelf
  |
  |
cookbooks/ ---- jenkins_server/ ------- metadata.rb
                                  | 
                                  |---- recipes/    ---- default.rb
                                  |
                                  |---- attributes/ ---- default.rb
                                  |
                                  |---- files/      ---- config_jenkins
```

### Berkshelf

```rb
site :opscode

cookbook 'apt'
cookbook 'windows'
cookbook 'java'
cookbook 'jenkins'
cookbook 'yum-epel'
```

### metadata.rb

```rb
name 'jenkins_server'
depends 'java'
depends 'jenkins'
```
metadata.rbのdependsでcookbookの依存関係を定義しておかないと、cookbookが見つからないとのエラーが出ます。軽くハマりどころでした。

### recipes/default.rb

```rb
include_recipe 'java'
include_recipe 'jenkins::master'

# 設定ファイルをコピーする
cookbook_file 'config_jenkins' do
  path '/etc/sysconfig/jenkins'
  action :create
  notifies :reload, 'service[jenkins]'
end
```

### attributes/default.rb

```rb
node.default['java']['install_flavor'] = 'openjdk' # ['oracle', 'oracle_rpm', 'openjdk', 'ibm', 'windows']
node.default['java']['jdk_version'] = '8'
```

### files/config_jenkins

```
......
(省略)
......

## Type:        string
## Default:     "-Djava.awt.headless=true"
## ServiceRestart: jenkins
#
# Options to pass to java when running Jenkins.
#
JENKINS_JAVA_OPTIONS="-Djava.awt.headless=true"
JENKINS_JAVA_OPTIONS="$JENKINS_JAVA_OPTIONS -Djenkins.install.runSetupWizard=false"
JENKINS_JAVA_OPTIONS="$JENKINS_JAVA_OPTIONS -Dorg.apache.commons.jelly.tags.fmt.timeZone=Asia/Tokyo" # タイムゾーンをJSTにする

......
(省略)
......
```

## レシピを実行する
上記のファイルが作成できたら、
`berks vendor cookbooks`で必要なcookbookがcookbooks/以下にインストールされます。最後に、`sudo chef-client --local-mode --runlist 'recipe[jenkins_server]'`でJenkinsが起動します。
Bandicamのビデオ出力形式をmp4に変更する方法

![BAND1.PNG](https://qiita-image-store.s3.amazonaws.com/0/192842/f83b8987-9b97-4a33-343b-81a441f209a0.png)
![BAND2.PNG](https://qiita-image-store.s3.amazonaws.com/0/192842/3a90d2ef-e00c-d4e7-ff82-ec5b826e479f.png)
Unityなどの撮影を行う場合はフレームレートを60に変更したほうがいいと思われます。
Swift3 Dictionaryの値がnilの要素を削除する方法

Ruby on Railsで言う所の [Hash#compact](https://apidock.com/rails/Hash/compact
) のようなものは、Swiftにはなさそうなので、調べてみた。

ちなみに値のOptionalもunwrapする。

```Swift
let nullableValueDict: [String : Any?] = [
    "a": 1,
    "b": "2",
    "c": nil,
    "d": nil,
    "e": 5
    ]
// ["b": Optional("2"), "e": Optional(5), "a": Optional(1), "d": nil, "c": nil]

let dict = nullableValueDict.reduce([String : Any]()) { (dict, e) in
    guard let value = e.1 else { return dict }
    var dict = dict
    dict[e.0] = value
    return dict
}
// ["b": "2", "e": 5, "a": 1]
```
reduceを使ったパターンがシンプルで良いかなと。ワンライナーで簡単にできないかなと思ったがそうはいかなかった。

頻繁にやる必要があれば、Dictionaryの `extension` を作った方が良さそう。

### 参考

- 
https://stackoverflow.com/questions/27044095/swift-how-to-remove-a-null-value-from-dictionary
Stochastic Gradient Descent > keyword > is coalesced | the learning rate schedule | (batch size B) with values above 10 taking advantage of the speed-up of matrix-matrix products over matrix-vector products

How large should the batch size be for stochastic gradient descent?
https://stats.stackexchange.com/questions/140811/how-large-should-the-batch-size-be-for-stochastic-gradient-descent

sabalabaによる回答の中で知らなかった単語など

### be coalesced 

> your algorithm will run faster if the memory accesses **are coalesced**, i.e. when you read the memory in order and don't jump around randomly.

### the learning rate schedule

> I like to think of epsilon as a function from the epoch count to a learning rate. This function is called **the learning rate schedule**.

関連: http://machinelearningmastery.com/using-learning-rate-schedules-deep-learning-models-python-keras/

### advantage of the speed-up

Antoineによるコメント (Mar 24 at 9:44)

> e.g. B = 32 is a good default value, with values above 10 taking advantage of the speed-up of matrix-matrix products over matrix-vector products.
Raspberry pi3 をiPhoneとbluetooth接続しようとしてかなりハマった話

　Raspberry Pi 3でiPhoneとbluetooth接続のテストをした時にネットの情報と違って思いの外ハマったので備忘録兼ねての。

#行った環境

- Raspberry Pi3(Raspbian Jessie lite)
- Macbookpro(ここからssh)
- iPhone5S

#順調だったこと

幾つかのサイトを参考に以下のコマンドを打つもののすでに入っていた。

```bash
$ sudo apt-get bluetooth bluez pi-bluetooth 
```

いざ繋げるべく

```bash
$ bluetoothctl -a
Argent registered
[bluetooth] scan on
[bluetooth] discoverable on
[NEW] Device xx:xx:xx:xx:xx:xx iPhone
```

のこのこiPhoneが現れたので

```bash
[bluetooth] pair xx:xx:xx:xx:xx:xx
Attempting to pair with xx:xx:xx:xx:xx:xx
[CHG] Device xx:xx:xx:xx:xx:xx Connected: yes
Request confirmation
[agent] Confirm passkey 123456 (yes/no): yes
```
となりあっさりPairing完了。
ここからが地獄だった。。。。

#ハマったところ
Pairingがあっさり完了したのだがiPhoneの表示は"Not Connected"のまま。
おかしいと思いタップしてiPhone側から再度接続を試みるも５秒ほど"Connected"となりすぐに”Not Connected"に戻る。

どういうことだよ。

sshしてるMacBook Pro側のTerminalにも

```bash
[CHG] Device xx:xx:xx:xx:xx:xx connected:yes
[CHG] Device xx:xx:xx:xx:xx:xx connected:no
[CHG] Device xx:xx:xx:xx:xx:xx connected:yes
[CHG] Device xx:xx:xx:xx:xx:xx connected:no
以下略
```

と永遠に表示されパニックに陥った回数だけこれが増えていく始末。

ここでGoogle先生に助けを求めるもみんなあっさりつながっている模様でここから抜け出す情報がない。

- Bluetooth関連パッケージの削除と再投入＞＞失敗
- 試しにpulseaudioの再投入と再起動＞＞失敗
- pulse audioの個別パッケージの再投入＞＞すでに最新

#抜け出し方

https://github.com/blueman-project/blueman/issues/677
最終的にここを見ているときにふと"gnome-bluetoothでも入れてもっかい試してみるか”と思い。

```bash
$ sudo apt-get install gnome-bluetooth
```

そんで再トライしたらあっさり繋がりましたとさ。

謎。

そんで

```bash
[bluetooth] trust xx:xx:xx:xx:xx:xx
```

で接続切れても認証無しで再接続可能に。

さまよってるときに"gnome-bluetooth入れてみれば？”っていう情報を得られなかったのでもしここでハマった方がこれを見つけて解決できたらなと。

discoverable on の状態でiPhone側から見つけてpairingすることにも成功。


#結論
gnome-bluetooth入れたらなんか繋がった！

trustの手順を自動化する方法を探そうかな。
OptionalをUnwrapする３つの方法

## Optionalとは？
Swiftの型の一つで、nilを保存できる子。値がある場合は、Optional(data)と保存されるので、
中のdataを取り出したい場合はunwrapしなければいけない。Optionalのデータとして扱われる。

## なんでOptionalを使わないとあかんの？

もしかしたら何かしらの整数Intの値を持ってるかもしれないし、何の値も持っていない（nil）かもしれないからです。例えば、データベースなどからデータを読み込むときに、値が何もなかったら、Optionalがそれを取り込んでくれるので、とりあえずエラーは防げる！

## Optionalを初期化する方法

２つ方法があります。

```.swift
let optionalOne: Int? = Int("42") //方法１
let optionalTwo: Optional<Int> = Int("42") //方法２

print(optionalOne) // Optional(42)
print(optionalTwo) // Optional(42)
```
Optionalはタイプなので、そのまま使うと、Optionalタイプとして実行されます。
中身のデータタイプを覆っているので、中身にアクセスするには、Unwrap(開く)必要があります。

## OptionalをUnwrapする方法

### 1. if-letでunwrap

```.swift
let optionalString = fetchOptional()

if let unwrapped = optionalString {
    print(unwrapped)
}

func fetchOptional() -> String?{
    return array.first
}
```

### 2. guard-letでunwrapする

```.swift
var someStr: String?
guard let unwrapped = someStr else { return }
Print (unwrapped)
```

### 3. forced unwrapping (強制的アンラップ)
Optionalにビックリマークをつける。

```
var someStr: String?
Let unwrapped3 = someStr! 
```
ただし、これを使うときはsomeStrの値が100%あると場合でないといけません。もし、強制的にアンラップして、値がnilだった場合エラーが起きるからです。
単純な文字列アニメーション

常識かもしれませんが、文字列で簡易的にアニメーションする方法を書いてみます。
こんな感じのアニメーションが作れます。

![プゲラ.gif](https://qiita-image-store.s3.amazonaws.com/0/194349/9d029e6c-8f41-96ae-069c-db8bf0eddd96.gif)

![ｱﾋｬﾋｬﾋｬ(ﾟ∀ﾟ)ﾋｬﾋｬﾋｬ.gif](https://qiita-image-store.s3.amazonaws.com/0/194349/28627340-2f39-847b-c216-da3d88d908b6.gif)

Python 3.6.1で作っていますが、原理的に言語が違っても作成できます。
キャリッジリターンが認識される環境ならば思い通りに表示されると思います。

仕組みは、単純です。

1. printの改行を抑制する
2. 文字列を表示させたらキャリッジリターンを表示させる

の2つだけです。
後は、アニメーションらしく表示間隔を調整してやらばそれらしく見えます。

一番単純なものは以下のようなものでしょうか。

```python:python
import time
interval = 0.50
print("1     \r", end="")
time.sleep(interval)
print(" 2    \r", end="")
time.sleep(interval)
print("  3   \r", end="")
time.sleep(interval)
print("   4  \r", end="")
time.sleep(interval)
print("    5 \r", end="")
time.sleep(interval)
print("      \r", end="")
time.sleep(interval)
```

もう少しプログラムらしくすると、以下のような感じになります。

```python:python
import time

def animation(sts, times=3, interval=0.25):
  for n in range(times):
    for st in sts:
      print(st, end="")
      time.sleep(interval)
      print("\r", end="")
  print()

sts = [
    "  （・∀・）       ",
    "  （・∀・）ﾆﾔ     ",
    "  （・∀・）ﾆﾔﾆﾔ   ",
    "  （・∀・）ﾋｬ     ",
    "  （・∀・）ﾋｬﾋｬ   ",
    "  （・∀・）ﾌﾟｹﾞﾗ  ",
]

times = 3
interval = 0.25
animation(sts, times, interval)
```
ReduxでAPIから取得したデータを保持するのが嫌になったのでaxiosで保持してみた

## ReduxのGlobalStateでAPIのデータを保持するか否か
Reduxではredux-thunkやredux-sagaを用いてaction内でAPIリクエストした結果をGlobalStateに保持するのがお約束になっていますが、そもそも

action作成
 ↓
reducerにcase追加
 ↓
containerのmapStateToPropsで受け取る

というプロセスが非常にめんどくさい。
しかもGlobalStateにAPIデータが保持されているかどうかで分岐もさせないといけない。

それならaxiosのPromiseをキャッシュしておいて、2度目以降同じaxios.getリクエストをした場合にそのキャッシュを返せばいんじゃね？
ということでaxios.getをキャッシュする仕組みを作ってみました。

注意点として、この中でキャッシュと呼んでいるものは永続的なものでなくリロードすると消えるものです。

## 使用するモジュール
・Webpack (3.0.0)
・axios (0.16.2)

## コード

URLとクエリパラメータが完全に一致するキャッシュが存在する場合にのみキャッシュを返します。
また `allowedCaches.js` に指定したパターンに一致するリクエストのみキャッシュします。

```js:./src/axios-cache/index.js
import 'babel-polyfill';
import allowedCaches from './allowedCaches';

/**
 * keyをソートして返却
 * @param {object} object
 * @return {object}
 */
function objectSort(object) {
  let array = [];
  for (let key in object) {
    if (object.hasOwnProperty(key)) {
      array.push(key);
    }
  }

  array.sort();

  let sorted = {};
  for (let i = 0; i < array.length; i++) {
    sorted[array[i]] = object[array[i]];
  }

  return sorted;
}

/**
 * @param {object} params
 * @return {string}
 */
function createQuery(params) {
  params = objectSort(params);

  let ary = [];
  Object.keys(params).forEach(function(key) {
    ary.push(`${key}=${encodeURIComponent(params[key])}`);
  });
  return ary.join('&');
}

function match(url) {
  for (let i=0; i < allowedCaches.length; i++) {
    const allowedUrl = allowedCaches[i];
    if (url.match(new RegExp(allowedUrl))) {
      return true;
    }
  }
  return false;
}

/**
 * @param {Axios} axios - axios instance
 */
export function cachingGet(axios) {
  const get = axios.get;
  const cache = new Map();

  axios.get = function cachedGet(url, config) {
    const key = (config && config.params) ? `${url}?${createQuery(config.params)}` : url;
    if (cache.has(key)) {
      return cache.get(key);
    } else {
      const request = get.apply(axios, arguments);
      if (match(url)) {
        cache.set(key, request);
      }
      return request;
    }
  };
}

```

```js:./src/axios-cache/allowedCaches.js
export default [
  '/api/users.*' // 正規表現
];
```

## 使い方

```js:./src/main.js
import axios from 'axios'
import { cachingGet } from './axios-cache'

const axiosInstance = axios.create();
cachingGet(axiosInstance);

axiosInstance.get('/api/users');
// 2度目以降はキャッシュしたpromiseインスタンスが返却される
axiosInstance.get('/api/users');

// クエリパラメータまで一致しない場合、別のリクエストとみなす
axiosInstance.get('/api/users?a=b');
axiosInstance.get('/api/users?a=c');
```
Webpackでnode_modules配下のライブラリを自動でCommonsChunkPluginに指定して出力

WEB+DB PRESS Vol.99のWebpack2特集を読んでいてCommonsChunkPluginの説明が物足りなかったので書いてみた。
偉そうなこと言ってますが実は公式ドキュメントに普通に書いてあるものをコピペしただけです。

`minChunks` でnode_modules配下のライブラリかどうか判別してvendor.jsにぶっこんで吐き出します。

## 使用するモジュール
・Webpack (3.0.0)

## Webpack設定
```js
plugins: [
  new webpack.optimize.CommonsChunkPlugin({
    name: "vendor",
    minChunks: function(module){
      return module.context && module.context.indexOf("node_modules") !== -1;
    }
  })
]
```

## 公式ドキュメント
https://webpack.js.org/plugins/commons-chunk-plugin/#combining-implicit-common-vendor-chunks-and-manifest-file
新米Railsマンの僕が100万回詰まった３つのポイント


(注)ホントのホントに初心者向けの記事なので「こんな初歩的なこと書くなよ」「お前がQiitaやるなんて100万年早い」って言う人や、自称初心者のスーパーエンジニアさんは絶対に読まないでください。

(注)何度も詰まったポイント３つですが、さすがに100万回は詰まってないです。少し盛りました。でもほんとに何度も詰まってたくさんの時間を「持って行かれ」ました。

![201305301158284aa.jpg](https://qiita-image-store.s3.amazonaws.com/0/150384/bbd36026-7362-b6b1-f7fa-ab5aaaa39dc1.jpeg)



#目的

ホントのホントに初心者だった僕がホントに詰まって困ったポイントを書き残して、ホントのホントに初心者の誰かの役に立てるため。

<br>
#①git addしようとすると毎回`database.yml`とかgitに加えたくないファイルがうようよ出てきてうっとおしい


- `database.yml`などはパスワードなどが入ってるのでシンプルにリモートにプッシュしちゃマズいファイルです。これも出てこないようにしましょう

- あと、`.bundle`や `vendor/bundle`も出ないようにしましょう。コミット量がとんでもないことになりがちです。やらかすとだいたい先輩に怒られます。

1. ディレクトリの先頭で`.gitignore`というファイルを作成します

`vi .gitignore`

2. `.gitignore`に追加したくないファイル名を追加します。

```ruby:.gitignore
.DS_Store
database_yml
vendor/bundle
/.bundle
```



これで、ここに書いた形式のファイルはgit管理から外れるようになります！


(追記)
`◯◯.DS_Store`といった具合のファイルはローカル勝手に生成される邪魔なファイルなので、.gitignoreでなくもっと手前で排除したほうがよい、というコメントをいただきました！

```
$ git config --global core.excludesfile ~/.gitignore_global
```
こうすることで.DS_Store軍団がgitから綺麗にいなくなるそうです！
簡単！最高！！！




#②rbenvでバージョン切り替えしてるのにバージョン確認すると切り替わってない

僕の場合、PATHの設定ができていないだけでした・・・

```
$ source ~/.bash_profile
```

これで毎回解決しました。
アホみたいな話ですが僕は何度も引っかかってるので気をつけてください。  
僕がアホなだけかもしれません。  

#③rails sすると「rails server is already running」って言われるけど、runしてないんですが・・・

これ、`control` + `C`でサーバーを止める際、なぜかうまくexitできずに中断されるとよく起こりました。
僕の解決策は`tmp/pids/server.pid｀を削除するというものでした。

```
$ cd tmp
$ cd pids
$ rm -rf server.pid
```

すみません、根本的な理由は謎です・・・
ですが、これが残っていると「サーバーがまだ稼働している」とRails側に勘違いされるようです。
<br>
誰かいつか理由を教えてください・・・
<br>


#最後に
以上です！
読み返すと本当に「これだけかよ！」みたいなポイントばっかりですね・・・
ですが実際限られた貴重な人生をこの３つの解決に何時間も費やしてしまったので、ホントの初心者の皆さんは僕を踏み台にしてもっとサクサク進んでください。

<br><br>

あと鋼の錬金術師は大変な傑作なので、まだ読んでない人は今すぐ読んで下さい。


`kindle版　鋼の錬金術師 1巻 (デジタル版ガンガンコミックス) `
http://amzn.asia/7K5pbYy
Eurekaのセレクトボックスに後からデータを入れる方法

# 概要
[Eureka](https://github.com/xmartlabs/Eureka)というフォーム作成ライブラリを使っている．
APIで取得したデータをEurekaのフォームのセレクトボックスのデータにセットする方法について説明する．
何か間違いがあれば，ご指摘お願い致します．

## 環境
 - 言語
    - Swift3
 - 使用ライブラリ
    - Eureka(https://github.com/xmartlabs/Eureka)

# 問題
APIからデータを取得した際，非同期的にデータを取得するため，APIから取得したデータがセレクトボックスに表示されず，初期にセットしたデータが表示されてしまう．

# 解決法
```swift:ViewController.swift
import UIKit
import Eureka

class ViewController: FormViewController {
    
    var locations: [String] = []
    var activeLocation: String = ""
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // APIから位置データの取得
        LocationService.getLocations{ responseLocations in
            self.locations = responseLocations      // このままではformには反映されない
            
            // タグから対象のフォームの情報を取得
            if let LocationsRow = self.form.rowBy(tag: "Locations") {
                // 対象のセレクトボックスにデータを入れるために.cellUpdateを呼ぶ
                LocationsRow.updateCell()
            }
        }
            
        form
        +++ Section("Source")
            <<< PushRow<String>("Locations"){
                $0.title = "場所"
                $0.selectorTitle = "場所の選択"
                $0.options = self.locations
            }.onChange { row in
                self.activeLocation = row.value ?? self.locations[0]
            }.cellUpdate { cell, row in             // .updateCellで実行される
                row.options = self.locations
            }
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
}
```

## 解説
### formの部分
```
form
    +++ Section("Source")
        <<< PushRow<String>("Locations"){
            $0.title = "場所"
            $0.selectorTitle = "場所の選択"
            $0.options = self.locations
        }.onChange { row in
            self.activeLocation = row.value ?? self.locations[0]
        }.cellUpdate { cell, row in             // .updateCellで実行される
            row.options = self.locations
        }
```
**1. `.cellUpdate`の追加**

formに`.cellUpdate`を追加し，`row.options = self.locations`を記述し，後からデータを挿入する記述を行う．
.cellUpdateはこういう用途らしい
> Called each time the cell appears on screen. You can change the appearance here using variables that may not be present on cellSetup().

セルが表示されるたびに呼ばれるところらしい．またcellSetup()で与えられていない変数を利用して表示を変更できるらしい．

**2. tagの追加**
`<<< PushRow<String>("ここにタグ"){`のように，タグを追加する．
これで外からアクセスするための準備が完了．

### 外から`.cellUpdate`の発火

```
// APIから位置データの取得
LocationService.getLocations{ responseLocations in
    self.locations = responseLocations      // このままではformには反映されない
            
    // タグから対象のフォームの情報を取得
    if let LocationsRow = self.form.rowBy(tag: "Locations") {
        // 対象のセレクトボックスにデータを入れるために.cellUpdateを呼ぶ
        LocationsRow.updateCell()
    }
}
```
**1. タグから対象のフォームにアクセス**
`self.form.rowBy("対象のタグ名")`で対象のフォームの情報を取得できる．

**2. `updateCell()`で`.cellUpdate`の発火**
`LocationsRow.updateCell()`で`.cellUpdate`を実行させる．