OmniAICreator/Qiita-1.07M huggingface dataset:
Laravel5.1.11で追加されたGateを試してみる(その3)

# 概要
Laravel5.1.11で追加されたGateを試してみる(その2)の続き。
http://qiita.com/inaka_phper/items/c584904bb39673e2dc16

今回は以下の要件を満たすための処理を追加する。
8. 管理者権限を持ったユーザーは全投稿に対して全操作が可能

実装方法としては、`Gate`の`before`を利用して
これまでPolicyで設定したチェックが走る前に、管理者権限のチェックを行い
管理者であれば常に権限あり。
管理者でなければ、引き続き通常の権限チェックが走る。
という感じになる。

# beforeを使うためにLaravel 5.1.16にアップデートする
2015.9.13現在、ドキュメントにはAuthorization5.1.11以上で使えると書いてあるが
一部機能は5.1.12には含まれていないようで最新版にアップデートしないと使えないものがあったので
`composer update`で5.1.16へアップデートしました。

# コードを実装する。

## usersテーブルに管理者フラグを追加
マイグレーションでadminカラムを追加した。
`php artisan make:migration modify_users_admin_column`

[実際のサンプルコード](https://github.com/inaka-phper/laravel-role/commit/17d87f1b3cf2f05f76dd4a46d43665d80484215f)

```2015_09_13_053509_modify_users_admin_column.php
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::table('users', function ($table) {
            $table->boolean('admin')->default(0)->after('remember_token');
        });
    }
```

## Userに管理者か確認用のisAdminを追加する
Userオブジェクトでユーザーの管理者権限を判別するisAdminを追加。
単純にadminカラムの内容から判別するようにする。

[実際のサンプルコード](https://github.com/inaka-phper/laravel-role/commit/e372904192e8e1e47bb54fa36a473aa1f64d6e20)

```User.php
    /**
     * 管理者権限の有無をtrue/falseで取得
     * @return bool
     */
    public function isAdmin()
    {
        return $this->admin == 1;
    }
```

## 管理者の場合、無条件で全部権限を与える。
今回はPolicy関係なく全権限ありにするので、`AuthServiceProvider`に追加して
大本から一括で管理者権限チェックを行う。

`$ability`には定義した名前(今回ならcreate/update/delete)が入ってくるので
よくあるrole方式で編集権限、削除権限という単位で分ける場合
`$ability`の内容を元に処理を分けてあげればよい。

[実際のサンプルコード](https://github.com/inaka-phper/laravel-role/commit/2b9f1efe9da3151b5aef299350e3798db236e2cb)

```AuthServiceProvider.php
    /**
     * Register any application authentication / authorization services.
     *
     * @param  \Illuminate\Contracts\Auth\Access\Gate  $gate
     * @return void
     */
    public function boot(GateContract $gate)
    {
        parent::registerPolicies($gate);

        // 8.管理者権限を持ったユーザーは全投稿に対して全操作が可能
        $gate->before(function ($user, $ability) {
            if ($user->isAdmin()) {
                return true;
            }
        });
    }
```

# その他の記述方法
beforeはPolicyにも記述することができ、Policyに記述した場合はPolicy単位で事前チェック行うことができる。

> 2016.9.1追記
> beforeはLaravel側で`is_null()`で判定されるため、nullを返すように変更しました。

```CommentPolicy.php
    /**
     * 管理者の場合、Commentに対する権限をすべて付与
     * @param $user
     * @param $ability
     * @return mixed
     */
    public function before($user, $ability)
    {
        return $user->isAdmin() ? true : null;
    }
```

# 両方に記述した場合の優先順位
`before`は`AuthServiceProvider`にも`Policy`にも書くことができる。
Policyを利用で両方書いた場合の優先順位は想像通り以下の順番。

1. AuthServiceProvider@before
2. Policy@before
3. 通常の処理

どこかで`true`を返したら以降の処理は走らない。
この順序を把握して、うまく使い分けてあげるとよさそうです。

# 次回
基本的な使い方はこれぐらいっぽいですね。

次回は複数のPolicyを走らせるっぽい`allows`を試してみたいと思います。
完全無料でカスタムドメインWordPressを運用する方法（OpenShift編）(Git使用者向き)

## まずは結果を確認
[こんなサイト](http://www.gaddictech.net/free-wordpress-openshift-git)を作れます。
内容はこの記事と同じものです。

## はじめに
この記事はGitの使用方法についてある程度理解している人向けです。
Gitって何？早くWordPress使わせろっていう人はググりながら進めるか、
新しい記事を書きますのでそれをお待ちください。

## なぜOpenShiftか
2015年5月にHerokuの無料プランが変更になりました。
無料プランの制限や環境を以下にまとめました。

|項目|OpenShift|Heroku|
|:--|:--|:--|
|無料プラン|制限なし|1日18時間まで|
|MySQL使用|1GBまで|5MBまで<br>クレジットカード登録必要|
|構築の容易さ|非常に簡単（ほぼワンクリック）|設定が必要|

また、WordPressを簡単に開設できるサービスでは、
運営会社の広告が入ってしまうことがあります。
自分の広告を自由に貼るためにも、自分専用のWordPressを運用しましょう。
**時代はPaaSです**

## 導入方法
基本的なステップは4つです。

1. 準備（Git、OpenShift、カスタムドメイン）
2. WordPressを編集してpush
3. (任意)phpMyAdminを編集してpush
4. カスタムドメインの設定

### 0.ゴール
---
最終的なファイルの配置を先に示しておきます。
phpフォルダは.gitと同じ階層に新規作成します。
myadminフォルダはphpフォルダ直下に新規作成します。

```ファイルの配置
php
├ myadmin
  ├ doc
  ├ examples
  ...
├ wp-admin
├ wp-content
├ wp-includes
├ license.txt
...

```



### 1.準備
---
1. Gitのインストールをしましょう。方法はGoogleで
2. OpenShiftのアカウント作成。
	3. phpアプリケーションを作成
	4. MySQLを追加
	5. Source Codeに記載されている "ssh:〜" をCloneする
6. カスタムドメインの取得
	7. tkドメインを[取得](http://www.dot.tk/ja/index.html)
	8. 登録時は一旦 "URL Forwarding" に適当な文字を入れておいてください
	8. 方法はGoogleで（捨てメールアドレスを作成すると良いかも）

### 2.WordPressを編集してpush
---
1. WordPressの[ダウンロード](https://ja.wordpress.org/)
2. phpフォルダ内に展開
3. `wp-config-sample.php`を`wp-config.php`にリネーム
4. `wp-config.php`の'DB_NAME'あたりを[これ](https://gist.github.com/Gaddict/3ca4ecd79f856bf26050)に書き換え
5. push

おめでとうございます。
この段階でもうWordPressは動きます。
カスタムドメインの設定やphpMyAdminの設定をする方はもうひと踏ん張りしましょう。

### 3.phpMyAdminを編集してpush
---
1. phpMyAdminの[ダウンロード](https://www.phpmyadmin.net/downloads/)
2. php/myadminフォルダに展開
3. php/myadmin直下の`config.inc.php`の$cfg['Servers'][$i]['host']あたりを[これ](https://gist.github.com/Gaddict/85f7df8db9b5af315319)に書き換え
4. push

### 4.カスタムドメインの設定
1. OpenShiftの設定
	2. Applications画面で作成したアプリを選択
	3. foo-bar.rhcloud.comの横にある小さい "change" をクリック
	4. Domain nameに取得したドメイン（wwwを頭につける） `例：www.example.tk`
5. DNSの設定
	6. Dozensに[アカウント作成](https://dozens.jp/)
	7. ドメイン設定後、レコードを作成
	8. Record Name `www`、Type `CNAME`、 Content `foo-bar.rhcloud.com`
9. tkドメインの設定
	10. 管理画面にログイン
	11. Domains > MyDomains > テーブルの右側のManage Domain
	12. Management Tools > NameServers
	13. Use custom nameservers (enter below)を選択
	14. DozensのNameServerを書く（NS1.DZNDNS.COM〜NS4.DZNDNS.COM）
	15. Change Nameserversをクリック

## 参考サイト
OpenShiftでWordPressを動かす方法の詳細は下記サイトを参考にしました。
[PaaS で動かす WordPress ＋ OpenShift 入門](http://www.cyokodog.net/blog/wordpress-openshift)

DNSに関して不明点があればコメントをお願いします
TypeScript1.6 + React 書いてみてハマったポイントとか

JSX がサポートされた TypeScript 1.6 がいよいよ beta になったので，いくつかの趣味プロジェクトに投入してみた感想です．

[TypeScript 1.6.0-beta 変更点](http://qiita.com/vvakame/items/072fa78f9fe496edd1f0)

バグを踏むことも無く，基本的には JSX のときと同じように書けました．付けなければいけない props の指定し忘れや state の型の間違いが無いかをコンパイラがチェックしてくれます．React にも props をバリデーションするなどの機能はありますが，コンパイル時にそのあたり見てくれると便利．

Real world example のうちの1つとして，Electron 向けの埋め込みブラウザのコンポーネントを TypeScript + React で書きました．commonjs モジュールで ES5 向けにコンパイルした後，browserify で結合する感じです．

https://github.com/rhysd/react-embedded-browser/blob/master/src/main.tsx

基本的な使い方はもっと以前に試しておられる方がいらっしゃるのでそちらを見てもらえれば使い方は変わっていないので大丈夫です．

[React JSX with TypeScript(1.6)](http://qiita.com/Quramy/items/70f97e68d21859d91ed8)

ここでは微妙にハマったポイントとか今後の改善ポイントとか，実はこれもっとうまく書けるんじゃないのかなとか思った箇所を5点書きます．

## インポート文

React に限りませんが，TypeScript のインポート文は ES6 のそれとデフォルトインポートの挙動が少し異なっています．

```javascript
import React from 'react'
```

```typescript
import * as React from 'react'
```

## 特別な意味のある props の定義

React コンポーネントは型定義が `React.Component<Props, State>` となっているため，ノードを一意に特定するための `this.props.key` という property や，子ノードを表す `this.props.children` といった property も現状手で型定義する必要があります．

```typescript
interface Props {
    key?: string;
    children?: React.ReactElement<any>[];
}
```

これはもっと react.d.ts が良くなって，`interface Props extends React.PropsBase` みたいに書けば自動で定義してくれるようになるとうれしいなと思います．

## ref の定義

react.d.ts における `this.refs` の型定義は現状 `refs: { [key: string]: React.Component<any, any> }` となっているため，`this.refs.foo` のような書き方ができず，`this.refs['foo']` と書く必要があるようです．これは良くない…

個人的にはコンポーネントの型が `React.Component<Props, State, Ref>` になって，`interface MyRefs {foo: some_type}` みたいに書けるのが良さそうに思います．

また，上記の props の問題と同様に，自前で定義したコンポーネントの `Props` の定義の中に `ref` メンバを含めておかないと，そのコンポーネントを使う側では `ref="..."` のように指定できません．なお，デフォルトで使える `<div>` などの要素は `ref` が定義されているため気にする必要はありません．

```typescript

interface Props {
    ref: string;
}

class MyComponent extends React.Component<Props, {}> {
    // ...
}

// ここで ref を使うには上記の Props 内の定義が必要

class SomeComponent extends React.Component<{}, {}> {

    // ...

    render() {
        return <MyComponent ref="foo"/>;
    }
}
```

## `onClick` などのイベントの型

`onClick` などのイベントは React の event wrapper である `React.SyntheticEvent` になります．これは元々 React がそういう wrapper を用意しているので当たり前といえばそうですが，今までと同じ調子で `MouseEvent` を指定してしまいコンパイラに怒られました．

## デフォルトプロパティ

React + ES6 では，`defaultProps` というプロパティをコンポーネントのコンストラクタに追加することで props の指定が無かった場合に React がデフォルトの値を props に書き込んでくれます．[React のドキュメント](https://facebook.github.io/react/docs/reusable-components.html#es6-classes) に載っています．

TypeScript でもこれは static メンバ変数として書けます．

```typescript
interface CounterProps {
    count?: number;
}

class Counter extends React.Component<CounterProps, {}> {
    public static defaultProps = {count: 0};

    // ...
}
```

ただ，`defaultProps` の型と `CounterProps` の間の整合性はコンパイラはチェックしてくれません．（例えば `count` を `cont` にタイポしていてもコンパイラは気づきませんし，`count: "42"` のように型を間違えていても気づきません）

このあたり react.d.ts をもっとうまく書けば良い感じにチェックしてくれるようになるのかな…

## まとめ

TypeScript 1.6 が beta になったので試しに使ってみました．react.d.ts の定義がまだ改善の余地があるなという感じですが，基本的にはかなり快適に使えていて babel で JSX 使うよりも書きやすいなぁという印象です．
Laravel個人的メモ

**◆発行されたクエリの確認**

    DB::getQueryLog();

これを、var_dump()なりLog::info()なりで出力して確認

**◆ビュー（bladeファイル）内で、コメント**
※画面上見づらいがハイフン２つ

    {{-- コメント --}}


**◆（コントローラから渡された変数でなく）ビュー（bladeファイル）内だけで、変数をセットしたい場合の記述**
※画面上見づらいがハイフン２つ

    {{-- */ ●●● /* --}}


例

    {{-- */ $foo = "var"; /* --}}

実質
<?php $foo = "var"; ?>
と書くのと同様

**◆バッチ**
start/artisan.phpにバッチ名を登録
↓
commands/配下にバッチ配置し、fireファンクション内に、処理を記述。
↓
コマンドラインからの起動

    php artisan batch:hogehogeBatch


**◆ビルトインサーバー起動**

    php artisan serve --host x.x.x.x --port xxxx
rails 初期設定メモ

## server build
### development server build command

```bash
rake db:migrate
rails s -p $PORT -b $IP
```

### protenction server build commands

```bash
rake db:migrate RAILS_ENV=production
rake assets:clean RAILS_ENV=production
rake assets:precompile RAILS_ENV=production
RAILS_SERVE_STATIC_FILES=true rails s -p $PORT -b $IP -e production
```
railsをWeblickサーバーで、production環境でサーバーを立てても、public/asstsを読み込んでくれない。
development環境なら、問題なく動作する。

これの原因は、```config/environments/production.rb```の中の

```ruby
config.serve_static_files = ENV['RAILS_SERVE_STATIC_FILES'].present?
```
の部分である。

どうやら、```config.serve_static_files```の部分に```true```がわたることによって、```public/assets```を読み込んでくれる。理由はわからない。

```ENV['RAILS_SERVE_STATIC_FILES']```の記述からわかるように、

```bash
export RAILS_SERVE_STATIC_FILES=true
```
でも同様に動作する。

なお、railsの方では、変数が存在しているか確認しているだけなので、

```bash
export RAILS_SERVE_STATIC_FILES=false
```
でも、同様の挙動を示す。


以前の環境に戻すには、

```bash
unset RAILS_SERVE_STATIC_FILES
```

をしてあげる必要がある。

## devise install時、参考にしたdevise.ja.yml
https://gist.github.com/yhara/606476
http://easyramble.com/rails-devise-ja-yml.html (こっちの方がよさそう)

## rails_secret_token をデプロイ時に自動生成する、スクリプト
http://railstutorial.jp/chapters/static-pages?version=4.0
の「リスト 3.2 秘密トークンを動的に生成する。」

```ruby:config/initializers/secret_token.rb
# Be sure to restart your server when you modify this file.

# Your secret key is used for verifying the integrity of signed cookies.
# If you change this key, all old signed cookies will become invalid!

# Make sure the secret is at least 30 characters and all random,
# no regular words or you'll be exposed to dictionary attacks.
# You can use `rake secret` to generate a secure secret key.

# Make sure your secret_key_base is kept private
# if you're sharing your code publicly.
require 'securerandom'

def secure_token
  token_file = Rails.root.join('.secret')
  if File.exist?(token_file)
    # Use the existing token.
    File.read(token_file).chomp
  else
    # Generate a new token and store it in token_file.
    token = SecureRandom.hex(64)
    File.write(token_file, token)
    token
  end
end

SampleApp::Application.config.secret_key_base = secure_token
```

SampleAppの部分は、適宜自分のアプリケーション名に変更してください

## railsのタイムゾーンについて
railsのアプリを開発していると、ローカルタイムがアメリカにやヨーロッパになっていたりした時があったので、それの変更方法
* http://ruby-rails.hatenadiary.com/entry/20141217/1418817120#activesuppor-time-all-and-local-timezones
* http://yamacent.hatenablog.com/entry/2015/04/24/172148
* http://b.pyar.bz/blog/2014/10/27/rails-timezone/
* http://kanonji.info/blog/2014/08/12/utc%E3%81%AA%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%81%A8mysql%E3%81%A8%E3%81%A7%E4%BD%BF%E3%81%86rails%E3%81%AE%E6%99%82%E9%96%93%E3%81%AE%E6%89%B1%E3%81%84%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/
この辺りが参考になる。

具体的方法は、

```ruby:config/application
module Workspace
  class Application < Rails::Application
    config.time_zone = 'Tokyo'
    config.i18n.default_locale = :ja
  end
end
```

のように、```time_zone ```と、```default_locale ```に書き換えること。
それと、
http://weblabo.oscasierra.net/centos6-timezone-1/
にあるように、OS自体のタイムゾーンも変更する必要があるみたい。

```bash
cp /usr/share/zoneinfo/Japan /etc/localtime
```

実行すると、railsがjapan/Tokyoで認識してくれる。
Electronアプリからファイルをダウンロード

Electronアプリからファイルをダウンロードする方法です。
自分好みのPushbulletクライアントを作成する途中で必要になりました。
# 前提
・PushbulletのAPIだとpushしたファイルのURLをの形式で取得できます。このファイルをElectronアプリ上で取得してローカルに保存します。

```
https://dl.pushbulletusercontent.com/<ID文字列>/<ファイル名>
```

・Mac環境でのみ確認しています。
・とりあえず次の拡張子で動作確認しています：txt,xml,svg,jpg,png,pdf,key,zip
# 方法
```
let request = require('request');

// ①
request(url, {
    encoding: 'binary'
}, (error, response, body) => {
    if (!error) {
        let remote = require('remote');

        // ②
        let lastSavePath = window.localStorage.getItem('lastSavePath') || '';

        // ③
        remote.require('dialog').showSaveDialog({
            defaultPath: lastSavePath + filename,
            title: 'Download File',
            filters: [{
                name: "File",
                extensions: [filename.split('.').pop()]
            }]
        }, (filePath) => {

        	// ④
            if (filePath) {
                let fs = require('fs');

                // ⑤
                let savedFileName = filePath.split('/').pop();
                window.localStorage.setItem('lastSavePath', filePath.replace(savedFileName, ''));
                fs.writeFile(filePath, body, 'binary', (err) => {});
            }
        });
    }
});
```

①. requestでurlにアクセスしてエラーが返ってこなければファイルの保存処理に進みます
②. lastSavePathは前回ファイルを保存したパスです。⑤で設定しています。
③. オプションを設定して保存ダイアログを呼び出します

- defaultPath: 保存先の初期パス　ファイル名まで指定しないと"名称未設定"で初期表示
- title: ダイアログのタイトル
- filters: nameとextensionsは必須のパラメータ
- name: 意味はよくわからない。今回の使い方ではなんでもいいっぽい
- extensions: ファイルの拡張子

④. 保存ダイアログでOKされたら保存先パスがfilePathに入ります。
　 キャンセルされるとundefinedです。
⑤. 保存されたファイル名をsavedFileNameに取得します。
　 filePathからファイル名を除いて保存先パスをlocalStorageに入れておきます。
　 '/'で分割しているのでWindowsだとうまく動かないかも。

# 参考URL
[Electron の dialog モジュールを使ってみる](http://nhamada.hatenablog.com/entry/2015/05/24/210639)
unity > string型変数 > 書式指定子 / CRLF付きにする > string text = "hello" + System.Environment.NewLine;

```txt:動作確認
Unity 5.1.3-f1 on MacOS X 10.8.5
```

<CR><LF>付きのstringにするには以下のようにする。

```
string text = "hello" + System.Environment.NewLine;
```
バインド値によってDataGridに表示する画像を変更する

例えばWPFだけで性別によって表示する画像を切り替えたいという時に使います。

まずデータを格納する名前と性別もったPersonクラスを作成。

```C#:Person.cs
class Person
{
    public string Name { get; set; }
    public string Gender { get; set; }
}
```

MainWindow.xaml.csはサンプルデータを3件作り、DataGridにセットするだけ。

```C#:MainWindow.xaml.cs
public MainWindow()
{
    InitializeComponent();
    var data = new ObservableCollection<Person>
    {
        new Person { Name="田中太郎", Gender="M" },
        new Person { Name="山田花子", Gender="F" },
        new Person { Name="鈴木一郎", Gender="M" },
    };
    this.dataGrid.ItemsSource = data;
}
```

画像の分岐はImage.Styleを使います。

```XAML:MainWindow.xaml
<Grid>
  <DataGrid Name="dataGrid" AutoGenerateColumns="False">
    <DataGrid.Columns>
      <DataGridTextColumn Binding="{Binding Path=Name}" Header="Name" />
      <DataGridTemplateColumn Header="Gender">
        <DataGridTemplateColumn.CellTemplate>
          <DataTemplate>
            <Image>
              <Image.Style>
                <Style>
                  <Style.Triggers>
                    <DataTrigger Binding="{Binding Gender}" Value="M">
                      <Setter Property="Image.Source" Value="Resources/man.png"/>
                    </DataTrigger>
                    <DataTrigger Binding="{Binding Gender}" Value="F">
                      <Setter Property="Image.Source" Value="Resources/woman.png"/>
                    </DataTrigger>
                  </Style.Triggers>
                </Style>
              </Image.Style>
            </Image>
          </DataTemplate>
        </DataGridTemplateColumn.CellTemplate>
      </DataGridTemplateColumn>
    </DataGrid.Columns>
  </DataGrid>
</Grid>
```

階層が深くてわかりにくいですが、実際には下記で表示する画像をセットしています。

```XAML
<DataTrigger Binding="{Binding Gender}" Value="M">
  <Setter Property="Image.Source" Value="Resources/man.png"/>
</DataTrigger>
<DataTrigger Binding="{Binding Gender}" Value="F">
  <Setter Property="Image.Source" Value="Resources/woman.png"/>
</DataTrigger>
```

今回の値は「M」と「F」を想定していますが、もし「X」等のそれ以外の値の場合はどうなるかというと空欄になります。

実際に実行した際の画面は次のようになります。
![スクリーンショット 2015-09-06 22.15.55.jpg](https://qiita-image-store.s3.amazonaws.com/0/24516/f31a4f0f-22db-92c6-2352-281bd864672d.jpeg "スクリーンショット 2015-09-06 22.15.55.jpg")
Ruby-Processing 画像の一部を切り取って描画


画像の一部を切り取るサンプルです。
マウスカーソルで切り取る画像の位置を指定しています。

![clip.gif](https://qiita-image-store.s3.amazonaws.com/0/1900/a4e08491-3379-6163-b305-666da56e60ee.gif "clip.gif")

```ruby:clip.rb
# 矩形サイズ
SIZE = 30

def setup
   size 300, 300

   @image = load_image('./image/study_daigakusei_man.png')
   @image.load_pixels

   # 切り取ったイメージの格納先
   @clipimage = create_image(SIZE, SIZE, ARGB)
end

def draw
  background 255
  image(@image, 0, 0)

  stroke 255, 0, 0
  no_fill
  rect_mode CENTER
  rect mouse_x, mouse_y, SIZE, SIZE

  # 矩形内のピクセルを @clipimage にコピー
  for i in 0..SIZE-1
    for j in 0..SIZE-1
      x = mouse_x - SIZE/2 + j
      y = mouse_y - SIZE/2 + i
      p = y * @image.width + x
      if x <= @image.width && 0 <= p && p < @image.width * @image.height
        @clipimage.pixels[i * SIZE + j] = @image.pixels[p]
      else
        @clipimage.pixels[i * SIZE + j] = color(255, 255, 255)
      end
    end
  end
  @clipimage.update_pixels

  # 切り取ったイメージを描画
  image(@clipimage, 200, 200)
  stroke 0
  rect 200+SIZE/2, 200+SIZE/2, SIZE, SIZE
end
```

コマンドラインから次のように実行します。

```
$ rp5 run --nojruby clip.rb
```



## 参考

- rp_samples/samples/processing_app/topics/image_processing/edge_detection.rb
  - Ruby-Processing 付属のサンプル

## 素材

- [かわいいフリー素材集 いらすとや](http://www.irasutoya.com/)
WPF UIのプロパティをグローバル変数として扱う

小ネタ。

お前のMVVMのやり方がおかしいと言われそうな話だけど、UIのプロパティを、グローバル変数のように、どこのクラスからでもアクセスしたいと思ったので、それ用のやり方を作った。
Staticおじさんである。


こういうクラスを作り、

```csharp:filename
    public class GenericBinding<T> : GalaSoft.MvvmLight.ViewModelBase
    {
        public GenericBinding(FrameworkElement ui, DependencyProperty dp)
        {
            this.Value = (T)ui.GetValue(dp);
            AddBinding(ui, dp);
        }

        public GenericBinding<T> AddBinding(FrameworkElement ui, DependencyProperty dp)
        {
            var binding = new Binding();
            binding.Source = this;
            binding.Mode = BindingMode.TwoWay;
            binding.Path = new PropertyPath("Value");           
            ui.SetBinding(dp, binding);
            return this;
        }

        public Action<T> ChangeValueAction { get; set; }

        T _value;
        public T Value
        {
            get
            {
                return _value;
            }
            set
            {
                if (_value.Equals(value)==false)
                {
                    _value = value;
                    RaisePropertyChanged("Value");
                    if (ChangeValueAction != null) ChangeValueAction(_value);
                }
            }
        }
    }
```

こういう感じの静的クラスを作り、

```csharp:filename
    public static class State
    {
        public static GenericBinding<double> MaxImageViewNum { get; set; }
        public static GenericBinding<string> NameText { get; set; }
    }
```

WPFのコードビハインドで、登録を行います。
XAML上で、UIオブジェクトには名前をつけて、DependencyPropertyは適切なものをつけてください。

```csharp:filename

    public partial class MainPage : UserControl
    {
        public MainPage()
        {
            InitializeComponent();      

            State.MaxImageViewNum = new GenericBinding<double>(numericUpDown1, NumericUpDown.ValueProperty);
            State.NameText = new GenericBinding<string>(textBlock1, TextBlock.TextProperty);
        }
     }
```

使い方は、State.MaxImageViewNum.Valueという感じで、どこからでも呼び出せ、値の更新もUIに反映されます。
乱用するとおかしなことになるのでしょうが、複数のオブジェクトで使う設定などには便利だと思います。
案外、今のソースでは書き換え可能になっていますが、ReadOnly版の方が便利かもしれません。
PostgreSQLコマンド覚え書き

いつも忘れがちなPostgreSQLコマンド。
Railsで使うために最低限ユーザーとデータベースを管理できるように。
コマンド探しで困ったら↓。
[PostgreSQL クライアントアプリケーション リファレンス](https://www.postgresql.jp/document/9.4/html/reference-client.html)

ターミナルからのコマンド
`$ psql -l` <- データベース一覧を表示

`$ cresteuser (ユーザー名)` <- ユーザー作成
`$ dropuser (ユーザー名)` <- ユーザー削除
`$ createdb (データベース名)` <- データベース作成
`$ dropdb (データベース名)` <- データベース削除
[参考記事](http://www.develop-memo.com/database/postgresql/postgresqloperate.html)

ユーザー一覧を見たい時はデータベースに接続して確認する
` $ psql (データベース名)`　<- データベースに接続
`(データベース名)-#` <- psqlのメタコマンドに切り替わる
`(データベース名)-# \du` <- ユーザー一覧を表示
`(データベース名)-# \q` <- psqlのメタコマンド終了
[参考記事](http://ossfan.net/setup/postgresql-06.html)
OSX で Fluid のアプリを定期的に開いて Session の有効期限を更新する。

# 最近あったちょっと不便なこと

私は [JXA で Google Chrome を Incognito Window (シークレットモード) で開き直す](http://qiita.com/kitsuyui/items/629aefb2fc9940dd45bf) でも述べているように、
頻繁に使うサイトは Fluid で専用アプリ化している。

ところで、各サイトはそれぞれログイン機能を持っていて Cookie で Session を保持している。
それぞれの Session には有効期限がある。
短いもので 30 分間、長いものでは数ヶ月くらいアプリを立ち上げないでいると有効期限が切れてしまう。

アプリをしばらく起動しないでいると、ログインからやり直しになってしまう。
こんな時にまたパスワード入力するのは面倒くさい。
2 段階認証をオンにしているサービスもあるので、手間も 2 倍になる。

(もちろんこれは Fluid だからということではなく、あらゆるブラウザで起きる話。)

# 対処

そこで、信用できるローカル環境では、しばらく開く予定のない場合も定期的にアプリを立ち上げることにする。
定期的に立ち上げれば、まともなサイトならページを読み込むたびに Session の有効期限が延びる。
次のような方針を考えてみた。

## 方針

- 対象のアプリに対してそれぞれ
  - 現在、起動していればスキップ
  - 起動していなければ
     - すぐに起動する。
     - 読み込みが完了する程度の時間を待機する。 (とりあえず決め打ちで 2 秒とした)
     - 終了する。
- ↑ を各アプリに対してシェルスクリプトで実行する。
- ↑ を定期実行する。

# 実装

せっかくなので、また JXA をつかって次のようなスクリプトを作って対処してみた。

```js:reloadSession.js
#!/usr/bin/env osascript -l JavaScript

function run(argv) {
  argv.forEach(function (appName) {
    reloadSession(appName);
  });
}

function reloadSession(appName) {
  if (isAppWaking(appName)) {
    console.log('Skipping:\t' + appName);
    return;
  }
  var app = Application(appName);
  console.log('Reloading:\t' + appName);
  restartApp(app, 2.0);
}

function isAppWaking(appName) {
  var se = Application('System Events')
  return se.processes[appName].exists()
}

function restartApp(app, duration) {
  if (typeof duration === 'undefined') {
    dulation = 0;
  }
  delay(duration);
  return app.quit();
}
```

```bash:reloadApps.sh(サンプル)
#!/usr/bin/env bash
./reloadSesion.js \
 'Qiita' \
 'AWS' \
 'GitHub' \
 'Bitbucket' \
 'Ikaring'
```

※ Ikaring とは [イカリング](https://splatoon.nintendo.net/sign_in) のこと。

# 定期実行

OSX での定期実行については launchd に登録すればいい。
plist を書くのが億劫なときは、 [plist ファイルの代わりに YAML を使ってみた](http://qiita.com/kitsuyui/items/d254d3f0ba84c6a5d04d) のやり方で簡単に書ける。

# 余談

なお、これを 1 日 1 回のペースで実行することにした。

有効期限が 30 分のものは、ブラウザを開いている間にも切れてしまうことがある。
なので、 Fluid の各アプリに仕込める User Script に 10 分ごとのリロード設定を追加してある。

他のアプリでも開きっぱなしかつ、ずっとリロードしないでいれば同じことが発生しうる。
【Unity】実行するだけでなぜか変更されてしまうファイル

Unityでコミットするときに手を付けてないファイルが変更されていたのでメモ。

Assetsのprefabやマテリアルをスクリプトで直接変更すると、実行するたびにそのファイルが変更されてしまいます。
以下のスクリプトだと実行するたびにAssets/Resouces/Cube.prefabがX方向に移動してしまいます。


```csharp:ObjectMove.cs
// ※ダメな例
using UnityEngine;
public class ObjectMove : MonoBehaviour
{
	// 初回更新
	void Start()
	{
		// Assetsのprefabを読み込み
		GameObject prefab = Resources.Load( "Cube" ) as GameObject;

		// 読み込んだprefabをX方向に移動
		prefab.transform.position += new Vector3( 1.0f, 0.0f, 0.0f );
	}
	
}

```



Assetsのファイルは直接変更せず、Instantiateで生成したオブジェクトを変更すれば大丈夫。


```csharp:ObjectMove.cs
// ※こっちだと大丈夫
using UnityEngine;
public class ObjectMove : MonoBehaviour
{
	// 初回更新
	void Start()
	{
		// Assetsのprefabを読み込み
		GameObject prefab = Resources.Load( "Cube" ) as GameObject;

		// インスタンス
		GameObject cube = Instantiate( prefab );

		// X方向に移動
		cube.transform.position += new Vector3( 1.0f, 0.0f, 0.0f );
	}
	
}
```

## InspectorでAssetsのファイルをアタッチするときも注意

Resources.Loadだと気が付きやすいのですが、InspectorでAssetsのファイルを直接アタッチ場合でも同様のことが起こるので注意

![Instpector.png](https://qiita-image-store.s3.amazonaws.com/0/89022/43bc4b20-49e9-eaec-14c7-b6f382d7ecc7.png)


こっちも以下のようなスクリプトだと実行するたびにどんどんX方向に移動してしまいます...

```csharp:ObjectMove.cs
// ※ダメな例
using UnityEngine;
public class ObjectMove : MonoBehaviour
{
	// Inspectorでアタッチしたオブジェクト
	public GameObject prefab;

	// 初回更新
	void Start()
	{
		// X方向に移動
		prefab.transform.position += new Vector3( 1.0f, 0.0f, 0.0f );
	}
	
}

```

Instantiateで生成したものを変更すれば大丈夫


```csharp:ObjectMove.cs

// ※こっちだと大丈夫
using UnityEngine;
public class ObjectMove : MonoBehaviour
{
	// Inspectorでアタッチしたオブジェクト
	public GameObject prefab;

	// 初回更新
	void Start()
	{
		// インスタンス
		GameObject cube = Instantiate( prefab );

		// X方向に移動
		cube.transform.position += new Vector3( 1.0f, 0.0f, 0.0f );
	}
	
}
```
[memo] 情報整理

- 増井俊之式整理法を実施したい。

- 文書に tag をつけて蓄積していったあと、 tag 構造の変更は可能か。
  - 例えば、 1000 ほどの文書に「交通」という tag をつけた後、これを「陸上交通」と「海上交通」に分離することは可能か。
  - できなかったら、なにか問題か。

- いまの所得では、図書館を利用せざるを得ない。全ての本を電子端末で読む生活は不可能である。
- きれいに製本された本を裁断するのにはもったいないという感情も出る。

- 電子化に向く本と向かない本がある。
  - 概ね、 sequential に読む本は電子化しても問題ない。他方、 random access をする本は電子化すると不便である。

- 自分で scan した文書は、だいたいもう読まない。99％はもう読まない。しかし、1％の重要な文書が存在する。

- 昔の写真は scan して保管する。公開して喜んでくれる人がいるならば公開したい。しかし、公開を喜ばない人もいるだろう。だから、公開するならば写っている人全員から許可を得る必要がある。どうやるのが最善か。

- 工具や電化製品で、 package (厚紙) が取扱説明書も兼ねているものがある。厚紙は scan できない。いま、 copy して scan している。最善の方法は何か。
appleTVでpresentModal画面遷移

## はじめに
前回記事の続きになります。
appleTVでHelloWorld
http://qiita.com/senseiswift/items/1ba47afa73ecc1760cac

今回は画面にボタンを追加して、2つの画面間を遷移できるようにします。

## やること
1. 表示するTVMLにボタンを追加して、変数に切り出し
2. TVML表示時にイベントリスナー（選択時のコールバックイベント）追加
3. コールバックイベント内に、次の画面を読み込んで表示する処理を書く

### 1. 表示するTVMLにボタンを追加して、変数に切り出し
buttonタグでボタンを追加します。

```js:main.js
// 1枚目のTVML
var firstXMLString =
`<?xml version="1.0" encoding="UTF-8" ?>
<document>
<alertTemplate>
<title>Hello AppleTV!</title>
<button>
<text>Hello!</text> // buttonタグでボタンをセットします
</button>
</alertTemplate>
</document>`

// 2枚目のTVML
var secondXMLString =
`<?xml version="1.0" encoding="UTF-8" ?>
<document>
<alertTemplate>
<title>Bye AppleTV!</title>
<button>
<text>Bye!</text>
</button>
</alertTemplate>
</document>`
```

### 2. TVML表示時にイベントリスナー（選択時のコールバックイベント）追加
```js:main.js
// 起動時に呼ばれる1枚目のTVMLを表示するメソッドです
function firstAlert() {
    var parser = new DOMParser();
    var alertDOMElement = parser.parseFromString(firstXMLString, "application/xml");

    // イベントリスナーを追加します
    alertDOMElement.addEventListener("select", /* ここにボタン押した時の処理を書きます */, false);
    navigationDocument.presentModal(alertDOMElement);
}
```

### 3. コールバックイベント内に、次の画面を読み込んで表示する処理を書く
2枚目のTVMLを表示するメソッドを定義し、
1枚目のTVMLのボタンを押した時のコールバックに指定します。
2枚目のTVMLでボタンが押された時は、1枚目のTVML表示メソッドを呼ぶようにします。

```js:main.js
function firstAlert() {

    // 1枚目のTVMLのボタン押した時に呼ばれる
    // 2枚目のTVMLを表示するメソッドです
    function showSecondXML() {
        var parser = new DOMParser();
        var alertDOMElement = parser.parseFromString(secondXMLString, "application/xml");

        // 2枚目のボタンを押した時、1枚目のTVMLを表示するようにします    
        alertDOMElement.addEventListener("select", function(){firstAlert();}, false);
        navigationDocument.presentModal(alertDOMElement);
    }
    
    var parser = new DOMParser();
    var alertDOMElement = parser.parseFromString(firstXMLString, "application/xml");

    // コールバックイベントに2枚目のTVMLを表示するメソッドを指定します
    alertDOMElement.addEventListener("select", showSecondXML, false);
    navigationDocument.presentModal(alertDOMElement);
}
```

### 動作確認
準備が整ったので、実際に動かしてみましょう！　main.jsがあるディレクトリで、
「python -m SimpleHTTPServer 8000」するのを忘れないように注意してください。

アプリ起動後、シミュレータの「HardWare > Show　Apple TV Remote」の順に選択して、
リモコンを表示しておきましょう。

### 1枚目
![スクリーンショット 2015-09-13 11.09.07.png](https://qiita-image-store.s3.amazonaws.com/0/91606/2453cbe7-323e-9e1c-5b59-b55278a5f78c.png)


### 2枚目
![スクリーンショット 2015-09-13 11.12.27.png](https://qiita-image-store.s3.amazonaws.com/0/91606/808f7391-198e-fadc-2735-923f507075dc.png)

## まとめ
presetModalを使って、複数のTVMLを遷移できるようになりました。
全部modalだと残念なので次はPushPop操作を勉強します。

appleTVでpush/pop画面遷移 AC俺 14日目
http://qiita.com/senseiswift/items/b61139456e9c553ea1bd

ソース全文はgithubを参考にしてください。
https://github.com/senseiswift/appleTVtutorial/commit/2e74e2f0609e95c7d068f5fa5c61e974f65c3f09
POH6+『「え、妻が松江？」松江Ruby会議07協賛 回文作成プログラミングコンテスト』 ゴルフ編

#概要
ヒャッハー！ゴルフだ－！
効率とかどうだっていい、とにかく最短を目指すんだ！
Rubyだと発表とかされるらしいけどそんなのどうだっていい、C++でゴルフしようぜ！
※テストケースの詳細が[某スレに流れてきた](http://kanae.2ch.net/test/read.cgi/prog/1429784368/713)ので投稿しました。一応言っておきますが、下記の内容はこのレスの前から分かってました
※2015/09/28追記：イベントも終わったので復活。

#そもそもテストケースがガバガバな件について
既にご存知かと思いますが、**POHのテストケースは常に一定です**。
つまり、テストケースについての情報を得られれば、**相当適当なコードでもOKになります**。
[さる方の記事](http://qiita.com/rana_kualu/items/23a0ef14db9e4eb44e45)にあるように、コードにusleep()を挟めば実行時間から情報が得られますので……。
で、調査した結果、次のような感じになりました。

* ケース1(   6個,「中央」1種1個,「左側」  2種  2個,単語長 3)
* ケース2(   1個,「中央」1種1個,「左側」  0種  0個,単語長10)
* ケース3(   7個,「中央」1種7個,「左側」  0種  0個,単語長 5)
* ケース4( 969個,「中央」0種0個,「左側」390種390個,単語長 8)
* ケース5(1000個,「中央」0種0個,「左側」350種350個,単語長10)

**……おいてめぇふざけんなよ、書かれた問題文より相当条件厳しいじゃねえか！！！**
([ポイント編](http://qiita.com/YSRKEN/items/11f5e1517f3bef666c29)での講釈がほとんど無意味になるレベルの酷さと言えば分かるだろうか？)

まず「中央」ですが、なんと2種類以上は出ません。つまり、「中央」と判定できればその単語1つと出てきた回数だけ記録すればいいことになります。
また「左側」についても、別に重複しないことから、std::mapとかを使う意味がないことになります。要するに、[改良編](http://qiita.com/YSRKEN/items/20aea3c3d40e901e79db)での記述もほとんど不要になります。

まあ、極限まで手抜きすれば最初に単語リストを入力するところもタダの配列で済みます。とはいえ、std::vectorだとstd::findで検索するために「#include \<algorithm\>」という記述が必要なので打鍵数的に不利です。
ということで、**重複OKで検索が.count()とかで何とかなるデータ構造**であるstd::multisetを使いましょう。
……正直ソートされてる必要性は皆無ですが他に都合がいいコンテナを思いつかなかったから仕方がない。

#限界まで縮めた結果がこれだよ！
```code6.cpp
#include <iostream>
#include <set>
#include <string>
#define R(S) reverse(S.begin(), S.end())
using namespace std;
int main(void){
	int N;
	string temp_word, center_word = "", all_word = "";
	multiset<string> word;
	cin >> N;
	while(cin >> temp_word){
		word.insert(temp_word);
	}
	for(auto it : word){
		temp_word = it;
		R(temp_word);
		if(it == temp_word)
			center_word += temp_word;
		else
			if(word.count(temp_word) && it < temp_word)
				all_word += it;
	}
	cout << all_word << center_word;
	R(all_word);
	cout << all_word << endl;
}
```

信じられるか？　これ、**まだ圧縮する前**なんだぜ？　ということで圧縮ポン。

```code6_2.cpp
#include<iostream>
#include<set>
#include<string>
#define R(S) reverse(S.begin(),S.end())
using namespace std;int main(){int N;string T,C="",A="";multiset<string>W;cin>>N;while(cin>>T)W.insert(T);for(auto I:W){T=I;R(T);if(I==T)C+=T;else if(W.count(T)&&I<T)A+=I;}cout<<A<<C;R(A);cout<<A<<endl;}
```

これで僅か297バイト。やったぜ。
https://paiza.jp/poh/joshibato/matsue-ruby/result/719154be

#Rubyでの圧縮の手引き
これをRubyに応用する場合、そのまま移植したくなることでしょう。実際移植してみましたが、それだと177バイトぐらいまでしか削れませんでした。
ただ、Rubyの場合は**.selectや.sortなどの性能が高く、上手く使えば大幅に打鍵量を減らせます**。私のような不束者ですら**116バイトまで削れました**。

```code6_3.rb
n=gets;w=ARGF.read.split.sort;c="";w.select!{|x|c+=x if(y=x.reverse)==x;x<y&&w.index(y)};s=w.join;puts s+c+s.reverse
```
https://paiza.jp/poh/joshibato/matsue-ruby/result/f146ef96?o=e52081be
unity > System.DateTime > 月の最初と最後の日を取得する > var firstDayOfMonth = new DateTime(date.Year, date.Month, 1); / var lastDayOfMonth = firstDayOfMonth.AddMonths(1).AddDays(-1);

```txt:動作確認
Unity 5.1.3-f1 on MacOS X 10.8.5
```

指定日時をもとに、その月の最初と最後の日を取得したい。


以下のSergey Berezovskiyさんの方法がシンプルだ。

http://stackoverflow.com/questions/24245523/getting-the-first-and-last-day-of-a-month-using-a-given-datetime-object

```
DateTime date = ...
var firstDayOfMonth = new DateTime(date.Year, date.Month, 1);
var lastDayOfMonth = firstDayOfMonth.AddMonths(1).AddDays(-1);
```

AddMonths()とAddDays()がメソッドチェーンのようになっている。

メソッドチェーンって使えるのだろうか？
ImageMagick を使って画像の自動傾き補正をしてみたかった適当記録


とりあえず傾いている画像をどうにかしたかった。
少し調べてこんなのでできるみたい。

```bat
convert.exe -deskew 40% in.jpg out.jpg
```

ファイルを置き換える変換コマンド。

```bat
mogrify.exe -deskew 40% *.jpg
```

補正して追加された部分の色は白になるので、背景色相当で埋めてもらえないだろうか？
どうしても画質の劣化があるので、もう少しどうにかできないかな。

そのほか調整の参考になりそうなところ
- [\ay diary](http://arika.org/tags/imagemagick/)
AppiumとCalabashについて調べてみた


モバイルアプリのテスト自動化ツールであるAppiumとCalabashに関していろいろ調べたのでメモとして記載します。
もし加筆・訂正すべき情報があればコメントいただけるとうれしいです。

## Appium・Calabash共通

### サポート環境
* iOS, Android両方に対応（AppiumのみFirefoxOSも対応）
* シミュレータ, 実機どちらにも対応

### 仕組み
どちらも、アプリのテストツールをラップするサーバを起動させ、そのAPI経由でアプリを操作する仕組み。

#### テスト自動化ツール

* iOS - UI Automation
* Android - UiAutomator (もしくはInstrumentation)

### クラウド

* AWS Device Farmで使用可能


## Appium

http://appium.io/


### 動作の仕組み

開発PC上で、SeleniumのWebDriver JSON wire protocolに準拠したAPIを持つサーバを起動させ、そのAPIを経由してアプリを操作する。

![UI_automation_test_figures.001.jpg](https://qiita-image-store.s3.amazonaws.com/0/38775/92d1c0b2-ec4f-28b2-97c3-21393ed0b1fb.jpeg "UI_automation_test_figures.001.jpg")


### 記述言語
多くのプログラミング言語に対応
http://appium.io/slate/en/master/?ruby#list-of-client-libraries-with-appium-server-support


### メリット
* テスト用に特別にビルドする必要がなく、リリース相当のものでテストできる。
* GUIツールが使いやすい。Inspectorで操作したいパーツを確認しながら、テストコードを生成できる。

### デメリット
 * テストシナリオの作成・編集・解読にプログラミングスキルが必要。

## Calabash

https://github.com/calabash/calabash-ios


### 動作の仕組み

シミュレータ・実機側でサーバを起動させ、そのAPI経由でアプリ操作を行う。iOSの場合はアプリに組み込まれたcalabash.frameworkがCalabash Serverを起動する。Androidの場合はInstrumentation Test Serverアプリがインストールされる模様。cucumberコマンドを実行すると、テストシナリオに従ってAPIが呼ばれ、テストが実行される。

![UI_automation_test_figures.002.jpg](https://qiita-image-store.s3.amazonaws.com/0/38775/939cea6a-de36-88c3-05a5-fd5b66c44c84.jpeg "UI_automation_test_figures.002.jpg")


### 記述言語
* Gherkin https://cucumber.io/docs/reference
* 各テストステップのカスタマイズにはrubyの知識が必要
	* 他の言語でも書けてもよさそうだが、ドキュメントが見つからない。

### メリット
* テストシナリオの可読性。Gherkinはプログラマでなくても読みやすい。その気になれば日本語でも書ける。そのまま検査仕様書できるかも？

```
Scenario: Example steps
  Given I am on the Welcome Screen
  Then I swipe left
  And I wait until I don't see "Please swipe left"
  And take picture
```

* Gherkinの解釈結果はカスタマイズできるため、AndroidとiOSでそれぞれの解釈結果を用意することで、両OSで共通のテストシナリオを使用できる。

### デメリット
* テストシナリオを作成するのが難しい。このボタンはどうやったら指定できるか？等の確認にはCalabashが用意するCLIを使用する必要あり。
* iOSではCalabash用に特別ビルドを行う必要がある。通常のTargetとCalabash用Targetの同期を取らないといけない。TargetとSchemeが自動生成されるのでWorkspaceが汚れる。

## その他

#### Calabashで困ったこと

* OSアップデート直後はうまく動作しなくなる。
* 安定して動いてくれないことがある。特にUIAlertView関係。
* 日本語入力がうまくできない（Appiumはできる）。

!!!: Appiumは未確認なだけで同じような問題はあるかもしれません。


## 参考リンク
* スマホ向け無料システムテスト自動化ツール（8）：SeleniumのUIテスト自動化をiOS／AndroidにもたらすAppiumの基礎知識とインストール方法、基本的な使い方 (1/4) - ＠IT http://www.atmarkit.co.jp/ait/articles/1504/27/news025.html
* 宇大を出たけれど: iOSのテストにおいてのAppiumとCalabashの比較(Comparing the Appium with the Calabash in the iOS test) http://utsunomiya-university.blogspot.jp/2014/04/iosappiumcalabash.html
* 七転び八起きなAppiumを使ったモバイルテストのたしなみ - Qiita http://qiita.com/Kazu_cocoa/items/115e162133ac0bbdbce6
* スマホ向け無料システムテスト自動化ツール（4）：iOS／AndroidにCucumberのBDDをもたらすテストフレームワークCalabashの基礎知識とインストール (1/3) - ＠IT http://www.atmarkit.co.jp/ait/articles/1412/16/news043.html
Ubuntu PPA一覧(きっと追加する)

# 基本入れておく

| リポジトリ名 | PPA or PPA add command |
|:--------------------------------|-------------------------------------|
| Git | add-apt-repository ppa:git-core/ppa |
| Ansible | add-apt-repository ppa:ansible/ansible |
| Docker | add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" |
| apt-fast | add-apt-repository ppa:saiarcot895/myppa |
| umake | add-apt-repository ppa:ubuntu-desktop/ubuntu-make |

# ケースバイケースで入れる

| リポジトリ名 | PPA or PPA add command |
|:--------------------------------|-------------------------------------|
| Oracle JDK | add-apt-repository ppa:webupd8team/java |
| elixir | wget https://packages.erlang-solutions.com/erlang-solutions_1.0_all.deb && sudo dpkg -i erlang-solutions_1.0_all.deb |

# 自動化出来なさそうな手順
## VisualStudio Code
https://code.visualstudio.com/docs/setup/linux
dictionaryのkeyとvalueを全て取得する方法


自分のメモ用に。
しっかり調べてないので、補足やもっと便利なものがあれば教えてくださると助かります！

#keyのリスト [keys()]
```Python
dictionary = {'key1': [645, 469], 'key2': "value", 'key3': 3}
print (dictionary.keys())

```

#valueのリスト [values()]
```Python
dictionary = {'key1': [645, 469], 'key2': "value", 'key3': 3}
print (dictionary.values())
``` 

#keyとvalue同時に取得 [items]
keyとvalueのタプルのリストが返ってきます。

```Python
dictionary = {'key1': [645, 469], 'key2': "value", 'key3': 3}
print (dictionary.items())

    #-> [('key3', 3), ('key2', 'value'), ('key1', [645, 469])]
```

#iteritems()
for文とかで回すならこのメソッドを使用したほうが便利な場合があるかもです。

```Python
dictionary = {'key1': [645, 469], 'key2': "value", 'key3': 3}

for key, value in dictionary.iteritems():
	print "key:", key, "-- value:", value 

```
Ruby on Railsでポート番号を指定してサーバーを立ち上げる

[株式会社TECH LUCK](https://techluck.co.jp/?utm_source=qiita&utm_medium=article&utm_campaign=myarticle)という会社で代表兼エンジニアをしている齊藤です。

DXプロジェクト、開発プロジェクト、Rails開発などでお困りごとがありましたら[弊社HP](https://techluck.co.jp/?utm_source=qiita&utm_medium=article&utm_campaign=myarticle)からご相談をいただけますと幸いです。
以下のような問題に対応することが可能です。
- プロジェクトでRailsエンジニアが足りなくて困っている
- Railsのバージョンアップをしたいがノウハウ・リソースが足りなくて困っている
- オフショア開発をしているが、要件の齟齬やコード品質が悪いので改善したい


また、Railsエンジニアも募集しておりますので、興味がありましたら[弊社HP](https://techluck.co.jp/?utm_source=qiita&utm_medium=article&utm_campaign=myarticle)からご連絡いただけますと幸いです。


# 前提
Ruby on Railsでポート番号を指定してサーバーを立ち上げたい時があったので、その方法についてまとめました。

Ruby on Railsでローカルにて開発を行なっている際に、ターミナルで`rails s `コマンドを実行してローカルサーバーを立ち上げ、ブラウザで`localhost:3000`と入力すると、ローカル環境で自分が開発しているアプリを確認することができます。
これはポート3000番でrailsサーバーを起動させ、`localhost`というURLにポート3000番でアクセスし、画面を表示していることになります。

しかし、すでに3000番ポートを使ってしまっており、違うポート番号でローカルサーバーを立ち上げたいという時も想定し、
3000番以外のポート番号でローカルサーバーを立ち上げる方法を説明したいと思います。


## 都度ポート番号を指定する

ターミナルで`rails s`コマンドでローカルサーバーを立ち上げるときに、以下のようにコマンドを実行してローカルサーバーを立ち上げます。

```bash:ターミナル
rails s -p 4000 # pとはportの略です
```

ブラウザのURLで`localhost:4000`と入力すると、ポート番号が4000番でアプリを確認することができます。

## 常に指定したポート番号（3000番以外）にする

`sample/config/boot.rb` ファイルに設定を加えます。
変更を加えていなければ以下のようになっています
![bootbefore.png](https://qiita-image-store.s3.amazonaws.com/0/92443/a4587481-8646-6334-04d0-a5d0930b183b.png)

このファイルに以下の記述を加えます。

```rb:sample/config/boot.rb
require 'rails/commands/server'
module Rails
  class Server
    def default_options
      super.merge({
        :Port => 4000
        })
    end
  end
end
```

![bootafter.png](https://qiita-image-store.s3.amazonaws.com/0/92443/4dcf629b-ac89-51c2-45c4-2eb2ccae4cb0.png)

こうすることで、ポート番号を指定せずとも`rails s`コマンドを打つと、自動的にポート番号4000でサーバーが立ち上がります。
4000のところは任意の数字で構いませんが、ブラウザで確認するときは同じ番号でアクセスすることに注意しましょう。
DOMを中の値でソートする

何かを大量に一覧できるページを見てると特定の値でソートをしたいことが時々あります。（金額、参照回数、ブクマ数、コメント数など…）
サイト側にソートする機能が無い時は自分でコンソールなり、ユーザスクリプトでソートしてやります。

## 商品一覧で安い順にソートする例

```html
<ul id="sec_forsale">
    <li>商品A<p class="price"><del>345円</del> 234円</p></li>
    <li>商品B<p class="price"><del>2,000円</del> 1,234円</p></li>
    <li>商品C<p class="price"><del>60円</del> 56円</p></li>
    <li>商品D<p class="price"><del>10円</del> 1円</p></li>
    <li>商品E<p class="price"><del>10円</del> 9円</p></li>
    <li>商品F<p class="price"><del>50円</del> 5円</p></li>
</ul>
```

```js
var container = document.querySelector('#sec_forsale');
[].slice.call(container.querySelectorAll('li'))
    .map(function(v){
        var value = v.querySelector('.price').innerHTML.replace(/<.+>/,'').replace(/\D/g,'') - 0;
        return { dom: v, value: value };
    })
    .sort(function(a,b){ return a.value - b.value; })
    .forEach(function(v){ container.appendChild(v.dom); });
```

## 補足

* `querySelectorAll()` の戻り値は `NodeList` を返し、配列系メソッドが使えないため、`[].slice.call()` で配列化しています。ES6に対応していれば `Array.from()` も使えます。
* map 内では比較用の値をざっくり取り出し数値化しています。
* また次に行う sort ではアルゴリズム上、比較対象を変えた上で1つの値を何度も評価しますので、パースが何度も行われないように要素と数値両方保持する形に持ち替えています。（シュワルツ変換）
* sort内では持ち替えた `.value` の方を参照します。
* このsortでは要素を持った配列の並び替えでしかないため最後のforEachでDOMに反映します。
yum updateでHTTP Error 404 - Not Found

## 参考

* [インフラ情報まとめ Linux-CentOS7](http://pcmemorin.blog.fc2.com/category38-7.html)

## 現象

CentOS7にて遭遇。

```bash:
# yum update
読み込んだプラグイン:etckeeper, fastestmirror
http://www.ftp.ne.jp/Linux/packages/CentOS/7.0.1406/os/x86_64/repodata/repomd.xml: [Errno 14] HTTP Error 404 - Not Found
他のミラーを試します。
http://ftp.riken.jp/Linux/centos/7.0.1406/os/x86_64/repodata/repomd.xml: [Errno 14] HTTP Error 404 - Not Found
他のミラーを試します。
http://ftp.jaist.ac.jp/pub/Linux/CentOS/7.0.1406/os/x86_64/repodata/repomd.xml: [Errno 14] HTTP Error 404 - Not Found
他のミラーを試します。
http://ftp.nara.wide.ad.jp/pub/Linux/centos/7.0.1406/os/x86_64/repodata/repomd.xml: [Errno 14] HTTP Error 404 - Not Found
他のミラーを試します。
http://mirror.fairway.ne.jp/centos/7.0.1406/os/x86_64/repodata/repomd.xml: [Errno 14] HTTP Error 404 - Not Found
他のミラーを試します。
http://ftp.iij.ad.jp/pub/linux/centos/7.0.1406/os/x86_64/repodata/repomd.xml: [Errno 14] HTTP Error 404 - Not Found
他のミラーを試します。
http://ftp.tsukuba.wide.ad.jp/Linux/centos/7.0.1406/os/x86_64/repodata/repomd.xml: [Errno 14] HTTP Error 404 - Not Found
他のミラーを試します。
http://mirror.vodien.com/centos/7.0.1406/os/x86_64/repodata/repomd.xml: [Errno 14] HTTP Error 404 - Not Found
他のミラーを試します。
http://centos.mirror.secureax.com/7.0.1406/os/x86_64/repodata/repomd.xml: [Errno 12] Timeout on http://centos.mirror.secureax.com/7.0.1406/os/x86_64/repodata/repomd.xml: (28, 'Connection timed out after 30181 milliseconds')
他のミラーを試します。
http://centos.ustc.edu.cn/centos/7.0.1406/os/x86_64/repodata/repomd.xml: [Errno 14] HTTP Error 404 - Not Found
他のミラーを試します。
http://www.ftp.ne.jp/Linux/packages/CentOS/7.0.1406/extras/x86_64/repodata/repomd.xml: [Errno 14] HTTP Error 404 - Not Found
他のミラーを試します。
http://ftp.riken.jp/Linux/centos/7.0.1406/extras/x86_64/repodata/repomd.xml: [Errno 14] HTTP Error 404 - Not Found
他のミラーを試します。
http://ftp.jaist.ac.jp/pub/Linux/CentOS/7.0.1406/extras/x86_64/repodata/repomd.xml: [Errno 14] HTTP Error 404 - Not Found
他のミラーを試します。
http://mirrors.skyshe.cn/centos/7.0.1406/extras/x86_64/repodata/repomd.xml: [Errno 14] HTTP Error 404 - Not Found
他のミラーを試します。
http://ftp.nara.wide.ad.jp/pub/Linux/centos/7.0.1406/extras/x86_64/repodata/repomd.xml: [Errno 14] HTTP Error 404 - Not Found
他のミラーを試します。
http://mirror.fairway.ne.jp/centos/7.0.1406/extras/x86_64/repodata/repomd.xml: [Errno 14] HTTP Error 404 - Not Found
他のミラーを試します。
http://ftp.iij.ad.jp/pub/linux/centos/7.0.1406/extras/x86_64/repodata/repomd.xml: [Errno 14] HTTP Error 404 - Not Found
他のミラーを試します。
http://ftp.tsukuba.wide.ad.jp/Linux/centos/7.0.1406/extras/x86_64/repodata/repomd.xml: [Errno 14] HTTP Error 404 - Not Found
他のミラーを試します。
http://mirror.vodien.com/centos/7.0.1406/extras/x86_64/repodata/repomd.xml: [Errno 14] HTTP Error 404 - Not Found
他のミラーを試します。
http://centos.ustc.edu.cn/centos/7.0.1406/extras/x86_64/repodata/repomd.xml: [Errno 14] HTTP Error 404 - Not Found
他のミラーを試します。
```

## 修正方法

```bash:
yum clean all
```
unity > [Range()]にてenum定義したものを使用する

```txt:動作確認
Unity 5.1.3-f1 on MacOS X 10.8.5
```

Unityには[Range()]というものでpublic宣言した変数の範囲を制限する機能がある。
http://unity3d.com/jp/learn/tutorials/modules/intermediate/scripting/attributes?playlist=17117

enum定義した定数を使って範囲を指定するには以下のようにするようだ。

```sample.cs
	enum xscaletype {
		Daily = 0,
		Weekly,
		Monthly,
		Yearly,
	};

	[Range((int)xscaletype.Daily, (int)xscaletype.Yearly)]
	public int xtype = 0;
```

(int)をつける必要あり。

xtypeの定義をintでなく、enum型にすれば違うかもしれないが、未調査。


余談であるが、[Range()]は検索がしずらい。そのためdifficultToSearchタグを付けた。
unity > よくやる失敗 > シーンファイル保存忘れ > Save projectしてもシーンファイルは保存されない。

```txt:動作確認
Unity 5.1.3-f1 on MacOS X 10.8.5
```

unityで色々変更したものをgithubなどにpushする前によくやる失敗が、シーンファイルの保存忘れだ。

`Save project`を実行しても、シーンファイルの変更は保存されないので、上記の失敗をする。

`Save project`をしてもシーンファイルを保存しないという利点がよく分からない。

`Save project`と`Save Scene`を実行してからリポジトリにPushするようにした。
楽ができるGolangのライブラリ達


ライブラリ探すなら基本[awesome go](https://github.com/avelino/awesome-go)見とけばいいけど、いろいろ楽するためという観点で、思い出した順に適当に追記していく。気が向いたらサンプルも書く

## gojson

- https://github.com/ChimeraCoder/gojson

jsonのデータを渡すとそれに対応するstructを生成してくれる。JSON APIを利用するときに楽ができる。既存APIのリプレイスをGoでやるときとかも良い。


## goquery

- https://github.com/PuerkitoBio/goquery

JQueryっぽくhtmlをパースしたり検索したりして楽ができる。自前でhtmlのパースなんか書いてられない。

## goreq

- https://github.com/franela/goreq

`net/http`パッケージで、httpリクエストを飛ばすのは結構面倒だったりいろんな書き方があったりしてヘッダつけるときどれ使うと楽なんだっけとか毎回調べたりするのとても面倒なので、そこを楽するときに使うラッパ。pythonのrequestsみたいなもの

使い方は公式のREADME見れば一発で分かる。

- https://github.com/franela/goreq/blob/master/README.md

## monkey

- https://github.com/bouk/monkey

関数ポインタ書き換えてMonkey Patchingしてくれる。LL言語でのテストコードに慣れてると気軽にMonkey Patchingするおじさんになっているのでとても良い。無理やり関数ポインタ書き換えるのでセキュアなOSだと動かなかったり、インライン化されてるとうまくいかないので`-gcflags -l-`が必要だったりする。スレッドセーフでもないので気をつけろ。

- 中でやってること
  - http://postd.cc/monkey-patching-in-go/

### 使い方

基本的には、関数置き換え(monkey.Patch)と置き換えたものを戻す(monkey.Unpatch)で関数を置き換える。置き換え元と置き換え先の関数のインターフェイスを揃えておく必要がある(無いと当然panicする)

特定のインスタンスに生えている関数を置き換える場合は、`monkey.InstanceMethod`、`monkey.UnpatchInstanceMethod`を利用する

## render

- https://github.com/unrolled/render

httpレスポンスを楽に返すことが出来る。JSONのレスポンス返すのにいちいちNewEncoderとか書いてられない。jsonとかBinaryとか返すのが楽になる。

## validator

- https://github.com/go-validator/validator

structのアノテーションを元に、各要素のヴァリデーションをしてくれる。

公式に乗ってるアノテーションのサンプルはこんな感じ。数値型と文字列型で、よくあるヴァリデーションがアノテーションで書けて楽。

```go:
type NewUserRequest struct {
    Username string `validate:"min=3,max=40,regexp=^[a-zA-Z]$"`
    Name string     `validate:"nonzero"`
    Age int         `validate:"min=21"`
    Password string `validate:"min=8"`
}

nur := NewUserRequest{Username: "something", Age: 20}
if valid, errs := validator.Validate(nur); !valid {
    // values not valid, deal with errors here
}
```

なんか新しいのも出てた

- https://github.com/go-playground/validator

## interpose

- https://github.com/carbocation/interpose

net/http向けの便利なmiddlewareと既存のwafのmiddlewareをnet/httpで使えるようにするadaptor。

## goxc

- https://github.com/laher/goxc

クロスコンパイルが楽になるやつ

## channels

- https://github.com/eapache/channels

channelのラッパー集。バッファーサイズが無限の奴とか、バッファ・サイズ超えると古いやつから勝手に消えてくれる奴とかが実装されている


## cron

- https://github.com/robfig/cron
- https://godoc.org/github.com/robfig/cron

その名の通り、cron形式の指定時間に、gorutineを動かしてくれる。自前で特定時間に動かすとかタイマー書くのはめんどうなので、cron形式で書けるので楽。普通のcronと違って秒単位まで指定できる。

## Godep

- https://github.com/tools/godep

普通に`go get`するとmasterの最新のコミットを取ってくるので、後方互換性がない変更があると死ぬし、全体で同じ物を共有しているのでメンテしてないコードが死んだりするので、プロジェクトの毎にライブラリを管理して、Godeps.jsonにcommit idを記録してくれる。Godep経由でbuildやtestを叩くとGOPATHを書き換えて動く。Godeps.jsonから落としなおしてくれるとかはしてくれないのでそこはいけてない。

## fresh

- https://github.com/pilu/fresh

プロジェクトのディレクトリを監視して、自動でコンパイルして再起動してくれる。godep使ってる場合はこんな感じのMakefile書いとくと良いかも。

```
GODEP_PATH := $(shell godep path)
fresh:
	GOPATH=$(GODEP_PATH):$(GOPATH) fresh
```

プロジェクトのディレクトリにrunner.confというファイルを置いて設定を書くことも出来る。


## gobot

- https://github.com/hybridgroup/gobot

arduinoとかRaspberry PiとかEdisonとかその他いろいろなロボットとか基盤をgolangから楽に使えるラッパーライブラリ。

## gatt

- https://github.com/paypal/gatt

BLEのgattプロファイルを楽に扱える奴。
unity > TDD > 動作テスト用gameobjectのON/OFFで処理を繰り返す

```txt:動作確認
Unity 5.1.3-f1 on MacOS X 10.8.5
```

## 問題点

http://qiita.com/7of9/items/5835021b3ae22dd09b9f
において、テスト用ゲームオブジェクト(Test_weekly)をActivateした時にテストコードの実行ができた。

ただし、処理の実行を繰り返すことができない。

Start(), Awake()からの関数実行を試したが、できなかった。

[forum.unity3d](http://forum.unity3d.com/threads/event-for-when-a-gameobject-is-deactivated-activated.193980/)
によると、最後のLysanderさんが以下のように書いている。

> The answer is to use the OnDisable() and OnEnable() functions of the component in order to check the status of the GameObject, and then react if the entire thing has been disabled. Next time you should read to the end of the thread first IMO.

テスト用GameObject(Test_weekly)のActived/Deactivatedを監視するGameObjectを用意して、それがTest_weeklyのActivateを検知したら、処理をする、ということらしい。


## 実装

テスト用GameObject (Test_hello)とスクリプトTest_hello.cs (下記) を用意。
外部GameObjectからコールするため static public宣言としている。

```Test_hello.cs
using UnityEngine;
using System.Collections;

public class Test_hello : MonoBehaviour {

	static public void Test_showHelloMessage() {
		Debug.Log ("Hello from Test_hello");
	}
}
```

テスト用GameObject監視用GameObject (Test_helloGoChecker)とスクリプト Test_helloGoChecker.cs(下記)を用意

```Test_helloGoChecker.cs
using UnityEngine;
using System.Collections;

// Test_hello GameObject activated/deactivated checker

public class Test_helloGoChecker : MonoBehaviour {

	float accTime = 0.0f;

	bool preState = false;

	void CheckGameObjectAndRun() {
		GameObject weekly = GameObject.Find ("Test_hello");
		if (weekly == null) { // null if gameobject is deactivated
			preState = false;
			return;
		}
		if (preState == true) {
			return;
		}
		preState = true;

		Test_hello.Test_showHelloMessage ();
	}

	void Update () {
		accTime += Time.deltaTime;
		if (accTime < 0.3f) { // every 300msec
			return;
		}
		accTime = 0.0f;

		CheckGameObjectAndRun ();

	}
}
```

Test_helloゲームオブジェクトがDeactivatedになっている場合、GameObject.Find()でnullが返るようなので、それを利用した。


デザインにおいて、Actiavted/Deactivatedは以下のようにしておく。監視側は常にActiveでないといけない。

- Test_hello : deactivated
- Test_helloGoChecker : activated


##実行例

プレイモードで実行後は以下のように Test_hello がDeactivatedになっている。

![Main_unity_-_150908-udpTimeGraph_-_PC__Mac___Linux_Standalone__Personal_.jpg](https://qiita-image-store.s3.amazonaws.com/0/32870/7621b3c9-3505-b6e5-9f4d-e050ebe031e6.jpeg)

インスペクタで Test_helloをActivateにするごとに (下図1) とConsoleに表示される"Hello from Test_hello"の実行回数が増えている (繰り返し処理がされていることが分かる）

![Main_unity_-_150908-udpTimeGraph_-_PC__Mac___Linux_Standalone__Personal_.jpg](https://qiita-image-store.s3.amazonaws.com/0/32870/3ea79e34-3590-13fe-e430-818070f5fcde.jpeg)

![Main_unity_-_150908-udpTimeGraph_-_PC__Mac___Linux_Standalone__Personal_.jpg](https://qiita-image-store.s3.amazonaws.com/0/32870/21db1df8-eae6-0cb5-bce0-c3e3fea9332e.jpeg)


## code
[v0.9 @ github](https://github.com/yasokada/unity-150908-udpTimeGraph/releases/tag/v0.9)