OmniAICreator/Qiita-1.07M huggingface dataset:
【今日から携わる】新規リポジトリ作成したあと、gitコマンドでfirst-commitをする方法

携わる案件：新規リポジトリ作成したあと、gitコマンドでfirst-commitをする方法


```html:準備
空のフォルダ作成
ターミナルを開いて、作成した空のフォルダに移動
```
```html:ディレクトリ見本
Documents/
　└ www/
　　　　　　　└ client01/　 （クライアント名）
　　　  　　　　　　　　　　├ design　　（デザインデータを格納）
　　　　　　　  　　　　　　├ material　（素材や情報を格納）
　　　　　　　　　　　  　　└ source　　（コーディングデータを格納）← 今回作成する空フォルダ
```

準備ができたら、以下のコマンドでOK！

## clone
共有されたgitリポジトリをクローンする

```html:command
git clone [リモートリポジトリのパス]
```

## git status

```html:command
git status
// no commits yet：まだコミットされてないと言われます。
```

## git init

```html:command
git init
// フォルダをgit管理下におく
```

## touch [作成するファイル名]

```html:command
touch README.md
//空の仕様書を作成する
```

## git add [ステージングにあげるファイル名]

```html:command
git add -A
// ファイルをステージングにあげる
```

## git commit -m "first commit"

```html:command
git commit -m "first commit"
// コメント付きでステージングエリアにあるものをリポジトリにコミット
```

## git push -u origin master

```html:command
git push -u origin master
// ステージングにあげてコミットしたファイルを、マスターにプッシュする
```

## git status
状態を確認

```html:command
git status
```

## git log
コミット履歴を確認する

```html:command
git log
```

おしまい


## 簡易バージョン
```
echo "# hoge" >> README.md
git init
touch README.md
git add README.md
git commit -m "first commit"
git remote add origin https://github.com/hoge
git push -u origin master
```

## githubバージョン


```
GitHub
「＋New Repository」ボタンをクリック
「Create repository」ボタンをクリック

ターミナル
git init
touch README.md
git add -A
git commit -m "first commit"
git remote add origin https://github.com/hogehoge.git
git push origin master
```

「git commit --amend --reset-author」が表示されたらCommiterを変更する

```
git config --local user.name abenosite
git config --local user.email abenosite@gmail.com
```

