OmniAICreator/Qiita-1.07M huggingface dataset:
Rubyで年・月・週単位で日付をループさせる

## 通常の日付のループ処理

RubyのDateクラスは先頭の日付と末尾の日付を繰り返し処理出来る仕組みがあります。

```rb
head = Date.new(2016, 1)
tail = Date.new(2016, 12)

# 1日ずつループ
(head..tail).each { |date| p date.strftime('%Y%m%d') }
# => '20160101', '20160102', '20160103', ...

# n日の間隔でループ
head.step(tail, 5).each { |date| p date.strftime('%Y%m%d') }
# => '20160101', '20160106', '20160111', ...
```

これはこれで、とても便利な機能なのですが、ループのstepの幅は日単位でしか指定することが出来ません。

## 年・月・週単位でループさせる

`Enumerator`インスタンスを生成することで、任意の間隔でループさせる処理を書くことが出来るようになります。

```rb
e = Enumerator.new do |yielder|
  head = Date.new 2016, 1
  tail = Date.new 2016, 12

  while head <= tail
    yielder << head
    head = head.next_month # ここをhead.next_weekやhead.next_yearに変えることで年毎や週毎のループに出来る
  end
end

e.each { |date| p date.strftime('%Y%m%d') }
# => '20160101', '20160201', '20160301', ...
```

### ほんの少し解説

`yielder`に対して`<< arg`という形でメソッドを呼び出すと`arg`が`each`のブロック引数に渡されます。
上記のサンプルコードでは、`yielder << head`となっているので、`head`（whileループの中でカウントアップされている日付）が`each`のブロック引数に渡されていることになります。

## 便利に使う

下記のようなrefinementを利用して、Dateクラスを拡張すると便利です。
（`active_support`を使うこと前提のコードです）

```rb
require 'date'
require 'active_support/all'

module DateExtender
  refine Date do
    def step_by_unit(tail, unit = :day, step = 1)
      head = self.dup

      Enumerator.new do |yielder|
        while head <= tail
          yielder << head
          head += step.send(unit)
        end
      end
    end
  end
end

using DateExtender

# week by
head = Date.new(2016, 1)
tail = Date.new(2016, 1).end_of_month
head.step_by_unit(tail, :week).each { |date| p date.strftime('%Y%m%d') }
# => '20160101', '20160108', '20160115', ...

# month by
head = Date.new(2016, 1)
tail = Date.new(2016, 4)
head.step_by_unit(tail, :month).each { |date| p date.strftime('%Y%m%d') }
# => '20160101', '20160201', '20160301', ...

# year by
head = Date.new(2016)
tail = Date.new(2020)
head.step_by_unit(tail, :year).each { |date| p date.strftime('%Y%m%d') }
# => '20160101', '20170101', '20180101', ...
```
Pull Request をマージするのは誰だ

チーム開発の現場に git を導入し、git-flow, github-flow などの開発フローに則って、 pull-request とコードレビューを実施している現場も多くあるだろう。

私達のチームもその例に漏れていない。git-flow, github-flow こそ採用はしていないものの、それらをより簡略化、シンプルにしたフローで開発を行ってる。

さて、あなたのチームではコードレビューの後にPull Requestをmergeするのは誰の作業だろうか？レビューをした人？それともレビューを依頼した人？あるいは、ソースコード統括管理担当者？

私達のチームでは、Pull Requestを作った人(つまり、コードレビューを依頼した人)がソースコードのマージを行うようにルールを作成した。今回は、そのようなルールを導入している理由とメリットや効果について纏る。

## レビューに通過！さあ、マージしよう・・・えっ！？

おめでとう、君の作った Pull Request は無事に自動テストに合格し、厳しいことで有名な先輩エンジニアのレビューに合格した。張り切って `Merge pull request` を押す・・・その前に確認をして欲しい。マージ先のブランチは君がトピックブランチを作ったときから進んでいないだろうか？

チーム開発を行っているとよくある現象だ。自分が自分で作ったブランチで作業をしている間にも、開発ブランチの作業はどんどん進んでいっている。今、そのままマージをするのは私は次の理由でオススメをしない。

 - あとからリビジョンツリーを見た時にブランチの関係性が見難くなる。そのため、仮にマージコミットを revert するときに操作が複雑になりえる
 - 開発ブランチでの変更によって、トピックブランチがバグを引き起こす可能性がある。

開発ブランチの変更と作業ブランチの変更が、一見関係のない部分のように見えても、思いもしないバグを引き起こす可能性がある。残念ながら、それがソフトウェアだ。

そこで、私達は開発ブランチの変更をトピックブランチへ取り込む作業を行う。このとき、 `merge` にするのか `rebase` にするのかという議論があるようだが、私達は `rebase` を利用している。

`rebase` が完了したら悪名高き `force push` を行う。あとは、自動テストが実施され問題が発生しないことを確認する。

## さぁ今度こそマージだ・・・！！誰が・・・？

さて、いよいよ今回の本題だ。前にも書いたように私達は Pull Request を作った本人がマージを行うようにルールを作って運用している。この方法にはメリットがある。

### 自分に割り当てられている Issue を自分で終了できる

Pull Request と Issue が結びついていることが前提だけれど、自分に割り当てられている Issue を自分の責任で終了できるので、チームメンバーで Issue の共有をするときに、認識の齟齬が生まれにくくなる。

### `rebase`との相性が良い

前の節で私達はマージの前に必ず `rebase` を行うことを紹介したけれど、 `rebase` は `force push` を伴う作業だ。一つのトピックブランチに2人以上の人間が `force push` を行うことは、コンフリクトを引き起こす一番の原因だ。問題を発生させる可能性は避けるべきであると言える。

### 責任の所在がはっきりとする

レビューを行うのも人間だし、マージを実施するのも人間だ。人間の行うことには残念ながらミスがつきまとう。ミスは仕方ないものとしても、再発を防止するのは必要だ。

このとき、誰がやったことが原因で生じた問題なのかをはっきりとしておくことで、原因の分析ができてその積み重ねが解決へ結びつく。

そして、最後に携わるレビュワーよりも、一番コードを書いたであろうレビュー依頼者の方が、コードの全容を知っているという意味で後者が負うのが適切だと考えている。

## まとめ

私達が運用している Pull Request のルールについて纏めた。実はこのルールは、今のチームでは私が作った物では無いのだけれど、実は私が以前いたチームでも同じことをやっていたので、なんだかｽｯと馴染んだ。

まとめに書く内容となって恐縮なのだけれど、この方法は「Pull Request に対して自動でテストを行っていること」や「Pull Request と Issue が紐付いていること」が前提条件になっている。全てのチームにおいて、この方法が最適ではないのが残念だ。

