OmniAICreator/Qiita-1.07M huggingface dataset:
セミナー「開校！サルでもわかるGitスクール 　-Adobe x Nulabプレゼンツ-」に参加して、情報共有と備忘録

#はじめに
セミナー「[開校！サルでもわかるGitスクール 　-Adobe x Nulabプレゼンツ-](https://techplay.jp/event/626951)」に
参加してきたので、その情報共有と備忘録の記事です。

投稿内容に誤りがありましたらご指摘よろしくお願いします。

#セミナーのタイムテーブル
セミナーのタイムテーブルは以下でした。
1. Gitの基礎知識
2. DreamweaverとBacklogで運用するサイト制作
3. パネルディスカッション

##1. Gitの基礎知識
このパートはGitの基本をDreamweaverのGUI的操作で実演するという内容でした。

Dreamweaverとは?
>Dreamweaver（ドリームウィーバー）とは、Adobe社が販売しているWebオーサリングツールの名称を指します。 
ビジュアルな作業とコード編集の両方を駆使しながら、確実にWebサイトやWebアプリを構築出来るツールとして、プロのWebデサイナー達にとても人気のあるソフトです。
[初心者の為のDreamweaver講座!](http://www.drmwvr.net/m1-learn/01.html) より引用

###Gitって何?という問いに対して
- ファイル編集の過程でセーブポイントを増やせる
- どのセーブポイントでも戻れる
- 誰が, いつ, どの場所を, 何のために 変更したのかを記憶している

###まずはこれだけ理解しておけばOKということ
- **リポジトリ, ステージ, コミット**をおさえればOK
- リポジトリ：Gitで監視されたフォルダのこと
- ステージ：コミットする対象を選ぶこと
- コミット：変更履歴を保存すること

　
実際にセミナーではここまで箇条書きで記述した内容を踏まえながら、Dreamweaver
での実演に移りました。
ですが私自身の開発環境でDreamweaverを使用していないので、簡易な図を示して
流れを記述することで代替したいと思います。

![pic](https://cl.ly/1i2V2u390O0g/git.png)

流れとしては以下になります。
1. ローカルリポジトリをリモートリポジトリ[^1]と同期する(git pull)
2. ワーキングツリー[^2]で何らかの更新作業
3. インデックス[^3]にコミット対象を登録する(ステージ)
4. コミットを登録する(コミット)
5. ローカルリポジトリ[^4]の更新をリモートリポジトリに反映する(git push)

[^1]: 複数人で共有するネットワーク上のリポジトリ
[^2]: 更新をしている対象
[^3]: コミット対象を登録している場所
[^4]: 個人的な作業リポジトリ

より詳細な説明やコマンドについては以下の他の方のサイトやリンクをご参照頂くと
良いかと思います。


- [サルでもわかるGit入門](http://www.backlog.jp/git-guide/)
- [いまさら聞けないgitの使い方](http://qiita.com/mountcedar/items/682743c95fd3b8fc274b)

##2. DreamweaverとBacklog[^5]で運用するサイト制作
このパートはGitを運用する上で生じがちな疑問への提言と、BacklogでのGit操作の実演という内容でした。

Backlogに関しては以下のサイトをご参照ください。
[http://www.backlog.jp/](http://www.backlog.jp/)
[^5]: プロジェクト管理ツール

###Q1. Gitで何を管理すればよいのか?
- 何を管理しても良い。
- ただ、容量が大きなファイルは負荷がかかるので除外も検討した方が良い。

###Q2. いつコミットすればよいのか?
- 細かくコミットする。
- 細かくコミットする分にはVersionを戻すときに遡りやすい。
- タスク単位でコミットするのがよいのではないだろうか。

###Q3. ブランチ[^6]はどのような時に作成すればよいか?
- masterブランチ(本番リリース用)とdevelopブランチ(開発用)で分ける。
- 今から更新する内容が成功するかどうか分からない時に別のブランチを作成する。

[^6]: 分岐した更新履歴の流れ


###Q4. リモートリポジトリが無法地帯とならないために必要なことは?
- コミットするファイルのルール化
- ブランチの作成と運用のルール化
- コミットコメントのルール化

※Backlogの実演のトレースについては私自身の開発環境で使用していないので割愛

##3. パネルディスカッション
このパートはセミナーの参加者から寄せられた質問に対して、パネラーが見解を
回答するという内容でした。
ですが、ここでの内容は正確なメモが残せていないので詳細は割愛します。
RecyclerView の要素を循環させる

# 概要
要素が循環する RecyclerView の実装方法について説明します。

## なぜ要素を循環させたいのか？
Android スマートフォンを片手で操作する際、画面横幅一杯に配置した RecyclerView で横一列に要素を並べると、右利きの場合は左端に置いてある要素をタップしにくいと感じることがあります。要素が循環するように実装できれば、左端の要素を右端までスクロールして持ってきてからタップできるので、便利ではないかと考えました。

## 具体的には RecyclerView の要素をどう配置したいのか？
こんな感じの RecyclerView にしたいです。RecyclerView の要素は先頭が0で最後尾が∞です。

![ezgif-3-be4129204e.gif](https://qiita-image-store.s3.amazonaws.com/0/102004/e83a13d1-b974-54bd-7ad0-8d4f47de976c.gif)

∞ の次は 0 が出てきます。

## どう実装するか？
下記の Answer の通りに実装すれば簡単でした。

- [How do I create a circular (endless) RecyclerView?](https://stackoverflow.com/questions/31253555/how-do-i-create-a-circular-endless-recyclerview)

まあ、考えようでして、Adapter.getItemCount にものすごく大きな値を設定して、Adapter.onBindViewHolder で下記のように Item を取り出す、というやり方です。厳密には循環しているわけではありませんが、通常の使用には特に問題はありません。

## 実行環境

| 項目 | 値
|:---|:---
| Android OS | 6.0
| compileSdkVersion | 25
| buildToolsVersion | 25.0.3
| Programming Language | Java

----

# 実装
以下の3ステップで実装可能です。RecyclerView.Adapter を修正するだけで実装可能で、特にライブラリは必要ありません。

1. RecyclerView.Adapter.getItemCount の戻り値を極端に大きな値にする
2. RecyclerView.Adapter.onBindViewHolder で、position を 0-items.size() までの範囲に収める
3. 初期位置を中央にずらす

## 1. RecyclerView.Adapter.getItemCount の戻り値を極端に大きな値にする
上記 Stackoverflow の例では Integer.MAX_VALUE を指定しています。極端に大きな値であれば特に何でも構いません。

```java
@Override
public int getItemCount() {
    return Integer.MAX_VALUE;
}
```

## 2. RecyclerView.Adapter.onBindViewHolder で、position を 0-items.size() までの範囲に収める
position には極端に大きな値が入るようになるため、RecyclerView の Item の個数を最大とする値に収めます。position を Items の要素数で割った余りを用いるように修正します。

```java
@Override
public void onBindViewHolder(final ViewHolder holder, final int position) {
    final Item item = items.get(position % items.size());
    //...
```

## 3. 初期位置を中央にずらす
RecyclerView の初期位置を中央までずらしておくことで、左右どちらにスクロールしても終わりが見えない感じを出す、という仕掛けです。

初期位置の設定は LayoutManager.scrollToPosition(int) で可能です。

```java
final LinearLayoutManager layoutManager
                = new LinearLayoutManager(activityContext, LinearLayoutManager.HORIZONTAL, false);
recyclerView.setLayoutManager(layoutManager);
layoutManager.scrollToPosition(Adapter.mediumPosition());
```

----

# まとめ
RecyclerView.Adapter に修正を加えるだけで、要素が循環する RecyclerView を実装することができました。片手で両端の要素をタップしたい時などに役立つと思います。

----
# リンク
- [修正差分(GitHub)](https://github.com/toastkidjp/PlanningPoker/commit/98e945afcaba07eda5c66e89e10fa7f1c72b7f5b)
- [How do I create a circular (endless) RecyclerView?](https://stackoverflow.com/questions/31253555/how-do-i-create-a-circular-endless-recyclerview)
CakePHP 3 でトランザクションを入れ子にできるか？

CakePHP3で開発をしていて、PHPUnitで少し複雑なテストをしようとごにょごにょやってたら、トランザクションをネストしてロールバックしたくなったので調べました。

# SQLにおけるトランザクションはネストできるか？

本記事でいうトランザクションとはSQLのアレです。[コレ](https://dev.mysql.com/doc/refman/5.6/ja/glossary.html#glos_transaction)です。ではそもそもトランザクションとはネストできるものなのかというと、通常はできません。詳しくは下記の記事に詳しく書いてありました。

[トランザクションをネストしたらどうなる？　内側だけロールバックできる？ - Qiita](http://qiita.com/yuba/items/9b5b86bc3e128a84db5e)

記事によると、TRANSACTION命令だけでなく、SAVEPOINTを使えば部分的ロールバックが可能だということです。CakePHP3ではどうすればよいのでしょうか。

# 結論：CakePHP3ではトランザクションをネストできる

結論から先に言うと、CakePHP3では普通に**トランザクションをネストできます。**内部的には前出のSAVEPOINTを利用して実現されています。詳細はcakephp/src/Database/Connection.phpのbegin()メソッドのソースを見ればすぐわかります。CakePHP 3.4時点でのコードを引用してみます。

```cakephp/src/Database/Connection.php
    /**
     * Starts a new transaction.
     *
     * @return void
     */
    public function begin()
    {
        if (!$this->_transactionStarted) {
            if ($this->_logQueries) {
                $this->log('BEGIN');
            }
            $this->_driver->beginTransaction();
            $this->_transactionLevel = 0;
            $this->_transactionStarted = true;
            $this->nestedTransactionRollbackException = null;
            return;
        }
        $this->_transactionLevel++;
        if ($this->isSavePointsEnabled()) {
            $this->createSavePoint($this->_transactionLevel);
        }
    }
```

こんな感じで、begin()メソッドをネストして使うと最初のif文の```!$this->_transactionStarted```がfalseになるためSAVEPOINTの作成処理が実行されます。部分的ロールバック等も普通にできます。

注意点としては、```$this->isSavePointsEnabled()```でfalseが返ってくる場合はネストできません（少し前のバージョンだと```$this->useSavePoints()```だったりします）。こちらはドライバの実装に依ると書かれていますが、今のところMySQL, Postgres, SQLite, SQL Serverの全てで利用可能であるようです。

というわけで、基本的には何も考えずbegin()を複数回ネストしても大丈夫です。Cake側でよしなにやってくれます。Cake万歳。
gem 'pinp'で座標情報を扱う

#できる事
1.座標を点(Pointクラス)として扱う
2.Pointを3つ以上格納した配列から領域(Polygonクラス)を生成
3.座標(Point)が領域(Polygon)に含まれているか判定する(contains_point?メソッド)

# 使ってみる
##1.Gemfileに以下を追加してインストール

```ruby:Gemfile
gem 'pinp', git: 'https://github.com/kimhunter/PointInPolygon.git'
```
## 2.requireして使う準備

```ruby:sample.rb
+ require "pinp"
```

## 3.領域を生成するための配列を用意

```diff:sample.rb
require "pinp"

+ points = []
```
## 4.座標(Point)を作成して配列に格納

###※引数には(x軸の値, y軸の値)を指定


```diff:sample.rb
require "pinp"

points = []
+ points << Pinp::Point.new(0,0)
+ points << Pinp::Point.new(20,0)
+ points << Pinp::Point.new(20,20)
+ points << Pinp::Point.new(0,20)
```

## 5.座標(Point)の集合から領域を生成

```diff:sample.rb
require "pinp"
points = []
points << Pinp::Point.new(0,0)
points << Pinp::Point.new(20,0)
points << Pinp::Point.new(20,20)
points << Pinp::Point.new(0,20)

+ pgon = Pinp::Polygon.new points
```

##6. 新しい座標(Point)を作成して生成した領域に含まれるか判定(contains_point?メソッド)

```diff:sample.rb
require "pinp"
points = []
points << Pinp::Point.new(0,0)
points << Pinp::Point.new(20,0)
points << Pinp::Point.new(20,20)
points << Pinp::Point.new(0,20)

pgon = Pinp::Polygon.new points
+ puts pgon.contains_point? Pinp::Point.new(10, 10)
+ puts pgon.contains_point? Pinp::Point.new(20.1 ,10)

#=> true
#=> false
```

# ソース
https://github.com/kimhunter/PointInPolygon
【3分レシピ】Mastodon/Qiitadon アプリを MacOSX で作る

以下は、今は無き Qiita の [Mastodon](https://www.google.com/search?q=site:qiita.com+Mastodon%E3%81%A8%E3%81%AF) サーバー [Qiitadon](https://qiitadon.com/) のクライアント・アプリを 3 分で作る例。

<img width="100%" alt="スクリーンショット 2017-07-30 22.20.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/78776/1665d395-778a-d797-ea54-b83ec6ec552c.png">
<img width="50%" align="left" alt="スクリーンショット 2017-07-30 22.16.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/78776/30f62f9a-ed8e-e0ed-2aad-df60874f7b91.png">

1. [Automator](/search?q=Automator%E3%81%A8%E3%81%AF)を立ち上げ、アプリケーションの作成を選ぶ
2. 「指定されたURLを取得」と「Webサイトポップアップ」のアクションを追加する
3. 「指定されたURLを取得」には「`https://mastodon.com/`」を追加する[^youtube]
4. 「Webサイトポップアップ」はサイズを「iPhone」、UAを「iPhone」、出力は「入力URL」を選ぶ[^custom]
5. 保存して完了

[^youtube]: ステップ3で、Youtubeの再生リストの埋め込みタグ内にあるURLを入れるとYoutube垂れ流しプレーヤーにもなります。

[^custom]: ウィンドウサイズが大きい場合は「カスタム」にします。
初めてのajax

##はじめに
Webアプリケーションの元ができたので、ajaxを動かして見ようと思いました。
javascriptがjsonを取り込んで、非同期処理でDBアクセスしたりする仕組みと言う言葉では理解していたものの、実装したことがなかったので実装してみました。

##お手本探し
下記のページを参考に作り始めました。

テックノート – はじめてAjaxを実装する人へ、効率的な学習方法について書きました
http://javatechnology.net/ajax/biginer-start-up/

以下引用

```js

function() {
    $.ajax({
      url: 'http://localhost:8080/AplExample/family',
      type:'GET',
      dataType: 'jsonp',
      timeout:1000,
      success: function(data) {
                   alert("ok");
               },
      error: function(data) {
                   alert("ng");
             }
    });
});
```

なるほど。URLで読み込んだ情報を出力するのか。これをいじっていこう。

##PHPでjsonを出力
以前作ったPHPの実行環境でJSONを出力。

```php
<?php
$json = array(
    'aaa' => '1',
    'bbb' => '2',
    'ccc' => '3',
    'ddd' => '4',
);

echo json_encode($json);
```

##これで出るかな？
dataTypeは読み込むデータ形式によって変えるものらしい。JSONなのでJSONに。

```js

<script src="https://code.jquery.com/jquery-3.0.0.min.js"></script>
<script>
<!--
(function() {
    $.ajax({
      url: 'http://192.168.xx.xx/json', // jsonのURL
      type:'GET',
      dataType: 'json',
      timeout:1000,
      success: function(data) {
                   alert(data);
               },
      error: function(data) {
                   alert("ng");
             }
    });
})();
// -->
</script>
```

結果
[object Object]

object Objectってなんだよ。

##動いた！
調べたら、HashMap形式、PHPのarrayと同じ方法で参照できるらしい。


```js

<script src="https://code.jquery.com/jquery-3.0.0.min.js"></script>
<script>
<!--
(function() {
    $.ajax({
      url: 'http://192.168.xx.xx/json', // jsonのURL
      type:'GET',
      dataType: 'json',
      timeout:1000,
      success: function(data) {
                   alert(" aaa =" + data["aaa"] + "\n" +
                         " bbb =" + data["bbb"] + "\n" +
                         " ccc =" + data["ccc"] + "\n" +
                         " ddd =" + data["ddd"] );

               },
      error: function(data) {
                   alert("ng");
             }
    });
})();
// -->
</script>
```

結果

aaa = 1
bbb = 2
ccc = 3
ddd = 4

期待どおり。あとはjsonをPHPのロジックで変更できるようにしたら思い通りに動かせそう。
vimrcを書くのが面倒なら Ultimate vimrc を導入してみよう

## Ultimate vimrc とは

[The Ultimate vimrc](https://github.com/amix/vimrc)

**Amir Salihefendic 氏** が配布している **ぼくのかんがえたさいきょうのvimrc** です

## 導入

以下の Basic もしくは Awasome のどちらかをインストールします

### basic （基本版） インストール

```shell-session
# git clone --depth=1 git://github.com/amix/vimrc.git ~/.vim_runtime
# sh ~/.vim_runtime/install_basic_vimrc.sh
```

### Awasome （拡張版） インストール

```shell-session
# git clone --depth=1 https://github.com/amix/vimrc.git ~/.vim_runtime
# sh ~/.vim_runtime/install_awesome_vimrc.sh
```


## 使用感

これから

インストール後に顔文字が出てかわいい

```shell-session
# sh ~/.vim_runtime/install_awesome_vimrc.sh
Installed the Ultimate Vim configuration successfully! Enjoy :-)
```

## 警告対策

(2018.01.07 追記)

Awasome版をインストールすると、Vimを起動するたびに警告が表示されるようになった。

```
$ vim hoge
vim-go requires Vim 7.4.1689 or Neovim, but you're using an older version.
Please update your Vim for the best vim-go experience.
If you really want to continue you can set this to make the error go away:
    let g:go_version_warning = 0
Note that some features may error out or behave incorrectly.
Please do not report bugs unless you're using Vim 7.4.1689 or newer.
続けるにはENTERを押すかコマンドを入力してください
```

プラグインのバージョン衝突っぽい  
警告どおりのパラメータを、ユーザー設定 `.vim_runtime/my_configs.vim` にセット

```shell
echo "let g:go_version_warning = 0" >> ~/.vim_runtime/my_configs.vim
```

警告が出なくなります👐 ※根本的な対策ではありません
一つのプロジェクトでWebStormとPHPStormを同時に開いてよしなにやる方法

バックエンドはPHPで作ってフロントエンドはJSみたいな構成でプロジェクトを作ったときのことです。

WebStormとPHPStormを併用したかったのですが、2つのIDEで同時にこのプロジェクト開くと
片方で開いたファイルがもう片方で勝手に開かれてしまうなど思ったよういきませんでした。

解決方法を探す/設定項目の場所を探すのに手こずったでメモしておきます。。

[How do I open the same project twice? – IDEs Support (IntelliJ Platform) | JetBrains](https://intellij-support.jetbrains.com/hc/en-us/community/posts/207060065-How-do-I-open-the-same-project-twice-
)

## TL:TD;
原因はどちらのIDEも同じ.ideaディレクトリを参照してしまうためです。
そのため複数のワーキングプロジェクトを作成し、
片方はリソース参照でメインのプロジェクトのディレクトリを指定しましょう。

## 解決方法
併用する複数のIDEA IDEのうち、片方のために別のワーキングディレクトリを作成し、
そのディレクトリをプロジェクトとして開きます。

次に、**メニューの中のWebStorm/PhpStormの中にあるPreferencesを開き*
Directoriesを選択してください。
*環境によって Settings　の中？とかにあるかも。

最後に、プロジェクトルートを選択して、「＋Add Content Root」をクリック、
本来使いたいワーキングディレクトリを選択してください。

これにより、プロジェクトの中にある、 .ideaディレクトリが
IDEごとに別のディレクトリとして存在することになり、設定やタブの情報が共通ではなくなります。
【個人メモ】CentOS 環境構築時にやること

## 目的

vagrant box から php, mysqlが利用できる環境を作る

* Q. mariaDBじゃないの？
* A. 事情がありMysql



## 手順

2017.07.30 仮想環境構築を行ったときの手順

vagrant box は bentoのCentOS 6.8を利用

```rb:Vagrantfile
config.vm.box = "bento/centos-6.8"
```

### command

作業に必要なコマンドなど

```
yum -y install vim htop curl yum-utils
```

リポジトリを追加

```
yum -y install epel-release
wget http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
rpm -Uh ./remi-release-6.rpm
curl -s https://repos.fedorapeople.org/repos/jkaluza/httpd24/{epel-httpd24.repo} -o /etc/yum.repos.d/#1
yum-config-manager --enable epel remi epel-httpd24
```

インストール

```
yum -y install httpd24
yum -y install php71
yum -y install mysql-server mysql-client # 5.5以上が入るはず

ln -s /opt/rh/httpd24/root/etc/httpd /etc/httpd
mkdir -p /var/www/
ln -s /opt/rh/httpd24/root/var/www/html /var/www/html

cat /usr/share/mysql/my-small.cnf | egrep -v "^#.*$" > /usr/share/mysql/my.cnf

service mysqld start
mysql_secure_installation


chkconfig httpd24-httpd on
chkconfig mysqld on
chkconfig iptables off
chkconfig ip6tables off

```

## 参考

* [[Apache2.4] yum経由でApache2.4 をインストールしてPHP5.6を動かすまで](http://qiita.com/pb_tmz08/items/edd737affa0e2671d422)
全モデルで使えるシンプルなインポート機能を実装する

# 概要
Rails5で導入された、ApplicationRecordクラスに実装することにより、全モデルでシンプルなインポート機能を使えるようにする。

# 環境
* Ruby 2.3.1
* Rails 5.1.2

# 方法
## activerecord-importを導入
インポートをとても楽にしてくれるactiverecord-importを導入します。（参考：[【Rails】activerecord-import でデータを bulk-insert するのが超便利でイケメン河童になる](http://kappa-game.hatenadiary.jp/entry/2016/03/15/%E3%80%90Rails%E3%80%91activerecord-import_%E3%81%A7%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92_bulk-insert_%E3%81%99%E3%82%8B%E3%81%AE%E3%81%8C%E8%B6%85%E4%BE%BF%E5%88%A9%E3%81%A7%E3%82%A4%E3%82%B1)）今回の話の本質ではないですが、すごい便利なので紹介がてら使います。

インストールは普通通り、下記をGemfileに追加してbundle installする。なお、active adminを導入している場合は既にインストールされているかもしれません。その場合は無視してください。

```Gemfile
gem 'activerecord-import'

```

## ApplicationRecordクラスに実装
Rails5から全てのモデルはApplicatonRecordクラスから継承されるようになりました。よって、全てのモデルで使いたいメソッドは、ApplicationRecordクラスに実装すれば呼び出すことができます。
今回は、インポートするためのメソッド __simple_import__ メソッドを下記の様に実装します。

```app/models/application_record.rb
class ApplicationRecord < ActiveRecord::Base

  def self.simple_import(path: '', col_sep: ',')
    a = []
    CSV.foreach(path, headers: true, col_sep: col_sep) do |r|
      a << self.new(get_import_params(r))
    end
    import a # activerecord-importのメソッドです。
  end

private
  def self.get_import_params(row)
    headers = row.headers & self.column_names # 存在するカラム名のみに限定する
    headers.each_with_object({}) do |c, h|
      h[c.to_sym] = row.field(c)
    end
  end
end
```

ちなみに、aはarray、rはrow, hはhash、cはcolの略のつもり。

# 使い方
## モデル
* 例えば、idとnameとcolorカラムを持つFruitモデルを想定します。

```app/models/fruit.rb
class Fruit < ApplicationRecord
end
```

## csvデータ
* インポートするcsvを用意します。

例えば、インポートするデータをdbフォルダ直下に用意します。

```db/input.csv
id,name,color,kansou
1,apple,red,oisii
2,banana,yellow,amai 
```

1行目はヘッダーで、2行目以降がデータです。

インポートしたいカラムには __必ずカラム名と同じ名称__ をつけてください。なお、存在しないカラム名はインポートされません。（この例ではkansou）

## インポート
このcsvデータをインポートするためには、 __Fruit.simple_import__ をするだけです。

例えば、rails consoleから下記の様にコマンドをうてばインポートされます。（ちゃんとkansouカラムは無視されます）

```rails_console
> Fruit.simple_import(path: 'db/input.csv', col_sep: ',')
```

以上
vue-routerでページ遷移を検知して、GAのpageviewを送信する

[合同会社kumanote](http://kumano-te.com/)のTanakaです。
`vue-router`使用時にページ遷移を検知して、Google AnalyticsのBeaconを飛ばす実装の紹介になります。

## ページ遷移の検知

`$route`という変数を`watch`することで、ページ遷移を検知することができます。

単一の`router-view`を使っている場合は、一箇所実装することで
全てのページ遷移に反応して、処理を行うことができます。
（※ 複数の`router-view`を使っている場合は別の作り込みが必要になります。）

具体的には以下のような感じになります。

```html
<template>
  <router-view></router-view>
</template>

<script>
export default {
  watch: {
    '$route': function (to, from) {
      if (to.path !== from.path) {
        // ここに処理を追加します。
      }
    }
  }
}
</script>
```

## GAの送信

[こちら](https://developers.google.com/analytics/devguides/collection/analyticsjs/single-page-applications?hl=ja)が参考になります。

```js
ga('set', 'page', '/new-page.html');
ga('send', 'pageview');
```

みたいに送信するといいようです。

最終的には以下のような形になります。
（※ アプリの起動時にgaのライブラリ読み込みは前提になります。）

```html
<template>
  <router-view></router-view>
</template>

<script>
export default {
  watch: {
    '$route': function (to, from) {
      if (to.path !== from.path) {
        window.ga('set', 'page', to.path);
        window.ga('send', 'pageview');
      }
    }
  }
}
</script>
```

以上になります。
postgresql in jupyter

```
pip install ipython-sql
conda install psycopg2

brew install postgresql
echo 'export PGDATA=/usr/local/var/lib/pgsql/data' >> ~/.zshrc
source ~/.zshrc
initdb
brew services start postgresql

jupyter-console

%load_ext sql
%sql postgresql://@localhost/postgres
# => 'Connected: @postgres'

%sql create table test_table (id int, name text)
%sql insert into test_table values (1, 'a'), (2, 'b')
df = %sql select * from test_table
df
```
一般の人にもわかる範囲でメールリンクの難読化ができないか考えた

## 背景

メールアドレスを収集されるリスクがあるとはいっても、やはりウェブサイトにはコンバージョン向上の思惑などでmailtoリンクが必要になります。
なので、通常はこのような難読化ツールのお世話になっているわけなのですが…

http://www.luft.co.jp/cgi/coding.php

CMSテーマの制作中に「**クライアントが、設定画面からメールリンクのアドレスを変更できるようにしたい**」という要件が出てきて悩んでしまいました。

複数行のブログカスタムフィールドを作って、その欄に先述の難読化ツールのコードを書いてもらうのは危なすぎます。
また、先述のコードは単純なメールリンクの生成なので、リンクがボタンになっていたり、メールリンクのラベルにアイコンが付いていたりという状況に対応できません。

なので、一般の人にもわかる範囲の書き方（かつ推測されにくい）で「プチ難読化」させ、それを整形する手段を考えてみました。

テーマからの出力時にbase64エンコードできるのが理想ですが、PHPが書けないCMSではできないし、IE9が非対応らしいので…

## 実装手順

### 1. ライブラリを追加

テーマ内に、以下のjQueryのライブラリを読み込みます。

mailto.js
https://gist.github.com/webbingstudio/b962ad96a0a4b6803a298e35d95ee418

### 2. プチ難読化したメールアドレスを入力

続いて、ブログの設定画面から、クライアントに以下の書式でメールアドレスを入力してもらいます。

```
(@より後の前半)***(@より前)***(@より後の後半)
```

メールアドレスが「info[at]example.com」なら「examp\*\*\*info\*\*\*le.com」となります。

### 3. テーマ側で出力

CMSのテーマ側で以下の通り出力させると、自動的にメールリンクに変換します。

#### 基本的な使い方

```
<a href="#" class="js-mailto" data-mailto-set="（難読化したアドレス）">メールを送る</a>
```

#### hrefだけでなくテキストもメールアドレスに置き換える

```
<a href="#" class="js-mailto" data-mailto-set="（難読化したアドレス）" data-mailto-changetxt="true">メール</a>
```

#### span要素やtd要素にメールアドレスを出力したい場合

```
<span class="js-mailto" data-mailto-set="（難読化したアドレス）" data-mailto-changetxt="true">メール</span>
```

## まとめ

すべての文字を逆順に書かせることも考えましたが、逆に見破られやすいかなと思い、3分割にしました。

メールアドレスに「\*\*\*」が入っていたケースまでは流石に考慮していません。ですが、上記ライブラリは対象クラスをjs-mailto以外にしたり、セパレータを変更したりもできます。
その辺りはコードを参照ください。

そもそも最近の収集ボットって、DOM整形した後のドキュメントも拾えるのではないだろうか？
という根源的な疑問も生じています…
php　ビルトインサーバーで開発

# PHP ビルとインサーバーでローカル開発環境を構築

下記サイトにこのような説明があります。

http://php.net/manual/ja/features.commandline.webserver.php

PHP 5.4.0 から、CLI SAPI にはウェブサーバーの機能が組み込まれるようになりました。

このウェブサーバーは単一のシングルスレッドプロセスしか実行しないので、 リクエストがブロックされると、PHP アプリケーションはストールします。

URI リクエストの処理は、PHP を開始した時点の作業ディレクトリから行われます。 -t オプションを使えば、ドキュメントルートを明示的に指定することができます。 URI リクエストにファイルが含まれない場合は、指定したディレクトリにある index.php あるいは index.html を返します。どちらも存在しない場合は、 親ディレクトリにさかのぼって index.php と index.html を探します。 どちらか一方が見つかるか、あるいはドキュメントルートに達するまでこれが続きます。 index.php あるいは index.html が見つかるとそれを返し、 $_SERVER['PATH_INFO'] が URI の末尾にセットされます。 見つからなかった場合はレスポンスコード 404 を返します。

## 使い方
下記の方法で通常起動

```
php -S localhost:8000
```

下記の方法がドキュメントルートを指定しての起動

```
php -S localhost:8000 -t /Users/username/Documents/Devlop/
PHP 5.6.30 Development Server started at Sun Jul 30 20:30:35 2017
Listening on http://localhost:8080
Document root is 
/Users/username/Documents/Devlop/
Press Ctrl-C to quit.
```

control C で停止
rubyXL で Excel 生成したいときの Tips 集

## 始めに

今どき Excel で読み書きしようとしている時点で方針が間違っています。引き返しましょう。

## install するには？

```shell
gem i rubyXL
```

## Hello World するには？

```ruby
require "rubyxl"
@workbook = RubyXL::Workbook.new
@sheet = @workbook.first
@sheet.add_cell(0, 0, "Hello World")
@workbook.write("out.xlsx")
`open out.xlsx`
```

## 上の Hello World ができないときは？

面倒なことに、バージョン 3.4.0 以降は、便利メソッドが別のファイルに分けられてデフォルトでは require されていないので↓が必要だそうです

```ruby
require 'rubyXL/convenience_methods'
```

たぶん、↑をしておかないと、↓のコードもほとんど動かないでしょう

## 直接バイナリーで欲しいときは？

```ruby
@workbook.stream.read
```

Rails で send_data するとき用

## 既存のファイルを読むには？

```ruby
@workbook = RubyXL::Parser.parse("file.xlsx")
```

## 1つめのシートを参照するには？

```ruby
@sheet = @workbook.first
```

## 2つ目のシートを作るには？

```ruby
@sheet = @workbook.add_worksheet("2つめのシートの名前")
```

## 既存のシートの名前を変更するには？

```ruby
@sheet.sheet_name = "シートの名前"
```

## A列の横幅を変更するには？

```ruby
@sheet.change_column_width(0, 1.0) # よくわからないが 1.0 で1文字分ぐらいの幅だった
```

## 座標の扱いは？

- 横(x)も、縦(y)も、 `0` が基点
- `(x, y)` はすべて逆の `(y, x)` で指定

## (x, y) のセルを取得するには？ (なければ作る)

```ruby
@cell = @sheet.add_cell(y, x, "", nil, false)
```

## 左よせ・センタリング・右よせ するには？

```ruby
@cell.change_horizontal_alignment("left")
@cell.change_horizontal_alignment("center")
@cell.change_horizontal_alignment("right")
```

## 3桁毎のカンマ区切りにするには？

```ruby
@cell.set_number_format('#, ##0') # 書式はよくわかってない
```

## セルの文字色を赤にするには？

```ruby
@cell.change_font_color("FF0000")
```

## セルの背景を灰色にするには？

```ruby
@cell.change_fill("EEEEEE")
```

## (x1, y1) から (x2, y2) の範囲でセルを結合するには？

```ruby
@sheet.merge_cells(y1, x1, y2, x2)
```

## アンダーラインを引くには？ (ボーダーの下だけに線)

```ruby
@cell.change_border(:bottom, "medium")
```

## アンダーラインの色を赤にするには？ (下ボーダーの色変更)

```ruby
@cell.change_border_color(:bottom, "FF0000")
```

## 1つのセルだけにボーダーを描くには？

```ruby
[:top, :bottom, :left, :right].each do |e|
   @cell.change_border(e, "medium")
end
```

## ボーダーの線を細くするには？

`medium` のかわりに `thin` を指定

## セル結合した範囲や、広範囲にボーダーを描くには？

x, y 順で (1, 1) から (3, 2) の地点までボーダーを描く場合

```ruby
x1, y1 = [1, 1]
x2, y2 = [3, 2]

(y1..y2).each do |y|
  (x1..x2).each do |x|
    list = []
    if y == y1
      list << :top
    end
    if y == y2
      list << :bottom
    end
    if x == x1
      list << :left
    end
    if x == x2
      list << :right
    end
    list.each do |e|
      cell = @sheet.add_cell(y, x, "", nil, false)
      cell.change_border(e, "medium")
    end
  end
end
```

セル結合している場合は左上のセルに設定したボーダーが、セル結合した範囲にも自動的に広がってくれると思ったらそうはならないようです。

常識的に考えてこんな冗長なコードを使う側が書く必要はないと思うので、何か他の方法がある気がするんですが見つけられませんでした。とりあえず自力でボーダーを引くようにしてみましたが正しい方法があったら教えてください。
Mac terminal コマンドプロンプトにgit のブランチを表示

# git のterminal 、teraterm コマンドプロンプトの表示を変える

デフォルトではterminalなどのコマンドプロンプトは下記のような感じなっております。

![スクリーンショット 2017-07-30 19.55.18.png](https://qiita-image-store.s3.amazonaws.com/0/31394/d7967a66-ad08-df10-8fa5-cbef991ec2eb.png)

こちらをわかりやすいように色分けしたり、git のブランチを表示させたりします。

下記のような感じになります。

![スクリーンショット 2017-07-30 20.01.55.png](https://qiita-image-store.s3.amazonaws.com/0/31394/dde0af8b-d550-2390-924e-cf5a69667b5e.png)

このような状態にするには下記bash を　 ~/.bash_profile に記述しsource で反映させるとこのような感じになります。

下記手順になります。

```
vi ~/.bash_profile
```

```
function parse_git_branch {
    git branch --no-color 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ [\1]/'
}
function promps {
    local  BLUE="\[\e[1;34m\]"
    local  RED="\[\e[1;31m\]"
    local  GREEN="\[\e[1;32m\]"
    local  WHITE="\[\e[00m\]"
    local  GRAY="\[\e[1;37m\]"
    local  Mag="\[\e[1;35m\]"
    local  LIGHT_B="\[\e[0;34m\]"
    local  LIGHT_GREEN="\[\e[0;36m\]"
    case $TERM in
        xterm*) TITLEBAR='\[\e]0;\W\007\]';;
        *)      TITLEBAR="";;
    esac
    local BASE="\u@\h"
#    PS1="${TITLEBAR}${GREEN}${BASE}${WHITE}:${BLUE}\W${GREEN}\$(parse_git_branch)${BLUE}\$${WHITE} "

     PS1="${LIGHT_GREEN}\u${GREEN}\w:${GREEN}\$(parse_git_branch)${BLUE}\$${WHITE}: \n->> "
}
promps

```

色の名前はなんとなくつけたものなので、ご自分のお好きなように変更されると良いかと思われます。

ho

|設定|内容|例|
|-----:|-----:|------:|
|\h    |ホスト名|	あなたのMacの名前 （システム環境設定＞ユーザとグループ＞ユーザ右クリックで編集可能）|
|\u	|ユーザ名|	ログインユーザーの名前同上|
|\w	|現在のディレクトリ※フルパス|	~/Applications|
|\W	|現在のディレクトリ|	Applications|
|\t	|現在時刻※24時間表記|	17:14:42|
|\T	|現在時刻|※12時間表記	05:14:42|
|\d	|日付と曜日※ダサいから注意|	日 7 27|


## 色の設定

|コード|	色|
|-----:|------:|
|\\[\033[30m]色付けたい部分\[\033[0m]|	Black|
|\[\033[31m]色付けたい部分\[\033[0m]|	Red|
|\[\033[32m]色付けたい部分\[\033[0m]|	Green|
|\[\033[33m]色付けたい部分\[\033[0m]|	Yellow|
|\[\033[34m]色付けたい部分\[\033[0m]|	Blue|
|\[\033[35m]色付けたい部分\[\033[0m]|	Mangenta|
|\[\033[36m]色付けたい部分\[\033[0m]|	Cyan|
|\[\033[37m]色付けたい部分\[\033[0m]|	White|

色の種類は下記にもあります。

![bash_color.png](https://qiita-image-store.s3.amazonaws.com/0/31394/91572a17-979b-55d7-d833-408dc6440ec4.png)


下記サイトから引用

http://www.tux-planet.fr/les-codes-de-couleurs-en-bash/
Bluemix の Cloudant に python3 の requests で画像ファイルをアップロード

次のページでは、pycurl を使っていますが、requests を使ってみました。
[Bluemix の Cloudant に python3 で画像ファイルをアップロード](http://qiita.com/ekzemplaro/items/89e831e30c56e0773d2d)

```py3:to_cloudant.py
#! /usr/bin/python
# -*- coding: utf-8 -*-
#
#	to_cloudant.py
#
#						Jul/30/2017
#
import sys
import requests
# --------------------------------------------------------------------
# [4]:
def file_upload_proc(url,key):
	print(key)
	jpg_in = key + ".jpg"
#
	fp_in = open(jpg_in,'rb')
	image = fp_in.read()
	fp_in.close()
#
	url_jpg_file = url + "/jpg/" + key + "/" + jpg_in
	headers = {'Content-type': 'image/jpeg'}
	try:
		rr=requests.put(url_jpg_file, data=image,headers=headers)
		print(rr)
		print(str(rr.content,'utf-8'))
		print()
		print(rr.headers)
	except Exception as ee:
		sys.stderr.write(str(ee))
#
# --------------------------------------------------------------------
sys.stderr.write("*** 開始 ***\n")
#
url="https://44b508dd-f332-4f91-81f2-78369c7d29d9-bluemix:9dacdfdee131c2a5c16596fc371012e08a32e7132d3b21ebaad1f63a835fae64@efc189dc-f332-4f52-81f2-78369c7d17d9-bluemix.cloudant.com"
#
url_jpg = url + "/jpg"
rr=requests.delete(url_jpg)
print(rr)
print(str(rr.content,'utf-8'))
#
rr=requests.put(url_jpg)
print(rr)
print(str(rr.content,'utf-8'))
#
keys= ["DSCF0001","DSCF0002"]
#
for key in keys:
	file_upload_proc(url,key)
#
sys.stderr.write("*** 終了 ***\n")
# --------------------------------------------------------------------
```
コーディングで指定するフォント

今回の記事は備忘録として。
いつも環境が変わるたびに指定しているフォントがなんだったかを忘れるので。。。

# 2019/06/08 追記
CamingCode だと非ASCIIを入力したときに等幅が崩れるのでイマイチ｡
なので **Myrica M** について追記した｡
上記に合わせてタイトルも変更

# 設定対象の環境
* Windows 10 Home 64bit
* [Visual Studio Code](https://www.microsoft.com/ja-jp/dev/products/code-vs.aspx)


# Myrica M
[こちら](https://nelog.jp/myrica) によると Ricty ベースらしい｡

蛇足ながら､Ricty にはそのまま使える [Ricty Diminished](https://www.rs.tus.ac.jp/yyusa/ricty_diminished.html) というのがあるけれど､これを使ってみたところ **バッククォートが直後の文字にかぶって凄い気持ち悪い** のでやめた｡
解消方法は [Rictyのバッククオートを修正する](https://qiita.com/uKLEina/items/ff0877871fc425952b92) で取り上げられているので､ご興味ある方は試してみるのも良いかと｡

で､肝心の **Myrica M**｡ ダウンロードは以下から｡

* [プログラミングフォント Myrica / Estable](https://myrica.estable.jp/myricamhistry/)

ダウンロードした後は zip を解凍してフォントファイルをダブルクリックしてインストールする。

## エディタへの設定
* フォントの設定
 * メニューの 「基本設定」 -> 「設定」 から 「ユーザ設定」 に対して次を設定する。

    ```js
    {
      // フォントサイズはお好みで｡
      "editor.fontSize": 16,
      "editor.fontFamily": "MyricaM M"
    }
    ```

# CamingoCode
ダウンロードは本家ページから。

* [CamingCode](http://www.janfromm.de/typefaces/camingomono/camingocode/)

ダウンロードした後は zip を解凍してフォントファイルをダブルクリックしてインストールする。

## エディタへの設定
* フォントの設定
 * メニューの 「基本設定」 -> 「設定」 から 「ユーザ設定」 に対して次を設定する。

    ```js
    {
      // フォントサイズはお好みで。フォントファミリーは Regular を指定。
      "editor.fontSize": 16,
      "editor.fontFamily": "CamingoCode Regular"
    }
    ```
テストコードを書いたほうがいい理由を新卒にわかりやすく説明したい

最近、新卒エンジニアと1〜2週に1度の頻度で1時間ほどペアプロを行っています。

新卒君の技術力の向上と作業効率のアップを目的として行っているんですが、
これがなかなか効果ありで結構楽しいです。教えることで自分の知識の再確認にもなっています。

で、先日はPHPのテストコード作成に取り組むことに。
PHPUnitでテストコードの作成に着手したわけなのですが、そのとき新卒君にこんなことを言われました。

「なんでモデルのテストコード書くんですか？コントローラの200テストだけで十分じゃないですか？」

時間がなかったため、

「モデルのテストも書いたほうが、バグの発生率は減らせるでしょう？」

とだけ答えました。

我ながら雑な答え方だし、そもそもテストコードを何故書くべきなのかちゃんと教えたほうが良いなぁと思ったので文章として残すことにしました。

# 良いコードを書く意識が自然と身につく
テストコードを書くのが習慣的になっていると、必然的にテストしやすい構造のプログラムを書くようになります。
つまりどういうことかというと、複雑なメソッドを書くことが減り、疎結合で副作用の少ない小さな機能単位で開発するようになるのです。

テストしづらい構造のプログラム…極端な例ですが、例えば1000行くらいあってスパゲッティなメソッドは、非常にテストしづらいというのは容易に想像できると思います。

そんなスパゲッティなコードに対して、テストコードが仮に存在していたとしても、少しの変更を加えたいと思ったら途端にテストコードのメンテナンスコストは跳ね上がります。

「メンテナンスにコストがかかるならそもそもテストコード書かなければいいのでは？」

と思う人もいるかもしれません。

確かに重要な箇所でなければ時間がもったいないのでテストコードは書かなくても良いかもしれません。

しかし、決済機能など一歩間違えると死ねるような機能を拡張・修正しようといった場合、テストコードがあるのとないのではプロダクトコード自体のメンテナンス性が全く違ってきます。
テストコードがありテストしやすい構造にできていれば、ソースの見通しもよくなっているはずなので、作業のしやすさも変わってくるでしょう。

# テストコードがないとリファクタリングと呼べない
「うわーなんだこのクソコード、リファクタリングしてやる！」

と思うこと、ありますよね。

でも、テストコードがある状態でリファクタリングするのと、ない状態でコードを改善するのではまったく違ってきます。
そもそもリファクタリングとは、外部的振る舞いを保ちつつ内部構造を改善することを指します。この外部的振る舞いをテストコードでチェックしてやるわけです。

そもそもテストコードが甘かったりバグってしまっていることもあるので、100%担保できるわけではありませんが、テストコードによって常に同じ外部的振る舞いをチェックできるため、コードを改善するつもりがデグレーションを起こしてしまうといった可能性は確実に減ります。

プログラムにできることはプログラムにやらせましょう。

# 最終的に作業時間が減る
テストコードも書けていいコードも書けていると、以下の理由により最終的には作業時間の短縮につながると考えられます。

- 読みやすいソースコード、設計になり機能追加・修正がしやすくなる
- テストで事前にバグの発見がしやすくなる。結果手戻りが減る

なので最初は手間でも、テストコードは積極的に書いておくのが良いと思います。
また上記にも書きましたが、バグがあると致命的な機能に関しては、厚めにテストケースを書いておいたほうが他のプログラマも幸せになるでしょう。


# 最後に
上記以外にも、テストコードのメリットについて書かれた記事がググればたくさん出て来るので、まだよくわからんって場合は調べてみてほしいです。
レガシーな開発環境でそもそもテストコードをどうやって書けばいいんだって場合は、[レガシーコード改善ガイド](https://www.amazon.co.jp/%E3%83%AC%E3%82%AC%E3%82%B7%E3%83%BC%E3%82%B3%E3%83%BC%E3%83%89%E6%94%B9%E5%96%84%E3%82%AC%E3%82%A4%E3%83%89-%E3%83%9E%E3%82%A4%E3%82%B1%E3%83%AB%E3%83%BBC%E3%83%BB%E3%83%95%E3%82%A7%E3%82%B6%E3%83%BC%E3%82%BA-ebook/dp/B01AN97W08/ref=sr_1_8?ie=UTF8&qid=1501408104&sr=8-8&keywords=%E3%83%AA%E3%83%95%E3%82%A1%E3%82%AF%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0)なんかを読むと良いです。
(数年前に読んで内容忘れかけてるので僕も読み直したいと思います)

というわけで、僕ももっとテストコード書いたり良い設計に思いを馳せることにします。
Db2を数クリックでWindows 7に簡単インストール〜 Db2 Developer Community Edition

DB2がDb2になって、なにやら簡単に使えそうなエディションも出たりしたようで、自分も試してみた。

## Db2に名前が変わった件について
ここに色々載ってた
http://qiita.com/steel_mikan/items/76f47d3e0dfbf1b2e86d
https://www.ibm.com/blogs/solutions/jp-ja/ibm-db2-rebranding/

## Db2 Developer Community Edition
無償で、コミュニティサポートで、機能全般試せるDb2。
Dockerの上で動くやつみたい。

## インストール方法

(0)自分のPCは元々Dockerが入ってたのでやり方をご紹介↓。ちなみに入って無くても、このDb2のインストーラで勝手にDockerも入れてくれるみたい。
http://docs.docker.jp/windows/step_one.html

(1)Db2をダウンロード
https://www-01.ibm.com/marketing/iwm/iwm/web/preLogin.do?source=swg-db2dtrial

(2)ダウンロードしたファイルを実行
この画面が出てからしばらくしたら...
![スクリーンショット 2017-07-30 19.12.34.png](https://qiita-image-store.s3.amazonaws.com/0/119378/a9584b73-9a13-d61b-acdb-c795a4c790f2.png)

同意せよ、と出て来るので、同意して「continue」をクリックして次へ進む。
![スクリーンショット 2017-07-30 19.13.33.png](https://qiita-image-store.s3.amazonaws.com/0/119378/946f1517-c69e-afb9-052b-d63847de14b6.png)

(3)パスワードなどを設定
まあ、適当に。
![図1.png](https://qiita-image-store.s3.amazonaws.com/0/119378/6f7a79aa-7899-1ef8-29ff-de8cc3151d72.png)

(4)待つ
ダウンロードフォルダを見ると、tarファイルが見えます。これがdockerイメージのようで。
![スクリーンショット 2017-07-30 19.16.28.png](https://qiita-image-store.s3.amazonaws.com/0/119378/816d4c04-7ef1-ed55-e29a-77fa12a3a5eb.png)


## できた
できたーだいたい20分くらいで、DBとそれを管理するGUIツールが一挙インストールされました。らくちん。
![スクリーンショット 2017-07-30 19.18.51.png](https://qiita-image-store.s3.amazonaws.com/0/119378/fa0da338-a1b9-67b7-3da3-84776db60e06.png)




## ご参考(Mac）
先人の知恵を拝借しました
http://qiita.com/kirinchan/items/0ecd2ebf8f82c938e4b3
http://qiita.com/kirinchan/items/5d0217c66af3c131e6b9
Zabbix用語

#Zabbix用が非常に分かりずらかったのでメモ
##ホスト
監視対象
　サーバ、仮想マシン、ESXiホスト、ルータ、スイッチetc

##アイテム
監視項目
　何を監視するか
　　CPU使用率、httpdプロセス、PING監視etc

##トリガー
監視閾値
　アイテムのステータスが何を基準に正常/障害を判定して、イベントを起こすか
　　CPU使用率が90%を超えたら、PINGが3回連続で応答なくなったらetc

##イベント
　トリガーで発生した情報

##アクション
　どのイベントで、どんなアウトプットをするか定義
　　CPU使用率が90%を超えたら管理者へメール通知する、httpdプロセスが存在しなくなったらサーバを再起動するetc

##LLD
ローレベルディスカバリ
　ホストを自動で監視対象に追加し、OSなどホストに適したアイテム設定を自動的に割り当てる。
　　ESXiホストを自動検出し、仮想マシンを自動で追加etc
　　Windowsのドライブ名、Linuxパーティション構成を検出etc
Product Advertising API (PA-API) に専用のIAMでアクセスする

昔まだAWSが出来て間もない時代（かろうじてS3があったくらい）にPA-APIを使ったアプリを作っていたのですが、最近またPA-APIを使おうかなと思って調べたところ、未だにPA-APIを使うアプリでは認証にアマゾンのルートアカウントのアクセスキーとシークレットを使えという記事が出てきました。

PA-API以外に使うものがあんまりなかった時代ならいざしらず、AWSがこんなに使われてる現状でも未だにPA-APIにそれ用の権限とか存在しないのか…？？と思ってよくよく調べてみると、最近それ用のIAMポリシーができたよう（いつできたのかは不明）なので、それを設定して使うことにしました。

これがなかったら、さすがにAWSをバリバリ使ってるアカウントのルートアカウントをPA-APIのアプリに使いたくなかったので、専用のAWSアカウントを作るところでした。

## これはなにか？

PA-API用ポリシーを作って、PA-API用のIAMユーザに紐付ける手順、及びそのユーザのアクセスキー及び秘密鍵を使ってPA-APIから値を取得できるかの確認。


## ポリシーの作成

まずはAWSのWebコンソールからPA-API専用のポリシーを作ります。

<img width="742" alt="Pasted_Image_2017_07_30_18_03.png" src="https://qiita-image-store.s3.amazonaws.com/0/18007/2ec89246-f2b0-a600-bc2e-e2074d68c2bb.png">

「独自のポリシーを作成」を選択します。

<img width="855" alt="Pasted_Image_2017_07_30_18_04.png" src="https://qiita-image-store.s3.amazonaws.com/0/18007/8c592b34-2bc9-b8b0-2d0d-d70da54774ca.png">

PA-APIに対するFullAccess権限を設定したポリシーにします。ポリシー名は適当なものを。

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "ProductAdvertisingAPI:*",
            "Resource": "*"
        }
    ]
}
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/18007/92b790b3-8ee4-7a89-6c21-1cb791a38221.png)

念の為ポリシーの検証をしておいて、問題なければポリシーの作成です。

## PA-APIアクセス用ユーザの作成

次に上記で作成したポリシーを紐付けるユーザを作成しましょう。

<img width="502" alt="Pasted_Image_2017_07_30_18_13.png" src="https://qiita-image-store.s3.amazonaws.com/0/18007/2a7bc81c-afd3-f358-16ee-34f71540a505.png">

適当な名前をつけて「プログラムによるアクセス」にチェックを入れます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/18007/e9c343b1-302d-e395-7837-dcc6616dc0d1.png)

「既存のポリシーを直接アタッチ」を選んで、先程作成したPA-API用のポリシーにチェックを入れます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/18007/15d06e64-c4e7-52f9-3021-f8e8fc970d3f.png)

次の画面で確認して、問題なければ更に次の画面でcredentials.csvをダウンロードしておきましょう。

## 実際にアクセス可能な確認

取得したアクセスキーと秘密鍵が実際にPA-APIへのアクセスに使えるか念の為チェックしておきましょう。

rubyだと[amazon-ecs](https://github.com/jugend/amazon-ecs)というgemがPA-APIにアクセスするのによく使われているようです。

`associate_tag`、`AWS_access_key_id`、`AWS_secret_key`のところは自分のものに置き換えてください。

```ruby
require 'amazon/ecs'

Amazon::Ecs.options = {
  associate_tag: 'xxxxxxxxxxxxxx',
  AWS_access_key_id: 'xxxxxxxxxxxxxxxxxx',
  AWS_secret_key: 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
  country: :jp
}

# Nintendo SwitchのASINを指定してみます
res = Amazon::Ecs.item_lookup('B01NCXFWIZ', response_group: 'Small')

p res.items.map {|item| item.get('ItemAttributes/Title') }
# => ["Nintendo Switch Joy-Con (L) ネオンブルー/ (R) ネオンレッド"]
```

OK、ちゃんと取れてるようですね。

## 参考

- [Becoming a Product Advertising API Developer - Product Advertising API](http://docs.aws.amazon.com/AWSECommerceService/latest/DG/becomingDev.html)
- [Amazon Product Advertising APIが、IAMユーザーに対応していた - プログラマでありたい](http://blog.takuros.net/entry/2017/04/10/074404)
- [jugend/amazon-ecs: Ruby Amazon Product Advertising API](https://github.com/jugend/amazon-ecs)
Jenkins と Github を連携させる Webhook と SCMポーリング

## Jenkins と Github を連携させる
Jenkins と Github を連携させるための手段として、Webhook と SCMポーリングの二つあると思いますが、違いをまとめてみました。理解を深めるためにまずは予備知識を下に並べます。

### Jenkinsとは
Javaで書かれたオープンソースCIツール。

### CIとは
Continuous Integration (継続的統合)。アプリ開発時の品質改善や納期短縮のための習慣。

#### 習慣とかわかりにくいのでもっと狭義に言うと
ビルドやテストを頻繁に継続して行うことで、バグを早期に発見し、開発の効率・納期の短縮を実現させるための手法。
(ビルド：コンパイル〜ライブラリの依存解決〜パッケージ化のようなソースコードからリリース/デプロイ可能なモジュールを作成するまでのプロセス。)

#### 手法とかイメージしにくいのでもっと具体的に言うと
**時間** (何時間に一回とか) もしくは**トリガー** (Github上でプルリクエストが作成されたらとか、コミットされたらとか) を契機に、ビルド環境に対象のリポジトリのブランチのソースを clone し、ビルドを実行するようにJenkins(CIツール)に設定しておいて、手動ではなく自動でビルドを継続的に行うこと。

何かしらのトリガーによりビルドを実行する場合、Jenkins と Github を連携させておく必要がありますが、手段としては

1. Github に Webhook を掛けておく。
2. Github に対して SCMポーリングを行う。

の２パターンがあります。

# (ここから本題) WebhookとSCMポーリングはどう違うのか？
### Webhook とは？
Webサービス(今回はGithub)に投げ先のURL(JenkinsのURL)を指定して、POSTリクエストを投げてもらう仕組み。
Github上でプルリクエストが作成されたとか、リモートからプッシュされたとかをトリガーにしてGithubからJenkinsにPOSTリクエストを投げてもらう。
Github のここで設定するやつですね。
<img width="1001" alt="スクリーンショット 2019-01-23 11.24.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/182916/1552ecc4-7c7b-1b61-6e02-ccc4c9974180.png">

### SCMポーリングとは？
#### そもそも SCM とは
Software Configuration Management(ソフトウェア構成管理)。
GitとはSVNとかはこれを実現させるためのツール。
#### そもそもポーリングとは
複数のコンピュータが接続されているネットワークでアクセスの競合を避けたり、準備ができているか、死活監視の意味も込めて、送信要求がないか**定期的に問い合わせを行う通信方式**。(本来の意味)

#### 踏まえてSCMポーリングとは
JenkinsからGithubに対して**定期的に問い合わせを行う方式**。(なので、やりすぎるとGithubに負荷がかかる)

#### (+α) JenkinsでのSCMポーリング設定方法
プロジェクト > 設定 > ビルドトリガ から設定できます。
<img width="600" alt="スクリーンショット 2019-01-22 12.33.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/182916/4e5a2802-4663-b099-8b9f-2529359e3310.png">

このようなプラグインを使えば、ポーリングの即時実行もできるようです。
https://wiki.jenkins.io/display/JENKINS/PollSCM+Plugin

# まとめ
JenkinsとGithubを繋ぐための手法として、WebhookとSCMポーリングの二つがありますが、

1. Webhook は **Github発信で**ビルドの契機となる POSTリクエストを Jenkins に送ってくれる仕組み。
2. SCMポーリングは **Jenkins発信で**ビルドの契機となる Github への問い合わせを実施する仕組み。

という、(Jenkins から見て) 能動/受動の違いがあります。
実際にビルドが実施される環境が Jenkins なので、Jenkins の立場的には、**Webhook は Push型の通知**みたいなもの、**SCMポーリングは PULL型の通知**みたいなものだと理解すると良いのではないかなと思いました。
微分方程式

# 微分方程式
## 冷却方程式
室温が　$T_r$ 度の部屋においた熱湯の温度変化率が、時刻 $t$ における熱湯の温度 $T(t)$ 度と室温との差 $(T - T_r)$ に比例するとき、次の問いに答えよ。

(1) 比例定数を $k > 0$ として、$T(t)$ に対する微分方程式を立てよ。

```math
\frac{d T(t)}{dt} =-k(T - T_r)
```

(2) (1) の $T(t)$ に対する微分方程式の一般解を求めよ

```math
\begin{align}
\int{\frac{1}{T(t) - T_r}}dT(t) &= -k \int dt \\
\log(T(t) - T_r) &= -kt + C \\
e ^ {\log(T(t) - T_r)} &= e ^ {-kt + C} \\
T(t) - T_r &= e ^ {-kt + C} \\
T(t) &= e ^ {-kt + C} + T_r
\end{align}
```

(3)

```math
T_r = 20 \\
T(t) = e ^ {-kt + C} + 20 \\
T(0) = e ^ {-0k + C} + 20 = 100 \\
e ^ C = 80 \\
\log e ^ C = \log 80 \\
C = \log 80 \\
T(2) = e ^ {-2k + C} + 20 = 70 \\
e ^ {-2k} \cdot e ^ C = 50 \\
80 e ^ {-2k} = 50 \\

\log e ^ {-2k} = \log \frac{50}{80} \\
= \log \frac{5}{2^3} \\

-2k = \log 5 - 3 \log 2 \\
k = \frac{1}{2} (3 \log 2 - log 5) \\

T(t) = e ^ {-kt + C} + 20 \\
= e ^ {-kt} \cdot e ^ C + 20 \\
= 80 e ^ {-kt} + 20 = 40\\
4 e ^ {-kt} = 1\\
e ^ {-kt} = 2^{-2}\\
\log e ^ {-kt} = \log 2^{-2} \\
-\frac{1}{2} (3 \log 2 - log 5) t = - 2 \log 2 \\
(3 \log 2 - log 5) t = 4 \log 2 \\
t = 4 \cdot \frac{\log 2}{3 \log 2 - log 5} \\
= \frac{4}{3 - log_2 5} \\
```
JavaScript for文のindex指定方法

VB系やDelphi系をやってきたので、JavaScriptなどのC/C++系のfor文を書くときにループ値の指定方法がいつも、少し引っかかり迷いが生じるのでメモしておきます。

index値が、0から長さ-1までループしてもらいたいときの書き方で単純なものは次の通りです。

i++ や i-- は JsLintに敬意をはらい、使わないようにしてみました。

```JavaScript
  var str = 'abc';
  for (var i = 0; i <= str.length - 1; i += 1) {
    console.log(str[i]);
  }
  //a b c と順に出力される
```

しかし、C系のfor文の言語特性だと思いますが、ループごとにforのループの終了判定の部分

```i <= str.length - 1```

これが評価されるために、毎度、str.lengthを取得する処理が発生するのでループが少し遅くなります。

なので、高速化を重視して最初にループ回数は変数に代入しておく方がよいとされています。

```JavaScript
  var str = 'abc';
  for (var i = 0, il = str.length - 1; i <= il; i += 1) {
    console.log(str[i]);
  }
  //a b c と順に出力される
```

これはこのようにも書かれます。

```JavaScript
  var str = 'abc';
  for (var i = 0, il = str.length; i < il; i += 1) {
    console.log(str[i]);
  }
  //a b c と順に出力される
```
こうすると、ループの終了値が読み取りにくいので、いまだに自分は少しモヤっとした気分になりますが、C/C++/Java系の人にとっては、可読性が低いということもないのでよく見かけるコードですので、読めるようになっておくといいでしょう。

逆順になると、このように書くとよいです。

```JavaScript
  var str = 'abc';
  for (var i = str.length - 1; 0 <= i; i -= 1) {
    console.log(str[i]);
  }
  //c b a と順に出力される
```

また、工夫してforの構文を利用すると、次のようにもかけます。

```js
  for (var i = str.length; i--;) {
    console.log(str[i]);
  }
  //c b a と順に出力される
```

動作確認した全文は次のとおり。

```index.html
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="utf-8">
  <title></title>
<script>

  var str = 'abc';

  for (var i = 0; i <= str.length - 1; i += 1) {
    console.log(str[i]);
  }
  //a b c と順に出力される

  for (var i = 0, il = str.length - 1; i <= il; i += 1) {
    console.log(str[i]);
  }
  //a b c と順に出力される

  for (var i = 0, il = str.length; i < il; i += 1) {
    console.log(str[i]);
  }
  //a b c と順に出力される

  for (var i = str.length - 1; 0 <= i; i -= 1) {
    console.log(str[i]);
  }
  //c b a と順に出力される

  for (var i = str.length; i--;) {
    console.log(str[i]);
  }
  //c b a と順に出力される

</script>
</head><body>
</body></html>
```
HerokuでPHPアプリを作成するまでの手順まとめ

## はじめに

Heroku初心者がPHPで「Hello Heroku World」までやってみたので、簡単に手順を残します
細かい解説はいたるところに転がってるので、例えば[ここ]([初心者でも15分で公開できるHerokuのはじめかた])なんかをご参照ください

## 環境と前提

#### 私の環境
- MacBook Pro (Mid 2015)
- macOS Sierra

#### 前提

- gitコマンドが使える環境
- Herokuに登録済み　登録は[ここ](https://signup.heroku.com/)

## HerokuでPHPアプリを作成するまでのコマンド

```Bash:HerokuでPHPアプリを作成するまでのコマンド
myMBP:~ myName$ brew install heroku
myMBP:~ myName$ heroku login
Enter your Heroku credentials:
Email: myAddress@gmail.com	
Password: ***********
myMBP:~ myName$ mkdir myheroku
myMBP:~ myName$ cd myheroku/
myMBP:myheroku myName$ touch composer.json
myMBP:myheroku myName$ touch index.php
myMBP:myheroku myName$ git init
myMBP:myheroku myName$ git add .
myMBP:myheroku myName$ git commit -m "Add Heroku SampleApp"
myMBP:myheroku myName$ heroku create
myMBP:myheroku myName$ git push heroku master
myMBP:myheroku myName$ heroku open
myMBP:myheroku myName$ heroku apps:rename sampleapp-001
myMBP:myheroku myName$ 
```

index.phpの中身はこんな感じ

```php:index.php
<?php
  echo "Hello Heroku World!";
?>
```

## コマンドを解説

| コマンド | 解説 | 
|:-----------|:------------|
| brew install heroku    | Heroku CLI(Command Line Interface)をインストール<br>Homebrewを使えない場合[こちら](https://devcenter.heroku.com/articles/heroku-cli)からインストーラをダウンロード |
| heroku login           | HerokuにCLIからログインしSSH鍵を登録<br>メールアドレスとパスワードを入力しましょう |
| mkdir myheroku         | 任意の場所にHerokuのアプリ用のローカルリポジトリに使用するディレクトリを作成 |
| touch composer.json    | composer.jsonを作成 ([composer.jsonとは](http://qiita.com/masarufuruya/items/23131a465b7e9c8f3060)) |
| touch index.php        | index.phpを作成 |
| git init               | カレントディレクトリをGitリポジトリ化 |
| git add .              | カレントディレクトリのファイルをローカルリポジトリに追加 |
| git commit -m "Add Heroku SampleApp"   | コミット |
| heroku create          | アプリを自動生成<br>引数としてアプリ名を渡してあげることもできます |
| git push heroku master | pushしてアプリをデプロイ |
| heroku open            | アプリをブラウザで起動 |
| heroku apps:rename sampleapp-001   | アプリの名前を”sampleapp-001”に変更 |

## さいごに

HerokuもPHPも触ったことのない初心者ですが、簡単にWebアプリを作れました
独学である程度学びたいのですが、何を作ればいいんでしょうか？

## 参考
- [初心者でも15分で公開できるHerokuのはじめかた]
- [composer.json、composer.lockって何なの？という人向けのまとめ]

[初心者でも15分で公開できるHerokuのはじめかた]:http://developers.mobage.jp/blog/how-to-use-for-beginners-heroku
[composer.json、composer.lockって何なの？という人向けのまとめ]:http://qiita.com/masarufuruya/items/23131a465b7e9c8f3060
clara-rulesの世界(5)

[前回](http://qiita.com/iku000888/items/67bcf71602c3d2af315f)

clara-rulesの[accumulator](http://www.clara-rules.org/docs/accumulators/)機能を使うとsqlで言うところの集約関数のような事が実現できるので今回はそれを試してみることにする。

## 概要

- `clara.rules.accumulators`のネームスペースにあるものを利用する
- デフォルトでmin/max/sum等が提供されている
    - 自分で任意のaccumulatorを作成する事もできる(accum関数)
- `defrule`の左辺、`defquery`で使用することができる

## 文法
`[<束縛する変数名> <- <accumulator> :from [<ファクト>+<constraint>]]`

## 動かしてみる

以下のようなコードを試してみた。

```clj

(ns clara-rules.accumulator
  (:require [clara.rules :refer [fire-rules insert mk-session query defquery]]
            [clara.rules.accumulators :as acc]))

(defrecord SomeAmount [id amt])

(defquery test-query
  []
  [?largest-amt <- (acc/max :amt) :from [SomeAmount]]
  [?total <- (acc/sum :amt) :from [SomeAmount]]
  [?grouped <- (acc/grouping-by :id) :from [SomeAmount]]
  ;;Total by groups
  [?grouped-and-summed
   <- (acc/grouping-by :id (fn [m]
                             ;;Accepts map key=field for grouping
                             ;;value=seq of maps of records that were grouped
                             (map (fn [[k seq-of-records]]
                                    {k (reduce + (map :amt seq-of-records))})
                                  m)))
   :from [SomeAmount]])

(-> (mk-session)
    (insert (->SomeAmount :a 4)
            (->SomeAmount :a 8)
            (->SomeAmount :b 32)
            (->SomeAmount :b 21)
            (->SomeAmount :c 1)
            (->SomeAmount :c 9))
    (fire-rules)
    (query test-query))
;; => ({:?largest-amt 32,
;;      :?total 75,
;;      :?grouped {:a [#clara_rules.accumulator.SomeAmount{:id :a, :amt 4}
;;                     #clara_rules.accumulator.SomeAmount{:id :a, :amt 8}],
;;                 :b [#clara_rules.accumulator.SomeAmount{:id :b, :amt 32}
;;                     #clara_rules.accumulator.SomeAmount{:id :b, :amt 21}],
;;                 :c [#clara_rules.accumulator.SomeAmount{:id :c, :amt 1}
;;                     #clara_rules.accumulator.SomeAmount{:id :c, :amt 9}]},
;;      :?grouped-and-summed ({:a 12} {:b 53} {:c 10})})
```
iTerm2 v3 shell integrationの確認ダイアログでCmd+Shift+;でフォントサイズが拡大できない問題

iTerm2をv3系にアップデートしたら `Cmd+Shift+;` でフォントサイズが拡大できなくなりました。
手元の環境はMac OSX EI Capitan 10.11.6 + iTerm2 v3.1.beta.6です。

フォントサイズを拡大しようとショートカット `Cmd+Shift+;` を押すと 「About Shell Integration」 というダイアログが出てきます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/61152/a9685cbe-9d9c-8bcc-2eca-8cf5cf3db35a.png)

「OK」を押してダイアログを閉じても、フォントサイズが大きくなりません。
仕方がないので「Install Now」でインストールしてみたんですけど、インストール後も `Cmd+Shift+;` も同じダイアログが出てきて、やっぱりフォントサイズが拡大できません。

ほんとまじなんなんこいつ。俺はただフォントサイズを大きくしたいだけなんだ。

このダイアログを無効化する方法は分かりませんでしたが、暫定の回避策として、キーボードショートカットじゃなくても、トラックパッドのピンチアウト（二本指で広げる）動作でフォントサイズが拡大できることに気付きました。
まったく納得がいかないですが、メニューからプロファイルを開くよりかはまぁマシ。

誰かもうちょっとマシな回避策を見つけたら教えて下さい。
All About ACS: IBM i Access Client Solutions - 最新バージョンの確認方法

# ACSの更新情報をサイトで確認する
本日(2017-07-30)、確認したら Base Package の 1.1.7.1 が利用可能になっていました。
そこで、ACS の最新バージョンの確認方法な更新情報を記事にします。

情報は、こちらのサイトで確認できます。

https://www-03.ibm.com/systems/power/software/i/access/solutions.html#updates

下記では、Base Package の 1.1.7.1 が最新バージョンで「July 2017」つまり、2017 年 7 月に利用可能になったのが分かります。
また「The next available update is planned for October 2017」なので、次のバージョンは、2017 年 10 月に予定されているのも分かります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/184930/de576ba2-8ea8-cc42-be65-c77806c500ee.png)

頭の「▶」を展開すると、今回のバージョンでの主な拡張や改善内容が表示されます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/184930/7db02d40-4557-a83b-97c7-d594732cb0d3.png)

「Version x.x.x」の表記がない更新は、Windows Application Package や Linux Application Package の更新です。
最新の「June 2017 (2017年6月)」には特記する新機能は無く、バグ修正のみが行われたようです。
また、AFP Printer Driver (IBM i に接続されたAFPプリンターに Windowsアプリから印刷するドライバー) の新しいWindows 用のものは Richo のサイトから入手するようにとあります、

![image.png](https://qiita-image-store.s3.amazonaws.com/0/184930/9dcbb748-3f53-35d9-f456-4d254accd357.png)

# 稼働中のBase Package から 最新バージョンを確認する

ACSを起動し、メニューから「ヘルプ」→「更新の確認」に進みます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/184930/67df4ffa-529b-40c7-3c01-62e39036aabb.png)

利用しているのが 1.1.7.0 で 1.1.7.1 が最新版として利用可能なことが表示されます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/184930/2b9a1dc2-eb57-1e8a-8352-202b7769d392.png)

利用しているのが最新版であるのが確認できた場合は「利用可能な更新はありません。」と表示されます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/184930/c91b75dc-36f0-bc63-24b1-31608216c273.png)

**最新版の情報を確認するには、インターネットに接続する必要があります。
外部アクセスでできない場合も「使用可能な更新はありません。」が表示されます**ので、ご注意ください。

もっとも、最新版の情報が確認できるだけで、残念ながら、自動更新やダウンロードのガイドが出るわけではありません。

ACS は、まだ発展途中の製品だと個人的に感じます。新バージョンで多くの機能追加や不具合の修正が行われますので、何か困った場合、最新版で問題が解決しないか確認されることをお勧めします。

***
「All About ACS」では IBM i に対する新しいクライアント「IBM i Access Client Solutions」の情報をいろいろ提供していきます。
[記事一覧はこちら](http://qiita.com/6onoda/items/2dc925586d8d3b8644f2)で確認いたけます。

許可の無い転載を禁じます。
この記事は筆者の個人的な責任で無保証で提供しています。
当記事に関してIBMやビジネスパートナーに問い合わせることは、固くお断りします。
***