OmniAICreator/Qiita-1.07M huggingface dataset:
PHP-FPMに環境変数を渡す

PHPを実行する環境として、FPMも有用です。ただし、FPM内から環境変数を参照するには、いくつもの壁が立ちはだかっています。

# 環境変数の使い方
データベースのアクセスキーやAPIのキーなどのような、Gitに残すのが適当でない情報や、データベースサーバの位置や環境設定の切り替え用のフラグなど、環境ごとに変更が必要な情報は、環境変数に入れておいてアクセスする、というのがサーバサイドでの定石のようになっています。

そういうわけで、システム側で環境変数を用意してPHPから読み取らせようとしたのですが、見事に失敗してしまいました。

# PHP-FPMとは
Webサーバで動的なページを供給しようとする場合、いくつかの手段があります。

0. Webサーバから別プロセスを呼び出す
1. Webサーバにプログラムを組み込む
2. 動的なページを処理するアプリケーションサーバを用意して、Webサーバがそちらに投げる

いちばん最初のがもともとのCGIですが、これではプロセスの生成コストがかさんでしまうので、高速化を追求する中では下火となっていきました。そして、PHPでは2番めのように、Apacheに`mod_php`を追加して動かす、という形態もよく取られます。

ただ、ご存知のようにApacheへPHPを組み込むと、両者がからみ合って動作設定が複雑化する、片方だけ取り替えることができないなど、密結合にしたことによる問題が生じてきます。ということで、「アプリだけ動くサーバ⇔フロントエンドのHTTPサーバ」という2つに分ける方法も取られるようになってきました。

RailsなどRuby系でよく使われるUnicornやNode.jsのように、アプリケーションサーバ自体がHTTPで結果を返してももちろん構わないのですが、バックエンドアプリ用に開発されたFastCGIという専用のプロトコルもあります。そして、FastCGIで結果を返すPHP用のアプリケーションサーバ（PHP純正）がPHP-FPMです。

