OmniAICreator/Qiita-1.07M huggingface dataset:
AppleScriptでブラウザ(Safari)で開いているリンクとタイトルを取得


肝はこの辺・・・

#####配列の定義と要素追加

	--定義
	set linkArray to {}

	--要素の追加
	set the end of linkArray to {urlTitle:tabName, urlLink:tabURL}
	

##### アプリケーション(Safari)に指示を出す

	tell application "Safari"
		
	end tell

#####１つのウインドウ内にあるタブの数
	-- tell application "Safari"内で・・・
	set tabcount to number of tabs in window inWindowNumber

#####指定回数のループ

	--1〜タブ数までループ、変数yがインクリメントされる
	repeat with y from 1 to タブ数

	end repeat


##### コード全体	

	-- ========================================
	-- 戻り値：配列
	--   key : urlTitle
	--   key : urlLink
	-- ========================================
	to tellSafariToGetURLsOfWindowByWindowNumber(inWindowNumber)
		set linkArray to {}
		tell application "Safari"
			set tabcount to number of tabs in window inWindowNumber
			try
				set tabcount to number of tabs in window inWindowNumber
			
				repeat with y from 1 to tabcount
					--Get Tab Name & URL
					set tabName to name of tab y of window inWindowNumber
					set tabURL to URL of tab y of window inWindowNumber
					set the end of linkArray to {urlTitle:tabName, urlLink:tabURL}
				end repeat
			end try
		end tell
		return linkArray
	end tellSafariToGetURLsOfWindowByWindowNumber



##### 実行

	tellSafariToGetURLsOfWindowByWindowNumber(1)

##### 結果 
qiitaのページをタブで２つ開いたウインドウの結果

	{{urlTitle:"ホーム - Qiita", urlLink:"http://qiita.com/"}, {urlTitle:"ホーム - Qiita", urlLink:"http://qiita.com/"}}
PostgreSQL ですべてのテーブルを削除する方法

データ移行とかバックアップファイルのリストアの検証時にまっさらな状態のDBが欲しくて、何度もテーブル削除することがたまにあるんですが、テーブル数が多いとひとつずつ削除するの面倒だし、外部キー制約があると削除順にも気をつけないといけなかったりしてとても面倒です。

そんなときはこんな感じで一掃できる模様。（本当にこのままやったらできた。）

http://stackoverflow.com/questions/3327312/drop-all-tables-in-postgresql

```postgres
drop schema public cascade;
create schema public;
```

ただし、すべてのテーブルが同一スキーマにあることが前提です。スキーマごと DROP するという感じですね。
BuildVariantsでプロジェクトのサンプルコードを管理・共有する

## 目的

- 実装パターンのサンプルコードを共有したい
- gist.github.comやpastebinのようなものを共有目的で利用するのは面倒

そんな時の一つの手段として、BuildVariants の仕組みを利用してコードの断片を共有してみる

## 効能

- サンプルコードの共有がIDE上で完結する
- プロジェクト内のどの実装がベストプラクティスかを確認・記憶・共有するコストが下げられる
    - とりあえずサンプルコードのあるパッケージを見ればよい、という状態に
- 実装パターンや役割毎にパッケージを区切れば、IDE上での閲覧性が上がる
    - 特定のパターンに関係のないコードが存在しない、すっきりしたサンプルコードにしやすい
- お手本コードを管理する場所が出来る
    - アプリ内に実装パターンが散乱している場合には特に便利

## 実践例

サンプルコードを共有するための buildType `snippets` を追加する

``` gradle
// build.gradle
android {
    buildTypes {
        debug {}
        release {}
        // コードを共有するための BuildType を用意
        snippets {}
    }
}
```

`snippets` 用のディレクトリを作成する。

```
# 一般的なAndroidStudioのディレクトリ構成です
# 今回の説明に不要なディレクトリは省略

/MyProject
|
`- app/src
    |
    |- main/
    `- snippets/ # ここに共有したいものを置いていく
        |
        |- java/
        `- res/
```

後は `snippets` に共有したいものを適当に放り込んでいくだけ。

## 所感

本実装もちょっとした設計相談もボイラープレートも、みんなPull Requestベースで管理出来たり、IDE上でのやりとりが便利になっていい感じ。

アプリの本実装に影響しないように BuildType の追加という対応をしているので、仮に `snippets` 由来のコンパイルエラーがあったとしてもアプリ本体には影響はないはず。

アプリ内のベストプラクティスを更新する必要があったら `snippets` を更新する Pull Request を送ればよいし、それによって設計や実装に関する共有・相談もしやすくなって便利。
Jekyllメモ

自分用Jekyll使い方メモです.

## HTML埋め込み

```
{% raw %}
...
{% endraw }
```

## その他

[Ruby2.1.2+Jekyll2.2.0+独自ドメインでブログを作ってみた](http://blog.enogineer.com/jekyll/nginx/2014/08/09/setup-jekyll/) 

http://blog.enogineer.com/2014/08/12/responsive/
PowerShellでwebスクレイピング

#やること
PowerShellでGoogle Trendから最新のトレンドをぶっこぬいてくる

#依存
* System.Net.Http (.NET 4.5以降)
* SGMLReader (https://github.com/MindTouch/SGMLReader)

#コード

```ps1
Add-Type -AssemblyName System.Net.Http
Add-Type -Path "SgmlReaderDll.dllへのパス"


$hc = New-Object System.Net.Http.HttpClient
$stream = $hc.GetAsync("https://www.google.co.jp/trends/").Result.Content.ReadAsStreamAsync().Result

$my_streamreader = New-Object System.IO.StreamReader($stream, [System.Text.Encoding]::UTF8)
$my_sgml = New-Object Sgml.SgmlReader
$my_sgml.DocType = "HTML"
$my_sgml.IgnoreDtd = $true
$my_sgml.InputStream = $my_streamreader
$my_xdocument = [Xml.Linq.XDocument]::Load($my_sgml)
$data = [Xml]($my_xdocument)
$navi = $data.CreateNavigator()


