OmniAICreator/Qiita-1.07M huggingface dataset:
C > I/Oの時間制御 > P1,P2,P3,P4 / P1x2,P3x2 / P1x4

```txt:
組込みC (ライブラリは極力使わない)
```

## 仕様

- Case A, B, Cのいずれかの設定で動かす。
- ポート1..4がある。
- 全制御時間(単位:分)`Ttotal_min`は4の倍数とする。

それぞれのCaseに基づき、オープンするポートを制御する。

- Case A (Ttotal_minの1/4ずつ)
  - P1, P2, P3, P4
- Case B (Ttotal_minの1/2ずつ)
  - P1, P3
- Case C (Ttotal_minの全時間)
  - P1

## code

以下のように実装した。
エラー処理は省略している。

http://ideone.com/BkufAI

```.c
#include <stdio.h>

/*
port controller
*/

#define NUM_PORT_LIST (4)
static int s_portList[NUM_PORT_LIST];

enum {
	IDX_CASE_A = 0,
	IDX_CASE_B,
	IDX_CASE_C,
};
enum {
	PORT_1 = 0,
	PORT_2,
	PORT_3,
	PORT_4,
};

void SetPortElement(int p1, int p2, int p3, int p4, int *dstPtr)
{
	if (dstPtr == NULL) {
		return;
	}
	dstPtr[0] = p1;
	dstPtr[1] = p2;
	dstPtr[2] = p3;
	dstPtr[3] = p4;
}

void SetPortOnCase(int aCase, int *dstPtr)
{
	switch(aCase) {
	case IDX_CASE_A:
		SetPortElement(PORT_1, PORT_2, PORT_3, PORT_4, dstPtr);
		break;
	case IDX_CASE_B:
		SetPortElement(PORT_1, PORT_1, PORT_3, PORT_3, dstPtr);
		break;
	case IDX_CASE_C:
		SetPortElement(PORT_1, PORT_1, PORT_1, PORT_1, dstPtr);
		break;
	}
}

void FuncSetup(void)
{
	int idx;
	
	// set open list
	SetPortOnCase(IDX_CASE_A, &s_portList[0]);
//	SetPortOnCase(IDX_CASE_B, &s_portList[0]);
//	SetPortOnCase(IDX_CASE_C, &s_portList[0]);

#if 0 // debug print
	for(idx=0; idx < NUM_PORT_LIST; idx++) {
		printf("%d:%d\n", idx, s_portList[idx]);		
	} 
#endif	
}

int getListIndex(int elapsed_sec, int Ttotal_min)
{
	int idx;
	idx = elapsed_sec * NUM_PORT_LIST / (Ttotal_min * 60); //
	return idx;
}

void FuncExecute(int Ttotal_min)
{
	int idx;
	int elapsed_sec = 0;
	int curPort;
	int lstidx;

	// open ports in turn
	elapsed_sec = 0;
	while(1) {
		lstidx = getListIndex(elapsed_sec, Ttotal_min);
		curPort = s_portList[lstidx];
		printf("%d:%d - %d\n", elapsed_sec, lstidx, curPort);
		elapsed_sec += 10; // every 10 sec
		if (elapsed_sec >= (Ttotal_min * 60)) {
			break;
		}
	}
}

int main(void) {
	FuncSetup();
	FuncExecute(/* Ttotal_min=*/4); // use integral multiple of 4
	
	// Dummy: Close all Port
	
	return 0;
}
```

## 結果

### Case A選択時 (1/4ずつ)

```txt
Success	time: 0 memory: 2160 signal:0
0:0 - 0
10:0 - 0
20:0 - 0
30:0 - 0
40:0 - 0
50:0 - 0
60:1 - 1
70:1 - 1
80:1 - 1
90:1 - 1
100:1 - 1
110:1 - 1
120:2 - 2
130:2 - 2
140:2 - 2
150:2 - 2
160:2 - 2
170:2 - 2
180:3 - 3
190:3 - 3
200:3 - 3
210:3 - 3
220:3 - 3
230:3 - 3
```

### Case B選択時 (1/2ずつ)

```txt
Success	time: 0 memory: 2156 signal:0
0:0 - 0
10:0 - 0
20:0 - 0
30:0 - 0
40:0 - 0
50:0 - 0
60:1 - 0
70:1 - 0
80:1 - 0
90:1 - 0
100:1 - 0
110:1 - 0
120:2 - 2
130:2 - 2
140:2 - 2
150:2 - 2
160:2 - 2
170:2 - 2
180:3 - 2
190:3 - 2
200:3 - 2
210:3 - 2
220:3 - 2
230:3 - 2
```

### Case C選択時 (全時間)

```txt
Success	time: 0 memory: 2112 signal:0
0:0 - 0
10:0 - 0
20:0 - 0
30:0 - 0
40:0 - 0
50:0 - 0
60:1 - 0
70:1 - 0
80:1 - 0
90:1 - 0
100:1 - 0
110:1 - 0
120:2 - 0
130:2 - 0
140:2 - 0
150:2 - 0
160:2 - 0
170:2 - 0
180:3 - 0
190:3 - 0
200:3 - 0
210:3 - 0
220:3 - 0
230:3 - 0
```

とりあえず希望した動作にはなった。
これをたたき台としてブラッシュアップする。
arduinoでtimer5 その２

#概要
arduino megaで、一秒後１、二秒後２をやりたかった。
#写真
![ctc2.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/adbbb57c-d685-e647-d64f-959d402d9616.jpeg)

#サンプルコード
```
volatile int sec1 = 0;
ISR(TIMER3_COMPA_vect)
{
	sec1++;
}
ISR(TIMER3_COMPB_vect)
{
	sec1++;
}
void setup()
{
	Serial.begin(115200);
	TCCR3A = 0;
	TCCR3B = 0;
	TCCR3B |= (1 << CS32) | (1 << CS30);
	TCNT3 = 0;
	OCR3A = 15624;
	OCR3B = 31249;
	TIMSK3 = 0;
	TIMSK3 |= (1 << OCIE3A);
	TIMSK3 |= (1 << OCIE3B);
}
void loop()
{
	int a1;
	long b;
	a1 = sec1;
	b = millis();
	Serial.print(a1);
	Serial.print("\t");
	Serial.println(b);
	delay(250);
}
```
【AccessVBA】便利なコード・よくつかうコードまとめ

AccessVBAの便利なコード・よくつかうコードをまとめました。

ファイルを開くもの、SQL、その他細かいものがあります。
よく使うので備忘にもどうぞ。

###●ファイルを開く系
```vbnet:Access
'フォームを開く
DoCmd.OpenForm "F_Form", WindowMode:=acDialog

'テーブルを開く
DoCmd.OpenTable "T_Table", acViewNormal

'レポート開く
DoCmd.OpenReport "R_Report", acPreview,

'Excelを開く
'oApp:AccessからExcelを参照する変数
Dim oApp As Object
Set oApp = CreateObject("Excel.Application")
oApp.Visible = True
'Only XL 97 supports UserControl Property
oApp.UserControl = True
oApp.Workbooks.Open FileName:="xxx\zzz.xlsm"

'PDFを開く
PathName = CurrentProject.Path & "xxx\zzz.pdf"
Application.FollowHyperlink PathName
```
###●SQL文

```vbnet:AccessVBA
'INSERT
DoCmd.RunSQL "INSERT INTO T_Table SELECT * FROM T_xxx"

'UPDATE
DoCmd.RunSQL "UPDATE T_Table SET zzz = 'yyy' WHERE vvv = 'xxx'"

'DELETE
DoCmd.RunSQL "DELETE * FROM T_Table WHERE vvv LIKE 'yyy'"
```

###●細かいの

```vbnet:AccessVBA
'画面の描画を行わない
Application.Echo False

'ワーニング表示をしない
DoCmd.SetWarnings False

'再クエリ
Me.Requery

'更新
Me.Refresh

'再計算
Me.Recalc

'昇順並べ替え
Me.OrderBy = "xxx"
Me.OrderByOn = True

'指定のコントロールへカーソルを戻す
DoCmd.GoToControl ("xxx")

'コンボボックスにテーブルの値を設定
Forms.F_Form.コンボn.Value = DLookup("team", "T_Table", "num = 'zzz'")

'Import
DoCmd.TransferText acImportDelim, , "T_Table", CurrentProject.Path & "vvv\xxx.csv"
```

これ以外にも、オススメのものがあれば、コメントください。
[短文][Python]リストや辞書などを整形してprint

