OmniAICreator/Qiita-1.07M huggingface dataset:
ルビ<ruby>非対応のFirefoxで、<rp>でお茶を濁さずにCSSだけで非表示にする方法。


HTML5の最終勧告から日が浅いので、今後のブラウザ実装次第ではすぐに使い物にならなくなる可能性はありますが…。
以下の簡単なCSSだけで、Firefoxでのルビ振り自体を非表示にできます。

ご存知の通り、普通に&lt;ruby&gt;タグで表示させると、

```html:html
アナと<ruby>雪<rt>ゆき</rt></ruby>の<ruby>女王<rt>じょうおう</rt></ruby>
```

**Chrome、Safari、Internet Explorer**
　![アナと雪の女王](https://qiita-image-store.s3.amazonaws.com/0/37964/b8778489-2e29-aae1-f80c-308fa8fa7266.png)

**Firefox**
　![アナと雪ゆきの女王じょうおう](https://qiita-image-store.s3.amazonaws.com/0/37964/fb2ee149-32fa-ff47-c2a4-f6942ff2073f.png)

Firefoxでは&lt;rt&gt;タグが無視されてしまうわけで、
大抵の場合は&lt;rp&gt;タグで非対応ブラウザ向けに括弧を付与して回避するわけです。

```html:html
アナと<ruby>雪<rp>（</rp><rt>ゆき</rt><rp>）</rp></ruby>の<ruby>女王<rp>（</rp><rt>じょうおう</rt><rp>）</rp></ruby>
```

**Firefox**
　![アナと雪（ゆき）の女王（じょうおう）](https://qiita-image-store.s3.amazonaws.com/0/37964/2b0749f1-542f-3a59-f29b-9b51f42a8ef1.png)

というふうになります。これでルビの役目は果たしますが、
ここまでやるほどそこまでルビは重要じゃないよね。といったケースもあります。
で、それならば、Firefoxだけ非表示にしてしまおう。というときには簡単なCSSだけで解決できます。

```css:css
@-moz-document url-prefix() {
  rt, rp {
    display: none;
  }
}
```

**Firefox**
　![アナと雪の女王](https://qiita-image-store.s3.amazonaws.com/0/37964/5ca806dc-0a7d-d5ce-d24e-2c8e38ca7b73.png)

Mozillaの独自拡張 @-moz-document url-prefix で、
無視されていた&lt;rt&gt;タグを（すでに利用していたら&lt;rp&gt;タグも）そのまま非表示にするだけです。
Cocoapodsでインストールしたライブラリのヘッダーファイルが見つからない場合（Xcode6）

Xcode6にて既存プロジェクトをgitにてCloneして後、CocoaPodsでインストールしたライブラリの.hファイルが見つからないバグに遭遇してだいぶ悩んだのでメモ。

#解決策
参考：http://stackoverflow.com/questions/26095775/cocoapods-cant-find-header-xcode-6

上記Stackoverflowの解答画像にある通りProject設定からProject→InfoにあるConfigurationsの中のDebug・Release設定の○○TestsがNoneになっているのをPods.○○に変更する。

これで実行できるようになります。
$(function(){}) と $(window).on('load',function(){}) の違い

ページ読み込み時に処理を実行したい場合、いろいろな書き方があると思います。
このあたりの違いをまとめました。

## 種類

jQueryのready と jsで昔から愛用されているonload がある。

### ready

```js
$(function(){
	alert('Hello');
});

//または
$(document).ready(function() {
	alert('Hello');
});

//または
jQuery(function() {
	alert('Hello');
});

//または
jQuery(document).ready(function(){
	alert('Hello');
});

//JavaScript
document.addEventListener('DOMContentLoaded', function(){
	alert('Hello');
}, false);
```

jQueryの書き方は、省略しているだけなので、どの書き方をしても同じです。


### load

```js
$(window).on('load',function(){
	alert('Hello');
});

//または
$(window).load(function(){
	alert('Hello');
});

//JavaScript
window.onload = function(){
	alert('Hello');
}
```



## 実行されるタイミング

### ready

DOMツリーの構築が完了したら実行される。

### load

画像、動画などの関連データの全ての読み込みが完了したら実行される。

### つまり

readyは画像などが表示されるより前に実行され、loadは画像などが表示された後に実行されます。

では、どんなときにどちらを使った方が良いのでしょうか？

#### [ready]

* htmlを置き換えるものや、表示するかしないかを制御するもの ex)ラジオボタンが選ばれていたら、表示する など
* ウインドウサイズによって決まるもの ex)スムーススクロールのコンテンツのポジション取得 など(場合によっては、rezsizeイベントも必要)
* 読み込み時間をカモフラージュするためのアニメーションなど

#### [load]

* 画像の大きさを取得するものや、画像の大きさによって可変するもの
* ページ遷移時に表示するアニメーション(特にスマホは、readyにしてしまうと、ページが表示されたときにはもう終わっていたりする…)

こんな感じでしょうか？

## 複数ある場合の実行

複数の記述をする場合、ほとんどは、特に気にする必要はありません。
全て実行されます。
しかし、以下のもののみ、最後に記述したもののみ実行されます。

```js
window.onload = function(){
	alert('javascript1');
}
 
window.onload = function(){
	alert('javascript2');
}

window.onload = function(){
	alert('javascript3');
}
```

「javascript3」のみ表示されます。

## おさらい

以下のように記述した場合、どの順番で表示されるでしょうか？

```js
$(window).on('load',function(){
	alert('jq_on_load1');
});

window.onload = function(){
	alert('js_onload1');
}

$(function(){
	alert('jq_ready1');
});

document.addEventListener('DOMContentLoaded', function(){
	alert('js_ready1');
}, false);

$(window).load(function(){
	alert('jq_load1');
});

$(window).load(function(){
	alert('jq_load2');
});

$(window).on('load',function(){
	alert('jq_on_load2');
});

window.onload = function(){
	alert('js_onload2');
}

$(function(){
	alert('jq_ready2');
});

document.addEventListener('DOMContentLoaded', function(){
	alert('js_ready2');
}, false);
```

以下の順番に表示されます。

[テキスト表示]
jq_ready1
jq_ready2
js_ready1
js_ready2
[画像表示]
jq_on_load1
jq_load1
jq_load2
jq_on_load2
js_onload2

※ js_onload1は表示されません。

## おまけ

### DOMツリーとは

DOM（Document Object Model）とは、HTMLドキュメントやXMLドキュメントをプログラムから利用するためのAPIのことです。
DOMではHTMLドキュメントやXMLドキュメントをオブジェクトのツリー状の集合として取り扱います。
それを"DOMツリー"と言います。
DOMツリーの中の一つひとつのオブジェクトはノードと呼びます。

JavaScriptでは、このDOMを操作し、ページの再読み込みなしにページの一部を書き換えたり、スタイルを変えたりすることが出来ます。

こちらのサイトでは、DOMツリーを可視化することが出来ます。
[domtree](http://domtree.breckyunits.com/?v=2)
![DOMツリー.png](https://qiita-image-store.s3.amazonaws.com/0/34634/9d064abc-72d8-ad78-77fb-3f550a96cc87.png)
[Haskell小話②] 文字列のみなしかた

# 文字列のリテラルぽいのは糖衣構文
```hs
"Hello"
```

をただの糖衣構文だとみなすとHaskellの世界がより潔白なモノになってよいです.

`"hello"`は

```hs
(:) 'h' ((:) 'e'  ((:) 'l' ((:) 'l' ((:) 'o' []))))
```

の糖衣構文です.

順番にひも解いてみましょう.

`String` は `[Char]` のエイリアスにすぎないので、

```hs
"Hello"
```

は

```hs
['h', 'e', 'l', 'l', 'o']
```

の糖衣構文とみなせます.

また上記の様なリストの宣言は第二引数のリストの先頭に第一引数の要素を加える関数`(:)`

の省略とみなせるので結局のところ

```hs
(:) 'h' ((:) 'e'  ((:) 'l' ((:) 'l' ((:) 'o' []))))
```

の糖衣構文とみなす事ができます.

全部関数の評価と考えられるといいですね〜

無理やりにもっというと

`'h'` と`[]`はそれぞれ`Char`クラスと`List`型コンストラクタのデータを作るコンストラクタだとみなしすともっと純粋な世界とみなせますね.
关于物流

## 几种物流方法
###ヤマト運輸 
[ホームページ](http://www.kuronekoyamato.co.jp/top.html)
###佐川宅急便 
[ホームページ](http://www.sagawa-exp.co.jp/)
###ゆうパック
[ホームページ](http://www.post.japanpost.jp/service/you_pack/)
###はこBooN 
[ホームページ](https://www.takuhai.jp/hacoboon/hb166)
###アマゾンFBA
[ホームページ](http://services.amazon.co.jp/services/sell-on-amazon/soa-fba.html)

## 配送用的盒子
[ホームページ](http://www.danboru.net/goods/goodsSearch.asp#bottom_open)
盒子大小 我觉得这种[200x140x60](http://www.danboru.net/goods/goodsDetail.asp?cateCode=0010000000&pCode=001#bottom_open)应该就足够了,具体大小最好确认一下。
貌似原本就有盒子的，不过品牌名字是中文的，而且盒子运过来与麻烦还贵。
是否有纸质的兜子或者塑料兜子品牌用？
还有一个大点儿号的盒子[310x220x80](http://www.danboru.net/goods/goodsDetail.asp?cateCode=0010000000&pCode=AN05#bottom_open)大约[macair 11寸大小](https://www.apple.com/jp/macbook-air/specs.html)

##配送用的商标
最好自己打印商标
如果自己邮送的话也最好不要手动填写单子 因为显得不专业 需要打印机？
有的公司提供相关服务 [佐川急便](http://www.sagawa-exp.co.jp/service/okurijyou-support/e-hidenweb/)

##宣传用的小册子
* 准备一个宣传用的小册子,对每一款产品进行介绍 一定是彩色（印刷，国内？日本?)最好先准备200册 [日本貌似非常贵](http://raksul.com/flyer/a3/coat_standard_4c4c_option-14-5/?amount=1)
* 一个Feedback卡片(含邮费)はがき?(はがきの料金は全国一律で、1通52円です。)
* 商品二维码 款式介绍用网站(facebook)什么的
iOSアプリ中のUIWebviewで広告ブロック(Objective-C)


# 背景

[UIWebViewにおけるAdBlockをSwiftで実現している記事](http://qiita.com/shzero5/items/755fd80bc759a5460c43)があるのですが
Objective-C向けのプロジェクトで同じことをしたかったので書きなおして利用させていただきました。
(iOS7, 8で動作確認)

# ソースコード

## FilteredURLProtocol

```Objective-C:FilteredURLProtocol.h
@interface FilteredURLProtocol : NSURLProtocol
+(BOOL)canInitWithRequest:(NSURLRequest *)request;
+(NSURLRequest *)canonicalRequestForRequest:( NSURLRequest *)request;
-(void)startLoading;
-(void)stopLoading;
@end
```

```Objective-C:FilteredURLProtocol.m
#import "FilteredURLProtocol.h"

@implementation FilteredURLProtocol
+(BOOL)canInitWithRequest:(NSURLRequest *)request
{
    NSString *host = request.URL.host;
    if ([host rangeOfString:@"ad"].length) return YES; // <- ここの条件でコンテンツを出し分ける
    return NO;
}

+(NSURLRequest *)canonicalRequestForRequest:( NSURLRequest *)request
{
    return request;
}

-(void)startLoading
{
    NSURLResponse *response = [[NSURLResponse alloc] initWithURL:self.request.URL MIMEType:nil expectedContentLength:0 textEncodingName:nil];
    [self.client URLProtocol:self didReceiveResponse:response cacheStoragePolicy:NSURLCacheStorageNotAllowed];
    [self.client URLProtocol:self didLoadData:[NSData dataWithBytes:nil length:0]];
    [self.client URLProtocolDidFinishLoading:self];
}

-(void)stopLoading
{}

@end
```

## UIViewControllerでの利用方法

利用したいUIViewControllerでNSURLProtocolに設定してやる。
viewWillAppearとかviewDidLoadあたりに記述してやればOK。
ただし、一度設定すると、アプリ内の全ての場所で適用されてしまう。
そのため、他の画面でこの機能が不要になる場合はviewWillDisappearあたりで解除する。

```WebViewController.m
#import "FilteredURLProtocol.h"

// (略)

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    [NSURLProtocol registerClass:FilteredURLProtocol.class];    
}

- (void)viewWillDisappear:(BOOL)animated
{
    [NSURLProtocol unregisterClass:FilteredURLProtocol.class];    
    [super viewWillDisappear:animated];
}

```


# 参考
iOS - SwiftでNSURLProtocolを使ってUIWebViewの広告をブロックする - Qiita
http://qiita.com/shzero5/items/755fd80bc759a5460c43

iOS Advent Calendar 2011 5日目 / NSURLProtocolの使い方 : As Sloth As Possible
http://faultier.blog.jp/archives/1762587.html
GooglePlayGameServiceにつながらない時に確認する項目

GooglePlayGameServiceにつながらない時に確認する項目。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/19676/e5e8b1bb-dbca-a372-33c9-d0ab356c9694.png)

以下の項目をクリアできれば、たぶんきっとおそらくたいてい大丈夫。

#### PackageName
***
DeveloperConsoleで登録したものと同じか確認する。
パッケージ名を変えたいときは → http://goo.gl/m7MnwP

iOSでいうところのBundleIdentifier的なもの


#### app_id
***
```strings.xml
<string name="app_id">01234567890</string>
```
strings.xmlじゃなくても解決できればどこでもいい

#### meta_data
***
```AndroidManufest.xml
<meta-data android:name="com.google.android.gms.games.APP_ID"
           android:value="@string/app_id" />
<meta-data android:name="com.google.android.gms.version"
           android:value="@integer/google_play_services_version"/>
```

#### CloudServiceもなど使う場合はappstateも追加
***

```AndroidManufest.xml
<meta-data android:name="com.google.android.gms.appstate.APP_ID"
           android:value="@string/app_id" />
```


#### GameHelperの初期化引数
***
最新のBaseGameUtilsに含まれるGameHelperを使う場合、ネットのサンプルとかを写経して`GameHelper.CLIENT_ALL`を引数にしてしまうと上記のappstateの記述も必要になる。で、appstateの記述がないとサインインしようとした時に落ちる。

必要に応じて`GameHelper.CLIENT_GAMES`とかにしましょう。

`GameHelper.CLIENT_ALL`のフラグの中身は確認してちょ。

#### アプリの認証
***
アプリを作っただけでSHA1とかもろもろ登録してないケース。
Wizardにしたがって進めると自然と登録する流れになるが、見落としてたり、後から変更したい場合にはこちらから。
https://console.developers.google.com/project

#### SHA1の確認
***
DeveloperConsoleで登録した証明書（SHA1）とビルドしたものに含まれているSHA1が同じものか確認する。

サインイン失敗した場合、Eclipseで繋いで実行してるとapkに使われてる情報がLogCatに出力されるので確認しやすい。

keytoolを使って確認してもいいけど、apk作った時にもダイアログに出てるし、Debug用のならEclipseの
`「環境設定（Preferences）」→「Android」→「Build」`
でも確認できる。

ちなみに、この設定ページでデフォルト以外のデバッグ用証明書も登録できるが、ここで使うにはデフォルトのと同じくパスワードが「android」になっている必要があるらしい。（自分では試していない）

DeveloperConsoleに登録してある情報は、先のURLから確認できる。
https://console.developers.google.com/project


#### APIの有効化
***
https://console.developers.google.com/project/
から対象のプロジェクトを選択し、左側にある「API」を選択。
ここで使いたいAPIが有効になっているか確認する。

Google Play Game Management
Google Play Game Service
Google+ API

CloudServiceを使わなければ、いわゆる普通にアチーブメントとかリーダーボードとか使いたいだけなら、ココらへんが有効になっていれば大抵事足りる。

#### テストユーザー
***
![スクリーンショット 2014-12-26 16.04.49.png](https://qiita-image-store.s3.amazonaws.com/0/19676/fff18fdb-714b-94d6-6c78-d81a468dc81e.png)

#### 著作権侵害対策
***
GooglePlay経由してないものは弾くという設定。オフにする。
**開発中のアプリでも弾かれます。**
「ONにしておいたほうが安全じゃない〜？ふふ〜ん」
という浅はかな認識でONにしておいて弾かれまくってハマった。
リリース後に必要に応じて設定しましょう。

![スクリーンショット 2014-12-26 16.07.01.png](https://qiita-image-store.s3.amazonaws.com/0/19676/ecb43812-ccb4-9996-4841-d777d2846fec.png)

***

以上です！
今すぐJadeを最新版にして、selfオプションを有効にすればレスポンスが8倍早くなる（かも）【Node.js】

# はじめに
* 個人で運営しているWebサービスの話です。
* Express + Jade の標準的な構成で運用
* メインページのレスポンスタイムが600ms超えで絶望
* ボトルネック調査で **`res.render()`** が98%以上の時間を占めていることが判明

# 結論は2つ
1. Jadeを最新版にしてみよう
1. selfオプションを今すぐ有効にしよう

| Jade 1.7.0 | Jade 1.8.2  | Jade 1.8.2 (enable 'self' option) |
|:----------:|:-----------:|:---------------------------------:|
|   620ms    |    160ms    |     80ms                          |

# 1.7.0 -> 1.8.2（4倍早い）
* `npm update jade`
* ダメ元で、Jadeのバージョンアップを行いました。効果抜群でした。
* 公式のChange Logを読んでも「大幅にperformance向上したよ」的なことは書いてありません。何故こんなに早くなったのかまでは調査していません。

# selfオプション（更に2倍早い）
### なにそれ
* Jadeの変数展開はデフォルトだと、内部で `with` 構文を利用している。爆遅。
* selfオプションを有効にすると **常に** 'self' namespaceを通じて変数にアクセスする。爆速。

### 使い方
'self' namespaceを有効にしたいtemplateのrender時に `{ self: true }` を指定するだけ。

```js:example.js
res.render('watch', {
	id: 777,
	self: true
});
```

template側で変数にアクセスする際は `#{self.id}` のようにする。（ `#{id}` ではなく ）

# 参考
* [jadeを知る](http://nextdeveloper.hatenablog.com/entry/2013/12/10/180457)
* [JavaScript：with構文によるブロックスコープ再考](http://blog.tojiru.net/article/197591734.html)
[Haskell小話①] >>=の代わりに=<<で可読性をチョイあげ

# あいさつ

Haskellや圏論ではおなじみのバインド

```
(>>=)  :: m a -> (a -> m b) -> m b
```

の逆バージョンの`=<<` を使うと可読性があがる場面は多い.

```
(=<<)  :: (a -> m b) -> m a -> m b
```

# `=<<` を使ってリファクタリング！

まずこんなコードを例に取ります.

```hs
main = do
  args <- getArgs
  mapM_ putStrLn args
```

端末から引数を受け取ってIOモナドから値を取り出してputStrLnで出力する簡単な例です.

(出力もIOモナドで包まないといけないので`mapM_ `を使う事に注意されたい）

このコードをdoを使わずに書こうと思ったら、

```hs
main = getArgs >>= mapM_ putStrLn
```

というのがパッと浮かぶと思うのですが、
（Haskell力が低いからかもしれません）

ここは一つ

```hs
main = mapM_ putStrLn =<< getArgs
```

と書いてみると、おおよそ

```hs
main = map putStrLn getArgs
```

みたいにとらえる事が出来て可読性があがるよね！foo↑

つまり関数を左辺に、モナドに包まれたものを右辺におくと通常の関数ぽくみなせてすごく良い.
【FileMaker】検索件数が0件のときにメッセージを出す

まー、頭のキャッシュが小さいので取り急ぎで残しておきます。

~~Get(対象レコード数)~~
Get(最終エラー) = 401

このGetの中身がいつもでてこないんですよねー。
なまじ日本語なだけに、めんどくさい面があります。

![1206_1.png](https://qiita-image-store.s3.amazonaws.com/0/60538/dfa4116c-fe81-f731-fa6a-0954c1f12a3f.png)

実行させると、メッセージがでてダイアログが終わったら全件表示します。
![1206_2.png](https://qiita-image-store.s3.amazonaws.com/0/60538/9b30572c-1ae4-2154-86f4-656ddf6f027e.png)

はー、毎回検索するのがめんどくさいです。
スクリプトを書くときに"Get("と書いたらプルダウンとか出てきてほしいです。

※「対象レコード数」だと挙動不審のケースがあるとのアドバイスがあったので、更新しました。
AWSでWEBサーバー構築手順


EC2でWEBサーバーを立ち上げ、セッティング、PHPをインストールしSESを使った問い合わせを実装したWEBサイトをRoute53でドメインを紐付け公開する手順の記録。
今後の予定としてこの手順を自動化しデプロイ可能にすること。

## EC2の起動
Amazon Linux AMIを利用、InstanceTypeはとりあえずt2.micro、EBSは8GB、他はデフォルトのまま。
※ReservedInstanceの設定は今回はなし

## SecurityGroupを設定
Inbound　SSH
Outbound　All

## Elastic IPの設定
InstanceIDを指定し、ElasticIPをひもづける。

## EC2にSSH接続
秘密認証キーのパーミッション変更
`$chmod 400 ~/hoge/hoge.pem`

sshアクセス
`$ssh -i ~/hoge/hoge.pem ec2-user@xx.xx.xx.xx`

## WEBサーバーセッティング
- SecurityGroup確認、InboundのHTTP、HTTPSを許可する。
- 参考リンクをもとにApache、PHPをインストール後、Apacheを起動する。

>参考リンク　[チュートリアル: LAMP ウェブサーバーのインストール - Amazon Elastic Compute Cloud](http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/install-LAMP.html)

- ブラウザにElasticIPで設定したIPアドレスでアクセスし、ApacheのTestページが表示されればOK！
- 次にapacheのドキュメントルートの所有権の変更。コレでec2-userからドキュメントルートにアクセスを出来るようにする。
- アクセス権の設定が完了すればSFTPが利用可能なFTPソフトなどでアクセスできるようになる。

>参考リンク　[AWSインスタンスにSFTPで接続（Cyberduck） | 日々是迷子](http://www.hibimai.com/2014/02/05/175/)

## Route53を使ったホストゾーンの作成
上記リンクをもとにホストゾーンを作成後、Aレコードを設定。ドメインとElasticIPをひもづける。
今回はhoge.com、www.hoge.comに設定。
>参考リンク [ホストゾーンの使用 - Amazon Route 53](http://docs.aws.amazon.com/ja_jp/Route53/latest/DeveloperGuide/AboutHZWorkingWith.html)

## SESを使ったお問い合わせフォームの実装
###SES のセットアップ
>参考リンク [Amazon SES のセットアップ - Amazon Simple Email Service](https://docs.aws.amazon.com/ja_jp/ses/latest/DeveloperGuide/setting-up-ses.html)

管理画面からSESの利用設定をする。EmailAdressの設定ページでアドレスを設定。
認証メールが登録したアドレス宛に届くので確認する。
上記手順でSESお試しモード（sandbox access）の利用が可能になる。

__sandbox accessとProduction Accessの違い__
sandbox accessは以下の制限がある

- 登録したメールアドレスのみ送信可能
- 最大で 24 時間あたり 200 メッセージを送信できます。
- 最大で 1 秒あたり 1 メッセージを送信できます。

Production Accessでフル稼働させるにはリクエストをAWSに送る。1営業日必要。

###AWS PHP SDKのセットアップ

今回は一番簡単に実装出来る方法にしました。
1.SESの利用登録後、IAMユーザーを作成する。Policyは"AmazonSESFullAccess"を利用。
2.Credential Key Passwordを控えておく
3.こちらのダウンロードからaws.pharをダウンロード [AWS SDK for PHP | アマゾン ウェブ サービス（AWS 日本語）](http://aws.amazon.com/jp/sdkforphp/)
4.PHPスクリプトを作成。参考はこちらがわかりやすいです [AWS SDK for PHPを使ってAmazon SESからメール送信 - F.Ko-Jiの「一秒後は未来」](http://blog.fkoji.com/2013/02040009.html)
5.あとは通常のフォーム作成と同じです！

##参考リンクまとめ
[ホストゾーンの使用 - Amazon Route 53](http://docs.aws.amazon.com/ja_jp/Route53/latest/DeveloperGuide/AboutHZWorkingWith.html)
[Amazon SES のセットアップ - Amazon Simple Email Service](https://docs.aws.amazon.com/ja_jp/ses/latest/DeveloperGuide/setting-up-ses.html)
[SSH を使用した Linux/Unix インスタンスへの接続 - Amazon Elastic Compute Cloud](http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/AccessingInstancesLinux.html#AccessingInstancesLinuxSCP)
[AWS SDK for PHP — AWS SDK for PHP 2.7.12 documentation](http://docs.aws.amazon.com/aws-sdk-php/guide/latest/index.html)
[AWS SDK for PHP | AWS SDK for PHP](http://docs.aws.amazon.com/aws-sdk-php/latest/index.html)
Windows 曜日単位のバックアップ作成バッチ

# はじめに
Windowsで、曜日単位で指定したフォルダをバックアップするバッチです。
gitサーバのデータフォルダをデイリーでバックアップする必要があったので作成しました。
その内容を共有します。

例ではC:¥scripts内にすべてのファイルを配置しています。
私はスケジューラから毎朝2:00にgitBackup.batを実行するようにしていました。

「タスクスケジューラの基本的な使い方（Windows 7／8／8.1編）」
http://www.atmarkit.co.jp/ait/articles/1305/31/news049.html

# ファイル作成

### gitBackup.bat

キックする対象のbatファイル。
以下の内容ですと平日のみバックアップを作成します。

```lang:gitBackup.bat
@echo off
echo 開始
cscript /b C:¥scripts¥wday.vbs
REM echo wday:%errorlevel%
if %errorlevel%==7 echo.
if %errorlevel%==6 BackupExec.bat 06_Friday
if %errorlevel%==5 BackupExec.bat 05_Thursday
if %errorlevel%==4 BackupExec.bat 04_Wednesday
if %errorlevel%==3 BackupExec.bat 03_Tuesday
if %errorlevel%==2 BackupExec.bat 02_Monday
if %errorlevel%==1 echo.
```

### wday.vbs
上記ファイルから呼ばれる、曜日取得のスクリプトファイル。

```lang:wday.vbs
@echo off
echo 開始
cscript /b C:¥scripts¥wday.vbs
REM echo wday:%errorlevel%
if %errorlevel%==7 echo.
if %errorlevel%==6 BackupExec.bat 06_Friday
if %errorlevel%==5 BackupExec.bat 05_Thursday
if %errorlevel%==4 BackupExec.bat 04_Wednesday
if %errorlevel%==3 BackupExec.bat 03_Tuesday
if %errorlevel%==2 BackupExec.bat 02_Monday
if %errorlevel%==1 echo.
```

### BackupExec.bat

ネットワーク上のドライブを作成し、ファイルコピー後にその設定を削除、という動作をさせています。
バッチ実行ユーザに権限が足りないとここで失敗するかもしれないので注意してください。

この例の場合、Cドライブ直下のgitblitフォルダを、ネットワーク上の別のマシンのbackup¥daily¥gitフォルダにコピーしています。

```lang:BackupExec.bat
@echo off
echo %1
set logfile="%date:‾0,4%-%date:‾5,2%-%date:‾8,2%_backup.log"
NET USE Z: /d /y
NET USE Z: ¥¥[IPアドレス]¥backup [パスワード] /USER:[ユーザ名]
C:¥Windows¥System32¥Robocopy.exe C:¥gitblit Z:¥daily¥git¥%1 /E /R:2 /W:10 /NP /LOG+:"%logfile%"
NET USE Z: /d /y
```

# おわりに
曜日単位で作成されたバックアップフォルダは、翌週上書きされるので気を付けてください。
適宜、値を変更して使用してみてください。

何かの参考になりましたら幸いです。
CircleCI経由でElasticBeanstalkにデプロイする方法

## circle.ymlを定義する

まずは`circle.yml`にデプロイ方法を記述していきます。
なお、ここではstagingブランチをステージング環境、masterブランチをプロダクション環境としていますので、プロジェクトによって適宜変更してください。

```yaml:circle.yml

machine:
  python:
    version: 2.7.6

dependencies:
  pre:
    - pip install awsebcli

deployment:
  staging:
    branch: staging
    commands:
      - eb deploy env-name-of-staging
  production:
    branch: master
    commands:
      - eb deploy env-name-of-production

```

まず、ElasticBeanstalkのデプロイに必要な`eb`コマンドをインストールします。
そして、デプロイ時はebコマンドから環境を指定してやれば、その環境にデプロイされます。
また、後述の設定ファイルでデプロイ先の環境を指定することもできます。

Pythonのバージョンを指定しているのは、それによってvirtualenv環境が設定されてキャッシュが効くようになるからです。

## eb用の設定ファイルを定義する

続いて、ebコマンド用の設定ファイルを用意します。
ファイル名は`config.global.yml`か`config.yml`のどちらかにする必要があります。

```yaml:.elasticbeanstalk/config.global.yml

global:
  application_name: app-name
  default_region: someweher

```

最低限必要なのは`application_name`だけですが、ここで`default_region`を定義しない場合は`eb --region=somewhere`の形式で都度指定する必要があります。
また、`branch_default`以下にブランチごとの設定を書くことも可能です。

## .gitignoreに追記する

最後に、`.gitignore`に追記していきます。

まず、ebコマンドは`.elasticbeanstalk`以下に色々とファイルを生成するので、これをバージョン管理しないようにします。

しかし、先ほど設定した設定ファイルはデプロイ時に必要なため、例外にします。

```bash:.gitignore

.elasticbeanstalk/*
!.elasticbeanstalk/config.global.yml

```

これで準備は完了です。
gitのブランチに変更があった際に、CircleCIでビルドが走り、デプロイが反映されれば成功です。
UISwitchがOFFの時の背景色カスタマイズ方法

UISwitchにはcolorを設定するプロパティが3つあります。

```
UISwitch *sw = [UISwitch new];
sw.tintColor = [UIColor blueColor];
sw.onTintColor = [UIColor redColor];
sw.thumbTintColor = [UIColor greenColor];
```

offの時には青くて、onの時には赤くて、ツマミが緑のSwitchができました。

![IMG_4728.PNG](https://qiita-image-store.s3.amazonaws.com/0/34405/0cc30aea-1390-ec58-b3a7-36738306de86.png)
![IMG_4729.PNG](https://qiita-image-store.s3.amazonaws.com/0/34405/224a477f-16b2-dbd6-7b06-5eebee1c7bb7.png)

…offのときの背景色、白い。
黒のほうがいいので、backgroundColorを設定します。

```
sw.backgroundColor = [UIColor blackColor];
```

![IMG_4730.PNG](https://qiita-image-store.s3.amazonaws.com/0/34405/5e16159c-bd8f-ad9b-95ad-9b3490c518db.png)
![IMG_4731.PNG](https://qiita-image-store.s3.amazonaws.com/0/34405/1e3311c7-e143-b5ed-bbc8-0fb3d3f7ba11.png)

**!!?**

こんなときはlayer.cornerRadiusを設定しましょう。

```
sw.layer.cornerRadius = sw.frame.size.height/2;
```

![IMG_4732.PNG](https://qiita-image-store.s3.amazonaws.com/0/34405/00f6b259-12b7-2384-4063-450b2beab71d.png)
![IMG_4733.PNG](https://qiita-image-store.s3.amazonaws.com/0/34405/062e1145-583a-e3df-4063-df258397d255.png)

できあがり。
[blackbird-aerospike] blackbird で Aerospike をモニタリングする

# blackbird aerospike plugin

この plugin では aerospike の様々な情報を取得し、backend にデータを送信します

![aerospike1.png](https://qiita-image-store.s3.amazonaws.com/0/40416/d8406eab-183e-3482-2bbf-3aabe9099fe2.png)

![aerospike2.png](https://qiita-image-store.s3.amazonaws.com/0/40416/affcdd42-c71a-44ae-6b13-656fb2c988d5.png)


## 取得してくる項目

基本的には `asinfo` で取れる項目を取得します

* `asinfo -v latency`
* `asinfo -v namespace/<ns>`
* `asinfo -v sets/<set>`
* `asinfo -v get-config`
* などなど

namespace 及び set の情報は Low Level Discovery で自動的に拾うようにしています

# Install

## blackbird 本体

[こちら](http://qiita.com/makocchi/items/9166016b2ad4cc43e83f)を参考に install してください

## Install aerospike plugin

setup.py で入れる方法と rpm で入れる方法があります

### setup.py で install

```bash
git clone https://github.com/Vagrants/blackbird-aerospike.git
cd blackbird-aerospike
python setup.py install
```

### rpm で install

```bash
yum install blackbird-aerospike --enablerepo=blackbird
```

# この plugin を使う前に

## citrusleaf.py

この `blackbird-aerospike` の module は `citrusleaf` という python の module が必要になります
`citrusleaf` ですが `aerospike-tools` のパッケージに入っていますので blackbird を起動させるサーバーに install しておくか、パッケージから `cistrusleaf.py` を抜き出して `sys.path` のどこかに置いて下さい

## daemon.py を排除する

`aerospike-tools` を install した場合、`/opt/aerospike/lib/python` が `sys.path` に追加されます
実は `/opt/aerospike/lib/python/daemon.py` が曲者で、`python-daemon` と conflict して blackbird が起動しなくなります(Aerospike 3.4.0 現在)
ですので `/opt/aerospike/lib/python/daemon.py` は rename してください

この `/opt/aerospike/lib/python/daemon.py` ですが `asgraphite` から import されてますので、`asgraphite` を使う場合は `asgraphite` 内の import の部分を rename 後の名前にしてください

# plugin の設定をする

config は `/etc/blackbird/conf.d/aerospike.cfg` にあります

```ini:/etc/blackbird/conf.d/aerospike.cfg
[aerospike]
module = aerospike

# Aerospike server setting
#
#ashost = 127.0.0.1
#asport = 3000

# If aerospike cluster is set enable-security true, 
# please set asuser and aspass
#
#asuser = admin
#aspass = admin
```

cluster の設定で `enable-security` が `true` の場合は認証情報が必要になります
適宜 asuser 等を設定してください

監視の間隔は 60 秒がデフォルトですが、変更したい場合は

```ini:/etc/blackbird/conf.d/aerospike.cfg
interval = 30
```

のように指定してください

設定が終わったら `blackbird` を再起動させます

```bash
sudo /etc/init.d/blackbird restart
```

# Zabbix 上でデータが入ってきているか確認する

Zabbix の Template は [github の repository](https://github.com/Vagrants/blackbird-aerospike/tree/master/templates)にあります
Zabbix に import して対象のサーバーに適用させて下さい

**Zabbix 上の host 名と blackbird が起動しているサーバーの host 名が違う場合は `/etc/blackbird/conf.d/aerospike.cfg` 上で hostname を設定してあげる必要があります**
Zabbix 上と合わせてください

```ini:/etc/blackbird/conf.d/aerospike.cfg
hostname = your_static_hostname
```

# その他

* この module は Aerospike 3.3.26 と 3.4.0 で動作確認してます
* Aerospike 3.4.0 の場合、asinfo (citrusleaf で取れる値)の一部の format が崩れている不具合があるので取得できない item があります
CodeIgniterで初期表示。のための設定。


サーバーのことがわからないと多分ハマるステップ
***

**初歩のしょ**
MVCをおさらいしつつ、ベーシカルなページを作って表示しようとして参考にしたのはこちら：
[軽量PHPフレームワーク 'CodeIgniter' 徹底ガイド！](http://www.ci-guide.info/)
[CodeIgniter ユーザガイド 日本語版 Version 2.0.3](http://codeigniter.jp/user_guide_ja/index.html)

####ルーティングとmod_rewrite
ルーティング＝パスやクエリ文字列によって、処理されるクラスやアクションメソッドが決定される
ttp://localhost/ドメイン/index.php/login/index/Taro/Jiro
login=controller,class
index=action,method
Taro,Jiro=methodのparamater1,2
index.phpはない方が見た目的にもSEO的にも美しい
ttp://localhost/ドメイン/~~index.php~~/login/index/Taro/Jiroとするには
　＝＞mod_rewriteの出番

* .htaccessを有効化

[.htaccessを有効にする](http://www.be-webdesigner.com/technotes/server/httpd_conf/htaccess.htm)
XAMPPのApacheのconfigボタンより、httpd.confを選択して上記リンクを参考に編集

* .htaccessの編集

サンプル
`RewriteEngine on
RewriteCond $1 !^(index\.php|images|js|css|robots\.txt|favicon\.ico)
RewriteRule ^(.*)$ /index.php/$1 [L]`

.htaccessの影響する範囲について知識がなかったために、結構ハマったポイント。
サンプルはC:\xampp\htdocsにindex.phpがある構成
自分のものはC:\xampp\htdocs\ドメインにindex.phpがある構成

なので、ドメインのところにあるindex.phpと同階層の.htaccessに対して、修正
`RewriteEngine on
RewriteCond $1 !^(index\.php|images|js|css|robots\.txt|favicon\.ico)
RewriteRule ^(.*)$ /ドメイン/index.php/$1 [L] `

このRewriteCondの中にある拡張子のラインナップに、使用しているファイルのものが含まれていないと表示するときにエラーになるので要注意。
例でいえばjs、cssはサンプルではJavaScript、StyleSheetでした。作ったjsやcssファイルをjs・cssフォルダへ格納して、あれ表示されないぞ？なんてことになっていました。

* config.phpの編集

`$config['base_url']	= ''`
→`$config['base_url']	= 'http://localhost/ドメイン/';`
`$config['index_page'] = 'index.php';`
→`$config['index_page'] = '';`
`$config['uri_protocol'] = 'AUTO'; `
→`$config['uri_protocol'] = 'PATH_INFO';` 
index_pageの設定を見落としていて、mod_rewriteで消していたindex.phpが画面遷移後に付加され直されてしまい、気持ち悪い思いをしました :sweat_smile: 

***
以上の設定を行い、MVCに沿ったサンプルを作ってページを表示ができました。
なおここまでの設定は個々の環境によって違うので、必須ではありません。
のちのちつまづいたら見る用に、ピックアップしてみました。
GitHub API で メンバーごとにPullRequest回数をカウント 

Pull Request をメンバごとにカウントするため、
GitHub APIを使ってみた。


```rb

require 'net/http'
require 'uri'
require 'json'
 
uri = URI.parse('http://XXXXXXXX/api/v3/repositories')
json = Net::HTTP.get(uri)
result = JSON.parse(json)
 
puts 'repos, created_at, html_url, user.login'
pullreq = {}
 
result.each{|var|
  repos = var['full_name']
  page = 1
 
  begin
    reposUri = URI.parse("http://XXXXXXXX/api/v3/repos/#{repos}/pulls?state=all&per_page=100&page=#{page}")
    reposJson = Net::HTTP.get(reposUri)
    reposResult = JSON.parse(reposJson)
 
    reposResult.each{|reposVar|
      if reposVar['created_at'] > '2014-09'
        puts "#{repos}, #{reposVar['created_at']}, #{reposVar['html_url']}, #{reposVar['user']['login']}"
        pullreq["#{reposVar['user']['login']}"] = 0 unless pullreq.key?("#{reposVar['user']['login']}")
        pullreq["#{reposVar['user']['login']}"] += 1
      else
        break
      end
    }
    page += 1
  end while page <= 10
}
 
puts ''
 
pullreq.sort{ |(k1,v1),(k2,v2)| v2<=>v1 }
       .each{ |k,v| puts "#{k}:#{v}" }

```

## 参考

### all public repositories

http://XXXXXXXX/api/v3/repositories

参考：[list-all-public-repositories](https://developer.github.com/v3/repos/#list-all-public-repositories)

### list-pull-requests

http://XXXXXXXX/api/v3/repos/:owner/:repo/pulls

参考：[list-pull-requests](https://developer.github.com/v3/pulls/#list-pull-requests)

## 感想

- GUIにてプルリクMAX(Num)を確認してとりあえず「page <= 10」とした。
[Swift]String型の配列からInt型の配列に変換する方法でつまづいた


俺の名はケンヤ。難事件をいくつも迷宮入りさせたニート。しかし ある時謎の組織に入社し薬を飲まされ身体が縮んで **Braian** になっちゃった。

##mapを使用した変換

```
var numbersString: [String] = ["1", "2", "3"] 
var numbersInt: [Int] = []

numbersInt = numbersString.map({ (value: String) -> Int in
                return value.toInt()!
            })
            // [1, 2, 3]
```

##forを使用した変換

```
var numStrings: [String] = ["1", "2", "3"]
var numIntegers: [Int] = []

for str in numStrings {
    numIntegers.append(str.toInt()!)
}
// [1, 2, 3]
```

これですね！！
個人的には基本的にはmapが好きです！！

他の書き方やこうしたほうがいいなどあればコメントくださいませ！！
おねがいします。

もっと良い書き方を教えて頂きました！！！
koherさんありがとうございます。


![修正.png](https://qiita-image-store.s3.amazonaws.com/0/53382/0d875e3f-e467-c62f-52f4-f83560e46d56.png "修正.png")
インベントリファイルを使用せずにlocalhostに対してplaybookを実行する

ec2インスタンス立てる時などに、わざわざインベントリファイル作るのダルいしいけてない。
そんな時は`-i`の引数に`"localhost,"`を指定すればインベントリファイル無しでも実行できる。
playbookの`hosts`には`all`と書いておけばいい。
1.7と1.8で動作確認済み。

例

```sh
$ ansible-playbook -i "localhost," aws.yml
```

そもそもこんなこと書くのもどうかと思う。

参考
http://ansible.pickle.io/post/86598332429/running-ansible-playbook-in-localhost
Githubのレポジトリ間でIssuesをコピーする

ググってまず見つかったのが[StackOverflow](http://stackoverflow.com/questions/9720718/how-do-i-move-an-issue-on-github-to-another-repo)。
しかし紹介されていた[github-issues-import](https://github.com/IQAndreas/github-issues-import)はうまく動作せず。

もう少しググってみたら見つかったのが、[こちらのblog](http://justinlee.sg/2013/07/16/importing-github-milestones-labels-issues-comments-from-one-repository-to-another/)。
紹介されているgistの[github-import-issues](https://gist.github.com/agarny/5541773)は問題なく動作した。
スクリプトの先頭でgithubの認証情報とかレポジトリ情報書き換えるだけなのでたぶん見ればわかります。

注意しないといけないのが、__実行するとコピー先のラベルとマイルストーンは全削除__されてしまうので、既存レポジトリには使えなさそうなこと。
quartz APIの基礎

# はじめに

相変わらずツマラナイサンプルですが、社内の人に向けて書いてみました。
quartz APIについての情報が少ないのでまとめておきます。

# 基本的なこと

quartzにはJOBとTriggerという概念があります。

* JOB実行したい処理を書きます。JOBインタフェースをimplementsすればなんでもかけます。
* Triggerはスケジュールを表現するクラスです。cron expressionが使えますが、cronexpressionを使わずともAPIを使って同じことはできます。（今回は割愛）
* 上記のJOBとTriggerをScheduleインタフェースを使って操作します。

# JOBとTriggerをまとめて登録

```
		Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();

		JobDetail job = JobBuilder
				.newJob(EbsSnapshotJob.class)
				.withIdentity(EbsSnapshotJob.class.getSimpleName(),
						Services.AWS.getName()).storeDurably().build();

		CronTrigger trigger = TriggerBuilder
				.newTrigger()
				.withIdentity("12345", "4")
				.withSchedule(
						CronScheduleBuilder.cronSchedule("00 */20 * * * ?")
								.inTimeZone(TimeZone.getTimeZone("Asia/Tokyo")))
				.forJob(job).startNow().build();

		scheduler.scheduleJob(job, trigger);
```

# JOBの登録

ExamplesではJOBの登録とTriggerの登録を同時にするものしかありませんが、もちろんJOBのみの登録ができます。storeDurably()を設定しないとJOBのみの登録できません。

``` 
        Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();

        JobDetail job = JobBuilder.newJob(EbsSnapshotJob.class)
                .withIdentity(EbsSnapshotJob.class.getCanonicalName(), Services.AWS.getName())
                .storeDurably()
                .build();
        scheduler.addJob(job,false);
```

# JOBの削除

JOBの削除を行うにはJobKeyを設定し、deleteJobを呼び出します。
この時紐づくTriggerも全部消えてしまいますので使用には十分気をつけましょう。

```
        Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
        JobKey jobKey = new JobKey(EbsSnapshotJob.class.getSimpleName(), Services.AWS.getName());
        scheduler.deleteJob(jobKey);
```

# Triggerの登録を行う（JOBは存在）

TriggerにforJobを設定してあげれば良いです。

```
        Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();

        JobDetail job = JobBuilder.newJob(EbsSnapshotJob.class)
                .withIdentity(EbsSnapshotJob.class.getCanonicalName(), Services.AWS.getName())
                .build();

        CronTrigger trigger = TriggerBuilder
                .newTrigger()
                .withIdentity("12345", "4")
                .withSchedule(
                        CronScheduleBuilder.cronSchedule("00 */10 * * * ?")
                                .inTimeZone(TimeZone.getTimeZone("Asia/Tokyo"))).forJob(job).startNow().build();

        scheduler.scheduleJob(trigger);

```

# Triggerの変更

rescheduleしてあげます。下記の例ではTriggerKeyのTriggerをCronTriggerで定義したものに置き換えています。

```
        Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();

        CronTrigger trigger = TriggerBuilder
                .newTrigger()
                .withIdentity("12345", "4")
                .withSchedule(
                        CronScheduleBuilder.cronSchedule("00 */20 * * * ?")
                                .inTimeZone(TimeZone.getTimeZone("Asia/Tokyo"))).forJob(job).startNow().build();

        TriggerKey triggerKey = new TriggerKey("12345", "4");
        scheduler.rescheduleJob(triggerKey, trigger);
```

# Triggerの削除

```
        Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
        TriggerKey triggerKey = new TriggerKey("12345", "4"); 
        scheduler.unscheduleJob(triggerKey);
```
ソースコードビルドをするときに自分で決めたルールのメモ


# ディレクトリの使い方
| path | usage |
| :--- | :--- |
|  /usr/local/share/downloaded/ | ソースコードのダウンロード先 |
|  /usr/local/src/ | ソースコードの解凍・コンパイル |
|  /usr/local/lib/ | ビルド先 |
|  /usr/local/ | bin ディレクトリのシンボリックリンク生成先 |
| /usr/local/etc/ld.so.conf.d/ | soファイルパス設定ファイル設置 |


- 本当は実行ファイル自体のシンボリックリンクを /usr/local/bin に作った方がいいのかもしれないけど、以下の理由で回避：
 - /usr/local/bin には普通PATHが通っちゃってるので、むやみに実行可能なプログラムを増やしたくなかった
 - ひとつのビルドで複数の実行ファイルができることがあって、いちいちシンボリックリンク貼るのが面倒

- /usr/local/etc/ld.so.conf.d/ 以下の.confファイルを /etc/ld.so.conf.d/ 以下にシンボリックリンクを貼る

## ディレクトリの作成
```
sudo mkdir -p -m 0777 ¥
/usr/local/share/downloaded/ ¥
/usr/local/etc/ld.so.conf.d/

```


# 必須パッケージ
```
yum list installed wget tar gcc gcc-c++ make nano
```

- 入ってなければインストールする

## 必須パッケージのインストール
```
sudo yum install wget tar gcc gcc-c++ make nano
```
IntelliJ IDEAでgoの標準ライブラリがエラー表示になるのを解消する

* [Go の開発環境は IntelliJ IDEA + golang plugin がマトモだった](http://qiita.com/kaiinui/items/433eb86c022ffcad0bea)(by kaiinuiさん)

kaiinuiさんのエントリーにあるように、Goを書くときにストレスが一番少ないのは今のところIntelliJ IDEAな気がします。まだまだ荒削りなところとかはあるのですが、うまく動いているときは快適にコードが書けます。

ただ、使っているとたまに標準ライブラリを認識しないことが多数。fmtとかも赤くなってしまいます。どうも、新規作成でウィザードを使ってプロジェクトを作るとうまくいくのですが、git cloneしてきたフォルダを後からIntelli Jで開くとうまくいっていない模様。

kaiinuiさんのエントリーの4のimportを治すというのをやろうとしたのですが、右クリックでライブラリ情報編集というメニューが出てこなかったので無理やり直してみました。

.imlファイルの作成
---------------------------

まずはダミーのプロジェクトを新規作成して、.imlファイルを取得します。Mac OS Xなら以下の内容をコピペすればOKです。OSごとに共通っぽい。 `プロジェクト名.iml` というファイルがトップに作成されます。プロジェクト名のところを、修正したいプロジェクト名に変えます。

```xml
<?xml version="1.0" encoding="UTF-8"?>
<module type="GO_MODULE" version="4">
  <component name="NewModuleRootManager" inherit-compiler-output="true">
    <exclude-output />
    <content url="file://$MODULE_DIR$" />
    <orderEntry type="jdk" jdkName="Go SDK go1.3.3 darwin/amd64" jdkType="Google Go SDK" />
    <orderEntry type="sourceFolder" forTests="false" />
  </component>
</module>
```

で、これを `.idea` フォルダに投入すればOK。モジュールの設定は `.idea/modules.xml` にかかれていますが、新規作成ではプロジェクトのルートに、フォルダを開くをすると、 `.idea` 以下に.imlファイルがあるという定義がされています。後者の場合はその肝心のファイルがそもそも作られてなくて存在しないのでライブラリが見つけられないみたい。認識されない場合は `.idea/modules.xml` を参照して、そこに書かれているファイル名と一致しているか確認してみてください。

年明けたらプラグインの開発元にフィードバックします。
PythonのNotImplementedError

ドキュメントに
>exception NotImplementedError
>この例外は RuntimeError から派生しています。ユーザ定義の基底クラスにおいて、抽象メソッドが派生クラスでオーバライドされることを要求する場合、この例外を送出しなくてはなりません。

と書いてあります。とりあえず絶対オバーライドしろよって場合には使えばよさそうです。

```py
# -*- coding: utf-8 -*-

class BaseTest(object):
    def hogehoge(self):
        raise NotImplementedError()


class Test(BaseTest):
    def hogehoge(self):
        print "hogehoge"


class Test2(BaseTest):
    pass


if __name__ == "__main__":
    test = Test()
    test.hogehoge()

    test2 = Test2()
    test2.hogehoge()
```

出力結果

```shell-session
hogehoge
Traceback (most recent call last):
  File "test.py", line 22, in <module>
    test2.hogehoge()
  File "test.py", line 5, in hogehoge
    raise NotImplementedError()
NotImplementedError
```
ガチャのロジックを比較してみた

ガチャのロジックをいくつか見てきたけど、どれがいいか検証してみた。
主に2種類あって、以下の通り

# ロジックの種類

0. 確率の数だけIDのリストを積んで、shuffleして1件取得する方法
0. 確率の累計を求めてmt_randで選択

#### 案1
```php
$data = self::getData(); // CSVからデータ取得
$list = array();
foreach ($data as $record) {
    // 確率の個数分$listに積んでいく
    for ($i = 0 ; $i < $record['rate'] ; $i++) {
        $list[] = $record['id'];
    }
}
// リストを混ぜる
shuffle($list);
// リストの先頭1件を取得
return array_shift($list);
```

#### 案2
```php
$data = self::getData(); // CSVからデータ取得
// 確率の合計値を求める
$max = 0;
foreach ($data as $record) {
    $max += $record['rate'];
}

// 0から始まるので合計値から1を引いた数までの乱数を取得
$rate = mt_rand(0, $max-1);

// 乱数がどこに当たるか調べていく
foreach ($data as $record) {
    $max -= $record['rate'];
    if ($max <= $rate) {
        return $record['id'];
    }
}
throw new Exception('ここには来ないはず!');
```

#### データ(ID,確率)
```
1,10
2,10
3,10
 :
 :
50,1
51,2
52,3
53,4
```

# 計測結果

計測の種類として以下の観点でのパターンを用意し、指定回数ガチャを引くのを10回施行した平均をとりました。

* IDの増減
* 確率の数値の大小

|IDの数|確率の数値|ガチャ回数|案1|案2|
|:--:|:--:|--:|--:|--:|
|100|1-100|10000回|19.7sec|1.5sec|
|100|10000-20000|10000回|30sec以上|1.5sec|
|100000|1-100|100回|47.0sec|1.9sec|
|100000|10000-20000|100回|メモリ溢れ|30sec以上|

※上記、案1のshuffleはrand、案2はmt_randなので正確なベンチではありません。
(mpywさんのコメントの記事参照。情報ありがとうございます。)

案2の圧勝ですね。結果は予想通りだったでしょうか？

何でこれをやったかって？
そりゃあ、案1の方が速いと譲らないPLがいたからですよ。。。

他にも違うパターンを見つけたら、それも試してみたいと思います。
（最初にSR,R,Nなどの引くランクを求めて、対応したガチャを引く系は除外）

# 2015/12/24追記

shuffleはrandを利用しているらしいです。
なので、ベンチマークをより正確にするならば以下のロジックとする必要がありますね
PHP7ではrandom_intという関数ができたようです。PHP7環境の場合はこちらを利用するものよいかと。

- 案2のmt_randをrandにする
- 案1のshuffleをmt_randを使うようなメソッド作る

とはいえ、大きな差が出てるので、結果は覆らないと思いますが。。。

mpywさん情報ありがとうございました。
http://qiita.com/mpyw/items/c644dab7d067626fc629
PHPでユークリッド距離を求める

KMeans法を実装したくて、<a href="http://www.amazon.co.jp/exec/obidos/ASIN/4873113644/kuredev-22/ref=nosim/" name="amazletlink" target="_blank">集合知プログラミング</a>本を読んでいる途中のメモ。

ユークリッド距離の計算方法は以下の通り。（Wikipediaより）

![ScreenClip.png](https://qiita-image-store.s3.amazonaws.com/0/50690/7a5dd3a5-175f-8cd7-ed1f-a9959480a98f.png)

以下、コード＋試験。エラー処理などは特になし。

```php:EuclidDistance.php
<?php

function distance($data1, $data2) {
    $num = 0;
    for ($i = 0; $i < sizeof($data1); $i++) {
        $num += pow($data1[$i] - $data2[$i], 2);
    }
    return sqrt($num);
}

var_dump(distance(array(1, 1), array(4, 5)));//int(5)
```
peco + ssh + 社内API + jq = 対話型sshで仕事が捗った

社内にホスト名一覧をjsonで返すAPIがあったので、jqとpecoで対話的にホスト名を選択してログインできるようにした。

## .bashrc

```bash:.bashrc
function list_intra_hosts() {
  # 社内APIが返すjsonの"name" キーがホスト名
  # jqでホスト名のみをリスト化
  curl -sS http://apihost/hosts | jq -r '.[] | .name'
}

function ssh_intra_host() {
  ssh $(list_hosts | peco)
}

alias pssh=ssh_intra_host
```


## 使い方

```shell-session
$ pssh
```

## まとめ

社内APIと連携して対話的にホストにログインすることができた。

個人的にpecoなどを社内のオペレーションの仕組みに取り入れる発想があまりなかったので、ちょっとしたライフジェインジングなハックだった。
初めてのC初心者限定#3


###投稿の動機
専門学校でPG教えてます。時間の制約の為、c++もさらっとしか教えられないので、学生さん向けにまとめようと思います。
ついでにcがわからんと思い込んでる方々の参考になれば幸いです。
プロには不要なまとめです。あくまで、初心者むけです。
ご指摘は大歓迎です。積極的に取り入れていきます。

###環境
####Linux,Unix,Mac
ターミナルからコマンドを発行。
gcc -v
インストール済みなら、何らかリターンがあります。

####Windows
VmWare Playerをインストール
Linuxの仮想環境を作りましょう。

bcc32 .netのコンパイラを勧めない理由。
結局Unix、Linuxを勉強しなきゃならんのです。

###条件判断if
```c:If.c
#include <stdio.h>

int main(void)
{
    int ans;
    printf("Input Number!");
    scanf("%d", &ans);
    if(ans < 0){
        printf("It's minus.\n");
    }
    else if(ans > 0){
        printf("It's plus.\n");
    }
    else {
        printf("It's zero.\n");
    }

    return 0;
}

```
整数を入力します。
正、負、0しかないので、そのように記述します。


###コンパイル
```
gcc -o If If.c
```

###Run
```
./If
```
![kobito.1419562980.189125.png](https://qiita-image-store.s3.amazonaws.com/0/33317/7f64ee11-0c8f-6eae-877d-eb65231af3e9.png "kobito.1419562980.189125.png")


はい簡単です。

###おまけ
Macならsayコマンドを使って 
./If | say

してみると、ちょっと楽しい。
全てのGItプロジェクトのバックアップ

社内で扱っているGitのプロジェクトが増えてきて、バックアップ取らないとまずいなーと思っていたので、やってみました。

下記のスクリプトで、全プロジェクトの全リモートブランチのバックアップが可能です。


    #!/bin/sh

    REPO_DIR="/backup/git/repositories"
    SOUR_DIR="/backup/git/source"

    for filepath in ${REPO_DIR}/*
    do
        cd ${filepath}
        project_name="$(echo -n "$filepath" | cut -d/ -f5)"

        # master branch backup
        git checkout master
        git pull origin master
  
        if [ ! -e $SOUR_DIR/$project_name/master ]; then
            mkdir -p $SOUR_DIR/$project_name/master
        fi
        
        cp -frp $REPO_DIR/$project_name/* $SOUR_DIR/$project_name/master

        # other branch backup
        for remote_branch in `git branch -a | grep remotes | grep -v HEAD | grep -v master`;
        do
            branch_name="$(echo -n "$remote_branch" | cut -d/ -f3)"
            git checkout $branch_name
            git pull origin $branch_name

            if [ ! -e $SOUR_DIR/$project_name/$branch_name ]; then
                mkdir -p $SOUR_DIR/$project_name/$branch_name
            fi

            cp -frp $REPO_DIR/$project_name/* $SOUR_DIR/$project_name/$branch_name
        done

        git checkout master

        echo "${filepath} Repository Complete!"
    done


一応問題なく回っていますが、この方法だと、先に指定のディレクトリに全リポジトリをcloneしておかないとバックアップ対象にならないのがネックです。

もっといい方法があればぜひ教えて下さい。
Xcode 6.1のiOSシミュレータ上で、日本語環境でアプリを起動する


Xcode 5.xのときはシミュレータの「Settings」アプリで「General」->「Language & Region」を日本語に設定すると `[NSLocale preferredLanguages]`とかで日本語環境向けの処理ができたのが、Xcode 6.1からどうやらそれが無視されるようです。

以下のように日本語環境を指定して起動すると、Xcode 6.1でも日本語環境が適用されるみたい。

```
$ rake args="-AppleLanguages '(ja)'"
```

* Before
![141226-0001.png](https://qiita-image-store.s3.amazonaws.com/0/2075/b0e7a8bb-6bf2-0a42-686f-644c77556fcf.png "141226-0001.png")


* After
![141226-0002.png](https://qiita-image-store.s3.amazonaws.com/0/2075/309b5197-c0b5-6b27-0883-9037c166bfb5.png "141226-0002.png")

`Rakefile`で以下のように環境変数を設定してあげると、iOSシミュレータ上でアプリを起動するときは、毎回日本語環境が適用されるようになります。

```ruby
ENV['args'] ||= "-AppleLanguages '(ja)'"  

Motion::Project::App.setup do |app|
  # Use `rake config' to see complete project settings.
  ...
end
```
__name__の中身

\_\_name\_\_に入る値は下記のようになります。

-----

実行する構成
.
├── entry_point.py
└── test_module.py

```py:entry_point.py
# coding: utf-8

if __name__ == "__main__":
    # エントリポイントとして呼ばれた場合には
    # __name__には"__main__"文字列が入る

    # ex) python entry_point.py
    print "__main__!!"
else:
    # 他からimportなどmoduleとして呼ばれた場合には
    # __name__にはモジュール名が入る

    # ex) python test_module.py
    # __name__ == "entry_point"
    print __name__
```

```py:test_module.py
import entry_point
```

-----

entry_point.pyを実行した場合
% python entry_point.py
\_\_main\_\_!!

test_module.pyを実行した場合
% python test_module.py
entry_point

-----

実行方法により入る値が変わるようです.
Python ゲッター、セッターなどサンプル

方法1

```py
# -*- coding:utf-8 -*-

class Test(object):
    def __init__(self):
        self._x = None

    def getx(self):
        print "getx."
        return self._x

    def setx(self, value):
        print "setx."
        self._x = value

    def delx(self):
        print "delx."
        del self._x

    x = property(getx, setx, delx)

if __name__ == "__main__":
    test = Test()

    test.x = 1
    test.x
    del test.x
```

実行結果

```shell-session
setx.
getx.
delx.
```
---
方法2

```py
# -*- coding:utf-8 -*-

class Test(object):
    def __init__(self):
        self._x = None

    @property
    def x(self):
        print "property x."
        return self._x

    @x.setter
    def x(self, value):
        print "setter x."
        self._x = value

    @x.deleter
    def x(self):
        print "deleter x."
        del self._x

if __name__ == "__main__":
    test = Test()

    test.x = 1
    test.x
    del test.x
```

実行結果

```shell-session
setter x.
property x.
deleter x.
```
Pythonでモジュール名とクラス名の取得のサンプル

```py
# -*- coding: utf-8 -*-

class Test(object):

    @classmethod
    def class_method(cls):
        print "cls.__module__", cls.__module__
        print "cls.__name__", cls.__name__

if __name__ == "__main__":
    Test.class_method()
```

出力結果

```shell-session
cls.__module__: __main__
cls.__name__: Test
```
Pythonのフックメソッドの簡単なサンプル

よく使いそうなフックメソッドのサンプル

```py
# -*- coding: utf-8 -*-

class Test(object):

    def __init__(self):
        print "Call __init__\n"

    def __getattr__(self, name):
        print "Call __getattr__"
        print "name: {}".format(name)
        print ""

    def __setattr__(self, name, value):
        print "Call __setattr__"
        print "name: {}".format(name)
        print "value: {}".format(value)
        print ""

if __name__ == "__main__":
    test = Test() # __init__が呼ばれる

    # __getattr__が呼ばれる
    # 存在しない属性でもOK
    test.aaa

    test.bbb = 1 # __setattr__が呼ばれる
```

以下、出力結果

```shell-session
Call __init__

Call __getattr__
name: aaa

Call __setattr__
name: bbb
value: 1
```
CodeIgniterをいれてみたメモ。

注）自分が入れた組み合わせをメモしていっただけなので、ベターな組み合わせはあると思います。
***

**XAMPP ver 5.6.3**
*localhostが403になってしまう対策
[ローカル環境で、http://127.0.0.1/には入れて、http://localhostに入れない時の設定方法](http://p-bn.com/making-a-website/xampp-localhost.html)
hostsファイルと、.htaccessを編集

*セキュリティ画面の文字化け対策
下記を参考に一部解消
[改めてXAMPPのセキュリティ画面の文字化けを解決 | ふーたらのページ (GALAXY S4やAndroidやドコモとiPad miniもね)](http://fu-tara.com/wordpress000460/)

*それでも一部残っている場合
文字コードのせいらしい
UTF8で開きたいけど、なぜかエディタが勝手にSJISで開いてしまったので、[FileCodeChecker](http://www.forest.impress.co.jp/docs/review/20121217_578855.html)でセキュリティのlangフォルダ内を一式UTF8に変換

*PATH追加
XAMPPでMySQLを入れてもPATHは自動で入らない？ので手動追加
→C:\xampp\mysql\bin\
***

**CodeIgniter ver 2.2.0**
*初期表示がうまく表示されない
`A PHP Error was encountered
Severity: Notice
Message: Only variable references should be returned by reference
Filename: core/Common.php
Line Number: 257`

[Codeigniter 2.1.4 and php5.6 / Forums / Community / EllisLab](https://ellislab.com/forums/viewthread/244510/)
を参考に、core/Common.phpを修正。
wp_posts テーブル中で最新の行 ID を取得する



post テーブルにおける、無条件で最新の ID を取得する。


前提
----------------
- 外部の PHP プログラムから WordPress を操作する
- `wp-load.php` が読み込まれている


本題
----------------
生に近い SQLクエリを DB に投げて取得する。

`wp-load.php` をロードしていると $wpdb というグローバル変数がセットされる。

[Class Reference/wpdb « WordPress Codex](http://codex.wordpress.org/Class_Reference/wpdb)

これを使って

```php
global $wpdb;
$postIdMax = $wpdb->get_var("SELECT MAX(ID) AS postIdMax FROM {$wpdb->posts}");
```

のようにする。先述の " *生に近い* SQL クエリ " と書いたのは、上のようにクエリ中で
`$wpdb->posts` などと書けば、テーブル名を直接していしなくて良いから。

WordPress のデフォルトのテーブル名だと `wp_something` となるが、独自にテーブル接頭辞をカスタムして `wp_abcdefg_something` などとしている場合や、開発環境と本番環境でテーブル名が異なる場合でも、 `$wpdb->posts` のお陰でコードを分けなくて済むという利点がある。

以上。


余談
----------------
当初試みた処理はをメモしておく。失敗したけど。

```php
$wp_get_recent_posts_arg = [
    'numberposts' => 1,
    'offset' => 0,
    'category' => null,
    'orderby' => 'post_id',
    'order' => 'DESC',
    'include' => null,
    'exclude' => null,
    'meta_key' => null,
    'meta_value' => null,
    'post_type' => 'post',
    'post_status' => 'draft, publish, future, pending, private, auto-draft, inherit',
    'suppress_filters' => false,
];
$postId = wp_get_recent_posts($wp_get_recent_posts_arg);
var_dump($postId[0]);
```

これだと `auto-draft` なども含めた本当の最新 ID は取れなかった。
`wp_get_recent_posts()` はあくまで最新の投稿データである ID を取得するものなのかも。


参考
----------------
- [php - select and get most recent post ID from wpdb - Stack Overflow](http://stackoverflow.com/questions/17758645/select-and-get-most-recent-post-id-from-wpdb)
- [Writing Custom Queries in WordPress - Tuts+ Code Tutorial](http://code.tutsplus.com/tutorials/writing-custom-queries-in-wordpress--wp-25510)
- [WordPress › Support » get latest post id](https://wordpress.org/support/topic/get-latest-post-id)
apacheのrewrite_modで特定のパスだけ除外する

PHPでフロントコントローラでリクエストを捌くようにしたのだが、その時のURLの設定で悩んだのでメモ。
（もしもっとエキセレントなやり方があったらぜひコメントで教えていただけると嬉しいです・・！）


1.URLがhttp://xxx.xxx.com/index.php/xxx となってしまうのでindex.phpを無くしたいとおもった
2.apacheを利用していたのでhttpd.confでhttp://xxx.xxx.com/ にアクセスしたときに、http://xxx.xxx.com/index.php にリライトされるようバーチャルホスト設定をした。

```apache
<VirtualHost *:80>
 ServerName xxx.xxx.com
 DocumentRoot "/var/www/html/xxx.xxxx"
 DirectoryIndex index.html index.php
 ErrorLog /var/log/httpd/xxx.xxx.com_error_log
 AddDefaultCharset UTF-8
 RewriteEngine On
 RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f
 RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-d
 RewriteRule . /index.php [L]
 <Directory "/var/www/html/xxx.xxx">
 AllowOverride All
 </Directory>
</VirtualHost>
``` 

3.これでok！かと思っていたのだが画像ファイルが軒並み開けなくなる。
4.http://xxx.xxx.com/resouces 以下においてあったファイルが、リライト設定によりhttp://xxx.xxx.com/index.php/resouces と判断されてしまい開けないのだとわかる
5.リライト時にresourcesフォルダだけ除外するようにする。

```apache
#下記を追加
 RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !^/resources/(.*)$
```

6.これで画像ファイルも開けるようになった。

これがメジャーなやり方なのかわからないです。
jenkinsでCakePHPのテスト、の設定

## 設定前半

1. プロジェクト名を入れる

1. 古いビルドの破棄にチェック

1. Log Rotation を選んで保存日数を30日に

1. ソースコード管理でGitを選択
`Repository URL` にはアルミニウムのリポジトリのパスを入れる。
例）/var/opt/alminium/git/myproject

1. ブランチのところは `*/develop` かな・・。

1. ビルドトリガは「定期的に実行」でスケジュールが
`H 1 * * 1-5`

## ビルド設定

### まず、ソナー

```
cd ${WORKSPACE}
/usr/local/bin/sonar-runner-2.3/bin/sonar-runner
```

リポジトリからパス `${WORKSPACE}` に展開される。
例）/var/lib/jenkins/jobs/PHP/workspace
直下に`sonar-project.properties`が置かれている。その場所でsonar-runnerを走らせる、という意味。
つまりソナーランナーもあらかじめこのサーバーにインストールしてある

### 次、コードスニッファー

```
cd ${WORKSPACE} && /usr/bin/phpcs --report=checkstyle --report-checkstyle=${WORKSPACE}/reports/checkstyle.xml --standard=CakePHP \
--extensions=php --ignore=app/Vendor/*,app/Test/*,app/Plugin/*,app/Config/* ./app || id
```

workspace直下のreportsというディレクトリ内に`checkstyle.xml`という結果のファイルを出力せよ、という意味。
つまりworkspace直下にreportsというディレクトリをあらかじめ作っておく。
これもあらかじめphpcsがサーバーにインストールしてあるイメージ。

### phpunitの実施

```
cd ${WORKSPACE}/app && Console/cake test app All \
--stderr \
--log-junit ${WORKSPACE}/reports/junit.xml \
--coverage-html ${WORKSPACE}/reports/clover_html/ \
--coverage-clover ${WORKSPACE}/reports/clover.xml
```

こちらも結果をreports以下に出力している。
`Console/cake test app All`　ここはcakeのコマンドそのまま。DB接続がなくても動くのかどうかは不明。

## ビルド後の処理

1. 「Checkstyle警告の集計」を選んで設定。
ファイルで上記の`reports/checkstyle.xml`を設定。workspaceからの相対パスでいい

1. 同じくCloverPHPカバレッジレポート集計`reports/clover.xml`
CloverHTMLレポートを公開するにチェック
`reports/clover_html/`
JUnitテスト結果の集計に`reports/junit.xml`