$navi.Select('//*[contains(concat(" ", normalize-space(@class), " "), " hottrends-single-trend-title ")]') | %{
	Write-Host $_
}
```

#今後の課題
* PowerShellにおいて、async/awaitを前提としたライブラリはどのように呼んでやるべきか
* ~~Invoke-WebRequest版も書く~~［追記：[書きました](http://qiita.com/ctrl_alt_george/items/714378dd4bcada57a573)］

#参考URL
* [neue cc - C#でスクレイピング:HTMLパース(Linq to Html)のためのSGMLReader利用法](http://neue.cc/2010/03/02_244.html)
* [php - Selecting a css class with xpath - Stack Overflow](http://stackoverflow.com/questions/8808921/selecting-a-css-class-with-xpath)（XPathについて参考にした）
QiitaにあったXSSの脆弱性について(修正済)

# 脆弱性の内容
記事編集画面にて以下の文字列を入力すると、XSSが発生するリンクが生成されます。

```text
[xss](\ javascript:alert(1))
```

# 脆弱性の解説

```text
[title](http://~)
```

という記法は、Markdownでリンクを生成するときに使用します。
通常記事編集画面では、`javascript:`から始まる文字列はリンクにならないように対策が施されています。
しかし、今回はMarkdownのエスケープ文字である`\`と半角スペースを組み合わせることによりXSSが発生するリンクが生成されてしまいました。
aタグのhref属性には、スキーム名の先頭に半角スペースを入れてもリンクとして認識されてしまうという特性があります。

```html
<a href=" javascript:alert(1)">xss</a>
```

これを利用して、以下のような正規表現を回避することができます。

```text
/^javascript:/
```

# 最後に
この脆弱性を報告したのは本日(2014/08/09)の08:03頃で、修正完了とのメールが来たのは同日の11:07頃でした。
対応が凄く早くて驚きです。
他にも2つの脆弱性を発見してQiitaに報告をしました。
その2つはわりとよくある脆弱性なので、公開はしないことにします。
Qiitaにも脆弱性報奨金制度があったら良かったと思った日でした。
visual story telling

## from internet     
- 本の第２章をきれいにまとめてある  
http://www.convinceandconvert.com/social-media-case-studies/seven-tips-for-jumpstarting-your-visual-storytelling-strategy/    
　
- 日本語で簡単にかいてある。ゲッティイメージのやつ  
http://curve.gettyimages.com/article/the-power-of-visual-storytelling-jp  
　
- infographicsの方法とか書いてある  
http://www.webcreatorbox.com/inspiration/infographics/  
　
　
- ソーシャルメディアを使った方法をまとめてある  
http://www.socialmediaexaminer.com/tag/visual-storytelling/  
　
- ２１チップとたくさんある
http://community.paper.li/2014/04/07/21-tips-for-better-visual-storytelling/ 
　

- 5 Ways Businesses Are Using Visual Storytelling on Facebook
http://www.socialmediaexaminer.com/visual-storytelling-on-facebook/  
　
- 5 Brands Using Instagram to Interact & Build Fan Relationships
http://www.clickz.com/clickz/column/2299432/5-brands-using-instagram-to-interact-build-fan-relationships  
　
- What Every Company Needs to Know About Instagram Video
http://www.fastcompany.com/3013700/dialed/what-every-company-needs-to-know-about-instagram-video  
　
- 6 of the Best, Boldest Uses of Vine in Marketing
http://www.fastcompany.com/3019652/dialed/6-of-the-most-creative-clever-uses-of-vine-in-marketing  
　
- Podcast
http://www.marketingprofs.com/podcasts/2014/24622/visual-storytelling-ekaterina-walter-marketing-smarts  
　

#それぞれまとめていきますか

> タスク 


# from  the book  
-  1章  
  
- ２章  

- 3章  

- 4章

- 5章  


> タスク
TypeScript in Railsのカレントステータス

## Overview

[typescript-rails](http://rubygems.org/gems/typescript-rails)がしばらくメンテナされていなかったため、関連gemを含めてメンテナにしてもらいました。

TypeScriptは文字通り型のあるJavaScriptです。以下のgifアニはIntelliJ IDEAでTypeScriptを書いている様子です。補完がバリバリ効いてますね。

![typescript-in-idea.gif](https://qiita-image-store.s3.amazonaws.com/0/207/0b4dfa74-e5a2-ecd3-68dd-011527ab1f13.gif)

とりあえず現在は、[typescript-rails-example](https://github.com/typescript-ruby/typescript-rails-example) で Rails4 + tsd を使ってどうやって管理するかを考えているところです。

RubyでのTypeScript関係のgemは以下のgithub organizationにまとまっています。

* :octocat: [TypeScript in Ruby](https://github.com/typescript-ruby) 

## Current Status

* :white_check_mark: Rails4 support
* :white_check_mark: TypeScript 1.0.1 support
* :white_check_mark: Compiles with `--target ES5` by default
* :white_check_mark: Tested to use jquery.d.ts with [tsd](https://github.com/DefinitelyTyped/tsd)

## Roadmap

いまのことろ以下のことを考えています。とはいえ今は仕事で使っているわけではないので、開発速度は遅いです。日本語でかまわなので、pull-requestをお待ちしています。

* Angular.JS support
* rails generator support
* source-maps support
拡張性、再利用性、可読性の高いコードパターン - HTML(PHP)編

快適なコーディングを楽しむための新しいコードパターン（とファイルパターン）を提示します。

*2014-08-09追記：*
*長くなったのでHTML(PHP)編,CSS編,JavaScript編に分けました。*
*過去の投稿からご参照頂ければと思います*

Webコーディングでもっとも対処すべき課題は**範囲（スコープ）を明示し独立させる**ことです。
（HTMLやCSSはスコープがないために読みづらく冗長だと考えます）

HTMLは構造、CSSはプレゼンテーション、JavaScriptは振る舞いというそれぞれの役割の意味をしっかり吟味し根本から再考しています。

##HTML

###従来の課題
HTMLは最も冗長になりやすく管理に苦戦する。
ここではそのなかでも特に煩雑になりがちなフォームを題材にあげ解説する。

###解決
3つの概念に分離
1. layout　…　大枠：たいてい一つ
2. gadget　…　中構造：ある程度の塊で切り分ける
3. class（ここではFormpartsクラスを用意）　…　小構造：メソッドで組み上げる

**・layout**
大枠のレイアウトを定義するHTML。
大体の画面の構成（骨組み）がこれで出来上がり、
のちにその枠（以下、セクション）の中にgadgetをおいていく。

**・gadget**
タブパネル、スライドショー、カレンダー、記事エリアなどガジェット（小さなView）として定義するHTML。
基本、セクションの中にはめ込む形で書く。
* セクション内に複数のgadgetが存在して良い
* gadgetの中にgadgetを内包して良い
* gadgetの中にセクションを内包して良い（大枠のセクションではなくあくまでgadgetのセクション扱い）

**・class**
Formpartsの場合、冗長になりがちなselect要素などをメソッドにまとめ、引数で、selectの選択肢（例：['東京都','大阪府','京都府','沖縄県']や['社員','フリーター','自営業']）などを変更し再利用できるようにする。


###ファイルパターン
index.php　…　大枠（layout）
gadget
├article.php
├form.php
├panel_aboutAuthor.php
├panel_calender.php
└panel_latestPosts.php
class
└Formparts.php

```html+php:index.php（例　※便宜上headerタグなどは使っていません）
...
<body>
<div id="header">...</div>
<div id="main">
	<div class="mainContain">
		<?php
		if( is_article() )
		  include('gadget/article.php');
		elseif( is_form() )
		  include('gadget/form.php');
		else
		  ...
		?>
	</div>
	<div class="side">
		<div class="sideArea1">
			<?php include('gadget/panel_aboutAuthor.php'); ?>
		</div>
		<div class="sideArea2">
			<?php include('gadget/panel_calender.php'); ?>
		</div>
		<div class="sideArea3">
			<?php include('gadget/panel_latestPosts.php'); ?>
		</div>
	</div>
</div>
<div id="footer">...</div>
</body>
...
```

以上。これでコードがきれいになるはずだ。gadgetごとに分離しているので管理も容易。

##おわりに

さらに快適なコードパターン実現のために、あなたのコードパターンやファイルパターンを教えて下さい。また、私の解説上で難解な部分、指摘箇所なども伝えていただけると大変幸いです。

他CSS編,JavaScript編もご参照ください。
[状態マシン図] 内部遷移 (internal transition)

イベントが発生したときに遷移をともなわないアクションを実行させたいときは、内部遷移を設定する。

ガードはあってもなくてもＯＫだが、アクションがなければ内部遷移を設定する意味がないので、内部遷移にアクションは必ず設定されなければならない。

![internal_transition0.png](https://qiita-image-store.s3.amazonaws.com/0/11188/a700007c-f4f6-bf11-1dad-c4e1153cc909.png)

内部遷移は、astah*,Rhapsodyともにサポートされており、１つの状態に０個以上の内部遷移を設定できる。

![internal_transition02.png](https://qiita-image-store.s3.amazonaws.com/0/11188/a5ae22ff-52de-f53c-17c5-7aa9c2c7fd83.png)

内部遷移が複数設定された場合、どれから先に評価されるかはUMLでは決められていない。

内部遷移は自己遷移と異なり、状態を退場入場はしないので、内部遷移がおきても、退場時アクションと入場時アクションは呼び出されない。

内部遷移を使うとLatch Stateパターンが実現できる。まず、Latch Stateパターンを使った例

![internal_transition6_orthogonal.png](https://qiita-image-store.s3.amazonaws.com/0/11188/5207dda7-bc85-b334-b881-389a195ebea7.png)

写真プリンタでは、印刷中に電源オフ要求があっても、インクや紙を無駄にしないよう、すぐには電源オフ処理をしないで、いま印刷している写真を印刷終わってから電源オフ処理を始めたい、という要求がある。

これを内部遷移を使って描きなおすと、

![internal_transition5.png](https://qiita-image-store.s3.amazonaws.com/0/11188/9910b804-ba1c-f0a5-6ef7-178b3e2f2329.png)

印刷中に電源オフ要求があれば、内部遷移でインスタンス変数byeをtrueにする。印刷が終わったところで、byeがtrueならば電源オフ処理を始める。

このように、内部遷移を使うと、フラグを増やすことになり、わかりにくいモデルになる可能性がある。

フラグが増えると非常にわかりにくいソフトウェアになってしまうことはみなさんご存知のとおりである。内部遷移を使わずに、Latch Stateパターンで実装するのをおすすめする。

---
参考記事

1. [状態マシン図] Latch State パターン<br>
[http://qiita.com/saltheads/items/abd039ec2df18bdd7995](http://qiita.com/saltheads/items/abd039ec2df18bdd7995)
PL/SQLで、カラム名と同じ名前の変数を定義してはいけない

知らんくて激しくハマった。

##説明
以下のようなテーブルがあったとして、

__TEST_TABLE__

|ID|VALUE|
|:--|:--|
|1|HOGE|
|2|FUGA|
|3|PIYO|

以下のような PL/SQL を書いたとする。

```sql:
DECLARE
  id NUMBER;
BEGIN
  id := 2;

  UPDATE TEST_TABLE
     SET VALUE='update'
   WHERE ID=id
  ;
END;
/

SELECT * FROM TEST_TABLE;
```

ID=2 のレコードの VALUE を "update" に更新しているつもりの実装。

これを動かすと、 TEST_TABLE は以下のようになる。

__TEST_TABLE（更新後）__

|ID|VALUE|
|:--|:--|
|1|update|
|2|update|
|3|update|

全レコード "update" に更新されてしまう！

##なにが起こったか
要は、 UPDATE 文で使っている `id` は、変数の `id` ではなく、 TEST_TABLE の ID カラムを参照しているのが原因。

PL/SQL の仕様上、カラム名と同じ変数が SQL 内で使用されている場合、カラム名が優先されるようになっている。

[列名の優先順位 | PL/SQLの名前解決](http://docs.oracle.com/cd/E16338_01/appdev.112/b56260/nameresolution.htm#BABCAECA)

> ローカル変数または仮パラメータのいずれかと列の両方に属する名前をSQL文で参照すると、列名が優先されます。
> 
> 注意:
> 変数名またはパラメータ名が列名として解釈されると、データが誤って削除、変更または挿入されることがあります。

しっかり公式ドキュメントに注意書きが書いてあった。

##つまり、カラム名と同じ名前の変数を定義するのは超危険
知っている人にとっては当たり前の話かもしれないけど、知らんとかなりハマるので要注意。

##SQLFiddle サンプル
http://sqlfiddle.com/#!4/0e905/2
ChromeAppsのSandBox化について

以前
[ChromeAppとかExtensionsでVue.jsを使うために](http://qiita.com/koki_cheese/items/f568f15556fadc939ef3)を書いたんですが

SandBoxするとどうなるのか？

実際のコードは？

を書いてなかったので　自分でも忘れないようにメモをしておこうと思います。

これからPolymerをChromeAppsでも使いたいという人には避けては通れないSandBoxだと思います。(てか避けて通れる方法が欲しい...)

# SandBox？

SandBoxはChromeAppsやExtensionsで制限されているevalを使うためにあります。

そもそも、なぜevalが使えないのか？

ChromeAppsは通常のWebサイトではアクセスできないユーザーの様々なデータにアクセスすることができるので
通常のWEBページ以上にユーザーのセキュリティとプライバシーに影響を与える可能性がでてくるためです。


# SandBoxの使い方

参考先ではChromeExtensionsを使って説明してますので
ここではChromeAppsのサンプルを使いながら説明させてもらいます。

サンプル: https://github.com/k2wanko/chromeapp-polymer-example

## manifestで宣言

SandBoxさせるhtmlファイルをmanifest.jsonで宣言する必要があります。

```json:manifest.json
{
  ...
  "manifest_version": 2,
  ...
  "sandbox": {
    "pages": [
      "index.html"
    ]
  }
}
```

## SandBox化されたページとのやりとり

SandBox化されたページはevalが使える代わりにChromeAppsやExtentionsのAPIが使えなくなります。(全部使えないのかは調べてないです。)

なのでAPIを使おうと思ったら
SandBox化されていないページにメッセージを投げて
実行しなければなりません。

HTML5でアプリケーションを作ったことある人なら(たぶん)お馴染みの
window.postMessageを使います。

以下サンプルコード抜粋です。

```coffeescript:toolbar.coffee
window.parent.postMessage
  command: "close"
```

```coffeescript:window.jade
window.addEventListener 'message', (e)->
  switch e.data?.command
    when "close" then chrome.app.window.current().close()
```

`window.parent.postMessage`メソッドを使い
親Windowにメッセージを親ウィンドウに対して送り

`window.addEventListener`の第一引数を`message`にし第二引数のFunctionで受け取ります。

後は　APIが使える側でSandBoxのWindowを操作してあげればセキュリティ的に安全かつ普通のChromeAppsと同じ物を提供できます。

# 参考
[Using eval in Chrome Extensions. Safely.](https://developer.chrome.com/extensions/sandboxingEval)
現在のターミナルの大きさ（横に何文字、何行）を知るには

# 背景

先日知った[ttyrecordからGIF作るのにスクリーンショットなんて必要なかったんや - すぎゃーんメモ](http://d.hatena.ne.jp/sugyan/20140730/1406724574)を試した際に必要になった。

大きめなサイズの端末で録画しており、端末の文字数を指定しないとttyrecordしたファイルをうまくGifに変換出来なかった。

# OSXのターミナルアプリで現在の大きさを知る

## 横に何文字か

```
echo $COLUMNS
```

## 縦は何行か

```
echo $LINES
```

# まとめ

もしかすると、これは自分が標準のBashを使っているから出来るのかもしれません。他のシェルだと別の名前だったりするかも。

ncursesのSDL版つかってSLコマンドをEmscriptenでJs化していても、
黒い画面は[奥が深く](http://0xcc.net/misc/bad-knowhow.html)、今回のような簡単な事もどうすりゃいいのかすぐには
わかりませんでした。

追伸、「奥が深い」の記事の方と、ttyrecordの作者の方が同じ方のだった。

# やや関連する記事

- [JavaScriptをDockerを使って黒い画面に表示する](https://abrakatabura.hatenablog.com/entry/2014/08/09/224138)
- [Node.jsでターミナル.appにアメッシュを表示させてみた](https://abrakatabura.hatenablog.com/entry/2015/12/09/073213)
- [mrubyでWebカメラを黒い画面にそのまま表示できるようにした](https://abrakatabura.hatenablog.com/entry/2017/02/25/080830)
- [Go言語でコマンドプロンプトに画像を表示するコマンドを作って、Vimの:terminalで表示させた](https://abrakatabura.hatenablog.com/entry/2017/08/19/093906)
- [RustでWebカメラの映像をコマンドプロンプトに出すコマンドを作った](https://abrakatabura.hatenablog.com/entry/2017/09/21/064630)
- [Surface Goのカメラ映像をRustでコマンドプロンプトに表示した](https://abrakatabura.hatenablog.com/entry/2018/12/20/000602)
てっとり速くCoffeeScriptを身につける方法


最近、CoffeeScript、熱いですよね。え、キミの中だけだって？いやだそんな///

## 本題
CoffeeScriptは歴史的経緯からも分かる通り、なんだかRubyを思わせる文法です。
JSらしさはかなり失われている感じなのですが、コンパイルされるとしっかりとJavaScriptになるのです。

実は、CoffeeScriptは相互変換する事が可能で、JavaScriptで書かれたファイルをCoffeeScriptに逆に変換する事が可能なのです。

# How to install.

```
$ npm install -g js2coffee
```

# How to use.
```
$ js2coffee file.js > file.coffee
```

これだけで変換されます。

# Parameter

```
$ js2coffee -h

Usage: js2coffee [options] path/to/script.js

  js2coffee file.js
  js2coffee file.js > output.coffee
  cat file.js | js2coffee

options:
--version # Show js2coffee version
--verbose # Be verbose
--no_comments # Do not translate comments
--show_src_lineno # Show src lineno's as comments
--single_quotes # Use single quoted string literals - default double quoted
--help # If you need help
--indent # Specify the indent character(s) - default 2 spaces

shorcuts:
-v = [ '--version' ]
-V = [ '--verbose' ]
-X = [ '--no_comments' ]
-l = [ '--show_src_lineno' ]
-h = [ '--help' ]
-sq = [ '--single_quotes' ]
-i4 = [ '--indent', '    ' ]
-it = [ '--indent', '\t' ]
```

インデントが規約で指定されている場合は、
スペース2個の場合→ `js2coffee -i2 file.js`
タブの場合　　　 → `js2coffee -t file.js`
また、`-l`で元のソースコードの行数が行末にコメントとして入るので、比較するのに最適です。

# おまけ
面倒なのでjsファイルを自動削除しちゃいましょう。

```ShellScript
js2coffee_d () {
  js2coffee $1 > `echo $1 | sed -e "s/\.js/.coffee/"`
  rm $1
}
```

え、エラー処理してない？そんなぁ…
Ruby | 単語の組み合わせでブレーンストーミングもどきをするためのRubyスクリプト

# Ruby | 単語の組み合わせでブレーンストーミングもどきをするためのRubyスクリプト

## 概要
単語の組み合わせでブレーンストーミングもどきをするためのRubyスクリプトを作成しました

## 詳細
既存のキーワードの組み合わせで新たな発想を得られる場合があります。

人間の発想だとどうしても、意味のある組み合わせをしてしまいがちなので、
プログラムで無作為に組み合わせを抽出します。

キーとなる単語群からランダムに X 個の単語を出力するプログラムを作成して
アイデアフラッシュの足しにしたいと思います。

## 仕様
CLIの仕様について。

第1引数: 単語を改行区切りで記述したテキストファイル
第2引数: 組み合わせて出力する単語数
第3引数: 組み合わせを出力する回数

~~~bash
ruby brain_connect.rb words 4 10
~~~

## サンプル

CodeIQの問題のためのアイデアフラッシュをするとします。

### 単語ファイル（words）

~~~
CodeIQ
ゴルフ
簡単
難しい
Ruby
Java
アルゴリズム
メタプログラミング
技術用語
ことのはじめ
警告
RuboCop
楽しい
Brainf**k
~~~

### コード

~~~
words = ARGV[0]
connect_count = ARGV[1]
output_count = ARGV[2]

class FileNotFoundException < StandardError; end

class BrainConnector
  def initialize
    validate_file
    @words = File.read(ARGV[0]).each_line.map { |e|e.chomp }
    @connect_count = Integer(ARGV[1])
    @output_count = Integer(ARGV[2])
  end

  def connect_brain
    @output_count.times { puts @words.shuffle.first(@connect_count).join(',') }
  end

  private

  def validate_file
    file = ARGV[0]
    fail FileNotFoundException, "not found #{file}" unless File.exist?(file)
  end
end

begin
  bc = BrainConnector.new
  bc.connect_brain
  exit
rescue => e
  puts e.message
  exit(false)
end
~~~

### 出力1回目
4単語の組み合わせを10回出力

~~~bash
$ ruby brain_connect.rb words 4 10
警告,CodeIQ,楽しい,Ruby
ことのはじめ,警告,Java,技術用語
ことのはじめ,RuboCop,ゴルフ,Ruby
Java,簡単,ことのはじめ,ゴルフ
メタプログラミング,CodeIQ,難しい,警告
RuboCop,楽しい,Brainf**k,ことのはじめ
技術用語,ゴルフ,ことのはじめ,Ruby
ことのはじめ,CodeIQ,アルゴリズム,警告
メタプログラミング,RuboCop,技術用語,簡単
ことのはじめ,難しい,アルゴリズム,Java
~~~

### 出力2回目
3単語の組み合わせを4回出力

~~~bash
$ ruby brain_connect.rb words 3 4
簡単,ゴルフ,Brainf**k
アルゴリズム,ことのはじめ,RuboCop
難しい,メタプログラミング,警告
CodeIQ,ゴルフ,警告
~~~
Qiita要望 | 非ログイン時のトップページへの検索窓設置

# Qiita要望 | 非ログイン時のトップページへの検索窓設置

## 非ログイン時のトップページへの検索窓設置
会社でQiitaを利用する際にログインして利用できないなどの事情がある場合、
トップページに検索窓がないのは何かと不便です。
日本のシステム開発会社の場合、職場から外部のWebサービスにログインすることが推奨されない環境は
たくさんあると思います。

* 非ログイン時のトップページに検索窓設置
* 非ログイン時のトップページを開いて、Tab1回で検索窓にフォーカスが当たるのが理想
* 可能ならショートカットで検索窓にフォーカスが当たるとなおよい  
    ※（GitHubの 「/」や「s」で検索窓にフォーカスがあたるのと同じように）
* ショートカットアクセスが可能なら、三種類のアクセス方法があるとよい

|キー|内容|
|:--|:--|
|s|search。通常の検索。検索窓にフォーカスが当たる|
|u|user search。ユーザー検索。user:まで入力済みで、コロンの右側にカーソルがある状態で検索窓にフォーカスが当たる|
|t|tag search。タグ検索。tag:まで入力済みコロンの右側にカーソルがある状態で検索窓にフォーカスが当たる|

※同意、と言う方はストックしてくださると運営の方に伝わりやすく・ストック数が多いほど同意見が多いと見なして
Qiita内部での課題の優先度が高くなると思います
node.jsを使って、カレントディレクトリのHTTPサーバーを立てるまで


mac

##nodebrewのインストール
homebrewっぽい名前のnodeバージョン管理ソフトがあるのでインストールする https://github.com/hokaccha/nodebrew

```bash:
$ curl -L git.io/nodebrew | perl - setup
$ vi ~/.bashrc
以下追記
export PATH=$HOME/.nodebrew/current/bin:$PATH

$ source ~/.bashrc

```

##node stableのインストール
安定版をインストールします
```bash:
$ nodebrew install stable 
```

##デフォルトで使うnode の設定
```bash:
$ nodebrew alias default v?.?.? #←これさっきのstableで入ったバージョン
$ nodebrew use default
```

##connectモジュールのインストール
サーバー立てるのに使うnodeのモジュールをグローバルインストールします

```bash:
$ npm install connect -g
```

##グローバルインストールしたモジュールをnodeのrequire先に含める
これが一番ハマった。nodeはデフォルトでnpm -gの環境のモジュールを読まないので読むように設定します。

```bash:
$ vi ~/.bashrc
以下追記
export NODE_PATH=`npm root -g`

$ source ~/.bashrc
```

##サーバーをたてるコマンド

```bash:httpserver.sh
node -e "var cnct = require('connect'); var port = 3000; cnct().use(cnct.static(global.process.env.PWD)).listen(port); console.log('Server has started at http://localhost:' + port);"
```

をpathに追加して実行権限付けて

```bash:
$ chmod a+x "httpserver.shがある場所"/httpserver.sh
$ vi ~/.bashrc
以下追記
export PATH="httpserver.shがある場所":$PATH

$ source ~/.bashrc
```


##できた

```bash:
$ mkdir hoge
$ cd hoge
$ vi hoge.html
<h1>へろーほげ</h1>

$ httpserver.sh &
Server has started at http://localhost:3000

$ open http://localhost:3000 # ブラウザが開いて へろーほげ！
```

##参考
* 簡単に手元でHTTPのファイルサーバ立てる方法 - かみぽわーる http://blog.kamipo.net/entry/2013/02/20/122225
* Node.jsでWebSocketのサンプルを動作させるまで - techlog http://d.hatena.ne.jp/j7400157/20130121/1358722561
    * nodebrew を使ったnodeのインストール方法について参考にしました
* node.js のrequire先pathにnpm -gでグローバルインストールしたのものを登録する by @hikaruna http://qiita.com/hikaruna/items/abdadca27f12c0e4eb78
* node.js - nodejs connect cannot find static - Stack Overflow http://stackoverflow.com/questions/24346161/nodejs-connect-cannot-find-static
    * connectのバージョンが2.X.Xじゃないと has no method 'static' というエラーに成ってしまう問題について参考にしました
node.js のrequire先pathにnpm -gでグローバルインストールしたのものを登録する


node のrequire先path確認方法

```bash
$ node
global.module.paths
```

これによると、デフォルトはカレントディレクトリのnode_module。それが見つからなければ親ディレクトリのnode_moduleと見ていくらしい。


```bash
$ echo $NODE_PATH
```

それに加えて環境変数を見に行くらしい。

つまり
環境変数 NODE_PATHにnpm -gのlibの場所を登録すれば良い

```bash
export NODE_PATH=`npm root -g`
```

これはあくまで nodeのrequire先の話で、コマンドのpathを通す話とは別です

##参考
* Node.js のライブラリ読み込みについてのTIPS - 割と普通なブログ http://normalian.hatenablog.com/entry/20110821/1313947003
* modules - Node.js v0.4.12 Manual & Documentation http://nodejs.jp/nodejs.org_ja/docs/v0.4/api/modules.html
CoreDataでatomicにsaveする

 >Core Dataは関係データベースでも関係データベース管理システム(RDBMS)でもありません。 (by Apple CoreDataプログラミングガイド）

ORマッパーでもありませんし、永続ストアのひとつとしてたまたまSQLiteを使えるっていうだけで、プライマリーキー制約なんて概念もありません。

なので例えば

```
User
-uid
-name

```

こんなモデルがあったとして

```
[
  { 
    "uid": 1, 
    "name": "kentaro"
  },
  {
     "uid": 2,
     "name": "yamada"
  }
  ...
]
```

こんなjsonレスポンスを返すAPIがあった場合、

```objc
//APIアクセスしてレスポンス取得
NSNumber* uid = ..;
NSString* name = ...

[MagicalRecord saveWithBlock:^(NSManagedObjectContext *ctx) {
    User* user = [User MR_findFirstByAttribute:@"uid" withValue:uid inContext:ctx];
    if (user == nil) {
        user = [User MR_createInContext:ctx];
        user.uid = uid;
    }
    person.name = name;
} completion:^(BOOL success, NSError *error) {
    assert(success);
}];
```

こういうコードを書いても、とくにクラッシュすることなく普通にうごきます。
ただし、このようなAPIアクセス〜永続化処理が、並列で同時に100回くらい実行されると、、、

```objc
int cnt = [Person MR_countOfEntitiesWithPredicate:[NSPredicate predicateWithFormat:@"uid = 1"]];
NSLog(@"count = %d", cnt);

//> count:100
```

あれー、uid=1のレコードが複数保存されちゃってるー、ってことが起こりえます。
saveWithBlock:ブロック内部がアトミックじゃないからです。

こんな場合は、たとえばGCDの直列ディスパッチキューを一つ用意して、Test and Set を実行するブロックは必ずそのキュー上で実行させてみます。

```objc
static dispatch_queue_t serialQueue;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
    serialQueue = dispatch_queue_create("net.kenmaz.serialqueue", DISPATCH_QUEUE_SERIAL);
});