## 参考
> [ローカル作業フォルダをGIT管理下においてGitHubにPUSHするまで](https://qiita.com/riversun/items/dac05d7fd9ac304dffa9)
xamppでLaravelの環境構築

Laravelを試してみ用と思い立ち、とりあえずxamppでLaravelが動作する環境を作ってみた。

##環境
□OS:Windows10 home　64bit
□PHP:7.2.6
[（PHPのバージョンアップはこちら参照）](https://qiita.com/maruyama42/items/2a6af783cf400cbcc216)

##Composerのインストール

Composerというソフトウェアが必要らしいのでインストールを実施

[こちら](https://getcomposer.org/)からComposerをダウンロードする。

Downloadをクリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/215529/651bd6cd-83b1-7a9c-aeb1-a8e2a573a63a.png)


Composer-Setup.exeのリンクをクリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/215529/0a794a18-c1a7-0f99-2c67-71b65708c85d.png)

ダウンロードしたexeファイルを実行
![image.png](https://qiita-image-store.s3.amazonaws.com/0/215529/95920b03-1538-788c-90af-8a4ee1b1ac84.png)

xamppのphp.exeのファイルを指定
![image.png](https://qiita-image-store.s3.amazonaws.com/0/215529/4e5efb2b-2673-fd83-03bb-7a3878a9c4cf.png)


![image.png](https://qiita-image-store.s3.amazonaws.com/0/215529/1142f649-02fb-0fb3-6452-a4f6aa7379fd.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/215529/fbe5102c-3cb1-253e-6502-97113048f8d9.png)


![image.png](https://qiita-image-store.s3.amazonaws.com/0/215529/388c9b8f-2cd5-97ab-8042-76da80e14b3c.png)

ここまでくれば、インストールできたこととなる。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/215529/8fff75e8-1a1f-f47b-de89-4a05c9394f3b.png)


##Laravelのインストール

xamppシェルを起動
![image.png](https://qiita-image-store.s3.amazonaws.com/0/215529/f9891311-8ace-0270-6b5d-12f127754ad9.png)


htdocsに移動し次のコマンドを実行

```
$cd htdocs
````

（htdocsフォルダにlaravelフォルダを作成し、Laravelのプロジェクトを作成）

```
composer create-project --prefer-dist laravel/laravel laravel
```

もし以下のエラーが出てしまった場合

```
'composer' は、内部コマンドまたは外部コマンド、操作可能なプログラムまたはバッチ ファイルとして認識されていません。
```

composer.batのフォルダパスをシステムの環境変数のPATHに設定してあげる必要ある。

※ここで再起動せずに少し悩んでしまった。。。
【環境変数の変更時は再起動必須！！！】


再度次のコマンドを実行

```
composer create-project --prefer-dist laravel/laravel laravel
```

いろいろインストールするので、5分ほど時間がかかる。

以下のメッセージが出れば完了。

```
set successfully.
```

[localhost/laravel/public]にブラウザでアクセスすると、Laravelの初期ページが表示される。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/215529/313dddfc-6723-29ea-a1a9-6fde61ecb2bf.png)


これで、laravelの環境構築が完了。


最後に、laravelのバージョンを確認してみる。

htdocsフォルダにlaravelフォルダを作成したので、まずはlaravelフォルダへ移動する。

```
cd laravel
```

バージョン確認コマンド

```
php artisan --version
```

または

```
php artisan -v
```

以下のようにバージョンが5.6.23であることが確認できた。

```
# php artisan -V
Laravel Framework 5.6.23
```
Windows10でCuda9.1+Chainer4.1の環境を最速で作る

# はじめに
最近はライブラリ(特にPythonで)が充実していて、GPUを利用した機械学習が身近になってきていますが、Windowsでの環境構築はやはり難しいですね。
先日、研究室のWindowsマシンでCuda+Chainerの環境を作るのにかなり苦労したので、備忘録も兼ねて結論をまとめておきます。
もちろん、公式推奨のUbuntuやCentOSが圧倒的に楽です。本記事は「それでもWindowsを使いたい！」という方向けです。
また、情報の過不足があるかもしれませんので、発見された方はコメントでご指摘いただけると助かります。

# バージョン情報
**用意しておくもの**
・NVIDIA社のGPUを搭載した対応マシン
・Windows 10
・Python 3.6
**これからインストールするもの**
・Visual Studio 2017
・Cuda Toolkit 9.1
・Chainer 4.1

# Visual Studio 2017のインストール
Cudaを使うのにC++のコンパイラが必要です。必ずCudaの前にインストールしましょう。
[こちら](https://www.visualstudio.com/ja/downloads/?rr=https%3A%2F%2Fdocs.microsoft.com%2Fja-jp%2Fvisualstudio%2Finstall%2Finstall-visual-studio)から、Visual Studio 2017（無料版のCommunityでよい）をダウンロードしてください。C++ Build Toolsだけで十分らしいのですが、私にはよくわかりませんでした。
インストーラを起動したら、「C++によるデスクトップ開発」にチェックを入れてインストールしてください。黄色でハイライトした辺りがインストールされればOKです。
\*時間がかかります
![vs.PNG](https://qiita-image-store.s3.amazonaws.com/0/144878/538e37f7-d899-75f9-cc6e-c78bbb93265d.png)

インストールが終わったら、環境変数PATHを追加します。ビルド番号などは適宜変更してください。
**C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin**
**C:\Program Files (x86)\Windows Kits\10\bin\10.0.17134.0\x64**


# Cuda Toolkit 9.1のインストール
CudaはNVIDIA社のGPUを扱うためのプラットフォームです。
[こちら](https://developer.nvidia.com/cuda-91-download-archive?target_os=Windows&target_arch=x86_64&target_version=10)からインストーラをダウンロードしてください。
最新版のCuda Toolkit 9.2はChainerが未対応のようなので、9.1をインストールします。インストールはそのまま指示に従えば大丈夫です。
\*時間がかかります

インストールが終わったら、環境変数INCLUDEを追加します。ビルド番号などは適宜変更してください。
**C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.1\include**
**C:\Program Files (x86)\Windows Kits\10\Include\10.0.17134.0\ucrt**

次に、GPU演算をサポートするライブラリであるCuPyをwheel(予めコンパイルされたバイナリファイル)でインストールします。このコマンドを実行してください。

```
$ pip install cupy-cuda91
```
wheelを使った場合cuDNNのダウンロードや面倒な設定は不要です。Cudaとのバージョンの整合性も保証されているので楽ですね。

# Chainerをインストール
ChainerはPreferred Networks社が提供する深層学習ライブラリです。このコマンドを実行してください。

```
$ pip install chainer
```
無事インストールができれば成功です。レッツ・ディープラーニング。

# 参考文献
お世話になったリンク集です。
[1] [Installation — Chainer 4.1.0 documentation](https://docs.chainer.org/en/stable/install.html)
[2] [Chainerのインストール方法をわかりやすく解説｜Mac・Linux・Windows | 侍エンジニア塾ブログ | プログラミング入門者向け学習情報サイト](https://www.sejuku.net/blog/42488)
[3] [Windows10でChainerをGPUで動かすまでメモ - うるはし](http://uluhashi.hatenablog.jp/entry/2017/12/11/124407)
[4] [Chainer v4 ビギナー向けチュートリアル - Qiita](https://qiita.com/mitmul/items/1e35fba085eb07a92560)
連動プルダウンshow()/hide()がsafari, IEでは効かない問題

# 連動プルダウンを作ろう
```html
<input type="select" id="select1">
    <option value="a">a</option>
    <option value="b">b</option>
    <option value="c">c</option>
</input>

<input type="select" id="select2">
    <option value="a1">a1</option>
    <option value="a2">a2</option>
    <option value="b1">b1</option>
    <option value="b2">b2</option>
    <option value="c1">c1</option>
    <option value="c2">c2</option>
</input>
```
こんなよくあるselect1の動きに追従してselect2のoptionの中身を変えようというプルダウン。

## jQueryを書こう
```js
$('#select1').on('change', evt => {
    $('select2').find('option').each((idx, elem) => {
        if($(elem).val().indexOf($(evt.target).val()) != -1){
            // ①オプションを表示する
        } else {
            // ②オプションを非表示にする
        }
    });
});
```
select1の選択されたvalueとselect2のoptionのvalueをeachで一個ずつ比較して表示・非表示を行うというやつ。
簡単簡単はいできたーと書いたのがこのコード

```js
$('#select1').on('change', evt => {
    $('select2').find('option').each((idx, elem) => {
        if($(elem).val().indexOf($(evt.target).val()) != -1){
            // ①オプションを表示する
            $(elem).show();
        } else {
            // ②オプションを非表示にする
            $(elem).hide();
        }
    });
});
```

## 動作確認をしよう
先ほど書いたコード、、、え？safari動かなくね？

## 調べてみた
。。。残念ながらsafari, IEでoptionのshow()/hide()は効かないらしい。。。
つまりdisplay: noneが適用できない。
そのほかにも、内側の要素にはshow()/hide()が効かないという報告の記事もあり（未検証）

## 代替案
1、非表示はremove()、表示はappend()/prepend()する
2、prop("disabled", true)で選択できなくする
3、都度検索してキャッシュやDBなどからoption全部を入れ替える

今回は１で実装

```html
<label id="hidden_area" style="display:none"></label>
```
1,このlabelに一度要素を退避。
2,退避したoptionに対してeach。
3,select1のvalueに一致するoptionのみ元のselect2へprepend()する
の手順を踏む。

## 最終的なコード
```js
$('#select1').on('change', evt => {
    let val = $('#select1').val();
    // 全て退避
    $('select2').find('option').each((idx, elem) => {
        $('#hidden_area').prepend(elem);
    });
    $('#hidden_area').find('option').each((idx, elem) => {
        if($(elem).val().indexOf(val) != -1){
            // オプションをselect2へ移動
            $('#select2').prepend(elem);
        } 
    });
});
```

ようやく動いた。。。
１度前に遭遇したことあったのだが、ハマるのが２度目だったのでメモ。。。。
Watson Assistant 勉強会カンペ

#Watson Assistantとは
>チャットボット等、ユーザーとコンピューターが自然言語で対話可能なアプリケーションを簡単に開発するためのサービスです。Watson Assistant は機械学習の適用により、ユーザーからの自然言語での入力を理解し、適切な応答を返します。開発者はシンプルで洗練された統合開発ツールを用いることで、対話の流れを直感的な操作で作ることができます。また、さまざまな業務に特化した事前定義済みのコンテンツを活用することで、より迅速なアプリケーション開発を実現します。

#準備
##IBM Cloud 登録
https://www.ibm.com/account/reg/jp-ja/signup?formid=urx-30180&target=https%3A//www.ibm.com/cloud-computing/jp/ja/
適当に埋めてください

##My IBMにサインイン
![スクリーンショット 2018-05-29 13.41.07.png](https://qiita-image-store.s3.amazonaws.com/0/194971/fbfc78f9-c8fb-1f63-9d38-11854334ab9d.png)

##IBM CloudをLaunch
![スクリーンショット 2018-05-29 13.41.51.png](https://qiita-image-store.s3.amazonaws.com/0/194971/0829efda-9f57-3c3c-901f-eb9e4464819d.png)

##リソースの作成
![スクリーンショット 2018-05-29 13.43.08.png](https://qiita-image-store.s3.amazonaws.com/0/194971/ef4a2e23-83cb-c292-8014-df6d14d0b93d.png)

![スクリーンショット 2018-05-29 13.43.51.png](https://qiita-image-store.s3.amazonaws.com/0/194971/ab172827-be88-9c27-5e4a-c0c537e07971.png)

適当に埋めてツールの起動

##Create a Workspace
![スクリーンショット 2018-05-29 13.49.37.png](https://qiita-image-store.s3.amazonaws.com/0/194971/e20dfd11-5633-a7da-122f-966e3a681d15.png)

#チャットボット作ろう
##あいさつしよう
![図1.png](https://qiita-image-store.s3.amazonaws.com/0/194971/ccb92663-076e-6fbe-0ca7-12516691d985.png)

###intentの追加
"#挨拶"というintentを追加
![スクリーンショット 2018-05-29 13.50.48.png](https://qiita-image-store.s3.amazonaws.com/0/194971/2ef0dba1-bf62-715a-503c-52acfc3dfe75.png)

###シナリオ作成
![スクリーンショット 2018-05-29 13.51.50.png](https://qiita-image-store.s3.amazonaws.com/0/194971/f24c8b3d-cfc6-11e4-47ca-1e464d68fa08.png)

###試してみよう
こんにちはと打つと、いい天気ですねが返ってくる
![スクリーンショット 2018-05-29 13.52.24.png](https://qiita-image-store.s3.amazonaws.com/0/194971/96484bbc-bfda-7415-0cb1-5433b1e53240.png)


###実は
登録してない挨拶文でも挨拶と認識してくれるかも！？
こんばんははさっき登録してないのに…
![スクリーンショット 2018-05-29 13.53.19.png](https://qiita-image-store.s3.amazonaws.com/0/194971/5a9aca18-dc9d-0f56-fa84-3c081fdea30b.png)

こういうこと
![図２.png](https://qiita-image-store.s3.amazonaws.com/0/194971/69d5bedf-aae2-81fd-18a2-b2896c52b826.png)


##ちょっと賢い会話しよう
![図3.png](https://qiita-image-store.s3.amazonaws.com/0/194971/16cd1048-5d03-2ce4-032a-d24e61ae326b.png)

###intentの追加
"#飲食店検索要求"というintentを追加
![スクリーンショット 2018-05-29 13.55.28.png](https://qiita-image-store.s3.amazonaws.com/0/194971/ff1f9469-b93a-4816-2a37-fe82310653c8.png)

###entityの追加
食べ物リストを作る
![スクリーンショット 2018-05-29 13.56.47.png](https://qiita-image-store.s3.amazonaws.com/0/194971/a6e37a86-9d9a-edee-7e25-4029c54dacbb.png)

###シナリオ作成
![図4.png](https://qiita-image-store.s3.amazonaws.com/0/194971/2abdee55-26e3-8e2b-57e0-823c21e2d719.png)
![スクリーンショット 2018-05-29 13.57.43.png](https://qiita-image-store.s3.amazonaws.com/0/194971/efc69220-91eb-0bcd-753a-3f542726e7e6.png)


###試してみよう
![スクリーンショット 2018-05-29 14.01.45.png](https://qiita-image-store.s3.amazonaws.com/0/194971/f99b09fb-a69b-ee88-ed89-1bf6aba2e750.png)

###こんなことも
![スクリーンショット 2018-05-29 14.03.03.png](https://qiita-image-store.s3.amazonaws.com/0/194971/e97a8aba-9334-1e99-f3aa-5b35b74db677.png)
kintone開発をより効率的にするために ~Atomパッケージ開発~



#はじめに

普段は大学でkintone使ってNPOの方の業務アプリケーションを作成させてもらっています。
個人的にkintoneカスタマイズやプラグインの作成なども少し行なっているのですが、たまに

**kintone用のAPIのスクリプトを打つのが面倒だな...**

と思うことがあります。。。

なので、少しでもコードを書く作業を効率化したいと思い、atom用の補完プラグインを作成してみました


#atomのプラグイン作ってみた

作ったものがこちら
https://atom.io/packages/autocomplete-kintone

![スクリーンショット 2018-05-28 0.37.03.png](https://qiita-image-store.s3.amazonaws.com/0/114867/e1f80bcd-7494-ff9c-2b4d-2862032e3d40.png)

#使い方

`ke`キーを入力すると以下のような画面になるので

<img width="621" alt="スクリーンショット 2018-05-28 0.40.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/114867/e6d1f403-e514-e668-ce0c-7a9e4df65d33.png">

後は`Enter`を押すだけ！！
<img width="616" alt="スクリーンショット 2018-05-28 0.40.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/114867/f0858892-d0c6-ccb8-887a-064bb2b16899.png">

すぐにkintone javaScript APIのスクリプトを入力することができます！！


#終わりに
このツールを通して、少しでもkintone開発者が増えれば嬉しいです。

今後やっていきたいこととしては、、、

1:まだkintone javaScript API用しか作成できていないので、kintone REST API用の補完も作成していきます。

２：今回kintone開発をもっと効率化してみたいと思って作ってみたatomプラグインでしたが、
思っていた以上に様々なプラグインが作れる予感がしたので他のプラグインも作ってみようと思います。

３：プラグイン作成用の日本語ドキュメントが少なかったので、そちらも増やしていきたいです。
Salesforce Mobile SDKのプロジェクト作成で躓いたこと

Hybrid アプリケーションを作成する際に、下記のエラーの調査で時間がかかりました。
環境変数を読み込めていなかったなどの理由のエラーのようで、コマンドプロンプトを開きなおしてプロジェクトを再作成すると解消されました。

# コマンドプロンプトを開きなおして、"forcehybrid create"でプロジェクトを作成し直すと解消されるエラー 

### 環境情報 
対象の Android SDK: Android Oreo (API 27) 
最小 Android SDK: Lollipop (API 21) 
Android 3.1.2 
gradle:3.1.2 
Jre1.8.0 
Cordova: 7.0.0  

1. forcehybrid create実行時のエラー 
エラーメッセージ：Command failed: cordova plugin add https://github.com/forcedotcom/SalesforceMobileSDK-CordovaPlugin#v5.3.0 --force #348 

2. forcehybrid create実行時のエラー 
エラーメッセージ：Command failed: git clone --branch v6.1.0 --single-branch --depth 1 https://github.com/forcedotcom/SalesforceMobileSDK-Shared.git mobile_sdk\SalesforceMobileSDK-Shared 

3. gradleビルド時のエラー 
エラーメッセージ：AndroidManifest.xml:5: error: Error: No resource found that matches the given name (at 'icon' with value ''). 
Gradleがエラーの場合はforcehybridから作り直す 

4. gradleビルド時のエラー 
エラーメッセージ：No manifest file found at ./AndroidManifest.xml. Falling back to the Android OS resources only. 

5. gradleビルド時のエラー 
エラーメッセージ：実行時に、Android Studio: “Please select Android SDK”とエラーが出力される 

# 環境変数にANDROID_HOMEが設定されてないときのエラー 
1. forcehybrid create実行時のエラー 
エラーメッセージ：ANDROID_HOME is not set and "android" command not in your PATH. You must fulfill at least one of these conditions 

### WindowsのAndroid SDKの場所 
Projectフォルダを右クリックして、[Open Module Setting] > [ProjectStructure]画面のサイドメニュー[SDK Location] でAndroid SDK Locationが表示されます。 
そのパスを環境変数に登録。
正規表現のフラグ

#フラグって何？
正規表現では
```/(pattern)/```
と記述するが、
パターンの後に以下のようにフラグを設定することができる。
```/(pattern)/(flag)```

#フラグの種類
※PHPを使って各フラグの種類について例を取り上げます。
##g
最初の1個だけでなく、文字列の最後まで検索を繰り返す。グローバルマッチとも呼ばれる。
例）
```preg_replace('/aa/', 'cc', 'aabbccaabbcc') → ccbbccaabbcc```
このやり方だと一番初めのaaがccに置換される
```preg_replace('/aa/g', 'cc', 'aabbccaabbcc') → ccbbccccbbcc```
gフラグを使うと文字列の全てのaaがccに置換される

##i
大文字小文字を区別せずにマッチうる
例)
```preg_match('/XYZ/', 'xYz') → false```
大文字小文字を区別するため、マッチしていないと判断されてfalseになる
```preg_match('/XYZ/i', 'xYz') → true```
iフラグを使うと大文字小文字を区別しないため、マッチしていると判断されてtrueになる

##m
^と$がそれぞれ先頭と末尾だけでなく、行頭と行末にもマッチする
例)
```preg_match('/^hello$/', 'hello\nworld') → false```
$は文字列の末尾のみにマッチするのでfalseになる
```preg_match('/^hello$/m', 'hello\nworld') → true```
mフラグを使うと$が文字列の末尾と行末にマッチするのでtrueになる
hashmapの使い方にハマった件について

### はじめに
私は、
〜2013年3月　文系大学学部卒
〜2018年4月　インフラ系のSIer　#　LinuxとかAzureとか
2018年5月〜 WEB系エンジニア　#　開発できるようになりたかった
という変遷をたどり、
絶賛業務でJava勉強中の身です。

開発のやり方が学べたら
フルスタックなスキルを身につけられるように頑張りたいと思ってます。

だいぶ初心者な記載が多いかもしれませんが、ご了承ください。


### やりたかったこと
クローリングして取ってきた情報を加工し、
複数のテーブルにインサートを行う処理を

①共通のMapを作成し、情報を入れる
②Aテーブル用のMapを作成し、①のMapを入れ、Aテーブル用のMapを加工しAテーブルにインサート
③Bテーブル用のMapを作成し、①のMapを入れ、Bテーブル用のMapを加工しBテーブルにインサート

ということがやりたかった

### やったこと（失敗）
下記メソッドを実行して

```Java 
public void putMain()  {
        Map<String, Object> insertData = new HashMap<>();
        insertData.put("aaa","aaa");
        insertData.put("bbb","bbb");
        insertData.put("ccc","ccc");
        putA(insertData);
        putB(insertData);
}
public void putA(Map<String, Object> insertData)  {
        Map<String, Object> aData = new HashMap<>();
        aData = insertData;
        aData.remove("bbb");
        insert(aData);
}
public void putB(Map<String, Object> insertData)  {
        Map<String, Object> bData = new HashMap<>();
        bData = insertData;
        bData.remove("aaa");
        insert(bData);
}
```
#####期待した結果


|insertData |aData  |bData  |
|---|---|---|
|aaa  |aaa  |  |
|bbb  |  |bbb  |
|ccc  |ccc  |ccc  |


#####実際の結果


|insertData |aData  |bData  |
|---|---|---|
|  |aaa  |  |
|  |  |  |
|ccc  |ccc  |ccc  |


というように
共通テーブルの内容が変更されてしまった。

### 直したこと(成功)

``` Java
public void putMain()  {
        Map<String, Object> insertData = new HashMap<>();
        insertData.put("aaa","aaa");
        insertData.put("bbb","bbb");
        insertData.put("ccc","ccc");
        putA(insertData);
        putB(insertData);
}
public void putA(Map<String, Object> insertData)  {
        Map<String, Object> aData = new HashMap<>(insertData);
        aData.remove("bbb");
        insert(aData);
}
public void putB(Map<String, Object> insertData)  {
        Map<String, Object> bData = new HashMap<>(insertData);
        bData.remove("aaa");
        insert(bData);
}
```
xDataの宣言後に代入するのではなく、
xDataの宣言をするときに、引数でinsertDataを与えてあげたら
期待通りの動きになった。

### 終わりに
なぜそうなのかはまだ勉強できていないので、わかってはいません。。。
先輩教えてください＞＜
Adobe Premiere CCでMP4(H.264)の動画が緑っぽくあるいはピンクっぽく人によっては紫っぽくなるときはレンダラーを「ソフトウェア処理」にする

# 症状

パソコン買い換えたらこうなった。

![mp4.png](https://qiita-image-store.s3.amazonaws.com/0/34041/b0996c72-12d0-c6e5-8dfc-82ee495122e6.png)

# 対策

## その1

ファイル → プロジェクト設定 → 一般 → 「ビデオレンダリングおよび再生」の「レンダラー」を「Mercury Playback Engine - ソフトウェア処理」にする。

## その2

グラボかう。

# あ、そうだ

Adobe Media Encorderの設定も変えとかないと泣く。

編集 → 環境設定 → 一般 → 「ビデオレンダリン(以下略)
Web DB Press のファイル名を一括変換する高性能スクリプト

# what
pdfの連番ファイル名を置換する

# why
[総集編1-102](http://gihyo.jp/book/2018/978-4-7741-9686-2)を買ってウハウハとタブレットに入れて読んでるが**ファイル名がvolNN.pdfとなっており、ゼロ詰めされてない**のでソートしてウギャー

# how

```bash
for file in webdb_vol??.pdf ; do
  if [[ ${file} =~ ^(.*vol)([0-9]+.pdf)$ ]]; then
    mv $file "${BASH_REMATCH[1]}0${BASH_REMATCH[2]}"
  fi
done
```


# finally
- ソートしてウギャーからの卒業
- bashで正規表現
    - ```BASH_REMATCH[0]```でマッチした全体が返る
- 正規表現とか全言語共通になってほしい
テーブルの作成手順（MySQL）

# テーブルの作成

どうも、webエンジニアのキャリア２年目の者です。今まで、静的サイトのコーディングしかしてなかったので、Webアプリケーション作成に関するお勉強中です。
今回は、MySQLというミドルウェアのアプリケーションを使用して、テーブルの作成手順を紹介したいと思います。

記事メディアを作りたいと言う目標があるので、今回は仮に`media`というデータベースに、`article`というテーブルを作成したいと思います。

## データ型

基本のデータ型だけを挙げておきます。

- INT（整数）
- DOUBLE（少数）
- VARCHAR（可変長の文字列）
- TEXT（文章用の長い文字列）
- TIMESTAMP（日付時刻型）

## データベースの作成

MySQLの環境の用意や初期設定などは説明しません。すいません。

SQLで`media`データベースを作成するには下記のコマンドを実行します。

```sql
mysql> CREATE DATABASE media;
```

できているかどうかの確認は以下のコマンドを実行しましょう

```sql
mysql> show databases;
```

## 操作するデータベースを選択したいとき

```sql
mysql> USE media;
```

## データベースを削除したいとき

```sql
mysql> DROP DATABASE media;
```

（注意）**確認なしに削除するので**、消していいのかちゃんと確認しましょう。


## `media`データベースに`article`テーブルを作成するSQLファイル

`media`データベースにテーブルを作成します。少し長いのでファイルを作成してSQLから実行しましょう。

create_table_media_article.sql ファイルを作成

```sql:create_table_media_article.sql
CREATE TABLE media.article (
    id INT AUTO_INCREMENT NOT NULL PRIMARY KEY,
    title VARCHAR(50),
    content TEXT,
    created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
);
```

上記のSQLについて説明していきます。

`CREATE TABLE media.article`

mediaデータベースの中にarticleテーブルを作成するという意味です。
特定のデータベースのテーブルを指定するときは、 `データベース名.テーブル名`によって指定できます。

次は、テーブルの設計の中身について見て行きます。
上記のSQL文では、下記の４つのカラムを作成して行きます。

- id（ID）
- title（タイトル）
- content（本文）
- created_at（登録された日時）

`id INT AUTO_INCREMENT NOT NULL PRIMARY KEY`
- カラム名：`id`
- データ型：`INT`
- `AUTO_INCREMENT`：自動的に値が1ずつ増えていく設定
- `NOT NULL`：空データを許さない設定
- `PRIMARY KEY`：データ（レコード）を一意に特定するためのカラムを決めるもので、1つのテーブルに必ず1つは必要

`title VARCHAR(50)`
- カラム名：`title`
- データ型：`VARCHAR`

VARCHAR型は文字列であり、(50)は50文字と制限するためのものです。VARCHARでは必ず最大文字数を指定する必要があります。

`content TEXT`
- カラム名：`content`
- データ型：`TEXT`

`created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP`
- カラム名：`created_at`
- データ型：`TIMESTAMP`
- `NOT NULL`：空データを許さない設定
- `DEFAULT CURRENT_TIMESTAMP`：現在日時を保存すると言う意味です。

## SQLファイルの実行

データベースサーバへ接続して、　格納してあるSQLファイルを実行する。

```sql
mysql> source ~/hoge/hoge/create_table_media_article.sql
```

パスはご自身の環境に合わせて変更してください。

## 作成したテーブルの確認し、テーブルの設計内容を確認

`media`データベースを`use`したら。

```sql
mysql> show tables;
+-----------------+
| Tables_in_media |
+-----------------+
| article         |
+-----------------+
1 row in set (0.00 sec)

mysql> describe article;
+------------+-------------+------+-----+-------------------+----------------+
| Field      | Type        | Null | Key | Default           | Extra          |
+------------+-------------+------+-----+-------------------+----------------+
| id         | int(11)     | NO   | PRI | NULL              | auto_increment |
| title      | varchar(50) | YES  |     | NULL              |                |
| content    | text        | YES  |     | NULL              |                |
| created_at | timestamp   | NO   |     | CURRENT_TIMESTAMP |                |
+------------+-------------+------+-----+-------------------+----------------+
4 rows in set (0.00 sec)
```

## テーブルを削除したい場合

```sql
mysql> DROP TABLE media.article;
```

（注意）**確認なしに削除するので**、消していいのかちゃんと確認しましょう。

---

以上で終わります。
PDFMiner on Windows7

# はじめに
PDFMinerをWindows7環境に導入した際のメモです

# 目標
- pythonでpdfファイルをテキストファイルに変換する

# 動作環境
- Windows7 32bit
- python 2.6.5
- pdfminer 20140328

# 公式サイト
- [pdfminer](https://www.unixuser.org/~euske/python/pdfminer/)

# Download
- [pdfminer 20140328](https://pypi.org/project/pdfminer/)

# 手順
1. ダウンロードしたファイルを展開
2. コマンドプロンプトで以下を実行

```
mkdir pdfminer\cmap
python tools\conv_cmap.py -c B5=cp950 -c UniCNS-UTF8=utf-8 pdfminer\cmap Adobe-CNS1 cmaprsrc\cid2code_Adobe_CNS1.txt
python tools\conv_cmap.py -c GBK-EUC=cp936 -c UniGB-UTF8=utf-8 pdfminer\cmap Adobe-GB1 cmaprsrc\cid2code_Adobe_GB1.txt
python tools\conv_cmap.py -c RKSJ=cp932 -c EUC=euc-jp -c UniJIS-UTF8=utf-8 pdfminer\cmap Adobe-Japan1 cmaprsrc\cid2code_Adobe_Japan1.txt
python tools\conv_cmap.py -c KSC-EUC=euc-kr -c KSC-Johab=johab -c KSCms-UHC=cp949 -c UniKS-UTF8=utf-8 pdfminer\cmap Adobe-Korea1 cmaprsrc\cid2code_Adobe_Korea1.txt
python setup.py install
```

# 動作確認

```py:tools\pdf2txt.py
python .\tools\pdf2txt.py -o test.txt .\samples\simple1.pdf
```
ECSのログレベルをDEBUGモードに変更する

## 前提
- ecs-optimized AMIを使用している、またはecs-agentがinstall済みであること

## やり方

`/etc/ecs/ecs.config` に

```
ECS_LOGLEVEL=debug
```

を追記し

```
sudo stop ecs
sudo start ecs
```

これで、ECSのログがDEBUGモードで出力されます。

- `/var/log/ecs/ecs-agent.log` (agent自身のログ)
- `/var/lib/docker/containers/*/*.log` (containerのログ)
react-native+redux+react-navigationテンプレート

#react-native+redux+react-navigationのテンプレート

<br />

制作時に編集するファイルと編集しなくていいファイルを完全に分離したかった。
component、Reducer、Actionファイルを追加して作っていってください。
ベースにしたプログラム：[React Navigation(v2)](https://reactnavigation.org/docs/en/redux-integration.html)

ソース丸ごとDLしたい人はここ：[react-native template](https://github.com/shoichi1023/template)
使い方が知りたい人はこっちです：[react-native+redux+react-navigationサンプル](https://qiita.com/shoichi1023/items/b5ffb85b160211e53324)

<br />

App.js　―　コンテナとなるファイル。ルートのコンポーネント
navResucer.js　  ―　react-navigationのためのReducer
pageNation.js　　―　react-navigationのnavigatorを作ってる場所。component(ページ)を登録する
allReducer.js　―　reducerをまとめるためのファイル。reducerを作ったらここに登録




<br />

↓　編集しないファイル　↓



```jsx:App.js
import React from 'react';
import { addNavigationHelpers, } from 'react-navigation';
import { createReduxBoundAddListener, createReactNavigationReduxMiddleware, } from 'react-navigation-redux-helpers';
import { createStore, applyMiddleware, } from 'redux';
import { Provider, connect, } from 'react-redux';
import PageNation from './pageNation';
import allReducers from './allReducers';

//reduxとreact-navigationの橋渡し
const middleware = createReactNavigationReduxMiddleware(
    'root',
    state => state.nav,
  );

//storeを作成
const store = createStore(allReducers, applyMiddleware(middleware));

//ページ遷移命令を受け取るためのリスナー
const addListener = createReduxBoundAddListener('root');

//stateを各コンポーネントに渡すための枠組み
class App extends React.Component {
  render() {
    return (
      //container・・・ページ遷移のための枠組み
      <PageNation navigation={addNavigationHelpers({
        dispatch: this.props.dispatch,
        state: this.props.nav,
        addListener,
      })} />
    );
  }
}

//stateをAppコンポーネントに混ぜ込むときの形式を設定
const mapStateToProps = (state) => ({
  nav:state.nav,
});

//connect...stateやdispachを受け取る、受け渡す形式を決める
const Container = connect(mapStateToProps)(App);


//storeをAppに受け渡すための枠組み
class Root extends React.Component {
  render(){
    return (
        <Provider store={ store }>
          <Container />
        </Provider>
      );
  }
}

export default Root;
```


<br />

```navReducer.js
import PageNation, { rootCom } from './pageNation';

//現在のページのstateを取得
const navState = PageNation.router.getStateForAction(PageNation.router.getActionForPathAndParams(rootCom));

const navReducer = (state = navState, action) => {
  //次のページのstateを取得
  const nextState = PageNation.router.getStateForAction(action,state);
  //次のページがあればnextStateを、なければstateを返す
  return nextState || state;
};

export default navReducer
```


<br />
↓　編集するファイル　↓

```pageNation.js
import { StackNavigator } from 'react-navigation';

export const rootCom = '';//ここにルート要素のキーを設定
//const rootCom = 'Page1';

//ページ⇔コンポーネント対応表
const PageNation = StackNavigator({
/*
  Page1: {
    screen: Page1,
  },
  Page2: {
    screen: Page2,
  },
*/
});

export default PageNation
```



<br />

```allReducer.js
import { combineReducers } from 'redux';
import navReducer from './navReducer';

//Reducerをまとめる
const allReducers = combineReducers({
  nav: navReducer,
  /*
  r1: reducer1,
  r2: reducer2,
        .
        .
        .
        .
  */
});

export default allReducers
```



<br />
ごま塩ノイズの除去

デジタル化を行うときに発生するノイズには、インパルスノイズや、ガウシアンノイズがあります。インパルスノイズは電源などに乗ってくる雷や、電源のON/OFF、蛍光灯の点滅、自動車エンジンのプラグなどの衝撃(Impulse)によって発生し、ガウシアンノイズは光が足りなかったりセンサーや回路などが高温になった場合に発生します。

[背景差分で物体抽出](https://qiita.com/goodboy_max/items/71a3b804d14f961c0d91) で作成した画像には、光の映り込みで、白いドットが差分としてでていました。これを、インパルスノイズ(ごま塩ノイズ)の除去テクニックとして有名なメディアンフィルタを使って取れるか試してみましょう。

# 入力画像

![diff.jpg](https://qiita-image-store.s3.amazonaws.com/0/255677/8ce9fa83-4ead-ab68-65ff-a5bb1429ff0e.jpeg)

パット見では、よくわからないので、わかりやすく記載すると白いノイズはコレです。

![diff2.jpg](https://qiita-image-store.s3.amazonaws.com/0/255677/31b9c0ce-ef1d-348d-99ce-7802eb3d0bcb.jpeg)



# 仕組みの説明


メディアンフィルタは、インパルスノイズの除去で利用されます。中央にある画素の値を、まわりの画素の平均値で入れ替えるフィルタです。そのため白いドットがごま塩のように存在している場合、まわりの画素の平均値、例えば3×3ピクセル(アパーチャーサイズが3)の黒0で囲まれたの中央値が白1とすると白い部分が0に変わるフィルタになります。
※RBG値であれば白＝255,255,255 ですがわかりやすいように 1 としています。

例えば、

000
010
000  

という配列があったとすると 1 の周りはすべて 0 なので平均値は 0 なので、

000
000
000

になります。
フィルタのアルゴリズムを実装する場合は、画像の配列を１つ１つ計算していくのでとても面倒です。

# サンプルコード

OpenCVには、cv2.medianBlur というメディアンフィルタ用の関数があります。
なんと1行書くだけで動きます。
アルゴリズムを勉強している人は画像データを配列にぶち込んで自力で実装してみてください。:stuck_out_tongue:

~~~py
# -*- coding: UTF-8 -*-
import cv2

if __name__ == '__main__':

    # 画像の読み込み
    img_src = cv2.imread("diff.jpg", cv2.IMREAD_COLOR)

    # フィルタ実行前画像の表示
    cv2.imshow('frame',img_src)

    # フィルタの実行
    ksize=7 # アパーチャーサイズ 3, 5, or 7 など 1 より大きい奇数。数値が大きいほどぼかしが出る。
    im_mask = cv2.medianBlur(img_src,ksize)

    # フィルタ実行後画像の表示
    cv2.imshow('frame_mask',im_mask)

    # 実行後画像の書き込み
    median_path = './diff_mask.jpg'
    cv2.imwrite(median_path,im_mask)

    cv2.waitKey(0)
    cv2.destroyAllWindows()
~~~

# 実行結果

![diff_mask.jpg](https://qiita-image-store.s3.amazonaws.com/0/255677/6c7d8c5f-08e4-b797-1753-5348ec773b5a.jpeg)

ちゃんと白いドットがなくなりました。
マウスもギザギザが少なくなって若干スムーズな画像となりました。


# 参考資料
https://docs.opencv.org/3.4.0/d4/d86/group__imgproc__filter.html#ga564869aa33e58769b4469101aac458f9
プロキシ認証が必要なネットワーク下で、pacman コマンドが失敗する

#環境
OS：Windows 8.1   
msys2 : 2017年9月17日版  

# 現象
手持ちの環境にmsys2をインストール後、pacman -Syuuコマンドで  
アップデートをかけようとしたところ、エラーで終了。
メッセージを見ていると、どうやらプロキシ認証に失敗。  
~~ほんとこういうのがあるからプロキシ認証って嫌い・・・~~  

#解決方法
結局はLinuxライクに動いているターミナルなので、ホームディレクトリ直下に  
.bashrcがあります。  
ここに、以下の記述を追加してあげて、ターミナルを再起動してあげればよい。
+ export http_proxy=http://[ユーザー名]:[パスワード]@[プロキシサーバ]
+ export https_proxy=http://[ユーザー名]:[パスワード]@[プロキシサーバ]

ユーザ名に＠が含まれる場合は当然%40に変換して記述してあげる必要があります。

なんかここ間違ってるよとかあれば、コメントを下さい。
Leaflet はじめの一歩


久しぶりにLealfetをさらから使おうかとしたら手順忘れてたのでメモ

まっさらな空っぽフォルダしか無い環境から始めます。
npmを使っていきます。

## 環境

Leaflet v1.3.1


## Leafletの設定

### npmの初期化
`npm init`
これでフォルダ配下にpackage.jsonが作成されます。

### Leafletのインストール
`npm i leaflet --save`

node_modulesフォルダとその配下にleafletが作成されます。


## index.htmlの作成
フォルダ配下にindex.htmlを作成します。

Leafletを画面いっぱいで動かす為に、height: 100%;  margin: 0;等を付けています。

```html
<html style="height: 100%; margin: 0;">
<head>
    <title>Leaflet</title>
    <meta charset="utf-8">
    <link rel="stylesheet" href="./node_modules/leaflet/dist/leaflet.css" />
    <script src="./node_modules/leaflet/dist/leaflet.js"></script>
</head>

<body style="height: 100%; margin: 0; overflow: hidden;">

</body>
</html>
```

## Mapの作成

Leafletトップ画面に記載あるのマップの作成方法をやってみます。

[Leaflet - a JavaScript library for interactive maps](https://leafletjs.com/index.html)　の以下の部分をindex.htmlに埋め込みます。

```js
var map = L.map('map').setView([51.505, -0.09], 13);

L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
    attribution: '&copy; <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors'
}).addTo(map);

L.marker([51.5, -0.09]).addTo(map)
    .bindPopup('A pretty CSS3 popup.<br> Easily customizable.')
    .openPopup();
```


という訳で以下になりました。

```html
<html style="height: 100%; margin: 0;">
<head>
    <title>Leaflet</title>
    <meta charset="utf-8">
    <link rel="stylesheet" href="./node_modules/leaflet/dist/leaflet.css" />
    <script src="./node_modules/leaflet/dist/leaflet.js"></script>
</head>

<body style="height: 100%; margin: 0; overflow: hidden;">
    <div id="map" style="height: 100%; width: 100%;"></div>
</body>

<script>
    var map = L.map('map').setView([51.505, -0.09], 13);

    L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
        attribution: '&copy; <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors'
    }).addTo(map);

    L.marker([51.5, -0.09]).addTo(map)
        .bindPopup('A pretty CSS3 popup.<br> Easily customizable.')
        .openPopup();

