OmniAICreator/Qiita-1.07M huggingface dataset:
resolv.confが書き換わる！

# はじめに
  resolv.confが書き換わる現象は、いくつか検索すると出てきますが、どれも今回の現象とHitしませんでした。
  おおよそ出てくる情報は、
  「NetworkManagerが原因です！」
  「DHCPによって情報が書き換わる」
  と言ったものでした。
####今回は、別ものです。


# 環境
  CentOS6.5  （おそらくCentOS6.Xで発生します）
  NetworkManager は停止！
  DHCPも利用してません！

```
# cat /etc/sysconfig/network-scripts/ifcfg-eth0

DEVICE=eth0
HWADDR=XX:XX:XX:XX:XX:XX
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=no
BOOTPROTO=static
IPADDR=XXX.XXX.XXX.XXX
NETMASK=255.255.255.XXX
USERCTL=no
IPV4_FAILURE_FATAL=yes
IPV6INIT=no
GATEWAY=XXX.XXX.XXX.XXX
```


# 現象

  /etc/sysconfig/network-scripts/ifcfg-ethXX のパラメータを上記内容に修正。
  以前は、上記のものにプラスしてこれらも入ってました。

```
DNS1=XXX.XXX.XXX.XXX
DNS2=XXX.XXX.XXX.XXX
DOMAIN=XX.jp
```

  修正後 service network restart をしたところ、Internet通信ができない！！
  名前解決ができてないのでDNSだと見当を付けて確認したところ、resolv.conf が・・・。

  書き換わってる。。。。。
  
# 原因
  NetworkManagerも停止して、BOOTPROTO=dhcp でないことから安心していましたが、原因は2つ。

  1. /etc/resolv.conf.save が存在していたこと
  2. PEERDNS=no を明示的に記載していなかったこと

上記2つの条件が重なることで今回の現象が発生していました。


# 対処策

/etc/resolv.conf.save を削除する。
   or
PEERDNS=no を明示的に記載する。

2つの条件が重なることで、resolv.conf.save ⇒ resolv.conf への書き換えが実行されるため、
どちらか1つの条件をクリアすれば発動しません。
Kaminari使用時に undefined method 'per' for ActiveRecord::Relation と怒られた話


一体何番煎じなのかといった内容ですが備忘録も兼ねて、Kaminari を使用してページネーションを実装しようとした際にエラーが出て詰んだ話とその対処法です。

#著者の環境
- CentOS 6.9
- Ruby 2.2.6
- Rails 4.2.8

## controller 側

```ruby:articles_controller.rb
class ArticlesController < ApplicationController
  before_action :set_task, only: [:show, :edit, :update, :destroy]

  # GET /articles
  # GET /articles.json
  def index
    @articles = Article.order("created_at desc").page(params[:page]).per(3)
  end
(以下略)
```

##　view 側
```ruby:articles/index.html.rb
<%= paginate(@articles) %>

(以下略)
```

で、ページを見に行くと、

undefined method 'per' for ActiveRecord::Relation
と怒られる。。。

# 解決策
どうやら **Kaminari** とページネーション用のライブラリの **WillPaginate** が競合してしまっているらしい

ので config/initializers 配下に以下のファイルを作成してあげる。

```ruby:kaminari.rb
Kaminari.configure do |config|
  config.page_method_name = :per_page_kaminari
end
```

```ruby:will_pagenate.rb
if defined?(WillPaginate)
  module WillPaginate
    module ActiveRecord
      module RelationMethods
        def per(value = nil) per_page(value) end
        def total_count() count end
      end
    end
    module CollectionMethods
      alias_method :num_pages, :total_pages
    end
  end
end
```

ファイルを作成したらサーバー再起動をお忘れなく！


# 参考ページ
https://github.com/sferik/rails_admin/issues/1498
http://tech-brains.blogspot.jp/2012/11/kaminari-willpaginate-incompatibility.html
これで無料？RPA学習者にお勧め！クラウドシステム開発環境SaaSForceの利用申し込み方法

