OmniAICreator/Qiita-1.07M huggingface dataset:
Pythonでローカルのメモ（日記帳）を表示検索するアプリケーション



長らくプログラミングから離れていたけど何か作りたい欲求が限界に達したので
自分で作る意味もたいしてないけど
ちょうどいいリハビリ，もとい練習になりそうだったので作り始める．



実現しようと思っていること（予定）は以下のとおり．
-あるディレクトリ配下のファイルを一覧表示(中身も表示)できる
-キーワード（正規表現）検索が可能
-結果についてはGUIで表示（WEBブラウザ表示でも良いか？）



まだGUI部分は全くできていないが検索するところまではできた．
構成は今のところこんな感じ．

|ソースファイル|ファンクション|
|:--|:--|
|AxMemoBrowser.py|本体．exe化などした際に呼び出す|
|PyCMemo.py|CUI周りのコマンド相当は実装するクラス|
|PyCBrowser.py|GUI周りを実装するクラス|
|PyCSearchResult.py|検索結果を保存するためのクラス|




それぞれ以下のとおり実装．
不慣れなのでもっと良い実装方法はいくらでもありそう．

```AxMemoBrowser.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
'''
Created on 2014/11/26

@author: kuromame
'''
from PyCMemo import PyCMemo

#cmemo = PyCMemo("/Users/kuromame/Desktop");
cmemo = PyCMemo();

#cmemo.ReadDir();
cmemo.SearchString("変数");

```

```PyCMemo.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
'''
Created on 2014/11/26

@author: kuromame
'''

#必要モジュールのインポート
import os;
import sys;
import re;
import codecs;


class PyCMemo:
    def __init__(self,root_dir=''):
        #クラスメンバの初期化
        print('[PyCMemo.__init__]');
        self.pwd = '';                  #検索時のrootディレクトリ
        self.file_list = [];            #検索したファイル一覧
        self.pattern = [];              #検索ワード(正規表現可能)．リスト形式で最後尾が最新の検索ワード．
        self.isRead = 0;                #一度でも検索したかの確認用フラグ
        #カレントディレクトリ or 指定ディレクトリを指定する
        if root_dir != '':              
            self.pwd = root_dir;
        else:
            self.pwd = '';                  

    def ReadDir(self):
        #変数の初期化
        print('[PyCMemo.ReadDir]');
        if self.pwd == '':
            self.pwd = os.path.abspath(os.path.dirname(__file__));
        print(self.pwd);
        #カレントディレクト以下を探索．
        #トップダウンで検索する．
        for root, dirs, files in os.walk(self.pwd):
            for file_ in files:
                full_path = os.path.join(root, file_);
                self.file_list.append(full_path);
                print(full_path);
        #検索結果をソート
        self.file_list.sort();
        #print(self.file_list);
                
    def SearchString(self,pattern):
        #変数の初期化
        print('[PyCMemo.SearchString]');
        self.pattern.append(pattern);
        #正規表現の検索エンジンの初期化
        ptn = re.compile(self.pattern[-1]);
        #一度でもファイルを読んでいない場合はReadDirを呼び出す
        if self.isRead == 0: self.ReadDir(),
        self.isRead = 1;
        #再帰的にファイルを探索
        for fname in self.file_list:
            print('=検索開始=');
            print(fname);
            try:
                fp = codecs.open(fname,'r','utf-8');
                line_num = 1;
                try:
                    for line in fp.readlines():
                        if ptn.search(line): print(fname,line_num,line),
                        line_num += 1;
                        #print(fname,line_num);
                except UnicodeDecodeError:
                    print("エンコードエラーで検索できませんでした．")
                finally:
                    #想定外は何もしない．(本来は例外をスローするなどの工夫が必要)
                    pass
            finally:
                fp.close();
                print('=検索終了=')
    
                    
```





ちなみに今回から練習でGitHubにコードをおくようにした．
https://github.com/ambitious-kuromame/AxMemoBrowser
UnityでAndroid向けバイナリをビルドするときに「Error building Player: Win32Exception: ApplicationName='/Applications/android-sdk-macosx/tools/zipalign'」が発生する

UnityでAndroid向けのapkをビルドすると、

<pre>
Error building Player: Win32Exception: ApplicationName='/Applications/android-sdk-macosx/tools/zipalign', CommandLine='4 〜
</pre>

というエラーが出る。
macでもWin32Exceptionと出る。

zipalignの位置が変わってしまっているようなので、
「アプリケーション」の下にある、「android-sdk-macosx/build-tools/20.0.0/zipalign」を「android-sdk-macosx/tools/zipalign」にコピーしてやると解決する。
RailsアプリにBootstrapを適用させる

対象となるGemfileに以下を追記する。

gem 'bootstrap-sass', '~> 3.3.1'
<blockquote>
<b>gemfile</b>
<code>
...

  gem 'bootstrap-sass', '~> 2.3.1.0'

...</code>
</blockquote>
追記し終わったらgemの更新
<blockquote>$ bundle install</blockquote>

次にmain.css.sassに@import "bootstrap";を追加する。
<blockquote>
<b>app/assets/stylesheets/main.css.sass</b>


<code>// Place all the styles related to the Main controller here.
// They will automatically be included in application.css.
// You can use Sass (SCSS) here: http://sass-lang.com/

@import "bootstrap";
</code>
</blockquote>

application.jsにrequire Bootstrapを追加

<blockquote><b>app/assets/javascripts/application.js</b>

<code>//= require jquery
//= require jquery_ujs
//= require bootstrap
//= require angular
</code>
[MacOS X]MySQLで日本語データを扱う為の設定


まえがき：
既にこの手の投稿はいくつもありますが
自分の環境の覚え書きとして残しておきます。

```text:<strong>確認した環境</strong>
Mac OS X Yosemite バージョン　10.10.1
MySQL バージョン　5.6.21
```

1.my-default.cnfをmy.cnfという名前に変更して/etcにコピー

```text:terminal
sudo cp /usr/local/mysql/support-files/my-default.cnf /etc/my.cnf
```

2.コピーしたmy.cnfにcharacter-set-serverを追加

```text:my.cnf
[mysqld]
character-set-server = utf8
```

3.mySqlを起動しcharacter-setを確認
（初期値としてlatin1になっていた部分がutf8になっていればOK）

```text:mysql
mysql>show variables like 'char%';
+--------------------------+-----------------------------------------------------------------+
| Variable_name            | Value                                                           |
+--------------------------+-----------------------------------------------------------------+
| character_set_client     | utf8                                                            |
| character_set_connection | utf8                                                            |
| character_set_database   | utf8                                                            |
| character_set_filesystem | binary                                                          |
| character_set_results    | utf8                                                            |
| character_set_server     | utf8                                                            |
| character_set_system     | utf8                                                            |
| character_sets_dir       | /usr/local/mysql-advanced-5.6.21-osx10.8-x86_64/share/charsets/ |
+--------------------------+-----------------------------------------------------------------+
8 rows in set (0.00 sec)
```

参考にしたサイトは色々ありますが
環境の違い（バージョンの違い）で動作せず…。
（恐らく公式サイトの英語を熟読すれば直ぐに分かった…のかも？）

結局、私の環境では一行追加するだけでした。
（一行追加するだけで他のcharacter−setもutf8になった。）

create tableする時に
DEFAULT CHARACTER SET utf8
を付けるというのもありますが、毎回やるのは面倒ですね。

余談：こんなのより、アンインストールする方がハマります。
あれ？システム環境設定のMySQLが消えてくれないじゃん！とか…。
Mac初心者なので知らないだけなんですけどね。

以上、kobitoから投稿テスト（初投稿）でした。
httpieを使った、AWSが利用しているIPアドレス取得コマンド