</script>
</html>
```

動作画面は以下です。IE11でも動いてます。
![image](https://qiita-image-store.s3.amazonaws.com/0/49910/36656623-4a63-6362-9eb1-165f07e12cc3.png)


簡単ですが、以上でLeafletが動作しました。

参考までにpackage.jsonは以下です。

```js

{
  "name": "leaflettest",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "leaflet": "^1.3.1"
  }
}
```
オーバーラップあり正規表現 in Python and Java

参考:
<https://stackoverflow.com/questions/17971466/java-regex-overlapping-matches>

ふつう正規表現のmatchを取るときは、あるマッチで採択された文字列部分は、他のマッチで重複して利用されない。
例えば「 `_apple_banana_cherry_` 」という文字列から、
`/_[^_]+_/`をマッチさせると取れるのは `_apple_` と `_cherry_` の2つ。
オーバーラップする"\_"を利用して `_apple_`, `_banana_`, `_cherry_` の3つを取りたい場合は特殊な指定が必要になる。

pythonの場合
------------

簡単な方法は、正規表現パッケージの `regex` を使い、オプション `overlapped=True` でマッチさせる。

``` {.python}
>>> import regex as re
>>> re.findall("_[^_]+_", "_apple_banana_cherry_")
['_apple_', '_cherry_']
>>> re.findall("_[^_]+_", "_apple_banana_cherry_", overlapped=True)
['_apple_', '_banana_', '_cherry_']
```

Javaの場合
----------

Javaの場合は標準の正規表現パッケージを利用し、startIndexをずらしていく方法をとるのが簡単。

``` {.java}
Matcher m = Pattern.compile("_[^_]+(_)").matcher("_apple_banana_cherry_");
if (m.find()) {
    do {
        System.out.println(m.group());
    } while (m.find(m.start(1)));
}
```

解説:
`/_[^_]+(_)/` で、2番目に出現する `_` を `()`で括ってグループ1として取得できるようにしている。
`m.start(1)`は、グループ1の先頭インデックスを返す。
`m.find(N)`はN番目の文字からマッチを開始するという意味。
なので `m.find(m.start(1))`は、m.find()をグループ1の先頭インデックスから開始するという意味になり、
つまり2回目以降のループでは、マッチした文字列の末尾の `_` から次のマッチを開始するというループになっている。

note:
どのグループを次回マッチの先頭インデックスとするかの指定は、名前付きグループを使ったほうがわかりやすいかもしれない。

``` {.example}
(?<name>PATTERN)
```

また、より複雑なマッチパターンの場合は非キャプチャグループが必要になるかも。

``` {.example}
(?:PATTERN)
```
超初心者が学ぶdate関数

## 自己紹介
2018年新卒の文系出身未経験エンジニアです。

## 背景
社内本棚管理ツールを作成していた際に、借りた日から2週間後の日付を出力したい画面がありました。
それの勉強メモ。

## date関数

書いたコードはこちらです。

```php
    private function returnDate($id)
    {
        $sql = 'UPDATE book SET return_date = :return_date WHERE id = :id';
        $sth = $this->pdo->prepare($sql);
        $sth->execute([':return_date' => date('Y-m-d', strtotime('+2 week')), ':id' => $id]);
    }
