OmniAICreator/Qiita-1.07M huggingface dataset:
Unity5 C#の簡単なセーブ方法 PlayerPrefsクラス  

既にQiitaで同様の内容を書いている方がいらっしゃるのですが、補足と使用例を追加して書かせていただきます。

PrayerPrefsクラスに保存したデータは、一度アプリケーションを終了してもデータが残ります。
ゲームのちょっとしたセーブデータ等に用いるのであればかなり便利です。

大量に取得したりセットしたりするのには向かないので、その場合は別の方法をとりましょう。

* * *
今回は例として「何ステージまでクリアしたか」の値を保存してみることにします。
まずはサンプルスクリプトから。

```lang:ClearStatus.cs
using UnityEngine;
using System.Collections;

public class TestPlayerPrefs : MonoBehaviour {

　void Start () {
　　PlayerPrefs.SetInt("CLEARSTAGE",0)
　　//データ名「CLEARSTAGE」に引数の0を代入

　　int ClearStage = PlayerPrefs.GetInt("CLEARSTAGE");
　　//変数「ClearStage」に「CLEARSTAGE」の値を代入
　｝

```

普通の変数と違い、いきなり「SetInt("データ名",初期値)」と書くだけでデータが作成され、初期値が代入されます。
また、「int 変数名 = GetInt("データ名",初期値)」と書いても同じことが可能です。
メソッドの第二引数は値が保存されていない時に返される値ということですね。

サンプルで使用しているint型に加え、float型とstring型が使用可能。
その場合の関数名はそれぞれ以下のようになります。

`PlayerPrefs Get Float()`
`PlayerPrefs Get Int()`
`PlayerPrefs Get String()`

`PlayerPrefs Set Float()`
`PlayerPrefs Set Int()`
`PlayerPrefs Set String()`

次に、ステージをクリアして、セーブする際に動かすメソッドです。

```lang:ClearStatus.cs
//スクリプトはさっきの続き

using UnityEngine;
using System.Collections;

public class TestPlayerPrefs : MonoBehaviour {

  void SaveClearStage1(){
        PlayerPrefs.SetInt("CLEARSTAGE", 1);
        //データ名「CLEARSTAGE」に引数の1を代入しなおす

        ClearStage = PlayerPrefs.GetInt("CLEARSTAGE",1);
        //変数「ClearStage」に「CLEARSTAGE」の値を代入しなおす
　｝

```
やってることは先ほどと全く同じです。簡単ですね。
クリアしたステージ数によって処理が分岐する場合などは、ClearStageの値を使います。
PlayerPlefsのデータは別クラスからでもアクセスできます。

SetInt等で保存されるのは実際にはアプリケーション終了時であり、不具合等でアプリが落ちた時にはセーブされていない可能性があります。

重いので多用は避けたいですが、アプリ終了前のタイミングでデータを保存したい時はSetInt等で保存後
`PlayerPrefs.Save()`
を実行してください。
* * *
最後に、その他の関数です。

`PlayerPrefs.DeleteAll()`
そこまで保存していたPlayerPrefsのデータを全て削除します。

`PlayerPrefs.DeleteKey(string key)`
保存されている特定のデータを削除します。

`bool b =PlayerPrefs.HasKey(string key)`
bool型。特定のデータが存在するかどうかを真偽で返します。
{質問} 任意の曜日の任意の時間に任意の言葉をしゃべらせたい

こんなことできたら嬉しいです。

たとえば
火曜日の１０時３０分になると
「おばあちゃん、今日はリハビリに行く日ですよ」
金曜日の１２時３０分になると
「おばあちゃん、今日は病院に行く日ですよ」
日曜日の９時３０分になると
「あばあちゃん、今日はゴミの日ですよ」

これを毎週繰り返す。

こんなことできませんでしょうか？

ChoregraphでSayボックスを作った後で
指定した曜日と時間にSayが発動するトリガーが必要と思いますが。

Sayボックス作成→Solitaryアクティビティ→トリガー条件式→インストール
この流れでいいのでしょうか？
ただ、その場合のトリガー条件式などが解りません。

また別の方法などあるのでしょうか？

どうかよろしくお願いします。
1つのHTMLファイルで簡易なバージョン管理ができるブラウザアプリを作ってみた。

10年ぶりにJavaScriptをさわってみたら知らないことがたくさんあったので、勉強がてらにちょっとブラウザアプリを作ってみました。

# アプリの概要
ブラウザだけで動く1つのHTMLファイル(filepot.html)による簡易バージョン管理アプリです。
Gitなどのバージョン管理システムを使えない(環境にいる)人向けをイメージしてみました。


# 特徴
- 新しめのブラウザがあれば動きます。他にインストールが必要なものはありません。
- 外部とのやり取りはしないため、インターネットにつながっていない環境でも使用可能です。

