OmniAICreator/Qiita-1.07M huggingface dataset:
SwiftでMetalを呼び出すときのメモ


私的メモ

##C++11で書くシェーダーにはまった

次のような構成(Swift)
      renderEncoder.setVertexBuffer(頂点バッファー, offset: 0, atIndex: 0)
      renderEncoder.setVertexBuffer(テクスチャの頂点バッファー, offset: 0, atIndex: 1)
      renderEncoder.setFragmentTexture(テクスチャ本体, atIndex: 0)
で、頂点バッファーがXYZAのフォーマット、テクスチャの頂点がXYフォーマットのときの一番簡単なシェーダーをつけておきます。この構成でPNGファイルを三角形に貼り付けることができました。



````Shaders.metal

#include <metal_stdlib>
using namespace metal;

struct MyVertex
{
    float4 m_Vertex [[position]];
    float2 m_Texture [[user(texturecoord)]];
};

vertex MyVertex my_vertex(constant float4         *pPosition   [[ buffer(0) ]],
                                      constant packed_float2  *pTexCoords  [[ buffer(1) ]],
                                      uint                     vid         [[ vertex_id ]])
{
    MyVertex outVertices;
    outVertices.m_Vertex = pPosition[vid];
    outVertices.m_Texture = pTexCoords[vid];
    return outVertices;
}

fragment half4 my_fragment(MyVertex     inFrag    [[ stage_in ]],
                                    texture2d<half>  tex2D     [[ texture(0) ]])
{
    constexpr sampler quad_sampler;
    half4 color = tex2D.sample(quad_sampler, inFrag.m_Texture);
    if (color[3] < 0.5) discard_fragment();//透明の処理
    return color;
}

````

エンコーダーはレンダーエンコーダをつかっています。透明の処理を0.5で敷居していますが、ちょっと乱暴ですね。
リモートデスクトップを切断したユーザーをログオフさせる


Windows Serverをリモートデスクトップを利用して複数人で管理していると、どうしても閉じるボタンで画面を閉じてしまう人が出てきます。閉じるボタンで画面を閉じてしまうと、ログオフではなく切断となり、無駄にメモリを使用し続けたり、他の人が入れなくなる場合があります。

ということで、切断された場合には強制的にログオフさせてしまう設定です。

## Windows Server 2008 R2の場合
Windows Server 2008 R2の場合は、[リモートデスクトップセッションホストの構成]から設定することができます。この機能は、[管理ツール]メニューの[リモートデスクトップサービス]の中にあります。

 1. [リモートデスクトップセッションホストの構成]を起動します。
 2. 画面左側で[RDセッションホストの構成]を選択します。（たぶん選択された状態から始まります。）
 3. 画面中央[サーバーの構成]の[接続]にある[RDP-tcp]を右クリックして、[プロパティ]を選択します。
 4. 表示された[RDP-tcpのプロパティ]ダイアログで、[セッション]タブを開きます。
 5. 上の段の[ユーザー設定よりも優先する]チェックボックスをONにし、[切断されたセッションの終了]を適切な時間に設定します。（自分は[10分]くらいにしていることが多いです。）
 6. [OK]ボタンを押し、[RDP-tcpのプロパティ]ダイアログを閉じます。

## Windows Server 2012 R2の場合

Windows Server 2012 R2の場合は、リモートデスクトップサービスをインストールしないとリモートデスクトップセッションホストの構成が使用できないため、ローカルグループポリシーを変更します。しかし、ローカルグループポリシーエディタもメニューには表示されていません。

1. 検索チャームを使用して[mmc]を検索し、起動します。
2. [ファイル]メニューにある[スナップインの追加と削除]を選択します。
3. 表示された[スナップインの追加と削除]ダイアログの左側にある[利用できるスナップイン]から[グループポリシーオブジェクトエディター]を選択し[追加]ボタンを押します。
4. 表示された[グループポリシーオブジェクトの選択]では[ローカルコンピューター]を選択（たぶん選択された状態から始まります）し、[完了]ボタンを押します。
5. [OK]ボタンを押して、[グループポリシーオブジェクトの選択]ダイアログを閉じます。
6. 画面左側のツリーで[コンソールルート]→[ローカルコンピューターポリシー]→[コンピュータの構成]→[管理用テンプレート]→[Windowsコンポーネント]→[リモートデスクトップサービス]→[リモートデスクトップセッションホスト]→[セッションの時間制限]を選択します。
7. 画面中央で[切断されたセッションの制限時間を設定する]を選択します。
8. 画面右側で[切断されたセッションの制限時間を設定する]の下にある[他の操作]をクリックし、表示されたコンテキストメニューから[編集]を選択します。
9. 表示された[切断されたセッションの制限時間を設定する]ダイアログの左上にあるラジオボタンで[有効]を選択し、左下の[オプション]にある[切断されたセッションを終了する]を適切な時間に設定します。（自分は[10分]くらいにしていることが多いです。）
10. [OK]ボタンを押し、[切断されたセッションの制限時間を設定する]ダイアログを閉じます。

## 参考情報

- Microsoft TechNet - リモート デスクトップ サービスのセッションのタイムアウト設定と再接続設定を構成する
    https://technet.microsoft.com/ja-jp/library/cc754272.aspx

- Microsoft TechNet - ローカル グループ ポリシー エディター
    https://technet.microsoft.com/ja-jp/library/dn265982.aspx
Fedora21でserverspecのリッスンポートのテストをするとうまくいかない問題をどうにかする

これはnet-toolsが非推奨になってnetstatがデフォルトで入っていない影響(たぶんCentOS7でも同じ現象に遭遇すると思う)
serverspec(が依存しているspecinfra)ではリッスンしているポートの検査に未だにnetstatを使っているのでそのコードを書き換えてあげれば良い。

specinfraがインストールされているディレクトリの
lib/specinfra/command/base/port.rbを

```
class Specinfra::Command::Base::Port < Specinfra::Command::Base
  class << self
    def check_is_listening(port, options={})
      pattern = ":#{port} "
      pattern = " #{options[:local_address]}#{pattern}" if options[:local_address]
      pattern = "^#{options[:protocol]} .*#{pattern}" if options[:protocol]
      "ss -lutn | grep -- #{escape(pattern)}"
    end
  end
end
```

のようにssコマンドを使うようにしたら正常に動作した(たぶん)
気が向いたら修正パッチ書いてpull-request送ろうかと思う
Maven 2.2.1でjetty-parentのせいでエラーとなるのを解決する方法

今更、maven 2.2.1とかないだろうって思われてしまうかも知れないが、世の中、使わざるを得ない場合もあるよね〜ってことで、maven 2.2.1ネタです。

Jersey 2.17 + Jettyを使ったアプリをmaven 2でビルドしようとすると、
jetty-parentが解決出来なくて通らないと思います。

```xml
<dependency>
    <groupId>org.glassfish.jersey.containers</groupId>
    <artifactId>jersey-container-jetty-servlet</artifactId>
    <version>2.17</version>
</dependency>
```

# 原因
jetty-parentのpomを探しに行く先が変わっていて、HTTP 301が返されてしまうが、
maven 2.2.1では、デフォルトではroot pomのリダイレクトに対応していないためである。
ちなみに、Maven 3系では発生しない。（理由は後述）

# 解決策
Maven Wagon Provider HTTPを、Apache HTTP Clientによる実装が使われるようにする。
方法は、mvnコマンドの引数に
```
-Dmaven.wagon.provider.http=httpclient
```
を指定する。

※ Maven3系では、Apache HTTP ClientによるWagon Providerがデフォルトであるため、何もせずにjetty-parentが解決出来るわけですね。

# 参考
http://maven.apache.org/guides/mini/guide-wagon-providers.html



使うPOMに書いておけば、いちいち指定しなくても済むなんてことないかな…
DockerfileでOracle Java8を入れる

Dockerfileを使って、docker build時にOracle Java8をインストールしようとすると、docker buildでは画面が表示されないため、ライセンス承諾の画面周りの動作でエラーとなってしまう。