```

`execute`する場面で配列を用いて`':return_date'`にdate関数で作成した2週間後の日付を当てはめています。

### date関数とは？

[公式](http://php.net/manual/ja/function.date.php)の内容を初心者なりに噛み砕いて説明すると、

`こちらが指定した書き方に従って日付、時刻を出してくれる関数。基本は現在の日付、時刻だがオプションで出力するものは指定することもできる`

という認識です。
次は上記の`書き方`と`オプション`についてのまとめです。

### format
書き方とはformatのことを指します。
このformatはたくさんあるのですが、これを指定してあげることで好きな出力形態を選べます。
以下はよく使うだろうと思うものを個人的に抜粋しました。

| format           | 説明                                     | 例                    |
|------------------|------------------------------------------|-----------------------|
| d                | 日。二桁の数字（先頭にゼロがつく場合も） | 01 ~ 31            |
| D                | 曜日。3文字形式。              | Mon ~ Sun          |
| j                | 日。先頭にゼロをつけない。               | 1 ~ 31             |
| l (小文字の 'L') | 曜日。フルスペル形式。                   | Sunday ~ Saturday  |
| F                | 月。フルスペルの文字。                   | January ~ December |
| m                | 月。数字。先頭にゼロをつける。           | 01 ~ 12            |
| M                | 月。3文字形式。                         | Jan ~ Dec          |
| n                | 月。数字。先頭にゼロをつけない。         | 1 ~ 12             |
| Y                | 年。4桁の数字。                         |  2018    |
| y                | 年。2桁の数字。                         | 18      |
| a                | 午前、午後（小文字）                 | am , pm          |
| A                | 午前、午後（大文字）                 | AM , PM          |
| g                | 時。12時間単位。先頭にゼロを付けない。   | 1 ~ 12             |
| G                | 時。24時間単位。先頭にゼロを付けない。   | 0 ~ 23             |
| h                | 時。数字。12 時間単位。                  | 01 ~ 12            |
| H                | 時。数字。24 時間単位。                  | 00 ~ 23            |
| i                | 分。先頭にゼロをつける。                 | 00 ~ 59            |
| s                | 秒。先頭にゼロをつける。                 | 00 ~ 59            |

僕の書いたコードでは、出力形態を`年(４桁)-月(２桁)-日(２桁)`にしたかったので引数には`Y-m-d`を渡しています。

### オプション
date関数の第２引数に`strtotime`を用いることで、`strtotime`の引数から見た日時を出力することができます。
僕の書いたコードでは現在から2週間後を指定したかったため、`strtotime(+2 week)`を渡しています。

`strtotime`の書き方はたくさんパターンがあるようなので[公式](http://php.net/manual/ja/function.strtotime.php)の例を見ると多く参考になるかと思います。

##感じたこと
意外と簡単に指定できるのだと感じた。この勉強に関しても使い続けないと慣れてはこないと思うので、新たなパターンを利用するたびに更新していこうと思います。

## 参考文献・引用
[PHP公式　strtotime]　http://php.net/manual/ja/function.strtotime.php
[PHP公式 date]　http://php.net/manual/ja/function.date.php
ブランチを使いこなそう!

#ブランチを使いこなそう!
今回は、[実際にgitへアップロードしてみよう!](https://qiita.com/n_hirai/items/a2ad60ff2bb9ff46fafe)に引き続きブランチを使いこなす手順を説明します。

ブランチについてに説明はこちら↓  

* [ブランチのいろいろ](https://qiita.com/n_hirai/items/06b6d1d5049bd1eecc5f)


##ブランチを作成する

前回つくったディレクトリ内で操作していきます。
まず今あるブランチを表示してみます。

```
:hirai_test n_hirai$ git branch
* master