[AWSが利用しているIPアドレスを取り出してみた](http://qiita.com/SatoHiroyuki/items/5d77f6e7219016a639a6 "AWSが利用しているIPアドレスを取り出してみた")を参考に、普段私が使っている[httpie](https://github.com/jakubroztocil/httpie "httpie")だとどうやるか書いてみました。

## 
## コマンド例
- 全てのリージョンのレンジIPを取得

Serviceには、現在以下の項目が入ります。これ以外は順次追加されていくそうです。

- "AMAZON"
- "EC2"
- "ROUTE53"
- "ROUTE53_HEALTHCHECKS"
- "CLOUDFRONT"

```
http https://ip-ranges.amazonaws.com/ip-ranges.json | jq '.prefixes[] | if .service == " INPUT SEVICE KEY " then .ip_prefix else empty end'
```

- 指定のサービス＆リージョンのレンジIPを取得

ここでは、東京リージョンのEC2で使用しているIPアドレスを取得します。

```
http https://ip-ranges.amazonaws.com/ip-ranges.json | jq '.prefixes[] | if .service == "EC2" and .region == "ap-northeast-1" then .ip_prefix else empty end'
css：cssだけで画像をトリミング表示する。

●background-positionで表示位置を指定する。

```
<div style="height:100px;width:200px; background-image:url('画像ファイルパス'); background-size:auto; background-position:-406px -77px;"></div>
```


●画像を拡大・縮小しつつ位置を指定する。

```
<div style="height:100px;width:200px; background-image:url('画像ファイルパス'); background-size:3000px 3000px; background-position:-406px -77px;"></div>
```

⇒これを応用するとイメージの拡大・縮小をjsで実装可能。
pritunlでCentOSにVPNサーバー構築


## 環境
server: CentOS7
client: OSX

## pritunlとは
VPNサーバーを構築・管理するためのOSSで、ブラウザ上で設定・グループ、ユーザー管理ができます。詳しくは公式サイトで。

[pritunl](http://pritunl.com/)
 

## セットアップ
CentOS7用のrpmが用意されているのでダウンロードしてインストール。起動後、サーバー起動時に起動するように設定。

```bash
wget http://pritunl.com/bin/pritunl-0.10.12-1.el7.centos.x86_64.rpm
yum install -y pritunl-*.rpm
systemctl start pritunl.service
systemctl enable pritunl.service
```

## 設定
次にブラウザ上でVPN情報を設定していきます。デフォルトの解放ポートは9700なので以下にアクセス。
https://＜Your server address＞:9700

初回ID・パスワード
- id: admin
- pass: admin


### グループを設定
`Users`タブへ移動し、グループを追加します。名前は何でも大丈夫です。


### ユーザを設定
`Add user`をクリックしてユーザーを追加します。
ここで先ほど追加したグループを設定します。

### サーバーを設定
`Serves`タブに移動し、`Add Server`ボタンをクリック。サーバーの設定項目が表示されるので環境に合わせて設定します。

主に変更する箇所

|項目|内容|
|:--|:--|
|Name(任意)|管理上のサーバー名前|
|Port(任意)|VPN接続時に用いるポート番号|
|Public IP|サーバーのIP|

サーバーの追加が終わったら`Attach Organization`ボタンをクリックし、VPNサーバーとグループを紐付けし、`Start Server`でサーバーを起動させます。

### 設定ファイルをダウンロード
`Users`タブに戻り、ユーザー横の矢印アイコンをクリックしVPN設定ファイルをダウンロードしておきます。

## 接続確認
VPNクライアントツールを用いたVPN接続についての説明は省略します。下記サイトを参考にして下さい。

['OpenVPN プロトコルを用いた VPN Gate への接続方法'](http://www.vpngate.net/ja/howto_openvpn.aspx)


VPN接続が完了したら、プライベートIPにて接続出来ていることが確認できます。

```bash
$ ping 192.168.10.3
PING 192.168.10.3 (192.168.10.3): 56 data bytes
64 bytes from 192.168.10.3: icmp_seq=0 ttl=64 time=9.087 ms
```
テーブルの比較で、カラムの値を結合して比較

※そのうちちゃんと書くかも。とりあえずメモ書き。
※わかりやすいタイトル募集...。

## やりたいこと
以下の様なテーブルがあるときに、テーブルAとテーブルBを比較して、テーブルAにしか無いレコードを抽出したい。

## テーブル構成
- テーブルA(table_a)
    - a_id
    - a_name
    - a_item_id
    - a_code
        - (↑ここにはb_x, b_y, b_zを単純に結合した文字列が入っている。)
- テーブルB(table_b)
    - b_id
    - b_item_name
    - b_item_no
    - b_x
    - b_y
    - b_z

## 答え
### その1
- `outer join`を使って、くっつけた側のレコードがnullでは無いものを取り出す。
    - `left outer join` なら、くっつけた側（join句の方）のレコードが存在しないレコードが取れる。
    - `right outer join` なら、くっつけられた側（from句の方）が存在しないレコードが取れる。
    - `full outer join` はMySQLだと対応してないけど、くっつけた側にしか無いレコードもくっつけられた側にしか無いレコードも両方取れるらしい。
    - ※ところで`outer`って書いても書かなくても同じ？
- on句の条件で`concat`を使って、カラムの値をくっつける。
    - `||(パイプ)`を使っても良い。但し設定次第ではパイプが使えないこともあるらしい。

```sql
SELECT
  *
FROM
  table_a
  LEFT OUTER JOIN
    table_b
  ON
    (a_item_id = b_item_no and a_code = concat(b_x, b_y, b_z))
WHERE
  b.item_no IS NULL;
```

たぶんこんな感じ。

### その2
[Facebook経由](https://www.facebook.com/kurosuke.freedom/posts/10202017886647265?comment_id=10202019192039899)で

> 単純に「table_aにしかないデータを取りたい」のなら、`exists`句を使うのはどうですか？
> （元が SELECT * なので、not existsにすると結果セットにtable_bのカラムが出てきませんが……）

と教えていただきました！

```sql
SELECT
  *
FROM
  table_a
WHERE
  NOT EXISTS (
    SELECT
      NULL
    FROM
      table_b
    WHERE
      a_item_id = b_item_no
      and a_code = concat(b_x, b_y, b_z)
  )
;
```

なるほど、こういう方法もあるのですね！
ありがとうございます！

（もっと勉強せねば...。）
[Unity] MonoDevelop で日本語入力できるようにしよう

こんにちは, Unity 初心者の @phi です.

ちょこちょこ英語でコメント書いてたのですが, そろそろ自分の英語力では限界だったので
@[pkaichi](http://twitter.com/pkaichi) san に教えを乞うたところ『[Unityユーザー助け合い所](https://www.facebook.com/groups/unityuserj/)』 なる Facebook Group で日本語入力できる MonoDevelop が配布されているという情報を頂いたので早速導入してみました.

※日本語IME出来るMonoDevelop-Unityを配布されている [鯡 マイケル](https://www.facebook.com/khakionion?fref=nf) さんに確認の上, このエントリーを書いております!!

## インストール

1. MonoDevelop 日本語入力可能バージョンを [**こちら**](https://docs.google.com/uc?id=0B9jnC6pOXILnaHVJLW83aGxQYlE&export=download) からダウンロード
2. ダウンロードしたら .dmg ダブルクリック起動して MonoDevelop を Application フォルダに移動
3. ( MonoDevelop インストール done! )
4. MonoDevelop を起動しようとすると MRE 入れろと怒られます
5. MRE を[**こちら**](http://www.mono-project.com/download/) からダウンロード&インストール
6. ( MonoDevelop 起動できるようになります:D )


## Unity 導入手順

Unity のメニューにある

[Unity] -> [Preferences...]

をクリック.

![ss.png](https://qiita-image-store.s3.amazonaws.com/0/7756/1f1470bf-bc90-bf54-a552-14c41e0d5e8b.png)

[External Tools] -> [External Script Editor]

が MonoDevelop (build-in) になっているので
これを先ほど選択した MonoDevelop に変更してください.

これでデフォルトのエディタが日本語入力のできる MonoDevelop に切り替わりますo(＾∇＾)o

![ss2.png](https://qiita-image-store.s3.amazonaws.com/0/7756/5366c4c8-87ad-5102-9802-b4f9c49eba40.png)


もちろん『痛Monodevelop』も知っているのですが正攻法じゃない気がしまして...
Xamarin studio? また今度ね♪

以上, 備忘録でしたmm
Movable TypeとJSONを使い記事を2週間のみ表示させる方法

前回、[Movable Typeでカスタムフィールドで表示するNew画像を2週間のみ表示させる方法](http://qiita.com/redamoon/items/d5aa32a1b3d988874a76)という記事をあげたのですが、追加要望が発生したためカスタマイズを試みました。

検証や実装イメージを二日間くらい考えた結果、今日ひらめき実装したらできたので忘れないためメモになります。



# 要件

* ブログ記事を静的で管理しているページに記事一覧へ表示
* 14日後には、自動的に非表示
* 静的側で記事をスライダー表示（今回は割愛）
* 入力したテキスト文字が枠から飛び出ないように、文字制限処理（今回は割愛）

# バージョン

* MTバージョン：5.02
* jQueryバージョン：1.4系（静的ページで管理している部分）

# 実装の洗い出し

* MT記事をjsonで書き出し
* jsonを静的側に呼び出し
* 公開日の値を拾い、14日で自動的に消えるようにjavascript・jQueryで制御
* jsonの値を使い、自作またはプラグインでスライダー処理を実装
* 文字制限処理（MTでもよかった気がするけど、javascript・jQuery制御）

## JSON

このコードでも大丈夫ですが、ダブルクォーテーションなどが入ったりしてJSONが壊れてしまう可能性があるためto_jsonを使用するように変更致しました。



* ~~MTのブログ内にJSONを記述~~
* ~~通常通りMTEntriesを使い、jsonを生成~~
* ~~MTEntryDateで値（formatは下記コードのようにします）~~

``` json
[
<mt:Entries>{
"title": "<$mt:EntryTitle$>",
"date": "<$mt:EntryDate format="%Y年%m月%d日 %H時%M分%S秒"$>"
}<MTIf name="__last__"><MTElse>,</MTElse></MTIf></mt:Entries>
]​​
```

##### 下記に変更

* エスケープ処理などをMT側で制御してくれる

```json
<mt:SetVar name="entries" function="undef" />
<mt:Entries>
    <mt:SetVar name="e" function="undef" />
    <mt:SetHashVar name="e">
        <mt:EntryTitle setvar="title">
        <$mt:EntryDate format="%Y年%m月%d日 %H時%M分%S秒" setvar="date"$>
    </mt:SetHashVar>
    <mt:EntryID setvar="id" />
    <mt:SetVar name="entries" key="$id" value="$e" />
</mt:Entries>
<mt:Var name="entries" to_json="1" />​
```

## javascript・jQuery

* getJSONで該当のパス名を記述（index.json部分）
* 変数currentDateで現在の日を取得
* ループパスの中に入っている部分は、[一定時間で自動的に消える New マークを付ける JavaScript の jQuery 版](http://www.tinybeans.net/blog/2008/09/25-062812.html)を参考
* 変数itemHTMLでは、パース用のHTMLとして変数へ

``` javascript
$.getJSON("index.json", function(index){
  var currentDate = new Date();
  for(var i in index){
    var pass = 336;
    var newmarkAttr = index[i].date;
    newmarkAttr = newmarkAttr.replace(/年|月|日|時|分/g,':');
    newmarkAttr = newmarkAttr.replace(/\s|秒.*/g,'');
    var time = newmarkAttr.split(":");
    var entryDate = new Date(time[0], time[1]-1, time[2], time[3], time[4], time[5]);
    var now = (currentDate.getTime() - entryDate.getTime())/(60*60*1000);
    now = Math.ceil(now);
    var itemHTML = '<div class="box"><ul><li>' + index[i].title + '</li></ul>' + '<p>' + index[i].date + '<p>' + '<div>';
    if(now <= pass){
      $("#output").append(itemHTML);
    }
  }
});
```

取り急ぎのメモになります。
こういったJSONをつかって〜・・や日付の値つかって〜・・って処理は得意じゃない分、現場で必要になるな思いました。（正規表現は特に必要）
基底クラスのstaticメンバ変数を継承先のクラスで書き換えると、別クラスのインスタンスにも影響する

基底クラスのstaticメンバ変数を複数のクラスから利用し、それを変更すると他のクラスにも影響します。

```php
<?php
class base {
  protected static $super_value = "super value\n";
  public function printValue() {
    echo self::$super_value;
  }
}

class extClassA extends base {
}

class extClassB extends base {
  public function setValue($value) {
    self::$super_value = $value;
  }
}

$obj_a = new extClassA();
$obj_a->printValue();              // print "super value"

$obj_b = new extClassB();
$obj_b->printValue();              // print "super value"
$obj_b->setValue("NEW value\n");
$obj_b->printValue();              // print "NEW value"

$obj_a->printValue();              // print "NEW value" ...先にインスタンス化されていてもstatic変数は影響を受ける。
```

これをstaticメソッド化したものも挙動は同様です。

```php
<?php
class base {
  protected static $super_value = "super value\n";
  public static function printValue() {
    echo self::$super_value;
  }
}

class extClassA extends base {
}

class extClassB extends base {
  public static function setValue($value) {
    self::$super_value = $value;
  }
}

extClassA::printValue();              // print "super value"

extClassB::printValue();              // print "super value"
extClassB::setValue("NEW value\n");
extClassB::printValue();              // print "NEW value"

extClassA::printValue();              // print "NEW value" ...先にインスタンス化されていてもstatic変数は影響を受ける。
```

より詳しいことはこちらの記事が大変参考になります。
http://qiita.com/trashtoy/items/f4e2a97765e620bb2828

## 参考サイト

http://www.dondari.com/%E3%82%B9%E3%83%BC%E3%83%91%E3%83%BC%E3%82%AF%E3%83%A9%E3%82%B9%E3%81%AEstatic%E3%81%AA%E3%83%A1%E3%83%B3%E3%83%90%E5%A4%89%E6%95%B0%E3%81%AE%E6%8C%99%E5%8B%95
一番簡単なRubyクラス

Railsは分かるのだが、Rubyの基本を特に意識したこともなく。

```sample.rb
class Sample
  def initialize
    @greet = "ほげ"
  end
  attr_accessor :greet
end

sample = Sample.new
printf "こんにちは。私は%sです。", sample.greet
# => こんにちは。私はほげです。
```
Rakefileのtaskをデバッグしたい

Rakefileの中のtaskがちゃんと動くかどうかデバッグしたい。
`--dry-run` オプションでtaskの依存関係のチェックとかはできるけど、taskの中身のチェックがしたい。

``` ruby:Rakefile
require 'rake'

def delete(file)
  puts "delete file - #{file}" if ENV["DEBUG"]
  rm file unless ENV["DEBUG"]
end

desc 'remove log-files'
task :remove do
  Dir.glob('log/*.log').each do |f|
    delete f
  end
end
```

とりあえずこんな感じで、実際の処理をラッパーメソッドで包んでおいて`rake remove DEBUG=1`とかやるとtaskの中身の確認ができるようにしてたんだけど、そんな事する必要なかったのでメモ。
rakeの`sh`,`ruby`,`cp`,`rm`,`rm_rf`等の操作の多くはRake::FileUtilsExtに由来している。

``` ruby:Rakefile
require 'rake'

p method(:sh).owner     # => Rake::FileUtilsExt
p method(:ruby).owner   # => Rake::FileUtilsExt
p method(:rm).owner     # => Rake::FileUtilsExt
p method(:rm_rf).owner  # => Rake::FileUtilsExt
p method(:cp).owner     # => Rake::FileUtilsExt
```

で、このRake::FileUtilsExt自体がnowrite_flagなる属性値を持っていて、元々処理の実行可否を切り替えられるようになってる。便利。
なので、最初のファイルはこれで十分だった。


``` ruby:Rakefile
require 'rake'

# for debug
nowrite true

desc 'remove log-files'
task :remove do
  Dir.glob('log/*.log').each do |f|
    rm f
  end
end
```
デバッグが終わったら、`nowrite true`をコメントアウトすれば良い。
Officeドキュメントの内容比較はTortoiseSVN/TortoiseGitで瞬殺

Word文書の差分表示の仕方、ご存じですか？
比較する双方の文書を開いた状態で、どちらかのウィンドウで【校閲】-【比較】すると比較したいウィンドウ2枚を選択できます。
PowerPointは？
比較する片方の文書を開いて【校閲】-【比較】で、比較相手の文書を選べます。
ではExcelは？
こちらは、差分表示コマンドが用意されていません。

操作方法がまちまちで手軽でない上に、Excelには差分表示機能がありません（註 Excel2013でアドインとして追加されました）。

ところでTortoiseSVN/TortoiseGitでOffice文書の差分を見ようとするとどう表示されるか、お気付きでしょうか。
バイナリ差分が表示されたりしません。Officeがセットアップされている環境ではOfficeを使って差分表示してくれます。しかも、Excelブックについても自力で差分表示を生成までして！

そしてこの差分表示機能、履歴に対してだけでなく機能します。
エクスプローラーでファイルを二つ指定して右クリックから【TortoiseSVN/TortoiseGit】-【diff】、これでリポジトリと無関係なローカルファイルの差分表示ができます。
【PS】はじめにやっておきたい環境設定

Photoshopを使用して作業する前に、まずは初期設定を変更していきます。
##環境設定画面を開く

![スクリーンショット 2014-11-26 11.59.08.png](https://qiita-image-store.s3.amazonaws.com/0/37178/c0a998f8-76a3-8334-63f9-f3ba32963239.png "スクリーンショット 2014-11-26 11.59.08.png")

1.メニューバーの"Photoshop"を選択
2.環境設定を選択
3.一般を選択

###■ 環境設定 > インターフェース
サイドバーの"インターフェース"を選択

![スクリーンショット 2014-11-26 13.11.55.png](https://qiita-image-store.s3.amazonaws.com/0/37178/0d7ceffb-e2a1-f756-14e3-5a8f9d512bcb.png "スクリーンショット 2014-11-26 13.11.55.png")

####カラーテーマ
UIの色を設定できます。自分の気に入った色に変えてみましょう。
####自動的にアイコンパネル化
これにチェックを入れておくと、いちいちパネルをアイコンにしまうためにクリックする手間が省けます。

###■ 環境設定 > 単位・定規
サイドバーの"単位・定規"を選択

![スクリーンショット 2014-11-26 13.24.20.png](https://qiita-image-store.s3.amazonaws.com/0/37178/96a7a9e0-b31d-7be7-ba25-4d8ccfa5c7c6.png "スクリーンショット 2014-11-26 13.24.20.png")


####単位
定規・文字、共に単位を"pixel"に変更します。
これ忘れずに。

####スクリーン解像度
"72"の"pixel/inch"になっているのを確認。
これもまぁまぁ大事。（初期設定で設定されているはず）

###■ 環境設定 > ガイド・グリッド・スライス
サイドバーの"環境設定 > ガイド・グリッド・スライス"を選択

![スクリーンショット 2014-11-26 13.38.59.png](https://qiita-image-store.s3.amazonaws.com/0/37178/ae48f9c1-055d-9400-ce80-fd81bec52749.png "スクリーンショット 2014-11-26 13.38.59.png")


####ガイド・スマートガイド
カラー：ガイドの色を指定できます。
スタイル："実線or破線"から選択できます。
スマートガイドはカラーだけ変更可能です。

####グリッド
カラー：グリッドの色を指定できます。
スタイル："実線or破線or点線"から選択できます。
グリッド線：数値と単位を指定できます。
単位は"pixel"を選択しましょう。
分割数：上で指定したグリッド線をいくつで分割するか指定できます。
（グリッド線=100pixel、分割数=5の場合、20pixel高幅のグリッド線が設定される）

####スライス
カラー：スライスの色を指定できます。
スライス番号は任意で良いと思います。

***

##設定完了
ひとまずここまで設定ができれば、作業に支障はないでしょう。
あとはお好みで色々試してみてください。
Google Charts でとりあえずグラフを描いてみる

# かるくグラフを描いてみよう

DBに入っていたり、スクリプトで吐き出した数字をちょっとグラフにしたいときに、一旦CSVに吐き出してエクセルに持って行こうとしたら自分のPCにオフィスはいってなかったわーとか、GDライブラリを使ってごりごりお絵かきするかと思ったらサーバに入れてなかったわー(しかもなんだかんだと依存問題が出てサックリインストールできない)とか、そんなときにはJavaScriptをちょろっと使ってさっとグラフ描けるGoogle Chartsがべんり。Charts? Chart?

# 参考文献
https://developers.google.com/chart/

# データの準備
マトリクス的にデータを渡せるarrayToDataTableというメソッドを使うため、Arrayもしくは専用のClassあたりにデータを入れとくとプログラムを書きやすいとおもいます。

サンプルなんで超テキトーにデータつくります。２本グラフ引くためにValuesを２つ用意してます。

```php
<?php
error_reporting(E_ALL);
$datas=array();
for($utime=strtotime('-1 year'); $utime<time(); $utime=strtotime('+1 month',$utime))
  $datas[date('Y/m',$utime)]=array(rand(0,1000),rand(0,1000));
?>
```

# HTML準備
headでは専用のJSを一つincludeしてあげるだけでOK。
bodyへdiv等でグラフを描画する要素を置いてあげましょう。この要素にはJSから呼び出すためのidもふってあげます。

```html
<html>
<head>
 <script type="text/javascript" src="//www.google.com/jsapi"></script>
</head>
<body>
<div style="margin:20px 10px; padding:0; width:800px; height:350px;" id="graphField">Now Loading ...</div>
<script type="text/javascript">
 // ここに後述のJSコードをいれてね
</script>
</body>
</html>
```

# JavaScriptを書く
グラフを描画する要素の直下でいいのでscriptタグを設置してそこへ実際のchartsなコードを書きます。

```js+php
// この辺おまじない
google.load('visualization', '1.0', {'packages':['corechart']});
google.setOnLoadCallback(function(){
  // この辺データ
  var data = google.visualization.arrayToDataTable([
    ['Month', 'Value1', 'Value2'],
    <?php foreach($datas as $ym=>$values): ?>
    ['<?php echo $ym ?>', <?php echo $values[0] ?>, <?php echo $values[1] ?>],
    <?php endforeach ?>
  ]);
  // この辺グラフの描画オプション
  var options = {
    title: 'Graph Sample',
    chartArea: {'width':'70%', 'height':'65%', 'left':65 },
    hAxis: { title:'Year/Month', titleTextStyle:{italic:false} },
    vAxis: { title:'Random Values',  titleTextStyle:{italic:false} },
    crosshair: { trigger: 'both' }
  };
  // この辺おまじない
  var chart = new google.visualization.LineChart(document.getElementById('graphField'));
  chart.draw(data, options);
});
```

## データの辺り
なんとなくマトリクスなデータあげるといいかんじに解釈してくれます。
最初の配列要素はラベルになります。

```js
// 横軸 , 値1, 値2
['Month', 'Value1', 'Value2'],
```

２行目以降は実際にプロットされるデータになります。

```js+php
<?php foreach($datas as $ym=>$values): ?>
['<?php echo $ym ?>', <?php echo $values[0] ?>, <?php echo $values[1] ?>],
<?php endforeach ?>
```

こう書くと、

```js
['2013/11',100,444],
['2013/12',400,512],
  :
['2014/10',931,123],
```

といったかんじで展開されるハズ。

意外とこういう処理するときに面倒なのが、配列に入ったデータをforeachとかforみたいなループ文を使って出力するときの最初と最後の判定で、「最初はラベル」「最後のカンマを入れないようにする」といったような微調整なんですが、PHPみたいに最後の要素のおわりにカンマが入っていてもエラー等にならずにスルーしてくれるようです。たぶん。

## グラフのオプションの辺り
* chartArea : グラフ描画するエリアの設定
  * 元のdiv要素の大きさとグラフ描画の範囲を調整してあげないとラベルテキストが折り返したり軸の数字が隠れちゃったりするのでいろいろ調整してあげてください。
* hAxis, vAxis : 縦軸横軸の設定
  * 斜体がお気に召さないのでキャンセル
* crosshair
  * プロットにマウスオーバーすると十字に線を表示してくれる厨二心が満たされるオプション

## グラフの種類
さいごのおまじないの```LineChart```の辺りをいろいろ変えれば違うグラフにもできます。

# できた！

上X下B左L右R


![image](https://qiita-image-store.s3.amazonaws.com/0/56211/69aa92d8-e20b-bae7-fb39-07effe81145b.png)

べんり！


# 追記
会社の先輩よりご指摘いただきました：）

* JSの配列書くときの最後のカンマ
  * 古いブラウザ(IEとかIEとかIEとか)ではやっぱりシンタックスエラーになるかも。

* "data" で複数形だから datas じゃないよ！
  * 単数形は datum
  * やったね！飲み会での話題がひとつ増えたよ！
vagrant実行時にfogのデバッグメッセージを出力する

Vagrantでトラブルシューティングする際、以下のように```--debug``` オプションを付けたり、```VAGRANT_LOG``` でログレベルを設定することでデバッグメッセージを表示させることができる。

```bash
$ vagrant up --debug
$ VAGRANT_LOG=info vagrant up
```

しかし、[fog](http://fog.io)を利用したプラグインの場合、エラーがあってもVagrantのメッセージには出力されないことが多い。この場合には次の様に```EXCON_DEBUG=1``` を付けfogのデバッグメッセージを出力するようにするとリクエスト・レスポンスが全て表示される。

```bash
$ EXCON_DEBUG=1 vagrant up
# --debugオプションなどと一緒に使うこともできる
$ EXCON_DEBUG=1 vagrant up --debug
```

仮想マシンの名前が衝突していて作成に失敗しているなど、失敗の原因が分かれば簡単に対処できる場合も多いのでうまくいかない場合は確認してみると良い。
Rubyで文字列の類似度を計算する関数を作った

##はじめに
文字列がどのくらい似ているか比べたいときってありません？
Rubyで文字列を比較する関数を作りました。
文章をベクトル化してコサイン類似度を求めています。
一応動いているのですが、冗長なところや間違っているところがあったら教えてください。

##準備
* Mecabをインストール

##コード

```ruby:cosine_similarity.rb
require 'mecab'
require 'matrix'

# コサイン類似度を計算
# @param [String] str1 文字列
# @param [String] str2 文字列
# @return [Float] スコア
def calc_score(str1,str2)
  vector = []
  vector1 = []
  vector2 = []
  frag_vector1 = []
  frag_vector2 = []

  node1 = MeCab::Tagger.new.parseToNode(str1)
  node2 = MeCab::Tagger.new.parseToNode(str2)
  
  while node1
    vector1.push(node1.surface)
    node1 = node1.next
  end

  while node2
    vector2.push(node2.surface)
    node2 = node2.next
  end

  vector += vector1
  vector += vector2
  
  #重複と空文字列を削除
  vector.uniq!.delete("")
  vector1.delete("")
  vector.delete("")
  vector2.delete("")

  vector.each do |word|
    if vector1.include?(word) then
      frag_vector1.push(1)
    else
      frag_vector1.push(0)
    end

    if vector2.include?(word) then
      frag_vector2.push(1)
    else
      frag_vector2.push(0)
    end
  end

  vector1_final = Vector.elements(frag_vector1, copy = true)
  vector2_final = Vector.elements(frag_vector2, copy = true)

  return vector2_final.inner_product(vector1_final)/(vector1_final.norm() * vector2_final.norm())

end
```
jQueryでポップアップブロックを回避して新windowにformの値を送りたい

フォームの値を別ウィンドウに送りたい場合
$("form").attr("target", "_blank");
を使うと、ポップアップブロックにかかってしまうので、
その回避方法

window.open("","newwin");
$("form").attr("action", "開きたいURL");
$("form").attr("target", "newwin");
$("form").submit();

一旦新しいウィンドウを開いてから
そこにフォームを送る
Mac OSXでのWordPress導入でデータベース接続エラー


# このドキュメントについて
Macのローカル環境でWordPressを動かそうとして、データベース接続エラーに遭遇した時の解決方法について書いています。


```bash
 PHP Warning:  mysql_connect(): No such file or directory in /Users/ashibuya/wordpress/wp-includes/wp-db.php on line 1409
[Tue Nov 25 15:53:36 2014] [error] [client ::1] PHP Notice: This XML document is invalid, likely due to invalid characters. XML error: Invalid character at line 23, column 26 in /Users/ashibuya/wordpress/wp-includes/class-simplepie.php on line 1446, referer: http://wordpress.sample.jp/wp-admin/
```

# 環境
- MacOSX 10.9.5
- PHP 5.4.35 (cli) (built: Nov 17 2014 06:06:49)
- Server version: 5.6.21 MySQL Community Server (GPL)
- WordPress 4.0.1

# エラー内容

## 画面

WordPressのインストール画面の途中では「データベース接続エラー」の表示

## apacheエラーログ

```bash
 PHP Warning:  mysql_connect(): No such file or directory in /Users/ashibuya/wordpress/wp-includes/wp-db.php on line 1409
[Tue Nov 25 15:53:36 2014] [error] [client ::1] PHP Notice: This XML document is invalid, likely due to invalid characters. XML error: Invalid character at line 23, column 26 in /Users/ashibuya/wordpress/wp-includes/class-simplepie.php on line 1446, referer: http://wordpress.sample.jp/wp-admin/
```

# 対処

MacOSXのMySQLではソケットファイルの位置がすこし悪いようです。
MySQLのセッティング、my.cnfで場所を変更するという方法もあるのですが、ここは、WordPressが参照しにいく場所にMySQLのソケットファイルをシンボリックリンクで置いてあげます。


```bash
cd /var 
sudo mkdir mysql
sudo chmod 755 mysql
cd mysql
ln -s /tmp/mysql.sock mysql.sock
```

# 参考

[php - Warning: mysql_connect(): [2002] No such file or directory (trying to connect via unix:///tmp/mysql.sock) in - Stack Overflow](http://stackoverflow.com/questions/4219970/warning-mysql-connect-2002-no-such-file-or-directory-trying-to-connect-vi)


# おまけ

東洋経済オンラインで「エンジニア夫婦のあるある日記」を連載中です

[エンジニア夫婦のあるある日記](http://toyokeizai.net/search/author?category%5B%5D=TK%3E%E8%A8%98%E4%BA%8B&category%5B%5D=TK%3E%E5%A4%96%E5%A0%B1&author_name=%E3%81%BC%E3%81%B8%E3%81%BC%E3%81%B8)

![img_7aa46138cef6c956f55f35a3a6127f5587982.jpg](https://qiita-image-store.s3.amazonaws.com/0/32215/bb12cce6-9b74-9a2d-5f24-b38d406c9410.jpeg "img_7aa46138cef6c956f55f35a3a6127f5587982.jpg")
SublimeText3 環境セットアップ


自分用メモ。

## Package Control をインストール

* https://sublime.wbond.net/installation#st3 にアクセスして、インストール用コマンドをコピー
* コンソールを開いてコマンドを実行

インストール完了後、`Ctrl + Shift + P` で Package Control が開くようになる。

## 設定項目のカスタマイズ

```
{
	// 現在の行をハイライト表示する
	"highlight_line": false,

	// スペース・タブを表示
	"draw_white_space": "all",

	// タブ入力時にスペースに変換
	"translate_tabs_to_spaces": true
}

```

## プラグインをインストール

### SublimeLinter

Linter (構文チェッカー) を利用するためのフレームワーク。
まずはこれをインストール。

### SublimeLinter-jshint

JSHint による構文チェックを行う。

事前に JSHint をインストールしておく。

```
sudo npm install -g jshint
```

nodebrew を利用している場合、SublimeLinter-jshint の settings の中にある paths に、
jshint のパスを指定しておく必要がある。パスは絶対パスで指定すること。

```
{
    "user": {
    
        ...
        
        "paths": {
            "linux": [],
            "osx": [
                "/path-to-path/bin"
            ],
            "windows": []
        },
        
        ...
    }
}
```

### BracketHighlighter

タグやクォーテーションの開始・終了をハイライト表示する。

### SideBarEnhancements

サイドバーの拡張。
SVNのbranchを履歴付でGitのmasterに移行

なんのこともないSVNのbranchをSVNの履歴がついた状態で、
Gitのmasterに移行したお話。備忘録です。


### 背景

SVNでbranch運用していたプロジェクトをGitのmasterに移行したかった。
どうすべきか探ったところ、

```
git svn clone [-s] -T {trunk} -b {branches} -t {tags}
```

みたいにすりゃいいよ、ってことだったんですが、そもそもがbranch運用だったために悩む。
で、結局…。

### branchをtrunk扱いした

```
$ git svn clone -T branches/{$BRANCH} https://{$SVN_REPO}/
```

長いこと待つ。
途中で止まったら

```
$ git svn fetch
```

で継続。HEAD REVISIONがYEAH!!みたいなログが出てきたら終わり。

```
$ git branch
```
でちゃんとtrunkのようにふるまってることを確認して、
あとはいつも通り

```
$ git remote add origin https://{$GIT_REPO}.git
```
して

```
$ git push -u origin master
```
する。

開発用のごちゃごちゃしたbranchの移行なので、
revertやmergeしてたりするとどうなるかの検証はしてません。

なにか「もっといい方法があるよ！」「そこ間違ってるよ！」みたいなのあったら
ガンガンご指摘ください！
NSDateから曜日の文字列を取得する


```objectivec:NSDateから曜日を取得する
    NSCalendar* calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
    NSDateComponents* comps = [calendar components:NSWeekdayCalendarUnit
                                          fromDate:date];
    
    NSDateFormatter* df = [[NSDateFormatter alloc] init];
    df.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"ja"];
    
    //comps.weekdayは 1-7の値が取得できるので-1する
    NSString* weekDayStr = df.shortWeekdaySymbols[comps.weekday-1];