dispatch_async(serialQueue, ^{
    //ここから〜
    NSManagedObjectContext* ctx = [NSManagedObjectContext MR_context];

    User* user = [User MR_findFirstByAttribute:@"uid" withValue:uid inContext:ctx];
    if (user == nil) {
        user = [User MR_createInContext:ctx];
        user.uid = uid;
    }
    person.name = name;

    [ctx MR_saveToPersistentStoreAndWait];
    //〜ここまで排他的に実行
});
```

100並列実行しても・・・

```objc
int cnt = [Person MR_countOfEntitiesWithPredicate:[NSPredicate predicateWithFormat:@"uid = 1"]];
NSLog(@"count = %d", cnt);

//> count:1
```
おｋぽ

みなさん、このあたりはどのように書いてますかね？
よいアイデアがあればおせーてください。

ちなみにこのへん↓でも似たような話をしてるっぽい
http://stackoverflow.com/questions/7718801/is-a-gcd-dispatch-queue-enough-to-confine-a-core-data-context-to-a-single-thread
CakePHPのルーティング設定について

CakePHPではコントローラ/アクションに紐づけるURLを手動で設定する事が出来る機能が
あります。それが「**Router::connect*」です。

使い方は次の通り

1． app/Config/routes.phpを開く
2． 下記を入力する(入力はサンプルです。)

```
//第１引数は「CakePHPは任意に指定したいURL」
//第２引数はURLに紐づけるコントローラです。
Router::connect('/user/login', array(
    'controller' => 'myLogin', 
    'action' =>'index'
));
```

3． 保存する

でOKです。

サンプルで指定したルーティング設定はどういう事かというと、

```
URL「 http://{CakePHPのルート}/user/login 」 は，

