OmniAICreator/Qiita-1.07M huggingface dataset:
PHP7で流行って欲しいリクエストパラメータの受け取り方

# 経緯

過去に色々

```php
$a = $_GET['a'];
```

みたいなコードの是非を巡ってPHPと闘ってきましたが…

- [$_GET, $_POSTなどを受け取る際の処理](http://qiita.com/mpyw/items/2f9955db1c02eeef43ea)
- [filter_input_simple](http://qiita.com/mpyw/items/5a7242269f51dfabc973)
- [filter_input_array_recursive](http://qiita.com/mpyw/items/c39b9ee695a5c2e74627)

いずれにも以下のような欠点がありました。

- `filter_input` で一発処理出来るのは**外部から受け取る値**かつ**文字列**のみ
- 上記に該当しないものには `isset` と `is_string / filter_var` の処理がどこかで必要になってくる

# PHP7からは…？

PHP7には**NULL合体演算子`??`**が導入されており、任意の変数に対して

- 未定義でもNULLでもなければ左オペランドの値を採用
- 未定義またはNULLのとき右オペランドの値を採用<br />**(内部で`isset`相当のチェックを行っているのでエラーが発生しない)**

という処理を記述することが出来ます。

## 文字列型のみ処理したい場合

```php:filter_inputでの書き方
$a = filter_input(INPUT_GET, 'a'); // 未定義の場合は null， 配列の場合は false になる
if (is_string($a)) {
    /* 正常系の処理 */
}
```

```php:NULL合体演算子での書き方
$a = $_GET['a'] ?? null; // 未定義の場合は null になり, 配列の場合は配列のまま
if (is_string($a)) {
    /* 正常系の処理 */
}
```

## 文字列型を強制する場合

```php:filter_inputでの書き方
$a = (string)filter_input(INPUT_GET, 'a'); // 未定義や配列の場合は空文字列になる
```

```php:NULL合体演算子での書き方
$a = (string)filter_var($_GET['a'] ?? ''); // 未定義や配列の場合は空文字列になる
```

# 考察

## `filter_input`と比較したときの長所

**配列がネストしていても大丈夫。** これに尽きます。

```php:
$a[0] = (string)filter_var($_GET['a'][0] ?? ''); 
```

もうちょっと楽をしたければ、`htmlspecialchars`に対して`h`というラッパー関数を割り当てる感覚で

```php:$varは値渡し
function s($var) {
    return (string)filter_var($var);
}
```

という関数を作っておくと

```php
$a = s($_GET['a'] ?? ''); 
```

と書けます。文句無しですね。

## 実はPHP5でも…

これは賛否両論あると思いますが、未定義の要素が勝手にNULL初期化されても問題無いのであれば

```php:$varは参照渡し
function s(&$var) {
    return (string)filter_var($var);
}
```

という関数を作っておくと

```php
$a = s($_GET['a']);
```

で済みます。大事なことなので二度言いますが、未定義でも勝手に

```php
$_GET['a'] = null;
```

という処理が走るのであまりおすすめは出来ません。
NIS環境構築 (Centos6.x)

# NISサーバ構築
1) yumで必要なサービスを取ってくる。
```yum install ypserv rpcbind ```
2) NISドメイン名を設定する。
```ypdomainname NISドメイン名```
```vi /etc/sysconfig/network```で以下を追記。
```NISDOMAIN=NISドメイン名```

3) /etc/yp/Makefileの以下の行にNISを行いたいファイルを記載。
```all: passwd shadow ...```

4) /etc/yp.confに以下を追記。
```domain=NISドメイン名 server IPアドレス```
```ypserver IPアドレス```

5) ```/etc/ini.d/rpcbind restart
/etc/ini.d/ypserv restart
/etc/ini.d/yppasswdd restart
```

6) ```chkconfig rpcbind on
chkconfig ypserv on
chkconfig yppasswdd on
```

7) ```/usr/lib64/yp/ypinit -m```
Serverspec Windowsをテストする際にドメイン認証を使う方法


WindowServerに対して、Serverspecを実行する際にドメイン認証を使いたくなると思うが、Serverspec-initで標準で出来るspec_helper.rbではベーシック認証のみしか受け付けてくれないので、下記のようにドメインユーザ指定するとwinrm認証でこけてテストが失敗する。。

```
user = "[ドメイン名]\ユーザ名"
pass = "パスワード"
```

##標準でのwinrmの接続文字列
basic_auth_onlyを指定があるので他の認証は不可

```
winrm = ::WinRM::WinRMWebService.new(endpoint, :ssl, :user => user, :pass => pass, :basic_auth_only => true)
```

##こう変更する
色々調べてみたんだけど、答えは簡単でwinrmのgemリポジトリの中に答えがあった。

