OmniAICreator/Qiita-1.07M huggingface dataset:
lynx/ncursesをソースコードビルドする


# 概要
## これはなに？
- テキストベースのウェブブラウザ
- httpdのコンパイルで必要
- http://lynx.isc.org/

## 目標
- lynx-2.8.8rel.2 が使えるようになる
- ncurses-5.9 の共有オブジェクトがシステムに読み込まれる

## 実行環境
- CentOS-7.0
- [ソースコードビルドするための環境](http://qiita.com/boscoworks/items/0d442d446436f7d72183)

## 依存パッケージ
- なし
- lynx は、ここでビルドする ncurses に依存する

# 導入手順 (ncurses)
## tar.gz をダウンロードする
```
wget http://ftp.gnu.org/pub/gnu/ncurses/ncurses-5.9.tar.gz -P /usr/local/share/downloaded/
```

## tar.gz を解凍する
```
tar -zxvf /usr/local/share/downloaded/ncurses-5.9.tar.gz -C /usr/local/src/
```


## configure を実行する
```
cd /usr/local/src/ncurses-5.9/

./configure --prefix=/usr/local/lib/ncurses-5.9
```

## make を実行する
```
make
```

## make install する
```
sudo make install
```

## ディレクトリのシンボリックリンクを作成する
```
sudo ln -s /usr/local/lib/ncurses-5.9 /usr/local/ncurses
```


## 共有オブジェクトのパスを登録する
```
echo "/usr/local/lib/ncurses-5.9/lib" > /usr/local/etc/ld.so.conf.d/ncurses-5.9.conf

sudo ln -s /usr/local/etc/ld.so.conf.d/ncurses-5.9.conf /etc/ld.so.conf.d/ncurses-5.9.conf

sudo ldconfig
```

# 導入手順 (lynx)
## tar.gz をダウンロードする
```
wget http://lynx.isc.org/current/lynx2.8.8rel.2.tar.gz -P /usr/local/share/downloaded/
```

## tar.gz を解凍する
```
tar -zxvf /usr/local/share/downloaded/lynx2.8.8rel.2.tar.gz -C /usr/local/src/
```


## configure を実行する
```
cd /usr/local/src/lynx2-8-8/

./configure --prefix=/usr/local/lib/lynx-2.8.8rel.2 --with-curses-dir=/usr/local/lib/ncurses-5.9
```

## make を実行する
```
make
```

## make install する
```
sudo make install
```

## ディレクトリのシンボリックリンクを作成する
```
sudo ln -s /usr/local/lib/lynx-2.8.8rel.2 /usr/local/lynx
```


## 実行ファイルのシンボリックリンクを作成する
```
sudo ln -s /usr/local/lib/lynx-2.8.8rel.2/bin/lynx /usr/local/bin/lynx
```


# 削除手順 (ncurses)
## 導入時に生成したファイルを削除する
```
sudo rm -r /usr/local/share/downloaded/ncurses-5.9.tar.gz
sudo rm -r /usr/local/src/ncurses-5.9/
sudo rm -r usr/local/lib/ncurses-5.9/
sudo rm -r /usr/local/ncurses
sudo rm -r /usr/local/etc/ld.so.conf.d/ncurses-5.9.conf
sudo rm -r /etc/ld.so.conf.d/ncurses-5.9
```


## 共有オブジェクトのパスを更新する
```
sudo ldconfig
```

# 削除手順 (lynx)
## 導入時に生成したファイルを削除する
```
sudo rm -r /usr/local/share/downloaded/lynx2.8.8rel.2.tar.gz
sudo rm -r /usr/local/src/lynx2-8-8/
sudo rm -r usr/local/lib/lynx-2.8.8rel.2/
sudo rm -r /usr/local/lynx
sudo rm -r /usr/local/bin/lynx
```
Gemfile備忘

Gemfileの備忘。
自分しか得しないメモ。
自分が気づいたらどんどん増えるでござる。


***

#group
環境を決めてインストールができる。
開発環境では欲しいけど本番ではいらないgemなんかを書くと(・∀・)ｲｲﾈ!!

```lang:こんな感じ
group :development, :test do
  gem 'rspec-rails', '2.13.1'
end

```

#gemのバージョン指定

```lang:何も書かないとき
gem 'rspec-rails'

->最新版が入る
```

```lang:カンマ区切りのとき
gem 'rspec-rails', 'A.A.A'

->A.A.Aバージョン固定
```

```lang:=>のとき
gem 'rspec-rails'=> 'B.B.B'

->B.B.B以降が欲しい
```

```lang:>のとき
gem 'rspec-rails'=> 'C.C.C', < 'D.D.D'

->C.C.C以上、D.D.D以下のバージョンが欲しい
```

```lang:>のとき
gem 'rspec-rails' ~> 'E.0'

->メインバージョンEが欲しい(マイナーバージョン最新が欲しい)
```

#requireしないgemがあるとき

Railsチュートリアルで出てきた。
わりと忘れるので自分で調べてみる

```Railsチュートリアルで出てきた
group :doc do
  gem 'sdoc', '0.3.20', require: false
end
```

requireってRubyさんの関数だったんだね。
なるほど。
自動読み込みの関数らしい。(なければ読み込む、あれば読み込まないみたいなことしてくれる)
この場合だとsdocを自動読み込みしないってことか。なんで…？
(この辺は別の記事にまとめる)
cmake + SublimeText2でビルド(C++)


cmakeでビルド＆実行できたC++コードをSublimeText上からビルドしたいなと思った話。
デフォルトのままだと`make`が実行されないので、設定をちょい変。


# お試しのファイル
適当に作る
- cpp, h: printf出力する関数のファイルとメイン
- CMakeLists.txtも最低限必要と思われる記述

```
-rw-r--r--@ 1 sadoru  staff  362  1 10 14:12 CMakeLists.txt
-rw-r--r--  1 sadoru  staff  142  1 10 14:12 func.cpp
-rw-r--r--  1 sadoru  staff  188  1 10 14:12 func.h
-rw-r--r--  1 sadoru  staff  124  1 10 14:12 hello.cpp
```

```func.h
#ifndef FUNC_H
#define FUNC_H

#ifndef __cplusplus
#	error ERROR: This file requires C++ compilation (use a .cpp suffix)
#endif

void func1(void);

#endif // FUNC_H
/* EOF */
```

```func.cpp
#include <stdio.h>

#include "func.h"

void func1(void)
{
    printf ("%s bbb\n", __PRETTY_FUNCTION__);

    return;
}

/* EOF */
```

```hello.cpp
#include <stdio.h>

#include "func.h"

int main(int argc, char *argv[])
{
  printf ("aaa\n");

  func1();
  
  return 0;
}
```

```CMakeList.txt
CMAKE_MINIMUM_REQUIRED(VERSION 3.0.0)

SET(CMAKE_C_FLAGS_RELEASE "-Wall -O2")
SET(CMAKE_C_FLAGS_DEBUG "-g -Wall -O2")

#SET(CMAKE_BUILD_TYPE Release)
SET(CMAKE_BUILD_TYPE Debug)

PROJECT(hello)

ADD_EXECUTABLE(hello
	hello.cpp
	func.cpp
)
```

# cmakeだけでビルド

```
$ cmake .
-- The C compiler identification is AppleClang 6.0.0.6000056
-- The CXX compiler identification is AppleClang 6.0.0.6000056
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Configuring done
-- Generating done
-- Build files have been written to: /Users/sadoru/Desktop/sample

$ ls -l
total 88
-rw-r--r--   1 sadoru  staff  12439  1 10 14:14 CMakeCache.txt
drwxr-xr-x  12 sadoru  staff    408  1 10 14:14 CMakeFiles
-rw-r--r--@  1 sadoru  staff    362  1 10 14:12 CMakeLists.txt
-rw-r--r--   1 sadoru  staff   5432  1 10 14:14 Makefile
-rw-r--r--   1 sadoru  staff   1236  1 10 14:14 cmake_install.cmake
-rw-r--r--   1 sadoru  staff    142  1 10 14:12 func.cpp
-rw-r--r--   1 sadoru  staff    188  1 10 14:12 func.h
-rw-r--r--   1 sadoru  staff    124  1 10 14:12 hello.cpp

$ make
Scanning dependencies of target hello
[ 50%] Building CXX object CMakeFiles/hello.dir/hello.cpp.o
Linking CXX executable hello
[100%] Built target hello

$ ./hello 
aaa
void func1() bbb
```

ok, 問題無し


# Sublimetextからビルド
`cmd + B` でビルドするとこうなる

>
Undefined symbols for architecture x86_64:
  "func1()", referenced from:
      _main in hello-cff8c8.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
[Finished in 0.2s with exit code 1]


# SublimeTextの設定
`cmd + shift + P`で
`Preferences:Browse Packages` -> Finderでパッケージのフォルダ -> `C++.sublime-build`

デフォルトの記述だとこう。

>
"cmd": ["g++", "${file}", "-o", "${file_path}/${file_base_name}"],


こっちにする。

>"cmd": ["make"],


これでできた。
WIFI接続で使われるポップアップ認証を調べてみた

フリーWIFIに接続する際、Webページのポップアップが開いて UserName, Passwordを入力すると接続が出来る仕組みがある。

これについてググってみた。

IEEE802.1x という認証技術。

# 自作

[Ubuntu を無線 LAN ルータとして稼働させる - Qiita](http://qiita.com/8mamo10/items/59adae2c9f286e041792)

でhostapdを準備し、

FreeRADIUSで認証。
* [RADIUSによる認証ネットワーク環境構築のための７ステップ](http://www.virment.com/linux/916/)
* [CentOS FreeRadiusの設定](http://www.unix-power.net/linux/freeradius.html)

# 製品例

## NetAttest

[NetAttest EPS | ジェイズ・コミュニケーション株式会社](http://jscom.jp/products/soliton/netattest_eps/)

## Cisco 

[Catalyst 2960 スイッチ ソフトウェア コンフィギュ レーション ガイド Rel. 12.2(40)SE - IEEE 802.1x ポートベース認証の設定 - Cisco Systems](http://www.cisco.com/cisco/web/support/JP/docs/SW/LANSWT-Access/CAT2960SWT/CG/005/sw8021x.html?bid=0900e4b1825295c6#pgfId-1274616)
pm2でhubotをデーモン起動してみる


なかなかないのでメモ。イマイチわからなかったのでいじってたらうまくいきました。

参考: [http://nodejs.osser.jp/node/node-pm2/](http://nodejs.osser.jp/node/node-pm2/)

##pm2のオプション

* プロセスに名前をつける(ligco-cw) : `--name プロセス名`
* node以外のコマンド実行: `-f コマンド名 -x`
* コマンド実行に引数を渡す: `-- 引数` / (例:slackアダプタ指定とBOT名指定) `-- -a slack -n mybot`

##実行

通常に起動する場合

```
$ bin/hubot -a chatwork -n ligco
```

↓
pm2でデーモン化

```
$ pm2 start -f bin/hubot -x --name ligco-cw -- -a chatwork -n ligco
```

##確認

```
$ pmlist
┌──────────┬────┬──────┬───────┬────────┬───────────┬────────┬─────────────┬─────────────┐
│ App name │ id │ mode │ PID   │ status │ restarted │ uptime │      memory │    watching │
├──────────┼────┼──────┼───────┼────────┼───────────┼────────┼─────────────┼─────────────┤
│ ligco-cw │ 6  │ fork │ 17360 │ online │         0 │ 2m     │ 66.211 MB   │ unactivated │
└──────────┴────┴──────┴───────┴────────┴───────────┴────────┴─────────────┴─────────────┘
 Use `pm2 desc[ribe] <id>` to get more details
```
Rails備忘

Rails備忘。当たり前のことを書くから目新しいことはしないよ。
自分メモなのでどんどん増やすよ。使ったのだけ書くことが多いから網羅率は悪いよ…。
(どんどん増えてない時は何もしてない怠け者だよ)
時系列？体系？なにそれおいしいの？
(多少気にする)

***

#Railsアプリケーションの作成

##コマンド

```lang:アプリケーション作るよ
rails new [アプリケーション名]
```
アプリケーションはカレントディレクトリの下にできるよ。

```lang:アプリケーション作るよ、でもテストは要らないんだよ
rails new [アプリケーション名] --skip-test-unit
```
Test::Unitを使わない場合とかに使う

##パブリックリポジトリのとき
* Railsでセッション変数の暗号化に使用する秘密トークンを設定するらしい。(Railsチュートリアルの受け売り)->[3章](http://railstutorial.jp/chapters/static-pages?version=4.0#top)に書いてあるお。

#MVCのファイル生成とかそのへん

##コマンド

```lang:コントローラーとそれに付随するビューを作る
rails generate [コントローラー名] [ビュー] [ビュー]…
```
キャメル型でもそうじゃなくてもいいよ。
ビューは複数でもいいよ

```lang:作るの失敗した…
rails destroy [コントローラー名/モデル名]
```

```lang:model作るよ
rails generate model [モデル名] [--skip-migration]
```
マイグレーションファイルを先に作った場合のみ、「--skip-migration」オプションを入れる。



***
#route.rb

* route.rbはurlにリソース(DB)を割り当てるって意味で、`resources :users`みたいに書いてる

# rails console

## ActiveRecordのsqlを表示したい
```
ActiveRecord::Base.logger = Logger.new(STDOUT)
```
cocos2d-xでchildrenから複数の要素を削除する


__sawasaka さんが 有用なコメントを書いて下さっているので、よかったらコメント欄も読んでみてください。__

逆順で回すのがポイントです。

```cpp
auto children = getChildren();
// 逆順で回さないとindexがズレてしまい消したい要素を消せない
reverse(children.begin(), children.end());

for(auto child: children){
    auto name = child->getName();
    
    // _dirtyNamesには削除したい要素につけているnameが入っていることを想定
    auto keys = _dirtyNames.keys();
    // 以下のコードは keys.contains?(name) 的な意味
    if( std::find(keys.begin(), keys.end(), name) == keys.end() ){
        child->removeFromParent();
    }
}

```

書いてから思ったんだけど、逆順で回さないと配列が壊れるって話前にもobjcでハマったことあるな・・
初心者の俺がIDCFクラウドを借りてみた

ずぶの初心者の俺がひょんなことからIDCFクラウドを借りましたので、備忘録を兼ねて接続できるようにするまでに実施した内容を書き留めておこうと思います。
基本的にはIDCフロンティアが提供する[めちゃ楽ガイド](http://www.idcf.jp/pdf/cloud/IDCFCloud_installation_guide.pdf)にのっとってます。
ドットインストールの[さくらのVPS入門](http://dotinstall.com/lessons/basic_sakura_vps)も参考にしました。

## 仮想マシンの作成
まず、一番安いlight.S1を借りることにします。
OSはCentOS6.5を選択しました。
データディスクはとりあえず無しで。

SSHキーは作成にして、適当な名前を入力します。
そうすると秘密鍵が出てくるのでそれをエディタにコピペして、ローカルのユーザーフォルダ内.sshフォルダに保存しました。

仮想マシン台数は1台。
詳細情報のマシン名はhdtyWeb1、グループ名hdtyNetにしました。
プライベートIPアドレスは自動設定のままです。

これで入力は終わりなので内容を確認して、よければ作成します。
ものの数分もすると仮想マシンの構築が終わります。

## ネットワーク設定
IDCFのクラウドコンソール画面で操作していきます。

左側の「IPアドレス」をクリック。
すると右側にサーバー情報が出てくるので、IPアドレス名「network1」をクリック。
上にアイコンが出てくる画面になるので「ファイアウォール」をクリック。

まずSSH用の設定として、以下のルールを追加し「+」をクリックします。
コメント「SSH」、ソースCIDR「Any」、タイプ「CustomTCP」、ポートレンジに任意のポート番号

httpとhttps用のルールも追加しておきます。
コメント「HTTP」、ソースCIDR「Any」、タイプ「HTTP」
コメント「HTTPS」、ソースCIDR「Any」、タイプ「HTTPS」

ファイアウォールの設定が終わったら「ポートフォワード」をクリック。
以下のルールを追加して次々に「+」を押していきます。

コメント「SSH」、プライベートポート「22」、パブリックポートに先ほどのポート番号を指定、プロトコル「TCP」、仮想マシン名「hdtyWeb1」
コメント「HTTP」、プライベートポート「80」、パブリックポート「80」、プロトコル「TCP」、仮想マシン名「hdtyWeb1」
コメント「HTTPS」、プライベートポート「443」、パブリックポート「443」、プロトコル「TCP」、仮想マシン名「hdtyWeb1」

これでネットワーク設定は終了です。

## Rlogin（Windows）設定
ターミナルソフトに使っているRloginに以下の設定をして接続します。

エントリー「IDCF」
ServerAdressには仮想マシンのIPアドレスを入力
SocketPortは先ほどのSSH用のポート番号を入力
User「root」
ターミナルは何がいいんですかね?とりあえず「Kterm」を選択
SSH鍵は最初に作成した鍵を指定
エンコード「UTF-8」

これで仮想マシンに接続できるようになりました。
Octopressの再セットアップで嵌ったのでメモ


## 問題提起

年末にOSをクリーンインストールした際に、
Octopressのライブラリ一式もふっとんだので設定し直したい。

rubyのライブラリがグローバルに入るのは嫌だなぁと思って、とりあえずAmazonLinuxで試してみましたが、色々トラブったのでメモっておきます。

### 前提

- Octopress2.0
- AmazonLinux(2014.09.1)
- ソース一式はBitbucketで保管されてる。
- Deploy先はGithubPage


### Octopressの簡単な説明

Jekyllをベースにした静的ブログジェネレータ

似たようなものでMiddlemanとかHugoとかがある。

メリット：

- 機能・デザインテンプレートが充実してる
- GithubPageなどへのデプロイが楽。

デメリット：

- ビルドがけっこう遅い。
- rubyの依存解決がめんどい。
- 記事が全て同一フォルダに置かれるので管理しにくい。

結構デメリットが大きいですが、デザインを設定してしまって変えるのがめんどくさいので、惰性で続けています。

### 手順

まずはgit入れたりリポジトリ落として来たりする。

以下、ターミナルでoctopressフォルダにいる場合。


#### gem install

```

$ (sudo) gem install bundler

# octopressのGemfileを見て必要なライブラリをインストールする。
# pathオブションを指定するとそのディレクトリに依存ライブラリが入るらしい。
# Cabalでいうsandboxみたいなものと思ってる。
$ bundle install --path vendor/bundle

# 指定したpathの情報は.bundle/configに入るらしい
# 以降そのディレクトリでは'bundle exec'を頭につけると各種コマンドが使える。

```

普通ならこれでinstallできるはずなんだけど、、

なんかエラーが出る。

```
Gem::Installer::ExtensionBuildError: ERROR: Failed to build gem native extension.

    /usr/bin/ruby2.0 extconf.rb 
mkmf.rb can't find header files for ruby at /usr/share/ruby/include/ruby.h


Gem files will remain installed in /home/ec2-user/octopress/vendor/bundle/ruby/2.0/gems/RedCloth-4.2.9 for inspection.
Results logged to /home/ec2-user/octopress/vendor/bundle/ruby/2.0/gems/RedCloth-4.2.9/ext/redcloth_scan/gem_make.out
An error occurred while installing RedCloth (4.2.9), and Bundler cannot
continue.
Make sure that `gem install RedCloth -v '4.2.9'` succeeds before bundling.
```

rubyのこういうところ嫌い。。。

原因が全くわからないので適当にエラーメッセージでググってみる。

- http://qiita.com/satzz@github/items/0361a7093a57b459e15b
- http://www.xmisao.com/2014/07/06/cannot-load-such-file-mkmf.html
- http://qiita.com/s_osa/items/faf9b892dcd7fa9d8e74

で、足りないものをインストール。

```
sudo yum -y install ruby-devel
sudo yum -y install gcc-c++
```

再度`bundle install`したらうまく行った。

#### preview

とりあえずinstallできたのでpreviewしてみる

```
# bundle execを使うと、グローバルでなくcurrentDirectoryの設定をとってくる。
bundle exec rake preview
```

```
Dependency Error:  Yikes! It looks like you don't have jekyll-coffeescript or one of its dependencies installed. In order to use Jekyll as currently configured, you'll need to install this gem. The full error message from Ruby is: 'cannot load such file -- json'
```

またエラーった。なんかjsonがないって言われる。

`gem install json`をやるとグローバルに入ってしまうので、Gemfileにjsonを追加してもっかいinstall

```
bundle install
# 二回目はpathオプションをつけなくていいらしい。
```

できた。

```
curl http://localhost:4000/
```

でちゃんと応答がある。

4000番portを開けて、ホストマシンからもアクセスしよう。

・・・

繋がらなかった。

どうも`rake preview`だと自分自身のアクセスしか受け付けないっぽい。
色々調べたけど、MacのPowってのを使う以外の方法がわからなかった。。。誰か教えてください。


#### Deploy

```
bundle exec rake gen_deploy
```

デプロイ先がないって言われる。そりゃそうですね。。

```
bundle exec rake setup_github_pages
# ここでページを指定してからgen_deployやると、該当のリポジトリが上書きされるので注意。
# ただ、そこは公開用なので普通は気にしない。
```

もっかいgen_deployするとうまく行った。

### 参考URL

http://blog.awairo.net/blog/2013/12/09/reinstall-octopress/
http://morizyun.github.io/blog/octopress-gitpage-minimum-install-guide/
PHPStorm使って30分で実装。Bitbucket->ChatWork通知をFuelPHPで。


とりあえず動くよってのを、ちゃちゃっと作ってみた。
## 準備
* oilのインストール

```
$ curl get.fuelphp.com/oil | sh
```

* ChatWorkとBitbucketのAPIキー取得
* チャットワークでグループチャットの作成

## FuelPHPのプロジェクト作成
とりあえずプロジェクト名はnoticeとする。

```
$ oil create notice
$ cd notice
$ oil install
```

## PHPStormで必要なものをcomposer経由で導入
PHPStormで、↑を開くなりNew Project From Existing Filesして、
プロジェクトを作成。

### Composerの導入
Tools > Composer > Init Composer
インタプリタと、composer.pharを選択。

インタプリタはMAMP環境なら、
/Applications/MAMP/bin/php/php5.6.2/bin/php
とかその辺。
既にPreferences>Languages & Frameworks>PHPで登録していればプルダウンで選べるはず。

composer.pharはoil createでプロジェクトルートに出来ているのでそれを選択。
先走ってgetcomposer.orgから取って来ないように。

### パッケージの導入
Tools > Composer > Add Dependency
パッケージが表示されるのをまって、

mp-php/fuel-packages-chatwork
gentle/bitbucket-api
をInstall

fuel/packages/chatwork
fuel/vendor/gentle/bitbucket-api
に配置される。

これでcomposer.jsonも更新される。
PHPStorm便利だなぁ・・・

### コンフィグの修正
chatworkパッケージをalways_loadしておく。
ついでにdefault_timezoneと、languageまわりも。
bitbucketの方はcomposerのautoloaderが面倒みてくれる。


## APIを雑に実装

とりあえず動的に変わりそうなパラメータもベタ書きで、
RestControllerにこんなメソッドを実装。
例外処理もなんもないけどその辺は後でリファクタリングするので

```php:fuel/app/classes/controller/api/chat.php
    public function action_notice()
    {
        $oauth_params = array(
            'oauth_consumer_key'      => '鍵',
            'oauth_consumer_secret'   => 'Secret'
        );
        $account = 'アカウント名';
        $repository = 'リポジトリ名';
        $rid = 'ルームID';

        $events = new Bitbucket\API\Repositories\Events();
        $events->getClient()->addListener(
            new Bitbucket\API\Http\Listener\OAuthListener($oauth_params)
        );

        $content = $events->all($account, $repository, array('start' => 0, 'limit' => 1,))->getContent();
        $response = json_decode($content);

        foreach($response->events as $event)
        {
            $subject = $event->event;
            $utc_created_on = strtotime($event->utc_created_on);
            $updated_at = date('Y-m-d H:i:s', $utc_created_on);
            $title = $subject . ' by ' . $event->user->display_name . ' on ' . $updated_at . "\n";
            $body = '';
            foreach($event->description->commits as $commit)
            {
                $body .= $commit->description . "\n";
                $body .= "https://bitbucket.org/{$account}/{$repository}/commits/{$commit->hash}\n";
            }
            Chatwork::post("/rooms/{$rid}/messages", array('body' => "[info][title]{$title}[/title]{$body}[/info]"));
        }
    }
```

とりあえず、これで試しにアクセスしてみて、チャットワークに投稿できればOK。

あとはWebサーバーの設定とデプロイして、
BitbucketのPOST用フックにURLを指定すれば、pushがチャットワークに通知される。

やっぱtaskにしちゃって、jenkinsから呼び出す方がいいかな。
push通知だけならjenkinsのプラグインでも出来るみたいだけど、
まあやりたい事それだけじゃないので。
今度またリファクタリングしながら考えようっと。
Python基礎講座(15 終わりに)

後半は駆け足になってしまいましたが、Python基礎講座は以上となります。
あくまで基礎講座のため、また僕の至らなさのため、説明を省いた機能がたくさん存在します。
* nonlocal変数
* ジェネレータ関数
* 関数デコレータ
* ドキュメンテーション文字列
* 関数アノテーション
* with文
* インスタンスアロケータ
* 特殊メソッド
* コンテキストマネージャ
* クラスメソッド(スタティックメソッド)
* 抽象基底クラス
* super
などがあります。
この講座で紹介した基礎を身につけ、さらに高度な知識を身につけてみてください。
そして、ぜひ皆さんの地元で開催されている勉強会(Pythonを使わない勉強会でもかまいません）に
参加してみてください。刺激になりますし、何より楽しいですから。
ここまで読んでいただき、ありがとうございました。
[windows7] ファイルのパスをコピーする

1. エクスプローラの画面のファイルやフォルダを、Shift+右クリック
2. パスとしてコピー

"c:\hoge\hare" のように " で囲まれる

複数のファイルやフォルダも指定可能で、パスが改行区切り
Phalconのドキュメント翻訳に関するまとめ（翻訳に参加する人は必ずお読みください）

Phalconの公式ドキュメントの日本語への翻訳に関することをまとめています。

# 進捗状況

2015/1/15現在、翻訳率は **37%** です。これは、言語別で世界 **2位** です。

![Transifexのスクリーンショット](https://pbs.twimg.com/media/B7SUAJKCcAEEmXU.png "Transifexのスクリーンショット") 

# 参加方法

<del>現在、日本語への翻訳はすべてTransifexで行われています。</del>
（2015/10/26）現在、ドキュメントの翻訳は[GitHub](https://github.com/phalcon/docs)で行われています。PRしてください。Webサイトの翻訳はTransifexで行われています。

以下を参考にTransifexのアカウントを取得して日本語翻訳チームに参加申請してください。

* [Phalcon PHPの翻訳チームにジョインした話](http://qiita.com/nntsugu@github/items/77ed9c389d173af3c4f4)

2015/1/10現在、**4人** のレビュアーと **22人** の翻訳者が参加しています。

## レビュアーの募集

レビュアーが少ないので英語のスキルがある程度以上ある人はレビュアーになることを検討してください。

# コミュニケーション

翻訳に関するコミュニケーションは、以下のTransifexのフォーラムで行われています。

* https://www.transifex.com/organization/phalcon/team/14457/discussions/#ja

# 翻訳の進め方

TransifexのWebサイトにログインして以下のJapaneseリソースを翻訳します。

* https://www.transifex.com/projects/p/phalcon/language/ja/

翻訳は必ずWebサイトから行います。txコマンドによる翻訳ファイルのpushやブラウザからのuploadはしてはいけません。push/uploadすると翻訳率が100％になってしまうためです。以下参照。

* [transifex - ボクがPhalcon翻訳プロジェクトでやらかしたコト](http://qiita.com/MiuraKatsu/items/1fdf4f74b58f1e84df99)

現在、[Phalconの公式サイトの日本語ドキュメント](http://docs.phalconphp.com/ja/latest/index.html)は翻訳を反映して更新されていません。これは、更新システムが未完成のためです。

また、Transifexに登録されている翻訳文字列の更新がまだのため、一部の文章は翻訳できません。

## 最新の暫定翻訳

翻訳の参考のため、最新の翻訳状況を反映しビルドしたHTMLを以下に置いています。レビュー前の翻訳も含まれています。

* https://phalcon-docs-ja.herokuapp.com/index.html

上記サイトは暫定的なもので将来削除されます。更新システムが完成していないため、まだHTMLに不具合が残っている可能性があります。不具合を見つけた方はお知らせください。

また、不定期に手動で更新していますので必ずしも完全に最新の状態ではありません。

# 現在の最優先事項

## 本当に翻訳済みのレビュー前の訳のレビュー

済み。
~~翻訳ファイルがpushされたため、Transifexでの翻訳率が100％になってしまいました。これを正しい翻訳率に戻すため、まず、翻訳済みのレビュー前の訳のレビューを進める必要があります。~~

## 英語がわからなくてもできる作業

「[公式サイトの日本語ドキュメント](http://docs.phalconphp.com/ja/latest/index.html)」と上記の「[最新の暫定翻訳](https://phalcon-docs-ja.herokuapp.com/index.html)」を比較するとわかりますが、公式サイトで日本語化されている部分でも最新の暫定翻訳では未訳のものがあります。これはTransifexへの翻訳済みデータの移行が完了していないということです。

それらの部分は公式サイトの日本語ドキュメントの翻訳済みの日本語を、Transifexで原文を検索してコピペするだけで翻訳が進みます。

ただし、Transifexに登録されている翻訳文字列の更新がまだのため、一部の文章は翻訳できません。
Python基礎講座(10 内包表記)

## 内包表記
内包表記を使用するとリスト、セット、ディクショナリのデータ操作を短い行数で記述できます。
また処理速度も早くなるので、膨大な要素を持つ場合はこちらを使いましょう。

### リスト内包表記
まずは以下のリスト内包表記を使用したプログラムを実行してください。

```py3:list_comprehension1.py
result = [x**2 for x in [1, 2, 3, 4, 5]]
print("{0}".format(result))
```
x**2は「xの2乗」を意味し、リストresultには以下の値が格納されます。

**[1, 4, 9, 16, 25]**

リスト内包表記を使用しない場合、上のプログラムは以下のように置き換えることが出来ます。

```py3:list_comprehension2.py
result = []
for i in [1, 2, 3, 4, 5]:
    result.append(i**2)
print("{0}".format(result))
```

**[** *要素に入れる値(変数を使用)* **for** *変数* **in** *リスト* **]**

リストはプログラムのようにリスト型のデータを使用することも可能ですし、 range(1,6)のようにrange()も使用可能です。

リスト内包表記は、リストの要素内で処理する要素、処理しない要素を条件指定することができます。

```py3:list_comprehension3.py
print("{0}".format( [x*10+1 for x in range(1,6) if x > 2 and x < 5]))
```

出力結果は以下になります。

**[31, 41]**

リスト内包表記はリストを返すので、print文に直接リスト内包表記を与えることも当然可能です。
リスト内包表記を使用しない場合、上のプログラムは以下のように置き換えることが出来ます。

```py3:list_comprehension4.py
result = []
for x in range(1,6):
    if x > 2 and x < 5:
        result.append(x*10+1)
print("{0}".format(result))
```

**[** *要素に入れる値(変数を使用)* **for** *変数* **in** *リスト* *条件* **]**

### セット内包表記
内包表記はセットでも使用可能です。使用方法はリスト内包表記と同じです。

```py3:set_comprehension.py
print("{0}".format( {x*10+1 for x in range(1,6) if x > 2 and x < 5}))
```

出力結果は以下になります。
**set([41, 31])**

### ディクショナリ(辞書)内包表記
キーと値を:で区切り、キー:バリューと{}で括るのは通常のディクショナリと同じです。
使用方法はリストと同じです。

```py3:dictionary_comprehension.py
print("{0}".format( {str(x):x**2 for x in range(1,6)}))
```

内包表記を使用しなくても同じ処理を行うことが出来ますが、シンプルで高速動作を実現できる
内包表記を意識して使用すると良いソースコードが出来上がります。

次: [Python基礎講座(11 例外)](http://qiita.com/Usek/items/53527feba2adcb386aa8)
Atomの編集タブの一つとしてChromeのタブを開く

ということができるatomプラグインを作った https://github.com/mizchi/webview-pane

なにができるかはこれをみてほしい。

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

```
apm install webview-pane
```

`WebView Pane: Open` コマンドが入る

## なにができるか

- ローカルのhtmlを開ける
- 任意のURLが開ける
- 内側で開いたwebviewに対して独立したdevtoolsを開く

これでrailsアプリの開発中にlocalhost:3000開きっぱなしみたいなことができる。

## どうやったのか

atomのベース部分のatom-shellのchrome拡張由来の機能として、webviewというカスタムタグが実装されている。これはiframeの強化版みたいなもので、別プロセスでタブを開けるという機能。このプラグインはatomのペーン単位としてこれを開いてるだけ。しかもdevtoolsを開けてすごく嬉しい。

## バグ

webviewタグが`display:none`で非表示になるとGCがクラッシュするというバグがある。これは結構致命的で、タブを背面に回すと壊れることを意味する。(なので現在画面を分割して開いている)
https://github.com/atom/atom-shell/issues/989 でIssueたてたらchrome40が出たら直すよという話だった。
これが治るまでは結構不便かもしれない。とはいえ自分の用途では問題なく使えたのでリリースした。

## 雑感: webviewタグの信頼感

[atom-shell/web-view-tag.md at master · atom/atom-shell](https://github.com/atom/atom-shell/blob/master/docs/api/web-view-tag.md "atom-shell/web-view-tag.md at master · atom/atom-shell")に書かれていることは全部できる…と思いきやそう上手くいかない。

↑のバグの他に、ちょくちょく壊れてるっぽい挙動を目にするんだが自分としても安定するの待ってる感じ。

たとえば`<webview/>reload()` が動かなかったので `webview.executeJavaScript('localtion.reload()')`で代替している

## 要望

https://github.com/mizchi/webview-pane/issues までどうぞ
ブラウザ上の色を3秒でクリップボードに[Firefoxプラグイン]


こちらのプラグイン 
colorPicker
https://addons.mozilla.org/ja/firefox/addon/colorpicker/?src=api

![tt.png](https://qiita-image-store.s3.amazonaws.com/0/40717/0c02df8a-6139-c7c1-1e83-187972ae0b03.png)
ツールバーのこのアイコンをクリックすると起動される

![tt2.png](https://qiita-image-store.s3.amazonaws.com/0/40717/f09f42a4-a9ef-4902-b8b6-c7fc8af77029.png)
取得したい色の上にマウスカーソルを乗せると表示される
(CSS のRGB表記2種類 からコピーしたい方のラジオボタンを選択しておく)
Esc キーを押すと終了される

![tt3.png](https://qiita-image-store.s3.amazonaws.com/0/40717/e4c29613-2bed-1caa-ee9d-73ea5154935e.png)
終了時に値がクリップボードに保存されている

便利

しいて言うなら hsl値 も欲しかった
メモ：Googleサイトを自分で管理しているドメインのサブドメインとして公開するための設定

###はじめに注意
この投稿は、2014年9月9日時点での、個人的設定メモです。
何かの参考になるかもしれませんが、汎用的な情報としてまとめてありませんので、あしからず。
####2015年7月4日 追記
ちと手を加えました。自分があとで読んでもっとわかりやすくするために。

###概要
Googleサイトで WEB サイトを作り、それを自分で管理しているドメイン "mato.me" のサブドメインを使って `http://natto.mato.me/`  (など) でアクセスできるようにするための設定方法。

###背景
うち (小島農園虚業部) では、まったく WEB サイト構築に関するスキル、資金のないクライアントに、ほんのちょっとした WEB サイトを作るのに Google サイトで作ってもらって (最初は代行して作って)、サブドメインも貸してあげようかな、的な。

###手順
やることは、大まかに、

* Google サイト側でサブドメインを URL として受け入れる
* DNS でサブドメインが Google サイトに向くようにする
* ドメインの所有確認をする


####パターン１：うちで Google サイトを立ち上げ
うちで Google サイトを立ち上げ、編集はクライアントの Google アカウントを共同編集者に指定してクライアント自身にやってもらうか、うちで代行する。
これが手軽でいろいろ取り回しがしやすい気がする。

1. Google サイト作成。うちの Google アカウントで新しい Google サイトを作る。
2. 当該 Google サイトの「サイトの管理」＞「ウェブアドレス」で "`natto.mato.me`" を追加する。
3. DNS 設定。`CNAME` で "`natto.mato.me`" を "`ghs.googlehosted.com.`" に振る。FQDN 指定するから最後のピリオド忘れないように。
2. うちの Google アカウントで [Google Search Console (旧ウェブマスターツール)](https://www.google.com/webmasters/tools/home?hl=ja) に入り、"`mato.me`" ドメインの所有権確認をする。"`natto.mato.me`" ドメインでないことに注意（これ、かなりはまった）。
3. DNS 設定。`mato.me` の `TXT` レコードに、[Google Search Console (旧ウェブマスターツール)](https://www.google.com/webmasters/tools/home?hl=ja) で指定されたコードを登録する。

"`mato.me`" のサブドメインとしてどんどん Google サイトを追加していく（クライアントのアカウントで作った Google サイトではなく、うちのアカウントで作った Google サイト）場合、元である "`mato.me`" のドメイン所有確認は済んでいるので 4, 5 は必要ない。

####パターン２：クライアントのアカウントで Google サイトを立ち上げ

うちではドメインを貸すだけで、クライアントの Google サイト構築には関わらないパターン。

1. 【クライアント】Google サイト作成。クライアントに自分の Google アカウントで新しい Google サイトを作る。
2. 【クライアント】当該 Google サイトの「サイトの管理」＞「ウェブアドレス」で "`natto.mato.me`" を追加してもらう。
3. 【うち】DNS 設定。`CNAME` で "`natto.mato.me`" を "`ghs.googlehosted.com.`" に振る。
2. 【クライアント】 [Google Search Console (旧ウェブマスターツール)](https://www.google.com/webmasters/tools/home?hl=ja) に入り、"`mato.me`" ドメインの所有権確認をしてもらい、`TXT` レコードに指定すべきコードを教えてもらう。
3. 【うち】DNS 設定。`mato.me` の `TXT` レコードに教えてもらったコードを登録する。

そんな感じかな。
【Unity2D】Mathf.DeltaAngleでホーミング弾を作る

## はじめに

![001.png](https://qiita-image-store.s3.amazonaws.com/0/43772/da71d361-5f56-24b4-1b18-0cdf9b05f1e3.png)

ここではMathf.DeltaAngleでホーミング弾を作る方法を紹介します。
ホーミング弾とは、移動を「角度」と「速度」にもとづいて行い、目標となる方向を一定の旋回速度で向こうとしながら動きます。例えば現在向いている方向が30度だとして、180度方向に目標物があるとしたら、少しずつ左回りしながら移動します。

## サンプル
と言葉で説明したものの、まずはサンプルを見るとどんなものか分かりやすいと思います。
http://2dgames.jp/unity/horming/
これはマウスカーソルを追いかけるようにして、にんじんミサイルがホーミングするサンプルとなります。こちらのページにはプロジェクトファイルのリンクもあります。

## 実装方法
実装方法は簡単です。Mathf.DeltaAngle関数に現在の移動している角度と、目標となる角度を指定すれば、その角度差が返却されます。それがプラスであれば左回りをして、マイナスであれば右回りをすれば旋回をすることができます。

```csharp
float direction; // 現在の角度
float targetAngle; // 目標となる角度
float deltaAngle = Mathf.DeltaAngle(direction, targetAngle);
if(deltaAngle > 0) {
	// プラスであれば左回り
	direction += 5;
}
else {
	// マイナスであれば右回り
	direction -= 5;
}
```

これは旋回速度を「5度」とした場合の処理となります。ただし、これだけだと角度差が±5度の範囲内の場合にガクブルしてしまいます（右回り・左回りを交互に繰り返してガクガクした挙動となる）。

そこで、角度差が一定の角度以下であれば回転しないようにすることで、このガクブルを発生しないようにすることができます。

```csharp
if(Mathf.Abs(deltaAngle) < 5) {
	// ±5度より小さければ回転しない
}
else if(deltaAngle > 0) {
	// プラスであれば左回り
	direction += 5;
}
else {
	// マイナスであれば右回り
	direction -= 5;
}
```

## サンプルコード

以下は、マウスカーソルの位置に向かってホーミング移動するサンプルコードです。

```csharp
using UnityEngine;
using System.Collections;

public class Missile : MonoBehaviour {

	/// 旋回速度
	float _rotSpeed = 3.0f;
	/// 移動速度
	float _speed = 3.0f;

	/// 移動角度
	float Direction {
		get { return Mathf.Atan2(rigidbody2D.velocity.y, rigidbody2D.velocity.x) * Mathf.Rad2Deg; }
	}
	
	/// 角度と速度から移動速度を設定する
	void SetVelocity(float direction, float speed) {
		var vx = Mathf.Cos(Mathf.Deg2Rad * direction) * speed;
		var vy = Mathf.Sin(Mathf.Deg2Rad * direction) * speed;
		
		rigidbody2D.velocity = new Vector2(vx, vy);
	}

	/// 更新
	void Update () {

		// 画像の角度を移動方向に向ける
		var renderer = GetComponent<SpriteRenderer>();
		renderer.transform.localRotation = Quaternion.Euler(new Vector3(0, 0, Direction));

		// ターゲット座標を取得（マウスの座標に向かって移動する）
		var mousePosition = Input.mousePosition;
		Vector3 next = Camera.main.ScreenToWorldPoint(mousePosition);
		Vector3 now = transform.position;
		// 目的となる角度を取得する
		var d = next - now;
		var targetAngle = Mathf.Atan2(d.y, d.x) * Mathf.Rad2Deg;
		// 角度差を求める
		var deltaAngle = Mathf.DeltaAngle(Direction, targetAngle);
		var newAngle = Direction;
		if(Mathf.Abs(deltaAngle) < _rotSpeed) {
			// 旋回速度を下回る角度差なので何もしない
		}
		else if(deltaAngle > 0) {
			// 左回り
			newAngle += _rotSpeed;
		}
		else {
			// 右回り
			newAngle -= _rotSpeed;
		}

		// 新しい速度を設定する
		SetVelocity(newAngle, _speed);
	}
}
```

特に難しいところはなく、コメントのとおりとなります。
移動速度に対応する角度(`Direction`プロパティ)と、方向と速さから速度を設定できる関数(`SetVelocity`関数)を用意しているのがポイントとなります。また2Dなので、`Physics2D > Rigidbody 2D`を使用する前提のコードとなっています。
あと、`Update`関数なので、本来であれば旋回速度に`Time.deltaTime`を乗算したほうがいいですね。

## おまけ

オブジェクトには`Effects > Trail Renderer`をつけて軌道を表示するとそれっぽく見えてよいですね。

![002.png](https://qiita-image-store.s3.amazonaws.com/0/43772/571fccce-e7d6-a782-aefa-6c78574df9f7.png)

今回の例ではこのような設定としました。にんじんミサイルの画像サイズが128x128と大きめなので、もっと小さい場合はそれにあわせて小さくするとよいかもしれません。
OS X MavericksでSDLが画面初期化できなくて落ちるやつ

週末はホビープログラマ、ということで。
ちょっと [MLT (Media Lovin' Toolkit)](http://www.mltframework.org/) で遊ぼうと思って

最新の mlt-0.9.2 をビルドして、Pythonバインディングのサンプル (mlt-0.9.2/src/swig/python/play.py) に適当な動画ファイルを渡して実行したら

```
Python[7087:d07] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Error (1000) creating CGSWindow on line 263'
```

とか出て落ちるわけですよ
PythonとかSWIGのせいではなさそうです

mlt.Consumer() で "sdl" 以外の[Consumerプラグイン](http://www.mltframework.org/bin/view/MLT/PluginsConsumers)、例えば "sdl_audio" とか "rt_audio" を指定するとちゃんと音だけ出るのです

SDLを入れなおしたりビルドしなおしたりXCodeをアップデートしたり、色々やりましたけど

結論からいうと、
http://stackoverflow.com/questions/12641755/sdl-video-init-causes-exception-on-mac-os-x-10-8
にある `pre_init()` をまるっと mlt-0.9.2/src/modules/sdl/consumer_sdl.c に貼り付けて、`consumer_start()` の先頭で呼ぶようにしたら解決しました。
（libSDLmainをリンクする、というのも試してみたけどうまくいかなかった）

Macでは、SDLのビデオカードの初期化に問題があって、それが最新版 (SDL 1.2.15）でも直っていないとかそんなような話のようです。

====

ちなみに
なんでOpenCVじゃなくて？って思われた方の為に。

先に試してます。

* cv2では開きたい動画が開けなかった（codecの対応が弱いのか？ffmpegでは開けてるのだけど）
* 音声も利用したい

といった辺り。pyffmpeg はメンテナンスされてなくて最新のffmpegに対応してないらしいし。
webで頑張っている元教え子ちゃんにおくるまとめ＃2


#どこまで勉強すればいいのか？
そんなものは定義できない。
そもそも全てを学ぶこと自体できない。
メジャーな言語で50程存在している。
仕事になってりゃいいと割りきりましょう。
大事なことは「技術のトレンド」をおさえていくことです。
もう一つ、謙虚な姿勢。「やったことのある人」は、皆師匠です。
国籍、学歴、職位、性別、全て関係無いです。
素直に教わりましょう。「無知の知」です。

#情報収集

##Googleアラートの活用
まずはここから。新しめの情報を得ておきましょう。
![スクリーンショット 2015-01-10 5.13.50.png](https://qiita-image-store.s3.amazonaws.com/0/33317/d61accba-d313-1b58-f2bb-808fc9262178.png "スクリーンショット 2015-01-10 5.13.50.png")

##Qiita
毎日チェック
近いところをやってる人は速攻でフォロー

##ドットインストール
youtube-dlなどのダウンローダーを併用して、動画として保存。
入門編は脅威のカバレージです。

#縁を保つこと
方法はなんでもいいのです。
お世話になった人と、とにかくつながっておきましょう。
Haskell でミーリマシン (Mealy Machine)

`Auto` アローについて調べていたらとてもわかりやすい `Auto` についての記事を見つけたのでその紹介と， `Auto` 型に慣れるために Mealy machine を実装してみたのでメモ．

[Intro to Machines & Arrows (Part 1: Stream and Auto) · in Code](http://blog.jle.im/entry/intro-to-machines-arrows-part-1-stream-and "Intro to Machines & Arrows (Part 1: Stream and Auto) · in Code")
[Auto as Category, Applicative & Arrow (Intro to Machines/Arrows Part 2) · in Code](http://blog.jle.im/entry/auto-as-category-applicative-arrow-intro-to-machines "Auto as Category, Applicative & Arrow (Intro to Machines/Arrows Part 2) · in Code")

コード中の `myMealy` は http://en.wikipedia.org/wiki/Mealy_machine の Example にあったもので，現在の入力と一つ前の入力の XOR を出力する Mealy machine.

# コード

```hs:mealy_machine.hs
{-# LANGUAGE NamedFieldPuns #-}

newtype Auto a b = ACons { runAuto :: a -> (b, Auto a b) }

data S = Si | S0 | S1
  deriving Show

data Σ = Σ0 | Σ1
  deriving Show

data Λ = Λ0 | Λ1
  deriving Show


data Mealy s σ λ = Mealy { s0 :: s
                         , t :: (s, σ) -> s
                         , g :: (s, σ) -> λ
                         }

mealyToAuto :: Mealy s σ λ -> Auto σ λ
mealyToAuto Mealy { s0, t, g } = mealy s0
  where mealy s = ACons $ \σ -> (g (s, σ), mealy $ t (s, σ))

myMealy :: Mealy S Σ Λ
myMealy = Mealy { s0 = Si, t, g }
  where t (_,  Σ0) = S0
        t (_,  Σ1) = S1
        g (S0, Σ1) = Λ1
        g (S1, Σ0) = Λ1
        g _        = Λ0


testAuto :: Auto a b -> [a] -> ([b], Auto a b)
testAuto auto []      = ([]  , auto )
testAuto auto (x:xs)  = (y:ys, final)
  where
    (y,  next ) = runAuto  auto x
    (ys, final) = testAuto next xs

testAuto_ :: Auto a b -> [a] -> [b]
testAuto_ = (fst .) . testAuto


test = testAuto_ (mealyToAuto myMealy) [Σ0, Σ1, Σ0, Σ1, Σ1, Σ1, Σ0, Σ0]
```

# 解説

ミーリマシン : 有限オートマトンのうち，トランスデューサ (変換機 : 入力を出力に変換するオートマトン) と呼ばれるもののひとつ．出力が入力と現在の状態から決まる．

`NamedFieldPuns` : `Mealy { s0 = s0, t = t, g = g }` みたいに書くところを `Mealy { s0, t, g }` でよくなる

`Auto` : オートマトンを表す型．入力 `a` と現在の内部状態から出力 `b` と 新しい内部状態をもったオートマトン `Auto a b` を生み出す計算．

`S` : 状態の集合．初期状態 `Si`
`Σ` : 入力の集合．0 か 1 の一ビット．
`Λ` : 出力の集合．0 か 1 の一ビット．

`testAuto` : オートマトンと入力のリストをとって出力のリストと新しいオートマトンを返す

`testAuto_` : `testAuto` の出力リストだけを返す版

# 課題

`Auto` を `Array` にする．
Powershellで複数のCSVファイルを読み込んでSortして出力

##はじめに
前回作った[歩引行](http://qiita.com/arachan@github/items/799fa7766d191f7d8da9)と実際の売上のデータ行を合成して出力します。


```text:sales.csv
id,detail_id,item,price,discount_per,discount_price
0,1,letsnote,2000,8,160
1,1,macbookair,1230,8,98.4
2,1,macbookpro,998,8,79.84
```

```text:discounts.csv
"id","detail_id","item","price","discount_per","discount_price"
"0","998","8%","-160","8","160"
"1","998","8%","-98.4","8","98.4"
"2","998","8%","-79.84","8","79.84"
```

```ps1:2つのCSVファイルを読み込んで結合して出力
PS >$sales=Import-Csv -path sales.csv,discounts.csv
PS >$sales=$sales | sort id,detail_id
PS >$sales | Export-Csv -path sales.csv
```

```text:sales.csv
"id","detail_id","item","price","discount_per","discount_price"
"0","1","letsnote","2000","8","160"
"0","998","8%","-160","8","160"
"1","1","macbookair","1230","8","98.4"
"1","998","8%","-98.4","8","98.4"
"2","1","macbookpro","998","8","79.84"
"2","998","8%","-79.84","8","79.84"
```

##参考サイト

[第2回チキチキ！シェル芸人養成勉強会をPowerShellでやってみた](http://tech.guitarrapc.com/entry/2012/12/26/121207)
の問題10: ファイルの結合
validateとverifyの使い分け

# validateとverifyの使い分け

- 確認する、検証する、チェックする

## Validate

> Validation is the assurance that a product, service, or system meets the needs of the customer and other identified stakeholders. It often involves acceptance and suitability with external customers.

- Validationは、プロダクト、サービス、システムなどが顧客や特定のステークホルダーのニーズを満たしているということを確認すること。外部顧客による受け入れと適合性に関連することが多い。

- そのものが妥当であるか適切であるか、有効であるか確認する際に用いる。
    + 入力データをvalidationして、無効でないデータであることを確認する。
- `function validate_input_data()`

## Verify

> Verification is The evaluation of whether or not a product, service, or system complies with a regulation requirement, specification, or imposed condition. It is often an internal process.

- Verificationは、プロダクト、サービス、システムなどが規制、要求、仕様、指定された条件などに適合しているかどうかを評価するプロセス。内部プロセスである場合が多い。

- 何らかの処理をした結果について検証する際に用いる。
    + CDやDVDへの書き込み、バックアップ後にverificationして、エラーなく完了しているか検証する。
- `function verify_calculation_results()`

---
- 参考
    + [Validation v.s. Verification](http://pmzilla.com/validation-vs-verification)
    + [Verify(検証する)と Validate(妥当性確認する) ](http://www1.m.jcnnet.jp/pmlabo/TOPICS/TOPICS0811.pdf)
PHP公式マニュアルを読む。

#PHP入門独習の方法
スクー　「PHP入門 独習のポイントと公式マニュアルの使い方」　個人メモ
http://schoo.jp/class/1603/

##PHP公式マニュアルを読む

##PHP学習の3大困った
- 入門書などで、サンプルプログラムに書かれているプログラムの意味がわからない。
- 自分なりのプログラムに変えたがどう変えたらよいかわからない。
- 困ったときに何を調べたら良いのかわからない


→それより公式マニュアルを使おう。

#公式マニュアルのメリット
- 記述が正確で、漏れていることがない。
- 情報が最新でバージョンに合わせて確認できる
- 検索機能で（慣れれば）、素早く検索できる。

##でも難しい・・・。

- 記述が正確すぎるから。
- 文章の意味がわからない。（英語の翻訳で日本語の意味を成さない）
- サイトのデザインがいけてない。

#公式マニュアルの使い方

##その前に型を確認
- string【ストリング】 文字（文字列）
- int【インテジャー】　整数
- float【フロート】　少数（doubleの場合もある）
- boolean【ブーリアン・ブール値】 true(YES)またはfalse(NO)
- array【アレイ】 配列（たくさんの値が詰まったもの）
- mixed【ミクスド】 なんでもOK
- number【ナンバー】 整数または小数

##roundの説明を見てみる。
[ ] ブラケット内は省略可能なパラメーター
float round ( float $val [, int $precision = 0 [, int $mode = PHP_ROUND_HALF_UP ]] )
↓
返り値 round ( 【一つ目のパラメーター】 省略可能：[, 【2つ目のパラメータ】 = 【2つ目の初期値】 [, 【3つ目のパラメータ】 = 【3つ目の初期値】 ]] )

##説明を見る前に例を見よう
全ての例を見ればどんな動きをするかがわかる。

##応用はNotesで
いろいろな人がコメントを残すことができる。
この関数を使ってこういうの作ってみました等見ることができる

##便利ソフトでいつでも確認。
googleChrome
→devdocs
英語版の読み込み

#公式マニュアルここが困った。
- 関数名を忘れてしまった場合
- 似た関数があったはずだが覚えていない。
→関数名を覚える。

忘れがちな関数。
MB_strrpos
MultiByte_STRingReversePOSition
→関数名の正式名称を覚えれば、略称を覚えられる。

やりたいことがわからない。
→逆引き辞典を使おう。
PHP逆引きレシピ

##入門書は3冊くらい買って見る。
- チュートリアル系
- リファレンス系
- バイブル系

##参考欄を使う。
覚えている名前を入れるだけで関連した関数がわかる。

##自分のリファレンスを残す。
QitaやGistを使う
do～while(0)とは何か？

do～whileなんて珍しいものをと思いきや、
0なのでループしないという謎ソースがあった。

よくよく聞いてみるとエラー処理などで
一気に抜けたい場合などに使えるテクニックらしい。

こんな感じにしてやると

```c:do_while_0.c
#include <stdio.h>
int main()
{
  int i = 0;
  do {
    if (i == 0) {
      printf("hello world! i=%d\n", i);
      break;
    }
    if (i == 1) {
      printf("hello world! i=%d\n", i);
      break;
    }
    printf("I don't want to run here!\n");
  } while (0);
  return 0;
}
```

gotoなどを使わなくても囲われたブロックからbreakで脱出できるという訳。
PHPUnitでランダムなユーザーを登録して、そのユーザーをログインユーザーとしてセットする


たとえばある関数を特定のロールのユーザーのみに許可したい場合に、PHPUnitで任意のロールのユーザーを作成して、そのユーザーをカレントユーザーとして、テストを実行したい場合に使用する。

```php
<?php

class SampleTest extends WP_UnitTestCase
{

	/**
	 * @test
	 */
	public function sample_test()
	{
		// administratorを追加してカレントユーザーに。
		$this->set_current_user( 'administrator' );
		// switch_themesを実行できる
		$this->assertTrue( current_user_can( 'switch_themes' ) );

		// editorを追加してカレントユーザーに。
		$this->set_current_user( 'editor' );
		// switch_themesは実行できてはいけない。
		$this->assertFalse( current_user_can( 'switch_themes' ) );
	}

	/**
	 * Add user and set the user as current user.
	 *
	 * @param  string $role administrator, editor, author, contributor ...
	 * @return none 
	 */
	public function set_current_user( $role )
	{
		$user = $this->factory()->user->create_and_get( array(
			'role' => $role,
		) );

		/*
		 * Set $user as current user
		 */
		wp_set_current_user( $user->ID, $user->user_login );
	}
}
```
githubクローンGitPrepを試す

![gitgrep.png](https://qiita-image-store.s3.amazonaws.com/0/33674/e6de8fe5-1937-e971-05f1-f0e52f70dc9c.png)

自分で構築できるgithubクローンといえば、GitBucketやGitLabですが
目立たないところでGitPrepというのもあります。（Perl製）

GitBucketがモッサリしてるという場合は、
機能は少なめですがこちらも一案としてありかなと。

```bash
$ git clone https://github.com/yuki-kimoto/gitprep.git
$ cd gitprep
$ ./setup.sh
<== Installed dependencies for .. Finishing.
54 distributions installed
// ↑ここでのPerlモジュールインストールは直下の extlib/ 以下に行われる

$ vi gitprep.conf
-;listen=http://*:10020
+listen=http://*:8080

// 起動
$ ./gitprep

// 停止
$ ./gitprep --stop
```

# 参考

GitPrep - ポータブルなGithubシステムをUnix/Linuxにインストール - サンプルコードによるPerl入門 ～ 安定と信頼のPerlを学ぼう ～
http://d.hatena.ne.jp/perlcodesample/20130421/1366536119

yuki-kimoto/gitprep
https://github.com/yuki-kimoto/gitprep
Pyramid の独自 View Decorator で view 関数の前後に処理を挿入する

[2015/3/20 色々調べて分かった内容にアップデート。なんか別物になった]

ユーザ認証あり & 認証済みページではどの画面でもヘッダ部分にユーザ名を表示、みたいなありがちな Web アプリを作るときの定形処理を自動化。

- 認証済みで user という permission を持っているときだけ view の実行が許可されるような view_decorator を定義する
  - 同様に admin という permission でだけ view の実行ができるようにする
- request.user へのアクセスで User オブジェクトにアクセスする
  - 最初にアクセスしたときにだけ、SQL を実行して models.User を検索

```py
def permission_view_config(permission):
    def pvc(**params):
        settings = dict(permission=permission, _depth=1)
        settings.update(params)

        def wrapped_view_config(original_func):
            return view_config(**settings)(original_func)
        return wrapped_view_config
    return pvc


user_view_config = permission_view_config('user')
admin_view_config = permission_view_config('admin')
```

```__init__.py
def groupfinder(user_code, request):
    if not request.user:
        return []
    elif request.user.is_admin:
        return ['group:users', 'group:admin']
    else:
        return ['group:users']


def get_user(request):
    user_id = unauthenticated_userid(request)
    if user_id is not None:
        return DBSession.query(User).get(user_id)


class RootFactory(object):
    __acl__ = [
        (Allow, 'group:users', 'user'),
        (Allow, 'group:admin', 'admin')
    ]

    def __init__(self, request):
        pass


def main(global_config, **settings):
    # ...
    config = Configurator(settings=settings, root_factory='.RootFactory')

    # request の user プロパティにアクセスしたら get_user してね、という指定。これ重要。
    config.set_request_property(get_user, 'user', reify=True)

    authn_policy = AuthTktAuthenticationPolicy('...', callback=groupfinder, hashalg='sha512')
    authz_policy = ACLAuthorizationPolicy()
    config.set_authentication_policy(authn_policy)
    config.set_authorization_policy(authz_policy)
    # ...
```

こんな風に使えば

```views.py
@user_view_config(route_name='index', renderer='templates/index.jinja2')
def index(request):
    # ここは user の permission を持っている人だけ
    do_something_with(request.user)  # user が使える
    return {'name': 'my_app'}

@admin_view_config(route_name='index', renderer='templates/add_user.jinja2')
def add_user(request):
    # ここは admin の permission を持っている人だけ
    do_something_with(request.user)  # user が使える
    return {'name': 'my_app'}
```

inspired by [Pyramid でカスタムの View Decorator を実装する](http://qiita.com/ledmonster/items/60f778fa171e149bc988)
PowerShellでCSVデータの中身を書き換える

##はじめに
歩引行を生成するサンプルを作って見ました。

行そのものを書き換えるスクリプトのサンプルはよくありますが、
CSVのデータ行を他の行に書き換えるようなサンプルはなかったので作って見ました。


##歩引金額を生成

金額(price)に歩引金額(discount_price)を入れる。
歩引なのでもちろん -1*dicount_priceしています。


```ps1
$discount.price=-1*$discount.discount_price
```

の行に注目

```text:discount.csv
id,detail_id,item,price,discount_per,discount_price
0,1,letsnote,2000,8,160
1,1,macbookair,1230,8,98.4
2,1,macbookpro,998,8,79.84
```

```ps1:対話的に実行
PS >$discounts=Import-Csv -path discount.csv
PS >$discounts
id             : 0
detail_id      : 1
item           : letsnote
price          : 2000
discount_per   : 8
discount_price : 160
id             : 1
detail_id      : 1
item           : macbookair
price          : 1230
discount_per   : 8
discount_price : 98.4
id             : 2
detail_id      : 1
item           : macbookpro
price          : 998
discount_per   : 8
discount_price : 79.84

PS > foreach($discount in $discounts){$discount.price=-1*$discount.discount_price}
PS > $discounts

id             : 0
detail_id      : 1
item           : letsnote
price          : -160
discount_per   : 8
discount_price : 160
id             : 1
detail_id      : 1
item           : macbookair
price          : -98.4
discount_per   : 8
discount_price : 98.4
id             : 2
detail_id      : 1
item           : macbookpro
price          : -79.84
discount_per   : 8
discount_price : 79.84﻿

```

##商品名も8%に変更
この要領で、itemも 8% に書き換えましょう。

```ps1:8%を生成している部分
$discount.item="歩引"+$discount.discount_per+"%"
```

全体のソースコード

```ps1:itemを歩引8%に書き換え
PS >$discounts
id             : 0
detail_id      : 1
item           : letsnote
price          : -160
discount_per   : 8
discount_price : 160
id             : 1
detail_id      : 1
item           : macbookair
price          : -98.4
discount_per   : 8
discount_price : 98.4
id             : 2
detail_id      : 1
item           : macbookpro
price          : -79.84
discount_per   : 8
discount_price : 79.84

PS > foreach($discount in $discounts){$discount.item="歩引"+$discount.discount_per+"%"}
PS > $discounts

id             : 0
detail_id      : 1
item           : 歩引8%
price          : -160
discount_per   : 8
discount_price : 160
id             : 1
detail_id      : 1
item           : 8%
price          : -98.4
discount_per   : 8
discount_price : 98.4
id             : 2
detail_id      : 1
item           : 8%
price          : -79.84
discount_per   : 8
discount_price : 79.84﻿

```

生成した歩引行と実際の売上と合わせる時に、
歩引きが一番下に来るようにdetail_idに998を挿入しておきます。

```ps1:detail_idに998を挿入
PS >$discounts | Where-Object { $_.detail_id -eq 1 } | ForEach { $_.detail_id = 998 }
```
これをExport-CsvでCSVデータに再び吐き出せます。

```ps1:Export-CSV

PS > $discounts | Export-CSV -path discounts.csv -Delimter `t -Encoding UTF8
```

##参考サイト
[csvファイルのインポート、エクスポートについて](https://social.technet.microsoft.com/Forums/ja-JP/3bc692ab-8016-4485-b92f-2da0de192a57/csv?forum=powershellja)

[WindowsPowerShellでCSVをDBっぽく扱う](http://www.twinfami.com/20130117_234956/)
atomでカスタムOpenerを作って任意のViewを作る

カスタムOpenerとは、Paneを生成する時にユーザーが定義した振る舞いをすることを指す。(実装を調べた結果僕がそう読んでるだけで、正しい呼び方は知らない)
デフォルトだとTextEditorになっている。Cmd+, の設定画面や、MarkdownPreviewのPreview側だと思うとわかりやすいかもしれない。


```coffeescript
url = require 'url'
{View} = require 'atom-space-pen-views'
# ターゲットなるViewの実装。タブ名で使われるgetTitleを実装する必要がある。
class SimpleView extends View
  @content: ->
    @div 'hello!'
  getTitle: -> 'debugging'

# 呼び出し時のプロトコルがsimple://だったら↑のviewを返す
# openerが falsy な値を返すとこのopenerは無視され次のopenerに処理が移る…のだと思う
atom.workspace.addOpener (uriToOpen) ->
  {protocol, host, pathname} = url.parse(uriToOpen)
  return unless protocol is 'simple:' # simple: 以外を無視する
  new SimpleView

atom.workspce.open 'simple://foo' # 開く
```

今はfooという雑なメッセージを投げているけど、実際にはファイルパスを渡したりして任意のプレビューを作ったりするのに使えると思う

以上のことは [markdown-preview](https://atom.io/packages/markdown-preview "markdown-preview") を読んで学んだ
ステータスバーに常駐するアプリケーション

OS Xのステータスバーに常駐するアプリケーションを作成します。
ステータスバーは通知センター、検索、時計などがある右側の領域のことです。

![スライド](https://qiita-image-store.s3.amazonaws.com/0/3862/3e67e4c5-c665-6f3a-f0da-a9743d293e05.jpeg)

AppDelegate.swiftにコードを書き足します。
「Quit」というメニューアイテムを作成します。
このメニューアイテムがクリックされるとアプリケーションが終了します。


```swift:AppDelegate.swift
import Cocoa

@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {

	var statusItem = NSStatusBar.systemStatusBar().statusItemWithLength(-1)
	
	func applicationDidFinishLaunching(aNotification: NSNotification) {
		// Insert code here to initialize your application
		
		let menu = NSMenu()
		self.statusItem.title = "Sample"
		self.statusItem.highlightMode = true
		self.statusItem.menu = menu
		
		let menuItem = NSMenuItem()
		menuItem.title = "Quit"
		menuItem.action = Selector("quit:")
		menu.addItem(menuItem)
	}

	func applicationWillTerminate(aNotification: NSNotification) {
		// Insert code here to tear down your application
	}

	@IBAction func quit(sender: NSButton) {
		NSApplication.sharedApplication().terminate(self)
	}
}
```

ステータスアイテムを作成する箇所をObjective-Cで記述すると以下のようになります。

```objc:AppDelegate.m
[[NSStatusBar systemStatusBar] statusItemWithLength:NSVariableStatusItemLength];
```
SwiftでNSVariableStatusItemLengthまたは、CGFloat(NSVariableStatusItemLength)と記述してコンパイルすると、以下のようなエラーがでて失敗するため-1を指定しています。

	Undefined symbols for architecture x86_64:
	  "_NSVariableStatusItemLength", referenced from:
	      __TFC13StatusBarTest11AppDelegatecfMS0_FT_S0_ in AppDelegate.o
	ld: symbol(s) not found for architecture x86_64
	clang: error: linker command failed with exit code 1 (use -v to see invocation)


実行すると、ステータスバーに「Sample」という項目が表示されます。

![スライド](https://qiita-image-store.s3.amazonaws.com/0/3862/5f07fc26-ed4c-50ca-6a1e-5355789a7b77.jpeg)

このときウィンドウも表示されるので、このウィンドウを非表示にします。
Main.storyboardのWindow Controllerを選択して、「Is Initial Controller」のチェックを外します。

![スライド](https://qiita-image-store.s3.amazonaws.com/0/3862/bb14f15a-29b7-97d9-2efd-d9f714fb33ca.jpeg)

最後にInfo.plistにキーを追加します。

	<key>LSUIElement</key>
	<true/>

このキーを追加すると、そのアプリケーションはDockと強制終了ウィンドウに表示されなくなります。
Write in C

"Write in C"
https://www.youtube.com/watch?v=XHosLhPEN3k
https://www.youtube.com/watch?v=1S1fISh-pag
（Let it beの替え歌）

歌詞(en)：http://www.cloudlyrics.com/anonymous-lyrics-write-in-c.html
歌詞(ja)：http://d.hatena.ne.jp/kaminarioyaji/20090517/1242563256
暗号化したスパースバンドル ディスクイメージのパフォーマンス

子供の写真が大量に溜まってきたので、そろそろクラウド・ストレージにバックアップしたい。
大したデータはないけど、とはいえそのままで置いておくのは何となく気持ち悪い。
そこで暗号化したディスクイメージを作成して、それをバックアップしたら良いのではと考えた。スパースバンドルイメージなら、実態は8MBに分割されたファイル群だから、効率よく差分バックアップできる。
でもパフォーマンスは気になるよねーということで調べてみた

## 測定環境

- Mac mini (2014)
- yosemite
- Fusion Drive 1TB
- Core i5 2.6GHz

## 測定方法

ディスクユーティリティで「ファイル > 新規 > 空のディスクイメージ」を作成する

- 100GB
- Mac OS 拡張 (ジャーナリング)
- 暗号化
- 単一パーティション・GUIDパーティションマップ
- スパースバンドル・ディスクイメージ
- パスワードは 24 文字をランダムに生成 (鍵マークをクリック)

## 計測方法

- Disk Speed Test(ver.2.2)

## 結果

READ は AES256 のほうがパフォーマンスがいい！Write もさほど変わらない。
AES-NI 使ったりしてるのかな。それならブロック長が長い暗号でパフォーマンスがいいのは説明できそう。
とりあえず、AES256でも目立ってパフォーマンスが劣化するようなことはなさそうなことがわかったので、当初の目的は達成。

#### AES128

![aes128.png](https://qiita-image-store.s3.amazonaws.com/0/9549/527db35d-a4af-b484-1db2-8adca5f16006.png)

#### AES256

![aes256.png](https://qiita-image-store.s3.amazonaws.com/0/9549/19e0e41f-b2d7-4143-385b-41d24cad4f05.png)

####　暗号化無し

![raw.png](https://qiita-image-store.s3.amazonaws.com/0/9549/d3324c12-773f-9a99-d55b-9d073694a4c8.png)
一人脳内 AWS Game Day をやってみた

はじめに
---

みなさんは妄想はお好きですか？私は好きです。
今日は一人で脳内 AWS Game Day をやっていました。

AWS Game Day Japan 2015 は来るのか？
来たら一体どんなチームが勝つのか？

そんなことを妄想しながらお送りしたいと思います。

Game Day とは？
---

チームが敵味方に分かれ、一方は知恵を絞って AWS 上に構築されたシステムを破壊し、もう一方は全力でそれを修復するというもの。AWS の PowerUser アカウントが乗っ取られた体で、各チームでアカウントを交換し全力で相手方のシステムを破壊します。破壊された後は、いち早く元の構成に戻します。

ルールは参加したことないのでよくわかってませんが、過去の開催状況を見る限り以下のようになります。

（過去参加した方、詳しいルールをご存知の方、補足していただけるとありがたいです。）

1. アカウント自体への攻撃禁止 
   - PowerUser アカウントの権限変更やパスワードの変更、アカウントのクローズ処理等は行わない

2. インスタンスへの ssh 禁止
   - これはやらないというよりキーペアの秘密鍵がないので出来ない。ただしAMI化して新しいインスタンスにし直せば、中にログインしてインスタンス内の設定ファイルというを壊せるかも。（過去に、その手を使った方もいらっしゃった模様。）

攻撃手法の分類
---
自分で思いついた限り、大きく分類して以下のような攻撃手法がありそうです。
これで各パターン×サービスの数x機能の数の組み合わせぐらいはあるのではないかと思われます。

1. AWS リソース削除系
2. AWS リソース置き換え、その発見を遅らせるダミーリソース追加系
3. サービス設定変更系
4. ファイル（設定ファイルなど）置き換え系

一番簡単で誰でも出来るのは 1 のリソース削除です。根こそぎ削除してもいいですが、恐らく防御側はそこから簡単に復旧してしまうでしょう。

2は例えばインスタンスを違う AMI であげておくなど。3 は VPC のルーティング設定をいじっておくなどの例が思いつきました。

4はインスタンスの中の設定ファイルや鍵になるスクリプトを入れ替えたり、壊したりになります。

下に行くほど巧妙な感じになり、発見も難しくなるのではないでしょうか。
そこで、攻撃手法ごとに有効そうな事前対策を考えてみました。

有効そうな事前対策
---

1. CloudTrail の有効化 
   - かつ、他のアカウントの Bucket にログを保存するとか？
2. AWS リソース削除系への対策
  - 基本 AMI などは共有機能で他のアカウントなどに持たせてバックアップとしておく
  - 構成は CloudFormation で出来る部分を確認しておいて、出来る限り自動的に戻す
  - S3 上のファイルなら Versioning ON にして二回アップ、最新世代を削除しておき、何もファイルがないように見せかける（某イケメンがいけない画像を隠すのに使っている方法を応用）
3. AWS リソース置き換え、ダミー追加系
  - CloudTrail ログで何をされたか確認
  - 場合によっては丸ごとCloudFormationで作り直したほうが早いかも？
4. サービス設定変更系
  - CloudTrail ログで何をされたか確認
  - 場合によっては丸ごとCloudFormationで作り直したほうが早いかも？
5. ファイル置き換え系
  - CloudTrailにログが残らないのでこのあたりは変更点を探して直そうとすると苦労する
  - 見つけだすことよりも復旧に注力して、正しいファイルを含むAMIなどを使ってインスタンスごと直したほうが早いかもしれません
  - 事前に変えられると致命的なスクリプトや設定ファイルなどの場所をデフォルトから変えて見つかりにくくする、とかもありでしょうか？

まとめ
---

実際に Game Day 参加したことないので妄想レベルですが、結局一人でやっていると自分の手を越える神の一手を考えだすのは難しそうです。あと何かいろんなものを勘違いしているかもしれません。

**免責
こちらは個人の意見で、所属する企業や団体は関係ありません。
いけない画像を S3 Versioning で隠している某イケメンもフィクションです。**