![wfc20161109059.JPG](https://qiita-image-store.s3.amazonaws.com/0/184885/ad30e5a9-a5e8-c028-c660-96e547c7de72.jpeg)

SaaSForceは、期間限定とはいえ無料で使うことができるクラウドアプリを開発し、運用できるサービスです。

開発のアカウントは1つで、テストサーバーで実際にアプリが使えるのは6アカウントまでです。

無料申し込みは、こちらのサイトから可能です。

https://www.saasforce.jp/regist/try.jsp



![wfc20161109060.JPG](https://qiita-image-store.s3.amazonaws.com/0/184885/15a25849-702c-7afe-e510-29204a8dbbab.jpeg)

メルアドは、フリーので十分です。

![wfc20161109061.JPG](https://qiita-image-store.s3.amazonaws.com/0/184885/7830bf73-351a-c48b-de31-74443ddb5447.jpeg)

必要事項を全て入力して送信すると、このような画面になって、メールボックスに自動で送られてきます。

実際確認したわけではないですが、この自動返信に記載されているURLは、72時間有効だそうです。

ですから申し込みから3日以内にログインしないといけません。

IDとパスワードを入力するとこのような画面になります。

![wfc20161109062.JPG](https://qiita-image-store.s3.amazonaws.com/0/184885/2c93597b-1453-8960-e652-21e44cac6c46.jpeg)

かなり簡単にアカウントが作れるのがわかっていただけたと思います。
Intellij IDEAはMavenのクラスを読み込めないについての解決案

GitHub からある Maven の Repo を Clone し、Itenllij　IDEA にインポートしましたが、エディターにソースコードのImport部分に他のライブラリのクラスが認識されないようです。

<img width="697" alt="Screen Shot 2017-06-07 at 13.15.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/2179/5cb72361-c504-99ce-df53-1e226f25039e.png">

赤い字と線がきにならなくてはなりません。

コンソールにて　`mvn package` など無事に実行できるのに、問題は　Intelli　IDEA　にあるのはずです。

一時間ぐらいにネット上に調べたところ、問題は　Proxy　にあるそうです。Proxy　を利用する場合、Local　のリポジトリを更新できないようです。

<img width="1110" alt="Screen Shot 2017-06-07 at 13.16.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/2179/ad9a26f0-96cf-79c5-2144-5c0f2d13a467.png">


いろんな事情で、私は GoAgent を使っています。GoAgent を落としもいちどリポジトリを更新に成功しました。

<img width="1101" alt="Screen Shot 2017-06-07 at 13.26.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/2179/4fb9daa3-6db5-d89e-ed36-6b7875f689b8.png">

しばらく経つと、ソース上に赤い字と赤い線も消え問題は解消しました。
OpenCVで画像の特徴量を取得する


OpenCVで画像を読み込んで、その彩度と明度の平均値を取得します。numpyの行列として扱われるので、PythonでOpenCVを扱うときはnumpyの知識も必要になってきます。以下の例では転置行列(T)を利用して各レイヤの平均を求めています。

```
import sys,cv2

img = cv2.imread(sys.argv[1],1) # 0=grayscale, 1=color
hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)

print("Shape: {0}".format(hsv.shape))
print("Salute(mean): %.2f" % (hsv.T[1].flatten().mean()))
print("Value(mean): %.2f" % (hsv.T[2].flatten().mean()))
```

以下のリポジトリにOpenCVのPythonバインディングのサンプルコードがちょっとだけあります。

https://github.com/lumbermill/takachiho/tree/master/sandbox/opencv
swiftmailerでメールを送る (Gmail, Yahoo!メール経由)

下の画像のように、ローカル環境から自分宛てに手軽にメールを送信できます。
SMTP設定をその都度変えられるので、[XAMPPに付属しているsendmailを使う](http://d.hatena.ne.jp/sutara_lumpur/20100617/1276728122)よりも便利だと思います。

![001.png](https://qiita-image-store.s3.amazonaws.com/0/27816/fa20a10a-37a7-73f2-b67c-693052663c04.png)

# 環境
- Windows 10
- XAMPP 7.2.2
- Composer 1.6.5
- [swiftmailer](http://swiftmailer.org/) 6.1.2

# swiftmailerをインストール
:link: [Installation](http://swiftmailer.org/docs/introduction.html#installation)

```txt:PowerShell
> composer require "swiftmailer/swiftmailer:^6.0"
```

# Googleアカウントを使う
## 準備
メール送信に使いたいGoogleアカウントでログインした上で、下記のページを開きます。
:link: https://myaccount.google.com/lesssecureapps

そして、「安全性の低いアプリの許可」を有効にします。

![001.png](https://qiita-image-store.s3.amazonaws.com/0/27816/27a82547-b71d-b3d3-9841-d366f22158ae.png)

## 送信する
:link: [Basic Usage](http://swiftmailer.org/docs/introduction.html#basic-usage)
:link: [Encrypted SMTP](http://swiftmailer.org/docs/sending.html#encrypted-smtp)
:link: [GmailのSMTP設定](https://support.google.com/a/answer/176600?hl=ja)

```php
<?php
require_once './vendor/autoload.php';

$from = '<Gmailアドレス>';

// 送信設定
$transport = (new Swift_SmtpTransport('smtp.gmail.com', 587, 'tls'))
    ->setUsername($from)
    ->setPassword('<Googleのパスワード>');

// 送信設定をもとにメール送信のインスタンスを作成
$mailer = new Swift_Mailer($transport);

// メッセージを作成
$message = (new Swift_Message('件名'))
    ->setFrom([$from => '送信者名 (省略可)'])
    ->setTo(['<送信先アドレス>' => '受信者名 (省略可)'])
    ->setBody("こんにちは!\nこれはテスト送信です。\nTLSで暗号化しています。");

// メールを送信する
if ($mailer->send($message)) {
    echo 'メールを送信しました。';
}
```

# Yahoo!アカウントを使う
## 送信する
:link: [Yahoo!メールのSMTP設定](https://www.yahoo-help.jp/app/answers/detail/p/565/a_id/47789/~/smtp-auth%E3%81%A8%E3%81%AF%EF%BC%88%E3%83%A1%E3%83%BC%E3%83%AB%E3%82%BD%E3%83%95%E3%83%88%E3%81%AE%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E8%AA%8D%E8%A8%BC%E8%A8%AD%E5%AE%9A%EF%BC%89)

Yahoo!の場合、メールアドレスからドメインを除いたものがユーザー名となります。
暗号化はできないので、平文で送ります。
ポート番号は`587`です。

```php:抜粋
$username = '<ユーザー名>';
$from = $username . '@yahoo.co.jp';

// 送信設定
$transport = (new Swift_SmtpTransport('smtp.mail.yahoo.co.jp', 587))
    ->setUsername($username)
    ->setPassword('<パスワード>');
```

## 暗号化について
以前から、SSLで送るよう指定しても下記のように平文になっていました。

![002.png](https://qiita-image-store.s3.amazonaws.com/0/27816/df5f3afa-8ba0-f16b-daec-ca294f4584c8.png)

しかし、2018年7月31日に動作をあらためて確認したところ、SSLを指定するとswiftmailerがエラーで止まるようになりました。
よって、平文で送るしかありません。
オレオレ証明書を作ってS/MIMEで暗号化することもできるようですが、どのみち本番環境では使わないのでこのままにしておきます。


# その他
- HTMLメールを送りたい: [Setting the Body Content](http://swiftmailer.org/docs/messages.html#setting-the-body-content)
- 日本語の文字化け対策: [Using Swift Mailer for Japanese Emails](http://swiftmailer.org/docs/japanese.html)
flannelで自由に固定ipレンジを取得する方法

# はじめに
kubernetesを利用していて、flannelのipレンジを自由に割り振りたくなったので割り振ってみました。

# ipレンジを変更する
始めに割り振られているipは下記のように172.17.33.0でした。これを172.17.32.0に変更していこうと思います。

```
flannel0  Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
          inet addr:172.17.33.0  P-t-P:172.17.33.0  Mask:255.255.0.0
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1472  Metric:1
          RX packets:4 errors:0 dropped:0 overruns:0 frame:0
          TX packets:4 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:500
          RX bytes:336 (336.0 B)  TX bytes:336 (336.0 B)
```

まず、flannel起動時に参照しているetcdの設定ファイルを見に行きましょう。
etcdが動いているサーバーで下記コマンドを打つことで使用されているipレンジの一覧を確認することができます。

```
# atomic.ioの部分に関しては各自の設定で変更してください
$ etcdctl ls /atomic.io/network/subnets/
/atomic.io/network/subnets/172.17.94.0-24
/atomic.io/network/subnets/172.17.74.0-24
/atomic.io/network/subnets/172.17.43.0-24
/atomic.io/network/subnets/172.17.50.0-24
/atomic.io/network/subnets/172.17.15.0-24
/atomic.io/network/subnets/172.17.69.0-24
/atomic.io/network/subnets/172.17.33.0-24
/atomic.io/network/subnets/172.17.52.0-24
/atomic.io/network/subnets/172.17.22.0-24
/atomic.io/network/subnets/172.17.55.0-24
```
次に現在の取得しているipレンジの値を確認します。

```
$ etcdctl get /atomic.io/network/subnets/172.17.33.0-24
{"PublicIP":"192.168.133.3"}
```

次に現在の値を削除します。

```
$ etcdctl rmdir /atomic.io/network/subnets/172.17.33.0-24
PrevNode.Value: {"PublicIP":"192.168.133.3"}
```

次に新しく取得したいipレンジの値を登録していきます。

```
$ etcdctl set /atomic.io/network/subnets/172.17.32.0-24 '{"PublicIP":"192.168.133.3"}'
{"PublicIP":"192.168.133.3"}
```

動いていたflannelを再起動すると下記のようにipが172.17.32.0に変更されています。

```
flannel0  Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
          inet addr:172.17.32.0  P-t-P:172.17.32.0  Mask:255.255.0.0
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1472  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:500
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
```

# おわりに
基本的にflannelはPublicIPが変わらない限り、同じIPを割り振ってくれるみたいなので、固定IPが欲しいとかだったら今回の設定はやらなくていいと思います。PublicIPを変更したけど前と同じIPが欲しいとかいう状況があれば今回の設定で、IPを変更すればいい感じになると思います。
WordPress imgタグに独自のクラスや属性を追加する

# やりたいこと
- `the_post_thumbnail()` や `wp_get_attachment_image()` で出力される `<img>` タグに独自のCSSクラスや属性（`data-*`）を追加したい

Lazy Load 使いたいとかそういうパターン

# 配列で渡せばいいよ

例

- 投稿IDやサイズはよしなに
- CSSクラス `lazy` を追加する
- `data-original` 属性を追加する

## the_post_thumbnail()
https://developer.wordpress.org/reference/functions/the_post_thumbnail/

```php:post_thumbnail.php
<?php
the_post_thumbnail(
    $size,
    array(
        'class'         => 'lazy',
        'data-original' => 'img/example.jpg'
    )
);
```

## get_the_post_thumbnail()

https://developer.wordpress.org/reference/functions/get_the_post_thumbnail/

```php:get_the_post_thumbnail.php
<?php
get_the_post_thumbnail(
    $post,
    $size,
    array(
        'class'         => 'lazy',
        'data-original' => 'img/example.jpg'
    )
);
```

## wp_get_attachment_image()

https://developer.wordpress.org/reference/functions/wp_get_attachment_image/

```php:wp_get_attachment_image.php
<?php
wp_get_attachment_image(
    $attachment_id,
    $size,
    false,
    array(
        'class'         => 'lazy',
        'data-original' => 'img/example.jpg'
    )
);
```
## 全てで対応
`wp_get_attachment_image()` から出力される全ての `img` タグ（投稿サムネイルやギャラリーショートコードなど）で対応するならば `wp_get_attachment_image_attributes` フィルターフックだけでOK。

https://developer.wordpress.org/reference/hooks/wp_get_attachment_image_attributes/

※コード未検証です

```php:wp_get_attachment_image_attributes.php
<?php
function my_attachment_image_attributes( $atts, $attachment ) {
    $atts['class']         = $atts['class'] + ' lazy';
    $atts['data-original'] = 'img/example.jpg';
    return $atts;
}
add_filter( 'wp_get_attachment_image_attributes', 'my_attachment_image_attributes', 10, 2 );

```
現場からは以上です。
SeleniumWebDriverにエラーがあるんだって(node版)

seleniumWebDriverに不具合あって使えないらしい。

具体的には`.sendKeys()`使ったときにエラーが発生する。

バージョンは`3.4.0`

調べてみたらパッチ当ててる人がいた。
よくわからんので、自分でモジュールなおす。

```js:node_modules/selenium-webdriver/lib/webdriver.js
// 2189行目
//              setParameter('text', keys).
              setParameter('text', keys.then(keys => keys.join(''))).
```

これで治った。
iCloud Drive で tmp という名前は予約語になっているのかもしれない

よく tmp という名前のディレクトリを作成して作業することがある。
Documents の tmp 配下で自宅で作業して会社の PC で作業しようとしたら
iCloud Drive で同期されていなかった。
改めて帰宅して Documents をよく見ると、以下のようになっていた。

<img width="103" alt="Screen Shot 2017-06-07 at 14.04.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/1853/ccfd5da0-c127-2639-ce1d-9c18e994d817.png">

予約語なのかもしれない。他にも利用できない文字列があるかまでは調べていない。
apple のサポートコミュニティにも同様の症状が報告されていた。

https://discussions.apple.com/thread/7654418?start=0&tstart=0
Unity Remote利用者に発生する "The file MemoryStream is corrupted! Remove it and launch unity again" について

## Unity Remoteとは

Unity Editor上で起動しているゲームをiOS/Android実機に表示し、
タッチ操作でゲームをプレイすることができる機能です。
タッチスクリーン上で操作できる点以外はPC実機上で動いているものをスマホ実機に表示しているだけですので
端末依存の挙動を調べることはできないものの、
UIの確認等には十分使えます。

ストアに書いてある通りに設定すればきっと動きます。
https://itunes.apple.com/jp/app/unity-remote-5/id871767552?mt=8
https://play.google.com/store/apps/details?id=com.unity3d.genericremote&hl=ja

使い方等も調べれば出てくるでしょう……


## The file MemoryStream is corrupted! とかいう謎のエラー

Unity Remoteを使っていないときに、
Unity Editorの再生ボタンを押したタイミングで以下のエラーが出て、Unityが強制終了するという現象に巡り逢いました。

> The file MemoryStream is corrupted! Remove it and launch unity again [Position out of bounds!]



![sc.png](https://qiita-image-store.s3.amazonaws.com/0/54305/97ef6d01-9c01-e26c-79b7-9006d2646d36.png)

エラーメッセージを調べると、
「Unity Remoteの出力先を設定しているのにその接続先の端末がない」ため落ちているとのことで、
Unity Remoteの出力先をNoneにすることで解決しました。

Editor->UnityRemote->Device->None
![スクリーンショット 2017-06-07 13.40.30.png](https://qiita-image-store.s3.amazonaws.com/0/54305/29df2d74-370c-aa52-5eaa-a1b9ce3d3322.png)


Unity Remote、お行儀が悪い……


参考：
http://answers.unity3d.com/questions/1117177/the-file-memorystream-is-corrupted-remove-it-and-l.html
gvmでGolangインストール

#はじめに
最近遊び始めたので、メモついでに簡単なGolangの環境構築方法をつらつら書いていこうと思います。

環境はAWSのEC2（Amazon Linux）です。
他のLinux系OSやMacでも同様の処理でインストールまで出来るはずです。

#Golangとは
GolangはGoogleが開発しているコンパイル型のプログラム言語で、
シンプルな記法が特徴で並列処理も簡単に実装できます。


#gvm
gvmはGolangのバージョン管理ツールです。
`$GOPATH`や`$GOROOT`も最初から設定してくれるので大変便利です。
https://github.com/moovweb/gvm

##gvmのインストール
ターミナルで下記を実行

```bash
$ bash < <(curl -s -S -L https://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gvm-installer)
```

これだけです。

.bashrcに自動読み込みの設定も追記されているので、今後はターミナルを立ち上げるだけでgvmが利用できます。

1. ログイン中のターミナルですぐに使いたいときは下記を実行してください。
 * `source /home/ec2-user/.gvm/scripts/gvm`
* 下記のエラーが出た場合は`git`をインストールしましょう。
 * `ERROR: Could not find git`

##gvmの確認
正常に動いているか確認しましょう。

```bash
$ gvm version

Could not find bison

  linux: apt-get install bison

Could not find gcc

  linux: apt-get install gcc

```

と思ったら怒られました。
Amazon Linuxには`bison`と`gcc`が無いのでインストールします。

```bash
$ sudo yum install -y bison gcc
```

そして再確認

```
$ gvm version
Go Version Manager v1.0.22 installed at /home/ec2-user/.gvm
```

問題なさそうです。
これでgvmのインストールが完了しました。

#Golang
ではGolangをインストールしていきましょう。

## gvm listall
まずインストール可能なGolangの　バージョンを探します。

```bash
$ gvm listall
...
   go1.7rc4
   go1.7rc5
   go1.7rc6
   go1.8
   go1.8.1
   go1.8.2
   go1.8.3
...
```

今回は最新の`go1.8.3`をインストールしようと思います。

## gvm install

```bash
$ gvm install go1.8.3 -B
```

オプションの`-B`はBinaryを持ってくるだけですが、
`-B`なしでのインストールを行うとGolangのソース持ってきてローカルでコンパイルします。
ただし`go1.5`以上のコンパイルには`go1.4`が必要となることがあります。
（※`go1.8.2`のインストールでは必要なかったのでこの仕様は無くなったのかもしれません。）

## gvm use
ではGoを使えるようにしましょう。

```bash
$ gvm use go1.8.3 --default
```

オプションの`--default`を指定しておくことでターミナルに再ログインした後でも、そのバージョンを利用できます。
指定しない場合はログイン中のみ利用できます。

それでは確認です。

```bash
$ go version
go version go1.8.3 linux/amd64
```

さらに`$GOPATH`、`$GOROOT`も見てみましょう。

```bash
$ echo $GOPATH
/home/ec2-user/.gvm/pkgsets/go1.8.3/global
$ echo $GOROOT
/home/ec2-user/.gvm/gos/go1.8.3
```

※もし何も表示されない場合は再ログイン、または下記を実行してください。
`source /home/ec2-user/.gvm/scripts/gvm`


というわけでGolang1.8.3のインストールが完了です！
mac ターミナル 表示 git ブランチ名


gitのブランチ名を表示したい！

```
parse_git_branch() {
  git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/[\1]/'
}

export PS1='[\h:\W]\[\033[31m\]$(parse_git_branch)\[\033[00m\]:\$'
export LS_COLORS="no=00:fi=00:di=42:ex=34;1"
```
ユーザ名:カレントディレクトリ][ブランチ名]:$

Gitを使っていてターミナル操作の時にいちいち
```git branch```
で調べるの面倒だなぁと思ったのでこれでだいぶ楽に♪

$の前は下記のサイトでわかりやすく説明があるので、参考までに^^
http://www.yoheim.net/blog.php?q=20140309
Railsでテーブルの削除

#概要
うっかりタイポで間違ったテーブル作ってしまった時の対処法。

#手順
モデルの削除コマンドをして削除したが、schemaに間違った方もあったので消えていないのだと確信。

###マイグレーションファイルの作成

本当はrecordsとしたかったところをrocordsとしてしまいあとで気がついた。テーブルを削除するためのマイグレーションファイルを作成する。

```
$ rails generate migration rocords
```

###マイグレーションファイル編集
消したいテーブルを指定して、`drop_table :rocords`と記述する。

```
class DeleteRocords < ActiveRecord::Migration[5.1]
  def change
  	drop_table :rocords
  end
end

```

下記のコマンドを叩くと、データベースから削除される。

```
$ rails db:migrate
```

これでrecordsとrocordsが混在することはなくなった。なにより紛らわしい。

#参考資料
[Ruby on Railsでテーブル削除](http://qiita.com/Kuragasaki/items/7d98cf29341611fb189a)
Redshiftで完全に重複した行を消したい


# なに？
Redshift使ってると、全く同じ行がわんさかできてしまったりします。
色々な参考を読んでいると、登録データで新しいのだけ残して消したりとかやっていますが

プログラムから全く同じモノを何回も突っ込んでしまった時とかにどうやって消込かけようかとやってみた記録です

# 方法
http://docs.aws.amazon.com/ja_jp/redshift/latest/dg/merge-replacing-existing-rows.html

を参考に

1. 元のテーブルから完全重複している行をDISTINCTして1行だけにして取り出す
2. １で取り出した情報を作業用の一時テーブルに格納する
3. 元のテーブルから重複しているデータをごっそり消す
4. 一時テーブルから元のテーブルにデータを書き戻す

という方法で完全重複の消込をかけました。

# 参考

__元のテーブルはidとkyeで一意のデータに識別出来るものとする__

```sql:作業用SQL
-- テーブルを削除
DROP TABLE tmp;

-- 作業用テーブルの作成
CREATE TEMP TABLE tmp (LIKE moto_no_table);

-- 完全重複している行を1行だけInsert
INSERT INTO tmp
  SELECT DISTINCT *
  FROM moto_no_table
  WHERE (id, key) IN (
          SELECT DISTINCT
            id,
            key
          FROM moto_no_table
          GROUP BY id, key
          HAVING count(id) > 1
        );

-- 元のテーブルから重複しているすべての行を削除
DELETE FROM moto_no_table
WHERE (id, key) IN (
        SELECT DISTINCT
          id,
          key
        FROM moto_no_table
        GROUP BY id, key
        HAVING count(id) > 1
      );

-- 元のテーブルへ書き戻す
INSERT INTO moto_no_table
SELECT * FROM tmp;
```
リップルエフェクトボタン

[波紋が広がるリップルエフェクトボタンの作り方（CSS・Javascript）](https://saruwakakun.com/html-css/material/ripple_effect)を参考に jQuery にしてリップルエフェクトボタンをやってみました。

```JavaScript:ripple-effect.js
// クラス名rippleの要素を取得
var ripples = $('.ripple');

// クラス名rippleの要素があるかの判定
if ( ripples[0] ) {

	// クリックされた際の処理
	ripples.on('click', function(event) {
		offset = $(this).offset(); // 絶対座標の取得
		w      = $(this).outerWidth(); // 要素の幅を取得
		x      = event.pageX - offset.left - (w / 2);　// リップルの要素の X 座標を設定
		y      = event.pageY - offset.top - (w / 2);　// リップルの要素の Y 座標を設定
		// リップルの要素を設定
		html   = $('<span>').css({
			'top'    : y,
			'left'   : x,
			'width'  : w,
			'height' : w
		}).addClass('rp-effect').on('webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend', function(){
			// css の animation が終わったら各リップルの要素を削除
			$(this).remove();
		})
		// リップルの要素を追加
		$(this).append(html);
	});
}
```
後は参考サイトの、CSS と HTML を参考に作っていけば終わりです。
iOSのUnityRemote5が全然つながんなかった話

# まえがき
ある時、僕のサブで使っているWindowsのPCからUnityRemoteでデバッグできなくなってしまいました。

メインのPCを使えばデバッグできるので、それを使えばいい話なのですが、
外出先でメインのデスクトップPCを持ち歩くわけにはいかないので色々調べて解決したのでメモ。

# まず確認したこと
大体の場合は以下のサイト様で解決してしまいます。
http://blog.be-style.jpn.com/article/54331088.html

JDKのパスが通ってなかったり、単純に接続が悪かったりなどなど
これらの解決方法でも解決しなかったので、次の方法を試しました。

# iPhoneのデバイスドライバーを再インストールする

以下のサイト様を参考にしました。
http://labo.dotsmart.biz/windows10-itunes

要は、iPhoneのデータのやり取りを本来ならiTunesで同期とかができるのですが、今回iTunesにもiPhoneが認識されていなかったのがボトルネックでした。

### ”Apple Mobile Device USB Driver”

これを再インストールしたら無事Unity Remoteで起動したので、みなさんも参考にどうぞ！

※ここだけの話表題の問題を解決するのに５時間くらいかかってしまいました。。。。（トホホ
Webpack.dllPluginでバンドルしたファイルをIE11で使ったらシンタックスエラーで怒られた時の設定


## 設定ファイル

先に結果として、だいたいこんなです。

```js:webpack.dll.config.babel.js
import webpack from 'webpack';
import {dependencies} from './package';

export default {
  entry: {
    vendor: dependencies
  },
  output: {
    path: '/output/path',
    filename: '[name].dll.js',
    library: '[name]_library'
  },
  module: {
    rules: [
      {
        test: /\.jsx?$/,
        // node_modules内のファイルも基本的にloaderを通す
        exclude: [
          // loaderを通すとそれはそれでエラーを吐くようになったので除外
          /node_modules\/disposables\//,
          // loader通しても通さなくても良さそうなので除外
          /node_modules\/react.*\//,
          /node_modules\/lodash.*\//
        ],
        use: [
          {
            loader: 'babel-loader',
            options: {
              presets: [
                [
                  'env',
                  {
                    targets: {
                      // IE11, ...
                      browsers: ['last 1 version']
                    }
                  }
                ]
              ]
            }
          }
        ]
      }
    ]
  },
  plugins: [
    new webpack.DllPlugin({
      context: __dirname,
      path: './[name]-manifest.json',
      name: '[name]_library'
    })
  ]
};
```

## 背景
会社に入って早速そこそこ大きいプロジェクトに入りました。Webpackの設定が古くて遅かったので、色々やった内の1つとしてdllで先に作ってしまう方法も導入しました。
ところが、バグチェックする時IE11がシンタックスエラーを吐いて確認すらできない状態でした。だけど、依存パッケージ（幾つか良くわからない、使ったことない）が多くどれが原因を起こしているパッケージなのか分からないのと、別のパッケージで置き換えるのも嫌だ！と思いました。（時間もないし）

## 解決
エラーログを見たら確かに`() => {}`とかありました。
そこで、「こっちもbabelで変換しちゃえば良いいんじゃね？（そもそも通せるのか）
」と思ったので`babel-preset-env`な`babel-loader`を通すようにしてみました。

無事通ってはくれましたが、すべてをポイッっと通すと、それはそれで別のエラーを吐くようになってしまいました。これは、その都度`Rule.exclude`でそのファイルを除外するなどの設定が必要でした。また、明らかに大丈夫だろうというパッケージまで通してるとファイルサイズが大きくなってしまうので、そういうパッケージも除くようにしたほうがいいと思います。

とりあえずIE11でもエラーを吐かないようにできました😇

## 参照

1. [webpackのDLLバンドルを使ってビルドを速くする](http://qiita.com/pirosikick/items/c77db84dbed4c447a6fe)
astah* professionalを使用したH2 DatabaseのER図生成手順 

astah* professionalを使用してH2 DatabaseのデータファイルからER図を自動的生成(リバース)する手順は以下の通りです
(基本的に以下の公式サイトを見ればわかるような内容なのですがH2での動作実績として残しておきます)

# 準備
・astah* professional(本手順はv7で確認)

# ER図のリバース手順

## 1) DBリバースプラグインのインストール

astah* professionalの「DBリバースプラグイン」以下からダウンロード

上記サイトの手順に従いastah* professionalへ起動

○DBリバースプラグイン
http://astah.change-vision.com/ja/feature/db-reverse-plugin.html

## 2) H2のJDBCドライバーのインストール

JDBCドライバをダウンロードして任意のフォルダ(c:\tmp等)に保存

○H2 DatabaseのJDBCドライバ
http://repo1.maven.org/maven2/com/h2database/h2/1.4.195/h2-1.4.195.jar

## 3) DBファイルの取得

ER図を生成するH2 DatabaseのDBファイルをastahが動作しているPCの任意フォルダ(c:\tmp等)に配置する

## 4) DB接続設定と取り込み

astah* professionalの[ツール]→[DBリバース]を設定
表示されたダイアログで下記を設定して「接続」ボタンを押下

```
[接続方法] H2 Database Engine
[URL:] jdbc:h2:c:/tmp/<DBファイル名>;IFEXISTS=TRUE
[ユーザー名:] sa
[パスワード:] なし
[JDBCドライバー:] org.hsqldb.jdbcDriver
[ドライバーのパス:] C:\tmp\h2-1.4.195.jar
```

正常に接続できれば[コンソール:]に以下が表示されます

```
接続に成功しました。
取込みをする前に、スキーマを選択してください。
取込みボタンを押すと実行されます。また、切断ボタンを押すと接続が切断されます。
```

[スキーマ:]で「PUBLIC」を選択して「取り込み」ボタンを押下

左側の「構造ツリー」にテーブルが取り込まれたら「閉じる」ボタンを押下」

## 5) ER図作成

「構造ツリー」の「ER Model」を右クリックでメニューを開き「ER図を自動生成する」を選択するとER図が作成されるので適宜レイアウトを調整してください
codeigniterでindexにアクセス出来ない

localhost/exampleにアクセスした時に、エラーが出る場合がある。

アクセスしたいURL→`http://localhost/exsample`
ルートディレクトリ→`xammp/htdocs/exsample`
indexファイルの場所→`/xampp/htdocs/exsample/codeigniter/public/index.php`

指定しているディレクトリが違うから、開けない。
そんな時は

xammpのconfigからhttpd.confを開く。

```
Alias /example C:\xampp\htdocs\example\codeigniter\public
```
とする。
【Swift】UIColorからRGB値を逆変換で取得する

## はじめに
iOSアプリ開発で色を扱うときに`UIColor`を使いますが、RGB値から`UIColor`を生成することは簡単だと思いますが、`UIColor`からRGB値を取得するのに苦戦したので、その方法について書きます。

## 開発環境
Xcode 8.3.2
Swift 3.1

## コード

### `CGColor`を経由する方法
`UIColor`を`CGColor`に変換することでRGBの値を取得することができます。

```swift

func convertToRGB(_ color: UIColor) -> (red: CGFloat, green: CGFloat, blue: CGFloat, alpha: CGFloat) {

    let components = color.cgColor.components! // UIColorをCGColorに変換し、RGBとAlphaがそれぞれCGFloatで配列として取得できる
    return (red: components[0], green: components[1], blue: components[2], alpha: components[3])
}
```

### 使い方

```swift
let sampleColor = UIColor(red: 0.3, green: 0.2, blue: 0.5, alpha: 1)
convertToRGB(sampleColor).red // -> 0.3が取得できる
```
Numeral.js で通貨記号を変更する


[Numeral.js](http://numeraljs.com/) で Currency フォーマット時の通貨記号を変更する方法のメモ。

参考記事の通りにロケールの変更するだけで良かったので簡単だった。
試したバージョンは numeral@2.0.6。

```javascript
> const numeral = require('numeral');
// locale ファイルの読み込み
> require('numeral/locales/ja');
> require('numeral/locales/de');

// locale を ja に変更
> numeral.locale();
'ja'
> numeral(999999999).format('$0,0');
'¥999,999,999'

// locale を de に変更
> numeral.locale('de');
'de'
> numeral(999999999).format('$0,0');
'€999 999 999'

// locale をデフォルトに戻すには en を指定。en は locale ファイルを読み込む必要無し
> numeral.locale('en');
'en'
> numeral(999999999).format('$0,0');
'$999,999,999'
```

## 参考

JavaScriptでカンマ区切りなどによる数値のフォーマットができるNumeral.jsが便利 - Qiita 
http://qiita.com/ariarijp/items/4a043c60ca00d848af48

Numeral.jsのlocaleを変更して桁区切り文字をカンマからピリオドにする - dackdive's blog 
http://dackdive.hateblo.jp/entry/2017/05/24/185346
gulp-uglify v3.0.0から preserveComments が消えたので書き方変えたよ

# Licenseコメント残すためのオプション preserveComments が消えた
npm updateしたら
`preserveComments` is not a supported option
とか言われた。そんなバカな。

ってわけで調べたら、gulp-uglifyに↓こんなissueが
https://github.com/terinjokes/gulp-uglify/issues/215
https://github.com/terinjokes/gulp-uglify/issues/265

中身を見てみると
「preserveComments が動かないっす」
「gulp-uglify v3.0.0からそのオプション自体消しますんで」
みたないやり取り
なんてこった。

## uglifyjs2を踏まえたオプションの書きかたに変更
いままではこう

```javascript:gulpfile.js
var uglify = require('gulp-uglify');//プラグイン宣言
gulp.task('script', function(){
  gulp.src(src)
    .pipe(uglify({preserveComments: 'some'})) // ←これが今回の問題オプション
});
```
これが動かなくなりました。
gulp-uglify　v3.0.0以上からはUglifyJS2の記述を踏まえて
これからはこう↓

```javascript:gulpfile.js
var uglify = require('gulp-uglify');//プラグイン宣言
gulp.task('script', function(){
  gulp.src(src)
      .pipe(uglify({ 
        output:{
          comments: /^!/ //正規表現でLicenseコメントの頭によくある/*!を検出
        }
      })
};
```

わりとさくっと動いた。よかった。
optionの設定はUglifyJS2を見ると詳細があります。やったぜ！
https://github.com/mishoo/UglifyJS2#minify-options

正規表現の部分を改良すれば/*!以外のライセンスコメントも抽出できるね。
とか思ってたら
https://www.npmjs.com/package/uglify-save-license
ってのがあった。素敵！！

## pumpを利用して書く
https://github.com/terinjokes/gulp-uglify#errors
gulp-uglifyでerrorを出力するようにしたからpumpをおすすめします
的なことが書かれてたのでpumpつかって書いてみる。

``` gulpfile.js
gulp.task('script', function(callback) {
  pump([
      gulp.src('assets/js/*.js'),
      $.plumber(),
      $.concat('all.js'),
      uglify(),
      gulp.dest('./htdocs/assets/js/')
    ],
    callback
  );
});

```
pipeでつなぐと途中でerrorした場合、そのtaskを抜けるのでエラーが最初の一つしかわからない。
pumpなら記述内をすべて行ってからエラーをまとめて出力してくれるようです。

## gulp-uglify、sourcemapやめるってよ
**追伸** sourcemapも設定しないでねとのこと。そのうち消えるのかな？
https://github.com/terinjokes/gulp-uglify#options
Python vs Ruby 『ゼロから作るDeep Learning』 3章 ステップ関数、シグモイド関数、ReLU関数のグラフ

## 概要

書籍『ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装』3章のコードを参考に Python と Ruby でステップ関数、シグモイド関数、ReLU関数のグラフを描画するプログラムを書く。

計算処理・描画処理では外部ライブラリを利用する。Python では NumPy と Matplotlib を、Ruby では Numo::NArray と Numo::Gnuplot を使用する。

環境構築が必要な場合はこちらを参照。
→ Python vs Ruby 『ゼロから作るDeep Learning』 1章 sin関数とcos関数のグラフ http://qiita.com/niwasawa/items/6d9aba43f3cdba5ca725

## ステップ関数、シグモイド関数、ReLU関数のグラフを描画するコード

### Python

```python
import numpy as np
import matplotlib
matplotlib.use("AGG") # 描画ライブラリにAGG(Anti-Grain Geometry)を使う
import matplotlib.pyplot as plt

# ステップ関数
def step(x):
  return np.array(x > 0, dtype=np.int)

# シグモイド関数
def sigmoid(x):
  return 1 / (1 + np.exp(-x))

# ReLU (Rectified Linear Unit) 関数
def relu(x):
  return np.maximum(0, x)

# データの作成
x = np.arange(-5.0, 5.0, 0.1)
y1 = step(x)
y2 = sigmoid(x)
y3 = relu(x)

# グラフの描画
plt.figure(figsize=(3, 4), dpi=160) # 画像サイズ
plt.plot(x, y1, label="Step")
plt.plot(x, y2, label="Sigmoid")
plt.plot(x, y3, label="ReLU")
plt.title("Step, Sigmoid, ReLU")
plt.xlim(-5.5, 5.5) # x軸の範囲
plt.ylim(-0.2, 5.2) # y軸の範囲
plt.legend()
plt.savefig("python_graph.png")
```

### Ruby

```ruby
require 'numo/narray'
require 'numo/gnuplot'

# ステップ関数
def step(x)
  x > 0 # Numo::Bit を返す
end

# シグモイド関数
def sigmoid(x)
  1 / (1 + Numo::NMath.exp(-x)) # Numo::DFloat を返す
end

# ReLU (Rectified Linear Unit) 関数
def relu(x)
  y = Numo::DFloat[x] # コピー
  y[y < 0] = 0 # 0より小さい値の場合は0を代入する
  y
end

# データの作成
x = Numo::DFloat.new(100).seq(-5.0, 0.1)
y1 = step(x)
y2 = sigmoid(x)
y3 = relu(x)

# グラフの描画
g = Numo::gnuplot do
  set term: {png: {size: [480, 640]}} # 画像サイズ
  set output: 'ruby_graph.png'
  set title: 'Step, Sigmoid, ReLU' # タイトル
  set key: 'box left top'
  set xrange: -5.5...5.5 # x軸の範囲
  set yrange: -0.2...5.2 # y軸の範囲
  set offset: [0, 0, 0, 0]
  plot x, y1, {w: 'lines', lw: 3, title: 'Step'},
       x, y2, {w: 'lines', lw: 3, title: 'Sigmoid'},
       x, y3, {w: 'lines', lw: 3, title: 'ReLU'}
end
```

## 出力された画像

### Python

![python_graph.png](https://qiita-image-store.s3.amazonaws.com/0/139365/91ac1b87-845b-8d7c-d81c-55a4baf9af7d.png)

### Ruby

![ruby_graph.png](https://qiita-image-store.s3.amazonaws.com/0/139365/67a084eb-6e6a-b093-af75-9e9112054f73.png)

## 参考資料

- Python vs Ruby 『ゼロから作るDeep Learning』 まとめ - Qiita http://qiita.com/niwasawa/items/b8191f13d6dafbc2fede
Windows上でシンプルにPython3実行環境を構築する

社内でエンジニア、非エンジニア交えてPythonの勉強を始めたところ、Windows10環境にてインストールからつまづいたのでメモを残します。

前提
---

* 非エンジニアを対象に含む
* virtualenvとかは使わずに単純にpythonをシステムにインストールする
    * 非エンジニアに複雑な環境構築やらせるのは酷、後からでいい
    * まずはコード書いて動かして感動したい
* 使うもの
    * Windows10
    * Python 3.6.x
    * Visual Studio Code


Pythonのインストール
---

### Python本体をインストール

1. [公式ダウンロードページ](https://www.python.org/downloads/windows/)にある一番新しい日付の`Windows x86-64 executable installer`をダウンロード
    * いろいろ紛らわしい名前なので注意。`x86-64`と`executable`がポイント
1. ダウンロードされた`python-3.6.1-amd64.exe`（3.6.1の部分はダウンロードした日付によって変わることがある）を実行してインストール
    * 後からPATHを設定するのは面倒なので`Add Python 3.6 to PATH`にチェックを入れてインストールする
![pythonインストール.png](https://qiita-image-store.s3.amazonaws.com/0/31037/9995f7f5-74b9-f545-eae7-5abf78c42b3c.png)
1. インストールが終わったらコマンドプロンプトを開いて`python -V`とタイプして`Python 3.6.1`などと出ればOK
    * 上手くいかない場合は上記チェックの入れ忘れなのでWindowsの環境変数PATHに`C:\Users\(ここはユーザ名)\AppData\Local\Programs\Python\Python36`を設定する
    * コマンドプロンプトから`setx /M PATH "%PATH%;C:\Users\(ここはユーザ名)\AppData\Local\Programs\Python\Python36"`と入力すれば追加される


### Visual Studio 2015 の Visual C++ 再頒布可能パッケージをインストール

Pythonだけインストールしても起動時にエラーが出るので、VS2015のVC++再頒布パッケージをインストールする。

1. [このページ](https://www.microsoft.com/ja-jp/download/details.aspx?id=52685)で「日本語」が選択されている状態で赤い「ダウンロード」ボタンをクリック
1. `	
vc_redist.x64.exe`にチェックを入れて、青い「次へ」ボタンでダウンロード
1. ダウンロードされた`	
vc_redist.x64.exe`を実行してインストール

Visual Studio Codeのインストール
---

### 本体のインストール

1. [公式ページ](https://code.visualstudio.com/)の緑色の「Download for Windows」ボタンをクリックしてダウンロード
1. ダウンロードされた`VSCodeSetup-1.12.2.exe`（1.12.2の部分はダウンロードした日付によって変わることがある）を実行してインストール

### 拡張機能のインストール

1. インストールされたVisual Stduio Codeを起動
2. `Ctrl + Shift + x`で拡張機能画面を表示し、検索欄に`python`と入力して一番上に出てくる`Python`という拡張機能をインストール

---
raspberry pi 3 と windows10 を Ethernet で繋げずハマった話

# 背景
- raspberry pi 3 を買ってきた
- あれ......ディスプレイもマウスもキーボードもないぞ
- Ether cable で繋いでsshすればええんちゃう
- OSインスコしたぞ
- sshするで
- 動かない.....

# 環境
- PC : Thinkpad X220i windows 10 RAM:16GB 
- Pi : Raspberry Pi 3 Model B Raspbian(2017/04)  

# やったこと（間違った手順？）
- windows に Itunes を入れた (Itunesに含まれるBonjour？が必要らしい)
- Ethernet Cable でpcとpiにつなげる
- ネットワーク共有で、Pi3にネットワークを割り当てる
- arp -a でそれっぽいアドレスを見つける(192.168.---.-----みたいなの)
- ping する
- sshする（bash on windows を使用）
- 弾かれる

# 原因と対処
"arp -a でそれっぽいアドレスを見つける" これがダメでしたね。
正しい手順は、ping raspberry.local をして、ping が通るかの確認とIPアドレスの確認をするでした。
ちなみに、初期設定ではIPv6での接続になっていたので、これをOFFにしてV4でのIPの確認をしました。
その後、確認したIPアドレスに向けてsshしたら普通につながりました。めでたしめでたし。
[Kaggle]タイタニックチュートリアルを使った問題集を作ってみた

https://www.kaggle.com/startupsci/titanic-data-science-solutions　
↑のTutorialを写経していると全然あんまり頭の入ってこなかったので問題集を作ってみました。


https://github.com/yoshimo8/feature_practice_pandas2
こちらのGithubをクローンしてJupyterを使ってバンバン問題を解いてみてください。
CSSで画像を簡単に円形にくり抜くTIPS！border-radius面白い！

今回は、border-radiusがimgタグにも効く！ってことを共有します。

普通に正方形の画像を配置した場合（背景色はブラックにしています）、
以下のようになります。

<img width="310" alt="before.png" src="https://qiita-image-store.s3.amazonaws.com/0/118906/8c67a186-0c53-6188-43eb-379573d2773e.png">


<br>
こちらの画像imgタグにborder-radiusを付けることで円形にくり抜くことができるのです。

```
img{
 width: 220px;
 border-radius: 50%;
}
```

<img width="381" alt="after.png" src="https://qiita-image-store.s3.amazonaws.com/0/118906/78bf8bb6-352a-9299-be7e-50ce7e0ecb7a.png">




border-radiusの値を0〜50%の間で変更して見て下さい。
円形以外にも丸みをおびた表現が可能になります。


border-radius不思議ですね。詳細仕様は以下で確認できます。
https://developer.mozilla.org/en-US/docs/Web/CSS/border-radius?v=example
java8標準クラスを使って和暦や曜日を表示する

java8の日付、時刻型はいろいろクラスが用意されていて、
多機能な反面ぱっと使いずらい（和暦はJapaneseDateで扱えるけど時間情報は持たないなど）ので、
任意の日時を任意のフォーマットで出力するユーティリティメソッドを考えてみました。

```java:DateTimeFormat.java
import java.time.LocalTime;
import java.time.chrono.ChronoLocalDateTime;
import java.time.chrono.JapaneseDate;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoField;
import java.time.temporal.ChronoUnit;
import java.util.Locale;
import java.util.function.Function;

@SuppressWarnings("javadoc")
public class DateTimeFormat {

    public static String dateTimeFormat(String format) {
        return dateTimeFormat(format, Function.identity());
    }

    public static String dateTimeFormat(String format, Function<ChronoLocalDateTime<JapaneseDate>, ChronoLocalDateTime<JapaneseDate>> modify) {
        return modify.apply(JapaneseDate.now().atTime(LocalTime.now())).format(DateTimeFormatter.ofPattern(format, Locale.JAPAN));
    }

    public static void main(String[] __) {
        // 現在日時
        System.out.println(dateTimeFormat("uuuu/MM/dd(E) HH:mm:ss"));
        System.out.println(dateTimeFormat("Gy年M月d日(EEEE)H時m分s秒"));
        System.out.println(dateTimeFormat("GGGGGy.M.d"));
        // 今月の末日
        System.out.println(dateTimeFormat("uuuu/MM/dd(E)", d -> d.with(ChronoField.DAY_OF_MONTH, d.toLocalDate().lengthOfMonth())));
        // 一週間後
        System.out.println(dateTimeFormat("Gy年M月d日(E)", d -> d.plus(7, ChronoUnit.DAYS)));
        // 来月1日
        System.out.println(dateTimeFormat("GGGGGy.M.d", d -> d.with(ChronoField.DAY_OF_MONTH, 1).plus(1, ChronoUnit.MONTHS)));
    }

}

```

```:実行結果
2017/06/15(木) 11:30:05
平成29年6月15日(木曜日)11時30分5秒
H29.6.15
2017/06/30(金)
平成29年6月22日(木)
H29.7.1
```
【AWS自分用メモ】新しいwebプロジェクトでやること

新しいwebプロジェクトに関して、やることを一覧。AWSは90種類以上のサービスがあり自分は一部しか把握していません。。。
これやったほうがいいよというサービスなどあれば教えていただけると嬉しいです。喜びます。

やることを簡単にまとめると
RDS,EC2はプライベートサブネットに配置
webサーバー2台構成で異なるAZに配置
ALBの前にWAFを使用
cloudwatchでダッシュボードやアラート作成


#AWSサービス
使用サービス一覧(()内は必要であれば)
CloudTrail VPC　IAM　EC2　route53 (RDS) (cloudfront) (ACM)　WAF　Cloudwatch

##◆CloudTrail
・awsアカウント全体の操作ログを記録

##◆VPC
構成：
・東京リージョン
・サブネットはプライベートサブネットとパブリックサブネットを各２つずつ、かつ各サブネット異なるAZ
・EC2インスタンスとRDSはすべてプライベートサブネットに作成
・クライアントのhttpリクエストは右のような流れ⇒【IGW-WAF-(cloudfront)-alb-ec2 (レスポンスはこの反対)】
・EC2がIGWを通る方法はNAT経由、右のような流れ⇒【EC2-NATGW-IGW】
・新規EC2インスタンスのsshアクセスは踏み台経由、のような流れ⇒【踏み台はユーザーと鍵認証-踏み台からsshコマンドでユーザーとパスワード認証】
・踏み台用VPC作成、プロジェクトごとのVPC作成後お互いにピアリング接続


> ###踏み台VPC作成（踏み台がない新規AWSアカウントのみ、かつDefaultのVPC使うなら不要）

- VPC作成
- サブネット作成（パブリックサブネットを一つ作成）
- IGW作成
- ルートテーブル：ルートタブIGWをアタッチ,サブネットの関連付けタブで明示的にサブネットを当てる

> ###新規プロジェクトのVPC作成

- VPC作成
- サブネット作成,PrivateSubnetをことなるAZで2つ,PublicSubnetを異なるAZで２つ作成＝合計4つ作成
- IGW作成
- PCX作成　踏み台VPCと新規プロジェクトのVPCを作成。承認する必要あるので承認する。
- NATゲートウェイ作成　EIP新規割り当て
- ルートテーブル1つ作成　合計2つあるテーブルをPraivateとPublicに分けPraivateをメインにする
- Praivateのルートテーブルのルートタブに作成したPCXとNATを登録、サブネットの関連付けタブで明示的にPrivateSubnetを2つ登録
- Publicのルートテーブルのルートタブに作成したIGWを登録、サブネットの関連付けタブで明示的にPublicSubnetを2つ登録
- 踏み台VPCのルートテーブルにPCXを登録

##◆IAM
新規ロールをアタッチ。ポリシーは必要に応じて後でつけるので無し。

- IAMロール作成

##◆EC2
構成：
・webサーバーを2つ構成で冗長化（プライベートサブネットで各異なるAZに配置）
・必要に応じてautoscalling、リザーブドインスタンスの権利購入、など

> ###踏み台VPCの構成

- PublicSubnetにインスタンス作成
- 作成したインスタンスにEIPを当てる


> ###新規プロジェクトの構成

- ポートセキュリティの作成 ポート：ssh,http,(https)
- インスタンスの作成、プライベートサブネットで各異なるAZに配置、ロールの割り当て、セキュリティグループ割り当て、自動割り当てパブリックIP無効

- ALBを作成　Publicサブネット異なるAZに配置、webサーバーを２つ登録、
- ALBのロギング設定、セッションの維持、ヘルスチェックの変更

##◆route53

- お名前などのサービスからドメインの取得
- route53に取得ドメインを登録
- お名前などドメインをとったサービスからAWSのネームサーバーに変更
- route53必要なサブドメインなど登録　（AレコードにAliasでELBのドメインを登録）
- route53のオプション機能geolocationで国を制限

##◆WAF

- プロジェクトごとにあった設定
- 設定後新規プロジェクトのALBに当てる

##◆Cloudwatch

- ダッシュボードの作成
- アラートの作成

[【AWS自分用メモ】Cloudwatch 監視事項・アラート](http://qiita.com/mint/private/3bf74f7c1c86754cba1f)

#amazon linuxの中の設定
##◆OS amazon linux

- 時間の設定
[Linux インスタンスの時刻の設定](http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/set-time.html)


- apache,php,phpモジュールなどのインストール
- httpd,logrotate,php.iniの設定  （httpdのログとalbのヘルスチェックは分ける）
[【AWS自分用メモ】webサーバーに関しての設定](http://qiita.com/mint/private/2c882ca29eaa96c150dd)

- 公式カスタムメトリクス実装
[公式カスタムメトリクス実装](http://qiita.com/mint/items/71914001fb8389981256)
capistrano3-pumaのtaskが読み込めない場合の対応

## 事象

CapistranoのVersionを3.8にあげると、デプロイが失敗するようになりました。
capistrano3-pumaのtaskがよみこめなくなったというエラーがでます。

```
Don't know how to build task 'start' (see --tasks)
Don't know how to build task 'puma:restart' (see --tasks)
```

## 設定ファイル

```:config/deploy.rb
namespace :puma do
  desc 'Create Directories for Puma Pids and Socket'
  task :make_dirs do
    on roles(:app) do
      execute "mkdir #{shared_path}/tmp/sockets -p"
      execute "mkdir #{shared_path}/tmp/pids -p"
    end
  end
  before :start, :make_dirs
end

namespace :deploy do

  desc 'Restart application'
  task :restart do
    on roles(:app), in: :sequence, wait: 5 do
      invoke 'puma:restart'
    end
  end

  after :publishing, :restart
end
```

```Capfile
require "capistrano/setup"
require "capistrano/deploy"
require "capistrano/rails"
require 'capistrano/puma'
require "capistrano/scm/git"

install_plugin Capistrano::SCM::Git

Dir.glob("lib/capistrano/tasks/*.rake").each{|r| import r}
```

## 対応

Capfileに``install_plugin Capistrano::Puma``を追記しました。

```Capfile
require "capistrano/setup"
require "capistrano/deploy"
require "capistrano/rails"
require 'capistrano/puma'
require "capistrano/scm/git"

install_plugin Capistrano::SCM::Git
install_plugin Capistrano::Puma <-コレ

Dir.glob("lib/capistrano/tasks/*.rake").each{|r| import r}
```


## 追記

さらに最新(2017/06/07)のcapistrano3-pumaのGemをinstallすると、またもやエラーが発生

```
Skipping task `puma:restart'.
Capistrano tasks may only be invoked once. Since task `puma:restart' was previously invoked, invoke("puma:restart") at rails_app/vendor/bundle/ruby/2.4.0/gems/capistrano3-puma-3.1.0/lib/capistrano/tasks/puma.rake:96 will be skipped.
If you really meant to run this task again, first call Rake::Task["puma:restart"].reenable
THIS BEHAVIOR MAY CHANGE IN A FUTURE VERSION OF CAPISTRANO. Please join the conversation here if this affects you.
https://github.com/capistrano/capistrano/issues/1686
```

## 対応

```:config/deploy.rb
namespace :deploy do

  desc 'Restart application'
  task :restart do
    on roles(:app), in: :sequence, wait: 5 do
      Rake::Task["puma:restart"].reenable <-コレを追記
      invoke 'puma:restart'
    end
  end

#  after :finishing, :restart <- これをコメントアウトする
```

## 参考
https://stackoverflow.com/questions/43014993/dont-know-how-to-build-task-start-when-run-cap-production-deploy-for-capist
https://github.com/seuros/capistrano-puma#usage
https://github.com/capistrano/capistrano/issues/1686
https://stackoverflow.com/questions/39810930/pumarestart-invoke-twice-but-i-only-call-it-once-on-my-deploy-app-via-capistr
[メモ]iOSアプリ公開時に必要なもの

パターンを試したわけではないので、必要でないものもあるかもしれない。
今回はiPhone用として作成していた。
が、iPad用にも公開されるのは必須みたい。
iPad専用アプリはあるのに。
だから素材も両方用意しなければならない。

[使用環境]
Xcode8

<h1>･アイコン</h1>
iPhone用にサイズ別に8枚。
iPad用に2枚。
iPadPro用に1枚。

iPhone用は多分全部必要だと思うけど、一部で済むかも。
iOSアプリ用に必要なサイズに一括変換してくれるツールがあるけど、
現行の種類に対応しているのは見当たらなかった...。

```
iPhone	   Notifications(2x)                                   40px x 40px
iPhone	   Notifications(3x)                                   60px x 60px
iPhone	   Spotlight(2x)(iOS5,6) and Setting(iOS5〜10)         58px x 58px
iPhone	   Spotlight(3x)(iOS5,6) and Setting(iOS5〜10)         87px x 87px
iPhone	   Spotlight(2x)(iOS7〜10)                             80px x 80px
iPhone	   Spotlight(3x)(iOS7〜10)                           120px x 120px
iPhone	   App(2x)(iOS7〜10)                                 120px x 120px
iPhone	   App(3x)(iOS7〜10)                                 180px x 180px

iPad	   App(1x)(iOS7〜10)                                   76px x 76px
iPad	   App(2x)(iOS7〜10)                                 152px x 152px
iPad Pro   App(2x)(iOS7〜10)                                 167px x 167px
```

<h1>･スクリーンショット</h1>
iPhone,iPad各種画面サイズが最大のデバイスのスクリーンショットが最低1枚ずつ必要。
iPhoneなら7Plus等5.5インチ。
iPadならiPadProの12.9インチ。

iPhoneはやはり未確認。
手持ちのデバイスが7だったので、7のスクリーンショットを入れて実行したら、
5.5インチが無いとエラー。
7の4.7インチをそれ以下のサイズに適用みたいな機能はあったので、
最初から5.5インチを入れたら全部に適用できたのかも。

あと、おそらくファイルはjpgが使えなくて、pngのみ。
だけどアルファチャンネル(透過)は使えない。
Photoshopとかでイジってたりしたら、アルファチャンネルなしにしておく必要あり。
TensorFlowでTicTacToeに挑戦 その2

#概要
TnsorFlowでTicTacToeをやるために、OpenAiGymのTicTacToe環境作って見た。
TnsorFlowでやってみた。

#写真
百回やって、4回、勝って、ドローが4回。

![katta.jpg](https://qiita-image-store.s3.amazonaws.com/0/18104/58cdbe7f-3ca0-e5b4-1bb5-931a3f609929.jpeg)


#環境
windows 7 sp1 64bit
anaconda3
tensorflow 1.0
OpenAi Gym 0.5

#方針
Qラーニングしない。CNN使わない。RNN使わない。
盤を判断する推定器、つくる。

環境observeを、貯めておいて、
報酬rewardが1と-1のときだけ、ブレイン学習する。

実行時、ランダムにアクション求めて、盤を作って
ブレインにお伺いをたてる。

学習は、1000ゲーム。

tensorflowのグラフは、input,fc,relu,fc,outputです。
inputは、9個、outputは、2個。fcは、20個、20個。
オプチマイザーは、GradientDescentOptimizer。

学習プログラムと実行プログラムつくる。
学習は、saver.saveする。
実行で、saver.restoreする。


#学習のサンプルコード

```
def main(_):
	env = toeEnv()
	saver = tf.train.Saver()
	with tf.Session() as sess:
		tf.initialize_all_variables().run()
		for j in range(1000):
			states = []
			rewards = []
			env.reset()
			isGameOver = False
			pstate = [0, 0, 0, 0, 0, 0, 0, 0, 0]
			while (isGameOver != True):
				action = 0
				global X, Y, train_op, loss
				action = sasu(pstate)
				state, reward, gameOver, _ = env.step(action)
				env.render()
				states.append(state)
				if gameOver:
					isGameOver = gameOver
				else:
					pstate, reward, gameOver, _ = env.step(-1)
					isGameOver = gameOver
			if (reward == 1):
				for i in range(len(states)):
					rewards.append(np.array([0, 1]))
				op, lss = sess.run([train_op, loss], feed_dict = {
					X: states,
					Y: rewards
				})
				print("Epo: " + str(j) + " loss: " + str(lss) + " reward: 1")
			if (reward == -1):
				for i in range(len(states)):
					rewards.append(np.array([1, 0]))
				op, lss = sess.run([train_op, loss], feed_dict = {
					X: states,
					Y: rewards
				})
				print("Epo: " + str(j) + " loss: " + str(lss) + " reward: -1")
		save_path = saver.save(sess, os.getcwd() + "/toe1.ckpt")
		print("Model saved in file: %s" % save_path)
```

#確認のサンプルコード

```
def main(_):
	env = toeEnv()
	saver = tf.train.Saver()
	with tf.Session() as sess:
		saver.restore(sess, os.getcwd() + "/toe1.ckpt")
		win = 0
		draw = 0
		for j in range(100):
			env.reset()
			isGameOver = False
			pstate = [0, 0, 0, 0, 0, 0, 0, 0, 0]
			while (isGameOver != True):
				action = -1
				global X, Y, predict_op, loss
				found = False
				while (found != True):
					ppstate = pstate.copy()
					i = np.random.randint(0, 9)
					ppstate[i] = 1.0
					op = sess.run(predict_op, feed_dict = {
						X: [ppstate],
					})
					if op == [1]:
						found = True
						action = i
				state, reward, gameOver, _ = env.step(action)
				env.render()
				if gameOver:
					isGameOver = gameOver
				else:
					pstate, reward, gameOver, _ = env.step(-1)
					env.render()
					isGameOver = gameOver
			if reward == 1:
				win += 1
			if reward == 0:
				draw += 1
			print ("Epo: " + str(j) + " reward: " + str(reward) + " win: " + str(win) + " draw: " + str(draw))
```
【Unity拡張】Unity上の画像ファイルをPhotoshopで開く

# はじめに
最近、Photoshopで画像データを編集するという場面が増えてきて　

>Photoshop起動 -> 画像を開く 

という手順が面倒に感じるようになってきました。


そこで、Unity上から画像ファイルをPhotoshopで直接開くエディター拡張を作ってみました。

# 環境について
Windows 10
Unity 5.6.1f1

# ソースコード
Unityプロジェクト内にEditorフォルダを作成して、以下のスクリプトを作成します。

```csharp
using UnityEngine;
using UnityEditor;
using System.Diagnostics;
using System.IO;

public class EditorOpenInPhotoshop
{
    const string ItemName = "Assets/Open in Photoshop";

    [MenuItem(ItemName, false)]
    static void Open()
    {
        foreach (var guid in Selection.assetGUIDs)
        {
            var path = AssetDatabase.GUIDToAssetPath(guid); // 選択中のアセットのパス
            var fullPath = Path.GetFullPath(path); // アセットの絶対パス
            Process.Start("photoshop", fullPath); // Photoshopでアセットを開く
        }
    }
}
```

# 使う
開きたい画像を選択して右クリックメニューの Open in Photoshopを選択します。
![open_in_photoshop.gif](https://qiita-image-store.s3.amazonaws.com/0/44288/17abe139-40fb-c306-a63f-c2323e56462b.gif)

<br>

Photoshopが立ち上がり、選択した画像がすべて開きます。(完)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/44288/40edc338-2f1e-3090-afc9-c531f4e4136a.png)
MAMPでPython3をブラウザに表示

MAMPでPython3をブラウザに表示させます

忘備録として、できるだけ詳しく書いていきます。



##目次
- 環境
- 手順
    - サンプルコード
    - 実行結果
- エラー時の対処法



###環境

OS                          :MacOS
環境                        :MAMP
言語                        :Python 3.6.1
ブラウザ                 :chrome
テキストエディタ   :Atom


###手順

- Apache設定

アプリケーションのfinderでhttpd.confを検索　

場所は

/Applications/MAMP/conf/apache/httpd.conf 

にありました。

httpd.confにて

```#AddHandler cgi-script .cgi 
```

を
```AddHandler cgi-script .cgi .py 
```
に変更し、httpd.confを再読み込みするためにMAMP再起動


　

- 実行権限(パーミッション)の変更  

プログラムの実行権限を与えるために、

例えばtest.pyを作成したら

ターミナルで
```$ chmod 755 test.py
```
と打ちましょう。



No such file or directoryと出るなら、

ターミナルでの現在の場所が間違っているので、cdコマンドで移動しましょう。

　




- test.pyの作成



１行目はpythonのインタプリタの場所です。

わからないときは、ターミナルで

```$ which python3
```
とすれば、

```/Library/Frameworks/Python.framework/Versions/3.6/bin/python3
```
などと出てきます。


　
２〜５行目は、日本語表示する際に必要です。


　
６行目以降は、Python3でHTMLを書くならこれです。なくても構いません。

その場合は１２行目だけでいいですね。






　
**サンプルコード**


```python:test.py

#!/Library/Frameworks/Python.framework/Versions/3.6/bin/python3
import sys
import io
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')

print("Content-Type: text/html; charset=utf-8")
print("")
print("""
    <html>
    <head>
    <meta charset="utf-8">
    </head>
    <body>
    <h1>It works!</h1>
    <p>chmod 755 /Applications/MAMP/htdocs/chatbot.py</p>
    <p>finder :apache_error.log</p>
    <p>本文</p>
    </body>
    </html>
    """)

print('お疲れ様です。')

```

**実行結果**

![スクリーンショット 2017-06-02 12.36.57.png](https://qiita-image-store.s3.amazonaws.com/0/185702/64ff0607-5722-531d-b6c7-e9fe01f387f4.png)






 　
　


###エラー時の対策
　

ブラウザでエラーが出ているなら、

finderでapache_error.logを検索し、

コンソールでapache_error.logを確認して見ましょう。



以下、いくつかよくあるものをメモしておきます。

　

*malformed header from script*
HTTPヘッダーが不完全な場合

３から１２行目が間違っている可能性があります。

　

*Exec format error*
実行形式エラーでよくあるのが、

１行目に正しいPythonの実行ファイルがある場所を示していないことです。

ターミナルで、１行目に指定してある場所が正しいか、試しに

バージョンを確認して見ましょう。

```$ /Library/Frameworks/Python.framework/Versions/3.6/bin/python3 --version
```
などと打って

```Python 3.6.1
```
などと出れば大丈夫です。

　


*Permission denied*
パーミッションエラーでは、実行しようとしているファイルの実行権限がないということです。

ターミナルで

```$ chmod 755 実行したいファイル名
```
などと打ってあげてください。

　　　


*UnicodeEncodeError: 'ascii' codec can't encode characters*

日本語などを書いたときに出てきます。

```
import sys
import io
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
```

は書かれていますか？
　

*その他*
インデントエラー（IndentationError）、

構文エラー（SyntaxError）はpython公式HPを確認してください。


　　　


　

質問、要望など

気軽にツイッターのDMどうぞ！

下の鳥さんをクリックすると、サブアカウントに飛びます。

[ 　　　　_,,,
　　_/::o・ｧ　  ♪　
∈ミ;;;ﾉ,ﾉ
](https://twitter.com/cafe_kanaka)
gitで最新のマージに特定の変更が含まれているか確認する

最近CIサーバ上で、「特定のディレクトリが変更された場合にのみ、ある処理を行う」
というスクリプトを書く必要があったので、メモ。

## TL;DR 
以下の通り(HOGEは監視したいディレクトリへのpath)

```shell-session
  latest_commit=$(  git log --merges -n 2 --pretty=format:"%H" | head -n 1 | tail -n 1)
  previous_commit=$(git log --merges -n 2 --pretty=format:"%H" | head -n 2 | tail -n 1)

  diff=$(git diff $latest_commit..$previous_commit --name-only | grep 'HOGE/')

  if [[ -z $diff ]]; then
    echo "HOGEに変更はありません。"
  else
    echo "HOGEが変更されました。処理を開始します。"
fi
```

## 解説
### commit hashの取得
- `git log --merges`  
→マージされたコミットを表示
- `git log --merges -n 2`  
→マージされたコミットのうち、直近2つを表示
- `git log --merges -n 2 --pretty=format:"%H"`  
→マージされたコミットのうち、直近2つのcommit hashのみを表示
- `head -n 2`  
→入力された内容の、先頭の2行を表示する
- `tail -n 1`  
→入力された内容の、末尾の1行を表示する
- `head -n 2 | tail -n 1`  
→入力された内容の、2行目を表示する(入力された内容の先頭の2行の末尾の1行 = 2行目のみ)
- `git log --merges -n 2 --pretty=format:"%H" | head -n 1 | tail -n 1 `  
→最新のマージコミットを取得
- `git log --merges -n 2 --pretty=format:"%H" | head -n 2 | tail -n 1 `  
→最新の1つ前のマージコミットを取得

### 差分の確認
- `git diff $latest_commit..$previous_commit`  
→ `$latest_commit`と`$previous_commit`の間の差分を表示
- `git diff $latest_commit..$previous_commit --name-only`  
→ `$latest_commit`と`$previous_commit`の間で差分があるファイルをpathで表示
- `git diff $latest_commit..$previous_commit --name-only | grep 'HOGE/'`  
→ `$latest_commit`と`$previous_commit`の間で差分があるファイルのうち、pathに`HOGE/`が含まれるものを表示

### 判定
- `if [[ -z $diff ]]; then`  
→ `$diff`が空文字列でない場合、true