# ダウンロード
[こちら](https://github.com/shimamu/filepot/releases)からfilepot.htmlをダウンロードしてください。
※ソースコードは[GitHub](https://github.com/shimamu/filepot/)に置いてます。

# 使い方

## ファイルの登録

1. ブラウザでfilepot.htmlを開きます。

2. バージョン管理したいファイルをドラッグ＆ドロップします。するとドロップしたファイルの一覧が下に表示されます。
![2015-10-20_00h19_10.png](https://qiita-image-store.s3.amazonaws.com/0/50443/59a0201e-4c72-faa3-1a62-c05b8beac4b1.png)

3. この時点ではまだ保存されていないため、保存をクリックします。クリックするとfilepot.htmlのダウンロードが始まるので上書き保存するか別名で保存してください。
![2015-10-20_00h22_00.png](https://qiita-image-store.s3.amazonaws.com/0/50443/02b0fe78-9fa7-696b-6202-8461879212f7.png)

```
本当はfilepot.htmlが自分自身を上書き保存できればいいのですが、たいていのブラウザのセキュリティポリシーではJavaScriptからローカルにファイルを保存するのは難しいようなのでダウンロードという形式にしています。
```

登録したファイルを更新したり新しいファイルを追加したい場合は上記保存によってダウンロードしたfilepot.htmlを開いて同じ操作をします。

![ファイル更新.png](https://qiita-image-store.s3.amazonaws.com/0/50443/f7bc4a99-510e-9c34-46d5-362467ad7b3d.png)


##登録したファイルの取得

登録しているファイルを取得する方法は2つあります。
### 特定のバージョンのファイルを1つ取得する

1つめの方法はファイル名のリンクのクリックです。クリックするとそのリンクの左側に記載されているバージョンでのファイルをダウンロードできます。

![2015-10-20_00h22_00 ファイルDL.png](https://qiita-image-store.s3.amazonaws.com/0/50443/7ff5769d-32cf-fda9-88d1-bf59aaa43cad.png)

### ある登録時点のファイルをまとめて取得する。

2つめの方法はまとめてダウンロードのリンクのクリックです。こちらはファイルを登録した単位でその時点で登録されている最新ファイル一式をダウンロードできます。

![2015-10-20_00h22_00 まとめてDL.png](https://qiita-image-store.s3.amazonaws.com/0/50443/8280fb15-2c72-1af7-942d-390a3cc09a46.png)

```
見た目はダウンロードなのでインターネット経由でサーバーからダウンロードしているように見えますが、JavaScriptでファイルを返しているだけなのでインターネットにアクセスしているわけではありません。
```

## 登録のやり直し
「1つ戻す」をクリックすると一番最新の登録を削除します。

![１つ戻す.png](https://qiita-image-store.s3.amazonaws.com/0/50443/db2533b5-9e96-877e-c879-e5bfc2cfeb50.png)


登録されているものがなくなるまで削除できます。

```
削除すると元には戻せないので保存する前に実施する場合は注意してください。
```

## コメントを書く
コメントアイコンをクリックするとコメント入力ダイアログが表示されコメントを書くことができます。コメントはファイル単位で書くことができます。

![コメント.png](https://qiita-image-store.s3.amazonaws.com/0/50443/9900eac1-79a4-8d0e-0904-383ef6adf27e.png)


## フィルター
フィルターアイコンをクリックすると、クリックしたファイル(とそのコメント)だけが画面に表示されます。特定のファイルの履歴を見たいときに便利です。

![フィルタ.png](https://qiita-image-store.s3.amazonaws.com/0/50443/8ee76d38-7ff8-96bb-effc-b136197da9b1.png)


## ブラウザのエラーなどで保存ができない場合
ブラウザの制限もあり、filepot.htmlのファイルサイズが大きくなると保存できなくなることがあります。その場合はハサミのアイコンをクリックすると最新版のみを含んだfilepot.htmlをして継続することができます。

![ブランチ.png](https://qiita-image-store.s3.amazonaws.com/0/50443/ba543404-2d1d-ee06-60ae-e40f7e6ef4b9.png)

基本的な使い方はこんな感じです。
開発時ではないときに assertion を止める

`assert` を使って事前条件と事後条件を表明するという契約プログラミング的なスタイルは Clojure においても実践可能でそれは次のように書くことが出来ます。

```clj
(defn foo [x]
  {:pre [(map? x)]}
  x)

(foo 1) ;; AssertionError Assert failed: (map? x) 
(foo {:bar 10}) ;; {:bar 10}
```

とはいえ、これらは開発時に使いたいものであってプロダクション環境などでは動いてほしくないものです。
なのでこれを止めるようにします。

```clj
(defproject assert-test "0.1.0-SNAPSHOT"
  :description "FIXME: write description"
  :url "http://example.com/FIXME"
  :license {:name "Eclipse Public License"
            :url "http://www.eclipse.org/legal/epl-v10.html"}
  :dependencies [[org.clojure/clojure "1.7.0"]]
  :profiles
  {:dev {:global-vars {*assert* true}}
   :prod {:global-vars {*assert* false}}})
```

`:global-vars` を設定するだけで良いです。例えば `lein uberjar` するときに行いたいなら `:uberjar` プロファイルに設定するなどでも良いと思います。
【RailsユーザのためのPHP/Laravel】よくつかうコマンド入門


どーもー。Rails芸人の次はLaravel芸人でGoogleで一番上を目指している[@srockstyle](https://twitter.com/srockstyle)です。

LaravelはPHPで作られているWebアプリケーションフレームワークです。RailsでいうRakeコマンドやrailsコマンドの代わりっぽいのがartisanコマンドってのがあるようです、アルチザンですね。パルチザンかと思いました。

## マイグレーションファイル作成

rails g migration的なのは以下です。

```shell
php artisan make:migration create_articles_table
```

## マイグレーション実行
rake db:migrateみたいなやつ。DBに反映します。

```shell
php artisan migrate
```

## シードデータ最適化（ファイル作成後）

ファイルを作った後シードデータを最適化します。

```shell
php artisan optimize
```
シードデータの読み込みは以下。

```shell
php artisan db:seed
```

二回目以降のシード読み込みは以下ですね。

```shell
php artisan migrate:refresh --seed
```
## モデルの作成
rails g model系は以下です。

```shell
php artisan make:model Article
```

モデルはapp/以下に置かれるので、場合に応じてapp/modelsとかつくってもいいかもですね。

## コントローラの作成

rails g controller系は以下です。

```shell
php artisan make:controller ArticlesController
```

## キーの作成

Railsでいうsecret.ymlに設定するキーですかね。キーの作成はこちら。

```shell
php artisan key:generate
```

## サーバ起動

サーバ起動しましょう。

```shell
php artisan serve
```

## まとめ

考え方としては「Railsでいう〜が〜」みたいに思っとくとすぐすんなり入ってきます。PHPも悪くないですね！

なんかあれば追記します！！！

そんじゃ！！！
syslog

#Syslog
Linuxのメインログ。syslogdがメッセージをログとして出力する。

                                
カーネル／デーモン／プロセス → syslogd → ログファイル／コンソール／他ノード

＜設定ファイル＞
/etc/syslog.conf

＜書式＞
スペースまたはタブで区切られた2つのフィールド。
Selector(取得するログの設定)`  `スペースまたはタブ` `Action(ログの出力先)

EX:
`*.warn   /var/log/syslog`

＜Selector(取得するログの設定)＞
Selectorは、facilityとpriorityをピリオドでつなぐ
特定のActionに対して複数のSelectorを指定したい場合は、；で接続する
`Ex: facility.priority;facility.priority  Action`

＜Facility(ログの分類）＞
Facilityとは、ログの分類のこと。
auth,authpriv,cron,daemon,kern,mail,lprmners,syslog
user(ユーザプロセス),uucp(uucp転送),local0〜7(アプリ依存) なんかがある。

複数のfacilityを指定したいなら、
`mail,ftp.warn`
とか書くとよい

noneを使用すると、そのfacilityの出力を行わない
.

＜Priotity＞
emerg
alert
crit
err
warning
notice
info
debug
上から順にプラオリティが高い（よりヤバい）

facilityのlocal0〜7は、特定のプログラムが所属するfacilityを
既存のと分けたい時に使う

指定したpriorityより低いメッセージのみ出力させたい場合は、
`mail.*;mail.warn` のように記述する。
（この場合、mailのnotice,info,debugが出力される）

特定のpriorityだけ出力させたい場合
`kernel.=warn`
（カーネルの警告だけ出力）

特定のpriorityを出力させたくない場合
`mail.*;mail!=crit`
（mailのcrit以外のメッセージ）

＜Action＞選んだログに対するアクション

他のファイルにわたす→パス
他のプログラムにわたす→｜（パイプ）
他のホストにわたす→＠ホスト名
コンソール出力→ユーザ名

EX:
`*.info;authpriv.none;crone.none  /var/log/messages`
authprivとcronを除いた全てのfacilityでinfo以上のメッセージを/var/log/messagesに出力させる

EX:
`authpriv.* /var/log/secure`
authprivのメッセージを全て/var/log/secureへ

EX:
`*.emerg *`
全てのfacilityでemergのメッセージを、オンラインユーザのコンソールへ
Qiita > もっと検索しやすくするための要望 > 複数タグによる絞込 / レベル付け > [2017/01/09] 複数タグによる絞込みは実装されています

## 要望1.複数タグによる絞込機能 

Qiitaで色々ストックしていると、ストックから記事を探すのが難しくなる。
今のストックの機能では、優先度関係なしに全てのストックが同じレベルで扱われる。

現在、僕の場合は521のストックがあるが、その中で何回も見返したい記事を探すのが難しい。

別のサービスの話だが、はてなブックマークでは複数のタグによる絞込が可能で、それにより探しているブックマークの絞り込みが非常にやりやすい。Qiitaでも複数タグによる絞込機能が欲しい。

<hr>
## 要望2. レベル付機能 (非公開[ストック者のみ分かればいい])

上記の複数タグによる検索が可能となったとしても、記事の作者がタグをあまりつけない場合、有効ではない。

ストックした側で管理できるようなものがあれば、ストックした人にとって記事の検索率および再利用率が高まる。

レベル付機能というのがあればいいかもしれない。

利用例として、よく見かえす記事には「１．HIGHEST」をつけて、たまに見る程度のものには「３．NORMAL」などをつける。
5段階くらい(HIGHEST / HIGHER / NORMAL / LOWER / LOWEST)あればいいかもしれない。

レベルはタグと組合せて検索可能とすることで、ストック者にとって記事の検索性が高まる。

なお、レベルは公開しない方がいい。記事にレベルをつけられるのは記事投稿者にとっては良い面もあり悪い面もあると思う。
「ストックされたけど、レベルが低い」というのは印象が悪い。

<hr>
上記ははてなブックマークなどの外部サービスを使えば可能ではあるが、Qiitaのシステムに含めて欲しい。Kobitoにもあるのが望ましいと思う。
firebaseで、スクラム計画用カードサービスを作ってみる

# 開発環境

* https://koding.com/
* node v0.10.26
* npm v1.4.3
 * npmのコマンド
  * http://qiita.com/yoh-nak/items/8446bf12094c729d00fe

# firebaseアカウント登録
* https://www.firebase.com/

## 料金と無料範囲
* https://www.firebase.com/pricing.html

# firebase hosting
 * https://www.firebase.com/docs/hosting/quickstart.html

## 使い方
### firebase-toolsのインストール

```
$ npm install -g firebase-tools
```

### ログイン

```
rei-no-MacBook-Air:agile_estimate_card alin$ firebase login
Visit this URL on any device to log in:
https://www.firebase.com/login/confirm.html?ticket=XXXXXX

Waiting for authentication...

✔  Success! Logged in as XXXXXX@gmail.com


rei-no-MacBook-Air:agile_estimate_card alin$ firebase logout
✔  Logged out from XXXXXXXX@gmail.com
```

### アプリの初期化

```
rei-no-MacBook-Air:agile_estimate_card alin$ firebase init
? What Firebase do you want to use? sweltering-torch-299
? What directory should be the public root? public
✔  Public directory public has been created
Firebase initialized, configuration written to firebase.json
rei-no-MacBook-Air:agile_estimate_card alin$ ls
firebase.json	public
rei-no-MacBook-Air:agile_estimate_card alin$ vi firebase.json 

```

```
vi firebase.json
------

{
  "firebase": "sweltering-torch-299",
  "public": "public",
  "ignore": [
    "firebase.json",
    "**/.*",
    "**/node_modules/**"
  ]
}
```

### アプリデプロイ

```
vi public/index.html
-------------
<html>
  <head>
    <title>Agile Estimate Card</title>
  </head>

  <body>
    <h1>hello firebase</h1>
  </body>
</html>
```

```
rei-no-MacBook-Air:agile_estimate_card alin$ firebase deploy

=== Deploying to 'sweltering-torch-299'...

i  deploying hosting
i  preparing public directory for upload...
✔  1 files uploaded successfully

✔  Deploy complete!

URL: https://sweltering-torch-299.firebaseapp.com
Dashboard: https://sweltering-torch-299.firebaseio.com

Visit the URL above or run firebase open

```

結果
 ![スクリーンショット 2015-10-28 23.11.41.png](https://qiita-image-store.s3.amazonaws.com/0/13451/80ee8ccc-7388-8f90-8d8c-a20259f9a2d2.png)


# スクラム計画用カードサービスを作ってみる

* https://sweltering-torch-299.firebaseapp.com/index.html
Raspberry Pi 2にArch　Linuxを入れるまで

## SDに書き込む環境を作成
2015/10/30
なんかVirtualBoxのArch Linuxの環境がぶっ壊れてたので[Wiki](https://wiki.archlinuxjp.org/index.php/%E3%83%93%E3%82%AE%E3%83%8A%E3%83%BC%E3%82%BA%E3%82%AC%E3%82%A4%E3%83%89)を見ながら最初から入れなおす。

[Arch arm](http://archlinuxarm.org/)のRaspberry Pi 2を見ながら進めるがvfatのフォーマットが出来ないからパッケージを導入する

```pacman
pacman -S dosfstools
```

色々めんどくさいからターミナル経由でやろうとしたらsshすら入ってなかったのでOpenSSHを導入・・・wgetも入ってなかった

```pacman
pacman -S openssh wget
systemctl enable sshd.service
systemctl start sshd.service
```
でもって、Installationに沿って、ボチボチやればオッケー。

あとはでもSDカード引っこ抜いてラズパイ起動してやればいいんだけど
SSHがrootログインがパスワード認証を拒否してるから、コンソールから
ログインすることを**強いられてるんだ！**
csharp / linq > 大文字小文字関係なしで同じ文字をSelect >  .Where(o => string.Compare(o, term, StringComparison.CurrentCultureIgnoreCase) == 0);

hello / Hello / heLLo をまとめてSelectしたい。

## try1 (ToLowerInvariant()使用)

参考
https://msdn.microsoft.com/ja-jp/library/bb546166.aspx

`ToLowerInvariant()`で小文字に変換したもの同士で == 演算すればいい。

http://ideone.com/yNsDQB

```csharp
using System;
using System.Linq;

public class Test
{
	public static void Main()
	{
		string [] test = new string[3];
		test[0] = "hello";
		test[1] = "Hello";
		test[2] = "heLLo";
		
		string term = "hellO";
		
		var strs = test
			.Where(o => o.ToLowerInvariant() == term.ToLowerInvariant());

		foreach(var x in strs) {
			Console.WriteLine(x);
		}
	}
}
```

```txt:結果
Success	time: 0.05 memory: 24008 signal:0
hello
Hello
heLLo
```

## try2 (string.Compare()使用; こちらの方が良い)

@Temarin_PITA さんに教えていただいた方法。
コードはTemarin_PITAさんのコメントを参照。

LINQを使う場合、インスタンスメソッドやnullなどの考慮が必要でした。今後はそういう部分も意識していければと思います。
VirtualHostの設定

#VirtualHost
##VirtualHostとは
1つのWEBサーバで複数のドメインのWEBサーバを運用すること

##設定方法
```lang:/etc/httpd/conf/httpd.conf
# コメントアウトから外す　VirtualHostを使いますよって意味です。
NameVirtualHost *:80

# 一番下に下記を追加する
<VirtualHost *:80>
    ServerName     www.adminweb.jp
    ServerAdmin    hogehoge@adminweb.jp
    DocumentRoot   "D:/Apache Group/Apache2.2/adminweb_docs"
    CustomLog      logs/adminweb.access.log common
    ErrorLog       logs/adminweb.error.log
</VirtualHost>
```

ServerName   : 設定したいドメイン
ServerAdmin  : 404などのエラーの際に管理者のメールアドレスを表示する
DocumentRoot : サイトのルートディレクトリ
CustomLog    : アクセスログ
ErrorLog     : エラーログ

# Apachを再起動する
```lang:
$ service httpd restart
```
csharp / linq > object[]からHelloを含むstringだけ取得 > var hellos = test.OfType<string>().Where(x => x.Contains("Hello"));

[Qiitaのコメント](http://qiita.com/7of9/items/6b2dd66d676fd7479273#comment-c5f132cb73fb2ee07800)にて教えていただいものを元に勉強。

object[]から"Hello"という文字を含むものだけ取得したい。

参考 [Keibalight](https://keibalight.wordpress.com/2011/07/20/%E3%80%90linq%E3%80%91%E6%9D%A1%E4%BB%B6%E3%81%AE%E5%80%A4%E3%82%92%E5%90%AB%E3%82%80%E8%A6%81%E7%B4%A0%E3%81%AE%E4%B8%80%E8%A6%A7%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B%E3%81%AB%E3%81%AF/)


## NG版

http://ideone.com/BcQ3Ul

```csharp
test
    .Where(o => o.Contains("Hello"))
    .Select(o => o.ToString())
```

上記のようにContains()で絞り込もうとしたら以下のようになった。
> prog.cs(17,20): error CS1929: Type `object' does not contain a member `Contains' and the best extension method overload `System.Linq.ParallelEnumerable.Contains<string>(this System.Linq.ParallelQuery<string>, string)' requires an instance of type `System.Linq.ParallelQuery<string>'


## OK版 (注意点あり)

http://ideone.com/wql0mL

```csharp
using System;
using System.Linq;

public class Test
{
	public static void Main()
	{
		object[] test = new object[5];
		test[0] = "Hello,Ken";
		test[1] = 3.1415;
		test[2] = "Hello,Taro";
		test[3] = "Hi,Yoko";
		test[4] = 27182;
		
		var hellos = 
		  test
			.Where(o => o != null)
			.Select(o => o.ToString())
			.Where(o => o.Contains("Hello"))
			;

		foreach(var hello in hellos) {
			Console.WriteLine(hello);
		}
	}
}
```

```txt:結果
Success	time: 0.05 memory: 24064 signal:0
Hello,Ken
Hello,Taro
```

(追記)
ただし、@NetSeed さんのコメントにあるように、本来望まないものを拾ってしまう場合もあるとのこと。
NetSeedさんの方法`var hellos = test.OfType<string>().Where(x => x.Contains("Hello"));`を使う方がよさそう。


http://ideone.com/WOxBjD
において、

xhellos (OK版)の結果は以下

```txt:結果
Success	time: 0.05 memory: 24024 signal:0
Hello,Ken
Hello,Taro
Test+HelloClass
```

hellos(NetSeedさん版)の結果は以下

```txt:結果
Success	time: 0.04 memory: 24016 signal:0
Hello,Ken
Hello,Taro
```
webpack-dev-serverでReactをES6ですぐに書く

`browserfy`には[wzrd](https://github.com/maxogden/wzrd)や[beefy](https://github.com/chrisdickinson/beefy)のような、ビルド結果をブラウザで即次実行する環境が用意されていますが、webpackで同様のものが[webpack-dev-server](https://github.com/webpack/webpack-dev-server)です。

[分かりやすいサンプルコードが記載されている英語の記事](https://robots.thoughtbot.com/setting-up-webpack-for-react-and-hot-module-replacement)を見つけましたが、日本語で、改めて自分で確認した手順を、下記に掲載したいと思います。

なお、**起動したサーバーは、ファイルの変更を検知して、リビルドを行うライブリロードが標準で付いています**。 [^1]

[^1]: [Hot Module Replacementの設定と仕組みを理解する](http://qiita.com/haradakunihiko/items/40486ec2b6b9aea119bb)

```bash
mkdir react-server
cd react-server
# make some files ...

tree . -L 1
# .
# ├── package.json
# ├── src
# │   ├── index.html
# │   ├── index.js
# │   └── index.css
# └── webpack.config.js
```

下記のpackage.jsonとwebpack.config.jsを作成します。

> babel@6は現状、環境によって動作しないので使用しないで下さい。

```json:package.json
{
  "name": "react-server",
  "scripts": {
    "start": "webpack-dev-server",
    "build": "webpack"
  },
  "devDependencies": {
    "babel-core": "^5.8.33",
    "babel-loader": "^5.3.3",
    "file-loader": "^0.8.4",
    "webpack": "^1.12.2",
    "webpack-dev-server": "^1.12.1"
  },
  "dependencies": {
    "react": "^0.14.1",
    "react-dom": "^0.14.1"
  }
}
```

```js:webpack.config.js
module.exports = {
  context: __dirname + "/src",
  entry: {
    javascript: "./index.js",
    html: "./index.html",
    css: "./index.css",
  },

  output: {
    path: __dirname + "/dist",
    filename: "index.js",
  },
  
  module: {
    loaders: [
      {
        test: /\.js$/,
        exclude: /node_modules/,
        loaders: ["babel-loader"],
      },
      {
        test: /\.html$/,
        loader: "file?name=[name].[ext]",
      },
      {
        test: /\.css$/,
        loader: "file?name=[name].[ext]",
      },
    ],
  },
}
```

ビルド対象のファイル`index.js`,`index.html`,`index.css`を作成します。

```bash
mkdir src
```

```js:src/index.js
import React from 'react'
import ReactDOM from 'react-dom'

class Greet extends React.Component{
  render(){
    return (
      <h1>hello! kiniro-mozaiku</h1>
    )
  }
}

window.addEventListener('DOMContentLoaded',()=>{
  ReactDOM.render (<Greet />,document.querySelector('main'))
})
```

```html:src/index.html
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Document</title>
  <script src="index.js"></script>
  <link rel="stylesheet" href="index.css">
</head>
<body>

  <main></main>
  
</body>
</html>
```

```css:src/index.css
h1{
  font-size:15vw;
}
```

`npm run build`でコンパイル、`npm start`でブラウザ用の即次実行環境を起動します。

```bash
npm install
npm start
# webpack: bundle is now VALID.
# http://localhost:8080/webpack-dev-server/
```

http://localhost:8080/webpack-dev-server/ にアクセスすると、下記のようになるはずです。

![スクリーンショット 2015-11-01 08.54.38.png](https://qiita-image-store.s3.amazonaws.com/0/28576/23154556-a061-980e-b1bc-2b0b7a3ab7dd.png)

ほかの参考記事（日本語）
---
* [webpack-dev-serverで継続的なクライアントサイドテスト - Namiking.net](http://blog.namiking.net/post/2015/09/test-webpack-browser/)
* [ReactとStylusをwebpackで使うための開発環境構築 - twopipe Get going!](http://www.twopipe.com/front-end/2014/12/22/react-webpack-env.html)
ERROR ITMS-90049: "This bundle is invalid. The bundle identifier contains disallowed characters. [See the section of the Application Programming Guide entitled The APplication Bundle.]" の解消方法

Xcode7.1から申請（バイナリupload）すると

```
ERROR ITMS-90049: "This bundle is invalid. The bundle identifier contains disallowed characters. [See the section of the Application Programming Guide entitled The APplication Bundle.]"
```

このようなエラーが出た
以下のように対応した

サードパーティSDKのinfo.plistのTarget membershipを確認し、チェックがあったら全て外す


これで、申請時のエラーはなくなった
refactoring > ここでひとつ強調しておきたいのは、リファクタリングによって以前動いていたテストが動かなくなったときには、デバッグをしてはいけないということだ。作業をアンドゥして、よく調べよう。

@ テスト駆動開発による組込みプログラミング by James Grenning

> ここでひとつ強調しておきたいのは、リファクタリングによって以前動いていたテストが動かなくなったときには、デバッグをしてはいけないということだ。作業をアンドゥして、よく調べよう。問題が本当に明らかになれば、修正を試みよう。だがグリーンに戻すまでにどれくらいアンドゥが必要になるか、常に意識しておこう。もし１度や２度の変更でテストが成功しなければ、あなたは穴にはまっている。そのときに掘るのはやめよう。

gitなりを使うことによって上記のようなことがやりやすくなった。
また、テストを用意することで「動かなくなった」状況を把握しやすくなる。
ニブル / nibble > 4ビットを意味する

@ テスト駆動開発による組込みプログラミング by James Grenning

> ...計算が簡単で、２つのビットが異なるニブルにあるためだ。
...
> 監訳注: ニブル(nibble)は4ビットを意味する

<hr>
http://e-words.jp/w/%E3%83%8B%E3%83%96%E3%83%AB.html
> ニブルとは、情報量の単位の一つで、4ビットに相当する。

バイト (8ビット)より小さい単位としてニブルがあるようだ。
TDD / naming > 4フェーズドテストパターン > 準備(setup)、実行(exercise)、検証(verify)、後片付け(cleanup/teardown) > exercise

@ テスト駆動開発による組込みプログラミング by James Grenning

> テストケースには、４フェーズドテストパターンの各ステップ、準備(setup)、実行(exercise)、検証(verify)、後片付け(cleanup/teardown)が目に見えなくてはならない。

「実行」をrunやexecuteでなくexerciseと定義するのを初めて見た。

exerciseで検索すると、physicalトレーニングに相当するものが検索結果にひっかかってしまう。

<hr>
https://robots.thoughtbot.com/four-phase-test

確かに exercise としている例がある。
naming > モジュール初期化 / クリーンナップ の関数 > Create() / Destroy()

@ テスト駆動開発による組込みプログラミング by James Grenning

モジュールの初期化とクリーンナップのための関数として
> 約束事として、私はCreate関数とDestroy関数をそれぞれのモジュールに用意している

過去に出くわした関数例としては
Create()に対応するもの
- Init()
- Setup()

Destroy()に対応するもの
- TearDown()
- Terminate()
- Finalize()

どれを選択すれば正しいか分からないが、一貫性があればいいと思う。
技術英語 > [the situation is that] it's not only new exposure / the problem is that / Another possibility is that

@ LOE > April 13, 2012

http://loe.org/shows/shows.html?programID=12-P13-00015
> <font color=red>the situation is</font> that it's not only new exposure

The xxx is thatという構文。

<hr>
関連して思い出したのは1 (ソースは失念: lapse of memory)

> The problem with those places is that ... 

<hr>
関連して思い出したのは2

http://loe.org/shows/segments.html?programID=04-P13-00043&segmentID=5
> Another possibility is that web users may find information that
Laravel5でアプリ毎にディレクトリを分ける方法。

これを使ってみました。
https://github.com/pingpong-labs/modules  
  
インストールの方法ドキュメントはこちら
http://sky.pingpong-labs.com/docs/2.0/modules  
  
自分の場合は Admin と Front のそれぞれモジュールを分けました。
artisanのコマンドとかも各モジュール毎に実行できるようにしてくれるので良さげなんじゃないかなーと。
入れたばかりなので、問題点とか、使用感とか分かったらまた更新します。
Equalsを短く実装する

#はじめに
Eclipseを使用して実装している。hashCode()とかequals(Object)を生成してくるのだが、hashCode()はいいのだが、equals(Object)は長くて見にくい。いや、ちゃんと動くし、いいんですよ。しかし、個人的には生成されたソースが見た目悪いので、どうやればすっきりとしたソースになるか検証してみた。

#基本のソース

```java:EqualsTest.java
public class EqualsTest {

	private String name;
	private int age;
	private boolean isMan;
}
```

ベースのクラスはこんな感じ。オブジェクト、数値リテラル、boolean型を網羅するようにした。

#hashCode()を見る
Eclipseが生成するコードは下記のよう。良いと思う。

```java:EqualsTest.java
@Override
public int hashCode() {
	final int prime = 31;
	int result = 1;
	result = prime * result + age;
	result = prime * result + (isMan ? 1231 : 1237);
	result = prime * result + ((name == null) ? 0 : name.hashCode());
	return result;
}
```

#equals(Object)を生成する

```java:EqualsTest.java
public boolean equals(Object obj) {
	if (this == obj)
		return true;
	if (obj == null)
		return false;
	if (getClass() != obj.getClass())
		return false;
	EqualsTest other = (EqualsTest) obj;
	if (age != other.age)
		return false;
	if (isMan != other.isMan)
		return false;
	if (name == null) {
		if (other.name != null)
			return false;
	} else if (!name.equals(other.name))
		return false;
	return true;
}
```

オブジェクト部分が長いと思う。一つのオブジェクトに5行だと、10つオブジェクト変数があると、50行になる。それは頂けないかと。

# 自分でequals(Object)を考えてみる

```java:EqualsTest.java
public boolean myEquals(Object obj){
	if (this == obj) return true;
	if (obj == null || hashCode() != obj.hashCode() || ! (obj instanceof EqualsTest)) return false;

	EqualsTest other = (EqualsTest) obj;
	boolean result = true;
	result = result && (isMan == other.isMan);
	result = result && (age == other.age);
	result = result && (name == null ? other.name == null : name.equals(other.name));
		return result;
}
```

こんな感じでどうだろう。
変数がオブジェクトでも一行。だいぶ行数の節約になるはず。
生成されたソースはfalseとわかった時点でreturnしているので実行速度は速い。それに対し、こちらは変数分の判定を実施しているので遅い。しかし、個人的にはそのデメリット以上に見やすくて良いつもり。

# getClassとinstanceOfの違い
さて二つの相違点として型比較を、生成されたものはgetClass()で、自分で考えてみたものはinstanceOfを使用しています。どこで差が出てくるかというと、継承を使ったときです。「Effective Java 第2版」の項目8から引用させて頂きます。
単純な座標情報のクラスPointがあったとします。Pointに色情報を追加したサブクラスColoredPointを作ります。さて、PointとColoredPointで座標が同じ場合どうなるでしょうか。
point.equals(coloredPoint)ではPointには色情報がないのだから、座標情報があればequalsはtrueでは？でもcoloredPoint.equals(point)は色情報の有無があるからfalseになるべきでは、ということになります。本来point.equals(coloredPoint)とcoloredPoint.equals(point)の結果は同じにならなければならないのに。
ちなみに本書のなかでは「継承よりコンポジションを選びなさい」というオチになってます。継承せずに、PointとColorの変数を持つColoredPointを作ろう、と。

# 終わりに
ソースは、
https://github.com/xaatw0/quiita/blob/master/src/EqualsTest.java
に置いてあります。生成されたequalsと自分で作成したequalsが同じ結果を出すことを確認したテストコード、継承を使ったときは違う結果になるテストコードも入っています。
それにしても、普通equalsの実装で皆さんどうされているのでしょうか。
代替データストリーム（ADS）について色々調べてみた

[Windows コマンドプロンプト ポケットリファレンス（書籍）](http://www.amazon.co.jp/Windows-%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%83%97%E3%83%AD%E3%83%B3%E3%83%97%E3%83%88-%E3%83%9D%E3%82%B1%E3%83%83%E3%83%88%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9-%E5%B1%B1%E8%BF%91-%E6%85%B6%E4%B8%80/dp/4774149543)を読んでいると「代替データストリーム（ADS）」という用語が登場し、気になったので色々調べてみました。

## 代替データストリーム（ADS）って何？
１．NTFSファイルシステムのファイル／ディレクトリに保存できる、隠しファイル
２．１つのファイル／ディレクトリに対して複数のADSを保存できる
３．用途の例としては、インターネットからダウンロードしたファイルを開く時に警告画面を表示させる、など
４．Poison Ivy（トロイの木馬）などのマルウェアの隠し場所としても悪用されているらしい
５．[streams.exe](https://technet.microsoft.com/ja-jp/sysinternals/bb897440)でADSの検索／削除が可能
６．Windows標準機能(コマンドプロンプト、PowerShell含む）でも、ADSの作成／検索／削除が可能


今回は、コマンドプロンプトとPowerShellを利用してADSの作成／検索／削除を行ってみた
※[streams.exe](https://technet.microsoft.com/ja-jp/sysinternals/bb897440)を利用したADSの検索／削除の方法は、[参考記事](http://www.atmarkit.co.jp/fwin2k/win2ktips/1363streams/streams.html)を参照

## 実行環境
OS：Windows 10 Home（64bit）
PowerShellバージョン：5.0


## 代替データストリーム（ADS）の作成

```bat:コマンドプロンプト
C:\test>mkdir foo

C:\test>echo bar>foo:hoge.txt
　
```

上記例では、ディレクトリfooを作成後、ディレクトリfooに「bar」という内容が書かれた「hoge.txt」という名称のADSを保存している

## 代替データストリーム（ADS）の検索

ADSを含むファイル一覧を表示させたい場合、以下のようにコマンドを実行するとよい

```bat:コマンドプロンプト
c:\test>dir /r
 ドライブ C のボリューム ラベルがありません。
 ボリューム シリアル番号は 344F-DD0A です

 c:\test のディレクトリ

2015/11/01  01:19    <DIR>          .
2015/11/01  01:19    <DIR>          ..
2015/11/01  01:16    <DIR>          foo
                                  5 foo:hoge.txt:$DATA
               0 個のファイル                   0 バイト
               3 個のディレクトリ  68,721,668,096 バイトの空き領域
```

ADSの行だけを抽出したい場合、PowerShellと組み合わせて以下のようにコマンドを実行するとよい

```ps1:PowerShell
PS C:\test> cmd /c 'dir /r' | ?{$_.Contains('$DATA')}
                                  5 foo:hoge.txt:$DATA
```


ADSの内容を確認したい場合は、以下のようにコマンドを実行するとよい

```bat:コマンドプロンプト
C:\test>more < foo:hoge.txt
bar
```


## 代替データストリーム（ADS）の削除

ADSを削除したい場合は、以下のようにコマンドを実行するとよい

```ps1:PowerShell
PS C:\test> Remove-Item foo -Stream hoge.txt
```

## まとめ
活用方法としては、例えば、開発時に、ソースファイル（PHPなど）にリビジョン番号などのバージョン情報をADSとして付与しておけば、万が一、デプロイ後に現地でソース変更が発生した場合でも、開発環境へのマージがしやすくなりそうだと思いました。
ただし、マルウェアに悪用されるなどのケースも発生しているようなので、ADSは慎重に扱った方が良さそうです。


## 参考
[Windows コマンドプロンプト ポケットリファレンス（書籍）](http://www.amazon.co.jp/Windows-%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%83%97%E3%83%AD%E3%83%B3%E3%83%97%E3%83%88-%E3%83%9D%E3%82%B1%E3%83%83%E3%83%88%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9-%E5%B1%B1%E8%BF%91-%E6%85%B6%E4%B8%80/dp/4774149543)
[streamsコマンドでNTFSの代替データ・ストリーム情報を表示／削除する](http://www.atmarkit.co.jp/fwin2k/win2ktips/1363streams/streams.html)
[Poison Ivyにみるマルウェアの隠し場所](http://security.excite.co.jp/fsecureblog/article/1483)
VecやHashMapなどでミュータブルな型を得る際の注意点

この記事は `rustc 1.4.0 (8ab8581f6 2015-10-27)` で動かすことを想定しています。

## はじめに
久々に時間が取れたのでRustの勉強をしていました。
普段はPerlやRuby等でプログラミングをしていたので、HashをRustでも使ってみたくて下のようなコードを書きました。

```rust
use std::collections::HashMap;

#[derive(Debug)]
struct I {
  vec: Vec<i64>
}

fn main() {
  
  let mut a: HashMap<i64, I> = HashMap::new();
  let mut i = I { vec: vec!(1,2,3) };
  a.insert(1, i );
  let mut b = a.get(&1).unwrap();
  b.vec.push(1);
  println!("{:?}", b);
}
```
結果は、

```bash
src/main.rs:14:3: 14:8 error: cannot borrow immutable field `b.vec` as mutable
src/main.rs:14   b.vec.push(1);
                 ^~~~~
error: aborting due to previous error
Could not compile `test`.
```
イミュータブルなフィールドを可変として借りれないといったエラーが発生しました。ここで混乱。どうして、`let mut` で値取得してるのにイミュータブルなんだろうと・・・。

## そもそも HashMapのgetはイミュータブルな値しか返さない

ちょっと驚きましたが、`get` はイミュータブルな値のみ返すようです。
ミュータブルな値を返すには、`get_mut` を使うと良いようです。

同じように、`Vec` では、`iter`が イミュータブルな値を返し、 `iter_mut` がミュータブルな値を返します。

## 学習のカギ

Rust言語は言語仕様がまだまだよく変わってしまう言語なので、Github等で検索するとおすすめです。

### get_mut
[GitHub::Search - get_mut](https://github.com/search?l=rust&q=get_mut&ref=searchresults&type=Code&utf8=%E2%9C%93)

### iter_mut
[GitHub::Search - iter_mut](https://github.com/search?l=rust&q=iter_mut&ref=searchresults&type=Code&utf8=%E2%9C%93)
Railsでfaviconを設定する


# はじめに

Railsのバージョンは4.2.1で確認。

# faviconのメソッドとiconファイルの参照箇所について

`favicon_link_tag`メソッドの引数を省略するとパスはapp/assets/images以下にあるfavicon.icoを参照する。

```ruby
<%= favicon_link_tag() %>
```

assetpipelineを使っているなら

```html
 <link rel="shortcut icon" type="image/x-icon" href="/assets/favicon-f864e77e8c0e38c5aced6c94986a3bea59d6c4fa37787e7cd6bb1fa39b794001.ico" />
```

これは次のようにするのと同じ

```ruby
<%= favicon_link_tag('favicon.ico') %>
```

iOSのアイコンなどを指定する際はapp/assets/images/apple-touch-icon-180x180.pngにファイルを置いて次のように指定

```ruby
<%= favicon_link_tag('apple-touch-icon-180x180.png',
                     {:rel => 'apple-touch-icon',
                      :sizes => '180x180',
                      :type => 'image/png'}) %>
```


/favicon.icoなどのように指定した時はpublic/favicon.icoを参照する。

```ruby
<%= favicon_link_tag('/favicon.ico') %>
```


```html
<link rel="shortcut icon" type="image/x-icon" href="/favicon.ico" />
```

# 自分はどうしてるか

基本的なfavicon.icoは下記のように引数を省略せずパス指定せず設定してる。なぜかというと省略したらどうなるかを憶えていられる自信はないし、実ファイルがassets/assets/favicon.icoにしかないのでここを参照していることが確認にもなる。

```ruby
<%= favicon_link_tag('favicon.ico') %>
```
UIViewControllerに、同名のStoryboardから生成する能力を与える


iOSの開発をしていると、UIViewControllerと同名のStoryboardを用意しておいて、UIViewControllerを生成するコードがよく書くと思います。

```swift:Storyboardから生成
let storyboard = UIStoryboard(name: "SampleViewController", bundle: nil)
let viewController = storyboard.instantiateInitialViewController() as! SampleViewController
```

覚えてしまえば簡単なコードですが **出来れば共通化したい**ところです。

# 共通化
そこで Swift 2.0 から追加された「protocol extension」を使って、UIViewControllerにその能力を与えられるようにしてみました。

具体的には、以下のようにプロトコルを採用するだけでその能力が得られるようにしてみました。

```swift
// ViewControllerの定義
class SampleViewController: UIViewController, StoryboardInitializable {
}

// 生成
let viewController = SampleViewController.instantiateStoryboard()
```

# 仕組み
以下のようにプロトコルとその拡張を用意することで実現しています。

```swift:実装
protocol StoryboardInitializable {
}

extension StoryboardInitializable where Self: UIViewController {
    
    static func instantiateStoryboard() -> Self {
        let type = Mirror(reflecting: self).subjectType
        let name = String(type).componentsSeparatedByString(".")[0] // クラス名を取得
        let storyboard = UIStoryboard(name: name, bundle: nil)
        let viewController = storyboard.instantiateInitialViewController() as! Self
        return viewController
    }
}
```

# Xibからの生成にも対応する
UIViewを同名のNibファイル（.xib）から生成することもよくあります。こちらも同じ仕組みで共通化してみました。

```swift:使い方
// Viewの定義
class SampleView: UIView, XibInitializable {
}

// 生成
let view = SampleView.instantiateXib()
```

```swift:実装
protocol XibInitializable {
}

extension XibInitializable where Self: UIView {
 
    static func instantiateXib() -> Self {
        let type = Mirror(reflecting: self).subjectType
        let name = String(type).componentsSeparatedByString(".")[0] // クラス名を取得
        let nib = UINib(nibName: name, bundle: nil)
        let view = nib.instantiateWithOwner(self, options: nil)[0] as! Self
        return view
    }
}
```

# 全てのUIViewController/UIViewに適用する
プロトコルの採用すら省略したい、という場合には以下のようにUIViewController/UIViewをextensionで拡張することで何も書かずともStoryboard/xibから生成する能力を得られます。

```swift:UIViewController/UIViewを拡張して全てに適用する
extension UIViewController : StoryboardInitializable {
}

extension UIView : XibInitializable {
}

// 何も書かかなくても使えるようになる
let viewController = SampleViewController.instantiateStoryboard()
let view = SampleView.instantiateXib()
```

ただしこうした場合、同名のStoryboard/xibから生成することを意図していないクラスに対しても呼べてしまうので注意が必要です。（が、実際に不都合が起こるケースは稀かと思います）

# まとめ
* UIViewControllerで`StoryboardInitializable`プロトコルを採用すると、同名のStoryboardから生成する能力を得られます
* UIViewで`XibInitializable`プロトコルを採用すると、同名のNibファイル（.xib）から生成する能力を得られます
* Swift 2.0 から導入された「protocol extensions」は便利！

コード全体:
https://github.com/YusukeHosonuma/SwiftCommons/blob/master/SwiftCommons/ResourcesInitializable.swift

# SwiftCommons

Swiftの勉強用として作り始めた共通ライブラリです。発展途上ですが、MITライセンスですのでよろしければご利用ください。
https://github.com/YusukeHosonuma/SwiftCommons
Mac OS X にて Android Studioのキーボードショートカットがおかしい

# 発端

Android Studioにて、Keymapを"Eclipse (Mac OS X)"をベースととした独自設定で使っていたところ、戻る(Back, Cmd+[)と進む(Forward, Cmd+])をキーボードショートカットで呼び出そうとしたところどうも挙動がおかしい…

Keymapのキーボードショートカットを追加(Add Keyboard Shortcut)で同じキーをを入力したところ打った文字と違う文字が認識されている(!?)ことが判明した。

# 原因

Android Studio の元となった IntelliJ IDEA のバグ(IDEA-63779)で、キーボードショートカットが、USキーボードレイアウトに依存してしまっているようで、US以外(JPなど)のキーボードレイアウトだとショートカットのだとキーが正しく認識されないようだ。

# 対処

**注意: Android Studio 2.0 ではこの対処法は利かなくなってしまっているようです**

Android Studio が認識しているキーがずれているだけなので、よく使うキーボードショートカットについて個別に設定しなおすというのも一つの手だが、非常に ~~面倒くさいので~~ **非効率なので** 避けたい。

実はこれに対する試作(?)修正が実装済みだが、デフォルトでは無効になっているので有効にするとうまくいくようだ。

1. Android Studioを起動し、適当なプロジェクトを開いておく
1. [Help] > [Find Action] にて "Registry" と入力し `Registry...` が選択された状態で Enter
1. 表示されたダイアログ(Registry)のリスト内の `ide.non.english.keyboard.layout.fix` にチェックをつける
1. [Close]でダイアログを閉じてAndroid Studioを再起動する

以上の手順でキーボードショートカットが正常に動作するようになった。
ただし、この修正で全ての問題が修正されるワケではないらしいので、場合によってはキーボードショートカットの再設定が必要かもしれない。
なお、Android Studio以外のIntelliJ IDEAベースのIDEについても同様の方法が使えるかもしれないがこれは未確認。

# 参考
* [IDEA-63779 Keymap shows characters for keys only for english keyboard layout correctly]
(https://youtrack.jetbrains.com/issue/IDEA-63779)

* [Jetbrains' IDEs Problems with Other Keyboard Layout]
(https://www.konpat.me/2015/07/23/jetbrain-IDEs-problems-with-keyboard-layout/)
C# : ソシャゲで使える曜日限定区分サンプル

### 用途
- 曜日限定のマスタデータを定義する場合に１レコードで管理できる

|ID|Caption||Dow|
|---|---|---|---|
|1|火曜限定|　|2|
|2|土日曜限定|　|96|
※Dow = DayOfWeek

### ルール

|0|1|2|4|8|16|32|64|
|---|---|---|---|---|---|---|---|
|指定なし|月曜|火曜|水曜|木曜|金曜|土曜|日曜|
- 土曜日を定義したい場合は **32** になる
- 土曜と日曜日を定義したい場合は **96** （32+64）になる
- 月曜と水曜と金曜日を定義したい場合は **21** （1+4+16）になる
- ビット演算を利用して曜日の組み合わせを **0～127** の数値で定義することができる（但し0と127は同じ結果）

### **チェック処理**
```csharp:Program.cs
using System;

public class Program{
    public static void Main(){
        Console.WriteLine(string.Format("MasterData({0}) is Saturday? {1}", 1, isDayOfWeek(1) ? "yes" : "no"));
        Console.WriteLine(string.Format("MasterData({0}) is Saturday? {1}", 32, isDayOfWeek(32) ? "yes" : "no"));
        Console.WriteLine(string.Format("MasterData({0}) is Saturday? {1}", 34, isDayOfWeek(34) ? "yes" : "no"));
        Console.WriteLine(string.Format("MasterData({0}) is Saturday? {1}", 64, isDayOfWeek(64) ? "yes" : "no"));
        Console.WriteLine(string.Format("MasterData({0}) is Saturday? {1}", 127, isDayOfWeek(127) ? "yes" : "no"));
    }

    /// <summary>対象日チェック処理</summary>
    /// <param name="dow">DayOfWeekFlg</param>
    /// <returns>True:Target, False:Non Target</returns>
    static bool isDayOfWeek(int dow)
    {
        if (dow == 0) return true;
        return (dow & 1 << (DateTime.Now.DayOfWeek == DayOfWeek.Sunday ? 6 : (int)DateTime.Now.DayOfWeek - 1)) == 0 ? false : true;
    }
}
```

実行結果（土曜日に実行した場合）

```bash
MasterData(1) is Saturday? no
MasterData(32) is Saturday? yes
MasterData(34) is Saturday? yes
MasterData(64) is Saturday? no
MasterData(127) is Saturday? yes
```

数値を曜日に変更するサンプル

```csharp:Program.cs
using System;
using System.Collections.Generic;

public class Program{
    public static void Main(){
        for (int i = 1; i < 127; i++)
        {
            Console.WriteLine(string.Format("{0} : {1}", i, nameDayOfWeek(i)));
        }
    }

    static string nameDayOfWeek(int dow)
    {
        List<string> ret = new List<string>();
        if ((dow & 1) == 1) ret.Add("月");
        if ((dow & 2) == 2) ret.Add("火");
        if ((dow & 4) == 4) ret.Add("水");
        if ((dow & 8) == 8) ret.Add("木");
        if ((dow & 16) == 16) ret.Add("金");
        if ((dow & 32) == 32) ret.Add("土");
        if ((dow & 64) == 64) ret.Add("日");
        return string.Join(".", ret);
    }
}
```

実行結果

```bash
  1 : 月
  2 : 火
  3 : 月,火
  4 : 水
  5 : 月,水
   ...
124 : 水,木,金,土,日
125 : 月,水,木,金,土,日
126 : 火,水,木,金,土,日
127 : 月,火,水,木,金,土,日
```
今まで出会ったBad Coding.(java6)

某プロジェクトでみた未来へ引き継ぎたくないコーディング例を書いていく。
できれば二度と会うことのないよう祈願して厄落とし的に書いていきたい…
java6で開発している世界の話。


ここに記載したコードは、某プロジェクトで見た邪悪な既存コードをなんとなく再現したものです。
すでにバッドノウハウと化したコード、意味をなさないコード、バグ、頭おかしいやつなど混在してます。

# インスタンスの再利用
```java
public class HogeBean {
  private String key = "";
  private val = 0;
}
```
```java
public class LogicClass{
  public void bizLogic(List inputList){
    HogeBean hoge = new HogeBean();
    for(Object input: inputList){
      init(hoge); //すでに存在するインスタンスの各フィールドを初期化
      hoge.setKey(input.getXXX());
      hoge.setVal(input.getYYY());
      // hogeを処理する
    }
  }

  private void init(HogeBean b){
    b.setKey("");
    b.setVal(0);
  }
}
```

太古の昔であれば、newに時間がかかるからー、という性能のためにこのアプローチあったと思うんだけど、今となっては可読性を殺しにかかってたし意図がわからないコードになってるからきつい。
いまなら、普通にループでもnewしてやったほうがいいと思うの。



# 過剰なリテラルの忌避
```java
final static String BLANK_STRING = "";
if(BLANK_STRING.equals(hoge)){
  //処理
}
const int INT_ZERO = 0;
if(fooArray.size() == INT_ZERO){
  //処理
}
``` 
文字列に対して""とか、sizeに対して0を比較くらいであれば、リテラルで指定すればいいのに。いいのに。

# 過剰なリテラルの忌避２
``` java
const int INT_THREE = 3; //3
if(inputVal == INT_THREE){
  //処理
}
``` 
適当に名前つけたらマジックナンバーじゃなくなるわけじゃないし、コメントもジョークかとおもった。

# return (条件文) ? true : false;

return (条件文) ;でええんやで。

# int am7 = 070000 
※なぜか数値で時刻を表現してた実装。

``` java
int am7  = 070000; // 7時
int pm18 = 180000; //18時
```

多分桁合わせるために、0つけたんだろうけど、
頭に0つけた数値リテラルなんて８進数になるに決まっとる…
そもそもなんで時刻をint値で表現していたのか…

# ProjectNameUtil.isNull(String s)

``` java
public boolean isNull(String s){
  return s == null || "".equals(s);
}
```
名前と挙動が一致してない。完全にトラップ実装。
多分長さ0の文字列はnullと一般的に言われていると思ってるやつが書いた。
ちなみにプロジェクトでは普通にStringUtilsがインポートされてるので、車輪の再生産な上に悪質。
こういう実装が既存コードの奥にそれなりに存在していたので、ソースリーディング時は奥深くまで読まなければならずレビュアとしてはストレスフル。

# まとめ

厄落としとして書いてみた、
今回の開発は元から存在した既存コードが今回の記事のような邪悪さをもつコードだったので、今後はこのような負債と関わり合いにならないように生きたい。
CMD - test -f "$1" と test -d "$1"

@echo off
@rem    シェルスクリプトの test -d "$1" 相当
@rem
    if (%1)==() goto usage
    @rem ディレクトリとファイルあり
    if not exist %1\*.* goto check_dir
    @echo "フォルダ %1 は存在し、ファイルもあります"
    exit /b
    
:check_dir
    @rem ディレクトリのみあり
    if not exist %1\nul goto not_exist
    @echo "フォルダ %1 は存在するが、ファイルはありません"
    exit /b

:not_exist
    @rem ディレクトリ, ファイルともになし
    @echo "ディレクトリ %1 とファイルともにありません"
    exit /b

:usage
    @echo "Usage: %0 DIRNAME"
Perl : ソシャゲで使える曜日限定区分サンプル

### 用途
- 曜日限定のマスタデータを定義する場合に１レコードで管理できる

|ID|Caption||Dow|
|---|---|---|---|
|1|火曜限定|　|2|
|2|土日曜限定|　|96|
※Dow = DayOfWeek

### ルール

|0|1|2|4|8|16|32|64|
|---|---|---|---|---|---|---|---|
|指定なし|月曜|火曜|水曜|木曜|金曜|土曜|日曜|
- 土曜日を定義したい場合は **32** になる
- 土曜と日曜日を定義したい場合は **96** （32+64）になる
- 月曜と水曜と金曜日を定義したい場合は **21** （1+4+16）になる
- ビット演算を利用して曜日の組み合わせを **0～127** の数値で定義することができる（但し0と127は同じ結果）

### **チェック処理**
```pl:hoge1.pl
use strict;
use warnings;
use utf8;
use DateTime;
use constant {
    MON => 1,  TUES => 2, WED  => 4, THUR => 8,
    FRI => 16, SAT => 32, SUN => 64,
};

printf "MasterData(%d) is Saturday? %s\n",   1, !is_dayofweek(1)? "no":"yes";
printf "MasterData(%d) is Saturday? %s\n",  32, !is_dayofweek(32)? "no":"yes";
printf "MasterData(%d) is Saturday? %s\n",  34, !is_dayofweek(34)? "no":"yes";
printf "MasterData(%d) is Saturday? %s\n",  64, !is_dayofweek(64)? "no":"yes";
printf "MasterData(%d) is Saturday? %s\n", 127, !is_dayofweek(127)? "no":"yes";


# 0:対象日外、0以外:対象日
sub is_dayofweek {
    my ($dow) = @_;
    return 1 unless $dow; # 0の場合は全有効
    return $dow & (1 << DateTime->today->day_of_week_0);
}

1;
```

実行結果（土曜日に実行した場合）

```bash
$ perl hoge1.pl
MasterData(1) is Saturday? no
MasterData(32) is Saturday? yes
MasterData(34) is Saturday? yes
MasterData(64) is Saturday? no
MasterData(127) is Saturday? yes
```

1,0 でチェックしたい場合

```pl
# 0:対象日外、1:対象日
sub is_dayofweek {
    my ($dow) = @_;
    return 1 unless $dow; # 0の場合は全有効
    return ($dow & (1 << DateTime->today->day_of_week_0))? 1 : 0;
}
```

数値を曜日に変更するサンプル

```pl:hoge2.pl
use strict;
use warnings;
use utf8;
use DateTime;
use Encode;
use constant {
    MON => 1,  TUES => 2, WED  => 4, THUR => 8,
    FRI => 16, SAT => 32, SUN => 64,
};

for my $i (1..127) {
    printf "%3d : %s\n", $i, dayofweek_name($i);
}

sub dayofweek_name {
    my ($dow) = @_;
    return '' unless $dow;
    my @ret;
    push @ret, '月' if ( $dow & MON  );
    push @ret, '火' if ( $dow & TUES );
    push @ret, '水' if ( $dow & WED  );
    push @ret, '木' if ( $dow & THUR );
    push @ret, '金' if ( $dow & FRI  );
    push @ret, '土' if ( $dow & SAT  );
    push @ret, '日' if ( $dow & SUN  );
    return encode('utf-8',(join ',', @ret));
}

1;
```

実行結果

```bash
$ perl hoge2.pl
  1 : 月
  2 : 火
  3 : 月,火
  4 : 水
  5 : 月,水
   ...
124 : 水,木,金,土,日
125 : 月,水,木,金,土,日
126 : 火,水,木,金,土,日
127 : 月,火,水,木,金,土,日
```
cmd - dirname、basename相当

@echo off
@rem unix の dirname相当
    @rem コマンドプロンプトの find は unix の grep に相当する
    dir %1 | find "\<DIR>"

@rem unix の basename相当
    @rem コマンドプロンプトの find /v は grep の -v と同じ
    dir %1 | find /v "\<DIR>" | find /v " 0 " | find /v "ファイル"
移動先でsudo -iでコマンドを実行する

Vagrantのプロビジョニング用のスクリプトを以下のように用意したら意図と違う動作をした。
（コマンド自体に深い意味はないです）

```bash:prov.sh
#!/bin/bash
cd /tmp
sudo -i -u vagrant pwd
```

結果は`/tmp`じゃなくて`/home/vagrant`になる。

以下のようにすると、移動先でコマンドを実行できる。

```bash:prov.sh
#!/bin/bash
sudo -i -u vagrant bash -c "cd /tmp; pwd"
```

`sudo -i`しなければ前のスクリプトでも問題ないですが、ユーザーの環境変数を参照するようなコマンドを実行する場合にはこういうやり方が必要でした。
UNIDUINOdemoの使い方

`UNIDUINOdemo.app`を起動するとこんなDialogが出現されます。
![スクリーンショット 2015-10-31 23.49.48.png](https://qiita-image-store.s3.amazonaws.com/0/67575/edc9b05d-75e6-929c-6ef7-46d0de9c310c.png)
`Windowed`にチェックを入れておくと、Windowで起動するので便利です。
サイズはPCの画面サイズに合わせて自由に選択してください。
cmd - 第1引数で指定したファイルを第2引数で指定したフォルダに移す

@echo off
@rem    第1引数で指定したファイルを、第2引数で指定したフォルダに移す
    if (%2)==() goto error
    if exist %1 goto del_old
    echo "ERROR: not found %1"
    goto exit

:del_old
    @rem 移動先に同名のファイルがあったら消す
    if exist %2\%1  del %2\%1
    @rem 移動先に同名のファイルが無ければ移動処理(move_to)へ進む
    if not exist %2\%1 goto move_to
    @echo "ERROR: could not delete old file"
    goto exit

:move_to
    @copy %1 %2\%1
    if exist %2\%1 goto del_src
    @echo "ERROR: could not copy"
    goto exit

:del_src
    del %1
    if not exist %1 goto finish
    @echo "ERROR: could not delete original file"
    goto exit

:finish
    @echo "%0 is finished."
    goto exit

:error
    @echo "Usage: %0 source dest"

:exit
HTMLのよく使うタグ集

# はじめに
この前Amon2で簡易ツイッターを作った際にいちいち探していたので、まとめました。
アプリケーションを作る際によく使いそうなhtmlの備忘録です。

## form：入力・送信フォームを作成する 
\<form>～\</form>の間に、 \<input>・\<select>・\<textarea>などのタグにより、一行テキストボックス・ボタン・チェックボックス・ラジオボタン・セレクトボックス・スクロールテキストボックス等の部品を配置できる。

フォームに入力されたデータは、送信ボタンを押すことでCGIプログラム等へ送信。
**送信先はaction属性**で、**転送方法はmethod属性**で、**データ形式はenctype属性**でそれぞれ指定。

| 属性 | 使用方法 | 動作 |
| :--: | :--- | :--- |
| action | action="URI" | 送信先プログラムのURIを指定する |
| method | method="HTTPメソッド" | 送信の際の転送方法（HTTPメソッド）を指定する |
| enctype | enctype="MIMEタイプ" | 送信の際のデータ形式（MIMEタイプ）を指定する |
| accept-charset | accept-charset="文字セット" | CGIプログラム等のデータの受け側で、受付可能な文字セットを指定する |
| accept | accept="MIMEタイプ" | CGIプログラム等のデータの受け側で、処理可能なMIMEタイプを指定する |
| name | name="名前" | スクリプト言語などから参照できるよう名前を指定する |
| target | target="フレーム名" | フォーム送信の結果を表示するフレーム、またはウィンドウの名前を指定する |

- `login.tx`で`action="<: uri_for('/login') :>"`で以下にloginのテンプレ。
- `method='/post'`には小文字大文字どちらでもよい



## input：各入力フィールドにデータを入力
テキスト入力欄や実行ボタン等、フォーム（\<FORM>～\</FORM>）を構成する部品を作成。
type属性の値により、一行テキストボックス・チェックボックス・ラジオボタン・実行ボタン・リセットボタン等の部品となる。

\<FORM>でデータが送信する際には、\<INPUT>タグのname属性で付けたデータ名とその値を一組にして、\<FORM>タグのaction属性で指定したサーバー上のファイルに、\<FORM>タグのmethod属性で指定した転送方法で送られる。

| 属性 | 使用方法 | 動作 |
| :--: | :-------- | :--- |
| text | type="text" | 1行テキストボックス。2行以上の長い文章入力には、\<TEXTAREA>～\</TEXTAREA>を使用。 |
| password | type="password" | パスワード入力ボックス。入力したテキストがアスタリスク（*）などに置き換えて表示されます。ただし、データが暗号化されるわけではない。 |
| checkbox | type="checkbox" | チェックボックス。複数選択が可能。checked属性を指定すると、その項目についてはあらかじめチェックの付いた状態。 |
| radio | type="radio" | ラジオボタン。複数の中から一つしか選択できない。複数を一つのグループにするには、name属性で同じ名前を付ける。checked属性を指定すると、その項目についてはあらかじめチェックの付いた状態。 |
| file | type="file" | サーバーへファイルを送信する際に、送信するファイルを選択。ファイル名の入力フィールドと[参照]ボタンが表示されます。サーバー側にはファイルを受け取るための特別なCGI等が必要です。 |
| hidden | type="hidden" | 隠しデータをサーバーに送信。画面上には表示されないが、value属性で指定した値がサーバーへ送信。 |
| submit | type="submit" | 送信ボタン。 |
| button | type="button" | 汎用ボタン |
| reset | type="reset" | リセットボタン |
| image | type="image" | 画像のボタン。使用する画像ファイルはsrc属性で指定。alt属性が必須。 |


## 表関連

| タグ | 意味 |
| :--: | :----- |
| \<TABLE> | テーブル（表）を作成する |
| \<TR> | テーブル（表）の横方向の一行を定義する |
| \<TH> | テーブル（表）の見出しセルを作成する |
| \<TD> | テーブル（表）のデータセルを作成する |
| \<THEAD> | テーブル（表）のヘッダ行を定義する |
| \<TFOOT> | テーブル（表）のフッタ行を定義する |
| \<TBODY> | テーブル（表）のボディ部分を定義する |
| \<CAPTION> | テーブル（表）にタイトルをつける |
| \<CENTER> | センタリングする |
| \<HR> | 横罫線を引く |
fluentdで集めたログをslackやelasticsearchに流すための設定メモ

# 事前準備
## 使ったfluentdのプラグイン

- [fulentd-plugin-elasticsearch](https://github.com/uken/fluent-plugin-elasticsearch)
- [fluentd-plugin-slack](https://github.com/sowawa/fluent-plugin-slack)
- [fluentd-plugin-rewrite-tag-filter](https://github.com/fluent/fluent-plugin-rewrite-tag-filter)
- [t-plugin-mysqlslowquery](https://github.com/yuku-t/fluent-plugin-mysqlslowquery)

## slackのwebhookの設定

![slack_webhook.png](https://qiita-image-store.s3.amazonaws.com/0/1686/4ba676b8-9d4c-4651-ff77-867d6465dc62.png)

http://xxxx.slack.com/services/newの下の方にある「incomming WebHooks」のリンクからwebhook urlの情報を取得します


# fluent.confの設定

```fluent.conf

<source>
  type tail
  path log/rails_application_development.log
  tag slack
  format multiline
  format_firstline /^., /
  format1 /^., \[(?<time>[^\.]+).+\][ ]+(?<level>[^ ]+) -- :(?<message>.*)$/
  time_format %Y-%m-%dT%H:%M:%S
</source>

<match rails.*>
  host 192.***.**.***
  port 9200
  index_name famiphoto 
  type_name fluentd
  type elasticsearch
</match>

<match slack>
  type slack
  webhook_url https://hooks.slack.com/services/***********/*********
  channel general
  username rails_dog
  flush_interval 5s
  icon_emoji :dog:
  message_keys level,message
  message "[%s] %s"
</match>
```

elasticsearchにログを入れる設定と同じくslackにapplicationログの内容を通知する設定。実際はslackに通知するのはエラーの場合だけでいいけど。
一旦はメモとして残す。

同じ要領でslow-logも通知するようにする。

# mysqlのスローログを通知する設定（仮)
my.cnfにスローログをファイルに出す設定にしておいて、fluent.confを編集します。

```fluent.conf
<source>
  type mysql_slow_query
  path log/mysql_query.log
  tag mysql_slow_query_slack_notifier
</source>

<match mysql_slow_query_slack_notifier>
  type slack
  webhook_url https://hooks.slack.com/services/***********
  channel general
  username mysql_slowlog_ghost
  icon_emoji :ghost:
  color danger
  message "Query_time:%s\r\nLock_time:%s\r\nRows_sent:%s\r\nRows_examined:%s"
  message_keys Query_time,Lock_time,Rows_sent,Rows_examined
  flush_interval 1m
</match>
```

こんな感じになります。color dangerを指定しているのでslack上で赤い表示がされます。
エンジニア + マーケター  = adbocater

エンジニアもマーケできると幸せになれるという事ですね。
参考URL http://liginc.co.jp/187679

```
Developer Relations(マーケティング活動)

DevRel?? => DevRelは “Developer Relations” の略語 => 外部の開発者とのつながりを形成し、自社製品/サービスの魅力を知ってもらうためのマーケティング活動 => それらの活動をエバンジェリスト活動と言われる!!
```

```具体例

・ブログや外部メディアへの寄稿
・自社における勉強会/セミナーの開催
・外部コミュニティ主催の勉強会/セミナーにおける発表
・オンラインコミュニティ運営
・ソーシャルメディア運営
```

```
GoogleではAdvocateと呼ぶ

これらの取り組みを通して、外部開発者からのニーズを聞き取り、サービスの開発側へ伝えてあげることも可能になります。双方向のコミュニケーションが取れる状態に持っていき、文化やコミュニティを形成していく共創マーケティングとも言えるでしょう。Googleではエバンジェリストという言葉を使わず、アドボケイト(Advocate)という言葉を使っています。

なんで？？

Evangelist という言葉は元々宗教の伝道師に使われる言葉です。しかし Google で Evangelist に類する仕事が作られた際、開発者の方に一方的に伝えていくだけでなく、対話やフィードバックから Google 自身も学び成長していくという意味を込めるため、Advocate という言葉が選ばれました。

```
HashTableのキーでソート


HashTable実体をソートではなく、keyをソートして出力してみました。

```csharp
Hashtable hash = new Hashtable( );
hash.Add(2, "two");
hash.Add(1, "one");
hash.Add(3, "three");
ArrayList keys = new ArrayList(hash.Keys);
keys.Sort()
foreach (int key in keys)
{
    Console.WriteLine(hash[key]);
}
```