OmniAICreator/Qiita-1.07M huggingface dataset:
CSSを使ってフェイドするスライド実装


```css
/*
 * -- Slider --
 * slider plugins class
*/
.slide { 
    visibility: hidden;
    opacity: 0;
    z-index: -1;
    -webkit-transition: all 2s ease-in-out;
       -moz-transition: all 2s ease-in-out;
        -ms-transition: all 2s ease-in-out;
         -o-transition: all 2s ease-in-out;
            transition: all 2s ease-in-out;
}

.slide.active {
    visibility: visible;
    opacity: 1;
    z-index: 10;
    -webkit-transition: all 2s ease-in-out 1s;
       -moz-transition: all 2s ease-in-out 1s;
        -ms-transition: all 2s ease-in-out 1s;
         -o-transition: all 2s ease-in-out 1s;
            transition: all 2s ease-in-out 1s;
}

```

```javascript
  $.fn.roopSlider = function(options) {
    $this = $(this)
    
    var settings = $.extend( {
                     'speed': 5000,
                     'start': 0
                   }, options);
                   
    var Slider = function(obj){
      $slide = $(obj).find('.slide')
      $slide[settings.start].classList.add('active')

      setTimeout(function(){
        roop();
      },settings.speed);
    };

    var getActive = function(){
      return $this.find('.active')
    }

    var getNext = function(){
      $active = getActive()
      if ($active.next('.slide').length == 0) {
        return $this.find('.slide').first()
      }

      return $active.next('.slide')
    }
    
    var roop = function(){
        active = getActive();
        next = getNext();

        active.removeClass('active');
        next.addClass('active');
        
        setTimeout(function(){
          roop();
        },settings.speed);
    };

```

あとはjavasriptでactiveクラスを切り替えるだけ
C# 日付計算 週の開始日と最終日

日曜始まりと月曜始まりは確認、火曜日始まり以降は未確認。

>コメントで指摘いただいているとおり次のコードには問題があります。
利用者の責任において、という前提ですが、検討される場合はコメントのコードから始めるとよいと思います。指摘いただいた方、ありがとうございます。

```csharp
public static class DateTimeExtension
{
    /// <summary>
    /// 週の最初の曜日を指定して開始日を返す
    /// </summary>
    /// <param name="source"></param>
    /// <param name="start">週の最初の曜日</param>
    /// <returns></returns>
    public static DateTime FirstDayOfWeek(this DateTime source, DayOfWeek start)
    {
        if (start == DayOfWeek.Sunday)
        {
            return source.AddDays(DayOfWeek.Sunday - source.DayOfWeek);
        }
        else
        {
            var d = start - source.DayOfWeek;
            return source.AddDays((d > 0) ? d - 7 : d);    // MAGIC
        }
    }

    /// <summary>
    /// 週の最初の曜日を指定して最終日を返す
    /// </summary>
    /// <param name="source"></param>
    /// <param name="start">週の最初の曜日</param>
    /// <returns></returns>
    public static DateTime LastDayOfWeek(this DateTime source, DayOfWeek start)
    {
        if (start == DayOfWeek.Sunday)
        {
            return source.AddDays(DayOfWeek.Saturday - source.DayOfWeek);
        }
        else
        {
            var d = start - source.DayOfWeek;
            return source.AddDays((d == 1) ? 0 : 6 + d);    // MAGIC
        }
    }
}
```
PHPのopenssl_encrypt()で暗号化したファイルをopensslコマンドで戻す


