OmniAICreator/Qiita-1.07M huggingface dataset:
「進捗・どう・です・か」をランダムに表示し「進捗どうですか」が完成したら煽ってくるバッチ

　[「進捗・どう・です・か」をランダムに表示し「進捗どうですか」が完成したら煽ってくるClojure](http://qiita.com/esehara@github/items/c57cafa57aa92dc1e3c2)　様に影響され、気付いたら出来上がっていました。

　1000字を超えても完成しなければ煽られずに済むおまけつきです。

```lang:「進捗・どう・です・か」をランダムに表示し「進捗どうですか」が完成したら煽ってくるバッチ.bat
@echo off
mode con:cols=100 lines=50
title 「進捗・どう・です・か」をランダムに表示し「進捗どうですか」が完成したら煽ってくるバッチ
:top
cls
set word=
echo 「進捗・どう・です・か」をランダムに表示し「進捗どうですか」が完成したら煽ってくるバッチ
echo.
echo 何かキーを押すと進捗状況を確認します
pause >nul
set loop=0
set wcount=0
:generate
set /a num=%random%*4/32768
set str=進捗
set length=2
if %num% == 1 set str=どう
if %num% == 2 set str=です
if %num% == 3 set str=か&set length=1
set /a loop+=1,wcount+=length
goto write

:write
set word=%word%%str%
set judge=%word:~-7%
cls
echo %word%
if %judge% == 進捗どうですか goto fin
if %wcount% geq 1000 goto out
goto generate

:fin
echo.
echo.
echo.
echo.
timeout /t 2 /nobreak >nul
echo 　　　　　　　　　　　　　　　　　　　　　＿人人人人人人人＿
echo 　　　　　　　　　　　　　　　　　　　　　＞進捗どうですか＜
echo 　　　　　　　　　　　　　　　　　　　　　￣Y^^Y^^Y^^Y^^Y^^Y^^Y^^￣
echo.
echo 　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　%wcount%文字で煽られました。
pause >nul
goto top

:out
echo.
echo.
echo.
echo.
timeout /t 2 /nobreak >nul
echo 　　　　　　　　　　　　　　　　　　　　　　　　　ふう…。
echo.
echo 　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　煽られずに済みました。
pause >nul
goto top
```


　　　　　　　　　　　　　　　　　　　　　　**進捗ダメです**



　以上です。ありがとうございました。
PHPのORM「Idiorm」とActiveRecord「Paris」を使ってみた感じ

PHPで既存システムに導入するのに手軽なORMとかActiveRecord探してて「Idiorm」と「Paris」を見つけたので、導入前に使用してみました。

Idiorm and Paris - object relational mapper (ORM), fluent SQL query builder and Active Record implementation for PHP
http://j4mie.github.io/idiormandparis/

このページみるとだいたい使用した感じが伝わってきますね。

# 感想

* ドキュメントしっかりしてるし簡単に読める。
* 軽量で既存システムにも導入しやすい。
* 一通り必要と思われる機能は揃っているし、書き方も嫌いじゃない。
* テーブル名とか外部キーの名前とか辛いことになってるのにも対応できる。

# 使用した感じ

ちょっと導入前に使用してみた感じです。

```php
<?php
require_once './libs/idiorm/idiorm.php';
require_once './libs/paris/paris.php';

# データベース設定
ORM::configure('mysql:dbname=dbname;host=localhost:3306:/tmp/mysql.sock;charset=utf8');
ORM::configure('username', 'root');
ORM::configure('password', 'root');
```

```php
<?php

require_once 'config.php';

class Company extends Model{

  public static $_table = 'company';    # table name (異なる場合オーバライドできる)
  public static $_id_column = 'id';     # primary key (同様)

  # Userモデル関連付け
  public function users(){
    return $this->has_many('User', 'company'); # もし外部キーがcompany_idでなくcompanyの場合でも
  }

  public function systemAdmin($orm){
    return $orm->where('admin', true);
  }

}
```

```php
<?php

require_once 'config.php';

class User extends Model{

  public static $_table = 'users';
  public static $_id_column = 'id';

  # 関連付けはRubyのactive_reocordみたいに双方には書かなくていいみたい
  
  public function isAdmin(){
    if ($this->master == true) return true;
  }
}
```

```php
<?php

require 'Company.class.php';
require 'User.class.php';

$company = Model::factory('Company')->find_one(1);
$users   = $company->users()->find_many();

foreach($users as $user){
  if ($user->isAdmin()){
    echo $user->name . 'はadminです。';
  }
}
# Get
print $company->name;
# => テスト

# Update
$company->set(array(
  'name'    => '株式会社ユニキャスト',
  'address' => '茨城県日立市'
));
$company->save();

print $company->name;
print $company->address;
#= > 株式会社ユニキャスト 茨城県日立市

# filterとかもいける
$system_admin = Model::factory('Company')->filter('systemAdmin')->find_one(1);
print $system_admin->name;
# => 株式会社ユニキャスト

# Create
$new_company = Model::factory('Company')->create();
$new_company->set(array(
  'name'      => '株式会社テスト',
  'address'   => '東京都'
));
$new_company->save();

```

こんな感じです。

PHPでちょっとORMとかActiveRecord使いたいときにいいかも。

# 参考

ドキュメント読みやすい。

Welcome to Idiorm’s documentation! — Idiorm documentation
http://idiorm.readthedocs.org/en/latest/index.html
Welcome to Paris’s documentation! — Paris documentation
http://paris.readthedocs.org/en/latest/index.html
BloggerでMarkdown書けるようにした。

#Markdownめっちゃ良い。
さいきん、Qiitaに初投稿してみました。
> [kimonolabsの使い方 基礎編](http://qiita.com/her0m31/items/b844ff74a9d488c9dc81)

実は、Markdownで何か書く体験も、これが初めてだったりします。
めっちゃ良いです。気に入りました。

ということでbloggerでMarkdownで書けるようにしてみました。
ちなみに以下の記事を参考にしました。
> [Blogger で Markdown 記法で投稿する方法](http://blog.ccm-lulu.com/2013/01/blogger-markdown.html)

え、何でqiitaでやんないかって？
はてなでやれ？
まぁ、そういうなって。
#bloggerテンプレートhtmlの編集
まずは、bloggerのテンプレートHTMLを編集します。

![スクリーンショット_0027-07-15_17_35_15.png](https://qiita-image-store.s3.amazonaws.com/0/31946/845cd2b7-dccf-366f-4d00-2f4891feb044.png)

MarkdownからHTMLに変換することで、実現するので変換スクリプトをHTMLに埋め込みます。
参考記事と同様、marked.js を使用することにしました。
以下のjavascriptを\</body>の直前にコピペします。

```lang:template
<script src='https://rawgithub.com/chjj/marked/master/lib/marked.js'/>
<script>

var mdEls = document.querySelectorAll('.markdown');
for(var i in mdEls){
	var mdEl = mdEls[i];
	var converted = document.createElement('div');
	converted.innerHTML = marked(mdEl.value);
	mdEl.parentNode.replaceChild(converted, mdEl);
}
</script>
```

![スクリーンショット_0027-07-15_17_37_50.png](https://qiita-image-store.s3.amazonaws.com/0/31946/bcb9096a-7060-5b47-2769-f26249823e30.png)

#CSSの追加編集
次にbloggerのCSSの追加編集をします。

![スクリーンショット_0027-07-15_17_35_15.png](https://qiita-image-store.s3.amazonaws.com/0/31946/f3e97f4c-2a3a-1e37-dbeb-9b5c702b254a.png)

カスタマイズの、

![スクリーンショット_0027-07-15_17_54_52.png](https://qiita-image-store.s3.amazonaws.com/0/31946/8ad4658b-633f-317b-3f6b-86dc7221698c.png)

上級者向けの、CSSを追加に以下のCSSを追加します。

```
.markdown  {
  width:100%;
  height:auto;
  overflow:scroll;
  background-color:#ffffff; 
}
.showdown {
  background-color:#ffffff
}
.showdown img {
  height:auto;
  width:100%;
}
```
background-color:#ffffff;は設定している背景色に合わせると良いと想います。
#投稿
あとは投稿画面のHTML記述のほうで、

```
<textarea border-style:dotted="border-style:dotted" class="markdown" disabled="disabled">

# test1

</textarea>
```

として\<textarea>タグの中にMarkdownで記述していけばokです。
プレビューができないので、そこだけは不便かもしれない。

試しに、qiitaのMarkdownをそっくりそのままコピペしたのが、下記の記事になります。
[kimonolabsの使い方 基礎編(blogger)](http://blog.her0m31.me/2015/07/kimonolabskimonolabshttpswww.html#more)

*ちなみにcssのimgを設定しているのは、そのままだと大きな表示なってしまうからだったりします。画像URLがqiitaのままなので元サイズでるのが当然でした。

#Tips:投稿テンプレートの設定
bloggerは投稿テンプレートの設定ができるので設定しておくと次回以降が楽です。

設定の、投稿とコメントの設定から投稿テンプレートを設定できます。

![Blogger__her0m31_s_blog__-_投稿とコメントの設定.png](https://qiita-image-store.s3.amazonaws.com/0/31946/be54dd3b-1ae3-3a77-5314-837dcb78236e.png)

#おわり
bloggerも使うようにしよう
PDOで取得したデータ型がDATETIMEだったら、DateTimeオブジェクトに入れる


PDOで普通にDATETIME型やTIMESTAMP型の取得すると、PHP的には文字列になってしまう。
***PDOStatement::bindColumn***とかでDateTimeオブジェクトに変換できれば美しいんだけど、できなそうだったので泥臭く実装してみました。

```php

// SELECT実行
$sth -> execute();

// DATETIME型のカラム名配列を作成する
$datetimeColumnNameArray = array();
for ($i = 0; $i < $sth -> columncount(); ++$i ) {
	// カラムのメタ情報を取得
	$columnMeta = $sth -> getColumnMeta( $i );
	// DATETIME型の場合
	if ( strcmp( $columnMeta['native_type'], 'DATETIME' ) == 0 ) {
		$datetimeColumnNameArray[] = $columnMeta['name'];
	} else {
		;
	}
}

// 結果を入れる配列
$valueArray = array();

// 結果を取得
while ( $value = $sth -> fetch( PDO::FETCH_ASSOC ) ) {
	// DATETIME型配列に含まれていたら、DateTimeオブジェクトにする
	foreach ( $datetimeColumnNameArray as $datetimeColumnName ) {
		$value[$datetimeColumnName] = new DateTime( $value[$datetimeColumnName] );
	}
	$valueArray[] = $value;
}
```

レコード数×DATETIME型のカラム数だけループが回るから、負荷的にちょっと心配。

何か他に良いやり方を知っている方がいれば、是非とも教えて下さいませm(__)m
イントラでget_avatar()使うとAvatarが上手いこと出てこない


**色々うまく動いてなかったので直しました...**

イントラでDefault Avatorを変更したいときにlocalのファイルを見てくれなかったのでメモ
Wordpress 4.2.2

Simple Local Avatarプラグインを使ってローカルのものを見て欲しいのに、
get_avatar()を普通に使うと、GravatarかWordPressのPhotonを見に行く形にURLが整形されてしまう。

こんな感じ
```<img alt="" src="http://2.gravatar.com/avatar/5c352d2f2b385a211964ad3daf1fe230?s=26&amp;d=http%3A%2F%2F192.168.33.10%2Fwp-content%2Fthemes%2Fpc-test%2Flibrary%2Fimages%2Frobot.png&amp;r=g" srcset="http://2.gravatar.com/avatar/5c352d2f2b385a211964ad3daf1fe230?s=52&amp;d=http%3A%2F%2F192.168.33.10%2Fwp-content%2Fthemes%2Fpc-test%2Flibrary%2Fimages%2Frobot.png&amp;r=g 2x" class="avatar avatar-26 photo" height="26" width="26">```

そこで、[こちらのサイト](http://ateitexe.com/avatar-customize/)に記載されているような方法でDefault Avatarを変更しようとすると、上記の原因でイントラのサーバの画像をキャッシュしてもらえず、画像が見つからない形となってしまう。

その時の回避

function.phpあたりに以下のようなものを追加する

```
function custom_get_avatar($avatar,$id_or_email,$size,$default) {
    
    $robot = get_template_directory_uri() . '/library/images/no-img-robot.png';
    if ( strpos($avatar, 'gravatar.com') !== false ) { # Gravatar使ってるやつだけローカルパスに置き換え
        return "<img src=\"$robot\" />";
    }

    return $avatar;
}

add_filter( 'get_avatar', 'custom_get_avatar', 10, 4 );
```

get_avatar()に指定される$defaultには、どうやらAvatar画像のアドレスが入るみたい。
そのため、Default Avatarに指定したものと同じパスが来たら、get_avatar()でURLがGravatarのものに書き換えられる前に返してしまう。といったイメージのようです。

慌ててやったのでどこかで大きさがずれちゃうかもしれないです。
$sizeあたりからwidth/heightを拾ってclassに追加してあげたほうがいいかも。

下のサイトを参考にかきかえますた

* http://wordpress.stackexchange.com/questions/159482/custom-gravatar-not-working/159949#159949
* https://ja.forums.wordpress.org/topic/16276


\# 本当はAvatarの名前とかで当てたいんだけど方法がわからん...
\# Gravatarとの同居もしたいけど↑が解決できなくて諦め...
プロキシを超えてHTTPのCONNECTメソッドを発行する

#プロキシを超えたいなあ　ってとき

#事前準備（パスワードがある場合）
##basic認証用のパスワードを作成する
`echo -n 'アカウント:パスワード' |base64`


#CONNECTする

```
telnet プロキシサーバIP　ポート番号
Trying xx.xx.xx.xx....
Connected to xxxxxxxxxx.

CONNECT 接続先:ポート番号 HTTP/1.1　（1.0の場合もあり）　　
Proxy-Authorization: Basic Basic認証パスワード

HTTP/1.1 200 Connection established

```

つながった！

[このサイト](http://kshimo69.hatenablog.com/entry/20110822/1314014349)がわかりやすいですね！
Android 2系~5系で動く、intentでの画像取得にハマった（起動アプリ調整）


## もともとはシンプル
```Java
Intent intent = new Intent();
intent.setAction(Intent.ACTION_PICK);
intent.setType("image/*");
startActivityForResult(intent, REQUEST_CODE);
```

こんな感じで対応すれば動いていましたが、kitkatから対応方法が変わったのは有名ですね。

- https://developer.android.com/reference/android/content/Intent.html

## 最初の対応方法
```Java
if (isKitkat) {
    Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
    intent.addCategory(Intent.CATEGORY_OPENABLE);
    intent.setType("image/*");
    startActivityForResult(intent, REQUEST_CODE);
} else {
    Intent intent = new Intent();
    intent.setType("image/*");
    intent.setAction(Intent.ACTION_PICK);
    startActivityForResult(intent, REQUEST_CODE);
}
```

みたいな感じで、 `ACTION_OPEN_DOCUMENT` と `ACTION_PICK` を使い分けていました。

が、この実装方法だと起動するアプリがドキュメントになっちゃうし、要件によってはちょっと使いづらいものになっちゃうんです。
そうじゃないんだよ。俺は、 `フォト` とか `ギャラリー` アプリが起動して欲しいんだよ！って感じだったので調べました。

## そこで対応したのがこちら

```Java
Intent intent = new Intent(Intent.ACTION_PICK,
    MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
    
intent.setType("image/*");

startActivityForResult(
    Intent.createChooser(
        intent,
        getResources().getString(chooseString)
    ),
    REQUEST_CODE);
```

- `ACTION_PICK` に `MediaStore.Images.Media.EXTERNAL_CONTENT_URI` という `Uri` を渡します。
- 今回は不要でしたが、要件に合わせて `intent.putExtra(Intent.EXTRA_LOCAL_ONLY, true);` など追加してください。
- ついでに、 `createChooser` することで起動アプリの選択も行うように修正しました。

これで `intent.getData();` すれば `Uri` が取得できますよ。

## 別の話
上記対応をしていて、 `getData();` した返り値の処理が結構面倒でした。
`content://com.google.android.apps.photos.contentprovider` の場合とか色々ですね。
よかったら、みなさんも試してみてください。
Retrofitで実装したRESTクライアントでオレオレ証明書を許可する

[「[Android] OkHTTP + Retrofit + RxAndroid で REST クライアントを実装する ｜ Developers.IO」](http://dev.classmethod.jp/smartphone/android/okhttp-retrofit-rxandroid/)を参考にRetrofitを利用してRESTクライアントを実装していた時に、テスト環境の接続先が自己署名SSL証明書というよくあるアレだったためにやったことのメモです。

#オレオレ証明書を許可するOkHttpClientの作成
[OkHttpで認証・SSL通信・クッキー管理するTips - Qiita](http://qiita.com/muran001/items/ddbd0341670fb03dce05)ほぼそのままです。（とりあえずエラーハンドリングは適当です）

```java
@Override
public OkClient createOkClient() {
    OkHttpClient client = new OkHttpClient();
    final TrustManager[] trustManagers = new TrustManager[]{
            new X509TrustManager() {
                @Override
                public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
                    // 特に何もしない
                }

                @Override
                public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
                    // 特に何もしない
                }

                @Override
                public X509Certificate[] getAcceptedIssuers() {
                    return null;
                }
            }
    };
    try {
        final SSLContext sslContext = SSLContext.getInstance("SSL");
        sslContext.init(null, trustManagers, new java.security.SecureRandom());
        final SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();
        client.setSslSocketFactory(sslSocketFactory);
        client.setHostnameVerifier(new HostnameVerifier() {
            @Override
            public boolean verify(String hostname, SSLSession session) {
                // ホスト名の検証を行わない
                return true;
            }
        });
    } catch (NoSuchAlgorithmException | KeyManagementException e) {
        e.printStackTrace();
    }
    return new OkClient(client);
}
```

#RestAdapterの作成
参考にしたコードにsetClient一行加えるだけです。

```java
RestAdapter adapter = new RestAdapter.Builder()
                .setEndpoint("https://oreore.org")
                .setConverter(new GsonConverter(gson))
                .setLogLevel(RestAdapter.LogLevel.FULL)
                .setClient(createOkClient())
                .build();
```
xmonadでLibreofficeを起動するとフォーカスがループする問題

割と困っていたこの問題。Libreofficeでダイアログウィンドウを表示すると、フォーカスがチラチラと移って、CPU使用率がガンガン上がって使用不能になる現象です。

# 解決策

以下を参照にしてください。

- [Xmonad and Libreoffice/OOo / Applications & Desktop Environments / Arch Linux Forums](https://bbs.archlinux.org/viewtopic.php?pid=1037847#p1037847)

`~/.xmonad/xmonad.hs`に、

```haskell
import XMonad
import XMonad.Hooks.EwmhDesktops

main = xmonad $ ewmh defaultConfig
```

のように[XMonad.Hooks.EwmhDesktops](http://xmonad.org/xmonad-docs/xmonad-contrib/XMonad-Hooks-EwmhDesktops.html)をインポートして、defaultConfigの前に"ewmh"を書いておけばいいみたいです。
Swift 文字列

#### 文字列の入れ替え

```swift
let str:String = "abcdefghi"
println(str.stringByReplacingOccurrencesOfString("b", withString: "B", options: nil, range: nil)) 
// aBcdfghi
```

#### 文字の数

```swift
let codeString = "test"
count(codeString.utf16) // 4
```


#### 正規表現 
- 正規表現の勉強や試すができるサイト　http://regexr.com/
- 置き換え

```swift
let textString = "http://www.test.jp/page"
var regVersion = textString.stringByReplacingOccurrencesOfString("http://([a-zA-Z0-9]|.|)+/", withString: "$1", options: NSStringCompareOptions.RegularExpressionSearch, range: nil)
// page
```
- 抽出

```swift
let textString = "http://www.test.jp/page"
let patternStr = "http://([a-zA-Z0-9]|.)+/"
let nsText = textString as NSString

let regex = NSRegularExpression(pattern: patternStr, options: NSRegularExpressionOptions.CaseInsensitive, error: nil)
let results = regex!.matchesInString(textString, options: NSMatchingOptions.allZeros, range: NSMakeRange(0, nsText.length))
let url = results.map {nsText.substringWithRange($0.range)}
print(url[0]) // http://www.test.jp/
```
#### 文字列があるかどうか
```swift
let url = "http://www.test.jp"
if let range = url.rangeOfString("http") {
   return true
} else {
   return false
}
```
EC2 Document (VPC) まとめ

参考は「[Amazon Elastic Compute Cloud - Amazon EC2 と Amazon Virtual Private Cloud](http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/using-vpc.html)」
あとこちら。「[Amazon Virtual Private Cloud](http://docs.aws.amazon.com/ja_jp/AmazonVPC/latest/UserGuide/VPC_Introduction.html)」

EC2インスタンスを起動するとき、 *EC2 Classic* と *VPC* とではどう違うのか？といった部分がまとめられています。EC2 Classicをご利用のお客様の運用やVPC移行をする場合にはこの辺が役立つのではないかと。

# はじめに
従来のDC(データセンター)で運用していたネットワークの環境によく似ている、らしい。AWSのスケーラブルなインフラを使ってネットワークの構築ができるところがメリット。設定をコントロールできる範囲も(たぶん)広い。例えば以下のようなもの。

- IPの範囲
- サブネットの作成
- ルーティングテーブル
- ネットワークG/W
- セキュリティ

既に自前で持っているDCに対してVPCを接続することもできる。よって、VPCを既存環境(DC)の拡張として使うことができる。

VPCサブネットのセキュリティにはSecurity Group, Network ACLなど、複数のセキュリティレイヤを使用できる。SG(Security Group)とNACL(Network ACL)の違いは[VPCドキュメント](http://docs.aws.amazon.com/ja_jp/AmazonVPC/latest/UserGuide/VPC_Introduction.html)の[VPC のセキュリティ](http://docs.aws.amazon.com/ja_jp/AmazonVPC/latest/UserGuide/VPC_Security.html)にて記載があります。ざっくり言うと以下のようなことかなと思っています。

- SG
	+ 保護する対象はインスタンス(もしくはインスタンスのグループ)
	+ デフォルトDenyで「許可する」の設定のみ可能
	+ ステートフル(トランスポート層のイメージ。 往復の概念がある)
- NACL
	+ 保護対象は個々のサブネット。
	+ 「許可」「拒否」の設定を両方記述する
	+ ステートレス(ネットワーク層のイメージ。 往復の概念はない)

NACLでは **In/Out** の両方を意識する必要がある、っていうところが注意点のように思います。
ちなみに、NACLの設定を見てみても以下のような注意書きがありますね。落とし穴なんでしょう。

> (インバウンドの設定ペインにて)インバウンドトラフィックを許可します。ネットワーク ACL はステートレスであるため、インバウンドおよびアウトバウンドルールを作成する必要があります。

# EC2インスタンスを起動するネットワーク(Default VPC/それ以外)による違い
ドキュメントで対応しているのは[EC2-Classic と EC2-VPC の違い](http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/using-vpc.html#differences-ec2-classic-vpc)です。EC2-Classicは置いといて、 *Default VPCかどうか？* の違いに着目して見てみます。

|特徴|Default VPC|Default VPC以外|
|:----:|:-----|:-----|
|public IPの割り当て(デフォルト設定)|Yes <small>(注1)</small>|No|
|DNSホスト名の有効/無効(デフォルト設定)|有効|無効|
|インスタンスのインターネットアクセス|可能|不可|
<small>注1 ... ただし、デフォルトのサブネットで起動し、かつデフォルトのサブネットのPublic IP属性を変更していない場合</small>

あと、設定項目の上限値。こちらはVPC共通。

|項目|値|
|:---:|:---|
|VPCあたりの最大SG数|100|
|リージョンあたりの最大SG数|500|
|SGに追加可能なルール数|50 <small>(注2)</small>|
|単一インスタンスあたりに同時割り当て可能なSG数|5 <small>(注3)</small>|

<small>注2 ... おそらくInbound/Outboundでの合計数。要検証
注3 ... インスタンスの起動時/実行中に割り当てが可能</small>

# 以降、工事中
時間作って追記しますー。
sbt で Gradle の distZip 相当のことをやりたい

# やりたいこと

Java のコマンドラインアプリケーションをデプロイするときに Gradle の [application プラグイン](http://gradle.monochromeroad.com/docs/userguide/application_plugin.html)の `distZip` を使ってアプリケーションの実行に必要な依存ライブラリや実行スクリプトをまるっと用意するというのをよくやっていました。

sbt でのビルドを前提として Scala で開発しているときに同等のことができないかと探していたら、 [SBT Native Packager Plugin](http://www.scala-sbt.org/sbt-native-packager/index.html) にたどり着きました。

# 使い方

使い方は公式サイトに記載のとおりですが、Java コマンドラインアプリケーションでの例を以下にも書いておきます。

1.`project/plugins.sbt` に以下を追加

```scala:project/plugins.sbt
addSbtPlugin("com.typesafe.sbt" % "sbt-native-packager" % "1.0.3")
```

2.`build.sbt` に以下を追加

```scala:build.sbt
enablePlugins(JavaAppPackaging)
```

3.コマンドラインで以下を実行

```shell-session
sbt universal:packageBin
```

以上で `target/universal` に `distZip` と同様の zip ファイルが生成されます。

# その他

zip 形式だけでなく、Native Packager では他にも[いろいろな形](http://www.scala-sbt.org/sbt-native-packager/gettingstarted.html#packaging-formats)でパッケージングできます。

以上、「Gradle distZip」と「sbt」で検索したとき用のポストでした。（すぐに辿りつけなかったので）
管理者権限で外部プロセスを起動する（OSX）

##Problem
外部プロセスを叩いてシステムに関わる設定を変更する，というニーズは少なからず発生します。
環境によっては`visudo`でパスワード無しtty無しを許可すれば事は足りますが，そのような設定が困難な場合に。

##Solution
###A.sudoers設定が可能な環境の場合
Mono on Linuxなどではこちらで。

```cs:sudo.cs
var psi = new ProcessStartInfo();
psi.FileName = "/usr/bin/sudo"; // 環境による
psi.Arguments = "(実行したいコマンドと引数)";
var p = Process.Start(psi);
p.WaitForExit();
```

###B.どこで実行されるかわからない場合
OSXは基本的にこちらで。
AppleScript を叩いて実行していきます。
事前に実行したいコマンドをシェルスクリプトにまとめておくといいです。

```cs:withadmin.cs
var psi = new ProcessStartInfo();
psi.FileName = "/usr/bin/osascript";
psi.Arguments = "-e \"do shell script \\\"(path to shellscript)\\\" with administrator privileges\"";
var p = Process.Start(psi);
p.WaitForExit();
```

実行すると管理者のパスワード入力を求めるプロンプトをOSが表示してくれます。

##Conclusion
AppleScript, もしくはシェルスクリプトで実行したい処理をまとめておくと，例外時のハンドリングもしやすいかと思います。
iPod touch 第四世代でWi-Fiに繋がらない（取り急ぎの解決方法）

Wi-Fiに繋ぐと下記の画面になってしまう。
apple.comtって何よ！！

![IMG_6706.jpg](https://qiita-image-store.s3.amazonaws.com/0/85010/dea77035-66da-2e7c-f4e7-9430d470152b.jpeg)

```lang:
<HTML><HEAD><TITLE>Success</TITLE><HEAD><BODY>Success</BODY></HTML>
```

下記の手順でとりあえずネットに繋げるようになる。
1.ルータのWANケーブルを抜く（インターネットから切断する）
2.iPod touchでいつも通りWi-Fiに繋ぐ
→この時点で上画像のエラーは出ない
3.ルータのWANケーブルを接続する（インターネットに繋ぐ）

この後で、iPodtouchを休止にしたりしてWi-Fiから切断されるとまた同現象が発生するorz

**<2015年7月15日 追記＞**
もっと簡単な方法があった。
1.Wi-Fiに繋ぐ
→上画像のエラーが発生
2.Wi-Fiの設定から「自動ログイン」をOFFにする

これでエラーが出なくなる。

**<2015年7月16日 追記＞**
今朝エラーが出なくなっていた。
そして「自動ログイン」の項目がなくなってた。
c++ builder XE4, 10.2 Tokyo > Stringがfloat型のデータか文字列かのチェック

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

受け取ったString文字列がfloat型のデータか、文字列かのチェックをする処理。

IsNumeric()はIdGlobalのものを使用している。余分なincludeが加わるので、本当は自分で実装するのが望ましい。

```cpp
#include <IdGlobal.hpp> // for IsNumeric()

static bool s_isFloatingPointValue(String str)
{
	int decimalPoint = str.Pos(L".");

        // 1. 小数点付き
	if (decimalPoint > 0) {
		String wholeNumber = str.SubString(0, decimalPoint - 1);
		String fractional = str.SubString(decimalPoint + 1, str.Length() - decimalPoint);
		if (IsNumeric(wholeNumber) && IsNumeric(fractional)) {
			return true;
		}
		return false;
	}

        // 2. 整数のみ
	if (IsNumeric(str)) {
		return true;
	}
	return false;
}
```

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

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

Tokyoでも同じ動作になることを確認した。
CoffeeScriptで記述したAWS Lambda関数をGulpでデプロイする

タイトルの通り、AltJS系言語であるCoffeeScriptを用いてAWS Lambda関数を記述し、それをGulpを使ってデプロイする手順について述べます。

# ※2015年10月9日追記

より手軽にAWS LambdaでCoffeeScriptを使うために`lamjet`というツールを作成し、それについての記事を書きました。あわせてご参照ください。
[lamjet を使って AWS Lambda に CoffeeScript で書かれた関数を楽々デプロイする方法](http://qiita.com/yuyakato/items/268ee2e2059bef3c6717)

# 1. やりたいこと

- AWS Lambdaの関数（以下、Lambda関数）をCoffeeScriptを用いて記述する
- Lambda関数をgulpコマンド1発でデプロイする

# 2. 結論

[lambduh/lambduh-gulp](https://github.com/lambduh/lambduh-gulp)を使うのが便利です。ZIPファイルの生成、アップロードなどのGulpタスク一式が含まれています。

他にも以下の様なGulpプラグインが見つかりますが、どちらもLambda関数の登録、アップロードを主眼としており、関連タスクまでは含まれていません。複数のLambda関数のアップロードを行うなど、より細かい、より複雑な制御を行う場合は、これらの方が便利かもしれません。

- [willyg302/gulp-awslambda](https://github.com/willyg302/gulp-awslambda)
- [ThoughtWorksStudios/node-aws-lambda](https://github.com/ThoughtWorksStudios/node-aws-lambda)

# 3. `js`タスクの上書き

`lambduh/lambduh-gulp`はJavaScript用に作られているため、CoffeeScriptを使う場合には`js`タスクの上書きが必要です。

```coffeescript:gulpfile.coffee(抜粋)
# ...
gulp.task "js", ->
  gulp.src("./src/*.coffee")
    .pipe(coffee({bare: true})).on("error", gutil.log)
    .pipe(gulp.dest("./dist"))
```

# 4. ファイル構成

今回は、1つのLambda関数を1つのディレクトリとして管理します。ファイル構成は以下の通り。

```
lambda-function-name/  ..  Lambda関数の管理用ディレクトリ。
  dist/  ................  ビルド結果が格納されるディレクトリ。Gulpにより生成される。
  node_modules/  ........  パッケージディレクトリ。
  src/  .................  CoffeeScriptを格納するディレクトリ。
    index.coffee  .......  Lambda関数の本体。
  dist.zip  .............  Lambda関数のZIPアーカイブ。Gulpにより生成される。
  gulpfile.coffee  ......  Gulpの設定ファイル。後述。
  lambda-config.js  .....  Lambda関数の設定ファイル。後述。
  package.json  .........  パッケージの設定ファイル。後述。
```

# 5. 設定ファイルの例

設定ファイルの例は以下の通り。少なくとも`lambda-config.js`の`FunctionName`、`Role`、`Region`を環境に合わせて書き換える必要があります。

```coffeescript:gulpfile.coffee
gulp        = require "gulp"
coffee      = require "gulp-coffee"
gutil       = require "gulp-util"
lambduhGulp = require "lambduh-gulp"

lambduhGulp gulp

gulp.task "js", ->
  gulp.src("./src/*.coffee")
    .pipe(coffee({bare: true})).on("error", gutil.log)
    .pipe(gulp.dest("./dist"))
```

```js:lambda-config.js
module.exports = {
  FunctionName: "function-name",
  Description: "description",
  Handler: "index.handler",
  Role: "arn:aws:iam::XXXXXXXXXXXX:role/yyyy",
  Region: "us-east-1",
  Runtime: "nodejs",
  MemorySize: 128,
  Timeout: 3
}
```

```json:package.json(抜粋)
{
  "devDependencies": {
    "coffee-script": "^1.9.3",
    "gulp": "^3.9.0",
    "gulp-coffee": "^2.3.1",
    "gulp-util": "^3.0.6",
    "lambduh-gulp": "^0.1.1"
  }
}
```

# 6. デプロイ

上記の設定ファイルを用意することで、下記の1行でLambda関数がビルド、ZIPファイル化、アップロードされます。
内部的に`aws-sdk`が使われており、AWS CLIなどと同様に、認証に関する情報を`~/.aws/credentials`ファイルや環境変数に設定する必要があります。

```
$ gulp zipload
```

# 7. 参考

- [A Gulp Workflow for Amazon Lambda — Medium](https://medium.com/@AdamRNeary/a-gulp-workflow-for-amazon-lambda-61c2afd723b6)
- [AWS LambdaファンクションをGulpでデプロイ ｜ Developers.IO](http://dev.classmethod.jp/cloud/aws/how-to-deploy-a-lambda-function-with-gulp/)
fatal error: 'ruby/config.h' file not found エラーの対応

# エラー内容
osx10.9.5環境でshenzhenをインストールしようとしたら

```
#  ~  sudo gem install shenzhen
Password:
Building native extensions.  This could take a while...
ERROR:  Error installing shenzhen:
	ERROR: Failed to build gem native extension.

    /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/ruby -r ./siteconf20150715-80705-c762g.rb extconf.rb
creating Makefile

make "DESTDIR=" clean

make "DESTDIR="
compiling generator.c
In file included from generator.c:1:
In file included from ./../fbuffer/fbuffer.h:5:
In file included from /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/include/ruby-2.0.0/ruby.h:33:
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/include/ruby-2.0.0/ruby/ruby.h:24:10: fatal error: 'ruby/config.h' file not found
#include "ruby/config.h"
         ^
1 error generated.
make: *** [generator.o] Error 1

make failed, exit code 2
```

エラーが出てインストールに失敗する


# 対応
[http://stackoverflow.com/questions/26434642/yosemite-upgrade-broke-ruby-h](http://stackoverflow.com/questions/26434642/yosemite-upgrade-broke-ruby-h)

Command Line Toolsをインストールする
該当のバージョンに合わせたものをダウンロードしてインストール。
今回はxcodeのバージョンに合わせてCommand Line Tools (Osx 10.9) for Xcode 6.2を入れた。

Command Line Toolsインストール後、shenzhenのインストールは出来た。
Exception 発生時に情報を収集する

    Sub dump(ex As Exception)
        debug.print("例外の日付と時刻={0}", DateTime.Now)
        debug.print("マシン名={0}", Environment.MachineName)
        Debug.Print("例外のソース={0}", ex.Source)
        Debug.Print("例外型={0}", ex.GetType.FullName)
        Debug.Print("例外メッセージ={0}", ex.Message)
        Debug.Print("例外スタックトレース={0}", ex.StackTrace)
        debug.print("呼び出しスタック={0}", Environment.StackTrace)
        Debug.Print("アプリケーションドメイン名={0}", AppDomain.CurrentDomain.FriendlyName)
        Debug.Print("アセンブリ名={0}", Reflection.Assembly.GetExecutingAssembly().FullName)
        Debug.Print("アセンブリ バージョン={0}", Reflection.Assembly.GetExecutingAssembly().GetName.Version)
        Debug.Print("スレッド ID={0}", System.Threading.Thread.CurrentThread.ManagedThreadId)
        Debug.Print("スレッド ユーザー={0}", System.Threading.Thread.CurrentPrincipal.Identity.Name)
        Debug.Print("認証タイプ={0}", System.Threading.Thread.CurrentPrincipal.Identity.AuthenticationType)
    End Sub
EC2 Document (主にEIP) まとめ

参照・引用は公式ドキュメント「[Amazon EC2 とは](http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/concepts.html)」「[Elastic IP アドレス（EIP）](http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/elastic-ip-addresses-eip.html)」より。私見で大事そうな部分をメモります。

# EC2の機能
覚えた方がよさそうな単語は以下。

- インスタンスストアボリューム
- EBSボリューム
- EIP (Elastic IP)

<a href="http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/instance-types.html#instance-virtualization-type" target="blank">仮想化タイプ</a>に出てる[AMI仮想化タイプ](http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/virtualization_types.html)のページは時間とって読みたい。

あと、"Amazon EC2リソースにタグを付ける"のページで[請求用のリソースにタグを付ける](http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/Using_Tags.html)のところは面白そうだった。

# EIP
インスタンスに割り当てられるIPだけど、EC2インスタンスではなく *AWSアカウント* に紐付けられるのが面白い。
VPCにおけるEIPの特徴を表にしたものが以下。引用元は[こちら](http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/elastic-ip-addresses-eip.html#VPC_EIP_EC2_Differences)。EC2-VPCのカラムを引用。

|特徴|EC2-VPC|
|:-----|-----|
|割り当て|割り当てたEIPはVPC内でのみ使用されます。|
|関連付け|EIP は Elastic ネットワークインターフェイス（ENI）のプロパティです。EIP とインスタンスを関連付けるには、インスタンスにアタッチされている ENI を更新します。詳細については、「Elastic Network Interface（ENI）」を参照してください。|
|再関連付け|アカウントで EC2-VPC のみをサポートしている場合、既に別のインスタンスに関連付けられている EIP を関連付けようとすると、アドレスは自動的に新しいインスタンスに関連付けられます。EC2-Classicで VPC を使用している場合、既に別のインスタンスに関連付けられている EIP を関連付けようとすると、再関連付けを許可している場合にのみ成功します。|
|インスタンスの停止|インスタンスを停止すると、その EIP は関連付けを維持します。|
|複数IP|インスタンスは複数の IP アドレスをサポートし、それぞれの IP アドレスに対応する EIP を設定できます。詳細については、「複数のプライベート IP アドレス」を参照してください。|

もうちょい噛み砕いた説明をしたいけど、現状置いときます。。

## 電子メールアプリケーションでの逆引き DNS の使用
参考：[EC2 - 電子メールアプリケーションでの逆引き DNS の使用](http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/elastic-ip-addresses-eip.html#Using_Elastic_Addressing_Reverse_DNS)

インスタンスからメールを送る場合のスパム誤判定を防ぐしくみを解説している...と思っています。[電子メール送信制限制御解除申請](https://console.aws.amazon.com/support/home#/case/create?issueType=service-limit-increase&limitType=service-code-ec2-email)のページでメール送信に使うインスタンスのEIPを提供すればOK、とのこと。

> インスタンスから第三者に電子メールを送信する場合、1 つ以上の Elastic IP アドレスをプロビジョニングし、電子メール送信制限解除申請フォームで当社にそれらのアドレスを提供していただくようお願いします。AWS は、ISP およびインターネットアンチスパム組織（Spamhaus など）と協力して、これらのアドレスから送信された E メールにスパムのフラグが付く可能性を減らしています。

また、そのインスタンスに付いたEIPに対して *静的逆引きDNSレコード* を割り当てるとスパム判定される危険が減ることがある、とも言っています。

> また、E メールの送信に使用される Elastic IP アドレスに静的逆引き DNS レコードを割り当てると、アンチスパム組織により E メールにスパムのフラグが付くことを避けられることがあります。前述のフォームを使用して、アドレスに関連付ける逆引き DNS レコードを当社に送信できます。逆引き DNS レコードを作成できるようになる前に、その Elastic IP アドレスを参照する、対応するフォワード DNS レコード（A レコード）が存在している必要があることにご注意ください。逆引き DNS レコードが Elastic IP アドレスに関連付けられると、そのレコードが削除されるまで Elastic IP アドレスを解放することはできません。逆引き DNS レコードを削除するには、AWS サポートにお問い合わせください。 

## EIPの制限
AWSアカウントで5つまで。これはIPv4アドレスが限られた資源であるため。

> EIPは主に負荷分散のユースケースに使用し、DNSホスト名は他のすべてのノード間通信に使用することを強くお勧めします。

ともありますが、これは意図がわかりませんでした。わかったら追記する予定。
WEB上の画像をダウンロード

```lang:php
<?php
    $url = '<a href="http://blog.t-szk.com/wordpress/wp-content/themes/default/images/logo.jpg" target="_blank" rel="noreferrer" style="cursor:help;display:inline !important;">http://blog.t-szk.com/wordpress/wp-content/themes/default/images/logo.jpg</a>';
    $data = file_get_contents($url);
    file_put_contents('./download/dl.jpg',$data);
?>
```
このプログラムを実行すると、downloadディレクトリにdl.jpgという名前で画像が保存されます。PHPマニュアルによるとfile_get_contents関数はテキストで表現される情報だけでなく、バイナリデータも取り扱うことができるとのことです。

http://codaholic.org/?p=341

こういうのコピーでまずいんかな(^o^;)
SalesCubeでInputPOrderSlipDtoにゲッターを追加する方法

SalesCubeの話。
AbstractSlipDto を継承して InputPOrderSlipDto が実装されている。
InputPOrderSlipDto にて、

	public String getYamatoHoge01(){
		return this.supplierName;
	}

のようなゲッターを追加する場合。
AbstractSlipDto　に

	public abstract String getYamatoHoge01();

を追加する。
呼び出し側では下記のように実装する。

	AbstractSlipDto<LINEDTOCLASS> dto = form.copyToDto();
	String piyo = dto.getYamatoHoge01();
個人的に便利なGitコマンド

自分が開発する上で良く使用するコマンド集をメモって置きます。
基本的な開発は以下のコマンド一覧をつかえば何とかなるはず。

#コミット関連
##差分確認
###変更したファイルを確認する
```git status```
変更したファイル一覧が表示される
また、各ファイルがコミット対象に追加されているかも表示される

###ファイルの変更内容を確認する
```git diff```
変更した全てのファイルの差分が表示される
```git diff <ファイルパス>```と叩くと指定のファイルの差分が確認できる
※ファイルパス = ```git status```を叩いた際に表示されるファイルパス

##コミット準備〜コミット実行
###ファイルをコミット対象に追加する
Gitでは実際にコミットを行う前に、コミット対象となるファイルを選択する必要がある
※こちらを行わないと、コミット時に「コミットするモノがありません」という風に弾かれる

```git add -A```
変更があった全てのファイルをコミット対象に追加する
```git add <ファイルパス＞```と叩くと指定のファイルのみをコミット対象に追加する

###ファイルコミット対象から外す
基本的に変更したファイルが自動的にコミット対象となることはないので、
**コミットしたくないファイルを間違えてコミット対象に追加してしまった場合用**となる

```git reset HEAD```
コミット対象として追加されている全てのファイルをコミット対象から外す
```git reset HEAD <ファイルパス>```と叩くと指定のファイルのみをコミット対象から外す

###コミットを実行する
```git commit```
コミット対象に追加されているファイルをコミットします
上記コマンドを叩いた後、コミットメッセージを入力する画面が表示されるので、そちらにコミットメッセージを記入すればコミットは完了となる

別の画面でコミットメッセージを記入するのがイヤという方は
```git commit -m "<コミットメッセージ>```というコマンドで、コミットコマンドと同時にコミットメッセージを登録することができる

###コミットを確認する
```git log```
今までのコミットの一覧が表示される
コミットの数が増えてくると見づらくなるので、
```git log --oneline```の方がオススメ
（１つのコミットログが１行にまとめて表示される）


#ブランチ関連
##ブランチの基本操作
###ブランチの確認
```git branch```
ローカル上に現存するブランチ一覧を表示する
*が付いているブランチが現状作業中のブランチとなる

また、他にもリモート上のブランチを確認するコマンド、全てのブランチを表示するコマンドもある

```git barnch -r```
リモート上のブランチ一覧を表示する

```git branch -a```
ローカル上、リモート上問わず、全てのブランチ一覧を表示する

###ブランチの作成
```git checkout -b <ブランチ名>```
新しいブランチを作成して、移動する
指定のブランチ名が既に存在する場合はエラーとなる

###ブランチの移動
```git checkout <ブランチ名>```
既存のブランチに移動する
指定のブランチ名が存在しない場合はエラーとなる

##ブランチの編集
###ブランチの削除
```git branch -d <ブランチ名>```
指定のローカルブランチを削除する
コミットされていない作業等があった場合はエラーとなる

```git branch -D <ブランチ名>```
指定のローカルブランチを**強制的に**削除する
ブランチの状況問わず削除する

```git push :<ブランチ名>```
指定のリモートブランチを削除する
ローカルブランチとは違い、"**:**"を付けてプッシュすればブランチの削除依頼となる


#おまけ
##作業内容を一時的に破棄する
```git stash```
現在コミットされていない、全ての変更内容が一時的に破棄される
（ゴミ箱の上に積まれる用な感じ）

##stashした内容を復元する
```git stash pop```
**一番最後にstashされたもの**を復元する
復元された後は、該当するstashの情報は破棄される

何回でも```stash```及び```stash pop```は出来るが、
復元されていない、最後にstashされたものを復元するのでstashのしすぎには要注意

stashの履歴から、指定のstashを復元する方法もあるが、ここでは割愛

##コミットログから検索する
```git log --grep <検索内容>```
特定のコミットのコミットIDが欲しい場合、誰がコミットしたか確認したい場合等に重宝する
MySQL4.x から 5.x移行時のエラー対応


さくらのレンタルサーバのDB移行時に出会ったエラーをまとめます

## mysqldumpでExport
まず、4.x環境ではmysqldumpを実行するとエラーが発生します。

なので、dumpは以下のようにコマンドを実行します

```
mysqldump-4.0 -u {{ユーザ名}} -h {{ホスト}} -p{{パスワード}} {{DB名}} > {{出力ファイルパス}}
```


参考：http://blog.dacelo.info/mysql/entry-1031.html



## dumpからImport
4.xと5.xでは構文が違うため、mysqldumpした中身を書き換える必要があります。

変更箇所は３箇所

### CREATE DATABASEの構文を消す

```
CREATE DATABASE `ユーザ名`;
USE ユーザ名;
↓
= CREATE DATABASE `ユーザ名`;
= USE ユーザ名;
```

### TYPE=をENGINE=に変更

vimのコマンドモードで以下を入力すると置換してくれます

```
:%s/TYPE=/ENGINE=/
```

### timestamp(14)をtimestampに変更

vimのコマンドモードで以下を入力すると置換してくれます

```
:%s/timestamp(14)/timestamp/
```

参考：http://www.nishishi.com/blog/2013/06/mysql4_to_5_db.html
NX!inputで「|(パイプ)」が入力できずに困った話

# 課題
現在この入力が生きているのか不明なうえ日本の端末以外は関係ない話です。
過去のSHの端末にNX!inputというATOKベースの入力システムがあるのですが、これで「|(パイプ)」を入力しようとしたら

**…な、ない！？**

どこを探してもありません。「|」がない。記号にもない。
普通の人なら困らないかもしれませんが、ねぇ。

# 解決
googleインプットをデフォルトにして回避しました…
ググっても見つからなかったので、念のため。
less メモ

# less コマンド
```
$ less [オプション] ファイル名
```

## オプション
行数表示: N
パターン検索: p パターン
改行なし: S

## キーバインド
１ページ進む: Space
１ページ戻る: b
半ページ進む: d
ページの先頭に移動: g
ページの最後に移動: G
パターン前方検索: /パターン
パターン後方検索: ?パターン
前方検索繰り返し: n
後方検索繰り返し: N
エディタ起動: v
終了: q

## tail -f で改行なし的な

```
$ less -S+F access_log
```
通常のlessに戻す: Ctrl+C
tail -f に切り替え: Shift+F
max_input_vars対策

PHP5.3で導入された、DoS攻撃対策のmax_input_varsですが、
単純に大きな値を設定するのは避けたいところです。
(本末転倒ですからね。)

ではどのようにして多数の項目を送信すればよいでしょうか。

例えばですが、

```js
//JS
    var data = {
                 "id": "1234567",
                 "member": [
                   {"first_name": "tarou", "family_name": "tanaka"},
                   {"first_name": "satoru", "family_name": "ueki"}
                 ]
               };

    $.ajax({
        type: 'POST',
        data: {data: JSON.stringify(data)},
        url: 'https://xxxx'
    });
```
のようにシリアライズした状態で送信し、

```php
//PHP
    $data = json_decode($_POST['data'], true); //第2引数はtrueにしておく
```
このようにデシリアライズする感じでしょうか。
"<HTML><HEAD><TITLE>Success</TITLE>..." と出てくる不具合対処メモ


Wi-Fiに繋ぐと5分おきくらいに

```
<HTML><HEAD><TITLE>Success</TITLE></HEAD><BODY>Success</BODY></HTML>
```

と表示されたウィンドウがポップアップしてくる（しかも最前面固定）不具合に対する対処メモ．

## Macの場合

参考: http://apple.stackexchange.com/questions/45418/how-to-automatically-login-to-captive-portals-on-os-x?answertab=active#answer-140843


(i) MacのWi-Fi接続テスト機能をとりあえずオフにする

```ターミナル
sudo defaults write /Library/Preferences/SystemConfiguration/com.apple.captive.control Active -boolean false
```
(ii) 再起動


とりあえず自分はこれで出なくなりました．

元に戻すには

```ターミナル
sudo defaults delete /Library/Preferences/SystemConfiguration/com.apple.captive.control Active
```

一時避難的な対処なのでしばらくたったら戻しておこう．

> 2015/07/15 20:15 追記
OS X 10.9.5です

## iPhoneやIPad等, iOSの場合 (2015/07/15 20:15 追記)
※こちらは自分では試していません
参考: https://i-bitzedge.com/tips/wifi-issue-2015-07
rakeタスクがproduction環境でNameErrorになる

# 現象

```shell-session
[user@host]$ RAILS_ENV=production bundle exec rake solr:reindex
rake aborted!
NameError: uninitialized constant ApplicationController
....
```

# 原因

以前の投稿でproduction環境でthread safeの設定をしているため。
http://qiita.com/toshi_dev/items/c1e39666bda177e55c16

```rb:config/environments/production.rb
TestApplication::Application.configure do
...
  config.threadsafe!
...
end
```

# 対処

条件をつけてThreadsafeで動かさないようにしてやる。

```rb:config/environments/production.rb
TestApplication::Application.configure do
...
  config.threadsafe! unless ENV['THREADSAFE'] == 'off'
...
end
```

```shell-session
[user@host]$ RAILS_ENV=production THREADSAFE=off bundle exec rake solr:reindex
....
```

# 参照
https://github.com/sunspot/sunspot/issues/607
params.requireとparams.permitの違い

```rb
class UsersController < ApplicationController
  def show
    @user = User.find(params[:id])
  end
 
  def edit
  end
 
  def update
    current_user.update(update_params)
  end
 
  private
  def update_params
    params.require(:user).permit(:family_name, :first_name, :family_name_kana, :first_name_kana)
  end
end
```

##params.requireとparams.permitの違いとは

入れ子構造になっている。例えばform tagを使った時userに対して情報がハッシュで追加されることになるが、それはuserの数が増えるほど増えていく。つまり入れ子構造になっているのである。親のハッシュにはrequireを、その下のハッシュにはpermitを使うと覚えるといいだろう。
MAMP + Postfix on Yosemite


# fatal: bind fe80::1 port 25: Can't assign requested address

MAMPはGUIでPHPから送信するメールサーバーの設定を行えるが、そのままだとYosemiteではIPv6で接続しようとして動作しない。
また、GUI側でSMTPサーバーに指定でポート番号を記載しても、ポート指定がうまく動いていないようだった。結果的に、Postfix設定を直接変更することで対処できた。

# MAMP向けのSASL設定を書き換える

```
> sudo vi /etc/postfix/sasl_MAMP_passwd
```

```/etc/postfix/sasl_MAMP_passwd
smtp.example.com:587   your_account:password
~                                                               
```


# Postfix設定ファイルでSMTPサーバーとポート番号を指定する
```
> sudo vi /etc/postfix/main.cf   
```

```/etd/postfix/main.cf
inet_interfaces = 127.0.0.1
relayhost=smtp.example.com:587
smtp_sasl_security_options=
```

# Postfix設定をリロードしてログ監視

```
> sudo postfix reload

/usr/sbin/postconf: warning: /etc/postfix/main.cf: unused parameter: mydomain_fallback=localhost
postfix/postfix-script: refreshing the Postfix mail system
```

```
> tail -f /private/var/log/mail.log
```

# 参考
* [Mac - Yosemite で MAMP PRO の Postfix がうまく動作しなかった時の解決法 - Qiita](http://qiita.com/turusuke/items/34076762b5d5dfbdd14e)
* [mac osx - Postfix not working on MacOS Yosemite - Server Fault](http://serverfault.com/questions/646284/postfix-not-working-on-macos-yosemite)
* [relayhost=deinmailserver.de:587](http://mkleine.de/blog/2013/02/27/postfixmail-unter-mac-os-x-einrichten/)
* http://www.postfix.org/SASL_README.html
sqlalchemyによるRDB入門 Ⅰ

# データベース

## DBってなんだろう
RDBという単語は一旦忘れて、まずはデータベースという単語を学びましょう。

DB(データベース:Database)とは、**あとから利用するために、たくさんのデータをあつめたもの**です。例えば、住所録や電話帳などもDBと言えます。

特に、WebサービスではDBが必要不可欠です。例えば検索サイトならWebサイトを集めたDBが、twitterのようなSNSなら投稿を集めたDBが必要でしょう。

## DBとDBMS

DBを利用するための、DBMS(データベース管理システム:Database Management System)という種類のソフトウェアが存在します。

DBだけではただのデータですが、DBMSを利用することで、DBにデータを追加したり、DBからデータを検索したり、という操作が容易に実行できるようになります。

DBとDBMSの関係は、ちょうどxlsxファイルとエクセルの関係のようなものです。データはxlsxファイルに保存されますが、エクセルがないと閲覧も編集できません。それと同じように、DBを操作するためにはDBMSが必要不可欠なのです。

なお、DBとDBMSをまとめてデータベースと呼ぶことも多いので注意してください。本記事では、特に断りがない限りはDBとDBMSは区別しています。

## データモデル

データベースがデータを格納する方法を、「データモデル」と呼びます。

データの格納と言っても、実に様々な方法がありますが、以下に幾つか代表的なものを挙げます。

- データを木構造として格納する「階層型データモデル」
- データを束として格納する「ネットワーク型データモデル」
- データを表として格納する「関係モデル」

## まとめ

- DB(Database)とは、あとから利用するために、たくさんのデータをあつめたものである。
- DBMSはDBを操作するためのソフトウェアの総称であり、DBを利用するためには不可欠である。
- DBがデータを格納する方法を「データモデル」と呼び、様々な種類がある。

# 関係データベース

## RDBとは

RDB(関係データベース:Relational Database)とは、関係(Relational)モデルに基づいたDBであり、RDBのDBMSをRDBMSと呼びます。

リレーショナルモデルでは、データを表(Table)として格納します。想像がつきにくければ、RDBMSとはExcelのようななにかという認識で大丈夫です。

例として献立を表す表を作ります。

```
+----+-----------+------+
| id | name      | kcal |
+----+-----------+------+
|  1 | カレーメシ  |  500 |
|  2 | キビヤック  |  100 |
+----+-----------+------+
```

## 行

まずは表を横方向(行:Row)に注目して見てみましょう。一行目を抜き出すと以下のようになります。一番上の行は見出しなのでデータ本体ではないことに注意してください。

```
+----+-----------+------+
| id | name      | kcal |
+----+-----------+------+
|  1 | カレーメシ  |  500 |
+----+-----------+------+
```

このように行は1つのデータを表しています。

次に、表を縦方向(列:Column)に注目して見てみましょう。name列を抜き出すと以下のようになります。

```
+-----------+
| name      |
+-----------+
| カレーメシ  |
| キビヤック  |
+-----------+
```

このように、列を抜き出すことで、複数のデータ間でのある項目による比較が可能になります。

## まとめ

- RDBとは関係モデルに基づいたDBであり、データを表の形で保存する。
- 行に注目すると、データを表すことができる。
- 列に注目すると、複数のデータ間での比較ができる。

# RDBMSができること

## テーブルに対する操作

- 新規テーブルの作成
- 既存のテーブルの削除
- 既存のテーブルの構造の変更

既存のテーブルの構造の変更とは、既存のテーブルにカラムを追加したり、逆に削除したりすることです。

## データに対する操作

- データの取得
- データの新規作成
- データの削除
- データの更新

この内、新規作成以外では、更に次のような操作を行ったあとに適用することが可能です。

- 条件による絞り込み(e.g.kcalが200以下のみ)
- ソート(e.g. kcalが小さい順にソート)
- 件数の制限(e.g. 10件のみ)

これらを組み合わせることで、例えば以下のような操作が可能です。

- kcalが200以下のデータを削除
- kcalが200以下のデータをkcalが小さい順にソートして、最初の10件のkcalを100に更新
- nameがカレーメシのデータを取得
- kcalを小さい順にソートしたあと、30件目から10件を取得

このように非常に柔軟な指定が可能です。

## まとめ

- RDBMSはテーブルやデータに対する操作を行えます。
- データを取得・更新・削除するときには、非常に柔軟な指定が可能です。

# 今回のまとめ

今回は、DB・RDBとRDBMSができることを説明しました。すべてを完璧に覚える必要はありませんが、「まとめ」の内容は重要なので、できる限り抑えるようにしてください。

次回はいよいよsqlalchemyを用いてPythonからRDBを利用していきます。
OpsWorks で GitHub のプライベートリポジトリを利用するときのSSH鍵の設定

プライベートリポジトリを利用する情報が少なかったので、覚書として書いてみました。

1)ローカルの.ssh配下にある「id_rsa」と「id_rsa.pub」を利用する。
※上記ファイルが無い時は、「ssh-keygen -t rsa」でファイルを作る。
###GitHub
2)ローカルのターミナルでpbcopy < ~/.ssh/id_rsa.pub でファイルの内容をコピーする。
3)GitHubの対象のリポジトリの「Settings」より「Deploy keys」を押下する。
4)「Add Deploy Key」を押下し、コピーした内容を貼り付ける。
###OpsWroks
5)ローカルのターミナルでpbcopy < ~/.ssh/id_rsa でファイルの内容をコピーする。
6)OpsWorksの「Apps」よりAppの作成・編集画面に移動する。
7)「Application Source」の「Repository SSH key」にコピーした内容を貼り付ける。

[関連記事:名前を指定してssh鍵を作り、githubでssh接続する(Mac)](http://qiita.com/tak74/items/62d4a4c83486ec59d0d2)
SSHトンネルを使ってAWS上のPostgreSQLに接続する

**2021/1/25 追記**
5年以上放置していたのですが、未だにたまにストックされるので修正しました。
メンテされていなかったのでツールを使用した接続方法についての記述は削除しています。

# 前提
ローカル環境のMacからAWS上に存在するPostgresql（RDS）へ接続を行いたいが、RDSは特定のEC2等にしかポートを解放していないという場合の接続方法。

- ローカルから直接RDSに接続できない（セキュリティ的に正しい）
- 対象のRDSに接続可能なEC2は存在する（セキュリティグループの設定とかでよしなに設定されている）
- 上記のEC2にローカルからSSHできる

# トンネルを掘る

```
ssh -N -L [ローカル側で転送に使用するPort（10000〜60000）]:[RDSのHostName]:[RDSが解放しているPort] -i [IdentityFile（秘密鍵のパス）] -p [踏み台が解放しているPort] [踏み台のUser]@[踏み台のHostName]
```

## 例：以下の条件で接続する場合

- Port:12345、秘密鍵:/User/foo/.ssh/rsa_id
- 踏み台　HostName:10.0.0.1、User:hoge、Port:22
- RDS　HostName:10.0.0.2、Port:5432、User:postgres、database:dev_database

```
ssh -N -L 12345:10.0.0.2:5432 -i /User/foo/.ssh/rsa_id -p 22 hoge@10.0.0.1
```

- `-N`は、接続先でコマンドを実行しないというオプション。ポート転送を行う際に指定する。ただし、指定しなくてもいける。
- `-L`は、ポート転送を行うためのオプション。
- 踏み台へのSSH接続でconfigファイルを使用している場合は、`-i`以降を簡略化できる。（configでHost:hogehogeで「10.0.0.1」への接続を設定している場合、 `ssh -N -L 12345:10.0.0.2:5432 hogehoge` で接続可能）

# トンネルを使って接続する
## **psqlコマンドを使用する**

```
psql -h localhost -p [ローカル側で転送に使用するPort] -U [database user name] -d [database name]
```

一つ前の例で挙げたトンネルを使用する場合

```
psql -h localhost -p 12345 -U postgres -d dev_database
```

<br>
## **JDBC接続を行う場合**
「Host」に `localhost` 、「Port」に自分で設定した「ローカル側で転送に使用するPort」を設定する。

*Hostに `localhost` を設定するのが重要*
EC2からRDSに接続出来ない時にやった事

###EC2からRDSへ接続出来ずセキュリティグループを見直した件

#####2015/7/15時点の記事です。
#####2015/11/10に修正。

1)EC2でセキュリティグループへ移動し、セキュリティグループを作成。
インバウンドをルール追加（以下例）

```
タイプ：MYSQL/Aurora
送信元：カスタムIPを選択し、対象となるセキュリティグループのIDを入力(AWS OpsWorks Rails-App serverのグループIDなど)
```

2)「インスタンスの操作 -> 変更 -> ネットワーク & セキュリティ」から「個のセキュリティグループ」
で先ほど作成したセキュリティグループを選ぶ。
UIPageControlの丸（ドット）のサイズを変える

実際にはドットの大きさを変更するパラメータ、メソッドはありません。
そこで、CGAffineTransformMakeScaleをつかって、View全体サイズを変更してしまいます。

```swift
pageControl.transform = CGAffineTransformMakeScale(0.8, 0.8);
```
DockerのMySQLデータコンテナを暗号化する。


すごくマニアックな要件過ぎて、需要があるかどうかは不明なのですが、
ネットを探してもほとんど情報が見つからなかったので、備忘録代わりに書いておきます。

##現在の状況

まず、既存の構築済みDockerコンテナはこんな感じ。
MySQLコンテナはCentOSです。

![MySQLその１.jpg](https://qiita-image-store.s3.amazonaws.com/0/75412/46687d2d-20bd-e076-d493-ff183dafc844.jpeg "MySQLその１.jpg")

MySQLのデータを別のDockerコンテナに分けています。
しかし、データのみの持ち出しが容易な反面、
tar等のコマンドでデータを別の人に持ちだされてしまうと、
セキュリティが心配！という声が有りました。

というわけでなんとかデータ部分だけを暗号化してくれ、というオーダーを受け、
色々試行錯誤してみたわけです。


##そもそもMySQLの暗号化は

どうも色々調べると、MySQLの場合、レコードに挿入するデータ自体を暗号化することが多いらしく、そういった記述は多々見つかりました。

7.11.2. 暗号化関数と圧縮関数
http://mysql.stu.edu.tw/doc/refman/5.1-olh/ja/encryption-functions.html


ですが、今回はこれじゃないんです。


##色々調べた結果、こんな感じで暗号化すると良さそう

![MySQLその2.jpg](https://qiita-image-store.s3.amazonaws.com/0/75412/c5a6cbe6-f1c1-579f-ca52-0f39f392671c.jpeg "MySQLその2.jpg")

LinuxOSが持っている、「自分自身のとある一部のディレクトリのみ暗号化する」という手法を使おうと思いました。


###とある一部のディレクトリを暗号化する手順

理解してしまえば簡単ですが、下記のような感じ

1. ディスクイメージファイル（IMGとかISOとか）を作る。
2. 作成したディスクイメージファイルを暗号化する。
3. ディスクイメージファイルを自分自身にマウントする（ループバックデバイスというらしい）

仮想的に暗号化された外付けUSBディスクのようなものを作り出し、それを自分にマウントしてその中にデータを書き込むような感じです。

で、そのディスクイメージを、別のDockerコンテナ内に作成するようにしてしまえば、今回の要件は達成できそうです。


##ではコマンド

####データ用コンテナ作成
まずはイメージファイルを入れるコンテナを作成

```bash:
docker run -it -v /var/lib/img/ --name crypttest_db_data busybox /bin/sh
```


####MySQLコンテナを作成

```bash:
#イメージのループバックマウントには--privilegedが必要
docker run -it --name crypttest_db2 -p 3306 --volumes-from crypttest_db_data --privileged centos /bin/bash
```
ここで注意が必要です。
ループバックデバイスというものを利用するためには、Dockerコンテナを作成する際に「--privileged」というオプションが必須になります。



####コンテナスタート

```
docker start crypttest_db2
```



####必要ソフトのインストール
MySQL関連のインストールはできてるものとして、それ以外の必要ソフトウェアを入れます。

```bash:
#デバイスの暗号化ソフトウェア
yum install -y cryptsetup

#ファイルをフォーマットするソフトウェア
yum install -y e2fsprogs
```

####MySQLを格納しておくイメージファイルを作成
ひとまず5GBで。

	dd if=/dev/zero of=/var/lib/img/mysql.img bs=1M count=5120


####空きループバックデバイスを確認

	losetup -f
	/dev/loop0
	#loop0が空いているようです。
	
			
####作成したディスクをループバックデバイスに関連付け

	losetup /dev/loop0 mysql.img


####ループバックデバイスに接続したディスクを暗号化のために初期化

	cryptsetup luksFormat /dev/loop0
	#パスフレーズを求められるので、適当に入力してください。


####暗号化して読み書きできるデバイスファイルを作成

	cryptsetup luksOpen /dev/loop0 encrypted


これで、/dev/mapper/encryptedというデバイスファイルができます。このデバイスファイル経由で読み書きすれば暗号化されるので、今後はこのデバイスファイルに対して操作します。

####デバイスのフォーマット

	mkfs -t ext4 /dev/mapper/encrypted

####mountし、読み書きできることを確認

	mount -t ext4 /dev/mapper/encrypted /var/lib/mysql/


###以上で終了です。
これでmysql.imgファイルを/var/lib/mysqlにマウントすることができました。
仮に、mysql.imgだけ１人でどこかに行ってしまっても、解読されることがありません。

試しにMacでマウントしてみようとするとこんな感じになります。
![スクリーンショット 2015-07-15 11.49.03.png](https://qiita-image-store.s3.amazonaws.com/0/75412/b863000b-2b87-12c7-2f50-a238be473d9a.png "スクリーンショット 2015-07-15 11.49.03.png")
DockerのMakefile

# dockerのコマンド

dockerのコマンドは繰り返し作業する割にはオプションが長いです。
コンテナ名など決めないとどんどん知らない名前が作られますし・・・
どこかで見たコードに ```Makefile``` でやっているのを見て自分も見よう見真似でどんどん追加して、現在の形になりました。

## 実行コマンド
中身はすべて ```docker``` のコマンドで書かれていますがパラメタをほとんど指定しなくて良いですし、違うイメージでもコマンドが統一されるのも良いですね。
特に ```docker run```のコマンドは長いパラメタになるので短く打てて便利です。

### イメージ構築

```bash
$ make build
```

### コンテナ起動
長いパラメタを入力しなくて便利。

```bash
$ make start
```

### コンテナ再起動
現在残っているコンテナを強制削除して新しく起動します。
コンテナを構築しているときは ```build``` と ```restart``` の繰り返しになります。

```bash
$ make restart
```

### 不要イメージ、コンテナ削除
不要なイメージ、コンテナを削除、コンテナは ```-f``` オプションをしていないので現在動いているコンテナがある場合は削除でエラーになります。すべてのコンテナが止まっているときがいいでしょう。

```bash
$ make clean
```

### その他
その他に ```stop``` ```logs``` ```attach``` がありますが ```$(NAME)``` を指定している以外はほとんどそのままです。

## Makefileのテンプレート

```:Makefile
NAME=xxx
VERSION=xxx

build:
	docker build -t $(NAME):$(VERSION) .

restart: stop start

start:
	docker run -itd \
		-p xxx:xxx \
		-v xxx:xxx \
		--name $(NAME) \
		$(NAME):$(VERSION) bash

contener=`docker ps -a -q`
image=`docker images | awk '/^<none>/ { print $$3 }'`

clean:
	@if [ "$(image)" != "" ] ; then \
		docker rmi $(image); \
	fi
	@if [ "$(contener)" != "" ] ; then \
		docker rm $(contener); \
	fi

stop:
	docker rm -f $(NAME)

attach:
	docker exec -it $(NAME) /bin/bash

logs:
	docker logs $(NAME)
```

## 更新
- attachを本当のattachから ```exec``` に変更。```<ctrl+p> <ctrl+q>``` で抜けるのはいいけど、間違えて ```exit``` してしまうことがあるのでこっちかなぁ
Ruby 素数を出力する エラトステネスの篩(ふるい）

#単純に考えてみる
##問題
1から100の素数を全て出力してください。

##解答
```rb
#素数を判定するメソッド
def check_prime(num)
  case num
  when 1 then
    false
  when 2 then
    true
  else
    (2..(num-1)).each do |index|
      if num % index == 0
        return false
      end
    end
    return true
  end
end

 #1から100までの素数の判定
 (1..100).each do |num|
   puts num if check_prime(num)
 end
```

#もう少し真剣に考えみる
上記の書き方だと素数の値が大きくなってくると計算量かなり増えそう。。
それで改良策として
[エラトステネスの篩(wikipedia)](https://ja.wikipedia.org/wiki/%E3%82%A8%E3%83%A9%E3%83%88%E3%82%B9%E3%83%86%E3%83%8D%E3%82%B9%E3%81%AE%E7%AF%A9)
>
指定された整数以下の全ての素数を発見するための単純なアルゴリズムである。古代ギリシアの科学者、エラトステネスが考案したとされるため、この名がある。

手順としてはwikipediaには次のようにすればいいらしいと。

>
ステップ 1
探索リストに2からxまでの整数を昇順で入れる。
ステップ 2
探索リストの先頭の数を素数リストに移動し、その倍数を探索リストから篩い落とす。
ステップ 3
上記の篩い落とし操作を探索リストの先頭値がxの平方根に達するまで行う。
ステップ 4
探索リストに残った数を素数リストに移動して処理終了。

***以下解答をご覧になりましたら、追記までご覧下さい***

##解答

```rb
include Math

#素数の配列を返すメソッド
def fetch_prime_list(max)
  list = (2..max).to_a
  prime_list = []
  sqrt = Math.sqrt(max).floor

  while val = list.shift
    prime_list << val
    if val > sqrt
      break
    end
    list.delete_if{|num| num % val == 0}
  end
  return prime_list.concat(list)
end

#配列の出力
p fetch_prime_list(100)
```

###ポイント
* Array.shiftはなかなかに便利で、配列の先頭の値を消去してその値を返してくれる。
* Array.delete_ifは重要で、はじめに下記のように書いていてdelete_ifによってかなり高速化出来た。

```rb
  list.each do |num|
    list.delete(num) if num % val == 0
  end
```

#比較する
どれくらいの違いが出たのか実験してみます。
```benchmark```という標準ライブラリを用いて計算速度を比較します。
下記のように使用します。参考：[Rubyで処理の時間計測方法](http://qiita.com/yakiimo23/items/7293c7606c1d59501d89)

```rb
require 'benchmark'

result = Benchmark.realtime do
  # 処理
end
puts "処理概要 #{result}s"
```

##実測
単純に考えたものをA、エラトステネスの篩で考えたものをBとします。
3回測ってみました。なお、差をわかりやすくするために「1から**10000**までの素数を出力する」時間で計測しました。

||A|B|
|:--:|:--:|:--:|
|1回目|0.5881432759342715s|0.016686114016920328s|
|2回目|0.5918690949911252s|0.014826877973973751s|
|3回目|0.57632252399344s|0.019242812995798886s|

エラトステネスのほうがかなり速いですね！

## 追記

本記事でWikipediaのステップを参考に「エラトステネスの篩」の作成を試みたのですが、@yuki2006さんよりこれでは実行速度が速く、より正確な「エラトステネスの篩」の実装をご紹介頂いたので追記します。

```rb
include Math

#素数の配列を返すメソッド
def fetch_prime_list(max)
  table = Array.new(max + 1,true)
  prime_list = []

  (2..max).each do |num|
      if table[num] == true
        prime_list << num
      k = num * num
      while k <= max
        table[k] = false
        k += num
      end
    end
  end
  return prime_list
end

#配列を返すメソッド
p fetch_prime_list(10000)
end

```

なお、参考までにこのコードでの実行速度をCとすると

||A|B|C|
|:--:|:--:|:--:|:--:|
|1回目|0.5881432759342715s|0.016686114016920328s|0.003259235993027687s|
|2回目|0.5918690949911252s|0.014826877973973751s|0.004096289980225265s|
|3回目|0.57632252399344s|0.019242812995798886s|0.003389560035429895s|
となり、実行速度が速いことが分かります。