```  

今はmasterという結合ブランチしかありません。  

では「test」というブランチを作ってみます。  

```
:hirai_test n_hirai$ git branch test

```
そしてまたブランチを表示してみると

```
:hirai_test n_hirai$ git branch
* master
  test
```
testというブランチができてることがわかります。  
 
「*」は現在いるブランチのことを表しています。  

##ブランチを移動する
では次はブランチを移動してみましょう。  

移動したいブランチ名を書きます。

```
:hirai_test n_hirai$ git checkout test

Switched to branch 'test'

```

となりもう一度ブランチを表示してみると

```
:hirai_test n_hirai$ git branch
   master
 * test
```

testに変わったことがわかります。

チェックアウトをすると以前いたブランチの内容を移動したブランチに記憶します。


##ブランチをマージする

masterにマージしたい場合は、一回ブランチをmasterに移動します。

```
:hirai_test n_hirai$ git checkout master

Switched to branch 'master'

```

そして、testブランチをマージします。

```
:hirai_test n_hirai$ git merge issue1
Updating 1257027..b2b23c4
Fast-forward
 myfile.txt |    1 +
 1 files changed, 1 insertions(+), 0 deletions(-)

```

##ブランチを削除する

統合ができたのでtestブランチを削除します。


```
:hirai_test n_hirai$ git branch -d test
Deleted branch test (was b2b23c4)