調べてみると、[ここ](http://stackoverflow.com/questions/25019183/docker-java7-install-fail)の最後にある方法でライセンス承諾をしたように振る舞うことが出来た。

抜粋
```
RUN echo debconf shared/accepted-oracle-license-v1-1 select true | debconf-set-selections
RUN apt-get install -y oracle-java8-set-default
```
WordPressのプラグイン

使いたいものをメモ

#SEO対策
##1. All in One SEO Pack
- 記事毎にタイトル、メタタグの書き換えができる。
- 記事編集画面で登録した記事のタグ（tag）を「投稿のメタタグ keywords」に利用できる。
- Googleアナリティクスのアクセス解析コード設定ができる。

##2. WordPress SEO by Yoast
- 1より高機能らしい

##3. Google XML Sitemaps
- XMLサイトマップを自動送信する

##4.PuSHPress
- 投稿するとすぐGoogle検索エンジンにインデックスさせる。

#管理系
##1.検索ワード
- Search Meter

##2.リダイレクト管理
- Redirection

##3.リンク切れチェック
- Broken Link Checker

##4.セキュリティ対策
- Acunetix WP Security

##5.ログイントライ回数制限
- Limit Login Attempts

##6.ログイン履歴
- Crazy Bone

##7.テーマファイルチェック
- Theme Authenticity Checker

#表示
##1.関連記事
- WordPress Related Posts
- Yet Another Related Posts Plugin
(リスト、サムネイル、カスタムできる)
- Child Pages Shortcode
(コページを表示)

##3.目次自動生成
- Table of Contents Plus
- PS Auto Sitemap

##5.パン屑
- Breadcrumb NavXT

##6.無限スクロール
- Infinite-Scroll

##6'.トップへ戻る
- jQuery Smooth Scroll

##7.スライダー
- Meta Slider

##8.画像はりつけ
- Image Widget

##9.SNSリンク
- Social Media Feather - lightweight social media sharing and follow buttons


##9.YouTube
- Video Thumbnails

##10.閲覧履歴
- WP Browsing History


#HTML編集補助
##1.エディタ拡張
- Ultimate TinyMCE

##2.HTMLタグ自動除去の除去(使わないかも)
- PS Disable Auto Formatting

##3.よく使うタグ登録
- AddQuicktag

##4.ショートコード登録
- Shortcoder

##5.テーブル登録
- TablePress

##6.シンタックスハイライター
- Crayon Syntax Highlighter

# その他
##1.お問い合わせリスト
- Flamingo

##2.メールフォーム
- Contact Form 7

##3.バックアップ
- BackWPup

##4.テーマのカスタマイズ
- Code Snippets
- WP-Total Hacks

##5.スマホ対応
- WPtouch(古いテーマでレシポンシブデザインじゃないもの限定)

##6.BASIC認証
- WP BASIC Auth

##7.ページ表示高速化
- WP Super Cache
- W3 Total Cache
- Head Cleaner
- Unveil Lazy Load(スライド速度に応じて)

##8.amazonリンク
- AmazonJS

##9.プラグイン負荷チェック
- P3 (Plugin Performance Profiler)

##10.リダイレクト
- Redirection

##11.User管理
- User Role Editor

##12.広告管理
- Adrotate


#参考記事
下記URLを自分仕様で抜粋しました。

- http://netaone.com/wp/wordpress-plugin-first/
- http://markehack.jp/wordpress-plugins-recommended/

#プラグイン作り方

- http://www.webopixel.net/wordpress/631.html
Atom エディタで画面分割する方法

![atom.png](https://qiita-image-store.s3.amazonaws.com/0/18072/fdccca6f-7f2b-8674-5136-32893bab9930.png)
画面上部のタブで右クリックして、Split Up/Down/Left/Rightのいずれかを選択することで可能です。
Casbahのラッパー作ってみた

# Casbahのラッパー作ってみた

ScalaでMongoDBとやり取りするには。

[MongoDBの公式サイト](http://docs.mongodb.org/ecosystem/drivers/scala/)

いろいろある。

Rogueがいい感じだったので、それを使おうかと思ったのだが
Liftに依存してたので、やめた。

で、オレオレドライバ作った。
ドライバというよりは、公式ドライバ「Casbah」のラッパー、といった方が正しいが。

```scala
implicit val db = MongoClient(...)("dbの名前")

// insert
Book.insert( Book(author="FooBar", title="HogeFuga", price=1200) )

// find
val books: Seq[Book] = Book.where(_.author == "foo" && _.price >= 2000).find

// update
Book.where(_.title == "hoge").set(price := 1000).update

// remove
Book.where(_.price <= 1000).remove
```

Casbahを直接使うよりは、便利に書けると思う。
とくにANDとかORとか使う場合は。

---

githubで公開してます。

[tochka](https://github.com/fkmt-disk/tochka)

これ作るために、いろいろ調べていて思ったのだが、
MongoDB使うならScalaよりGroovyの方が便利だと思う。
Rails @import "bootstrap";

Railsチュートリアル
http://railstutorial.jp

5.1.2BootstrapとカスタムCSS

ではまり中

```
@import "bootstrap";
```

これが動かずエラーになる

```
File to import not found or unreadable: bootstrap.
```

解決！、Gemfileに指定していたbootstrapの行がproductionグループに入っているのに気が付かなかった。bootstrapインストールされていなかったのかもおおおおおばかばかぁ、おれのばかぁ！
Macのデスクトップに残るファインダーの残像を消す方法

## こんな残像残ることないですか？

![1.png](https://qiita-image-store.s3.amazonaws.com/0/14975/a71a795b-02c9-138c-9eed-689e7da1cff4.png)

僕はファインダーのタブを分離しようとするとなります。。

## 消し方分かりました。

ターミナルを開いてコマンドを打つだけ。

![2.png](https://qiita-image-store.s3.amazonaws.com/0/14975/99212b48-ff54-8adf-6c14-f333da714145.png)

すると...

![3.png](https://qiita-image-store.s3.amazonaws.com/0/14975/b2b071a4-0900-2c1a-2216-d9233380a4cf.png)

きれいサッパリ！
これで思いっきりファインダーのタブを分離できます！
browserifyのrequire対象を相対パスのみにする

## 結論
`--no-bundle-external`オプションを使う。（[公式参照][1]）

## 以下、補足

```js:hoge.js
module.exports.client= function(){
  return require('./lib');
}
module.exports.server= function(){
  return require('http');
}
```

サーバーとクライアントの処理が混ざってるファイルから、クライアントのrequireだけ(`./lib`)を、browserifyの対象にしたい場合

```bash
browserify hoge.js --exclude node_modules
# 0.834s 5227lines
```
としても、うまくいきません。

公式には
> [`    --exclude, -u  Omit a file from the output bundle. Files can be globs.`][1]

とあるので

```bash
browserify hoge.js --exclude 'node_modules/**'
# 2.186s 154lines
```
とすると、除外は上手く行きますが、すごい時間かかります。ので

>   `--no-bundle-external`
>    Turn off bundling of all external modules. This is useful if you only want to bundle your local files.

```bash
browserify hoge.js --no-bundle-external
# 0.444s 154lines
```
としました。ちゃんとそういうオプションが用意されていましたね。スミマセン

# browserify-middleware
Express4用の[browserify-middleware](https://github.com/ForbesLindesay/browserify-middleware/blob/master/History.md#700--2015-07-22)の`bundleExternal`にfalseを渡すと、同様に`require()`からビルドインと`node_modules`を除外できます。

[1]: https://github.com/substack/node-browserify#usage
[2]: https://github.com/isaacs/node-glob#glob-primer
課金テストで「認証が必要です。Googleアカウントにログインしてください。」と言われる



アプリケーションが公開されていないケースで発生

Google Play Developer Console でアプリを公開（ベータ版・アルファ版でも可）したら解消した。

参考: http://forums.coronalabs.com/topic/53854-google-iap-error-authentication-is-required-huh/
knife zero bootstrap で リモートに chef がインストールできない

knife-zero を始めようと思い、 bootstrap しようとしたら詰まりました。
単純に
```
knife zero bootstrap www.hoge.com -i /home/issei/.chef/issei.pem -x issei --sudo 
```

とやったら

```
www.hoge.com 
www.hoge.com Installing Chef Client...
www.hoge.com --2015-03-21 19:02:34--  https://www.chef.io/chef/install.sh
www.hoge.com www.chef.io をDNSに問いあわせています... 103.245.222.65
www.hoge.com www.chef.io|103.245.222.65|:443 に接続しています... 接続しました。
www.hoge.com エラー: 証明書に記載されている名前 `g.ssl.fastly.net' とホスト名 `www.chef.io' が一致しません
www.hoge.com www.chef.io に安全の確認をしないで接続するには、`--no-check-certificate' を使ってください。
www.hoge.com SSL による接続が確立できません。
www.hoge.com Starting first Chef Client run...
www.hoge.com bash: line 83: chef-client: command not found
```
とエラーが起きた。

いろいろぐぐったら
http://comments.gmane.org/gmane.comp.sysutils.chef.user/20457
がヒットして

bootstrap 時に
```
--bootstrap-url https://www.opscode.com/chef/install.sh
```
をつければよいらしい。
やってみたらうまく行きました。
rails cannot load such file -- active_job/railtie (LoadError)

チュートリアル５章ではまる

```
@import "bootstrap";
```

これがよみこめていないっぽい？

Genfileを自動生成のままつかってきて、ここまではすんなりいけてたけど、やっぱまずかったかな。

でもチュートリアルのGemfileつかうとrspecでエラーでるんだよな

```
application.rb:5:in `require': cannot load such file -- active_job/railtie (LoadError)
```


http://stackoverflow.com/questions/16782198/cannot-load-railtie-after-upgrade-to-rails-4-per-ruby-railstutorial-org

こちらを参考にgem 'activeresource'を追加、しかし変わらず

```
require "active_resource/railtie" 
```

これをコメントあうとするとあるが、application.rbにこの記述はない

(あ、よくみたらエラーが違う。このURLのエラーはactive_resourceだ）

[参考]
http://elearning.hateblo.jp/entry/2014/12/25/154503
システムのRubyではなく、rbenvのRubyに変更するTips

#初めに

内容はよくある記事ですが、
タイトルから探しやすいように、記事にしました。
（備忘録として）

#内容

Rubyを実行する場合、システムのRubyになっていて、
rbenvのRubyに変更したい/使いたい場合のちょっとした記事です。



#対象ファイル
```bash:zshの場合
vi ~/.zshrc
```

```bash:bashの場合
vi ~/.bash_profile
```

#変更点

```bash:末尾にこれを追加
export PATH="$HOME/.rbenv/bin:$PATH"
eval "$(rbenv init -)"
```


#環境変数の反映


```bash:zshの場合
source ~/.zshrc
```

```bash:bashの場合
source ~/.bash_profile
```

シェルの再起動でもいいです。
上のコマンドを打つとすぐに反映されます。
EclipseでStreamのコンパイルエラー

Eclipseにはめられたので備忘録として。
（はめられたのは4.4.2です）

# Eclipseでエラーが出る
```java:Kuku.java
import java.util.stream.Collectors;
import java.util.stream.IntStream;

public class Kuku {

	public static void main(String[] args) {
		IntStream.range(1, 10)
			.mapToObj(n -> IntStream.iterate(n, m -> m + n).limit(9).mapToObj(String::valueOf))
			.map(ns -> String.join("\t", ns.collect(Collectors.toList())))
			.forEach(System.out::println);
	}

}
```

結果はエラー
![スクリーンショット 2015-03-21 18.36.10.png](https://qiita-image-store.s3.amazonaws.com/0/57377/fb26b242-e724-14ff-175f-23b738d3bf92.png)

# 気づき
おかしいなぁ、動くはずなのになぁ、と書き換えたりしてたところあることに気づく。

![スクリーンショット 2015-03-21 18.38.43.png](https://qiita-image-store.s3.amazonaws.com/0/57377/92f5c4cf-7ce7-d66a-8436-9b2260a4cce5.png)

ん？`List<Object>`？？

# コンソールで
そんなわけで、Eclipseさんの挙動が怪しいのでコンソールで試してみる。

```console
$ javac Kuku.java 
$ java Kuku
1	2	3	4	5	6	7	8	9
2	4	6	8	10	12	14	16	18
3	6	9	12	15	18	21	24	27
4	8	12	16	20	24	28	32	36
5	10	15	20	25	30	35	40	45
6	12	18	24	30	36	42	48	54
7	14	21	28	35	42	49	56	63
8	16	24	32	40	48	56	64	72
9	18	27	36	45	54	63	72	81
```

動くやないか！(ﾟДﾟ)ｺﾞﾙｧ!


**（追記）**
4.5.2では直ってました。

![スクリーンショット 2016-03-09 21.35.23.png](https://qiita-image-store.s3.amazonaws.com/0/57377/47e83a9b-0cca-b72c-0bd3-0b46e8621116.png)
ボット利用者の権限管理を行う hubot-acl の使い方

hubot 経由で jenkins のジョブを実行したり、github の pull リクエストをマージしたりするの、便利でおもしろけど、ボットに話しかけられる人なら誰でも実行できてしまうのでちょっと怖い感じがした。

ボットに話しかけられる人の権限管理を行えるようになっていればいいなーと思い、[tily/hubot-acl](https://github.com/tily/hubot-acl) という Hubot スクリプトを作ってみた。

## 使い方

external-scripts で `hubot-acl` をロードすると robot が `acl` というイベントを発行するようになるので、自分のスクリプトの中でこれを捕捉して設定を行う。

```coffeescript
module.exports = (robot)->
  robot.on 'acl', (order, allow, deny)->
    # ここに ACL 設定を記述する。
```

ACL 設定は [apache の httpd.conf っぽいスタイル](http://httpd.apache.org/docs/2.0/ja/mod/mod_access.html#order) で記述できるようにしてみた。 (他に参考にできるようなインタフェースを思いつかなかったので…)

### ホワイトリスト

```coffeescript
robot.on 'acl', (order, allow, deny)->
  order deny, allow
  deny text: /.*/
  allow id: [1], text: /.*/
  allow id: [2], text: /^jenkins/
  allow id: [3], text: /^jenkins (list|last|describe)/
```

* デフォルトでは全員がすべてのコマンドを禁止されている
* id=1 のユーザーはすべてのコマンドを許可されている
* id=2 のユーザーは `jenkins` プラグインのコマンドのみ許可されている
* id=3 のユーザーは `jenkins` プラグインの閲覧系コマンドのみ許可されている

### ブラックリスト

```coffee
robot.on 'acl', (order, allow, deny)->
  order allow, deny
  allow text: /.*/
  deny name: ['bay4k', 'manny'], text: /^jenkins/
  deny name: ['sticky'], text: /^jenkins (b|build)/
```

* デフォルトでは全員がすべてのコマンドを許可されている
* bay4k, manny は `jenkins` プラグインのコマンドを禁止されている
* sticky は `jenkins` プラグインのビルド系コマンドを禁止されている

### hubot-auth との連携

hubot-auth ([CoffeeScript - Hubot の標準的な権限管理 (hubot-auth) - Qiita](http://qiita.com/bouzuya/items/76165b32705e82e2f7c4)) で指定された role での権限設定も可能 (v0.0.2 から)。

```coffeescript
robot.on 'acl', (order, allow, deny)->
  order deny, allow
  deny text: /.*/
  allow role: ['admin'], text: /.*/
  allow role: ['jenkins'], text: /^jenkins/
  allow role: ['jenkins-readonly'], text: /^jenkins (list|last|describe)/
```

### 実行例

権限がないとこんな感じでリプライが返ります。

```
Hubot> Hubot jenkins build hoge
bes: Error: you are not allowed to execute that command
```

## 仕組みとか TODO とか

Robot#respond は内部的に Robot#listeners にコールバックを push するんだけど、ACL の判定はボットが reply に反応するときに一番最初に呼ばれるようにしたいので、Robot#listeners へ直接 unshift して必ず一番最初に呼ばれるようにしている。([JavaScript - Hubotの応答に権限追加 - Qiita](http://qiita.com/dtaniwaki/items/d89f7c1ed714f50497ed) のように #receive をオーバーライドしたほうが確実かな…。)

あと、それなりに重要な要件だから Hubot のテストの書き方をよく分かっていないんだけどテストを書きたい。
C言語の基礎 (ダイナミックにメモリ確保) NO.8 備忘録

言葉の説明
「ダイナミックにメモリ確保」
>Wikipedia
> プログラムを実行しながら、平行して必要なメモリ領域の確保と解放を行う仕組み

```c++:test.cpp
  int *piData = NULL; // int型のポインタ変数の宣言
  
  piData = (int*)malloc(sizeof(int) * 3);  // 4*3ビット分のメモリをint型にキャストしてメモリ確保
  
  if ( piData == NULL )
    return -1;
  
  
  piData[0] = 10;
  piData[1] = 20;
  piData[2] = 30;
  
  
  // 順番に値を表示する
  for ( int i = 0; i < 3; i++ )
  {
    CCLOG("%d",piData[i]);
  }
  
  piData[0] = 100;
  CCLOG("%d",piData[0]);
```
実行結果
cocos2d: 10
cocos2d: 20
cocos2d: 30
cocos2d: 100

__このプログラムをポインタ変数を用いて書換__


```c++:test.cpp
  int *piData = NULL; // int型のポインタ変数の宣言
  
  piData = (int*)malloc(sizeof(int) * 3);  // 4*3ビット分のメモリをint型にキャストしてメモリ確保
  
  if ( piData == NULL )
    return -1;

  *(piData + 0) = 10;
  *(piData + 1) = 20;
  *(piData + 2) = 30;
  
  
  // 順番に値を表示する
  for ( int i = 0; i < 3; i++ )
  {
    CCLOG("*(piData + %d)の値:%d",i,*(piData + i));
  }
  
  *(piData + 0) = 100;
  
  CCLOG("*(piData + 0):%d",*(piData + 0));
```
実行結果
cocos2d: *(piData + 0)の値:10
cocos2d: *(piData + 1)の値:20
cocos2d: *(piData + 2)の値:30
cocos2d: *(piData + 0):100

復習
**値の代入**
`aiData[0] = 10;`
↓
`*(piData + 0) = 10;`

**アドレスの表示**
`(piData + 0))`
↓
`&piData[0]`
C言語の基礎 (多次元配列) NO.7 備忘録

書式

データ型　配列名[行の要素数][列の要素数]

```c++:test.cpp
int aiScore[3][2] = {[56,60],[65,70],[85,50]};
```

```c++:test.cpp
  int aiScore[3][2] = {{56,60},{65,70},{85,50}};  //点数の2次元配列

  int i = 0;  // インデックス1
  int j = 0;  // インデックス2
  
  int iTotal = 0; // 合計値格納用の変数
  
  
  // 0行目の合計値
  for ( i = 0; i < 2; i++ )
  {
    iTotal += aiScore[0][i];
  }
  
  CCLOG("0行目の合計値:%d",iTotal);

  iTotal = 0;
  
  // 2列目の合計値
  for ( i = 0; i < 3; i++ )
  {
    iTotal += aiScore[i][1];
  }
  
  CCLOG("2列目の合計:%d",iTotal);
  
  // 全体の合計
  for ( i = 0; i<3; i++ )
  {
    for ( j = 0; j<2; j++ )
    {
      iTotal += aiScore[i][j];
    }
  }
  
  CCLOG("全体の合計値:%d",iTotal);
```
実行結果
cocos2d: 0行目の合計値:116
cocos2d: 2列目の合計:180
cocos2d: 全体の合計値:566

#2次元配列の仕組み
```c++:test.cpp
  int aiScore[3][2] = {{56,60},{65,70},{85,50}};  //点数の2次元配列
  
  for ( int i = 0; i < 3; i++ )
  {
    for ( int j = 0; j < 2; j++ )
    {
      CCLOG("%d行%d列のアドレス:%p 値:%d",i,j,aiScore + (i+j),*(*(aiScore + i) + j));
    }
  }

  CCLOG("%p",aiScore);
  CCLOG("aiScoreのメモリサイズ:%d",(int)sizeof(aiScore));
  
  CCLOG("0行目のアドレス:%p",aiScore + 0);
  CCLOG("1行目のアドレス:%p",aiScore + 1);
  CCLOG("2行目のアドレス:%p",aiScore + 2);
```
実行結果
cocos2d: 0行0列のアドレス:0x16fdbe0a0 値:56
cocos2d: 0行1列のアドレス:0x16fdbe0a8 値:60
cocos2d: 1行0列のアドレス:0x16fdbe0a8 値:65
cocos2d: 1行1列のアドレス:0x16fdbe0b0 値:70
cocos2d: 2行0列のアドレス:0x16fdbe0b0 値:85
cocos2d: 2行1列のアドレス:0x16fdbe0b8 値:50
cocos2d: 0x16fdbe0a0
cocos2d: aiScoreのメモリサイズ:24
cocos2d: 0行目のアドレス:0x16fdbe0a0
cocos2d: 1行目のアドレス:0x16fdbe0a8
cocos2d: 2行目のアドレス:0x16fdbe0b0

・aiScoreは要素数が3つの配列へのポインタになっている。
・aiScore + 1　は、要素2つ分のメモリを飛び越えた値になっていることがわかる。

```c++:test.cpp
  int aiScore[3][2] = {{56,60},{65,70},{85,50}};  //点数の2次元配列

  int *piData = nullptr;    // int型のポインタ変数の宣言
  
  piData = (int *)aiScore;  // 配列のポインタをint型にキャストして代入
  
  
  for ( int i = 0 ; i < 3 * 2; i++ )
  {
    CCLOG("*(piData + %d)の値:%d",i, *(piData + i));
  }
```
実行結果
cocos2d: *(piData + 0)の値:56
cocos2d: *(piData + 1)の値:60
cocos2d: *(piData + 2)の値:65
cocos2d: *(piData + 3)の値:70
cocos2d: *(piData + 4)の値:85
cocos2d: *(piData + 5)の値:50


#最初のプログラムをポインタ変数を使用して書換
```c++:test.cpp
  int aiScore[3][2] = {{56,60},{65,70},{85,50}};  //点数の2次元配列
  
  int i = 0;  // インデックス1
  int j = 0;  // インデックス2
  
  int iTotal = 0; // 合計値格納用の変数
  
  
  // 0行目の合計値
  for ( i = 0; i < 2; i++ )
  {
//    iTotal += aiScore[0][i];
    iTotal += *(*(aiScore + 0) + i);
    
  }
  
  CCLOG("0行目の合計値:%d",iTotal);
  
  iTotal = 0;
  
  // 2列目の合計値
  for ( i = 0; i < 3; i++ )
  {
//    iTotal += aiScore[i][1];
    iTotal += *(*(aiScore + i) + 1);
    
  }
  
  CCLOG("2列目の合計:%d",iTotal);
  
  // 全体の合計
  for ( i = 0; i<3; i++ )
  {
    for ( j = 0; j<2; j++ )
    {
      iTotal += *(*(aiScore + i) + j);
    }
  }
  
  CCLOG("全体の合計値:%d",iTotal);
```
実行結果
cocos2d: 0行目の合計値:116
cocos2d: 2列目の合計:180
cocos2d: 全体の合計値:566

   `aiScore + 0`          : 0行0列の先頭ポインタ
  `*(aiScore + 0)`        : 0行0列の先頭ポインタ(int型)
  `*(aiScore + 0) + 1`    : 0行1列の先頭ポインタ(int型)
  `*(*(aiScore + 0) + 1)` : 0行1列の値
htcのAndroidでUnityRemoteを実行するメモ（Windows8.1）

# 作業概要

>http://loumo.jp/wp/archive/20121210085729/
http://www.javadrive.jp/android/install/index1.html#section1

基本的には上記を参考に作業

ただ、htcのスマートフォンはUSB接続時に実行するドライバインストールだけだと
UnityでのBuild&Run時にエラーが発生して進まなかったりするので

>http://amidagamine.com/notes/2013/09/10/htc-j-usb%E3%83%89%E3%83%A9%E3%82%A4%E3%83%90/

今度はココ↑を参考にして進めたらできた。

<br>
# 準備
    まず
      ・WindowsPCにAndroidSDKをダウンロードして用意しておく。（管理しやすいディレクトリにフォルダを置いておく）
      ・htcのAndroidスマートフォンにUnityRemoteアプリを入れておく。

・AndroidSDK
http://developer.android.com/sdk/index.html#Other
![tret5ewt.png](https://qiita-image-store.s3.amazonaws.com/0/23248/1cf84ca9-f3db-e8bd-4368-a9b9dbe7241f.png)

      インストーラーかZIP、お好きな方を。
      ※最新のものは画像と異なる場合がありますよ

・UnityRemote
https://play.google.com/store/apps/details?id=com.unity3d.androidremote&hl=ja

      AndroidスマートフォンからGooglePlayアプリでアクセス(UnityRemote を検索)してね。

<br>
# 作業内容
###Windows側

    1.HTCのHTC Sync Managerをインストール

http://www.htc.com/jp/software/htc-sync-manager/

    ※HTC Sync Manager が必要ない場合は
      インストール後にWindowsの コントロールパネル -> プログラムのアンインストール から
        ・HTC Sync Manager
        ・IPTInstaller

      を削除する。
      (HTC Driver Installer だけ消さずに残す)
![dfsh awtebh4.png](https://qiita-image-store.s3.amazonaws.com/0/23248/12da6a61-fb36-3258-9181-c257e29ca7a8.png)

    要は、USBドライバだけインストールするにも、まずHTC Sync Managerをインストールしないといけない。



あとは、USBでAndroidとPCを接続しておき・・・

***

###Unity側

    2.Edit -> Preferences… -> External Tools -> Android SDK Location の右にあるボタンぽくなってる部分
      を押して、SDKのディレクトリ位置を設定。
     （android-sdk-windows 等のディレクトリを選択した状態で 【フォルダーの選択】 を押せばよい。）

    3.File -> Build Settings -> Android を選択して Switch Platform
      Android を選択した状態で Player Settings… を選択。

    4.Inspector 内のandroid（マーク）のタブを選択
![reswttse.png](https://qiita-image-store.s3.amazonaws.com/0/23248/b7a2a595-fad9-fe68-6ef1-f15bcf32cb27.png)

    -> Other Settings -> Identification -> PlayerSettings.bundleIdentifier の
      文字列を適当に変える（初期のままだとうまくいかないので）例： jp.hoge とか。

　

    5.File -> Build & Run
      ※Build Settings -> Scenes In Build での画面遷移設定はあらかじめ設定しておいてください・・

ビルドが完了した後、Androidのロック画面が解除されていて、画面が点灯していれば、UnityRemoteを介してビルドしたUnityアプリが勝手に起動します。多分。

----

以上でなんとかhtcのAndroidでUnityRemote実行できました。
ドライバ単体でインストールできないとか、htcまじ厄介。
ま、他にもこ～いうメーカーあるかもしれませんが。
Rails 環境毎に異なる定数を管理するのに便利な gem rails_config を導入する

環境 ( development, test, production) 毎に異なる定数の管理を、簡単に行う事が出来る、rails_config という gem  をインストール・設定を行う。


**GitHub リポジトリ rails_config**
(https://github.com/railsconfig/rails_config)

※ インストールの方法から、利用方法までは上記 GitHub に全てまとまっています。


## 前提

||バージョン|
|:--|:--|
|Ruby|2.1.1|
|Rails|4.2.0|
|rails_config|0.4.2|

 
## 1. インストールと初期化

Gemfile へ rails_config を追記

```rb:Gemfile
gem 'rails_config'
```

Gemfile をインストール。
( rails プロジェクト内に閉じた状態で gem をインストールしたいため --path オプションを利用。 )

`$ bundle install --path vendor/bundle`

---

デフォルトの初期ファイルセットを作成する。

`$ bundle exec rails g rails_config:install`

以下のファイルが作成されます。

**config/initializers/rails_config.rb**
下記の YAML をパースした定義にアクセスするためのクラス。
デフォルトは Settings という名前となっている。

**config/settings.yml**
全ての環境で共通して利用する設定

**config/settings.local.yml**
ローカル環境のみで利用する設定
( バージョン管理の対象外 )

**config/settings/development.yml**
開発環境のみで利用する設定

**config/settings/production.yml**
本番環境のみで利用する設定

**config/settings/test.yml**
テスト環境のみで利用する設定


また、.gitignore に以下の記述が追記されます。

```git:.gitignore
config/settings.local.yml
config/settings/*.local.yml
config/environments/*.local.yml
```

これによって config/settings.local.yml がコミットの対象外となります。
ローカルで開発を行っているような場合に、誤ってコミットされる事が無くなるので、その環境独自の設定も気兼ねなく記述する事が出来ます。

同じ設定を複数のファイルで記述した際の読み込みの優先度としては以下のようになります。

settings.local.yml  **>**  ( production.yml, test.yml, development.yml )  **>**  settings.yml


## 2. 設定ファイルへの記述

view のセレクトボックスへセットする値を設定ファイルで管理する想定。

```config/settings.yml
cuisine_type:
  '1': '和食'
  '2': '中華'
  '3': 'イタリアン'
```

## 3. 参照元の記述

view ファイル (ERB) で、実際に上記の設定を呼び出す例。

```
<p>
  <strong>Cuisine type:</strong>
  <%= Settings.cuisine_type[ @store.cuisine_type ] %>
</p>
```

---

実際の戻り値は RailsConfig::Options クラスのインスタンスのため、Hash のメソッドを利用したい場合は to_h してから。
※ form のセレクトボックスへ値をセットする際等。

```
<div class="field">
    <%= f.label :cuisine_type %><br>
    <%= f.select :cuisine_type, Settings.cuisine_type.to_h.invert %>
  </div>
```

## 4. おまけ

同じような機能を提供してくれる gem として settingslogic があります。
rails_config と違って、1 つのファイル内へ production, test, development の定義を記載するため、規模の小さなアプリケーションの場合は settingslogic のほうが見通しが良くなるかもしれません。
Rails コピペで作れるバッチファイル

#はじめに
Railsを使ったバッチファイルの作り方を解説します。
基本的にコピペすればバッチファイルが作れるようになっています。
今回はちょっとオシャレに名前空間で実装しています。

##ステップ1　名前空間の設定をしよう

```rb:config/application.rb
  class Application < Rails::Application
    # config/application.rbに下記をコピペ
    config.autoload_paths += Dir["#{config.root}/lib"]
  end
```
application.rbにコピペしてください。

##ステップ2 バッチファイルを作ろう

```rb:lib/tasks/batch.rb
class Tasks::Batch
  def self.execute
    # 実行したいコードを書く
    p "Hello world"
  end
end
```
lib/tasks batch.rbファイルを作成して上記をコピペ
今回はexecuteメソッドだけですが、もちろんクラス内に複数メソッドを作成することも可能です。

##ステップ3 バッチを実行しよう

```bash
$ rails runner Tasks::Batch.execute
```
```rails runner クラス名.メソッド名```で実行できます。

以上です。３ステップでバッチファイルが作成できるRails。優秀ですね。
will_paginateをArrayで使う方法

will_paginateはArrayじゃ使えない。

will_paginate/arrayをインポートしないとダメ！

具体的な方法としては、
config/initializersの下に適当なファイル（今回は、will_paginate_fix.rb）を作って、

```rb:will_paginate_fix.rb
require 'will_paginate/array'
```

を追記すればOK。
three.js ことはじめ



# ■はじめに

3D ライブラリの three.js を動かしてみた。

Three.js 

![threejs_official.jpg](https://qiita-image-store.s3.amazonaws.com/0/27642/9570b82c-42af-51f5-ffe9-8fa6a41c7144.jpeg "threejs_official.jpg")


# ■サンプルコードの実行

最初に Github にあがっているサンプルを実行してみた。
https://github.com/mrdoob/three.js/#usage

コードの書き方が乗っているだけでサンプルとして固まっていなかったので、作成して以下にアップしました。


PC での実行例は以下
http://jsfiddle.net/f17Lz5ux/


アプリとしてはコードになかったので上記を参考に作成。

以下にコミットしています。
https://github.com/namaranran/threejs_1st_sample


そのままブラウザで表示すると以下の様にワイヤーフレームの立方体が表示されます。
これがくるくると回転するサンプルとなります。

![browser.jpg](https://qiita-image-store.s3.amazonaws.com/0/27642/46cc2b1a-2e4b-48e8-cd8f-3f7985e88c13.jpeg "browser.jpg")


Firefox OS向けにmanifestも追加しています。

``` manifest.webapp
{
  "name": "threeJS",
  "description": "threeJS demo",
  "type": "web",
  "launch_path": "/index.html",
  "locales": {
    "en-US": {
      "name": "threejs_demo,
      "description": "Web app three.js demo"
    }
  },
  "icons": {
    "128": "icon128x128.png"
  }
}
```

Firefox OSでもアプリとして動きます。
Fx0とかFlameをお持ちの方は試してみてください。

<img src="https://qiita-image-store.s3.amazonaws.com/0/27642/0fd16028-7889-7c74-730d-318e95810ecb.png" width="50%">

意外ですが、Fx0でもヌルヌルと動きます(スクリーンショットだと伝わりませんが・・・)
LinuxでもAlfredしたい！→Mutateを使おう！

# 導入

Mac OS XにはAlfredというかっこいいランチャーアプリがあります。

[Macユーザー必須の神アプリ Alfred の基本的な使い方とか設定方法とか その1（検索&アクション）](http://dev.ontheroad.jp/archives/10817)

以前Macユーザーの知り合いが使っているのを見て憧れていたのですが、自分はMacユーザーではないので諦めていました。

しかし、最近ふと思い出して調べてみたところ、LinuxでもAlfredのようなランチャーアプリはいくつかあるみたいです。

[Alfred Alternatives for Linux - AlternativeTo.net](http://alternativeto.net/software/alfred/?platform=linux)

その中でもMutateが気になったので使ってみると、結構いい感じだったので紹介します。

[qdore/Mutate](https://github.com/qdore/Mutate)


# どんな感じ？

一応アニメGIFを作ってみました。

![Mutate](http://i.gyazo.com/bf15cc318030e175371c7d05b2e5318e.gif)

さくっと表示して検索して、起動できる感じです。

# インストール

Ubuntuであればppaからインストールできます。

```console
$ sudo add-apt-repository ppa:mutate/ppa
$ sudo apt update
$ sudo apt install mutate --no-install-recommends
```

`--no-install-recommends`を忘れるとfcitxとか入ってくるので注意してください。

他にも、[リポジトリのREADME.md](https://github.com/qdore/Mutate)によるとFedoreとかでもインストール方法も乗っていたりするので参考にしてください。


# 起動方法

コマンドラインとかから、

```console
$ mutate
```

で起動します。

しかしデーモンとして起動したりするわけではないので、`~/.xprofile`とかに、

```bash:~/.xprofile
mutate &
```

と書いておくことをオススメします。

一度起動したらあとは、`Ctrl-D`で検索窓を表示できるようになります。


# 設定

検索窓で、

```
preference
```

と入れてエンターを押すと設定画面が開きます。

また、設定ファイルは`~/.config/Mutate`に保存されています。

自分でスクリプトを書いてカスタマイズすることもできるので、がんばってみてください！

参考までにボクの設定です。

[MakeNowJust/mutate-config](https://github.com/MakeNowJust/mutate-config)


# 問題点とか

2015/03/21現在のです。

  - さっきも書きましたが普通にインストールしようとするとfcitxを入れようとしてきます。これはuimユーザーとしては許しがたい暴挙ですので[Issue](https://github.com/qdore/Mutate/issues/49)を立てました。
  - 設定ファイルの保存されているディレクトリのパーミッションが微妙なのでどうにかして欲しいです。
  - 2回起動しようとすると、怒られます。これは2回ホットキーが登録されたらマズいので理解できるのですが、一度プロセスを殺してもこうなるので何だかなぁ、と。  
    一応、`rm /tmp/qipc_sharedmemory*`すれば出なくなります。
sinatraでautodoc

# APIのドキュメンテーション

今更ながらSinatraを使ったことがなかったのでWebAPIを書いてみた。
シンプルで使いやすかったです。

で、READMEをはじめ良いドキュメントがついてると良いプロダクトな気配を感じるので、
APIドキュメンテーションに挑戦。

# 調査

* アノテーション不要 -> 5分で面倒くさくなる自信がある。複数人で開発すると質がバラける
* Sinatraでつかえる -> RailsApp限定のものもちらほら
* できればGithubで簡潔 -> あれこれ見るのは面倒臭い

が希望。
[APIドキュメントを書くのが楽になるツールまとめ - Qiita](http://qiita.com/horimislime/items/32acf0f1be33a269a309)
などを参考に試してみて、最終的に**AUTODOC**に決定

# AUTODOC

7kamuraさんが公開されているgemで、テストベースでドキュメントを自動生成してくれます。

https://github.com/r7kamura/autodoc

> Rack applicationで実装されたAPIに対して、RSpecで書かれたテストを元にAPIドキュメントを生成するもの。 テストを実行すると、テスト中に発行したリクエストやレスポンス、そのテストに付けられたメッセージを元に、 良い感じに情報をまとめ、Markdown形式でAPIドキュメントを記したファイルを生成してくれる。

http://r7kamura.github.io/2013/12/01/autodoc.html

( ﾟДﾟ)ｳﾋｮｰ

# 利用開始＆例外

gem入れて、metadataに`autodoc: true`入れて、

```diff
diff --git spec/requests/hello_api_spec.rb spec/requests/hello_api_spec.rb
index 1a7698f..d24a3a1 100644
--- spec/requests/hello_api_spec.rb
+++ spec/requests/hello_api_spec.rb
@@ -12,7 +12,7 @@ describe 'hello API' do
       get entry_point
     end
 
-    it 'hello :)' do
+    it 'hello :)', autodoc: true do
       expect(json).to eq({'message' => 'hello :)'})
     end
   end
diff --git spec/spec_helper.rb spec/spec_helper.rb
index 88ecf8a..51b7545 100644
--- spec/spec_helper.rb
+++ spec/spec_helper.rb
@@ -3,6 +3,7 @@ require 'rspec'
 require 'rack/test'
 require 'json'
 
+require 'autodoc'
 
 require_relative '../app'
```

AUTODOC=1入れてGuardを実行

```
$ AUTODOC=1 RACK_ENV=development bundle exec guard
```

```irb
/path/to/project/vendor/bundle/ruby/2.1.0/gems/actionpack-4.2.1/lib/action_dispatch/http/mime_negotiation.rb:6:in `<module:MimeNegotiation>': uninitialized constant ActiveSupport::Concern (NameError)
```

OH...

# 解決策


```diff
diff --git spec/spec_helper.rb spec/spec_helper.rb
index 51b7545..cb358e3 100644
--- spec/spec_helper.rb
+++ spec/spec_helper.rb
@@ -3,6 +3,7 @@ require 'rspec'
 require 'rack/test'
 require 'json'
 
+require 'active_support/core_ext/module/concerning'
 require 'autodoc'
 
 require_relative '../app'
```
無いならrequireしてやればよい。

# できたもの

サンプルプロジェクト
https://github.com/kotatsu360/autodoc-using-sinatra
ドキュメント
https://github.com/kotatsu360/autodoc-using-sinatra/blob/master/doc/hello_api.md

```
autodocの中でrequestsというディレクトリを期待しているので、
APIのspecはそこに置いている。rails的なお約束なんだろうか。
```


# 調査中
* RailsAppだとどうなのか
* `module concern`で調べると3ファイルくらいあるけどどれがいいのか

不具合なのか使い方が悪いのか調査中
Ansible+Vagrantを利用して仮想環境(CentOS6.5)にMongoDBをインストールする

## インストール手順についてはGithubを参照
https://github.com/kilhyungdoo/ansible_mongo

## 処理の説明

#### mongodbダウンロード先を定義
~/ansible_mongo/role/mongodb/files/mongodb.repo

```
[mongodb]
name=MongoDB Repository
baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/x86_64/
gpgcheck=0
enabled=1
```

#### アカウント情報を設定
~/ansible_mongo/role/mongodb/vars/main.yml

```yaml
database_name: myapp
user_name: user1
password: 1234
```

#### mongodbをインストール
~/ansible_mongo/role/mongodb/vars/main.yml

```yaml
- name: 1. install python pymongo module.
  yum: name={{ item }} state=present
  with_items:
   - gcc
   - pymongo

- name: 2. copy mongodb.repo
  copy: src=mongodb.repo dest=/etc/yum.repos.d/mongodb.repo owner=root

- name: 3. install mongodb
  yum: pkg=mongodb-org

- name: 4. start mongodb
  service: name=mongod state=started

- name: 5. create mongo account
  mongodb_user: database={{database_name}} name={{user_name}} password={{password}} state=present
```

1. Ansibleから仮想環境CentOSに接続するためのgcc, pymongoをインストール
2. ローカル環境からインストール先情報をコピーする
3. MongoDBをインストール
4. MongoDBを起動
5. MongoDB接続するためのアカウントを追加
TAPLのML実装をRustでやってみるシリーズ「4章 算術式のML実装」

[TAPL本(Types And Programming Language、型システム入門)](http://www.amazon.co.jp/exec/obidos/ASIN/4274069117/uehaj-22/ref=nosim/)の各章にある「ML実装」の例をRustにポーティングしてみます。

まずは4章の算術式です。書籍でのtype termが保持するinfoは、ソースからパージングするわけではないので略します。いらなそうなletは省きました(OCamlでの必要性は不明)。

```rust
#![feature(box_patterns)]
#![feature(box_syntax)]

#[derive(Debug,Clone)]
enum Term {
    True,
    False,
    If(Box<Term>, Box<Term>, Box<Term>),
    Zero,
    Succ(Box<Term>),
    Pred(Box<Term>),
    IsZero(Box<Term>)
}

use Term::*;

fn is_numerical(t: &Term) -> bool {
    match *t {
        Zero => true,
        Succ(box ref t1) => is_numerical(t1),
        _ => false
    }
}

fn is_val(t: &Term) -> bool {
    match *t {
        True => true,
        False => true,
        _ => is_numerical(t)
    }
}

fn eval1(t: Term) -> Term {
    match t {
        Zero => Zero,
        If(box True, box t2, _) => t2,
        If(box False, _, box t3) => t3,
        If(box t1, t2, t3) => If(box eval1(t1), t2, t3),
        Succ(box t1) => Succ(box eval1(t1)),
        Pred(box Zero) => Zero,
        Pred(box Succ(box ref t1)) if is_numerical(t1) => t1.clone(),
        Pred(box t1) => Pred(box eval1(t1)),
        IsZero(box Zero) => True,
        IsZero(box Succ(box ref t1)) if is_numerical(t1) => False,
        IsZero(box t1) => IsZero(box eval1(t1)),
        _ => panic!()
    }
}

fn main() {
    assert_eq!(format!("{:?}", True), "True");
    assert_eq!(is_numerical(&True), false);
    assert_eq!(is_numerical(&Zero), true);
    assert_eq!(is_val(&True), true);
    assert_eq!(is_val(&If(box True,box True,box False)), false);
    assert_eq!(format!("{:?}", eval1(If(box True,box True,box False))), "True");
    assert_eq!(format!("{:?}", eval1(If(box False,box True,box False))), "False");
    assert_eq!(format!("{:?}", eval1(If(box IsZero(box Zero), box True, box False))), "If(True, True, False)");
    assert_eq!(format!("{:?}", eval1(Succ(box Succ(box Zero)))), "Succ(Succ(Zero))");
    assert_eq!(format!("{:?}", eval1(Pred(box Zero))), "Zero");
    assert_eq!(format!("{:?}", eval1(Pred(box Succ(box Zero)))), "Zero");
    assert_eq!(format!("{:?}", eval1(Pred(box Succ(box Zero)))), "Zero");
    assert_eq!(format!("{:?}", eval1(IsZero(box Zero))), "True");
    assert_eq!(format!("{:?}", eval1(IsZero(box Succ(box Zero)))), "False");
    assert_eq!(format!("{:?}", eval1(IsZero(box Pred(box Succ(box Zero))))), "IsZero(Zero)");
}
```

* boxを除けば、ほぼOCamlと同等。GCの無い言語としては、良い線に行っていると思う。
* 実行メモリモデルがまさにC/C++なので、参照と値、cloneを完璧に適切に使いわける必要がある。OCaml版では全く意識する必要がない点である。この区別をてきとうにやっておけばうまく動く、ということはない。ここがGC言語との違い。
 * もし完璧に適切に使いわけられないならば、それはコンパイルが通らないことを意味する。やりとげてみると、目から鱗の自然な形なのだが、最初わからないとつらい。根性しかない。
 * 今回の場合、match式の背後にある「暗黙の代入」、すなわちマッチ対象から各パターン、ガード、枝の本体に分配されるための代入が、それぞれムーブセマンティクスなのか、ownershipをとらない参照(&mutではない&)なのか、boxなのかrefなのかbox refなのか、そのすべてが正しく的確に指定されている必要がある。matchが展開された結果における暗黙の代入の様子を想像する力が問われる。どっかにドキュメントありますかね…。
 * Rustにおけるデータ管理は、「値」が基本になる、というのはたぶん間違いない。しかし、リアルワールドでは「値だけ」でやっていくことはできない。borrwingとclone()を適宜組合せる必要がある。
iPython上でPillowを使ってみる（その2）

## Pillowの作業フロー（その2）

1. Image.open で画像を読み込む
2. 画像をゴニョゴニョする
3. Image.save で編集した画像を保存する

では行ってみましょー。

```py3:
%pylab inline
from PIL import Image,ImageDraw,ImageFont
```

### ファイルのフォーマット変換

```py3:
# 画像を読み込み
img = Image.open('in-image/lena_std.tif')

# ファイルの情報表示
print('size    : ', img.size)
print('format  : ', img.format) 
print('mode    : ', img.mode) 
print('palette : ', img.palette) 
print('info    : ', img.info) 

pl_img = np.array(img) ; plt.imshow( pl_img ) # 表示

# ファイル形式を変換して保存（拡張子を見て自動的に判定する）
img.save('work-image/lena.jpg') 
```
![lena.jpg](https://qiita-image-store.s3.amazonaws.com/0/26107/ffce11b9-203d-4aca-697a-461d27682739.jpeg)

### 画像ファイルのサイズ変更（resize）

```py3:
img = Image.open('work-image/lena.jpg')

# ファイルの情報表示
print('size    : ', img.size)
print('format  : ', img.format) 
print('mode    : ', img.mode) 
print('palette : ', img.palette) 
print('info    : ', img.info) 

# 200*200にサイズ変更
resize_img = img.resize((200,200),Image.ANTIALIAS)

# ファイルの情報表示
print('size    : ', resize_img.size)
print('format  : ', resize_img.format) 
print('mode    : ', resize_img.mode) 
print('palette : ', resize_img.palette) 
print('info    : ', resize_img.info) 

# 変換したデータを保存
resize_img.save('work-image/resize_lena.jpg') 

pl_img = np.array(resize_img) ; plt.imshow( pl_img ) # 表示
```
![resize_lena.jpg](https://qiita-image-store.s3.amazonaws.com/0/26107/4a3b2710-12c1-b808-081c-2227234dfef4.jpeg)

### 画像のトリミング

```py3:
# 元データ（img）はすでに読みこんであるので、それをトリミング
trim_img = img.crop((64,64,448,448))

pl_img = np.array(trim_img) ; plt.imshow( pl_img ) # 表示

# トリミングしたデータを保存
trim_img.save('work-image/trim_lena.jpg') 
```
![trim_lena.jpg](https://qiita-image-store.s3.amazonaws.com/0/26107/e241084a-f8e8-f6e6-6e9f-295e5e9eaa8e.jpeg)


↓nbviewerにノートブックをあげてみました（っていうか、こっちがメイン）
[nbviewer.ipython.org/github/suto3/git-public/blob/master/python/notebook/Pillow-workflow02.ipynb](http://nbviewer.ipython.org/github/suto3/git-public/blob/master/python/notebook/Pillow-workflow02.ipynb "nbviewer.ipython.org/github/suto3/git-public/blob/master/python/notebook/Pillow-workflow02.ipynb")


↓作業環境については、こちら
[Pillow環境構築 -- virtualenvによる仮想環境、iPythonによるインタラクティブ環境 - Qiita](http://qiita.com/suto3/items/ab506c238d4b58cdfd88 "Pillow環境構築 -- virtualenvによる仮想環境、iPythonによるインタラクティブ環境 - Qiita")

[iPython上でPillowを使ってみる（その1） - Qiita](http://qiita.com/suto3/items/2232c7e6885f5d97bfec "iPython上でPillowを使ってみる（その1） - Qiita")

[iPython上でPillowを使ってみる（その3） - Qiita](http://qiita.com/suto3/items/a1770423514b4875bc09 "iPython上でPillowを使ってみる（その3） - Qiita")

いや～、iPythonは楽だw。
iOS8の実機で初めてビルドした時のUITabbarの闇

##タブバーの画像のサイズが合わない。。

iOS7では普通に動いていたのにiOS8で動かすと、アイコンがおかしくなるバグ、というか闇
アイコンサイズがおかしくなる闇、

それ、アプリを一回落として再インストールしてみてください。きっと道が開けるでしょう。

『アプリのキャッシュって本当に厄介なんだな』と、このバグで１日なやんだ僕は思うのです。
IPアドレス棚卸し_Ansibleで。

突貫ですが作ってみました。

Ansibleのhostsファイルに書かれているホストを対象として実行すると以下のように出力するだけです。
ホスト名
IPアドレス
IPアドレス
ホスト名
IPアドレス
：


事前注意としては、Ansibleのhostsファイルで
server[001:005]みたいな書き方が出来ると思いますが、その場合ちゃんと動きません。

毎月の棚卸し時、ホスト名と実際振られているIPアドレスをリストアップを自動でやれたら少しは便利かなと思いました。
IP管理表とDNSと実機って結構ずれてしまうので。
シェルはこれ

```lang:ip_list.sh
#!/bin/bash

filename=$1

while read line
do
line_name=`echo $line | grep -v "^#\|^\[" `

if [ "$line_name" != "" ];
then
    ansible -m setup $line_name | grep "ansible_hostname\| \"address\"" | awk '{print $2}' | sed -e "s/,//g" | sed "s/\"//g" | egrep -v "..:..:..:..:..:.." | egrep -v "^fe80:" | grep -v 127.0.0.1 | grep -v "0xF0000\|0xE0000\|0xEA050" | sort -r | uniq
fi
done < ${filename}
```

例として、hostsの中身を以下とします。コメントアウトされてる行やグループ行はスキップしますー
<pre>
cat /etc/ansible/hosts
[svr01-03]
svr001
svr002
 ## mainte
 #svr003

[web01-02]
web01
web02
</pre>

ip_list.shを実行します。
<pre>
/usr/local/bin/ip_list.sh > /usr/local/bin/ip_list.log
tail -f /usr/local/bin/ip_list.log
svr001
192.168.1.1
10.14.0.1
svr002
192.168.1.2
10.14.0.2
web01
172.17.1.1
10.14.2.1
web02
172.17.1.2
10.14.2.2
</pre>
辞書を生成するメタクラス(wip)

# 辞書を生成するメタクラス(wip)

(TODO: 何か使い道が思いついたら追記する)

呼び出すと辞書を返すクラスPreDict(OPreDict)を作りました

## 使い方

以下の事ができます。

- 生成
- 継承
- 併合(merge)
- 所有(own)

### 生成

辞書をクラス定義のような感覚で作成できます。

```py
class Person(OPreDict):
    name = Attribute(doc="名前")
    age = Attribute(doc="年齢")

print(Person())
# OrderedDict([('name', {'doc': '名前'}), ('age', {'doc': '年齢'})])
```

クラス定義の順序関係も保持しています。

### 継承

クラス定義なのでもちろん継承できます。

```py
class Info(PreDict):  # OPreDictではないので順序関係は保持しない
    success = Attribute()
    failure = Attribute()


class Info2(Info):
    warnings = Attribute()

print(Info2())  # {'failure': {}, 'success': {}, 'warnings': {}}
```

### 併合

複数のクラス同士を併合することができます。

```
class Student(OPreDict):
    grade = Attribute(doc="学年")


print((Student + Person)())
# OrderedDict([('grade', {'doc': '学年'}), ('name', {'doc': '名前'}), ('age', {'doc': '年齢'})])
```

### 所有

クラスを所有したクラスも生成できます。

```py
class Parents(OPreDict):
    father = Attribute(Person, doc="父親")
    mother = Attribute(Person, doc="母親")

import json
print(json.dumps(Parents(), ensure_ascii=False))
{"father": {"name": {"doc": "名前"}, "age": {"doc": "年齢"}, "doc": "父親"},
 "mother": {"name": {"doc": "名前"}, "age": {"doc": "年齢"}, "doc": "母親"}}
```

コレクションのようなものの定義はできるでしょうか？できません。(TODO:後で何か考える)

## Attributeの使い方に一工夫

今まではAttributeを単なる辞書生成用のフィールドのように見立てて使ってきましたが、
`functools.partial`を使うことでAttributeをもう少し便利にできそうです。

例えばデータ型を定義するなど。

```py
from functools import partial
Number = partial(Attribute, type="number")
String = partial(Attribute, type="string")
```

すると以下の様な感じのjsonが手に入ります。

```py
class Person(OPreDict):
    name = String(doc="名前")
    age = Number(doc="年齢")


def pp(D):
    print(json.dumps(D, indent=2, ensure_ascii=False))

pp(Person())
# {
#   "name": {
#     "type": "string", 
#     "doc": "名前"
#   }, 
#   "age": {
#     "type": "number", 
#     "doc": "年齢"
#   }
# }
```

実装は以下
https://gist.github.com/podhmo/5297214c9dc3ba57ec93
擬人化オブジェクト指向 - 第1話「MVC」

![](http://lorempixel.com/640/396/business)
フレームワーク「みんなで協力して仕事をしましょう」
モデル「はい」
ビュー「はい」
コントローラー「はい」

----
![](http://lorempixel.com/640/396/technics)
ビュー「1000円の送金の要請がありました」
コントローラー「では送金の処理をお願いします」
モデル「はい」
モデル「無事終わりしました」
コントローラー「ではユーザーに送金に成功したと通知してください」
ビュー「はい」

----
![](http://lorempixel.com/640/396/transport)
ビュー「AさんからBさんへ4000円、HさんからJさんへ8000円、その他x万件の要請がありました」
コントローラー「それぞれ処理をお願いします」
モデル「アッハイ」
モデル「DB壊れました」
コントローラー「ではユーザーに謝っておいてください」
ビュー「はい」

----
![](http://lorempixel.com/640/396/business?1)
管理者「サーバーダウンしたの知らなかったんだけど。報連相は誰の役目だっけ？」
ビュー「私じゃないです」
コントローラー「モデルです」
モデル「コントローラーです」

----
→ [擬人化オブジェクト指向 - 第2話「名前」 - Qiita](http://qiita.com/progre/items/2fe6acbc20e3585b9cba "擬人化オブジェクト指向 - 第2話「名前」 - Qiita")
android studioとrobolectricの設定


robolectricは、そのままだとandroid studioでうまく動かないので、プラグイン`Android Studio Unit Test`を利用する。

##設定

1.プロジェクトディレクトリ直下のbuild.gradleに以下を追加

```
buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:0.14.2'
        classpath 'com.github.jcandksolutions.gradle:android-unit-test:2.1.1'
    }
}
allprojects {
    repositories {
        jcenter()
    }
}
```

2.appディレクトリ下のbuild.gradleに以下を追加

```
apply plugin: 'com.android.application'

android {...}

apply plugin: 'android-unit-test'

dependencies {
    // testing
    testCompile 'org.robolectric:robolectric:2.4'
    testCompile 'junit:junit:4.+'
}
```


3.プラグインの追加
android studio -> preference -> plugins -> browse repositoryを開き、'Android Studio Unit Test'を検索しインストール

4.androidTestディレクトリの名前をtestに変更

5.appディレクトリ配下の、build.gradleファイルにafterEvaluateを追加

```
apply plugin: 'com.android.application'

android {...}

apply plugin: 'android-unit-test'

afterEvaluate {
    tasks.findByName("assembleDebug").dependsOn("testDebugClasses")
}

dependencies {...}
```

##テストの実行

1. テストの実行の設定をする。<br>
 1.  Run -> Edit Configuration -> + -> jUnit の順に選択
 2.  任意の名前をつける
 * Test KindでAll in packageを選択
 * use classpath of mod..でappを選択
 * applyをクリック
 <br><br>
 ![スクリーンショット 2015-03-21 15.50.07.png](https://qiita-image-store.s3.amazonaws.com/0/43996/72e5775a-d60b-ec95-c6b9-3d1128cd25f4.png "スクリーンショット 2015-03-21 15.50.07.png")
<br><br>

2. Robolectricに、manifestファイルの場所を教える。

 ```
@RunWith(RobolectricTestRunner.class)
@Config(manifest="./src/main/AndroidManifest.xml")
public class MyActivityTest {
	...
}
```

3. テストを実行する。 
 1. 実行ボタン(再生マーク)の横から1.で設定した名前を選ぶ
 2. 実行ボタンをクリックする。<br><br>
![スクリーンショット 2015-03-20 8.27.49.png](https://qiita-image-store.s3.amazonaws.com/0/43996/23068848-6441-dd1d-a5ed-0e2469854e65.png "スクリーンショット 2015-03-20 8.27.49.png")
sublime text 2 > Fortranコード編集中に固まるようになった > fortran.tmbundleが原因だった

動作確認

    CentOS 6.5

Fortranのコードを編集中にSublime Text2が固まるようになった。
どうもFortranのsyntaxを表示する`fortran.tmbundle`というのがある場合に固まってしまうようだ。

色々試したが、結局の所、Sublime Text3にして`MinimalFortran`というパッケージでsyntax highlightningするように変更したら固まらなくなった。

Sublime Text2でも`MinimalFortran`を試したが、こちらはsyntax highlightningにならなかった。理由はよく分からない。
javascriptで月初、月末取得

javascriptで月初、月末で取得するやり方
たいした内容ではないけど。。。
メモとして残しておく

# 月初
```js
var date = new Date();
date .setDate(1);
```

# 月末
```js
var date = new Date();
date.setDate(1);//ここ大事
date.setMonth(date.getMonth() + 1);
date.setDate(0);
```
setDateは0を指定するの前月の最終日になる。
最近知った。。。
Nginx+UnicornでRailsを動かすon Mac

#Nginx+UnicornでRailsを動かすon Mac

RailsというよりRubyビギナーです。

ローカル環境ではWEBrickでもいいかなと思ったのですが、最終的にはそうもいかなくなると思うので、商用でもイケるWebサーバーを使ってみることにしました。

最初はとっつきやすそうなApache+Passengerな環境をつくろうと思ったのですが、全然上手く動かず挫折した（未だに困ってるので助けてください←）ので、勉強がてらGithubでも採用しているらしいNginx+Unicornな環境をMac（Mavericks）につくってみました。いまっぽい。

ですが、こちらもなかなか手こずったので手順をまとめておきます。

## unicorn編

まずはgemでインストール。
（本当はbundleでインストールしたほうがいいのかな？）

```
$ gem install unicorn
```
次にunicornの設定ファイルを作成。

```
$ cd {RAILS_PROJECT_ROOT}
$ vi config/unicorn.rb
```
unicorn.rbの中身はこんな感じ。

```ruby:unicorn.rb
rails_root = File.expand_path('../../', __FILE__)
 
worker_processes 2
working_directory rails_root
 
listen "#{rails_root}/tmp/unicorn.sock"
pid "#{rails_root}/tmp/unicorn.pid"
 
stderr_path "#{rails_root}/log/unicorn_error.log"
stdout_path "#{rails_root}/log/unicorn.log"
```
そして、デーモンとして起動。

```
$ unicorn_rails -c config/unicorn.rb -E development -D
```
特にエラーが出なければOK。

ちなみに停止したい時は以下で。

```
$ kill -QUIT `cat tmp/unicorn.pid`
```
unicornの設定は以上。

## nginx編

まずは、インストール。

```
$ brew install nginx
```
そして、起動。

```
$ sudo nginx
```
http://localhost:8080
でアクセス出来ればOK。

次に設定ファイルを編集。（本当はApacheのバーチャルホスト設定ファイルとかと同じように別ファイルで管理したほうがよい）

```
$ cd /usr/local/etc/nginx
$ cp nginx.conf.default nginx.conf
$ cp nginx.conf nginx.conf.YYYYMMDD
$ vi nginx.conf
```
confファイルに以下を追記する。
パス等は適宜変更してください。

```
upstream unicorn {
        # nginxとunicornの連携
        # unicorn.rbで設定したunicorn.sockを指定
        server unix:{RAILS_PROJECT_ROOT}/tmp/unicorn.sock;
    }

server {
        listen 8081;
        server_name {PROJECTDOMAIN_FOR_LOCAL};

        root {RAILS_PROJECT_ROOT}/public;

        access_log /usr/local/var/log/nginx/{PROJECT_NAME}_access.log;
        error_log /usr/local/var/log/nginx/{PROJECT_NAME}_error.log;

        client_max_body_size 100m;
        error_page 500 502 503 504 /500.html;

        try_files $uri/index.html $uri @unicorn;

        location @unicorn {
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header Host $http_host;
                proxy_pass http://unicorn;
        }
    }    
```

nginx再起動。

```
$ sudo nginx -s reload
```
nginxの設定は以上。

## 最終確認

http://{PROJECTDOMAIN_FOR_LOCAL}:8081
にアクセスしてRailsの初期画面が表示されていればOK！

というわけで、これからRails頑張ります。

## 参考サイト
rails + nginx + unicorn連携：
http://qiita.com/shinyashikis@github/items/ace49154f0c71c65b2c9
nginx + unicorn + Rails on Mac
http://archive.aerial.st/archive/2011/06/16/nginx-unicorn-rails-on-mac
pepper Programming Tips -「もしかしてボクpepperと話すのは初めてですか？」を止める！-

pepper開発者なら、もう何度も聞かされてうんざりしているあのセリフ。

「もしかしてボクpepperと話すのは初めてですか？」

もう初めてじゃないし、正直ウザイヽ(｀Д´#)ﾉ しかも不意のタイミングで発生するのでなんとか止めたいと思ってる人への朗報です。

＜使用するボックス＞
・Text Edit
・Stop Behavior

＜使用方法＞
1) Text EditとStop Behaviorをつなぐ（あえてループさせます）
2) マウス右クリックにてロボットアプリケーションでpepper_dialog_sampleを選択し、"アプリケーションのIDをコピー"する。
3) コピーした内容をText Editにペーストし実行。
![pepper_mosikasite.jpg](https://qiita-image-store.s3.amazonaws.com/0/59491/a61333bd-d902-b273-0b43-62210209fd54.jpeg)
4)これを作成するアプリに入れておけば、もうあのセリフに悩まされないですみます。
削除するのはなんとなく怖い(?)という方にもお勧めです。
C/C++でグローバル変数（配列）を0以外に初期化すると実行ファイルが巨大になる罠

##初めに

C++はあまり詳しくないですが、ある現象を見つけたのでメモ程度に記事を書きます。
競技プログラミングなどで、出力ファイル制限があるジャッジ(yukicoderとか）などでは、気をつけましょうという記事です。

##再現コンパイラバージョン
gcc 4.8.2/clang 3.5
(g++ -O2 -o a.out main.cpp / g++ -o a.out main.cpp)


##対象のコード

これらのコードをコンパイルするだけで実行ファイルが**40MB**になります。

グローバル変数に対してリテラルで初期化しているだけです。

p[0]=0,p[1]=1,それ以外は0で初期化します。

```cpp:実行ファイルが巨大になる例1
int p[10000000]={0,1};
int main(){
} 
```

p[0]=1それ以外0で初期化するのも同様です。

```cpp:実行ファイルが巨大になる例2
int p[10000000]={1};
int main(){
} 
```

ただし、すべて0で初期化する場合は例外で、巨大な実行ファイルにならないようです。(a.outは4KBほど）

```cpp:実行ファイルが巨大にならない例1
int p[10000000]={0};
int main(){
} 
```


##回避コード

ローカル変数で宣言したり、

```cpp:実行ファイルが巨大にならない例2
#include <iostream>
using namespace std;


int main(){
    int p[10000000]={1};
    
    cout<<p[sizeof(p)/sizeof(p[0])-1]<<endl;
} 

```


他にありましたら、教えてください。
h2suzukiさんにコメントでご指摘いただきました。
fillはしなくてもいいそうです。
コメント欄もぜひご覧ください。


```cpp:実行ファイルが巨大にならない例3
#include <iostream>
using namespace std;

int p[10000000]={};

int main(){
    p[0] = 1
    cout<<p[sizeof(p)/sizeof(p[0])-1]<<endl;
} 

```


##まとめ

ファイル制限のあるジャッジ/オンラインコンパイラだと、コンパイルエラー(CE)になるとおもいますが。
エラーメッセージも以下の様な感じで、ユーザーからは原因見つけるのが面倒そうな気がします。

```text
g++: internal compiler error: File size limit exceeded (program as)
Please submit a full bug report,
with preprocessed source if appropriate.
See <http://bugzilla.redhat.com/bugzilla> for instructions.
```

##参考資料

「セクションとか.textとか」
http://www.ertl.jp/~takayuki/readings/info/no02.html
（診断人さんありがとうございます）
Google Cloud Storage でのCORSの設定



# バケットの現在のCORSの設定を取得する
```
gsutil cors get gs://example
```


# バケットにCORSの設定JSONを食わせる

```
gsutil cors set cors-json-file.json gs://example
```

## CORS設定のJSONファイル

```
[
  {
    "origin": [
      "http://localhost:3000",
      "http://www.hoge.com",
      "https://www.hoge.com"
    ],
    "responseHeader": [
              "Content-Type",
              "Accept", 
              "X-Requested-With",
              "Access-Control-Allow-Credentials"
              ],
    "method": [
      "GET",
      "OPTIONS"
    ],
    "maxAgeSeconds": 60
  }
]
```