今日知ったけど、実は大昔から標準でありました。pprintを使います。 ([Python3.x](http://docs.python.jp/3/library/pprint.html), [Python 2.x](http://docs.python.jp/2/library/pprint.html))
カスタマイズするなら、ドキュメントを読まねばなりませんが、「良きに計らえ」でよければ、これだけで使えます。

```py3
from pprint import pprint

pprint(my_something)
```

例:

```py3:code
import http.client
from pprint import pprint

conn = http.client.HTTPSConnection('python.org')
conn.request('GET', '/')
resp = conn.getresponse()
pprint(resp.getheaders())
```

```py3:stdout
[('Server', 'nginx'),
 ('Date', 'Sat, 28 May 2016 06:51:23 GMT'),
 ('Content-Type', 'text/html'),
 ('Content-Length', '178'),
 ('Location', 'https://www.python.org/'),
 ('Strict-Transport-Security', 'max-age=315360000; preload')]
```

デバッグ用出力などにどうぞ。
aria-level属性でHTML階層構造の整合性を保つ

## HTMLは構造を明示的に書く
HTMLは基本的に構造を明示的に書きます。
構造を明示的に書くことで、Webサイトが持つ意味をコンピュータが理解できるようになる(マシン・リーダビリティーが向上する)からです。
この考え方を**セマンティックWeb**というんですね。
※ざっくり説明でごめんなさい！詳しい説明は[セマンティックWeb - IT用語辞典バイナリ](http://www.sophia-it.com/content/%E3%82%BB%E3%83%9E%E3%83%B3%E3%83%86%E3%82%A3%E3%83%83%E3%82%AFWeb)を見てね。

マシン・リーダビリティーの向上させることによって、結果的にスクリーンリーダーなど支援技術を使うユーザーにも使いやすい**アクセシブル**なサイトを作ることが出来ますし、検索エンジンのクローラーにとっても読みやすいサイトとなるため、**SEO**にも効果があるとされるというわけです。
なんか情報科の授業みたいな感じになってしまいましたが、基本の復習ということで。
![computer_screenreader_shikakusyougai.png](https://qiita-image-store.s3.amazonaws.com/0/119598/1c578cf7-5fbf-9b61-9019-782cc2ac277e.png)

### 見出しタグは階層構造を明確に
本題に入ります。HTMLの見出しタグは`<h1>`から`<h6>`まであります。`<h6>`の下にいきなり`<h1>`を置いたりすることも間違いではないのですが、基本的には`<h1>`の次は`<h2>`、`<h2>`の次は`<h3>`と、階層構造を守って使用するべきです。
> セクションは、任意のランクの見出しを含んでもよく、かつ著者はセクションのネストレベルに適切なランクの見出しを使用するよう強く推奨される。
（ [4.3.10 見出しとセクション - W3C Recommendation 28 October 2014 4.3.10日本語訳](http://momdo.github.io/html5/sections.html#headings-and-sections)）

つまりたとえば`<h3>`は、「真ん中くらいの重要度」とか「中くらいの大きさの見出し」ではなく、「h2の下で、h4の上の階層構造の見出し」と理解したら良いということなんですね。
（[4.3.6 h1、h2、h3、h4、h5、h6要素 - W3C Recommendation 28 October 2014 4.3.10日本語訳](http://momdo.github.io/html5/sections.html#the-h1,-h2,-h3,-h4,-h5,-and-h6-elements)）

### 階層構造が崩れたHTML

```html:html
<h1>タイトル見出し</h1>
<section>
  <h5>小さい文字の見出し</h5>
  <p>本文のテキスト</p>
  <h2>大きい文字の見出し</h2>
  <p>本文のテキスト</p>
</section>
```

しかし見出しタグを見た目の大小を表すために使った結果、上記のような階層構造になってしまうことがあります。
こんな時に、HTML構造も見た目も変えずに階層構造の整合性を保ちアクセシビリティを担保する方法があります。
それが**aria-level属性**を使う方法です。

## aria-level属性
>aria-level属性は段階レベルを指定できるWAI-ARIA属性です。
値には数値を指定でき、ネスト構造、需要度などの段階レベルを指定できます。
([aria-level属性 - HTMLリファレンス](http://www.webcreativepark.net/html/wai-aria/aria-level/))

ちなみにWAI-ARIAとは、Web Accessibility Initiative -Accessible Rich Internet Applicationsの略でウェイアリア(ワイアリアでもいいらしい)と読みます。

```html:html
<h1>タイトル見出し</h1>
<section>
  <h5 aria-level="2">小さい文字の見出し</h5>
  <p>本文のテキスト</p>
  <h2 aria-level="3">大きい文字の見出し</h2>
  <p>本文のテキスト</p>
</section>　　　　
```

このようにaria-level属性を使用すると、マークアップも見た目をも変えることなくコンピューターに階層構造を正しく伝えることができるようになり、アクセシビリティを担保できるようになります!

- [aria-level (property) - WAI-ARIA - W3C](https://www.w3.org/TR/2014/REC-wai-aria-20140320/states_and_properties#aria-level) 
- [aria-level (property) - WAI-ARIA - W3C　日本語訳](https://momdo.github.io/wai-aria/states_and_properties.html#aria-level)

## 所感
今年（2016年）4月より[障害者差別解消法](http://www8.cao.go.jp/shougai/suishin/sabekai/kihonhoushin/honbun.html)が施行され、Webにおいてもアクセシビリティへの合理的配慮が求められることが定められました。また今年はリオオリンピック・パラリンピック開催年。そうしたこともあり、個人的にはWebアクセシビリティについて考えるとても良いきっかけになりました。
業務上では全く必要とされないケースもあるかと思いますが、知識として知っておいて損なしだと思います。
誰にとってもアクセスしやすいサイトを作って行こうとの思いを新たにしました。
form_forタグのsubmitは何をするか

form_forは引数のインスタンスが何も情報を持っていなければ自動的にcreateアクションへ、すでに情報を持っている場合はupdateアクションへ自動的に振り分けてくれます。

`<%= form_for(@like※ここは生成するモデルのインスタンスにする) do |f| %>
  <%=f.number_field :price, placeholder: "この企業に入社できる場合、教育コストをいくら自己負担できますか？" %>
  <%= f.submit "ライク" %>
<% end %>`

この<%= f.submit "ライク" %>は、対応するモデルクラスのLikeが何も情報を持っていなければ自動的にcreateアクションへ、すでに情報を持っている場合はupdateアクションへ自動的に振り分けてくれます。
内蔵・外付けキーボード判定でKarabinerを起動・終了させるAppleScript

自室用にMajestouchを購入したのを機にSeilとKarabinerを導入したけど、
メイン機がMacBookProなので外で作業するときにいちいち上記のソフトを起動終了するのが面倒になったので、さくっとスクリプトを組んだ。
キーボードの製品IDを予めシステムプロファイラから確認して登録しておくだけで起動と終了をスイッチしてくれるやつです。

```applescript:kbchecker.scpt
set keyboard_id to "0x4545"

set KB to missing value
try
	set KB to paragraphs of (do shell script "system_profiler SPUSBDataType -detaillevel mini | grep " & keyboard_id)
end try

set pl to missing value
tell application "System Events"
	-- プロセス取得
	set pl to name of every process
end tell

if KB is equal to missing value then
	-- キーボードがない時はkarabinerとseilを終了
	try
		do shell script "pkill Seil"
		do shell script "pkill Karabiner"
	on error
		display alert "起動していない状態なので終了します。"
		return
	end try
	
	display alert "Quit OK"
	return
else
	tell application "Seil" to run
	tell application "Karabiner" to run
	
	display alert "Launch OK"
	return
end if
```

後はアプリケーションとして保存してDockとログイン時リストに登録しておくだけで、内蔵と外付けとでうまいこと切り替えることが出来ます。


追記：
karabiner終了時にそもそも起動していなかった時の例外処理を入れていなかったので入れました。
特定のラベルのついたGmailを定期的に削除するようにした

Gmailが気がついたら未読2000通になっていて、精神衛生上よろしくないので定期的に削除するようにスクリプトを組んだ。

大まかな部分は[こちらの記事](http://qiita.com/kobaboy/items/bbdc6ceb1904947866d2)を参考にさせていただいた。
ただ、今回削除したい対象のラベルが複数あり、かつラベル毎に保持期間を作りたかったので、スクリプトについては以下のように実装しなおした。

```js
function myFunction() {
  var delayDays = 7;
  
  var targetLabelAndPeriod = {"ラベル1": 7, "ラベル2": 7, "ラベル3": 1};
  for (key in targetLabelAndPeriod) {
    var deleteThreads = GmailApp.search('older_than:'+targetLabelAndPeriod[key]+'d -is:starred label:'+ key);
    
    for (var i = 0; i < deleteThreads.length; i++) {
      deleteThreads[i].moveToTrash();
    }
  }
}
```

削除したい対象のラベル名と保持期間（日）を連想配列に入れ、これをループで回して順次削除するようにした。

注意することは、対象となるメールが多くなりすぎるとスクリプトの起動時間の制限に引っかかってしまう可能性がある。
はじめのうちはスクリプトの定期起動結果の通知をonにしておいて、時間が足りなくなっているようだったらスクリプトを分割しようと思う。
ASP.NET WebForm を VS2019で勉強中

### 開発環境
VS2019 のバージョン
Microsoft Visual Studio Professional 2019
Version 16.8.6

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93227/434656e4-f6dd-49ca-2332-b4b99616cf32.png)

.NET Framework は、4.8
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93227/d3d90f3f-6e21-1d1d-95b8-53a5ea91c25c.png)




### aspx と asp.vb を表示する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93227/2e250a41-f2a7-1899-7a3f-a68cc1bb29ad.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93227/1cba9dd5-8943-32b6-954f-63d48d43f6f5.png)

この表示切替が、わからなかった。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93227/0e85516c-2ccb-a2b5-c6d2-aa4328682bfc.png)

ソリューションエクスプローラーで、［すべてのファイルを表示］をクリックすればよい。

### いろいろなエラーが理解できていない
HTTP Error 500.22 - Internal Server Error
ASP.NET 設定が、統合されたマネージ パイプライン モードで適用されないことが検出されました。

![image](https://qiita-image-store.s3.amazonaws.com/0/93227/0fbe4ff0-3649-c359-3429-96c264afd9c7.png)

このエラーは、［クラックック ASP.NET］を VS2019 の ASP.NET で実行した時のエラーのようです。

https://technet.microsoft.com/ja-jp/library/ff454090.aspx

```web.config
  <system.web>
    <pages>
      <controls>
        <add namespace="Microsoft.Web.UI" assembly="Microsoft.Web.Atlas" tagPrefix="atlas"/>
        <add namespace="Microsoft.Web.UI.Controls" assembly="Microsoft.Web.Atlas" tagPrefix="atlas"/>
      </controls>
    </pages>

    <compilation debug="false">
      <buildProviders>
          <add extension=".asbx" type="Microsoft.Web.Services.BridgeBuildProvider" />
      </buildProviders>
    </compilation>

    <!--
          ASMX is mapped to a new handler so that proxy javascripts can also be served.
    -->
      <!--- ここを削除する
      <httpHandlers>
      <remove verb="*" path="*.asmx"/>
      <add verb="*" path="*.asmx" type="Microsoft.Web.Services.ScriptHandlerFactory" validate="false"/>
      <add verb="*" path="atlasbatchcall.axd" type="Microsoft.Web.Services.MultiRequestHandler" validate="false"/>
      <add verb="*" path="atlasglob.axd" type="Microsoft.Web.Globalization.GlobalizationHandler" validate="false"/>
      <add verb="*" path="*.asbx" type="Microsoft.Web.Services.ScriptHandlerFactory" validate="false"/>
    </httpHandlers>
    <httpModules>
      <add name="ScriptModule" type="Microsoft.Web.Services.ScriptModule"/>
      <add name="BridgeModule" type="Microsoft.Web.Services.BridgeModule"/>
      <add name="WebResourceCompression" type="Microsoft.Web.Services.WebResourceCompressionModule"/>
    </httpModules>
    -->    
  </system.web>
 
```
p5js,ES6でパーティクルを動かしてみる

![スクリーンショット 2016-05-28 14.48.11.png](https://qiita-image-store.s3.amazonaws.com/0/26043/ba477bb0-4fcf-7d72-5cde-ebf311b8534b.png "スクリーンショット 2016-05-28 14.48.11.png")
フロントエンドの環境進化に伴い、ES6 syntaxでもp5.jsを書くことができるようになってきました。パーティクルを動かしてみます。

#準備

##ビルド環境
省略します。それぞれのやり方でES6が書ける環境を構築しましょう :v: :video_game: 

##インストール

```
npm install --save p5
```

##ファイル構成
3つのファイルを同じ階層に配置しています。

```
- sketch.js
- Particle.js
- ParticleSystem.js
```

#実装

##インスタンスモード

インスタンスモードを使います。
[Instantiation Cases · processing/p5.js Wiki](https://github.com/processing/p5.js/wiki/Instantiation-Cases)


##sketch.js

```js:sketch.js
import P5 from "p5";
import ParticleSystem from "./ParticleSystem";

const sketch = (p) => {

  var system;
  
  p.preload = function() {

  }

  p.setup = function() {
    p.createCanvas(p.windowWidth, p.windowHeight);
    p.background(255);

    system = new ParticleSystem();

	//パーティクルの数
    var num = 500;

    for(var i = 0; i < num; i++) {
      var l = p.createVector(p.random(p.windowWidth), p.random(p.windowHeight));

      system.addParticle(p, l);
    }
  }

  p.draw = function() {
    p.background(255);

    system.run();
  }
}

new P5(sketch);

```
##ParticleSystem.js
```js:ParticleSystem.js
import Particle from "./Particle";

export default class ParticleSystem {
  constructor() {
    this.particles = [];
  }

  addParticle(p, location) {
    this.particles.push(new Particle(p, location));
  }

  run() {
    this.particles.forEach((particle) => {
      particle.run();
    })
  }
}
```


##Particle.js

```js:Particle.js
export default class Particle {
  constructor(p, location) {
    var v = 1;

    this.p = p;

    this.acceleration = this.p.createVector(0, 0);
    this.velocity = this.p.createVector(p.random(-v, v), p.random(-v, v));
    this.location = location.copy();

    this.diameter = 5;

    this.wall = {
      top: this.diameter / 2,
      right: this.p.windowWidth - this.diameter / 2,
      bottom: this.p.windowHeight - this.diameter / 2,
      left: this.diameter / 2
    }

  }

  run() {
    this.update();
    this.borders();
    this.display();
  }

  update() {
    this.velocity.add(this.acceleration);
    this.location.add(this.velocity);
  }

  display() {
    this.p.noStroke();
    this.p.fill(0);

    this.p.ellipse(this.location.x, this.location.y, this.diameter, this.diameter);
  }

  //壁の当たり判定
  borders() {
    if (this.location.y < this.wall.top) {
      this.location.y = this.wall.top;
      this.velocity.y *= -1;
    }

    if (this.location.x > this.wall.right) {
      this.location.x = this.wall.right;
      this.velocity.x *= -1;
    }

    if (this.location.y > this.wall.bottom) {
      this.location.y = this.wall.bottom;
      this.velocity.y *= -1;
    }

    if (this.location.x < this.wall.left) {
      this.location.x = this.wall.left;
      this.velocity.x *= -1;
    }
  }
}
```

#所感
constructorにpを渡して,this.pと書くのがダルいような。。。 :innocent: 良い方法があればご教授ください :bow: 

#参考
[The Nature of Code](http://natureofcode.com/book/chapter-4-particle-systems/)
has_manyメソッドに使用できるオプション

多　対　多のアソシエーションを実現できるthroughメソッドはよく使用します。

また、has_manyメソッドには他にも次のようなオプションを指定できます。

オプション名	用途
class_name	関連するモデルのクラス名を指定でき、関連名(photos_tags等、has_manyの直後に書くもの)と参照先のクラス名(PhotosTagのようなモデル名)を異なるものにできる。
foreign_key	参照先を参照する外部キーの名前を指定できる（デフォルトは、参照先のモデル名_id）
dependent	親モデルのデータを消したら関連するモデルのデータも連動して消したいときに使用します。destroyとdelete_allでひとつひとつ消していくか、一気に消すかを指定できる
source	関連テーブルから先のモデルにアクセスするための(関連モデルから見た)関連名を指定できる
※has_many :answered_questions, through: :answers, source: :question
sourceオプションは関連テーブル（answers）から先のモデルにアクセスするための関連名を指定しています。今回はanswersテーブルを通し、questionsテーブルの情報を取得しているので:questionを指定しました。

アソシエーションの名前と関連先テーブルが同じ名前の場合、省略することもできます。今回の場合has_many :questionsというアソシエーション名にしてしまえばsourceオプションを書く必要はありません。しかし、それだと User と Question を紐付ける通常の1対多のアソシエーション定義とかぶってしまうのでanswered_questionという違う名前にしました。

「答えた質問」という意味でより分かりやすいですよね。
SDLのウィンドウプロシージャからSDL_PollEventが呼び出されるまでを解析してみた

OSのメッセージ処理とゲーム実装部分分離についての参考のためにSDLを解析したときのメモを公開します。

# 注意点
昔Blogに書いた記事の転載です。そのため、SDLのバージョンはリビジョン7724（2013/8/31更新とかなり古い）を参考にしているので現状の実装と異なる場合があります。
ウィンドウプロシージャ周りの挙動はWindowsOSを前提としています。

# 対象
基本的なC/C++の知識があること。
OSが介在するプログラミングの知識があること。
基本的なSDL/SDL2のプログラミングの知識があること。

# SDLのポーリング
　SDLではOSが送ってくるウィンドウメッセージをいったんSDL側で全て吸収してSDL独自形式に変換した上で、SDL_PollEvent関数を使用してユーザー側に渡して処理を記述させている。
　そのウィンドウメッセージをどう処理しているのかコードを辿っていきたいと思う。

# ウィンドウプロシージャの実装
　まず、SDLにおけるウィンドウプロシージャの実装はSDL_sysevents.cに定義されているWinMessage内で行われている。
　ここから様々なサブシステムにメッセージを投げて処理をしていると思われるがウィンドウプロシージャ側から辿るのが難しそう（分岐が多くて面倒くさそう）なので逆方向からアプローチを行う。

# SDL_PollEventを呼び出しているのは？
　ユーザーがイベントを取得するSDL_PollEvent側から辿ってみる。SDL_PollEvent(正確にはSDL_PeepEvent)で使用するSDL_EventQ(イベントキュー)はグローバルメンバ変数で、SDL_events.cに次のように定義されている

```cpp:SDL_events.c
/* Private data -- event queue */
#define MAXEVENTS 128

static struct {
SDL_mutex *lock;
int active;
int head;
int tail;
SDL_Event event[MAXEVENTS];
int wmmsg_next;
struct SDL_SysWMmsg wmmsg[MAXEVENTS];
} SDL_EventQ;
```

　構造体の仕様から、SDLの内部処理でeventメンバに対して随時ウィンドウメッセージを処理したイベントを追加されることが予想される。では、実際にどこでイベントが追加されるかというとSDL_AddEvent内で処理される。

　ここまでの流れを簡単に整理するとWinMessage(ウィンドウプロシージャ）-> [SDL入力処理？] -> SDL_AddEvent -> SDL_PollEventの順に処理されることでメッセージをやり取りするのではないかと推測できる。

# イベントキューの実装
　次はSDL_AddEventをだれが呼び出しているかについて調べていきたい。
　ここから多少処理の分岐が複雑になって理解が難しくなるので注意されたし。
　SDL_AddEventを呼び出している処理はSDL_PollEvent内でも呼び出しているSDL_PeepEventsによって追加処理も行われる。
　これはSDL_PeepEventsと引数であるSDL_eventactionが次のような定義になっている。

```c++
int SDL_PeepEvents(SDL_Event *events, int numevents, SDL_eventaction action,
Uint32 mask)

// SDL_eventactionの定義
typedef enum {
SDL_ADDEVENT,
SDL_PEEKEVENT,
SDL_GETEVENT
} SDL_eventaction;
```

　定義を見るとSDL_ADDEVNETを渡せばイベントキューにイベントを登録するし、それ以外であればSDL_Event*型メンバ引数にイベントを取得する処理になるであろう仕様が推測できる。
　では、さらに辿ってSDL_PeepEventに対してSDL_ADDEVENTを渡している処理を追ってみる。するとSDL_PeepEventをさらにラップしているSDL_PushEventを経由して多岐にわたるソースコードからイベントが登録されている。
　SDL_PushEventを使用してイベントを登録しているサブシステムは以下の通り。

 * sdl_mouse.c
 * sdl_keyboard.c
 * sdl_joystick.c
 * sdl_events.c
 * sdl_resize.c
 * sdl_quit.c
 * sdl_expose.c
 * sdl_active.c

　かなり分岐が多いので説明は省くがsdl_mouse、sdl_keyboardやsdl_joystick等入力処理からの登録がほとんどである。
　これを集約してさらに元をたどるとWinMessageに行き当たる。
　処理の流れをまとめるとWinMessage(ウィンドウプロシージャ）-> 上記サブシステム群 -> SDL_AddEvent -> SDL_PollEventとなる。

　以上でSDLがウィンドウプロシージャからのメッセージをどの様にユーザーに提供しているのか大まかに把握できた。
『改訂３版 基礎Ruby on Rails』を読んだので感想を書き留めました

#改訂３版 基礎Ruby on Rails
最近は『改訂３版 基礎Ruby on Rails』を読み終わったので自分の感想を書いときます。
事前にHTML, CSS, JavascriptやRubyの知識は少しありました。

モックアプリケーションを作りながらRailsの仕組みを勉強するための本です。
第２章ではRuby言語の勉強もするけど、特にHTMLの知識がないと困ります。
Railsスタンダードのsqlite3も中心に使うのでデータベースの知識はあんまりなくても大丈夫です。<br/>

##好きなところ
1. <strong>すべての章の最後に、練習問題がありました。</strong><br/>
特に最初の方の章は分かりやすくて、<br/>
簡単に解けました。ただ、第２章から始めて、booksやauthorなど、<br/>
同じ情報を教科書の最後まで繰り返して使うので、<br/>
練習問題の解答を保存することをおすすめします。<br/>
2. <strong>Githubに、すべてのコードは章毎に分かれています。</strong><br/>
ですので、もしある章を読んでいて途中で分からなくなってしまったら、<br/>
Githubのコードを自分のパソコンにダウンロードして<br/>
比較することができます。<br/>
3. <strong>MySQLを入れなかったこと</strong><br/>
というか、appendixのところに入れました。<br/>
MySQLやPostgreSQLなどを使うのがいいだと思うけど、<br/>
また、目標はRailsの仕組みを理解することなので、MySQLの分は<br/>
appendixの方に入れてくれたことがありがたかったです。

##気になったところ
1. <strong>コードは多すぎ</strong><br/>
本格的なアプリケーションはあんな感じかもしれないんですが、<br/>
仕組みを理解するにはちょっとややこしいだなと思いました。<br/>
ヘルパーメソッドが多くて、「これは今のところ要らんじゃない？」<br/>
と思ったことも結構ありました。<br/>
まあ、役に立ったけど、また私の目標はRails自体を理解することだったので<br/>
少し時間の無駄に思いました。<br/>
2. <strong>たまについていくのは難しかったです</strong><br/>
Railsが難しいからではなくて、教科書の指示はたまにはっきりとしていなかったからです。<br/>
例えば、ある章でFactoryGirlを使ってシードデータを作成します。<br/>
また別の章で、そのクラスの属性を変える場面がありました。<br/>
そしてその後に（１章、２章後？）、「ログインしてユーザーの投稿を見てください」<br/>
みたいなことが書いてあったけど、上手くログインできず、ちょっと混乱するところがありました。<br/>
何が起こったかというと、もとのFactoryGirlのシードデータに変える必要があったからです。<br/>
単純な失敗だったけど、「変えてください」と書いて、<br/>
そして「元の変数に変えてください」というのは書いてなかったから<br/>
少し気になって、ちょっとしたことで悩みました。
3. <strong>誤植は多い</strong><br/>
結構多かったですね。第９章には<br/>
「indexアクションのテンプレート `app/controllers/member/index.html.erb` を開いて」<br/>
というのが書いてあったとか。<br/>
まあ、<a href="http://www.oiax.jp/books/rails4book/eratta.html" target="_blank">こういう具合です。</a><br/>
私が書いてるコードが大丈夫なのかなって。

##まとめ
特に教科書の最初の方の解説は分かりやすくてすごく役に立ちました。
でも、簡潔でシンプルなコードではないため、初心者には少し難しくて、
Railsの仕組みを一から理解するにはちょっと困難です。
VirtualBoxで仮想マシンを新規作成後、NATによるNW設定からSSH接続したいところまで

#最初に

お急ぎで手っ取り早く仮想マシンを作成したい場合はVirtualBoxホーム画面上で仮想マシンを作成するよりも
現在に至ってはvagrantで仮想マシンを作成した方が断然早いので
どうしてもVirtualBoxホーム画面上からでないと嫌だという方以外は
他の記事を参照した方がよろしいかと思われます。

#概要

ゲストOSから外側のインターネットに接続しホストOSからゲストOSに
対してSSH接続を行う事を目的と致します。

VirtualBoxのNATによるNW設定の注意点は、NAT用のネットワークインターフェイスとホストオンリーアダプター用のネットワークインターフェイスをそれぞれ設定してやらないといけない点にあります。

NATアダプターはホストマシン外のネットワークとの接続用、ホストオンリーアダプターはホストマシンとの接続用とざっくりですがここではご理解ください。

以降の手順は、CentOS などのOSを既にインストール設定済みである事を前提としてます。

#手順
1.「Oracle VM VirtualBox マネージャー」で作成された仮想マシンを選択して、「ネットワーク」をクリックします。

![aaaaaaaaaa.png](https://qiita-image-store.s3.amazonaws.com/0/126270/71431b7d-fe2d-24cb-7f3a-203077efbe2f.png)


2.
設定画面で「ネットワーク」を選択し、「アダプター1」の設定画面を開き、以下の設定を行います。

ネットワークアダプターを有効化：チェックを入れる
割り当て：「NAT」を選択し「OK」をクリック
![bbbbbbbbbb.png](https://qiita-image-store.s3.amazonaws.com/0/126270/b2f18ed0-d4ce-c08a-46ef-0393668b7763.png)

3.「アダプター2」の設定画面を開き、以下の設定を行い「OK」ボタンをクリックします。

ネットワークアダプターを有効化：チェックを入れる
割り当て：「ホストオンリーアダプター」を選択し「OK」をクリック
![aaacffff.png](https://qiita-image-store.s3.amazonaws.com/0/126270/bf1ea4e3-1abe-7a47-d464-5f169980ccef.png)



※仮想マシンが停止状態でないと「アダプター2」の設定画面が開きません


4.コンソール画面からNAT用のネットワークインターフェイスの設定ファイル「/etc/sysconfig/network-scripts/ifcfg-eth0」を、以下の部分だけ編集します。変更を行う箇所のみ示します。
「eth0」はBOOTPROTO=dhcpのままで指定します。

![3.png](https://qiita-image-store.s3.amazonaws.com/0/126270/6c6fd53f-9822-33cc-6e2b-0b58fdf92293.png)

5.ホストオンリーアダプター用のネットワークインターフェイスの設定ファイル「/etc/sysconfig/network-scripts/ifcfg-eth1」を、以下のように編集します。変更を行う箇所のみ示します。
※ポイントは「eth1」側に固定IPを指定する事です。

![WS000012.JPG](https://qiita-image-store.s3.amazonaws.com/0/126270/36de64c1-00b5-4705-a53b-89fc1f88e623.jpeg)

なお、使用できる固定IPアドレスは「Windowsスタートメニュー」→「コントロールパネル」→「ネットワークとインターネット」→「ネットワークと共有センター」→「アダプターの設定の変更」→「VirtualBox Host-Only Ethernet Adapter」→「プロパティ」→「インターネットプロトコルバージョン 4」をダブルクリック。ここの例では、IPアドレスに192.168.56.0/24内から割り当てられる事を確認出来ます。

![WS000017.JPG](https://qiita-image-store.s3.amazonaws.com/0/126270/298d4583-4d2a-a27d-8ba7-4610006d9cfe.jpeg)



6.ネットワークの設定を有効化するには、以下のコマンドを実行してネットワークサービスを再起動します。

![WS000005.JPG](https://qiita-image-store.s3.amazonaws.com/0/126270/38f4742a-89d7-3d9e-ddd3-369253d710f0.jpeg)

7.「ifconfig」コマンドを実行し「etn1」のIPを控えておきます

![WS000015.JPG](https://qiita-image-store.s3.amazonaws.com/0/126270/ee6b2f42-8fbc-c7a1-91f4-dd86a276baef.jpeg)

8.再度、設定画面で「ネットワーク」を選択し、「アダプター1」の設定画面を開き、「ポートフォワーディング」を選択し以下の設定を行います。

![8.png](https://qiita-image-store.s3.amazonaws.com/0/126270/6f3692fe-1a79-39d6-aefc-c5da60a7e60a.png)

![WS000018.JPG](https://qiita-image-store.s3.amazonaws.com/0/126270/33a24445-089c-87dc-cf37-da413b3b9711.jpeg)


> ホストIP：teratermを使用する端末IP（ここでは127.0.0.1でよい）
> ゲストIP：ifconfigで先ほど確認した「eth1」のIPを入力
> ポート：22番を指定（バッティングを考慮してホストポートは10022等 にしてもよい）


9.最後に「OK」を選択し、teratermを使用する端末からSSH接続いたします。
![WS000019.JPG](https://qiita-image-store.s3.amazonaws.com/0/126270/2873a5bf-848c-cb73-b0ce-a235077d530a.jpeg)
Laravelで絞り込み検索をする


やりたいことは

- フォームに入力されたデータを取得して、一致するデータのみをリスト表示

#ビュー

```
<form action="/search" method="get">
    <input type="text" name="name" placeholder="社名・社員名を入力ください">
    <button type="submit" value="検索">検索</button>
</form>


<table class="staffs">
    <thead>
        <tr>
            <th>会社名</th>
            <th>氏名</th>
            <th>ふりがな</th>
        </tr>
    </thead>
    <tbody>
        @forelse ($testData as $staff)
            <tr>
                <td>{{$staff["company"]}}</td>
                <td>{{$staff["name"]}}</td>
                <td>{{$staff["kana"]}}</td>
            </tr>
        @empty
            <tr>
                <td>データがありません</td>
                <td>データがありません</td>
                <td>データがありません</td>
            </tr>
        @endforelse
    </tbody>
</table>
```

#コントローラー

##unsetを使う

指定した変数の割当を解除する関数。
これを使って条件にあてはまらない配列だけ解除。
検索ボタンを押すと下記のメソッドが実行されるようにすればOK。

```
Route::get('/search', function(Request $request){
    $testData = [];
    $testData[] = [
        "company" => "株式会社クエスチョン",
        "name" => "鈴木たけし",
        "kana" => "すずきたけし"
    ];
    $testData[] = [
        "company" => "株式会社hatenabox",
        "name" => "山田太郎",
        "kana" => "やまだたろう"
    ];
    $testData[] = [
        "company" => "チャット（株）",
        "name" => "田中一郎",
        "kana" => "たなかいちろう"
    ];

    $this->request = $request;
    $formData = $this->request->get("name");

//    テストデータの各グループについてフィルタリング
    if($formData){
        foreach($testData as $index=>$test) {
            if ($test["name"] !== $formData && $test["company"] !== $formData && $test["kana"] !== $formData) {
                unset($testData[$index]);
            }
        }
    }

    return view('memberlist', [
        "testData" => $testData
    ]);
});

```

#結果

- フォームにデータがあれば当てはまる配列だけ残って表示される
- フォームにデータがなければフィルタリングされないので全ての配列が表示される

#補足

1. あんまりif文は使わずにforeachで
2. できるだけまとまりで渡して行って、最後はシンプルな配列をビューに渡す

といい感じになるらしい。
Google Analyticsの基礎的な使い方について


## 検索キーワード、訪問者数を調べる。
1. Google Analyticsにログインし、集客のキャンペーン
2. オーガニック検索をクリックすると、キーワードが表示される。

![スクリーンショット_2016-05-28_13_02_03.png](https://qiita-image-store.s3.amazonaws.com/0/47909/80f42b4e-a94d-2159-aaa8-2f0768c652df.png "スクリーンショット_2016-05-28_13_02_03.png")
Laravel5 例外ハンドラで指定した遷移先ページでセッションを使う方法

正しい方法かわからないけども、解決方法として。

例えば、404ページ内でセッションを使うことを考える。

# Laravelでの404ページの出力

例外をつかんだ後の遷移先のページの指定は、app/Http/Kernel.phpで指定できる。

```app/Http/Kernel.php
省略

public function render($request, Exception $e)
    {
      $status = $e->getStatusCode();
      if($status == 404){
        return response()->view("errors.404", ['exception' => $e,'previous' => URL::previous()], $status);
      }else{
        return parent::render($request, $e);
    }

省略
```

こんな風にすれば、指定した遷移先へ飛ぶ。

しかし、指定した遷移先でセッションを使おうとするとなぜか使えない。

# 解決方法

同じく、app/Http/Kernel.php に \Illuminate\Session\Middleware\StartSession::class を以下のように追加する。

```app/Http/Kernel.php
protected $middleware = [
        \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
        \Illuminate\Session\Middleware\StartSession::class, // これを追加
    ];
```

これで使えるようになる。

# 注意

\Illuminate\Session\Middleware\StartSession::class　を1度に2回呼び出すと、前のセッションがなくなるから、バリデーションのエラーメッセージとかが取得できなくなる。
Laravelのsessionの使い方

Laravelには次のリクエストまで情報を一時保存できる **session** というものがある。
ちょいちょい使ってるのに「どういうときに使うのか」がよく分かってないのでまとめる。

#流れ

- flashメソッドでフォームデータをsessionに一時保存
- 見つけたデータをリストに埋め込んで表示

#flashメソッド

sessionに保存したデータは **old** で取得できる。

#まずbladeに画面作成

actionに送信先url、methodに送信方法を。（もちろんpostでもOK）
oldを使ってリストにセッションのデータを埋め込めば、sessionに保存されたデータからほしいやつだけ取得できる。


```
<form action="url" method="get">
	<input type="text" id="name" name="name" placeholder="山田 太郎" >
	<button class="search" type="submit" value="検索">検索</button>
</form>


<thead>
    <tr>
        <th>名前</th>
    </tr>
</thead>
<tbody>
    <tr>
        <td>{{ old("name") }}</td>
    </tr>
</tbody>

```

#ルート書く

```
Route::get('url', function(
    Request::flash();
    $name = Request::old('name');
    return view('index', [
        "name" => $name
    ]);
});
```

"検索"ボタンを押せばリストの {{ old("name"}} にnameの値が入るようになる。

#追記

フォームの値を配列にして渡すことも可能。

```php:form.blade.php
<input type="text" class="formItem__form" name="data[name_last]">
<input type="text" class="formItem__form" name="data[name_first]">
```

```Controller

//lumen
$router->get("/confirm",function(Request $request){
    $request->flash();
    $data = $request->old('data');
    // dd($data);
    return view("confirm", [
    "form_data" => $data
]);

```

```php:confirm.blade.php
	<p>{{$form_data["name_last"]}}</p>
	<p>{{$form_data["name_first"]}}</p>
```

####dd()で返ってくる値

```
array:2 [▼
  "name_last" => "山田"
  "name_first" => "太郎"
]
```
Git Subtree 事始め


もうそろそろいい加減git subtreeも使いこなせないとまずいな、と思っていたところなので
とりあえずわかる範囲で調べてまとめてみた。

## git subtree とは何か 

git subtreeは外部のリポジトリを現在のリポジトリに取り込むための機能です。

リボジトリ in リポジトリとなるとgit submoduleだったり、
npmとかcomposerみたいな依存管理ライブラリみたいなものを連想するかも知れませんが、
subtreeの挙動はちょっと違います。

一般的な依存管理ライブラリや、git submodule では、
特殊なファイルに 取り込み元リポジトリを記載して管理するという、
取り込み元と、取り込み先を明確に区別しての管理を行うのですが、
subtree では、

「取り込み元と取り込み先のコミット履歴を完全に結合する」

という動き方をするみたいです。

## 使い方

とりあえずフロントエンド開発でよく使うライブラリを使って、
いろんなgit管理プロジェクト内で利用したり更新したりしたいなぁという所が始まりです。

とりあえず練習用に、
https://github.com/chatbox-inc/frontend.git
という形でgulpのスクリプトなどを雑にまとめたリポジトリを用意しました。

### 事前準備

とりあえず事前準備として、取り込むライブラリのリポジトリをremoteに登録しておきます。

````
$ git remote add frontlib https://github.com/chatbox-inc/frontend.git
````

### プロジェクトにライブラリを追加する。

とりあえず空のプロジェクトを作ってみます。

````
$ mkdir hogeProject
$ cd hogeProject
$ git init
$ git commit -m project_first_commit --allow-empty
````

frontend ディレクトリを作成してディレクトリにライブラリをぶち込みます。

````
$ git subtree add --prefix=frontend frontlib master
````

frontendディレクトリが作成されて、綺麗にライブラリが打ち込まれました。

### ここで何が起こっているのか

何が起こっているのかを見るには、gitのログを確認してみるのが一番です。

````
$ git log --oneline
4cb013b Add 'frontend/' from commit '48f0fafda1cb73ef8abc72630ff2xse379958a1b'
0ec38xx project_first_commit
48ffewd frontlib_first_commit
````

自分で明示的に作成したコミットの他に、frontlibから取り込まれたコミットもコミットログに追加されている事がわかります。

2つのリポジトリのコミットログを混ぜて、そのマージコミットを注記する、のがsubtreeの構造っぽい。

別のディレクトリを切って、同じライブラリをぶち込んでみると、こんな感じ

````
$ git subtree add --prefix=frontend2 frontlib master
$ git log --oneline
ab96901 Add 'frontend2/' from commit '48f0fafda1cb73ef8abc72630ff2xse379958a1b'
4cb013b Add 'frontend/' from commit '48f0fafda1cb73ef8abc72630ff2xse379958a1b'
0e37c38 project_first_commit
48f0ffd frontlib_first_commit
```` 

`48f0ffd`が重複することは無く、単純にsubtreeのマージコミットのみが２つ記録されている。

マージコミットが、subtreeの状態を管理していて、取り込み元の`48f0ffd`はあくまでその参照として機能している、みたいな感じで、subtreeの挙動をふんわりと理解する事ができます。

### サブツリーの削除

単純にサブツリーの削除を行う場合はrmしてcommitすればOKです。

````
$ rm -rf frontend2
$ git commit -m delete_frontend2
````

しかし、いくらrm->commit の手続きをとってもsubtree addを行ったという履歴は消えません。

誤って異なるリポジトリから大規模なコミットをsubtreeで取り込んでしまったとしても、
それはもうコミットであるため、容易に取り消す事はできません。
取消を行うためには、歴史の改変が必要です。

````
git filter-branch --tree-filter 'rm -rf frontend2' HEAD
````

`filter-branch`サブコマンドの`--tree-filter`オプションには、
プロジェクト内の各チェックアウトに対して指定したコマンドを実行して結果を再コミットする、という機能があります。

## ライブラリの更新を取り込む/送信する

一旦subtreeの取り込みが終わったら、あとは楽ちん

````
$ git subtree push --prefix=frontend frontlib master
$ git subtree pull --prefix=frontend frontlib master
````

プロジェクトにおけるコミットも特に気にせず行ってOK。
frontendとそれ以外のディレクトリにまたがるコミットが存在しても自動的に切り分けて、
frontendのみのコミットを抽出してpushしてくれる。マジで賢い。

## 気になったこと

毎回コマンドでprefixとremote指定するのめんどくさい。

prefix と remoteのひも付けってどうやって管理するのがベターなんだろうか。


## 参考

http://qiita.com/shogo82148/items/04b29b195dbbb373152f
IBM BluemixでHubotをガンガンに動かす

# bluemixでhubotを動かす方法
> Herokuでbotを運用する時代は終わった。これからはIBM Bluemixを使って無料で運用する
> http://qiita.com/akameco/items/39a55635ceb0ba185b7f

# bluemixに修正をアップロード

```bash
$ cf push uran
$ cf restage
$ cf logs [app] --recent # ログの確認
```

# Bluemixだと本体自身に手を加えるより機能を追加する方が良い?

1. `yo`でhubotを作成
2. node_modulesに置くモジュールを別のリポジトリで作成
3. node_modulesからリンクを作成
4. モジュールは公開リポジトリで更新
5. `package.json`にモジュールを記載
6. `cf push`を使ってデプロイ

> Hubot スクリプトを追加インストールしよう & 自分だけの Hubot スクリプトをつくろう
> http://qiita.com/bouzuya/items/4c0206d72ff22ade9339

# 手元で対話モードで動かす

```bash 
$ ./bin/hubot -a shell -n uran 
```
[uran]はbotの名前

> shell アダプターで動かす
> http://qiita.com/bouzuya/items/11c0c6da2b3ad54b827f#shell-%E3%82%A2%E3%83%80%E3%83%97%E3%82%BF%E3%83%BC%E3%81%A7%E5%8B%95%E3%81%8B%E3%81%99

# 手元で接続して動かす

```bash
# export HUBOT_SLACK_TOKEN=[Slackの画面に書いてあった値]
# export HUBOT_SLACK_TEAM=[Slackの画面に書いてあった値]
# export HUBOT_SLACK_BOTNAME=[任意のボット名(例：hogebot)]
# export PORT=80
# bin/hubot -a slack
```

> Hubot を Amazon EC2 にセットアップし、Slack と連携する！
> http://qiita.com/hkusu/items/3e3695450f8a4f9389b3

# cronで定期実行

> Hubot × node-cron で、定刻/定間隔に ○○ をさせる簡単な例
http://qiita.com/hkusu/items/fce98bb52a14e47c06d9

# 定期botを作った話

> Hubot+HerokuでSlack用のリマインダーbotを作る
> http://qiita.com/ryotahirano/items/be5df095c9859007524a

# hubotの良質記事たくさん

http://qiita.com/bouzuya
よく忘れるので数学のTeX記法をまとめ

最近，ゼミで数式を扱う勉強会が増えており
その都度調べ直すのも面倒なのでTeXの備忘録を書きました．

## ギリシャ文字
|出力|$\TeX$|出力|$\TeX$|読み方|
|:--|:--|:--|:--|:--|
|$A$|A|$\alpha$|\alpha|アルファ|
|$B$|B|$\beta$|\beta|ベータ|
|$\Gamma$|\Gamma|$\gamma$|\gamma|ガンマ|
|$\Delta$|\Delta|$\delta$|\delta|デルタ|
|$E$|E|$\epsilon$|\epsilon|イプシロン|
|$Z$|Z|$\zeta$|\zeta|ゼータ|
|$H$|H|$\eta$|\eta|イータ|
|$\Theta$|\Theta|$\theta$|\theta|シータ|
|$I$|I|$\iota$|\iota|イオタ|
|$K$|K|$\kappa$|\kappa|カッパ|
|$\Lambda$|\Lambda|$\lambda$|\lambda|ラムダ|
|$M$|M|$\mu$|\mu|ミュー|
|$N$|N|$\nu$|\nu|ニュー|
|$\Xi$|\Xi|$\xi$|\xi|クシー|
|$O$|O|$o$|o|オミクロン|
|$\Pi$|\Pi|$\pi$|\pi|パイ|
|$P$|P|$\rho$|\rho|ロー|
|$\Sigma$|\Sigma|$\sigma$|\sigma|シグマ|
|$T$|T|$\tau$|\tau|タウ|
|$\Upsilon$|\upsilon|$\upsilon$|\upsilon|ユプシロン|
|$\Phi$|\Phi|$\phi$|\phi|ファイ|
|$X$|X|$\chi$|\chi|カイ|
|$\Psi$|\Psi|$\psi$|\psi|プシー|
|$\Omega$|\Omega|$\omega$|\omega|オメガ|

## ギリシャ文字(var)
|出力|$\TeX$|読み方|
|:--|:--|:--|
|$\varepsilon$|\varepsilon|イプシロン|
|$\vartheta$|\vartheta|シータ|
|$\varrho$|\varrho|ロー|
|$\varsigma$|\varsigma|シグマ|
|$\varphi$|\varphi|ファイ|

## 微分・勾配記号
|出力|$\TeX$|
|:--|:--|
|$\nabla$|\nabla|
|$\partial$|\partial|

## その他の記号・文字
|出力|$\TeX$|
|:--|:--|
|$=$|=|
|$+$|+|
|$-$|-|
|$\times$|\times|
|$\div$|\div|
|$\pm$|\pm|
|$\mp$|\mp|
|$\neq$|\neq|
|$\sim$|\sim|
|$\simeq$|\simeq|
|$\fallingdotseq$|\fallingdotseq|
|$\risingdotseq$|\risingdotseq|
|$\equiv$|\equiv|
|$>$|>|
|$<$|<|
|$\geq$|\geq|
|$\geqq$|\geqq|
|$\leq$|\leq|
|$\leqq$|\leqq|
|$\gg$|\gg|
|$\ll$|\ll|
|$\oplus$|\oplus|
|$\ominus$|\ominus|
|$\otimes$|\otimes|
|$\oslash$|\oslash|
|$\circ$|\circ|
|$\cdot$|\cdot|
|$\cdots$|\cdots|
|$\bullet$|\bullet|
|$\in$|\in|
|$\ni$|\ni|
|$\notin$|\notin|
|$\subset$|\subset|
|$\supset$|\supset|
|$\subseteq$|\subseteq|
|$\supseteq$|\supseteq|
|$\cap$|\cap|
|$\cup$|\cup|
|$\emptyset$|\emptyset|
|$\infty$|\infty|


## 数式
### 分数
|出力|$\TeX$|
|:--|:--|
|$\frac{a}{b}$|\frac{a}{b}|

### 指数
|出力|$\TeX$|
|:--|:--|
|$e^x$|e^x|
|$\exp x$|\exp x|

### 平方根
|出力|$\TeX$|
|:--|:--|
|$\sqrt{x}$|\sqrt{x}|
|$\sqrt[n]{x}$|\sqrt[n]{x}|


### 対数
|出力|$\TeX$|
|:--|:--|
|$\log x$|\log x|
|$\log_a x$|\log_a x|
|$\ln x$|\ln x|


### 絶対値
|出力|$\TeX$|
|:--|:--|
|$&#124;x&#124;$|&#124;ｘ&#124;|

### 組み合わせ
|出力|$\TeX$|
|:--|:--|
|${}_nC_r$|{}\_nC\_r|
|${}_nH_r$|{}\_nH\_r|
|${}_nP_r$|{}\_nP\_r|

### 極限
|出力|$\TeX$|
|:--|:--|
|$lim_{n \to \infty}$|lim_{n \to \infty}|

### 三角関数
|出力|$\TeX$|
|:--|:--|
|$\sin x$|\sin x|
|$\cos x$|\cos x|
|$\tan x$|\tan x|
|$\csc x$|\csc x|
|$\sec x$|\sec x|
|$\cot x$|\cot x|
|$\arcsin x$|\arcsin x|
|$\arccos x$|\arccos x|
|$\arctan x$|\arctan x|
|$\sinh x$|\sinh x|
|$\cosh x$|\cosh x|
|$\tanh x$|\tanh x|


### 大型演算子
|出力|$\TeX$|
|:--|:--|
|$\sum_{i=1}^{N}$|\sum_{b=1}^{N}|
|$\prod_{i=1}^{N}$|\prod_{i=1}^{N}|
|$\int_{a}^{b}$|\int_{a}^{b}|
|$\iint_{a}^{b}$|\iint_{a}^{b}|
|$\iiint_{a}^{b}$|\iiint_{a}^{b}|
|$\idotsint_{a}^{b}$|\idotsint_{a}^{b}|


## ベクトル
|出力|$\TeX$|
|:--|:--|
|$\vec{x}$|\vec{x}|
|$\overrightarrow{x} $|\overrightarrow{x}|
|$\hat{x}$|\hat{x}|


## 書式
|出力|$\TeX$|
|:--|:--|
|$\mathbb{E}$|\mathbb{E}|
|$\mathcal{N}$|\mathcal{N}|
|$\mathrm{x}$|\mathrm{x}|
|$\underline{x}$|\underline{x}|
|$\overline{x}$|\overline{x}|
|$\underbrace{x}$|\underbrace{x}|
|$\overbrace{x}$|\overbrace{x}|
【初心者向け】gulpをはじめる for Mac

gulpの導入について。
簡単に流れを説明します。

※Macでの実行結果となります。


＜目次＞
【１】nodebrew（Mac版バージョン管理ツール）のインストール
【２】Node.jsのインストール
【３】gulpのインストール
【４】package.jsonの作成
【５】npmのインストール
【６】gulpfile.jsの作成
【７】実行


# 【１】nodebrew（Mac版バージョン管理ツール）のインストール


nodebrewはPC（ローカル）でバージョン管理（バージョンごとに使い分けたり、任意のNode.jsをインストールしたり）するためのツール。


## （１）nodebrewをインストール


```
$ curl -L git.io/nodebrew | perl - setup
```


## （２）PATHを通す


```
$ export PATH=$HOME/.nodebrew/current/bin:$PATH
```


## （３）設定を読み直す


```
$ source ~/.bashrc
```


# 【２】Node.jsのインストール


```
$ node -v
```

インストールされていればNode.jsのバージョン番号が、そうでなければ-bash: node: command not foundなどと表示される。

インストールされていなければ、下記よりインストール。
http://nodejs.org/


# 【３】gulpのインストール


```
$ sudo npm install -g gulp
```

上記完了したら、バージョンの確認。


```
$ gulp -v
```

```
[12:09:29] CLI version 3.9.1
[12:09:29] Local version 3.9.1
```

と出ればOK。

ここまでが下準備。


## ★gulpのインストール（ローカル）


gulpはグローバルだけでなくローカル（プロジェクト毎）にもインストールする必要があります。

```
$ sudo npm install gulp --save-dev
```


# 【４】package.jsonの作成


主なプラグインをインストール。
基本、案件ごとに使い回しができるように設定をしておく。


その他、プラグインは案件に応じて選択すること。

- gulp-tinypng-compress（https://www.npmjs.com/package/gulp-tinypng-compress）
- gulp-prettify（https://www.npmjs.com/package/gulp-prettify）
- gulp-html5-lint（https://www.npmjs.com/package/gulp-html5-lint）
- gulp-sass（https://www.npmjs.com/package/gulp-sass）
- gulp-autoprefixer（https://www.npmjs.com/package/gulp-autoprefixer）
- gulp-frontnote（https://www.npmjs.com/package/gulp-frontnote）


# 【５】npmのインストール


package.jsonを作成したら、プロジェクトのルートで下記を実行。
package.jsonで設定している必要なプラグインをまとめてインストールできる。


```
$ npm install
```

※node_modulesフォルダ、package.jsonが生成され、必要なモジュールが配置される


# 【６】gulpfile.jsの作成


gulpfile.js はタスクのレシピ。
package.jsonで指定したモジュールを読み込むと、使えるようになる。


＜サンプルコード＞

```
var gulp         = require('gulp');
var cssimport    = require('gulp-cssimport');
var autoprefixer = require('gulp-autoprefixer');
var minifyCss    = require('gulp-minify-css');
var rename       = require('gulp-rename');

gulp.task('style', function(){
  return gulp.src('src/style.css')
    .pipe(cssimport())
    .pipe(autoprefixer('last 2 versions'))
    .pipe(minifyCss())
    .pipe(rename({ extname: '.min.css' }))
    .pipe(gulp.dest('dist/'));
});
```


参考）プラグイン
http://gulpjs.com/plugins/


# 【７】実行


```
$ gulp style
```

正しく実行されれば、dist/フォルダにstyle.min.cssというファイルができる。


```
※Ctrl + C
```
で、プログラムを中断できる。


以上です。


こちらの記事もどうぞ。
【初心者向け】gulp触るなら覚えておいたほうが良いコマンド3選＋α
http://qiita.com/kobatatakayuki/items/0fa9faf8003c713ce5d5
Qiita APIを使用した最近のランキング作り with Python

#【環境】
　windows8.1
　python2.7

#【概要】
　Qiita APIを使って最近のユーザランキングとタグランキングを作ります。
　ユーザランキングはフォロワー数を、タグランキングはそのタグのアイテム数で
　ランク付けしてます。

#【準備】
　プログラムを実行するにはqiitaの設定ページからトークンを取得してください。
　（右上の画像クリック）→（設定）→（アプリケーション）→（新しくトークンを発行する）

#【プログラム】
ユーザランキング

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

from qiita_v2.client import QiitaClient

# QiitaClientを継承してget_userをオーバーライド
class child_QiitaClient(QiitaClient):
    def get_user(self, id, params=None, headers=None):
        ''' 特定のユーザを返します。
        '''
        return self.get("/users?page={}&per_page=100".format(id), params, headers)
 
TOKEN="取得したトークンを入力してください"
client = child_QiitaClient(access_token=TOKEN)

# ランキングするために配列を初期化(フォローされている人数用)
rank_followers = []
i = 0
for i in xrange(10):
    rank_followers.append(0)

# ランキングするために配列を初期化(ユーザーの名前用)
rank_user_name = []
i = 0
for i in xrange(10):
    rank_user_name.append("")


i = 0
for i in xrange(1,101):
    res = client.get_user(str(i))
    json_data = res.to_json()
    for j in xrange(0,100):
        # ユーザー名の代入
        user_name = json_data[j]["id"]
        # フォローされている人数の代入
        user_followers = json_data[j]["followers_count"]
        # ランク付け
        for k in xrange(10):
            if rank_followers[k] < user_followers:
                rank_followers[k] = user_followers
                rank_user_name[k] = user_name
                break

print rank_followers
print rank_user_name
```

タグランキング

```py:tag_rank.py

from qiita_v2.client import QiitaClient

# QiitaClientを継承してget_tagをオーバーライド
class child_QiitaClient(QiitaClient):
    def get_tag(self, id, params=None, headers=None):
        ''' 特定のタグを返します。
        '''
        return self.get("/tags?page={}&per_page=100".format(id), params, headers)
 
TOKEN="取得したトークンを入力してください"
client = child_QiitaClient(access_token=TOKEN)

# ランキングするために配列を初期化(タグのアイテム数用)
rank_item = []
i = 0
for i in xrange(10):
    rank_item.append(0)

# ランキングするために配列を初期化(タグの名前用)
rank_tag_name = []
i = 0
for i in xrange(10):
    rank_tag_name.append("")


i = 0
for i in xrange(1,101):
    res = client.get_tag(str(i))
    json_data = res.to_json()
    for j in xrange(0,100):
        # タグ名の代入
        tag_name = json_data[j]["id"]
        # タグのアイテム数の代入
        tag_item = json_data[j]["items_count"]
        # ランク付け
        for k in xrange(10):
            if rank_item[k] < tag_item:
                rank_item[k] = tag_item
                rank_tag_name[k] = tag_name
                break
            
print rank_item
print rank_tag_name
```

#【問題】
　・ユーザーもタグも最近の1万項目しか取得できないため、全ての情報に対してランク付けが
　　できなかった。
　・get_user関数にはContribution項目がないため、フォロワー数のランク付けとなってしまった。

#【感想・今後】
　・Qiitaのユーザ情報ページなどをスクレイピングすると利用制限に引っかかってしまうため、
　　どうやって情報取得すればいいのか考えるのが面白かった。
　・機会があったらQiitaの全てのユーザやタグに対してをランキング付けしてみたい。

#【参考サイト】
　[Qiita API v2ドキュメント](http://qiita.com/api/v2/docs)
　[Python Wrapper for Qiita API v2](https://github.com/petitviolet/qiita_py/blob/master/qiita_v2/client.py)
　[Qiita API がなぜかContribution数をかえしてくれない件](http://www.indetail.co.jp/blog/6829/)
　[クラスを継承してオーバーライドするぞ](http://qiita.com/fukkyy/items/0d846e91a964333be3d5)
Zybo > Link > Interrupts AXI GPIO and AXI Timer

Zybo関連のGPIO割込みについて調べていて、以下を見つけた。

http://ece.gmu.edu/coursewebpages/ECE/ECE699_SW_HW/S15/viewgraphs/ECE699_lecture_4.pdf

PS-PL間の処理を行っている。

今の自分にはさっぱりな内容だが、読みやすくはある。
今のペースだと数か月後くらいに追いつけるかもしれない。
xcodeでcocoapodのライブラリのパスを合わせる「初心者向け」

#1, xcodeでcocoapodのライブラリのパスを合わせる

pod installしたライブラリのパスがあってない場合はimportしてもファイルがないとエラーになっていた。

例：#import "CorePlot-CocoaTouch.h"
→file not found

対応策：cocoapodのライブラリのパスがあってない場合に合わせる

初期：Headers/Public/CorePlot
変更後：Headers/Public/CorePlot/ios

![スクリーンショット 2016-05-28 10.32.23.png](https://qiita-image-store.s3.amazonaws.com/0/64334/64f2f416-7fe7-f0ba-17b0-912d68f48ac4.png)



参考：http://ja.stackoverflow.com/questions/6621/swift-bridging-header-%E3%81%AE-import-%E3%81%A7-file-not-found-%E3%81%8C%E7%99%BA%E7%94%9F%E3%81%97%E3%81%A6%E3%81%97%E3%81%BE%E3%81%86


#2,podsのライブラリをビルドする

podsのライブラリを変更してもビルドがされていないとエラーになっていました。
というかpodsの内容に手を加えたらpods updateには気をつけないと当然上書きされます。

ビルドの仕方は下記サイトにお世話になりました。

引用：
XcodeのツールバーにあるSchemeポップアップメニューから、「Pods」を選択する
Product > Build メニューを選択し、ビルドを実行する


#参考になりそうリスト
http://www.ateliee.com/archives/2364
http://qiita.com/paming/items/34f94a829c09eddfee95
http://qiita.com/laiso/items/ac0eab1d5dd11d293d8a
http://qiita.com/lynrin/items/b2b4316ea51a731019ff


参考：http://qiita.com/dkwnm/items/ce4b711d258bc814f9a9
PostgreSQL におけるレプリケーションの仕組み

今回はPostgreSQLにおける同期、非同期レプリケーションの違いについて説明します。

# PostgreSQLにおける同期/非同期レプリケーションの概要
PostgreSQLでのデータの書き込みはWAL（Write Ahead Log）に変更履歴として記録されています。
WALの詳細については[マニュアル](http://www.postgresql.jp/document/9.5/html/wal-intro.html)をご確認ください。

PostgreSQLでは、そのWALをスレーブに転送し、スレーブがそのWALを再生することでレプリケーションを実現しています。

- 同期レプリケーション：WALファイルがスレーブのディスクに書き込まれるまでを保証
- 非同期レプリケーション：WALファイルをスレーブに送信するまでを保証

## レプリケーションを行うためのPostgreSQLのプロセス
マスタ、スレーブ間でのWALのやり取りは2つのプロセスによって実現されています。
マスタではwal_senderプロセス、スレーブではwal_receiverプロセスが起動します。まずはwal_receiverが起動し、マスタに接続を行います。wal_receiverプロセスからの接続に応じて、マスタでwal_senderプロセスが起動し、WALの転送が開始されます。
このような仕組みでレプリケーションは行われるため、max_wal_sendersは必ず「1」以上に設定する必要があります。
![プロセス](http://f.cl.ly/items/013k0V2i0B0v2m0l2Q3G/%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E3%81%AE%E4%BB%95%E4%BA%8B.png "process")
※なんとなく絵も書いてみました。

# 更新SQL実行時のレプリケーションのイメージ
## 同期レプリケーションのイメージ
![同期レプリケーション](http://f.cl.ly/items/1T0X3U22241f3x3f2d2h/%E5%90%8C%E6%9C%9F%E3%83%AC%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3.PNG "sync")

## 非同期レプリケーションのイメージ
![非同期レプリケーション](https://s3.amazonaws.com/f.cl.ly/items/2m093s430Z0H3w2g3D0o/%E9%9D%9E%E5%90%8C%E6%9C%9F%E3%83%AC%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3.PNG "async")
CentOS7にxfce4をインストールする

# インストール

CentOS7のxfce4はEPEL(エンタープライズ Linux 用の拡張パッケージ)に登録されているため、xfce4をyumコマンドでインストールするためにはEPELリポジトリをインストールする必要があります。ちなみに、minimal-installしたCentOSにインストールすることが前提です。

    $ sudo yum install -y epel-release
    $ sudo yum update

で、

    $ sudo yum groupinstall "X Window System" 
    $ sudo yum groupinstall Xfce


## とりあえず起動する

    $ echo "exec startxfce4" > ~/.xinitrc
    $ startx

を実行するとxfce4のデスクトップが起動するはずです。英語が堪能な方は以下省略で。


# 日本語関連設定

- 日本語フォントのインストール

```
$ sudo yum install vlgothic-*
$ sudo yum install ipa-gothic-fonts ipa-mincho-fonts ipa-pgothic-fonts ipa-pmincho-fonts
```

- $HOME/.xinitrcに環境変数LANG追加

```
export LANG=ja_JP.UTF-8
exec startxfce4
```

- 日本語入力

```
$ sudo yum install ibus-kkc
```

CentOSでibus-mozcをインストールする場合、fedoraのrpmファイルを取得する方法が一番確実っぽいです。


# その他

- xrdp経由でxfce4を動かすところまで行けなかった．．．
[Akka-HTTP]DSLにおける暗黙の型変換


`akka.http.scaladsl`パッケージをimportすることで使えるようになるDSLが、
裏側でどのように実装されているか気になったので調べた。

## 題材

akka-httpにおいて、単純なルーティングについて考えてみる。

```scala
val route = path("ping") {
  get {
    complete("pong")
  }
}
```

`localhost:8080/ping`にGETリクエストを送ると期待通りに`pong`と返ってくる。

```
$ curl localhost:8080/ping
pong
```

## implicit conversionを明示する

この`route`が`Route`たるために、implicit conversionがふんだんに使われている。
implicitなconversionを明示的にして変数に束縛して型注釈をつけるとこうなる。

```scala
// path
val pingSegment: String = "ping"
val pingMatcher: PathMatcher[Unit] = ImplicitPathMatcherConstruction.segmentStringToPathMatcher(pingSegment)
val pingDirective: Directive[Unit] = path(pingMatcher)

// response
val pongStr: String = "pong"
val pongMarshal: ToResponseMarshallable =
  ToResponseMarshallable.apply(pongStr)(PredefinedToEntityMarshallers.StringMarshaller)
val pongStandardRoute: StandardRoute = complete(pongMarshal)

// construct route
val getPingPath: StandardRoute => Route = s =>
  Directive.addByNameNullaryApply(MethodDirectives.get)(s)
val pingRoute: Route = getPingPath(pongStandardRoute)
val pingRouter: (=> Route) => Route = Directive.addByNameNullaryApply(pingDirective)
val route: Route = pingRouter(pingRoute)
```

思ったより量が多くなった。
なおimplicit conversionを明記だけなら多少は読みやすくなる。

```scala
Directive.addByNameNullaryApply(path(ImplicitPathMatcherConstruction.segmentStringToPathMatcher("ping"))) {
  Directive.addByNameNullaryApply(MethodDirectives.get) {
    complete(ToResponseMarshallable("pong"))
  }
}
```

## DSLはどのようにimplicit conversionされているか

実際にDSLを使用するだけであれば特に意識する必要はないが、DSLの裏で行われていることをざっとまとめると以下。

- `path`の引数に渡している`String`は`PathMatcher[Unit]`にimplicit conversionされる
  - `PathMatcher[L]`になる場合(`path`に正規表現を渡すとか)もあり、その場合は`Directive[L]`となる
    - `Directive[L]`は`L => Route`な関数を受け取る
- `complete`の引数に渡している`String`は`ToResponseMarshallable`にimplicit conversionされる
  - 標準で用意されているMarshallerは[PredefinedToEntityMarshallers](https://github.com/akka/akka/blob/master/akka-http/src/main/scala/akka/http/scaladsl/marshalling/PredefinedToEntityMarshallers.scala)を参照
  - その他の型については自前でMarshallerを実装すれば良い
- `Directive[L]`を`Directive.addByNullaryApply`によって`Route => Route`な`Function1`にimplicit conversionされる
  - 今回は`Directive0`、すなわち`Directive[Unit]`なので`Directive.addByNameNullaryApply`が使われる
  - `Directive[L]`の場合は`Directive.addDirectiveApply[L]`が使われる
Zybo / Zynq > XGpioPs_SetIntrTypePin() > XGpioPs_SetIntrTypePin(&GpioPs, 0x10, XGPIOPS_IRQ_TYPE_EDGE_FALLING);

http://qiita.com/7of9/items/443fe12992708582efa5
で引っかかったGPIOの割込み設定。

XGpioPs_SetIntrTypePin()で検索して使用例を見つけた。

https://forums.xilinx.com/t5/Zynq-All-Programmable-SoC/GPIOPS-interrupt-problem/td-p/441640

```
while (1)
{/*
u32 data;
XGpioPs_SetOutputEnablePin(&GpioPs, 0x10, 0x0);
data = XGpioPs_ReadPin(&GpioPs, 0x10);
XGpioPs_SetIntrTypePin(&GpioPs, 0x10, XGPIOPS_IRQ_TYPE_EDGE_FALLING);
data = XGpioPs_IntrGetStatus(&GpioPs, 1);
XGpioPs_IntrClear(&GpioPs, 1, 0xFFFFFFFF);
data = XGpioPs_IntrGetStatus(&GpioPs, 1);
data = XGpioPs_ReadPin(&GpioPs, 0x10);*/
}
return 0;
}
```

whileで使っているので割込みとしてきちんと使っていない（かつコメントアウトしているようだ）だが、コードの勉強にはなる。

```
XGpioPs_SetIntrTypePin(&GpioPs, 0x10, XGPIOPS_IRQ_TYPE_EDGE_FALLING);
```

xgpiops.hでは以下の定義だった。IrqTypeにはXGPIOPS_IRQ_TYPE_EDGE_FALLINGなどを定義できるというのが分かった。

```
void XGpioPs_SetIntrTypePin(XGpioPs *InstancePtr, int Pin, u8 IrqType);
```

## at adamTaylor

adamTaylorでも読んでいたが、忘れていた。

http://qiita.com/7of9/items/819f92658f652a18797d