```

testブランチが削除されたことが分かります。



```
:hirai_test n_hirai$ git branch
* master

```  



##まとめ

今回は基本的なブランチの使い方について説明しました。
masterブランチを使っての作業はいけないので、ブランチを作成して修正をしていきましょう。



##参考文献
[サルでもわかるgit入門](https://backlog.com/ja/git-tutorial/)
5/29レポート課題

# 課題1

```python
#送信電力(w)
Pt = 10000
#送信アンテナ利得
Gt = 4
#受信アンテナ利得
Gr = 10
#距離(m)
d = 40000
#周波数(MHz)
f = 540 

#λ
lamda = 300 / f

#実行面積
Ar = (Gr * (lamda ** 2))/ (4* np.pi)
#受信電力
Pr = (Pt*Gt*Ar)/(4*np.pi*(d**2))

```
答え
    4.886245353122001e-07


# 課題2

```python
#波動インピーダンス
Z=120 * np.pi
#電力束密度
Pd = Pt * Gt /(4 * np.pi * d **2)
#電界強度(自由空間)
Eo = np.sqrt(Z * Pd)
```


答え
0.027386127875258306


# 課題3

```python
#送信アンテナ高さ
h1 = 600
#受信アンテナ高さ
h2 = 120
#電界強度(ハイトパターン考慮)
E = 2 * Eo * np.sin(2*np.pi*h1*h2/(lamda*d))
```



答え
    0.05466417521532467
【SpatiaLite】2頂点からなるLINESTRINGの頂点座標を求める



```sql
-- 2頂点p1(x1, y1), p2(x2, y2)を結ぶ線分（LINESTRING)の頂点座標を求める。
SELECT
	X(p1) AS x1,
	Y(p1) AS y1,
	X(p2) AS x2,
	Y(p2) AS y2