* コントローラ: MyLoginController
* アクション: index

にアクセスしますよ！
```

という事です。

ちなみにルーティング設定を設定していると，ビューのヘルパーで

```
$this->Html->link(array(
    'controller' => 'myLogin', 
    'action' =>'index'
));
```

と指定すると指定したルーティング設定で設定したURLでaタグを生成してくれます。
Goでカリー化とMapの実装

[食べられないほうのカリー化入門](http://qiita.com/KDKTN/items/6a27c0e8efa66b1f7799)を読んで、「へえ、カリー化って面白そうじゃん。Go言語でも実装しやすそう」と思っていたのですが、[Go言語で関数のカリー化(currying)入門](http://qiita.com/135yshr/items/77613fb8366998f0ee52)で、先を越されてしまいました……

まあせっかくなので、食べられない方のカリー化でサンプルにしているような、配列操作のサンプルコードを晒してみます。

```go
package main

import "fmt"

type Slice []int

func main() {
	sample := Slice{1, 3, -5, 7, -2}

	// n倍する関数を返す
	times := func(n int) func(int) int {
		return func(x int) int {
			return x * n
		}
	}

	// +nする関数を返す
	add := func(n int) func(int) int {
		return func(x int) int {
			return x + n
		}
	}

	// nと比べて小さければnを返す関数を返す
	max := func(n int) func(int) int {
		return func(x int) int {
			if n > x {
				return n
			} else {
				return x
			}
		}
	}

	fmt.Println("--- 実行 ---")
	fmt.Println(sample.Map(times(2)))
	fmt.Println(sample.Map(times(10)))
	fmt.Println(sample.Map(add(10)))
	fmt.Println(sample.Map(max(0)))
}

