OmniAICreator/Qiita-1.07M huggingface dataset:
railsでf.selectにclassを設定する

以下のようにrailsでselectにclass設定しようとしたが、生成されたHTMLを見てみると、classが設定できていなかった。

```
<%= form_for @user do |f| %>
  <%= f.select :person_id,Person.all.collect { |p| [ p.name, p.id ] }, class: "form-control %>
<% end %>
```
## 対処法
下記で出来ます。

```
<%= form_for @post do |f| %>
	<%= f.select :person_id,Person.all.collect { |p| [ p.name, p.id ] }, {}, {class: 'form-control'} %>
<% end %>
```


ソースコードを調べて見ると、option(:include_blankや:prompt)は第3引数に設定し、html_options(classやstyle)は第4引数に設定するようでした。
なので、html系のオプションだけ設定したい場合は、第3引数に空ハッシュを渡し、第4引数にhtml系のオプションを設定します。


```text:メソッド定義
def select(method, choices = nil, options = {}, html_options = {}, &block)
```


http://railsdoc.com/references/select
このドキュメントの説明だけは分からなかった。optionsには、include_blankとpromptしか設定できないようです。



### include_blankやpromptも設定したいこのように。

```
<%= form_for @post do |f| %>
	<%= f.select :person_id,Person.all.collect { |p| [ p.name, p.id ] }, {include_blank: true}, {class: 'form-control'} %>
<% end %>
```

### f.collection_selectなども同様に
```
<%= form_for @post do |f| %>
	<%= f.collection_select :person_id, Author.all, :id, :name_with_initial, {}, {class: 'form-control'} %>
	<%= f.submit %>
<% end %>
```
WindowsのCIFS/SMB共有のマウント(Windows 10 Anniversary update以降でもOK)

とある作業(別に秘密でもないけど)のため、LinuxからWindowsの共有フォルダをマウントしている。

で、これがある時からNGになってた様子。

いろいろやって直したので、その結果を残す。
ただ、すごく「とりあえず問題回避」でしかないので、環境を鑑みて手元ではよりよく直して利用してください。

# Windows側設定

```
コントロール パネル\ネットワークとインターネット\ネットワークと共有センター\共有の詳細設定
```

の

* パブリックフォルダアクセスにする
* パスワード保護共有は無効にする(ローカル利用だけ、なので)

Microsoft IDのパスワード更新したんだが、新しいパスワードで認証がうまくいかない...
ちゃんとしてれば、ここは不要かも。

# Linux側マウントの書式
*こちらの変更、Windows側の変更が効いてしまっているかもしれないため、明確には確認できてない、というのはあります。*

```
//192.168.xxx.yyy/Share /mnt/point cifs nounix,prefixpath=<subdir>,credentials=/etc/smbauth,uid=root,file_mode=0644,dir_mode=0755,iocharset=utf8,_netdev,defaults 0 0
```

```config:smbauth
username=username@outlook.com
password=<password>
domain=outlook.com
```

肝は、smbauthのdomainにoutlook.comを指定すること。
https://ubuntuforums.org/showthread.php?t=2293172
にもあるけど、私の環境で以前は不要だったが、どうもAnniversary updateから確認されるようになったっぽい?

# 後記
基本雑なやり方だが、なにかの情報共有になれば、ということで。
Androidアプリをリリースする忘備録



Androidアプリを初めてリリースしたのでその時の忘備録です。


