OmniAICreator/Qiita-1.07M huggingface dataset:
勉強会をスムーズに進行する46のコツ

# 「運営がグダグダ」と言われないように

せっかく準備して当日も頑張ったのに運営のことでネガティブなことを言われるのはつらいですよね。

そこで、グダグダ進行を卒業してスムーズに進行するためのコツをまとめました。

準備も万全じゃないし進行もグダグダで「有志でやってるゆるふわな会なので^^;」と言い訳していた過去の自分とはサヨナラしましょう。

釘を刺しておきますが「リラックスした雰囲気とグダグダは別物」です。

# 46のコツ

勉強会の流れに沿ってポイントをまとめました。

##タイムテーブルをきっちり作る

1.入館から退館まで
2.時間・内容・詳細を表にする
3.印刷するかスマホですぐに見られるようにしておく
4.運営スタッフにも配っておく

事前にタイムテーブルをしっかり作って、当日は常に持ち歩いて誰に何を聞かれてもすぐに確認できるようにしましょう。

流れを把握しておくべきですが決して覚える必要はありません。バタバタしているときに記憶に頼って答えると間違ったことを言うものです。

##事前説明をしっかりする

5.スピーカー／会場担当者／運営スタッフそれぞれ別個にきちんと事前説明をする
6.スピーカーには、タイムテーブル、持ち時間・登壇予定時間・集合時間・入館方法・注意事項など
7.会場担当者には、タイムテーブル、当日の流れ・入館時間・確認事項など
8.運営スタッフには、タイムテーブル、当日の流れ・集合時間・入館方法・注意事項など
9.その他、懇親会参加するかどうかなど事前に確認すべきこと・伝えるべきことは連絡しておく
10.なんでもいいからみんなが手軽に見られる方法で共有するなりメッセージで送る

ドキュメントがしっかりできていれば事前ミーティングの必要はありません。ドキュメント作成をサボって口頭説明で済ませようとはしないでください。

## 会場設営

11.机やイスのレイアウト変更の時間も見込んでおく
12.何かしらイレギュラーがあると思って余裕を持って設営できるように時間を設定する
13.マイク音量の調節方法やプロジェクターのスリープ解除などの機材操作も確認しておく
14.設営の時間内に会場に関する作業や確認は全て済ませましょう

リハーサル以降はスピーカー対応や受付対応など人の動きが活発になって会場準備どころではなくなると思って動きましょう。

## リハーサル

15.出演順にプロジェクター接続とマイクの声の通りをテストする
16.接続＆マイクチェックと同時に出演順の確認にもなる
17.登壇者にはリハの時間を計算して集合時間を伝えておく

「僕は登壇慣れてるから大丈夫です」というスピーカーもいざ本番というときに「映らない？あれ？おかしいな～」となることがあるので、例外なくリハは全員やりましょう。

## 開場・受付

18.受付係には事前に受付手順をデータで共有するか印刷して渡しておく
19.受付でトイレや自販機、喫煙所の場所を聞かれることが多いので、受付係に場所を説明しておく
20.開場したらBGMを流す（誰もいなくて無音だと寂しいし入っていいのか戸惑うから）
21.たまに様子を見に行って問題ないか確認、混雑時には行列整理や受付を手伝う
22.混雑時に手分けできるように受付リストは予備も印刷しておく

## 会場案内・冒頭説明

23.プログラム最初に会場案内として、Wi-Fi・トイレ・自販機・喫煙所などを説明する
24.冒頭説明として、勉強会の主旨・タイムテーブル・注意事項などを説明する

これらをせずになんとなく始めてしまうと、いちいち質問されるので運営サイドの対応が煩雑になるし、勉強会の意図が浸透しないので大事なことです。

## セッション

25.スピーカーが演台についたらプロジェクターの接続を手伝う（緊張していて手間取る人もいるので）
26.マイクのスイッチをONにして渡す（スイッチがわからなくてテンパる人もいるので）
27.タイマーアプリをスタートして演台に置く
28.ストップウォッチで時間計測する
29.マイクが遠かったり画面が切れたり何かあったらジェスチャーかカンペで伝える
30.そろそろ時間になったらジェスチャーかカンペで伝える

セッション中はスピーカーが話に集中してパフォーマンスを発揮できるように、それ以外のことで戸惑わないように気を配って最大限サポートしましょう。

## 休憩

31.「何分間休憩か」ではなく「何時に再開」かをアナウンスする
32.休憩中はBGMを流す（雑談しやすい雰囲気作り）
33.リハできなかったスピーカーがいたら休憩中に接続チェックをしておく
34.再開時間前に余裕をもって次のスピーカーにスタンバイしてもらう
35.来場者からの質問など何かしらの対応が発生するかもしれないのでスタッフは誰かしら受付にいる
36.再開する1分〜30秒前にBGMを切る（気づいた人から雑談をやめてくれる）

セッション中よりもスタッフはやることが多いケースもあります。来場者との交流とのバランスをうまく取りましょう。

## 時間厳守

37.会場入りから時間通りに（担当者さんにわざわざ開けてもらうので当然のこと）
38.リハもテキパキ進める（スピーカー同士の雑談はリハ後にしてもらう）
39.開場・受付開始も時間通りに（開場待ちしている人がいる場合もあるので）
40.終了時間をオーバーしない（オーバーした分聞けずに帰る人が出てしまうので）
41.撤収時間をオーバーしない（有料の会場だと延長料金がかかる。無料提供の場合は尚更）
42.スピーカー交代の時間を考慮する（持ち時間の数分前に終えるように言っておくなどする）

## その他

43.スムーズにできるかは八割がた準備にかかっていることを忘れずに
44.企画・準備段階から担当者さんに配慮して協力して進める
45.スピーカーや来場者の不便や疑問を想定して準備しておく
46.人手があるならタイムキーパーをおく
Railsのdevelopment/productionについて


## この記事の内容

Railsで初めてアプリを作っている人が本番環境と開発環境をどうやって(極力)コードをいじらずにやっていったらいいか学んだ(予定)ものを書きます。

取り急ぎで記事を書いたので、何か追加があった際は追記していきます。

## データベースについて

データベースは config/database.yml にdevelopmentとproductionの設定を書きます。下記はサンプルです。

ローカル(とテスト)では sqlite3 を使用し、本番環境でMySQLを使用する設定です。

```
default: &default
  adapter: sqlite3
  pool: 5
  timeout: 5000

# local PC
development:
  <<: *default
  database: db/development.sqlite3

# Test 用
test:
  <<: *default
  database: db/test.sqlite3

# production server用
production:
  adapter: mysql2
  encoding: utf8
  reconnect: false
  database: データベースの名前
  pool: 5
  username: ユーザ名
  password: パスワード
  host: localhost
```

## rails console

rails consoleは引数で環境の指定ができるようです。

```
$ rails console -e production
```
## データベースのmigrate

データベースのマイグレーションは以下のように行いました。

### 開発環境

```
$ rake db:migrate RAILS_ENV=development
```
RAILS_ENVを特に設定していない場合はデフォルトがdevelopmentになるようです。

### 本番環境

```
$ rake db:migrate RAILS_ENV=production
```

その他のオプションや実行例は http://railsdoc.com/references/rake%20db:migrate にまとまっています。

### 初期データをseeds.rbを使って登録

初期データはテストデータであればtest/の中にあるファイルで初期データが作れますが、都合によって開発環境と本番環境でデータが変わらなければいけない場合は一工夫が要りそうでした。
色々やり方があるようです。

* rakeのtaskを修正してファイルを読み込むデータファイルを変えるパターン
    * http://detham.tumblr.com/post/37265665869/seeds
* seeds.rbの中で分岐させて登録するパターン
    * http://kameryo.hatenablog.com/entry/2015/03/05/201356

数がある場合は工夫が必要ですね。

## configファイル
config/ の下にdevelopment.rb, production.rb, test.rbというファイルがあるので、それぞれの設定に応じて編集を行う。

## gemについて

意外と困ったのは、開発用のPCに入れられないライブラリがあったことで、bundle install が実行できず仕方なくコメントアウトを行っていました。
これも環境をよりどころに読み込むものを変えられるようです。

開発環境だけで使うgemファイルの表示

``` Gemfile
group :development do
  # インストールしたいGemを記載
  gem 'better_errors'
end
```

groupのブロックを作成し、その中にインストールするgemを記載します。

## bundle install

--withoutのオプションを使用する。

```
$ bundle install --without test development
```

test/developmentグループに指定しているgemを取り除いてbundle install => productionの時に

## パスワード等の比較的繊細な情報について

個々のサーバに環境変数として持たせておくという手があるようです。
あとは例えば定数で設定してあるようなところに環境変数を入れてやるという具合です。

参考記事: http://qiita.com/ka_/items/a19f65628bdc213fc8f5

## サーバの起動

### passenger standalone

passenger standaloneで環境をつくっていたのでそちらのものを記載します。

コマンドラインで(デフォルトはdevelopment)

```
$ passenger start --environment production
$ passenger start --environment development
```

設定ファイルで、nginx式のjson設定ファイルに

```
"environment": "production",
```

を追加する
### apache + passenger