FROM
(
	SELECT
		PointN(geom, 1) AS p1,
		PointN(geom, 2) AS p2
	FROM
	(
		SELECT
			GeomFromText('LINESTRING(0 1, 2 3)', 0) AS geom
	)
)
```

`GeomFromText('LINESTRING(0 1, 2 3)', 0)`のところを任意の`LINESTRING`ジオメトリで置き換えればOKです。
C++ Builder 10.2 Tokyo > TeeChart > データポイントのマウスオーバー強調表示機能の無効化

```txt:動作環境
RAD Studio 10.2 Tokyo Update 3
Windows 10 Pro (64bit) バージョン 1803 (April 2018 Update)
```

### 関連

- [C++ Builder 10.2 Tokyo > TeeChart > UI > 目的の不明なBold表示 | (Hover)機能の無効化](https://qiita.com/7of9/items/d0801b603c6e70247317)

## データポイントのマウスオーバー強調表示

### 備考

データポイントのマウスオーバーにてポイントが強調表示される。

ユーザーは「何か動作するのだろうか？」と考える。

クリックしても何も起きない。

TeeChartのバージョンが上がって標準化されたUIである。

### 実行準備

以下はグラフ表示までの手順。

1. TChartコンポーネントを追加
2. [c++ builder XE4, 10.2 Tokyo > TeeChart > 最初の一歩 > グラフ作成まで](https://qiita.com/7of9/items/c0eb0b85583a197c8a47) に基づき、グラフ作成
   - Fast LineでなくPointを選択
   - 3Dの選択を解除
3. 実装は下記のコードにする
   - データポイントが上部と下部だけにならないように変更した


```Unit1.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include <DateUtils.hpp>
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormShow(TObject *Sender)
{
    Chart1->Series[0]->XValues->DateTime = true;
    Chart1->BottomAxis->DateTimeFormat = L"nn:ss";

    TDateTime dt;

    dt = Now();

    double yval;
    for (int idx=0; idx < 10; idx++) {
        yval = idx;
        Series1->AddXY(dt, yval, "", clRed);
        dt = IncSecond(dt, 1);
    }
}
//---------------------------------------------------------------------------
```

### 実行結果

データポイント上にマウスオーバーすると、ポイントが強調表示される。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/568ece9c-bfe1-6cdf-d6fd-89b0b456fe88.png)


## 機能の無効化

### デザインにて > Seriesに対する変更

1. TChartコンポーネント(例: Chart1)をダブルクリック
   - =>> Editing Chart1が表示される
2. 変更したいSeries(例: Series1)をダブルクリック
3. General > Hover > FormatにあるVisibleのチェックを外す。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/849e9b0a-f93c-8ebb-3a4a-7c5586c535cc.png)

### デザインにて > Chartに対する変更

オブジェクトインスペクタでHoverプロパティのVisibleをFalseにする。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/2a597932-4f94-b67c-7ebb-cf3f40ef442c.png)


### コードにて > Chartに対する変更

以下を追加することで、Chart1のすべてのHover機能を無効化できる。

```
Chart1->Hover->Visible = false;
```
リバースプロキシでUser-agentに応じて任意のリクエストヘッダを追加する

リバースプロキシとして動作しているApacheでは、バックエンドのサーバにリクエストを中継する際に、任意のリクエストヘッダを追加することができる。アクセスしてきたデバイスがスマートフォンの場合のみリクエストヘッダを足したいニーズがあったので設定方法をメモしておく。

### User-agentがスマートフォンの場合のみリクエストヘッダを追加する

```httpd.conf
# User-Agentがスマホの場合は環境変数deviceにsmartphoneをセットする
BrowserMatch "(^MobileSafari|^Mozilla/5\.0 \((iPhone;|iPod;|Linux; U; Android .* Mobile|Linux; Android .* Mobile))" device=smartphone

# 環境変数deviceがsmartphoneの場合、環境変数isspにtrueをセットする
SetEnvIf device ^smartphone$ issp=true

# 環境変数isspが存在する場合、リクエストヘッダX-TEST-HEADERに値SPをセットする
RequestHeader set X-TEST-HEADER SP env=issp
```

### 注意点
- RequestHeader ディレクティブでは環境変数の有無を条件にできるが、環境変数の値は条件にできないため、SetEnvIfディレクティブで環境変数deviceの値を判別している
- mod_headers, mod_setenvifを読み込んでおく必要がある
Windows 10 .NET Framework 3.5 未インストールで、Windowsサービスインストール時に特権がないと言われる件[WiX Toolset固有?]

##■症状
* Windowsサービスのインストーラを実行すると、サービスを開始する特権がないと言われてインストールが正常に完了できない。
* イベントビューアーを確認すると、インストール自体は完了しているがサービスの起動に失敗している(イベントID:1033)。

##■発生環境
* 対象OS: Windows 10 Pro x64 (手元にHomeが無いのでわかりませんが、エディション問わず発生する？)
* 上記Windows 10 Proは、Windows 7 ProのゲストOSとして起動している(VMware)
* Windowsサービスをインストールするmsiを実行する(実務で使用しているサービスでした)
* msiは、[WiX Toolset](http://wixtoolset.org/ "WiX Toolset")を用いて作られたもの。
* 当該Windowsサービスのターゲットフレームワークは.NET 3.5 SP1
* インストール時のサービスログオンアカウントはLocalService
* UACは「通知しない」設定後、OS再起動済み
* OSのログオンアカウントはAdministrator権限のもの

##■参考キャプチャ(サービス名は消去しています)

1. インストール失敗時のエラーダイアログ
![error-install--service-3.png](https://qiita-image-store.s3.amazonaws.com/0/258849/0c66dbf0-34f9-f1e6-8f28-054eb3214463.png)

2. インストール失敗時のイベントログ
![error-install--service.png](https://qiita-image-store.s3.amazonaws.com/0/258849/7b9156ca-6114-04d6-131e-3a2f7be6a6f9.png)

##■さて…LocalServiceアカウントに対して特権がないとはこれいかに
ふーむ、LocalServiceで開始する特権がないとな…。

タスクマネージャを見ても、LocalServiceで起動しているサービスは沢山おりますがな。
試しにLocalServiceで動作している動作中の`sqlbrowser.exe`を停止／開始してみる。
…何も問題ないじゃない。

特権がないとはいったい・・・うごごご！
（とはいえこの辺でさすがに何となく権限うんぬんが問題じゃないんじゃないかと察してくる。）

##■状況の整理
* 本サービスは既定でLocalServiceでインストールされる
* Windows 10 Pro(x86|x64ともに)導入実績あり
* 対象マシンと別のデスクトップ Windows 10 Pro x64でインストールしてエラー無く開始までできる
* 別のゲストOS Windows 7 Professional では素のOSに 問題なくインストール、サービス開始できた

うーん、マシン固有の問題か…？
Windows 10 Pro 間で差があるということは、何か足りてないんだろうなぁ、という自分なりの結論に。
といろいろ考えて、Windows 10マシンをセットアップするときに無意識にやっていること、
ありました、思い出しましたよ。

__素のWindows 10 には.NET Framework 3.5がプリインストールされていないですよ。__

サービス本体のターゲットフレームは.NET Framework 3.5 SP1。
一方、.NET Framework 4系では3.5以下は互換性がない。

冒頭のエラーメッセージと関係が今ひとつ繋がらない気がするけど(私が無知なだけかも)、
まああてずっぽうですがまずは.NET Framework 3.5 SP1 をインストールしてみる。
（心の声：まあ、解決するわきゃないな。）

⇒__問題解決。うそーん。__


##■今後の課題
* WiX Toolset固有の問題か、Visual Studioのsetupプロジェクトでも発生するものかの切り分け(msiなのはどっちも同じだが)
* Windows 10 Home でも再現するか
* 「サービスを開始する『特権』がない」と、ターゲットフレームワークが未インストールであることの関係調査
Chainer, Tensorflowライブラリインポート時のnumpy FutureWarningを解決する

# 環境
Anaconda: 4.4.10
numpy: 1.14.3
tensorflow: 1.8.0
chainer: 4.0.0

# 問題点
2018年5月現在, Winodws上のAnacondaでChainerとTensorflowを導入したところ, ライブラリのimport時に以下の警告が表示された.

```python
>>> import tensorflow as tf
C:\Users\...\lib\site-packages\h5py\__init__.py:36: FutureWarning: Conversion of the second argument of issubdtype from `float` to `np.floating` is deprecated.
In future, it will be treated as `np.float64 == np.dtype(float).type`.
  from ._conv import register_converters as _register_converters