//スライスの各要素に対して指定の操作をする
func (s Slice) Map(proc func(int) int) []int {
	clone_s := make([]int, len(s))
	for i := range s {
		clone_s[i] = proc(s[i])
	}
	return clone_s
}
```

```
--- 実行 ---
[2 6 -10 14 -4]
[10 30 -50 70 -20]
[11 13 5 17 8]
[1 3 0 7 0]
```

割とさくっと実行できますな。

しかし[goでEach, Map, Selectのサンプル](http://qiita.com/hnakamur/items/76b06603013279b14aeb)でも、近いことをしていました……！！
拡張メソッドのグループ化

ちょいテクです。

最近、拡張メッソドが楽しくて仕方ないのですが、あまりにも大量に増えすぎると困ります。
また、String型などの、極めて基本的なクラスに対しての拡張メソッドも、増やしすぎていいものかと思います。
そこで、拡張メソッドのグループ化をしたくなります。
こんな感じで実現できました。

```csharp:filename
    public static class Text
    {
        public static HtmlText ToHtml(this string html, string url)
        {
            return new HtmlText(html, url);
        }

        public static HtmlText ToHtml(this string html)
        {
            return new HtmlText(html, string.Empty);
        }
    }

    public class HtmlText
    {
        public string Text { get; set; }
        public string Url { get; set; }
        public HtmlText(string text,string url)
        {
            Text = text;
            Url = url;
        }

        public IEnumerable<MarkupLanguage.TagClass> GetTag(string tag)
        {
            return MarkupLanguage.TagAnalyze.GetTag(Text, tag);
        }
        public IEnumerable<Web.Link> GetLink()
        {
            return Web.GetLinkForHTML(Text, Url);
        }
        public IEnumerable<Web.Link> GetImageLink()
        {
            return Web.GetImageLink(Text);
        }
        public string TagClear()
        {
            return Web.HtmlTagAllDelete(Text);
        }
    }
```
こういう感じで、呼び出し専用のクラスを作り、そのクラスを作るための拡張メソッドを作ると、拡張メソッドのグループ化ができると思います。


```csharp:
　var urlList = "HTMLテキスト".ToHtml().GetLink().Select(n => n.Url);
```
使い方はこんな感じです。スッキリ！
CloudWatchで１つのMetricsに複数の系列を入れちゃおう


## はじめに

みんな大好きCloudWatchのCustom Metrics。値の入れ方は２通り。

+ Valueを１つ指定
+ Statistics Valueを指定

前者は複数のデータソースから１データサンプルずつを入れるイメージです。
もし複数のデータがある場合には、それらのMin/Avg/Max/SumをCloudWatchが計算してくれます。

後者の場合にはPutする時点で集計を終わらせて、

+ Minimum
+ Maximum
+ Sum
+ SampleCount

を全て指定する必要があります(Average は自動的に Sum / SampleCount になります)。
これらの数字は１回のGetMetricStatisticsで取り出す事が出来ます。

記録したい系列が２つ以上ある場合、それぞれに脈絡のない別の数字を入れてPutMetricDataすると、取り出す時に一気に取り出せて、若干のお得感があります。

## どうやるの

```
$ aws cloudwatch put-metric-data --namespace "multivalue" --metric-name "foo" --statistic-values Minimum=1,Maximum=3,SampleCount=2,Sum=4

$ aws cloudwatch get-metric-statistics --namespace "multivalue" --metric-name "foo" --start-time $(date -v 1H -u +%Y-%m-%dT%H:%M:%S) --end-time $(date -u +%Y-%m-%dT%H:%M:%S) --period 60 --statistics Minimum Average Maximum Sum SampleCount
{
    "Datapoints": [
        {
            "SampleCount": 2.0,
            "Timestamp": "2014-08-08T15:41:00Z",
            "Average": 2.0,
            "Maximum": 3.0,
            "Minimum": 1.0,
            "Sum": 4.0,
            "Unit": "None"
        }
    ],
    "Label": "foo"
}
```

ちゃんとそれぞれに入れた値と、自動的に計算された Average が得られました。

## 制限事項

いくつか気をつけないといけない事があります。

### Min > Max はダメです
```
$ aws cloudwatch put-metric-data --namespace "multivalue" --metric-name "foo" --statistic-values Minimum=3,Maximum=1,SampleCount=2,Sum=4

A client error (InvalidParameterValue) occurred when calling the PutMetricData operation: The parameter MetricData.member.1.StatisticValues.Maximum must be greater than MetricData.member.1.StatisticValues.Minimum.
```
当たり前と言えば、当たり前。

### SampleCount = 0 もダメです
```
$ aws cloudwatch put-metric-data --namespace "multivalue" --metric-name "foo" --statistic-values Minimum=1,Maximum=3,SampleCount=0,Sum=4

A client error (InvalidParameterValue) occurred when calling the PutMetricData operation: The parameter MetricData.member.1.StatisticValues.SampleCount must not equal 0.
```

０で割れませんから、当然ですね。

そのくせ、

```
$ aws cloudwatch put-metric-data --namespace "multivalue" --metric-name "foo" --statistic-values Minimum=1,Maximum=3,SampleCount=1,Sum=0
```

みたいな矛盾しているパターンでも入れてしまえます。

以上、小ネタでした。
Java入門 戻り値の利用

Java入門
戻り値の利用

メソッドから呼び出し元に戻されるデータを戻り値といいます。

```java:sample.java
public class Sample {
	public static void main(String[] args) {
		int answer = add(100, 50);

		System.out.println("100 + 50 = " + answer);
	}
	// 2つの値を合計するメソッド
	public static int add (int x, int y) {
		int answer = x + y;
		// 合計を変数answerに格納してmainメソッドに返す
		return answer;
	}
}
```

実行結果

```lang:sample
100 + 50 = 150
```

addメソッドのreturnを注目してください。この設計ではreturnの横に書かれた変数answerに2つの値の合計を格納して
mainメソッドに渡しています。
returnは変数だけでなく、整数値や文字列を直接記入することも可能です。

addメソッドの型を注目して下さい。ここの型はreturnによって戻される値と同じ型を指定します。今回は整数値を戻すのでint型と指定します。ここは文字列であればString型、戻すものがなければvoidを指定します。

return文はメソッドの終了も意味します。return文の下に処理を書いても実行されず、コンパイルエラーになるので注意しましょう。
SVN プロトコルまとめ


# はじめに

SVN のプロトコルには以下の種類があります。
どのプロトコルを選択すべきか、判断材料のメモです。

```
file://path/
http://host/path/
https://host/path/
svn://host/path/
svn+ssh://host/path/
```

大きく分けて http と svn がある。



# 各プロトコルの特徴

## file://

ローカル環境で使用します。


## http://

Apache ベースのサーバ

### 利点
* Apache がサポートしている認証を利用できる。
* WebDAV クライアントを利用できる。

### 不利な点
* 扱うファイル数が多くなるほどオーバーヘッド大きくなり、処理に時間がかかる。
（v1.7 以降改善されている。）


## https://

http プロトコルの SSL セキュア版

### 利点
* 暗号化通信

### 不利な点
* セキュリティ証明書の取得など、構築にコストがかかる。


## svn://

svnserve ベースのサーバ

### 利点
* http プロトコルに比べ、高速である。
* http プロトコルに比べ、サーバ構築が若干楽。

### 不利な点
* ユーザーを管理しづらい。


## svn+ssh://

svn プロトコルの SSH セキュア版

### 利点
* 暗号化通信

### 不利な点
* クライアント側の接続操作が複雑。



# まとめ

* http プロトコルが使用されている場面が多いよう。
 * メンテナンス、サポート面から見て。
 * 特に複数名の環境。
* 個人で気軽に使う分は svn プロトコルでも良さそう。
* 暗号化は必要に応じて。



# 参考資料

* http://en.wikipedia.org/wiki/Apache_Subversion
* http://stackoverflow.com/questions/2140954/which-protocol-svn-or-https
ZabbixでSmokepingのようにLatencyを測定する

ネットワークのLatency測定を仕掛けておくためにSmokepingではなくZabbixを使用したのでメモ。いつもは[ブログ](http://komeiy.hatenablog.com)に書いていますが、QiitaにZabbixの投稿が少ないのを見てこちらに書いてみます。

経緯
-------
SmokePingもいいのですが、以下の内容からやはりZabbixで。
・監視ツールが増えて管理画面を複数開くのが面倒。きっと見なくなる。
・Zabbix API使って実現していることをそのまま使いたい。

やりたい事
-------
・パケットサイズを環境に合わせて応答時間を測定
・任意の間隔、パケット数で測定
・複数パケットを送信した場合、最大値/平均値/最小値も表示
・グラフを見た時に中央値をすぐに把握したい
・グラフは見やすい方がよい

Zabbixの設定
---------
以下の3つのシンプルチェックを使用
・icmppingsec
・icmppingloss
・net.tcp.service.perf

シンプルチェックの使用例：

```
icmppingsec
icmppingsec[,5,,1000,]
icmppingsec[,5,1000,80,500]
```

```
net.tcp.service[ftp,,155]
net.tcp.service[http]
net.tcp.service.perf[http,,8080] 
```

グラフ画像
-------
・ネットワークレイテンシー（応答時間）

![Ping-graph.JPG](https://qiita-image-store.s3.amazonaws.com/0/51152/39d62e3c-83e5-8b7e-6bb1-db98905e46d9.jpeg)

LargeとShortでパケットサイズを変えて応答時間を測定しています。
中央値はLargeとShort混ざって取っているので、グラフを分けた方がその点では良さそうです。

・HTTPレスポンス（応答時間）

![http-grarh.JPG](https://qiita-image-store.s3.amazonaws.com/0/51152/7ebf9046-f293-4cde-1571-e3ff3015cd5f.jpeg)

ここでは単純にYahooへアクセスして計測しています。

最後に
----------
テンプレートをGithubにアップしましたのでご自由にご使用ください。
間隔やパケットサイズなどアイテムの設定値を適宜修正して、ホストにテンプレートを適用してください。

https://github.com/komeiy/Smokeping_Zabbix

あくまでも個人の範囲での提供のため、ご使用は自己責任でお願いします。


twitter,blog等はプロフィールからお願いします。
bashで過去に実行したコマンドやその引数を引用する

よく忘れてそのたびにググるのでメモ

存在しないフォルダを作って移動する

```console
$ mkdir -p hoge/newdir/newnewdir
$ cd !$
```

コマンドを置換して同じ引数で実行

```console
$ vi ../../.bashrc
$ !:s/vi/source/
```

引数の範囲を指定して引用

```console
# 引数全部を引用
$ echo aa bb cc dd ee
$ echo !*
echo aa bb cc dd ee
aa bb cc dd ee

