OmniAICreator/Qiita-1.07M huggingface dataset:
Nginx で PC とスマートフォンでコンテンツをうまく出し分ける

# 要件1
- HTTP リクエストヘッダー User-Agent: により、スマートフォンか PC かを判別し、ドキュメントルートを切り替える。
  - PC 用ドキュメントルート = /var/www/public_html
  - スマートフォン用ドキュメントルート = /var/www/public_html/sp

## よく見かける例
```
http {

  ...

  server {

    ...

    set $is_sp 0;
    if ($http_user_agent ~* "(iphone|ipod|android.*mobile)") {
      set $is_sp 1;
    }

    root /var/www/public_html;

    location / {
      if ($is_sp) {
        root /var/www/public_html/sp;
      }

    }
  }
}
```

間違いではない。でも...

## 同じことを、もう少しかっこよく
```
http {

  ...

  server {

    ...

    if ($http_user_agent ~* "(iphone|ipod|android.*mobile)") {
      set $path_prefix "/sp";
    }

    location / {
      root /var/www/public_html$path_prefix;
    }

  }
}
```

## 解説
root ディレクティブには変数が使える。ただそれだけのこと。

# 要件2
- HTTP リクエストヘッダー User-Agent: により、スマートフォンか PC かを判別し、ドキュメントルートを切り替える。
  - PC 用ドキュメントルート = /pub/www/public_html
  - スマートフォン用ドキュメントルート = /pub/www/public_html/sp

ここまでは要件1と同じ。今回はそれに加えて、

- **スマートフォン用ドキュメントルートを優先してコンテンツを探す**
  - スマートフォンで見たときに、スマートフォン用ドキュメントルートにファイルが存在すればそれを応答し、存在しなければ PC 用ドキュメントルートから探して見つかったらそれを応答する。

このように、スマートフォン用に最適化されたドキュメントが作られていたらそれを表示し、なければ PC 用コンテンツをそのまま表示したいというのは、コンテンツ制作現場では実践的でありがちな要件だと思う。

```
http {

  ...

  server {

    ...

    if ($http_user_agent ~* "(iphone|ipod|android.*mobile)") {
      set $path_prefix "/sp";
    }

    location / {
      root /var/www/public_html$path_prefix;
      try_files $uri $uri/ @pc;
    }

    location @pc {
      root /var/www/public_html;
    }

  }
}
```

## 解説
`try_files` ディレクティブで、コンテンツの探索順序を設定している。`try_files $uri $uri/` までは普通で、その後ろに `@pc` という名前付きロケーションを設定している。
`@pc` ではドキュメントルートを PC 向けに設定しているので、「最初にスマートフォンのドキュメントルートを探し、なければ PC のドキュメントルートを探す」という、今回の要件を満たす動きになる。

ここで、こんな疑問が湧いてくるのではないだろうか。

### Q1: PC で見たときは `$path_prefix` が未設定なので、PC 向けドキュメントルート /var/www/public_html を2回探すことになるんじゃないの?

そのとおりである。
たしかに無駄な処理かもしれない。しかし実際にはその無駄な処理にかかるオーバーヘッドは、たかがしれている。もしかすると Nginx 内部では動作が最適化されていて、無駄な処理自体行われていないかもしれない。(ソースを読んでいないのでわからないけど)

### Q2: スマートフォンで見たときだけ /var/www/public_html/sp を探しに行けば良いのだから、if ブロックに `try_files` を書けば良いのでは?

`try_files` は if ブロックには書けない。http://nginx.org/en/docs/http/ngx_http_core_module.html#try_files によると、`try_files` は server または location ブロックにしか書けないのである。
no-static-element-interactions制限の回避

入力不可のhtmlタグにonClickなどのイベントを登録すると、eslintのno-static-element-interactionsルール違反の警告が表示されてしまいます。

```
Visible, non-interactive elements should not have mouse or keyboard event listeners
```

# 回避方法
eslintの行禁止コメントを該当タグに追記します。

```
<dl // eslint-disable-line jsx-a11y/no-static-element-interactions
  onClick={e => this.changeType(e, '1')}
>
```

# タップした際の半透明背景の表示禁止
AndroidやiOSでボタン及びラベルをタップした時に、半透明の背景が一瞬に表示され、ユーザにタップされたことを知らせるために、非常に有用な情報です。
ただし、dlをタップすると、dl領域ブロックがボタン押下のような表示が望ましいではない場合があります。その時は、下記のstyleを設定すればそれを無効化することができます。

```
<dl // eslint-disable-line jsx-a11y/no-static-element-interactions
  onClick={e => this.changeType(e, '1')}
  style={{ '-webkit-tap-highlight-color': 'rgba(0,0,0,0)' }}
              >
```
githubの非表示にされたコメント(outdated-comment)を全表示するブックマークレット

以下をブックマークレットに登録して実行すると、githubのPull Requestの非表示にされたレビューコメント等を、全表示することができます。

```js
javascript:Array.from(document.getElementsByClassName('outdated-comment')).forEach(l => l.classList.add('open'));
```
【転職者】未経験エンジニアが素敵な就職をするためにできること