[winrm](https://github.com/WinRb/WinRM)

basic_auth_onlyを外して、disable_sspiオプションを指定(無効化)する。

[SSPIとは](http://eternalwindows.jp/security/sspi/sspi01.html) Windows認証をセキュアにする為のAPI

```
winrm = ::WinRM::WinRMWebService.new(endpoint, :ssl, :user => user, :pass => pass, :disable_sspi => true)
```

##おまけ

各々のドメインユーザで認証するケースだと都度入力にしたいと思い、ドメインのID,passをハードコードするのはセキュリティ上もよろしくないので、こんな感じで対話式にして実行するとよい。

```
#ユーザ名・パスワード入力を都度入力に変更
puts "ユーザ名を入力して下さい sample:dc1\..."
user = STDIN.gets.chop

puts "パスワードを入力して下さい"
pass = STDIN.noecho(&:gets).chop

```

これでドメインユーザでの、Serverspecの実行が可能となる！！
WKWebView でページ遷移時に about:self で止まる

# 発端
事の発端は以下のTweet内のリンクをアプリ内ブラウザで表示しようとした時。
<blockquote class="twitter-tweet" lang="ja"><p lang="ja" dir="ltr">iOS 8以降の端末でKDDI系MVNOサービスが利用可能に？――IIJが調査結果を公開 <a href="http://t.co/JWVkNJi0Hg">http://t.co/JWVkNJi0Hg</a></p>&mdash; ITmedia Mobile (@itm_mobile) <a href="https://twitter.com/itm_mobile/status/620788820762451968">2015, 7月 14</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
ページのURLへ遷移したと思ったら突然 about:self に遷移し、WebViewが真っ白に。

```objc:WKNavigationDelegate.h
- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler;
```

# 暫定対応
ひとまず上記にて、about:self が来たら decisionHandler(WKNavigationActionPolicyCancel); として目的のページを表示することは出来た。

about:self を理解出来てないままの対処療法なのでまずいケースがあるかもしれない。
調べよう。

# 追記 (2015/07/15)
原因判明。
アプリ独自のURL補完処理が誤って作動していた。
通常の動作では about:self へのアクセスがあっても何も起こらないが、アプリが http:// を付与してアクセスを試みた事によって http://about:self へのアクセスとなり読み込み失敗になっていた。

該当処理を修正することで改善。
YBI実行環境


##前提条件

#####1.Ruby Gemsのインストール
$sudo yum install rubygems(centos)

#####ps)yumのコマンド　
：パッケージを取得してインストール/アップデートをすること
yumのoption
#####-y:問い合わせがあったときにすべて「y」と答える

#####2.CLIツールのインストール
$sudo gem install td

#####3.エンドポイントの設定（環境変数）
（デフォルトでTDはAWS上にあるので、YBIはIDCFに変更すること）

$echo 'export TD_API_SERVER=http://ybi.jp-east.idcfcloud.com' \

＞＞~bash/.bash_profile

$source ~/.bash_profile

##基本コマンド

#####1.YBIへログインする
$td account -f

#####2.クエリ実行方法
$td query -w -t hive -d my_db "select count(*) from my_tbl" 

#####-w:クエリが実行完了するまで待つ
#####-t:クエリのタイプを指定します
#####-d：db名を指定します
Storyboardを使ってNavigationController+ViewController+TableView

# Project
* Xcode 6.4
* Single View Application

# Navigation Controller
* Navigation Controllerを追加して`Is Initial View Controller`にチェックを入れる。 (Storyboard)
* Navigation ControllerにくっついてきたRoot View Controllerを削除する。 (Storyboard)
* 元々ある（プロジェクト作成時に作られた）View ControllerをNavigation Controllerのroot view controllerとして繋ぐ。 (Storyboard)

# 諸々
* [Storyboardを使ってViewController+TableView](http://qiita.com/fuzzball/items/1f31380971f33cd3d8fb)と同様に諸々の設定を行う。

# ここまで
![navi.png](https://qiita-image-store.s3.amazonaws.com/0/18828/414564ac-0d30-6e24-120b-57af883e8a9f.png)
テーブルの上部に変な余白が！

# 調査
* Navigation Barの`Translucent`のチェックを外す。 (Storyboard)
* ViewController.mのviewDidLoadに`self.edgesForExtendedLayout = UIRectEdgeNone;`を書く。 (Code)
* View ControllerのExtend Edgesの`Under Top Bars`のチェックを外す。 (Storyboard)

など、iOS7リリース当時の記事がいくつか見つかりましたが、「[やはりお前らのiOS7対応は間違っている(解説編)](http://qiita.com/yimajo/items/254c7cebab7864678246)」の[設定が反映されるviewについて](http://qiita.com/yimajo/items/254c7cebab7864678246#2-6)を参考にして、View Controllerのview.subviews[0]にダミーのViewをかましてみました。

![dummyView.png](https://qiita-image-store.s3.amazonaws.com/0/18828/bd0e4854-ec68-ccb3-90a3-028f666ad768.png)

Rect(0, 0, 0, 0)でHiddenにしてます。

# ということで
![iOS Simulator Screen Shot 2015.07.14 13.19.55.png](https://qiita-image-store.s3.amazonaws.com/0/18828/46d4b13c-4cb9-f684-696d-83d1072ffba5.png)

と、ここまで書いてダメなことに気が付いたけど、せっかくなのでこのまま投稿。
これはこれで使えることがあるかも。
ssh　ノンパスが通らない場合の確認方法

sshでノンパス設定したのに通らない場合は  
/var/log/secure
を確認する。

自分の場合は$HOMEディレクトリの権限が777になっていて通らなかった。
$HOMEの権限とか予想外・・・
$HOMEを755にすることで解決
urllibでjsonデータを取得する際の流れメモ


# 参考ページ
http://docs.python.jp/2/howto/urllib2.html

## point
> data 引数を渡さない場合、urllib2 は GET リクエストを利用します。 

ってことは引数を渡せばPOSTとなる

## サンプル
import urllib
import urllib2
import json

url = 'http://api.hoge.json'
params = {
    'status': 1
}
data = urllib.urlencode(params)
req = urllib2.Request(url, data)
response = urllib2.urlopen(req)
json_acceptable_string = response.read().replace("'", "\"")
data = json.loads(json_acceptable_string)
エラー『Dangling meta character '?'』の回避方法

Javaの`matches`関数を用いた文字列比較で
`Dangling meta character '?' near index 0`
というエラーが発生したので対策メモ．


##エラー発生状況
`matches`関数で二つのString変数の比較を行ったときに発生．
具体的には，

```
String str1 = "?ABC";
String str2 = "?A";

if(str1.matches(str2 + ".*)) {}
```

というように，文字列の先頭に`?`が含まれる変数の比較を行った．

##原因
文字列中の`?`が正規表現記号と判定されてしまうため．

##回避方法
`matches`関数の引数の文字列にエスケープ文字`\\`をつけてあげればOK．
上記の例だと，次のようにすれば回避できる．

```
String str1 = "?ABC";
String str2 = "?A";

if(str1.matches("\\" + str2 + ".*")) {}
```

もしくは，`Pattern.quote`でも回避できる．

```
if(str1.matches(Pattern.quote(str2) + ".*")) {}
```
HaskellのIntと２つのモノイド

Haskellには[Monoid](https://hackage.haskell.org/package/base/docs/Data-Monoid.html)という型クラスがあります
モノイドというのは結合則を満たす演算子と単位元が存在する集合のことで

* 自然数と足し算
* 自然数と掛け算
* 文字列の結合

などここには書き表せられないほどたくさんのものがモノイドの性質を満たします。

```hs
class Monoid a where
    mempty :: a
    mappend :: a -> a -> a
    
    mconcat :: [a] -> a
    mconcat = foldr mappend mempty
```

ところで整数の足し算と掛け算もどちらもモノイドなのですがHaskellのIntはどのようなMonoid のインスタンスになっているでしょうか？
実はIntはそもそもMonoidのインスタンスになっていません
その代わり `Data.Monoid` では `Sum`と`Product` という二つの型が `newtype` で宣言されていてそれらがMonoidのインスタンスとなっています。

```hs
newtype Sum a = Sum { getSum :: a }

instance Num a => Monoid (Sum a) where
    mempty = Sum 0
    (Sum x) `mappend` (Sum y) = Sum (x + y)


newtype Product a = Product { getProduct :: a }

instance Num a => Monoid (Product a) where
    mempty = Product 1
    (Product x) `mappend` (Product y) = Product (x * y)
```

こうすることで

```hs
>>> (Sum 5) `mappend` (Sum 5)
Sum 10
```

のように無事 Int (Num a)にもモノイドの性質を付与することが出来ました :hatching_chick: 
でもちょっと待って下さい :exclamation: 
使うたびにいちいち `Sum` や `Product` で包まなきゃいけないのでしょうか？
実際はもちろんそうなのですがそれほど面倒なわけでもありません
例えば`sum`と`product`を再実装してみましょう

```hs
sum' = Num a => [a] -> a
sum' = getSum . mconcat . fmap Sum

product' = Num a => [a] -> a
product' = getProduct . mconcat . fmap Product
```

どうでしょうか
変換が必要なのは入り口と出口だけであることがわかると思います
とっても便利ですね :cat2:
ImageViewをCheckableにカスタマイズしたくなる症候群

# なんでもCheckableにしたくなりますよね

私は、たとえばImageViewやLinearLayoutをトグルボタンにしたくなったりします。


# Checkableを実装する

ImageViewをCheckableにして、checkされた時に画像の周りにボーダーを付けるようにします。


```CheckableImageView.java
public class CheckableImageView extends ImageView implements Checkable {

    private static final int[] CHECKED_STATE_SET = {android.R.attr.state_checked};
    private boolean checked = false;

    public CheckableImageView(Context context) {
        super(context);
    }

    public CheckableImageView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public CheckableImageView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    public void setChecked(boolean checked) {
        if (this.checked != checked) {
            this.checked = checked;
            refreshDrawableState();
        }
    }

    @Override
    public boolean isChecked() {
        return checked;
    }

    @Override
    public void toggle() {
        setChecked(!checked);
    }

    @Override
    public int[] onCreateDrawableState(int extraSpace) {
        final int[] drawableState = super.onCreateDrawableState(extraSpace + 1);
        if (isChecked()) {
            mergeDrawableStates(drawableState, CHECKED_STATE_SET);
        }
        return drawableState;
    }
}
```

チェック時にボーダーを表示するスタイルを定義
state_checked="true"の時のスタイルを指定します。

```toggle_image_circle.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_checked="true">
        <shape android:shape="oval">
            <size android:width="150dp" android:height="150dp" />
            <stroke
                android:width="5dp"
                android:color="#F0F0F0" />
        </shape>
    </item>
</selector>
```

あとは、layoutで使うだけ

```activity_main.xml
# パッケージ名は環境に合わせて変える
<jp.test.views.CheckableImageView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/sample_image"
    android:background="@drawable/toggle_image_circle"
    android:src="@mipmap/sample_image" />
```




簡単ですね♪

いろんなビューで実施できるのでお勧めです。
c++ builder XE4, 10.2 Tokyo > char文字列のString型への格納

```txt:動作確認
C++ Builder XE4
```

文字コードの扱いにちょっとはまったのでメモ。

```cpp
	char dmy[] = "test";

	String str_char_arg;
	String str_String_arg;
	AnsiString astr;

	// case1
	str_char_arg = String().sprintf(L"%s", dmy); // garble

	// case2
	String strMiddle = dmy;
	str_String_arg = String().sprintf(L"%s", strMiddle); // OK

	// case3
	astr = AnsiString().sprintf("%s", dmy); // OK

	int nop=1;
```

上記において、case1では文字化けが発生し、case2, case3では問題ない。

dmyはchar[]型なので、それをString型のL"%s"に渡すと失敗するということ。

case2のように、一度String型に変換するか、case3のようにAnsiStringで受ける方法がある。


### 10.2 Tokyo
(追記 2017/12/26)

```txt:動作環境
Rad Studio 10.2 Tokyo Update 2
```

Tokyoでも同じ動作であることを確認した。
【AWS】【ELB】AWS初心者がELBのヘルスチェックではまったら

#AWSでELB下のインスタンスがヘルスチェック無効によりOut of Serviceの時まずやること

AWS初心者がVPC内にLAMP環境を作ろうとした時に凡ミス（というか不注意）でハマったこと。

VPC、LAMP環境の構築は以下のページを参考にさせて頂きました。

- [「AWS体験ハンズオン ～セキュア&スケーラブルウェブサービス構築～」に参加してきました](http://akiyoko.hatenablog.jp/entry/2015/06/04/232220)

- [Amazon Linux への LAMP ウェブサーバーのインストール(公式)](http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/install-LAMP.html)

- [取り急ぎEC2にLAMP環境を構築する(AWS公式)](http://qiita.com/katsukii/items/0b82aa1db8e61ca1bfb2)


ロードバランサーを設置する際、ヘルスチェックのコンフィギュレーションで「Ping Path」がデファルトのまま(index.html)
だったり、「/」だったりするのをスルーしていました。

超当たり前ですけどちゃんと作ってあげないといけなかったんですね。

##以下、その方法

1.ヘルスチェックのコンフィギュレーション上でPing Pathを適当に"health.html"とかに指定
![capture](https://qiita-image-store.s3.amazonaws.com/0/69560/43f6b0a4-2def-e42d-b40b-46bcf22c8899.png)

2.sshで該当するEC2インスタンスにアクセス
3. /var/www/htmlディレクトリに移動
4. touch ~ で適当にhealth.htmlを作成
5. vimで中身を適当に編集し保存（これは必要だったのかよくわらない）

といった形で、ひとまずELBのステータスはInServiceになりました。
KotlinでParameter specified as non-null is null

Kotlin素人すぎてハマったのでメモ。
Kotlinはnullに対して厳密な世界なので関数を記述するときには、きちんと継承元のjava関数のNullableを気にしなくてはならない。

# 誤った記述

例えば、FragmentのonCreateView.

```
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup, savedInstanceState: Bundle) : View {
}
```

と書くと、コンパイルは通るのだけれど、実行時にIllegalArgumentExceptionが発生する。

```
Caused by: java.lang.IllegalArgumentException: Parameter specified as non-null is null: method kotlin.jvm.internal.Intrinsics.checkParameterIsNotNull, parameter savedInstanceState
```

これはsavedInstanceStateにnullが渡ってきて、kotlinのoptional定義と矛盾してしまったため。

# 正しい記述

java側の定義をみてみる。

```java
@Nullable
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
        @Nullable Bundle savedInstanceState) {
}
```

が元の定義なので、

```kotlin
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?) : View? {
}
```

で継承しなくてはならない。
Win8.1 + Firefoxで縦横のスクロールバーが同時に表示されない時の解決方法


Win8.1 + Firefoxでの対処法です。

## 概要

極狭い範囲でこんな表示をしたい時、片方のスクロールバーしか表示されない時がある
![sample.jpg](https://qiita-image-store.s3.amazonaws.com/0/33942/7d493860-4473-b90f-1402-b34a1934c1bf.jpeg "sample.jpg")

## 解決策
width, heightにそれぞれ51px以上を指定してあげる

```html
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>sample</title>
  <style>
    .box {
      /*ここ*/
      width: 51px;
      height: 51px;
      overflow: auto;
      background-color: #ddd;
      word-break: keep-all;
    }
  </style>
</head>
<body>
  <div class="box">
    <span>contentcontentcontentcontentcontentcontentcontent</span>
    <span>コンテンツコンテンツコンテンツコンテンツコンテンツ</span>
    <span>contentcontentcontentcontentcontentcontentcontent</span>
    <span>コンテンツコンテンツコンテンツコンテンツコンテンツ</span>
    <span>contentcontentcontentcontentcontentcontentcontent</span>
    <span>コンテンツコンテンツコンテンツコンテンツコンテンツ</span>
    <span>contentcontentcontentcontentcontentcontentcontent</span>
    <span>コンテンツコンテンツコンテンツコンテンツコンテンツ</span>
  </div>
</body>
</html>

```

## 参考
境界値での挙動

```css
/* パターン1 横のバーのみ表示される */
.box {
  width: 50px;
  height: 50px;
}

/* パターン2 横のバーのみ表示される */
.box {
  width: 51px;
  height: 50px;
}

/* パターン3 縦のバーのみ表示される */
.box {
  width: 50px;
  height: 51px;
}


```


## 各最新ブラウザでの動作
一応2015/7/14時点の各最新ブラウザでの動作

| OS | ブラウザ | 動作 |
|---|---|---|
| OS X Yosemite | Chrome | 正常|
| OS X Yosemite | Firefox | 正常|
| OS X Yosemite | Safari | 正常|
| Win 8.1 | Chrome| 正常 |
| Win 8.1 | Firefox | 横バーのみ表示 |
| Win 8.1 | IE 11 | 正常 |
Wicked PDFでハマらないために知っておきたいことをQ&A形式でまとめてみた


## はじめに

実務(Rails)でPDF化をはじめて行いました。
その時に使ったgemがWicked PDFです。

色々ググってはみるものの、ハマることが多かったので自分用まとめも兼ねてシェアしたいとおもいました。

## どうやってPDF化するの？

```controller.rb
  def result
   	respond_to do |format|
    format.html do
      render layout: "hogehoge"
    end
    format.pdf do
     render pdf: 'result', encoding: 'utf-8', layout: 'pdf.html', show_as_html: params[:debug].present?
     end
   end
  end
```  

pdf: 'result'のところが.pdf.erbになる感じですね。

## 改ページしたいんだけど…

PDFだったらページをいい感じのところで区切りたいものですよね。

以下のCSSを追加しましょう

```html
<div class="page-break">content 1</div> <!-- 1ページ目 -->
<div class="page-break">content 2</div> <!-- 2ページ目 -->
<div class="page-break">content 3</div> <!-- 3ページ目 -->
```

```css
.page-break {
  page-break-after:always;
  &:last-child {
    page-break-after: avoid;
  }
}
```
とします。最後のページにはpage-breakつけなくてもいいんですが、コピペで間違えてつけちゃった時に悩んでしまいそうだったので。またpage-breakとつけておくと区切り目として分かりやすいので:last-childで別に処理を書いてます。

## CSS、JavaScript、imageが上手く表示されない！

- wicked_pdf_stylesheet_link_tag
- wicked_pdf_javascript_include_tag
- wicked_pdf_image_tag

Wicked PDF用のhelperがあるのでそれを使えば解決！

## 要素検証しながらHTMlでdebugしたい！

URLの最後に ```?debug=true``` をつけましょう！

## debug=trueの時にimage表示されないんだけど…

以下のようなhelperを書いておきましょう。

```
 def pdf_image_tag(*args)
    if params[:debug].present?
      image_tag(*args)
    else
      wicked_pdf_image_tag(*args)
    end
  end
```

あとは普段通りのimage_tagのように使うだけ！

## PDFのデフォルトサイズっていくつ？
A4 = 210mm x 297mm
デフォルトだと1pageあたり使える高さが185mm

## background-imageでPDFが表示されないんだけど？

```no_bacground: false``` オプションを追加！

```
render pdf: "result", no_background: false
```

これに加えて、絶対パスで指定してあげる必要があるので

```
background-image: asset-data-url('test.png')
```

みたいにしてあげれば表示される。

## PDFのサイズ変えたいんだけど？

- page_width
- page_height

を指定すればいける。 **単位**をつけないとうまくいかないので注意。

## フッターにページ数を表示したいんだけど？
- '[page]'とすればいける。

## デフォルトのマージンっていくつ？変更できるの？
10mm。

```
margin: {
	top: 5 # 単位はmm
	bottom: 5
}
```

みたいに指定すればいける。

## dpi変更したいんだけど？
オプションで変更可能。スクリーンなら'72'がいい。

## PDFのデフォルトの向きを横に変えたい！

```
orientation: 'Landscape'
```
と、orientationを指定する。

## fontSizeオプション指定したらおかしくなった(´；ω；｀)
デフォルトがpxじゃない模様。いつもの感覚で12pxみたいに12って指定すると失敗する。

## position: absolute; bottom: 0でフッター作ったのに下いってくれない！おこ！

fotterオプションがあるので、それで指定してあげる必要があります。

htmlでfooter書きたかったら

```
footer: {
  html: {
    template: "footer.pdf.erb" # views以下のパスを指定する点に注意
  }
}
```

とすればOKです。

## layoutファイルどうするん？
僕はPDF用にpdf.html.erbみたいなのを作りました。

## ローカルだと見れるのにstaging, productionだと文字が見れない！(怒)
フォントが入ってない可能性あり。

[このあたり](http://d.hatena.ne.jp/addition/20130410/1365530641)や[このQiita](http://qiita.com/metheglin/items/bb88aa25eae250bfa2a2)を見ると、

ipaexgが必要だと判断。

ルートに.fontsディレクトリ作ってその中に、ipaexg.ttfファイルを追加。

## productionで全角記号バグったんだけど(T_T)
gemをwkhtmltopdf-binary-11にすればOK。
wkhtmltopdf-binaryでは全角記号は使えなかった。

## debug=trueだと見えるのにPDFだと崩れる。。
結構width指定とかちゃんとしてガチガチにコーディングしないとバグる印象です。

## 他にもこれしたいんだけど、、オプションないの？

公式の[Advanced Usage with all available options](https://github.com/mileszs/wicked_pdf#advanced-usage-with-all-available-options)にたくさん載っています。
基本的にここに載っていなかったらググるとstackoverflowが出てきてそれを読んで解決というプロセスでした！

## 終わりに
案外躓くどころが多いWicked PDFですが、慣れれば普段のコーディングみたいにスムーズに出来ると思います。よかったら参考にしてみてください！
Microsoft Dynamics AX のリサーチ

# これは何？
* Microsoft Dynamics AX に関する調べたデータをまとめたものです。

# 概要情報

> Microsoft Dynamics AX（旧称Axapta）はマイクロソフト社製のERPソフトウェアパッケージの一つである。 Microsoft Dynamicsシリーズの一製品であるDynamicsAXは、会計管理、サプライチェーン管理（販売・購買・在庫）、生産管理/プロジェクト管理、人事管理、BI等のコア機能をはじめ、小売業、プロセス製造業といった業種別ソリューション、さらに業種に特化したパートナーソリューションを含めると幅広い機能構成になる。また最新のマイクロソフト技術を導入し、他のマイクロソフト製品と連携が可能である。現在では130以上の国や地域で12,000社を超える導入実績がある。

https://ja.wikipedia.org/wiki/Microsoft_Dynamics_AX

* 公式サイト - https://www.microsoft.com/ja-jp/dynamics/erp-ax-overview.aspx

# アドオン

## 開発言語

X++（Java、C#に似た文法）

* [C#とX++の比較](https://msdn.microsoft.com/en-us/library/cc967415.aspx)
* [X++ Language Programming Guide [AX 2012]](https://msdn.microsoft.com/en-us/library/aa867122.aspx)

## アーキテクチャ

* https://msdn.microsoft.com/en-us/library/aa496912(v=ax.10).aspx


# 参考サイト（日本語）

* http://techinfoofmicrosofttech.osscons.jp/index.php?Dynamics%20AX%E9%96%8B%E7%99%BA%20(AOT)
* http://ax.next-ware.co.jp/
withステートメントの問題点

##コードヒントもシンタックスカラーもコンパイルエラーも出ない
以下の例で、Graphicsのメンバ関数であるbeginFill()とかのコードヒントも出ないし、シンタックスカラーも適応されません。
そして、定義されていない適当な関数を書いてもなんとエラーが出ないし、実行するまでわからないのです。

``` as3
const rect:Shape = new Shape();
with (rect.graphics)
{
	beginFill(0xffffff);
	drawRect(0, 0, 100, 1);
	endFill();
	test(); // 定義されていない関数を書いてもコンパイルエラー出ない
}
```
##プロパティの追加ができない
オブジェクトのプロパティ追加ができるのかと思えばできないです。

``` as3
var obj:Object = {};
// obj.temp = 0; ←スコープ外で宣言してやらないとwith内ではつかえない
with (obj)
{
	temp =  10;
}
trace(obj.temp);
```

```:実行結果
undefined
```

コメントアウトを外せば、ちゃんと反映されます。

```:実行結果
10
```

スコープのレベルが関数内で変わるような処理はあまりすべきでないってことのような気がします。
Reduxでアクションをデバッグする


![Developer_Tools_-_http___192_168_0_77_signup.png](https://qiita-image-store.s3.amazonaws.com/0/7565/3681c788-6ec9-1b37-71a5-77742d04a9a6.png)

追記: 最近は、[redux-logger](https://github.com/fcomb/redux-logger) という便利なnpmモジュールがあるので、そちらを使ったほうが楽で綺麗な出力が得られます!

Redux 1.0.0-alphaからミドルウェア機構が追加されたので、アクションをデバッグするミドルウェアを追加してみる。これがあるといちいちアプリ側のコードでconsole.logしなくてもよくなるので便利。


## ミドルウェアのコード

```javascript
const debug = function actionDebugMiddleware() {
  return next => action => {
    console.info(action.type, action);
    next(action);
  };
};
```

## app.js

```javascript
import React from "react";
import BrowserHistory from "react-router/lib/BrowserHistory";

import {Router} from "react-router";
import {createStore, combineReducers, applyMiddleware} from "redux";
import {Provider} from "react-redux";

import routes from "routes";
import * as reducers from "reducers";

import thunk from "redux-thunk";

const reducer = combineReducers(reducers);

// ミドルウェアの宣言
const debug = function actionDebugMiddleware() {
  return next => action => {
    console.info(action.type, action);
    next(action);
  };
};

// applyMiddlewareに指定
const finalCreateStore = applyMiddleware(thunk, debug)(createStore);
const store = finalCreateStore(reducer);
const history = new BrowserHistory();

React.render(
  <Provider store={store}>
    {() => <Router history={history} children={routes}/> }
  </Provider>,
  document.getElementById("app")
);
```
NginxによるRTMPサーバ構築メモ

[Nginx](http://nginx.org/)で[RTMP](https://ja.wikipedia.org/wiki/Real_Time_Messaging_Protocol)サーバを構築してみたので備忘的な意味でメモしておきます。 *(2015/7/14)*

# 環境
* OS: CentOS 6.4
* Nginx: v1.8.0

# 事前準備
必要なものがちらほらあるので入ってなければインストールしておきます。

## GCCのインストール
Cなどのコンパイラ

```bash
$ yum install gcc
```

## PCREのインストール
Perl5互換の正規表現ライブラリ

```bash
$ yum install pcre-devel
```

## zlibのインストール
gzipの圧縮/解凍ライブラリ

```bash
$ yum install zlib zlib-devel
```

## OpenSSLのインストール
SSLライブラリ

```bash
$ yum install openssl openssl-devel
```
既にOpenSSLが入っていて、バージョンが古い場合はUPDATEが必要です。
(v1.0.1以上必須っぽい)

# Nginxのインストール(RTMPモジュール組み込み)
準備が整ったらNginxをインストールします。
今回はRTMPモジュールを組み込んでビルドする必要があるので`yum`は使えません。
以下、手順。

## Nginx用のユーザ作成
インストール前にNginx用のユーザを手動で作成しておきます。

```bash
$ useradd --shell /sbin/nologin nginx
```

## NginxとRTMPモジュールをダウンロード
[公式のダウンロードページ](http://nginx.org/en/download.html)からNginxの最新の安定版を任意の場所に`wget`して解凍します。

```bash
$ wget http://nginx.org/download/nginx-1.8.0.tar.gz
$ tar -zxvf nginx-1.8.0.tar.gz
```

続いて[RTMPモジュール](https://github.com/arut/nginx-rtmp-module)のソースも任意の場所に`wget`して解凍します。

```bash
$ wget https://github.com/arut/nginx-rtmp-module/archive/master.zip
$ unzip master
```

## Nginxをmakeインストール
configureを定義します。
`--add-module`パラメータにはRTMPモジュールのパスを指定します。

```bash
$ cd nginx-1.8.0
$ ./configure --user=www-data --group=www-data --with-http_ssl_module --with-http_realip_module --add-module=../nginx-rtmp-module-master
```
とりあえず最低限の設定＋RTMPモジュールを組み込んでいます。
他にも入り用なら追記して下さい。

makeインストールします。

```bash
$ make
$ sudo make install
```

このままだとプロセスが起動しないので設定ファイルを変更します。
1行目あたりにあるuserディレクティブのコメントを外して手動で設定します。

```Nginx:/usr/local/nginx/conf/nginx.conf
user  nginx nginx;
```

試しに起動してみる。

```bash
$ sudo /usr/local/nginx/sbin/nginx
```
`http://{サーバのアドレス}`にアクセスできればOK。

## RTMPサーバとして起動する
本題のRTMPサーバです。
まず設定ファイルにRTMPサーバの設定を追記します。

```Nginx:/usr/local/nginx/conf/nginx.conf
rtmp {
    server {
        listen 1935;

        application live {
            live on;
            record off;
        }
    }
}
```

Nginxを再起動。

```bash
$ /usr/local/nginx/sbin/nginx -s stop
$ /usr/local/nginx/sbin/nginx
```

これでRTMPサーバとして起動しています。

## Live配信してみる
やり方は何でもいいんですが、ここではローカルマシン（MacBook）から[ffmpeg](https://www.ffmpeg.org/)を使って搭載カメラで撮影した動画をRTMPサーバ経由で配信して、[VLC](https://www.videolan.org/vlc/index.ja.html)で動作確認してみました。
※ffmpegのインストールやコマンドの説明は長くなるので割愛しますm(_ _)m

まず配信側はこんな感じで。

```bash:local
$ ffmpeg -f avfoundation -pixel_format uyvy422 -i "0:0" -crf 23.0 -c:v libx264 -c:a aac -strict experimental -s 640x360 -b:v 128k -f flv rtmp://{RTMPサーバのアドレス}/live/1
```

次に受信側。
1. VLCを起動
2. 「ファイル」 > 「ネットワークを開く」
3. 「URL」欄に`rtmp://{RTMPサーバのアドレス}/live/1`を入力して「開く」

これで無事Live配信できました。

# 所感
遅延が10secほどあったのがちょっと気になりました。
（マシンスペックやネットワーク環境にも影響するところなのでまだ詳しく見れていないです汗）

とはいえ、割と簡単にLive配信できたし、設定も簡単で全体的に良い感じでした。
NginxではRTMPだけじゃなくて、HLSに変換しながら配信したりもできるみたいなので今度やってみたいと思います。

# 参考
* [http://qiita.com/nenokido2000/items/3cbb76dac2b9940f339e](http://qiita.com/nenokido2000/items/3cbb76dac2b9940f339e)（Nginxのインストール部分はほぼこちらを参考にさせて頂きました。感謝。）
* https://obsproject.com/forum/resources/how-to-set-up-your-own-private-rtmp-server-using-nginx.50/
Raspberry Pi2でdockerを使う(Snappy Ubuntu Core)

* RaspberryPi2 + SD4GB


## 感想

* RaspberryPIホスト自体はネットワーク設定程度しか変更しない、という発想が大変気に入った。

## 参考

* [Snappy Ubuntu Coreで遊んでみる 2015-06-20](http://www.slideshare.net/nobuto_m/playing-with-snappy-ubuntu-core-2015-0620-49628718) 14p以降
* [Get started | Ubuntu developer portal](https://developer.ubuntu.com/en/snappy/start/#snappy-raspi2)

## ダウンロード

* [Index of /~platform/snappy/raspberrypi2](http://people.canonical.com/~platform/snappy/raspberrypi2/)
  * ubuntu-15.04-snappy-armhf-rpi2.img.xz (145MB)
  * 4GB以上のSDカードが必要。

## ログイン

* ubuntu / ubuntu

```bash:ipアドレス確認
ip a
```

```bash:
ssh ubuntu@snappy_ip
```

## 状況

```bash:SDカードの空き
$ df -h | grep G
/dev/mmcblk0p4               1.6G   29M  1.4G   2% /oem
```

```bash:メモリの空き
(RaspberryPi2)ubuntu@localhost:~$ free -m
             total       used       free     shared    buffers     cached
Mem:           924        143        780         12          7        100
-/+ buffers/cache:         36        888
Swap:            0          0          0
```

```bash:
$ uname -r
3.19.1-11-generic-bcm2709
```

```bash:
(RaspberryPi2)ubuntu@localhost:~$ lsmod
Module                  Size  Used by
xt_addrtype            16384  2 
xt_conntrack           16384  1 
ipt_MASQUERADE         16384  1 
nf_nat_masquerade_ipv4    16384  1 ipt_MASQUERADE
iptable_nat            16384  1 
nf_conntrack_ipv4      20480  2 
nf_defrag_ipv4         16384  1 nf_conntrack_ipv4
nf_nat_ipv4            16384  1 iptable_nat
iptable_filter         16384  1 
ip_tables              24576  2 iptable_filter,iptable_nat
x_tables               20480  5 ip_tables,ipt_MASQUERADE,xt_conntrack,iptable_filter,xt_addrtype
nf_nat                 20480  2 nf_nat_ipv4,nf_nat_masquerade_ipv4
nf_conntrack           81920  5 nf_nat,nf_nat_ipv4,xt_conntrack,nf_nat_masquerade_ipv4,nf_conntrack_ipv4
bridge                 98304  0 
aufs                  204800  0 
joydev                 20480  0 
evdev                  20480  0 
uio_pdrv_genirq        16384  0 
uio                    20480  1 uio_pdrv_genirq
```

exFATには対応していないが、cifs, xfs, hfs, nfsなどに対応している。

* cat /proc/filesystems
* ls /lib/modules/3.19.1-11-generic-bcm2709/kernel/fs/

# dockerのインストール手順

## WebUIからインストール

WebDMからSnappy Storeにアクセス

* http://snappy_ip:4200/

![1.png](https://qiita-image-store.s3.amazonaws.com/0/25728/0749276b-9808-9863-ad79-01a2f6862d32.png)

![2.png](https://qiita-image-store.s3.amazonaws.com/0/25728/58fb24ca-8327-4193-3dce-cda8bfccb897.png)

## CLIから

```bash:
sudo snappy install docker
```

```bash:
$ docker -v
Docker version 1.6.1, build 7f761fb
```

```bash:
docker run -it tukiyo3/rpi-ja /bin/bash
```

## docker build

```bash:Dockerfile
FROM tukiyo3/rpi-ja

RUN apt-get update &&\
    apt-get install -y nginx &&\
    rm -rf /var/lib/apt/lists/*

EXPOSE  80
ENTRYPOINT /usr/sbin/nginx && tail -f /dev/null
```

```bash:build
cat Dockerfile | docker build -
```

# IPの固定

* /etc/network/interfaces.d/eth0

を編集すればよさそう

# その他

* systemctl, journalctlなどが使われている。
generatorでhubotを対話式にする



Node.jsの0.12でES6のgeneratorが使えるようになっているので勉強。
正しい使い方かわからないが、hubotで使うと対話モード風になる。

コード
-


```coffeescript:calendar.coffee
module.exports = (robot) ->
        cal = ->
                title = yield 'Creating a schedule. \nWhat?'
                attendees = yield 'With whom?'
                date = yield 'When?'
                while date == 'sat' or date == 'sun'
                        date = yield 'No meeting on weekend. When?'
                place = yield 'Where?'

                delete robot.cal
                'Set ' + title + ' with ' + attendees+ ' on ' + date + ' at ' + place  + '. Enjoy!'

        next_value = (input) ->
                robot.cal.next(input).value

        # respond block
        robot.respond /cal$/i, (msg) ->
                robot.ignore_input = true
                robot.cal = cal()
                msg.send(next_value())

        # hear block
        robot.hear /(.*)\s*$/i, (msg) ->
                if !('cal' of robot and robot.cal)
                        return
                if 'ignore_input' of robot and robot.ignore_input
                        delete robot.ignore_input
                        return
                msg.send(next_value msg.match[1])
```
- generatorは`robot.cal`として登録されている。
- `yield`でgeneratorから呼び出し元に処理が移る。
- generatorが存在する間は`hear`のたびにgeneratorの`next`が呼び出される。




結果
-

![スクリーンショット 2015-07-13 14.54.28.png](https://qiita-image-store.s3.amazonaws.com/0/281/06a7ac91-b125-2ab4-a67b-dd2677b62cb4.png "スクリーンショット 2015-07-13 14.54.28.png")

コンパイル
-
hubotの挙動確認としては不要だが、初めはコンパイルしながら確認したほうがよいかもしれない。
http://coffeescript.org/ のTRY COFFEESCRIPTでもできるし`/path/to/coffee -c scripts/calendar.coffee`でも可能。
`yield`を入れておくと自動でgenerator(`function*`)が生成されるのがミソ。


感想とか
-
- ステートマシンっぽくステートとそのネットワークをうまく管理するのがよいのだろうが、ステートにいちいち名前つけてフロー修正を試行錯誤するのは面倒
- `yield`と`next`なら、ただの入力待ちのような感じで使えて手軽
- generatorの保存は`robot.brain`でもがんばればできそうだったが、プロセス再起動で確実に挙動を切り替えてほしいのでとりあえず`robot`のメンバーとしてみた（永続化するほどのデータは扱わない前提）
- コードの臭い
	- `respond`と`hear`が複数マッチする場合、コードに書いた順に呼ばれる。書く順を変えると破綻する
	- `respond`の直後に`hear`も呼ばれるがそのままreturnしてほしい、みたいな余計な意図のコードが入る
	- 手戻りややり直しが数回程度の簡単な状態遷移であれば見通しよくコンパクトに収まるが、気がついたらモンスター化してそう
- ステートパターン上手く使えないかな？




環境構築
-
本題ではない。使ったのは以下のバージョン。

- node@0.12.7
- coffee-script@1.9.3
- hubot@2.11.4
- hubot-slack@3.3.0
 
実際にgeneratorを利用できるようにするところで四苦八苦。
バッドノウハウっぽいが動いているので、ちゃんとした手順にするのはいったん後回しにする。

1. 使っているcoffeeの実行ファイルを探す。
1. coffeeのshebangでのnode呼び出し時に`--harmony`オプションを渡したいのだが、shebangではファイル名以外の引数が渡せなかったので間接ファイルを作って呼び出す。

```console:
$ vi /path/to/node-harmony
#!/bin/bash
/path/to/node --harmony "$@"


$ vi /path/to/coffee
#!/usr/bin/env /path/to/node-harmony
```
（もちろんパス通してもよいと思う）

参考にした情報
-
- [CoffeeScriptが1.9でgenerator構文をサポート](http://qiita.com/mizchi/items/39906871bc0a532b6e71)
- [Node.jsのv0.12の時に harmony はdefaultにならないという結論になりました。](http://yosuke-furukawa.hatenablog.com/entry/2014/01/31/153207)
- [Run a node shell script in --harmony mode](http://stackoverflow.com/questions/20980222/run-a-node-shell-script-in-harmony-mode)
Macで急にFaceTimeカメラが認識されなくなった時の対処法

Macで、例えばChromeやFirefoxでgetUserMediaを使ったり、FaceTimeやPhoto Boothを使おうとした時に、FaceTime内蔵のMacなのに何故かカメラが認識されない、ということが発生したりします。私も特にスリープから復帰すると急に使えない、という目によく遭います...

ググってみると、SMCリセットやら何やら色々と出てきますが、もっと手っ取り早い解決法が見つかったので示しますと、ターミナルで、

```bash
sudo killall VDCAssistant
```

を実行すれば、あっさり解決しました。**SkypeかChromeかFirefoxか何かがカメラをロックしたままになってしまう場合がある**ようで、その場合はこの方法で解決できるということのようです。

(追記) アクティビティモニタからVDCAssistantを探して強制終了させても同様の対処ができるようです。

参考: Appleサポートコミュニティ https://discussions.apple.com/thread/4158054
datetimeモジュール使い方

毎回うっすら忘れてシンタックスエラーなのでメモ
# 参照
http://docs.python.jp/2/library/datetime.html

# UTCで現在時刻を取得
> now = datetime.datetime.utcnow()

# 指定の日時を指定
> the_day = datetime.datetime(2015, 6, 2, 21, 0, 0, 0)

# 計算
> start = now - datetime.timedelta(days=96)
> 使えるパラメーターは([days,seconds,microseconds,milliseconds,minutes,hours, weeks])
GIMPで選択範囲に線を描画、保存するキー

赤色で線を引きたいだけなのに苦労した。
pinta使えば良いと思う

## 参考

* [【無料の画像処理ソフト「GIMP」を使って選択範囲に枠線をつける方法】 | 今村だけがよくわかるブログ](http://www.imamura.biz/blog/web/gimp/13658)

## 線を描画

* マウスで線を引きたい場所を選択し、
* Alt-e -> s -> Enter

##  pngで保存

* Ctrl-Shift-e -> Enter
体系的　webアプリケーション　の続き

#続きです

ブラウザはどのように受動攻撃を防ぐか

➡サンドボックス・・・プログラムでできることが限りがある。
　　　　　　　　　　　悪意のあるプログラムを作ろとしても、利用者に被害が及ばないように配慮

サンドボックスでできないこと　①ローカルファイルへのアクセス禁止
　　　　　　　　　　　　　　　②プリンタなどの資源の利用禁止
　　　　　　　　　　　　　　　③ネットワークアクセスの制限
#　脆弱性はどこで発生するのか？

①脆弱性には処理に起因するものと出力に起因するものがある
②入力に起因する脆弱性はない
③出力起因する脆弱性にはインジェクションという単語がつくものが多い

#入力処理とセキュリティ

入力処理では入力値に対して

①文字エンコーディングの妥当性検証
➡PHPでは　mb check encoding関数が使える
②文字エンコーディングの変換
➡PHPでは　mb convert encoding関数
③パラメータ文字列の妥当性検証

まとめ　これらはセキュリティの根本的な対策にはならない。
　　　　ただ、プラットフォームやアプリケーションに洗剤ていな脆弱性がある場合はセーフティーネットになりうる。

#表示処理に伴う問題

表示処理が原因になるもの
①クロスサイト・スクリプティグ（XSS)
②エラーメッセージからのリーク

◎XSSの脆弱性の影響

①サイト利用者のブラウザで、攻撃者の用意したスクリプトの実行によりクッキー値を盗まれ、利用者が成りすましの被害にあう。
②同じくブラウザでスクリプトを実行させられ、サイト利用者の権限でwebアプリの機能を悪用される
③webサイトに偽りの入力フォームが表示され、フィッシングにより、利用者が個人情報が盗まれる。

発生個所・・・・wabアプリケーションでHTML,JAVA Scriptを生成している場所
影響を受けるページ・・・アプリ全体
影響の種類・・・・サイトの利用者のブラウザ上でのJava Scriptの実行、偽情報の表示
影響の度合い・・・中から大
利用者関与の度合い・・・必要➡罠サイトの閲覧、メール記載のURL
対策・・・・・属性値は”で囲む、HTMLで特別な意味を持つ記号文字をエスケープ

#SQL呼び出しに伴う脆弱性

SQLインジェクション

①発生箇所・・・SQLを呼び出しているところ
➡エラーメッセージ経由、union select等
②影響を受けるページ・・・すべてのページ
③影響の度合い・・・・大
④利用者関与の必要性・・・ない
⑤対策・・・・静的プレースホルダーを利用

脆弱性が生まれる原因

文字列リテラルの問題

対策・・・・プレースホルダ（特に静的）を使ってSQLを組み立てる。＊プレースホルダとは、実際の内容を後から挿入するために、とりあえず仮に確保した場所のこと。
　　　　　　アプリケーション側でSQLを組み立てる際に、リテラルを正しく構成して変更されないようにする。
.NET teratail API Client Library


# .NET teratail API Client Library
teratail APIの.NET用クライアントライブラリを作ってみた。
[teratailApiClient](https://github.com/cssho/teratailApiClient)
## teratail
[teratail](https://teratail.com/)
> teratailは、日本のエンジニアが集うQ&Aコミュニティサイトです。

## teratail API
[teratail API](https://teratail.com/api)
> teratail APIは、teratailで使われている質問や回答、ユーザー、タグなどの情報を利用するためのWeb APIです。

APIドキュメント : [teratail API v1.0](http://docs.teratailv1.apiary.io/#introduction/undefined)


## Client Library
[teratailApiClient](https://github.com/cssho/teratailApiClient)
APIのクライアントライブラリを作るのは初めてなのでおかしな作りになっているところが多数あるかも。
ご指摘お願いします。

### ハマりどころ
退会済み、ゲストユーザはjsonにuserプロパティが現れないのでライブラリ側ではnullとする。

### 今後
ちょいワケありでWebClientでAPIにアクセスしてるけどHttpClientに置き換えたい。
そして、async/awaitで非同期にしたい。
例外はどう扱えばいいんだろ

### サンプル
未回答の質問をリストアップ（タイトルと質問者）

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

namespace SearchTeratail
{
    class Program
    {
        static void Main(string[] args)
        {
            var tera = new TeratailApi();
            var q = tera.GetQuestionList(10000);
            while (q.Meta.HasNext())
            {
                q = tera.GetQuestionList(10000, q.Meta.Page + 1);
                q.Questions.Where(x => x.CountReply == 0).ToList().ForEach(x =>
                {
                    Console.WriteLine(x.Title);
                    Console.WriteLine(x.User != null ? x.User.DisplayName : "");
                });
            }
        }
    }
}
```
iCalのデータからイベント一覧を取り出す

OS X の iCal でイベントを細かく管理していると、過去にどんなことが有ったのかの記録に使えるぞ、と思いました。

## やりたかったこと
iCalでカレンダーの書き出しをすると、vCalendar 形式のファイル（拡張子は .ics）で出力されます。
こんな感じ
> BEGIN:VEVENT
UID:11A04694-11B0-4053-984C-700328F928BF
DTSTAMP:20150808T044239Z
LOCATION:
TRANSP:OPAQUE
SUMMARY:重要な会議だよ
SEQUENCE:0
DTEND;TZID=Asia/Tokyo:20150802T103000
DTSTART;TZID=Asia/Tokyo:20150802T093000
END:VEVENT


このままでは検索性や一覧性に欠けるので、次のような日時とイベントタイトルが一行になったテキストデータに変換しようと考えました。
> 2015/08/02-09:30　重要な会議だよ

## プログラム
OS Xには Perl が標準で入っているので、Perl で書いたプログラムです。

```Perl:iCalSel.pl
#!/usr/bin/perl
#### use encoding 'utf8', STDOUT=>'shiftjis';
while(<>) {
	 ($EventName, $EvantData, $EventTime) = "" if(/BEGIN:VEVENT/) ;
	 chop;
	 chop;
	$EventName =  $1 if(/SUMMARY:(.+)/);
	$EventDate  = substr($1, 0, 4) . '/' . substr($1, 4, 2) . '/' . substr($1, 6, 2)  if(/DTSTART;.+:([0-9]+)/);
	$EventTime  = substr($1,1, 2) . ':' . substr($1, 3, 2)  if(/DTSTART;.+:[0-9]+(T[0-9]+)/);
	if (/END:VEVENT/) {
		$wk = substr($EventDate,0,10) . "-$EventTime 　" . $EventName . "\n";
		printf($wk) if (/END:VEVENT/);
	}
}

```
二行目はコメントアウトしていますが、出力したい文字コードを変更したい場合に書き換えて利用してください。　`use encoding 'utf8', STDOUT=>'shiftjis';`

## 利用方法
このプログラムを保存して実行権限を与えたら、ターミナルで以下のようにコマンドを実行します。

`$ cat （iCalで書きだしたファイルパス） | iCalSel.pl | sort > （結果を書き出すファイルパス） `
（例）　`$ Cat 2015Calendar.ics | iCalSel.pl | sort > 2015Cal.txt`

cat を使うと、複数のカレンダーを一括で処理できます。
 `$ cat Calendars/* | iCalSel.pl | sort >iCalAllData.txt `

お役に立てば幸いです。
MongoDB 最低限知っておくべきコマンド



# データベース選択
> use database

# データベース一覧表示
> show dbs

# コレクション一覧表示
> show collections

# データベース削除
> use database
> db.dropDatabase()

# データベースコピー
> db.copyDatabase('fromDatabase', 'toDatabase')

# コレクション作成
> db.createCollection('collection')

# コレクション削除
> db.collection.drop()

# コレクション名変更
> db.oldCollection.renameCollection('newCollection')

# コレクション複製
> db.oldCollection.find().forEach(function (x) {db.newCollection.save(x)})

# インデックス作成
> OLD!!
> db.collection.ensureIndex({name: 1})
> New!!
> db.collection.createIndex({name: 1})

# インデックス削除
> すべてのインデックス削除
> db.collection.dropIndexes()

# 個別にインデックス削除
> db.collection.dropIndex({name: 1})

# 全件表示
> db.collection.find().forEach(printjson)

# indexとかもろもろ確認
> db.collection.stats()
ハッカソンの成果物/PJのまとめサイト

[株式会社ギブリー](https://givery.co.jp/services/jphacks/)でハッカソンを研究しています五十嵐です。

ハッカソンが持つ最も大きな問題の一つが作品の継続開発です。
以下のサイトはその継続開発を助けてくれそうなサイトです。

## 海外のハッカソンの成果物/PJのまとめサイト

以下の3つが有名なサイトです。

1. [Challengepost](http://challengepost.com/software)
2. [Hacker League](https://www.hackerleague.org/hacks)   [※intelが買収](http://japan.cnet.com/news/business/35040876/)
3. [Hackathon IO](http://www.hackathon.io/projects)

例えば、[2015/7にギブリーがCo-hostさせて頂いたAngelHack Tokyo 2015](http://angelhacktokyo.strikingly.com/)の作品は[Hackathon IOにまとめられています。](http://www.hackathon.io/angelhack-tokyo/projects)

ざっと比較した感じ、利用者視点ではChallengepostが一番良さそうです。
A. youtube埋め込みが簡単
B. try it outでgithub repへのリンクが定番
C. 一覧されている作品の完成度が他の２つと比べて高い = Hacker LeagueとHackathon IOは未完成作品（今からPJを始めるからメンバー募集）が多い
D. 技術系のタグをつけられる

ただ、まだ全てが一長一短でバグも多く見られますので、今後の発展が楽しみです。

## 国内のハッカソンの成果物/PJのまとめサイト

日本ではリクルートが作ったHacklogが今後伸びてきそうです。
4. [Hacklog](http://hacklog.jp/)

また、Knowledge Connectorは経済産業省の予算で作られたもので、オープンデータとCivic Techに強いのが特徴です。
5. [Knowledge Connector](http://idea.linkdata.org/ideas?sort=popularity&tag=CATEGORY_0004)

その他にも良い情報があれば、教えてください。
PsychoPyでBufferImageStimを動かす how to move BufferImageStim object in PsychoPy

たくさんの刺激を書かないといけない場合は描画に時間がかかります。
サイコパイは裏でGLが働いているので、displaylistを使うと大分描画時間を短縮できいます。
[BufferImageStim](http://www.psychopy.org/api/visual/bufferimagestim.html)がdisplaylistのラッパになっているので、これを使えばいいんですが、
描画前にposとか変えても反映されないので、動かすことができません。

以下の様なworkaroundでGL関数直接呼び出すと使えます。


[BufferImageStim](http://www.psychopy.org/api/visual/bufferimagestim.html) is useful for fast rendering, but at the moment `pos` has no effect, so you cannot move the stimulus.

Here is workaround.

```py
from psychopy import visual, core, event, monitors
import numpy as np

# need these lines to use GL functions
import pyglet
pyglet.options['debug_gl'] = False
GL = pyglet.gl

#create a window
mywin = visual.Window([800,600],monitor="testMonitor", units="pix")

N = 800
xs = np.random.rand(N)*800-400
ys = np.random.rand(N)*600-300
rs = np.random.rand(N)*10

slist = [visual.Circle(win=mywin, radius=r, pos=(x,y)) for x,y,r in zip(xs,ys,rs)]
stim = visual.BufferImageStim(mywin, stim=slist)

t0 = core.getTime()
while True: #this creates a never-ending loop
    nw = core.getTime()
    
    cx = np.sin(-nw*np.pi)

    # stim.draw() # position doesn't change
    
    stim._selectWindow(stim.win)

    GL.glPushMatrix()
    GL.glTranslated(cx, 0, 0) # NOTE: gl coordinate. by default, [-1 to 1, -1 to -1] (probably)

    GL.glScalef(stim.thisScale[0] * (1,-1)[stim.flipHoriz],
                stim.thisScale[1] * (1,-1)[stim.flipVert], 1.0)
    GL.glColor4f(stim.desiredRGB[0], stim.desiredRGB[1], stim.desiredRGB[2], stim.opacity)
    GL.glCallList(stim._listID)
    GL.glPopMatrix()

    mywin.flip()

    if len(event.getKeys())>0: break
    event.clearEvents()

#cleanup
mywin.close()
core.quit()
```

BufferImageStim使わない版の比べてみましょう

Here is non-BufferImageStim version. Pretty slow.

```py
from psychopy import visual, core, event, monitors
import numpy as np

#create a window
mywin = visual.Window([800,600],monitor="testMonitor", units="pix")

N = 800
xs = np.random.rand(N)*800-400
ys = np.random.rand(N)*600-300
rs = np.random.rand(N)*10

slist = [visual.Circle(win=mywin, radius=r) for x,y,r in zip(xs,ys,rs)]

t0 = core.getTime()
while True: #this creates a never-ending loop
    nw = core.getTime()
    
    cx = np.sin(-nw*np.pi)*400

    for i in range(0, N):
        slist[i].pos = (xs[i]+cx, ys[i])
        slist[i].draw()
        
    mywin.flip()

    if len(event.getKeys())>0: break
    event.clearEvents()

#cleanup
mywin.close()
core.quit()
```

Enjoy!!
CoreOSにdocker-composeとBash-Completion

CoreOSにDocker Composeがなかったので導入した作業ログ

# 環境
```bash
$ cat /etc/os-release 
NAME=CoreOS
ID=coreos
VERSION=738.1.0
VERSION_ID=738.1.0
BUILD_ID=
PRETTY_NAME="CoreOS 738.1.0"
ANSI_COLOR="1;32"
HOME_URL="https://coreos.com/"
BUG_REPORT_URL="https://github.com/coreos/bugs/issues"

$ echo $SHELL
/bin/bash

$ docker version
Client version: 1.6.2
Client API version: 1.18
Go version (client): go1.4.2
Git commit (client): 7c8fca2-dirty
OS/Arch (client): linux/amd64
Server version: 1.6.2
Server API version: 1.18
Go version (server): go1.4.2
Git commit (server): 7c8fca2-dirty
OS/Arch (server): linux/amd64
```

# docker-composeを導入
```bash
$ sudo -i
# mkdir -p /opt/bin
# curl -L https://github.com/docker/compose/releases/download/1.4.2/docker-compose-`uname -s`-`uname -m` > /opt/bin/docker-compose
# chmod +x /opt/bin/docker-compose
# docker-compose -v
docker-compose version: 1.4.2
```

# Bash-Completion
```bash
https://www.binarysludge.com/2014/10/21/install-bash-completion-on-coreos/
$ toolbox dnf -y install bash-completion wget \
  && toolbox wget https://raw.githubusercontent.com/docker/docker/master/contrib/completion/bash/docker -O /usr/share/bash-completion/completions/docker \
  && toolbox cp /usr/share/bash-completion /media/root/var/ -R  \
  && source /var/bash-completion/bash_completion
$ cp $(readlink .bashrc) .bashrc.new && mv .bashrc.new .bashrc
$ echo "source /var/bash-completion/bash_completion" >> ~/.bashrc
```

# docker-compose用補完ファイル
```bash
$ sudo -i
# curl -L https://raw.githubusercontent.com/docker/compose/1.4.2/contrib/completion/bash/docker-compose > /var/bash-completion/completions/docker-compose 
```
CoreOSにはパッケージマネージャがない代わりのような立ち位置に[toolbox](https://github.com/coreos/toolbox)が付属してます。

# タブしてみる
```
$ docker-compose 
build              kill               migrate-to-labels  ps                 restart            run                start              up                 
help               logs               port               pull               rm                 scale              stop               version
```
おー。補完されました。
plotly でいい感じのグラフをオンラインに公開する  

Jupyter でずらずらページをつくるのがイイとは思うけどグラフだけほしいときにつかえそう  
  
[https://plot.ly/](https://plot.ly/)  

# これとかよむ  
- [Web上でデータの可視化ができるPlotlyをRで試してみる - Dimension Planet Adventure 最終章 最終話『栄光なる未来』](http://ksmzn.hatenablog.com/entry/2013/12/12/000100)  
- [Make: Japan |   Plotlyでデータストリーミング](http://makezine.jp/blog/2014/02/streaming-data-with-plotly.html)  

# つかいかた  
つかうには api_key が必要なのでもらう  
signup には github のアカウントがつかえます  
api_key を取得したら  
`pip install plotly`  
すると `.plotly\.credentials` ができるので そこに username と api_key をセットしておく  

これをやる [Getting Started Plotly for Python](https://plot.ly/python/getting-started/)  

```py3
import plotly.plotly as py
from plotly.graph_objs import *

trace0 = Scatter(
    x=[1, 2, 3, 4],
    y=[10, 15, 13, 17]
)

trace1 = Scatter(
    x=[1, 2, 3, 4],
    y=[16, 5, 11, 9]
)

data = Data([trace0, trace1])
unique_url = py.plot(data, filename = 'basic-line')

```
`py.plot` で URL が発行されてページが開く  
[https://plot.ly/~trsqxyz/3](https://plot.ly/~trsqxyz/3)

データやコードも読めるので便利  
画像がきれいなのでローカルでもできたらいいなと思っている
# 2015/07/14 10:10
```py3
layout = Layout(title='basic-line')
fig = Figure(data=data, layout=layout)
py.image.save_as(fig, filename='fig.png')
```
でローカル保存できた
railsのエラーページをrambulanceでハンドリング

## はじめに

コントローラでのエラーを取得、対応するために色々方法を考えていたのですが、そのなかで見つけたram bulanceというgemが簡単に実装するには良さそうだったので、作業のまとめ記事を書こうと思います。

## 環境

* rails 4.2
* ruby 2.2.2
* rambulance 0.3.1

## 使用まで

### インストール

Gemfileに書きを追記しましす。

 
<pre class="lang:default decode:true " >Gemfile
gem "rambulance"
</pre> 


以上でbundle installを行います。

### railsへの適用

rails g でファイルを生成します。-eオプションでviewのテンプレートが選べるようだったので使用していた haml を入力しました。その他はerbとslimが選択できるようです。

 
```shell-session
generating templates:
      create  app/views/errors/bad_request.html.haml
      create  app/views/errors/forbidden.html.haml
      create  app/views/errors/internal_server_error.html.haml
      create  app/views/errors/not_found.html.haml
      create  app/views/errors/unprocessable_entity.html.haml
      create  app/views/errors/bad_request.json.jbuilder
      create  app/views/errors/forbidden.json.jbuilder
      create  app/views/errors/internal_server_error.json.jbuilder
      create  app/views/errors/not_found.json.jbuilder
      create  app/views/errors/unprocessable_entity.json.jbuilder

copying app/views/layouts/application.html.haml to app/views/layouts/error.html.haml:
      create  app/views/layouts/error.html.haml

generating initializer:
      create  config/initializers/rambulance.rb
```

### 設定の変更

config/initializers/rambulance.rb を編集します。

```config/initializers/rambulance.rb
  config.rescue_responses = {
    ActionController::RoutingError              => :not_found,
    AbstractController::ActionNotFound          => :not_found,
    ActionController::BadRequest                => :bad_request,
    "Hosting::Task::Base::DrubyNotRunningError" => :internal_server_error,
    "Hosting::Task::Base::AlreadyExistError"    => :internal_server_error,
    "CustomersController::DrubyNotWorkingError" => :internal_server_error,
  }

  # view/layout内から使用するテンプレートファイル
  config.layout_name = 'application'
```

ハッシュの中によく使いそうなエラーと独自に作成したエラーを残しました。
layoutは他のページと同様のものを使用するのでapplication/にあるとレイアウトファイルをそのまま使用するように設定しました。

また、開発環境でもエラーを確認できるように

```rb
config.consider_all_requests_local = false
```

を設定しています。

### エラーの内容をページに表示

上記でだいたい整ったので最後に、もしもエラーが有った際にエラークラスを表示できるようにしました。

```haml
.dialog
  %div
    %h1 Internal Server Error
  %p 
    申し訳ありません、下記の理由で実行を停止しました。
    %br/
    サーバ管理者に確認をして下さい。
%pre
  【エラーメッセージ】
  %br/
  - if $!
    = "[Error] #{$!.class}" # error class
    %br/
    = "[Message] #{$!}"       # message
    %br/
    = "#{$@}"       # error trace
    %br/
  - else
    メッセージはありません。
```

とても雑だけど、\$!で発生した種類の障害をクラスとメッセージで表示、もう一個の$@で詳細で其の際のログを大量に出します。こちらでやりたいことが満たせました。

### 最後に
エラー処理はめんどくさいイメージでしたが、クラス同士で結びつけたりよく発生するエラーがあればそれを流せるレールがあることで、エラー処理をあまりやって来なかった自分にもなんとか導入出来ました。
raspbian日本のミラーサイト

## 公式サイトからダウンロードが1時間かかったので・・・

* https://www.raspberrypi.org/downloads/

## 日本のミラーサイトを発見

* https://www.raspbian.org/RaspbianMirrors
    * [旧 raspberrypi](http://ftp.jaist.ac.jp/pub/raspberrypi/raspbian/images/)
    * [raspios_arm64](http://ftp.jaist.ac.jp/pub/raspberrypi/raspios_arm64/images/)

3分くらいでダウンロード完了。ありがたや
[Facebookあるある]ogImage作ったけどタイムラインでどう見えるのかよくわからん。

ogImageのレギュレーションはコロコロ変わります。
とくに画像サイズ。
1200×1200pxのでっかい正方形がいいよ〜
とか
1200×630pxでいいよ〜(2015/7/10現在ではこっち？)
とか

いざそのサイズで作ってもユーザーの閲覧方法によってはトリミングして表示される。企業ロゴ、タレントの顔写真がブツッと切れていたら残念ですよね。。。

そんなときは
(og:image Simulator: OGP画像シミュレータ)[http://ogimage.tsmallfield.com/]

Facebook公式ではないですが、有志の方が運営されています。
いつも使わせていただいています。ありがとうございます！
[Facebookあるある]ogImageが更新されない。。。

キャンペーンサイトなどをやっていると、発売前・発売中・発売後と時期によってogImageを差し替えたいということがよくあります。

「◯時更新だからぴったりに切り替えてね！」
もう心臓がドキドキですね。

画像を差し替えたのに更新されない！1秒でも早く更新してくれ！！！とテンパりたくない。

ogpはキャッシュされてしまうので、即時更新されないのです。。

そんなときは
[Debugger - Facebook Developers](https://developers.facebook.com/tools/debug/)

更新したいURLを入力してぽちっとするとキャッシュがクリアされます。

これで怖くない！
sumなど集計関数と一緒にselect利用してゴニョゴニョする

# はじめに

ちょっと自分のプロジェクトで悩んでいる人がいたのと、それを説明している文書になかなかたどり着けない気がするので書いておく。あまり自分も使い込んでいないので、間違いがあったりしたらツッコミ大歓迎です。

# 前提

下記のような親子構造をしている。
```
Project --* ProjectUser --* Work
```

Workは下記のようなプロパティを持つ前提。

- work_time 数値
- extra_cost 数値

# 課題

`Project`に属する`project_user`の一覧を取得して、さらにそのそれぞれが持っている`Work`の`work_time`、`extra_cost` を全て合算したい（本当はもう少し複雑）。

# 対応

下記のように`group`と`select`を使うといい感じになる。

```rb
  # Project

  def calc_total
    project_users.joins(:works)
      .group(ProjectUser.arel_table[:id]).select('project_users.*, sum(work_time) as sum_work_times, sum(extra_cost) as sum_extra_costs')
  end
```

`project.project_users`のそれぞれの`project_user`に集計結果が入っている形になるので下記のように扱える。

```rb
@project_users = project.calc_total
@project_users.each do |project_user|
  # 下記のようなProjectUserの持っているメソッドが呼べる
  project_user.id
  project_user.payment

  # 集計関数で集計した値も呼べる。メソッドでもいけたっけ？
  project_user[:sum_work_times]
  project_user[:sum_extra_costs]
end
```

# おまけ

`select`は`arel_table`を使ってもっと良い感じになる？
http://qiita.com/yamagen0915/items/b1721a9d1ea076f8cdc5

```rb
  # Project
  
  def calc_total
    project_user_table = ProjectUser.arel_table
    work_table = Work.arel_table
    project_users.joins(:works)
      .group(project_user_table[:id])
      .select(project_user_table) # これで * 取れるんだっけ。調べんと。
      .select(work_table[:work_time].sum.as('sum_work_times'))
      .select(work_table[:extra_cost].sum.as('sum_extra_costs'))
  end
```

なんか squeel よさげ。
http://labs.timedia.co.jp/2013/11/activerecord4sql-squeel.html