##1.Google Play デベロッパーへ登録
[googleアカウントでのログイン](https://play.google.com/apps/publish/signup/)
↓
デベロッパー契約に同意
↓
登録料の支払い
↓
アカウントの詳細の入力
>
1.デベロッパー名 : google playでアプリの下に出ている文字
2.電話番号 : +81-***-****-****(国番号が必須→日本は81)

##2.release apk 作成
AndroidStudio(2.2.0)で作成

AndroidStudio
↓
Build
↓
Generate Signed APK

>
key store path : 作成したファイルを格納するパス
Alias : 署名キーに付ける名前
Validity(years) : 署名の有効期間　25年以上が推奨
First and Last Name : 開発者の名前（姓と名）
Organization Unit : 部署名
Organization：組織名 : 会社名
City or locality : 所在地
State or Province : 都道府県
Country Code(XX) : JP（日本コード）

↓
app-release.apk
> release.apkファイルを保存しておく

**注意点**
作成したjksファイルを必ず保管しておくこと
なくしたらPlaySotreでアプリをUpdateできなくなる

##3.Google Play デベロッパーからアプリをリリース
必須項目を記入していきアプリを公開する

**注意点**
イメージ画像も必須になるので頑張って作成しましょう!!

##参考URL
http://ascii.jp/elem/000/000/561/561345/index-3.html
http://qiita.com/konifar/items/6c6b73deae9085a69666
https://support.google.com/googleplay/android-developer/answer/1078870?hl=ja
GoとlocaltunnelでLine Messaging APIを使ってオウム返しLINE Botを試す #golangjp


Line Messaging APIを使ってLINE Botを作ってみます。 **[localtunnel](https://localtunnel.github.io/www/)を使うとSSL証明書など用意しなくていいのでめちゃ楽です。**

セキュリティ的にあれなのでちょっと試すくらいで利用しましょう。

> [Go言語初心者向けハンズオン](http://connpass.com/event/39677/)でもくもくやってます。

![](https://i.gyazo.com/98f2ac99e44ee4140e420fb8c42a8913.png)

LINE Botのアカウント作成などは以下を参考にしました。

> 参考: [PHP版の公式SDKを使ってLINE Messaging APIベースのBotを作ってみた](http://qiita.com/yositosi/items/87a0ee54ab88b934b1cb)


スピード優先でちょっと説明雑かもしれません。

## LINE BOTアカウント作成

https://business.line.me/ja/services/bot ここからMessaging APIを選択してBOTを作ります。
(Developer Trialでも問題ないかも?)

## 環境

* macOS Sierra
* Go 1.6

## Goのインストール(してない人むけ)

インストール

```
$ brew install go
```

GOPATHの設定

```
$ export GOPATH=$HOME/.go
```

## Messaging APIのGO SDKのインストール

```
$ go get github.com/line/line-bot-sdk-go/linebot
```

app.goを作ります。
[Go SDK for the LINE Messaging API](https://github.com/line/line-bot-sdk-go)を見つつ、進めます。

* Channel Secret
* Channel Access Token

![](https://i.gyazo.com/2a67cea0ad679a7dbaf9e2fa30f187dd.png)

の値を埋めましょう。公式サンプルを元にログ出力などちょっといじってます。

```app.go
package main

import (
	"log"
	"net/http"
	"fmt"

	"github.com/line/line-bot-sdk-go/linebot"
)

func main() {
	bot, err := linebot.New(
		"Channel Secret",
		"Channel Access Token",
	)
	if err != nil {
		log.Fatal(err)
	}

	// Setup HTTP Server for receiving requests from LINE platform
	http.HandleFunc("/callback", func(w http.ResponseWriter, req *http.Request) {
        fmt.Printf("ping\n")
		events, err := bot.ParseRequest(req)
		if err != nil {
			if err == linebot.ErrInvalidSignature {
				w.WriteHeader(400)
			} else {
				w.WriteHeader(500)
			}
			return
		}
		for _, event := range events {
			if event.Type == linebot.EventTypeMessage {
				switch message := event.Message.(type) {
				case *linebot.TextMessage:
                    fmt.Printf("%v", message)
					if _, err = bot.ReplyMessage(event.ReplyToken, linebot.NewTextMessage(message.Text)).Do(); err != nil {
						log.Print(err)
					}
				}
			}
		}
	})
    
	// This is just a sample code.
	// For actually use, you must support HTTPS by using `ListenAndServeTLS`, reverse proxy or
	if err := http.ListenAndServe(":1337", nil); err != nil {
		log.Fatal(err)
	}
}
```

* 起動

```
go run app.go
```

これで http://localhost:1337 にサーバーが起動します。

## localtunnnelでローカルサーバーに外部からアクセスできるようにする

インストール

```
npm install -g localtunnel
```

これだけです。かんたん。


* 1337ポートを公開する

```
$ lt --port 1337

your url is: http://xxxxxxxxxxxx.localtunnel.me
```

これで表示された`http://xxxxxxxxxxxx.localtunnel.me`に外部からアクセスできるようになります。

localtunnelのすごいところはSSL(`https://xxxxxxxxxxxx.localtunnel.me`)アクセスもこの時点でできるところです。

## LINE側に設定

`https://xxxxxxxxxxxx.localtunnel.me/callback`をLINE BOTの設定画面でWebhook URLに設定します。

これで設定完了です。

起動させると記事の最初に出した画像のように動いてくれました！

![](https://i.gyazo.com/98f2ac99e44ee4140e420fb8c42a8913.png)

絵文字とかも対応してあるやつはおうむ返ししてくれますね。
Pythonで国立国会図書館サーチAPIを使用

### 使用するAPI
[国立国会図書館サーチ外部提供インタフェース（API）](http://iss.ndl.go.jp/information/api/)

### 使用するライブラリ
https://github.com/nocotan/pyndlsearch

### 例

```python:test.py
# -*- coding: utf-8 -*-

from pyndlsearch.client import SRUClient
from pyndlsearch.cql import CQL


if __name__ == '__main__':
    # CQL検索クエリの組み立て
    cql = CQL()
    cql.title = 'Python'
    cql.fromdate = '2000-10-10'
    #print(cql.payload())

    # NDL Searchクライアントの設定
    client = SRUClient(cql)
    client.set_maximum_records(2)
    #print(client)

    # get_response()ではxml形式で取得可能
    #res = client.get_response()
    #print(res.text)

    # SRU
    srres = client.get_srresponse()

    for record in srres.records:
        print(record.recordData.title)
        print(record.recordData.creator)
```

- 出力結果

```
10日でおぼえるPython入門教室
穂苅実紀夫, 寺田学, 中西直樹, 堀田直孝, 永井孝 著
1500円定番ARMマイコン・ボードで試して合点! アプリはスクリプトで柔軟に!マイコン用MicroPythonプログラミング
中村 晋一郎
```

### 説明
[API仕様書](http://iss.ndl.go.jp/information/wp-content/uploads/2016/09/ndlsearch_api_20160627_jp.pdf)に記載されているCQLという検索クエリを組み立てて検索します.
  
Responseは構造化されたものを得るget_srresponse()か生のxmlを得るget_response()を使用できます.

### searchRetrieveResponse
- version
- numberOfRecords
- nextRecordPosition
- extraResponseData
  - facets {  
      REPOSITORY_NO,  
      NDC,  
      ISSUED_DATE,  
      LIBRARY,  
    }
- records
  - recordSchema
  - recordPacking
  - recordData{  
      title,  
      creator,  
      descriptions,  
      publisher,  
      language,  
    }
  - recordPosition

[pyndlsearch](https://pypi.python.org/pypi/pyndlsearch)
ファイルやディレクトリのパーミッション

#パーミッションとは
ファイルやディレクトリに対するユーザのアクセス権のこと
Aユーザーはhoge.phpに書き込んで良いけどBユーザはhoge.phpには書き込んではいけないというように、ユーザによって権限を設定することができる

#パーミッションの確認方法
ターミナル上で下記のコマンドを打つ

```php
ls -l
```

するとこんな感じで確認ができる

```php
-rwxr-xr-x   4 userName  groupName   136 Oct  2 19:45 hoge.php
```

#パーミッションの見方
##まずは結論から
hoge.phpに対するパーミッションは

1.ファイルの所有者は、読み込み(read)・書き込み(write)・実行(execute)が行える
2.ファイルの所有グループは、読み込み・実行が行える
3.その他は、読み込み・実行が行える

##もう少し詳しく
###分かりやすいuserName/groupNameから
ここはファイルの所有者と、そのファイルの所有グループを表している

###次に前半の「drwxr-xr-x」の部分
分解すると「d」「rwx」「r-x」「r-x」
1.パーミッションの対象について
「-」 ⇨ ファイル
「d」　⇨ ディレクトリ
「l」　⇨ シンボリックリンク

2.ファイル所有者のパーミッションについて
3.ファイル所有グループのパーミッションについて
4.その他のパーミッションについて

###権限内容
・r 読み取り
・w 書き込み
・x 実行
・- 権限なし

#変更方法
chmodコマンドを使用（chmod モードの数値　ファイル名）
モードの数値を「所有者」「所有グループ」「その他」の順で入力することでパーミッションを変更することができる

```php
chmod 755 hoge.php
```

##モードの数値
読み取り(r) →　4
書き込み(w)→　2
実行(x)　　 →　1

##chmod 755 test.phpを分解してみる
やりたいことは「test.phpの権限を変える」ということ
「所有者」　　　rwx　= 4+2+1 = 7
「所有グループ」r-x 4+ 1 = 5
「その他」　　　r-x 4+ 1 = 5
emmet-vimの使い方


## 基本操作

文章入力後にカーソルを行末に置いたまま、\<C-y\>,（Ctrl+yのあとにカンマ）を押す。


```
html:5
（もしくは）
!

↓

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
        
</body>
</html>
```

階層構造を作る

```
div>ul>li

↓

<div>
        <ul>
                <li></li>
        </ul>
</div>
```

アスタリスクで複数のタグを作る

```
div>ul>li*3

↓

<div>
        <ul>
                <li></li>
                <li></li>
                <li></li>
        </ul>
</div>
```

+で同階層のタグを配置する

```
p+a+p

↓

<p></p>
<a href=""></a>
<p></p>
```

id（#）やclass（.）を指定して配置する

```
div#head+div.class+dive#id.class1.class2.class3

↓

<div id="head"></div>
<div class="class"></div>
<dive id="id" class="class1 class2 class3"></dive>
```

アスタリスクと$を組み合わせて連番を作る

```
ul>li.item$*5

↓

<ul>
    <li class="item1"></li>
    <li class="item2"></li>
    <li class="item3"></li>
    <li class="item4"></li>
    <li class="item5"></li>
</ul>
```

[]で属性を挿入

```
input[type=text class=hoge]

↓

<input class="hoge" type="text">
```

{}でテキストを挿入

```
a{Click}

↓

<a href="">Click</a>
```

タグ名を省略すると、上位階層のタグ（下記の例だとdiv）が挿入される

```
div#hoge>#header+#content+#footer

↓

<div id="hoge">
    <div id="header"></div>
    <div id="content"></div>
    <div id="footer"></div>
</div>
```

## 主な記号

|記号|機能|
|:--:|:--:|
|#|IDとして展開する|
|.|classとして展開する|
|>|階層を1つ下げる|
|+|要素を同階層に展開する|
|*|要素を繰り返す|
|$|アスタリスクと一緒に使うことで連番を振る|
|()|1つのブロックとしてまとめる|
|[]|srcやhrefなどの属性の追加を行う|
|{}|テキストの挿入|





## 参考
[emmet-vimの使い方](http://motw.mods.jp/Vim/emmet-vim.html)
[[技術][Vim]Vimmerなプログラマは迷わずZen-Codingしろ！](http://d.hatena.ne.jp/idesaku/20100424/1272092255)
[zen-coding - ZenHTMLElementsEn.wiki](https://code.google.com/archive/p/zen-coding/wikis/ZenHTMLElementsEn.wiki)
[Emmet Documentation - Abbreviations Syntax](http://docs.emmet.io/abbreviations/syntax/)
Tesseract.jsを触ってみた

# Tesseract.jsとは
http://tesseract.projectnaptha.com/
Tesseract.js is a pure Javascript port of the popular Tesseract OCR engine.
って書いてるのでJavaScriptでかかれたOCRエンジンです。


HTMLのなかで

```
<img  src="./images/cosmic.png" class="img"></img>
```
って言う風にimgタグでイメージ表示させて

JavaScriptで
```
var image = document.getElementsByClassName("img");
```

でimage取得して

```
Tesseract.recognize(image[0])
.progress(message => console.log(message))
.catch(err => console.error(err))
.then(result => console.log(result))
.finally(resultOrError => console.log(resultOrError));
```

で処理してあげるとresultにOCR結果が返ってくる素敵なものになってます。

https://gitlab.com/rururu3/FirstTesseract

にサンプルとして作ったのあげてます(環境はnodejsでパッケージ管理＆http-server立ち上げ)

![image](https://qiita-image-store.s3.amazonaws.com/0/142784/837cec75-53f4-b343-0d7a-a3ea2495f69b.png)
raspberry pi 1 model bで、アセンブラ　その２

#概要
raspberry pi 1 model bで、アセンブラでzundokoやってみた。
#開発環境
raspberry pi 1 model b
raspbian 2016_09_23 jessie lite
#実行
nano zundoko.s
gcc zundoko.s -nostdlib
./a.out
#サンプルコード
https://lowreal.net/2016/03/16/2

```
.text
.global _start
_start:
	ldr r8, =0x02020000
	mov r6, #0
loop:
	eor r8, r8, r8, lsl #13
	eor r8, r8, r8, lsr #17
	eor r8, r8, r8, lsl #15
	tst r8, $0x80
	adreq r1, zun
	moveq r2, #zun_len
	addeq r6, #1
	adrne r1, doko
	movne r2, #doko_len
	mov r0, #1
	mov r7, #4
	svc #0
	bne check_kiyoshi
	b loop
check_kiyoshi:
	cmp r6, #4
	bge call_kiyoshi
	mov r6, #0
	b loop
call_kiyoshi:
	adr r1, kiyoshi
	mov r2, #kiyoshi_len
	mov r0, #1
	mov r7, #4
	svc #0
	mov r0, #0
	mov r7, #1
	svc #0
zun:
	.string "ズン\n"
zun_len = . - zun
	.align 2
doko:
	.string "ドコ\n"
doko_len = . - doko
	.align 2
kiyoshi:
	.string "キヨシ\n"
kiyoshi_len = . - kiyoshi
	.align 2

```
デザインパターンとDI

#デザインパターンとは
wikipediaによると
過去のソフトウェア設計者が発見し編み出した設計ノウハウを蓄積し、名前をつけ、再利用しやすいように特定の規約に従ってカタログ化したもの

自分たちが直面する問題⇨過去他のプログラマも直面している⇨それに対する解決方法が幾度となく考えられてきている⇨それを再利用できるようにした方が効率がいい⇨デザインパターン

#難しそうだからちょっと具体例
##Adapterパターン
元々関連性のない2つのクラスを接続するクラスを作る
これにより既存のクラスに対して修正を加えることなく、インタフェースを変更することができる
詳しくは[PHPで学ぶデザインパターン(Adapterパターン)](http://qiita.com/bunty/items/5e497c85d66b3a24fe09)に書きました。

#デザインパターンについてまとめると
よく使われる設計を一般化された形でまとめたものに過ぎない
具体的な実装を提供するものではなく、あくまでもコンセプトとして参照されることが意図されている

#DIの概要
Dependency Injectionの略
Dependency(依存)をInjection(注入)するデザインパターンであり、依存性の注入と訳されることが多い

#DIとは
一言で言うと依存していた部分を、外から注入すること

・依存性とは
クラスやメソッドに、固定の値（変数や定数など）が入っていること
つまりそのクラスは、その定数、変数、インスタンスに依存している
＝状態を持っていること

・注入とは
クラスやメソッド内に持っていた固定の値を外から渡すということ

#具体的にはどうやって注入するか？
・Interface Injection
メソッドの引数に使いたいオブジェクトを渡せるようにする
・Constructor Injection
使う予定のオブジェクトをコンストラクタに渡せるようにする
・Setter Injection
オブジェクトを setter メソッドで渡せるようにする

##Interface Injection

ある数値を出力するというメソッドがあったとする
わかりやすい例を挙げるとこんな感じ

```php
public function echoNum() 
{
  $num = 10;
  echo $num;
}
```
これは「$num = 10」という固定の値がメソッドの中に入っていると言う状態である
単体のテストを書こうとすると、常に10が返ってくるということが書けるが、10という値を変更したらそのテストは成り立たなくなってしまう。

メソッドの引数に使いたいオブジェクトを渡せるようにするとこうなる。

```php
public function echoNum($num) 
{
  echo $num;
}
```

引数に10を渡せば同じ挙動になる。
また単体テストを書くときも、常に引数で渡した値が返ってくることを確認をすれば良いので、値を変更してもテストが崩れることはない。
メソッドの中に固定の値を持たないために、値を引数で渡してあげることをインターフェースインジェクションという。

##Constructor Injection
コンストラクタインジェクションを使用しない場合には、メソッドの中でValidatorクラスのインスタンスを生成することになる。

```php
class Hoge
{
  public function hoge($params)
  {
    $validator = new Validator();
    $this->validator->validate($params);
  }
}

```

コンストラクタインジェクションでは、コンストラクタでValidatorクラスのインスタンスを生成することができる。
これによりインターフェースインジェクションの時と同様に、$validatorという固定の値をメソッドの中に持つ必要がなくなる。

```php
class Hoge
{
  private $validator;

  public function __constructI(Validator $validator = null)
  {
    $this->validator = $validator ?: new Validator(); //インスタンスが生成されていない場合に、コンストラクタでインスタンスを生成する
  }

  public function hoge($params)
  {
    $this->validator->validate($params);
  }
}
```

##Setter Injection
クラスにオブジェクトを注入するために、セッターメソッドを使用する。

```php
class Hoge
{
  private $value;

  public function setValue($value)
  {
    $this->value = $value;
  }

  public function hoge()
  {
    echo $this->value;
  }
}
```


#メリット
・モジュール間の依存関係を弱めることができる(保守性が高まる)
・単体テストがしやすい（「テスト・ファースト」による開発スタイルを取りやすくなる）

#デメリット
・クラスやファイルが沢山できる

#DIについてのまとめ
DIとは依存性の注入のこと
クラスやメソッドの中に固定の値を持たず、外から渡すことにより依存するものの影響を受けなくなるというデザインパターンの一種
HerokuにデプロイしたRubotyに機能を追加する



今更ながら社内用Slackbotを作ろうと思いたち、RubyistのはしくれとしてRubotyで作ってみました。
色々試行錯誤がありましたが結論だけ書いていきます。
(そもそも僕がHerokuをちゃんと使いこなせていないことが原因の可能性もあります)


RubotyをSlackで動かすにはruboty作成者r7kamuraさんの以下の記事通りに進めていけばpingを返すくらいのBotは数分で作れます。

http://qiita.com/r7kamura/items/8d1b98e28154de6030b9


さて。
とりあえずHeroku上でRubotyが起動したものの、それだけでは物足りないので自分でプラグインを書きたいと思いますね？

では、herokuからコードをCloneします。SettingsページにリポジトリのURLが載っています。


```bash
git clone https://git.heroku.com/ramen-police.git
heroku git:remote --app ramen-police
git push heroku master -f
```


と、ここでcloneしたリポジトリの中身を見ると、なんと空です。
とりあえずbundle initしてGemfileに以下を追記します。

(Gemfileに記載したruboty-ramen-policeというgemが社内用に作ったRubotyプラグインです。
この辺の実装方法もちょっと一癖あったのですが、別記事でまとめようかなと思っています。)


```ruby
source "https://rubygems.org"

gem "ruboty"
gem "ruboty-slack"
gem "ruboty-ramen-police", git: "https://gist.github.com/08d6c7858d0eb66ef952f7e0ba2de8b5.git", require: "ramen-police"
```

↑ではやっていませんが、GemfileにHerokuで稼働するRubyのバージョンも記入しておいたほうが良いかもしれません。

ここでハマったのですが、
そのままherokuにpushすると、だいたい以下のようなWarningが出ます。

```bash
heroku logs
```

```
remote: ###### WARNING:
remote:        You have not declared a Ruby version in your Gemfile.
remote:        To set your Ruby version add this line to your Gemfile:
remote:        ruby '2.2.4'
remote:        # See https://devcenter.heroku.com/articles/ruby-versions for more information.
remote:
remote: ###### WARNING:
remote:        No Procfile detected, using the default web server.
remote:        We recommend explicitly declaring how to boot your server process via a Procfile.
remote:        https://devcenter.heroku.com/articles/ruby-default-web-server
remote:
```

1つ目は先程書いたとおり、GemfileにRubyバージョンが指定されていないことによるワーニング。
問題は2つ目で、Procfileがないとpushした後にbotのプロセスが起動しません。
cloneしたリポジトリにはProcfileが無いので、自分で用意する必要があります。
（中身は https://github.com/r7kamura/ruboty-template より）

```Procfile
bot: bundle exec ruboty
```

Procfileを追加してherokuにpushしてあげます。
で完了。


今回作ったのはお遊びbotですが、いずれはChatOps的なものを作っていけたらなーと思っています。

Rubotyについてはこの記事にとても詳しくまとまっています。
http://qiita.com/tbpgr/items/39d93a0a33ec99e37da1
unknown terminal typeとか言われた

ずっと前にきちんとメモしてなかったので改めて。

わりと古めのLinuxマシン上でvimとかtopとか叩く度に

```
'screen-256color': unknown terminal type.
```

とか出力されて萎えておりました。以下のようにすることできちんと使えるようになりました

1 termcapファイルを作成する

こんなファイルを適当に用意します

```
$ cat /tmp/screen-256color.terminfo
screen-256color|GNU Screen with 256 colors,
        use=xterm-256color,
```

2 ticコマンドに食わせます

```
$ tic /tmp/screen-256color.terminfo
```

3 きちんと認識されていることを確認

```
$ infocmp screen
#       Reconstructed via infocmp from file: /usr/share/terminfo/s/screen
screen|VT 100/ANSI X3.64 virtual terminal,
        am, km, mir, msgr, xenl,
        colors#8, cols#80, it#8, lines#24, ncv#3, pairs#64,
        acsc=++\,\,--..00``aaffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
        bel=^G, blink=\E[5m, bold=\E[1m, cbt=\E[Z, civis=\E[?25l,
        clear=\E[H\E[J, cnorm=\E[34h\E[?25h, cr=^M,
        csr=\E[%i%p1%d;%p2%dr, cub=\E[%p1%dD, cub1=^H,
        cud=\E[%p1%dB, cud1=^J, cuf=\E[%p1%dC, cuf1=\E[C,
        cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA, cuu1=\EM,
        cvvis=\E[34l, dch=\E[%p1%dP, dch1=\E[P, dl=\E[%p1%dM,
        dl1=\E[M, ed=\E[J, el=\E[K, el1=\E[1K, enacs=\E(B\E)0,
        flash=\Eg, home=\E[H, ht=^I, hts=\EH, ich=\E[%p1%d@,
        il=\E[%p1%dL, il1=\E[L, ind=^J, is2=\E)0, kbs=^H, kcbt=\E[Z,
        kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA,
        kdch1=\E[3~, kend=\E[4~, kf1=\EOP, kf10=\E[21~,
        kf11=\E[23~, kf12=\E[24~, kf2=\EOQ, kf3=\EOR, kf4=\EOS,
        kf5=\E[15~, kf6=\E[17~, kf7=\E[18~, kf8=\E[19~, kf9=\E[20~,
        khome=\E[1~, kich1=\E[2~, kmous=\E[M, knp=\E[6~, kpp=\E[5~,
        nel=\EE, op=\E[39;49m, rc=\E8, rev=\E[7m, ri=\EM, rmacs=^O,
        rmcup=\E[?1049l, rmir=\E[4l, rmkx=\E[?1l\E>, rmso=\E[23m,
        rmul=\E[24m, rs2=\Ec\E[?1000l\E[?25h, sc=\E7,
        setab=\E[4%p1%dm, setaf=\E[3%p1%dm,
        sgr=\E[0%?%p6%t;1%;%?%p1%t;3%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;m%?%p9%t\016%e\017%;,
        sgr0=\E[m, smacs=^N, smcup=\E[?1049h, smir=\E[4h,
        smkx=\E[?1h\E=, smso=\E[3m, smul=\E[4m, tbc=\E[3g,
```

4 おわり

これでtopコマンドやvimたたくと今度はおこられない筈です。
Linux - プロンプトにホスト名を表示する方法


Amazon Linuxのデフォルトのプロンプトはこんな感じです

```
[ec2-user@ip-10-10-10-10 ~]$
```

このサーバのホスト名を「test1」とした場合、以下のようなコマンドでとりあえず実行すると変更されるのですが

```
[ec2-user@ip-10-10-10-10 ~]$ sudo hostname test1
[ec2-user@ip-10-10-10-10 ~]$ exec bash
[ec2-user@test1 ~]$
```

再起動するとまた元に戻ってしまいます

```
[ec2-user@ip-10-10-10-10 ~]$
```

以下のように修正すれば再起動後でも反映されます

```
[ec2-user@ip-10-10-10-10 ~]$ sudo vi /etc/sysconfig/network
----------
HOSTNAME=test1
----------
[ec2-user@ip-10-10-10-10 ~]$ sudo init 6
```

再起動後ログインしたら変更される

```
[ec2-user@test1 ~]$
```

サーバを設定するときにたまにググっていたので、備忘録的な記載となります

### ※参考
- [IT Notebook](http://makaaso.hatenablog.com/entry/2016/10/26/122409 "IT Notebook")
イラストや

#イラストやとは?
いらすとやはかわいいイラストのフリー素材集サイトです。
とにかくイラストの数が豊富です。数千点以上掲載されています。
商用利用可能で、クレジットの表記も不要です。
素材はpng形式でダウンロードできます。
[イラストや](http://www.irasutoya.com/)
##どこで使うの?
自分のスライドに使うことによって、より共感を得ることができます。
文字の色を変えるとか、フォントを大きくするというよりもより、視覚に訴えかけることができます。
また、様々なイラストが置いてあるために簡単にポップアップを作ることができたり、チラシを作成することに役立ちます。


#イラストやの使い方
探したいワードがあれば、サイト内にある検索エンジンを使うことをオススメします。
>「楽しい」「就活生」「女性」... etc

名詞、形容詞でも検索することができます。

また、パターンによっても使い分けることができます。
例えば、
>「家族」と検索した場合、
>「男性」と「女性」の夫婦と「男の子」の子供
>「男性」と「女性」の夫婦と「女の子」の子供
>「男性」と「男性」の夫婦と「男の子」の子供
>「女性」と「女性」の夫婦と「男の子」の子供...etc

なんかが出て来ます。
用途、自分が使いやすいものを選ぶことができます。

中には、こんなのどこに使うの？と思われるようなイラストも出て来ます。


#「イラストや」はこんな時に便利
***ハッカソンや、ビジネスプランコンテストなどで、プレゼンをしないといけない時***
時間が限られていて、かつ質の高いプレゼンの資料を作りたい時にオススメです。
種類が豊富なので、セキュアな世界にも対応することが可能

***簡単なポップアップを作成する時***
可愛いイラストが揃っているので、目に留まりやすいです。
デザイナーとか、イラストレーターとかに頼んでやるよりもずっと簡単に安く製作することができます。

なので、いろんなとこで使っていきましょう。


#イラストやの使用例
##こんなところにまで、イラストやは使われています。
名O屋のヨドバシカメラ
スギ薬局
どこかの工事現場
公園
学校の掲示物
公民館の注意喚起の記事
Startup Weekend の最終プレゼン
研究室の輪講発表の際
大学等の講義
遊び...etc



#こんなイラストどこで使うの？
![成金.png](https://qiita-image-store.s3.amazonaws.com/0/123597/e677891b-5d28-c865-cbf4-66f377d1687a.png)
成金のイラスト

![Religious_cult.png](https://qiita-image-store.s3.amazonaws.com/0/123597/9434f1ea-d098-30d3-2762-db1040be6a31.png)
独特な新興宗教（カルト宗教）を信じる夫婦から生まれた子供が、複雑な表情で家族と向き合っているイラスト

![inchiki_deki_race.png](https://qiita-image-store.s3.amazonaws.com/0/123597/dd312b03-85e1-e6d7-68c1-a33145517730.png)
出来レースのイラスト

#参考
[イラストやのまとめ](http://matome.naver.jp/odai/2145480803802298401)
[デザイナーの立場から見たイラストや](http://www.omg-ox.org/entry/2016/09/28/193633)
TensorFlow > TensorFlowを遊び倒す！ 4-1. Convolutional Neural Networks > cirar10_train.pyを実行しながらcifar10_eval.py

```txt:動作環境
Ubuntu 14.04 LTS desktop amd64
GeForce GTX 750 Ti
ASRock Z170M Pro4S [Intel Z170chipset]
TensorFlow v0.11
cuDNN v5.1 for Linux
CUDA v7.5
Python 2.7.6
IPython 5.1.0 -- An enhanced Interactive Python.
```

TensorFlowを遊び倒す！ 4-1. Convolutional Neural Networks
http://blog.brainpad.co.jp/entry/2016/04/22/170000

CIFAR-10のデータセットを処理するTutorialを学習中。

> 余談ですが、cifar10_eval.pyのスクリプトには面白い点があり、デフォルトで5分に1回評価を再実行します。

> つまり、1個のプロセスでcifar10_train.pyで学習をしながら、cifar10_eval.pyを眺めて精度が上がって行く様子を楽しむことができます。

やってみた。

tmuxを立ち上げて、１つのペインで以下を実行した。

```
$ python cifar10_train.py
```

もう１つのペインにおいて以下を実行した。

```
$ python cifar10_eval.py
I tensorflow/stream_executor/dso_loader.cc:111] successfully opened CUDA library libcublas.so locally
I tensorflow/stream_executor/dso_loader.cc:111] successfully opened CUDA library libcudnn.so locally
I tensorflow/stream_executor/dso_loader.cc:111] successfully opened CUDA library libcufft.so locally
I tensorflow/stream_executor/dso_loader.cc:111] successfully opened CUDA library libcuda.so.1 locally
I tensorflow/stream_executor/dso_loader.cc:111] successfully opened CUDA library libcurand.so locally
I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:925] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
I tensorflow/core/common_runtime/gpu/gpu_device.cc:951] Found device 0 with properties: 
name: GeForce GTX 750 Ti
major: 5 minor: 0 memoryClockRate (GHz) 1.202
pciBusID 0000:01:00.0
Total memory: 2.00GiB
Free memory: 74.38MiB
I tensorflow/core/common_runtime/gpu/gpu_device.cc:972] DMA: 0 
I tensorflow/core/common_runtime/gpu/gpu_device.cc:982] 0:   Y 
I tensorflow/core/common_runtime/gpu/gpu_device.cc:1041] Creating TensorFlow device (/gpu:0) -> (device: 0, name: GeForce GTX 750 Ti, pci bus id: 0000:01:00.0)
E tensorflow/stream_executor/cuda/cuda_driver.cc:965] failed to allocate 74.38M (77996032 bytes) from device: CUDA_ERROR_OUT_OF_MEMORY
E tensorflow/stream_executor/cuda/cuda_dnn.cc:375] could not create cudnn handle: CUDNN_STATUS_INTERNAL_ERROR
E tensorflow/stream_executor/cuda/cuda_dnn.cc:342] could not destroy cudnn handle: CUDNN_STATUS_BAD_PARAM
F tensorflow/core/kernels/conv_ops.cc:526] Check failed: stream->parent()->GetConvolveAlgorithms(&algorithms) 
中止 (コアダンプ)
```

GeForce GTX 750 Ti(RAM 2GB)ではメモリが足りない。

GTX 750の次を検討した方がいいかもしれない。

個人情報漏洩事件の被害者でなければ、AWSのサービスを使うことも考えたかもしれないが。
事件時の対応がずさんであったのが今も悔やまれる。

GTX1080を買ってドライバを頑張って入れるか、別のサービスを検討するか。
CPUで長時間回すというのもあり。
ネットからコピペしたコードを指定パスに配置するにはcat(1)とinstall(1)が便利

ネットで見たコードをssh先のマシン（ローカルでもよい）の指定パスに配置したい場合。

例えば下記コードを`/usr/local/hoge/hoge.txt`に配置したいとする。

```
CDPATH=$HOME:$HOME/bm
HISTFILE=$HOME/.zhistory
HISTSIZE=100000
```

まず次のエイリアスを作っておく：

```bash
alias pastetopath='install -m 0644 -D /dev/stdin'
```

すると次の操作でコピペできる。

```
$ pastetopath /usr/local/hoge/hoge.txt
（入力待ちになるので、マウスミドルクリックなどでコードを貼り付ける）
（Ctrl-dを押してcatを終了）
```

以上。

ちなみにカレントディレクトリに配置するなら

```
$ cat>hoge
（貼り付け）
（Ctrl-d）
```

でOK。
raspberry pi 1 model bで、python

#概要
raspberry pi 1 model bで、pythonやってみた。
#開発環境
raspberry pi 1 model b
raspbian 2016_09_23 jessie lite
python 2.7.9
#サンプルコード
```
# coding: utf-8
import random

zundoko = ["ズン", "ドコ"]
n = 0
i = True
while (i):
    s = zundoko[random.randint(0, 1)]
    print (s)
    if (s == "ドコ"):
        if (n == 4):
            print "キヨシ！"
            i = False
        else:
            n = 0
    else:        
        n = n + 1
```
#サンプルコード
```
# coding: utf-8
def fizzbuzz(n):
    if n % 3 == 0 and n % 5 == 0:
        print("fizzbuzz")
        return 0
    if n % 3 == 0:
        print("fizz")
        return 1
    if n % 5 == 0:
        print("buzz")
        return 2
    print(n)    
    return 3
for i in range(100):
    fizzbuzz(i + 1)
```
python datetime書式早見表

## 関連記事
[python(pyenv)インストールメモ](http://qiita.com/Esfahan/items/0dfe70357549f92b23da)

## datetime

```py
# -*- coding:utf-8 -*-
import datetime
from datetime import date,timedelta

# 現在日時
d = datetime.date.today() # 2019-08-01
print(d.strftime("%Y%m%d")) # 20190801
 
# 基準日
d = date(2019, 8, 01) # 2019-08-01
# 前日
yesterday = d - timedelta(days=1) # 2019-07-31
# 20日前
before_20_days = d - timedelta(days=1) * 20 # 2019-07-12
# 40日前
before_40_days = d - timedelta(days=40) # 2019-06-22
# 2週間前
two_weeks_ago = d + timedelta(weeks=-2) # 2019-07-18
```

## 早見表

| Code | Meaning | Example |
| :-- | :-- | :-- |
| %a  | Weekday as locale’s abbreviated name. | Mon |
| %A  | Weekday as locale’s full name. | Monday |
| %w  | Weekday as a decimal number, where 0 is Sunday and 6 is Saturday. | 1 |
| %d  | Day of the month as a zero-padded decimal number. | 30 |
| %-d | Day of the month as a decimal number. (Platform specific) | 30 |
| %b  | Month as locale’s abbreviated name. | Sep |
| %B  | Month as locale’s full name. | September |
| %m  | Month as a zero-padded decimal number. | 9 |
| %-m | Month as a decimal number. (Platform specific)  | 9 |
| %y  | Year without century as a zero-padded decimal number. | 13 |
| %Y  | Year with century as a decimal number.  | 2013 |
| %H  | Hour (24-hour clock) as a zero-padded decimal number. | 7 |
| %-H | Hour (24-hour clock) as a decimal number. (Platform specific) | 7 |
| %I  | Hour (12-hour clock) as a zero-padded decimal number. | 7 |
| %-I | Hour (12-hour clock) as a decimal number. (Platform specific) | 7 |
| %p  | Locale’s equivalent of either AM or PM. | AM |
| %M  | Minute as a zero-padded decimal number. | 6 |
| %-M | Minute as a decimal number. (Platform specific) | 6 |
| %S  | Second as a zero-padded decimal number. | 5 |
| %-S | Second as a decimal number. (Platform specific) | 5 |
| %f  | Microsecond as a decimal number, zero-padded on the left. | 0 |
| %z  | UTC offset in the form +HHMM or -HHMM (empty string if the the object is naive). | |
| %Z  | Time zone name (empty string if the object is naive). | |
| %j  | Day of the year as a zero-padded decimal number. | 273 |
| %-j | Day of the year as a decimal number. (Platform specific) | 273 |
| %U  | Week number of the year (Sunday as the first day of the week) as a zero padded decimal number. All days in a new year preceding the first Sunday are considered to be in week 0. | 39 |
| %W  | Week number of the year (Monday as the first day of the week) as a decimal number. All days in a new year preceding the first Monday are considered to be in week 0. | 39 |
| %c  | Locale’s appropriate date and time representation. | Mon Sep 30 07:06:05 2013 |
| %x  | Locale’s appropriate date representation. | 9/30/2013 |
| %X  | Locale’s appropriate time representation. | 7:06:05 |
| %%  | A literal '%' character. | % |

[参考]
http://strftime.org/
http://docs.python.jp/2/library/datetime.html
【Unity】swfファイルをUnityのMecanim用にコンバートしたい

最近uNETを触り始めて無限の可能性を感じたsu10です。

swfファイルをUnity用にコンバートするAssetはいくつかあるのですが、Mecanim、つまりAnimatorやらAnimationファイルやらAnimatorControllerファイルにコンバートするツールとかAssetは見当たらなかったのでどうにかできないものかと模索したメモ書きです。

正直わざわざMecanim用に作り直すよりLWFなりアセット買ったほうが安上がりですが、「独自フォーマットは嫌だ！」とかいろいろ事情がある人の参考になれば幸いです。

# 前提条件
- Mac使う（Windowsマシンない・・・）
- Unity上で完結する
- C#使う

後述する制限によりWindows使えるならWindows使ったほうがかなり楽になるかと思われます。

# コンバートの流れ

0. ライブラリを使ってswfを解析する
0. (中間データ作成)
0. 中間データからMecanim用のファイルを作成する

3.はリファレンス読むなりググるなりでどうにかなる部分なので省略。

# ライブラリを使ってswfを解析する

swfの仕様書を読んで理解してるならライブラリを使う必要もないかもしれないですが、「nバイト取ってくる」みたいな操作にアレルギー症状が出そうな人はライブラリ使いましょう。

以下の２つが使えます。

- [SwfLib](https://github.com/SavchukSergey/SwfLib)
- [Swf2XNA](https://github.com/debreuil/Swf2XNA)

自分は最初SwfLib使ってみたのですが、タグの解析後のタイムライン作成は自分で書かないといけなさそうだったので途中からSwf2XNAに移行しました。

## UnityにSwf2XNAを導入する

自分もかなりお世話になっている[UniRx](https://github.com/neuecc/UniRx)の作者さんのブログの[こちらの記事](http://neue.cc/2013/01/10_393.html)を見て「余裕そうだな」と思ってたら以下の理由でかなりハマりました。

- Unityで使える.NETは古い
- MacのUnityはSystem.Drawingが使えない
- namespaceの関係でエラー
- 同じクラス名が同じnamespaceに定義されていてエラー

ちなみにSwf2XNAの中で必要なのは以下の２つのディレクトリに含まれるクラス群なのでEditor以下にぶち込みましょう。

- SwfReader
- Vex

### Unityで使える.NETは古い

現行のUnityの.NETのバージョンは3.5らしく、Swf2XNAをそのまま突っ込んでもエラーで動きません。
これはベータとして公開されている[Unity5.5.0b9](http://beta.unity3d.com/download/b99e8d9f9ae4/public_download.html)を使用することで回避できます（参考：[テラシュールブログさんの記事](http://tsubakit1.hateblo.jp/entry/2016/10/05/221135)）。

なぜかMonoDevelopをUnityと繋いでのデバッグをしようとすると応答なしになるのでデバッグはDebug.Logで・・・

### MacのUnityはSystem.Drawingが使えない

Unityに付属してくるMonoDevelop.appの中にSystem.Drawing.dllが含まれているので持ってくればいいかと思いきや、" DllNotFoundException: gdiplus.dll"とかいうエラーで動きません。

よって以下のクラスを使っている箇所でエラーになるので、UnityのAPIに置き換えます。

- Bitmap
- Matrix
- Point

BitmapはTexture2Dを使って書き換え、MatrixはTransformかMatrix4x4で書き換えられると思います。

### namespaceの関係でエラー

「Vex.XXX」という記述箇所でエラーになるので「DDW.Vex.XXX」という風に直します。

### 同じクラス名が同じnamespaceに定義されていてエラー

参照を調べて使われていないほうのクラスをコメントアウトします。

# 終わり

以上でSwf2XNAがUnityで使えるようになったので、解析結果をコンバートする部分を頑張って書きましょう。

思い出しながら書いたので漏れがあるかもしれないですが、やってみて動かない箇所などあれば教えてください。
シンプルにコマンド出力をとってくるAnsible Role（Windows版）

その名の通り、ターゲットとなるサーバ上で実行した標準出力をリダイレクトしたファイルをとってくるRole **"fetch-wcommand-out"** を作ってみました。ターゲットサーバがWindows用のRoleです。
通常少なからずAnsibleのコードを書かなければなりませんが、取得に必要なファイルが決まってさえいれば直ぐに使えるようにしています。

# fetch-wcommand-out Role
Ansible Galaxy に上げています。
https://galaxy.ansible.com/tksarah/fetch-wcommand-out/

# 準備
* Ansible 2.X 以上の入ったホスト（v2.1.2でテスト済み）
* とってきたいファイルのリスト

```sample_comlist.txt
1,"Get-Date -displayhint tim","timeout.txt"
2,"$PSVersionTable","psversion.txt"
```

> （注意）ダブルクォーテーションを使い、不要なスペースは削除

# 使い方例
対象となるサーバのインベントリファイルを用意します。

（参考）[AnsibleでWindows Server 2012を構成する](http://qiita.com/tksarah/items/5f5916ec9236f24ff2a8)

Ansible Galaxy からロールをダウンロードします。

```shell-session
# ansible-galaxy install --roles-path ./roles tksarah.fetch-wcommand-out
```

プレイブックを用意します。（以下そのまま使っていただくと便利です。）

```yaml:site.yml
- name: Playbook for fetching files
  hosts: "{{ target }}"
  gather_facts: no

  vars_prompt:
    - { name: "target" , prompt: "Input target host" ,  default: all , private: no }
    - { name: "inputcommand" , prompt: "Input your command list" , default: sample_comlist.txt , private: no }
    - { name: "remtemp" , prompt: "Input remote temp directory " , default: "C:\\ansible_remtemp" , private: no }
    - { name: "savedir" , prompt: "Input a save directory" , default: fetched , private: no }

  roles:
    - tksarah.fetch-wcommand-out
```


実行します。

```shell-session
# ansible-playbook -i hosts site.yml
Input target host [all]:（ターゲットホストを指定します。デフォルトはall）
Input your command list [sample_comlist.txt]:（取得したいコマンドと保存ファイル名が書かれているファイルを指定します。）
Input remote temp directory  [C:\\ansible_remtemp]:（ターゲットサーバ上で一時的に保存するディレクトリを指定します。）
Input a save directory [fetched]:（取得したファイルを保存するディレクトリを指定します。デフォルトはカレントのfetched）
PLAY [Playbook for fetching files] *********************************************
                           :
                           :
                           :
PLAY RECAP *********************************************************************
192.168.0.1            : ok=19   changed=6    unreachable=0    failed=0
192.168.0.2            : ok=17   changed=6    unreachable=0    failed=0
```

上記サンプルのプレイブックを使った時、とってきたファイルはカレントの「fetched」ディレクトリに格納されます。

```shell-session
# tree fetched
fetched
|-- 192.168.0.1
|   |-- C:
|   |   `-- ansible_rmtemp
|   |       |-- psversion.txt
|   |       |-- timeout.txt
|-- 192.168.0.2
|   |-- C:
```

以下も合わせて使うと効果的です。
[シンプルにファイルをとってくるAnsible Role](http://qiita.com/tksarah/items/d958048c5ec50b474bc3)
[シンプルにコマンド出力をとってくるAnsible Role（Unix/Linux版）](http://qiita.com/tksarah/items/f9ce59c3f888a9a36180)
Ubuntuでiptablesを再起動後にも保持する方法

# やりたいこと
Ubuntuでiptablesの設定を保持したい。
他のディストリだと

```bash:~/
sudo iptables save
```
とかで出来ちゃうんだけども、Ubuntuだと何故か出来ない。

# 環境
Ubuntu 16.04 LTS


# 方法
**iptables-persistent**を使えば簡単に出来る。

```bash:~/　16.04より古い方はapt-getで
sudo apt install iptables-persistent
```


おわり。めっちゃ簡単。rebootしてみて設定が残ってるか確認してね。

```bash:~/　再起動後
sudo iptables --list
```

## ちなみに
直接保存や再読込をさせることも出来ます。

```bash:~/　保存と再読込
sudo /etc/init.d/netfilter-persistent save
sudo /etc/init.d/netfilter-persistent reload
```
やったぜ。

## ちなみ２
UbuntuでパーソナルFWを使用するならiptablesをそのまま使うよりもufwが便利です。(ufwはiptablesのラッパーです。)
特別なこだわりの無い方はufw使って幸せになりましょう。
http://qiita.com/tukiyo3/items/56525cb1b30cdd19fade

また、以下の様な方法を用いることでiptablesでしか書けない処理をufwに追記することが出来ます。便利ですね。
[Ubuntu の ufw で NAT サーバを作る](https://qiita.com/hoto17296/items/3aa5863ba9ef13400283)



# 参考文献
http://iwashi.co/2015/01/16/ubuntu-iptables-persistent
rails + angularjs + gonを試してみる


railsでangularjsを使うと、何かとコード量が増えてしまった面倒臭い。
gonを使ってrailsとangularを繋いだら楽になるんじゃないかと思って試してみた。
画面遷移は全部rails-wayな想定

##angularjsとgonのインストール
```Gemfile
gem 'angularjs-rails'
gem 'gon'
```

application.jsの設定
(turbolinkは削除)

```application.js

//= #require turbolinks
//= require angular
```

```application.html.erb

  <%= include_gon %>
  <%= stylesheet_link_tag    'application', media: 'all'%>
  <%= javascript_include_tag 'application' %>
  <!--<%= stylesheet_link_tag    'application', media: 'all', 'data-turbolinks-track' => true %>-->
  <!--<%= javascript_include_tag 'application', 'data-turbolinks-track' => true %>-->
  
```

controllerとaction:indexを作っておく

```
rails g controller hoge index
```

localhost:3000/hogeへアクセスして画面確認
![スクリーンショット 2016-10-29 11.33.52.png](https://qiita-image-store.s3.amazonaws.com/0/60267/ad9ccd75-fcec-9c2f-5c86-d3432fabb3e7.png "スクリーンショット 2016-10-29 11.33.52.png")

##angular-gonな設定
appを設定

```application.html.erb
<html ng-app="angular-gon">
    
```

app.jsを作成

```app/assets/javascripts/app.js
'use strict';

angular.module("angular-gon", []);

```

コントローラとhtml.erbに追加

```app/controllers/hoge_controller.rb
def index
    gon.title = "0から1へ!"
    gon.numbers = [1,2,3]
end
```

```app/assets/javascripts/hoge.js
angular.module("angular-gon").controller('HogeIndexCtrl',
  function () {
    $.extend(this, gon);
  });
```

```app/views/hoge/index.html.erb
<div ng-controller="HogeIndexCtrl as $ctrl">
  <h1>{{$ctrl.title}}</h1>
  <p ng-repeat="number in $ctrl.numbers">{{number}}</p>
</div>
```

で、localhost:3000/hogeを再表示
![スクリーンショット 2016-10-29 11.54.58.png](https://qiita-image-store.s3.amazonaws.com/0/60267/9182e46f-1c08-291c-96c8-0ca8c238dc82.png "スクリーンショット 2016-10-29 11.54.58.png")

出たー！！どんどんどん

railsのコントローラからangularjsまでスムーズにデータが流れるので、割とサクサクいけるんじゃないですかね？？

- rails g controllerを改修したら、さらに捗りそう
- controller@angularとerbのng-controllerの辺りを自動生成させる
ElixirからPythonオブジェクトを触ってみる

[ErlPort](http://erlport.org/)を使うとElixirからPythonやRubyのコードを扱うことができる。

ただ[ドキュメント](http://erlport.org/docs/python.html)にはクラスに関する記述がなかったので実際に試してみた。

結論から言うと少し直感に反する動作をしている。

## 準備

```bash
$ mix new python
```

```ex:python/mix.exs
defmodule Python.Mixfile do
  # ...

  defp deps do
    [
      {:erlport, github: "hdima/erlport"}
    ]
  end
end
```

```py:python/sample.py
class Sample(object):
    def __init__(self):
        print("Sample.__init__")
        self.message = "Hello, world!"

    def print_message(self):
        print(self.message)

    def set_message(self, msg):
        self.message = msg
```

## 実行

`:python.start()`でpythonプロセスを開始し、`:python.call()`で関数の呼び出しを行う。

```iex
$ iex -S mix
iex(7)> {:ok, python} = :python.start([python_path: '.'])
iex(8)> obj = python |> :python.call(:sample, :Sample, [])
Sample.__init__
iex(9)> python  |> :python.call(:sample, :"Sample.print_message", [obj])
Hello, world!
```

ここまでは問題ない。次に`Sample.set_message()`を呼んでみる。

```iex
iex(13)> python |> :python.call(:sample, :"Sample.set_message", [obj, "Hello, ErlPort!"])
iex(14)> python  |> :python.call(:sample, :"Sample.print_message", [obj])
Hello, world!
```

あれ？メッセージが変わっていない。

試しに`Sample.set_message()`で`self`を返すようにして、呼び出し側でそれを受け取るようにしてみると、

```py:python/sample.py
class Sample(object):
    # ...

    def set_message(self, msg):
        self.message = msg
        return self
```

```iex
iex(15)> {:ok, python} = :python.start([python_path: '.'])
iex(16)> obj = python |> :python.call(:sample, :Sample, [])
Sample.__init__
iex(18)> obj = python |> :python.call(:sample, :"Sample.set_message", [obj, "Hello, ErlPort!"])
iex(19)> python  |> :python.call(:sample, :"Sample.print_message", [obj])
Hello, ErlPort!
:undefined
```

今度はメッセージが変わった。
まるで`self`がイミュータブルオブジェクトであるかのような動作をしている。
Imageの透明度を動的に変化させる

##以下のコードを、透明度を動的に変化させたいオブジェクトにアタッチ

```csharp
//speedは1.0までの値で、大きいほど早く変化
float speed = 0.01f;

void Start () {
        red = GetComponent<Image>().color.r;
        green = GetComponent<Image>().color.g;
        blue = GetComponent<Image>().color.b;
    }

    void Update () {
        GetComponent<Image>().color = new Color(red, green, blue, alfa);
        alfa += speed;  
    }
```
source-is-missing に対処しよう

```
E: tdiary-contrib source: source-is-missing util/image-gallery/js/SmoothGallery/scripts/mootools-1.2-more.js line length is 278 characters (>256)
E: tdiary-contrib source: source-is-missing util/image-gallery/js/SmoothGallery/scripts/mootools-1.2.1-core-yc.js
```

cowbuilder の hook で呼び出される lintian で source-is-missing という E (lintian error) が出て build が失敗となる（ビルド自体は成功しているがLintian errorが失敗を返すのでビルドエラーと見なされる）。source-is-missing の内容は https://lintian.debian.org/tags/source-is-missing.html を見れば書いてある。

> Please repack your package to include the source or add it to "debian/missing-sources" directory.

ということなので、debian/missing-sources に放り込めばいいのかな（でも全く同じファイル名じゃないとlintian検知しないんじゃないか、という気もする→後述、正解）。

で、元のファイルは[mootools-more 1.2](https://github.com/mootools/mootools-more/releases?after=0.2)と[mootools-core](https://github.com/mootools/mootools-core/releases?after=1.2.4)だということは分かってるのでダウンロードしてくる。あとはパッケージの中のmergeされてminifiedされた.jsファイルとにらめっこ...（jsのこういう対応する元のソースを付けない文化は悪だと思う...動作おかしいときに直すの面倒にならんのかな。エディタがよろしくやってくれる？）。

で、再度ビルドするがやっぱりファイル名が一致するものがないと駄目なようなので、debian/source/lintian-overrides にエラーを貼り付けて無視することにする。ただ、何で無視したのか判るようにコメントを追加しておいた

```
# Note: source is added to debian/missing-sources directory but it is merged
#       from multiple files to one source, so lintian cannot detect it and
#       I'll override it.
tdiary-contrib source: source-is-missing util/image-gallery/js/SmoothGallery/scripts/mootools-1.2-more.js line length is 278 characters (>256)
tdiary-contrib source: source-is-missing util/image-gallery/js/SmoothGallery/scripts/mootools-1.2.1-core-yc.js
```
raspberry pi 1 model bで、アセンブラ

#概要
raspberry pi 1 model bで、アセンブラやってみた。
#開発環境
raspberry pi 1 model b
raspbian 2016_09_23 jessie lite
#実行
```
nano test2.s
gcc test2.s -nostdlib
./a.out
```
#サンプルコード
```
.text
.globl _start
_start:
	ldr r8, =msg
	mov r7, #4
	mov r0, #1
	ldr r1, =msg
	mov r2, #1
	svc #0
	mov r9, #'e'
	strb r9, [r8]
	svc #0
	mov r9, #'l'
	strb r9, [r8]
	svc #0
	mov r9, #'l'
	strb r9, [r8]
	svc #0
	mov r9, #'o'
	strb r9, [r8]
	svc #0
	mov r9, #'w'
	strb r9, [r8]
	svc #0
	mov r9, #'o'
	strb r9, [r8]
	svc #0
	mov r9, #'r'
	strb r9, [r8]
	svc #0
	mov r9, #'l'
	strb r9, [r8]
	svc #0
	mov r9, #'d'
	strb r9, [r8]
	svc #0
	mov r7, #1
	mov r0, #0
	svc #0
.data
msg:
	.byte 'h'
```
#考察
レジスタ
　r0～r15まで、あるが、r13,r14,r15は、スタックポインタ、リンクレジスタ、プログラムカウンタで使えない。
　r7,r0,r1,r2,r3は、システムコールで使う。
　r4,r5,r6,r8,r9,r10,r11,r12が使える。
システムコール
　r7に１を入れて、r0に０を入れて、svcを呼べば、「exit」。
　r7に４を入れて、r0に１を入れて、r1にアドレスを入れて、r2に長さを入れて、svcを呼べば、「write」。
メモリへのアクセス
　ldrで、レジスタにアドレス入れて、ldrbで読み込む。strbで書き出す。
プログラミング入門者のための「Homebrew」インストール

#概要

Macを持って、これからプログラミングを始めようと言う方向けに

Homebrewという便利なアイテムの説明とインストール方法を説明します。

#Homebrewとは

Homebrewとは、Mac OSにおいて、プログラミング上必要となってくる

パッケージをインストールしたりアンインストールしたり出来るシステムです。

このようなものをパッケージ管理システムと呼びます。

つまり、Homebrewを使えば、便利なアイテムのダウンロードが非常に簡単になってきます。

プログラミング言語の環境構築などでは必須のアイテムになっています。

#なぜHomebrew

Macでパッケージ管理システムというと、MacPortsも有名ですが、MacPortsはパッケージをインストールする時、現時点で自分のパソコンで入っているものを考慮にいれずにインストールしてきます。

その点、Hombrewはローカル（自分のパソコン）に入っているものを極力使おうとします。

他にも、Homebrewを使う利点はありますがここでは割愛させてもらいます。

#インストール

では実際にインストールしてみましょう。

##ターミナル

Macでは標準で「ターミナル」というアプリが入ってます。

ターミナルではコマンドを使いパソコンをなんでも操作することが出来ます。

さて、「アプリケーション」の中の「Utilities」フォルダーの中にある、ターミナルを開いてみてください。(command + spaceを押して「ターミナル」打ってもいいかもしれません。)

![Screenshot 2016-10-28 12.45.10.png](https://qiita-image-store.s3.amazonaws.com/0/114543/ad71bda0-81cb-5294-3f36-a5c3262c0097.png)

このような画面が表示されたでしょうか？

これであなたもプログラマーです。

# Command Line Toolsのインストール

Homebrewをインストールするのに必要なコマンドを打てるようにする準備をします。

`xcode-select --install`

上記のコマンドをターミナルに打った後に、いろいろな画面が表示されると思いますが、

インストールや同意するを押して進めてください。

「ソフトフェアがインストールされました」と表示されれば大丈夫です。

# Homebrewのインストール

さて、いよいよhomebrewをインストールしましょう。

打ち込むべきコマンドはHomebrewのホームページに載っています。

現時点は下に載せたコマンドですが、定期的に変わってるみたいなので、

ホームページからコマンドを取ってくることをおすすめします。

`/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
`
![Screenshot 2016-10-28 12.52.22.png](https://qiita-image-store.s3.amazonaws.com/0/114543/66fcd9e7-c51d-40ea-6929-34d863036eb1.png)


最後に

`Installation Successful!`
このように表示されていれば成功しているはずです。

実際に、以下のコマンドでHomebrewのバージョンを確かめて、本当にインストールが確認されているか確認してみましょう。

`brew update　#一応updateして最新にしておく`
`brew -v`

Homebrew 1.0.8
Homebrew/homebrew-core (git revision 516f; last commit 2016-10-28)
上記の様なものが表示されていれば成功です。

バージョンの数字は違ってても大丈夫です。

以上で、Homebrewのインストールは終了です！

お疲れ様でした。
Mac OS X El Capitan に pear をインストール

#  :open_mouth: 前提

従来？のインストール方法では、El Capitan から導入された「rootless」が有効なため
「/usr/lib/php/」下にディレクトリ作成ができないためNG

```
sudo php /usr/lib/php/install-pear-nozlib.phar
```

# :stuck_out_tongue: 手順

１. インストールスクリプトのダウンロード

```
curl -O  https://pear.php.net/go-pear.phar
```

２. インストールの実行
パスを変更する必要がなければ、そのままEnterキーを押す。

```
php -d detect_unicode=0 go-pear.phar
```

３. 「.bash_profile」にパスを追加

```
/Users/USERNAME/pear/bin
```

４. コマンドが確認できれば完了

```
which pear
```

[参考](https://coolestguidesontheplanet.com/installing-pear-on-osx-10-11-el-capitan/)
JSONValueにJSONValueを入れる

語彙が足りなくて適切なタイトルが出てこない。  
とにかくそういう事をするときは、JSONValue[string]という状態でないといけないようだ。

```d
import std.json : JSONValue,toJSON;

auto json = JSONValue(["Dman":""]);
json["Dman"].object = JSONValue(["is":"GOD"]).object;
//json["dman"].object = JSONValue(["is":"GOD"]); <-こうはできない

assert(toJSON(&json) == `{"dman":{"is":"GOD"}}`);
```

キーを後から追加したりすることはできないのかな?
TensorFlow > API > tf.nn.in_top_k() / tf.nn.top_k()

```txt:動作環境
Ubuntu 14.04 LTS desktop amd64
GeForce GTX 750 Ti
ASRock Z170M Pro4S [Intel Z170chipset]
TensorFlow v0.11
cuDNN v5.1 for Linux
CUDA v7.5
Python 2.7.6
IPython 5.1.0 -- An enhanced Interactive Python.
```

https://www.tensorflow.org/versions/master/tutorials/mnist/tf/index.html#tensorflow-mechanics-101

mnist.pyにおいて以下が気になった。

```mnist.py
...
  # For a classifier model, we can use the in_top_k Op.
  # It returns a bool tensor with shape [batch_size] that is true for
  # the examples where the label is in the top k (here k=1)
  # of all logits for that example.
  correct = tf.nn.in_top_k(logits, labels, 1)
  # Return the number of true entries.
  return tf.reduce_sum(tf.cast(correct, tf.int32))
...
```

tf.nn.in_top_k()のAPI doc
https://www.tensorflow.org/versions/r0.11/api_docs/python/nn.html#in_top_k
> Says whether the targets are in the top K predictions.

関連してtf.nn.top_k()も見つけた。
https://www.tensorflow.org/versions/r0.11/api_docs/python/nn.html#top_k
> Finds values and indices of the k largest entries for the last dimension.
TensorFlow / difference > tf.nn.sparse_softmax_cross_entropy_with_logits() / tf.nn.softmax_cross_entropy_with_logits() > exclusive / soft claesses

```txt:動作環境
Ubuntu 14.04 LTS desktop amd64
GeForce GTX 750 Ti
ASRock Z170M Pro4S [Intel Z170chipset]
TensorFlow v0.11
cuDNN v5.1 for Linux
CUDA v7.5
Python 2.7.6
IPython 5.1.0 -- An enhanced Interactive Python.
```

https://www.tensorflow.org/versions/master/tutorials/mnist/tf/index.html#tensorflow-mechanics-101

mnist.pyの以下が気になった。

```mnist.py
...
  cross_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits(
      logits, labels, name='xentropy')

...
```

cross entropyの計算だが、`sparse_`が付いている。

https://www.tensorflow.org/versions/r0.11/api_docs/python/nn.html#sparse_softmax_cross_entropy_with_logits
> NOTE: For this operation, the probability of a given label is considered <font color=red>exclusive</font>. That is, <font color=red>soft classes</font> are not allowed, and the labels vector must provide a single specific index for the true class for each row of logits (each minibatch entry). For soft softmax classification with a probability distribution for each entry, see softmax_cross_entropy_with_logits.

https://www.tensorflow.org/versions/r0.11/api_docs/python/nn.html#softmax_cross_entropy_with_logits
> NOTE: While the classes are mutually exclusive, <font color=red>their probabilities need not be</font>. All that is required is that each row of labels is a valid probability distribution. If they are not, the computation of the gradient will be incorrect.

>If using exclusive labels (wherein one and only one class is true at a time), see sparse_softmax_cross_entropy_with_logits.

exclusive, soft claessesの意味はそのうち分かるだろう。
TensorFlow / statistics > tf.truncated_normal([IMAGE_PIXELS, hidden1_units],stddev=1.0 / math.sqrt(float(IMAGE_PIXELS))), > イメージ数の平方根で割った値を標準偏差としている

```txt:動作環境
Ubuntu 14.04 LTS desktop amd64
GeForce GTX 750 Ti
ASRock Z170M Pro4S [Intel Z170chipset]
TensorFlow v0.11
cuDNN v5.1 for Linux
CUDA v7.5
Python 2.7.6
IPython 5.1.0 -- An enhanced Interactive Python.
```

https://www.tensorflow.org/versions/master/tutorials/mnist/tf/index.html#tensorflow-mechanics-101

mnist.pyのコードで気になった点。

```mnist.py
...
  with tf.name_scope('hidden1'):
    weights = tf.Variable(
        tf.truncated_normal([IMAGE_PIXELS, hidden1_units],
                            stddev=1.0 / math.sqrt(float(IMAGE_PIXELS))),
        name='weights')
...
```

上記ではt.truncated_normal()の標準偏差への値代入において`1.0 / sqrt(IMAGE_PIXELS)`の計算をしている。

なぜピクセル数の平方根で割っているのだろうか。

なんらかの総和の計算をした時の値が正規化される効果がある気がするが、第１ソースは見つかっていない。
github > 指定の行へのリンクとする > #L56を付加 > 56行へのリンクになる / 複数行指定方法も教えていただいた > #L56-L58 / link: githubチートシート

以下を見ていた。
http://qiita.com/tyfkda/items/2d1144796ce2b9edce8c

リンク先ではgithubへのリンクを以下のようにしている。

`
https://github.com/tensorflow/tensorflow/blob/master/tensorflow/contrib/learn/python/learn/datasets/mnist.py#L56
`

`#L56`をつけることで56行目へのリンクになるようだ。

<hr>
@SaitoAtsushi さんのコメントで複数行指定とgithubチートシートを教えていただきました。

情報感謝です。
python > API > nargs='?' < parser.add_argument('--fake_data', nargs='?', const=True, type=bool, default=False,

```txt:動作環境
Ubuntu 14.04 LTS desktop amd64
GeForce GTX 750 Ti
ASRock Z170M Pro4S [Intel Z170chipset]
TensorFlow v0.11
cuDNN v5.1 for Linux
CUDA v7.5
Python 2.7.6
IPython 5.1.0 -- An enhanced Interactive Python.
```

TensorFlowというDeep Learningのフレームワークを学習中。
https://www.tensorflow.org/versions/master/tutorials/mnist/tf/index.html#tensorflow-mechanics-101


mnist_with_summaries.pyの以下が気になった。

```mnist_with_summaries.py
...
  parser.add_argument('--fake_data', nargs='?', const=True, type=bool,
                      default=False,
...
```

http://docs.python.jp/2.7/library/argparse.html#nargs

> `'?'` – 可能なら1つの引数がコマンドラインから取られ、1つのアイテムを作ります。コマンドライン引数が存在しない場合、default の値が生成されます。オプション引数の場合、さらにオプション引数が指定され、その後にコマンドライン引数が無いというケースもありえます。この場合は const の値が生成されます。この動作の例です:

...

> `nargs='?'` のよくある利用例の1つは、入出力ファイルの指定オプションです:

...

上記のリンク先にて以下の使い分けをしている。

- parser.parse_args(['input.txt', 'output.ext'])
- parset.parse_args([])
TensorFlow > API > tf.gfile関連 > gfile.py / tf.gfile.FastGFile(graph, 'rb')

```txt:動作環境
Ubuntu 14.04 LTS desktop amd64
GeForce GTX 750 Ti
ASRock Z170M Pro4S [Intel Z170chipset]
TensorFlow v0.11
cuDNN v5.1 for Linux
CUDA v7.5
Python 2.7.6
IPython 5.1.0 -- An enhanced Interactive Python.
```

https://www.tensorflow.org/versions/master/tutorials/mnist/tf/index.html#tensorflow-mechanics-101

以下が気になった。

```mnist_with_summaries.py
...
def main(_):
  if tf.gfile.Exists(FLAGS.summaries_dir):
    tf.gfile.DeleteRecursively(FLAGS.summaries_dir)
  tf.gfile.MakeDirs(FLAGS.summaries_dir)
  train()
...
```

コードを見ているだけだが、ディレクトリの存在がある場合、再帰的にディレクトリを消す。そしてディレクトリを作成する、ということをしていそう。


tf.gfileに他にどういうメソッドがあるかは以下のリンク先の一番下の名前から推測はできそう。
https://github.com/tensorflow/tensorflow/blob/master/tensorflow/python/platform/gfile.py


以下では`tf.gfile.FastGFile(graph, 'rb')`という記載がある。`FastGFile`は上記のリンクにてclass定義されている。
http://developers.algorithmia.com/algorithm-development/model-guides/tensorflow/