# 第一の壁…FPM自体
まずは、PHP-FPMのマニュアルを確認してみましたが、その中に[`clear_env`という項目](http://php.net/manual/ja/install.fpm.configuration.php#clear-env)がありました。PHP 5.6以上や、PHP 5.4/5.5系でもリビジョンによっては、特に設定しないと環境変数がクリアされてしまうようです。

選択肢としては、「同じPHP-FPMの設定ファイルで環境変数も設定する」という方法と、「`clear_env = false`として、外からの環境変数を通す」という2つの手段があります。ここで設定するほうが楽かもしれませんが、あとあとcronなどFPMを経由しないでPHPを実行する際に同じ値を使えなくて煩雑になる、ということを考えて、`clear_env = false`とすることで、第一の壁を外すことにしました（後述の事情により、むやみやたらな環境変数が来る心配はありません）。

# 第二の壁…`systemd`
Webサーバとして動かすには、FPMも常駐が必要なので、ふつうは何かしらのデーモン管理システムから起動することになります。そういうわけで、たとえばRHEL7系列であれば`systemd`経由で動かすことになるのですが、**こちらも環境変数をクリアします**。

もちろん、「第三者が適当に設定した環境変数で動作が影響すべきでない」ということを考えれば、その動作は適切なのですが、今回は「あえて環境変数を設定している」ので、それは通してほしいものです。

で、調べてみると、`EnvironmentFile`として`NAME=val`形式の行を連ねたファイルを指定できるということだったので、ここで指定することでPHP-FPMにも環境変数が伝わるようにしておきます。そして、きちんと書いておけば同じファイルをシェルスクリプトとして読むこともできますので、シェルスクリプトでその設定ファイルを`source`して`export`すれば、1ファイルの設定でFPMにもシェルにも同じ環境変数を設定可能です。

# 第2.5の壁…PHP自体
順序としてはいちばん手前に来る壁のはずなのですが、これは迂回できるので最後に回しました。

これだけ設定して環境変数がPHP-FPMから見えるようになっても、`$_ENV`に値が入らないことがあります。`php.ini`の設定に[`variables_order`](http://php.net/manual/ja/ini.core.php#ini.variables-order)というのがあって、よく`GPCS`と、`$_ENV`を生成しないような設定となっているのです。

設定を変更してももちろん構わないのですが、「警告」にあるように、FastCGI環境では`$_SERVER`にも環境変数が設定されるようになっていますので、確実にFPMで実行するのであれば`$_SERVER`から取ってしまうことができます。また、`getenv()`関数で取得しても構いません。
知っておきたいデザインパターン 4.ファクトリパターン

こんにちは、@Im0_3です。LIGアドベントカレンダーの16日目です！

デザインパターンの第４回です。

過去の記事はこちらからご覧ください。
[知っておきたいデザインパターン 1.モジュールパターン](http://qiita.com/Im0_3/items/3d46f900aa4d4c5c3cde)
[知っておきたいデザインパターン 2.ファサードパターン](http://qiita.com/Im0_3/items/0543c9145666d49f36d8)
[知っておきたいデザインパターン 3.シングルトンパターン](http://qiita.com/Im0_3/items/d3e2ee9c86c6bf633aa0)

今回はファクトリパターンについてです。

# ファクトリパターンとは
Factoryとは工場という意味ですね。この工場はオブジェクトの作成をする工場です。
このパターンを使うことでオブジェクトの作成をシンプルにしてくれます。
そしてオブジェクトを作るときには、文字列を渡してそれに合わせたオブジェクトを返してくれます。

# 実践ファクトリパターン

今回はビール工場に例をファクトリパターンを実装してみます。

```js
//[1] AleコンストラクタとLagerコンストラクタを定義
function Ale( option ) {
    this.style = option.style || "Pale ale";
    this.pint = option.pint || 50
}

function Lager( option ) {
    this.style = option.style || "Pilsner";
    this.pint = option.pint || 50
}

//インスタンス生成のためのコンストラクタ
function BeerFactory() {}
BeerFactory.prototype.beerClass = Ale;

//[2]beerTypeによって生成するインスタンスを決め、オブジェクトを返す。
BeerFactory.prototype.brewBeer = function( option ) {
    if( option.beerType === 'ale' ) {
        this.beerClass = Ale;
    } else {
        this.beerClass = Lager;
    }
    return new this.beerClass(option);
};

//BeerFactoryインスタンスを生成
var beerFactory = new BeerFactory();


//brewBeerメソッドでインスタンスを生成
var ale = beerFactory.brewBeer( {
    beerType: 'ale'
});

console.log( ale instanceof Ale ); //console.log
console.log( ale ); //style:"Pale ale", pint:50

```

まずこの工場ではエールとラガーの２種類のビールを製造しています。そのため、Aleコンストラクタと、Lagerコンストラクタを用意しました。[1]

次に工場に発注書(option)を渡すとビールを製造して商品を送ってくれるようにします。

beerFactoryにbrewBeerというメソッドを作り、引数にオプションを渡します。オプションに書かれているbeerTypeによってどちらのビールを作るか判断して、新しいインスタンスが生成されます。[2]


# ファクトリパターンのメリット
このようにファクトリメソッドを使うことで、オブジェクトの生成を一箇所にまとめることができるため管理、メンテナンスがしやすくなります。また内部の構造を意識せずに使用ができるため、オブジェクトやコンポーネントの設定がかなり複雑な場合や、状況に応じて異なる種類のオブジェクトのインスタンスを簡単に作成したい場合に役に立ちます。

明日は@zuyaさんです！
STF (SmartphoneTestFarm) 使ってみた+UIにボタンを追加する

この記事は [ACCESS Advent Calendar 2015](http://qiita.com/advent-calendar/2015/access) 16日目の記事です。

# 概要

js/nodeをほぼ触ったことがない人がリモートワークでAndroidガラホ（feature phone）をテストするために [STF](http://openstf.io/index.html) を改造する話です。
具体的には、ガラホに特徴的な物理キー（十字キーの左右に4つくらいついてるメニューボタンとか何だとか）を入力できるように、STFのUIに追加します。

# 環境

- MacbookPro (OSX 10.9.5/10.10.5)
 - homebrew, ADB, npm インストール済み
- USBハブ, USB-microUSBケーブル
- Android端末

# 準備

[Github](https://github.com/openstf/stf) のRequirementsを見て、
`brew install rethinkdb graphicsmagick zeromq protobuf yasm pkg-config`
する。

標準のSTFを使いたいだけなら
`npm install -g stf`
でOK。

今回はボタンを追加したかったので、git cloneした。

# 改造

ここに追加することにする。
ボタンを増やしたときに見た目がイマイチとかは考慮しない。

![Screen Shot 2015-12-02 at 15.58.43.png](https://qiita-image-store.s3.amazonaws.com/0/28721/47ecc6c0-4022-e3d9-d270-88502ff6c6e2.png)

編集するのは以下のファイル。

- res/app/control-panes/advanced/input/input.jade
- res/common/lang/translations/stf.ja.json

## input.jade

```input.jade
(前略)
button(tooltip='{{ "F2"  | translate }}', ng-click='press("f2")').btn.btn-primary.btn-xs
  i.fa  SK2
(後略)
```
**tooltip**
ボタンにカーソルを乗せたときに出てくる吹き出しに何を出すか。translateは後述のjsonに日本語用語を登録しておくと言語設定によって切り替える…とかだと思われる。
なので `| translate` 部分はなくてもOK。

**ng-click='press()'**
ボタンをクリックしたときに何をするかを書くところ（…多分）。
http://developer.android.com/reference/android/view/KeyEvent.html これでKeyCodeを確認して、KEYCODE_HOGEだったら"hoge"と指定する。
※ `npm install` した後なら `/node_modules/adbkit/lib/adb/keycode.js` があって、ずらっとKeyCodeが書いてあるのだが、もしかするとここに記載があるものしか使えないのかもしれない。

**i.fa**
ボタンの見た目を指定するところ。アイコン（favicon？）がある場合は `i.fa.fa-camera` とかなってたけど、文字列でもいけるようなのでそうしました。

**D-Pad**
master では 2015/12現在、D-Padのボタン（上記画像の水色のボタン群）が非表示になっている。

```
//h6 D-pad
//table.special-keys-dpad-buttons
```
ここの"//"を削除すると表示されるようになる。

## stf.ja.json

```stf.ja.json
(前略) "F2":"えふつー", (後略)
```
前述のtooltipで英語/日本語を切り替えたいときにjsonに追加する。
（今回はあまり必要なかったですね）
改行がないため、originで更新された時にコンフリクトする。どうしてもという時以外はいじらないほうがいいかも。

# ビルド

Github README Buildingを見ながら

```
npm install
npm link
```

これだけ。
※自分の場合npmとnodeの相性が悪かったのか（バージョンは古くなかったのだが…）、一度失敗してnpm/nodeを再インストールしたりした。

# 起動

Github README Runningを見ながら
手元で試すなら端末をつないだ状態で

```
rethinkdb
stf local #別タブ（別ウィンドウ）で実行
```

ブラウザから http://localhost:7100 にアクセスすればOK。
他のPCからも使えるようにするのは
`stf local --public-ip <your_internal_network_ip_here>`
ですが、これは環境によりそうなので省略。
（OSXだったら[System Preferences]>[Sharing]>[Computer Name]とか？）

# 終わりに・感想

こんな感じになります。

![Screen Shot 2015-12-02 at 16.04.05.png](https://qiita-image-store.s3.amazonaws.com/0/28721/bbff5796-041d-1f6f-5c4f-b30e98400332.png)

適当な改造だったけど動いてよかったです！（多分よくない）

**心残り**

- 実は簡単にボタンを足せるかもしれない
- もうちょっと見た目をどうにかしたい

* * *

明日は @kumabook さんの「簡単なEmacs拡張を作ってみたよ」です！
2.3. ３角形面を描く

3Dの基本的な知識を理解したくて、『３次元CGの基礎と応用［新訂版］（ http://goo.gl/GKoQ4y ）』という書籍を購入しました。薄くて読みやすそうな本なのですがサンプルソースがないので、勉強がてらサンプルを作りながら読み進めようと思います。誰でもすぐに追試ができるよう、HTML + Javascriptでサンプルを作っていきます。

完全なサンプルはこちら
https://github.com/nakaken0629/3dstudy

# 2.3. ３角形面を描く

一番基本的なポリゴンである３角形面を、2.1.で使った点を描く処理を使って描く処理です。2.2.で使ったブレゼンハムのアルゴリズムを使う方法もあるのですが、それはそれなりに後で置き換えられるだろうということで、今回は実数が出てくる割り算を使った素朴な処理で実装しています。実数が絡む誤差のせいか、描画されたポリゴンは少し透明な場所も出ています。

![session2_3.png](https://qiita-image-store.s3.amazonaws.com/0/75307/af270858-ef30-ed3e-738f-1cdfbb0a6d84.png "session2_3.png")

# サンプルコード

```js:session2_3.htmlより
/* 共通処理 */

var canvas;
var ctx;

window.onload = function() {
    canvas = document.getElementById("myCanvas");
    ctx = canvas.getContext("2d");
    main();
};

var createRgb = function(red, green, blue) {
    return "#"
        + ("0" + red.toString(16)).substr(-2)
        + ("0" + green.toString(16)).substr(-2)
        + ("0" + blue.toString(16)).substr(-2)
    ;
};

var getRandomInt = function(min, max) {
      return Math.floor(Math.random() * (max - min + 1)) + min;
};

/* 個別処理 */

var main = function() {
    for(var i = 0; i < 5; i++) {
        x1 = getRandomInt(0, 319);
        y1 = getRandomInt(0, 199);
        x2 = getRandomInt(0, 319);
        y2 = getRandomInt(0, 199);
        x3 = getRandomInt(0, 319);
        y3 = getRandomInt(0, 199);
        red = getRandomInt(0, 255);
        green = getRandomInt(0, 255);
        blue = getRandomInt(0, 255);
        fillTriangle(x1, y1, x2, y2, x3, y3, createRgb(red, green, blue));
    }
};

var pset = function(x, y, rgb) {
    /* 1pxでは見づらいため、2pxとしている */
    ctx.fillStyle = rgb;
    ctx.fillRect(x * 2, y * 2, 2, 2);
};

var fillTriangle = function(x1, y1, x2, y2, x3, y3, rgb) {
    /* 素朴なアルゴリズム */
    var xmin = Math.min(x1, x2, x3);
    var ymin = Math.min(y1, y2, y3);
    var xmax = Math.max(x2, x2, x3);
    var ymax = Math.max(y1, y2, y3);

    for(var y = ymin; y <= ymax; y++) {
        /* y軸方向にスキャンする */
        var xl = null;  /* x left */
        var xr = null;  /* x right */
        var pairs = [[x1, y1, x2, y2], [x2, y2, x3, y3], [x3, y3, x1, y1]];
        for(var i = 0; i < pairs.length; i++) {
            /* ３本の直線とスキャンラインの交点を求める */
            var pair = pairs[i];
            var _x1 = pair[0];
            var _y1 = pair[1];
            var _x2 = pair[2];
            var _y2 = pair[3];
            var x;
            if(_x1 == _x2) {
                /* _x1と_x2が等しい時は水平な線分になるので、無視する */
                continue;
            }
            if(y < _y1 && y < _y2 || y > _y1 && y > _y2) {
                /* スキャンラインが線分の範囲外の時は、無視する */
                continue;
            }
            var x = (y - _y1) * (_x2 - _x1) / (_y2 - _y1) + _x1;
            if(xl == null || xl > x) {
                xl = x;
            }
            if(xr == null || xr < x) {
                xr = x;
            }
        }
        for(x = xl; x < xr; x++) {
            pset(x, y, rgb);
        }
    }
};            
```
【vte.cx応用】15. トランザクション処理と採番処理

今日はトランザクション処理と採番の実行方法について説明します。
最初から説教じみた話になるので覚悟して読んでください。

## 補償トランザクションの悪夢

トランザクション処理が何のためにあるのかといえば、それは正しい情報を管理するためです。
トランザクションコミットで「正しい情報」、ロールバックで「正しくないか、まだ受け付けられていない情報」とすることで常に整合性が保たれた状態になります。

MongoDBやCassandraなど多くのKVSではACIDトランザクションをサポートしていません。使い勝手の良さから、これらを利用して業務アプリケーションを構築している事例もよく見かけますが、大抵はトランザクション処理で嵌っているようです。

そして、自力で解決しようとしてさらに酷い状態に陥っているのも見かけます。いわゆる補償トランザクションというやつです。

ですが、トランザクション処理を甘くみてはいけません。私も数年前に酷い経験をしました。

まず、[補償トランザクションの悪夢](http://blog.virtual-tech.net/2009/09/blog-post.html)を読んでみてください。

読みましたか？

ACIDトランザクションを採用しないで補償トランザクションなどで解決しようとするのは、少々腕に自信があるエンジニアに限って陥りがちな罠なのです。
トランザクションを理解しているがゆえに運用を甘く見てしまうのです。
ブログに書いたように、時間の無駄であり、周りを不幸にします。

私の師である中島氏の言葉を借りれば、

>「クラウドの名の下に、既に確立された現行のシステム作りのノウハウをスクラップにして、またまた現場のシステム造りが混乱するのではないかという心配です。努力の割には、余り付加価値を生まない新しいお作法作りや置き換えに、優秀で貴重な頭脳や時間を浪費してしまうのではないかという危惧です。」

といったところでしょうか。

業務アプリケーションを作る上ではACIDトランザクションは必須だと考えてください。
ちゃんとACIDトランザクションをサポートしているミドルウェアを使いましょう。

## トランザクションスクリプトパターンの導入

では、ACIDトランザクションさえサポートしていればいいのかというと、それでもまだ不十分だと思います。

メインフレームやDBMS、JDBCなどで使われてきた、commit/rollbackに代表されるコード埋め込み型のトランザクション管理は元々問題あるとされてきました。

それは、commitやrollbackなどの記述漏れに起因する不具合の発見に苦労するからです。

>ソースを全部引っ張り出して「抜け」を探すことになる。「抜け」とは、開始点だけあるような処理、例えば、SELECT FOR UPDATEだけ実行されていてcommmit/rollbackされてない箇所のこと。他人のソースをひっくり返してロジックを追う作業は本当につらい。[ぶいてく](http://blog.virtual-tech.net/2008/05/ec.html)

そこで、APIの入り口と出口にトランザクションポイントを置くトランザクションスクリプトというデザインパターンで処理する方法を考えます。要は、API内部の実行が全部成功すればcommitとし、失敗すればrollbackとします。

これはサービスの最小単位がAtomicとなり、分かりやすいパターンです。

## vte.cxにおけるトランザクション処理

vte.cxでは、Feed単位のAtomicトランザクション(分離レベル：REPEATABLE READ)、かつ、Entry単位のバージョン比較(分離レベル：SNAPSHOT ISOLATION)をサポートしています。

![transaction.png](https://qiita-image-store.s3.amazonaws.com/0/17472/8711e956-3e4a-c1cc-36f8-6137a9e80d39.png)

### Feed単位のAtomicトランザクション

トランザクションスクリプトパターンにより、Feedに含まれるEntryは1トランザクションで実行されます。

例えば、Feedに在庫と受注の２つのEntryを入れることで、在庫引き当てと受注登録を１つのトランザクションとして実行させることができます。

詳しくは、[トランザクション処理](http://reflexworks.jp/documentation.html#taggingservice.html#R6)を参照してください。

### Entry単位のバージョン比較

Feedに含まれるEntryにはリビジョン番号があります。
FeedをまとめてPUT更新するときに元のリビジョンと比較することで更新できるかどうかをチェックします。元のリビジョンが異なれば誰かによって既に更新されていることになりますので楽観的排他エラーになります。

これは上記のFeed単位のAtomicトランザクションと組み合わせて使うことができます。
つまり、Entryのどれか一つでも楽観的排他エラーになるとFeed全体の更新がロールバックされます。

## 採番処理について

vte.cxでは採番のためのAPIを用意しています。
採番もACIDトランザクションがないと実装が難しい機能です。
Writeロックを採用しており、FeedのPUT更新を使うより高速に取得できます。

PUT /{任意のURI}?_allocids={採番数} で任意のURIごとに指定された採番数だけ番号を採番します。

その他、setidsやaddids、rangeidsなどのAPIがあります。

詳しくは、[採番と採番カウンタ](https://vte.cx/documentation.html#index06)を参照してください。

## 採番処理とFeed更新の組み合わせ

採番をした値をキーにして登録したいことがよくあります。

その場合は、Entryに採番した値をセットしてからFeed更新することになります。
もし、Feed更新でエラーになってロールバックしても採番したキーは元には戻りません。
その場合、値を捨てて構わないのであればそのままでよいし、歯抜けをなくしたいのであればaddids()でマイナスの採番をすればOKです。

ちなみに、POST登録でKeyを指定しなければユニークな番号が自動で振られます。（自動採番）

詳しくは、[Entry登録](http://reflexworks.jp/documentation.html#taggingservice.html#P1)を参照してください。

本日はこれで終わりです。
明日はセキュリティについて説明します。
それでは。
NSUserDefaultsの代わりにRealmを使ってみると良いかもしれない

# `NSUserDefaults`の代わりにRealmを使ってみると良いかもしれない
iOSアプリ内に何らかの設定値を保存する場合、基本的に`NSUserDefaults`に保存しているかと思います。

ただし`NSUserDefaults`は、`[String:AnyObject]`でアクセスしなければならず、Swiftでは結構扱いにくいです（ラッパークラスをうまく設計できていれば問題は起きないのかもしれませんが）。

それから色々な場所から色々なkeyで値が保存されるため、**気がついたらどこに何が入っているか分からない**ということにも起きがちちゃないのではないでしょうか。

いろいろ考えてみたのですが、Realmを使うと"アプリの構造"を扱いやすくなるのではないのか、と思いました。[こちら](http://qiita.com/shu223/items/0ad51b5e9771c2189bd2)の記事でも同様のことが述べられています。

ということで[RealmSwift](https://realm.io/jp/docs/swift/latest/)で[簡単なサンプル](https://github.com/mnat44/RealmAppSatateExample)を書いてみました。

## サンプルコード解説

シンプルにユーザーの状態（ゲスト状態かログイン状態か）と、起動した日時を記録しようと思います。

サンプルではユーザーの状態を`enum`で定義しています。

```AppPreferences.swift
enum UserState: String {
    case Guest, Login
}
```

Realmでは`enum`はプロパティとして扱えないので、`enum`の`rawValue`で`String`にしてプロパティに代入します。
そして`Object`を継承して`AppState`を定義します。

```AppPreferences.swift
class AppState: Object {
    dynamic var state: String = UserState.Guest.rawValue
    dynamic var launchDateTime: NSDate = NSDate()
}
```

以下のようなSingletonのRealmのラッパークラスを作成します。

```AppPreferences.swift
final class AppStateManager {
    
    static let sharedInstance = AppStateManager()
    private init() {}

    private var realm: Realm {
        guard let realm = try? Realm() else {
            fatalError()
        }
        return realm
    }
    
    func update(userState: UserState ,launchDateTime: NSDate) {
        
        let state = AppState()
        state.state = userState.rawValue
        state.launchDateTime = launchDateTime
        
        do {
            try self.realm.write({ [weak self] () -> Void in
                
                guard let stateManager = self else {
                    return
                }

                stateManager.realm.add(state)
                })
        } catch {
            print("could not write")
        }
    }
}
```

こんな感じでアプリ起動時にRealmへ保存を行います。

```AppDelegate.swift
    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        AppStateManager.sharedInstance.update(UserState.Guest, launchDateTime: NSDate())
        return true
    }
```


`AppDelegate`の`optional func application(_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [NSObject : AnyObject]?) -> Bool`で呼び出すことを想定しています。

## まとめ
UserDefaultsにRealmを使ってみることについて考えてみましたが、実際に使う際には結構リスクが高位のだろうなとも感じました。リスクを考慮した上で、許容できるのであれば、個人的には良い解決方法になるのではないかなと思います。

以下に個人的に感じたメリット、デメリットについてまとめてみました。

### メリット
* `AppState`などの状態をモデルとして定義することで、どんな情報が保存されているのかが構造化されて分かりやすい
* `NSUserDefaults`から取り出す際のキャストが不要
* [条件を指定](https://realm.io/jp/docs/swift/latest/#section-22)して保存したデータの絞り込みがしやすい

### デメリット
* Realmが1.0を迎えていない現段階ではリスクになりそう
* 既存のアプリに途中から入れることは難しそう
* マイグレーション怖い

### 補足
僕はあまりDB周りは得意ではないので、もっと色々なことがメリット、デメリット考えられるかと思うので、ご指摘いただけると嬉しいです。
Twilioとnode.jsをつかってサンタさんのメッセージを贈ろう！

こんにちは！これは<a href="http://qiita.com/advent-calendar/2015/dots_girls">dots girls Advent Calendar 2015</a>の16日目の記事です。

またまたやって来ました音楽と服と美少女をこよなく愛する関西人の<a href="http://qiita.com/supermanner">supermanner</a>です！
そろそろ冬も本番、私はオフィスが表参道付近にあるのでまちはクリスマスで色めき立ちまくってます。
恋人はサンタクロース♪背の高いサンタクロース♪

ということで、独り身で寂しい思いをしている人に、サンタさんからのメリークリスマスを送るスクリプトを書いてみました！
前々からアラート監視、通知などで使われているTwilioですが今回は全私中で勝手に流行りつつあるnode.jsで書いてみます。

# Twilioアカウントを作る
トライアルの期間が設けられているのでちゃちゃちゃっと作ってしまいましょう。
トライアル期間は、トライアルのクレジットから通話料を払ってくれるシステムになっているようです。

# express等、アプリに必要なライブラリをいれる
Twilioは、実にたくさんの言語をサポートしています。
下記はチュートリアルページです。

https://jp.twilio.com/docs/tutorials

この中に得意な言語がある方はそれで作るのがいいのではないでしょうか。
では、今回はnodeで作るので、まずは必要なお道具を揃えていきましょう。
今回の開発環境は以下のとおりです(nodebrew 0.8.1)

```
% node -v
v0.12.1
```

入れたnpm群は以下のとおりです

- express
- querystring
- twilio
- node-config

※結局テストアカウントなのでconfigいらなかったのでnode-configは使いませんでした！

# twilioを呼び出すmoduleを作る
ここまでくればあとはあとはtwilio公式のAPIドキュメントを見ながらとんとんと進めていきます。
とりあえず、twilioから電話を発信してくれるmoduleを作ってみましょう！

```twilio.js
var querystring = require('querystring');
var twilio      = require('twilio');
var express =require('express');
var router = express.Router();

// Twilio Credentials_
var accountSid = 'YOUR_SID';_
var authToken = 'YOUR_AUTH_TOKEN';
var client = twilio(accountSid, authToken);

var call = function(req, res) {
  var value = req.body;
  var tJson = JSON.parse(JSON.stringify(value));
  var message = tJson.message;
  var twiml = '<Response><Say voice="woman" language="ja-jp">' + message + '</Say></Response>';

  client.makeCall({
    to: 'トライアルでかけられる先としてphone number',
    from: 'トライアルアカウントとして登録したphone number',
    url: 'http://twimlets.com/echo?Twiml=' + querystring.escape(twiml)
  }, function(err, responseData) {
    if (err) {
      console.log(err);
      throw err;
    } else {
      res.send("Lets's call!!");
    }
  });
}

router.post('/', call);

module.exports = router;
```

app.js側でこのmoduleをexportしてuseしてあげれば準備は整いました。

# 電話をかける
ではサーバを立ち上げてみましょう。
ここは特に何もせずいつもどおりのport:3000で立ち上げました。

さて、次にPOST REQUESTを送ってあげましょう。
他にも色々やりたい方はこちらを参考にするともろもろ作れそうですね。
https://jp.twilio.com/docs/api

```
% curl -X POST  -H 'Content-Type: application/json' -d '{"message":"merry chistmas!!!"}' http://localhost:3000/twilio
```

curlでjsonをPOST!!!!
暫く待つ....

```
% POST /twilio 200 1485.567 ms - 93
```

request受理された...ｷﾀ━━━━(ﾟ∀ﾟ)━━━━!!
電話がかかってきました。

最初にトライアル版あるあるなガイダンスメッセージが流れるのでそれを聞いて適当に番号をおします。
すると、かの有名なゆっくりみたいな声で「ハロー、コンバンワ、メリークリスマス」とｗ


### テストクレデンシャルについて
こちら、テスト用ののものも用意されています。
「ツール→テストクレデンシャル」
で見ることが出来ます。テスト用はfromにする電話番号が決まっているので気を付けてください。

# はまったところ
前回に引き続き、今回も採りたて難しいことはしていないのですがハマったところが。
それはなんと<b>電話番号登録...</b>
そう、fromとtoの値をきちんとアカウント認証したものにしていたなかったのです。
本来課金してつかうtwilioの050の番号を入れていたり、自由に実家の電話番号にかけようとしたり笑
まぁそんな色々もerrをちゃんと表示してあげれば全部返してくれてるので、きちんと見ましょうってことですね。

#最後に
最近始めたnodeを書いていて(本エントリでは大したこと書いてないですが)ふんだんnginx等にお願いしている部分を自分で作り上げる感覚がすごく面白いと思いました。
また世の中には色々と面白いREST APIがあふれているので、新しい言語を学ぶときはAPIを積極的に活用していくのが良いのではないかなぁと思います！特に初心者の場合興味が先行すると飽きずに作り切れる場合が多いですしね。


最近実家に帰れていない、忙しくて電話できないというあなたも、ぜひTwilioでで長文を書いてjson投げてご両親に電話をかけてあげてください！


イタズラはいけませんよ！！！！

さて、あしたは<a href="http://qiita.com/npsamari0310">npsamari0310</a>さんがビジュアライゼーションツールTableauとデータ加工について書いて下さいます！お楽しみに！
milkcocoaを使ってチャットする

milkcocoaがIoTカテゴリになってたので自分もIoTしたかったのですが、
準備不足&知識不足で全然ムリだったので、
1年以上前に作ったmilkcocoa&enchant.jsでチャットできるサンプル置いておきます。

手抜きですみません。

## コード
githubにおいてあります。
https://github.com/kazuhei/milkcocoachat
自分がこれを作った時はmilkcocoaのバージョンがv0.2.5だったようです。
最新のv2.0.0にあげてコードも微修正しました。

## サンプル
herokuに置いてあります。
https://milkchat.herokuapp.com/

## スクショ
こんな感じでフィールド内をカーソルで移動できる他、文字を変更して会話ができます。

<img width="321" alt="スクリーンショット 2015-12-15 22.33.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/47882/d612555c-e9dd-baa8-f8d1-8b091515a71b.png">

ブラウザを複数窓開けば一人でも試せます。
<img width="1126" alt="スクリーンショット 2015-12-15 22.33.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/47882/aced2695-a45f-eb97-f855-ff14bb21702a.png">
【Slack】hubotを使って匿名チャット部屋を作る【裏掲示板】



## slackは名前が出るから本音で書きにくい

と思っている人も少ないはず。
自分の発言に責任を持たないと行けないなんて、生きづらい世の中です。

こんなことを考えたことのある人も少なくないはず。
「ああ、Slackに匿名で投稿し（て、上司の悪口を書き）たい」

残念なことに、slackには匿名で投稿できる機能はありません。
仕方ないので作ります。

## 完成したもの

誰がつぶやいたのかはわからない、匿名投稿部屋が slack にできました。

【図1】この部屋では、自分以外の人の投稿はすべて anonymous の発言になり、誰が部屋に参加しているのか、誰がつぶやいたのかはわからず匿名性が保たれます。（自分の投稿も、他の人から見るとanonymous が発言したことになっている）
![image](https://qiita-image-store.s3.amazonaws.com/0/39619/b586920b-a82f-8b64-df3b-39f680d342dd.png)



【図2】"長田さん"を名乗る大量の anonymous の出現により、カオス状態が訪れる様子。他の人の発言はすべて anonymous 一人がつぶやいたように見える。
![image](https://qiita-image-store.s3.amazonaws.com/0/39619/b739c608-cd43-942b-6feb-5db912a7301a.png)


## 実現方法
slack の room では、つぶやいた瞬間に部屋の参加者に誰がつぶやいたかどうかがバレてしまいます。
匿名投稿できる room を作る、ということは不可能なわけです。

そこで、他の人に会話の内容がばれない DirectMessage (以下DM)を使うことにしました。

slack では hubot と DM のやり取りを行うことができます。今回はそれを利用しました。

今回作成した hubot（以下 anonymous bot）に対して DM を送ると、それが匿名チャットの参加者全員に anonymous からのメッセージとして（つぶやいた人の名前を隠した状態で）ブロードキャストされます。
図で説明するとこんな感じです。

【図3】自分がつぶやいた際には anonymous bot を介して参加者に配信される。
![image](https://qiita-image-store.s3.amazonaws.com/0/39619/8e1022c1-2fef-5be9-c160-42601b699ee2.png)


あくまでも参加者は anonymous bot と DM を経由することで他の参加者と会話するので、誰がつぶやいたものなのかはバレることはありません。

## 主な機能
* 匿名つぶやき
* 匿名チャットへの参加/離脱
* 現在の参加人数の確認
* 匿名チャットへの招待

## github
ご自由にお使いください。
pull req お待ちしております。
（あとでリンクをはる）

## 苦労した点
* hubot 作るの初めて
* coffeescript初めて
* hubot の slack アダプター hubot-slack で DM の送信ができない...
    * 解決方法：http://qiita.com/kekekenta/items/0c599c549b236a77dee6


## 動かす手順
そのうちまとめます。

## 最後に
匿名でつぶやくと、真実味も増すのでおすすめです。
![image](https://qiita-image-store.s3.amazonaws.com/0/39619/3653b378-6347-16d2-82bd-524d3b083748.png)
スパース自己符号化器

スパース自己符号化器を使えば中間層のユニット数の方が多い場合でも自己符号化器で
意味のある表現を学習ができる。
chainerのサンプルコートmnistで実装するとこうなる。。。


``` py
n_units=1000
model = FunctionSet(l1=F.Linear(784, n_units),
                    l2=F.Linear(n_units, 784))

sigma0 = 0.05
beta = 0.1

def forward(x_data,y_data):
    x, t = Variable(x_data), Variable(y_data)
    y = F.sigmoid(model.l1(x))
    x_hat  = model.l2(y)
    loss = F.mean_squared_error(x_hat, t)
    A_data = np.matrix(np.repeat(1.0/batchsize,batchsize).astype(np.float32))
    A = Variable(A_data)
    y_avg = F.matmul(A,y)
    kl = sigma0 * np.log(sigma0) - sigma0 * F.sum(F.log(y_avg)) \
	      + (1-sigma0) * np.log(1-sigma0) - (1-sigma0) * F.sum(F.log(1 - y_avg))
    loss = loss + beta * kl

    return loss
```

次回mnistで検証してみよう。
underscoreコードリーディング（pluck）


underscoreに詳しくないので、勉強半分でソースコードを読む。


##利用するバージョン
[underscore.js(v1.8.3)](https://github.com/jashkenas/underscore/tree/1.8.3)


##invokeとは


###[underscorejs.orgのpluck](http://underscorejs.org/#pluck)

こんな説明。
>####_.pluck(list, propertyName) 
>A convenient version of what is perhaps the most common use-case for map: extracting a list of property values.


```javascript
var stooges = [{name: 'moe', age: 40}, {name: 'larry', age: 50}, {name: 'curly', age: 60}];
_.pluck(stooges, 'name');
=> ["moe", "larry", "curly"]
```

------------- 

mapを用いて何かをやる場合のもっともあり得るユースケース用の便利なバージョンである。
mapを用いてlistの値を抽出する

例示だとstoogeの中からnameをkeyに抽出したArrayが返ってきている



###[underscore.pluck](https://github.com/jashkenas/underscore/blob/1.8.3/underscore.js#L281)

コード的にはこのあたり。

```javascript
// Convenience version of a common use case of `map`: fetching a property.
  _.pluck = function(obj, key) {
    return _.map(obj, _.property(key));
  };

```

_.mapの中で_.property(key)に合致する値のみをreturnする。
そのため、keyにnameが入ってきた場合はnameの値のみで形成されたArrayが返却される。
MSXでコンピュータウィルスを作った時の話


この記事は25年ほど前にMSXユーザーだった私が、[MSX Advent Calendar 2015](http://www.adventar.org/calendars/920)の15日目の記事として書いたものです。
ほぼ昔話的な内容ですみません。

# MSXとの関わり

1990年頃にSONY製のMSX2+、HB-F1XVが家に来たのが始まりです(それまではPC-8801が家にあった)。最初はMSX FANの一画面プログラムを入力する程度でしたが、ほぼDATA文(=マシン語)なプログラムに衝撃を受けたのをきっかけに「Z80マシン語秘伝の書」でアセンブラを学び、バックアップ活用テクニックを愛読するような小学生でした。

近年はほぼMSXとの関わりはありませんでしたが、Yusuke Andoさんの下記のつぶやきを見かけて、いい機会と思い筆をとった次第です。

<blockquote class="twitter-tweet" lang="ja"><p lang="ja" dir="ltr">もっと人が必要な稀有なカレンダー <a href="https://twitter.com/hashtag/msxac?src=hash">#msxac</a> / “MSX Advent Calendar 2015 - Adventar” <a href="https://t.co/deFGbQEYVO">https://t.co/deFGbQEYVO</a></p>&mdash; Yusuke Ando (@yando) <a href="https://twitter.com/yando/status/674239123037655040">2015, 12月 8</a></blockquote> <script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
 
# 何を作ったの？

感染したフロッピーディスクを起動時にフロッピーディスクドライブに挿入しておくことでシステムに常駐、その後感染していないフロッピーディスクが挿入された時にそこに自己を複製し、特定の日付に起動された場合のみメッセージを表示するというコンピュータウィルスを作成しました。

# なんでそんなもの作ったの？

当時購読していたMSXマガジンのコラムに載っていた、世界初のコンピュータウィルスの話に触発されてだった記憶があります。
(MSXマガジンにはよくSFやコンピュータの歴史を語ったコラムが載っていた)

# 動作原理

(記憶ベースで書いているので、少々アバウトです)

1. 本体はフロッピーディスクのブートセクターに存在し、200バイト程度のアセンブラで書かれている。
2. 起動されるとRTCにアクセスし、日付を取得する。
3. 日付が特定のものだった場合、永久ループでメッセージを表示する。
4. 日付が特定のものでなかった場合、常駐するためにHIMEMを一定量(ブートセクター + バッファ)マイナスし、空いた領域に自分をコピーする
5. ディスク入力をフックし、ブートセクターをバッファに読み込んで感染していなかった場合のみ自分をブートセクターに書き込むルーチンを仕込む
6. 何事もなかったようにMSX-BASICを起動する

# 欠点

* (当たり前ですが)感染したフロッピーディスクから起動しないといけない
* MSX-BASIC起動時のプロンプトで表示される空きメモリ量が通常と変わるので、勘のいい人には異常を察知できる

# オチ

さて、ウィルスを作ったはいいのですが、実は当時僕のまわりにはMSXを持った友人がほぼおらず(泣)、感染を拡大させる経路がありませんでした…。その後、中学でMSXを持った友人と出会うことになるのですが、隙を見て彼のマシンを感染させるべくディスクをガッチャンガッチャンやっていたところ、本人にバレてぶん殴られ、計画は失敗に終わったのでした。
エンジニアとして働くために独学してきてよかったこと

記事の内容はこちらを参照してください。
https://mishimay.github.io/9ce09830e8693ffc9469/
<!--

この記事は [株式会社アイスタイルアドベントカレンダー](http://qiita.com/advent-calendar/2015/istyle) の14日目の記事です。

主にiOSアプリ開発を担当しています @mishimay がお送りします。
この記事では、就職してから今までの約4年間に業務時間以外で学んできてよかったなと思うことを、アプリ開発者の視点で紹介しようと思います。
ちなみに私はデザイン系の工学部出身で、趣味でiPhoneアプリの開発はしてはいましたがそれ以外のITとかエンジニアリングの知識はこの業界に入るまでほとんどなかったです。

内容はIT業界で働き始めた人、非エンジニアからエンジニアへ転職された方などが主な対象です。


# 英語
これは異論を唱える人はいないと思います。
プログラミング言語は英語ですし、AppleやGoogleが出すドキュメントは英語です。
WWDCや Google I/O は英語で行われます。
技術的なことをググる場合も、英語がわかれば体感的に10倍くらい情報に質の違いを感じます。

特にアプリ開発の場合は流行り廃りが激しいので、日本語訳を待っていると一足遅れることになってしまいます。
僕も最初は英語を読むのは苦痛でしたが、やり続けているとだんだん慣れていくものです。
苦手意識を持っている方も是非挑戦してみてはいかがでしょうか。
世界が開けると思います。

以下、英語学習に参考になったWebページを紹介します。
[英語上達完全マップ](http://homepage3.nifty.com/mutuno/)


# IPAの試験
IT全般の知識を体系的、網羅的に学ぶにはどうすればいいか？というのを前の会社で入社当時の先輩に聞いたところ、返ってきた答えが「基本情報技術者試験を受けてみては」というものでした。

IPAの試験はいくつも種類がありますが、エンジニアとしての登竜門的な存在が基本情報技術者試験です。
ITに関する知識を広く浅く学べるので、ITってどういう範囲を指すのか、どういう知識が常識として求められているのか、ということがわかると思います。
参考書がいろいろ出ていて学びやすいのも魅力です。

基本情報技術者試験に合格すればもう1レベル難しい応用情報技術者試験、さらに難しい専門的な試験へと挑戦できます。
自分の実力、興味にあった試験の勉強ができるのもいいところです。

[IPA 独立行政法人 情報処理推進機構：情報処理技術者試験](https://www.jitec.ipa.go.jp/)


# セキュリティの知識
何の開発をするにもセキュリティの知識は必要だと思いますが、セキュリティ全般を学ぶ機会はなかなかないです。

しかし一度学んでおくと、現在どんなセキュリティ攻撃が存在するのか？ どこまで対策すれば妥当と言えるのか？ を考える材料ができると思います。

アプリの開発の場合はそこまで網羅的に学ぶ必要はないかもしれないですが、暗号化の仕組みなどは汎用的な知識として知っておいて損はないはずです。

これもIPAの試験で勉強しました。
[情報セキュリティスペシャリスト試験](https://www.jitec.ipa.go.jp/1_11seido/sc.html)


# データベースの知識
主にリレーショナルデータベースについての知識です。
データベースは業務でそれなりに関わるとある程度の知識が身につくと思いますが、触れる機会がないとずっと知らないままになってしまいます。

iOS開発だと Core Data やSQLiteを使う機会がありますが、データベースの知識がないとインデックスやトランザクションの考えが理解できず、処理速度の最適化ができなかったりや思わぬバグを引き起こしてしまったりするかもしれません。

これもIPAの試験にあります。
[データベーススペシャリスト試験](https://www.jitec.ipa.go.jp/1_11seido/db.html)


# アジャイル開発の知識
「アジャイル開発」はいくつもある開発手法のうちの1つです。
歴史的に用いられてきた「ウォーターフォール型開発」と対比されることが多く、古い開発手法に対する新しい開発手法、という捉え方をされている場合が多いと思います。

将来アジャイル開発を行うことにならなくても、今どんな開発手法が盛り上げっているのか知っておくと視野が広がると思います。

こちらはとても読みやすく有名な書籍です。
入門としては最適です。
[アジャイルサムライ――達人開発者への道](http://www.amazon.co.jp/dp/B00J1XKB6K)

アジャイル開発手法にもいろいろな種類があります。
こちらはその中でも有名な「スクラム」のガイドです。
[スクラムガイド - Scrum Guides](http://www.scrumguides.org/docs/scrumguide/v1/Scrum-Guide-JA.pdf)


# 正規表現
正規表現は文字を検索するときや置換するときに知っていると非常に便利なものですが、わざわざ学ぶ機会はあまりないかもしれません。

例えば、「りんご」と「リンゴ」を両方いっぺんに「林檎」に置換したり、()の中に何の文字列が入っていても別の文字列に置き換えたり、ということができます。
どういったことができるのか一通り知っておくと、煩雑に思える作業であっても一瞬で終わらせる方法を思いつけるようになるかもしれません。

「正規表現」で探せばたくさん情報が見つかるので検索してみてください。


# デザイン
特にアプリ開発の場合はエンジニアであっても使いやすさや分かりやすさを意識して開発することになるので、いいデザインとは何か？を理解していることがいいプロダクトを生み出すことにつながります。

個人的におもしろかった書籍を挙げてみます。

製品デザインの古典とも言える本で有名です。
デザインについての普遍的な考え方を知ることができます。
[誰のためのデザイン？](http://www.amazon.co.jp/dp/478850362X)

さまざまな研究の紹介で、読み物としておもしろいです。
[インタフェースデザインの心理学 ―ウェブやアプリに新たな視点をもたらす100の指針](http://www.amazon.co.jp/dp/4873115574)

アプリは1つ1つのインタラクションの集合だという考え方は、アプリの本質ではないかと感じました。
[マイクロインタラクション ―UI/UXデザインの神が宿る細部](http://www.amazon.co.jp/dp/4873116597)


# おわりに


仕事をしていると業務で関わることは覚えていくと思うのですが、機会がないとずっと知らないままなことも結構あるのではないでしょうか。
ここでは仕事で直接的に学ぶ機会は少ないけれど、1度しっかり学んでおけばいろいろな場面で役立つような知識を書いてみました。
参考にしていただけたら光栄です。


-->
ハンズオン担当者は見た！「はじめてのIDCFクラウド」鉄板のヤマ場ベスト3

![811fccbd52c7f4e34518866187b7a4d9_s.jpg](https://qiita-image-store.s3.amazonaws.com/0/66616/94f949fd-1869-422d-6dd9-bcaec863968f.jpeg)

日本テレビ系列で昔放送されていた「はじめてのおつかい」という番組をご存知ですか？子供が、はじめておつかいに行き、勝手がわからず右往左往しながらも、おつかいを見事に達成する様子をカメラが追う番組です。
右往左往するヤマ場は水戸黄門のごとくパターン化されていて、(1)寄り道をする、(2)お母さんから頼まれた品物を間違える、(3)頼りないお兄ちゃんが泣き出す、だいたいこの3つでした（個人の感想です）。

「はじめてのIDCFクラウド」という番組があったとしたら、鉄板のヤマ場はだいたいこの3つではないでしょうか。ハンズオンセミナーをしていると、だいたいこの3つのポイントで手が挙がります。

#1つ目「なに！？クレジットカードだって…！？」
IDCFクラウドの決済手段は3つ、(1)クレジットカード、(2)銀行振込、(3)口座振替です。さくっと個人で試したいとき、また、ハンズオンセミナーでは特に当日アカウントを準備する方も多く、クレジットカード払いを選択する、という1つ目のヤマ場を迎えます。このヤマ場には以下のようなバリエーションがあります。
#### 「クレジットカード持たない主義なので。Vプリカ使えますか？」
ごめんなさい、使えないんです。
#### 「学生だから、クレジットカード持っていません」
イマドキの学生は、サーバー作っちゃうんですね…！
#### 「あの、間違えて、銀行振込選んだら、取り消しできないのですが…」
申込書が届くまで数日ステータスが変わりません。お問い合わせからご連絡ください。
#### 「クレジットカード、家にあるのですが」
堅実派も意外に多いのです。
#2つ目「え？ポートフォ・ワード？ポーとフォワード？」
IDCFクラウドは、1アカウントに1つの仮想ルーターが標準でついています。外部と通信するためのパブリックIPアドレスは、仮想ルーターに付与されているので、まず仮想ルーターに通信で必要なSSHやHTTPなどのポートを開けて（ファイアウォール設定）、さらにそのポートの通信を仮想マシンに割り振る設定をします（ポートフォワード設定）。

![ネットワークの設定.jpg](https://qiita-image-store.s3.amazonaws.com/0/66616/d54fec39-e839-0b9e-cedc-a40b3a1af886.jpeg)
引用：[サーバー初心者のためのWordPressサイト構築手順 ](http://www.slideshare.net/IDCFrontier/wordpress-42999690)
設定自体は数ステップ、ポチポチ進めればできる簡単な操作なのですが、この概念自体に慣れていないと、意外に混乱します。
#3つ目「SSHでログインできない」
これが最大のヤマ場！最初の2つはフリのようなものです。故にログインしたときの感動はひとしお…サーバー操作の序盤中の序盤にも関らず、エンディング並みの感動が待っています。
▼SSHログインを達成した者のみが目にすることができる黒い画面
![IDCフロンティア.png](https://qiita-image-store.s3.amazonaws.com/0/66616/3e3cf471-5721-c7a4-2b4b-7ff0a3d0f9ad.png)

####・ファイアウォール設定やポートフォワード設定に誤り
ポートフォワード設定自体飛ばしたり、ちょっとした抜け漏れ、タイポがあったり。
####・秘密鍵のコピー時に改行が入り、受け付けてくれない
結構多いです。
####・TeraTermでログインするときのユーザ名忘れ
ユーザ名は「root」です。私も中の人になる前は、某クラウドのもくもく会でスーパーハイスキルなMac使いのエンジニアさんを捕まえて2時間一緒に悩んだ事がある（ごめんなさい）、思い出のヤマ場です。

その他ハンズオンでは会場のネットワーク設定など、様々な原因で、SSHログインにできないケースに見舞われ、チューターはいかに短時間に原因を切り分けるか腕の見せ所となります。
「SSHログインができる」それは、素人がエンジニアの階段をひとつ登った証、勲章であります！

以上、はじめてのIDCFクラウド、鉄板のヤマ場ベスト3でした。この他にも、ここでつまづいたよ！そんな経験がありましたら、ぜひ教えてください。
iOSのアイコン生成をコマンドラインから実行

メモ

#対応範囲
http://resizeappicon.com/ などの生成ツールだと余計なものまで生成するので最低限のもののみシェルで生成→ついでに最適化

画像サイズ下記参考にさせて頂きました
http://qiita.com/Yuta/items/98b9ea2739718b9184de

ここから、アプリに入れ込むもののみ抽出
前提：iPhoneのみ対応、iOSは7,8以上

上記URLの↓のみ

>アイコン：ホーム　iOS 7/8
アイコン：ホーム　設定
アイコン：ホーム　Spotlight iOS 7/8

#Requirement
動かすには下記が必要です
[sips](http://d.hatena.ne.jp/oniloq/20121111/1352625190)：画像リサイズ
[ImageOptim](https://imageoptim.com/command-line.html)：画像最適化


#ディレクトリ構成
下記
![スクリーンショット 2015-12-15 23.10.39.jpg](https://qiita-image-store.s3.amazonaws.com/0/99683/538492cd-ed32-a161-0d51-e4e517a351d0.jpeg)

から生成後

![スクリーンショット 2015-12-15 23.09.55.jpg](https://qiita-image-store.s3.amazonaws.com/0/99683/09aa921f-6c69-1462-4126-e6fd1f01e72b.jpeg)

icon_original/ディレクトリにあるicon.pngからicon/icon-xxx.pngを生成する
シェルは下記(あまりシェルスクリプト得意じゃないので文法は参考にしないでください)

```bash:make.sh
#!/bin/sh


#define --------------#
outDestDir="icon"
originalFile="icon_original/icon.png"
originalSize=`sips -g all $originalFile|grep pixelWidth|cut -c 15-`
fileBaseName="icon"
outSuffix=".png"
array=("120" "180" "29" "58" "87" "80" "120")
arrayForOutfile=("-60@2x" "-60@3x" "-29" "-29@2x" "-29@3x" "-40@2x" "-40@3x")
arrayForIndex=()
n=0
for i in "${array[@]}"
do
    arrayForIndex[n]=$n
    n=`expr $n + 1`
done

#output Directory --------------#
if [ ! -e $outDestDir ]; then
    echo "mkdir --- $outDestDir"
    mkdir "$outDestDir"
else
    echo "dir exists -- $outDestDir"
fi

#Original size --------------#
if [ ! "$originalSize" ]; then
  echo "invalid original file"
  exit;
fi


#Make Image function --------------#
function makeDiffImage () {
    if [ ! "$1" ] || [ ! "$2" ]; then
      echo "no arg"
      exit;
    fi
    echo $1"--------"$2
    # exit;

    echo "start"

    targetSize=$1
    targetFileNamePrefix=$2
    echo "sips --resampleWidth $targetSize $originalFile --out $outDestDir/$fileBaseName$targetFileNamePrefix$outSuffix"
    sips --resampleWidth $targetSize $originalFile --out $outDestDir/$fileBaseName$targetFileNamePrefix$outSuffix
    /Applications/ImageOptim.app/Contents/MacOS/ImageOptim $outDestDir/$fileBaseName$targetFileNamePrefix$outSuffix
}

#Exec --------------#
for i in "${arrayForIndex[@]}"
do
    echo $i
    makeDiffImage ${array[$i]} ${arrayForOutfile[$i]}
done
```

以上
RaspberryPi 2でwhois

RaspberryPi2ではデフォルトでwhoisコマンドが利用できません。

パッケージをインストールすることで利用可能になります。

```
$ sudo apt-get install whois

```

[digやnslookupはこちらを参照](http://qiita.com/yubaxp/items/c9db7064d4abbb799617)
忙しい人のためのandroidMからのパーミッション


# 前書き
Hello こんにちは。
忙しい人のためにandroidMのパーミッション回りを書きます。
まとめからスタートします。より詳しく知りたかったらそれより↓を読んでください。

# まとめ
今までのパーミッションではユーザーから見た時いつどこで「その権限」が使われてるのかわからず不安だった。（それゆえに悪用もできた）
Mからはそれはよくないよね、という流れになった。（OSとしては当たり前）
デベロッパーは権限を使う前（度）にユーザーに「このパーミッション使っていいですか？」「このパーミッションは許可されていますか」と聞くことが義務となった。
ユーザーはより透明化されたパーミッションをアプリ一覧から確認して機能毎に許可不許可できるようになった。


# 今までのパーミッション
AndroidManifest.xmlに<user-permission>を書き込むことでアプリで使える権限を増やしていた。つまりユーザー目線に立ったとき
アプリを入れたい　→　このアプリはインターネット権限を使うのか　→　やめよう
といったフローでアプリの取捨選択を行っていた。
デベロッパーは余計な権限を極力使わないことでユーザーに安心感を与えていた。
しかし、これは逆もしかりで、ユーザーがよくわからないことをいいことに悪用することもできた、ということです。よくないですよね。


# では今後（M以降）は？
### デベロッパー
デベロッパーは二つの動作をすることができます。
### - 権限の要求

「<LOCATION>のパーミッションが欲しいけどいい？」といったダイアログを出す。

```java
public int requestPermissions(String[] permissions, int requestCode);
```
permissionが配列になっているのはpermissionをまとめてリクエストできるからです。（※ただし、一つのパーミッションにつき一つのダイアログが出てきます。ダイアログは現在customDialogは使えません。ちょっと不便。）
requestCodeは任意です。制御に使え、という意図でしょう。
戻り値に関しては
- 許可 (PERMISSION_GRANTED)
- 不許可(PERMISSION_DENIED)
です。

### - 権限の確認
「上のアプリ一覧で設定されたパーミッションに<LOCATION>は許可されてる？」といった問い合わせ。

```java
public int checkSelfPermission(String permission);
```
戻り値に関しては上と一緒です。

### リザルト
requestPermissionメソッドを呼び出すと、<onRequestPermissionsResult>が帰ってきます。オーバーライドしてそこで結果を受け取ります。


### ユーザー
ユーザーはアプリ一覧から権限を確認することができます。
例えば、アプリ全体から<LOCATION>を許可しているアプリは何か。また、このアプリは何のパーミッションを許可しているか、といった具合に。

# まとめ２
まだAndroidMのシェア率は0.6%です
今後増えていくだろうし、私たちも準備していきましょう。
Electronで背景の透過ができなかった話

# 結論
ウィンドウの設定以外に、Windows Aeroが有効でないと背景の透過ができなかった。

# 使用OS
Windows7 Home Premium 64bit

# 経緯
最近Web系を勉強しているから、Electronを使ってデスクトップアプリも作ってみよう！と思い立ち、作り始めました。
以前にC言語とWindows APIでデスクトップアプリを作ろうとして挫折した経験があるので、簡単にアプリを作ることができるElectronは革命的でした。

以前Windows APIでできなかった（断念した）こととして、背景の透過がありました。
デスクトップマスコットを作ろうと思ったのですが、設定等がよくわからず断念しました。
Electronでは背景の透過も簡単にできるとのことで、今回作ってみようと思いました。

# できない！
簡単にできるという言葉を信じて作ってみたものの、肝心な背景の透過ができませんでした。
アプリを起動すると、「応答なし」のような状態になってしまい、白い画面に何も表示されませんでした。
「Electron 透過 できない」とかでググっても、設定方法しかでてきませんでした。

背景を透過させる処理は大体こんな感じです。

```js:main.js
// メイン画面表示
var mainWindow = new BrowserWindow({
    width: 200,        // 幅
    height: 200,       // 高さ
    transparent: true, // 背景透過
    frame: false,      // フレーム有無
    resizable: false,  // 大きさ変更禁止
});
```

# 意外な解決
いくらやってもできないので、ElectronをやめてNW.jsに切り替えようと思い、それの透過処理について調べたところ、

「Windows Aeroを無効にしていると背景の透過が出来ません。」

お前だったのか。

Aero「私だ。」

ということで、Windows Aeroを有効にしたところ、先ほどのコードで問題なく動作しました。

わかりづらいですが、Windows7標準の壁紙に、水色の文字でHello Worldを表示しています。
![WS000002.JPG](https://qiita-image-store.s3.amazonaws.com/0/105301/c5588896-6b23-0695-548a-ee1bd084aa49.jpeg)


# なんでWindows Aeroを無効にしてたの？
タスクバーでソフトを入れ替えるときに出てくる、画面のプレビューが鬱陶しくて無効にしてました。
普通にウインドウのタイトルだけ表示してほしいです。


# まとめ
先日買ったCubase8がWindows Aeroを無効化していると立ち上がらないので、これからはAeroと共に生きていきます。
研究室でesa.ioを使えなかったのでクローン作ってる話


こんばんは，うどん大 情報系 院2年の[@hico_horiuchi](https://twitter.com/hico_horiuchi)です．
この記事は[esa Advent Calendar 2015](http://qiita.com/advent-calendar/2015/esa)の15日目です．

研究室で[esa.io](https://esa.io/)を使おうとしたのですが，諸々の理由で使えなかったﾄﾉｺﾄ．
結局，esa.ioの機能を真似たクローンを内製してるという話です．
合わせて，研究室で内製することの厳しさも話せればと思います．

## esa.ioとのﾃﾞｱｲ

esa.ioを知ったのは，他の研究室の友達の紹介でした．
第一印象は「ｽﾃｷなデザインだなぁ」でした．
当時はβのチーム募集をしている最中だったと思います．

うちの先生は寛容な方で，試してみたいと言ったら二つ返事でOK．
研究室の名前でチーム申請を出して，有料化までの数ヶ月利用していました．

具体的には，有志数人で週1のゼミの週報を書くのに使っていました．
esa.ioを使うまでの週報はと言うと，以下のような感じでした．


  - フォーマット自由 (最低限の必要事項あり)
  - PDF等でファイルサーバにアップロード
  - ファイルサーバ内のディレクトリ構成も学生毎にバラバラ

このままだと，全文検索も無く，本人以外は編集も出来ない…．
報告の粒度もバラバラで個人差も大きいので，どうしようかと思っていた次第でした．

## 研究室で使えなかった理由

単純に「Webサービスの利用料金を研究費で出すのが難しい」ﾄﾉｺﾄでした．
他にも，先生が心配していたことが幾つかありました．

  1. サービスの継続性・セキュリティは大丈夫か
  1. 手元へのバックアップは可能か
  1. ゼミ生全員が問題無く使いこなせるか

(1)については，研究室のサーバに無造作に保管するより安全だろう．
(2)と(3)も大丈夫だろうと思ったのですが，残念ながら有料化の前に利用停止となりました．

## esa.ioクローン「書庫」

esa.ioの継続利用が厳しいと分かった時から，1人でクローンの開発を開始しました．
(esa.ioの利用如何に関わらず，週報の運用を何とかしたい．)
実装にはRuby on Railsを使いました．
研究室にRubyistが多かったこと，所属する[SLP](http://poulenc.eng.kagawa-u.ac.jp/Pub/KBIT/)で活発に使われていることが理由です．

クローンの開発に当たり，重視したのは2つです．

  - テンプレート機能でフォーマットを統一可能
  - WIPで「ゼミ前夜にまとめて書く」を防止

ソースコードはGitHubで，研究室のOrganizationとして公開しています．

  - [sai-lab/shoko](https://github.com/sai-lab/shoko)

テンプレート機能はこんな感じで，WebSocketで情報をやり取りしています．

![shoko_documents.gif](https://qiita-image-store.s3.amazonaws.com/0/58742/b31a1971-c669-e966-a1e3-0dc170678cf8.gif "shoko_documents.gif")

他にも，独自機能として，週報の「活動概要」から議事録を作る機能もあります．
(ゼミの出席者と報告概要をメーリスに流す慣習があったため．)

![shoko_record.gif](https://qiita-image-store.s3.amazonaws.com/0/58742/f21a6ed5-47a1-1eed-b85f-924b4a35a081.gif "shoko_record.gif")

ちなみに，ドキュメントを保存すると`public/`以下に書き出されます．
このディレクトリはファイルサーバにリンクしており，Sambaで見れるようになっています．
(ディレクトリ構成はドキュメントのタイトル?カテゴリ?に従います．)
これは，私の卒業後にサービスが停止してもドキュメントを見れるようにとの配慮です．

利用開始から1年弱ですが，現在は研究室のほぼ全員が利用しています．
研究室内外から幾つかプルリクも貰ったような気がします．

## 研究室内製のｷﾋﾞｼｻ

こんな記事を書いておいてｱﾚですが，年内に書庫を捨てようと思っています．
卒業を数ヶ月後に控え，やはり研究室で内製するのは厳しかったかなという感じです．

  - Ruby・Railsのバージョンアップに追従できるか
  - バグフィックス・バックアップ・サービス監視等の運用を継続できるか
  - 学生の入れ替わりが激しく技術の継承が困難
  - 配属される学生の技術レベル・モチベーションのバラツキ

幸運なことに今年配属された3年生は皆モチベーションが高く，Rails経験者も居ます．
今後数年は安泰かなと思いますが，その後も継続して利用できるか，やはり不安が残ります．
(サービスが停止して負の遺産化，元の運用に戻る怖さ．)

ちなみに研究に必要な技術については，新人研修をやっています．
ここにRailsを含めるのも手ですが，どこまで教えるかなどが難しい所です．

  - [sai-lab/rookie-training](https://github.com/sai-lab/rookie-training)

## まとめ・これから

esa.ioが使いたかったけど使えず，クローンを内製したけどそれも捨てたい話でした．
最近は開発系バイトの日報にesa.ioを使っていて，ゼミの週報も書いて書庫にコピペしています．
やはりesa.ioの使いやすさ・コンセプトは凄いなぁと実感しています．

今後は，GitHubのプライベートリポジトリのWikiに移行しようかと思っています．
(認証あり，差分が見れる，バックアップは`git pull`，継続性もOK．)

これからもesa.ioを応援しています! グッズ買います!
開発者のお二人にも，一度勉強会等でお会いしてみたいですね．
Macのスクリーンショットまとめ


##Macのスクリーンショットの取り方の種類
<dl>
  <dt>全画面</dt>
    <dd>⌘(command)+Shift+3</dd>
  <dt>範囲選択</dt>
    <dd>⌘(command)+Shift+4</dd>
  <dt>範囲指定(ウインドウ単位など)</dt>
    <dd>⌘(command)+Shift+4+スペース</dd>
  <dt>範囲指定(上記の影無し)</dt>
    <dd>⌘(command)+Shift+4+スペース+option</dd>
<dl>

##スクリーンショットの保存先を変更
スクリーンショットの保存先が、Macのデフォルトではデスクトップになっていますが、それだと他のファイルと混ざって不便なので変更しました。

```shell-session
$ mkdir ~/Desktop/ScreenShots
$ defaults write com.apple.screencapture location ~/Desktop/ScreenShots
$ killall SystemUIServer
```

1. mkdirでスクリーンショットの保存用フォルダをデスクトップ上に作成します
2. スクリーンショットの保存先を「~/Desktop/ScreenShots」にします
3. SystemUIServerを再起動して、設定を有効にします


##ファイル形式を変更
```shell-session
$ defaults write com.apple.screencapture type jpg
$ killall SystemUIServer
```

1. タイプをjpgに変えます
2. SystemUIServerを再起動して、設定を有効にします

デフォルトではpngですが、jpg, bmp, gif, tif ,pdf ,pict jp2, psd ,sgi ,tga指定可能です。


##Grab (スクリーンショットのタイマー撮影など)
Macには「Grab」というキャプチャソフトが標準装備されています。タイマー撮影などが出来て、tiff形式で保存されます。

![スクリーンショット 2015-12-15 22.46.47.png](https://qiita-image-store.s3.amazonaws.com/0/88331/f1340997-c9ad-a192-7358-2484c6e959e2.png)

以下のようにポインタを変えてスクリーンショットを取れます。⌘(command)+,で環境設定を呼び出せます。

![スクリーンショット 2015-12-15 23.00.58.png](https://qiita-image-store.s3.amazonaws.com/0/88331/acded2df-6716-0ba9-e9e3-b640ceee8921.png)


いちいち探して起動させるのが面倒だと思うので、Alfredを使えば楽にGrabが起動できるかと思います。
未来を創る魔法使いのお話

**初めまして！Gizumo副社長の高橋将一（非エンジニア）です。**

今回は『株式会社GizumoのエンジニアによるAdvent Calendar』に非エンジニアの僕は技術的なお話は出来ないので、今回は僕の世界から見た『エンジニア』って種族のお話が出来たらと思います。

#はじめに
冒頭で副社長と名乗りましたが、僕は『Webディレクター』のお仕事もよく参加したりするので、『エンジニア』の人たちと仕事をする機会は沢山あります。

一概に『エンジニア』と言っても、プログラムっていう技術を勉強している理由は様々です。お金を稼ぐ為に勉強している人もいれば、知的好奇心を満たす為、サービスを作りたい人も居れば、今後の社会で生きてく為にという動機もよく聞きます。

最初は各々が、別々の目的を達成する為に技術を習得している背景がありますが、最終的には技術で出来ること（作れるもの）の幅が広がってくので、目的とは別に『技術ってもの自体が好きになる』人たちが多いような気がします（笑）

#エンジニアが出来ることは？
そもそもエンジニアが使う技術って何か？ですが、GizumoはWebが得意な会社なのでWeb領域で話を進めていければと思います。

Gizumoのエンジニアが使う技術は、『プログラム言語』です。例えばHTML、CSS、JS、Ruby、PHPetc...と言うような素人が見たら訳のわからないような文字をパソコンに書き込んで、Webと言う仮想空間に様々なものを生み出してきます。

この仮想空間に生み出せるものが、エンジニアの技術力と直結しています。

あまり馴染みがない人の為に、28歳にもなって中二病を患っている僕がファンタジーの世界でエンジニアって職業を例えてみたいと思います。

エンジニアにおいての『プログラム言語』は、
魔法使いにおいての『呪文』と同じようなものです。

魔法使いが『呪文』を唱える事で現実世界に『現象』を生み出すのと一緒で、エンジニアは『プログラム言語』を用いて仮想世界に『現象』を生み出すのです。
そんな平成の魔法使いの『エンジニア』の方々が、この先の未来も様々な『現象』を巻き起こしてくれる事でしょう。

#エンジニアと仕事をするにあたって
先程、平成の魔法使いとまで持ち上げておいてアレですが、当然エンジニアが居れば全てが上手くいくという訳ではありません。

この人たちは、『プログラム言語』を勉強する事が大変なので、一緒に仕事をする人たちはエンジニアが働きやすい環境を作ってあげないといけません。

例えば、クライアント先から頼まれた開発物を作りやすいようにまとめてあげたり、開発物が生み出された後にどのように運営していくのかを考えてあげたり、時には徹夜でプログラムを書くエンジニアに夜食を買ってきてあげたりとか（笑）

当然、クライアント先からクレームを言われてもエンジニアを窓口にさせてはいけません。すぐにやる気がなくなり案件が事故に繋がってしまいます（汗）
※勿論、個人差はあります

僕たち周りの人が理解してあげた方が良いのは、何でもエンジニアに「これやっておいて｣からの「何で出来ないの？｣と他人任せにしない事が凄く重要です。

エンジニアが一番偉いと言う訳ではないですが、「お金払ってるんだからやってよ｣と簡単に終わらせてしまうのではなくて、「技術を身に付ける為に努力してきたんだろうな｣と敬意を払いつつも、共に歩んでいきましょう。

何故なら、この先より良い社会を築く為にITは密接に関係してくると言う事と、そういった世界を作る上でエンジニアの力は欠かせないのだから。

#まとめ
最後に、上記でお話しした内容をベースに副社長としてGizumoの取り組みをご説明させて頂ければと思います。

Gizumoは技術教育を主軸にSESや受託を行っている会社です。
※自社プロダクトは作成中なので、今回はスルーです

SESとは簡単に言うと『大手の会社などは、情報資産を外部に漏洩出来ない事が多いので、開発をクライアントのオフィスで行わなければいけません。なので、技術傭兵団として大手の企業に技術を行使しにいくお仕事です』よく派遣と間違えられる事がありますが、全然違います。何故ならプロの技術者としてクライアントから意味のある知的財産を残すことを求められるからです。
※僕のイメージだとコンサルタントに近いイメージです

受託は逆に、開発環境が外でも問題ない中小企業向けのお仕事を自社内で開発して、それを納品するお仕事だと捉えておいてください。

Gizumoが押し出している教育の部分ですが、『Web環境が出来てまだ歴史が浅いため、あまり勉強が出来る環境が整っていない。でも、誰しもが一日一回はブラウザ環境を見るぐらいWebやアプリは社会に無くてはならないものになっている。この社会で、勉強が出来てキャリアアップをしていく事を考えると、技術教育って凄く大切なんじゃないだろうか？』と言う考えをベースに、勉強をしながら大手の案件に行きながらキャリアアップが出来るSESって凄く相性がいいな！と思いSESもエンジニアのキャリアアップ設計の一つとして活用しています。

また、この先の未来でエンジニアの力が必要不可欠になると思うのですが、ウチの教育はアプリケーション構造を理解するという構造理解に重きをおいています。

何故ならば、技術の知識を一つの手札として、それを上手に扱う人間は構造理解が必須だと思っているからです。
※この発想は社内で流行っているMTG（カードゲーム）がベースに思いつきました

長々と話をしてしまったので、この辺で一回話をまとめると、

この先の未来にエンジニアって人たちはとても大切な存在だと思うので、僕みたいな非エンジニアは『エンジニア』が技術を勉強しやすい環境を作りつつも、この先も『エンジニア』と言う名の魔法使い達と、副社長の高橋としてではなく、一人の人間としてこの先の未来を創っていければと思います。

**by Gizumo副社長 高橋将一**
http://gizumo-inc.jp/
Use appledoc tool to create project document.

###appledoc on github:
##https://github.com/tomaz/appledoc


###1.appledoc install(use terminal to install):
###first: 
####type sentence blow:
```git clone git://github.com/tomaz/appledoc.git```
```cd ./appledoc```
```sudo sh install-appledoc.sh```

#####to confirm whether is appledoc installed:
```appledoc --version```

if install successfully,go on.

###second:to set your Xcode project.
1. select "TARGETS",Then select "Editor"->"Add target".
2. select Other -> "Aggregate".type the name.Next.
3. in Build Phases blank.select"+" to add "New Run script phase".
4. type sentence blow in the blank:

```#appledoc Xcode script```
```# Start constants```  
```company="ACME";```  
```companyID="com.ACME";```
```companyURL="http://ACME.com";```
```target="iphoneos";```
`#target="macosx";`
`outputPath="~/help";`
`# End constants`
 
`/usr/local/bin/appledoc \`
`--project-name "${PROJECT_NAME}" \`
`--project-company "${company}" \`
`--company-id "${companyID}" \`
`--docset-atom-filename "${company}.atom" \`
`--docset-feed-url "${companyURL}/${company}/``%DOCSETATOMFILENAME" \`
`--docset-package-url "${companyURL}/${company}/``%DOCSETPACKAGEFILENAME" \`
`--docset-fallback-url "${companyURL}/${company}" \`
`--output "${outputPath}" \`
`--publish-docset \`
`--docset-platform-family "${target}" \`
`--logformat xcode \`
`--keep-intermediate-files \`
`--no-repeat-first-par \`
`--no-warn-invalid-crossref \`
`--exit-threshold 2 \`
`"${PROJECT_DIR}"`

5.select the target that you created it just now, then bulid your project with "command + R".
6. reopen your Xcode.

###third:
####use terminal to enter the code directory that you want to create document.Then, type sentence:
```appledoc --output ./doc --project-name objcdoc --project-company "kxx.xxq" --company-id "com.kxxxxq" ./```
ps. "./doc" is the directory to save document explain."objcdoc" is your project name."kxx.xxq" is your company name. "com.kxxxxq" is your company id."./" means to save your document at default directory(example:  /Users/asahi/Library/Developer/Shared/Documentation/DocSets).

###forth:Learn the methods that write annotations in Xcode file.
[A good article to learn write annotations in Xcode file](http://www.cnblogs.com/zyl910/archive/2013/06/07/objcdoc.html)

#####like this
![pic link](http://r.photo.store.qq.com/psb?/V106iJhq3r5pvo/1w2k4mYe1KY0fTKrG9Hx4fOudOR2QjD1xhTKbX4cImI!/r/dFsBAAAAAAAA)


#PS:
if we create document successfully.The effect will be:
![pic link](http://r.photo.store.qq.com/psb?/V106iJhq3r5pvo/f9UphaimBQ1tm4j2D36CxUSUJHwrep5I7.TGAROXc7E!/o/dF0BAAAAAAAA&bo=RQSAAhkGkgMFAG4!&rf=viewer_4)
Emacsで人気・新着の機能を紹介するtips.el作りました

## はじめに

Emacsにあまり慣れていない方が、便利な機能を知らないことがよくありました。
IDEで見た機能も、機能の名前が無いから探せないなど。

なので、Emacsの便利な拡張や使い方を知れる拡張を作りました。
機能は、QiitaのEmacsタグの付いた新着記事と、MELPAのDLランキング上位のものをランダムに表示したバッファを作って表示します。

## 動作イメージ

<img width="780" alt="スクリーンショット" src="https://qiita-image-store.s3.amazonaws.com/0/28665/2860b3e3-87ce-96b1-76cf-566d2bf36e80.png">

## 起動時
起動すると、バッファ共有した状態で起動します。

## 利用方法

### 取得
```bash
cd ~/.emacs.d/site-lisp/
git clone https://github.com/sanryuu/tips.git
```
### 設定

QiitaのAPIトークンを管理画面より取得します。
https://qiita.com/settings/applications

```el
;; 昔ながらの設定の追加
(add-to-list 'load-path "~/.emacs.d/site-lisp/tips")
(require 'tips)

(setq qiita->token "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX")
(tips-init)

```
### 手動起動
以下のコマンドでバッファが表示されます。
```
M-x tips-init
```

## まとめ

かなり無理矢理な実装になっていたりするので、何かありましたら、
ご意見頂けると嬉しいです。
枠がしばらく空いていたので、3年連続参加をしようと無理しました(笑)。

igjitさんのel-moreからも情報取ってきて並べたい。

関東Emacs勉強会やってなくてすみません。4月にはやります。
レンタルサーバーの Heteml（ヘテムル）で WP-CLI を使えるようにする


WordPress を使う上で、何かと便利な WP-CLI。コマンドライン（みんな大好き黒い画面）で WordPress の色々な操作ができる優れものです。

今回はヘテムルで説明していますが、Xserver やさくらインターネットとかでもほぼ同じだと思いますので、契約中のレンタルサーバーの環境に読み替えて試してみてください。

## WP-CLI で出来ること
* WordPress のインストール
* プラグインとテーマのインストール／有効化／削除／アップデート
* データベースのバックアップ／リストア
* データベース上の特定語句の置換（例 : 旧 URL から新 URL に書き換える）

その他様々なことができます。詳しくは[公式サイト](http://wp-cli.org/)をご覧ください。

## ちょっとそのまえに・・・
以下、説明の中でファイルパスやディレクトリパスを指定する部分に `~/hoge` のように記述している箇所がいくつかあります。

`~` は自分のホームディレクトリを示し、ヘテムルでは /home/sites/heteml/users/e/x/a/exampleuser を指します。例えば `~/backup` の場合、/home/sites/heteml/users/e/x/a/exampleuser/backup のディレクトリを指定していることになります。

また、ヘテムルの公開ディレクトリは `/home/sites/heteml/users/e/x/a/exampleuser/web` です。

※ ヘテムルのユーザー名が exampleuser である場合の例です。

SSH コマンドの例をコピペする場合は、`$　` の部分はコピーしないようにしてください。`$　` は便利上つけてるだとだと思ってください。


## WP-CLI のインストール

まずは、ターミナルなどの SSH クライアントでヘテムルにログインします。以下コマンドで実行するとパスワードの入力を求められるので、ヘテムルのパスワードを入力します。

**USERNAME と ssh123 の部分は Heteml から割り当てられたものに置き換えてください。**

```bash
$ ssh USERNAME@ssh123.heteml.jp -p 2222 -o PreferredAuthentications=password
```

次に、WP-CLI をダウンロードします。以下コマンドを実行するとダウンロードができます。

**コピペする場合は 1 行目の mkdir から 3 行目 wp までを全部コピペしてください。**

```bash
$ mkdir ~/bin &&\
wget https://raw.github.com/wp-cli/builds/gh-pages/phar/wp-cli.phar -O ~/bin/wp --no-check-certificate &&\
chmod +x ~/bin/wp
```

これでインストールが完了です。以後、`~/bin/wp` というコマンドで WP-CLI を実行できます。

### wp コマンドで WP-CLI を実行できるようにする
`~/bin/wp` が長いよ ! という場合は、.bash_profile ファイルを作成し、~/bin/ に PATH を通して上げることで `wp` として実行できるようになります。

.bash_profile ファイルを作成

```bash
$ vi .bash_profile
```

キーボードの i キーを押下した後、以下をコピペする。

```bash
PATH=${PATH}:${HOME}/bin
```

esc キーを押下し `:q`（コロン + q）と入力し enter キーを押下し完了です。PATH が通っているか確認の為、以下コマンドを実行してみます。

```bash
$ which wp
```

~/bin/wp と表示されれば大丈夫です。以後、`wp` というコマンドで WP-CLI を実行できます。

## WP-CLI の基本

WP-CLI の実行は、WordPress がインストールされているディレクトリに `cd` コマンドで移動してから行う、または、`--path` というオプションに WordPress がインストールされているディレクトリを指定します。

### WordPress がインストールされているディレクトリに移動してから実行する例

```bash
$ cd ~/web/wordpress/
$ wp plugin list
```

### オプションを指定する例
```bash
$ wp --path=~/web/wordpress plugin list
```

WordPress の Site URL と Home URL が別々になるようなインストール方法をとっている場合、`--path=` オプションを指定しても上手くいきません。その場合は、素直に WordPress がインストールされているディレクトリに `cd` コマンドで移動しましょう。

※ 誰か、解決方法教えてください(´；ω；｀)ｳｯ…

## WP-CLI の活用例

以下に、よく使いそうな例をいくつかピックアップしています。

### データベースのエクスポート

事前にエクスポート先のディレクトリを `mkdir` コマンドで作成してから、エクスポートを実行します。既に作成済の場合は、省略してください。

```bash
$ mkdir ~/backup
$ wp db export ~/backup/backup_20150000.sql
```

### データベースのインポート

```bash
$ wp db import ~/backup/backup_20150000.sql
```

### サイトの引っ越し時にデータベース上の URL を旧 URL から 新 URL に書き換える
データベース上に記録されている URL を、SQL ファイルをテキストエディターなどで開いて置換しては絶対にダメです。たまにブログなどで紹介されているのを見かけますが、これはバッドノウハウです。URL がシリアライズ化され記録されていたりと、色々難しいことがあるため、テキストエディターなどで置換してしまうと、色々面倒が起こります。でも WP-CLI なら、色々な難しい問題を解決し、一瞬で終わります。

以下に、http://example.com から http://example.net に変更する例を示します。

```bash
$ wp search-replace 'http://example.com' 'http://example.net'
```

または

```bash
$ wp --path=~/web/wordpress search-replace 'http://example.com' 'http://example.net'
```

## 最後に
今回はヘテムルで説明しましたが、Xserver やさくらインターネットとかでもほぼ同じだと思いますので、契約中のレンタルサーバーの環境に読み替えて試してみてください。

それでは、良い年末と良い WP-CLI ライフを !