```

これで「月」とか「火」とかの文字列が取得出来ます。
あらゆるサブドメインを127.0.0.1に名前解決する

Ruby on Ralisでウェブアプリケーションを開発しているとき、サブドメインが増えるごとにhostsを書き換えるのはとても面倒なので、localhostでunboundを走らせることにした。

環境はOS X YosemiteでHomebrewを使っているケースを想定しているが、どこかに適当にLinixサーバー立てちゃってもいいんじゃないかと。

# やりたいこと

* dev.testが127.0.0.1になるようにする
* foo.dev.testも127.0.0.1を返すようにする
* bar.dev.testも127.0.0.1を返すようにする
* いっそのこと*.dev.testなものすべてが127.0.0.1になればいい

# やりかた

## unboundをインストールする

1. Homebrewを入れる
2. 「brew install unbound」でunboundをインストールする
3.  /usr/local/etc/unbound/unbound.confを適切に設定する
4.  （おまけ）OS起動時にunboundが走るようにする

インストールはOSによってyumでもapt-getでも使えばいいんじゃないかと思います。

### 3. /usr/local/etc/unbound/unbound.confを適切に設定する

このような設定にする。必要に応じてaccess-controlなども付け足すとよい。

```:/usr/local/etc/unbound/unbound.conf
server:
    statistics-interval: 3600
    extended-statistics: yes
    interface: "0.0.0.0"
    username: "nobody"

    local-zone: "dev.test." redirect
    local-data: "dev.test. A 127.0.0.1"

