OmniAICreator/Qiita-1.07M huggingface dataset:
Try LPIC Level-1 in English

LPIC Level-1 を英語で受ける時に、自分が利用した教材のまとめ。
いずれも無料で利用できる。

LPICの試験はCBT形式のテストで、試験の申込時に言語を選択することができる。
デフォルトの日本語だと、試験中に問題を日本語/英語に切り替えることができる。
また、申込時に英語を選択した場合、試験中は英語のみで、試験中に日本語に切り替えることはできなくなる。
※私は英語を選択しましたが、中学卒業レベルの英語で十分理解できると思いました。

## [Tuxcademy](https://www.tuxcademy.org/media/lpic1/)

もともと、Linuxやオープンソースのトレーニングを提供していたドイツの Linup Front GmbH 社のトレーニング教材として利用されていた資料。
同社が2015年にトレーニング事業から撤退した後、Tuxcademy Project として、教材等を Free（Cretive Commons Licence）で提供している。
PDFの資料をダウンロードして読むことができる。

 * コマンドやスクリプトのサンプルが実践的
 * ディストリビューションによる差異が豊富
 * Linuxの歴史や背景に対する話題も豊富
 * LPICの出題範囲にも対応しているが、試験用の内容というよりは Linux の入門者向け。

Kindle Reader などの辞書機能のある PDF Reader を使うこと、わからない英単語の意味を確認しながら読める。

## [IBM developerWorks](https://www.ibm.com/developerworks/library/l-lpic1-map/index.html#101)

IBMが開発者向けに提供している技術情報。 日本語版ページもある。

 * LPICの出題範囲に対応した内容で構成されている
 * コマンドやスクリプトのサンプルが豊富で分かりやすくまとめられている

難しい英語はあまり使われていないので読みやすい。 
この記事を書いている時点では、102試験の内容については半分くらい準備中になっているので、主に101試験用の学習に利用するとよい。

## [jadijadi/lpic1book](https://jadi.gitbooks.io/lpic1/)

イラン出身のjadi氏のGitbook。 
非常にコンパクトな内容で、試験直前にさらっと出題範囲の全体を見渡したいときに便利。


## [Penguin Tutor - Linux Certification Practice Exams](http://www.penguintutor.com/quiz/index.php)

試験問題のシミュレーションができる。（Ping-tのようなもの）
英語で問題を解くための練習に利用できる。 簡単な解説もあるが、あくまで練習用に何度かやってみる程度でよいと思う。
rails-erdで「Graphviz produced errors. Verify it has support for filetype=pdf~Original error: Format: "pdf" not recognized.~」とエラーが出た時の対処