# 引数の先頭
$ echo aa bb cc dd ee
$ echo !^
echo aa
aa

# 最後の引数
$ echo aa bb cc dd ee
$ echo !$
echo ee
ee

# n個目の引数
$ echo aa bb cc dd ee
$ echo !:3
echo cc
cc

# n個目から最後の引数をまとめて
$ echo aa bb cc dd ee
$ echo !:3-$
echo cc dd ee
cc dd ee

# おまけ：前に実行したコマンド(!:0, !! の違い)
$ echo aa bb cc dd ee
$ echo !:0
echo echo
echo

$ echo aa bb cc dd ee
$ echo !!
echo echo aa bb cc dd ee
echo aa bb cc dd ee
```

たとえばこんなふうに使うと便利

```console
$ bundle exec rake db:drop db:create
$ !:0-2 db:seed   # bundle exec rake db:seed が実行
cronでバッチを設定する

#cronでバッチ処理
##1.　cronが起動しているか確認する
/etc/rc.d/init.d/crond status

##2.　cronに既にバッチ処理が設定されているか確認する
crontab -l

##3.　cronの設定ファイルを確認
　less /etc/crontab

##4.　バッチを設定する
　crontab -e
　0 0 * * * /bin/bash /home/xxx/cron_all.sh > /dev/null 2>&1
  ⇒分 時 日 月 曜日 コマンド
##5.　念のためwindowsの改行があるか確認する。
　cat -v /home/xxx/cron_all.sh
  ^Mがあったら、NG(windowsの改行)
  改行を除去する
　sed -i 's/\r//' /home/xxx/cron_all.sh

##6.　cronにバッチが設定されている事を確認。
crontab -l
Route53 : ValueDomain

#Route53

Amazonが提供するDNSサービス
ドメイン取得、ドメイン名登録、ヘルスチェック、フェールオーバー等が行える。

通常はドメインを取得したレジストラから追加料金なしで、提供されているサービスですが、
AWSとの連携、プログラマブルな操作、レコード反映の早さなどが特徴。

##料金

0.50 USD（ホストゾーンごと）/月 – 最初の25のホストゾーン
0.10 USD（ホストゾーンごと）/月 – それ以上のホストゾーン
0.400 USD（100 万クエリごと） – 最初の 10 億クエリ/月

##手順

###HostedZones

HostedZonesを作成