```

### 4. （おまけ）OS起動時にunboundが走るようにする

OS XにHomebrewでいれたときは以下のようにすればOS起動時にunboundも起動するようになる。かつ、unboundがすぐに起動する。

```shell-session
$ sudo cp -fv /usr/local/opt/unbound/*.plist /Library/LaunchDaemons
$ sudo chown root /Library/LaunchDaemons/homebrew.mxcl.unbound.plist
$ sudo launchctl load -w /Library/LaunchDaemons/homebrew.mxcl.unbound.plist
$ 
```

# lvh.meというドメイン

何処かの人が同じような設定をしている「lvh.me」というドメインもあります。ポリシー的にそれを使っても問題ないならそれを使うのもありですね。

設定変わったりすると怖いので、私はあまり使う気はないです。
powershellのusing(import,include)　名前空間省略方法のメモ

PowershellにC#で言うところのusing（javaのimport,cのinclude)がない、と思っているのではないかというコードが多いのでメモ

まず、New-Objectにtypeオブジェクトだけでなく、文字列が指定できるので、名前空間文字列を先頭行で宣言して、newするときに使う方法

```
PS C:\Temp> $List="System.Collections.Generic.List"
PS C:\Temp> $a=New-Object "$List[Int]"
PS C:\Temp> $a.GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     List`1                                   System.Object
```

staticメソッド・プロパティを使う場合はtype型にキャストした変数をポインタにできるみたいなんですけど、
名前空間は文字列型にして、個別のクラスはtypeにキャストするのが使い勝手がいいのかな、と思いました。

```
PS C:\temp> $excel="Microsoft.Office.Interop.Excel"
PS C:\temp> [Reflection.Assembly]::LoadWithPartialName($excel)

GAC    Version        Location
---    -------        --------
True   v2.0.50727     C:\Windows\assembly\GAC_MSIL\Microsoft.Office.Interop.Excel\15.0.0.0__71e9bce111e9429c\Microso...


PS C:\temp> $xlFixedFormatType="$excel.XlFixedFormatType" -as [type]
PS C:\temp> $xlFixedFormatType::xlTypePDF
xlTypePDF
PS C:\temp> $xlFixedFormatType::xlTypePDF.GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     XlFixedFormatType                        System.Enum
```


参考
ExcelファイルからPDFファイルやXPSファイルを作成する
http://blog.powershell-from.jp/?p=965


2016/4/5
Powershell5.0で正式な名前空間省略の文法ができたみたいです

PowerShell 5.0 で搭載された using namespace シンタックスの概要
http://tech.guitarrapc.com/entry/2015/08/30/082605
バージョン２で可変の変数を使う場合

バージョン２のみの方法

```
{assign var=que_name value=que`$smarty.section.que.iteration`_array}
{foreach from=$arrQuestion.0.$que_name item=que1_item key=que1_key}
<option value="{$arrQuestion.0.title1}___{$que1_item}">{$que1_item}</option>
{/foreach}```
Node.js + Socket.io + StreamingAPIでツイートを取得してWebサイトにリアルタイム描画する


先日に書いた[Twitter Streaming API + Node.js (ntwitter)で指定キーワードのツイートを取得する](http://qiita.com/n0bisuke/items/09126e6e2cd111841a2e)をWebサイト側に表示させてみます。

##準備
socket.ioを使います。

```
$ npm i socket.io
```

ソースコードは[Node.js + Socket.IO + jQuery で最小構成チャット](http://qiita.com/naga3/items/bdf6176537a5ac77a9b5)をもとにしています。

###サーバー側

```twstream.js
var util = require('util');
var twitter = require('twitter');

var twit = new twitter({
  consumer_key: 'xx',
  consumer_secret: 'xx',
  access_token_key: 'xx',
  access_token_secret: 'xx'
});

var keyword = process.argv[2]; //第一引数
var option = {'track': keyword};
console.log(keyword+'を含むツイートを取得します。');

var fs = require('fs');
var app = require('http').createServer(function(req, res) {
  res.writeHead(200, {'Content-Type': 'text/html'});
  res.end(fs.readFileSync('index.html'));
}).listen(3000);

var io = require('socket.io').listen(app);
io.sockets.on('connection', function(socket) {
  socket.on('msg', function(data) {
    io.sockets.emit('msg', data);
  });
});

twit.stream('statuses/filter', option, function(stream) {
  stream.on('data', function (data) {
    io.sockets.emit('msg', data.text);
    console.log(data);
  });
});
```

###フロント側
```index.html
<!DOCTYPE html>
<meta charset="UTF-8">
<title>chat</title>
<script src="/socket.io/socket.io.js"></script>
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
<script>
$(function() {
  var socket = io.connect();
  $('form').submit(function() {
    socket.emit('msg', $('input').val());
    $('input').val('');
    return false;
  });

  socket.on('msg', function(data) {
        console.log(data);
    $('div').prepend(data + '<br>');

  });
});
</script>
<form><input></form><div></div>
```

##使い方

起動する際に引数に検索ワードを入れて起動します。

```
$ node twstream 検索するワード
```

```
$ node twstream twitter
ligincを含むツイートを取得します。

/*しばらく待ちます...*/