# 現象
RailsでER図を自動生成してくれる[rails-erd](https://github.com/voormedia/rails-erd)を使ってみたところ、"pdf"が認識されない！といった旨のエラーが発生。
※graphvizはインストール済み

```
# rake erd
Loading application environment...
Loading code in search of Active Record models...
Generating Entity-Relationship Diagram for 11 models...
rake aborted!
Saving diagram failed!
Graphviz produced errors. Verify it has support for filetype=pdf, or use filetype=                                                    dot.
Original error: Format: "pdf" not recognized. Use one of: canon cmap cmapx cmapx_n                                                    p dot eps fig gv imap imap_np ismap pic plain plain-ext pov ps ps2 svg svgz tk vml                                                     vmlz xdot xdot1.2 xdot1.4

Error from ["/usr/bin/dot", "-q1", "-Tpdf", "-oerd.pdf", "/tmp/graphviz.rb20170701                                                    -2024-1dwwpak"]:
Format: "pdf" not recognized. Use one of: canon cmap cmapx cmapx_np dot eps fig gv                                                     imap imap_np ismap pic plain plain-ext pov ps ps2 svg svgz tk vml vmlz xdot xdot1                                                    .2 xdot1.4

Tasks: TOP => erd => erd:generate
(See full trace by running task with --trace)
```

### 実行環境
CentOS 7.3
Ruby 2.4.0
Ruby on Rails 5.0.2

# 原因と対処
Graphvizのインストールミス。PDFをサポートするためには、事前にCairoとPangoというものをインストールしなければいけないらしいです。Cairoは2Dグラフィクスライブラリ、Pangoは多言語テキスト表示ライブラリで、いかにもGraphvizと関連してますね。
これらを入れる順番も重要だそうです（Cairo→Pango→Graphvizの順）。
ということで、Graphvizをインストールし直せば良さげです。

### Graphizのアンインストール

```
# sudo yum remove -y graphviz
```
※ cairo, pangoの入れる順番を間違えているときはここでアンインストール

### Cairo, Pango, Graphizのインストール
```
# sudo yum install -y cairo pango graphviz

```

### 再びrails-erdを実行
```

# rake erd
Loading application environment...
Loading code in search of Active Record models...
Generating Entity-Relationship Diagram for 11 models...
Done! Saved diagram to erd.pdf.
```

無事ER図ができました！

## CoreText performance note: Client called~とエラーが出た時の対処法
別件ですがMac環境ではフォントの問題でエラーが発生することがあるらしいです。
そのときはgemインストールの際に以下のようにリポジトリを指定してやるといいそう。
```
+ gem 'rails-erd', github: 'paulwittmann/rails-erd', branch: 'mavericks'
```
# 参考
[rails-erd](https://github.com/voormedia/rails-erd)
[rails-erd issue#12](https://github.com/voormedia/rails-erd/issues/12)
[Qiita - Rails でモデルの情報を図にする方法 -Qiita](http://qiita.com/takecian/items/ab5e292a369f77c0e10c)
オフラインリアルタイムどう書くE15の問題の実装例です。


問題 : http://nabetani.sakura.ne.jp/hena/orde15nohil/
解答リンク集 : http://qiita.com/Nabetani/items/705fa83cfbf20377b92f
イベント : https://yhpg.doorkeeper.jp/events/61418

いつも通り ruby で。テストケースの大半は省略。

```ruby:ruby2.4
def to_xy( src )
  d=src.digits(3)
  d.zip([*0..d.size]).inject(0) do |acc,(n,ix)|
    acc+case n
    when 0; 0
    when 1; 1*2**ix
    when 2; 1i*2**ix
    end
  end
end

def to_num(pos)
  return nil if pos.real<0 || pos.imag<0
  x=pos.real.digits(2)
  y=pos.imag.digits(2)
  return [0,1,1i].index(pos) if 1==[x.size, y.size].max
  a=to_num( (pos.real/2).floor + (pos.imag/2).floor * 1i )
  b=to_num( x[0]+y[0]*1i )
  a && b && a*3+b
end

def neibours(src)
  pos = to_xy(src)
  [pos+1, pos-1, pos+1i, pos-1i ].map{ |x| to_num(x) }
end

def solve( src )
  neibours(src.to_i).compact.sort.join(",")
end

DATA.map{ |line|
  num, src, expected = line.split( /\s+/ )
  actual = solve( src )
  ok = actual==expected
  puts [ ok ? "ok" : "***NG***", src, actual, expected ].join(" ")
  ok
}.all?.tap{ |x| puts( x ? "okay!" : "something wrong" ) }
__END__
0 21  19,22,23 
1 0 1,2
2 1 0,3
51  1000000 999999,1000002 
```

順当な実装のつもり。

数値→座標→隣の座標→数値 という流れ。
数値を座標に変換する関数と、座標を数値に変換する関数を書く必要がある。

数値を座標に変換するのは、`to_xy`。二次元座標なので複素数で。
入力を 3進数に変換して、
* 1 があったら $2^{桁数}$ マス、右へ。
* 2 があったら $2^{桁数}$ マス、下へ。
という具合。

座標を数値に変換するのは、`to_num`。
入力を 3進数に変換して、一桁なら決め打ちで。
二桁以上なら、右端の一桁とそれ以外に分割。以下の二件の合計が求める値。
* 「右端の一桁」を `to_num`
* 「それ以外」を `to_num` して三倍
ただし、`to_num` が `nil` を返したら、`nil` にする。
という具合。

`Integer#digits` が便利。
でも、`Integer#digits` の逆もほしい。ないのが残念。
【herokuコマンド】コマンド集

[【herokuコマンド】アプリ名変更](http://qiita.com/chihiro/items/f5f4793fe99002286973)
[【herokuコマンド】createからdestroyまで](http://qiita.com/chihiro/items/5c3ff400f6cb99deb945)

上記記事でもherokuコマンドを紹介しましたが、今回は上記であまりふれていないコマンドについてもまとめようと思います。


#ログイン
```
$heroku login
```

#ログアウト
```
$heroku logout
```

#アプリのメンテナンスモード切り替え
```
# メンテナンスモードにする
$heroku maintenance:on 

# メンテナンスモードを解除
$heroku maintenance:off
```
メンテナンスモードのアプリにアクセスすると、ユーザーにはメンテナンス中のページが表示されます。


#アプリをブラウザで開く
```
$heroku open
```

#ログ表示
```
$heroku logs
```

#ログ表示(リアルタイム)
```
$heroku logs -t 

#もしくは以下

$heroku logs --tail
```
上記で、ストリーミング状態でログを表示することができます。

#アプリの情報を表示
```
$heroku apps:info
```

#アプリのステータス(プロセス)確認
```
$heroku ps
```

#ドメイン表示
```
$heroku domains
```

#Heroku上でコマンドを実行
```
$heroku run bash
```
上記のコマンドでbashを使用することができる。
`exit`コマンドで抜けることができる。

#Herokuアプリ一覧の表示
```
$heroku list
```

#heroku-cliのバージョンの確認
```
$heroku -v
```
GCPのアクセストークンを取得する


##環境
* ruby歴 初心者
* rails 5.0.2
* ruby 2.4.1p111

##これはなに？
GCPのアクセストークンを取得するAPIを実装しました。

最終的には、クライアントがこのアクセストークンを用いて
GCSにあるプライベートなファイルを操作するために使用します。

 
##発端
iOSでGCSにあるプライベートなファイルを操作する際に下記の問題点ありました。

* `aws-ios-sdk` などの`sdk`が見当たらない
* iOSで実装すると実装コストがかなり高くなる

そのためサーバーサイドでアクセストークンを発行し取得するAPIを
提供することになりました。

##準備
アクセストークンを発行するには下記のものを用意する必要がありますので
GCPから取得しておいてください。

* サービスアカウントID
* サービスアカウントの証明書（p12ファイル）
* 証明書のパスフレーズ

取得の流れはざっと下記のとおりです。

1. GCPでプロジェクト作成
2. サービスアカウント作成（ここでIDが手に入る）
3. p12ファイルを生成

詳しくは[こちら](https://www.magellanic-clouds.com/blocks/guide/create-gcp-service-account-key/)の記事をご参照ください。
※記事中ではjsonファイルを選択していますが、p12ファイルを選択してください。

サービスアカウントに持たせる権限は重要なので、どういった権限をもたせるかは
各自適した物を付与してください。
また実装時にも必要になるので覚えておいてください。

また、取得したp12ファイルのパスフレーズはデフォルトで`notasecret`になっています。
これではセキュリティがガバガバなので、自前で変更しましょう。
変更方法の詳細は[こちら](http://wiki.bsdserver.nl/doku.php/misc/ssl/sslchangepwonpkcs12cert)

パスフレーズの変更が終わったら、必要なものをそれぞれ所定の場所に置きます。 

* サービスアカウントID
→ リポジトリに残さないため環境変数へ追加

* サービスアカウントの証明書（p12ファイル）
→ プロジェクト内のフォルダに追加（credentialフォルダを作成しその配下に置いています。）

* 証明書のパスフレーズ
→ リポジトリに残さないため環境変数へ追加


##実装
準備ができたら実装に移ります。
まずは `gem` の導入です。
必要になるのは`google-api-client`です

```ruby:Gemfile

gem 'google-api-client'

```

実装の本体は下記のような感じです。

```ruby:storage.rb
require 'google/api_client/auth/key_utils'
require 'signet/oauth_2/client'

class Storage
  include ActiveModel::Model

  def initialize
    secret_key = Google::APIClient::KeyUtils.load_from_pkcs12(Rails.root.join('credential', 'keyfile.p12'), ENV.fetch('P12_PASSPHRASE'))
    @authorization = Signet::OAuth2::Client.new\
      token_credential_uri: 'https://accounts.google.com/o/oauth2/token',
      audience: 'https://accounts.google.com/o/oauth2/token',
      scope: 'https://www.googleapis.com/auth/devstorage.read_write',
      issuer: ENV.fetch('GOOGLE_SERVICE_ACOUNT_ID'),
      signing_key: secret_key
  end

  def fetch_access_token
    @authorization.fetch_access_token!
  end
end
```

準備したものをそれぞれ使用し、認証ロジックを通してアクセストークンを生成します。
1つ気をつけるのが権限の範囲である`scope`です。

```ruby:storage.rb
scope: 'https://www.googleapis.com/auth/devstorage.read_write'
```

このアクセストークンに持たせる権限になるのですが、サービスアカウントで付与した権限になります。
どの文字列になるかは、[こちら](https://developers.google.com/identity/protocols/googlescopes)を参照して適したものを記載してください。

以上で、実装は終わりです。
あとは、APIで返してあげるだけでOK

```ruby:console
Storage.new.fetch_access_token

=>
{
	"access_token":"XXXXXXXXXX",
	"expires_in":3600,
	"token_type":"Bearer"
}
```

##感想
今回は、p12ファイルでアクセストークンを取得しましたが
もし、jsonファイルでのアクセストークンの取得方法を知っておられる方は、ぜひとも教えていただきたいです:anguished:
パスフレーズを環境変数に逃しているとはいえ、p12ファイルをリポジトリに乗せるのは正直どうかと思いますので、、、、、
デプロイ時に rake task で含めるようにしろとか、それだと開発時めんどいだろとか
そういうのも含めてコメント頂けると幸いです:anguished:  

##参考リンク
* [GCP Service Accountを理解する](http://qiita.com/t-yotsu/items/5d3d36847fbc71b72b76)
* [パスワードとパスフレーズ(前編)](https://blog.rocaz.net/2005/02/184.html)
* [How to upload a json file with secret keys to Heroku](https://stackoverflow.com/questions/35144135/how-to-upload-a-json-file-with-secret-keys-to-heroku)
* [OAuth 2.0 Scopes for Google APIs](https://developers.google.com/identity/protocols/googlescopes)
* [Change Passphrase on pkcs12 certificate](http://wiki.bsdserver.nl/doku.php/misc/ssl/sslchangepwonpkcs12cert)
plistからデータを読み込む swift 3.0

### plistから配列を読みたい時
この場合は fruits.plist というフォルダを指定ていて、それぞれのデータを使って Fruitクラスを一個ずつ作っている。

```MakeData.swift

        if let path = Bundle.main.path(forResource: "fruits", ofType: "plist") {
            if let dictArray = NSArray(contentsOfFile: path) {
                for item in dictArray {
                    if let dict = item as? NSDictionary {
                        let name = dict["name"] as! String
                        let group = dict["group"] as! String
                        
                        let fruit = Fruit(name: name, group: group)
                        if !groups.contains(group){
                            groups.append(group)
                        }
                        fruits.append(fruit)
                    }
                }

```

```Fruit.swift
class Fruit {
    var name:String?
    var group:String?
    
    init(name: String, group: String) {
        self.name = name
        self.group = group
        
    }
}
```

fruits.plistの中身はこんな感じ。

![Screen Shot 2017-07-01 at 2.22.43 AM.png](https://qiita-image-store.s3.amazonaws.com/0/158705/7d9195ef-381a-9729-a360-7c86959c88dc.png)

@rshankrasさんのコードから参照
https://github.com/rshankras/FruitsDiet
かんたんに出来た！ fabric を使った 踏み台経由SSH の deployment作業 を circleCI を使って自動化

手作業でdeployするのがイヤになったのでいい加減、時代の波に乗りました。
状況としてはこんな感じです。

- ファイルをアップしたいサーバが**踏み台経由**
- **fabric** を使ってアップするコマンドを作る（今回これの詳細は説明しません）
- **circleCI** の deployment を使って自動化

# やったこと

- circleCIの設定
- fabricの設定
- ssh_config
- サーバ側の設定

ぐらいで出来ました。世界はカンタンになっているようです。

## circleCIの設定

- Project Setting > SSH Permissions に秘密鍵をアップする
    - この時 hostname は決まっていれば入力していいですが、空白だと全部に使ってくれる
- リポジトリの `circle.yml` をいじる

```yaml:circle.yml
machine:
  python:
    version: 2.7.12

dependencies:
  pre:
    - pip install -r ./requirements.txt
    - cat ~/repos_name/circleci_ssh_config >> ~/.ssh/config

deployment:
  staging:
    branch: master
    commands:
      - fab deploy_from_circleci
```

僕が書いたのはこんな感じ

次から `branch:` に設定したブランチにpushすると自動で fab コマンド動きます。
（当たり前ですが `requirements.txt` にFabricないとダメっす）

### 別のSSH_CONFIGを作成して、fabricから読む方法はダメだった

fabricではsshで使うSSH_CONFIGファイルを指定出来る機能があります

[（超メモ）fabric で ssh の config ファイルを指定する、利用する \- ようへいの日々精進XP](http://inokara.hateblo.jp/entry/2015/11/11/073101)

はじめはこれでやっていたのですが、元々の`~/.ssh/config`を読み込まないとidentifier系が原因でSSHがコケます。

苦肉の策で、独自SSH_CONFIGを`~/.ssh/config`に付け足して解決しました(´・ω・\`)
どなたか `env.ssh_config_path` で解決出来た方いらっしゃいましたら教えてくださいm(__)m


## fabricの設定

```python:deploy_from_circleci.py
from fabric.tasks import Task


class DeplyFromCircleCI(Task):
    """
    鯖に現在のlocal状態をupする
    """
    name = "up"

    def run(self):
        self.__set_env()
        self.__up_server()
        print blue(u"done")

    @classmethod
    def __set_env(cls):
        env.use_ssh_config = True
        env.user = "deployer"
        env.host_string = "deploy_server_hostname"

    @classmethod
    def __up_server(cls):
        project.rsync_project(
            "/path-to-remoteserver/",
            local_dir="./path-to-local/"
            exclude=[".DS_Store"], delete=True, default_opts="-cropgtvz --progress"
        )


deploy_from_circleci = DeplyFromCircleCI()
```

特別な事はしてないですね。rsyncしてるだけです。

## ssh_config の書き方

```:circleci_ssh_config
ForwardAgent yes

Host fumidai
    User circleci
    HostName 1.1.1.1
    Port 22

Host deploy_server_hostname
    HostName 2.2.2.2
    ProxyCommand ssh fumidai -W %h:%p
```

`ProxyCommand` で踏み台経由に設定してるだけです。IPは適当です。

## サーバ側の設定

### `fumidai` にあたるサーバ

`circleci` ユーザーを作って、circleCIに登録した鍵でSSHログイン出来るようにしておきます。 `authorized_keys` 登録すればよさそう。

### `deploy_server_hostname` にあたるサーバ

`deployer` ユーザーを作って、circleCIに登録した鍵でSSHログイン出来るようにしておきます。 `authorized_keys` 登録すればよさそう。

`ForwardAgent yes` してるのでいけそう

# これでいけるはず

超カンタンですね。
これからmasterにpushする度に自動でdeployしてくれます。
3回以上同じ事するぐらいなら自動化しましょう。（ってどこかのスゴイエンジニアの人がおっしゃってました）
AWS概要

AWSについてこれから学んでいくのでその勉強内容をまとめていく。

# 1.AWSとは
AWS(Amazon Web Service)とはオンラインショッピングで有名なAmazonが提供するパブリッククラウドサービス。
サービスの豊富さと提供スピードの速さが特徴。
## 1.1アマゾンが提供するサービス
AWSでは多くのサービスが提供されているが、そのサービスを分類ごとに大別し、代表的なものを紹介する。

* コンピューティング
* ストレージ&コンテンツ配信
* データベース
* ネットワーク
* 開発者用ツール
* 管理ツール
* セキュリティ＆アイデンティティで
* 分析
* IoT
* モバイル
* アプリケーションサービス
* エンタープライズアプリケーション

### 1.1.1 コンピューティング
AWSの中核となるサービス。
AWS超初心者の私でも聞いたことがあるEC2もここに分類される。
######・EC2(Amazon Elastic Compute Cloud)
従課金性(使った分だけお金を払う)の仮想サーバ。 
OSはLinuxやWindowsが用意されている。 
EC2を活用してDockerを運用したりDockerイメージの保存・共有を行うサービスも提供されている。
######・AWS Elastic Beanstalk 
Paasサービス。
これを利用すれば.NETやPHP、Python、Ruby、Node.jsで開発したアプリをAWSに自動でデプロイできる。
例えばJavaアプリの場合はEclipceで開発してEC2に配置するというところまでを自動でやってくれる。
######・AWS Lambda 
クライアントからリクエストが来た時だけ動くイベントドリブン型のサービス。 
EC2と違って常時起動しているわけではないので低コストで運用できる。
######・Auto Scaling
CPU使用率などの条件に応じてEC２を拡張するサービス
######・Elastic Load Balancing
負荷分散させるロードバランサのQWSバージョン。
###1.1.2 ストレージ&コンテンツ
######・Amazon S3
オンラインストレージサービス。
######・Amazon CloudFront
世界中にコンテンツを配信するためのネットワークサービス
######・Amazon EBS
EC2のデータを保持するストレージサービス。
EC2のHDやSSDのような役割。
EC2のインスタンスタイプがc4やM4だとストレージはこのEBSのみ。
EBSは確保した容量の分だけ料金がかかるので容量が大きいファイルを扱うときは注意が必要。

######・Amazon Elastic File System
EC2の共有ファイルストレージサービス。
使用容量の増減に伴って自動で拡張/縮小する。
######・Amazon Glacier
バックアップファイルなど、使用頻度は低いけど長期間保持しておきたいデータ向けの低価格ストレージサービス。
######・AWS Import/Export Snowball
大容量データ転送サービス。
ペタバイトレベルのものでも転送可能。
######・AWS Storage Gateway
オンプレとAWSを接続するGW
### 1.1.3 データベース
######・Amazon RDS
RDBMSを運用するサービス。
MySQLやOracle、SQLServer等が運用可能。
######・AWS Database Migration Service
データベース移行サービス
######・Amazon DynamoDB
noSQLの構築/運用サービス。
noSQLとはビッグデータなどで使用されるDBMS。
### 1.1.4 ネットワーク
######・Amazon VPC
AWS内にプライベートネットワークを構築するためのサービス。
######・AWS Direct Connect
オンプレのネットワークとAWSのネットワークをつなぐためのサービス。
######・Amazon Route 53
DNSシステムを構築するためのサービス。
### 1.1.5 開発者用ツール
######・AWS CodeCommit
Git等のバージョン管理ツールを運用するためのサービス。
######・AES CodeDeploy
開発したアプリを自動でデプロイするサービス
### 1.1.6 管理ツール
######・Amazon CloudWatch
サーバ・ネットワークの状態をグラフィカルに確認できたり設定した閾値を超えたときにアラートを出すことができるサービス。
######・AWS CloudFormation
テンプレートと呼ばれるファイルを作成することでAWSで構成するインフラ環境を自動で作成するサービス。
###セキュリティ&アイデンティティ
######IAM(AWS Identity and Access Management)
ユーザ認証などの認証機能を提供するサービス。
###分析
######Amazon EMR
ビッグデータの分散処理フレームワークであるApache Hadoopの実行基盤
######Amazon Machine Lerning
データを基に機械学習をするサービス。
AIなどの研究に使われる。
###IoT
######AWS IoT
AWSとデバイスとの接続、ネットワーク管理、セキュリティ、データベースとの接続を提供するサービス。
###モバイルサービス
######Amazon Cognito
アカウント管理・認証、データ同期などを行うサービス。
######AWS MobileSDK
OSに合わせた開発ツールを用意するサービス
######アプリケーションサービス
###Amazon SES
Emailの送受信サーバ
######・Amazon Cloud Search
クラウド内のデータ検索を行うサービス。
###エンタープライズアプリケーション
######・Amazon WorkSpaces
デスクトップPCをクラウド上で実行するサービス。


---

ざっとまとめただけでもこの量。。。
全部のサービスの内容を理解するのは無理かもしれないけど
何かやろうとしたときにそういえばAWSにこんなサービスがあったような…
と思い出して選択肢の一つに入れれるようになりたい。
GradleでMybatisGenerator実行した際にMybatisのカスタムプラグインを適用する

GradleでMybatisGeneratorを実行する際に自前で用意したMybatisのカスタムプラグインを使おうとしたとき、かなりハマったので同じ問題で悩んでる方の参考になれば

# 前提
- Gradle
- マルチプロジェクト(シングルプロジェクトはまだ解決方法わかりません。。。)

# 前置き
MybatisGeneratorでカスタムプラグインを適用する前にGradleでMybatisGeneratorどうやってやんの？？？って方は先にこちらをどうぞ -> [GradleからMybatisGenerator実行する](http://qiita.com/yooooooooshiki/items/a5cab6e0481beff127f0)

## gradle + mybatisGeneratorでカスタムプラグインを指定して実行した結果

```
/* スタックトレース省略 */

:project-core:mybatisGenerator FAILED

FAILURE: Build failed with an exception.

* Where:
Build file '/Users/username/Git/project/build.gradle' line: 259

* What went wrong:
Execution failed for task ':project-core:mybatisGenerator'.
> Cannot instantiate object of type project.core.plugin.mybatis.CustomPlugin

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

BUILD FAILED

Total time: 2.747 secs
Cannot instantiate object of type project.core.plugin.mybatis.CustomPlugin
17:01:38: External task execution finished 'mybatisGenerator'.
```
エラー内容が
> Cannot instantiate object of type project.core.plugin.mybatis.CustomPlugin

と、出たのでスタックトレースを見てみると根本的は原因は`java.lang.ClassNotFoundException:project.core.plugin.mybatis.CustomPlugin`でした。
プラグインはあるはずなのにClassNotFoundExceptionがでてるので調べた結果どうやらPluginはjarである必要がある？みたいです。
# カスタムプラグイン適用方
## 1. プラグイン専用のプロジェクトを作成する
- なんでもいいのでプラグイン置き場のプロジェクトを作成しましょう。今回は`project-plugin`というプロジェクトにしておきます。
- 適用したプラグインを全てこのプロジェクトに移動します。

## 2. Mybatis Generator Config のXMLファイル修正
- `Plugin`タグの`type`属性に指定するパッケージを移動したプラグインのパッケージに修正します。

## 3. gradle.buildの設定
```groovy:build.gradle
project(':project-core') {
    /* 中略 */

    configurations {
        mybatisGenerator
    }

    dependencies {
        mybatisGenerator group: 'org.mybatis.generator', name: 'mybatis-generator-core', version: mybatisGeneratorVersion
        mybatisGenerator group: 'mysql', name: 'mysql-connector-java', version: mysqlConnectorJavaVersion
        mybatisGenerator group: 'tk.mybatis', name: 'mapper', version: mybatisMapperVersion
        // 先ほど作成したカスタムプラグインのあるプロジェクトを mybatisGenerator タスクの依存関係として追加する
        mybatisGenerator project(':project-plugin')
    }

    /* mybatisGenerator のタスク処理省略 */
}

// カスタムプラグインのあるプロジェクト
project(':project-plugin') {
	dependencies {
		compile group: 'org.mybatis.generator', name: 'mybatis-generator-maven-plugin', version: mybatisGeneratorVersion
	}
}
```
# 最後に
これで`mybatisGenerator`タスクが実行されたときに`project-plugin`が依存関係で追加されているので、カスタムプラグインが適用されているはずです！
「俺シングルプロジェクトでカスタムプラグインを適用する方法知ってる！！！」って人がいたら是非教えてくださいーーー
Go言語で同じディレクトリ内の関数呼び出すのにエラーがでる（#command-line-arguments ./main.go: undefined: funcName）

タイトルで説明しきれなかったので追加説明すると
main.goと同じディレクトリ階層においてある関数の呼び出しが

```
go run main.go
```
では呼べないのである

例えば、GoでAPIを作るときにmain.goにroute書くのは気持ち悪いのでroutes.goに切り出しておきたい
###↓みたいなディレクトリ構造があったとする。

```
//ディレクトリ構造
appName/
  │
  ├ main.go
  └ routes.go
```


### コードには↓みたいに書く

```main.go
//省略

func main() {
   RegistersRoutes() //ちなみに関数名の最初の文字は大文字じゃないと呼べない
}
```

```routes.go
//省略

func RegistersRoutes(){
 fmt.Println("ここでGetとか書いていきたい")
}
```

これで

```
go run main.go
```
とかやると

```
#command-line-arguments ./main.go: undefined: RegistersRoutes） //とか言われる
```
#解決策

```
go build        # ファイル名を指定しない
# or 
go run main.go routes.go   # 両方共ファイル名を書く 
```

ここでずっと躓いて、`routes/routes.rb`とかやってた。
Rails 5.1のform_withでViewにvalidationエラー表示

Rails5.1でform_tagとform_forがform_withに統合されました。
form_withを使ってformを書いたところちょっとした落とし穴があったので共有します。
#問題 : validationエラーがviewに表示されない

例えばこんな感じでviewとcontrollerを書いてると、
validationエラーでsaveできなかった時に:newのviewにエラーが表示されません。

```erb:new.html.erb
...前略...

<%= form_with model: @user do |f| %>

  <!-- createに失敗するとエラー表示 -->
  <% if @user.errors.any? %>
    <div class="alert alert-danger">
      <ul>
      <% @user.errors.full_messages.each do |msg| %>
        <li><%= msg %></li>
      <% end %>
      </ul>
    </div>
  <% end %>

　　　　...中略...

<% end %>
```
```ruby:users_controller.rb
class EventsController < ApplicationController

  # ...中略...

  def create
    @user = User.new(user_params)
    if @event.save
      redirect_to @event, notice: '作成しました'
    else
      render :new
    end
  end

  # ...中略...
end
```
#原因 : form_withはデフォルトでremote: trueになっている
form操作をAjaxで行い時に、form_tag / form_forだとオプションにremote: trueを指定するだけで対応してくれましたが、
form_withでは何も指定しない場合デフォルトでremote: trueになるようです。
[（参考）Ruby on Rails 5.1.2　Module　ActionView::Helpers::FormHelper#form_with](http://api.rubyonrails.org/v5.1/classes/ActionView/Helpers/FormHelper.html#method-i-form_with)
#解決策 : form_withのオプションでlocal: trueを指定
form操作をAjaxで処理したいわけでもないなら、
form_withのオプションでlocal: trueを指定することでエラーメッセージをviewに表示できます。

```erb:new.html.erb
...前略...

<%= form_with model: @user, local: true do |f| %>

  <!-- createに失敗するとエラー表示 -->
  <% if @user.errors.any? %>
    <div class="alert alert-danger">
      <ul>
      <% @user.errors.full_messages.each do |msg| %>
        <li><%= msg %></li>
      <% end %>
      </ul>
    </div>
  <% end %>

　　　　...中略...

<% end %>
```
flowの型情報をnpmパッケージで一緒に配布する

## TL;DR;

- flow 0.19.0 から .js.flow 拡張子がついたファイルがあればそれを見るようになった
- npm パッケージでは型情報を消した .js ファイルと、型情報を持った .js.flow ファイルを一緒に配布する
    - 将来的に flow に特大の後方非互換な変更が入らない限り動くはず

## npmパッケージも型情報を使いたい
開発時に型情報を書いても、いざ配布するときにはそれを取り外してから配布する。取り外さないと、 flow を使っていないプロジェクトで `require` することが困難になってしまうためだ。

しかし、そのパッケージを使うときには flow を使いたい。[flowtype/flow-typed](https://github.com/flowtype/flow-typed) に自分のライブラリの情報を載せるのが一つの手だが、開発段階で実装が流動的だと更新が面倒なのに加えて、そもそも DRY ではない。

せっかく開発時に書いた型情報を、 npm パッケージとして require したときに使うことはできないのだろうか。

## Declaration files
なぜか flow.org の標準ドキュメントで言及されていないのだが、 0.19.0 で追加された declaration files という機能を使うと簡単に実現できる。

Declaration files とは、簡単な話が `foo.js` と `foo.js.flow` というファイルがあり、 `import Foo from './foo'` を実行したら flow は `foo.js.flow` を見に行く、というものだ。

つまり型情報を取り除いた .js ファイルとは別に、型情報が残ったままのファイルを .js.flow という名前でパッケージに入れればいい。

npm パッケージに書き込まれているということは、パッケージを使っているプロジェクトで利用している flow のバージョンによってはエラーが発生する可能性があるということだ。特に将来的に flow 本体に後方非互換な変更が入った場合、それによってパッケージを使っている側の型チェックが通らなくなってしまう。この場合は .flowconfig でそのパッケージを ignore するように設定してしのぐことになると思われる。

## 例: yuku-t/textcomplete
- :octocat: [yuku-t/textcomplete](https://github.com/yuku-t/textcomplete)

textcomplete は src ディレクトリの下に `@flow` プラグマが指定された .js ファイルが入っている。これを `npm run build:lib` でビルドすると lib ディレクトリの下に babel でトランスパイルされた .js ファイルと[^1]、 src ディレクトリにもともとあったそのままの .js.flow ファイルが生成される。

[^1]: babel は babel-preset-flow を使うように設定されている。

```json:package.json（抜粋）
{
  "script": {
    "build:lib": "babel src -d lib -s && for js in src/*.js; do cp $js lib/${js##*/}.flow; done"
  }
}
```

この結果 textcomplete を `require` すると flow は型情報にアクセスすることができるようになっている。

## 参考
- [Version 0.19.0](https://flow.org/blog/2015/12/01/Version-0.19.0/) - 0.19.0 のリリースブログ。 Declaration files について説明がある。
Listに含まれる単語の数をカウントするプログラム

自分のプログに載せた「Javaの単語をカウントをするプログラム」になぜか、毎日コンスタントにアクセスされている。
で、そのブログに載せたコードを転記してみた
10年以上前に書いたものだが、今、見ると、Listに総称型を使っていないとか、色々、未熟な部分があって恥ずかしいですね。

```Before.java
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

public class WordCounterTable {
    private Map counterTable;
    
    public WordCounterTable(){
        this.counterTable = new HashMap();    
    }

    public void count(List list){
        for(Iterator ite = list.iterator();ite.hasNext();){
            Object target = ite.next();
            if(this.counterTable.get(target) == null){
                this.counterTable.put(target,new Integer(1));    
            }else{
                this.counterTable.put(target,
                new Integer(
                ((Integer)this.counterTable.get(target)).intValue()+1)
                );
            }
        }
    }
    
    public String printTableValue(){
        StringBuffer buf = new StringBuffer();
        for(Iterator ite = this.counterTable.keySet().iterator();ite.hasNext();){
            Object key = ite.next();
            buf.append("word:"+key+" count:"+this.counterTable.get(key)+"\n");
        }
        return buf.toString();
    }
}
```

で、いつまでもこんな恥ずかしいプログラムをいつまでもブログに載せておくわけにもいかないので、Java8のStream関数を使って、書き換えてみました

```WordCount.java
package test;

import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.function.Function;

public class WordCount {

	public static void main(String args[]){
		List<String> list = Arrays.asList("triple","evergreen","puisan","triple","puisan");
		Map<String,Integer> map = list.stream().collect(
				Collectors.groupingBy(
						//MapのキーにはListの要素をそのままセットする
						Function.identity(),
						//Mapの値にはListの要素を1に置き換えて、それをカウントするようにする
						Collectors.summingInt(s->1)) 
				);
		System.out.println(map);
	}
}
//{triple=2, puisan=2, evergreen=1}がコンソールに出力される
```

Stream関数、便利ですね。
以前のもっさりしたプログラムに比べて、ロジックがすっきりかけていて見た目も美しくなっています
Metatrader4向けの発注用EAのソースを公開してみた

Metatrader4向けの発注用EAのソースをGithub上に公開しました。
このEAは、Metatrader画面上にGUIを表示するため、mt4gui2というOSSを利用しています。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/189952/ba9572a0-70ef-18d8-88ed-427e7fb55bbd.png)

* ダウンロード先
<https://github.com/bushidofx/hattyuusamuraizero>
gRPCのサーバー&クライアントをdockerとgoで動かしてみる

dockerを使って環境構築の手間を省いてすぐにgolangでgRPCを動かせるものを作った。 

サーバーサイド、クライアントサイドのどちらかだけを作成しても、gRPCの仕様上 `curl` を叩いて動作の確認ができず、デバッグのやりにくさがある。

なので今回は1レポジトリにサーバーサイド、クライアントサイド両方のコードを収め、簡単にサーバーサイドとクライアントサイドの動きがわかるようにした。

## 動機

LTで何かgolangネタをやろうと思い立ったのと、gRPCをとりあえず使ってみたかった。

gRPCは初めて触ってみたが, そもそも動かす段階に持っていくまでに苦労しそう？な気がしたので、dockerを立ち上げて `server.go` と `client.go` を起動すればdockerコンテナ内のローカルネットワークを使用してサーバーサイドとクライアントサイドの両方を動かせるようにした。

まだgRPC自体を触って半日だが、jsonのAPIアプリケーションを作るよりも便利そうな気がしている。

## ソースコード
ここに置いてあります
https://github.com/yoshi42662/go-grpc

とりあえず最低限動く形にして書いてあるだけなので、使いやすさや可読性、ソースコードの品質はこれから上げていきたい。

## 使い方
### Quick Start

- Get repository
`$ git clone git@github.com:yoshi42662/go-grpc.git`


- Build compose containers
`$ docker-compose build`

- Get into server container and run server.go
`$ docker-compose run server bash`
`(server-container) $ go run server/server.go`

- Get into server container from different console and run client.go

- List all running containers
`$ docker ps`
>CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
a69220a48eda        gogrpc_server       "bash"              20 minutes ago      Up 20 minutes       8080/tcp            gogrpc_server_run_1

- Get into same gogrpc_server container with container ID.
`$ docker exec -it a69220a48eda bash`
- Run client.go inside container
`(server-container) $ go run client/client.go`


### protocコマンドを使う
`.proto` ファイルから `.go` ファイルを生成するときに使用。

- dockerコンテナの中に入って実行。

`$ docker-compose run server bash`

`(server-container) $ protoc --go_out=plugins=grpc:. pb/*.proto`

### 所感
つまるところgRPCはネットワークでやりとりされるデータがJSONからバイナリになって、ルーティングやエンコーディング、デコーディングもgRPC側で勝手にやってくれるものっぽい。

実際触ってみるとドキュメント読む前でもなんとなく分かった。

gRPCはよい。便利。
pyenvを使わないシンプルなPython仮想環境の構築

# 追記（2018/12/05）
この記事を書いて1年以上経過しました。
最近は[Pipenv](https://pipenv-ja.readthedocs.io/ja/translate-ja/)を使うのが最も簡単な環境構築の方法となってきています。
これからPythonを始められる方には「pipenv + pyenv」でPythonのバージョンを指定しつつ、ディレクトリで仮想環境が分かれてくれる開発基盤を整えるのをおすすめします。

# まえがき
Pythonの環境構築っていろんな方法あって、初めて環境構築するとなるとわけがわからないですよね。
かといってデフォルトのpythonは2.7だし、そこにpipでいろんなパッケージ入れるとごちゃごちゃするし、何かしら環境分けれるものが欲しいですよね。

という中、半年くらいPython触って、環境構築しては壊しを繰り返すうちに「一番シンプルでは？」という方法に行き着いたのでメモ。

ただし、pyenvを使わないので、バージョン管理はできません。標準インストールされているpython2.7か、これからインストールするpython3.6のみを選択するようになります。
半年ほど使ってみて、python3.6非対応のパッケージ等には出会ったことがないので、特殊な用途に使う以外には問題ないと思っています。

# 環境
## 実行環境
- OS X Serria 10.12.5
- Homebrew 1.2.3

MacでHomebrew入ってたらなんとかなります。

## これから入れるもの
- python3.6
- pip
- virtualenv

pipはPythonのパッケージ管理システムで、パッケージのインストールなどができます。
virtualenvはPythonの独立した環境を作成できるパッケージで、pipでインストールできます。

# 手順
## Python3.6.1のインストール
```bash
$ brew install python3
```

でpython3.6.1が入ります。(2017/06/30時点)

```bash
$ python -V
Python 2.7.13
$ python3 -V
Python 3.6.1
$ python3.6 -V
Python 3.6.1
```

こんな感じになりました。

## pipのインストール

```bash
$ brew install pip
```

で入ります。

```bash
$ pip -V
pip 9.0.1 from /usr/local/lib/python2.7/site-packages (python 2.7)
```

##  virtualenvのインストール

```bash
$ pip install virtualenv
...

$ virtualenv --version
15.1.0
```

インストール自体はここまで。
ここから仮想環境の構築に入ります。

## 仮想環境の構築

仮想環境を作ると、ディレクトリがひとつ生成されるので、あらかじめ仮想環境を作りたいディレクトリに移動します。

```bash
$ mkdir sandbox
$ cd sandbox
```

`$ virtualenv 環境名 -p Pythonのインタプリタ`
で、Pythonのバージョンを指定して仮想環境が構築できます。

```bash
$ virtualenv testenv -p python3
...

$ ls
testenv
```

指定した名前(testenv)のディレクトリが生成されました。

仮想環境に入るには、
`$ source 環境名/bin/activate`
と打ち込みます。

```bash
$ source testenv/bin/activate #仮想環境に入る
(testenv) $ pip freeze #なにもパッケージがインストールされていない
(testenv) $ python -V #Pythonのバージョンが3.6.1に
Python 3.6.1
(testenv) $ deactivate #仮想環境を抜ける
$ 
```
`(環境名) $ `
と表示されたらうまく仮想環境に入っています。
試しに`$ pip freeze`するとvirtualenvが入っていないことがわかります。
`$ python -V`でpython3.6.1の環境となっていることがわかります。

# まとめ
Pythonでpyenvを使わずに、シンプルに仮想環境の構築ができました。
thisのみえぬぼくたち 〜コールバック関数内のthis〜

タイトルは某RPGの最終章をお借りしました。

[こちらの記事](http://qiita.com/takeharu/items/9935ce476a17d6258e27)が物凄〜くまとまっていて、正直これ読めばほぼ網羅しています。今回はタイトル通り、コールバック関数内における`this`が指すものが何か、を備忘録としてまとめます。

## 本題の前にアロー関数

[MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/arrow_functions#Lexical_this)では以下のように書かれています。

> アロー関数が登場するまでは、関数ごとに自身の this の値を定義していました(コンストラクタでは新しいオブジェクト、strict モード の関数呼び出しでは undefined、"オブジェクトのメソッド" として呼び出された関数ではそのときのオブジェクト、など)。これは、オブジェクト指向プログラミングをする上で煩わしいということが分かりました。

これがアロー関数ですと、`this`を束縛しなくなりました。

```js

const my_obj = {

   show: function() {
      console.log(this)   //=> Object {...}
   },

   show_arrow: () => {
      console.log(this)   //=> Window {...}
   }
}
```

はい。こっから本題です。

# 「タイマー」のコールバック関数
`setTimeout, setInterval`のことです。タイマーは`window`オブジェクトに定義されているので、thisは`window`オブジェクトを指しますが、前述通りアロー関数はthisを束縛しないため、以下の例では`Inc`オブジェクトを指します。

```js

function Inc() {
   this.num = 123

   setTimeout(function() {
      console.info(this)   //=> Window {...}
   })

   setTimeout(() => {
      console.info(this)   //=> Inc {...}
   })
}
const my_obj = new Inc()
```

# 「イベントハンドラ」のコールバック関数
今回は分かりやすく`click`イベントにします。`hoge`というテキストをクリックするとconsoleに結果が出力されます。従来のfunctionでは`divタグ`ですが、アロー関数では`Window`オブジェクトになります。

```html
<body>
  <div id="title">hoge</div>
</body>
```

```js
const ttl = document.getElementById('title')


ttl.addEventListener('click', function() {
   console.info(this)
})
//=> <div id="title">hoge</div>


ttl.addEventListener('click', () => {
   console.info(this)
})
//=> Window {...}
```

※ちなみに、上記の結果は`jQuery`のコールバックでも同様の結果になります。

# 「forEach」のコールバック関数
以下のように、第二引数に何も指定しなければ、両方共`Window`オブジェクトでした。

```js

[1].forEach(function() {
   console.info(this)
})
//=> Window{...}


[1].forEach(() => {
   console.info(this)
})
//=> Window{...}
```

しかし、forEachの第二引数にオブジェクトを指定すると、従来の`function`ではthisが指定したオブジェクトになりますが、アロー関数では`Window`オブジェクトになりました。

```js

const obj = {}

[1].forEach(function() {
   console.info(this)
}, obj)
//=> Object {}


[1].forEach(() => {
   console.info(this)
}, obj)
//=> Window{...}
```

__※ また何か見つけたら随時更新予定__

## 最後に
まだまだ`JavaScript`については初心者ですので、`マサカリ`は大歓迎です！（`マサカリ`は本来悪い意味ではない、という論もありますが、そこは目をつむっていただけると幸いですw）



## 参考
- [JavaScriptの「this」は「4種類」？？](http://qiita.com/takeharu/items/9935ce476a17d6258e27)
- [即時関数をcall(this)で呼ぶことについて](http://qiita.com/osakanafish/items/7c0240f195f36e66b101)
- [アロー関数](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/arrow_functions)
Angular Material を入れた時のメモ

[Angular Material](https://material.angular.io/) のサイトを参照して入れた時のメモ

##Step 1: Install Angular Material
`npm install --save @angular/material`

##Step 2: Animations
`npm install --save @angular/animations`

##Step 3: Include a theme
Available pre-built themes:

テーマの種類（４種類）
-deeppurple-amber.css
-indigo-pink.css
-pink-bluegrey.css
-purple-green.css

your styles.css file:
`@import '~@angular/material/prebuilt-themes/deeppurple-amber.css';`
タイプによって変える。
※index.htmlに入れるタイプの紹介もされているがエラーが解消せず。

##Step 5: Gesture Support
`npm install --save hammerjs`

your app's root module.
`import 'hammerjs';`

##Step 6  Add Material Icons
your index.html.
`<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">`



あとは[Component Library](https://material.angular.io/components)
を参照してパーツごとに入れる
モジュールあたりも追加するのでチェックを忘れずに。
webstorm使うと@NgModuleでMaterialModuleでＩｍｐｏｒｔｓすると取り消し線がつくが入れないとうまく動かないので注意してください。

Step5と６は使うパーツによって入れたりだが、まあまあ使う印象だから入れておいて良いかも（６は必須で良いかも）。

以上
Apache2.2でのssl.confのサンプル

# 概要
ある程度古いブラウザとの互換性を保ちながら、[QUALYS SSL LABS SSL Server Test](https://www.ssllabs.com/ssltest/analyze.html)で A+ 評価になる設定。
CentOS 6をターゲットにしていて、CentOS 5だとOpenSSLのバージョンの問題により動作しない。またCentOS 7だとhttpd 2.4系では設定の書き方が一部異なるためこちらも動作しない。

# 設定

```:/etc/httpd/conf.d/ssl.conf
LoadModule ssl_module modules/mod_ssl.so
Listen 443

AddType application/x-x509-ca-cert .crt
AddType application/x-pkcs7-crl    .crl

SSLProtocol All -SSLv2 -SSLv3
SSLHonorCipherOrder On
SSLCipherSuite ALL:!EXP:!SSLv2:!RC4:!MD5:+3DES:!ADH:!aNULL:!eNULL:!PSK:!SRP:!DSS:!KRBS:!LOW:+HIGH:+MEDIUM:EDH+HIGH

Header add Strict-Transport-Security "max-age=15552000"

SSLPassPhraseDialog  builtin

SSLSessionCache         shmcb:/var/cache/mod_ssl/scache(512000)
SSLSessionCacheTimeout  300

SSLMutex default

SSLRandomSeed startup file:/dev/urandom  256
SSLRandomSeed connect builtin

SSLCryptoDevice builtin

NameVirtualHost *:443

<VirtualHost *:443>
  ServerName hoge.domain
  DocumentRoot /var/www/html/
  TransferLog logs/ssl_access_log
  ErrorLog logs/ssl_error_log
  LogLevel warn

  SSLEngine on
  SSLCertificateFile /path/to/certs/server.crt
  SSLCertificateKeyFile /path/to/certs/server.key
  SSLCertificateChainFile /path/to/certs/server-chain.crt
</VirtualHost>
```
オフラインリアルタイムどう書くE15の問題


オフラインでリアルタイムに「どう書く」をやるイベント( https://yhpg.doorkeeper.jp/events/61418 )を行っています。

問題は「ギャスケット」という名前で、詳細は
http://nabetani.sakura.ne.jp/hena/orde15nohil/
です。

出題者の気分としては、問題を読み始めてから解けるまで1時間あればなんとかなると思ってますが、ひとそれぞれで。

実装ができた方はこちらのコメント欄からリンクを張っていただくと見つけやすくて助かります。

似たような問題をもっと解きたいという方は、https://nabetani.hatenadiary.com/entry/yhpg_list
に過去問リンク集がありますので、そちらをご覧になると良いと思います。
Rで一時ファイルの利用

ちょいちょい忘れては調べることになるのでメモ。

一時ファイル
------------

一時ファイルとは一時的なデータを保持しておくファイルで、通常さくっと作られて用が済めば削除されるものです。Rでも自分で準備して利用することが可能で、ちょっとデータなどを預けておいたりするのに重宝します。今回はこれの基本的なところを確認。

tempfile関数とtempdir関数
-------------------------

Rの場合、作成した一時ファイルは一時ディレクトリに置かれます。そして**この一時ディレクトリはそのRsessinoで準備されています**。その一時ディレクトリへのパスを取得する関数が`tempdir()`です:

``` r
tempdir()
#>  [1] "/tmp/RtmpLapPwK"
```

ルートからのパスはOSや環境に依存しますが、一時ディレクトリ名は`Rtmp*`という名前になるようです。

では今度は一時ファイルを作成してみたいと思います。一時ファイルを作成する関数は`tempfile()`関数です:

``` r
tempfile()
#>  [1] "/tmp/RtmpLapPwK/file9403432469"
```

上の`tempdir()`で出てきたディレクトリに`file*`というファイルが作成されて、そのファイルへのパスが返ってきます。通常はこのようにするのではなく、返り値をオブジェクトに預けます:

``` r
tmpf <- tempfile()
tmpf
#>  [1] "/tmp/RtmpLapPwK/file940709780f0"
class(tmpf)
#>  [1] "character"
```

このように預けておくと、このパスを利用してファイル操作ができるようになります:

``` r
kosaki <- c("kosaki", "yappari", "saikou!")
writeLines(kosaki, tmpf)
readLines(tmpf)
#>  [1] "kosaki"  "yappari" "saikou!"
```

Usage
-----

`tempdir()`関数には引数はありません。単に一時ディレクトリのパスを返すのみです。`tempfile()`のUsageは以下のとおりです:

    tempfile(pattern = "file", tmpdir = tempdir(), fileext = "")

-   pattern
    -   空ではない文字列ベクトルを指定
    -   一時ファイル名の最初の部分がこれになります
    -   初期値は"file"なので、上述のように`file*`という名に
-   tmpdir
    -   空ではない文字列ベクトルを指定
    -   一時ファイルを設置するディレクトリ名を指定
    -   初期値は`tempdir()`であり、上述した一時ディレクトリに格納される
-   fileexit
    -   空ではない文字列ベクトルを指定
    -   一時ファイルの拡張子を設定
    -   初期値は空の文字列で、つまりは拡張子なしのファイル

ということで、内容はシンプルです。ポイントは以下のようなところ:

-   文字列ベクトルを受け付ける、すなわち一度にたくさん作れる
-   一時ファイル名でも`pattern`である程度は付与できる
-   `.csv`や`.txt`、あるいは`.html`や`.md`などいろいろできる

いろいろ試してみる
------------------

てことで遊んでみます。まずは複数作成。

``` r
tempfs <- tempfile(paste("kosaki", 1:3, sep = "_"))
tempfs
#>  [1] "/tmp/RtmpLapPwK/kosaki_194012d6e993"
#>  [2] "/tmp/RtmpLapPwK/kosaki_2940a2bce14" 
#>  [3] "/tmp/RtmpLapPwK/kosaki_394076b5137c"
```

文字列ベクトルで与えると、それに合わせて準備してくれました。

次はいろんな拡張子を与えてみます:

``` r
tempfs <- tempfile("kosaki", fileext = c("", ".txt", ".csv", ".html"))
tempfs
#>  [1] "/tmp/RtmpLapPwK/kosaki9407c1cc7d4"     
#>  [2] "/tmp/RtmpLapPwK/kosaki9401f98b725.txt" 
#>  [3] "/tmp/RtmpLapPwK/kosaki9403cda92a8.csv" 
#>  [4] "/tmp/RtmpLapPwK/kosaki940179b1fe6.html"
```

こんな感じですね。実用性はほぼ無いですがテストしました。

では、ちょっと長いですが応用です:

``` r
# 前準備: 独自でRコードをマークアップした文字列を準備
hoge <- paste(
  "最初",
  "
",
  "paste('kosaki', 'No.1')",
  "<e>",
  "終わり",
  "",
  sep = "\n"
)

# 手順1: ターゲットを一時ファイルへ格納
tmp <- tempfile(fileext = c(".txt", ".R"))
write(hoge, tmp[1])

# 手順2: 一時ファイルから文字列ベクトルとして読みだす
xx <- readLines(tmp[1])

# 手順3: 読みだした文字列ベクトルからRコードの位置を特定して一時ファイル(.R)へ
chunk_start <- grep("
", xx)
chunk_end <- grep("<e>", xx)
r_chunk <- xx[chunk_start:chunk_end]
r_code <- r_chunk[!grepl("
|<e>", r_chunk)]
write(r_code, file = tmp[2])

# 手順4: 一時ファイルのコードを評価
out <- eval(parse(tmp[2]))

# 手順5: 出力を元のテキストに埋め込む

finish <- c(
  xx[1:chunk_end],
  "<out_s>",
  print(out),
  "<out_e>",
  xx[(chunk_end + 1):length(xx)]
)

# 手順6: ファイルとして出力
write(paste(finish, collapse = "\n"), file = "output.txt")
file.copy(paste(tmp[2], collapse = "\n"), "r_code.R")
```

伝わる人には伝わると思いますが、これはknitをイメージした処理です。実際の処理はもっと細やかにやるものなのですが、あくまで一時ファイルを使った例なのでざっくりやりました。

この一時ファイルはいろんなところで使われていて、パッケージの関数内処理で作成しているとかよく見かけます。ぜひ活用してみてください。

**Enjoy!**
Netlify で ビルドに PHP と Composer を使う

静的サイトのデプロイに便利な [Netlify](https://www.netlify.com/), ビルド時には PHP も使えたのでメモ。

単純にビルドのプログラムを PHP で書いて (ここでは build.php とします)、Netlify の Build command の設定のところに

```
php build.php
```

とかするだけでOK。

~~Composer を使いたければ、自前でインストールして `composer install` まで実行する必要があるっぽい。composer.json 置いとくだけでは勝手にはやってくれないっぽい。~~

~~なので composer 使う場合の Build Command の設定は~~

```
curl -sS https://getcomposer.org/installer | php; php composer.phar install; php build.php
```

~~こんな感じでしょうか。~~

### 追記

現在は composer.json を gitに含めておけば、composer install まで自動でやってくれるようです。やったぜ。(2018.8確認)

---

ちなみに Netlify内にある PHP のバージョンは 5.6.33 でした。(2018/03/15 時点)

```
PHP 5.6.33-3+ubuntu14.04.1+deb.sury.org+1 (cli)
```

最新ライブラリが使えない場合もあるかと思うので要注意(たとえば twig の 2系は PHP7以上が必要なので、1系にする必要があります)。

---

#### 追記

公式blog漁ってたら、php7.2 も使えるとのことです、実際使えそう。環境変数 `PHP_VERSION` に `7.2` を設定すればよいみたい (2018.7.17時点)

https://www.netlify.com/blog/2016/10/18/how-our-build-bots-build-sites/

```
$ php7.2 --version
PHP 7.2.5-1+ubuntu14.04.1+deb.sury.org+1 (cli) (built: May  5 2018 06:17:01) ( NTS )
```
TensorFlowのiOSサンプルの実行手順（2017年7月現在）


**【注意】本記事のサンプルは公開終了になっていました。（TensorFlow Liteに移行したようです。）**

TensorFlowのiOSサンプルの実行手順について、すでにいろいろ情報は出ていますが、最新版では少し異なる箇所があったので、覚書としてまとめておきました。

#はじめに

以下の環境で作業を行いました。
macOS 10.12.5
Xcode 8.3.3
TensorFlow Release 1.2.1　（2017/7/1 現在）

実は、今回行う手順は、以下のREADME.mdにまとまっています。
~~https://github.com/tensorflow/tensorflow/tree/master/tensorflow/contrib/makefile~~
ただし、古い記述もありました。
（「tensorflow/contrib/ios_examples」から「tensorflow/examples/ios」に移動になったようです）
https://github.com/tensorflow/tensorflow/tree/master/tensorflow/examples/ios

できるだけ要点だけをまとめたかったので、ディレクトリ移動「cd」の記述は含めませんでした。

#準備

automake, libtoolが必要になりますので、インストールしておきます。

```bash
brew install automake
```
```bash
brew install libtool
```

#ダウンロード

TensorFlowライブラリ（tensorflow-master.zip）をダウンロードします。
https://github.com/tensorflow/tensorflow

画像認識用の学習済みモデル（inception5h.zip）をダウンロードします。
https://storage.googleapis.com/download.tensorflow.org/models/inception5h.zip

#ビルド

##TensorFlowライブラリのビルド

```
tensorflow/contrib/makefile
```
に移動して、以下を実行します。

```bash
./build_all_ios.sh
```

README.mdに「This process will take around twenty minutes on a modern MacBook Pro.」とありますが、私の環境（Retina, 13-inch, Early 2015）では1時間以上かかったと思います。ご注意ください。

##iOSのサンプルプロジェクトのビルド

###学習済みモデルのコピー

**iOSのサンプルプロジェクトですが、以下に移動しています。（README.mdでの説明とは異なります）**

```
tensorflow/examples/ios
```

今回は「camera」のサンプルプロジェクトで説明します。

ダウンロードした画像認識用の学習済みモデル（inception5h.zip）を解凍して、

```
tensorflow/examples/ios/camera/data
```

に以下のファイルをコピーします。

```
imagenet_comp_graph_label_strings.txt
tensorflow_inception_graph.pb
```

###CocoaPodsのインストール

サンプルプロジェクトはCocoaPodsをインストールする必要があります。

```
tensorflow/examples/ios/camera
```

に移動して、以下を実行します。

```bash
pod install
```

もし上記で「Unable to find a specification for \`TensorFlow-experimental\`」というエラーが出た場合、以下の手順を行ってください。

```bash
pod repo remove master
pod setup

pod install
```

以下のxcworkspaceが作成されていれば成功です。

```
tensorflow/examples/ios/camera/tf_camera_example.xcworkspace
```

このxcworkspaceからXcodeを起動してください。
問題なくビルド、実行できると思います。

#実行結果

とりあえず、自宅にあったギターを試してみました。

###アコースティックギター

<img width="375" alt="IMG_0514.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/64581/d5ba62b3-097a-7f04-6644-62723287c777.png">

###エレキギター

<img width="375" alt="IMG_0515.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/64581/d2f143c0-51e7-984a-b5bb-f92fe071c7bc.png">

バッチリですね！
ペアプロに最適なマウス

みなさん、ペアプロやってますか？
うちのプロジェクトは基本開発作業を全てペアでやってます。
そんな中で、長年使っていた安物マウスが壊れてしまい新調することにしたのですが、購入したマウスが超絶便利でかつペアプロの生産性をさらにあげてくれるシロモノだったので、紹介記事を書くことにしました。

> けっしてメーカーの回し者ではありませんです、はい。

# 今回購入したマウス

* logicool m585gp
* https://www.amazon.co.jp/gp/aw/d/B071Z2TFHY/ref=yo_ii_img?ie=UTF8&psc=1

# 何がペアプロ向きなのか？

ずばり、

* logicool flow

と呼ばれる、アプリ機能です。
詳細はメーカーのページに任せますが、

* ロジクールオプションというクライアントソフトを、２つのマシンにインストール
* それぞれのマシンとマウスをペアリング(m585は2台までペアリング可能)
* ２つのマシンを同一ネットワークセグメント上に接続
 * ようはおなじスイッチハブにつないどけばok

これらの条件を満たしておくことで、

* 二台のpc間を、まるで一台pcのマルチディスプレイ環境であるかのようにシームレスに移動
* しかもしかも、クリップボードまで共有できる

という機能なのです！

ペアプロ時には基本的にドライバーのpcを使ってプログラミングすると思いますが、たまにAPIの使い方を調べたりする際に、シングルでググったりしますよね？
その際にナビゲーターが自分のpcでサンプルソースやサイトを見つけた場合、それをナビゲーター側に共有したくなりますが、普通だとそこでチャットでリンクを送ったり、最悪メールで共有、といったことになってしまいがちです。

そこをこのlogicool flowを使えば、同一pcで作業しているかのように、ナビゲーター側のpcからリンクなりコードスニペットなりをコピーし、ドライバー側のpcに持ってくることができるのです。
これは便利！！

ちなみにlogicool flowが使えるのは私が購入したもの以外にも、複数のモデルが出ているようです。
私のは4000円程度で、おそらく一番安いものだと思います。


ペア作業環境をよくするために、ぜひ検討されてはいかがでしょうか？
gitのたまに使うコマンド

不意にcommit取り消したいとかrebaseでエラーがでるときの解除とか、普段あまり使わなくてコマンドを忘れちゃうので最低限レベルで覚書程度にまとめてみました。

#add編
取り消し：``git reset``

#commit編
直前の取り消し：``git reset HEAD^``
2個前まで取り消し：``git reset HEAD^^``

■補足
HEAD:最新のコミットに対するハッシュ値の別名

#rebase編
取り消し（直後）：``git reset --hard ORIG_HEAD``

[CONFLICTが起きた場合]
解消：``git status``（確認・修正）  ⇒  ``git add``  ⇒  ``git rebase --continue``
rebase取り消し：``git rebase --abort``

■補足
ORIG_HEAD:最新の一つ手前のコミットに対するハッシュ値の別名

#cherry-pick編
取り消し（直後）：``git reset --hard ORIG_HEAD``

[CONFLICTが起きた場合]
解消：``git status``（確認・修正）  ⇒  ``git add``  ⇒  ``git cherry-pick --continue``
rebase取り消し：``git cherry-pick --abort``


#番外編
・addとcommitの一括処理をしたい
  ``git commit -am "xxxx" ``

・コミットしたファイルに、別の修正ファイルを含めたい
``git add`` ⇒ ``git commit --amend``
PhantomJSとは

**※PhantomJSの開発は終了し、リポジトリはアーカイブ化されました。本記事は参考程度にご覧ください。**
https://jser.info/2018/06/11/phantomjs-ended/

# PhantomJSとは
WebKitベースのヘッドレスブラウザ。WebKitとは主にWebブラウザーで用いられているレンダリングエンジンのこと。PhantomJSはWebKitにbuilt-inされているJavaScriptCore (Safariとかもこれを使っている) というJavaScriptエンジンを採用している。スクレイピングやスクリーンキャプチャなどにも活用可能。

`ヘッドレスブラウザ`：ヘッドレス・ブラウザとは、Webコンテンツを画面上に描くグラフィック・ユーザ・インタフェース（GUI）を省略したブラウザ

**要はコマンド（プログラム）でブラウザを実行できる環境のこと。**


プログラムで動きを制御できるので、
「自動化テスト」
「スクレイピング」
などを得意としている。


自動化テストだとSelenium+PhantomJSがセットで出てくることが多い。


## Node.js で Seleniumを動かす方法
１. 適当に作業フォルダ作る

```shell-session
$ mkdir selenium-test
```


２. Selenium install

```shell-session
$ npm -g install selenium-webdriver
$ npm install selenium-webdriver
```

※動かない場合はlocalにもselenium-webdriverを入れる。

３. Chrome WebDriver install
https://sites.google.com/a/chromium.org/chromedriver/downloads
※最新バージョンを入れる


４. 展開したファイルを作業フォルダに配置、jsファイルを作る

```
selenium-test/
　chromedriver
　chromeTest.js
```

こんな感じになれば良い。


５. jsテストコード記述

```javascript:chromeTest.js
// webdriverの機能が使えるよう呼び出す
var webdriver = require('selenium-webdriver');
var driver;
var By = webdriver.By;

// webdriver起動 chromeを指定
driver = new webdriver.Builder()
.withCapabilities(webdriver.Capabilities.chrome())
.build();

// googleのホームを開いたらロゴをクリックする
// クリックに成功したらログを出す
driver.get('https://www.google.co.jp/').then(function(){
  driver.findElement(By.id('hplogo')).click()
  .then(function(){
    console.log('ロゴをクリックしました');
  });
});
```


６. 起動

```shell-session
$ node chromeTest.js
```
ブラウザが起動し、ターミナルで「ロゴをクリックしました」が出力されれば成功。

<br>
**これがGUIブラウザを使った方法。**

<br>


**PhantomJSはGUIブラウザを使わない。**



## PhantomJS環境

### install

```shell-session
$ brew update
$ brew install phantomjs
```
もしくは

```shell-session
$ npm install phantom phantomjs -g
```

### テストコード
適当な作業フォルダにて、test.jsを作成

```javascript:test.js
console.log('Hello, World');
phantom.exit();
```

**実行**

```shell-session
$ phantomjs hello.js
```

「Hellow, World」と表示されれば成功。
次にcap.jsを作成し、以下のように記述する。

```javascript:cap.js
// ページを表示するためのpageオブジェクトを作成(ブラウザのタブを作る感じ？）
var page = require('webpage').create();

// githubが開けたらキャプチャを取る
page.open('www.github.com/‎', function() {
  page.render('github.png');
  phantom.exit();
});
```
**実行**

```shell-session
$ phantomjs cap.js
```

作業フォルダ内にgithub.pngができていれば成功。

といったように、GUIブラウザを開かずにブラウザを実行できる。
これがヘッドレスブラウザの特徴。
ブラウザが立ち上がらないので、作業の邪魔にもならない。


```javascript
page.onResourceRequested = function(request) {
  console.log('Request ' + JSON.stringify(request, undefined, 4));
};
page.onResourceReceived = function(response) {
  console.log('Receive ' + JSON.stringify(response, undefined, 4));
```
こんな感じでrequestやresponceを取得することもできる。
<br>


## PhantomJSの特徴

・ページ内での任意のJavaScriptコードの実行
・指定したボタンのイベントを動作（発火）させる
・Cookieの書き換え
・UserAgentの書き換え
・JavaScriptエラーの取得
・Ajaxや画像など様々なリクエストの監視

とブラウザ操作は一通りコマンドから実行できる。


あくまでブラウザなのでテストフレームワークと組み合わせて使うのが主流。

PhantomJS（ブラウザ）+Mocha（テストフレームワーク）+Chai（アサーションライブラリ）

テストフレームワークの使い方については別途投稿予定。
Node.js基礎知識

# Node.js基礎知識

## バージョン管理ツール

- nodebrew
- nodist（windowsだとこれ一択か？）
- ndenv

brewかrubyか。ndenvだとフォルダ別にversion設定できる。


## nodeのバージョン
https://github.com/nodejs/LTS

LTS（Long-term Support）：長期の保守運用が約束されたバージョン  

新規開発の際はLTSのActiveを選択すれば基本的に問題ない。


## Node.jsのリリースステータス

- CURRENT：最新版
- ACTIVE LTS：長期サポート対象期間
- MAINTENANCE：最低限のサポート期間

今だと6.xがActiveなので `v6.11.0` の最新を選択する。
※7/1時点


### バージョンの意味
`6.2.1`

左から
メジャーバージョン.マイナーバージョン.リビジョン
となっている。

メジャーバージョン：大規模な変更が発生する際に数字が上がる（変更 大）
マイナーバージョン：機能の追加や大規模なバグ修正の際に数字が上がる（変更 中）
リビジョン：小規模の変更や修正があった際に上がる（変更 小）


### アップデートの流れ
`6.2.0`
↓軽微のバグ修正↓
`6.2.1`
↓中規模のバグ修正↓
`6.3.0`

といった感じにアップデート内容によって、上げるバージョンを決めている。

リリース一覧（https://nodejs.org/ja/download/releases/）


## node.jsの実行

### node.jsはただのjavascript実行環境

※nodeが動く環境を前提としています。

以下の手順で node は実行できる。

```ruby:jsファイルを作る
vim app.js
```

```ruby:以下のように記述し保存
console.log('test')
```

```ruby:terminalにてjs実行
node app.js
```


## node.jsが持っている機能（module）
gruntやglup、webpackなど必要なツールはinstallする必要があるが
node.jsに最初からある機能も存在する。

**Core Modules**

[core modules 一覧](http://nodejs.jp/nodejs.org_ja/api/)


```ruby:使用例）パスを絶対パスにする
var path = require('path');
var testpath = path.resolve(path.join('src', 'js'));
console.log(testpath);

結果 => /someone/home/dir/src/js
```

moduleを別途インストールしたり探したりせずcore modulesにすでにある機能の場合もあるので
core modulesは覚えておく方が良い。
ある文字列をgrepで検索し返されたファイルをvimで編集


# こういう状況のこういう作業

* 一つのディレクトリ上にいくつかのファイルがある
* とある文字列が入っているファイルがそのうちのいくつかある
* (その文字列自体ではなく)その文字列**付近**を変更したい

# 具体的にこういう状況のこういう作業
例えば・・・

* homeディレクトリ上に連番(0-99)のファイルがある
* `RSA`という文字列がsample{素数}.txtに入っている
* `RSA`という文字列の続きは、'RSA124'とか'aaaRSAbbb'とか、そもそも小文字で'rsahoge'だったり、ばらばらとしましょう

```sh:homeディレクトリ上のファイル
$ cd ~
$ ls

sample0.txt
sample1.txt
sample2.txt
sample3.txt
sample4.txt
sample5.txt
sample6.txt
...
sample98.txt
sample99.txt
```

愚直にやるのであれば、grepコマンドで'RSA'文字列を検索します。

```sh:RSA文字列の検索
$ cd ~
$ grep -i RSA *
```

`-i`オプションは大文字小文字の無視(ignore)です。
(よく使うと思うので説明不要かもしれませんが、念のため)

結果は以下

```sh:grepの結果
sample2.txt:ssh-rsa
sample3.txt:aaaRSAbbb
sample5.txt:RSA124
sample7.txt:RSA125
sample11.txt:rsarsaRSA
sample13.txt:RSA5a465465a
...
sample89.txt:hogehogeRSaaaaaa
sample97.txt:RSAってなんだ
```

この出力結果を見ながら、

```sh:編集したいファイルをvimで開く
vim sample2.txt
vim sample3.txt
vim sample5.txt
vim sample7.txt
vim sample11.txt
vim sample13.txt
...
vim sample89.txt
vim sample97.txt
```

といちいち打ちこんでいってエディタを起動し

* `/rsa`で検索し、
* 修正加えて
* <kbd>n</kbd>, <kbd>N</kbd>で次の単語に移動する


# grep結果をvimにぶち込む

しかしスマートではないので、いちいちvimを起動しなくてもいいように

```sh:ファイル名だけを一度にvimにぶち込む
vim `grep -li RSA *`
```

`-l`はマッチしたファイル名のみ表示するオプションです。

こうすると

`{n} 個のファイルが編集を控えています`

みたいな標準出力が返されて、vimでn個のファイルを同時に開きます。
ファイルの移動は`:n`で次のファイル、`:N`で前のファイル


# 書いた理由
別の人の作業を後ろから覗いているとき、「愚直な方法」で示したやり方をやっていました。
当初`grep`でファイル名のみを出力オプションがあることだけは頭にあったのですが、具体的に`-l`オプションだということがわからなかったので特に教えたりせず、黙って作業を見守っていました。

また、自分自身最初はパイプを使えばいいものと思っていて、帰ってから自分の環境で

```sh
grep -li RSA * | vim
```

としたところ

```
Vim: 警告: 端末からの入力ではありません
Vim: 入力を読込み中のエラーにより終了します...
Vim: preserving files...
Vim: Finished.
```

というエラーが返されてしまいました。

しばらくなんやかんやして、先に`grep`を評価するバッククォート(\`)を使用するのが正しい、と気づき、自戒の念もこめて書きました。