[![thumbnail](http://image.slidesharecdn.com/170526tips-170529000924/95/slide-1-1024.jpg)](https://www.slideshare.net/YosukeKasagawa/ss-76430240)
https://www.slideshare.net/YosukeKasagawa/ss-76430240

## 目次
##### <1>いい感じの職務経歴書を作ろう
　(1)とにかく箇条書きで書き出す
　(2)連想ゲームを繰り返していく
　(3)「要はどういうこと？」でまとめる

##### <2>自分のことを発信していこう
　(1)発信する方法を調べてみた
　(2)実際に発信してみよう

##### <3>本日のスペシャルコンテンツ！
　※スピーカーノートを追記予定
Supervisorでお手軽プロセス自動再起動

サーバーアプリのプロセスがマンボーみたいに死にまくるので（原因はこれから調べます）、Supervisorを使って死んでも自動で再起動するようにします。とても簡単です。

環境：Ubuntu 16.04.2 LTS

## インストール

```
$ sudo apt-get install supervisor
```

## アプリ起動の設定ファイルを追加

```/etc/supervisor/conf.d/manganow_server.conf
[program:manganow_server]
command=/home/akiraak/manganow/server.sh
user=akiraak
autorestart=true
```

## Supervisor再起動

```
$ sudo service supervisor restart
```

## 実行されてるか確認

```shell-session
$ sudo supervisorctl 
manganow_server                  RUNNING   pid 19115, uptime 0:00:01
supervisor>
```

## おわりに

めちゃくちゃ簡単でした。今まで daemontools を使っていたのはなんだったのか。

ログ出力先など細かい設定もできるのでオフィシャルのドキュメントを見てアプリが落ちる原因を調べたいと思います！
http://supervisord.org
セキュリティ入門


&nbsp;
<h1>セキュリティ入門</h1>
メモとしてのこします
&nbsp;
<h2>セキュリティを考えるための3つの点</h2>

セキュリティを考える上での3つの点は
<ol>
	<li>完全性（改ざん防止）</li>
	<li>機密性（漏えい防止）</li>
	<li>可用性（安定したパフォーマンス）</li>
</ol>
の3つである。

上記3つが守られず、かつ悪用できる部分を脆弱性と呼ぶ。
ここで問題（曖昧）なのが、脆弱性・バグ・仕様の見分け方である。
開発者曰く、脆弱性が仕様である場合もあるらしい。
<h4></h4>
<h2>悪用可能なバグ</h2>

レイヤ別で記載する
<h4>◼︎ アプリケーション</h4>
・文字入力の場合、特殊文字の制限を設けていない
・GET通信
・パラメータが平文
・フレームワークのバージョンが古い
<h4>◼︎ネットワーク</h4>
・IPアドレス制限がかかっていない
・DoS、DDoS対策の不備
・SSL設定不備
・不正パケットのフィルタリング
<h4>◼︎ソフトウェア</h4>
・メモリリークの不備
・子プロセスからの侵害（Windows）
・リンクライブラリへのインジェクション
・メモリダンプ対策の不備
<h4></h4>

&nbsp;
<h2>悪用される前に</h2>

・アクセスログ
・パケットログ
・syslog
・サービス別のログ
・すべての操作ログ
→ とりあえず全部ログで残す

&nbsp;
<h2>ユーザーができる対策</h2>
&nbsp;

・gmailアドレスをサービスごとに分ける(amazon・楽天等)
<p style="padding-left: 30px;">　→ name + サービス名@gmail.com</p>
<p style="padding-left: 60px;">既存のgmailアドレスの最後に[+サービス名]をつけるだけで利用可能。複数登録する必要はない</p>
<p style="padding-left: 30px;">　→どのサービスから情報漏えいしたかがわかる</p>
・2段階認証有効化
<p style="padding-left: 30px;">　→パスワードが漏えいしても、もう1つの認証が破られにくい</p>
・ソフトウェアのバージョンは常に最新に
<p style="padding-left: 30px;">　→インストールしているアプリバージョン、OSのバージョン</p>
・UACのレベルは一番高く（Windows）

・PCのバックアップは２つ以上とっておく
<p style="padding-left: 30px;">　→常にオンラインストレージでとっておくもの、オフラインでとっておくものなど、</p>
&nbsp;

&nbsp;
<h2>脆弱性検証</h2>
・仮想環境で行う

・マルウェアを動かす時はsandboxで
<p style="padding-left: 30px;">→ Erthenetアダプタは抜く。VMwareToolsアンインストール</p>
・Webアプリ検証はDockerが便利
<p style="padding-left: 30px;">→ 壊れたらDockerでまたデプロイ</p>
※ ランサムウェアの検証は中途半端な知識で行わないこと

&nbsp;

&nbsp;
<h2>検証に使えるフリーウェア</h2>
・OWASP ZAP(プロキシツール)
<p style="padding-left: 30px;">→ 誤検知多いので注意</p>
・OWASP Broken Web Application
<p style="padding-left: 30px;">→ やられ環境VM。脆弱性がある環境</p>
・AppGoat/WebGoat

・BurpSuite

・Metasploit Framework
<p style="padding-left: 30px;">→ KaliLinuxに標準搭載</p>
・Windows10 Pro/Ent Developer VM

&nbsp;

&nbsp;
<h2>相談窓口</h2>
<h2></h2>
<a title="警視庁サイバー犯罪対策課" href="https://www.npa.go.jp/cyber/soudan.htm" target="_blank">警視庁サイバー犯罪対策課</a>

<a href="https://www.npa.go.jp/cyber/soudan.htm">https://www.npa.go.jp/cyber/soudan.htm</a>

&nbsp;
<h2>脆弱性報告</h2>
&nbsp;

<a title="IPA脆弱性届け出窓口" href="https://www.ipa.go.jp/security/vuln/report/" target="_blank">IPA脆弱性届け出窓口</a>

<a href="https://www.ipa.go.jp/security/vuln/report/">https://www.ipa.go.jp/security/vuln/report/</a>

&nbsp;

&nbsp;

&nbsp;

&nbsp;

&nbsp;

&nbsp;

&nbsp;

この人がすごいらしい

(セキュリティについて、タイムリーな内容をいろいろ更新しています。)

<a href="https://twitter.com/piyokango?lang=ja" target="_blank">https://twitter.com/piyokango?lang=ja</a>

<a href="http://d.hatena.ne.jp/Kango/" target="_blank">http://d.hatena.ne.jp/Kango/</a>

&nbsp;
Mysqlで正規表現を使って、指定のIP範囲からの検索履歴を見つける

## IPの範囲を検索するための正規表現

別の記事に便利なツールを紹介しているので、そこを是非参照してください：

http://qiita.com/kasia-some/items/75a0ad8b6245365ab91f

## Mysqlで正規表現

簡単です。

```mysql
select * from table where column regexp 'パターン';
```

regexp は0か1を返すので、自分の探している値がちゃんと指定したパターンにマッチしているかを確認すると安心です。

例えば：

```mysql
select '値' regexp 'パターン';
```

結果が1だったら、正規表現が正しいことになります。

注意点：
正規表現をSQL文で使う時、preg_matchのように'//'で囲ってしまうと動かない。phpのコードからそのまま正規表現を持ってきた場合、間違えて//も入れちゃうと思い通りの結果が出てこないので気をつけましょう。

## 実際にサンプルSQL書いてみる

例えば、「123.123.123.120」から「123.123.123.125」のIP範囲を使って、検索ログテーブル「search_log」にあるデータを全部取得したい。

```mysql
select * 
from search_log 
where 
ip regexp '^123\.123\.123\.(1(2[0-5]))$';
```

複数のパターンにマッチしているデータを検索する場合、シンプルにOR条件を追加します。
例えば、先程のIPに、「123.123.123.130」から「123.123.123.135」の範囲も追加したい場合：

```mysql
select * 
from search_log 
where 
ip regexp '^123\.123\.123\.(1(2[0-5]))$'
or ip regexp '^123\.123\.123\.(1(3[0-5]))$';
```
デザインパターン学習メモ：「Visitor」

## 目的
GoF本より引用する。

> あるオブジェクト構造上の要素で実行されるオペレーションを表現する。Visitorパターンにより、オペレーションを加えるオブジェクトのクラスに変更を与えずに、新しいオペレーションを定義することができるようになる。

## 実装例
GoF本を参考に作成。Productクラスのaccept()を具体的なVisitorインスタンスを渡して実行する。

Productクラスに新しいオペレーションを定義したいときは、新たにVisitorインタフェースを実装したクラスを作成し、visitProduct()メソッドを実装すればよい。

このとき、Productクラスの変更は不要である。

```java:Visitor.java
// Visitor役
public interface Visitor {
	void visitProduct(Product product);
}
```


```java:PricingVisitor.java
// Concrete Visitor役
public class PricingVisitor implements Visitor {

	@Override
	public void visitProduct(Product product) {
		// Productをつかった任意の処理を実装する
		System.out.println(product.getName());
		System.out.println(product.getPrice());
	}
}
```


```java:Item.java
// Element役
public interface Item {
	void accept(Visitor visitor);
}
```


```java:Product.java
// Concrete Element役
public class Product implements Item {
	private String name;
	private int price;

	public Product(String name, int price) {
		this.name = name;
		this.price = price;
	}

	public String getName() {
		return this.name;
	}

	public int getPrice() {
		return this.price;
	}

	@Override
	public void accept(Visitor visitor) {
		visitor.visitProduct(this);
	}
}
```

## 参考文献
 * エリック ガンマ、ラルフ ジョンソン、リチャード ヘルム、ジョン プリシディース（1999）『オブジェクト指向における再利用のためのデザインパターン　改訂版』本位田　真一、吉田　和樹 監訳、SBクリエイティブ
IPの範囲を検索するための正規表現作成ツール

自分で書くと結構大変なので、折角のツールを使いましょう。

以下のサイトは、GoogleアナリティクスでIP範囲を使って検索するために、指定のIP範囲内のアドレスがマッチする正規表現を生成してくれます。

http://www.analyticsmarket.com/freetools/ipregex

## 正規表現を生成する

「Step 1」にはIP範囲の最初のアドレスを入れます。一つだけのIPであれば、これで十分で、「Step 2」は空欄で大丈夫。
範囲を検索するための正規表現がほしい場合は、「Step 2」に範囲の最後のIPを入れます。
そして、「Generate RegEx」ボタンをおして、「Step 3」が表示されるまで待ちます。
「Step 3」には、コピーペーストできる正規表現パターンが表示されていますので、後は、使うだけです。

例えば、「123.123.123.120」から「123.123.123.125」のアドレスがマッチしているパターンがほしい場合、
「Step 1」に「123.123.123.120」、「Step 2」に「123.123.123.125」を入力して、結果を取得します。

結果は

```
^123\.123\.123\.(1(2[0-5]))$
```

です。

アナリティクスでももちろん、phpやMySQLでも使えて便利なので、紹介しました。
[WordPress] /?author=xx をちゃんと阻止した話

**2019.04.16補足**
実際に実装してみたところ、[2017.05.29補足]のようにhtaccessに１行を追加すると、
> **/?author=1** => **/author/hoge** => **302 redirect**

となり、**/author/hoge を経由してしまうため**本文同様（ログインIDが明示される）の状態になります。

~~~apache
RewriteRule ^\?author=(.*)? / [R=302,L]
~~~

も併せて設定されることをおすすめします。

-----

**2017.05.29補足**
PHP（Wordpress）上でリダイレクトを行わなくても、htaccessに一行足せば簡単に問題が解決しました...。

~~~apache
RewriteRule ^author/(.*)? / [R=302,L]
~~~
[mikkame 様](http://qiita.com/mikkame)からご指摘を受けました。ありがとうございます。

-----

##事の発端
とある管理サイトでの話。
**/?author=xx**でユーザーのログインIDが漏れるのは知っていたので

~~~author.php
<?php header('Location: ' . get_bloginfo('url') . '/403.php'); exit; ?>
~~~
と403ページへ転送していました。
これに加えて[Audit Trail](https://ja.wordpress.org/plugins/audit-trail/)というプラグインで**ログイン失敗だけ記録**。

これでひとまず安心...。しかしレンタルサーバーのエラーログを見ていたら

~~~Error.log
WordPress Login Failure: adminID from xxx.xxx.xxx.xxx
~~~
と、**ログインIDがバレていた!!**

##どうしてだろうか...
前後のエラーログやアクセスログを見ても**/?author=xx**や**xmlrpc.php**へのアクセスばかりでさっぱりわからず。
> xmlrpc.phpも念のためアクセス制限をかけていました。使わないので。

~~~apache
<Files "xmlrpc.php">
order deny,allow
deny from all
</Files>
~~~

###curl
ダメ元でcurlコマンドで叩いてみました。

~~~bash
# オプションなし
$ curl http://example.com/?author=xx
~~~

リダイレクト処理を行っているので応答なし。

そこでもしや、と思い -v をつけてHeaderを表示。

~~~bash
# リクエストヘッダーとレスポンスヘッダーの両方を見ることができます。
$ curl http://example.com/?author=xx -v
*   Trying xxx.xxx.xxx.xxx...
* TCP_NODELAY set
* Connected to example.com (xxx.xxx.xxx.xxx) port 80 (#0)
> GET /?author=xx HTTP/1.1
> Host: example.com
> User-Agent: curl/7.51.0
> Accept: */*
> 
< HTTP/1.1 301 Moved Permanently
< Date: Sun, 28 May 2017 19:07:33 GMT
< Server: Apache/2.2.31
< X-Powered-By: PHP/5.6.30
< Location: http://example.com/author/adminID/
< Content-Length: 0
< Content-Type: text/html; charset=UTF-8
< 
* Curl_http_done: called premature == 0
* Connection #0 to host example.com left intact
~~~

**なんと、ヘッダーに隠したはずのログインIDが書かれているではないですか！！**

##対応策
大急ぎで対応を検討しました。
しかし、Headerの出力をWordPressで制御するのは大変。
そこで以下のようにリライトを制御。author.phpを経由することなくTOPページへリダイレクトするようにしました。

~~~functions.php
function author_custom_redirection() {
    global $wp_rewrite;
    $wp_rewrite->flush_rules();
    $wp_rewrite->author_base = '';
    $wp_rewrite->author_structure = '/';
    if (isset($_REQUEST['author']) && !empty($_REQUEST['author'])) {
        wp_redirect(home_url());
        exit;
    }
}
add_action('init', 'author_custom_redirection');
~~~
> **補足**
> のちの参考リンク先ではif分岐が一段多いですが、これはログイン済みユーザーと非ログイン者とで処理を分けているからです。今回はログイン済みユーザーもauthor.phpを見ることができない仕様にしました。

~~~bash
# リクエストヘッダーとレスポンスヘッダーの両方を見ることができます。
$ curl http://example.com/?author=xx -v
*   Trying xxx.xxx.xxx.xxx...

# ### 中略 ###

< HTTP/1.1 301 Moved Permanently
< Date: Sun, 28 May 2017 19:07:33 GMT
< Server: Apache/2.2.31
< X-Powered-By: PHP/5.6.30
< Location: http://example.com
< Content-Length: 0
< Content-Type: text/html; charset=UTF-8
< 
* Curl_http_done: called premature == 0
* Connection #0 to host example.com left intact
~~~

無事にHeaderからもログインIDが消えました！！

##まとめ
/?author=xxを非表示にする方法としてよく挙がる「**author.phpからのリダイレクト**」では抜け穴があることを学べました。ありがとうございました。

##参考リンク
[authorクエリを利用したWordPressのユーザー名漏洩を防ぐ方法](https://blog.isao.co.jp/prevent-the-leakage-of-user-name-by-author-query-on-wordpress/)
Hackerrank.com problem equals

問題文
https://www.hackerrank.com/challenges/equal
女の子が次のルールでチョコをあげる。
1. 特定の一人を除いて他全員にチョコ１個あげる
2. 特定の一人を除いて他全員にチョコ２個あげる
3. 特定の一人を除いて他全員にチョコ５個あげる

全員同数のチョコを持つ為に上記のオペーレーションを何回繰り返すか？

解き方

解き方は自分で思いついていませんが、エレガントな解き方と思いますので、書きたくなりました。
気づくべきところ
1. 一人除いて他の人全員にチョコあげる行為は、その一人だけからチョコもらっている操作と同様。
2. １のため問題は、０に向かって全ての同僚が同じになるまで操作する。
3. 全ての同僚が同じ数のチョコを持つためには、各同僚が持つべき目的の数を決める。
4. ３で決めた数と初期に持っていたチョコの差分０になるまで何回操作をすればいいかを求める。この値が答えとなる。

アルゴリズム
0. 全ての同僚のチョコの数を配列aとする。
1. 一番少ない数のチョコ持っている同僚みつける。そのチョコの数をminとする。
2. 各同僚が持つべき目的の数は、min, min - 1, min - 2, min - 3, min - 4 である。
3. 2で決めた数字で差分をとる。delta[i] = a[i] - (min - j); 0<= j <= 4.
4. delta[i] = 5 * x + 2 * y + 1 * z　という式が成り立つ。最小のステップ数を求める　→　つまり(x + y +　z)が最小になるように下記のようにする。
   x = delta[i] / 5;
   y = delta[i] % 5 / 2;
   z = delta[i] % 5 % 2 / 1;
   sum += x + y + z;
5. 2-4を繰り返し、sumの最小値が答えとなる。
6. 補足：２でどうしてmin - 5, min -6などの数を目的の数として選ばないのか？を説明します。

min - 5を目的の数に選んだとします。
その場合の差分は、 delta1[i] = a[i] - (min - 5);となるこのときのxは下記のようになる。
x = delta1[i] / 5 = a[i] / 5 - min / 5 + 5 / 5 この「5 / 5 = 1」はいつもプラス１になり、１ステップ多くなることを意味します。つまりやっても無駄になります。5より大きな数はこのようにステップが無駄に増えるだけになります。



```java
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.util.StringTokenizer;

/**
 * @author munkhbat
 * hackerrank equal
 * 
 */
public class Solution
{
	static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
	static PrintWriter pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));

	static int solve(int min, int[] a) {
		// my answer goes below.
		int ans = Integer.MAX_VALUE;
		for (int j = 0; j <= 4; j++) {
			int tmpans = 0;
			for (int p = 0; p < a.length; p++) {
				int delta = a[p] - (min - j);
				int x = delta / 5;
				int y = (delta % 5) / 2;
				int z = ((delta % 5) % 2) / 1;
				tmpans += x + y + z;
			}
			ans = Math.min(tmpans, ans);
		}
		return ans;
	}

	public static void main(String[] args) throws IOException {
		int t = Integer.parseInt(br.readLine());
		for (int i = 0; i < t; i++) {
			int n = Integer.parseInt(br.readLine());
			int[] a = new int[n];
			StringTokenizer st = new StringTokenizer(br.readLine());
			int min = Integer.MAX_VALUE;
			for (int j = 0; j < n; j++) {
				a[j] = Integer.parseInt(st.nextToken());
				min = Math.min(min, a[j]);
			}

			pw.println(solve(min, a));
		}

		br.close();
		pw.flush();
		pw.close();
	}
}
Asciidoc文法クイックリファレンスの日本語訳

# 概要
[AsciiDoc Syntax Quick Reference](http://asciidoctor.org/docs/asciidoc-syntax-quick-reference/) を日本語訳したものです。
ところどころ意訳したり、補足説明を追加したりしています。
これからAsciidoctorを使ってみようという方々のお役に立てれば幸いです。

# ドキュメントのURL
GitHub Pagesの下記URLにて公開しています。
https://takumon.github.io/asciidoc-syntax-quick-reference-japanese-translation/

![スクリーンショット 2017-06-03 12.43.12.png](https://qiita-image-store.s3.amazonaws.com/0/49915/6adccc53-b8f2-29d0-a4a8-78ef92da0b68.png)

# Asciidoctorとは
AsciidoctorはAsciidocコンテンツをHTML5やDocBook 5、PDFに変換するためのツール群です。Rubyで実装されておりRubyGem.orgでパッケージが公開されています。オープンソースでGithubにホストされており、MITライセンスです。

# Asciidocとは
Markdownなどのような軽量マークアップ言語の一つです。Markdownよりも高い表現力、高い可読性を持ち合わせたもので、技術文書を書くのに適しています。
またOffice文章と比べてもテキストベースなので、軽量で、GITなどの構成管理ツールと相性が良いといったメリットがあります。
行列微分のコツ

機械学習で必ずと言っていいほど出てくる行列微分．これ，苦手な方も多いのではないでしょうか．僕も苦手でしたが，あるパターンを見つけたので共有したいと思います．もしかしたら当たり前なのかもしれませんが...．

まず，以下の式を理解する．

```math
[AB]_{ij} = \sum_{k=1}^c A_{ik} B_{kj}
```

ただし，Aは$m \times c$行列で，Bは$c \times n$行列．こう書くと普通Aはm行c列の行列をさし，Bはc行n列の行列をさします．使うのはほぼこの式だけです．ちなみに普通行列とベクトルは太字で書きますが，この記事では普通に書きます．あと，sumには添字のみを表記することにします．

じゃあ例題として，$tr(X^TBX)$を扱ってみましょう．trはtraceでただの対角成分の和なので何も怖くありません．まずは対象を成分で全て書き表します．

```math
\begin{align*}
tr(X^TBX) 
&= \sum_{i} [X^TBX]_{ii} \\
&= \sum_{i} \sum_{j} [X^T]_{ij} [BX]_{ji} \\
&= \sum_{i} \sum_{j} \sum_{k} [X^T]_{ij} B_{jk} X_{ki} \\
&= \sum_{i} \sum_{j} \sum_{k} X_{ji} B_{jk} X_{ki} \\
&= \sum_{i} \sum_{j} \sum_{k} B_{jk} X_{ji} X_{ki} \\
\end{align*}
```

最初の式を使って展開しただけです．ではこれを$X_{\ell\ell'}$で微分してみましょう．ここで，添字は式中の記号とは区別した方がいいです．
ここが最大のポイントなのですが，$B_{jk} X_{ji} X_{ki}$だけに注目して，各添字の組み合わせが$(\ell, \ell')$になる時だけを考えます．なぜならそれ以外は微分すれば消えるからです．ここでは，

1. $j = \ell, i = \ell'$
2. $k = \ell, i = \ell'$

の場合だけ考えれば良いです．

まず1の場合ですが，注目している項は$B_{\ell k} X_{\ell\ell'} X_{k\ell'}$になります．ここに出てくる添字の中で，$(\ell, \ell')$以外の添字についてはsumをとります．なので，$\sum_{k} B_{\ell k} X_{\ell\ell'} X_{k\ell'}$を考えます．ここから$X_{\ell \ell'}$を取り除きます．そうすると，残るのは$\sum_{k} B_{\ell k} X_{k\ell'}$になりますよね．そしてこれは最初の式で変形すると，$[BX]_{\ell \ell'}$となります．

2についても同様です．この場合，注目している項は$B_{j\ell} X_{j\ell'} X_{\ell\ell'}$となり，$j$が残っているのでsumをとって，$\sum_{j} B_{j\ell} X_{j\ell'} X_{\ell\ell'}$を考えます．ここから$X_{\ell\ell'}$を取り除くと，$\sum_{j} B_{j\ell} X_{j\ell'} $が残ります．これを最初の式で変形すると，$[B^T X]_{\ell\ell'}$となります．

これらを足せば，

```math
\frac{\partial}{\partial X_{\ell \ell'}} tr(X^T B X) = [BX]_{\ell \ell'} + [B^T X]_{\ell \ell'}
```

となります．行列の形で書くと，

```math
\frac{\partial}{\partial X} tr(X^T B X) = BX + B^T X
```

となります．そうですこれが，微分したものになっています．

今回は自分がやっている行列微分の方法を紹介してみました．まぁ実際にはmatrix cookbookなんかをみればたいていの微分は書いてあるのですが．
Python2で文字コードを自在に操りたい

## 目的
* Python2で文字列を自在に操りたい
* 文字コードってなんなん

## 結論
strを**decode**するとunicode
'\xe3\x81\x82'を**decode**するとu'\u3042'

unicodeを**encode**するとstr
u'\u3042'を**encode**すると'\xe3\x81\x82'

## 文字コードとは
文字を画像としてではなく、記号として扱うときに、文字に対応するコードのこと

## バイト文字列とユニコード文字列

||リテラル|Type|表記|
|:-----------------:|:-----------------:|------------------:|------------------:|
|バイト文字列|'あいう'|str|'\xe3\x81\x82'|
|ユニコード文字列|u'あいう'|unicode|u'\u3042'|
## 変換方法

```
>>> # decode : str -> unicode
>>> 'あ'.decode('utf-8')
u'\u3042'
>>> # encode : unicode -> str
>>> u'あ'.encode('utf-8')
'\xe3\x81\x82'
```

## 疑問点・調べることリスト

* 文字コードの調べ方
* \u3042と\xe3\x81\x82の違いって何？どうやって01で表現するの？
* 文字コードの歴史（単純に興味ある）

文字コードの本ないかなあと思ったらちょうどよさそうなのがあった。
[プログラマのための文字コード技術入門](https://www.amazon.co.jp/プログラマのための文字コード技術入門-WEB-PRESS-plus-plusシリーズ/dp/477414164X/ref=sr_1_1?ie=UTF8&qid=1495989913&sr=8-1&keywords=文字コード)
Mac 版 GIMP で筑紫丸ゴシックを使う

# はじめに
Windows 10 のシステムフォントである Yu Gothic UI のベースとなった游ゴシック体(字游工房)や、最近そこかしこで見る筑紫丸ゴシック(フォントワークス)などの日本語フォントが、OS X El Capitan から プリインストールされるようになっています。
自分も筑紫A丸ゴシックの雰囲気が好きで最近よく使うのですが、GIMP ではこれらのフォントが(初期設定では)参照できません。
そこでちょっと設定をいじって使えるようにしたので、道のりをメモ。

![できあがり](https://qiita-image-store.s3.amazonaws.com/0/163084/f6129e3b-8075-a37c-1f8c-ba7871fd26f8.png)

# 環境
macOS Sierra 10.12.5
GIMP 2.8.18

# やり方
## フォントの場所を確認する
(参考: http://inforati.jp/apple/mac-tips-techniques/system-hints/where-is-the-folder-of-macos-font-file.html)

Mac にはフォントファイルが保存されている場所が3種類あります。
システムフォント: `/System/Library/Fonts/`
ユーザフォント(共有): `/Library/Fonts/`
ユーザフォント(個別): `~/Library/Fonts/`

ところが上述のフォントはこれらの**どこにもありません**。
Font Book を開き、フォントにマウスオーバーするとディレクトリを確認することができます。
例として筑紫A丸ゴシックのレギュラーウェイトは

![スクリーンショット 2017-05-29 00.47.01.png](https://qiita-image-store.s3.amazonaws.com/0/163084/63616bb2-0fe6-b6ec-cf2b-e9653f965438.png)

他のフォントも `﻿﻿/System/Library/Assets/com_apple_MobileAsset_Font3/` 以下にあることがわかります。

## GIMP の設定
`GIMP > 設定 > フォルダー > フォント` を開き、先程のパスを追加します。

![パス設定](https://qiita-image-store.s3.amazonaws.com/0/163084/49301906-623d-fa5b-7236-2ba9b0ed5528.png)

`OK` を押すと GIMP がフォントを参照しはじめてフリーズしますが、数分で終わるので気長に待ちます。
終わったら一応 GIMP を再起動しましょう。

以上で GIMP でオサレ日本語フォントが使えるようになります。

# 蛇足
ちなみにこれらのプリインストールフォントは「フォントとして頒布しない」「改変を加えない」の2点を守れば商用利用が可能なようです。
(参考: http://yaritakunai.hatenablog.com/entry/2017/01/22/201000)
あと筑紫丸ゴシックって「つくし」って読むんですね……。ずっと「ちくし」って読んでた……。
Markdown記法

# Markdown記法

自分用のメモとしてまとめ直しました。

## 見出し

```md:見出し
# h1
## h2
###### h6
```

## リスト

```
-リスト１
    + リスト２
        * リスト３
                <code>

1. リストI
 2. リストII
```

- リスト１
    + リスト２
        * リスト３
                <code>

1. リストI
 2. リストII

## 引用

```
> このように引用ができます
> １段階
>> 2段階
```

> このように引用ができます  
> 1段階
>> 2段階

## コード

```markdown:markdown
```

## 水平線

```
* * *
- - -
```

* * *
- - -

## リンク

```
[テキスト](URL "タイトル")
![テキスト](画像URL "タイトル")
ここに注釈が入ります[^1]

[^1]:Here is a comment.
```

[テキスト](URL "タイトル")  
![テキスト](画像URL "タイトル")  
ここに注釈が入ります [^1]  

## テーブル

| left align | center align | right align |
|:---|:---:|---:|
|left  | center | right |

## 修飾

```
*イタリック*
**ボールド**
***イタリック＆ボールド***
~~打ち消し~~
```

*イタリック*  
**ボールド**  
***イタリック＆ボールド***  
~~打ち消し~~  

---

## 参照

[Daring Fireball: Markdown Syntax](https://daringfireball.net/projects/markdown/syntax)  
[GitHub Flavored Markdown](https://help.github.com/categories/writing-on-github/)  

[^1]:　Here is a comment.
[Rails] Rails5.1で控えめにwebpackerを使ってフロントエンド環境構築

とりあえずbabelとnpm package管理できればいいや、くらいのノリで

## rails new

rails new はwebpack関連のオプションなしで実行。

--webpack や --webpack=*** で同時に行うこともできるが、
webpack関連でジェネレートされた差分がわからなくなるのでオプションなしがおすすめ。

## yarnは最新にする

```
$ yarn --version
0.24.5
```
※ 2017年5月時点

アップデートは以下のコマンドで

```
yarn self-update
```

## webpack init

webpackerを追記

```Gemfile
gem 'webpacker', github: 'rails/webpacker'
```

webpackerのインストール

```
$ bundle install
$ bin/rails webpacker:install
```

必要なファイルがいろいろ生成される。
エントリポイントとなるapplication.jsをlayoutファイルに追記する。


```views/layouts/application.html.erb
<%= javascript_pack_tag 'application' %>
```

※ webpackを通すエントリポイントを指定するときは、`javascript_pack_tag`というヘルパーを使う

`bin/webpack` を実行して `Hello World from Webpacker`
が表示されれば設定完了

## webpackerのディレクトリ構成

webpackで管理するjsは、以下のディレクトリに配置する
※ `app/assets/javascripts` では無いことに注意！

```
app/javascripts/packs/
```


```
app/javascript/
├── lib → 共通で使う雑多なjsの置き場所
│
├── packs
│   └── application.js → エントリーポイント
└── pages
    └── hoge
        └── index.js → hogeページで動くjs
```


## cssとimages

今回はwebpack利用は控えめな方針なので
cssとimageはそれぞれ従来通り

css → assets/stylesheets/
image → assets/images

に配置する


## page.jsを使ったルーティングの例

webpackは関係ないが、エントリポイントを1つにする場合は、
page.jsを使ってルーティング

```app/javascript/packs/application.js

import page from 'page';
import pageHoge from '../pages/hoge';

page('/hoge/index', pageHoge);
page();
```

## webpack-dev-serverを設定してLive Reload

```Gemfile
gem 'foreman'
```

```Procfile
web: bundle exec rails s
webpacker: ./bin/webpack-dev-server
```

以下のコマンドで
rails serverとwebpack-dev-serverが同時に起動する

```
$ foreman start -p 3000
```

以上。ここまでwebpackのconfigは1行も追記せずに、
webpackでコンパイルできる環境が完成している。
CentOS7のメモリ使用量について

### CentOSのインストール方法によるメモリ使用量の違い
---
#### 1.まえがき
あくまでもメモ書き、というか先駆者は死ぬほどいると思うが、同じ轍を踏む人が1人でも減るようにと思って書いてみる
(無駄にお金かけてメモリ増設する等)

#### 2.全部入りインストール
CentOSのノーマルDVD版のISOを落として来て、GUIでも操作できるように初期インストール
その後、下記の物をいれてみる

1. DeveloperTool一式
2. Apache
3. MariaDB
4. PostgreSQL
5. PHP
6. Passenger
7. Ruby(renv)
8. Nginx
8. Zabbix(一式)
9. Redmine(一式)
10. CakePHP(一式)
11. GitLab(一式)

これらを一式入れて、起動してみるとメモリの使用量は約5GBほどになる(重い)
最初4GBのメモリを積んだ物理マシンでやっていたので、途中でメモリの増設をすることになった

#### 3.その後
管理の都合などもあり、もう少しリッチな環境でVM上にお引っ越しすることにした。

+ 元の環境
    + 2コアCPU
    + 6GBメモリ

+ 引越し先の環境
    + 4コアCPU
    + 8GBメモリ

これだけ見るととてもリッチになった気がするが
ホスト側でも結構リソースを割くので、実質VMに避けるのは

- 1コアCPU
- 2GBメモリ

となるので、どうにかしてメモリを圧縮しなければならない

#### 4.軽量環境の作成
まずは、最小環境のCentOS7のISOを落として来て、必要なものを必要なだけインストールしていく
「絶対GUIとか重いでしょ」とか思っていながら、本音は「そんなに変わらないでしょ…」と思っていた
が、とりあえずCUIオンリーで構成する。
さらに以下を先にインストール

1. DeveloperTool一式
2. Apache
3. MariaDB
4. PostgreSQL
5. PHP
6. Passenger
7. Ruby(renv)
8. CakePHP(一式)

で、いろいろ構築して(省く)
アプリ一式起動
使用メモリを確認すると…

**使用量 280MB** 

Σ(ﾟДﾟ)!?

え、軽っ!
まだZabbixとか入れてないけど、これは行けるのでは!?
(というかGUIどんだけ重いのか

という訳で今回はここまで
また、一式移したらまた報告します。

ではではノシ

ブログ始めました、よかったら遊びに来てください
https://red-full-moon.com/
pbm画像を画素単位で加工するための準備


pbmのバイナリ部分を自分で加工するんじゃなく、
ライブラリ使って簡単に書けないかなと思ったところ、numpyがいいらしい。

pbmからndarrayに入れるまではよかったのだけど、
ndarrayから2値のpbmに戻す方法がわかりません。

[NumPyのarrayとPILの変換Add Star](http://d.hatena.ne.jp/white_wheels/20100322/p1)
↑など参照したものの、

2値画像のarrayを画像に戻すときに、
1bitじゃなく8bitの1に値が置き換わってしまうのでpbmにはなってない。
pillowじゃだめなんだろうか。

```array_to_pbm.py
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
from PIL import Image

#画像ファイル開く
file_name = 'lf_img_small.pbm'
lf_img = Image.open(file_name)
#2値画像の場合はbool型で値が格納されています。
#numpyではbool型はnumpy.bool8として定義されています。
#配列に読み込む際には読み込みモードとしてbool8を指定します。
lf_img_ary = np.array(lf_img, np.bool8)

width, height = lf_img.size
print(width, height)

#配列の素性を調べてみる。
print('****************')
print(img_ary.flags)
print(img_ary.ndim)
print(img_ary.size)
print(img_ary.shape)
print(img_ary.itemsize)
print(img_ary.strides)
print(img_ary.nbytes)
print(img_ary.dtype)
print('****************')
for x in range(height):
    for y in range(width):
        if y ==0 :
            print(img_ary[x,y])

#画像に変換する場合はfromarrayみたいなんだけど、
#bool8だとエラーになる。
Image.fromarray(np.bool8(img_ary)).save('ary_to_pbm_file.pbm')

#uint8を指定だとpbmじゃなくpgmができている。
Image.fromarray(np.uint8(img_ary)).save('ary_to_pbm_file.pbm')

```
Java 関数型プログラミング練習帳 - zipWith -

# はじめに
このシリーズでは、`Java`の関数型プログラミングを使いこなすことを目的に、いろいろな題材で練習をしていこうと思います。今回は`zipWith`を取り上げます。

# `zip`と`zipWith`

`zip`は関数型言語にはたいてい標準で装備されている関数で、2つのリストの要素を順々に組み合わせていって新しいリストを作成するものです。
以下は`Haskell`の例です。１つ目の要素`1`と`'a'`によりタプル`(1,'a')`が生成され、同様に2番目、３番目の要素が処理されて、全体として長さが3のタプルのリストが生成されます。

```haskell:zip
Prelude> zip [1,2,3] ['a','b','c']
[(1,'a'),(2,'b'),(3,'c')]
```

`zipWith`は要素同士を組み合わせる際に適用する関数を指定できる高階関数です。
以下の例では、指定した要素を指定した回数繰り返して複製する`replicate`という関数を適用した例です。

```haskell:zipWith
Prelude> zipWith replicate [1,2,3] ['a','b','c']
["a","bb","ccc"]
```

# `Java`で`zipWith`を実装

最初はわかりやすさのためジェネリクスを使わずに汎用的でない`_zipWith`を書いてみます。
前節の`Haskell`の`zipWith`のコード例と同等のテストコードは以下となります。

```java:_zipWithのテストコード
    @Test
    public void test_zipWith() {
        List<String> l1 = Arrays.asList("a", "b", "c");
        List<Integer> l2 = Arrays.asList(new Integer(1), new Integer(2), new Integer(3));
        BiFunction<String, Integer, String> f = FunctionsTest::replicate;
        List<String> zipped = Functions._zipWith(f, l1, l2);

        assertNotNull(zipped);
        assertEquals(3, zipped.size());
        assertEquals("a", zipped.get(0));
        assertEquals("bb", zipped.get(1));
        assertEquals("ccc", zipped.get(2));
    }

    private static String replicate(String str, Integer n) {
        return IntStream.range(0, n).mapToObj(i -> str).collect(Collectors.joining());
    }
```

`_zipWith`の実装は以下のようになります。

```java:_zipWith
    public static List<String> _zipWith(BiFunction<String, Integer, String> f, List<String> l1, List<Integer> l2) {
        final int min;
        if ((l1 == null || l1.size() == 0) || (l2 == null || l2.size() == 0)) {
            return Collections.emptyList();
        } else {
            min = l1.size() <= l2.size() ? l1.size() : l2.size();
        }
        return IntStream.range(0, min)
                .mapToObj(i -> f.apply(l1.get(i), l2.get(i)))
                .collect(Collectors.toList());
    }
```

あとはジェネリクスを使って汎用化すればよいですね。

```java:zipWith
    public static <T, U, R> List<R> zipWith(BiFunction<T, U, R> f, List<T> l1, List<U> l2) {
        final int min;
        if ((l1 == null || l1.size() == 0) || (l2 == null || l2.size() == 0)) {
            return Collections.emptyList();
        } else {
            min = l1.size() <= l2.size() ? l1.size() : l2.size();
        }
        return IntStream.range(0, min)
                .mapToObj(i -> f.apply(l1.get(i), l2.get(i)))
                .collect(Collectors.toList());
    }
```

# `Java`で`zip`を実装

`zipWith`を使用して`zip`を実装できます。
※残念ながら`Java`にはタプルがないので、以下のコードでは`java.util.AbstractMap.SimpleEntry`で代用しています。

```java:zip
    public static <T, U> List<SimpleEntry<T, U>> zip(List<T> l1, List<U> l2) {
        return zipWith((t, u) -> new SimpleEntry<>(t, u), l1, l2);
    }
```

`zipWith`に渡す関数を`引数を２つ受け取ってタプル(ここではSimpleEntry)を生成する関数`ととらえて、ラムダ式で記述しています。

# 補足
サンプルコードは[GitHub](https://github.com/yonetty/javafunc)にアップしています。
手元にある画像データ(png)を.pbm画像に変換する

opencvでやろうと思っていたけど、
pillowの方が初心者向けっぽいのでまずはそっちでお試し。

``` png_to_pbm.py

#jupyterで表示する場合に有効にする。
#%matplotlib inline

from PIL import Image
import os
import matplotlib.pyplot as plt

file_name = 'piet.png'

#画像ファイル開く
img = Image.open(file_name)

#1bitに変換？の意味？
img_pbm = img.convert('1')
img_pbm.save('piet.pbm')
plt.imshow(img_pbm)

#'L'だとグレースケールになる
#img_pgm = img.convert('L')

#'RGB'だとRGBになる
#img_ppm = img.convert('RGB')


``` 

リサイズしたい場合は以下。

``` png_to_pbm.pyつづき
lf_img_resize = lf_img.resize((512,128))
lf_img_resize.save('lf_img_resize.pbm')
plt.imshow(lf_img_resize)
```
vue-strapを入れたけどエラーが出るときに疑うこと／Failed to resolve directive: el

## 要約
wffranco氏のフォークしたvue2対応版を使うべし
https://github.com/wffranco/vue-strap


## 入れたけどエラーがでる
Vueでアプリケーションを作りはじめ、Bootstrapの機能がVueで使えるVue-strapを使いたくなり入れてみた。
一番検索でヒットして、スター数も多いので「yuche」氏製のvue-strapを入れた
``` console
npm install --save vue-strap
```


動作させたらまともに動かず、めっちゃエラーを吐きまくった
``` chrome devtool
[Vue warn]: Failed to resolve directive: el
```

## 解決法
githubのリポジトリにあるロードマップを見てみるとあまり更新がない様子、、、
ロードマップの下の方にフォークしたリポジトリが記載されているので、それをインストールしたらエラーを一つも吐かなくなった。
``` console
npm install github:wffranco/vue-strap --save
```
[Swift]ポインタを引数に持つC言語の関数

<p>先日の『BUKURO.swift x AKIBA.swift 合同勉強会』で説明したコードは、withUnsafeMutablePointer(to:_:) の使用方法に間違いがあった。正しい記述内容が分かったので発表する。</p>

<p>withUnsafeMutablePointer(to:_:) は、ポインタを引数に持つC言語の関数をSwiftで利用するt目の総称型関数だ。</p>

<pre><code>func withUnsafeMutablePointer<T, Result>(to arg: inout T, _ body: (UnsafeMutablePointer<T>) throws -> Result) rethrows -> Result
</code></pre>

<p>正しい記述内容は、以下のとおり。</p>

<pre><code>var valueQueryResult: AnyObject?
result = withUnsafeMutablePointer(to: &valueQueryResult) {
    SecItemCopyMatching(valueQuery as CFDictionary, UnsafeMutablePointer($0))
}
</code></pre>

<p>渡したい変数valueQueryResultの型は、AnyObject? 。</p>

<p>withUnsafeMutablePointer()の引数toにポインタを渡す。</p>

<p>C言語の関数はクロージャ内で呼び出す。</p>

<p>この関数の戻り値は、クロージャの返した値を返す。クロージャ内のコードが式１つならその値を戻り値として返すので、SecItemCopyMatching() の戻り値は、resultに設定される。</p>

<p>ここを理解していなくて間違えていた。</p>

ソースコード
GitHubからどうぞ。<br />
<a href="https://github.com/murakami/workbook/tree/master/ios/Identifier">https://github.com/murakami/workbook/tree/master/ios/Identifier</a> - GitHub<br />

関連情報
<a href="https://classmethod.connpass.com/event/56018/">BUKURO.swift x AKIBA.swift 合同勉強会</a><br />
<a href="https://cocoa-study.connpass.com">Cocoa Study 池袋 (connpass)</a><br />
<a href="https://connpass.com/series/499/">Cocoa勉強会 関東 (connpass)</a><br />
<a href="https://atnd.org/groups/cocoa-study">Cocoa Study (ATND)</a><br />
<a href="https://mosa.connpass.com">BUKURO.swift (connpass)</a><br />

【Cocoa練習帳】
<a href="http://www.bitz.co.jp/weblog/">http://www.bitz.co.jp/weblog/</a><br />
<a href="http://ameblo.jp/bitz/">http://ameblo.jp/bitz/</a>（ミラー・サイト）<br />
<a href="https://t.co/6P3h2jtbRk</a>note<br />
一つのform_forで複数のテーブルに保存！！

# 概要
- スキルアップのため、レシピ投稿サイトを作っていました(cookpadのようなもの)。
- 一つのレシピにつき、複数の写真を投稿できるようにしたかった。
- 以下の記事を参考に、form_for + fields_forで、recipeレコードが保存されると、それに関連したimageレコードも保存されるようにした。
 
[複数のレコードを作成する。modelの関係性によって異なるform_for / fields_forの使い方](http://qiita.com/ftyabu/items/cae912b211e985d74d58)
[Rails 複数の子レコードの作成・更新を自在に扱う (accepts_nested_attributes_for)](http://qiita.com/shizuma/items/5bfcf6c1e855b959e135)
[Railsで階層化された複数モデルに対応するフォームの作り方](http://jetglass.hatenablog.jp/entry/2015/04/15/165236)

## 上記サイトのコピーで、書いたコード
- コントローラー

```recipes_controller.rb
class RecipesController < ApplicationController
  def new
    @recipe = Recipe.new
    @recipe.images.build
  end

  def create
    recipe = current_user.recipes.new(recipe_params)
    recipe.save
    redirect_to root_path
  end

  private

  def recipe_params
    params.require(:recipe).permit(:name, images_attributes: [:image])
  end

end
```
- ビュー

```new.html.erb
<%= form_for @recipe do |f|  %>
  <%= f.text_field :name %>
  <%= f.fields_for :images do |i| %>
    <%= i.file_field :image %>
  <% end %>
  <%= f.submit "Save",name:"commit" %>
<% end %>

```
- imageモデル

```image.rb
class Image < ApplicationRecord
  belongs_to :recipe
end
```
- recipeモデル

```recipe.rb
class Recipe < ApplicationRecord
  belongs_to :user
  has_many :images
  accepts_nested_attributes_for :images
end
```
## しかし、これだと保存されない！！
- 結論から言うと、imageモデルの記述を、belongs_to :recipe,optional: trueにすると無事に保存されました！！
- なぜ、optional: trueがないと、ダメかと言うと、rails5から、belongs_toに対して、required:trueがデフォルトで設定されているからみたいです。

## required:trueとは
- （私の理解が正しければ）値がnilだと保存されないよ！というものです。
- つまり、imageモデルにはbelongs_to :recipeしか書いてなくとも、実際はbelongs_to :recipe,required:trueとなっているということです。

## rails5はデフォルトでは、外部キー（hoge_id）のnilは許させない！！
- DBに保存されるまでは、idはnilなので、つまり、imageモデルでの時点では、recipe_id（imageレコードの外部キー）はnilなので、
required:trueのバリデーションに引っかかり、保存されなかったということみたいです！！

## optional: trueはrequired:trueを無効化する！！
- これで無事に保存されました！！
Tips : [R] 塩基配列のCG%を算出する


　塩基配列のCG%を算出の仕方をご紹介します。



　塩基配列内の文字の割合はBiostringsパッケージの```letterFrequency()```で算出することができます。

```r:文字の割合を算出（例１）
letterFrequency([塩基配列],letters="[カウントしたい文字]",as.prob=T)
```

　ただし、上の[塩基配列]はDNAStringオブジェクトである必要があります。
　なので文字列で[塩基配列]を入力する場合は

```r:文字の割合を算出（例２）
letterFrequency(DNAString(x="[塩基配列]"),letters="[カウントしたい文字]",as.prob=T)
```

　としましょう。

　以上をふまえてCG%を算出するスクリプトは以下のようになります。

```r:CG%算出
#環境構築
>library(BiocInstaller)
>biocLite("Biostrings")
>library(Biostrings)
#CG%算出
>letterFrequency(DNAString(x="ATCGCGTAATCG"),letters="CG",as.prob=T)*100
```

　出力

```r
C|G 
 50
```

　すんなりできました。

　別にこの方法を使わなくても標準の関数で算出は可能です。
　が、Rは文字列操作周りが若干不便に思うのでこういうのがあると便利です。

　以上です。ありがとうございました。
rbenv,rbenv-gemsetのコマンド覚え書き

#rbenvのコマンド（正確にはrbenv-build）
インストール可能なrubyのバージョン一覧を取得

```
$ rbenv install -l
```

rubyをインストール

```
$ rbenv install <version>
```
インストールされている全てのrubyのバージョンを確認

```
$ rbenv versions
```
現在のrubyのバージョンを確認

```
$ rbenv version
```
rubyのバージョンを切り替える

```
$ rbenv global <version>
```
バージョン切り替えをカレントディレクトリにのみ適用

```
$ rbenv local <version>
```
rubyをアンインストール

```
$ rbenv uninstall <version>
```



#rbenv-gemsetのコマンド
新しくgemsetを作成

```
$ rbenv gemset create <version> <name>
```
存在するgemsetの一覧を表示

```
rbenv gemset list
```
指定したgemsetを有効にする

```
$ echo > .rbenv-gemsets <version> <name>
```
現在有効になっているgemsetを確認する

```
$ rbenv gemset activate
```
gemsetの削除

```
$ rbenv gemset delete <version> <name> 
```
有効になっているgemsetにインストールされているパッケージの一覧

```
$ gem list
```
パッケージをインストール

```
$ gem install <package>
```
Cloudflareを利用して運用しているWordPressのSSL化

wpxサーバーにおいて、Cloudflareを利用して運用しているWordPressのSSL化を下記のURLに書かれている手順で設定を行った際、
https://www.wpx.ne.jp/cloud/manual/wordpress_setting_full_ssl.php
全てのページがリダイレクトループ(too many redirects)になってしまいました。

その場合の下記の手順1と2を行う必要があります。

手順1. wp-config.phpの一番最初に追記します。

```
// Cloudflare対策
if ( ! empty( $_SERVER['HTTP_X_FORWARDED_PROTO'] ) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https' ) {
    $_SERVER['HTTPS']='on';
}
```

手順2. Cloudflareの管理メニューのCrypto設定ページのSSL設定で
「Full」を選択します。
![cloudflare.png](https://qiita-image-store.s3.amazonaws.com/0/19382/e08e7a46-909b-1df9-0967-abdf469e4357.png)


※参考サイト
https://1design.jp/web-development/1873
【リンク切れ】テスト用のWindows10の仮想環境（寿命90日）の作成と日本語化

追記1
====

2023-05-01時点で、試用版 Windows10 のページの URL はリンク切れになってしまっているようです。新ページは未確認です（Windows11 への移行を促すため、削除されたのかもしれません）

追記2
====

Windows11 のイメージが公開されていました (2024-07-06)

+ [Download a Windows virtual machine - Windows app development | Microsoft Developer](https://developer.microsoft.com/en-us/windows/downloads/virtual-machines/)
+ (参考リンク)
    + [Microsoft、「Windows 11」ベースの開発者向け仮想マシンを無償公開 - 窓の杜](https://forest.watch.impress.co.jp/docs/news/1367913.html) (2021-11-19)
    + [Microsoftが無償提供するWindows 11仮想マシン、「VMware」「Parallels」向けが中止 - 窓の杜](https://forest.watch.impress.co.jp/docs/news/1605627.html) (2024-07-04)
    + [VirtualBox 7.0 に Windows11 をインストール #仮想環境 - Qiita](https://qiita.com/ekzemplaro/items/9b0f20bd3fda96ffe455) (2022-10-16)

（１）90日限定の試用版 Windows10 をダウンロード
===============================

* 【リンク切れ】~~https://developer.microsoft.com/en-us/microsoft-edge/tools/vms/~~

OVAイメージ(4GB)をダウンロードできる。
このイメージは一度立ち上がると、90日後に使えなくなるが、立ち上げる前の状態のスナップショットに戻せば、何回でも使える（らしい：未検証）。
ただ、WindowsUpdate の手間暇を考えると、都度、ダウンロードしなおした方がよいかもしれない。

（２）VirtualBox をダウンロード＆インストール
============================

* https://www.virtualbox.org/wiki/Downloads

わたしの環境では VirtualBox が「インストーラー サービスにアクセスできませんでした」というエラーが発生して、インストールが止まってしまった。この場合の対処法は Microsoft のサポートサイトに記載されている。

* [Windows 7 または Windows Vista でプログラムをインストールしようとすると、"Windows インストーラー サービスにアクセスできませんでした" エラーが発生する](https://support.microsoft.com/ja-jp/help/2642495/-the-windows-installer-service-could-not-be-accessed-error-when-you-try-to-install-a-program-in-windows-7-or-windows-vista)

（３）VirtualBox の起動＆イメージをスナップショット
=============================

1. VirtualBox を起動 → ファイル(F) → 仮想アプライアンスのインポートより、OVFイメージをインポート
2. 「MS Edge - Win10_preview」というマシンが出来るので、スナップショット(S)→ 📷 カメラアイコン(Ctrl-Shift-S)で、スナップショットを取る

（４）イメージの起動と WindowsUpdate
========================

1. VirtualBox をインストールした後、一度もホストOSをリブートしていない場合は、一度リブートする（これをしないとゲスト起動が失敗する）
2. ゲストの「MS Edge - Win10_preview」を起動する
3. ユーザは自動ログインされる。壁紙に全情報が書いてある
    * ユーザ名「IEUser」
    * パスワードは「Passw0rd!」
        * 最初のPは大文字、途中の0は数字のゼロ、末尾には感嘆符がついている
4. とりあえず、WindowsUpdate しよう
     * ネットワークがオフラインになっているというエラーがでることがある。
    実際にネットワークの設定が出来ていない場合もあれば、起動直後だからまだネットワークのサービスが起動しきっていないだけのこともある。
    一度くらいためしに「リトライ」してみよう。
5. 待つ（すごい時間かかる）

***＜このあたりでスナップショットを取っておいた方がよいと思われる＞***

（５）日本語化
=========

1.  「Setting」
    * →「Time and language」
    * →「Date & Time」
    * → Time Zone を「(UTC+9:00) Osaka, Sapporo Tokyo」にする
2. 「Region & language」
    * Countory & region」を「Japan」
    * 「Language」で「Add a language」「日本語」
    * 「日本語」をクリック
        * 「Set Default」
        * 「Language Options」→「Download」
        * 「Hardware keyboard layout」→「Change layout」→「Japanese keyboard(106/109 keys)」& Sign out

（６）コマンドプロンプトのchcp 932 対応
=========================

* 「Windowsアイコン」を右クリック 
* →「コントロールパネル（P）」
* →「時計・言語・および地域」
* →「日付、時刻、または数値の形式の変更」
* →「管理」タブ
* →「Unicode対応ではないプログラムの言語」
* →「システムのロケールの変更」
* →「日本語（日本）」
* →「今すぐ再起動」

***＜ここまでが結構な手間なのでスナップショットを取っておいた方がよいと思われる＞***

以上 （http://zetamatta.hatenablog.com/entry/2017/05/28/233643 より転載）
[Practical BEAR.Sunday] リソース単位でレンダラーを変更する方法

## はじめに

リソースは表現（Representation）のためのリソースレンダラーを持っています。
文字列評価されるとリソースはリソースレンダラーに表現されてレスポンスになります(文末[※1])。

通常はアプリケーションコンテキスト([※2]) の単位でデフォルトのレンダラーを選びますが（例：`app` コンテキストでは `JSONレンダラー`を使う、など）、リソース単位でレンダラーを変更することもできます。

たとえば [oEmbed](http://oembed.com/) のような埋め込みHTMLを返すWebAPIを開発しているとしたら、JSONレスポンスの一部の値だけはHTMLテンプレートで返したいというケースもあるでしょう。

## リソース単位でレンダラーを変更する

単純な例で考えます。APIで下記のJSONレスポンスを返したいとします。

```
{"html":"<html><h1>this is embed. bar<\/h1><\/html>"}
```

デフォルトのままでは下記のようにすべてがJSONになってしまいます。

![スクリーンショット 2017-05-28 18.14.39.png](https://qiita-image-store.s3.amazonaws.com/0/15295/f59a8598-134f-8541-882d-9d3adfc6c583.png)

"html" キーの値だけTwigテンプレートでレンダリングされたHTMLビューに変えます。

### サンプルプロジェクト

[kumamidori/ExampleChangeRenderer](https://github.com/kumamidori/ExampleChangeRenderer)

### クラス図

![renderer.png](https://qiita-image-store.s3.amazonaws.com/0/15295/707167ed-a5a8-2ba8-ddfe-292c19e0e7b7.png)

### 実装

#### 埋め込みHTMLリソースの `RenderInterface`  (名前 "html") に `TwigRenderer` をバインド

```php
class Embed extends ResourceObject
{
    /**
     * @Inject
     * @Named("html")
     */
    public function setRenderer(RenderInterface $renderer)
    {
        return parent::setRenderer($renderer);
    }

    public function onGet()
    {
        //・・・
    }
}
```

#### APIリソースで埋め込みHTMLリソースを文字列評価

```php
namespace Kumamidori\ExampleChangeRenderer\Resource\Page\Api;

//・・・
class Example extends ResourceObject
{
    //・・・
    public function onGet()
    {
        $embed = $this->resource->get->uri('page://self/embed')->eager->request();
        $this['html'] = (string) $embed; // ＜ 文字列評価する

        return $this;
    }
}
```

## 補足： レンダラーによる文字列評価のタイミングの違い

- (string) 評価をすればレンダラーでレンダリングされる
- (string) 評価をしない場合に、TwigRenderer と JsonRenderer で評価が異なる
- TwigRenderer の場合：
各要素を文字列評価しようとするので `__toString()` が呼ばれてそれぞれインジェクトされたレンダラーでレンダリングされる
- JsonRenderer の場合： JsonSerializable インターフェイスで実装されたjsonSerializeメソッドが呼ばれてJSONになるので明示的に (string) で文字列評価しなければならない（ref. https://github.com/bearsunday/BEAR.Resource/blob/1.x/src/ResourceObject.php#L207） ([※3])


## おわりに

- 当初自分では分からなくて BEAR の Issue / gitter で教えて頂きました。ありがとうございます。

## 参照リンク

- [※1] [リソース指向パターン - BEAR 公式マニュアル](http://bearsunday.github.io/manuals/1.0/ja/)
- [※2] [アプリケーション - BEAR 公式マニュアル](http://bearsunday.github.io/manuals/1.0/ja/application.html)
- [※3] [Gitter - BEAR.Sunday](https://gitter.im/bearsunday/BEAR.Sunday?at=590012ca12d24099359ba37a)
- [アプリケーションコンテキスト - Qiita](http://qiita.com/koriym/items/d8d14682ce0a542c3b42) 
- [リクエストとトランスファー -Qiita](http://qiita.com/koriym/items/6f485a16ccb7af4114f6)
- [Issue \#104](https://github.com/bearsunday/BEAR.Sunday/issues/104)
- [polidog/Polidog\.Todo](https://github.com/polidog/Polidog.Todo) （テスト実装やCI設定を参照させて頂きました。Thanks!）

## 関連リンク

- [BEAR\.Sundayで任意のPageリソースでJSON形式のレスポンスを返す (by kawanamiyuu)](http://qiita.com/kawanamiyuu/items/3f8d569175cc63c9d9cd)
Ruby on RailsでProtocol Buffersを使う

# RailsでProtocol Buffersを使用する
RailsでProtocol Buffersを使用するのに結構ハマったのでメモ

## 準備
rprotocコマンドのため、インストール
```gem install ruby_protobuf```

railsにインストールするため、Gemfileに以下を記述する
```gem 'ruby_protobuf'```

Gemfileの中身をインストール
```bundle install```

## ProtocolBuffersをRubyに変換する
```protobuf:key_value.proto
message KeyValue {
	required string key = 1;
	optional string value = 2;
}
```
以下を実行してprotoファイルをRubyのコードに変換する
```rprotoc key_value.proto```

すると以下のようなファイルが作られるのでapp/modelsの中に配置する

```rb:key_value.pb.rb
### Generated by rprotoc. DO NOT EDIT!
### <proto file: key_value.proto>
# message KeyValue {
#       required string key = 1;
#       optional string value = 2;
# }
require 'protobuf/message/message'
require 'protobuf/message/enum'
require 'protobuf/message/service'
require 'protobuf/message/extend'

class KeyValue < ::Protobuf::Message
  defined_in __FILE__
  required :string, :key, 1
  optional :string, :value, 2
```

## 実際に使ってみる
```rb:sample.rb
require "key_value.pb"

# Railsならこのようにクラスの初期値が可
kv1 = KeyValue.new(key: "key1", value: "val1")

# serialize
kvstr = kv1.serialize_to_string

# deserialize
kv2 = KeyValue.new.parse_from_string(kvstr)

puts kv2[:key]
# => key1

# Protocol Buffersで使えるメソッド
puts KeyValue.new.methods
# => [:value, :key, :value=, :key=, :==, :[], :[]=, :inspect, :to_hash, :to_s, :clone, :dup, :initialized?, :fields, :clear!, :has_field?, :serialize_to_string, :parse_from_string, :get_field, :get_field_by_tag, :get_field_by_name, :each_field, :parse_from, :parse_from_file, :serialize_to, :serialize_to_file, :merge_from, :to_json, :`, :to_yaml, :to_yaml_properties, :blank?, :present?, :presence, :psych_to_yaml, :as_json, :acts_like?, :to_param, :to_query, :deep_dup, :duplicable?, :in?, :presence_in, :instance_values, :instance_variable_names, :with_options, :html_safe?, :pretty_print, :pretty_print_cycle, :pretty_print_instance_variables, :pretty_print_inspect, :require_dependency, :unloadable, :require_or_load, :load_dependency, :try, :try!, :instance_of?, :kind_of?, :is_a?, :tap, :public_send, :singleton_method, :class_eval, :remove_instance_variable, :define_singleton_method, :method, :public_method, :instance_variable_set, :extend, :to_enum, :enum_for, :gem, :<=>, :===, :=~, :!~, :pretty_inspect, :eql?, :respond_to?, :freeze, :object_id, :send, :display, :byebug, :debugger, :suppress_warnings, :nil?, :hash, :class, :singleton_class, :itself, :taint, :tainted?, :untaint, :untrust, :untrusted?, :trust, :frozen?, :methods, :singleton_methods, :protected_methods, :private_methods, :public_methods, :instance_variable_get, :instance_variables, :instance_variable_defined?, :!, :!=, :__send__, :equal?, :instance_eval, :instance_exec, :__id__]
```
ThermoMSの.rawファイルをC#でこじ開ける方法

#ThermoMSの.rawファイルをC#でこじ開ける方法
###日本語での解説が無かったので備忘録的に使用

[Bioinformatics for Proteomic Mass Spectrometry 生物資訊於蛋白質體的質譜資料分析](
http://bioinfo.kouwua.net/2012/09/read-thermo-raw-with-msfilereader-in-c.html"Read Thermo RAW with MSFIleReader in C#")
を参考に

参照を追加にXrawfi2_x64.dllを追加。
やり方は参照ページのが詳しい。

ファイルをフォームにD&Dで名前取得するようにあらかじめ指定しておいてから使っていた。


```
        private void textBox1_DragDrop(object sender, DragEventArgs e)
        {
            MSFileReader_XRawfile rawfile = new MSFileReader_XRawfile();

            string[] fileName = (string[])e.Data.GetData(DataFormats.FileDrop, false);

            rawfile.Open(fileName[0]);
            rawfile.SetCurrentController(0, 1);

            int totalscannum = 0;
            double lowmass = 0;
            double highmass = 0;
            double massresolution = 0;

            string MSname = null;
            string MSmodel = null;


            rawfile.GetNumSpectra(ref totalscannum);
            rawfile.GetLowMass(ref lowmass);
            rawfile.GetHighMass(ref highmass);
            rawfile.GetMassResolution(ref massresolution);

            rawfile.GetInstModel(ref MSname);
            rawfile.GetInstName(ref MSmodel);

            double ProfilePeakWidth = 0.0;
            object MassList = null;
            object PeakFlags = null;
            int ArraySize = 0;
            int ArraySize2 = 0;

            object MassList2 = null;

            Series mz = new Series();
            Series mz2 = new Series();
            Series chart = new Series();



            rawfile.GetMassListFromScanNum(1, null, 1, 0, 0, 0, ref ProfilePeakWidth,
            ref MassList, ref PeakFlags, ref ArraySize);

            double[,] mslist = (double[,])MassList;
            int prescan = mslist.GetLength(0);

            double[, ,] array3d = new double[totalscannum, 2, mslist.GetLength(1)];

            for (int d1 = 1; d1 < totalscannum; d1++)
            {
                for (int d2 = 1; d2 < mslist.GetLength(1); d2++)
                {
                    long d3 = d2 - 1;

                    rawfile.GetMassListFromScanNum(d1, null, 1, 0, 0, 0, ref ProfilePeakWidth,
                    ref MassList2, ref PeakFlags, ref ArraySize2);

                    double[,] mslist2 = (double[,])MassList2;

                    array3d[d1, 0, d2] = mslist2[0, d3];
                    array3d[d1, 1, d2] = mslist2[1, d3];

                }
            }

        }
```

確かこんな感じで動いたはず。
ものすごく無駄が多い配列の初期化をしているけど、いずれよくなったらなあと。
ウイルス対策ソフトの動作確認をしたいときのテストウイルスファイル

# ウイルステストファイル

ウイルス対策ソフトをインストールしたけど、実際にウイルスを発見した時にどんな動きになるか確認したいことがありますよね。
怪しいサイトで本物のウイルスを拾ってくるなんてことは危険すぎるのでやめましょう。
そんなときは、「EICARテストファイル」というものを使います。
これは、どのウイルス対策ソフトでも共通してウイルスと認識されるファイルで、実際にはウイルスではないので安心して動作を試せます。

# EICARテストファイルの作り方
このEICARテストファイルの作り方は、テキストエディタなどで以下の文字列を拡張子を『```.com```』にして保存する。それだけです。

```EICARテストファイル.com
X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*
```

# 動作例
AVASTの場合はこんな感じになります
![2017-05-28_23h17_28.png](https://qiita-image-store.s3.amazonaws.com/0/181737/585b4d33-4d9d-4b63-decb-25662aa465aa.png)