OmniAICreator/Qiita-1.07M huggingface dataset:
iTerm2でsshしたらプロフィールを自動的に切り替える

[iTerm2 Version 3 Beta](https://www.iterm2.com/version3.html)が最近公開されました。ホームページ上で新機能を見ることができるようになっていて、色々便利そうなものはあるんですが中でも "Automatic Profile Switching" を使うとローカルマシンとssh先とで自動的に画面の色を変えられるのが良さそう（事故を防げそう）だったので使ってみたけどダメだったという話です。

# tl;dr

- Automatic Profile Switchingで確かにsshしたらプロフィールを切り替えることができる
- しかし、ssh先にも連携用スクリプトをインストールしないといけない
- 全てのssh先にそれを入れておくのは現実的ではないのでは？

# プロフィールとは

iTerm2におけるプロフィールとは、フォントや背景色などの設定をひとまとめにしたもので、保存しておいたプロフィールを適用するだけで、簡単にそういった設定を切り替えることができます。

# Automatic Profile Switchingでできること

現在のホスト名、ユーザ名、ファイルパスに応じてプロフィールを自動的に切り替えることができます。

- リモートホストで間違って変なコマンドを実行しないように見た目を変える
- rootになったら画面を真っ赤にして注意喚起
- プロダクト毎に見た目を変えて気分一新

なんて使い方ができそうです。

# Automatic Profile Switchingの使い方

詳しくは [Shell Integration - iTerm2](https://iterm2.com/shell_integration.html) の "Automatic Profile Switching" に書いてあるんでそれを読んでくれって感じなんですが、簡単に説明すると:

1. iTerm2 -> InstallShell Integrationをクリックする

    ![image](https://qiita-image-store.s3.amazonaws.com/0/153/2a17648d-57e3-0936-368f-7f61f2d85844.png)

    これをやると連携スクリプトがダウンロードされて、現在のシェルの設定にそのスクリプトを起動時に読み込む設定が追加される

2. 設定からプロフィールを追加する
3. プロフィールのAdvance -> Automatic Profile Switchingに設定する

    ![image](https://qiita-image-store.s3.amazonaws.com/0/153/f8af46c6-edff-8a06-4cc0-059e10788d92.png)

# 制約

- シェル連携用のスクリプト（iterm2_shell_integration）をインストールする必要がある
    - ssh先のbashでもそのファイルを読み込まないといけない
- hostnameには `$HOST` の値を設定する

という制約があります。そんな訳なのでリモートホストの見た目変えたければ、リモートホストにも連携スクリプトが必要だし、rootで見た目変えたければ、rootにもインストールする必要があります。えっ、そんなことしたくなくね？

# まとめ

という訳で見た目変えられたりして便利そうなんですが、シェル連携を全ての端末、ユーザで設定しなければならずあまり現実的じゃないなーという所感です。
はじめてmampでpeclを入れる手順

##peclをインストールするための手順

peclとはは下記を参照するとわかりやすいです。
http://dqn.sakusakutto.jp/2015/07/php_extension_pecl_phpize.html

>２つに分断されたPHPの世界
PHPの世界では、ライブラリ配布方式が２つの世界に分断されてしまっています。
ライブラリの種類	配布サイト	インストーラ
PHP言語で書かれたライブラリ	Packagist (https://packagist.org/)	Composer
C言語で書かれたライブラリ	PECL (https://pecl.php.net/)	pecl

## peclのインストール先を指定する

peclをmampにインストールする際には、使用するphpのバージョンを指定する必要があります。

mampを起動し、設定 > 標準バージョンを選択
<img width="522" alt="MAMP.png" src="https://qiita-image-store.s3.amazonaws.com/0/104424/20957ddc-b7d7-371c-f2db-4275076ac045.png">

peclをインストールする際には、下記を参照
http://www.webcyou.com/?p=2216

```
/Applications/MAMP/bin/php/phpのバージョン/bin/pear install -a http://pear.php.net/get/インストールしたいパッケージ
```

サンプル
```
 /Applications/MAMP/bin/php/php5.6.10/bin/pear install -a http://pear.php.net/get/Mail-1.2.0
```

インストールされているかの確認方法
```
/Applications/MAMP/bin/php/phpのバージョン/bin/pear list
```
<img width="568" alt="fuelphp_—_-bash_—_80×24.png" src="https://qiita-image-store.s3.amazonaws.com/0/104424/1bd47fd1-aff6-fb3f-27b1-5664f12079cd.png">
特定のレコードを一括で更新するSQL / バックアップしたsqlファイルからから個別にデータをinsertするSQL

#特定のレコードを一括で更新するSQL / バックアップしたsqlファイルからから個別にデータをinsertするSQL

```sql
update items
set  type = 'ItemMiddleHeading'
where article_id in
(select id from articles where key in (
))
and type = 'ItemHeading'
```

###バックアップしたsqlファイルからから個別にデータをinsertする
```sql
testdb=> INSERT INTO my_table VALUES (:'content');
```
賢いライト：LIFX


個人的にはハブ / コントローラー / ブリッジを必須としない LIFX が好み。
というか、LIFX は AllJoyn という公開規格の内の　Lighting Service Framework　の1実装なので、規格に従った実装があれば誰でも制御可能なところが心くすぐられる。

LIFX は Android / iOS 向けにストアにアプリが公開されている。
加えて、Android ユーザには朗報だけど Qualcomm が公開している Luminaire というアプリを使えば、少し開発者っぽくいろいろ情報取得ができる。

2016年2月初頭の時点で Amazon に出ている LIFX 製品は高めなので、北米の本家 LIFX から発送してもらうほうがまだ安上がりだと思う。

**蛇足**
Twilight っていう Android のブルーライト軽減アプリにスマートライト連携ってのがあるんだけど、Philips Hue と連携できるみたい。AllJoyn の Lighting Service Framework とも連携できればいいのに。
ある日突然rails dbが起動しない。


### <i class="fa fa-bomb"> 背景

rails dbを起動しようとしたら。。。
こんなエラーが

```bash
$ rails db
ERROR 1044 (42000): Access denied for user ''@'localhost' to database 'database_name'
```

### <i class="fa fa-smile-o"> 解決策

権限がないって言われているので権限を追加。


ルート権限で入ります。

```bash
$ mysql -u root
```

#### 現状の権限を確認

```mysql

mysql> show grants for ''@'localhost';
+--------------------------------------+
| Grants for @localhost                |
+--------------------------------------+
| GRANT USAGE ON *.* TO ''@'localhost' |
+--------------------------------------+
```
> USAGE	「権限が無い」 の同義語です。
> http://www.dbonline.jp/mysql/user/index5.html

！ 権限がなくなっている！

#### 権限を変更します

```mysql
mysql> GRANT ALL PRIVILEGES ON *.* TO ''@'localhost';
```
すべての権限に変更しました。

> GRANT ALL PRIVILEGES ON `DB名`.テーブル TO 'ユーザ名'@'ホスト名';
> http://qiita.com/pinohara/items/481c95dc4c8c2568bf8d

もう１回確認

```mysql
mysql> show grants for ''@'localhost';
+-----------------------------------------------+
| Grants for @localhost                         |
+-----------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO ''@'localhost' |
+-----------------------------------------------+
1 row in set (0.01 sec)
```

そして・・・

```zsh
$ rails db
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 15
Server version: 5.6.27 Homebrew

Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>
```

とりあえずこれで動きました！

なぜ権限が変わっていたのかの
直接的な原因はわかっていません。。(´・ω・`)
Visual Studioのデザイナの多言語環境で設定したプロパティの削除方法

メモ代わりに記載しているため、誤り、情報の不足等あれば、コメント下さい。
>確認済みVersion
- Microsoft Visual Studio 2008 Version 9.0.21022.8 RTM

# 多言語環境とは
Visual Studio(以下VS)では、アプリの多言語対応を安易に行るように、
言語設定毎にデザイナでプロパティ設定ができます。
>例：ボタンのテキスト、フォームのタイトル等

# 本文
今回、多言語環境で設定したプロパティ値を規定値とする為、多言語環境に設定したプロパティを明示的に削除しておきたいと思い、
削除方法を検索したところ、パッと見ヒットしませんでした。

仕方ないので、フォームの.言語(jpとか).resxファイルを直接操作して、削除するかと中身を見てみたところ、該当項目が見つからず、.resxファイルにプロパティ記載がありました。

何度かデザイナを操作して確認しましたが、以下のことが判明しました。

# 多言語環境プロパティは規定値環境に統合される
正確には、統合される場合とされない場合があります。

**・規定値 -> 多言語の順で同プロパティに同値をセットすると、多言語環境から、プロパティ値が削除され、規定値ファイルに統合される。
・多言語 -> 規定値の順で同プロパティに同値をセットすると、統合されない。**

単純であるものの、規定値を変更し、継承されるはずの値が継承されずに言語別に変更されない場合は、このあたりを見てみるといいかもしれません。
※実際、それによって悪影響となることは滅多にないと思いますが、数年後に変更した際に悪影響となる可能性もありますので、理由が無ければ明示的に削除したほうがいいかと思います。

デザイナでは分からない為、最終的には、.言語(jpとか).resxファイルを確認するのがいいかと思います。

# 注意点
resxファイルですが、正しいXMLで記述されていないとエラーが多発するとの記述があるため、本来は手動で触らないほうがいいとのこと。
[プログラムによる .resx ファイルの使用](https://msdn.microsoft.com/ja-jp/library/gg418542(v=vs.110).aspx)


稚拙な文ですが最後までお読み頂き、ありがとうございました。
VMWareで困った時のメモ

VMWare起動時に、たまに困って毎回調べてるのでメモ

# この仮想マシンは使用中の可能性があります。

ロックファイルが残り続けています。
もし、このVMゲストを起動していないようならばロックファイルを削除することで解決します。
ホストOSがWindowsの場合、```C:\Users\<UserName>\Documents\Virtual Machines```以下に```.lck```ディレクトリがあるので削除しましょう。

# パワーオン中にエラーが発生しました

VMware Authorization Serviceが起動していない事が主な原因
Windowsの設定からサービスを起動して、VMware Authorization Serviceを選択してサービスの開始をしましょう
Java SE7 Gold 取得を目指して (4)

Java SE7 Gold をとりたい…!
===

本日は第4回目です。

## 今日のこぼれ話
ひさびさにC#からJavaを書いていて感じるのは、やっぱり型推論欲しいなーという点。
第3回の `Outer.Inner obj = new Outer().new Inner();` とか辟易としますよね。あまり使いませんけど。
あとじわじわ効いてくるのが、`List<MyClass> list = new ArrayList<MyClass>();` でしょうか。ProjectCoinで `List<MyClass> list = new ArrayList<>();` で書けるよ!とか言われましても、恩恵はわずかといいますか…。
え、GroovyとかScalaとかKotlinとか、甘い誘惑はやめてください、試験勉強中ですよ!
Lombok? 何それおいしいんですか? おなか壊しませんかね…。

## 本日知ったこと(4章)

* is-a と has-a
  * has-a で特に強い関係がコンポジション → 全体と部分のオブジェクトの生存期間が同じ
  * is-a でも has-a でも他クラスの機能を利用できるが、利用する側にとって不要な機能が追加されてしまうような場合は has-a でのアプローチがよさそう
  
* パターン
  * Singleton
     * よく見る(使う)
     * マルチスレッドとかを考えて `synchronized Single getInstance() { ... }` とかやる
  * DAO
     * Frameworkの普及で意識しなくてもこのパターンを使っていることが多い
  * Factory
     * `valueOf()` はこのパターンらしい。 せっかくなのでIntegerクラスのソースを見た。いろいろ省略すると↓

       ```java
       public static Integer valueOf(String s, int radix) {
         return valueOf(parseInt(s, radix));
       }
       
       public static Integer valueOf(String s) {
         return valueOf(parseInt(s, 10));
       }

       public static Integer valueOf(int i) {
         return new Integer(i);
       }
       ```

デザインパターンとか出てきて、Goldらしい内容になってきた気がします。
ところで、is-a ってイズアって読むんですね。英語で考えれば当然なんでしょうが、「BオブジェクトはAオブジェクトだ」という意味でイズエーだと思ってました。口に出す前に知ってよかったです。
Angular マウスホバー時に、カーソル座標を得る




```js
        var appEl = angular.element(document.getElementById($scope.spanID));
        appEl.hover(function (e) {
            var $page = angular.element(window)
            var windowScrollTop = $page[0].pageYOffset
            var windowScrollLeft = $page[0].pageXOffset
            var elScrollTop = appEl.offset().top
            var elScrollLeft = appEl.offset().left

            //show ooui on mouseover event
            var top = windowScrollTop + elScrollTop;
            var left = windowScrollLeft + elScrollLeft-20;
},);
            
```
Front-end development @FirstServer - 15 minute presentation


A presentation for [第3回【関西ITベンチャー】](http://devtoolnight.connpass.com/event/25844/) event.
Why and how we built a new web application using the latest web technologies.

## Context

[zenlogic.jp](https://zenlogic.jp) provides hosting web services.
In 2016 January, we released a new version of the web application used to registers new customers.

## Goals

* Improve the user experience (UX):
 * Fast application
 * Easy to use (instant feedback)
 * Less steps, less clicks
 * Mobile-friendly
 
* For developers : 
  * use the latest technologies (npm modules, Javascript ES6, React, Redux...)
  * speed up development with "Hot Reload" feature

* For maintenance and safe deploy:
 * We want automatic tests for JavaScript too. 

## Technologies

Before: classic web application, with pages rendered by Ruby on Rails assets pipeline
After: single-page application (SPA) built with node.js tools

The new front-end stack:

* [node.js](https://nodejs.org/): server-side JavaScript used to build the application
* JavaScript ES6 modules (see [previous 勉強会](http://qiita.com/michaelrambeau/items/bf079b5b48507792807f)!)
* [React](https://facebook.github.io/react/)
* [React Hot Loader](http://gaearon.github.io/react-hot-loader/)
* [Redux](http://redux.js.org/): architecture to manage application state
* [redux-form](http://erikras.github.io/redux-form): used to bind forms to Redux state
* [Webpack](https://webpack.github.io/): bundle JS and CSS code, web server in development
* [Babel](http://babeljs.io/) converts ES6 code to ES5 code
* [React-router](https://github.com/rackt/react-router ) for client side routing
* [Autoprefixer](https://github.com/postcss/autoprefixer) and [PostCSS](https://github.com/postcss/postcss) to process CSS code 
* npm scripts (see [Glitter package.json](https://github.com/ZCloud-Firstserver/glitter/blob/master/package.json))
* Testing with [Mocha](http://mochajs.org/) and [jsdom](https://github.com/tmpvar/jsdom)
* Linting with [ESLint](http://eslint.org/), following [Airbnb styleguide](https://github.com/airbnb/javascript)


## The result

[Link](https://my.zenlogic.jp/registration/hosting/start?tracking=0#/) 

#### On mobile screens

![image](https://qiita-image-store.s3.amazonaws.com/0/72726/46c80546-943f-c633-8b8f-6a0263ff4260.png)


#### On desktop screen

![image](https://glitter.qiita.com/files/3da96cca-209e-9238-e046-e37071433062.png)

## About testing

Testing front-end code is important, testing is not only for back-end code!
We added more than 100 tests to be sure that nothing is broken when a new feature is added.

## About linting

We use [ESLint](http://eslint.org/) to check the code before deploying, following [Airbnb styleguide](https://github.com/airbnb/javascript) rules.
Goals:

* catch potential bugs
* keep a uniform coding style

## The end

Thank you for your attention!
GitHubで記事管理、レビューしてCircleCI使ってはてなブログへ自動投稿する

はてなブログを複数人で運用しているとレビューどうしようってなる。
GithubだとPR作成して1行1行でコードがいじれるからめっちゃ便利！
とはいえPR通った後は手動ではてなブログへ移す？

# CircleCIとは?
https://circleci.com/
知らない方は下記が参考になりそうです
http://www.slideshare.net/mogproject/circleci-51253223

# CircleCIはサーバー上で一通り遊べる環境が整っている

* Ruby, node.js, Python, PHP, Java, Scala, Clojure, Haskellと色んな言語をサポートしている
* 他にはsolr, elasticsearch, cassandra, neo4j
* databaseはmysqlとかmongodb、redisとかmemcachedだってサポートしてる
* 足りなければ自分でインストールだってできる

```
dependencies:
pre:
  - sudo apt-get update; sudo apt-get install git
```

# 自由！
**sshでログインすることもできるからデバックも楽ちん**
ここは結構重要でローカルではできてるけどCIでこけてて原因がどうしてもわからないときとかに
サーバーにログインして確認できる

# そして作ったはてなブログへCicleCIから自動投稿プログラム
## イメージ
![Untitled (1).png](https://qiita-image-store.s3.amazonaws.com/0/44247/2947cacb-4ea0-ef1e-b49f-660eb6420c12.png)

## 使用した主なコード

### 対象ファイルの抽出
**一番キモ**なのはどうやってCircleCI上で記事ファイルを認識させるか。
これはgit logからとってくる

```lang:shell
git log --name-status -p -1 | egrep "^[AM]\s+\"?articles\/.*\.md" | awk '{print $2}' | head -1 | sed -e 's/^\"//g' | sed -e 's/\"$//g'
```

`egrep "^[AM]\s+\"?articles\/.*\.md"`で各行を精査して対象記述を取り出す
`[M]  articles/hoge.md`といった具体で1行取得できるので`awk '{print $2}'`これで空白区切りの2番目のファイルパスをとってくる

### 記事の投稿
対象ファイルが判明すればCircleCIはrubyやpythonが動くのでお好きな言語ではてなapiをたたけば良い。
rubyには[hatenablog](https://github.com/kymmt90/hatenablog)というはてなブログのapiをラッパーしたものがあるので、これを使う。
画像に関してはgemとかはなかったので、[こちら](http://qiita.com/takuya_1st/items/59b93f94217811599a1e) を参考にしながら実装

トークンなどの大切な情報はgit上で管理はさせずにCircleCIの[environment variables](https://circleci.com/docs/environment-variables)で！

### circle.yml
運用イメージとしては、masterからブランチ切り出して
PRつくってレビューしていって最終的にマージしたら記事を投稿したいので、
設定に関してもmasterのみでコマンドが実行されるようにしてある。

```lang:circle.yml
machine:
  timezone:
    Asia/Tokyo
  ruby:
    version: 2.2.3

deployment:
  production:
    branch: master
    commands:
      - 記事アップロードするスクリプトを記載
```

## 感想
意外と難しくない。
誰でも使えるようにリポジトリつくったのでforkするなどすると使える
https://github.com/hatappi/circleci_to_hatenablog
TODO > ESP8266 > フラッシュに書いたデータの保持期間 > 20年間?

ESP8266でSPIFFSという方法で4MBのフラッシュにデータを書き込める。

気になるのはそのデータの保持期間。

10年持つかどうか。

考えているのは、10年先の自分に送るメッセージを現在制作中のMessage Stationに格納すること。
PiZero time capsule (正確にはPiZeroでなく ESP8266 time capsuleか).

<hr>
(追記 2016/02/26)

[SPANSION フラッシュメモリガイドブック](http://www.spansion.com/jp/Support/Documents/Flashmemory_Guide_Book_br_A2_J.pdf)

p.22
> 5.1 3Vで動作可能なフラッシュメモリ 「S29GL512N」
> 20年間のデータ保持能力 (標準値)

実際の性能は半分くらいの10年と考えるのがあっているのかも。
そうなると安全率はほとんどなく、10年持たないかもしれないし、持つかもしれない。

<hr>

TODO: ドレイクの方程式のアナロジーによるtime capsuleの開封確率計算
zfecライブラリでデータ破損を復元する誤り訂正符号を生成

zfecライブラリを利用して、データが一部破損していもて復元できる誤り訂正符号を生成してみました。

# データ破損を復元するイメージ図
zfecライブラリはRAID-5アルゴリズムでデータ破損を復元します。Raid-5アルゴリズムに関しては[こちら](http://nosa.cocolog-nifty.com/sanonosa/2013/11/raid5-d6a0.html)を読むと判りやすいです。XORを利用した単純な仕組みなのですぐ理解できると思います。

![スクリーンショット 2016-02-25 16.33.13.png](https://qiita-image-store.s3.amazonaws.com/0/65312/2e78cfc9-cff4-f2eb-4eb9-b6a05b88db81.png)


![スクリーンショット 2016-02-25 16.33.19.png](https://qiita-image-store.s3.amazonaws.com/0/65312/f77b3f14-d6e2-ba2c-98f3-19eaca3b6105.png)


![スクリーンショット 2016-02-25 16.33.36.png](https://qiita-image-store.s3.amazonaws.com/0/65312/c4d9a2dc-172f-70cf-d206-e3749146288d.png)


# zfecライブラリの特徴
・早い
・python, c, HaskelのAPIがある
・char配列を扱える

https://pypi.python.org/pypi/zfec

# インストール

```shell-session
pip install zfec
```

# 2ブロックから誤り訂正符号を生成して検証
![スクリーンショット 2016-02-25 16.33.13.png](https://qiita-image-store.s3.amazonaws.com/0/65312/2e78cfc9-cff4-f2eb-4eb9-b6a05b88db81.png)

```py:2DataBlock
# -*- coding: utf-8 -*-
from __future__ import absolute_import, unicode_literals
import zfec

# エラー検出訂正
data_block1 = str('aiueo')
data_block2 = str('kakik')

# データブロック1と2からエラー検出符号:3を生成
_, _, data_block3 = zfec.Encoder(2, 3).encode([data_block1, data_block2])
print 'data block 3 is... {}'.format(data_block3)
# >>> data block 3 is... uyI}g

# データブロック1とエラー検出符号:3から2を復元
_, repaired_data_block2 = zfec.Decoder(2, 3).decode([data_block1, data_block3, ], [0, 2])
assert data_block2 == repaired_data_block2

# データブロック2とエラー検出符号:3から1を復元
repaired_data_block1, _ = zfec.Decoder(2, 3).decode([data_block2, data_block3, ], [1, 2])
assert data_block1 == repaired_data_block1


```

# 5ブロックから誤り訂正符号を生成して検証

```py:5DataBlock
# -*- coding: utf-8 -*-
from __future__ import absolute_import, unicode_literals
import zfec

# エラー検出訂正
data_block1 = str('aiueo')
data_block2 = str('kakik')
data_block3 = str('ukeko')
data_block4 = str('sasis')
data_block5 = str('useso')

# データブロック1と2からエラー検出符号:3を生成
blocks = zfec.Encoder(5, 6).encode([data_block1,
                                    data_block2,
                                    data_block3,
                                    data_block4,
                                    data_block5])

ecc_block = blocks[-1]
print str('ecc block is... {}').format(ecc_block)
# >>> ecc block is... J?\j

# データブロック1-4とECCブロックから5を復元
repaired_blocks = zfec.Decoder(5, 6).decode([data_block1,
                                             data_block2,
                                             data_block3,
                                             data_block4,
                                             ecc_block], [0, 1, 2, 3, 5])
assert data_block5 == repaired_blocks[4]

# データブロック1,2,4,5とECCブロックから3を復元
repaired_blocks = zfec.Decoder(5, 6).decode([data_block1,
                                             data_block2,
                                             data_block4,
                                             data_block5,
                                             ecc_block], [0, 1, 3, 4, 5])
assert data_block3 == repaired_blocks[2]

```
EP 13 Take Advantage of Each Block in try/except/else/finally


> - The try/finally cmpound statement lets you run cleanup code regardless of whether exceptions were riased in the try block
- The else block helps you minimize the amount of code in try blocks and visually ditingush the success case from the try/except blocks
- An else block can be used to perform additional actions after successful try block but before common cleanup in finally block

> Effective Python



```python
try:
# Excute at the beginning

except Exception as e:
# Execute if an exception is riased in try block.

else:
# Execute if try block does not raise exception.
# Allow user to write code which cause exception here in order to propagate exception to upper stack.

finally:
# Executed at the end anyway.

```



```python
def load_json_key(data, key):
    try:
      result_dict = json.loads(data) # May raise ValueError
    except ValueError as e:
      raise KeyError from e
    else:
      return result_dict[key] # May raise KeyError
```
EP 12 Avoid else Blocks After for and while Loops.


> - Python has special sytax that allows else blocks to immediately follow for and while loop iterator blocks
- The else block after a loop only runs if the loop body did not encouner break
- Avoid using else block after loops because their behavior isn't intuitive an be be confusing

> Effective Python


```python
>>> for i in range(3):
...  print("Loop %d" % i)
... else:
...  print("Else block")
...
Loop 0
Loop 1
Loop 2
Else block
```

Fun behavior

```python
>>> for i in []:
...  print("Nothing")
... else:
...  print("Elese block")
...
Elese block

>>> while False:
...  print("Nothing")
... else:
...  print("Else block")
...
Else block
```


The rationale for these behaviors is that else blocks after loops are useful when you're using loos to search for something.


```python
>>> a = 4
>>> b = 9
>>> for i in range(2, min(a, b) + 1):
...  print("testing %d" % i)
...  if a % i == 0 and b % i == 0:
...   print("Not coprime")
...   break
... else:
...  print('Coprime')
...
testing 2
testing 3
testing 4
Coprime
```


But in real world, the helper function could be used.


```python
def coprime(a, b):
    for i in range(2, min(a, b) + 1):
      if a % i == 0 and b % i == 0:
        return False
    return Tru
```
EP 11 Use `zip` to Process Iterators in Parallel


> - The zip built-in function can be used to iterate over multiple iterators in parallel.
- In Python 3, zip is a lazy evaluation that produces tuples. In Python 2, zip returns the full result as a list of tuples.
- zip truncate its outpu silently if you supply it with iterators of different length.
- The zip_longest function from the itertools built-in module lets you iterate over multiple iterators in parallel regardless of the their lengths.

> Effective Python

Verbose

```python
>>> names = "Michel Stonbreaker Peter Bilas Franklin".split()
>>> letters = [len(n) for n in names]
>>> longest_name = None
>>> max_letters = 0
>>> for i in range(len(names)):
...  count = letters[i]
...  if count > max_letters:
...   longest_name = names[i]
...   max_letters = count
...
>>> print(longest_name)
Stonbreaker

```

You can use enumerate. But it is still verbose.

```python
>>> for i, name in enumerate(names):
...  count = letters[i]
...  if count > max_letters:
...   longest_name = names[i]
...   max_letters = count
...
>>> print(longest_name)
Stonbreaker
```

```python
>>> for name, count in zip(names, letters):
...  if count > max_letters:
...   longest_name = name
...   max_letters = count
...
>>> print(longest_name)
Stonbreaker
```

## zip truncate implecitly. if it iterate the different length of iteratable objects.

`itertools.zip_longest` could be a solution for this.

```python
>>> for name, count in zip(names, letters):
...     print(name, count)
...
Michel 6
Stonbreaker 11
Peter 5
Bilas 5
Franklin 8
>>> from itertools import zip_longest
>>> for name, count in zip_longest(names, letters):
...  print(name, count)
...
Michel 6
Stonbreaker 11
Peter 5
Bilas 5
Franklin 8
Matei None
>>>
```
技術英語 > I analyze the form and adjust the number of panels to [meet the budget] / meet the requirement / make both ends meet

@ AXIS Feb. 2016 > Cover interview: Frank Gehry

> I analyze the form and adjust the number of panels to <font color=red>meet the budget</font>, 

http://eow.alc.co.jp/search?q=meet+the+budget+target
> 予算目標を達成する

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

http://eow.alc.co.jp/search?q=meet+the+requirement

> meet the requirement

<hr>
http://eow.alc.co.jp/search?q=make+both+ends+meet

> make both ends meet

生活の収支を合わせる、収入の範囲内でやりくりする［やっていく］

English JournalかEnglish Express (2002年頃)にみたイメージで、紙切れを真ん中で折って両端をあわせることで収支をあわせる、というのを説明していた。
それを見てから make both ends meet が記憶に残った。
Dでの多次元配列の宣言による行/列の扱いの違い


多次元配列を宣言する際、

```d
int[10][5] arr;

# arr => 
# [0 0 0 0 0 0 0 0 0 0]
# [0 0 0 0 0 0 0 0 0 0]
# [0 0 0 0 0 0 0 0 0 0]
# [0 0 0 0 0 0 0 0 0 0]
# [0 0 0 0 0 0 0 0 0 0]
```
のように宣言すると5行10列の(固定サイズ)配列になるが、

```d
auto arr = new int[][](10, 5);

# arr =>
# [0 0 0 0 0]
# [0 0 0 0 0]
# [0 0 0 0 0]
# [0 0 0 0 0]
# [0 0 0 0 0]
# [0 0 0 0 0]
# [0 0 0 0 0]
# [0 0 0 0 0]
# [0 0 0 0 0]
# [0 0 0 0 0]
```
のように宣言すると10行5列の(動的サイズ)配列になる。

配列アクセスは
`arr[i][j] # => i行j列目`
なので、後者の形で宣言した方がバインド順の逆転が起こらない。

プログラミング言語Dの4.3節を読んでいて気になったが、ずっと後者の形を使っていたので逆転があることに気付かなかった……。
Hotonworksセットアップメモ及び参考URL

- HDP2.0セットアップ
  http://metasearch.osdn.jp/wiki/index.php?HDP2.0%A5%BB%A5%C3%A5%C8%A5%A2%A5%C3%A5%D7
- Setting up a Hadoop Dev Environment for Pentaho Data Integration
  http://diethardsteiner.github.io/pdi/2015/06/06/PDI-Hadoop-Dev-Env.html
- Set up Pentaho to Connect to a Hortonworks Cluster
  https://help.pentaho.com/Documentation/6.0/0H0/070/030/020
- Connect to a Hadoop Cluster in Spoon
  https://help.pentaho.com/Documentation/6.0/0L0/040/025
Topological Data Analysisに必要な数学的基礎

Topological Data Analysisで使うトポロジー(やホモロジー)を理解するために必要な数学について、ツラツラと書いてみます。
数学科の2年生くらいまでに習う事を押さえておけば、良いのではと思います。

# 線形代数
行列、線形写像の行列表現、スミス標準形(行列の階数)

# 位相空間
(解析的な意味での)連続性、連続写像、同相写像、距離空間、開被覆
疎な位相、密な位相

# 群、加群
可換群、剰余群、準同型定理、有限生成加群の構造定理、
完全系列とか蛇の補題のような議論に対する慣れ

# 多様体
モース理論
iOSのパスコード変更のコストについて

こちらの記事が大変面白かった。
[iPhoneの「バックドア」問題について](http://negi.hatenablog.com/entry/2016/02/20/155501)

記事の中で紹介されていたAppleの [iOSのセキュリティ iOS Security Guide](https://www.apple.com/jp/business/docs/iOS_Security_Guide.pdf) が非常に充実していて少し驚いた。

パスコードは端末の表示状態のロックを解除するだけかと思っていたら、そうではなく、iOSのコンテンツが実質的にパスコードで暗号化されているのだった。
なおかつ、パスコードを変更しても、ファイルを再暗号化しなくてもいいようになっている。

鍵マークを * で表すと
[ハードウェア鍵 + パスコード鍵] -> [クラス鍵 *] -> [ファイル鍵 *] -> [ファイルの内容 *]
となっていて、ファイルの内容はファイル鍵で、ファイル鍵はクラス鍵で、そしてクラス鍵はハードウェア鍵とパスコード鍵で、それぞれ階層的に保護されている。
文中の「ファイルのクラスを変更する場合はそのファイルのファイル鍵をラップし直すだけでよく、パスコードを変更した場合はクラス鍵のラップだけが変更されます」の部分について、簡潔すぎるので補足説明してみる。

ファイル鍵は256bitの秘密鍵である。乱数から生成され、ファイル毎に異なる(暗号化ファイル同士を比較して平文を推測したりできないようにするため)。
ファイルの内容はファイル鍵によりAESで暗号化される。これは普通のブロック暗号化である。ファイル鍵はSecure Enclave内だけで処理され、Secure Enclaveの外に出るときにはクラス鍵で暗号化して保護するようになっている。
クラス鍵はファイル鍵を保護するための256bitの秘密鍵であり、ファイル鍵はクラス鍵で暗号化されて、ファイルのメタデータ領域に保存される。クラス鍵もまた、Secure Enclave内だけで処理され、Secure Enclaveの外に出るときにはハードウェア鍵とパスコード鍵で暗号化するようになっている。(ここは単純なAESではないようだ)

このように階層化すると、実質的にはファイルをパスコードで保護しつつ、パスコードなどを変更したときのコストを減らすことができる。たとえばパスコードを変更したときは、暗号化されたクラス鍵を再暗号化(今の鍵で復号してから、新しい鍵で暗号化すること)すればよい。クラス鍵＝秘密鍵そのものは変更しない。一階層下のファイル鍵はクラス鍵で暗号化されているので、クラス鍵が同じなら暗号化されたファイル鍵はそのまま使える。
同様に、ファイルのクラスを変更するとき(ファイルのオーナーを変更するときとか？)は、暗号化されたファイル鍵だけを再暗号化すれば、新しいクラスで保護することができる。この場合もファイル鍵は同じなので、ファイルの内容自体を再暗号化しなくて済む。(ファイル全体の再暗号化はコストが大きいので避けたい)

ハードウェア鍵とパスコード鍵によってクラス鍵を暗号化するときには、PBKDF2のような反復的な処理が用いられていて、総当り攻撃がやりづらくなるよう、ある程度時間がかかるように調整されている。

余談だが似たようなトピックとして、WinZIPのAES暗号化も、パスワードをPBKDF2で攪拌したものを秘密鍵としてAESで暗号化するのだが、パスワードから生成された鍵そのものでファイルの内容を暗号化するため、パスワードを変更するにはファイルの内容全てを再暗号化する必要がある。(ZIPには色々フォーマットがあるので、もしかすると賢いものも存在するかもしれない)
Devise + CanCanCan + rolify のインストール


Railsでユーザの権限を管理するには、下にある3つのgemを組み合わせて使う方法があります。

- [Devise](https://github.com/plataformatec/devise) ユーザ認証
- [CanCanCan](https://github.com/CanCanCommunity/cancancan) 権限管理
- [rolify](https://github.com/RolifyCommunity/rolify) ロール管理

実装方法は「[Devise CanCanCan rolify Tutorial](https://github.com/RolifyCommunity/rolify/wiki/Devise---CanCanCan---rolify-Tutorial)」に説明がありますが、知らないことが多くてハマったのでメモしておきます。

インストール
----------

Gemfileに下の3つを追加して、`bundle install`を実行します。

```Gemfile
gem 'devise'
gem 'cancancan'
gem 'rolify'
```

以下のコマンドを実行し、権限管理の機能を備えたUserモデルを生成します。

```bash
$ rails generate devise:install
$ rails generate devise User
$ rails generate cancan:ability
$ rails generate rolify Role User
$ rake db:migrate
```

自分の場合は、既にUserモデルが存在していて、自前のログイン認証ロジックを組み込んでいたのですが、`rails d model user`で破棄してから実行しました。

Deviseの設定
---------------

`config/routes.rb`にrootの設定をします。

```config/routes.rb
root to: "home#index"  # ログイン後に遷移させるアクションを指定
```

認証が必要なコントローラに`before_action :authenticate_user!`を記述します。

```app/controllers/home_controller.rb
class HomeController < ApplicationController
  before_action :authenticate_user!

  def index
  end

end
```

また、DeviseのメーラーにデフォルトURLを設定します。意味は分かりません。

```config/environments/development.rb
config.action_mailer.default_url_options = { host: 'localhost', port: 3000 }
```

これにより、コントローラやビューで、`user_signed_in?`や`current_user`などのヘルパーを使うことができます。詳細は「[Devise README](https://github.com/plataformatec/devise/blob/master/README.md)」を参照。

ログインページのカスタマイズ
-----------------------

ログインページのデザインを変更するには、次のコマンドを実行して`app/views/devise`の下にビューを生成します。

```bash
$ rails generate devise:views

# 作成されたビュー
$ ls app/views/devise/
confirmations mailer        passwords     registrations sessions      shared        unlocks

# ログインページはこれを編集する
$ vim app/views/devise/sessions/new.html.erb
```

日本語化
-------

Deviseのローカライズファイルをダウンロードして`config/locales/`の下に配置します。

```
$ wget https://gist.githubusercontent.com/satour/6c15f27211fdc0de58b4/raw/d4b5815295c65021790569c9be447d15760f4957/devise.ja.yml -P config/locales/
```

権限の設定
---------

CanCanCanが生成した、`app/models/ability.rb`に権限を定義します。

```ruby
class Ability
  include CanCan::Ability

  def initialize(user)
    user ||= User.new # guest user (not logged in)

    # 基本ルール
    if user.has_role? :admin
      can :manage, :all       # adminロールは何でもできる
    else
      can :read, :all         # それ以外は参照のみ
    end

  end
end
```

- `user.has_role?`の引数には任意のシンボルが使えます
- `can`の第1引数には、`:manage`、`:create`、`:read`、`:update`、`:destroy`といったパーミッションを指定します
- `can`の第2引数には、対象となるオブジェクトのクラス名を指定します

詳しい説明は「[CanCanCommunity wiki - Defining Abilities](https://github.com/CanCanCommunity/cancancan/wiki/Defining-Abilities)」にあります。


ユーザにロールを割り当てる
----------------------

例) `rails console`で新規にユーザを作成して、adminロールを割り当てる

```bash
$ rails c

# ユーザ"hoge"を作成する
> user = User.new
> user.email = "hoge@example.com"
> user.password = "test1234"
> user.save

# ユーザ"hoge"に"admin"ロールを設定する
> user.add_role "admin"
```

ユーザには複数のロールを割り当てることができます。

ビューでの判定
------------

ユーザのロールで表示を切り替えるには、

```home.html.erb
<% if user.has_role? :admin %>
  ...ここにadminユーザだけに表示されるコンテンツ...
<% end %>
```

以上
RSpecでDeviseを使ったモデルをテストしたら RuntimeError:Could not find a valid mapping for というエラーが出た

Devise (gem)とRSpecでモデルのテストに中々困難したため記事化したいと思います。

※ 注意) 私はRuby初心者です。
間違っている箇所等ございましたらコメント等頂きたいです。

-----
因みに、私はこの設定をしないとこんな感じのエラーが出てしまっていました。

```
$ bundle exec rspec spec/models/user.rb
...
Failure/Error: u = FactoryGirl.create(:user, id: id,
     RuntimeError:
       Could not find a valid mapping for #<User id: 1, (中略...)
```

-----

まず、本題に入る前に下記のことについて確認しておきましょう。

* <code>Gemfile</code>に<code>gem 'devise'</code>(バージョン略)が記載されている
* 対象のモデル(今回はuser.rb)にDeviseの記述がされていること

```user.rb
class User < ActiveRecord::Base
    devise: :database_authenticatable, :registerable # etc...
```

# 設定

* <code>config/environments/test.rb</code>
* <code>config/routes.rb</code>

の2ファイルを編集します。

```config/environments/test.rb
config.action_mailer.default_url_options = { :host => 'localhost:3000' }
```

```config/routes.rb
# 対象のモデルが User であれば
devise_for :users
```

これだけ！！
このように記述することで正常にテストが動作するようになりました。


今回は<code>test</code>環境を使いたかったので
<code>config/environments/test.rb</code>を編集しました。

が、別に違う環境でも動作すると思います。
その時は編集するファイルも適宜変更してくださいね。


※ 補足
<code>config.action_mailer.default_url_options</code>は
railsからメールを送信する際のホストの設定です。
CakePHPでModel::find()にて部分一致の検索機能の実装

## Model::find()で検索  
http://book.cakephp.org/2.0/ja/models/retrieving-your-data.html  

'conditions'に検索条件を指定できる.
配列で渡せば, 複数の検索条件を指定できる.

```sample.php
$this->Model->find(array(  
	'conditions' => array(  
		'Model.field1' => '検索ワード1',
		'Model.field2' => '検索ワード2',
		)
	));
```


## 部分一致の検索を行う
LIKE, 及びワイルドカード'%'を用いる.  

```sample2.php
$this->Model->find(array(
	'conditions' => array(
			'Model.field LIKE' => '%'.'部分一致ワード'.'%'
			)
		));
```
MIMEエンコードされたメールのデコード方法

# メール本文のデコード

まずgmailの"メッセージのソースを表示する"をクリックする。そしてメール本文をコピーする。

### encodingがbase64でcharsetがUTF-8の場合

```
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: base64
```
`pbpaste | nkf -mB`


### encodingが7bitで、charsetISO-2022-JPの場合

```
Content-Type: text/plain; charset="ISO-2022-JP"
Content-Transfer-Encoding: 7bit
```

`pbpaste | nkf -J` でデコード


### encodingがquoted-printableで、charsetがUTF-8の場合

```
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
```

`pbpaste | nkf -mQ` でデコード


### encodingがbase64で、charsetがISO-2022-JPの場合

```
charset=ISO-2022-JP
Content-Transfer-Encoding: base64
```

`pbpaste | base64 -D | nkf -J` か `pbpaste | nkf -mB` でデコード

### encodingが8bitで、charsetがShift_JISの場合

```
content-type:text/plain; charset="Shift_JIS"
content-transfer-encoding:8bit
```

gmailのエンコードをShift_JISにする。

# Subject(件名)のデコード

### ISO-2022-JP、quoted-printable

```
Subject: =?ISO-2022-JP?Q?iTunes_Movie_=1B$B%K%e!<%j%j!<%9$HCmL\:nIJ=1B(B?=
```

`echo "=?ISO-2022-JP?Q?iTunes_Movie_=1B$B%K%e!<%j%j!<%9$HCmL\:nIJ=1B(B?=" | nkf -m` でデコード

### ISO-2022-JP、BASE64

```
Subject: =?ISO-2022-JP?B?GyRCJUElMSVDJUg5WEZ+JE4bKEI=?=
 =?ISO-2022-JP?B?GyRCJCpDTiRpJDshSiVmJUolJCVGJUMlSSEmJTclTSVeGyhCIA==?=
 =?ISO-2022-JP?B?GyRCJTAlayE8JVchSxsoQg==?=
```

`echo "Subject: =?ISO-2022-JP?B?GyRCJUElMSVDJUg5WEZ+JE4bKEI=?==?ISO-2022-JP?B?GyRCJCpDTiRpJDshSiVmJUolJCVGJUMlSSEmJTclTSVeGyhCIA==?==?ISO-2022-JP?B?GyRCJTAlayE8JVchSxsoQg==?=" | nkf -m` でデコード

改行を含んでいる状態で `pbpaste | nkf -m` でもデコードできる。

### UTF-8、BASE64

```
Subject: =?UTF-8?B?44CQ44OX44Op44Kk44Og5Lya5ZOh44Gu5pa5?=
 =?UTF-8?B?44G444GK55+l44KJ44Gb44CRUHJp?=
 =?UTF-8?B?bWUgTm93IOOCqOODquOCouaLoeWkpyjmnbHkuqzjg7vljYPokYkp?=
```

`pbpaste | nkf -m` でデコード

### UTF-8、quoted-printable

```
Subject: =?utf-8?Q?Distributed=20TensorFlow=E3=81=AE=E8=A9=B1?=
```

`pbpaste | nkf -m` でデコード
cisco 1812j で VLAN 間で疎通させる

##VLAN作成
```
Router#vlan database
Router(vlan)#vlan 10
VLAN 10 added:
    Name: VLAN0010
Router(vlan)#applyAPPLY completed.
```
##VLANをinterfaceに割り当てる
```
Router(config)#interface FastEthernet 2
Router(config-if)#switchport mode access
Router(config-if)#switchport access vlan 10
Router(config-if)#exit
```
##VLANにIPを割り当てる
```
Router(config)#int vlan 10
Router(config-if)#ip add 172.16.10.254 255.255.255.0
```
※同じ要領で２つ目のVLANを作成する

```
VLAN Name                             Status    Ports
---- -------------------------------- --------- -------------------------------
1    default                          active    Fa4, Fa5, Fa6, Fa7, Fa8, Fa9
10   VLAN0010                         active    Fa2
20   VLAN0020                         active    Fa3
```

##ルーティングを有効化
```
Switch(config)#ip routing
```

それぞれにパソコンを接続し疎通確認を行う。
WooCommerceの商品情報を取ってくる

##wc_get_productに商品のIDを投げる
２番目の引数に投げる値については調べているところなのでちょっとわからない

```php
wc_get_product( $post_id, array() );

#ID=2115の商品オブジェクトを取ってくる
wc_get_product( 2115 );
```

##戻り値はこんな感じのオブジェクト
```
class WC_Product_Simple#8606 (7) {
  public $id =>
  int(2115)
  public $post =>
  class WP_Post#342 (24) {
    public $ID =>
    int(2115)
    public $post_author =>
    string(1) "1"
    public $post_date =>
    string(19) "2016-02-25 18:36:16"
    public $post_date_gmt =>
    string(19) "2016-02-25 09:36:16"
    public $post_content =>
    string(883) "■商品説明

商品説明文がここに入ります。"...
    public $post_title =>
    string(91) "商品名 【国内正規品】"
    public $post_excerpt =>
    string(124) "<table>
<tr><th>メーカー型番</th><td>XXXXX</td></tr>
<tr><th>カラー</th><td>Baltic Birch</td></tr>
</table>"
    public $post_status =>
    string(7) "publish"
    public $comment_status =>
    string(4) "open"
    public $ping_status =>
    string(6) "closed"
    public $post_password =>
    string(0) ""
    public $post_name =>
    string(187) "meinl-percussion-"
    public $to_ping =>
    string(0) ""
    public $pinged =>
    string(0) ""
    public $post_modified =>
    string(19) "2016-02-25 18:36:16"
    public $post_modified_gmt =>
    string(19) "2016-02-25 09:36:16"
    public $post_content_filtered =>
    string(0) ""
    public $post_parent =>
    int(0)
    public $guid =>
    string(45) "http://woo.dev/?post_type=product&#038;p=2115"
    public $menu_order =>
    int(0)
    public $post_type =>
    string(7) "product"
    public $post_mime_type =>
    string(0) ""
    public $comment_count =>
    string(1) "0"
    public $filter =>
    string(3) "raw"
  }
  public $product_type =>
  string(6) "simple"
  protected $shipping_class =>
  string(0) ""
  protected $shipping_class_id =>
  int(0)
  public $total_stock =>
  NULL
  protected $supports =>
  array(1) {
    [0] =>
    string(16) "ajax_add_to_cart"
  }
}


```

#参考
https://docs.woothemes.com/wc-apidocs/function-wc_get_product.html
eclipseで少しでも作業領域を広く使いたい！

# はじめに

ついに私にもワイドディスプレイが支給されたのですが、随分縦の長さが足りないなと思い、
少しでも作業領域を広げるべく設定した際のメモです。

# 環境

##### OS
- Windows 8.1

##### Eclipse
- Mars.1 (4.5.1)

##### Eclipse Plugin
- Eclipse Color Theme 1.0.0.201410260308
- Jeeeyulテーマ 2.3.0.I20151022-090442

# やったこと

## OS側のタスクバーを隠す(or縦にする)

昨今のディスプレイはワイドだと思うのでタスクバーをとりあえず縦にしました。

## Eclipse側のツールバーを非表示にする

Eclipseのツールバーは、カスタマイズもでき色々便利なので、もったいない気もしましたが。。
デフォルトではショートカットがないので、UIから選択するか、以下のAltキー操作で切り替え。
必要なときはすぐに表示する。

Alt → W → T

※Excelのクイックアクセスツールバーみたいに、ウィンドウの上部に
ツールバーおけたらいいのにな。。どうやればできるんだろ。(´･ω･｀)
Eclipseがすっからかんなのが惜しい。

## Jeeeyulで好きなThemeを入れる

http://themes.jeeeyul.net/ からお好みで
私はデフォルトで入っているクロームを選択
※ツールバーからJeeeyulのTheme Storeを開くとその場で色々なThemeが試せるページにいけます。

## Jeeeyulを設定する

Jeeeyulの設定は以下の場所にあります
ウィンドウ > 設定 > 一般 > 外観 > Jeeeyulテーマ

General > Window Spacing > Cast Shadow→off
General > Window Spacing > Part Stack Spacing→2
General > Window Spacing > 余白→0
Parts > Active(下タブ) >  Close Button > Line Width→細
Parts > Inactive(下タブ) > Close Button > Line Width→細
Parts > Layout(下タブ) > Border Radius→0(ここはタブの丸みなのでお好みで)
Parts > Layout(下タブ) > Tab Item Paddings→3(0だとタブのアイコンなどが潰れるので。。)
Parts > Layout(下タブ) > Content Paddings→0
Parts > Layout(下タブ) > Tab Spacing→-1
Parts > Layout(下タブ) > Part Icon,～→0

保存(or適用)するとぴっちりします
この設定はエクスポートできるようなので次の環境のために保存

## Eclipse Color Theme

あとは好きなColor Themeをいれてください

## もしもVirtualBoxを使っているのなら

開発環境が仮想マシンで配布されているところも多いと思いますので。

- フルスクリーンモードで表示する
- Guest Additionsをインストールする(フルスクリーンにしてもシームレスに動かせます)
- 仮想マシンOS上のタスクバーを縦に

…あたりでしょうか。
Guest AdditionsはOSによっては一部エラーが発生することもあるので、
うまくいかない時はGoogle先生に聞くと一発で教えてくれることが多いです。
RaspberryPiでP2P匿名掲示板『新月(朔)』のゲートウェイを立てる方法


P2P匿名掲示板「新月」に接続するためのノードをRaspberryPiで立てたときの手順を
備忘録として残しておきます。
セキュリティの設定とかは飛してるので各自調べてやってください。

#新月ってなに？
みちづれ規制も無く、鯖落ち(サーバーダウン)も無く、画像投稿もできる[P2P](https://ja.wikipedia.org/wiki/Peer_to_Peer)による匿名掲示板。
自分でゲートウェイ(ノード)を立てれば、荒らし投稿の削除やフィルターの適用などが管理できるため、
今回は、RaspberryPiと新月の1実装である[朔](https://github.com/shingetsu/saku)で自分専用新月ゲートウェイを立てた。
詳しくは下記リンクなどを参照
[Wikipedia 「新月 (掲示板)」](https://ja.wikipedia.org/wiki/%E6%96%B0%E6%9C%88_%28%E6%8E%B2%E7%A4%BA%E6%9D%BF%29)
[公式サイト](http://shingetsu.info/)

#手順
##RaspberryPiのセットアップ
- 公式サイトからRaspbian Jessie Liteのイメージをダウンロードし、SDカードに書き込む(実際の手順は[RaspberryPi公式サイト](https://www.raspberrypi.org/documentation/installation/installing-images/README.md)参照)。
- SDカードをRaspberryPiにセットし、電源を接続する。
- 下記のコマンドを順次実行

```bash
$ sudo raspi-config
Advanced options → Updateを実行
再起動後
$ sudo raspi-config
Expand filesystemでSDカードの全容量を仕様できるようファイルシステムを拡張
Internationalisation Options内で次を設定
- Change Localeでja_JP.UTF-8 UTF-8を選択→OK
- Change TimezoneでAsia→Tokyoを選択→OK
- Change Keyboardで仕様しているキーボードの種類を選択→OK
Finishを選択して再起動
$ sudo apt-get update -y
$ sudo apt-get upgrade -y
$ sudo apt-get dist-upgrade -y
```
###アカウントの設定
セキュリティのため別のアカウントを作成し初期のpi:raspberryを削除する。
ここでは、rootのパスワード設定を行ない、通常用ユーザとしてユーザ名:shingetsu パス:newmoonとして進める

```bash

$ sudo passwd root
root用パスワードを入力(2回)
$ sudo adduser shingetsu -g wheel
パスワードを入力(2回)
残りの入力項目は入力せずエンターキー押下
$ sudovisudo
pi ALL=(ALL) NOPASSWD: ALL
↓
shingetsu ALL=(ALL) PASSWD: ALL
ctrl-xで保存
$ exit
作成したアカウントshingetsuでログイン
$ sudo userdel -r pi
raspberryと入力(2回)
```
##朔の実行に必要なもののインストール

```bash
$ sudo apt-get install git
$ sudo apt-get install python3 -y
$ sudo apt-get install python3-pip -y
$ sudo apt-get install libjpeg8-dev
$ pip install Pillow
```
##朔のダウンロードと設定
今回はアカウントshingetsuのホームディレクトリに朔を置き実行することにします。

```bash
$ cd ~
$ git clone https://github.com/shingetsu/saku.git
$ cd saku/file/
$ nano saku.ini

下記のように設定ファイルの内容を変更

[Network]
port: 8000
dat_port: 8001
max_connection: 20

[Gateway]
visitor: ^192\.168\.
admin: ^192\.168\.
rss_range: 259200
top_recent_range: 259200
recent_range: 2678400
record_limit: 2048
enable_2ch: yes

[Application Thread]
save_record: 0
get_range: 0
sync_range: 0
page_size: 50
force_thumbnail: no

ctrl-xで保存
```
##ポートの開放と朔の実行
ルーターの設定でRaspberryPiのTCP 8000番ポートを開放してください。
設定方法はルーターによって違うのでググレ!

```bash
下記のコマンドで朔を実行
$ python3 ~/saku/saku.py -v
ローカル内のPCからRaspberryPiの8000番ポートへブラウザでアクセスすると、
新月の掲示板を閲覧できます。
```
*Let's Enjoy! Anonymous BBS*
swift xcode7でempty Applicationから作成する

swift xcode7でempty Applicationから作成する方法を記載

1.File > New > Project から「Single View Application」を選ぶ

2.ナビゲータエリアから「Main.storyboard」「LaunchScreen.storyboard」を削除する

3.ナビゲータエリアからプロジェクト名を選択して　
General > Deployment info のMain interfaceを空にする
（この時、DeviceにiPadが設定されているとからにできない？ぽいので注意。一旦、iphoneにすると空にできます。 ver 7.2.1）

4.AppDelegate.swiftのapplicationメソッドに以下のコードを追加

```swift:AppDelegate.swift
self.window = UIWindow(frame:UIScreen.mainScreen().bounds)
let viewController = ViewController()
self.window?.rootViewController = viewController
self.window?.makeKeyAndVisible()

```


以上
Bitriseで、特定のスクリプトを実行したくないとき


これで。

```
if [ -z ${CI+x} ];then
    swiftlint
fi
```
こちらに、使用可能な環境変数の一覧がありました。
http://devcenter.bitrise.io/faq/available-environment-variables/

これで、Run Script Build PhaseでSwiftLintを実行するようにしていても、CIには影響しません。
今は直っているかもしれませんが、Run Script Build PhaseのSwiftLintがCIでうまく動かなかったため、こうしています。
SwiftLintは別途ワークフローを作って `swiftlint lint --strict` を実行しています。


Happy Bitrise !
pythonでdefault encodingをutf-8にするには

```
#!/usr/bin/env python                                                                                                   
#! -*- coding: utf-8 -*-                                                                                                
import sys
reload(sys)
sys.setdefaultencoding("utf-8")

def execute(fname):
   io = open(fname)
   for l in io:
       print l


if __name__ == '__main__':
   fname = sys.argv[1]
   execute(fname)

```
PHPをやってみたいので、MySQLもやってみる

##はじめに

こちらの記事は<a href="http://qiita.com/nogson/items/c341072292549fab196d">PHPをやってみたいので、環境構築からはじめてみる</a>の続きです。

備忘録なので、足りない分や、もっとこうしたらよかったとかは、後から追加修正していきます。

##前提条件
仮想マシーンはvagrantで作成してます。

##ローカル開発環境にMySQLをインストール

####仮想マシーンにログインする。

```
$ vagrant ssh
```

####MySQLのyumリポジトリを追加する。

```
$ sudo yum -y install http://dev.mysql.com/get/mysql-community-release-el6-5.noarch.rpm
```
MySQL Community Serverのインストール

```
$ sudo yum install mysql-community-server
```

MySQL Community Serverとは
>MySQL Community Serverは、世界でもっとも普及しているオープンソース・データベースの無償ダウンロード・バージョンです。
>
>有償版はMySQL Enterprise

####インストールしたmysqlのバージョンを確認する。

```
$ mysql --version
mysql  Ver 14.14 Distrib 5.6.29, for Linux (x86_64) using  EditLine wrapper
```
####インストールされているmysqlを確認する。

```
 $ rpm -qa | grep mysql
 
//MySQLのyumリポジトリの追加で入る
mysql-community-libs-5.6.29-2.el6.x86_64
mysql-community-client-5.6.29-2.el6.x86_64
mysql-community-release-el6-5.noarch
mysql-community-common-5.6.29-2.el6.x86_64
mysql-community-libs-compat-5.6.29-2.el6.x86_64

//MySQL Community Serverのインストールで入る
mysql-community-server-5.6.29-2.el6.x86_64
```

####MySQLのステータスを確認する。

```
$ sudo service mysqld status
mysqld is stopped
```

####止まってるようなので起動したいと思います。

```
$ sudo service mysqld start
Starting mysqld:[  OK  ]
```

起動できた！

####mysqlにroot権限でログイン

```
$ sudo mysql -u root -p
//mysql [-u ユーザ名] [-p パスワード]
Enter password:
```

-pの後にパスワードを入れない場合は、別途パスワードを聞かれます。
まずは何も入力しないでEnterを押してログインします。

####パスワードを設定する

```
mysql> set password = password('password');
Query OK, 0 rows affected (0.00 sec)
```
####ログアウトしてみて、再度パスワードが設定されているか確認してみる。
```
mysql> exit
$ sudo mysql -u root -p
Enter password: password
```

設定したパスワードで、ログインできました！

####vagrant up時にmysqlが立ち上がるようにする

mysqlからログアウト後、下記コマンドを実行。

```
$ sudo chkconfig mysqld on
```

下記コマンドで同じように出力されればOK。

```
$ sudo chkconfig | grep mysql
mysqld  0:off	1:off	2:on	3:on	4:on	5:on　6:off
```

####データベースを作成する

mysqlログイン後下記コマンドを実行。セミコロンが必要なのをお忘れなく。``databases``なのをお忘れなく。

```
mysql> create database test;
```

ちゃんと作成されたかを確認する場合は下記です。<br>
先ほど作成したtestが表示されます。

```
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
+--------------------+
```

####データベースを削除する

作成したデータベースを削除するには下記のコマンドです。

```
mysql> drop database test;
```
確認します。testが消えています。

```
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
+--------------------+
```

####データベースを切り替える

```
mysql> use test
```

##終わり
次はもうちょっとデータベースを詳しく勉強しようと思います。
laravel5インストール(from Mac)

# 筆者の作業環境
OS X Yosemite 10.10.5

# composerインストール
```
$ curl -sS https://getcomposer.org/installer | php
$ mv composer.phar /usr/local/bin/composer
```

# Laravelのインストーラ
```
$ composer global require "laravel/installer=~1.1"
```
## パス通し
```
$ PATH=$PATH:~/.composer/vendor/bin
$ export PATH
```

# プロジェクト作成
プロジェクト作成ディレクトリまで移動して

```
$ laravel new [プロジェクト名]
```
か

```
$ composer create-project laravel/[プロジェクト名] --prefer-dist
```
＊作成したプロジェクトをまるっと移動しても大丈夫です
babel-polyfillとbabel-runtimeの使い分けに迷ったので調べた


2018/03/20追記
この資料はbabel-preset-envに`useBuiltIns: usage`などが入るより前の資料になります。詳しくは最新版のbabel-preset-envをご確認ください
https://github.com/babel/babel/tree/master/packages/babel-preset-env#usebuiltins

---
---

2016/11/30追記: **更に詳細に調べた続編を書きました 
=> [babel-polyfill / babel-runtime の代わりにcore-jsを直接使うのはアリかナシか](http://qiita.com/inuscript/items/1993b6b18a76fcb70dc4)**

---
---

babelの変換において、古いブラウザでもある程度動かすようにしてくれるための[babel-polyfill](https://babeljs.io/docs/usage/polyfill/)。

しかし、調べてみると[babel-plugin-transform-runtime](http://babeljs.io/docs/plugins/transform-runtime/)というのもあった。
あまりドキュメントも充実しておらず何が違うのかわからなかったのでざっくり調べた。

# babel-plugin-transform-runtime
polyfill対象に該当するコードだけが未対応なブラウザでも動くように変換される。

例えば下記のような変換がなされる

```before.js
Object.entries({"foo": "baz"})
```

```after.js
(0, _entries2.default)({
    "foo": "baz"
});
```

- 利点
  - 必要な変換のみをするので、対象になるコードが少なければ、ファイルサイズは小さくすむ
	  - 変換する部分が多すぎると、肥大化する可能性がある（はず）
  - global展開せず、それぞれの場所で閉じて処理されるので、複数エントリファイルから呼び出していても問題無い
  - global汚染をしない
- 欠点
  - 最新ブラウザでも関係無くpolyfillを噛ませたコードになるので、場合によっては実行速度が遅くなる場合がある（はず）
  - [ドキュメント](http://babeljs.io/docs/plugins/transform-runtime/)が不親切

# babel-polyfill

~~単なるlibraryとして、下記のように読み込んで利用する~~
polyfillライブラリとして、通常のコードベースとは別途読み込む（2016/11/30追記：babe-importの読み込みと、コードベースを同時に行う事は推奨されない方法でした。誤解を生む書き方だったので、サンプルコードと説明を訂正しました）

```js
import "babel-polyfill"
```

```js
Object.entries({"foo": "baz"})
```

これで、core.jsをベースとしたpolyfillが使う・使わないにかかわらず全て読み込まれる。

- 利点
  - polyfillナシで対応がされている最新ブラウザにおいて、ブラウザネイティブが即時に利用されるので、動作が比較的早くなる（はず）
  - polyfillの対象になるコードを大量に含むような場合は、ファイルサイズが`transform-runtime`よりも縮む（はず）
  - [ドキュメント](http://babeljs.io/docs/usage/polyfill/)がそれなりにある
- 欠点
  - ファイルサイズが大きくなる
      - [core.min.js](https://github.com/zloirock/core-js/blob/master/client/core.min.js) を見ると77KB程度？
  - 複数のファイルから読み込むような環境だとエラーになる（後述）
      - ＝ entryファイルが一つだけになる場合でないと扱いづらい
  - polyfillの宿命だが、global汚染が発生する

### 問題点：複数のファイルから読み込むような環境だとエラーになる

たとえば`script1.js`、`script2.js`の２つでそれぞれbabel-polyfillを読んでいるとする

```html
<!-- どっちも import "babel-polyfill" しているとすると・・・ -->
<script type="text/javascript" src="./script1.js">
</script>
<script type="text/javascript" src="./script2.js">
</script>
```

こんなエラーが出る。

```
Uncaught Error: only one instance of babel-polyfill is allowed
```

## どう使い分ければ？
ざっくりこんな分けでいいと思われる

- 複数のエントリポイントが存在するなら
  - babel-plugin-transform-runtime
- SPAみたいな環境が用意できるなら
  - babel-polyfill

もうちょっと別な要因も気にするなら、こんな観点もありうる

- polyfill利用がすごく少ない場合なら
  - babel-plugin-transform-runtime
- polyfillを利用している箇所がすごく多いなら
  - babel-polyfill or core.jsを直接読み込んで利用する
- コードの実行対象が、だいたい最新ブラウザなら
  - babel-polyfill
- コードの実行対象が、だいたいレガシーブラウザなら
  - babel-plugin-transform-runtime
ズンドコキヨシをフォントで

#ズンドコキヨシをフォントで実現

とりあえず実働サンプルを見てください。 

http://wakufactory.jp/densho/font/glyphs/zundoko.html

ソースを見てもらうとわかるとおり、 JSで加工するようなことは一切してません。

#使い方

Webフォントとして使うWoffフォント [zundokokiyoshi-Regular.woff] (http://wakufactory.jp/densho/font/glyphs/zundokokiyoshi-Regular.woff) をダウンロードします。

Webフォントの指定。

```lang:css
@font-face {
  font-family: 'zundoko';
  src: url('zundokokiyoshi-Regular.woff') format('woff');
  font-weight:400 ;
}
```

適用するところに当てるスタイル。

```lang:css
.zundoko {
	font-family:zundoko,sans-serif ;
	-webkit-font-feature-settings: "ccmp" 1 ;
	font-feature-settings: "ccmp" 1 ;
}
```

これで「ズンズンズンズンドコ」と書いた部分が、自動的に「キ・ヨ・シ! 」と表示されるようになります。

#仕組み

Opentypeのフォントフィーチャーを利用しています。特定の文字の組み合わせを別の字体で表示する合字機能を使って、「ズンズンズンズンドコ」で特定の文字「キ・ヨ・シ! 」を表示する仕組みです。実は「キ・ヨ・シ! 」は一つの文字です。通常の文字はカタカナのグリフのみ持っています。

合字機能は、ブラウザによって自動的に動作しますが、 Chromeでは ```-webkit-font-feature-settings: "ccmp" 1 ;```　の指定が必要になります。

#作成環境

このような機能を持ったフォントを作ることのできるフォントエディタ、[Glyphs](https://glyphsapp.com/)で作成しました。

カナグリフのベースは、Adobeの[SoureceHanSansJPフォント](https://blogs.adobe.com/creativestation/cjk_font)から、SIL Open Font Licenseに基づいて利用しています。
エディタ

昔はhidemaruだったのだが、あの
「未だに送金してません」
というのに、気が引けて、vimに移行した。

最近githubを始めたので、vscodeがお気に入りである。
gitが簡単になるのがうれしい。また、cntl+shift+pでいろいろ
できるのがなかなかいい感じである。

まあ、emacsもきっといいんだろうけどちょっと手がでなかった。
eclipseとvisual sutudioはちょと使うには重すぎる。

また、IPythonもnotebookでなくqtconsoleというのがwindowsで使えるのに
感激した。
あと、一年後はどんなエディタにしているんでしょうねえ
node業界できっとまたすげーのが出てくるような気もする
Actionの結果でViewBagに詰めるようなことをしたい。

TestアクションのようなメソッドがJson形式で結果を返す場合にはViewBagにデータを詰めても値がセットされていなかった。下記のような疑似コードで、どうやって値を返すべきか悩んだのでメモ書き。

```csharp
    public ActionResult Test()
    {
        var ret = GetAll();
        if( ret == 0 ) {
            ViewBag.Message = "データなし";
            return this.Json(null , JsonRequestBehavior.AllowGet);
        } 
        return this.Json(ret, JsonRequestBehavior.AllowGet);
    }
```

```js
 $.ajax({
    type: 'get',
    url: '↑のアクション'
  })
  .done(function(data) {
     ViewBag.Messageがあればエラーをだす。
  });
```

結局のところViewメソッドの呼び出しがないので、cshtmlでは画面描画更新が走っていないはず。つまりViewBagで参照しようとしてもデータが設定されていない。

Json形式で返すなら、全部Jsonで返すのが手っ取り早いみたい。
結局、こんな感じに変更した。
※Jsonメソッドに渡す際に、匿名クラスで実装して、プロパティを増やす方法。

```csharp
    public ActionResult Test()
    {
        var ret = GetAll();
        if( ret == 0 ) {
            return this.Json(new{ message="データなし", data = "" } , JsonRequestBehavior.AllowGet);
        } 
            return this.Json(new{ message="", data = ret } , JsonRequestBehavior.AllowGet);
    }
```

```js
 $.ajax({
    type: 'get',
    url: '↑のアクション'
  })
  .done(function(data) {
     if(data.message !== "") {
        alert(data.message); // ここでサーバでメッセージを出す。
        retrun false;
     }
     var resData = data.data; // もともと返していたJson形式のデータ
     ～省略～
  });
```

参考サイト
http://stackoverflow.com/questions/12642143/mvc-use-c-sharp-to-fill-viewbag-with-json-action-result