[PHPで暗号化したファイル](http://qiita.com/zaburo/items/93afa1dd19ad255eab41)をopensslコマンドで戻そうとした際、

```bash
bad magic number
```

と表示され、戻すことができませんでした。

なんで？としばらく悩みましたが、[openssl_encrypt()](http://php.net/manual/ja/function.openssl-encrypt.php)のUser Contributed Noteのところに、同じことでハマっていた人の大変有用な記述がありました。

要約すると、

* encrypt_openssl()でpassとなっている引数は、opensslコマンドでのpassではなく、keyだ！
* しかそもそのpass(key)やivはopensslで入力する際には16進数変換されたものとなる！

なので、普通にpassやivを指定しただけでは複合化できないということのようです。
うーん。

親切にサンプルコードも乗せてくれていたので、自分の用途に合わせて変更したものが下記です。
opensslコマンドでdecryptするコマンドも表示してくれます（一部、ファイル出力に変更）。

```php
<?php

    //与えられた文字を16進数に変換
    function strtohex($x) 
    {
        $s='';
        foreach (str_split($x) as $c) $s.=sprintf("%02X",ord($c));
        return($s);
    } 

    //生成条件
    //passとなっているところはopensslコマンド的にはkeyとなる
    $iv   = "1234567890123456";
    $pass = '1234567890123456';
    $method = 'aes-256-cbc';

    //
    echo "<h3>変換結果</h3>";
    echo "コマンドで戻す人には下記を教えます。<br>";
    echo "ivを16進数に変換: ".strtohex ($iv)."<br>";
    echo "key(pass)を16進数に変換: ".strtohex ($pass)."<br>";

    //変換
    file_put_contents('./file.encrypted',openssl_encrypt (file_get_contents('input.txt'), $method, $pass, true, $iv));

    //デーコードコマンド
    $exec = "openssl enc -".$method." -d -in file.encrypted -out out.txt -nosalt -nopad -K ".strtohex($pass)." -iv ".strtohex($iv);

    echo "<h3>opensslコマンドでデコードする際は下記のコマンドを利用。</h3>";
    echo $exec."<br><br>";
    //実際に実行
    echo exec($exec);
```

通常、暗号化、復号化を利用する場合、暗号化する人と復号化する人は別で、かつ別の環境を利用していることが普通なので、この仕様はちょっと？？？な感じですね。
SwiftでCALayerの暗黙的アニメーションを無効にする ( OSX )

CALayerのプロパティは変更すると暗黙的にアニメーションをしてくれます。便利ですね。
でも、シーンによってはこのアニメーションを一時的に無効にしたいケースがあると思います。

####CATransaction.begin と CATransaction.commit
```swift
CATransaction.begin()
CATransaction.setValue(kCFBooleanTrue, forKey: kCATransactionDisableActions)
//ここにCALayerのプロパティの変更のコードを記述
CATransaction.commit()
```
上記のように、CATransaction.begin と CATransaction.commit の間に変更されたCALayerのプロパティはアニメーションをしなくなります。が、覚えるのが面倒です!

###iOSは便利だよなぁ、、
UIViewのクラスメソッドにはperformWithoutAnimationというメソッドがあり、アニメーションを無効にしたい一連のプロパティ変更処理をクロージャで渡すことができます

```swift
//@available(iOS 7.0, *)
//public class func performWithoutAnimation(actionsWithoutAnimation: () -> Void)

UIView.performWithoutAnimation {
//ここにUIViewのプロパティの変更のコードを記述
}
```

##OSXにも移植しよう!
extensionを使って、CALayerにもperformWithoutAnimationメソッドを追加してみました

```swift

extension CALayer {
    class func performWithoutAnimation(actionsWithoutAnimation: () -> Void) {
        CATransaction.begin()
        CATransaction.setValue(kCFBooleanTrue, forKey: kCATransactionDisableActions)
        actionsWithoutAnimation()
        CATransaction.commit()
    }
}

CALayer.performWithoutAnimation {
//ここにCALayerのプロパティの変更のコードを記述
}
```

わーい、iOSみたいになったよー。
PiZero > message data structure v0.7

This article is for my entry to Pi Zero contest 2016.
https://hackaday.io/project/9526-bring-your-own-pizero-byop

The message has the following structure:

| item | type | description | example | 
|:-:|:-:|:-:|:-:|
| senderSerial | String | serial number of message receiver | 000000000000000d  |
| senderName | String | nick name of the message sender | 7of9 | 
| receiverName | String | nick name of the message receiver | Vitra |
| message | String | message text. Up to 16 characters for public message, any length for the private message | meet at the Arctic |
| isSecret | bool | secret message or not | 1 |
| postDate | String | datetime of the message post in [yyyymmdd] | 20160309 |

TBD:
- S/N may not be necessary. Moreover, considering the security, it's good to remove S/N
- Or to avoid mistake in checking up the receiver with the same nick names, it may be useful to use S/N
- idea: do not provide public function to show the serial number, but to use the serial inside
技術英語 > I [remember talking] to a lawyer friend who was involved with the American Institute of Architects (AIA). > I remember tweaking the code around the UI interface two days ago.

@ AXIS Feb. 2016 > Cover interview: Frank Gehry

> I <font color=red>remember talking</font> to a lawyer friend who was involved with the American Institute of Architects (AIA).

よく間違うのが remember + ing / remember + to do

- <font color=red>remember + ing</font> : したことを覚えている
- <font color=red>remember + to</font> V : V することを忘れない

http://i-eigo.net/cat_0/ent_66.html

<hr>

どうやって記憶の宮殿に格納するか。
自分が関連するもので覚えるのがよさそう。

英作してみた。

I remember tweaking the code around the UI interface two days ago.

I remember to check in the updates we have made as soon as we check the code integrity.

二つあるうちの一つを覚えたら、もう片方の使い方は明確なので、上記のどちらかを覚えるとしよう。

会話形式にしてみる。

Martin > Our software keeps crashing each time we deselect the checkbox. We applied the latest update yesterday 18:00. Any ideas?
Vital > I remember tweaking the code around the UI interface two days ago. Maybe that's the culprit. I will check the code and correct it.
Martin > Do it.

上記は単語の選択(tweakなど)に間違いがあるかもしれない。
htopの2.0が出てた

glibcをアップデートしようとしててきとーに`dnf update`を打ったら、[htop](http://hisham.hm/htop/)の2.0が入ってきたので2.0の新機能を見てみました。
あんまり機能的な変更点はありませんでしたが、書き始めたので書きますｗ

ちなみにhtopはtop代替ツールです。
多分殆どのLinuxユーザがtopの代わりに使ってるんじゃないでしょうか。

## クロスプラットフォームになった

一番の変更点はこれで、メジャーバージョンが上がったのは多分このため。
今まではLinuxのみサポートでしたが、FreeBSD, OpenBSD, MacOSXでも動くようになりました。

FOSDEMの[動画](https://www.youtube.com/watch?v=g5GamptmWeA)によると今までもFreeBSDではlinprocfsというLinuxのprocfsのエミュレーションで動くバージョンがあったり、MacOSXにも0.8.2ベースの独自フォークがあったそうですが今回正式対応したようです。てか、見てて一番の衝撃は「homebrewで入るMac版のはwrong versionだから使うな」って発言でしたｗ
いずれhomebrewで入れるものも2.0になるのかな？

ちなみに上記の動画によると内部的な実装も大きく変わっていて、プロジェクトトップ以下にlinux,freebsd,openbsd,darwinといったプラットフォームごとのサブディレクトリが切られるようになりました。
リファクタリングの過程も語られていて、まずlinuxとunsupportedの2つのディレクトリを作って、次にfreebsdのディレクトリを作るために、BSDでビルドしてエラーが出たので直す、そしてまたビルドしてエラーが出たら直すを繰り返す、次にエラーは出ないけどクラッシュするようになったので、それを再びクラッシュしなくなるまで直す、そして再びLinuxに戻して動くか確認する、みたいな苦労話もされてました。

## eで環境変数が見える

初期画面のプロセス一覧が表示されている画面にて任意のプロセス上でeを押すとそのプロセスの環境変数一覧が表示されるようになりました。何気に便利なんじゃないでしょうか。

## プログラムのパスが表示されるようになった

今まではプログラム名のみの表示でしたが、パスが表示されるようになりました。
デフォルトで有効になってますがF2のdisplay optionから無効にもできます。これまた中々有り難いですね。

## マウスサポート

* マウスの反応がよくなったみたいなことが書いてあったんですが分かりませんでしたｗ
* 画面スクロールがホイールでできるようになったって書いてあったんですが、マウス使ってないので、これまた分かりませんでしたｗ
  * ちなみにホイールスクロールにはNCurses6が必要らしいです。自分の環境(Fedora23)だとdnfで入るのはまだ5.9なのでどっちにしろ試せないですね。。。

## その他

あとはバグフィックス系がメインです。
ただMacのhomebrewで入るhtopがベースとしている0.8.2からだともっと色々な変更点があるので、[Changelog](https://github.com/hishamhm/htop/blob/master/ChangeLog)を見ると良いんじゃないでしょうか。

ということで、見た目的にはあんまり変更点無いですが以上です。
smbtorture(samba regression test)の実行方法

smbtortureの実行方法まとめ。

# smbtortureとは
Writing Torture Tests - SambaWiki
https://wiki.samba.org/index.php/Writing_Torture_Tests

>The smbtorture framework provided in Samba is an extremely powerful tool for exercising obscure parts of Windows protocols and determining how different server implementations, Windows among them, respond. 

`samba`の機能追加/不良修正とセットで`smbtorture`のテストケースが
追加される、ことがある。

実行方法は上記SambaWiki`Running tests`あたり。
`make test`で全テスト実行できる。


# 前準備
`smbtorture`の実行には、`waf`が必要。

```console
samba-samba-4.1.0# make test
WAF_MAKE=1 python ./buildtools/bin/waf test
'test' finished successfully (0.014s)
Project not configured (run 'waf configure' first)
Makefile:17: recipe for target 'test' failed
make: *** [test] Error 1
samba-samba-4.1.0#
```

## wafとは
Web Application Firewall の方ではない。

- 公式@GitHub
 - https://github.com/waf-project/waf

>Waf is a Python-based framework for configuring, compiling and installing applications. 

waf チュートリアル - 純粋関数型雑記帳
http://d.hatena.ne.jp/tanakh/20100212


## waf設定
wafはsambaソースに含まれているためインストールは不要。
wafはバージョン毎の互換性があまりないらしく、
プログラムにwafを含めることが推奨されているらしい。
sambaにも含まれている。

sambaソースの以下パスにwafが格納されている。

```
samba-samba-4.1.0# ls buildtools/bin/
waf*
```

### alias設定
```console
samba-samba-4.1.0/buildtools/bin# alias waf=$PWD/waf
samba-samba-4.1.0/buildtools/bin# waf --version
waf 1.5.19 (9709M)
```

### configure
`waf configure`を実行する。

```console
samba-samba-4.1.0# waf configure
Checking for program gcc or cc           : /usr/bin/gcc
Checking for program cpp                 : /usr/bin/cpp
Checking for program ar                  : /usr/bin/ar
Checking for program ranlib              : /usr/bin/ranlib
Checking for gcc                         : ok
Checking for program git                 : /usr/bin/git
....
Checking for new_form                                                                           : ok
building regedit
Checking linker accepts -Wl,-no-undefined                                                       : yes
Checking linker accepts ['-undefined', 'dynamic_lookup']                                        : no
Checking linker accepts -Wl,--as-needed                                                         : yes
Checking for -lc not needed                                                                     : ok
Checking configure summary                                                                      : ok
Checking compiler for PIE support                                                               : yes
'configure' finished successfully (1m2.308s)
```

# smbtorture実行
設定が完了すればsmbtortureを実行できる。
`make test`(全テスト実行)を実行してもいいが、
`TESTS=`で実行するtest suiteを絞り込める。

```console
samba-samba-4.1.0# make test TESTS=samr
WAF_MAKE=1 python ./buildtools/bin/waf test
'test' finished successfully (0.010s)
```
rubyでシステムにコマンドが存在するか確認する方法


mkmfライブラリの`find_executable`を使う。

http://docs.ruby-lang.org/ja/2.3.0/method/Kernel/i/find_executable.html

```
$ pry
[1] pry(main)> require 'mkmf'
=> true
[2] pry(main)> find_executable('dfu-util')
checking for dfu-util... yes
=> "/usr/local/bin/dfu-util"
[3] pry(main)> find_executable('kyoko-command')
checking for kyoko-command... no
=> nil
```

mkmf.log が出力されてしまうので、

```
module MakeMakefile::Logging
   @logfile = '/dev/null'
end
```

みたいなことをしたんだけどmkmfのメソッドを単体で使わないほうがいいのかな。
javascriptでDOCX,ODTをプレーンテキストに

# javascriptでDOCX,ODTをプレーンテキストに
MSWordの.docx及びLibreOfficeの.odtはXMLをzipで固めたものなのでjavascriptでも解読は可能(なはず)。機会があったので試してみた。

## 動作環境
* DOMParserが使えるブラウザ
* JSZip ( https://stuk.github.io/jszip/ ) jsでzipファイルを読み書きするため

## DOCXの構造調査
Wordで作られたdocxを展開したところ、テキスト情報は word/document.xml にあり、以下のような構造だった。

```word/document.xml
<w:document>
  <w:body>
    <w:p>
      <w:r>
        <w:t>plain text</w:t>
      </w:r>
      <w:r>
        <w:tab/>
      </w:r>
    </w:p>
    <w:p>....</w:p>
  </w:body>
</w:document>
```
* ``<w:p>``はHTMLのP要素のように改行されて表示される
* たくさんの``<w:r>``で細かくテキストが分割されている
* タブ(U+0009)は``<w:t>``内には存在せず、別の``<w:r>``内の``<w:tab>``に変換されるようだ

## docx2txtの実装

```js
"use strict";
/**
 * .docxファイルを読み取りプレーンテキストにする
 * @param file {File|Blob} docxのファイル
 * @param callback {function} プレーンテキストを引数にする関数
 */
var docx2txt = function(file, callback) {
  var fr = new FileReader();
  fr.onload = function() {
    var xml,dom,txt,p,i,r,j,t,k;
    xml = new JSZip(fr.result).file('word/document.xml').asText();
    dom = (new DOMParser()).parseFromString(xml, 'application/xml');
    txt = "";
    p = dom.firstChild.firstChild.childNodes; //w:document>w:body>w:p
    for(i=0; i<p.length; i++) {
      if (p[i].nodeName !== 'w:p') {continue;}
      r = p[i].childNodes;
      for(j=0; j<r.length; j++) {
        if (r[j].nodeName !== 'w:r') {continue;}
        t = r[j].childNodes;
        for(k=0; k<t.length; k++) {
          if (t[k].nodeName === 'w:t') {txt += t[k].textContent;}
          else if (t[k].nodeName === 'w:tab') {txt += "\t";}
        }
      }
      txt += "\n";
    }
    callback(txt);
  };
  fr.readAsArrayBuffer(file);
};

//FileオブジェクトはDrag and Dropやinput[type='file']などで作成。以下の例はinputタグ
document.getElementById('inputFile').onchange = function(e) {
  var file = e.target.files[0];
  if (file && file.name.match(/\.docx$/i)) {
    docx2txt(file, function(txt) {
      console.info(txt);
    });
  }
};
```

## ODTの構造調査
テキスト情報は .odt を展開した直下の content.xml にあり以下のような構造をしている

```content.xml
<office:document-content>
  <office:body>
    <office:text>
      <text:h>
        <text:span>plain text</text:span>
      </text:h>
      <text:p>
        <text:span>
          <text:s/>はスペース
          <text:tab/>はタブ
        </text:span>
      </text:p>
      ...
    </office:text>
  </office:body>
</office:document-content>
```

* DOCXに似ているが多少違う
* ``<office:text>``以下には``<text:h>``か``<text:p>``がある
* ``<text:p>``(またはh)直下の``<text:span>``内にplainTextがある
* ``<text:span>``の中にはplainText以外に、スペースを表す``<text:s/>``やタブを表す``<text:tab/>``が存在することもある

## odt2txtの実装

ほぼ同じなので略:P

## 考察
javascriptでDOCXやODTからプレーンテキストを抜き出すのはそう難しくはなかった。
1MB程度のファイルで試したが処理は数秒だった。
詳細に検証したわけではないので変換できていない文字があるかもしれない。
複数ドメインを運用している際のメールサーバドメインの扱い

#前提
[【Postfix + dovecot + Gmail】自前のメールサーバとGmailを連携させてみた](http://qiita.com/gerogero/items/96a300a9908b38c934c6)
この記事を書いた後、再設定した点がありましたので記事にしました。

#何が言いたいか
こんな感じでサーバを運用している際に、メールサーバの方のドメインがちょっと期待しない動作をしました。

```
┏━━━━サーバ━━━━┓
┃┌─────────┐┌─────────┐┃
┃│ Domain1 ││ Domain2 │┃
┃│(Web-Svr)││(MailSvr)│┃
┃└─────────┘└─────────┘┃
┃┌─────────┐┌─────────┐┃
┃│Apache2.4││ Postfix │┃
┃└─────────┘└─────────┘┃
┗━━━━━━━━━━━┛

Domain1:example.jp
Domain2:example.com
```

```:DNS設定
example.jp A 123.456.789.012
example.com A 123.456.789.012
example.com MX example.com 10
```

当たり前と言えば当たり前ですが、メールサーバ用のドメイン```example.com```にアクセスすると、```example.jp```のページが表示されます。ですが、本来ないはずのページに飛んでもらっては困るので以下のように設定を変更します。

```:DNS設定
#example.jpはそのまま
- example.com A 123.456.789.012
- example.com MX example.com 10
+ smtp.example.com A 123.456.789.012
+ example.com MX smtp.example.com 10
```

```:httpd.conf
#VirtualHostの一番上に書く
<VirtualHost *:80>
  ServerName 404
  Redirect 404 /
</VirtualHost>
```

```:Gmail(SMTP,POP)の設定
smtp.example.com #smtpを追加
```

欲を言えば、本来```example.com```ではwebサーバを立てていないので、レスポンスを返さずにリクエストを破棄してほしいのですが…

#こ↑こ↓を参考にしました
http://metasta.blog88.fc2.com/blog-entry-35.html
Railsアプリで、force_sslでないアクションではHTTPSからHTTPへのリダイレクトを強制する

# 前提

* Rails 4.2.x
* Ruby 2.3

# 本題

RailsアプリでSSLを強制させたい場合、つまり HTTP -> HTTPS のリダイレクトをさせたい場合は、
`force_ssl`を使うことができます。

```ruby
class HogeController < ApplicationController
  force_ssl only: :new
end
```

ここで、やんごとなき理由で HTTP -> HTTPS のリダイレクトが不要なアクションは必ずHTTPでアクセスさせたい、という要求があったとしましょう。
このときHTTPのページのみを行き来していれば何も問題はないのですが、一度HTTPSのページを経由すると、以降相対パスによる遷移はすべてHTTPSとなってしまいます。
つまり、明示的に HTTPS -> HTTP のリダイレクトを行わないといけません。

`force_ssl`を使っているという前提で、どうすればよいかちょっと考えてみました。
普通に考えると`request.ssl? #=> true`のときにHTTPへリダイレクトする、という処理を書けば良いのですが、`force_ssl`の対象となるアクションはその処理を実行したくないです（リダイレクトループになってしまうので）。

すぐに思いついたのは`force_ssl`が追加するCallbackの中身をCallbackChainから探して判定するという方法ですが、これはCallbackChainに入るときにはすでにlambdaに変換されていてあとからそのメソッド名とオプションを判定しづらい（できない？）のと、思わぬバグを仕込んでしまいそうで怖いので見送りました。

そこで、ひとつの実装として下記のようにしてみました。

```ruby
class ApplicationController < ActionController::Base
  include SslRedirectable
end

class HogeController < ApplicationController
  force_ssl only: :new
end

module SslRedirectable
  extend ActiveSupport::Concern

  included do
    before_action :force_non_ssl, if: :force_non_ssl?

    class_attribute :ssl_actions

    SSL_ACTIONS_ALL = [:all]

    def self.force_ssl(options = {})
      self.ssl_actions = options[:only] || SSL_ACTIONS_ALL
      super
    end
  end

  def force_non_ssl?
    request.ssl? && request.get? && !ssl_required?
  end

  def ssl_required?
    return false unless ssl_actions
    ssl_actions.include?(action_name.to_sym) || ssl_actions == SSL_ACTIONS_ALL
  end

  def force_non_ssl
    redirect_to non_ssl_url
    flash.keep
  end

  def non_ssl_url
    URI(request.original_url).tap { |u| u.scheme = 'http' }.to_s
  end
end
```

`force_ssl`を呼び出したときの対象のアクションをclass_attributeとして保持しておき、あとで当該アクションが呼ばれた時に参照する、というアプローチにしてみました。
`force_ssl`をオーバーライドして拡張していますが、このくらいなら変更に弱くないだろうし、既存コードに手を加えずに実現できるメリットが大きいのでありかな、という感じです。
ここおかしくね？とか、もっとスマートな方法があるとか、ご意見あればぜひお願いします！
FuelPHP Templateコントローラでviewファイルを自動的に読み込む


## 概要

1. viewの指定があれば通常どおり
2. なければ「コントローラ名/アクション名」でviewファイルを検索・生成
（アクションがusers/indexならviewファイルの位置はviews/users/index）

という形にします。

### 変更前のControllerイメージ

```php:controller/users.php
public function action_create()
{
    (略)
    $this->tmplate->content = View::forge('users/create');
}

public function action_register()
{
    (略)
    $this->tmplate->content = View::forge('users/create');
}

public function action_index()
{
    (略)
    $data = array(
        'users' => Model_User::find('all'),
    );
    $this->tmplate->content = View::forge('users/index', $data);
}
```

### 変更後のControllerイメージ

```php:controller/users.php
public function action_create()
{
    (略)
}

public function action_register()
{
    (略)
    $this->tmplate->content = View::forge('users/create');
}

public function action_index()
{
    (略)
    $data = array(
        'users' => Model_User::find('all'),
    );
    $this->set_template_data($data); //追加メソッド
}
```

## ソース
以下を基底クラスにします。モジュール、深い階層対応。
viewにdataを渡すためのset_template_dataというメソッドだけ新設しています。
代わりに$this->template->set_globalを使う手もあります。

```php
class Controller_Base extends Controller_Template
{
	protected $data;

	protected static function get_view_filename()
	{
		$controller_fullname = Request::active()->controller;
		$pattern = array(
			'/^(.*\\\)*Controller_/', //namespace & prefix
			'/_/',                   //separator
		);
		$replace = array(
			'',
			'/'
		);
		$controller = preg_replace($pattern, $replace, $controller_fullname);
		$action     = Request::active()->action;
		return sprintf('%s/%s', $controller, $action);
	}

	public function before()
	{
		parent::before();
		$this->template->title   = '';
		$this->template->content = '';
	}

	public function after($response)
	{
		$res = parent::after($response);
		if (! $res->body()->content) {
			$view = static::get_view_filename();
			$res->body()->content = View::forge($view, $this->data);
		}
		return $res;
	}

	public function set_template_data($data)
	{
		$this->data = $data;
		return $this;
	}
}
```

## ポイント
afterメソッドに到達した時点で
$this->template->contentがnullだとこけるので
あらかじめbeforeで空文字などをセットしておく。
$this->template->content = '';

Requestクラスで取得したコントローラ名にはprefix（Controller_）、
名前空間（モジュール名）が付加されているので全部取り除く。

モジュール内のコントローラでviewを指定した場合Fuelは

1. app/modules/モジュール/views
2. app/views

の順に検索してくれる。
protocol oriented with 継続渡し


### モチベーション

protocol (extension)内でenumのパターンマッチをしたい。

### 継続渡しスタイル (CPS: Continuation-passing style)

簡単な例として、入力された数字が3の倍数かどうかを判定する関数を用いて処理を分岐することを考えます。

```swift
func foo(x: Int) -> Bool {
	return x % 3 == 0
}

func main() {
	switch foo(1) {
	case true:
		print("true")
	case false:
		print("false")
	}
}
```

これを継続渡しスタイルで考えるとこんな感じになります。

```swift
func foo2<A>(x: Int, f: Bool -> A) -> A {
	return f(x % 3 == 0)
}

func main() {
	foo2(1){ x in
		switch x {
		case true:
			print("true")
		case false:
			print("false")
		}
	}
}
```

`foo(x: Int) -> Bool`の場合、

1. `foo`に値を渡し`Bool`値を得て、
2. 戻り値(`Bool`)が`true`か`false`か判断し、
3. 戻り値に応じて何かする (ここでは`print()`)

という手順になります。一方、
継続渡しスタイル`foo2<A>(x: Int, f: Bool -> A) -> A`の場合は、

1. `foo2`に値と関数を渡し、
2. `foo2`が`Bool`値を関数に適用する。

という手順になります。つまり継続渡しスタイルでは、関数の計算結果を判断するという部分を関数側に押しやってしまっているように見えます。

### 継続渡しスタイルのパターンマッチ

`enum`のパターンマッチの場合を考えます。つまり、`enum`をパターンマッチして何か行いたい場合において、パターンマッチ部分を関数側に押しやってしまうわけです。

具体例として、以下のような`Either<A, B>`を考えます。

```swift
enum Either<L, R> {
	case Left(L)
	case Right(R)
}
```

`Either<L, R>`が準拠するprotocol `EitehrType`を定義し、その中でパターンマッチ用のメソッド`either`を定義します。

```swift
protocol EitherType {
	typealias LeftType
	typealias RightType

	func either<A>(@noescape ifLeft ifLeft: LeftType -> A, @noescape ifRight: RightType -> A) -> A
}

extension Either: EitherType {
	typealias LeftType = L
	typealias RightType = R

	func either<A>(@noescape ifLeft ifLeft: L -> A, @noescape ifRight: R -> A) -> A {
		switch self {
		case .Left(let x):
			return ifLeft(x)
		case .Right(let x):
			return ifRight(x)
		}
	}
}
```

これにより`extension EitherType`内でパターンマッチが可能になります。

```swift
extension EitherType {
  var right: RightType? {
		return either(
			ifLeft: { _ in nil },
			ifRight: { $0 }
		)
	}
}

let a: Either<Int, Int> = .Left(0)
a.right // nil

let b: Either<Int, Int> = .Right(0)
b.right // 0
```

これだけだと`Either`側で実装すればいいんじゃ...と思ってしまうんですが、protocol内でパターンマッチできることで`where`文に`EitherType`が出てくる場合にもパターンマッチできるようになります。

```swift
extension Array where Element: EitherType {
	func rights() -> [Element.RightType] {
		return self
			.map{ $0.right }
			.filter{ $0 != nil }
			.map{ $0! }
	}
}

let eithers: [Either<Int, Int>] = [
  .Left(0),
  .Right(1),
  .Left(2),
  .Left(3),
  .Right(4)
]
eithers.rights() // [1, 4]
```

### 参考

- [継続渡しなHaskellライフ - モナドとわたしとコモナド](http://fumieval.hatenablog.com/entry/2014/02/11/205916)
- [robrix/Either - github](https://github.com/robrix/Either)
[随時更新]初心者がわからなかったことを検索した結果まとめ

# 要旨
- ググった結果、わかりやすくまとまっている記事・ブログなどのリンクをまとめたい。
- ブックマークするほどでもないし、Evernoteで記録するのはMarkdownじゃないからだるい。

#目次
1. Homebrew
2. プログラミングの勉強方法 
3. Xcodeのバグ

## 1.Homebrew
- Macでアプリケーションをインストールしよう、となった際には聞くことになるであろう「homebrew」。
- コピペで使えちゃってるけど、一体なんなんだ？
- インストールしたアプリケーションってどこに格納されてんの？
- っていうか、今どれだけのアプリケーションがhomebrewで管理されてんの？

### [ＨｏｍｅＢｒｅｗの仕組みについてまとめておく](http://takuya-1st.hatenablog.jp/entry/20111224/1324750111)

>この記事を見ればさっきの疑問が晴れます。

## 2.プログラミングの勉強方法
- プログラミングについて調べたいけど、どういうことを勉強したらいいの？
- 優れたエンジニアって、どんな学習方法でスキルアップしてるの？
- ネットに散らばってる知識もいいけどバラバラでまとまってないから本がいい…でもどんなテキストがいいの？
- こう勉強したらこんなエンジニアになったっていう体験談を知りたい。


### [非エンジニアがWebプログラミングで勉強すべき10のこと](http://techacademy.jp/magazine/6398) 
> 全くプログラミングに触れたことのない人は上記の記事を読めば、全体像がつかめると思います。

ですが、この記事は概要だけに触れているだけなので、具体的にどうすればいいのかわからないと思います。
上の記事の元となった、村田佑介さんの記事を参考にするといいでしょう。


### [プログラミング未経験者がWEBエンジニアになるためにやるべきこと](http://www.muratayusuke.com/2015/09/03/for_biginner_engineers/)

> 参考事例は、実際の学習方法や流れなどがまとまっており、非常に参考になります。
中でも、リブセンスさんの **非エンジニアを1ヶ月でエンジニアに育て上げる話** は必読です。


> メンティー視点； 
#### [人は1ヶ月でエンジニアになれるのか](http://www.slideshare.net/kiyotoyamaura/1-45361529)
> メンター視点：
#### [人は一ヶ月でエンジニアになれるのか - 詳細解説](http://www.slideshare.net/livesense/ss-46078743)

>> **"書籍は必ず「まとめ」を書いてもらう"**　→これは今後学習するにあたって参考にしたい点です。
> 使用図書も参考になります。[リーダブルコード](http://www.amazon.co.jp/%E3%83%AA%E3%83%BC%E3%83%80%E3%83%96%E3%83%AB%E3%82%B3%E3%83%BC%E3%83%89-%E2%80%95%E3%82%88%E3%82%8A%E8%89%AF%E3%81%84%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E6%9B%B8%E3%81%8F%E3%81%9F%E3%82%81%E3%81%AE%E3%82%B7%E3%83%B3%E3%83%97%E3%83%AB%E3%81%A7%E5%AE%9F%E8%B7%B5%E7%9A%84%E3%81%AA%E3%83%86%E3%82%AF%E3%83%8B%E3%83%83%E3%82%AF-Theory-practice-Dustin-Boswell/dp/4873115655)は私も読んでみるつもりです。

## 3.Xcodeのバグ

### __'Tread 1:signal SIGABRT'__

シチュエーション：Xcode iosシュミレータ起動時に発生したバグ
要因：コードとUI部品の繋がりがおかしい
　→詳細：storyboardとコードを連携した後に、変数名を変更したため
参照：[XcodeのiOS simulatorでTread 1:signal SIGABRTが出てアプリが立ち上がらない時](http://qiita.com/evistream/items/b83f75d6934efa9ee115)

>コードとUI部品がうまく繋がっていない！

>UI部品をctrl+ドラッグでコードにドラッグした後に変数名を変更しませんでしたか？
もしかしたらそれが原因です。
コードとUI部品がうまく繋がっていない！

>UI部品をctrl+ドラッグでコードにドラッグした後に変数名を変更しませんでしたか？
もしかしたらそれが原因です。


# 終わりに
随時追加していきます。

- 2016/02/19
	- プログラミングの勉強方法　追加
- 2016/03/12
	- Xcodeのバグ　追加
Windows7の.gemrc設定手順(プロキシ環境有)

# やりたいこと

* gem を Windows7 で設定する。

## 前提環境

* プロキシ環境有: `$proxyserver`:`$port`
* OS: Microsoft Windows 7 Professional 6.1.7601 Service Pack 1 (SP1) ビルド 7601 x64
* [Ruby: 2.2.4 (x64)](http://qiita.com/bu-son/items/abc9a100f5ab11063212) インストール済み
* [Devkit: mingw64-64-4.7.2-20130224-1432-sfx](http://qiita.com/bu-son/items/b274e4c273e30126526f) セットアップ済み


## 設定するファイル

* .gemrc

## 手順

### **.gemrc** ファイルを作成

コマンドプロンプト(cmd)で下記のコマンドを実行します。

* `%User_Profile%`: ログインユーザーのアカウント（ユーザープロファイル）を指定
* `%id%`: プロキシサーバのユーザーID (必要なら設定)
* `%pw%`: プロキシサーバのユーザーIDに紐付くパスワード (必要なら設定)
* `%proxyserver%`: プロキシサーバ名
* `%port%`: プロキシサーバのポート

```bat:cmd.exe
c:  :: <= 実行するコマンド
cd C:\Users\%User_Profile%\ :: <= 実行するコマンド
echo 'gem: --no-ri --no-rdoc' >> .gemrc :: <= 実行するコマンド
echo 'http_proxy: http://%id%:%pw%@%proxyserver%:%port%' >> .gemrc :: <= 実行するコマンド
```

```bash:.gemrc
gem: --no-ri --no-rdoc
http_proxy: http://%id%:%pw%@%proxyserver%:%port%
```

※ 作成された『.gemrc』は文字コードがUTF-8であること

### 完了

## 参考文献

* [RubyGemsでgemのインストール時に--no-ri --no-rdocをデフォルトにする](http://blog.ruedap.com/2011/05/14/ruby-gem-install-no-ri-no-rdoc-gemrc)
* [[unix][DONE] gem(RubyGems)を認証必須のプロキシ経由で使いたい](http://d.hatena.ne.jp/taiyo/20080401/p3)
JavaScript ライブラリ Kefir.js and Gojs

* Kefir.js 
Kefir is a Reactive Programming library for JavaScript （リアクティブプログラミングライブラリ）
https://rpominov.github.io/kefir/#examples

Kefirは低メモリで使えパフォーマンスの良いリアクティブプログラミングライブラリ


npm install kefir


------
* Gojs　（HTML5 Canvas を使ったライブラリ）
GoJS for HTML5 Canvas is a fast and powerful JavaScript library for implementing interactive diagrams.
http://gojs.net/latest/learn/index.html
DroidKaigi2016 概要個人メモ

##目的

DroidKaigi2016で参加した講演のメモとその共有

##1. Master of Canvas
**講演者：Yuki Mima (@amyu_san)**
**主張：素晴らしいUI・UXを用いて、ユーザーにaha experienceを提供したい。**
**内容：独自実装した3つのアニメーションの説明がメイン**

＜概要＞
1.waveswiperefreshlayout
水がぽちゃっと落ちてくるようなアニメーションを実装。2つのベジェ曲線を組み合わせて作成。上下左右に動く水は4つの2次関数を組み合わせて作成。

+ Path#cubicTo：ベジェ曲線を引く
+ TypeEvaluator：時間軸に沿って色や動きを指定、多次元配列を渡す時に使用する(?)
+ Interpolator：アニメーションの変化率を定義（キーワード、覚えたい）

2.BeerSwipereFreshlayout
ビールが注がれるアニメーション。

+ Path#op :AND, ORなど演算子の組み合わせで画像の合成を行う。時間軸に沿ってmOpPathを上下に動かすことで、ビールを注ぐ（注がれる）様子を表現

3.ColoringLoadingとTextMorphingView
1本の線で複数の文字を表現する。ベジェ曲線を用いたアニメーション。

+  ExtendScript Toolkit

##2. Fragments: Why, How, and What For?

**講演者：Brenda Cook**
**内容：Fragmentで出来ること、その実装について**

<概要>
fragmentを利用するのはよりFlexibleなアプリケーションを作るため。
内容としては、あっさりしていた。

+ static or dynamicなfragmentの違いとその実装方法
+ fragmentのライフサイクル
+ fragmentの差し替えetc..

##3.僕がテスト書け書けおじさんになった経緯とその過程でやったこと
**講演者：yuyakaido**
**主張：テストコードを書く文化を作る。テストの目的化は無意味、エンジニアは怠惰であれ！**
**内容：Couplesのアプリでの実例を元に実際にどういう流れでテストコードを書いたのか**
**プレゼン資料:[こちら](https://speakerdeck.com/yuyakaido/droidkaigi-2016 "Qiita")から**
 
 ＜概要＞
 プレゼン資料が充実しており、その通りに進行。流れとしては
 
 + Couplesのアプリの問題点：テストケースが膨大
 + 設計について：マッチョなActivity & Fragment
 + テストコードを書く上での方針：バックエンドの見直し
 + テスト手法とフレームワークについて：資料参照
 + テスト文化を作るには？：勉強会の開催、環境を用意するだけではNG
 + まとめ：人的リソースの浪費、および機会損失を防ぐために、テストコード書こう。
 + 番外編：ジェニファーさんのアプリ Telecineは便利らしい。
 

##4.最速でリリースするためのAndroidアプリデザイン
**講演者：青山 直樹**
**主張：デザイナーもちゃんとコードに触れよう！**
**内容：デザーナーの視点から、よりよいUI・UXとするためにはコードに触れることでAndroidでは何が出来るのかを知るべき、という話。**

＜概要＞

+ デザイナーもコードを書いたほうがいい（書けるか？ではなく、書いたことがあるかどうか）
+ カンプは作るべき（最終アウトプットはアプリなので伝わればok）
+ リソースの定義：デザインスタイルガイドに記載するような内容をValueに書いておき、それ以外は使わないことで全体が崩れない。
+ カラーパレットには全部使いそうな色を入れておく、Dimensに8dpごとに文字サイズを決めておく。
+ 画像は9-patchは使わない：ゆくゆくはAndroid Studio 2.0 のVector Assetsを利用（SVGファイルを用意すればOK, Material Designを簡単に読み込める）
+ Material Designのススメ：今はMaterial Designを基本に考えるのが効率的、Documentが充実、体型だった仕組みがある—> カスタマイズでブランディングが可能。


##5.用途に合わせたアニメーションの実装方法
**講演者：住友孝郎**
**主張：Animationのフレームワークを整理したい**
**内容：Animationを場合分けして実装についてxmlで書くものと、コードで書くものの区別しながら説明。**

＜概要＞

+ Viewの中身を動かす場合：Animation DrawableとAnimation Drawable
+ Viewそのものを動かす場合：コードとxmlによる表現、ViewPropertyAnimationの紹介
+ 複数のViewを動かす場合：ActivityAnimation, FragmentAnimation, Transition, ActivityTransition, FragmentTransitionに分けて説明。


##6.実践！Android Studioプラグイン開発
**講演者：こにし ゆうすけ@konifar**
**主張：プラグイン作ると非常に便利**
**内容：自身が作成した経験に基づき、プラグイン開発についてざっくりと説明**

＜概要＞

+ プラグイン開発について：基本的なことはQiitaでok
+ 覚えておくべきクラス
	1. ActionEvent: プラグインのActionに関する様々な情報を取得できるクラス
	2. Project: プロジェクトの情報を取れる。
	3. Editor: エディタの内容を取得できる。
	4. Document: エディタ内のテキストを取得。
	5. PsiFile: プロジェクト内のファイルの情報の取得。
+ UIの実装
	1. Dialog
	2. EditorHint
	3. Notification
	4. File Choser
+ 悩んだときは・・？
	1. intellij -sdk -docs
	2. android-parcelable-intellij-plugin
	3. adb-idea
	4. 最後はandroid studioのコードを読む。
RailsのMessage Verifiersは何をしているのか


今さらですが、Rails4.1リリースノートにある Message Verifiers を調べてみました.

## TL;DR

使い方はとてもシンプルで以下のように使うだけです.

```sh:rails_console
> token = Rails.application.message_verifier(:foo).generate('data')
=> "BAhJIglkYXRhBjoGRVQ=--c1d9142a4741bbe8d377d5d9d475948137805e5b"
> Rails.application.message_verifier(:foo).verify(token)
=> "data"
```

### 特徴

 - config/secrets.ymlの`secret_key_base`と引数(`:foo`)を使って秘密鍵を作るから強度がある.
 - データ(`'data'`)自体は暗号化されてない
 - Base64の文字列なのでURLに乗せられる
	 - `+`,`/`,`=`がメッセージ(`token`)中に含まれるから少し注意
 - メッセージが改竄されても検出できる

## キーとなるコードとか

- [Rails.application.message_verifier](https://github.com/rails/rails/blob/48f5cecdb03f697a710169ccef1885fcaca70788/railties/lib/rails/application.rb#L198)

- [Rails.application.key_generator](https://github.com/rails/rails/blob/48f5cecdb03f697a710169ccef1885fcaca70788/railties/lib/rails/application.rb#L165)

- [Active_support::MessageVerifier](https://github.com/rails/rails/blob/bb382b7aee116446518ca4ed1c6472d6b58f42b5/activesupport/lib/active_support/message_verifier.rb)

- Rails.application.secrets.secret_key_base
	- config/secrets.ymlの`secret_key_base`

## メッセージのフォーマット

メッセージのフォーマットはデータ格納する`[DATA]`と
検証で利用する`[DIGEST]`部分をつないだ文字列になります.

> [DATA]--[DIGEST]

試しに以下のメッセージをデコードしていきます.

```
BAhJIglkYXRhBjoGRVQ=--c1d9142a4741bbe8d377d5d9d475948137805e5b
```


### `[DATA]`のデコード

MarshalとBase64だけでできてます

`[DATA]`は以下のような感じでデコードできます
符号化しているだけなので簡単にデコードできます.

```ruby
::Marshal.load(::Base64.strict_decode64('BAhJIglkYXRhBjoGRVQ='))
#=> "data"
```

### `[DIGEST]`のデコード

`Rails.application.key_generator`を使った秘密鍵と
HMCAのハッシュ値を計算しています.

```ruby
secret = Rails.application.key_generator.generate_key('foo')
OpenSSL::HMAC.hexdigest(OpenSSL::Digest.const_get('SHA1').new, secret, 'BAhJIglkYXRhBjoGRVQ=')
#=> "c1d9142a4741bbe8d377d5d9d475948137805e5b"
```

検証自体はこのハッシュ値とメッセージに含まれるハッシュ値を比較してる感じです.
正確には単純な文字列比較でなくバイナリ単位で比較してるっぽい.
Atomインストールと日本語化(for Windows)

# 最近知ったAtomエディタをインストールしてみた

## はじめに
まずは自分用メモとして初投稿

## 手順
1. ダウンロード
    **https://atom.io/** 
    こちらからバイナリをダウンロード

1. インストール
    ダウンロードした**AtomSetup.exe**ファイルを実行する
    *1～2分くらい待ったから結構重いのか自分のPCが弱いのか・・・

1. 実行してみる
    デスクトップ上にショートカットAtomができていたのでそこから実行
    *起動までに少しかかる。メモリ喰ってるなぁ

1. メニュー表記等を日本語化してみる
    「Settings」→「Install」を選択
     Search packagesに「japanese Menu」を入力して「Packages」をクリック
     検索で出てきた「japanese Menu」の「Install」をポチって完了

## 今後
Atomエディタの機能を使って何かするのか、何かするのにAtomエディタの使い勝手が良いのかが問題だ。現状インストールまでなので、追々プログラミングなんかもやっていけたらと。

とりあえず以上。
AWS Lambdaで定期ツイートするところまで最速でやる(Node.js)

###今回やること
- AWS Lambdaを使って毎朝決まったツイートをする仕組みを作り、デプロイする。


##事前準備すること
- node.js(v0.10.36)
- [AWSのアカウント](https://aws.amazon.com/jp/)
- [Twitter連携](https://apps.twitter.com/)のキー4つ
	- consumer_key
	- consumer_secret
	- access_token_key
	- access_token_secret

##コード書く
```bash
$ mkdir autotweet
$ cd autotweet
$ mkdir node_modules
$ npm install twitter
$ vi autotweet.js
```

```autotweet.js
var Twitter = require('twitter');
var client = new Twitter({
  consumer_key: 'P',
  consumer_secret: 'I',
  access_token_key: 'Y',
  access_token_secret: 'O'
});
exports.handler = function(event, context) {
  client.post('statuses/update', {status: 'あさおきた'},  function(error, tweet, response){
    if(error) return context.fail('失敗');
    context.succeed('だん');
  });
};
```

書いた。
その後、何も考えずnode_modulesとautotweet.jsをzipにしてまとめる。

##AWSにあげる
![スクリーンショット 2016-02-18 23.40.06.png](https://qiita-image-store.s3.amazonaws.com/0/22392/2a4051e7-9031-ac50-910f-1307c3f65a6a.png "スクリーンショット 2016-02-18 23.40.06.png")

AWS→Lambda→Create a Lambda function →Skip(右下)
設定はこんな感じにした。
![スクリーンショット 2016-02-18 23.43.43.png](https://qiita-image-store.s3.amazonaws.com/0/22392/4f1acd74-f598-4413-1a23-d7abe8e92fd0.png "スクリーンショット 2016-02-18 23.43.43.png")
これで作る。

##Schedule設定
おこのみで。平日の朝八時にするとこんな感じ。
![スクリーンショット 2016-02-18 23.45.25.png](https://qiita-image-store.s3.amazonaws.com/0/22392/6ece194a-f459-1b58-83a0-d8c75ee39600.png "スクリーンショット 2016-02-18 23.45.25.png")


##できた
![スクリーンショット 2016-02-18 23.47.45.png](https://qiita-image-store.s3.amazonaws.com/0/22392/8320771a-4d72-8d53-d958-1848e81c3990.png "スクリーンショット 2016-02-18 23.47.45.png")

もちろんaws-cli使ってあげることも出来る。
iTunes ディレクトリ（アーティスト一覧）（mp4 メタ情報）

こんにちは。
「[iTunes ディレクトリ（アーティスト一覧）](http://qiita.com/kkdd/items/1af892052cd106a7da70)」に関して、今度は mp4 メタ情報を読み取る方法で一覧を作って見ました。mp4info コマンドを利用しました。

```console
$ find ~/Music -name "*m4a" -print0 | xargs -0 mp4info | grep -E ^\ Artist: | sed -e 's/ Artist: //' | ruby -pe '$_.gsub!(/\s{0,1}(_|,|;|:|-|&|and|And)\s/, "\n")' |sort|uniq
Karl Böhm
Karl Leister
Karl Richter
Karl Suske
```

mp4info コマンドは、homebrew でも導入できます。

```console
$ brew info mp4v2
mp4v2: stable 2.0.0 (bottled)
Read, create, and modify MP4 files
https://code.google.com/p/mp4v2/
```
同じクラスのインスタンス同士でprivateフィールドを参照

メモっておけばいつか使うかもしれない（使うとは言っていない）

```php
class Person
{
    private $secret;

    public function __construct($secret)
    {
        $this->secret = $secret;
    }

    public function look(Person $person)
    {
        return $person->secret;
    }

    public static function lookStatic(Person $person)
    {
        return $person->secret;
    }
}

class Other
{
    public static function lookStatic(Person $person)
    {
        return $person->secret;
    }
}

$me      = new Person('ブログ');
$brother = new Person('日記');

echo $me->look($brother);
echo Person::lookStatic($me);
echo Other::lookStatic($brother);

```

結果は上から順に

```php
日記
ブログ
Fatal error: Cannot access private property Person::$secret
```

staticメソッドのほうはともかく、同じクラスのインスタンス同士でも
privateフィールドにアクセスできるのは知りませんでした。
Devkit を Windows7 にインストールする手順

# やりたいこと

* DevkitをWindows7にインストールする。

# 前提環境
* OS: Microsoft Windows 7 Professional 6.1.7601 Service Pack 1 (SP1) ビルド 7601 x64
* [Ruby: 2.2.4 (x64)](http://qiita.com/bu-son/items/abc9a100f5ab11063212)

# インストールするソフトウェア
* Devkit: mingw64-64-4.7.2-20130224-1432-sfx

# 手順

## 圧縮ファイルをダウンロード

[RubyInstaller for Windows](http://rubyinstaller.org/downloads/) で **DevKit-mingw64-64-4.7.2-20130224-1432-sfx.exe** を選択し、圧縮ファイルをダウンロードします。
※古いバージョンは [Archives](http://rubyinstaller.org/downloads/archives) でダウンロードが可能です。

![image](https://qiita-image-store.s3.amazonaws.com/0/112128/35ae4509-aa57-a2cb-0537-f936c8c2ca7c.png)

## 解凍

**DevKit-mingw64-64-4.7.2-20130224-1432-sfx.exe** を実行して解凍します。
解凍先のディレクトリ: C:\Devkit\

![image](https://qiita-image-store.s3.amazonaws.com/0/112128/857282d4-e6e2-1b1f-3a47-c25cdc6d7460.png)

## 初期化
コマンドプロンプト(cmd)で下記のコマンドを実行します。

```bat:cmd.exe
c: 
cd c:\Devkit
ruby dk.rb init
```

正常終了メッセージ

```
Initialization complete! Please review and modify the auto-generated
'config.yml' file to ensure it contains the root directories to all
of the installed Rubies you want enhanced by the DevKit.
```

**config.yml** が作成されます。
c:\Devkit\config.yml

**config.yml** をテキストエディタで開き、Ruby のインストールパスを設定します。

```yaml:config.yml
# This configuration file contains the absolute path locations of all
# installed Rubies to be enhanced to work with the DevKit. This config
# file is generated by the 'ruby dk.rb init' step and may be modified
# before running the 'ruby dk.rb install' step. To include any installed
# Rubies that were not automagically discovered, simply add a line below
# the triple hyphens with the absolute path to the Ruby root directory.
#
# Example:
#
# ---
# - C:/ruby19trunk
# - C:/ruby192dev
#
---
- C:\Ruby22-x64
```

## インストール
コマンドプロンプト(cmd)で下記のコマンドを実行します。

```bat:cmd.exe
c: 
cd c:\Devkit
ruby dk.rb install
```

正常終了メッセージ

```bat:result
[INFO] Updating convenience notice gem override for 'C:/Ruby22-x64'
[INFO] Installing 'C:/Ruby22-x64/lib/ruby/site_ruby/devkit.rb'
```

# 完了
SQLで複数のカラムを結合してまとめて検索する方法


郵便番号や住所、電話番号などデータベース上で、一つの属性値をテーブル上で複数カラムで管理していることがよくあります。
検索時に検索項目がカラムごとではなく属性値の場合に、カラムを結合させて検索しなければいけない場面がよくあると思います。


その場合はSQL関数で用意されているCONCAT関数を使うことで、以下のようにすることで対応ができます。

```sql
SELECT * FROM table_name WHERE CONCAT('zipcode1', 'zipcode2') = '1130011'
```

引数は結合する分だけ指定できます。
ただしRDBMSによって、CONCAT関数の仕様が異なるため、使う場合は対象のRDBMSの仕様を確認してから使った方が良さそうです。
RDO (Liberty版)でボリュームのクォータ情報が取得できないときの対処法

RDO (Liberty版)をインストールして動作確認中の話。
ボリュームのクォータ情報を取得しようとしたら下記のエラーが返ってきた。。

    # cinder quota-show 7353dcfcf497410ea45b6218167d9860
    ERROR: The server has either erred or is incapable of performing the requested operation. (HTTP 500) (Request-ID: req-75dd4e6e-da49-4b92-b72c-71b2bfe82430)

Kilo版の時にはこんなエラー出てなかったけれど、何だろう。。
`/var/log/cinder/api.log`を見ると下記のエラーが出ている。。

     Caught error: Not enough information to determine URL. Provide either auth_url or endpoint

auth_urlかendpointを設定しろというメッセージが出ているので、
`/etc/cinder/cinder.conf`に以下のパラメータを設定。

    [keystone_authtoken]
    auth_uri=http://IP:5000/

パラメータを更新後に、cinderを再起動して、改めてトライ。

    # openstack-service restart cinder
    # cinder quota-show 7353dcfcf497410ea45b6218167d9860
    +----------------------+-------+
    |       Property       | Value |
    +----------------------+-------+
    |   backup_gigabytes   |  1000 |
    |       backups        |   10  |
    |      gigabytes       |  1000 |
    |   gigabytes_iscsi    |   -1  |
    | per_volume_gigabytes |   -1  |
    |      snapshots       |   10  |
    |   snapshots_iscsi    |   -1  |
    |       volumes        |   10  |
    |    volumes_iscsi     |   -1  |
    +----------------------+-------+

無事表示された!! よかったよかった。
PHPでGitHubAPIを使うときはユーザエージェントが罠

#はじめに
GitHubAPIで、OAuth認証してデータ取得する為の方法を
メモっておきます。

言いたいことは、タイトルで終わっています。
他は特に嵌るポイントはないです。

#OAuth認証するメリット
OAuth認証しないと1時間に60回しかリクエストを送れません。
認証すると、1時間5000回までいけるようになります。

このAPIを利用して、ちょっとしたwebサービスでも作ろうと思ったら
基本OAuth認証が必要になります。

#嵌りどころ

##ユーザエージェントが罠
PHPでfile_get_contentsでリクエストを送ると
リクエストヘッダのユーザエージェントが、デフォルトで
「PHP/x.x.x」になります。

この「PHP/x.x.x」をGitHubAPIが弾いているようで
そのままリクエストを送ると403が返ってきます。

その為、php.iniのユーザエージェント設定を変更するか
file_get_contentsにてユーザエージェントを指定する必要があります。

参考
http://webtech-walker.com/archive/2007/05/08223419.html
http://xirasaya.com/?m=detail&hid=320

#サンプルコード

```php
$options = array(
    'http'=>array(
        'method'  => 'GET',
        'header'  => array(
                'Authorization: token [API_TOKEN]',
                'User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.106 Safari/537.36',
        )
    )
);
$context = stream_context_create( $options );
$contents = file_get_contents( 'https://api.github.com/users/bzz0217', FALSE, $context );
var_dump($contents);
```

#変更が必要な箇所
上記サンプルコードを動かす為に必要な変更箇所です。

##APIトークンの設定
[API TOKEN]の箇所に自身のGitHubのAPIトークンを設定してください。

```php
                'Authorization: token [API_TOKEN]',
```

APIトークンの取得がまだの方は下記記事を参考に取得してください。
http://blog.fkoji.com/2012/09051441.html

##リクエストするURLを変更
リクエストしたいURLを変更してください。

```php
$api_url = 'https://api.github.com/users/bzz0217';
```

どんなことが出来るかは、下記マニュアルを参照ください。
https://developer.github.com/v3/repos/

#Lets'エンジョイ！
では、GitHubAPIでLets'エンジョイ！
快適なAPIリクエストライフをお楽しみ下さいw
Ruby CSVを扱うためのメモ

Rubyでcsvを扱うときにパッと使えるようにメモを残しておきます。
やることは以下です。

- CSVファイルからデータを読み込むこと ( CSV.read )
- 読み込んだCSVデータをtxtファイルに出力すること ( File.open、file.write )

おまけ

- CSV.foreachでもCSVから読み込み
- CSV.generateでCSVで出力する


# CSV.read
member.csvというcsvファイルを読み込んで、intro.txtとファイルに出力するサンプルです。

```rb:create_intro.rb
require 'csv'

csv_data = CSV.read('member.csv', headers: true)
puts "start..."

File.open("intro.txt", 'w') do |file|
  csv_data.each do |data|
    intro_msg = "#{data["club"]}クラブ所属の#{data["age"]}歳、#{data["name"]}です。\n"
    puts intro_msg
    file.write(intro_msg)
  end
end

puts "complete! See intro.txt."
```

```member.csv
id,name,club,age
1,shizuma,baseball,22
2,qiita,soccer,33
3,taro,tennis,16
```

以下のファイルが出力されるファイルです。

```intro.txt
baseballクラブ所属の22歳、shizumaです。
soccerクラブ所属の33歳、qiitaです。
tennisクラブ所属の16歳、taroです。
```

# 解説

```rb
require 'csv'
```
csvライブラリを読み込みます。

```rb
csv_data = CSV.read('member.csv', headers: true)
```

readメソッドを使ってCSVのデータを読み込みます。
headersオプションを使うと、CSVの初めの1行はheaderとして出力の際に無視されます。今回はこのオプションを使っていますが、headerがないときはこのオプションはいりません。
ちなみに今回のheaderはcsvファイルの ```id,name,club,age``` のことですね。

```rb
File.open("intro.txt", 'w') do |file|
  csv_data.each do |data|
    intro_msg = "#{data["club"]}クラブ所属の#{data["age"]}歳、#{data["name"]}です。\n"
    puts intro_msg
    file.write(intro_msg)
  end
end
```

まず、 ```File.open```の箇所ですが、第一引数に生成したいファイル名、第二引数にオプションをいれています。今回の「w」はファイルを上書きしますが、「a」とするとファイルに追記していきます。

次に、```csv_data.each``` のところですがdataという変数にcsvファイルのデータが1行ずつ入ります。「,」区切りで左から0、1、2、...という番号がつきます。

追記:

```rb
intro_msg = "#{data["club"]}クラブ所属の#{data["age"]}歳、#{data["name"]}です。\n"
```

の箇所ですが、はじめは以下のように左からの順番で値を取得していましたが、 @scivola さんにコメントを頂き上記に変更しました。csvにheaderがある場合はheaderの値で指定出来るのですね。便利です！

```rb
intro_msg = "#{data[2]}クラブ所属の#{data[3]}歳、#{data[1]}です。\n"
```

# 参考
その他オプション等
[class CSV](http://docs.ruby-lang.org/ja/2.0.0/class/CSV.html)

# ついでに色々やってみた

## CSV.foreach

readで一気に読み込まなくても、foreachでやれば良さ気ですね。
やってることは上記のreadのファイルと一緒です。便利。

```rb
require 'csv'

puts "start..."

File.open("intro.txt", 'w') do |file|
  CSV.foreach('member.csv', headers: true) do |data|
    intro_msg = "#{data["club"]}クラブ所属の#{data["age"]}歳、#{data["name"]}です。\n"
    puts intro_msg
    file.write(intro_msg)
  end
end

puts "complete! See intro.txt."
```



## CSV.generate

CSVで吐き出すことも出来るみたいです。読み込んだデータもCSVですが、少し加工してまたCSVで出力してみます。

```rb
require 'csv'

puts "start..."

intro_csv = CSV.generate do |csv|
  CSV.foreach('member.csv', headers: true) do |data|
    intro_msg = [
      data["id"],
      data["name"],
      "#{data["club"]}クラブ",
      "#{data["age"]}歳"
    ]
    csv << intro_msg
    puts intro_msg
  end
end

File.open("intro.csv", 'w') do |file|
  file.write(intro_csv)
end

puts "complete! See intro.csv."
```

出力は以下のような感じ。

```intro.csv
1,shizuma,baseballクラブ,22歳
2,qiita,soccerクラブ,33歳
3,taro,tennisクラブ,16歳
```

これだけあれば色々出来そうですね！
Rust：Cargoでmain.rs以外のソースファイルのmain()関数を実行する

[Cargo](https://rust-lang-ja.github.io/the-rust-programming-language-ja/1.6/book/getting-started.html#hello-cargo) は、Rust のビルドシステム、兼、パッケージマネージャーです。`cargo new ... --bin` で実行可能アプリケーションのひな形を作成した後、`cargo run` でプログラムを実行しようとすると、デフォルトで `src/main.rs` の中の `main()` 関数が呼ばれます。

もし、別のソースファイルに書かれた `main()` 関数を実行したい時は、 `Cargo.toml` ファイルを編集して、bin ターゲットを追加します。

例えば、プロジェクトが以下のようになっていて、それぞれの `mailN.rs` ファイルの中で `main()` 関数が定義されている時は、

```shell-session
my_project
├── Cargo.lock
├── Cargo.toml
├── src
│   ├── main1.rs
│   ├── main2.rs
│   └── main3.rs
└── target
    └── ...
```

Cargo.toml の `[[bin]]` 以下を、このように書きます：

```Cargo.toml
[package]
name = ...
version = ...
authors = ...

[dependencies]
...

[[bin]]
name = "main1"
path = "src/main1.rs"

[[bin]]
name = "main2"
path = "src/main2.rs"

[[bin]]
name = "main3"
path = "src/main3.rs"
```

`name` が bin ターゲット名で、`path` が `main()` 関数の書かれたソースファイルへの相対パスとなります。

そして、例えば、`main2` を実行したい時は、以下のようにすれば OK です。

```shell-session
$ cargo run --bin main2
```

**環境**

以下のバージョンで確認：

- cargo 0.8.0 (08da2f5 2015-12-21)
- rustc 1.6.0

古いバージョンでも問題なく動くと思います。
TypeScriptのawaitとasyncを使う

デブサミ2016でaltJS使うなら、`Promise`で`then()`をつなげるよりも、`await`と`async`がいいよと教えられたので使ってみた。

```ts
async function main() {
  const value = await sleep(1000, 10);
  console.log(value);
}

function sleep(msec, val):Promise<number> {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve(val)
    }, msec);
  });
}

main();
```

ChromeやFirefox、Safari、Edgeでちゃんと動作します。旧Internet Explorer 11（IE11）向けにトランスパイルしたい場合は、次の記事を参照ください。

- [webpack + BabelでES2017環境の構築 \- ICS MEDIA](https://ics.media/entry/16028)
- [webpack + TypeScriptの環境構築 \- ICS MEDIA](https://ics.media/entry/16329)
ES6でクラス定数を使う


`Class.CONST`のかたちで呼び出せる、クラス定数をES6のクラス構文で書いてみました。

```js:index.js
class Qiita {
  static get API_ENDPOINT() {
    return "http://qiita.com/api/v2/";
  }
}

console.log("Qiita API Endpoint:", Qiita.API_ENDPOINT);
```

```json:package.json
{
  "name": "es6-class-const",
  "version": "1.0.0",
  "main": "index.js",
  "license": "MIT",
  "devDependencies": {
    "babel-cli": "^6.5.1",
    "babel-preset-es2015": "^6.5.0"
  },
  "babel": { "presets": [ "es2015" ] }
}
```

試してみるには、上記の2ファイル（`index.js`と`package.json`）を置き、同じディレクトリで以下のコマンドを実行してください。

```console:コマンドライン
$ npm install
$ node_modules/.bin/babel-node index.js
```

```console:実行結果
Qiita API Endpoint: http://qiita.com/api/v2/
```

また、結果的にES6のコマンドライン実行の最小環境サンプルにもなりました。

各種バージョンは以下の通りです。

```console:コマンドライン
$ node --version
v5.5.0
$ npm --version
3.7.1
$ node_modules/.bin/babel-node --version
6.5.1
```

それでは良いES6開発ライフをお過ごしください。

---

追記：Githubにリポジトリも作ったのでそちらから動作を試すこともできます。
https://github.com/noriaki/es6-class-const-example

---

追記：[@ykzts](http://qiita.com/ykzts)さんから編集リクエストをいただき、[固定値を返すのであれば `get`を使う必要はありません](http://qiita.com/noriaki/items/e7adaaf440020fbf6836/revisions/2)と教えていただきました。ありがとうございます。

調べてみた感じだと、以下の構文は[ES7の仕様として検討されている構文](https://github.com/jeffmo/es-class-fields-and-static-properties)でのようです。

```js:index.js
class Qiita {
  static API_ENDPOINT = "http://qiita.com/api/v2/";
}

console.log("Qiita API Endpoint:", Qiita.API_ENDPOINT);
```

この構文をBabelで有効にする場合は、`package.json`を以下のようにすると利用可能になります（transform-class-propertiesプラグインを追加）。

```json:package.json
{
  "name": "es6-class-const-sample",
  "version": "1.0.0",
  "main": "index.js",
  "license": "MIT",
  "devDependencies": {
    "babel-cli": "^6.5.1",
    "babel-plugin-transform-class-properties": "^6.5.2",
    "babel-preset-es2015": "^6.5.0"
  },
  "babel": {
    "presets": [ "es2015" ],
    "plugins": [ "transform-class-properties" ]
  }
}
```

こちらのケースは、[noriaki/es6-class-const-example#es7-transform-class-propertiesブランチ](https://github.com/noriaki/es6-class-const-example/tree/es7-transform-class-properties)としてGithubリポジトリに反映しておきました。
Ruby 2.3.1 を Windows7 にインストールする手順

# やりたいこと

Ruby 2.3.1 を Windows7 にインストールする。

# 前提環境

* OS: Microsoft Windows 7 Professional 6.1.7601 Service Pack 1 (SP1) ビルド 7601 x64

# インストールするソフトウェア

* Ruby: 2.3.1 x64

# 手順

## インストーラをダウンロード

[RubyInstaller for Windows](http://rubyinstaller.org/downloads/) で **Ruby 2.3.1 (x64)** を選択し、インストーラをダウンロードします。
※古いバージョンは [Archives](http://rubyinstaller.org/downloads/archives) でダウンロードが可能です。

![image](https://qiita-image-store.s3.amazonaws.com/0/112128/b93ce0f1-f4e5-5c43-073f-24da0ad22c46.png)

## インストーラを実行

**rubyinstaller-2.3.1-x64.exe** を実行します。

1. セットアップに使用する言語 **日本語** を選択
2. **OK** を選択

![image](https://qiita-image-store.s3.amazonaws.com/0/112128/e0dc61de-13e6-cd7b-8809-bf8a69db1c17.png)

1. 使用許諾契約書の同意 **同意する** を選択
2. **次へ** を選択

![image](https://qiita-image-store.s3.amazonaws.com/0/112128/3027a471-9819-d796-5309-856ecff71be1.png)

インストール先のディレクトリ: C:\Ruby23-x64

- [ ] Tcl/Tk サポートをインストールする
- [x] Ruby の実行ファイルへ環境変数 PATHを設定する
- [x] .rb と .rbw ファイルを Ruby に関連づける

**インストール** を選択

![image](https://qiita-image-store.s3.amazonaws.com/0/112128/7d853c5f-e323-ba7d-bfc4-029952a938f3.png)

**完了** を選択

![image](https://qiita-image-store.s3.amazonaws.com/0/112128/3616c8ca-bf54-d29c-73cd-bb0a9d9a4764.png)

1. PowerSheel を起動。`%SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe`
2. Ruby のバージョンを確認

```ps1:コマンド
PS C:\> ruby -v
```

```ps1:出力結果
ruby 2.3.1p112 (2016-04-26 revision 54768) [x64-mingw32]
```

# 完了