{ created_at: 'Wed Nov 26 03:37:50 +0000 2014',
  id: 537450127229997060,
  id_str: '537450127229997056',
  text: 'RT @BestYahooAnswer: What are the symptoms of homosexuality http://t.co/FRRQySyx7c',
  source: '<a href="http://twitter.com/download/iphone" rel="nofollow">Twitter for iPhone</a>',
  truncated: false,
  in_reply_to_status_id: null,
  in_reply_to_status_id_str: null,
  in_reply_to_user_id: null,
  in_reply_to_user_id_str: null,
  in_reply_to_screen_name: null,
  user: 
   { id: 1906062012,
     id_str: '1906062012',
     name: 'master debator',
     screen_name: 'patrickstump420',
     location: 'ig: bitchtml',
     url: 'http://kamisthebomb.com',
     description: 'hi im lulu & im scared of straight people',
     protected: false,

```

`http://localhost:3000`にアクセスしてみましょう。

![](http://i.gyazo.com/cef29aaf662211472c94aef8fca1c885.gif)

こんな感じで`[サーバー]Streamingで取得 -> [サーバー]Socket.ioでemit! -> [クライアント]Socketイベントとデータ取得 -> [クライアント]描画`という流れでリアルタイムにツイートを扱うことが出来ました。
【PS】PhotoshopのUI説明

Photoshopの起動から各UIの説明をします。
※Photoshopのパージョンは"CC"を使用

##1.Photoshopを起動する
起動するとこんな画面が展開されます。
初期設定だと多少UIの感じが違うかもしれないですが、今回は気にせずに進みましょう。

まず色で囲った場所から説明していきます。
ひとつひとつ全てを説明するとかなりボリュームが大きくなるので、ザックリした説明に留めていきます。
とりあえず、各パーツの名称だけ覚えればOKです。

![スクリーンショット 2014-11-26 10.17.04.png](https://qiita-image-store.s3.amazonaws.com/0/37178/d7784930-6b89-09e1-10dd-828b61826dda.png "スクリーンショット 2014-11-26 10.17.04.png")

###メニューバー
新規ファイルの作成から保存など環境設定を行えます。
その他にも写真の加工に使用できるものから、フィルター機能まで選ぶことができます。
###オプションバー
ツールバーで選択したツールに割りふられたオプションを設定することができます。
###ツールバー
使用用途によってツールを選び使用します。
基本的には移動ツールを選択しておくと良いです。
###パレット
文字の色やサイズを変更したり、レイヤーの重なり順を確認・変更したりできます。
ここに表示されていないパレットは"メニューバーのウィンドウ"から選択すると、パレットに表示できるようになります。

##2.よく使うツール

![スクリーンショット 2014-11-26 10.50.17.png](https://qiita-image-store.s3.amazonaws.com/0/37178/9403d410-eb00-6a4f-7d32-e9fd7d1be0db.png "スクリーンショット 2014-11-26 10.50.17.png")

###■ 移動ツール
レイヤーやシェイプを選択・移動・拡大縮小・回転することができる。
他のツールを使用した後は、このツールを選択しておくと良いと思います。

###■ 選択ツール
選択範囲をとって、切り抜いたり塗りつぶしたり、色々な用途に使用できるツール。

###■ クイック選択ツール・自動選択ツール
コントラストが強いところを基準に簡単に選択範囲を作成してくれるツール。写真の切り抜きなどによく使用します。

###■ 切り抜きツール・スライス／スライス選択ツール
####切り抜きツール
カンバスのサイズを変更したり、トリミングをすることができます。
####スライスツール
作成した画像を囲って、各画像フォーマットで書き出すことができます。
####スライス選択ツール
スライスツールで囲った範囲を変更したり、削除することができます。
###■ グラデーションツール
シェイプやレイヤーにグラデーションを追加できる。写真を左から右に徐々に薄くしたりなども可能。
###■ ペンツール
より自由なシェイプやパスを書くことができる。
###■ 文字ツール
文字を書くことができる。
###■ 長方形・角丸長方形・楕円・多角形・ライン・カスタムシェイプツール
上記の形のシェイプを描ける。カスタムシェイプではハートの形になっているものなど、特殊な形のシェイプを描くことが可能。
amazon AWSの本人認証でハマったのでメモ

EC2の画面に遷移すると下記のエラーが表示されてサービスが利用できなかった。

> We need additional information from you to complete your sign up. Here are few things 
> you can try to expedite the process:


本人認証が完了していないのが原因だった。

[Amazon Kinesis](https://console.aws.amazon.com/kinesis/home?region=ap-northeast-1)のページに、本人認証の続きを行うためのリンクがあった。
画面遷移後に「Sign up」をクリックし電話認証を行ったところ無事問題は解決した。

**参考**
https://forums.aws.amazon.com/thread.jspa?messageID=581742
RevelでGORMを使ってみる+SQLの返却データをCacheしてみようの巻

Golangの有名なフレームワークのひとつ[Revel](http://revel.github.io/)に用いるORMを探していたときに[Gorp](https://github.com/coopernurse/gorp)を見つけたけれど、何となく違うなーと思って他を探していたときに見つけたORMの[Gorm](https://github.com/jinzhu/gorm)。

初期設定にハマったので備忘として。
せっかくなのでDBから取得したデータはRevelのCache機能でCacheするようにしてみた。

まずは gorm.go を作成。

```go
package db

import (
	"github.com/revel/revel"
	"github.com/jinzhu/gorm"
    _ "github.com/go-sql-driver/mysql"
    "strings"
    "fmt"
    "time"
)

var Gdb gorm.DB
var GCacheTime time.Duration
var TimeFormat string

func getConnectionString() string {
    host := getParamString("db.host", "")
    port := getParamString("db.port", "3306")
    user := getParamString("db.user", "")
    pass := getParamString("db.password", "")
    dbname := getParamString("db.name", "")
    protocol := getParamString("db.protocol", "tcp")
    dbargs := getParamString("db.args", " ")

    if strings.Trim(dbargs, " ") != "" {
        dbargs = "?" + dbargs
    } else {
        dbargs = ""
    }
    return fmt.Sprintf("%s:%s@%s([%s]:%s)/%s%s", 
        user, pass, protocol, host, port, dbname, dbargs)
}

func InitDB() {
	var err error
    connectionString := getConnectionString()
    Gdb, err = gorm.Open("mysql", connectionString)
    if err != nil {
        revel.ERROR.Println("FATAL", err)
        panic( err )
    }
    Gdb.LogMode(getParamBool("db.debug"))
    GCacheTime = getCacheTime()
    TimeFormat = "2006-01-02 15:04:06"
}

func getParamString(param string, defaultValue string) string {
    p, found := revel.Config.String(param)
    if !found {
        if defaultValue == "" {
            revel.ERROR.Fatal("Cound not find parameter: " + param)
        } else {
            return defaultValue
        }
    }
    return p
}

func getParamInt(param string) int {
    p, found := revel.Config.Int(param)
    if !found {
        revel.ERROR.Fatal("Cound not find parameter: " + param)
    }
    return p
}

func getParamBool(param string) bool {
    p, found := revel.Config.Bool(param)
    if !found {
        revel.ERROR.Fatal("Cound not find parameter: " + param)
    }
    return p
}

func getCacheTime() time.Duration {
	cacheTime := time.Duration(getParamInt("cache.time")) * time.Minute
	if cacheTime < 0 {
		cacheTime = 1 * time.Nanosecond
	}
	return cacheTime
}
```

そしたら 今度は model を作成

```go
package models

import (
	d "api.gamefeat.net/app/libs/db"
	"github.com/revel/revel/cache"
	"github.com/revel/revel"
	"errors"
)

func (t TableModel) FindData(id string) (res TableModel, err error){
	//DB接続
	d.InitDB()	
	if c := cache.Get("SQL_CACHE_"+id, &res); c != nil {
		if d.Gdb.Table("table_name").Select("*").Where("id = ?", id, 0, 0).First(&res).RecordNotFound() {
			err = errors.New("FindData - NoData id : "+id)
			return res, err
		}
		
		go cache.Set("SQL_CACHE_"+id, res, d.GCacheTime)
	}
	
	revel.INFO.Println(d.GCacheTime)
	revel.INFO.Println(res)
	return res, err
}
```

これでとりあえずGORMを使えるようになるはず。
GORMはなかなか便利で使い勝手がいい感じがした。
AWSが利用しているIPアドレスを取り出してみた

#AWSのIPアドレスレンジ

先日、JSONが提供されたのでjqで引っ張ってみた。

Amazon Web Services ブログ
AWSのIPアドレスレンジをJSONで提供
http://aws.typepad.com/aws_japan/2014/11/aws-cidr-json.html

"AMAZON", "EC2", "ROUTE53", "ROUTE53_HEALTHCHECKS", "CLOUDFRONT"が提供されています。

##IP取り出し

CloudFrontのIPレンジ

```
 curl https://ip-ranges.amazonaws.com/ip-ranges.json | jq -r '.prefixes[] | if .service == "CLOUDFRONT" then .ip_prefix else empty end'
```

```
205.251.254.0/24
54.239.192.0/19
204.246.176.0/20
54.230.0.0/16
205.251.250.0/23
205.251.192.0/19
216.137.32.0/19
204.246.164.0/22
205.251.249.0/24
54.192.0.0/16
54.239.128.0/18
54.240.128.0/18
204.246.174.0/23
204.246.168.0/22
205.251.252.0/23
54.182.0.0/16
```

EC2で尚且つ東京リージョン

```
 curl https://ip-ranges.amazonaws.com/ip-ranges.json | jq -r '.prefixes[] | if .service == "EC2" then . else empty end' | jq -r '. | if .region == "ap-northeast-1" then .ip_prefix else empty end'
```

```
54.238.0.0/16
54.64.0.0/15
54.250.0.0/16
175.41.192.0/18
54.199.0.0/16
176.34.32.0/19
46.51.224.0/19
54.248.0.0/15
54.150.0.0/16
54.178.0.0/16
54.92.0.0/17
176.32.64.0/19
176.34.0.0/19
54.168.0.0/16
54.95.0.0/16
103.4.8.0/21
```

##etc

バケットポリシーやELBのセキュリティグループ等活用する機会はありそう。
Homebrew Caskを導入メモとリンク集


Macの開発環境構築で幸せになれるかなーと思い、
BrewfileとHomebrewとCaskを使ってみることにした時の導入メモ
本家 [Homebrew Cask](http://caskroom.io/)


### 参考にしたリンクたち
[Brewfile + Homebrew + Homebrew-caskで Mac の環境構築をする](http://wada811.blogspot.com/2014/05/brewfile-homebrew-cask.html)

[Macの環境構築にhomebrew-cask+Brewfile便利](https://waka.github.io/2014/1/19/homebrew_cask.html)
ffmpeg の -filter_complex オプション amix のinputsが取れる最大値は32 ヽ(ﾟｰﾟ*ヽ)(ﾉ*ﾟｰﾟ)ﾉわぁい

みなさん、おはこんばんちはでス。ffmpegネタを3日に一度ぐらい投入したい :smile: 今日は、メモ程度のネタですいません。音声を重ね合せるときに使うfilterのamixですが、取れる inputs の最大値は32でしたという話。32より多く重ね合せるなら、32個ずつに分けて後から合成すれば実現可能。

# amix の使い方

ちなみに、amixはこんな感じに使われます。

http://www.ffmpeg.org/ffmpeg-filters.html#amix

```
ffmpeg -i INPUT1 -i INPUT2 -i INPUT3 -filter_complex amix=inputs=3:duration=first:dropout_transition=3 OUTPUT
```

# 参考ページ等

↓ここでやったような36個の動画を合成しようとしたら引っかかりましたよ

[ruby と OpenCV, ffmpeg を使用した画像/動画の認識とパフォーマンスについて ヽ(ﾟｰﾟ*ヽ)(ﾉ*ﾟｰﾟ)ﾉわぁい](http://qiita.com/scleen_x_x/items/7137a58025fbefdbd18f) | http://qiita.com/scleen_x_x/items/7137a58025fbefdbd18f

36個の動画合成したもの

https://www.youtube.com/watch?v=DyKwJD-T-bc
Quick Reference for Git Mark of oh-my-zsh 'wedisagree' Theme

mac のヒトにはお勧めの、oh-my-zsh の wedisagree テーマを使うと、git の状態をマークで表示してくれます。
ですがそのマークがちと分かりづらい。覚えてしまえば楽なのだろうけれども、なかなか覚えられない。
というワケで、クイック・リファレンスになる関数を作りました。

```shell-session
function ph() {
  local prompt_descriptions
  prompt_descriptions=(
    $ZSH_THEME_GIT_PROMPT_DIRTY 'dirty\tclean でない'
    $ZSH_THEME_GIT_PROMPT_UNTRACKED 'untracked\tトラックされていないファイルがある'
    $ZSH_THEME_GIT_PROMPT_CLEAN 'clean'
    $ZSH_THEME_GIT_PROMPT_ADDED 'added\t追加されたファイルがある'
    $ZSH_THEME_GIT_PROMPT_MODIFIED 'modified\t変更されたファイルがある'
    $ZSH_THEME_GIT_PROMPT_DELETED 'deleted\t削除されたファイルがある'
    $ZSH_THEME_GIT_PROMPT_RENAMED 'renamed\tファイル名が変更されたファイルがある'
    $ZSH_THEME_GIT_PROMPT_UNMERGED 'unmerged\tマージされていないファイルがある'
    $ZSH_THEME_GIT_PROMPT_AHEAD 'ahead\tmaster リポジトリよりコミットが進んでいる'
  )

  local i
  for ((i = 1; i <= $#prompt_descriptions; i += 2))
  do
    local p=$prompt_descriptions[$i]
    local d=$prompt_descriptions[$i+1]
    echo `echo $p | sed -E 's/%.| //g'` $reset_color $d
  done
}
```

~/.zshrc の oh-my-zsh を読み込んでるトコ (`source $ZSH/oh-my-zsh.sh` の行) の後に追加して下さい。

実行結果
![screenshot.png](https://qiita-image-store.s3.amazonaws.com/0/28376/3117ed1d-7160-bb6b-0c5c-481f17a1eb23.png)

以下を参考にしました。
https://www.eisbahn.jp/yoichiro/2013/01/oh-my-zsh-wedisagree-git.html
Herokuのメリット、デメリット

# メリット

## メンテナンスコストがほぼゼロ

* ほぼ何もしなくても勝手に動いてくれます。
* 個人的な体感値だとAWSでEC2やロードバランサで環境を組んだ場合と比べると1:100ぐらいの手間無し感です。

## デプロイがコマンド一発

* デプロイは基本的に`git push heroku master`でHerokuにpushするだけです。(Railsのマイグレーションを行う場合は`heroku run rake db:migrate `も必要)
* 自分でデプロイスクリプトを頑張って書かなくてもいいので楽です。

## スケールアウトがコマンド一発、もしくはGUIで非エンジニアでも操作可能

* Herokuはdynoという独自のWebサーバプロセスの単位で操作するのですが、`heroku ps:scale web=3`でプロセス数を変更出来ます。
  * Herokuサイト上のダッシュボードからバーをスライドさせる事によって1〜100までdyno数を変更する事も可能です。

## リリースのバージョン管理を勝手にやってくれる

* `heroku releases`というコマンドを打つと下記のように直近のリリース一覧が表示されます。

```
=== APP-NAME Releases
v50  Deploy 45de3e3  xxxxxxxxxx@gmail.com  2014/11/25 17:37:55 (~ 27m ago)
v49  Deploy ff3082d  xxxxxxxxxx@gmail.com  2014/11/25 16:49:20 (~ 1h ago)
v48  Deploy 0508f80  xxxxxxxxxx@gmail.com  2014/11/25 14:05:57 (~ 3h ago)
v47  Deploy cfed7f8  xxxxxxxxxx@gmail.com  2014/11/25 13:44:55 (~ 4h ago)
v46  Deploy e847a65  xxxxxxxxxx@gmail.com  2014/11/25 12:27:30 (~ 5h ago)
v45  Deploy 0848019  xxxxxxxxxx@gmail.com  2014/11/25 12:14:57 (~ 5h ago)
v44  Deploy 5a5b056  xxxxxxxxxx@gmail.com  2014/11/25 11:56:16 (~ 6h ago)
v
```

* ロールバックもコマンド一発で、上記の場合は`heroku rollback v49`と打つと最新の1つ前のバージョンまでロールバックしてくれます。(ロールバックのロールバックも可能らしいです。)

## DBのバックアップもアドオンを入れると自動的に取ってくれる

* [PG Backups](https://addons.heroku.com/pgbackups) というアドオンを入れると日次、週次のバックアップを自動的に取る事が可能です。
* `heroku pgbackups`コマンドで下記のようにバックアップ一覧表示、`heroku pgbackups:restore DATABASE_URL a009`でバックアップからデータをリストア、これもコマンド一発で操作出来ます。

```
ID    Backup Time                Status                                Size     Database
----  -------------------------  ------------------------------------  -------  ------------
a001  2014/11/11 03:00.12 +0000  Finished @ 2014/11/11 03:00.15 +0000  21.9KB   DATABASE_URL
a008  2014/11/18 05:22.53 +0000  Finished @ 2014/11/18 05:22.58 +0000  23.3KB   DATABASE_URL
a009  2014/11/19 04:57.28 +0000  Finished @ 2014/11/19 04:57.33 +0000  23.3KB   DATABASE_URL
a010  2014/11/20 05:57.49 +0000  Finished @ 2014/11/20 05:57.53 +0000  23.3KB   DATABASE_URL
a011  2014/11/21 06:10.54 +0000  Finished @ 2014/11/21 06:10.59 +0000  26.7KB   DATABASE_URL
```

## アドオンが豊富

[Heroku Add-ons](https://addons.heroku.com/)

* Herokuは他のサービスをアドオンとして追加出来るので、パフォーマンスチェック、エラー通知、メール配信、MongoDBやRedis等のデータストアなどを簡単に連携させる事が出来ます。

## ステージング環境が無料で複数作れる

* 基本的にはステージング用に新しいHerokuアプリを作って、そっちにデプロイするだけなので、簡単にステージング環境を作れます。
* Herokuは無料の範囲内で使えばアクセス数などに関わらず無料で使えるので、費用を掛けずにステージング用、デモ用、プレビュー用など、色々な用途別にステージング環境を作る事が出来ます。(さすがに無駄に作りまくったら怒られると思いますがw)
* プロダクション環境があれば、当然ステージング環境も必要になりますが、AWSで自前で構築した場合、ステージング環境にはプロダクション環境とほぼ同等の環境が必要になるため、約2倍の費用が掛かってしまいます。Herokuなら無料で複数のステージング環境が作れます。(個人的にはこれがAWSで自己構築する場合とHerokuを比較した際の一番のHerokuオススメ理由です)

※追記：Herokuのアプリケーションはクレジットカードを登録済みであれば最大100個まで作成出来るようです。(カード未登録は最大5個)
source: https://devcenter.heroku.com/articles/account-management#application-limit

# デメリット

## 東京リージョンに対応していない

* これだけです。本当にこれさえあればHeroku一択と胸を張って勧められます。
手動でファイルロック

テスト時に迷ったのでメモ。

flockを利用する。※60秒間ロックする場合

```bash:
$flock --timeout=60 ロックするファイルパス sleep 60s
```
flockの書式「flock オプション　ファイル名　コマンド」なので、こんな感じでOK。
Xcode6,Swiftで APIのURLを分ける

APIのURLが開発、テスト、本番と３つあるとする。
Xcode5,Objective-Cの時はPreprocessor Macrosを使ってしてたが、Swiftではこの記述ができない。

```Objective-C
#ifdef
 

#endif
```


## コンパイルのオプションを使う
XcodeのBuild Settingのカスタムフラグを使う。

## 定数の設定ファイルをつくり設定をかく
Const.swiftという定数のクラスを作りそこへ書く。

```swift:Const.swift
class Const : NSObject {
    
    /* API URLs */
    #if DEBUG
    let URL_API = "http://debug.hoge.com/api"
    #elseif STAGING
    let URL_API = "http://staging.hoge.com/api"
    #else
    let URL_API = "http://production.hoge.com/api"
    #endif
    
}

```

##Xcodeの設定
`TARGETS > Build Settings > Swift Compiler - Custom Flags > Other Swift Flags`
Debugのところへ `-D DEBUG`を新たに追加する。(デフォルトは空)

##ビルドし呼び出す
####どこでもいいので、ログに出す。

```swift:ViewConstroller.swift
println(Const().URL_API)
/* 結果↓
http://debug.hoge.com/api
*/
```
####Build Settings のFlagを `-D STAGING`にして再度ビルド
```swift:ViewConstroller.swift
println(Const().URL_API)
/* 結果↓
http://staging.hoge.com/api
*/
```

####リリースビルド
`TARGETS > Build Settings > Swift Compiler - Custom Flags > Other Swift Flags`
Releaseのところが空なので本番のURLを向く
PHPエンジニアのためのGoLang便利Tips〜その３(in_array)

phpの標準関数 [in_array](http://php.net/manual/ja/function.in-array.php) をGoで自前実装したらこんな感じ。


```go

func InStringArray(val string, array []string) (exists bool, index int) {
    exists = false
    index = -1;
    for i, v := range array {
        if val == v {
            index = i
            exists = true
            return
        }   
    }
    return
}
```
PHPエンジニアのためのGoLang便利Tips〜その２(mt_rand)

phpの標準関数 [mt_rand](http://php.net/manual/ja/function.mt-rand.php) をGoで自前実装したらこんな感じ。

```go

import (
	"time"
	"math"
	"math/rand"
)

func Random(min int, max int) int {
	if min < 0 {
		min = 0
	}
	if max < 0 {
		max = 0
	}
	if min >= max {
		return max
	}
	rand.Seed(time.Now().UnixNano())
	return rand.Intn(max - min) + min
}
```
PHPエンジニアのためのGoLang便利Tips〜その１(round)

phpの標準関数 [round](http://php.net/manual/ja/function.round.php) をGoで自前実装したらこんな感じ。


```go

import (
	"math"
	"math/rand"
)
func Round(x float64, prec int) float64 {
	var rounder float64
	pow := math.Pow(10, float64(prec))
	intermed := x * pow
	_, frac := math.Modf(intermed)

	if frac >= 0.5 {
		rounder = math.Ceil(intermed)
	} else {
		rounder = math.Floor(intermed)
	}

	return rounder / pow
}
```