>>>
```

Chainerのライブラリをインポートしたときも同様.

見た感じh5pyってパッケージがnumpy使ってる部分で警告出してるっぽい.
試しにh5pyをライブラリとして単体でインポートしても同じ警告が出る.
警告はインポート時に出るだけでライブラリ自体は問題なく使えてそうなんだけど, 毎度出てるのも煩わしいし人に貸したとき何コレってなるから何とかしたい.

因みにエラーを吐いてるh5pyのバージョンは`2.7.1`でした.


# 解決策
GitHubにIssuesがあった.

- [Future warning numpy](https://github.com/h5py/h5py/issues/974)

解決を確認した方法は以下の２つ.

- h5pyのバージョンを上げる
  
  > pip install h5py==2.8.0rc1
 
- numpyのバージョンを下げる.
  
  > pip install numpy==1.13.3
 
どちらかお好みの方法でどうぞ.

# 蛇足: h5pyって何ぞ
GitHubより.
> h5py is a thin, pythonic wrapper around the HDF5, which runs on Python 2.7, and Python 3 (3.4-3.6).

PythonでHDF5を扱うためのラッパーだそう.
HDF5について詳しくはGoogle先生にお尋ねください.
livy+sparkmagicでjupyterを使う際のTips

sparkmagicを使用すると、jupyter上でSparkクラスタの処理が可能になる。
導入方法は参考リンクを参照。

ノートブック形式で作業をまとめられるのが便利な反面、
sparkmagic特有の問題とかもあるので、まとめてみる。

# Tips

## 一定時間使用しないと、Livyセッションが終了してしまう

デフォルトだと1時間で終了するみたい。
livy.confで「livy.server.session.timeout」を任意の値を変える。

## SQLモードで「IOPub data rate exceeded」エラー

jupyter_notebook_config.pyの値を増やす。
jupyter_notebook_config.pyはデフォルトでは、~/.jupyter/配下にある。

```python:jupyter_notebook_config.py

c.NotebookApp.iopub_data_rate_limit = 1000000
```

## matplotlibが利用できない

Livyで、matplotlibの結果は受け取れないみたい。
 - [[bug] matplotlib is not plotting variables from livy](https://github.com/jupyter-incubator/sparkmagic/issues/322)

Spark DataFrameをregisterTempTableで一時テーブルとして、
SQLモードでローカルへ出力する。
そうすると、ローカルモードでPandasのDataFrameとして値が受け渡されるので、それを使ってグラフを描く。
ローカルモードでjupyterが参照しているpythonカーネルは、PySparkカーネルとは違うので、処理に必要なライブラリは別途設定する必要がある。

```sql:SQLからlocalへのデータ受け渡し
%%sql -o plot_data
select * from spark_dataframe
```

```python:localでの値参照
%%local
%matplotlib inline

plot_data # SQLモードで-oで指定した変数名で参照できる
```

#参考
 - [JupyterからSpark clusterを操作できるlivy + sparkmagicを試してみた](https://chezou.hatenablog.com/entry/2016/07/12/115000)
ffmpeg コマンドメモ

RTPで映像と音声が送られてくる場合のffmpegトランスコード

※パラメータ未チューニング

RTP -> RTMP
```
ffmpeg  -analyzeduration 30M -probesize 30M -protocol_whitelist file,crypto,udp,rtp -re -vcodec h264 -acodec opus -i ~/local.sdp -pix_fmt yuv420p -preset veryfast -r 15 -c:v libx264 -an -acodec copy -b:v 500k -b:a 64k -ar 48000 -bufsize 1024k -maxrate 500k -g 50 -threads 1 -f flv rtmp://127.0.0.1:1935/live/stream
```

RTP -> HLS
```
ffmpeg  -analyzeduration 30M -probesize 30M -protocol_whitelist file,crypto,udp,rtp -re -vcodec h264 -acodec opus -i ~/local.sdp -pix_fmt yuv420p -preset veryfast -r 15 -c:v libx264 -an -acodec copy -b:v 500k -b 500k -b:a 64k -ar 48000 -bufsize 1024k -maxrate 500k -g 20 -threads 0 -flags -global_header -hls_time 2 -hls_list_size 2 -hls_wrap 10 -hls_flags delete_segments -hls_allow_cache 0  -f hls ./hls.m3u8
```
githubからアクセストークンでcloneする

## 概要
dockerなどを使っている場合に、ID/PASSや秘密鍵・公開鍵を使わずに、簡易にcloneできないか調べた内容をメモしておく。

## サンプルコマンド

```
# Config
$ export GIT_EMAIL=hoge@example.com
$ export GIT_USER=hoge
$ export GIT_TOKEN=************************
$ export GIT_REPOSITORY=Example-Inc/example.com.git

# Git
$ git clone https://${GIT_USER}:${GIT_TOKEN}@github.com/${GIT_REPOSITORY} .
$ git config --local user.name ${GIT_USER}
$ git config --local user.email ${GIT_EMAIL}
```

## 参考サイト
- [https+アクセストークンを使ってGitHubのアカウントを使い分ける](https://qiita.com/tq_jappy/items/6e2f81f372e4abaa5139)
SwiftでGenericsを使ったTableViewの実装

# SwiftでGenericsを使ったTableViewの実装
[モバイルアプリ開発エキスパート養成読本：書籍案内｜技術評論社](http://gihyo.jp/book/2017/978-4-7741-8863-8) 中で紹介されている、「タイプセーフでモダンなiOSアプリの設計|UITableViewとUITableViewCell周りの処理」の内容を自分のアプリに適用してみたのでその内容を書き留めておく。

xibファイルを使ったカスタムcellをキャストせずに使えるよう実装。  
RxSwiftからの利用を試す。

## Nibableプロトコルを採用したセルの作成
カスタムCellを利用する場合、UITableViewへの登録を、UINib、reuseIdentifierを使って行うが、これらを指定する際には文字列を渡す必要がある。これはコンパイラが発見できないバグを埋め込む可能性がある。この問題を防ぐため、nib名をセル自身にReuseIdentifier、nib名を返却させるような実装をProtocol、Extentionを使って再利用可能な形で実装する。

まずはnibName, nib を返却するProtocol。クラス名を返す実装はExtension内に定義することで、このProtocolを採用したクラスで必要に応じてクラス名以外を返すよう変更可能。こうすることで再利用性を高めている。

```swift
import Foundation
import UIKit

protocol Nibable: NSObjectProtocol {
    static var nibName: String { get }
    static var nib: UINib { get }
}

extension Nibable {
    static var nibName: String {
        return String(describing: self)
    }
    static var nib: UINib {
        return UINib(nibName: nibName, bundle: Bundle(for: self))
    }
}
```

### UITableViewとUITableViewCellの拡張

UITableViewへの登録、UITableViewからのキャスト無しでのCellの取得両方を、カスタムCellのTypeを渡すだけで可能になるようにUITableViewを拡張する。

```swift
import Foundation
import UIKit

extension UITableView {
    func register<T: UITableViewCell>(_ cellType: T.Type) where T: Nibable {
        register(T.nib, forCellReuseIdentifier: T.identifier)
    }

    func register<T: UITableViewCell>(_ cellType: T.Type) {
        register(T.self, forCellReuseIdentifier: T.identifier)
    }

    func dequeueReusableCell<T: UITableViewCell>(with cellType: T.Type,
                                                 for indexPath: IndexPath) -> T {
        // swiftlint:disable force_cast
        return dequeueReusableCell(withIdentifier: T.identifier, for: indexPath) as! T
        // swiftlint:enable force_cast
    }
}
```

ReuseIdentifierはStringを渡す必要がありこれもコンパイラが発見できないバグを埋め込む可能性がある。この問題を解決するために、UITableViewCellからクラス名を返すよう拡張する。

```swift
import Foundation
import UIKit

extension UITableViewCell {
    static var identifier: String {
        return String(describing: self)
    }
}
```

### カスタムCellの実装
作成したNibableプロトコルを採用したカスタムCellを実装する。

```swift
import UIKit

class MicropostTableViewCell: UITableViewCell, Nibable {
    func configure(micropost: Micropost) {
        textLabel?.text? = micropost.content
        detailTextLabel?.text? = String(micropost.userId)
    }

}
```

このように作成したメソッドを、外部からはキャストすることなく呼び出せる。RxSwiftから利用した例を以下に。

## RxSwiftからの利用
ViewModelが持つVariableをDriverに変換してfeedTableView.rx.itemsにバインドしている。(feedTableViewは、フィード表示用にViewControllerで持っているTableView。)

```swift
viewModel.feeds.asDriver().drive(
    feedTableView.rx.items(cellIdentifier: MicropostTableViewCell.identifier,
                            cellType: MicropostTableViewCell.self),
    curriedArgument: { row, micropost, cell in
        cell.configure(micropost: micropost)
}).disposed(by: disposeBag)
```
取り出したcellに対してはキャストすることなく独自実装したconfigureメソッドが呼び出せている。

## その他
今回作ったものはこちら。

[RxSwiftRailsTutorial_RxSwiftRailsTutorial at table-view · kfurue_RxSwiftRailsTutorial](https://github.com/kfurue/RxSwiftRailsTutorial/tree/table-view/RxSwiftRailsTutorial)