![dns-2.PNG](https://qiita-image-store.s3.amazonaws.com/0/49877/e0e0762a-3664-17eb-e64d-ea503e013226.png)

Aレコードをセットする

![dns-4.PNG](https://qiita-image-store.s3.amazonaws.com/0/49877/0f2811a4-0636-4296-c9fe-e2dc6de31b4f.png)

レコード確認

![dns-7.PNG](https://qiita-image-store.s3.amazonaws.com/0/49877/0ed559c1-aed1-98fb-7579-53fdde33c51f.png)


###名前解決確認

```lang
nslookup -type=any satohiroyuki.info
satohiroyuki.info
        primary name server = ns1.value-domain.com
        responsible mail addr = hostmaster.satohiroyuki.info
        serial  = 1407422678
        refresh = 16384 (4 hours 33 mins 4 secs)
        retry   = 2048 (34 mins 8 secs)
        expire  = 1048576 (12 days 3 hours 16 mins 16 secs)
        default TTL = 2560 (42 mins 40 secs)
satohiroyuki.info       nameserver = ns1.value-domain.com
satohiroyuki.info       nameserver = ns2.value-domain.com
satohiroyuki.info       internet address = 153.219.6.249

ns2.value-domain.com    internet address = 153.122.18.41
ns1.value-domain.com    internet address = 119.245.243.94

```

###レコード変更

レコード確認の際の内容を記載
私の場合はValueDomain

![dns-5.PNG](https://qiita-image-store.s3.amazonaws.com/0/49877/1ec2e769-dfba-70ee-54e8-9548f71dabd9.png)



###確認

1時間から2時間程度で変更

```lang
satohiroyuki.info
        primary name server = ns-373.awsdns-46.com
        responsible mail addr = awsdns-hostmaster.amazon.com
        serial  = 1
        refresh = 7200 (2 hours)
        retry   = 900 (15 mins)
        expire  = 1209600 (14 days)
        default TTL = 86400 (1 day)
satohiroyuki.info       nameserver = ns-1178.awsdns-19.org
satohiroyuki.info       nameserver = ns-1592.awsdns-07.co.uk
satohiroyuki.info       nameserver = ns-373.awsdns-46.com
satohiroyuki.info       nameserver = ns-932.awsdns-52.net
satohiroyuki.info       internet address = 114.158.145.26

ns-1592.awsdns-07.co.uk internet address = 205.251.198.56
ns-373.awsdns-46.com    internet address = 205.251.193.117
ns-932.awsdns-52.net    internet address = 205.251.195.164
ns-1178.awsdns-19.org   internet address = 205.251.196.154

```

##DDNS

IPアドレスが固定ではないため、
DDNSを実装する。


公式のツールもあるが、今回は有志のツールを使用する。

公式
http://aws.amazon.com/code/Amazon-Route-53/9706686376855511

使用ツール
https://www.npmjs.org/package/dynroute

###必要パッケージ

Ubuntu14.04の場合

```
sudo apt-get install libdigest-hmac-perl
sudo apt-get install libxml-xpath-perl
sudo apt-get install curl
sudo apt-get install npm
```

###dynrouteインストール
Install

```
sudo npm install -g dynroute
sudo ln -s /usr/bin/nodejs /usr/bin/node
```

keyfile

IAMは作成しておく
https://console.aws.amazon.com/iam/home?#security_credential

```
[credentials]
accessKeyId     = AAAAAAAAAAAAAAAAAAAA
secretAccessKey = bbbbbbbbbbbbbbbbbbbbbLwccccembeMdddddI4e
```

実行

```
dynroute -d satohiroyuki.info --once --debug
```
cronに仕込む

```
5 * * * * /usr/local/bin/dynroute -d satohiroyuki.info --once --debug
```
railsでdecryptとencryptのsetter、getterを実装する

個人情報を暗号化してDBに保存。取り出すときは復号化する。
これをRailsのsetter、getterで実装する方法を紹介します。

```:ruby
class User < ActiveRecord::Base  
  def encryptor 
    secret = 'hogehofgehogeogeoeogeogoeogeogeogoeogeooge'             
    ::ActiveSupport::MessageEncryptor.new(secret)                
  end

  def email=(val)
    encryptor = self.encryptor 
    write_attribute("email",encryptor.encrypt_and_sign(val))             
  end 

  def email
    encryptor = self.encryptor
    encryptor.decrypt_and_verify(read_attribute("email"))          
  end  
end
```

これで、saveメソッド実行したり、User.emailのように取り出すときも
復号化、暗号化が実行される。わざわざencrypt_emailのような関数を作らなくてOK

ちなみに、下記のような書き方では実行されない。

```:ruby
class User < ActiveRecord::Base  
  def encryptor 
    secret = 'nicomakinozoerikotouminikomakikotoumi'
    ::ActiveSupport::MessageEncryptor.new(secret) 
  end

  def email=(val)
    encryptor = self.encryptor
    email = encryptor.encrypt_and_sign(val)                                                                                                                            
  end 

  def email
    encryptor = self.encryptor
    encryptor.decrypt_and_verify(email)
  end  
end
```
PHPのストリームフィルタでCSV読み込み

※この実装は[バグがあります](https://qiita.com/rana_kualu/items/dc99be34b9e2f721b70f#comment-2359b95663c743e1a776)。コメントおよび[正しい実装](https://qiita.com/suin/items/3edfb9cb15e26bffba11)を参照してください。


『[利用できるフィルタのリスト](http://php.net/manual/ja/filters.php)』という謎の項目があります。
[filter_input()](http://php.net/manual/ja/book.filter.php)とかのFilterとはまた別の、PHPにデフォルトで用意されているフィルタです。

何ができるかというと、入出力ストリームに対して操作が可能です。
[ストリーム](http://php.net/manual/ja/resource.php)とはfopen()とかでオープンされるリソースで、というか他に何か使えるものあるんですかね？

```php
<?php
	$text = 'abcdefg';
	
	// ストリームフィルタ
	$crypt   = 'mcrypt.'.MCRYPT_3DES;
	$decrypt = 'mdecrypt.'.MCRYPT_3DES;
	$params = array('iv'=>'hoge', 'key'=>'fuga');
	
	// 書き込み
	$fp = fopen('foo.txt', 'w');
	// 暗号化ストリームフィルタを適用
	stream_filter_append($fp, $crypt, STREAM_FILTER_WRITE, $params);
	fwrite($fp, $text);
	fclose($fp);
	
	// 読み出し
	$fp = fopen('foo.txt', 'rb');
	// 復号ストリームフィルタを適用
	stream_filter_append($fp, $decrypt, STREAM_FILTER_READ, $params);
	$text = fread($fp, 10000);
	fclose($fp);
	
	var_dump($text); // abcdefg
```

foo.txtは人間には読めない形に暗号化されていますが、fread()するだけで透過的に復号されます。
あとはラッパークラスなりで囲えば簡単に暗号化ファイル操作クラスができあがります。

[デフォルトのフィルタ](http://php.net/manual/ja/filters.string.php)には、str_rot13()みたいな絶対使わないのがあるわりに有用なものがあまりありません。
ストリームフィルタは自作可能なので、役に立ちそうなものを自作してみます。

```php
<?php
	/*
	* SJISのCSVをUTF-8で取り込むフィルタ
	*/
	class fgetcsv_filter extends php_user_filter{
		/**
		* @Override
		* @param resource 入力ストリーム
		* @param resource 出力ストリーム
		* @param int 変更したデータ長を参照渡しで返す
		* @param boolean フィルタチェインの最後の処理であればtrue
		* @return int PSFS_PASS_ON / PSFS_FEED_ME / PSFS_ERR_FATAL
		*/
		public function filter($in, $out, &$consumed, $closing){
			$locale = setlocale(LC_ALL, 0);
			setlocale(LC_ALL,'ja_JP.UTF-8');
			while ($bucket = stream_bucket_make_writeable($in)) {
				$bucket->data = mb_convert_encoding($bucket->data, 'UTF-8', 'SJIS-win');
				$consumed += $bucket->datalen;
				stream_bucket_append($out, $bucket);
			}
			setlocale(LC_ALL, $locale);
			return PSFS_PASS_ON;
		}
	}
	// fgetcsv_filterをfgetcsv_regという名前で登録
	stream_filter_register('fgetcsv_reg', 'fgetcsv_filter');
	
	$fp = fopen('hoge.csv', 'r');
	// $fpにfgetcsv_regフィルタを適用
	stream_filter_append($fp, 'fgetcsv_reg');
	
	// 以後普通に読める
	$data = fgetcsv($fp);
	var_dump($data);
```

hoge.csv

```text
1ソ,Ⅱ表,③能,"ⅳ
"
```

CSVの文字コードはSJISです。
結果。

```php
  array(4) {
    [0]=>
    string(4) "1ソ"
    [1]=>
    string(6) "Ⅱ表"
    [2]=>
    string(6) "③能"
    [3]=>
    string(5) "ⅳ
"
  }
```

文字化けせずに読み込み成功しました。
めでたし。

まあ正直わかりにくいので、あえてストリームフィルタを使わなくても[fgetcsv_reg()](http://yossy.iimp.jp/wp/?p=56)でいいじゃないという気もしますが。
ホスト名書き換え:AmazonLinux 

#ホスト名変更

ホスト名の変更メモ

##手順
###network

```bash
vim /etc/sysconfig/network
=====
HOSTNAME=hogehoge.internal
=====
```

###hosts
```bash
vim /etc/hosts
=====
HOSTNAME=hogehoge.internal
=====
```

###Reboot
```bash
=====
reboot
=====
```

##再起動しても変更しない場合

###find
```bash
find /etc/ -type f -exec grep -H hogehost {} \;
```
検索してホストが記載されいるファイルを見つける

###sysctl

sysctl内に記載されていた

```bash
vim /etc/sysctl.conf
======
kernel.hostname=hogehoge
======
```

###その他

/etc/rc.d内のスクリプトなどにも書いてあることも
[enthumble] キーカスタマイズ例

リリースノートないからまだ3.0に更新してないけど現在の設定を投稿してみんとす。

`thumbIME` は使用しないで、逆の設定にしています。ひらがなキー単押しした時の設定できるようにしたいです。

- 無変換キー
 - IME ON
- 変換キー
 - IME OFF

ini には 2.7 って書いてありますけど ver. 2.8 を使用しています。

## keylist
`enthumble\keylist\IJKL.ini`

```ini:enthumble
[HowToUse]
Check=http://www.enthumble.com/keylist
Name=enthumble version 2.7

[KEY]
Space={Enter}
Muhenkan={vkF2sc070B}
 ;IME ON
Henkan={vkF2sc070B}{vkF3sc029}
 ;IME OFF
Hiragana={Escape}

F1={}
F2={}
F3={Volume_Down}
F4={Volume_Up}
F5={}
F6={}
F7={}
F8={}
F9={}
F10={}
F11={}
F12={}
F23={}
F24={}

1={shift down}{1}{shift up}
2={shift down}{2}{shift up}
3={shift down}{3}{shift up}
4={shift down}{4}{shift up}
5={shift down}{5}{shift up}
6={shift down}{6}{shift up}
7={shift down}{7}{shift up}
8={shift down}{8}{shift up}
9={shift down}{9}{shift up}
0={shift down}{10}{shift up}
-={shift down}{11}{shift up}
Hat={shift down}{12}{shift up}
\={shift down}{\}{shift up}

Q={}
W=^w
E={}
R={}
T={}
Y=^y
U={Home}
I={up}
O={End}
P={}
@={shift down}{Tab}{shift up}
LB={PgUp}

A=^a
S=^s
D=^d
F=^f
G=^g
H=^h
J={left}
K={down}
L={right}
Semicolon={}
:={Tab}
RB={PgDn}

Z=^z
X=^x
C=^c
V=^v{Left}{Left}{Down}
 ;クリップボード貼り付け二文字連続
B=^v{Left}{Down}
 ;クリップボード貼り付け一文字連続
N={Backspace}
M={Delete}
,={ctrl down}{PgUp}{ctrl up}
.={ctrl down}{PgDn}{ctrl up}
/={}
Backslash={}

Up={Up}{End}
Down={Down}{End}
Left={Left}{Home}
Right={Right}{End}
LButton={ctrl down}{PgUp}{ctrl up}
MButton={}
RButton={ctrl down}{PgDn}{ctrl up}
WheelUp={Volume_Up}
WheeDown={Volume_Down}

PageUp={WheelUp}
PageDown={WheelDown}
Home={}
End={}

Delete={Delete}{Delete}{Down}
 ;デリート二文字連続
Bacspace={BS}{Right}{Down}
Enter={}
Escape={}
Hankaku={}
Tab={}
Capslock={}
Lwin=^v{Left}{Left}{Left}{Left}{Down}
 ;クリップボード貼り付け四文字連続
Rwin={}
Insert={}
```
CloudWatchのあるはずのメトリックスが存在しない理由

身近で結構ハマる人が多かったので書いておきます。

# Question

例えばELBだと[CloudWatchのELB監視項目 - Qiita](http://qiita.com/mechamogera/items/7898331efafc973f9ed8)のようなメトリックスが取得できるはずだけど存在しないものがあるのはなぜ？
特にELBだとHTTPCode_ELB_5XXとかHTTPCode_Backend_5XX、SurgeQueueLengthなんかが存在しない場合が多い。

# Answer

対象の現象が発生していないのでデータがない。
もしくは、過去には発生していたがCloudWatchの保持期限である2週間立をこえて発生していなかったのでデータが削除されてない。
データがないとメトリックスは存在しない。

例えば、HTTPCode_ELB_5XXやHTTPCode_Backend_5XXだとELBやバックエンドのEC2で5XXのステータスコードが発生していない。
どうやらELBは監視間隔ごとにCloudWatchに5XXの発生回数を送っていているわけではないらしい。
発生していない時は0回というデータを送っているわけではなく、1回以上発生した時にのみデータを送っているらしい。

# TIPS

APIなどでCloudWatchのメトリックスを取得する際、そのメトリックスがあるはずなのに存在しないような場合は値を0として扱うようなことが必要。
Go言語: ビルド時にバージョン情報を埋め込みたい


## 課題

* Goでアプリケーションを作るとき、バージョン番号をコードに含めるのにいちいち書き換えてている…。

## 解決策

* ビルドの引数に `-ldflags "-X main.version=バージョン"` をつける。

## やりかた

バージョンを代入する変数を一つ作る。

```go:app.go
package main

var version string // 文字列型でバージョンを宣言する

func main() {
	println("version: " + version)
}

```

ビルド時に `-ldflags` をつけて実行する。

```console
$ go build -ldflags "-X main.version 1.0.0" app.go
```

ビルドされたアプリを実行してみると、変数 `version` に `1.0.0` が代入されているのが分かる。

```console
$ ./app
version: 1.0.0
```


`-ldflags` の `-X` で与える引数は `パッケージ名.変数名` であればなんでも使えるので、バージョン情報だけでなく、ちょっとした設定値やソースコードには含めたくないけど、ビルドには含んでおきたい情報などを埋め込むのにも使える。

なお、静的ファイルのような大きいデータを含める場合は `-ldflags` ではなく、[jteeuwen/go-bindata](https://github.com/jteeuwen/go-bindata) を使ったほうがビルドしやすいかもしれない。
JavaScriptでnewありでもなしでも同じオブジェクトを返したい時使うやり方

```js

var Foo = (function() {
  function Foo() {
    if (!(this instanceof Foo)) {
      return new Foo;
    }
  }

  return Foo;

})();

```

ちなみにClassをいっぱい使いそうなCoffeeScriptで書く場合はこう

```coffeescript
class Foo
  constructor: ->
    return new Foo unless @ instanceof Foo
```
Cygwinでプログラミング用フォントRictyを使えるようにする

新しい環境になった時に毎回調べるのがめんどくさいのでメモ

## 手順

- [プログラミング用フォント Ricty Diminished](http://save.sys.t.u-tokyo.ac.jp/~yusa/fonts/rictydiminished.html) より`RictyDiminished-3.2.3.tar.gz` をダウンロードする
- 次のようにしてファイルを解凍しttfファイルを取り出します

```
tar zxvf RictyDiminished-3.2.3.tar.gz
```

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/1538/df6bbcc0-fd3e-a090-f35c-0ef841bcfa19.png)


- エクスプローラから，`コントロール パネル\デスクトップのカスタマイズ\フォント`を開き，生成されたファイルを，ドラックアンドドロップする
- cygwinを開き，options, textから，`Ricty Diminished` を選択する

## 結果

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/1538/ff8e91b0-b0e1-c5d2-8835-194389c64048.png)
remoteObjectsのサンプル (OrderBy指定)

商談情報を取得するRemoteObject処理のサンプルです。
最初にapex:remoteObjectsを宣言します。

```
<apex:remoteObjects >
    <apex:remoteObjectModel name="Opportunity" fields="Name,Id">
        <apex:remoteObjectField name="Amount" />
        <apex:remoteObjectField name="IsPrivate" />
    </apex:remoteObjectModel>
</apex:remoteObjects>
```

JavaScript側はこんな感じです。

```
<script type="text/javascript">  
function drawPieChart() {
    // SObjectModel宣言
    var opportunityObject = new SObjectModel.Opportunity();
    
    // RemoteObject処理実行
    opportunityObject.retrieve({
        orderby: [{Amount: 'DESC'}],
        limit: 5
    },function(err, results) {
        if(err) {
            alert(err.message);
        } else {
            // 取得したリストをループ   
            results.forEach(function(result) {
                console.log(result.get('Name'));
                console.log(result.get('Amount'));
                console.log(result.get('IsPrivate'));
            });
        }
    });
}
</script>
```

値は「.get()」で取得できます。
orderbyで複数項目指定したい場合は、「orderby: [{Amount: 'DESC'},{Name: 'ASC'}]」という感じです。
FuelPHPの1.7.2でSmartyインストールしたらエラー

#composer update でエラーが発生
何度やっても直らない。
しまいには、.gitディレクトリがないとか言い出す始末。

#バージョン依存のエラーだった
##1.7.1に変えたら、すんなりインストールできた。
1.7.2のcomposer.jsonを見てもらえれば分かると思いますが、repositoryとかの記述が増えてますね。
開発時のものが紛れ込んでしまったんでしょうか。

```shell-session:こんなエラー
  [RuntimeException]                                                                               
  Failed to clone git@github.com:composer/installers.git via git, https, ssh protocols, aborting.  
                                                                                                   
  - git://github.com/composer/installers.git                                                       
    fatal: No such remote 'composer'                                                               
                                                                                                   
  - https://github.com/composer/installers.git                                                     
    fatal: No such remote 'composer'                                                               
                                                                                                   
  - git@github.com:composer/installers.git                                                         
    fatal: No such remote 'composer'   
```

#修正バージョンは・・
1.7.3になるんでしょうかね？
いずれにしても、1.7.2を使う際は要注意ということで。
pandas によるデータセットの加工 (2)

[昨日](http://qiita.com/ynakayama/items/2769bc92bb71ebf23be6)は pandas でのデータセット加工について説明しましたがその続きです。

## データを正規化する

実は[今までの記事](http://qiita.com/ynakayama/items/e37c222771db53a0e629)でもさり気なく正規化は登場してきたのですがきちんと説明していなかったと思います。

統計における **正規化 (normalize)** とは、異なる基準のデータを一定の基準にしたがって変形し利用しやすくすることです。


たとえば国語が 90 点、数学が 70 点だったとしましょう。単純に数値だけを比較すると国語のほうが成績が良いことになってしまいますが、もし国語の平均点が 85 点、数学の平均点が 55 点だったら果たしてどうでしょうか？このように基準が異なるデータを比較できるようになるといったことが正規化のメリットです。

一般的には平均 0 、分散 (及び標準偏差) が 1 になるように値を変換することを指します。

これは以下の数式で算出できます。

```math
Normalized(A(n)) = \frac {(A(n) - μ(A))} {\sigma(A)}
```

すなわち平均を引き、標準偏差で割れば良いわけです。これにより平均が 0 となり、標準偏差が 1 となります。

### 正規化を可視化する

何事も手を動かして目で見てみるのが一番です。pandas で同じことをしてみましょう。

まずはデータフレームを列方向の合計値で除算して総合計が 1 になるように正規化してみます。

![1.png](https://qiita-image-store.s3.amazonaws.com/0/38501/2e1039f7-4bf9-4058-990d-acb02697d9b5.png)

```py3
data.div(data.sum(1), axis=0)
```

![2.png](https://qiita-image-store.s3.amazonaws.com/0/38501/486e266f-9cc9-1ef7-64a3-77f1c9d967e1.png)

### 四分位範囲で正規化する

```py3
(data - data.quantile(0.5).values) / (data.quantile(0.75)-data.quantile(0.25)).values
```

![7.png](https://qiita-image-store.s3.amazonaws.com/0/38501/c36b9847-7ad1-1547-0962-38de8b46b378.png)

## 対数変換

[対数変換](http://ja.wikipedia.org/wiki/%E5%AF%BE%E6%95%B0)とは、対数正規分布にしたがう変数の対数をとって正規分布に従う変数を作ることです。

対数変換により、少数や、巨大な数値などを整理・表現しやすくすることができます。

コードで表現したほうがわかりやすいかもしれません。

```py3
data.apply(np.log)
```

![8.png](https://qiita-image-store.s3.amazonaws.com/0/38501/a1aa0ea1-c7fb-b239-97d2-bd51b1cafe52.png)

## 移動率を求める

移動率 (増加率) とは、ある基準となる値に対し、どれだけ変化したのかを示す数値です。

pct_change() はデータフレームの値を移動率に変換します。気をつけるべきポイントとしては、最初の数値はその前がないので移動率が NaN になる点です。移動率もさりげなく[以前の記事](http://qiita.com/ynakayama/items/1801d374224d6914a382)に登場していました。

```py3
data.T.pct_change().dropna(axis=0)
```

昨日紹介したように、欠損値を削除すると一応は表にできます。ただグラフの最初の値が大きくなってしまうので少し紛らわしいですね。

![9.png](https://qiita-image-store.s3.amazonaws.com/0/38501/2937841d-2631-9bf9-ba2b-1fa5ad28074b.png)

## IPython の作業履歴を保存する

データセットの加工とは直接は関係ありませんが、 IPython で試行した結果をファイルに出力して保存できれば便利です。もし正しい試行をしていたなら、そのままスクリプトとして利用できますし、作業履歴からコードを取り出すなど再利用性が高まります。

```py3
import readline
readline.write_history_file("history.py")
```

これにより IPython に入力したコードの履歴が history.py として保存されます。とても便利ですね。

## まとめ

今回もデータセットを加工する上でよく使うさまざまな処理をまとめました。