confファイルに下記の様な形にする必要があるようです。
こちら( http://www.workabroad.jp/tech/1116 )の記事を拝見しました

```
RailsEnv production
```

### rails s

ついでにrails sです。基本形はRAILS_ENV=productionっぽいんですね

```
rails s RAILS_ENV=production
```

## その他

### 画面上に現在の環境を示したラベルを表示するgem

面白そうです
https://github.com/dtaniwaki/rack-dev-mark


## まとめ

環境変数を使って、コードに無駄な修正をいれないでおくことでgit statusとかをした時の煩雑さが違いますし、なによりファイルがおかしくなって発狂することも無くなりそうなのでもっと意識してやっていきたいです。本当はなるべくそういう差異みたいなものを生まないようにして書かなければいけないのだとは思いつつ一歩一歩。

Railsをはじめて開発するとローカルルールを知るのに結構なエネルギーが必要なので、これからも備忘録的にまとめておきたいです。
Wi-Fi越しにadb接続する

adbコマンドはUSBで接続してないと使えないのかと思ったけど、Wi-Fi越しでも使えるらしい。すごい！

端末をUSB接続した状態で下記コマンドを実行します。

```bash
adb tcpip 5555
adb connect xxx.xxx.xxx.xxx
```

`xxx.xxx.xxx.xxx`はAndroid端末のIPアドレスにしてください。

接続完了したら、USBケーブルを抜いても`adb shell`で端末操作できるし`adb push`でファイル送ったり`adb pull`でファイル引っこ抜いたり`adb logcat`でログを見たりできます。Android StudioでデバッグしたりAPKのデプロイも可能！GearVRに刺しっぱなしでもステップ実行したりログ見たりアプリ再インストールしたりできます！！

接続を終了する時は

```
adb disconnect
```

でOK。
pythonのメタクラスとsqlalchemyのdeclarative

# pythonのメタクラスとsqlalchemyのdeclarative

メタクラスはライブラリなどでないかぎり使用する機会は少ないが、SQLAlchemyなどでは使用されているので、参考程度にまとめる。

メタクラスとは、クラスの型。pythonの場合、ユーザー定義クラスの型は基本的にはtypeになる。

```py
>>> class A(object):
>>>     pass
>>>
>>> type(A)
type
```

特殊な用途のために、type以外のメタクラスを使用することがある。

メタクラスの身近な用途としては、SQLAlchemyのdeclarativeの中でこれが使われている。

```py
>>> from sqlalchemy.ext.declarative import declarative_base
>>> Base = declarative_base()
>>> type(Base)
<class 'sqlalchemy.ext.declarative.api.DeclarativeMeta'>
```

declarativeを使用すると、クラス定義が自動的にテーブル定義とひもづく。

```py
class User(Base):
    __tablename__ = 'user_account'

    id = Column(Integer, primary_key=True, autoincrement=True)
    name = Column(Varchar(100))
```

内部的には、sqlalchemy.ext.declarative.api.DeclarativeMetaという独自のメタクラスを使用し、クラス定義時の処理をフックしてマッピングの処理を行なっている。

sqlalchemy.ext.declarative.api.DeclarativeMetaの定義は以下のようになっている。__init__はBaseを継承したクラスが作成されるタイミングで呼ばれ、この中でクラスとテーブルのひもづけを行なう。

```py:sqlalchemy/ext/declarative/api.py
class DeclarativeMeta(type):
    def __init__(cls, classname, bases, dict_):
        if '_decl_class_registry' not in cls.__dict__:
            _as_declarative(cls, classname, cls.__dict__)
        type.__init__(cls, classname, bases, dict_)

    def __setattr__(cls, key, value):
        _add_attribute(cls, key, value)

```

pythonでは、クラスの定義から自動的に何かの処理を行ないたい場合などにメタクラスを使用するのは比較的よく用いられる手法らしい。例えばwtformsのFormクラスもほぼ同様のことをやっている。


ユースケースによってはあえてこの処理を止めたいこともある。DBからリフレクションで作成したTableオブジェクトとdeclarative_baseで作成したクラスを紐づけるといったユースケースを考えよう。こうした場合、以下のようなコードを利用できる。

```py
from sqlalchemy import MetaData, Table
from sqlalchemy.ext.declarative import api, declarative_base
from sqlalchemy.ext.declarative.api import DeclarativeMeta


class_registry = {}
metadata = MetaData()
Base = declarative_base(class_registry=class_registry,
                        metadata=MetaData())


class MyMetaClass(DeclarativeMeta):
    def __init__(cls, classname, bases, dict_):
        # テーブルとの紐づけをしない
        type.__init__(cls, classname, bases, dict_)

    @classmethod
    def create_class(cls, table_name, class_name, dbsession):
        tableobj = Table(table_name, metadata, autoload=True,
                         autoload_with=dbsession.bind)
        class_ = MyMetaClass(class_name, (Base), {})
        # 以下で明示的にテーブルと関連づける。
        class_.__tablename__ = tablename
        class_.__table__ = tableobj
        for c in tableobj.columns:
            setattr(class_, c.name, c)
        api.instrument_declarative(class_, class_registry, metadata)
        return class_
```
Go言語で SplitMultiSep (複数種の区切り文字列で分解)

Go言語の strings.Split は文字列を分解する際に区切り文字が１種類しか指定出来ません。
例えば、a,b;c という区切りがある場合に、, と ; のどちらかでしか区切れません。

試しに複数指定対応の関数を作ってみましたが、仕事では(ちょっとした特殊な条件が必要で)使えなかったので、こちらにコードを晒します。ご参考までに。

## プログラム
```go:splitmultisep.go
package main

import (
        "fmt"
        "strings"
)

func SplitMultiSep(s string, sep []string) []string {
        var ret []string
        ret = strings.Split(s, sep[0])
        if len(sep) > 1 {
                ret2 := []string{}
                for _, r := range ret {
                        ret2 = append(ret2, SplitMultiSep(r, sep[1:])...)
                }
                ret = ret2
	}
        return ret
}

func main() {
	var s string = "a&b,c;d"
        a := SplitMultiSep(s, []string{"&", ",", ";"})
	fmt.Println(a)
}

```
実行結果

```shell-session
$ go run splitmultisep.go
[a b c d]
```

## 仕組み

区切り文字列の配列を渡されるので、まず一つ目の区切り文字列で分解して、分解された文字列を各々２つ目の区切り文字列で分解して、というのを再帰的に繰り返します。


# 追記 (regexp 方式)

そもそも regexp で良いとの指摘を複数受けました。

- http://play.golang.org/p/OVJHZgj07D

```go:

package main

import "fmt"
import "regexp"

func main() {
	var s string = "a&b,c;d"
	a := regexp.MustCompile("[&,;]").Split(s, -1)
	fmt.Println(a)
}
```

速度を気にする場面でも正規表現をコンパイルしてキャッシュすれば良さそうですし、こっちの方が良いかも？
CakePHP3のBakeTemplateについて

#CakePHP3のBakeTemplateについて

シェルなどでテンプレートを吐き出すプラグインを作成するにあたってCakePHP2ではTemplateTaskがありましたが、わりとbakeに特化してた(気がする)し、テンプレートファイルもイマイチ使いにくかったです。

CakePHP3ではBakeTemplateTaskが用意されていますが、これが結構使いやすい！

##使い方

```
<?php
namespace App\Shell\Task;

class AdminSetTask extends Shell
{
    public $tasks = [
        'Bake.BakeTemplate',
    ];

    public function main(){        
        //AdminAppControllerを設置
        $data = [
            'project_name' => 'TEST'
        ];
        //テンプレートファイルに設定したい変数をセット
        $this->BakeTemplate->set($data);
        //作成したいファイルのテキストを取得
        $contents = $this->BakeTemplate->generate('Controller/AdminAppController');
        $this->createFile(ROOT . '/src/Lib/Controller/AdminAppController.php', $contents);
    }
```



```
<?php
//ファイルパスはAPP/Template/Bake/AdminAppController.ctp
namespace App\Lib\Controller;
use App\Controller\AppController;
use Cake\Event\Event;
class AdminAppController extends AppController
{
    public function beforeRender(Event $event)
    {
        parent::beforeRender($event);
        //@変更プロジェクト名
        $this->set('project_name','<%= $project_name %>');
        //@変更!プロジェクト名
    }
}

```

##まとめ
CakePHP2時代のように
```
<?php
echo "<?php\n";
echo "App::uses('{$plugin}AppController', '{$pluginPath}Controller');\n";
```
見たいなことを書かなくていいのでとても書きやすくなっています。

まぁ利用頻度がそんなに高いものではないですが、テンプレートファイルを吐き出したいときには便利だと思いますよ！
Xcode7betaで、Process launch failed: Securityが出た場合の対応


下記の記事は、obsolutedです。



機種変更したiPhoneで、開発中のAppを実機で実行しようとしたら、Process launch failed: Securityのログメッセージが出た。

以前は、アラートに信頼するボタンが出ていたようだが、

現在は、設定＞一般＞プロファイルで出した画面にAPPプロファイルができてるので、
それタップして信頼するボタンが出るので信頼すれば、解決する。

いじょうです。
iOS Simulatorで起動しているアプリの終了方法


備忘録。

iPhoneの実機で起動しているアプリを終了するときは
ホームボタンを2回押して
下からニョキって出てきた画面のアイコンを
ドラッグしているかと思うのですが
これをiOS Simulatorで実現する方法はないのかなーと思って
ググったらあっさり見つかりました。

**コマンド＋シフト＋H×2（素早くHを2回押す）**

これで実機のように下からニョキって画面のアイコンが出てくるので
起動しているアプリを終了させることができました。

参考記事：
[iOSシミュレータのアプリの終了](http://joecola10mf.blog.eonet.jp/weblog/2013/02/ios-b77b.html)
gaeのflaskスケルトン立て

# たたき台持ってくる
```
git clone https://github.com/blossom/flask-gae-skeleton.git <project_name>
```
# サブモジュール持ってくる
```
cd <project_name>
git submodule update --init
```
# origin 付け替える
```
git remote rm origin
git remote add origin <new_remote like git@github.com:your_name/project_name.git>
git commit -am "initial setup"
git push origin master
```
chef実践入門　実機にて実施メモ（2） コミュニティクックブックを knifesolo + Berksfile　で活用


[Chef実践入門](http://www.amazon.co.jp/dp/477416500X "Chef実践入門") 第4章のコミュニティクックブックの活用　を実機にて検証したメモ

#0.環境前提
ホストOS: MacOSX knife　solo　インストール済み、knife solo initでリポジトリ作成済み
ゲストOS: Vagrant+birtualbox(cenos)で構築済み

#1.コミュニティクックブックの検索方法

##1. Webサイトにて検索  
	https://supermarket.chef.io/cookbooks-directory
##2. コマンドラインから検索

	```bash:
	#クエリ指定したキーワードで検索
	knife cookbook site search <クエリ>
	#指定したクックブックの詳細を見る
	knife cookbook site show <クックブック名>
	```
	
	ex) Apache2を例に検索
	
	+ キーワードapache2で検索
	
	```bash:
	knife cookbook site search apache2
	```
	
##3. 結果は以下(抜粋）
	
```bash:
apache2:
cookbook:             https://supermarket.chef.io/api/v1/cookbooks/apache2
cookbook_description: Installs and configures all aspects of apache2 using Debian style symlinks with helper definitions
cookbook_maintainer:  svanzoest
cookbook_name:        apache2
```

##4. 上記のクックブック名（coocbook_name) apache2の詳細を見る

```bash:
knife cookbook site show apache2
```
	
##5. 結果は以下(抜粋）
	
```bash:
	category:           Other
	created_at:         2009-10-25T23:47:55.000Z
	deprecated:         false
	description:        Installs and configures all aspects of
	apache2 using Debian style symlinks with helper definitions
	external_url:       https://github.com/svanzoest-cookbooks/apache2/
	foodcritic_failure: true
	issues_url:         https://github.com/svanzoest-cookbooks/apache2/issues
	latest_version:     https://supermarket.chef.io/api/v1/cookbooks/apache2/versions/3.1.0
	maintainer:         svanzoest
	name:               apache2
	source_url:         https://github.com/svanzoest-cookbooks
	apache2/up_for_adoption:    
	updated_at:         2015-05-25T19:14:18.433Z
```
	
★更新頻度、最終更新日、メンテナ等確認

#2.Berkshelfによるクックブックのインポート

+  knife-solo利用時には、Berkshelfというツールを使ってコミュニティクックブックをインポートする。
以下、試しにyum-epel,apache2,mysqlのクックブックをBerkshelfによってインポートし、Vagrant環境のノードに適用。

##1. chefのリポジトリディレクトリ内にある Berksfile(設定ファイル）を更新

  ```bash:Berksfile	
  site :opscode
  cookbook 'yum-epel'
  cookbook 'apache2'
  cookbook 'mysql'
  ```

##2. berksコマンドを実行
  
  ```bash:
  berks
  ```

berksコマンドを実行すると、~/.berkshelf/cookbooks ディレクトリ内に依存関係のあるクックブックも含めてダウンロードされる。また、Berksfile.lockというJSONファイルも更新される。このBerksfile.lockをもとにberksコマンドは利用するクックブックのバージョンを判断する。
  
##3. ~/.berkshelf/cookbooksディレクトリ内確認  
  
  ```bash:
  ls -la  ~/.berkshelf/cookbooks
  ```
  
##4.Berksfile.lockの中身
  
  ```bash:Berksfile.lock
  DEPENDENCIES
  apache2
  mysql
  yum-epel
  GRAPH
  apache2 (3.1.0)
  mysql (6.0.22)
    smf (>= 0.0.0)
    yum-mysql-community (>= 0.0.0)
  rbac (1.0.3)
  smf (2.2.7)
    rbac (>= 1.0.1)
  yum (3.6.1)
  yum-epel (0.6.0)
    yum (~> 3.0)
  yum-mysql-community (0.1.17)
    yum (>= 3.0)
  ```
    
  
##5.nodeオブジェクトへクックブックを追加 (yum-epelとapache2)
  
  ```json:node名.json
  {
  "run_list": [
  "recipe[yum-epel]",
  "recipe[apache2]"
  ]
  ```
  
##6.knife solo bootstap を実行
  
  ```bash:
  knife solo bootstrap webdb(ノードのvagrantマシン名）
  ```
  
  chefsolo,epel,apache2がvagrantのゲストマシンにインストールされる。

##7.確認
  
  ```bash:
  vagrant ssh
  ps auxw | egrep "httpd"
  yum list | grep epel
  ```
Herokuで独自ドメインを運用する（ムームードメインの場合）

Herokuにアップしたアプリを独自ドメインで運用したい。
という思いで色々調べたんですけど、AWSなしでサブドメインなし運用はキツイ様子。

というわけで現状できうる www付きの設定の場合。

まずはHerokuのアプリSettingから、Domainsの項目を設定。
Domain Nameには取得したドメイン　www.example.com を記述。

ムームードメインのカスタムDNSの設定で、「設定２」の方を設定します。
「サブドメイン」　に www を記述。種別はCNAMEで、
「内容」にはHerokuのDNS Targetを記述。

設定を反映して完了。
Unity C# プロジェクトのクラス図や呼び出し関係図を Doxygen で生成する on Mac

## 環境準備

基本brewで全部入ります。

```bash
# お約束
$ brew update

# doxygenとgraphvizをinstall 
# 後述するGUI frontendを入れればここでdoxygen入れる必要はないのでコマンドラインでも叩きたい人は入れる
$ brew install doxygen graphviz
```

### Doxygen GUI frontend

Doxygenを使って各種ドキュメントを生成する場合に[設定できる値](http://www.stack.nl/~dimitri/doxygen/manual/config.html)が非常に多いので、GUI使った方が楽です。

Doxygenの設定ファイルを手書きしたくない場合、GUI frontendを使いましょう。(僕はそうしました)

[DLページ](http://www.stack.nl/~dimitri/doxygen/download.html)より、 **A binary distribution for Mac OS X 10.5 and later** の項目を探してdmgファイルをダウンロードする。(記事執筆時点では、Doxygen-1.8.9.1.dmgでした)

brew caskからも入れられそうでしたが、cask使わないようにしたので僕は手で入れてしまいました。

## Doxygenの設定ファイルを作る

### Doxyfileの生成

#### コマンドラインで行う場合

```bash
# -g オプションを付けてコマンドを叩くとカレントディレクトリにDoxyfileという設定ファイルが出力される
$ doxygen -g [設定ファイル名] 

# -s オプションを付けると設定ファイル内のコメントが省略される
$ doxygen -s -g [設定ファイル名] 
```

#### GUI frontendを使う場合

上でダウンロードしてきたGUI frontendを起動してとりあえず何も入力せずに File > Save (⌘+s) を行うと保存画面がでるのでお好きな場所にお好きな名前で保存する。

### 必要な設定を書く

あとは設定ファイル内のコメントや[設定できる値一覧](http://www.stack.nl/~dimitri/doxygen/manual/config.html)を見つつって感じなんですがめっちゃ多いので大体必要そうなところだけピックアップします。

また全部GUI frontendでやったので、コマンドライン勢の人は頑張ってください。

- Step 1 に出力場所を指定
- Step 2 > Wizard > Project > Project Name にプロジェクト名を指定
- Step 2 > Wizard > Project > Source code directory にソースコードの場所を指定
    - 今回はUnityなので`{対象のUnityプロジェクトディレクトリ}/Assets`を指定した
    - スコープを絞りたい場合は、Assets以下で生成したいディレクトリを指定するといいと思います
- Step 2 > Wizard > Project > Scan recursively にチェック
- Step 2 > Wizard > Mode > Select programming language to optimize the results for に`Optimize for Java or C# output`を指定
- Step 2 > Wizard > Output > Select the output format(s) to generate からHTMLを選択
- Step 2 > Wizard > Diagrams > Diagrams to generate に`Use dot tool from the GraphViz package`を指定
    - その下の Dot graphs to generate は全てチェック
- Step 2 > Expert > Dot 内のプロパティについて以下を指定
    - CLASS_DIAGRAMS にチェック
    - HAVE_DOT にチェック
    - DOT_PATH に、dotコマンドの場所を指定(graphvizをbrew installした時点で入ってるのでコマンドラインで`which dot`して出た場所を指定するとよい)

ここまで設定したらもう一度保存します。

設定は色々あるので、ドキュメントなどを読みつつ調整するのがオススメ。


## ドキュメントを生成する

### コマンドラインから実行

上記で保存したDoxyfileがあるディレクトリでコマンドを実行します。(他ディレクトリからDoxyfile指定して叩くと動かなかった…)

```bash
# 設定ファイルの名前を変えている場合はファイル名を指定すること
$ doxygen [設定ファイル名]
```

### GUI frontendから実行

設定ファイルが読み込まれている状態で Step 2 > Run ウィンドウから Run doxygen を実行すると、ドキュメントが生成されます。


## トラブルシューティング

基本は生成課程のログを見ればエラー内容書いてあるのでシューティングしていく。

### なんでか画像が出ない

僕の環境ではこれが一番ハマったんですが`dot`コマンドが上手く叩けてないのが原因でした。

- Step 2 > Expert > Dot > DOT_PATH に dot コマンドへのパスが指定されていること
- graphvizが正しくinstallできていること(brewでlink errorが起きていたりしたので)

の2点を確認のこと。
python radius parser


pythonでradius packetを扱うライブラリについてのメモ。随時更新予定。

radius補遺。実際には方言がいくつかあり、radiusフレームの構造は使いつつ、定数の定義がちょっとずつ変わる。freeradiusのshareの中にテキストファイルの辞書になっているのが参考になる。ライブラリによっては、この辞書がそのまま使える。ただし辞書の形式も拡張を繰り返していて、辞書の読み込みに失敗することもあるので調整が必要になるかもしれない。

pyrad
------
* freeradiusでも使われている属性辞書が使えて、方言に対応できるのは良い。
* パースしたオブジェクトから元パケットに戻せないのは困る。具体的には属性順序を忘れる。authenticatorの検証などは、radius専用のライブラリにこそ期待したい機能なのに、これができず悔しくて仕方ない！
* 辞書の名前でフィールドを検索できるのは便利。ただしシリアライズした安定した形式にならないので、その後の扱いに大変困る。
* issueが積みあがっている

pypacker
-------
* python2 非対応。
* radiusまわりは死んでいるとコードに書かれている。
* 802.11まわりの実装が誤り過ぎていて、どこから手を付ければいいのかよく分からない。

scapy
------
* python3 未対応。scapy-python3 forkが使える。
* cygwin 未対応。pcapやコマンドラインなどの環境を標準で要求する。使わないときはオーバースペック。
* 属性の配列の扱いがクラスごとにバラバラ。
* issueが積みあがっている
* radius属性をパースしない

dpkt
----
* python3 未対応。
* issueが積みあがっている

pyshark
-------
* libwiresharkではなく、結局tsharkをコマンド起動する。
PHPでprivateメソッドをテストしやすくする


```php
class foo {
	private function bar($a){
		return $a . 'bar';
	}
}
```

こんなクラスがあってprivateメソッドをテストする方法をぐぐるとReflectionMethodをつかって下記みたいに書くって情報がいっぱいひっかかります。

```php
$foo = new foo();
$method = new ReflectionMethod($foo, 'bar');
$method->setAccessible(true);

$result = $method->invoke($foo, 'StringA');
$this->assertEqual($result, 'StringAbar');
```

慣れればすぐに何やってるかわかるようになるんでしょうけど、正直いって長くてパッと見よくわかんない。

で、めんどくさがりの私は下記みたいなテスト用クラスつくってみた。

```php
class fooTesting extends foo{

	public function __call($methodName, $params)
	{
		if(substr($methodName,0, 9) == '_testing_'){
			$callName = substr($methodName, 9);
			$method = new ReflectionMethod($this, $callName);
			$method->setAccessible(true);
			$result = $method->invokeArgs($this, $params);
			return $result;
		}else{
			return parent::__call($methodName, $params);
		}
	}
}
```

これ使ってテストする方法は呼び出したいプライベートメソッドに`_testing_`を頭につけて呼び出すだけ。

```php
$foo = new fooTesting();
$result = $foo->_testing_bar('StringA');
$this->assertEqual($result, 'StringAbar');
```

CakePHPのModelのテストで使うときはTestingクラスにAliasで元クラスの名前指定して`ClassRegistory::init()`してあげれば元クラスと同じように使えるはずです。

## 追記
2015/06/18 ラッパークラス作ってみました。→[自動テスト - PHPでprivateメソッドをテストしやすくするTestingWrapper - Qiita](http://qiita.com/RyujiAMANO/items/c93cc6da4bccd495d6f0)
iOS課金のテスト

課金のテストは、ストアに並べるまでは、テストアカウントでないと購入できないので、以下のようにしてテストアカウントで課金を行う。

## 実機に紐付けられている通常ユーザを一時的に解除

実機で、[設定] -> [iTunes & App Store] を選択して、AppleIDをログアウトしておく。この画面からテストアカウントは使わないこと。テストアカウントが使えなくなる。

![IMG_2874.PNG](https://qiita-image-store.s3.amazonaws.com/0/36927/dfeb7516-632c-f9e0-eb38-c49a0848c641.png "IMG_2874.PNG")

## TestFlightからDLしたアプリでテストアカウントを使って課金する

メロ購入を選択すると、下のようになるので、「既存のApple IDを使用」を選択する。
![IMG_2875.PNG](https://qiita-image-store.s3.amazonaws.com/0/36927/0ab253c5-f2ad-464f-4269-2a800239a828.png "IMG_2875.PNG")

テストアカウントのIDとパスワードを入力
![IMG_2877.PNG](https://qiita-image-store.s3.amazonaws.com/0/36927/fd9f7ca5-260c-3ffb-e98e-05043a237f99.png "IMG_2877.PNG")

テスト環境での課金確認画面が出るので「購入する」を押す。実際に課金はされない。
![IMG_2878.PNG](https://qiita-image-store.s3.amazonaws.com/0/36927/ec1aab2c-f1d6-4fbb-5d67-a5cccb633e4d.png "IMG_2878.PNG")

この後は、課金が終了した時の処理が行われる。
![IMG_2879.PNG](https://qiita-image-store.s3.amazonaws.com/0/36927/5a822b44-93cd-4c7a-6da3-f0c87e744271.png "IMG_2879.PNG")
グーグル スプレッドシートで図形をコピー＆ペースト

表に貼り付けた図形をサクッとコピー＆ペーストできるかと思ったけどできなかった。

図形の編集に入り、対象の図形を選択、「操作」からコピーして、閉じる。
新規に図形を作成して「操作」からペースト、そして保存して閉じる。
PC用のページをそのままスマホで表示する

レスポンシブに対応するのではなく、PC用にコーディングしたソースをそのまま綺麗にスマホでも見れるようにする方法。

## viewport設定

何も指定しないと、初期値は980pxだが、横にはみ出た状態になってしまう。

```
<meta name="viewport" content="width=1200">
```

上記のように、コンテンツ幅を指定する。(ex.1200px)
これで横幅いっぱいに表示される。

## 文字が大きくなる問題

CSSで指定したサイズとは違うサイズで表示されてしまう場合。

### iPhone

文字サイズの自動調整が効いているかららしい。

```
body {
  -webkit-text-size-adjust: 100%;
}
```

上記のように、文字サイズの自動調整をさせたくない部分に指定する。

### Android(Chrome)

metaにinitial-scaleを指定しなかったり、content属性の「width」が「width=1200」のような数字になっている場合に起きるらしい。(Android版Chrome固有のバグ？)

```
h1{
  max-height: 100%; 
}
```

上記のように、文字が大きくなってしまう要素に指定する。
CakePHP3 Entityのset/getについて

#CakePHP3 Entityのset/getについて

CakePHP2までの便利な機能の一つにafterFindというものがありましたが、CakePHP3では使用ができなくなっています。

その代わりとしてCakePHP3では便利な機能としてEntityにset/getという機能が準備されています。

http://book.cakephp.org/3.0/en/orm/entities.html#accessors-mutators

##set
setはEntityにセットするタイミングで発動します。

```php
// Entity
protected function _setTitle($title)
{
    // entityをセットするタイミングでtitleというフィールドがあれば処理
    return $title;
}
```

```php
// Table
$data = [
    'title' => 'title',
];
$entity = $this->newEntity($data);
```

##get
getはEntityを呼び出すタイミングで発動します。

```php
// Entity
protected function _getTitle($title)
{
    // entityをよびだすタイミングで処理
    return $title;
}
```

```php
<!--  Viewなど-->
<?= $entity->title;?>
```
CakePHP2以前のvirtualFieldsに該当するような処理もここで行えます。

##応用
上記基本の使用方法だと各Entityにメソッドを作成しないと使用できません。

プラグインなどで任意のフィールドを指定してgetやsetを発動させるには、大元の```Cake\ORM\Entity```のsetやgetをオーバーライドする必要があります。

```php
// Entity
// &getメソッドをoverride
public function &get($property)
{
    $value = parent::get($property);
    // propertyとvalueを利用して処理する
    return $value;
}
    
// setメソッドをoverride
public function set($property, $value = null, array $options = [])
{
    parent::set($property, $value , $options);
    // $thisにEntity情報が含まれているのでそれを利用して処理
    return $this;
}

```

##注意すること
getやsetが片方だけの場合はそこまで影響はないですが、両方オーバーライドをする必要がある場合、set内で値を取り出すと(当然ですが)getが発動します。

どうしてもset内でgetが発動することでうまく動作しない場合はメンバ変数を利用して処理を制御するなどの工夫が必要かと思います。

いずれにしてもかなり便利なのでどんどん使って行けるといいと思います！
CentOS7にOwnCloudの導入メモ

ホスト側 CentOS
クライアント側 とりあえずUbuntu14.04

#CentOSにOwnCloudサーバを入れる

[公式ページ](http://owncloud.org)から説明にしたがって入れていきます．手抜きをするために，パッケージマネージャを使った環境構築を行います．

```zsh
$ cd /etc/yum.repos.d
$ sudo wget http://download.opensuse.org/repositories/isv:ownCloud:community/CentOS_CentOS-7/isv:ownCloud:community.repo
$ sudo yum install owncloud
```
なんやかんやをyesしたら入る．割とデカイのでちょっと時間かかる．
最初の最初だとwgetが「コマンドがありません」と言われるかも．その時はyum installして入れましょう．

参考
[自分だけの専用クラウドストレージ「ownCloud」を導入してみました](http://enz0.net/web_service/cloud_owncloud/)
[centos6ミニマムインストールからowncloud導入まで](http://roserogue.blogspot.jp/2012/11/centos6owncloud.html#null)

#いろいろぶち込む
CentOSの環境構築を特に何もしていないのでいろいろたりません．とりあえずいろいろをぶち込みます．必要じゃないものまであるかも?

MariaDBの環境

```zsh
$ yum install mariadb mariadb-devel mariadb-libs mariadb-server
```
PHP環境

```zsh
$ yum install php-fpm php-common php-mbstring php-pecl-apcu php-gd php-mysql
$ sudo vim /etc/php.ini
//692行目のコメントアウトを外す
;default_charset = "UTF-8"
↓
default_charset = "UTF-8"

//878行目でタイムゾーンの設定
;data.timezone=
↓
data.timezone="Asia/Tokyo"
```

#動作確認（できない）
よっしゃこれで入ったと思ってwebブラウザで

https://ホスト名/owncloud

に繋いでもつながりません．あれ？
と思ったら，iptablesの設定を忘れていました．
というか，CentOS7からはiptablesではなく，Firewallというのになっているそうです(てきとう)

実際に

```zsh
$ systemctl list-unit-filter
```
とかしてみると，iptablesは無いけど，Firewalled.serviceが動いているのがわかります．

Firewalldの設定をします．
詳しい事は参考の参照してください．必要だった部分だけメモします

```zsh
$ su
$ firewall-cmd --add-service=http --zone=public --permanent
$ firewall-cmd --add-service=https --zone=public --permanent
$ firewall-cmd --reload
```
たぶんこれでhttp://ホスト名には接続できるようになったはず．でもhttps://ホスト/owncloudにはまだ接続できない．httpsは443ポートだからね(/_;)

参考
[CentOS 7からデフォルトのFirewalldでハマった(iptablesは今後使わない？)](http://urashita.com/archives/963)
[CentOS7 firewalldの設定](http://www.unix-power.net/centos7/firewalld.html)
[CentOS7最小インストールからHTTP接続が接続できるまで](http://qiita.com/tamamius/items/448c350ca34e4db9f6f5)
[CentOS7 64bit firewalldによるアクセス制御](http://www.kakiro-web.com/linux/firewalld.html)
[CentOS7 ownCloudを使ったオンラインストレージ](http://www.unix-power.net/centos7/owncloud_install.html)
c言語　バブルソートのソースコードの解説

この下に記載されてるc言語のバブルソートのコードがよく分かりません
誰か教えて下さい。
バブルソートについては分かりますが肝心なc言語のバブルソートの、ソースコードがどうなってるか
分からないので誰か詳しく教えてもらえませんかね？
よろしくお願いします！！！

ソーソコード↓
int main（void）
｛
int data［N］, target;
int i,j,work;
int low, high, middle;
/数値入力/
printf（"１０個の数値を入力してください。¥n"）;
for （i=0;i scanf（"%d",&data［i］）;
/*整列/*
for（i=0;i for（j=N-2;j>=i;j--）｛
if（ data［j］>data［j+1］）｛
work = data［j］;
data［j］= data［j+1］;
data［j+1］=work;
｝
｝
｝
/整列済みの数値を入力/
for（i=0;i<N;i++）
printf（"%d",data［i］）;
printf（"¥n"）;
/数値探索/
while（1）｛
printf（"探索対象数値を入力してください¥n"）;
scanf（"%d",&target）;
if（target < 0）
break;
low=0;
high =N-1;
while（low<= high）｛
middle = （low + high） /2;
if（ data ［middle］== target  ）
break;
else if （data［middle］< target）
low = middle +1  ;
else
high = middle -1;
｝
if（ low >high ）
printf（"見つかりませんでした¥n"）;
else
printf（"見つかりました¥n"）;
｝
return 0;
｝
Google Chrome の予測変換候補を個別に削除する

Google Chrome のアドレスバーに何か文字を入力すると予測変換候補が自動的に表示される。
例えば、Google Chrome のアドレスバーに `g` と入力しただけで、`google.com` や
 `github.com` を始めとして過去に閲覧したことのある URL が候補として表示される。これはこれで便利だが、間違って検索してしまった候補やもう使わない不要な候補までいつまでも表示される。

以下の方法で、不要な候補を個別に選んで削除することができる。

#### macOS の場合
不要な URL 候補を十字キーで選択して、キーボードの __fn+Shift+Delete__ を同時に押す。

#### Windows の場合
不要な URL 候補を十字キーで選択して、キーボードの __Shift+Delete__ を同時に押す。
Swift2.0で追加された構文


## guard

条件分岐の構文。
`if`と似ているが、`guard`は必ず`else`とセットで使う。

`if`だとunwrappedNameは`if`のブロック内でしか使えない。

```swift
func greet(name: String?) {
    guard let unwrappedName = name else {
        return
    }
        
    print("Hi \(unwrappedName)")
}

// ifで書くと
func greet(name: String?) {
    if let unwrappedName = name {
        print("Hi \(unwrappedName)")
    }else {
        return
    }
}


greet("Jhon") // "Hi John"
greet(nil)    // 何も表示されない。
```

## defer
`defer`ブロック内の処理はスコープを抜ける際に実行される。
例のように複数の`defer`を定義すると後ろから順に実行される。

```swift
func f() {
    defer { print("First") }
    defer { print("Second") }
    defer { print("Third") }
    
    print("call f()")
}
```

```実行結果
call f()
Third
Second
First
```

ファイルを閉じるなど後処理に使える。

## Availability
OSのバージョンによる分岐。

```swift
if #available(iOS 9, OSX 10.10, *) {
    // iOS9以降、OSX10.10以降
}else {

}
```

構文は以下のようになる。

```構文
if #available(`platform name` `version`, ..., *) {
    // iOS9以降、OSX10.10以降
}else {

}
```

最後の`*`は必須で、これが無いと、`Must handle potential future platforms with *`というエラーを吐くので、`*`はそれ以降を表している？
指定できるプラットフォームは`iOS`,`OSX`,`watchOS`

## Repeat-While

いわゆる`do-while`構文。

```swift
let loopTimes = 5
var loopCounter = 0
repeat {
    print(loopCounter)
    loopCounter++
} while loopCounter <= loopTimes
```

```実行結果
0
1
2
3
4
5
```


## 参照
[iBooks The Swift Programming Language (Swift 2 Prerelease)](https://itunes.apple.com/us/book/swift-programming-language/id1002622538 'Swift2')
jsでワードクラウドを手軽につくる！

javascript上で手軽にワードクラウドを作成できるスクリプト、EasyWordCloudを作成しました。

ドキュメントは[こちら](http://kyu999.github.io/d3-easy/)

[デモサイト](http://nlpkit.herokuapp.com/)
[デモサイトのコード](https://github.com/kyu999/NlpKit)

例
![wordcloud.png](https://qiita-image-store.s3.amazonaws.com/0/33227/1df33e19-e369-f3b8-93e5-f05dc78cd852.png)
XAMPPのGit設定共有用TextExpanderショートカット


XAMPPの設定共有毎回お願いするの面倒なので埋める形式にした。
（要TextExpander）

## ポップアップイメージ
![スクリーンショット 2015-06-10 14.06.22.png](https://qiita-image-store.s3.amazonaws.com/0/5472/526518a2-299e-7ed8-796d-a765c7330986.png "スクリーンショット 2015-06-10 14.06.22.png")


## コード
```bash:TextExpander

【%filltext:name=案件名%のローカル環境設定】
１.
Finderで shift + cmd + g 下記へ移動

/private/etc/hosts

エディタでhostsファイルを開く

下記1行を追加
127.0.0.1 %filltext:name=ローカルドメイン%

２.
Finderで shift + cmd + g 下記へ移動

/Applications/XAMPP/xamppfiles/etc/extra/httpd-vhosts.conf
エディタでhttpd-vhosts.conf を開く

下記4行を追加
<VirtualHost *:80>
 DocumentRoot "/Applications/XAMPP/xamppfiles/htdocs/%filltext:name=案件DocRoot%"
 ServerName %filltext:name=ローカルドメイン%
</VirtualHost>

【git】
%filltext:name=Gitパス%
パスワード： %filltext:name=Gitパスワード%
ブランチは「%filltext:name=ブランチ名%」を使います。

【URL】
ローカル : http://%filltext:name=ローカルドメイン%
テスト : http://%filltext:name=開発用ドメイン%

```
「バグ」を「UX向上作り込みタスク」という言い換えてみた

チャット系システムをつくっていて、「"空白文字だけの投稿"などの"有意な文字"を含まない投稿を許可しない」というタスクが出た。
機能仕様には含まれないので「バグ」という分類になっていたがそれについて少し考えた
なおそのタスクは即座に消化された。スピード優先。

# この手のタスクをバグと分類すると何がまずいのか(なおこれを仕様バグをして扱うことには異論はない)
・開発者が責められているように感じる。
・外聞が悪い(今週のバグ５件？品質悪いんじゃないの？)
・本来バグとして扱うべき物(クラッシュバグや、TL同士が混線する問題)がこれらの「軽微な問題」に埋もれてしまう
・この手の「バグ」が現れることは常態化しがちなので、バグがあっても当然という意識になりがち
・バグ＝問題＝瑕疵担保で無償対応、という意識からバグかバグでないかの議論に無駄なエネルギーが割かれがち(受託でよくある問題)

# 対応として
私としてはこれがバグだろうがバグじゃなかろうがどうでもいい。内製開発だし。
ただこれが許されるとTLの見た目が悪くなるのでUXが悪化する。UXを悪化させたくないので対応したい。

なのでUX向上作り込みタスクと呼称した。
対象は「存在したとしてもUXをクラッシュするレベルではないが、あると使いづらい、ダサい」レベルのバグ
そうすると
・ポジティブに聞こえる
・外聞が良い(ユーザーの方をちゃんと向いているように見える。)
・やばさのあるバグと区別可能
・問題じゃないように聞こえるし「UX向上の作り込みやります！」と言うとやるやらないでもめたりはしない(優先度では少し揉めるが)

ということで名前重要
Atomでphpの単語選択時に$を含まないように設定する

エディタによって単語選択時に変数の$記号を含んだり含まなかったりしますが
含まない方が好みの人向けの設定手順です。

# 設定方法

1. メニューからAtom->Open Your Configを選択してconfig.csonを開く
2. [".source.php"]["editor"]["nonWordCharacters"]を設定

```coffeescript
"*":
  #...
  welcome:
    showOnStartup: false
  core:
    themes: [
      "one-dark-ui"
      "seti-syntax"
    ]
  editor:
    invisibles:
      {}
    fontSize: 17
    fontFamily: "Ricty"
    showIndentGuide: true
  #...
#以下を追加
".source.php":
  editor:
    nonWordCharacters: '/\\()"\':,.;<>~!@#%^&*|+=[]{}`?-$'

```
ATOM の Theme / Package の感想文（2015-06-10）

[ATOM] Editor を定常的に使うようになって2週間程度かな。現時点で使ってる Theme と Package の感想を書いておく。
[ATOM] について書いた記事は「[ATOM Editor をそろそろ始めようか](http://qiita.com/spiegel-im-spiegel/items/3d41d98dacc107d73431)」をどうぞ（ブックマークもこちら）。ちなみに Windows 環境。

## Themes

```shell
C>apm list -i -b -t
atom-monokai@0.8.0
 → Theme にこだわりはないのだが、atom-monokai は UI Theme に反応して自動的に Dark と Light を切り替えてくれるので便利に使っている。
```

## Packages

```shell
C:>apm list -i -b -p
autoclose-html@0.17.1
→ 私はブログ記事を書くときは HTML べた書きなので、まぁまぁ助かる。
editorconfig@1.0.0
→ 仕事で ATOM を使うときは必須。
file-icons@1.5.7
→ 見栄えは大事。
git-control@0.3.0
→ git-plus が手に馴染んだら使わなくなった。 submodule を上手く処理してくれないのもマイナス。
git-plus@5.1.0
→ 手に馴染んだらとても便利なことに気が付いた。 GUI が要るなら GIT Extensions か SourceTree 併用で。
highlight-line@0.10.2
→ Windows キャレットをよく見失うのよ。これないと作業効率が下がる。
japan-util@0.1.1
→ 全角の英数字や半角カナを使う馬鹿が後を絶たないので必要。
japanese-wrap@0.2.10
→ 日本語環境では必須なのだが、たまにうまく動かないんだよなぁ。特に Markdown 編集時。
open-recent@2.2.4
→ 最近開いたファイルとフォルダを覚えてくれる賢いやつ。てか、何故これを Core に入れないのだ。
show-ideographic-space@1.0.0
→ 全角空白を可視化する。コード書きには必須アイテム。
symbols-tree-view@0.9.3
→ アウトライン解析。コード書きには必須アイテム。
```

[ATOM]: https://atom.io/ "Atom"
privateを含む全てのインスタンスメソッドを得る方法

諸事情があってやることになった。
すっごく気に食わないけどコレでいける。

```rb
self.class.instance_methods(false) + self.class.private_instance_methods(false)
```

長すぎるから、`instance_methods`を`methods`に変えても良いし、
とても、わかりにくいから、`private_instance_methods`+`protected_instance_methods`....なんてことでも良い。

`Object#instance_methods`は、`protected`と`public`のインスタンスメソッドのみを返す。
c言語　バブルソートのソースコードの仕組みが分かりません

c言語バブルソートがさっぱり分かりません
webでバブルソートの仕方が分かったのですが、問題はc言語のバブルソートのソースコードが
どうなってるのかがちゃんと把握できません
バブルソートが分かってもソースコードでのバブルソートの仕組みが分からなかったら意味ないので笑

ちなみに、問題です 
次のプログラムの説明を読んで、プログラムの中の数字に入れる適切な字句を入れてください 
＜プログラムの説明＞ 
このプログラムの目的は、入力された１０個の整数値を昇順に並べ替えて画面に出力し、その後 
指定した探索対象数値が、先の１０個の数値の中に存在しているかどうかを調べ、その結果を画面に 
表示することである。 
なお、入力される数値は０以上１００以下の整数であり、入力時の値はすべて正しいものとする。 
①１０個の数値を画面より入力する 
②入力された１０個の数値をバブルソートにより昇順に並べ替えて、画面に出力する 
③探索対象数値を入力する 
④指定した探索対象数値が、②で出力した１０個の数値の中に存在しているかどうか、２分探索により調べ 
、存在してる場合は「見つかりました」存在してない場合は、「見つかりませんでした」、と画面に出力する 
⑤ ③、④の処理を、探索対象数値に負の数が指定されるまで繰り返す。 
＜＜実行例＞＞ 
１０個の数値を入力してください 
20 3 12 8 18 6 32 25 19 30 
3  6  8 12 18 19 20 25 30 32 
探索対象数値を入力してください 
12 
見つかりました 
探索対象数値を入力してください 
13 
見つかりませんでした 
探索対象数値を入力してください 
2 
見つかりませんでした 
探索対象数値を入力してください 
32 
見つかりました 
探索対象数値を入力してください 
−１ 
です 
答えの番号は 
❸❸が data［j］>data［j+1］ 
❸❹が data［j］= data［j+1］ 
❸❺が data ［middle］== target 
❸❻が middle +1 
❸❼が low >high
です、
 
よければ詳しく書き方教えてくれないですか？
よろしくお願いします 

`code`

#include<stdio.h>
#define  N  10
int main（void）
｛
    int data［N］, target;
    int i,j,work;
    int low, high, middle;
    /*数値入力/*
    printf（"１０個の数値を入力してください。¥n"）;
    for （i=0;i<N;i++）
       scanf（"%d",&data［i］）;
    /*整列/*
  for（i=0;i<N;-1;i++）｛
     for（j=N-2;j>=i;j--）｛
       if（  ❸❸   ）｛
         work = data［j］;
                 ❹❹   ;
               data［j+1］=work;
     ｝
   ｝
 ｝

  /*整列済みの数値を入力/*
  for（i=0;i<N;i++）
        printf（"%d",data［i］）;
  printf（"¥n"）;
  /*数値探索/*
while（1）｛
    printf（"探索対象数値を入力してください¥n"）;
       scanf（"%d",&target）;
       if（target < 0）
           break;
       low=0;
       high =N-1;
       while（low<= high）｛
         middle = （low + high） /2;
         if（   ❸❺   ）
            break;
         else if （data［middle］< target）
              low =    ❸❻   ;
         else
             high = middle -1;
      ｝
   if（   ❸❼   ）
         printf（"見つかりませんでした¥n"）;
      else
         printf（"見つかりました¥n"）;
  ｝
   return 0;
｝
React.jsでpaginationを生成するモジュールを作りました


同じようなものを短期間に２つ作ったので、共通部分を切り出してみました。
https://github.com/toshi0383/ts-react-pager

使い方は、こんな感じ。

```
var Pager = require('ts-react-pager').Pager
var YourApp = React.createClass({
  handlePaging: function(pageNum) {
    this.setState({data:this.state.data, currentPage:pageNum})
  },
  render: function() {
    var o = {
      dataLength:this.props.data.length,  // Your data's length.
      handler: this.handlePaging,         // Gets called when page is changed. You must implement your own. Otherwise crashes.
      pageSize: this.props.pageSize,      // Max display count of your data.
      currentPage: this.state.currentPage // Your current page should be set in your state.
    }
    var pager = (<Pager object={o}>)
    return (
      <div>
        {pager}
        {yourtable}
        {pager}
      </div>
    )
  }
})
```

# こうなる
![ss.png](https://qiita-image-store.s3.amazonaws.com/0/35008/e1efe1a4-ed86-1ab4-c252-9df43659ba8b.png "ss.png")


テーブルは、共通化してもあまり綺麗に書けるようにならない気がするので、各自描画するということで。
似たようなライブラリは既にたくさんあるんですが、React.jsのことがよくわかってない状態で人のものを使いたくないと思い、自作してしまいました。

npm moduleをpublishするの初めてでしたが、package.jsonを書いて```npm publish``` だけよくてお手軽でした。
logrotateしたときに`because parent directory has insecure permissions`というエラーが出る


## 環境情報
* CentOS 7
* logrotate 3.8.6


## 事象
* logrotateした際にerrorが出力される。


## 検証
* logrotate 3.8.0でsuディレクティブが追加された模様。それ以降では権限によって同様のエラーが出るらしい。

* [tags/r3-9-1 の CHANGES – logrotate](https://fedorahosted.org/logrotate/browser/tags/r3-9-1/CHANGES)

## 回避策
### logrotate.confに`su`ディレクティブを追加する
suディレクティブでrotateするユーザを指定してあげればいいようです。

```
/var/log/nginx/*.log {
    daily
    missingok
    compress
    dateext
    ifempty
    sharedscripts
    rotate 10
    su nginx nginx
}

```
perlのコマンドでファイル内の文字列を一括置換しました。

perlコマンドを使ってファイル内の文字列を一括置換しました。以前使っている人を見たことがあり、使ってみたいと思っていたのです。

# perlの文字列置換コマンド
文字列置換コマンドの使い方です。

```perl:置換コマンドの使い方
perl -pi -e "s/変更したい文字列/新しい文字列/g" ファイルのパス
```
以下は`piyo`を`hoge`に置換する例です。

```perl:置換コマンドの使い方
perl -pi -e "s/piyo/hoge/g" app/controllers/*.php
```
`app/controllers/`ディレクトリ内にあるphpファイル内にある、`piyo`という文字列が`hoge`に置き換わりました。正規表現を書けばもっと色々できそうです。

## Class 属性を削除する例
正規表現を使って Class 属性を削除する例です。

```perl:
perl -pi -e "s/\ class=\"(.*?)\"//g" ./対象ファイル 
```

# おまけ
置換する前にも後にも文字列の存在を確認をすると思います。その際には以下のgrepコマンドで確認をしました。

```bash:grepコマンドでhoge文字列を探す
grep "hoge" -R app/controllers/*
```


# 参考
- Perl の便利な 1 行コマンド
 - http://www.redout.net/data/oneliner.html
- 【作業効率化】CSSのクラスがどのファイルで使われているかgrepコマンドで検索する 
 - http://qiita.com/pugiemonn/items/88d53ac5d5abac32ae5b
【シリアル接続】Mac でシリアルコンソールを利用してみた

以下の画像のマイコンにシリアル接続しました。

![IMAG0162.jpg](https://qiita-image-store.s3.amazonaws.com/0/75241/89f1c1dc-573f-8788-735a-7b16d4c6f0b9.jpeg)

Windowsの場合は、必要なドライバをインストールしたりして
TeraTermなどでシリアル接続が出来ます。

Macの場合は、
ターミナルでこの記事のコマンドを入力していけばシリアル接続できます。

# 環境
・Mac OSX Yosemite
・約4000円で買わされた16bitマイコン

#実際にやってみた
① Macとマイコンを繋げないで以下を実行 `$ ls -l /dev/tty.*`

```:ターミナル
$ ls -l /dev/tty.*
crw-rw-rw-  1 root  wheel   18,   0  6 10 02:13 /dev/tty.Bluetooth-Incoming-Port
crw-rw-rw-  1 root  wheel   18,   2  6 10 02:13 /dev/tty.Bluetooth-Modem
```

② Macとマイコンを繋げます
③ マイコン（tty デバイス）を確認します `$ ls -l /dev/tty.*` 

```:ターミナル
$ ls -l /dev/tty.*
crw-rw-rw-  1 root  wheel   18,   0  6 10 02:13 /dev/tty.Bluetooth-Incoming-Port
crw-rw-rw-  1 root  wheel   18,   2  6 10 02:13 /dev/tty.Bluetooth-Modem
crw-rw-rw-  1 root  wheel   18,   8  6 10 12:13 /dev/tty.usbmodem1421
```
④ マイコンの確認 (tty デバイスの確認)
　③の操作により、`/dev/tty.usbmodem1421`というのが追加されているのが確認できます。
　今回接続しているこのマイコン(tty デバイス)は`usbmodem1421`であることが分かりました。

⑤ cu コマンド　`$ cu -l /dev/tty.”ttyデバイス名”`を実行します

```:ターミナル
$ cu -l /dev/tty.usbmodem1421
Connected.
```

⑥ screen コマンド  `$ screen /dev/tty.”ttyデバイス名”`

```:ターミナル
$ screen /dev/tty.usbmodem1421
```
上手く接続できれば、

```
not find cmd token
at LN# 0
OK
```
のようにokと表示されます（何も表示されない場合は **enter(return)キー** を押してみる）

もしエラーが出ていてどうしても接続できない場合は、
マイコンを疑った方がいいです。
もしかしたら静電気の影響を受けて起動しない状態になっている可能性が高いです。
僕もこのパターンで、最初何がいけなかったのか...とイライラしてしまいました。

##プログラムの実行など
**load**と打って
直接BASICでプログラムを書いていきます。
最後に**end**と**999**を書いて**enter**を押したら**run**で実行できます。

プログラムを消したい場合は
**load** と打って**空白**を入れて次の行で **control+C** で強制終了すればデータを消すことが出来きます。
(↑このやり方で合っているかわからないです...が消えるのでこうしてます(汗))

1回1回プログラムを削除してloadしてrunするのが最初面倒だと感じました...

あと、入力した文字をdeleteキーで消すことが出来ないため、
一度テキストエディタでプログラムを書いてからコピペしています。


⑦切断方法
**control+a** を押してから **a** だけ離して*/*を押します。
そうすると、
**Really quit and kill all your windows [y/n]**
とターミナルの下に表示されるので **y** を押して終了します。

以上【シリアル接続】Macでシリアルコンソールを利用してみた
でした。

#参考サイト
・Mac でシリアルコンソールを利用する方法
URL: http://www.maruko2.com/mw/Mac_%E3%81%A7%E3%82%B7%E3%83%AA%E3%82%A2%E3%83%AB%E3%82%B3%E3%83%B3%E3%82%BD%E3%83%BC%E3%83%AB%E3%82%92%E5%88%A9%E7%94%A8%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95
・Mac OS X (Snow Leopard)でSerial Console (シリアルコンソール)
URL: http://www.ytsuboi.org/wp/archives/1219
「Page Plugin」（旧「Like Box」）の最小サイズが小さくなってた！

もしかしたらちょっと前から対応されてたのかもしれないけど、
昨日気が付いたのでメモ。
（Twitterで検索したら6/5につぶやいてる方がいらっしゃったので、それぐらいにしれっと変わってたのかも）

---

「Page Plugin」（旧「Like Box」）のサイズは、
当初、**『横幅：280px～500px、高さ：130px～』**と発表されていて、
どんな数値を入れても最小値より小さくはできませんでした。
（途中で切れて表示されてしまう。）

弊社サイトの左ナビや右ナビ内に入れていた「Like Box」は、
最小値よりも小さい 220～260px だったため、
「レイアウト変更か？削除か？」「無理矢理縮小しようぜ！」と
どのように対応すればよいかを考えていました。

ところが、
昨日、別件で「Page Plugin」を作成したところ、
180px まで小さく表示されるようになってた！
https://developers.facebook.com/docs/plugins/page-plugin
（Width欄の文言が『The pixel width of the embed (Min. 180 to Max. 500)』になっています。）

「最小値が 280px」っていうのは、
さすがにデカすぎて不評だったんでしょうかｗ
小さいサイズまで対応していただけるようになって助かりますー！

---

###【まとめ】
「Page Plugin」（旧「Like Box」）のサイズは、
~~**『横幅：180px～500px、高さ：130px～』** です。~~
**『横幅：180px～500px、高さ：70px～』** です。

※追記（6/18）
6/15頃に高さの最小値も 130px から 70px に変わっていたので、
まとめて記事にしました。

→ 6/23に「Like Box」廃止→「Page Plugin」へ | Tips Note
http://www.tam-tam.co.jp/tipsnote/html_css/post6482.html
Quaternions > youtube動画 / Quaternionsの利点

[Math for Game Developers - Quaternion Wrapup and Review](https://www.youtube.com/watch?v=fRSaaLtYj68&index=7&list=PLW3Zl3wyJwWNWsJIPZrmY19urkYHXOH3N)

Euler angleとQuaternionでの回転の比較例がある(1:30頃)。

<hr>
[MFGD - Quaternions 再生リスト](https://www.youtube.com/playlist?list=PLW3Zl3wyJwWNWsJIPZrmY19urkYHXOH3N)
上記のyoutube含めてQuaternionsの説明のyoutubeがまとまっている

<hr>
youtubeを見た感じではQuaternionsの利点は「中間の角度の回転を扱いやすい」のだと思う。

また、「gimbal lockになることがない」というのがもう一つの利点だろう。

3D CGソフトで"Double Quaternions"という機能が出てきているが、詳細な情報は不明。
初期化用lockステートメントをラップする

## よくある初期化用lock
```csharp
private static object thisLock = new object();
private static SomeObj some;
public void Hoge()
{
	// まだ作られてなければ作る
	if (some == null)
	{
		lock (thisLock)
		{
			if (some == null)
			{
				some = CreateSome();
			}
		}
    }
	// 以降の処理
}
```
### 気になる
- ネスト深い
- objectの用途を名前で表明するしかない

## ラップするクラスを作ってみる
```csharp
public class ObjectForLock
{
   /// <summary>
   /// 指定したconditionがtrueを返す時自分自身のlockを取得し再度conditionがtrueを返した時指定したactionを実行します
   /// </summary>
   /// <param name="condition"></param>
   /// <param name="action"></param>
   public void IsolateAction(Func<bool> condition, Action action)
   {
       if (condition() == false) return;

       lock (this)
       {
           if (condition() == false) return;

           action.Invoke();
       }
   }
}
```
### 先ほどの例を置き換えてみる
```csharp
private static ObjectForLock thisLock = new ObjectForLock();
private static SomeObj some;
public void Hoge()
{
	// まだ作られてなければ作る
	thisLock.IsolateAction(
		() => some == null,
		() => { some = CreateSome(); });
	
	// 以降の処理
}
```
- ネスト無い
- lock用のオブジェクトであることが型を見ればわかる

地味に便利
Python製CMS Mezzanine導入手順

PythonとDjangoで構築されたCMS、Mezzanineの導入手順です。
pipでインストールしてもいいんですが、createdbでエラーを吐かれたので
現時点で良さそうなインストール方法と、基本的な動作までを。

http://mezzanine.jupo.org/

上記URLから　GET Mezzanine　ボタンでダウンロード。
Mezzanine-3.1.10.tar.gzを落としてきます。

Pythonのパッケージとかモジュールをpipではなく、

```
$ python setup.py install
```

とする場合、最近はそれ用のディレクトリを作ってます。

```
$ mkdir pythoninstall
```

このフォルダにmezzanineを解凍したフォルダをぶち込みます。

```
$ cd pythoninstall
$ cd Mezzanine-3.1.10
$ python setup.py install
```

依存関係は全部インストールしてくれます。
ここまで出来たら後は起動まで一直線。

```
$ mezzanine-project myproject
$ cd myproject
$ python manage.py createdb
$ python manage.py runserver
```

面白いですMezzanine。
Wordpressでいいじゃん、と言われたらそれまでなんですけどね。
2015/06/10 時点の apm list と一行コメント

Atom を使い始めたのは、４月の末頃だった。

[2015/05/01 時点の apm list と一行コメント](http://qiita.com/t9md/items/38538d519b7b0bc6bdf7) を書いた時に比べて、自作 Package へが増えている。

これまで 11 個のPackage を作って公開した。
Vim の筋肉記憶に合わせる形で、Package を作ってる部分も結構ある。
お陰で、大分不満が減ってきた。

# テーマ系

```
$ apm list -i -b -t
monokai@0.14.0
pen-paper-coffee-syntax@0.9.1
unity-ui@2.0.11
```

# パッケージ系

```
$ apm list -i -b -p
aligner@0.13.0
 → よく使っている。便利
 
atom-beautify@0.28.0
 → あまり使っていない
 
autocomplete-emojis@2.2.2
 → 最近入れた。atom 本家製
 
color-picker@2.0.4
 → たまに使う。便利。
 
cursor-history@0.4.8
 → [自作] カーソル位置を記憶して行ったり来たり。日常的に使う。無いとやっていけない。
 
dev@0.0.0
 → [自作] 未公開, Atom の Package 作成時の試行錯誤様。event(onDidOpenとか..) の発動条件の観察とかに使用している。
 
file-icons@1.5.7
 → ファイルがかわいいアイコンに
 
fold-comments@0.4.0
 → 時々使う。Deprecated APIへのFIX PRが取り込まれた。
 
japanese-wrap@0.2.10
 → 日本語の文字折り返しが変じゃなくなる。ないとやってけないだろう。
 
jumpy@2.0.6
 → 使ってないが、これから作る Package の研究用に入れている。
 
key-peek@0.2.5
 → あんま使ってない。Deprecated APIへのPR投げたが反応無く、そのまま Deprecate にな
   ったので、自分で変更したやつ使ってる。
 
keymap-disabler@0.1.1
 → [自作] 使ってる。無いとやってけない(が、別にこの Package でなくても良い。)。
   標準配布の Package の keymap は採用。コミュニティ Package の keymap はデフォル
   ト無効で使ってる。
   たまにしか使わない機能と、よく使う機能のキーマップが被って「うぉー！！」というのが無くなった。
   バンザイ！
 
linter@0.12.6
 → まだ使ってない。これから使っていかんとな。。。。
 
minimap@4.9.4
 → 使ってない。でもアンインストールしようとは思わない。
 
minimap-git-diff@4.1.3
 → 使ってない。でもアンインストールしようとは思わない。
 
open-this@0.1.3
 → [自作] カーソル下のファイルを開く。使ってる。Vim や Emacs でこの操作に慣れてしまったので。
   とりあえずつくったという状態で、Improve の余地はかなりあるが、自分が使用する分には困っていない。
   
paner@0.1.4
 → [自作] PaneItem のスワップ、最大化、pane を一気に上方、下方等に移動(これが肝)。
   無いとやっていけない。
 
pigments@0.4.5
 → スタイルシートの色指定に自動で色つけてくれる。あるのが当たり前になっている。
 
preview@0.15.1
 → CoffeeScript や LESS 等のコンパイル結果をオートプレビュー。
 色々不満だが、まだアンインストールはしてない。transformer を自作したので使わなくなった。
 
project-manager@1.15.10
 → 使っている。便利。よく開くフォルダのショートカットみたいなものか。。。
 
quick-highlight@0.1.6
 → [自作] 画面に見えているキーワードをハイライト。使っている。無いとやっていけない。
 typo の発見や、複数形と単数形の変数の見分けに重宝。色で判別すれば、脳が疲れずに済む。
 
recent-finder@0.4.4
→ [自作] 使っている。主に、README を書くときに、別の Package の README をコピペするため。
 
regex-railroad-diagram@0.7.4
→ 使ってない。今の Atom で動くのか？？

run-in-atom@1.0.2
→ ChoromeDevTool のコンソールで直接操作するようになったので、使わなくなった。

script@2.24.0
→ ファイルや選択範囲を実行して、結果を見る。quickrun みたいなもの。
  transformer を自作したので、ほぼ使わなくなった。

theme-switch@0.3.4
→ [自作] theme を気楽に切り替える。毎日、使っている。
  部屋の明るさに応じて、light, dark を切り替えている。
  dark が好きだけど、明るいところでは、light の方が見やすい。

toggle@0.2.1
→ [自作] つくりたて。使用頻度は不明。。。

toggle-quotes@0.11.0
→ github 本家製、シングルクォート、ダブルクォートの切り替え

transform@0.1.0
→ [自作] 選択範囲 or バッファ全体を別の形に変換、、、がコンセプトだが、、、
  現状は単なるスクリプト runner。
  結果を TextEditor に書きだす点が、preview や、script とは違うところ。
  自分が使う分には満足。
  開発状態は very alpha state
  
try@0.2.5
→ [自作] 選択範囲を決まったファイルに貼り付ける。
  コード・リーディング時の不明点解消(動かして理解)や、ライティング時の試行錯誤。
  無いとやっていけない。
  
vim-mode@0.51.0
→ github 本家製。無いとやってけない。PRはこれまで２つ取り込まれた。１つは Pending。

vim-mode-visual-block@0.2.4
→ [自作] multi cursor 使って矩形選択モードをエミュレート。あるのが当たり前になっている。
```
update chef-client version

# 環境

OS: Ubuntu 12.04

# 現在のchef-clientのバージョンを確認

~~~
$ chef-client -v
Chef: 11.4.4
~~~

# chef-clientを11.12.8にバージョンアップ

~~~
$ (echo "version=11.12.8"; curl -L https://www.opscode.com/chef/install.sh) | sudo bash
...
Setting up chef (11.12.8-2) ...
Thank you for installing Chef!

$ chef-client -v
Chef: 11.12.8
~~~

# トラブルシューティング

## `dpkg: warning: 'ldconfig' not found...`エラーが発生する

### 解決方法

sudo実行時に環境変数PATHが渡っていないのが原因のようです。
~/.bash_profileに以下を追記します

~~~
# ~/.bash_profile
alias sudo="sudo env PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:$PATH"
~~~

~/.bash_profileを再読み込みします

~~~
$ source ~/.bash_profile
~~~

参考: http://unix.stackexchange.com/questions/160019/dpkg-cannot-find-ldconfig-start-stop-daemon-in-the-path-variable
iOS ベータ版のインストール手順


iOS のベータ版をインストールしようと思うたびに手順がわからなくなるのでメモ。

手順は下記の通り。

1. Dev center から iOS のイメージをダウンロード
1. device(iPhone) を Mac につなぐ
1. (device のバックアップを取っておく) 
1. iTunes からベータ版をインストール

# iOS のイメージをダウンロード
要Developer license。デバイスにあったものをダウンロードする。
https://developer.apple.com/ios/download/

# iTunes からベータ版をインストール

iTunes の device(iPhone) のページの "Check for Update" を Option キーを押しながら選択すると 適応させる iOS のイメージを選択するダイアログが出るのでイメージ(ipswファイル)を選択する。

![Screenshot 2015-06-10 11.27.39.png](https://qiita-image-store.s3.amazonaws.com/0/27210/4e90edd7-742a-2b16-2fff-f0b048abdfce.png "Screenshot 2015-06-10 11.27.39.png")
PHPExcelを使う(基本のみ)

自分がまたつかう時用のメモ。
## 環境
- PHP5.2.4　([PHP7だとエラー](#PHP7))
- xlsファイルで出力
- 書式設定はテンプレートファイルに指定
- xlsxなら`Excel5`は`Excel2007`,拡張子`xls`は`xlsx`に読み替え

##まずはダウンロードとインストール
[ここからダウンロード](http://phpexcel.codeplex.com/releases/view/119187)
(2015.6.10時点での最新は1.8.0です)

処理に必要なのはClassesフォルダだけなので、解凍した後にClassesだけ処理を行うPHP付近に置けばOK



##実際の処理
```php
//ディレクトリ設定
$dir = 'Classesがある場所のパス';

//ライブラリ読み込み
require_once $dir . '/Classes/PHPExcel.php';
require_once $dir . '/Classes/PHPExcel/IOFactory.php';

//テンプレート読み込み
$file =$dir.'temp.xls';//テンプレート名
$reader = PHPExcel_IOFactory::createReader('Excel5');
$book = $reader->load($file);

//シートを設定する
$book->setActiveSheetIndex(0);//一番最初のシートを選択(2枚目なら(1))
$sheet = $book->getActiveSheet();//選択シートにアクセスを開始
$sheet->setTitle( $month.'月' ); //シート名を設定、変数OK

/***************
*　書き込み処理
***************/
//セルを指定して書き込み
//セル名指定
$sheet->setCellValue('セル名','書き込み内容');

//セル位置指定
//列はA=0,B=1...　行はそのまま
$sheet->setCellValueByColumnAndRow(列,行,'書き込み内容');

/***************
*　出力処理
***************/
//出力ファイル名の設定(拡張子は出力形式に合わせて変える)
$output = 'output_'.$month.'.xls';

// Excel97-2003形式(xls)で出力する
$writer = PHPExcel_IOFactory::createWriter($book, 'Excel5');
$writer->save($output);

//DLさせる場合はこっち
header('Content-Type: application/vnd.ms-excel');
ob_end_clean();//バッファのゴミ捨て
header('Content-Disposition: attachment;filename=$output');
header('Cache-Control: max-age=0');

$writer = PHPExcel_IOFactory::createWriter($book, "Excel5");
$writer->save('php://output');
```
### ハマったこと
エラー出力設定をしていたので、エラーが出力されてしまってheaderがエラーを吐くという凡ミス(^▽^;)

DLできたので安心していたら、ファイルが破損していて云々と言われてしまって開けなかった…いろいろ調べた結果バッファのゴミが原因らしい。
`ob_end_clean();`
を追加したら解決しました(*^-^)

<a name="PHP7"></a>
## PHP7だとエラー
同じ操作をPHP7環境下で実行すると、DLはするもののファイルが壊れて開けません！って言われる。
エラーを見ると
`PHP Fatal error:'break' not in the 'loop' or 'switch' context in /Classes/PHPExcel/Calculation/Functions.php on line 581`

とのこと。
PHP7から`loop`や`swicth`以外で`break`を使うと怒られる仕様になったため。
該当部分をコメントアウトで解決しました！