ちなみに、私達のチームでは最近はコードレビューを自分の作業よりも優先するルールも取り入れた。その辺りの話は[コードレビューを優先するか自分の作業を優先するか](http://qiita.com/mironal/items/d5c0184b194917146576)を参考にしてみて欲しい。
mysql dump&restoreをローカルに保存せず、s3を使うコマンド

mysqldump -h host -P 3306 -u user -p database_name | gzip | aws s3 cp - s3://temp/xxx.sql.gz

aws s3 cp s3://temp/xxx.sql.gz - | gunzip | mysql -h host -P 3306 -p test -u user

でかいデータをdumpするときにローカルの容量を気にしなくて良くなります。
MACで環境設定したこと

MACで自分が環境設定したことをまとめてみます。

- 環境変数を読み込みやすいように設定する

基本的にたいていのサイトは対象のユーザのフォームディレクトリにある.bash_profileにかけとよく言われます。
自分は直接書くのが嫌いなので、これが正しいのかはわかりませんが自分は以下の通りとしました。
以下を入れると/etc/profile.dにある.shファイルをすべて読み込むようになります。
あとは/etc/profile.dを作成しそこに必要な設定を追加していけばOKです。
なお、今後環境変数の追加をした場合は必ず 

```shell
source .bash_profile
```
 
をするようにしました。
※.bash_profileはターミナルを起動した時に自動的に読まれるファイルになります。なのでターミナル起動しっぱなしだと環境変数は反映されません。確認したい時はまずset等のコマンドを叩いて追加した項目が定義されているか確認できます。なければsourceを叩いときます。

```shell:.bash_profile
for i in /etc/profile.d/*.sh ; do
    if [ -r "$i" ]; then
        if [ "${-#*i}" != "$-" ]; then
            source "$i"
        else
            source "$i" >/dev/null 2>&1
        fi
    fi
done
```

またPATH等の環境変数を上書きする可能性があるものは以下のように記述します。

```shell
#!/bin/bash

# MySQL Path Setting
export PATH=$PATH:/usr/local/mysql/bin:/usr/local/mysql/support-files/

```

- ターミナル接続を簡単にする。

私はAWSを扱うときが多いので以下にサーバの登録をするとpemファイルを省略しての登録など簡単にできます。
ホームディレクトリの配下にある.sshフォルダ以下にconfigファイルを設定します。以下を設定すると

```shell:.ssh/config
Host 付けたい名前
        HostName          HOSTIPまたはドメイン名
        Port                    22
        IdentityFile          PEMファイル（フルパス）
        User                    ec2-user
        ServerAliveInterval     60

```

本来は以下のように書かなくてはいけませんが

```
ssh ec2-user@IPアドレスまたはドメイン -i PEMファイル（フルパス）
```

以下のように書いてログインができるようになります。

```
ssh 付けたい名前
```

またSSH経由のscpやrsyncでも使用できます。

```
scp 元ファイル 付けたい名前:フォルダ名  
rsync -rlptvu --delete 元ファイル 付けたい名前:フォルダ名  
```

- 自前のコマンドを登録する

aliasで登録します。とある文字を打つとその文字に関連付けられたコマンドを起動するようなイメージとなります。

これは上の方式だと /etc/profile.d/alias.sh 等定義すればOKです。

$ 登録したコマンド名

で実行できるようになります。

```shell
$ cat /etc/profile.d/alias.sh
#!/bin/bash

# ターミナル接続
alias コマンド名='ssh -i PEM名（フルパス） ec2-user@IPアドレスorドメイン'

# mysql起動コマンド
alias mysqlstart=’sudo mysql.server start’
```

以上かなぁ・・・
docker 1.10 docker compose 1.6 を試してみる

# 概要

docker 1.10 docker compose 1.6 がでたので、試してみた。

[Compose 1.6: New Compose file for defining networks and volumes | Docker Blog](https://blog.docker.com/2016/02/compose-1-6/)

[参考訳：Compose 1.6: ネットワークとボリュームを定義する新しい Compose ファイル | Pocketstudio.jp log3](http://pocketstudio.jp/log3/2016/02/06/compose-1-6-ja/)

[参考訳：Docker 1.10 新しい Compose ファイル、セキュリティ改善、ネットワーク機能等 | Pocketstudio.jp log3](http://pocketstudio.jp/log3/2016/02/06/docker-1-10-ja/)

# 結論

紹介されていたサンプル動いた。

[docker/example-voting-app: Example Docker Compose app](https://github.com/docker/example-voting-app)

# 確認方法

今回は voting アプリをためした。
5000と5001のポートでそれぞれ、投票、確認、ができるようだ。

たくさんためこんでというより、最後に投票したほうが、１００％になる感じだった。



# 今後

時間があれば

- 複数のマシンまたいだら、どうなるのかも試してみたい。
- 名前解決のDNSを使ってみたい。
- docker デーモンの再起動無しで、設定を更新できるようなので、どのあたりの設定が更新できるか試してみたい。

# 以下作業

docker-machineを作って

```
docker-machine create -d virtualbox dockertest110
```

以下のような感じで実行

```
curl -L https://github.com/docker/compose/releases/download/1.6.0/docker-compose-`uname -s`-`uname -m`  > docker-compose
chmod 755 docker-compose
sudo mv docker-compose /usr/local/bin/docker-compose
git clone https://github.com/docker/example
-voting-app.git
cd example-voting-app
docker-compose up
```

## 確認

docker

```
$ docker version
Client:
 Version:      1.10.0
 API version:  1.22
 Go version:   go1.5.3
 Git commit:   590d5108
 Built:        Thu Feb  4 19:55:25 2016
 OS/Arch:      linux/amd64

Server:
 Version:      1.10.0
 API version:  1.22
 Go version:   go1.5.3
 Git commit:   590d5108
 Built:        Thu Feb  4 19:55:25 2016
 OS/Arch:      linux/amd64

```

docker-compose

```
$ docker-compose version
docker-compose version 1.6.0, build d99cad6
docker-py version: 1.7.0
CPython version: 2.7.9
OpenSSL version: OpenSSL 1.0.1e 11 Feb 2013
```


# 感想

```
docker-compose up
```

したら、コンテナをpullしてくるだけなのかとおもったら、なんかコンテナ作ってる感じだった。
結構なビルド時間がかかった。
java関係がたくさんはいって、maven がうごいていたからかな？？？
TowerでGitのsubmoduleを扱う


submoduleは、別リポジトリの内容をサブディレクトリとして扱うようにできるGitの機能です。ここではGitクライアント「[Tower](https://www.git-tower.com/)」でのsubmoduleの扱い方について記載します。

### 使用したバージョン
- Tower 2.3.3
- Mac OS X El Capitan バージョン 10.11.2

# submoduleを追加する

submoduleを追加するには、メニューの[Repository]→[Add New Submodule...]を選択します。

![image 2016-02-09 15.31.11.png](https://qiita-image-store.s3.amazonaws.com/0/1423/2d7f3e12-3531-e210-3333-a2488fd1c6d5.png "image 2016-02-09 15.31.11.png")

メニューから選択後、以下のダイアログが表示されます。[Path]、[Repository URL]に、それぞれsubmoduleを配置するサブディレクトリー、リポジトリのURLを入れます。

![image 2016-02-09 15.32.19.png](https://qiita-image-store.s3.amazonaws.com/0/1423/a7986d32-67fe-7e10-e4fc-03138620744a.png "image 2016-02-09 15.32.19.png")



# submodule内のファイルを変更する

左側ペインの[Submodules]をダブルクリックすると、submodule内を通常のリポジトリとして扱うことができます。ヘッダーにどこのリポジトリのsubmoduleなのか表示されるため、分かりやすいです。ここで通常通りコミットとプッシュを行うことでリポジトリは更新されます。

![image 2016-02-09 17.01.23.png](https://qiita-image-store.s3.amazonaws.com/0/1423/67b6f6b0-5a05-7d9c-317c-62ebe45be1eb.png "image 2016-02-09 17.01.23.png")

submodule側でコミットを行うと、親側のリポジトリーで、変更が検知されます。これをコミット&プッシュすることで、親側のリポジトリーのsubmoduleの取り込み先ハッシュ値が更新されます。

![image 2016-02-09 17.01.49.png](https://qiita-image-store.s3.amazonaws.com/0/1423/313442f6-d19e-2e53-a5ef-a63ef7c19dce.png "image 2016-02-09 17.01.49.png")

# リモートのリポジトリ―にsubmoduleがある場合
## cloneするとき
clone時に[Initialize Submodule]にチェックを入れておくと、自動でsubmoduleの中身の取り込みがされます。チェックを入れておかないと、submoduleのディレクトリの中身は空になっています。チェックを入れていない場合のsubmoduleの中身を取り込み方は後述で説明します。
![image 2016-02-09 16.39.52.png](https://qiita-image-store.s3.amazonaws.com/0/1423/eca9fe85-ba25-2909-4a65-d5daaf2c1dc1.png "image 2016-02-09 16.39.52.png")

## pullする
リモート上のリポジトリのsubmoduleハッシュ値が更新されている状態で、pullを行うと以下のダイアログが表示されます。

[Update]ボタンを押すと、submoduleの更新が取り込まれます。自分がsubmodule内のファイルを更新することがなければ、[Always auto-update submodule]にチェックを入れておいて大丈夫だと思います。(作業する場合だとコンフリクトする可能性があります）
![image 2016-02-09 16.20.21.png](https://qiita-image-store.s3.amazonaws.com/0/1423/b49348d7-5f15-42a6-e2ea-d478ecb08fdb.png "image 2016-02-09 16.20.21.png")


## submoduleの内容を取り込む
 
clone時に[Initialize Submodule]にチェックを入れておかなかったり、pull時に[Update]を選択していない状態だと、submoduleの中身が空のままだったり、古いままになります。左側パネルの[Submodules]を選択した時に黄色い帯で「Submodule is uninitialized. Use "Update" to Initialize now.」とのメッセージと[Update]ボタンが表示されるので、[Update]ボタンをクリックすることで、submoduleのディレクトリの中身が取り込まれます。

![image 2016-02-09 16.04.08.png](https://qiita-image-store.s3.amazonaws.com/0/1423/4b6a0ddb-fb43-ab1b-7b85-94f2ccd125ed.png "image 2016-02-09 16.04.08.png")



# 具体的な事例

Webサイト「[HTML5製のデザインツール Particle Develop - ICS](ics-web.jp/projects/particle-develop/)」の開発で、submoduleを使用しました。[パーティクルエディター](https://github.com/ics-creative/project-particle-develop)内では[パーティクルシステム](https://github.com/ics-creative/createjs-particle-system)をsubmoduleとして扱うことで、パーティクルシステムのランタイムを単体で提供できるようになりました。
MacOSで勝手に"を変換されるのを止める



設定ー＞キーボードー＞ユーザ辞書
の中の、
スマート引用符とスマートダッシュを使用を変更する。
（本当は、OFFにしたいのだが、OFFにならなかったアプリもある）

二重引用符を "abc"
一重引用符を 'abc'

に変更します。
こうすることにより、勝手にアプリで""をヘンテコな文字に変更されなくなる。


![キーボード.png](https://qiita-image-store.s3.amazonaws.com/0/44315/b7b48a5a-bc69-b6b6-5677-c05b9446063c.png "キーボード.png")
IndexedDBはiOS Safariの「ホーム画面に追加」でWebアプリにすると動作しない

表題の通り。
以下のコードをiOSの通常のSafariで動作させた場合と、「ホーム画面に追加」で全画面Webアプリにした場合で比べてみてください。

    var indexedDB = window.indexedDB || window.webkitIndexedDB || window.mozIndexedDB || window.msIndexedDB;
    if (indexedDB) {
        alert("great!")
    }
    else {
        alert("poor")
    }


Apple Support Communitiesを見ても、直す気はなさそうです。

IndexedDB is not working from a web app (on the homescreen) 
https://discussions.apple.com/thread/6549513?start=0&tstart=0

Apple's (iPad) implementation of IndexedDB - Is there documentation available? 
https://discussions.apple.com/thread/6707922?start=0&tstart=0
継承可能なSingleton基底クラス（VB.Net）

**改訂版書きました。**
[[改訂版]継承可能なSingleton基底クラス（VB.Net）](http://qiita.com/redseen/items/34d92016a09432cab4e7)
***
Singletonなクラスをある程度の個数作らなければいけなくなり、スニペットはあるもののなんとか継承を使用して解決できないか調査した。

#参考にしたサイト
[Singletonのサブクラス化](http://www.hyuki.com/techinfo/singleton.html)
[デザインパターン第１４回「Singletonパターン」その２](http://zecl.hatenablog.com/entry/20080229/p2)

#基底クラス
```vbnet:AbstractSingletonClass.vb
''' <summary>
''' シングルトン基底クラス
''' </summary>
''' <remarks></remarks>
Public MustInherit Class AbstractSingletonClass

    ''' <summary>
    ''' シングルトンインスタンスリスト
    ''' </summary>
    ''' <remarks></remarks>
    Private Shared _SingletonInstanceDictionary As New Dictionary(Of Type, AbstractSingletonClass)

    ''' <summary>
    ''' インスタンス生成排他ロックオブジェクト
    ''' </summary>
    ''' <remarks></remarks>
    Private Shared ReadOnly _SyncLockCreateInstance As New Object

    ''' <summary>
    ''' コンストラクタ（Protected）
    ''' </summary>
    ''' <remarks></remarks>
    Protected Sub New()

        '唯一のインスタンスを保証する
        If _SingletonInstanceDictionary.ContainsKey(Me.GetType()) Then
            Throw New InvalidOperationException("インスタンスは既に生成されています。")
        End If

        '追加する
        _SingletonInstanceDictionary.Add(Me.GetType(), Me)

    End Sub

    ''' <summary>
    ''' インスタンス取得
    ''' </summary>
    ''' <typeparam name="T"></typeparam>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Shared Function GetInstance(Of T As AbstractSingletonClass)() As T

        SyncLock _SyncLockCreateInstance

            'インスタンス生成済みかチェックする
            If _SingletonInstanceDictionary.ContainsKey(GetType(T)) = False Then
                '無ければ生成する
                _SingletonInstanceDictionary(GetType(T)) = CType(System.Activator.CreateInstance(GetType(T), True), T)
            End If

            '返す
            Return CType(_SingletonInstanceDictionary(GetType(T)), T)

        End SyncLock

    End Function

End Class
```
#派生クラス
```vbnet:SingletonA.vb
''' <summary>
''' 派生クラスA
''' </summary>
''' <remarks></remarks>
Public Class SingletonA
    Inherits AbstractSingletonClass

    ''' <summary>
    ''' コンストラクタ（Protected）
    ''' </summary>
    ''' <remarks></remarks>
    Protected Sub New()

    End Sub

End Class
```
#使い方
```vbnet:
Dim S = SingletonA.GetInstance(of SingletonA)()
```

#今回勉強になったポイント
1.インスタンスを生成するActivator.CreateInstanceメソッドは、Publicなコンストラクタのみを実行するものだと思っていたが、第2引数次第でProtected、Privateでも生成してくれることを知った。

2.Sharedなメンバは「基底クラス.Sharedメンバ」とアクセスしなければいけないと思い込んでいたため、派生クラス内に基底クラス名が出現するが嫌で敬遠していた。だが「派生クラス.Sharedメンバ」でもOKなことを知った。

#残る問題

こんな感じで使う時に型推論が効けば最高。

```vbnet:
Dim S = SingletonA.GetInstance()
```
解決方法をご存知の方、コメントください。
button要素のcssをリセットしたい


セマンティックなhtmlを書く上でリンクではないクリッカブルな要素はbuttonで書きたい衝動にかられると思います。

まぁaタグでもいいんですがbuttonタグを使いたい時にブラウザ標準のスタイルが当てられると最高にダサいので、リセットしてから独自のcssを当てましょう。

```style.css
button{
        background-color: transparent;
        border: none;
        cursor: pointer;
        outline: none;
        padding: 0;
        appearance: none;
}
```
旧バージョンのCentOSでyum install出来なくて辛かった

yum install しようとすると以下のエラーが出てしまってyum関連の操作が何も行えなかったのでメモ

```bash
$ sudo yum -y install
Cannot open/read repomd.xml file for repository: update
```

/etc/yum.repo.d/CentOS-Base.repoの中を見てbaseurlに指定してあるURLの先を見ると理研のサーバを見ていた。
ブラウザでそのURLを見てみると確かにREADMEを残して全て消え去っていたので、READMEを見ると「 http://vault.centos.org 」に移動したようなコメントが書いてあったので、ドメインを理研からvaultに変更したがまたもや同じエラー。
どうやらディレクトリの構成が変わっていたようなので、vaultのディレクトリ構成をブラウザで確認して対処。
変更して再度yum installしたら無事インストールが出来ました。
EC2インスタンス自身のメタ情報を取得する方法

# AWSインスタンス自身のメタ情報を取得する

参考: http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2-instance-metadata.html

取得できる項目の一覧
```
curl http://169.254.169.254/latest/meta-data/
```

例) ローカルIPを取得
```
curl http://169.254.169.254/latest/meta-data/local-ipv4
```

例) パブリックIPを取得
```
curl http://169.254.169.254/latest/meta-data/public-ipv4
```

自作のスクリプトへ組み込んで有効活用したい
配列操作

shift,pop,unshift,pushの名前がこんがらがるので自分なりの覚え方など。
配列のまとめが増えすぎたのでそのうち全部いい感じにまとめたい(願望

# [array_shift](http://php.net/manual/ja/function.array-shift.php)
`array_shift ( array &$array )`
配列の先頭を切り取って返す。
返り値は配列の先頭にいた値。元の配列からはその値はなくなる。
添え字が数値だった場合は添字も振りなおされる。
元の配列から値をシフトする。

```php
$arr = array("banana","orange","apple","peach","grape");
print_r($arr);
/*
Array
(
    [0] => banana
    [1] => orange
    [2] => apple
    [3] => peach
    [4] => grape
)
*/

$fruit = array_shift($arr);
print_r($arr);
/*
Array
(
    [0] => orange
    [1] => apple
    [2] => peach
    [3] => grape
)
*/
print_r($fruit)
// banana
```


# [array_pop](http://php.net/manual/ja/function.array-pop.php)
`array_pop ( array &$array )`
`array_shift`の最後バージョン。最後を切り取って返す。
数字なら添字も詰まるので、`array_pop`した後要素を追加した場合はその位置に入る。ポップアップとかのイメージ。なんpullとかpickにしてくれなかったのか…。

```php
$arr = array("banana","orange","apple","peach","grape");
print_r($arr);
/*
Array
(
    [0] => banana
    [1] => orange
    [2] => apple
    [3] => peach
    [4] => grape
)
*/

$fruit = array_pop($arr);
print_r($arr);
/*
Array
(
    [0] => banana
    [1] => orange
    [2] => apple
    [3] => peach
)
*/
print_r($fruit);
// grape

$arr[] = "mango";
print_r($arr);
/*
Array
(
    [0] => banana
    [1] => orange
    [2] => apple
    [3] => peach
    [4] => mango
)
*/
```

# [array_unshift](http://php.net/manual/ja/function.array-unshift.php)
`array_unshift ( array &$array ,"追加する値"[,"追加する値"]  )`
1つ以上の要素を配列の先頭に追加。追加する順は引数として与えた順序のまま。添字が数値なら０から振りなおされる。
shift(取り出し)の逆だからunshiftなんだろうけど…いまいちピンとこない。


```php
$arr = array("banana","orange","apple","peach","grape");
print_r($arr);
/*
Array
(
    [0] => banana
    [1] => orange
    [2] => apple
    [3] => peach
    [4] => grape
)
*/

array_unshift($arr,"mango","melon");
print_r($arr);
/*
Array
(
    [0] => mango
    [1] => melon
    [2] => banana
    [3] => orange
    [4] => apple
    [5] => peach
    [6] => grape
)
*/
```

# [array_push](http://php.net/manual/ja/function.array-push.php)
`array_unshift`の後ろバージョン。最後に値を追加。
`$arr[]`と動きは同じ。1個だけなら`$arr[]`の方が早い。
配列の後ろに値を押し付ける、なイメージ。

```php
$arr = array("banana","orange","apple","peach","grape");
print_r($arr);
/*
Array
(
    [0] => banana
    [1] => orange
    [2] => apple
    [3] => peach
    [4] => grape
)
*/

array_push($arr,"mango","melon");
print_r($arr);
/*
(
    [0] => banana
    [1] => orange
    [2] => apple
    [3] => peach
    [4] => grape
    [5] => mango
    [6] => melon
)
*/
vim-go-ideでさくっとGolang開発を始める

最近、Golangを仕事で書くことになったので、vimでgolangを快適に開発できるように下記の記事などを参考にして、.vimrc等を編集した。

- [【Go × Vim】 VimでGoを書く - 2015 Spring](http://qiita.com/izumin5210/items/1f3c312edd7f0075b09c)
- [vim-go-extra を公開致します。](http://vim-jp.org/blog/2014/09/02/vim-go-extra.html)

が、何が原因なのかわからない（gocodeっぽい気もする）が、

- gocodeの補完がほとんど効かない
- 文字をタイプするたびにやたら重い
- 文字化け？レイアウト崩れ？みたいな現象が頻繁に起きる

と、Vimで開発するのが非常に辛い状態になってしまった。

.vimrcを一から書きなおしたり、色々頑張ってみたが改善せず、Visual Studio CodeかAtomに切り替えようかなーと思っていたら、vim-go-ideというのを見つけた。

https://github.com/farazdagi/vim-go-ide

## 使い方

```sh
# インストール
$ git clone https://github.com/farazdagi/vim-go-ide.git ~/.vim_go_runtime
$ sh ~/.vim_go_runtime/bin/install

# ~/.vimrc.goができている
$ ls ~/.vimrc.go

# ~/.vimrc.goを指定してvimを起動
$ vim -u ~/.vimrc.go

# aliasを貼っておくと楽
$ alias vimgo="vim -u ~/.vimrc.go"
```

特に変わったことはやっておらず、~/.vimrc.goにこれを作った人が考える最強の.vimrcができるだけ。

設定をカスタマイズしたい場合は、`~/.vim_go_runtime/custom_config.vim`に書くと勝手にロードしてくれる。

```sh
$ vim ~/.vim_go_runtime/custom_config.vim
```


最初は他人の褌で相撲取る的な違和感を感じて気が進まなかったけれども、元々使っていたプラグインが被っていたり、気に入らない設定は上書きできるのでしばらくこれでよいかなーと思っております。
myPrestoトラジェクトリーファイル書式

myPrestoのMDシミュレーションソフトpsegeneまたはcosgeneのtrajectoryファイルはバイナリ形式で出力される。

その形式を知っていないと解析プログラムを作ろうにも作れないので、
ここにメモする。

（１）psygene（cosgene）のトラジェクトリーファイルの書式
trajectoryファイル（.codや.crd）はバイナリで書かれているため、その書式が分からないと中身も読めない。
以下に記す。

以下に示す数字は全てbyte単位である。intは整数型、floatは小数点型である。

4 (no information)
4 (int, loop number)
4 (float, simulation time)
4 (float, cpu time)
4 (float, total energy)
4 (float, kinetic energy)
4 (float, temperature)
4 (float, potential energy)
4 (float, rmsf (root mean square fluctuation))
4 (int, num15svw)
4 (int, num15hyd)
4 (float, rmsd (root mean square deviation))
8 (no information)
4*3N (float, coordinates(x, y, z), "N" is the number of atoms)
4 (no information)

以上が、MDのループの1 step分で、以降はこれの繰り返し。
Atom レジストリエントリを含むアンインストール方法（Windows版）

ドキュメンテーション [https://atom.io/docs](https://atom.io/docs) を uninstall で検索しても記載がなかったのでメモ

## アンインストール後の状態

他のプログラムと同様、コントロールパネル－「プログラムと機能」から [アンインストール] した後、以下の状態になる：

### 一部フォルダが残る
- バージョン1.4.3（2016/2/9 現在最新）でも残る
- 以下の議論からは（バグではなく）あえて残す設計仕様のようだ
- [How To Completely Uninstall Atom From Windows - discuss.atom.io](https://discuss.atom.io/t/how-to-completely-uninstall-atom-from-windows/17338)

### 一部レジストリエントリが残る
- バージョン1.2.4では少なくとも残る
- バージョン1.4.3（2016/2/9現在最新）では解消されている
   - アンインストール後、レジストリエントリも削除される

必要であれば以下を行う。

## 残ったフォルダの削除

- 以下を削除する
  - C:\users/(usrename)/.atom
  - C:\users/(usrename)/appdata/local/atom

コンテキストメニュー（いわゆる右クリックメニュー）に含まれる "Open with Atom" メニューは：

- バージョン1.2.4では
  - 両フォルダを削除すれば消えてくれる
- バージョン1.4.3では
  - 両フォルダを削除しなくても、Atomをアンインストールすれば消えてくれる

![atom_reg01.jpg](https://qiita-image-store.s3.amazonaws.com/0/12779/1f651221-da40-486d-ff56-42b0adada34c.jpeg)

## 残ったレジストリエントリの削除
- レジストリエディタを開く
- レジストリの最上位階層から `open with atom` や `atom.exe` で検索
- 見つかったエントリを削除

### 最初に見つかるエントリ
```
HKEY_CLASSES_ROOT\*\shell\Atom
HKEY_CLASSES_ROOT\*\shell\Atom\command
```

- 後者は `atom.exe` で検索すると見つかる
- 下図の場合、左ツリーに見えている「Atom」フォルダごと削除すればよい

![atom_reg02.jpg](https://qiita-image-store.s3.amazonaws.com/0/12779/9716fc92-aaeb-8315-f80a-67599fab0a33.jpeg)

### 次に見つかるエントリ
- 各階層に存在する \command フォルダもそれぞれ削除する

```
HKEY_CLASSES_ROOT\directory\background\shell\Atom
HKEY_CLASSES_ROOT\directory\shell\Atom

HKEY_CURRENT_USER\Software\Classes\*\shell\Atom
HKEY_CURRENT_USER\Software\Classes\directory\background\shell\Atom
HKEY_CURRENT_USER\Software\Classes\directory\shell\Atom
```

### さらに見つかるエントリ
- 以下のエントリも見つかる（はず）
- ただし、削除前の検索では見つかるものの、上述「次に見つかるエントリ」を上から削除していくと存在しなくなっていた
- S-1-5-21- ... で始まる数字部分は環境によって異なるかもしれない

```
HKEY_USERS\S-1-5-21-4082386584-2154754650-3463350242-4620\Software\Classes\*\shell\Atom
HKEY_USERS\S-1-5-21-4082386584-2154754650-3463350242-4620\Software\Classes\directory\background\shell\Atom
HKEY_USERS\S-1-5-21-4082386584-2154754650-3463350242-4620\Software\Classes\directory\shell\Atom

HKEY_USERS\S-1-5-21-4082386584-2154754650-3463350242-4620_Classes\*\shell\Atom
HKEY_USERS\S-1-5-21-4082386584-2154754650-3463350242-4620_Classes\directory\background\shell\Atom
HKEY_USERS\S-1-5-21-4082386584-2154754650-3463350242-4620_Classes\directory\shell\Atom
```
C#で日付を漢字に変換する。


2015/11/1というDateTime型の変数を

二〇一五年十一月一日という文字列に変換します。




```csharp
using System;

namespace Common
{
	/// <summary>
	///日付を漢字に変換する
	/// </summary>
	public class DateFormatter
	{
		//コンストラクタ
		public DateFormatter()
		{
			
		}

		public static String toKanji(DateTime  date)
		{
			//引数で受け取った日付を文字列型に変換して代入
			String dateTime = date.ToString("yyyy年MM月dd日");

			//取り出した文字が数値に変換可能だったならば、この変数に代入する
			int number = 0;

			//tryParseの結果
			bool result;

			//変換用の配列
			String[] kanjiArr = {"〇","一","二","三","四","五","六","七","八","九"};
			String[] kanjiArr2 = {"","十","二十","三十"};

			//ループカウント用のインデックス
			int i = 0;

			//戻り値
			String returnString = "";

			//日付を一文字づつ漢字に変換
			foreach (char c in dateTime)
			{
				//キャラ型を文字列に変換
				String str = c.ToString();
				
				//数値なのか漢字なのか判別
				result = TryParse(str, out number);

				//５文字目または8文字目であれば二桁目を変換
				if(i == 5 || i ==8 )
				{
					returnString += kanjiArr2[number];
					i++;
					//次のループへ
					continue;
				}
				
				//数値を漢字に置き換え
				if(result == true)
				{
					returnString += kanjiArr[number];
				}
				else
				{
					returnString += c.ToString();
				}
				i++;				
			}		
			return returnString;
		}		

		//文字列を数字に変換可能か判断する
		//変換できた場合、outにその値を代入する。
		private static bool TryParse(string value, out int result)
		{
			result = 0;

			try
			{
				result = Int32.Parse(value);
				return true;
			}

			//Parseに失敗 == 例外
			catch(FormatException)
			{            
				return false;
			}

			catch(OverflowException)
			{
				return false;
			}
		}
	}
}
```
Github
ご自由にお使い下さい。
https://github.com/Akirakong/DateTimeFormatter
Swiftによるアプリ開発〜Storyboardを用いた最もシンプルな画面遷移の超テンプレ


Swiftアプリ激初心者Noobゴミがお伝えするiOSアプリ開発のテンプレ講座

# Storyboardを使った開発
Storyboardなしでも一応アプリの画面遷移を作ることはできるが、チームで開発するときはパット見わかりやすいStoryboardによる制作にすべきです。gitを用いるときにコンフリクトをうまく避けることができるなら、こっちを使ったほうが管理は捗るでしょう。

# 制作するもの
```
            |---buttonA--2nd view
1st view----
            |---buttonB--3rd view

```
こんな感じの画面遷移をするやつ

## 最初のViewController
###1 最初名前変える
最初の"ViewController"は名前を変更しておく。例えば"TopViewController" "FirstViewController"など

###2 .xibファイルも名前を変えておく
"FirstView"などにしておくと良いでしょう。

###3 viewDidLoad（viewを読み込んだ時の動作を定義）
FirstViewControllerのviewDidLoadに次のようなコードをぶち込む

```swift
        super.viewDidLoad()
        let view = UINib(nibName: "FirstView", bundle: nil).instantiateWithOwner(self, options: nil).first  as? UIView;
        self.view = view;
        // Do any additional setup after loading the view, typically from a nib.
```

そうすると、FirstViewControllerは自身のview(self.view)に、FirstViewをアタッチする。

###4 .xibファイルのオーナークラスを登録
FirstView.xibのPlaceholders-File's Ownerを選択。XCode右上の新聞みたいなアイコンをクリックするとCustomClassを登録できるので、このviewを管理するControllerを登録しよう。つまり、FirstViewControllerと入力すれば良い。

###5 Launch
Cmd+Rで動作確認。やったね！


## 第二・第三のViewController

###Main.storyboardにViewController追加

storyboardにSecondViewController ThirdViewControllerを追加しよう。
右下の検索窓みたいなとこにViewControllerを検索。ドラッグ・アンド・ドロップ。


###あとは同じ
上の小節の1-5を、SecondViewController、ThirdViewControllerとして同じことを繰り返す。プロジェクトにViewControllerを追加するときは一緒に.xibを生成してくれるオプションを適用して、.xibはリネームしてしまう。そうしたら4の手順を省略できると思う。


## Segue（せぐえ）を使った画面遷移

参考１：

```
seguire （伊・動・第三活用）「続く」、etc

活用（現
io	seguo
tu	segui
lui, lei, Lei	segue
noi	seguiamo
voi	seguite
loro, Loro	seguono

不定詞　seguire

らしい。
```

参考２:
![Qiita](http://pic.prepics-cdn.com/11ada54b933b0/49099367_220x220.jpeg "Qiita")
![Qiita](http://d13n9ry8xcpemi.cloudfront.net/photo/odai/400/194648f91be8721eecde72c079941b43_400.jpg "Qiita")
しずえ

###1 Button配置
FirstViewにてきとーにUIButtonを２つ配置。ButtonA ButtonBとか。

###2 Action!
FirstViewにて右上の丸２つみたいなアイコンをクリックすると、FirstViewControllerのswiftコードが同時に表示される。
ButtonAを、Ctrlを押しながらドラッグしてSwiftコードに持って行く。FirstViewControllerクラス内のメソッドになるように。
オプションが現れるので、ConnectionはActionにして、Nameは例えばbuttonAClickedとかにしておく。Typeは一応UIButtonにしておこう。
ButtonBに対しても同じようにする。

###3 ソースの中でSeguire!
追加されたbuttonAClickedに以下のコードをぶち込む。

```swift
performSegueWithIdentifier("buttonA", sender: self)
```

###4 Storyboardの中でSeguire!
Main.StoryboardのFirstViewController〜ThirdViewControllerのCustomClassに対応するViewControllerが追加されることを確認しよう。
FirstViewControllerからCtrl+ドラッグでSecondViewCtonrollerにドラッグすると矢印が伸びる。
矢印をクリックして、画面右側の三角つまみみたいなとこを選択すると、Identifierが登録できるので、これを3のソースで書いたperformSegueWithIdentifierで登録したidentifierと同じ名前にする。今回はbuttonA。

Thirdに対しても同じく。identifierはbuttonB。


# こんなかんじかと思います。
画面遷移の時に呼ばれるメソッドがどれかもよくわかったと思う。データ登録や削除・様々な処理は、対応するメソッドの中に記述すれば、アクションをするごとに必要な処理を記述することができるということだとおもう。

ここらへんの処理が目隠しして3分でできるようになれば、いっちょまえのswiftアプリ開発者なのではないかと思うのでした。
Docker 1.10にアップグレードしたら動かなくなったでござるの巻 (CentOS7)


CentOS7のDockerを1.9から1.10にアップグレードしたら動かなくなってハマったので情報共有。

## ログ

`journalctl -xe -u docker`とするとこんな感じで出るわけですよ。

```
docker.service - Docker Application Container Engine
   Loaded: loaded (/etc/systemd/system/docker.service; enabled; vendor preset: disabled)
   Active: failed (Result: exit-code) since 火 2016-02-09 13:30:07 JST; 10s ago
     Docs: https://docs.docker.com
  Process: 5410 ExecStart=/usr/bin/docker -d -H fd:// $OPTIONS $DOCKER_STORAGE_OPTIONS $DOCKER_NETWORK_OPTIONS $BLOCK_REGISTRY $INSECURE_REGISTRY (code=exited, status=125)
 Main PID: 5410 (code=exited, status=125)

 2月 09 13:30:07 XXXXXXXXXX systemd[1]: Starting Docker Application Container Engine...
 2月 09 13:30:07 XXXXXXXXXX docker[5410]: flag provided but not defined: -d
 2月 09 13:30:07 XXXXXXXXXX docker[5410]: See '/usr/bin/docker --help'.
 2月 09 13:30:07 XXXXXXXXXX systemd[1]: docker.service: main process exited, code=exited, status=125/n/a
 2月 09 13:30:07 XXXXXXXXXX systemd[1]: Failed to start Docker Application Container Engine.
 2月 09 13:30:07 XXXXXXXXXX systemd[1]: Unit docker.service entered failed state.
 2月 09 13:30:07 XXXXXXXXXX systemd[1]: docker.service failed.
```

ポイントはここですかね。

```
 2月 09 13:30:07 XXXXXXXXXX docker[5410]: flag provided but not defined: -d
```

## systemd

dockerデーモンの起動コマンドに誤りがありました。
たぶん以下のどれかにあると思います。
チェックして下さい。

- `/etc/systemd/system/docker.service`
- `/usr/lib/systemd/system/docker.service`

```
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network.target docker.socket
Requires=docker.socket

[Service]
Type=notify
ExecStart=/usr/bin/docker -d -H fd://
MountFlags=slave
LimitNOFILE=1048576
LimitNPROC=1048576
LimitCORE=infinity
TasksMax=1048576
TimeoutStartSec=0

[Install]
WantedBy=multi-user.target
```

プロキシ設定してる人はいじってるんじゃないかと思います。

```
[Service]
ExecStart=/usr/bin/docker -d -H fd://
```

`-d`が悪でした。

`daemon`に変えましょう。
解決。

`-d`がdeprecatedになったのはどのバージョンからかちょっと追ってませんでしたが、
少なくとも1.10からは`-d`だとDockerをサービス起動できなくなりました、ということで。

あとはこれ

```
sudo systemctl daemon-reload
sudo systemctl start docker
```

## 参考

- [Control and configure Docker with systemd](https://docs.docker.com/engine/admin/systemd/)
gitリポジトリをoriginからpullして複数のremoteにpushする

個人的な備忘録のたぐいです。
試験用やバックアップ的にlan内など複数のremote（VPN経由なgitlab）に同期していたわけですが、手動がダルかったので自動にしましたというだけです。
いまさら感MAXですみません。
（定期で自動で同期しとくとoriginにアクセスできないことがあったときにLAN内のgitlabのブラウザから確認できていいんじゃないかと思いますです）

ラベルつきでリモートを追加

```
# git remote add lan git@gitlab.hoge.net:infra/test.git
# git remote add foreign git@gitlab-hoge-test.net:infra/test2.git
# git remote -v
lan git@gitlab.hoge.net:infra/test.git (fetch)
lan git@gitlab.hoge.net:infra/test.git (push)
origin  git@gitlab.mng.hoge.net:infra/test.git (fetch)
origin  git@gitlab.mng.hoge.net:infra/test.git (push)
foreign       git@gitlab-hoge-test.net:infra/test2.git (fetch)
foreign       git@gitlab-hoge-test.net:infra/test2.git (push)
```

設定かくにん

```
# cat .git/config 
[core]
        repositoryformatversion = 0
        filemode = true
        bare = false
        logallrefupdates = true
[remote "origin"]
        url = git@gitlab.mng.hoge.net:infra/test.git
        fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
        remote = origin
        merge = refs/heads/master
[remote "lan"]
        url = git@gitlab.hoge.net:infra/test.git
        fetch = +refs/heads/*:refs/remotes/lan/*
[remote "foreign"]
        url = git@gitlab-hoge-test.net:infra/test2.git
        fetch = +refs/heads/*:refs/remotes/foreign/*
```

とりあえずpushしてみる

```
# git push lan
# git push foreign
```

手動でやることをそのまま書いたようなスクリプトをつくってみた。
（addしてないやつを自動でするのはキケンな気がするのでしない）

```
# cat /root/git-sync-test.sh 

#!/bin/bash
export PATH=$PATH:/usr/local/bin
GITCMD=/usr/local/bin/git
exec 1> >(logger -p local0.info) 2>&1
cd /var/git-repos/test
${GITCMD} checkout master
${GITCMD} pull origin master
${GITCMD} push lan master
${GITCMD} push foreign master
exit
```

ログ出すだけだと気づかないのでほんとうは失敗したらチャットかなんかに飛んでくるかんじのがいいんでしょうけども。それは今後の課題ということで。
たぶん同期が失敗するのってディスクがあふれたとか壊れたとかネットワーク的な疎通の問題とかくらいですかね。
一回動かしたあとにログをかくにん（きりまわすのまで書くのだるかったので適当にsyslogにだした）

```
# tail /var/log/messages

Feb  9 14:24:42 git01 komi: Already on 'master'
Feb  9 14:24:42 git01 komi: M#011.chef/knife.rb
Feb  9 14:24:45 git01 komi: From gitlab.mng.hoge.net:infra/test
Feb  9 14:24:45 git01 komi:  * branch            master     -> FETCH_HEAD
Feb  9 14:24:45 git01 komi: Already up-to-date.
Feb  9 14:24:46 git01 komi: Everything up-to-date
Feb  9 14:24:53 git01 komi: Everything up-to-date
```

cron登録。jenkinsつかってもいいけどとりあえずここは誰も見える化といいださない気がするのでcronで。

```
# crontab -l|tail -1
30 22 * * 1-5 /root/git-sync-test.sh 
```

rootのcronに登録したらgitコマンドのPATHが通ってなかったのでちょっと修正しました。
あとちょっとスクリプトのおき場所がフリーダムすぎますかね。

参考：
http://bayashi.net/diary/2012/0714
http://qiita.com/h141dev/items/5af16b869248cf0d994e
http://qiita.com/mykysyk@github/items/e5398bc8262d35f4a1b9
CSSで横並びのリストを中央揃えする方法

毎回、意外と困ると話題の横並びのリストを更に中央揃えする方法です。

# 方法

```html
<ul>
  <li>Fantastic</li>
  <li>Internet</li>
  <li>Challenge</li>
  <li>Challenge</li>
</ul>
```

```css
ul {
  font-size: 0;
  text-align: center;
}

li {
  display: inline-block;
  font-size: 12px;
  padding: 0 10px;
}
```

[実際に動いてる様子](http://codepen.io/p1ch_jp/pen/MKzOrQ)
CS-Cart:キャッシュがクリアされない問題

CS-Cartでアドオンを開発しているとキャッシュをクリアすることがありますが、なぜかキャッシュがクリアできない問題に遭遇しました。

CS-Cartのキャッシュクリア機能は最終的にfn.fs.phpの`fn_rm`関数を呼んでいるのですが、実装が「ひとつでもファイル削除失敗したら中断する」ようになっています。中断されても、画面には「お知らせ キャッシュがクリアされました」とあたかもうまくいっているようなフィードバックがありますが、嘘っぱちです(苦笑)。

`fn_rm`関数を見てみましょう。ファイルでだったら`unlink`、ディレクトリだったら子ファイルを再帰呼び出しで`unlink`してからディレクトリを`rmdir`するといった、PHPあるあるなコードになっています。しかし、よく見てみると、ディレクトリ内のファイル削除がひとつでも失敗したら`return false`して処理を中断するようになっています。

```php
/**
 * Recursively remove directory (or just a file)
 *
 * @param string $source
 * @param bool $delete_root
 * @param string $pattern
 * @return bool
 */
function fn_rm($source, $delete_root = true, $pattern = '')
{
    // Simple copy for a file
    if (is_file($source)) {
        $res = true;
        if (empty($pattern) || (!empty($pattern) && preg_match('/' . $pattern . '/', fn_basename($source)))) {
            $res = @unlink($source);
        }

        return $res;
    }

    // Loop through the folder
    if (is_dir($source) && $dir = dir($source)) {
        while (false !== $entry = $dir->read()) {
            // Skip pointers
            if ($entry == '.' || $entry == '..') {
                continue;
            }
             if (fn_rm($source . '/' . $entry, true, $pattern) == false) {
                return false; /* ここで諦めちゃう… */
            }
        }
        // Clean up
        $dir->close();

        return ($delete_root == true && empty($pattern)) ? @rmdir($source) : true;
    } else {
        return false;
    }
}

```

こうなってしまっては画面からのキャッシュクリアはできませんので、コマンドでさくっと削除してしまいましょう。

```
rm -rf var/cache/registry/*
```
Photoshop JSX で特定のレイヤーをまとめたものをアイコン化するために実装したものまとめ

#概要
PSDファイルから特定のレイヤーを指定し、まとめたものをアイコン化するということをスクリプトで自動化する必要があったので、そこで実装したものについて簡易的なコードと注意点等まとめてみました。
# 環境
Windows 8.1(64bit)
Photoshop CC 2015(体験版) 
Adobe Extendscript Toolkit CC 4.0.0.1(コード作成、デバッグ)

# レイヤー名検索
```
var searchStr = new RegExp("arm.*left");
var flag = layerName.match(searchStr);
if (flag)
{
	// layerNameは"arm~left"を含む
	// ex. layerName = arm_hand_left .etc
}
```
String.match()を使用することで、文字列検索に正規表現を使用することができるので便利。

# レイヤー統合
```
activeDocument.mergeVisibleLayers ();
```
対象ドキュメント内の表示されているレイヤーを統合できます。
統合元になるレイヤーは現在アクティブなレイヤーが対象になる点と、表示状態のレイヤーが複数ない場合に実行するとエラーになる点に注意です。

# 複製
``` 
var desc = new ActionDescriptor();
var reg0 = new ActionReference();
reg0.putEnumerated(charIDToTypeID('Lyr '), charIDToTypeID('Ordn'), charIDToTypeID('Trgt'));
desc.putReference(charIDToTypeID('null'), reg0);

var reg1 = new ActionReference();
reg1.putName(charIDToTypeID('Dcmn'), "複製先のドキュメント名");
desc.putReference(charIDToTypeID('T   '), reg1);

executeAction(charIDToTypeID('Dplc'), desc, DialogModes.NO);
```
レイヤー画像の加工をするために別ドキュメントにレイヤーを複製しました。
指定レイヤーを別ドキュメントに複製するための関数が見当たらなかったので、動作をScriptingListener機能で記録して利用。

# 切り出し
```
var cutObj = activeDocument.activeLayer.bounds;
var x1 = cutObj[0];
var y1 = cutObj[1];
var x2 = cutObj[2];
var y2 = cutObj[3];　

docObj.crop([x1, y1, x2, y2]);
```
layer.boudsでレイヤーのピクセルがある範囲を取得し、crop()で指定範囲を切り出します。

# 正方形に調整
```
var sizeX = x2-x1;
var sizeY = y2-y1;
var imageMaxSize = sizeX > sizeY ? sizeX : sizeY;
var scalingNum = (iconSize-margin)/imageMaxSize;
var resizeX = sizeX*scalingNum;
var resizeY = sizeY*scalingNum;

activeDocument.resizeImage(resizeX, resizeY);
activeDocument.resizeCanvas(size, size, AnchorPosition.TOPLEFT);
```
比率が崩れないようにスケーリングします。marginに数値を入れればで余白幅の調整もできます。
resizeImage()で画像、resizeCanvas()でキャンバスのリサイズを行うことができます。

# 保存
```
fileObj = new File(file_path);
pngOpt = new PNGSaveOptions();
pngOpt.interlaced = false;
activeDocument.saveAs(fileObj, pngOpt, true, Extension.LOWERCASE);
```
PNGで保存します。

# おまけ
より便利になるように追加した機能を紹介
### フォルダ選択
```
folderName = Folder.selectDialog ("フォルダを作成する場所を選択して下さい。");
if (folderName != null)
{
  //　OK押した場合
}
```
 folderNameには選択したフォルダ名が入ります。
 キャンセルや閉じるボタンを押した場合、folderNameにはnullが入るので選択した場合のみ進ませたい場合はif文で分岐した方がいいです。

### プログレスバー
```
p_uDlg = new Window('palette','進行度',[100,100,505,180]);
p_uDlg.pBar = p_uDlg.add("progressbar",[10,30,10+384,30+15], 0, 100);
p_uDlg.pBar.value = 0;
p_uDlg.show(); 
```
 プログレスバーを表示できます。valueの数値でバーの値を設定できます。
普段利用するダイアログとほぼ同じですが、Windowのタイプをdialogタイプで利用するとそのウィンドウを閉じないかぎり先に進まないので、ここではpaletteタイプを使用し、表示中でも流れが止まらないようにしています。

### フォルダ作成
```
var folderName = srcDoc.name.split (".")[0];
var folderPath = filePath + folderName + "/";
folderObj = new Folder(folderPath);
var flag = folderObj.exists;
if (!flag) 
{
   // 存在しなければ作成
   folderObj.create();
}
```
パスを指定してフォルダを作成します。folderObj.existsですでに同階層に同名フォルダがないか確認できます。
フォルダ名にドキュメント名を利用していますが、そのままドキュメント名で取得すると拡張子までついてきてしまうのでsplit()で排除しています。
CS-Cartアドオン開発逆引きTips

CS-Cartアドオン開発で役立つかもしれないTips集です。

## 開発着手時に知っておくこと

[installディレクトリの削除をgitで無視する](http://qiita.com/suin/items/74da5ae648389ce94413)
[テンプレート・翻訳・Add-onの更新方法](http://qiita.com/suin/items/5a5925c23d582af73a61)
[CS-Cartでデバッグモードを有効にする](http://qiita.com/suin/items/eab72fb393962487fdca)
[コアの挙動を変える4つの方法まとめ](http://qiita.com/suin/items/aac80c2d07138c7d9f9a)
[PHPフックで呼び出される優先度を指定する](http://qiita.com/suin/items/7b251c65928489a277d3)

## 認証・認可・権限

[ユーザ名でログインできるようにする](http://qiita.com/suin/items/6dd87cec8c0d949602f9)
[現在ユーザのユーザ情報を取得する](http://qiita.com/suin/items/e0048304e9d7c1970da6)
[自前コントローラをアクセス権限制御する](http://qiita.com/suin/items/ca14c4768fc8547df3c1)
[出品者(vendor)に管理画面のコントローラアクセス権限を与える](http://qiita.com/suin/items/69e2aacaba001cd5485f)

## コントローラ・機能追加

[Addonでコントローラを追加して管理画面を作る](http://qiita.com/suin/items/6a0f8323eaa6eac67aca)

## 通知

[通知関数fn_set_notificationの使い方](http://qiita.com/suin/items/a325fe97905ae5e1f6ba)

## DB・SQL

[CS-CartのDBからデータを取得するAPIまとめ](http://qiita.com/suin/items/c0827c71267cb8d3ebe7)
[CS-CartのSQLプレースホルダの挙動](http://qiita.com/suin/items/143d50f2d8b455394daa)
[CS-CartをInnoDB化してトランザクションもやる](http://qiita.com/suin/items/88a25fdc23450b8340ec)

## テンプレート

### 共通

[CS-Cartのテンプレートキャッシュを更新する](http://qiita.com/suin/items/820c1381a5e1c6591896)
[CS-Cartでタイムスタンプを日付フォーマットにして表示する方法](http://qiita.com/suin/items/848998689e9dae351028)
[Smartyでグローバルに使える変数を追加する](http://qiita.com/suin/items/cdf67fcdfcf28363f7cc)
[Smartyプラグインを追加する方法](http://qiita.com/suin/items/ceeddf41ba201322107a)
[Add-onでコアのテンプレートを上書き(override)する](http://qiita.com/suin/items/042fbc0c56b2a5b28303)
[ブロックのキャッシュを無効にする](http://qiita.com/suin/items/269bf7ed77ef36e9be3a)

### フロントエンド

[frontendのページタイトルを設定する](http://qiita.com/suin/items/074a43d34a4e2aad42de)
[ボタンコンポーネントを使う](http://qiita.com/suin/items/66597d51a2f250aaac7a)
[タブコンポーネントを使う](http://qiita.com/suin/items/3cd9476983615098b27a)
[商品リスト形式のテンプレートまとめ](http://qiita.com/suin/items/8fff332b3308e07a4b10)

### バックエンド

[管理画面にメニューを追加する方法](http://qiita.com/suin/items/27d5b40d6d74dc4ce06b)
[ステータスを表示だけする方法(選択・変更できないようにする)](http://qiita.com/suin/items/fc720e2994ed022e0b63)
[管理画面で独自のバリデータを定義する](http://qiita.com/cscartjp/items/532aac9f45e486b015f0)


## アセット(JavaScript・CSS・画像)

[AddonのJavaScriptをリロードで反映するようにする](http://qiita.com/suin/items/cb70e6cbf8bfe0705153)
[全ページでJavaScriptを読み込みたい](http://qiita.com/suin/items/0d3e970c4d607bb1ad8a)
[AddonにJSやCSSファイルを同梱する](http://qiita.com/suin/items/ed5fda742593f317a8b0)
[アドオンの画像を配置する場所と画像の表示方法](http://qiita.com/suin/items/66fd40acd8a69dae2c61)

## 多言語対応・翻訳

[翻訳の文中に変数を使う](http://qiita.com/suin/items/11bc54af2163dd5af2bf)
[日本語版は「姓」がfirst name「名」がlast nameになっている](http://qiita.com/suin/items/691a146fda0f7dc004d0)
[CS-Cartの言語変数.poファイル更新を適用する方法](http://qiita.com/suin/items/b39466012777a524f253)

## セキュリティ

[CSRF対策のsecurity_hashを取得するAPI](http://qiita.com/suin/items/2b553643ac798f5bcda2)

## デバッグ

[エラーをログに出したり、Slackに通知したりする](http://qiita.com/suin/items/cf348b08b6023b7638b2)
[デバッグ用にメールの送信先を固定する](http://qiita.com/suin/items/431f8baa879ecf7c7a7b)
[コントローラにPOSTするために最低限必要なリクエスト](http://qiita.com/suin/items/8d90cc777d127cc38edb)

## トラブルシューティング

[キャッシュがクリアされない問題](http://qiita.com/suin/items/2801e2715a2c4eab15ce)
iOSのTwitterログインのパターンまとめ

# これはなに？
- 社内でエンジニア以外にも説明する必要があるのでまとめた
- Twitterアカウントの有無で画面遷移が色々と変わるのでまとめておく
- 誰かの役に立つかもしれないのでQiitaに投稿

# 使用するライブラリ
- FabricのTwitterKitを使用する
- Social.FrameworkやAccounts.Frameworkでも多分だいたい一緒だと思う（確認はしてないけど）
- ホームの設定 > Twitter でTwitterの設定画面へ行ける
- Accounts.Framework だとTokenとTokenSecretがとれないが、Fabricだと取れるので表示した

```objc:ViewController.m
NSString *message = [NSString stringWithFormat:@"userName:(@%@) \n\n userID:(%@) \n\n Token:(%@) \n\n TokenSecret:(%@)",
                     [session userName],
                     [session userID],
                     [session authToken],
                     [session authTokenSecret]];

UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Success to login"
                                                message:message
                                               delegate:nil
                                      cancelButtonTitle:@"OK"
                                      otherButtonTitles:nil];
[alert show];
```


### サインアップ（初回登録）

- 初回登録時には、必ずアクセスの許可を求められる
- 「許可しない」を押した場合、Twitterの設定の「アカウントの使用を許可するAPP」がOFFで登録される
- 「アカウントの使用を許可するAPP」がOFFだと、次回以降もユーザー名とパスワードを求められる

####  1. ユーザーのiPhoneにTwitterアカウントが１つだけある

![1.jpeg](https://qiita-image-store.s3.amazonaws.com/0/37385/9051ffcd-5035-d4e0-fdf5-420336285910.jpeg)



####  2. ユーザーのiPhoneにTwitterアカウントが複数ある

![2.jpeg](https://qiita-image-store.s3.amazonaws.com/0/37385/be071621-c6c0-b112-fa3e-ec3b7d46a5dd.jpeg)


####  3. ユーザーのiPhoneにTwitterアカウントがない

![3.jpeg](https://qiita-image-store.s3.amazonaws.com/0/37385/13d33abc-fb67-3394-bfe2-d47005fbaf3c.jpeg)


### サインイン（２回目以降）

- **設定画面でOFFをONに切り替えないと、ずっとユーザー名とパスワードを求めれる**

####  4. アカウントの使用を許可するAPPで、対象のアプリがON

![4.jpeg](https://qiita-image-store.s3.amazonaws.com/0/37385/a082479c-8a31-c561-dc48-6e5f040b4298.jpeg)



####  5. アカウントの使用を許可するAPPで、対象のアプリがOFF

![5.jpeg](https://qiita-image-store.s3.amazonaws.com/0/37385/b6a36255-ee31-88d6-102f-4d416c989787.jpeg)
【CSS】ボタンを作成するときはこれをコピペすればOK!!汎用的なボタンのコード




ボタンって沢山使う箇所があるのでできるだけCSSは汎用的に使いたいなあ〜って思ったので作成。

コンポーネントとして捉えるのは大切。

```html

<div class="l-btn">
	<a class="btn btn--normal btn--info" href="">
		お申し込みはこちら
	</a>
</div>

```

```css

.l-btn {
  text-align: center;
}

.btn {
  display: inline-block;
  text-align: center;
  cursor: pointer;
  vertical-align: middle;
}

/* Size */
.btn--normal {
  font-size: 1.4rem;
  padding: 10px 40px;
}

/* Color */
.btn--info {
  color: #FFF;
  background-color: blue;
}


```


何をしたかというと、
CSSでスタイルをつけるときの **見た目と構造の分離** ですね。

位置を変えたいときは

```css

.l-btn {
  text-align: center;
}
```

サイズを変えたいときは下記をいじって

```css
/* Size */
.btn--normal {
  font-size: 1.4rem;
  padding: 10px 40px;
}

```

色を変えたいときは下記をいじる

```css
/* Color */
.btn--info {
  color: #FFF;
  background-color: blue;
}
```


##まとめ
汎用的な使用が期待される部品はできるだけ分離して、再利用できる形にしておくべし。
UIStoryboardからViewControllerをロードするときにenumとprotocolとextensionを使ってカッコよくやる方法

# よくあるやり方

```swift
let name = "Main"
let identifier = "ArticleViewController"
let storyboard = UIStoryboard(name: name, bundle: nil)
let viewController = storyboard.instantiateViewControllerWithIdentifier(identifier) as! ArticleViewController
```

- このまま乱立すると、nameやidentifierの管理コストがひどい
- `as!` でキャストするのはswiftでコード書いてると気持ち悪い感が。。

# こういうふうに書けるようにできます

```swift
let storyboard = UIStoryboard(storyboard: .Main)
let viewController: ArticleViewController = storyboard.instantiateViewController()
```

# 定義方法

Storyboardのidentifierをプロパティとしてもつprotocolを定義します。

```swift
protocol StoryboardIdentifiable {
    static var storyboardIdentifier: String { get }
}
```

protocol extensionで初期値はUIViewControllerのクラス名がidentifierとなるように定義します。
そのため、Storyboard IDは定義しているViewControllerと同じ名前を使うようにしてください。（一番上の例だと`Storyboard ID = "ArticleViewController"` となります)

```swift
extension StoryboardIdentifiable where Self: UIViewController {
    static var storyboardIdentifier: String {
        return String(self)
    }
}
```

UIViewControllerにStoryboardIdentifiableを適合させます。

```swift
extension UIViewController: StoryboardIdentifiable { }
```

UIStoryboardを拡張します。

```swift
extension UIStoryboard {
    // アプリ内で作成されているStoryboardの名前をenumで定義します
    enum Storyboard: String {
        case Main
        case News
        case Favorite
    }

    // 上で定義したenumでinitできるように
    convenience init(storyboard: Storyboard, bundle: NSBundle? = nil) {
        self.init(name: storyboard.rawValue, bundle: bundle)
    }

    // StoryboardIdenfiableプロトコルに適合してるUIViewControllerのみ
    func instantiateViewController<T: UIViewController where T: StoryboardIdentifiable>() -> T {
        // ジェネリクスでプロトコルに適合してるのは保証される
        let optionalViewController = self.instantiateViewControllerWithIdentifier(T.storyboardIdentifier)

        guard let viewController = optionalViewController as? T else {
            fatalError("something error")
        }

        return viewController
    }
}
```

UIViewControllerの継承はいつも通りで使えるようになります。

```swift
class ArticleViewController: UIViewController { }
```

# 参考リンク

[UIStoryboard: Safer with Enums, Protocol Extensions and Generics — Swift Programming — Medium](https://medium.com/swift-programming/uistoryboard-safer-with-enums-protocol-extensions-and-generics-7aad3883b44d#.mk21kppi4)
SwiftGen等のBuild Phaseで生成される値を用いる際、毎回Buildを先に通しておくのが面倒な時

最近、iOSアプリの実装でリソースをタイプセーフに扱いたいという理由で[SwiftGen](https://github.com/AliSoftware/SwiftGen)を導入しました

# SwiftGenについて
ざっくり説明すると

- Assets Catalogs
- Localizable.strings
- storyboard
- UIColor

などのリソースを自動でenumへ変換し、利用時に補完してくれたり誤字を防いでくれたりするものです

XcodeのBuild Phasesに変換用のScriptを追加しておけば、ビルド時に毎回指定のリソースを読み取り、enumを記述したファイルを自動生成してくれるというスグレモノです

# Buildされないとenumが使えない
Build Phasesに書いたScriptは、書いたコードのBuildが通った後に実行されます

つまり

コーディング中 | → | 書いたコードのBuildがSuccess | → | Build PhasesのScript実行
:---: | :---: | :---: | --- | :---:
enumを使えない | | | | enum生成

という状態になります

一度自動生成の値を使わないコードを書き、Buildを通してから初めて使えるようになる為、二度手間になります

# BuildがFailedしてもBuild PhasesのScriptを実行
毎回
「Buildが通る状態にしてからBuildし、Build PhasesのScriptを実行させることでenumを生成」
なんてことをするのは面倒です

そこで、Xcodeの設定を使い、Buildが途中でFailedしても最後まで実行してくれるようにします

1. XcodeのPreferencesから
![スクリーンショット_0028-02-09_14_36_29.png](https://qiita-image-store.s3.amazonaws.com/0/69585/488fa621-a79c-e406-08de-daf1a727cc59.png)

1. GeneralのIssuesにあるContinue building after errorsにチェックを入れるだけです！
![スクリーンショット_0028-02-09_14_36_45.png](https://qiita-image-store.s3.amazonaws.com/0/69585/bda36059-e930-4c82-a210-f46c8dfed8e2.png)

以上で、エラーがあっても強制的にBuildを継続し、Scriptを実行することでenum等の値を生成することができるようになりました
サーバーや仮想環境等とgithubを鍵認証で連携させる

#記事の目次
[VirtualBox+CentOS7（+Windows）でruby on railsの開発環境を作るのまとめ](http://qiita.com/daraxuma04/items/5fd160a462e48c11a773)

***

- githubに鍵を登録し、連携させます。
 - 基本は上記で作成した仮想環境ベースですが、その他環境でも同じかと思います（たぶん）

***

#認証鍵を生成する
## 以下仮想環境ssh接続したコマンドで作業

- .sshディレクトリへ移動
 - ない場合は、自身のディレクトリ直下に作成する
<pre>
mkdir ~/.ssh
chmod 700 ~/.ssh
</pre>

- 鍵を生成する
 - 生成する場所は.ssh以下であれば、更にディレクトリを作成しても良いかと思います。
<pre>
ssh-keygen -t rsa -C "[メアド]" -f [鍵のファイル名]
</pre>

- パスフレーズ（鍵のパスワードみたいなもの）の入力を求められるので入力してEnter
- 確認にもう一度入力することを求められるので、再度入力してEnter
 - 入力内容は画面に表示されません
<br />
<br />
- 『[鍵のファイル名]』と『[鍵のファイル名.pub]』ができます。
- [鍵のファイル名]のみのファイルは秘密鍵となりますので、外部への公開等しないよう十分注意して下さい。
 - 仮想環境のイメージを出力して、それを配るとかすんなよって話
<br />
<br />
- 秘密鍵の権限を変更する
<pre>
chmod 600 [鍵のファイル名]
</pre>
<br />
- 公開鍵（.pubファイル）の情報をコピーする
 - 表示された『ssh-rsa...[メアド]』の部分までをコピーしておく。
<pre>
cat [ファイル名].pub
</pre>

***

#githubに鍵を登録する
## ここからホスト側のブラウザにて作業

1. githubにログインし、右上の自アイコンクリック⇒settingを選択
2. Personal settingsのメニューから、SSH keysを選択
3. 表示された画面の右上にある、『New SSH key』を選択
 - 表示されたフォームに、以下の情報を入力
<pre>
title：任意な文字列
Key：上記.pubファイルのコピーした内容をペースト
</pre>

- 『Add SSH key』を選択
 - githubのパスワードを求められるので、入力する 

- 戻ってきた画面に、指定したtitleで鍵が登録されていることが確認できればOK

***

#githubにssh接続する
## 再度仮想環境に戻ります

- 設定ファイルを作成する
 - なければ新規に作成する
<pre>
vi ~/.ssh/config
</pre>
<pre>
#-----------ここから-----------
Host github-testconnect
 User git
 Port 22
 HostName github.com
 IdentityFile ~/.ssh/[秘密鍵ファイル名]
 TCPKeepAlive yes
 IdentitiesOnly yes
#-----------ここまで-----------
</pre>

- configファイルの権限を変更する
<pre>
chmod 600 ~/.ssh/config
</pre>

- githubへのssh接続テスト
<pre>
ssh -T github-testconnect
</pre>

- 入力後、以下が表示されたら、『yes』を入力してEnter
<pre>
Are you sure you want to continue connecting (yes/no)?
</pre>
- 問題なく接続されたら鍵のパスフレーズ入力を求められるので、先に設定したパスフレーズを入力してEnter
- その後以下が表示されたら接続OK
 - githubのSSH keysの登録した鍵の項目にも、緑のチェックがつくようになります
<pre>
Hi [githubアカウント名]! You've successfully authenticated, but GitHub does not provide shell access.
</pre>


# クローンする
- クローンする際に指定の鍵を読み込ませる必要があるので、configでgithubを登録します。
<pre>#-----------ここから-----------
Host github.com
  IdentityFile ~/.ssh/[秘密鍵ファイル名]
#-----------ここまで-----------</pre>

- クローンするディレクトリに移動して、クローンする
<pre>
git clone git@github.com:xxxx/xxxx.git
</pre>
- パスフレーズの入力を求められるので、入力してEnter
 - 問題がなければ、該当のリポジトリからクローンができます

***
#ssh-agentを使ってパスフレーズをスルーする
- pullする時等、常にパスフレーズの入力を求められるのはめんどくさい。
 - ということで、ssh-agentを使って認証をスルーできるようにする

1. PIDを環境変数に登録する
<pre>eval \`ssh-agent\`
echo $SSH_AUTH_SOCK
</pre>

2. ログイン時にssh-agentを起動させる
<pre>echo 'eval \`ssh-agent\`' >> ~/.bash_profile
echo 'ssh-add ~/.ssh/[秘密鍵ファイル名]' >> ~/.bash_profile
</pre>

3. ログアウト時にssh-agentをkillするようにする。
<pre>
echo 'ssh-agent -k' >> ~/.bash_logout
</pre>

- この後仮想環境にログインする時、パスフレーズの入力を求められるので入力してEnter
 - これでログイン中は、パスフレーズの入力を求められなくなります。