OmniAICreator/Qiita-1.07M huggingface dataset:
Pepper内に保存したテキストを書き加えていく方法メモ

#参考記事
* [Pepperでファイル保存したり取り出したり](http://qiita.com/yacchin1205/items/95e98591abdc598d2bc4)
* [Python で、既存のテキストにデータを書き加えたいと思っています。 - OKWave](http://okwave.jp/qa/q6089899.html)
* [Python – ファイル入出力 ファイルへのテキスト書き込み - あるエンジニアの不定期勉強記録](http://abalone.ununu.org/archives/784)

#動機
大学院（IAMAS）の講義でPepperをいじる予定だったが、Pepperが届かないためNAOを使っている。かなり苦戦している。
**目のカメラでLINEのQRコードを読み込ませて、友だち追加用URLをNAOの中にストックさせる**クズロボットをつくろうと思った。
スタンドアロン環境でやるには、**読み込むたびに、アドレスをtextファイルに追加しなくてはいけない。**この講義で初めてPythonを読んだ、変数の指定の仕方もわからないクソ初心者なので、qiitaの練習がてら、とりあえず書き残そうと思った。


#方法

[Pepperでファイル保存したり取り出したり](http://qiita.com/yacchin1205/items/95e98591abdc598d2bc4)の、`Write Text`と`Read Text`を参考に、**保存されているテキストを一旦読み込んで、新規テキストを書き込み、その下に保存されていたテキストを書き込む**、という手順を踏むことにした。下記の2つを参考。

* [Python で、既存のテキストにデータを書き加えたいと思っています。 - OKWave](http://okwave.jp/qa/q6089899.html)
* [Python – ファイル入出力 ファイルへのテキスト書き込み - あるエンジニアの不定期勉強記録](http://abalone.ununu.org/archives/784)

##プログラム

`Write Text`の、`onInput_onStart`を下記の通り書き変える。

```py
    def onInput_onStart(self, text):
        import codecs
        try:
            with codecs.open(self.getParameter("File path"), "r", self.getParameter("Encoding")) as f:
                text2 = f.read()
            with codecs.open(self.getParameter("File path"), "w", self.getParameter("Encoding")) as f:
                f.write(text.decode("utf8"))
                f.write('\n'.decode("utf8"))
                f.write(text2.decode("utf8"))
            self.onStopped()
        except IOError as e:
            self.logger.error("Failed: %s" % str(e))
            self.onFailure(str(e))
```


* text2とかじゃない、もっとスマートな変数はあるかもしれない。
* もっとスマートな改行もあるかもしれない。


##他、ひっかかったとこ
![スクリーンショット 2015-05-25 14.26.30.png](https://qiita-image-store.s3.amazonaws.com/0/77925/73737752-e91d-dc99-0382-1897b1302c11.png)

NAOの内部にテキストを保存するには、File Pathを`/home/nao/***.txt`にする必要がある。.txtじゃなくてもいいのかも。
NAOの内部ストレージのアドレスが`/home/nao/`なんですね。これはあちこち探してもあんまり書いてなくてひっかかった。


##結果
![スクリーンショット 2015-05-25 14.18.25.png](https://qiita-image-store.s3.amazonaws.com/0/77925/89f2be89-22b9-9515-1618-d34cd9dc8d68.png)

![スクリーンショット 2015-05-25 14.17.19.png](https://qiita-image-store.s3.amazonaws.com/0/77925/e16d7955-21fa-fa8c-f73b-ada66aa11816.png)

QRコードの読み取り結果が一行ずつ保存されるようになったよ！**これでうまくQRコードかざしてもらえば、後からtext抜き出してURL打ち込んだら友達がふえるよ！**やったねたえちゃん！
ていうかネットつながってれば、こんなめんどくさいことしなくても、メールで送るなりやり方いっぱいありそう。


#最後に
Pepperいじりたい :joy: :joy: :joy:
jQuery javascriptの覚え書き

jQurery,javascriptでのテクニックの覚え書きです。
少しずつ更新していく予定です。

## DOMオブジェクトの簡潔な書き方
inputタグを作成したいとき、

```
var $input = $('<input>', {
  type:  'hidden',
  name:  'user_id',
  value: '1002'
});
```

エスケープもしてくれるので、便利!


## 追加した要素にイベントが有効にならない

```
$('button').click(function() {...});
```

こうでなくて

```
$(document).on('click', 'button', function(){...})
```

こう書くと追加した要素に対しても有効になる。
※.live()は使わない
C#で「ソフトウェアエンジニアならば1時間以内に解けなければいけない5つの問題」の5問目

[1時間以内に解けなければプログラマ失格となってしまう5つの問題が話題に - ソフトアンテナブログ](http://www.softantenna.com/wp/software/5-programming-problems/)
なんとも言えない無理矢理感…

```csharp:Program.cs
using System;
using System.Linq;

namespace FiveProblemOfFive
{
    class Program
    {
        static void Main(string[] args)
        {
            Enumerable.Repeat(new[] { " ", "-", "+" }, 9).Aggregate(Enumerable.Repeat("", 1)
                , (a, ca) => from s in a from c in ca select s + c)
                .Select(p => string.Concat(p.Select((x, i) => "" + x + (i + 1))).Replace(" ", ""))
                .TakeWhile(x => !x.StartsWith("+"))
                .Select(x => x.Replace("-", "@-").Replace("+", "@+").Split('@').Where(y => y != ""))
                .Where(x => x.Select(int.Parse).Sum() == 100)
                .ToList().ForEach(x => Console.WriteLine(string.Concat(x) + "=100"));
        }
    }
}
```
Ghostscriptのエラー


[ここ](http://yutaka-j.hatenablog.com/entry/2013/07/06/231952)にあるようなフォントの問題でもないようだ…

``` 
GPL Ghostscript 9.10 (2013-08-30)
Copyright (C) 2013 Artifex Software, Inc.  All rights reserved.
This software comes with NO WARRANTY: see the file PUBLIC for details.
Loading NimbusSanL-Regu font from /opt/local/share/ghostscript/9.10/Resource/Font/NimbusSanL-Regu... 3685004 2190824 4035440 2605142 2 done.
Can't find (or can't open) font file /opt/local/share/ghostscript/9.10/Resource/Font/Times.
Can't find (or can't open) font file Times.
Querying operating system for font files...
Error: /typecheck in /findfont
Operand stack:
   --dict:16/16(ro)(L)--   TimesLatin1   Times
Execution stack:
   %interp_exit   .runexec2   --nostringval--   --nostringval--   --nostringval--   2   %stopped_push   --nostringval--   --nostringval--   --nostringval--   false   1   %stopped_push   1916   1   3   %oparray_pop   1915   1   3   %oparray_pop   --nostringval--   1899   1   3   %oparray_pop   1787   1   3   %oparray_pop   --nostringval--   %errorexec_pop   .runexec2   --nostringval--   --nostringval--   --nostringval--   2   %stopped_push   --nostringval--   --nostringval--   1868   3   3   %oparray_pop
Dictionary stack:
   --dict:1171/1684(ro)(G)--   --dict:0/20(G)--   --dict:122/200(L)--
Current allocation mode is local
Last OS error: Invalid argument
Current file position is 4862
GPL Ghostscript 9.10: Unrecoverable error, exit code 1
```
ソート済みハッシュ(zset)コマンド覚書


```
# ひとつのノード登録
> ZADD myzset 1 "one"
# 一度に複数のノード登録
ZADD myzset 2 "two" 3 "three"

# 登録したノードを表示
ZRANGE myzset 0 -1 WITHSCORES
1) "one"
2) "1"
3) "two"
4) "2"
5) "three"
6) "3"

# 上書き
> ZADD myzset 100 "one"
(integer) 0
> ZRANGE myzset 0 -1 WITHSCORES
1) "two"
2) "2"
3) "three"
4) "3"
5) "one"
6) "100"

# ノード削除
> zrem myzset "two"
(integer) 1

ZRANGE myzset 0 -1 WITHSCORES
1) "three"
2) "3"
3) "one"
4) "100"

```
nginxで「 no resolver defined to resolve 」エラーに対処する

nginxを使っていて、proxy_passなどでIPアドレスではなくホスト名を利用したい場合は、

<pre>
location / {
    resolver 192.168.0.2 valid=2s;//DNSサーバのIP
</pre>
のように記載すると、無事ホストからエイリアスを引いてくれます。

AWS上でVPCを構築しており、Route53を利用している場合は、VPCのローカルネットワークアドレスの2番目が固定で設定されているので、「10.xxx.xxx.2」や「172.xxx.xxx.2」など指定すれば、Route53を見てくれます。

##nginx_lua_moduleを利用してDBに接続する場合
OpenResty等で、nginx_lua_moduleを利用し外部DBなどに接続する場合のホスト名も同様です。

例えば、AWS上のVPCでプライベートDNSをRoute53で構築している場合、

<pre>
location / {
   resolver 192.168.0.2 valid=2s;
   local mysql = require "resty.mysql"
   local db, err = mysql:new()
   if not db then
      ngx.exit(ngx.HTTP_SERVICE_UNAVAILABLE)
   end
   local ok, err, errno, sqlstate = db:connect{
      host = "db.hogehoge.local",
         port = 3306,
         database = "aiueo",
         user = "username",
         password = "userpass"
   }
</pre>
データベースのホストにホスト名を使いたい場合は、resolverディレクティブを指定する必要があります。


resolverで指定する値はIPアドレスである必要があります（多分）。

よろ。
【Hubot】AWSの利用料金を聞くと答えてくれるようにした

#<i class="fa fa-dollar" style="font-size:1em;"></i>　概要

最も気軽な形でAWSの利用料金を確認したかったので、Hubotにそれをやらせた。
HubotにAWSの利用料金を問い合わせが出来るように。
**AWS CLI** を使えば簡単に実現できます。


#<i class="fa fa-dollar" style="font-size:1em;"></i>　AWSの利用料金を取得する

の前に、aws cliをインストールしておく必要があります。

* [第1回　AWS CLIをインストール](http://gihyo.jp/admin/serial/01/awscli_diary/0001 "第1回　AWS CLIをインストール")


aws cliを使ってcloudwatchのメトリクスで料金を取得。
jqでタイムスタンプでソートをかけ、**最新の1件** だけ取得します。

```:bill.sh
#!/bin/bash

aws cloudwatch --region us-east-1 get-metric-statistics \
    --namespace "AWS/Billing" \
    --metric-name "EstimatedCharges" \
    --dimensions "[{\"Value\":\"AmazonEC2\",\"Name\":\"ServiceName\"},{\"Value\":\"USD\",\"Name\":\"Currency\"}]" \
    --period 60 \
    --start-time `date -u -d '3 hours ago' +%Y-%m-%dT%TZ` \
    --end-time `date -u +%Y-%m-%dT%TZ` \
    --statistics "Maximum" \
     | jq '.Datapoints | sort_by(.Timestamp) | reverse | .[0]'
```
この「bill.sh」と名付けたファイルを適当な場所に保存。
これを実行すると以下の形で返ってきます。

```json
{
  "Timestamp": "2015-05-25T01:08:00Z",
  "Maximum": 10.25,
  "Unit": "None"
}

```

#<i class="fa fa-dollar" style="font-size:1em;"></i>　Hubot側のスクリプト

あとは上記で作成したシェルスクリプトをHubotに実行させるだけ。

Node.jsで同期的にコマンドを実行できるようにする [execsyncs](https://www.npmjs.com/package/execsyncs "execsyncs") というモジュールを使ったので、npmでインストールします。


````
npm install --save-dev execsyncs

```

スクリプトはこちら
上記で作成したシェルを実行。

```coffeescript:bill.coffee

execsyncs = require('execsyncs')

module.exports = (robot) ->

  robot.respond /aws_bill/i, (msg) ->

    result = '' + execsyncs('sh 「bill.sh」のパス')
    obj = JSON.parse(result)
    bill = '・・・$'+obj["Maximum"]

    msg.send(bill)
```


#<i class="fa fa-dollar" style="font-size:1em;"></i>　実行結果

チャットツールは **ChatWork** を使ってます。

![bill.png](https://qiita-image-store.s3.amazonaws.com/0/67591/092adbf7-ae97-8916-2f2e-e89291cc9e3f.png)

※「G」の顔を公開してしまっていた。。危うく消されるところだった。。
【PHP】特定の文字列を含むかのチェック


#正規表現を使わない場合
strpos,strstr,preg_matchでは**strposが最も早いのでstrposを使う。**
PHPマニュアルにもそのように書いてある。

>
strstr
もし特定の haystack に needle があるかどうかを調べるだけの場合、 より高速でメモリ消費も少ない strpos() を代わりに使用してください。

strposは、該当する文字列が見つからなかった場合は、falseを返す。
該当する文字列が見つかった位置を数値で返すので（※１）、型までチェックする必要がある。そのため、===falseもしくは!==falseを使うこと。

※１例えば、strpos('abcd','ab')は0を返す。

```php
if(strpos($subject,'bc') !== false){
  //'abcd'のなかに'bc'が含まれている場合
}

if(strpos($subject,'bc') === false){
  //'abcd'のなかに'bc'が含まれていない場合
}
```

参考
[strposとstrstrの速度比較 ](http://d.hatena.ne.jp/oishiy/20080515/1210836445)


※名前が半角スペースまたは全角スペースで名字と名前が区切られている文字列を、名字と名前で取得

```
if(strpos($data['User']['name'],'　') !== false){
  //全角スペース区切り
  list($lastname,$firstname) = explode('　',$data['User']['name']);

}elseif(strpos($data['User']['name'],' ') !== false){
  //半角スペース区切り
  list($lastname,$firstname) = explode(' ',$data['User']['name']);
}else{
  //スペースなし区切り
  $lastname = $data['User']['name'];
  $firstname = '';
}
```
#正規表現を使う場合
preg_matchを使う。
preg_matchはマッチした場合は1を返す。マッチしなかった場合は0を返す。

```php
if(preg_match('/bc/',$subject)){
  //$subjectのなかにbcが含まれている場合
}

if(!preg_match('/bc/',$subject)){
  //$subjectのなかにbcが含まれていない場合
}
```
Get JSON from URL in Objective-C

\- Synchronous  

```objc: 
NSURL *url = [NSURL URLWithString:kJsonURL];
NSURLRequest *req = [[NSURLRequest alloc] initWithURL:url
                                          cachePolicy:NSURLRequestUseProtocolCachePolicy
                                      timeoutInterval:10.0];
NSError *error = nil;
NSURLResponse *res = nil;
NSData *json = [NSURLConnection sendSynchronousRequest:req returningResponse:&res error:&error];
NSInteger statusCode = ((NSHTTPURLResponse *) res).statusCode;
// if success
if (json && statusCode == 200) {
    NSArray* data = [[NSJSONSerialization JSONObjectWithData:json options:NSJSONReadingAllowFragments error:nil] objectForKey:@"data"];

// if failure
} else {
    
}
```
　
- Asynchronous  

```objc:
NSURL *url = [NSURL URLWithString:kJsonURL];
NSURLRequest *req = [[NSURLRequest alloc] initWithURL:url
                                          cachePolicy:NSURLRequestUseProtocolCachePolicy
                                      timeoutInterval:10.0];
[NSURLConnection sendAsynchronousRequest:req queue:[[NSOperationQueue alloc] init]
        completionHandler:^(NSURLResponse *res, NSData *json, NSError *error) {
            NSInteger statusCode = ((NSHTTPURLResponse *) res).statusCode;
            // if success
            if (json && statusCode == 200) {
                NSArray* data = [[NSJSONSerialization JSONObjectWithData:json options:NSJSONReadingAllowFragments error:nil] objectForKey:@"data"];

            // if failure
            } else {
                
            }
        }];
```
GoogleChromeでhoge.localhostにアクセスできなくなった

めっちゃはまったものの、そのものずばり解決されている方がいらしたのでメモ。
追加情報あれば更新します。

<blockquote class="twitter-tweet" lang="ja"><p lang="ja" dir="ltr">先ほど書いた問題ですが、Chrome が hoge.localhost という、etc/hosts に書いたドメイン名を &quot;localhost.&quot; と解釈し、ブリッジネットワーク先の 192.168.33.18 ではなく 127.0.0.1 を見に行ってしまうためと判明。バグだ！</p>&mdash; よねざわいずみ (@yonezawaizumi) <a href="https://twitter.com/yonezawaizumi/status/601690340299440128">2015, 5月 22</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" lang="ja"><p lang="ja" dir="ltr">なななんと！ バグではなく私のほうが間違いでしたとさ… RFC 6761 の 6.3.1 に「任意の localhost をサブドメイン名として含むドメイン名はすべてループバップアドレスを指す」って出てるよ！！orz Chrome は v43 でこれを正しく実装したんですね…</p>&mdash; よねざわいずみ (@yonezawaizumi) <a href="https://twitter.com/yonezawaizumi/status/601696305748967424">2015, 5月 22</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
smart-compileのキーワードにgitのルートディレクトリと相対パスを追加する

フルパス(%F)でも、ファイル名(%f)でもなく、gitのルートディレクトリと、そこからの相対パスが欲しい場合があるので、次のように設定しました。

```elisp
(defun git-root ()
  (substring (expand-file-name (locate-dominating-file default-directory ".git")) 0 -1))

(setq smart-compile-replace-alist
      (append smart-compile-replace-alist
              '(
                ("%G" . (git-root))    ; as "/Users/alice/src/myapp"
                ("%L" . (replace-regexp-in-string (concat (git-root) "/") "" (buffer-file-name)) ; as "app/models/user.rb"
                 ))))
```

これで開いているファイルが `/Users/alice/src/myapp/app/models/user.rb` なら
`%G` → `/Users/alice/src/myapp`
`%L` → `app/models/user.rb`
と置き換わるようになります。
UITabBarControllerを用いて、メニュー処理の実現方法

iOSでは、UITabBarControllerを用いれば、TAB処理を簡単に実現できます。
ただ、TABを用いるのでなく、独自のメニューのUIにてViewの切り替えを行いたい場合などがあると思います。
その場合は、自前でUITabBarControllerのようなものを実装する必要があるかと思いますが、下記手順にてUITabBarControllerの仕組みを利用して、シンプルに実現可能です。

1.通常通り、UITabBarControllerにて画面遷移を実装する。

2.各TabのFirstViewプロパティの「Hide Bottom Bar on Push」をチェックする。
　→TabBarが非表示となります。

3.各Viewにてメニューの表示処理を実装します。
　→NavigationBarなどにModal表示で実装します。

4.メニューの各ボタンが押された場合の処理を実装します。

下記の例では、Modalから呼び出されたViewControllerを取得し（UITabController）、selectedIndexを変更し、ModalViewを閉じています。

```objc++

- (void)menu2:(id)sender
{
    // 親ViewController(UITabBarController)を取得する
    UITabBarController* parentViewController = (UITabBarController*)[self presentingViewController];
    // TABを変更する
    parentViewController.selectedIndex = 1;
    // メニューを閉じる
    [self dismissViewControllerAnimated:YES completion:nil];
}
```

上記でUITabbarControllerを用いずに、Tabのような動きが可能になります。

サンプルはgithubからどうぞ
[menusample](https://github.com/sasanao/menusample)
Titaniumはオワコンか

答え：キミと同じくらいに、かな。

　こんにちは。この１年くらい、Titaniumなんてオワコンって言い捨てるのは、特に良心の咎めもなく（だいたいPHPをくさすのと同じくらい）気軽にできることで、塩分控えめ安心安全な雲の高みから技術っぽいことを語る挨拶代わりに丁度いいというのがテック系の常識となりつつあるようです。かくいうわたくしめも「Titanium、覚えていますか？」といったタイトルでスライドを作ったりしてウケを狙うこともあります。かつてTitaniumに喜んで飛びついた物見高いアルファな人たちもすでに去り、RubymotionとかReact Nativeとかのなんか似たような違うようなあれな別物に飛びついてはまた次々と去っていくのを見るにつれ（ネイティブ開発に進んだ人たちに幸あれ）、そして彼ら彼女らに追随して一時はガンガン書き立てていたのに今では見向きもしない各メディアの動向を見ると、ああ広報活動もしない小さな海外ベンダの製品なんて、結局そうやってトレンディ〜な人たちにつまみ食いされて使い捨てられるしか道はないのね、と暗い倉庫の片隅に積み上げられたセーラーズのトレーナー[^1]で涙を拭きたい気分です。

　でも、それはそれで、正しく安全な生き方なんだと思います。技術業界というのは、誰もが最安の航空機のチケットを買おうとしている貧乏な旅行客のようなもの[^2]で、自分が選択した技術が果たして最適なものなのか、他のを選んだ連中の方がずっと楽をしていたんじゃないのか、と常に疑心暗鬼の目で周囲を見ています。誰だって損をしていると感じるのは嫌ですからね。だから、新しく出てきたあれやこれやの製品がちょっとトレンドになれば目の色を変えてすぐさま飛びつき、そこであれこれ試してうまくかず、また別のもう少し良さそうなものが出てくると今度はそちらにふらふらと吸い寄せられるのですが、結局どれも下地となる知識の裏付けがなければ同じように苦労するだけだという単純な事実の繰り返しでしかない、という（まるで、だめな、追っかけ）スパイラル[^3]から抜け出すことができません。そして、そんな厳しい現実なんて毎朝鏡で見るだけで十分だからと、今日もまた別の希望にすがってしまう。

　人間だもの[^4]、というセリフは、人間というものを侮辱していますね。

　で、じゃあ結局Titaniumってどうなのさ？という方には、逆に、何を知りたいのか教えてほしいな、と思います。だって、普通どの技術を選択するにしても、そこでなんか手を動かして作ってみてうまくいったりいかなかったりでおしまいじゃダメですよね。プログラマだったら経験上わかると思うんですが、優れた技術者というのは、あるプラットフォームに取り組むとなると、必ずその下で動作している仕組みについて興味を持ってあれこれ調べるようになります。例えば、Titaniumであれば、JSという言語についての知識を深めた後は、Titaniumを動作させている仕組みそのもの、ソースコードが公開されているSDKの中身を覗いて、なるほど実際はこんなことが行われているんだ、だからこういう動作をするんだ、と理解していくようになれば、エクスパート[^5]への道を着実に歩んでいることになります。大事なことなので繰り返しますが、どんどん下のレイヤー、抽象化され普段は見ることがない層にまで踏み込んでいくのが優れた技術者なのです。そういう姿勢が全然ない優れたプログラマという人には、あいにくこれまで一人もお目にかかったことがありません。これは別にTitaniumに限らず、ありとあらゆるプログラミングの現場に当てはまります。で、Titaniumについていえば、行き当たる解決可能な問題のほとんどが、各プラットフォームの動作についての理解が足りないがために起きていたりします。クロスプラットフォームだからそこそこ面倒は見てくれますが、そこに安住できるようなものを探しているなら、これだけ標準化が進んだブラウザとHTMLでさえまだまだ対応しなければいけないことがあるのが現実なのですから、答えは見つからないと思います。なので、Androidってどんなことが出来て、どうやって実現するもので、Titaniumはどうやっているんだろう、と書籍を読んだりソースコードを追っているうちに、やがて身につく知識が問題解決に一番役に立つでしょう。

　そういうことを考えて実践しながら生きていると、じゃあTitaniumってオワコンなの？と聞かれて改めて考えてみても、適切な答えの持ち合わせがないことに気づきます。なので、笑顔で「そうだね、今年は◯◯と◯◯が来るけど、◯◯が本命かな？」とかいうトークでお茶を濁すくらいしかありません。なぜなら、その質問者が求めているものはきっと答えではないと思うからです。なんとかはオワコン、って言ってみるとなんか格好いいし、まともな人はそのときの自分に見合った適当な場所から始めたとしても、結局どんどん掘り進んで、最後には必ずちゃんとした技術的バックグラウンドとなる知識の層を掘り当てるから、そんな間抜けな質問をしている暇はないでしょう。

　じゃあさ、なんであんたはTitanium使ってるの？と聞かれたら、やっぱり笑顔で、だって使えるし、そこらへんを歩いてる人より上手に使えるから、としか言いようがないです。JS自体も好きで言語仕様もコンパクトだから頭を使うことが少なく、JSだけでクロスプラットフォームで動作するだいたいのところまで作ったら、あとはLiveViewで変更をすぐに実機やシミュレータに反映させながらUIの調整をして、短期間でリリースできるし、困ったら最悪Obj-CとかJavaでちゃちゃっと書いてしまえばいい。それより普通の案件ではもっと根本的なところ、例えばスマートフォンのアプリというのもを全く理解していない人たちが仕様を作って、スケジュールも守らず無茶な日程を強いるといったことの方がずっと深刻で、それなのに、まあ誰だって反省するのは嫌だし責められるのは怖いから、Titaniumとかの使っているツールのせいにする人たちもいっぱいいて、社会人って怖いな、というのが目下のいちばん深刻な問題です[^6]、はい。

***

[^1]: アパレルブランド。80年代の狂った流行のひとつ。もう少し若い世代にとっては[ガルフィー](http://matome.naver.jp/odai/2138733992036691301)のようなもの、らしいそうだが、筆者にはよくわからない。

[^2]: 「[ラクダとおもちゃのアヒル](http://local.joelonsoftware.com/wiki/%E3%83%A9%E3%82%AF%E3%83%80%E3%81%A8%E3%81%8A%E3%82%82%E3%81%A1%E3%82%83%E3%81%AE%E3%82%A2%E3%83%92%E3%83%AB)」

[^3]: 略してマダオスパイラル。

[^4]: トイレの日めくりカレンダーなどで有名。技術者はアドベントカレンダーが好き。

[^5]: エキスパート？どっちが正しいの？

[^6]: 違うよ、あなたのことじゃないよ！全然違うよ！
YahooのWebAPIを「.NET」で実装を検討しています。

WebAPIを利用して注文情報の取得や更新を考えています。
（注文検索API、注文詳細API、注文ステータス変更APIなど）
「.NET」での実装を考えておりますが、上記ＡＰＩを利用するためのライブラリとサ
ンプルプログラムはないでしょうか？
JavaScriptでDomから値を取得する方法を学ぶ際に参考にしたサイト一覧

画像クリック時動作

http://javascript.eweb-design.com/0801_cci.html

[JavaScript]あらゆる要素を取得する

http://yasumoha.com/blog/javascript%E3%81%82%E3%82%89%E3%82%86%E3%82%8B%E8%A6%81%E7%B4%A0%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B/

JavaScriptでclass名から要素を取得する方法
http://syncer.jp/getelementsbyclassname
シンボリックリンクの作成、更新、削除、権限変更をしました。

lnコマンドで作成するシンボリックリンクについて、毎度忘れてしまうのでメモしておきます。


# シンボリックリンクを貼る
シンボリックリンクの貼り方です。

```bash:シンボリックリンクの貼り方
ln -s ファイルのパス リンクのパス
```
上記の様に実行すると、リンクのパスでファイルへの参照ができるようになります。

Macに置いてあるファイルで確認してみました。

```bash:piyoファイルにhogeというシンボリックリンクを貼る
ln -s ~/Downloads/piyo ~/Desktop/hoge
```
確認します。

```bash:シンボリックリンクの確認
ls -al ~/Desktop/hoge
lrwxr-xr-x  1 pugiemonn  staff  41  5 25 10:54 /Users/pugiemonn/Desktop/hoge -> /Users/pugiemonn/Downloads/piyo
```
ここでhogeというファイル開くとpiyoファイルになっていました。

もう一点、以下はhttpdでconfファイルへシンボリックリンクを張った例です。

```bash:confファイルへシンボリックリンクを貼る
sudo ln -s /etc/httpd/sites-available/dev.example.com.conf /etc/httpd/sites-enabled/
```
このように実行した後に、`/etc/httpd/sites-enabled/dev.example.com.conf`にはシンボリックリンクが貼られています。

上記は都合により`sudo`がついてます。

# ディレクトリのシンボリックリンクを変更する
ディレクトリのシンボリックリンクを変更する場合です。

```bash:ディレクトリへシンボリックリンクを貼る
ln -nfs ディレクトリのパス シンボリックリンクを貼るディレクトリのパス
```
以下は`current`ディレクトリに貼られていたシンボリックリンクを貼り替えた例です。

```bash:currentディレクトリへシンボリックリンクを貼る
ln -nfs /var/www/pugiemonn.com/releases/20150510043839 current
```
currentディレクトリに貼られていたシンボリックリンクを貼りかえました。

よく`rm`コマンドでシンボリックリンクを削除していたのですが、削除したくなかったので上記を使用しました。

# シンボリックリンクを削除する
lnで作成したシンボリックリンクを削除する場合はunlinkを使用します。

```bash:シンボリックリンクを削除
unlink /etc/httpd/sites-enabled/dev.example.com.conf
```
シンボリックリンクをrmで消すのはよく見ますが、unlinkのほうが良い気がします。

# シンボリックリンクのPermissionを変更
`chown`コマンドに`-h`オプションを付けます。

```bash:シンボリックリンクの権限を変更
chown -h pugi:pugi /etc/httpd/sites-enabled/dev.example.com.conf
```

# 参考
http://qiita.com/takeoverjp/items/bb1576e90a8a495db4b3
http://qiita.com/pugiemonn/items/9e1bccf3344b74cea832
横並び表示で横スクロールバーを出すボックス


`<div class="parent">
<div class="child">
aaaa
</div>
<div class="child">
bbbb
</div>
</div>
`

`.parent{overflow-x:auto; overflow-y:hidden; width:100%; white-space:nowrap;}
.child{display:inline-block; margin-right:1%; width:19%; vertical-align:top; white-space:normal;}`


marginとwidthは適宜変更
white-spaceは親をnowrapすることで下に落とさないようにする。子はwidth内に表示させたいので、normalに戻す。
overflow-x,overflow-yは両方設定。webkit対策のため。
display:inline-blockで横に並べられる。vertical-align:topで上に合わせるよう並べる。



参考ページ
http://okazuki.hatenablog.com/entry/20130129/1359440307
Railsでrspec:installが実行できない際の応急処置

Railsを始めて２日目。

***

Ruby on Rails チュートリアルの第3章で
`$ rails generate rspec:install`
を実行する場面が出てきました。
http://railstutorial.jp/chapters/static-pages?version=4.0#top (リスト3.2の辺り)

最初に実行すると
``require': cannot load such file -- active_job/railtie (LoadError)`
というエラーに遭遇したので、それをそのままググってみると、どうやらRailsのバージョンの問題らしい。
http://qiita.com/jnchito/items/f3bde6e46afbeba8cb82

ひとまず
`$ rails -v
Rails 4.0.5
$ rails _4.0.5_ new sample_app --skip-test-unit`
というステップを踏んで再度やり直し。

再び
`$ rails generate rspec:install`
を実行すると、今度は
``<top (required)>': uninitialized constant SampleApp (NameError)`
というエラーが発生。

ここまでのステップでSampleAppという名前はチュートリアル(http://railstutorial.jp/chapters/static-pages?version=4.0#top) のリスト3.2にしかない
```config/initializers/secret_token.rb
SampleApp::Application.config.secret_key_base = secure_token```

NameErrorのエラーなので、この一行をコメントアウト。
すると
`$ rails generate rspec:install
      create  .rspec
      create  spec
      create  spec/spec_helper.rb`
となり成功しました。

(あまり理解せぬまま実行・成功したので応急処置です)

***

その後先輩に聞いたところ、ここのSapmleAppはプロジェクト名らしい。
チュートリアル内では
`$ rails new sample_app --skip-test-unit`
というコマンドでプロジェクトを生成。
コマンドではsapmple_appと命名したものが、諸ファイルの中ではSampleAppと表記されるらしい。

私は今回はプロジェクト名をsample_3.1としてしまったがために、
```config/initializers/secret_token.rb
Sample3.1::Application.config.secret_key_base = secure_token```
と変更して実行すると
`no .<digit> floating literal anymore; put 0 before dot (SyntaxError)`
というエラーを生んでしまいました。

次回以降はプロジェクト名に「.」を使用しないように気をつけようと思います。
ATOMでPHPの静的コード解析する、『linter-phpmd』を使ってみた

# 概要

最近何かと[Atom](https://atom.io/)の話題が出てくるので、Atomを利用し始めました。
Atom上でphpmdの結果を表示するプラグインを利用してみます。

# 前提条件

MacにてAtomを利用しています。
Macにphpmdが既にインストールされている状態です。
phpmdがインストールされていない場合、[前回の記事にてインストールする手順を記載](http://qiita.com/yuji0602/items/28b0c2363bae8fce055a)しています。

# インストール

[linter](https://atom.io/packages/linter)というものを利用します。以下の2つをAtomにインストールします。

```
apm install linter
apm install linter-phpmd
```

# 設定

`.atom/config.cson`に以下の設定を行います。
PHPMD_PATHと記載した場所に、phpmdをインストールしたpathを記載してください。
phpmdのルールについては、このまま記載していても大丈夫だと思います。

```~/.atom/config.cson
'linter-phpmd':
  'phpmdExecutablePath': PHPMD_PATH #phpmd path. run 'which phpmd' to find the path
  'rulesets': 'cleancode,codesize,controversial,design,naming,unusedcode' #phpmd rulesets
```

# 動作確認

以下のファイルを用意します。

```phpmdtest.php
<?php

class PhpMdTest
{
    public function test_function($param_string)
    {
        print "Hello World!!" . $param_string . "\n";
    }
}

$hoge_fuga = new PhpMdTest();
$hoge_fuga->test_function("( ﾟдﾟ )ｸﾜｯ!!");
```

Atom上ではこんな感じで表示されます。

![phpmd](http://i.gyazo.com/3af77fb6be48b27d7ddbf2bc32d2888d.png)

camelCaseの指摘を直すと、解消されます。

![phpmd](http://i.gyazo.com/a00aa7b34341545675155b56e1624fea.png)


都度phpmdを叩かなくても済むのでいい感じですね。

# 参考にしたURL

* https://atom.io/packages/linter
* https://atom.io/packages/linter-phpmd
いちいち動かすソート（麻雀の理牌とか）

#長い前置き
昔、商売で麻雀ゲームを作ったことがある。その時には、適当なコードでごまかしたのだが、その後、当時の自分的「未解決問題」のほとんどには、趣味の中で最適解が見つかった。

最適化厨だった頃の気持ちが蘇るネタとしては、ジャンプ命令最小＝バックトラックなしで向聴数を算出する最速CalcShantenなんかが面白いと思うが、これはあまりに一般性がない。役判定や「役との距離」なんかはその後、中国麻雀用・台湾麻雀用（17枚麻雀）のアルゴリズムなんかも考えていて、組合龍とかカンツ含みの七対が絡むと大変面白いことになるのだが、それはもっとマニアックだ。役の複合も、中国麻雀はとても難解で、だからこそ大変面白い。とは言え「上がり牌判定くらいいいかな」と思って、[ちょっと書いてみた](http://qiita.com/mrpepper/items/fca00359bbe54a3f1840)。

麻雀戦術理論としては、「ある（目指したい）上がり形集合に対して、見える残り牌集合と残り山牌を加味した場合、打牌毎の獲得期待値を計算するにはどうするか」とか、それと同様に、「打牌毎の喪失期待値を計算するにはどうするか」というのが最も興味あるところだろう（後者は、他家も最適打牌を行っているものと仮定する、でないと答えは出ない）。ただ、これはえらく大変だ。それなりに分量の多い記事が30回シリーズくらいかかる。しかも、出てくる式がまた、総乗と階乗がわんさか出てくる（しかも、ざっくり約分して消えたかと思うと、そいつを種にまた階乗というような心の折れる計算になる）ので、TeX記法満載じゃなきゃいけないのだ。そんな時間は割きたくない。むかしちょっとTwitterでとつげき東北氏にこの話をしかけたら、変な食いつき方をされてげんなりした記憶もあるので、気が向かない感じには拍車がかかっている。

いずれにせよ、そーゆーのは、おっさんではなく、大学院生(14)向きの仕事だと思う。

#いちいち動かすソート
現在の状態から、制限された操作を繰り返してソートを完了させたいが、無限ループしては困るし、制限の中では最も効率の良い操作に分解したい。というニーズがあったとしよう。例えば、麻雀の理牌で、ざくっと一瞬でソートされてしまうと、他のプレイヤーの並べ替えの仕方を見て手牌を推理する、という楽しみが失われることになるので、そういうことだ。また、ソートの最終状態にも選択肢があって、最も現状から近い並べ方をゴールとしたい、というニーズもあるだろう。「ピンズ、マンズ、ソーズ、字牌」「マンズ、ソーズ、ピンズ、字牌」とか、そういう選択肢だ。

この問題も、当時は適当に安全側に振った結論を出してそれっきりだったが、実はちょっと面白い解き方がある。

さてどうするか。最終状態に選択肢がある、というのが実はくせ者で、下手なやり方をすると、無限ループする。（もちろん、ソート前の状態で全ての操作列を作ってしまえば良いのだが、それはそれで結構頭の混乱するやり方だ。１回操作してしまえば、新しい順序になっているわけだから、アルゴリズムとして使いやすいのは、各状態でベストな「次の操作」を算出する漸化式型のアルゴリズムであるわけだ。

ここで操作の制約は、「内部から1つ取り去って別の場所に挿入する」だとする。

この場合、x軸に現在の配列、y軸に操作済配列（6通りあるので、6種類の表を作るのだ）をおき、同一の牌を示す交点に1を置く。疎行列のできあがりだ。ここで、現在の配列とそれぞれの操作済配列との距離空間を定義する。そしてそのために、操作不要集合というものを考える。ある操作不要集合Pに対して、p(x,y) where x＞x<sub>n</sub>; y＞y<sub>n</sub>; ∀(x<sub>n</sub>,y<sub>n</sub>)∈P; となるpが存在しなくなるまで追加した時、操作不要全集合PPerfectと呼ぶことにすると、牌姿によっては複数種類の操作不要全集合が作りうるので、最大の操作不要全集合をPPerfectMaxと呼ぶ。そして、元の配列の要素数－PPerfectMaxの要素数 を「現在の配列と操作済配列との距離」とする。この距離空間の定義そのものが、先の操作の制約によって決まるものなので、操作の制約を変えたら、この距離の定義自体を変えなくてはならない。まあ、今説明している操作が、まともな中では一番自由な操作なので、PPerfectの始点・終点に条件が加わったりするバリエーションがあり得る、と思ってもらえれば良い。

そして、各段階での操作は、PPerfectMaxに含まれない、xが最小のQ(x,y)に関して、 PPerfectMaxに加えられる位置に挿入する、という操作になる。この操作は距離最小の最終形との距離を1減少させる。そして、それ以外の最終形との距離も、高々1しか減少しない。というわけで、同じ距離の場合の目指す最終形の優先順位が固定されていれば、無限ループはしない。そして、1回の操作で詰められる距離は高々1なので、常に1減少させるこのアルゴリズムは、最も効率が高いと言えるのだ。ね、証明も容易でしょ。

![fig.JPG](https://qiita-image-store.s3.amazonaws.com/0/79187/4cf118ea-e429-f70c-4f7f-28228764f107.jpeg)

図がないと大変分かりにくいと思うので、図は後で描くけど、自分で手描きで描いた方が面白いと思います。（Markdownのテーブルって書きにくくないですか？）→つーわけで、描いたよ。こういうこと。

#いかがでしたか？
ソートというとどうしても最速もしくは安定に並べ替えるのを想像すると思いますが、こういう変種も面白いでしょう？　さらなる変種として、「内部から取り去って、先頭もしくは末尾に追加する」とか、「先頭もしくは末尾から取り去って内部に挿入する」とか「隣接したn牌を隣接した場所に動かすのは1操作でできる」とか、そういう操作に関して考えて見るのも面白いですよ。その場合、基本的には「操作不要全集合」「配列同士の距離」の定義が変わるのです。
ClojureでDatalogやJSON Storageを扱うためのリソース

Clojureの勉強をしていてそろそろデータベースを使いたくなってきました。JDCBでRDBMSに接続するのが一番簡単そうです。せっかくなのでJSON Document StorageやDatalogを選んでみようと思います。まずは情報集めからはじめます。



## はじめに

Redditに[A database that likes clojure..](https://www.reddit.com/r/Clojure/comments/2zmqg8/a_database_that_likes_clojure/)というちょうどよい議論がありました。ClojureといえばRich Hickey氏のDatomicですがプロプライエタリです。できればオープンソースでいきたいところです。DataScriptはクライアントサイドなのでサーバーとの同期するにはどうしようか悩みます。もっともDatalogとかLog-structured StorageにこだわらなければRDBをバックエンドにしてREST APIでJSONを返すWebサービスを作ってしまった方が楽な感じです。


## Datalog

* [Datomic](http://www.datomic.com/)
* [DataScript](https://github.com/tonsky/datascript)
* [PossibleDB](https://github.com/runexec/possibledb)
* [Cascalog](https://github.com/nathanmarz/cascalog)

## JSON Storage


### ArangoDB

* [Clarango](https://github.com/edlich/clarango)
  
### RethinkDB

* [clj-rethinkdb](https://github.com/apa512/clj-rethinkdb)
* [Revise](https://github.com/bitemyapp/revise)

### CouchDB

* [Clutch](https://github.com/clojure-clutch/clutch)

### Redis

* [Carmine](https://github.com/ptaoussanis/carmine)

### EventStore

* [EventStore](https://github.com/EventStore/EventStore)

### ElasticSearch

* [Elastisch](http://clojureelasticsearch.info/)

### MongoDB

* [Monger](https://github.com/michaelklishin/monger)

## Building REST API Service

* [Yesql](https://github.com/krisajenkins/yesql)
* [Liberator](https://github.com/clojure-liberator/liberator)
* [Compojure](https://github.com/weavejester/compojure)
* [Compojure-api](https://github.com/metosin/compojure-api)
* [ring-json](https://github.com/ring-clojure/ring-json)
* [Ceshire](https://github.com/dakrone/cheshire)
関西AngularJS勉強会資料


5/23に関西AngularJS勉強会で「簡単AngularJS」というタイトルで、
発表をしてきました。

資料を貼っておきます。
[簡単AngularJS](http://www.slideshare.net/tk_0225/angularjsangularjs)

あと、実演交えてだったので資料だけではわかりにくいかもしれないです。
すみません。。。
簡単とか言っておきながらそんなに簡単な内容じゃなかった(´・ω・｀)
補足などがあればこちらで書いていきます。
モジュール関数の作り方

Math のように、同じメソッドを Module の特異メソッドとしても、インスタンスメソッドとしても使えるメソッドをモジュール関数といいます。

```rb
Math.log2 2  #=> 1.0
include Math
log2 2       #=> 1.0
```

ActiveSupport のソースを読んでいると、いくつかの方法でモジュール関数を作っていたので、気になった２つを紹介します。

# `extend self`

いろいろなところで使われていました。

```rb
# こんな感じで
module ActiveSupport
  module Inflector
    extend self
    ...
  end
end
```

インスタンスメソッドを実装して、自分自身を `extend` することで、特異メソッドにもしているんですね。言われてみると当たり前だけど、こういう風に `extend self` ってやると初めて知りました。

```rb
module A
  extend self

  def method_a
    'モジュール関数です'
  end
end

A.method_a #=> "モジュール関数です"
include A
method_a   #=> "モジュール関数です"
```

確かに、モジュール関数になっています。便利ですね！

# `module_function`

こちらも、いろいろな所で使われています。

```rb
# 例えばこんな感じ
class ERB
  module Util
    ...
    def html_escape(s)
      ...
    end
    ...
    module_function :html_escape
    ...
  end
end
```

`module_function` は引数にインスタンスメソッド名を、シンボルか文字列で渡すと特異メソッドを定義するメソッドです。

```rb
module A
  def method_a
    'モジュール関数です'
  end

  module_function :method_a
end

A.method_a #=> "モジュール関数です"
```

また、引数を渡さないで呼び出すと、`module_function` の後に定義したインスタンス変数は全てモジュール関数になります。

```rb
module B
  module_function

  def method_a
    'これも'
  end
  
  def method_b
    'あれも'
  end
end

B.method_a #=> "これも"
B.method_b #=> "あれも"
``` 

これも便利ですね。

# `extend self` と `module_function`

２つのモジュール関数の定義の仕方を紹介しましたが、この２つ若干挙動が異なります。
実際に以下のように定義して、インスタンスメソッドを実行してみると

```rb
module BySlef
  extend self

  def hello_by_self
    'Hello extend self'
  end
end

module ByModuleFunction
  def hello_by_module_function
    'Hello module_function'
  end

  module_function :hello_by_module_function
end

obj = Object.new
obj.extend(BySlef).extend(ByModuleFunction)
obj.hello_by_self             #=> "Hello extend self"
obj.hello_by_module_function  #=> NoMethodError: private method `hello_by_module_function'
```

`module_function` で定義したモジュール関数の方は、インスタンスメソッドが private になっていることが分かります。このように、`module_function` はインスタンスメソッドと同名の特異メソッドを定義すると同時に、そのインスタンスメソッドを private にします。


ActiveSupport では、どちらの方法も良く利用されていましたが、ここら辺で上手く使い分けをするんですかね。以上、モジュール関数の定義の仕方でした。
ソースツリー(Source Tree)で2点間の差分ファイルを一発で作る、Windows版


Windows版は環境変数を通す必用があるので、
以下の方法が楽かと思います。

1. Gitコマンドのインストール
http://opcdiary.net/?page_id=27065
※インストール途中のオプションはこのサイト通りでお願いします。

2. ソースツリーにバッチ設定
ソースツリーへの追加方法は以下を参考
※設定するファイルは、sabun2.batとなります。
https://www.eyemovic.com/blog_it/4747.php
差分を作りたい"２点"を選択して、実行してもらえれば、その間の差分をZipで作ります


```lang:sabun2.bat
@echo off
setlocal ENABLEDELAYEDEXPANSION
set DIFF_LIST=
set NEW_SHA=%1
set OLD_SHA=%2
if "%OLD_SHA%"=="" set OLD_SHA=%NEW_SHA%^^
for /f %%A in ('git diff --name-only "%OLD_SHA%".."%NEW_SHA%" --diff-filter=ACMR') do set DIFF_LIST=!DIFF_LIST! %%A
git archive --format=zip HEAD -o archive.zip %DIFF_LIST%
endlocal
```
Octaveの設定方法(Mac)

##Step 1  Octaveをインストールする

以下のサイトからダウンロードできます
http://www.gnu.org/software/octave/

##Step 2 Octaveをターミナルで起動できるようにする

ターミナルを開き、開いたデフォルトのディレクトリで

```
vim .bash_profile
```

を入力、または、他の方法で.bash_profileを開く

```
alias octave="/Applications/Octave-cli.app/Contents/MacOS/Octave"
```

を.bash_profileに書き込む

ファイルを保存して閉じて、ターミナルを再起動
mscorlib.dllをインポートさせない

# mscorlib.dllとは
System.ConsoleやSystem.Stringなどが含まれている．
クラスの基本型のSystem.Objectもここにある．

# インポートさせない
mscorlib.dllを使えといった覚えがない．
VSの参照設定にもない．誰が使えといったか．

コンパイラが勝手にインポートするとのこと．
参照 https://msdn.microsoft.com/ja-jp/library/fa13yay7.aspx

以下のオプションでやめさせる

> /nostdlib

#コンパイル
以下のソースをコンパイルする．/nostdlibを指定する．

```c#:Hage.cs
class Hage{
  static void Main(string[] args){
    System.Console.WriteLine("Hage World!");
  }
}
```

> error CS0518: 定義済みの型 'System.Object' は定義、またはインポートされていません

暗黙で継承されるSystem.Objectが無いのでエラーでた．
CoffeeScriptで「unmatched OUTDENT」エラーが出たら

#コンパイルエラー最多登板賞はキミだ！

「unmatched OUTDENT」様！

```
/.../goldblend.coffee:453:22: error: unmatched OUTDENT
      compile filedst
                     ^
```

彼が現れたら、**余分な開きカッコがあるかも**ね！（ふつうに、コンパイラのゆーとおり、インデントが崩れているだけかも知れませんが……）　インデントの末尾にエラーが指摘されているけど、その場合**エラーの在処はそのスコープの冒頭部**です。文脈によっては、レイアウトによるスコープを伴っていても

```
/.../app.coffee:91:9: error: missing )
app.get ('/session-create', (req, res) ->
        ^
```

と適切に指摘してくれるので、この辺、何が境目なのかよく分かりません。そして、コンパイラの中を読んでみるつもりもないのでありました。（とは言え、何となく、if / for / switchのスコープ内にある無名関数でOUTDENTと言われるような傾向は感じます）

```coffeescript:goldblend.coffee(quote)
  if watch?     #↓これが要らない子
    fs.watchFile (filesrc, (curr, prev) ->
      doconv filedst,filesrc
      compile filedst
```

ただしくは、

```coffeescript:goldblend.coffee(quote)
  if watch?
    fs.watchFile filesrc, (curr, prev) ->
      doconv filedst,filesrc
      compile filedst
```

目下、「unmatched OUTDENT」は、私がCoffeeScriptで出会うコンパイルエラーの圧倒的1位をひた走っております。
Supervisordでvncserverを動かす

# debian8の場合

```bash:インストール
sudo apt-get install -y supervisor
```

```bash:/etc/supervisord/conf.d/custom.conf
[supervisord]
nodaemon=true

[inet_http_server]
port=127.0.0.1:9001

[program:vnc]
command=sh /home/user1/bin/vncstart.sh
autostart=true
autorestart=true     ; プロセスダウン時に自動再起動 
user="user1"         ; 起動ユーザ
redirect_stderr=true ; エラー出力を標準出力にリダイレクト 
stdout_logfile="/var/tmp/s-vnc.log" ; 標準出力ログ
environment=HOME="/home/user1", USER="user1"
```

* vncserverはバックグラウンドで起動するためsupervisordからは`running`状態にならない。
    * そのため`tail`する

```bash:/home/user1/bin/vncstart.sh
/usr/bin/vncserver -geometry 1280x1024 :2 \
  && tail -F $HOME/.vnc/*.log
```

```bash:起動
/etc/init.d/supervisor restart
```

![super.png](https://qiita-image-store.s3.amazonaws.com/0/25728/2ab37ba5-e603-7b6d-db16-0f158d4b3a74.png)

## supervisorctl

```bash:rootで実施
supervisorctl relead
supervisorctl update

supervisorctl status vnc
supervisorctl stop vnc
supervisorctl start vnc
```
Install Nginx 1.8.0 in CentOS 6.6


# Install Nginx 1.8.0 in CentOS 6.6

Epel's nginx is 1.0.15, which is kind old.

add repository

```
vi /etc/yum.repos.d/nginx.repo
```

```
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=0
enabled=1
```

```
yum install nginx
```

```
$ nginx -v
nginx version: nginx/1.8.0
```

Start nginx

```
service nginx start
```

Start nginx on boot

```
chkconfig nginx on
```

ref:
http://wiki.nginx.org/Install
Install glog 3.3.0 in CentOS 6.6


install glog 3.3.0

```
$ wget https://google-glog.googlecode.com/files/glog-0.3.3.tar.gz
$ tar xzvf glog-0.3.3.tar.gz

$ svn checkout http://google-glog.googlecode.com/svn/trunk/ google-glog
$ cd google-glog
$ configure
$ make
$ make install
```

ref:
https://github.com/facebook/hhvm/wiki/Building-and-installing-HHVM-on-CentOS-6.4
spark-submitにjarを渡すためにsbt assemblyするためのbuild.sbt

簡単簡単といろんな記事で書かれているsbt assemblyがsparkでは全然簡単じゃなくて心が折れそうだったのでメモ

sbt assemblyはscalaプロジェクトをスタンドアローン起動できるjarを作ってくれるsbtプラグイン

## sbt assemblyプラグインの設定を書く

```scala:project/plugins.sbt
logLevel := Level.Warn
addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.13.0")
```

## ごくシンプルなWordCountプログラムを書く　第一引数=データファイル　第2引数=検索キーワード

```scala:SparkSubmit_sample1.scala
import org.apache.spark
import org.apache.spark.{SparkContext, SparkConf}

/**
 * Created by Siori on 15/05/22.
 */
object SparkSubmit_sample1 {
  def main(args: Array[String]): Unit = {
    val conf = new SparkConf().setAppName("WordCount Application")
    val sc = new SparkContext(conf)
    val textFile = sc.textFile(args(0))
    val filterResult = textFile.filter(line => line.contains(args(1)))
    println(filterResult.count())
    sc.stop
  }
}
```


## build.sbtを書く

```scala:build.sbt
name := "sparkWorkCount"

version := "1.0"

scalaVersion := "2.11.6"

libraryDependencies ++= Seq(
  ("org.apache.spark" %% "spark-core" % "1.3.1").
    exclude("org.mortbay.jetty", "servlet-api").
    exclude("com.google.guava","guava").
    //exclude("org.apache.spark","spark-network-common_2.11"). 
    exclude("org.apache.hadoop","hadoop-yarn-api").
    exclude("commons-beanutils", "commons-beanutils-core").
    exclude("commons-collections", "commons-collections").
    exclude("commons-logging", "commons-logging").
    exclude("org.spark-project.spark", "unused"). 
    exclude("com.esotericsoftware.minlog", "minlog")
)

// libraryDependencies += "org.apache.spark" %% "spark-core" % "1.3.1"
// libraryDependencies += "org.apache.hadoop" % "hadoop-client" % "2.6.0"


mainClass in assembly := Some("SparkSubmit_sample1")
```

Sparkは現状scala2.10x系がデフォルトなので注意。ここではなんとなく最新版にしている。
とりあえずWordCountプログラムであればこの設定で動く。

exclude（訳：締め出す）はコンフリクトを起こしているクラス名を除外している設定である。
そう、簡単と言われているsbt assemblyだが結局ココらへんは手で人間が調整する必要がありはっきりいって全然簡単でもないしストレスが貯まる作業である。

``sbt assembly``

すると成功すればJARが作成され、失敗すればコンフリクトを起こしているパッケージがずらーと出てくるので
排除したい方をbuild.sbtに記述し、また``sbt assembly``を実行し、またエラーが出たら・・・の繰り返しをやる楽しい作業をすることになる。
Configure CentOS 6.6 for westlab


# Configure CentOS 6.6

[Install git 2.4.1 in CentOS 6.6](http://qiita.com/giwa/items/1b4d417432613100ac38)

[Install g++/gcc 4.8.2 in CentOS 6.6](http://qiita.com/giwa/items/28c754d8fc2936c0f6d2)


[Install libpcap 1.7.3 in CentOS 6.6](http://qiita.com/giwa/items/16db4add0c9339a21c1a)

[Install MariaDB 10.1 in CentOS 6.6](http://qiita.com/giwa/items/a8bba1901080b7204fc2)

[Install glog 3.3.0 in CentOS 6.6](http://qiita.com/giwa/items/3bd5c5abf53069eb95b0)


[Install Nginx 1.8.2 in CentOS 6.6](http://qiita.com/giwa/items/21a1020820234a07a518)
Install MariaDB 10.1 in CentOS 6.6



MySQLが入っている場合は削除

```
$ yum remove mysql
```

add repository

```
vi /etc/yum.repos.d/MariaDB.repo
```

```
# MariaDB 10.0 CentOS repository list - created 2014-03-12 12:47 UTC
# http://mariadb.org/mariadb/repositories/
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.1/centos6-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1

```

install MariaDB

```
$ yum install MariaDB-server MariaDB-client MariaDB-devel
```

start MariaDB

```
$ service mysql start
```

```
$ mysql --version
mysql  Ver 15.1 Distrib 10.1.4-MariaDB, for Linux (x86_64) using readline 5.1
```

start MariaDB on boot

```
$ chkconfig mysql on
```


ref:
http://lintut.com/install-mariadb-on-centos/
Install libpcap 1.7.3 in CentOS 6.6	


少し古いので最新のlibpcapをインストール

```
$ yum list | grep libpcap
libpcap.x86_64                          14:1.4.0-1.20130826git2dbcaa1.el6
libpcap.i686                            14:1.4.0-1.20130826git2dbcaa1.el6
libpcap-devel.i686                      14:1.4.0-1.20130826git2dbcaa1.el6
libpcap-devel.x86_64                    14:1.4.0-1.20130826git2dbcaa1.el6
```

```
$ yum install flex bison
$ wget http://www.tcpdump.org/release/libpcap-1.7.3.tar.gz
$tar zxvf libpcap-1.7.3.tar.gz
$ cd libpcap-1.7.3
$ ./configure
$ make
$ make install
```
Install g++/gcc 4.8.2 in CentOS 6.6




```
$ wget http://people.centos.org/tru/devtools-2/devtools-2.repo -O /etc/yum.repos.d/devtools-2.repo
$ yum install devtoolset-2-gcc devtoolset-2-binutils
$ yum install devtoolset-2-gcc-c++ devtoolset-2-gcc-gfortran

```


/opt/rh/devtoolset-2/root/usr/bin/ に入る

```
$ /opt/rh/devtoolset-2/root/usr/bin/gcc --version
gcc (GCC) 4.8.2 20140120 (Red Hat 4.8.2-15)
Copyright (C) 2013 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
```


```
scl enable devtoolset-2 bash
```

を実行すると環境変数がセットされ、g++やると4.8.2となる。
shellを再起動するともとにもどるので、下記を`~/.bashrc`もしくは`~/.bash_profiles`に記載する

```
source /opt/rh/devtoolset-2/enable
```

ref:
http://unix.stackexchange.com/questions/175851/how-to-permanently-enable-scl-centos-6-4
http://superuser.com/questions/381160/how-to-install-gcc-4-7-x-4-8-x-on-centos
Install git 2.4.1 in CentOS 6.6


個人の忘備録


```
$ yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel perl-ExtUtils-MakeMaker
$ wget https://www.kernel.org/pub/software/scm/git/git-2.4.1.tar.gz
$ tar -zxf git-2.4.1.tar.gz
$ cd git-2.4.1
$ make prefix=/usr/local all
$ make prefix=/usr/local install
$ git --version
```


Thanks
ref:http://qiita.com/sirone/items/2e233ab9697a030f1335
Apache設定ファイルのIfModuleは消しておく方がよい。

Apacheの設定ファイルは、パッケージのデフォルトをそのまま使っていると、`<IfModule>`ディレクティブがたくさん記述してあると思います。

例

```apache:/etc/httpd/conf/httpd.conf
<IfModule dir_module>
    DirectoryIndex index.html
</IfModule>
```

自分でサーバ管理する場合は、この`<IfModule>`は全部消したほうがいいと思います。

実際、マニュアルにも「普通の運用では使う必要がない」と書いてあります。

http://httpd.apache.org/docs/2.4/en/mod/core.html#ifmodule

> In normal operation, directives need not be placed in `<IfModule>` sections.


以下、IfModuleがなぜダメかの理由をのべます。

# 理由１：IfModuleがあると可読性が下がる
`<IfModule>`で囲われていると、その設定が実際に有効になっているのかどうかがそこだけ見てもわかりません。
長大なhttpd.confの中にある`LoadModule`の森を探求したり、`conf.modules.d`ディレクトリの中を探したりして、そのモジュールがロードされてるかどうかを確認しないといけなくなります。

つまり、

```apache:/etc/httpd/conf/httpd.conf
<IfModule dir_module>
    DirectoryIndex index.html
</IfModule>
```

だと、「この設定は適用されてないかもしれない」という可能性が頭をよぎります。

しかしもしIfModuleを外して

```apache:/etc/httpd/conf/httpd.conf
DirectoryIndex index.html
```
とだけ書いてあれば、この設定は有効であると即座にわかります。

「考えることを減らす」のはシステム管理上とても重要です。

# 理由２：モジュール名の指定方法が一意でないのでわかりづらい

モジュール名の指定方法には何通りかあるので、ぱっと見て一致してるかわかりにくいケースがあります。

例えばCentOS7にRemiレポジトリのPHPをインストールした場合、

```apache
<IfModule  mod_php5.c>
```
というのが追加されますが、ロードする部分は

```apache
LoadModule php5_module modules/libphp5.so
```
となっています。
"mod_php5.c"と"libphp5.so"が同じモジュールを指しているとパッと見てわかるでしょうか？

# 理由3：そもそも条件分岐する必要がない

サーバ運用において、どのモジュールを使うか/使わないかは事前に決めておくべきことです。
「あるモジュールが入ってる場合はこうで、入ってない場合はこう」という場合分けの発想自体が間違いだと思います。

# 理由4：IfModuleがなければ、モジュールのロードし忘れを防げる

dir_moduleをロードしてない状態で、

```apache:/etc/httpd/conf/httpd.conf
DirectoryIndex index.html
```

と書いてあると、起動に失敗します。
これはモジュールのロード忘れを発見するのに効果絶大です。

`<IfModule>`でくくっていると、ロードし忘れてもApacheが起動するのので、「動くけどなんか挙動がおかしい」ということになります。
これは見つけにくいバグの原因になります。

# IfModuleは何のためにあるのか？

「１つの設定ファイルをいろんな環境で使い回したい」ときに使うものである、と書いてあります。

http://httpd.apache.org/docs/2.4/en/mod/core.html#ifmodule

> This section should only be used if you need to have one configuration file that works whether or not a specific module is available.

具体的にはOSのディストリビューションがデフォルト設定ファイルを提供するケースがそれに当たるでしょう。
PHPのアプリケーションが.htaccessを同梱する場合とかもそうですね。

「１つの設定ファイルをいろんな環境で使いまわす」というのは普通のサーバ運用ではあり得ないと思うので、やはり結論としてはIfModuleは消しておいた方がよいでしょう。
viewsに割り込む


drupalで頻繁に使われるviewsモジュールに割り込んでみます。
テーブル結合した後にconditionを追加してみました。


##結合したいテーブルを準備する

```php:custom_module.php
$join = new views_join();
$join->table      = 'table_name';
$join->left_table = 'node';
$join->field      = 'entity_id';
$join->left_field = 'nid';
$join->type       = 'LEFT';
```

##結合する
```php:custom_module.php
$query = $view->query;
$query->table_queue['hoge'] = array (
      'alias'        => 'alias_name',
      'table'        => 'table_name',
      'relationship' => 'node',
      'join'         => $join,
);

```

##さらに条件を指定してみる
```php:custom_module.php
$conditions = array();
$conditions[] = array(
        'field'    => 'table_name.field_name',
        'value'    => 'value',
        'operator' => '=',
);

$conditions[] = array(
      'field'    => 'table_name.field_name',
      'value'    => null,
      'operator' => 'is',
);

$query->where[] = array(
      'conditions' => $conditions,
      'type'       => 'OR'
);
```

##終わりに
Drupalのテーブル一度見てみるとおもしろいですよ。
日本語のDrupalの記事がもっと増えると良いと思います。


##参考サイト
[Joining a table in a views handler](https://www.drupal.org/node/2049051)
ファイルの文字コードを変換する。vi、iconv、nkf (nkfの文字コード判定とか一括変換は便利)


はじめに
linuxでファイルの文字コード変更するときのいくつかの方法メモです。

1. viで変更する
これは他の記事で詳細に書いたのでそちらに任せて手抜きしますw 
例としてはこんなカンジ。viで開いた後コマンドモードで行います。

:set fileencoding=文字コード
もしくは
:set fenc=文字コード
　
例) 保存形式をeuc-jpに変える
:set fenc=euc-jp
もっと詳しく
http://tweeeety.hateblo.jp/entry/2014/12/17/222935

2. iconvで変更する
iconvコマンドで変更します。

コマンドのフォーマット
iconv -f ENCODING -t ENCODING INPUTFILE
オプション
-f : 変換元の文字コード
-t : 変換後の文字コード
-o : 出力するファイル
INPUTFILE : 変換元のファイル名
-oを指定しない場合は、標準出力に表示して終わります。
変換して保存したいときに-oオプションで出力先を指定します

例
# iconv -f sjis -t utf-8 sample.pl -o sample.pl
参考
http://itpro.nikkeibp.co.jp/article/COLUMN/20131209/523510/

3. nkfで変更する
nkfはnetwork kanji filterの略らしいです。略を初めて知りました。
そんなこんなでnkfで変換。デフォルトでは入ってないのでyumでinstallして使いましょう。

また、nkf -g ファイル名で文字コードやファイルフォーマットを判別してくれるのでちょっとしたときに使えます

※ 文字コードの判別
# nkf -g sample.pl
EUC-JP (LF)

※ utf-8に文字コード変換してから判別してみる
# nkf -w --overwrite sample.pl
# nkf -g sample.pl
UTF-8 (LF)
オプション
-g : 自動判別
-w : UTF-8コードで出力
-e : EUC-JPコードで出力
-s : Shift-JISコードで出力
--overwrite : 直接上書き
参考
http://blog.layer8.sh/ja/2012/03/31/nkf_command_option/

4. 一括で変更する
こちらは参考サイトのまんまなので、コマンドだけ引用させて頂いて参考サイトを載せておきます

※ 拡張子がpolのすべてのファイルをutf-8に一括変換する
# find -name '*.pl' | xargs nkf --overwrite -w

※ ファイルタイプが`ファイル`のものをutf-8に一括変換する
# find . -type f -print0 | xargs -0 nkf --overwrite -w -Lu
参考
http://www.yukun.info/blog/2008/01/euc-to-utf8.html
javascriptをちゃんと学ぶ


最近はもはやHTML、CSS、jQueryしか書いていないので、
プログラミングできない子状態になっっている。

モチベーションと時間が足りないんですよ、ええ・・

モチベーションと時間のうち、とりあえずモチベーションを保つために[codecademy](http://www.codecademy.com/)で勉強を始めた。


## 組み込みメソッド

### decodeURI(), decodeURIComponent()
文字列をデコードする

### encodeURI(), encodeURIComponent()
文字列をエンコードする

### escape()
文字列をエスケープする

### eval()
文字列をjavascriptとして「評価」する

### isFinite()
数値が有限かどうか調べる

### isNaN()
Not a Number であるか調べる

### parseFloat()
文字列を少数に変換する

### parseInt()
文字列を数値へ変換する

### unescape()
エスケープされた文字列をデコードする

### addEventListener()
イベントリスナーを設定する

### alert()
メッセージとOKボタンのみのダイアログを表示する

###prompt()
- ウィンドウに文字入力ダイアログを表示
- OKボタンを押すと入力した文字列を返す
- キャンセルボタンを押すとnullを返す

###confirm()
- ウィンドウに確認ダイアログを表示
- OKボタンを押すとtrueを返す
- キャンセルボタンを押すとfalseを返す

### blur()
ウィンドウからフォーカスを外す

### clearInterval()
定期実行タイマーをクリアする

### clearTimeout()
自動実行タイマーをクリアする

### close()
子ウィンドウを閉じる

### focus()
ウィンドウにフォーカスを当てる

### moveBy()
指定したピクセル分だけウィンドウを移動する

### moveTo()
指定した座標へウィンドウを移動する

### open()
ウィンドウを新しく開く

### print()
印刷ダイアログを表示する

### removeEventListener()
イベントリスナーを削除する

### resizeBy()
ウィンドウを指定したサイズに変更する

### resizeTo()
ウィンドウを指定したサイズに変更する

### scrollBy()
指定したピクセル数だけウィンドウをスクロールする

### scrollTo()
指定した位置へウィンドウをスクロールする

### setInterval()
定期実行タイマーを設定する

### setTimeout()
自動実行タイマーを設定する

###substring()

- 文字列から特定の箇所の文字列を抽出する為のメソッド

```:javascript:script.js

//第一引数には抽出する箇所の開始位置を指定
"wonderful day".substring(3); //"nderful day"

//第二引数には抽出する箇所の終了位置を指定
//※　第一引数より大きい値を指定しなくてはならない
"wonderful day".substring(10, 13); //"day"


```


##プロパティ

###.length
- 文字列の長さを返すプロパティ

```:javascript:script.js

var str = "文字列だよ";
str.length; //5

```

## イベントタイプ一覧

主なイベントタイプをまとめました。

### マウス操作関連

| 種類 | 概要 | 
|:-------------|--------------------:|
| onclick 　　　| クリックされた         |
| ondblclick   | ダブルクリックされた    |
| onmousedown  | マウスのボタンが押された |
| onmousemove  | マウスカーソルが動いた   |
| onmouseout   | マウスカーソルが外れた   |
| onmouseove   | マウスカーソルが乗った   |
| onmouseup    | マウスのボタンが離れた   |


### キー操作関連

| 種類 | 概要 | 
|:-------------|--------------------:|
| onkeydown 　 | キーが押された         |
| onkeypress   | キーが押されて元の状態に戻った|
| onkeyup      | キーが元の状態に戻った |


### フォーム操作関連

| 種類 | 概要 |
|:--------|:--------|
| onreset  | リセットが行われた |
| onsubmit | データの送信が始まった |
| onblur   | フォーカスが外れた |
| onfocus  | フォーカスされた |
| onchange  | 値が変更された|
| onselect  | 選択された |


### データ読み込み関連

| 種類 | 概要 |
|:--------|:--------|
| onload  | データの読み込みが完了した |
| onunload | ページの遷移が始まった |
| onabort  | データの読み込みが中断された |
| onerror | データの読み込み時にエラーが発生した |


### ウィンドウ操作関連

| 種類 | 概要 |
|:---|:----|
| onresize  | ウィンドウのサイズが変更された |
| onscroll  | ウィンドウがスクロールした |





##【参考】JavaScriptリファレンス
[javascriptリファレンス](http://www.htmq.com/js/index.shtml)
web界隈でよく出てくる英単語訳メモ


##〆(.. )ｶﾘｶﾘｯ!!

###A-Z
|英語         | 日本語     |省略形|
|:-----------|:----------|:----|
|above       |上記|
|allow       |許可する|
|assignment  |割り当て|
|binary      | 二進|
|binayTree   | 二分木|
|conclusion  |結論|
|confirm     |確認する|
|component   |成分 / 構成要素|
|comparison  |比較|
|declare     |宣言する|
|disallow    |許可しない|
|divisibility|可分性|
|document    |文書|doc|
|equal       |等しい / 同じ|
|evaluation  |評価|eval|
|even        |偶数（さらに）|
|evil        | 悪の|
|exclude     |除外する|
|extend      |伸びる / 拡張する|
|greater than|＞（不等号）|
|glossary    |用語集|
|index       |索引|
|less than   |＜（不等号）
|math        |数学|
|modulo      |余剰|
|odd         |奇数|
|select      |選択する|
|square      | 四角|
|statement   |宣言 / 声明
|string      | 文字列|str|
|sum         | 合計|
|thread      | スレッド|
|token       | トークン|