OmniAICreator/Qiita-1.07M huggingface dataset:
電子回路 > トランジスタ > 接地端子 > 0Vラインだけが接地箇所ではなく、固定の電位たとえば交流的には電源 V_CC も接地端子です。

引用: ダイオード・トランジスタ回路入門 by 岡山 努さん

第8章

> 3種の共有形態：エミッタ接地、コレクタ接地、ベース接地があり、共有している端子の名称が接地端子です。0Vラインだけが接地箇所ではなく、固定の電位たとえば交流的には電源 V_CC も接地端子です。


「接地」というとGNDと接続しているという説明をする本をいくつか見てきたが、必ずしもGNDに接続するわけではないということ。


ちなみに「エミッタ接地」は英語のwikipediaでは「common emitter」という項目に対応する。日本語の「エミッタ接地」は誤解をまねく訳語だと思った。
Hubot の更新を確認してみた 2.11.1 → 2.13.2

しばらく見ていなかったらバージョンが進んでいたので新しい機能を確認してみた。その際のメモ。

今回確認するのは、ぼくが[最後に確認][2015-02-17]した 2.11.1 から最新の 2.13.2 まで。

コミットを日時順に追いかけたのでマージされたタイミングによって順番が正しくないかもしれない。

## 総括

ぼくの気になったものを挙げる。

- `express` の警告が修正された。ようやく。
- `Listener` の引数が `msg` から `res` に変更された。 
- `Listener` に `options` が追加された。`id` などを指定できる。テストなどに有用かも。
- `process.env.EXPRESS_PORT` / `process.env.EXPRESS_BIND_ADDRESS` が追加された。
- endpoint URL の prefix を `/hubot` になるよう規約が追加された。
- Hubot 自体のテストコードが増えた。
- ドキュメントが充実した。Adapter のものが増えたりしている。一度読み返した方が良いかも。

## 2.13.2

- ドキュメントの不備などが修正された。
- `.gitignore` に `.node-version` が追加された。

## 2.13.1

- ドキュメントの不備などが修正された。

## 2.13.0

- `robot.respond` などが alias に対して正しく動くよう修正された。
- `Listener` の `options` のために `robot.enter` / `leave` / `topic` / `catchAll` の第一引数に options が追加された。
- `scoped-http-client` (`robot.http` の実体) が 0.10.3 → 0.11.0 に変更された。

## 2.12.0

- `Listener` の引数名が `msg` から `res` に変更された。
  - やっとか……
- `express` (`bodyParser`) の警告を消すよう修正された。
- `scoped-http-client` (`robot.http` の実体) が 0.10.0 → 0.10.3 に変更された。
  - Content-Length が設定されるようになった、とか。
  - 個人的には `robot.http` を使わないのでスルー

## 2.11.4

- `.hubot_history` の空行が読まれないよう修正された。

## 2.11.3

- shell adapter がリファクタリングされた。
- ドキュメントが Jekyll 向けに変更された。
- Adapter 向けのドキュメントが追加された。
- `.gitignore` に `.hubot_history` が追加された。
- robot.http の options のデフォルトを設定する機能が追加された。
  - 個人的には `robot.http` を使わないのでスルー

## 2.11.2

- Listener に options が追加された。
- Listener に id が追加された。 → デフォルトで null
  - `robot.hear /pattern/, id: 'my-script.hoge', (res) ->`
- `process.env.EXPRESS_PORT` が追加された。 ( `process.env.PORT` の代わりになる )
- `process.env.BIND_ADDRESS` は `process.env.EXPRESS_BIND_ADDRESS` に変更された。
- endpoint URL の prefix を `/hubot` になるよう規約が追加された

[2015-02-17]: http://twilog.org/bouzuya/date-150217
電子回路 > トランジスタ > エミッタ接地増幅器

引用: ダイオード・トランジスタ回路入門 by 岡山 努さん

[アナログエンジニア](http://analog-engineer.cocolog-nifty.com/)さんこと岡山努さんの本の第8章の抜粋。

![commonEmitter (1).png](https://qiita-image-store.s3.amazonaws.com/0/32870/8ec695c8-0407-c731-7151-bf8dba9623c6.png)


> 入力電圧 V_I = V_{BE} が増加するとベース電流 I_B が増加するので、コレクタ電流 I_C が h_{FE} x I_B だけ増加します。この結果、負荷抵抗 R_L での電圧降下が増大するので、電源 V_CC を基準電位として、出力 V_O は矢印の方向に大きく変化します。
...
> 入力の変化方向と出力の変化方向（極性）が逆ですので、エミッタ接地増幅器は反転増幅器です。
実践Ruby on Rails 4メモ


rails g rspec:install 
した後の、カレントディレクトリにある、
.rspec 
その2行目の --warnings を削除。
この行があると、Gem パッケージに起因する警告がターミナルに表示される。

  config.before(:suite) do
    FactoruGirl.reload
  end
テストのスイート前にリロードをかける。
Springの為の処理。

<%= render 'shared/footer' %>
ERBの中で使用されるrenderメソッドは、引数の文字列を部分テンプレートの名前だと解釈する。

assets:precompileタスクの実行で、
config/environments/production.rbの、
config.serve_static_assets = true
をtrueにするのですが、それと
config.assets.compile = true
ここの編集しておかないと、
$ assets:precompile
の際にassets pipelineのスタイルが適用されない。

データベースの名前の変更

app/models/モデル名.rb
の中で、
self.table_name = 'テーブル名'
alias_attribute :新しいカラム名, :変えたいカラム名
とすると変える事ができる。
Rails セッション管理でお手軽ユーザー管理

Railsでは「devise」(gem)を使えば簡単にユーザーログイン機能を実装出来ます。そのため、それで十分楽なのですが、セッション管理(gemなし)で簡易ユーザー管理をやってみたので覚書程度に書いておきます。

##仕様
* ユーザーがサイト内にアクセスしてきたら、user_idを発行しセッションを残す。
* セッション期限は1ヶ月の設定。
* セッションのdeleteボタンでセッション削除。（user削除)

##create

userテーブルを作成する。
その後、下記をapplication_controller.rb内に記述。
サイト内にアクセスしたら、ユーザー生成。

```rb:application_controller.rb
  before_action :login

  def login
    if session[:user_id].blank?
      user = User.create
      session[:user_id] = user.id
    end
    @user_id = session[:user_id]
  end
```

##destroy

任意の場所に下記のアクションを設定し、routeを設定。

```rb
  def destroy
    reset_session
    user =User.find(@user_id)
    user.destroy
    redirect_to root_path
  end
```

##セッション期限

下記を追記してセッションの有効期限を設定。

```rb:/config/initializers/session_store.rb
Rails.application.config.session_store :cookie_store, key: '_user_id_session', expire_after: 1.month
```

expire_afterが1ヶ月の有効期限。

##補足
ちなみに、deleteした後にすぐにまた新しいuserが発行されます。
application_controller内に作成したloginアクションを任意のコントローラーに移し、deleteのようにrouteを設定すれば、user作成ボタンで作成し、user削除ボタンで削除するという仕様に変更も出来ますね。需要はなさそうですが、追記。

##参考
[Rails4での基本的なセッションの使い方](http://ruby-rails.hatenadiary.com/entry/20141130/1417334030)
[Railsでsessionの有効期限を設定](http://blog.hello-world.jp.net/ruby/936/)
[非デザイナー向け] 全端末サイズ分の AppStore 用スクリーンショットを簡単に用意する


# AppStore のスクリーンショット

アプリを少人数で作っていて、「よしできた、AppStore のメタデータの準備しよう」ってなった時に、
開発とは別にやらないといけないことがけっこうあります、アプリの説明文やスクリーンショットの準備など。

エンジニアは説明文やスクリーンショットのセンスがないことが多いです(主観)。
単に画面キャプチャを用意するくらいしかできない。

しかも AppStore に提出するスクリーンショットは 4インチ用、4.7インチ用など複数のサイズで準備しなければならずけっこう大変です。

今趣味で作っているアプリのスクリーンショットを用意しようとしてた時に便利そうなサービスを見つけたので使ってみました。

# Screenshot Builder

LaunchKit の Screenshot Builder はスクリーンショットを iPhone に埋め込んだ画像にできるサービスです。
＃ 要アカウント作成

https://launchkit.io/

## 0.スクリーンショットの元となる画面キャプチャを用意する

実機またはシミュレータでスクリーンショットに使用する画面キャプチャを用意します。推奨は iPhone 6+ サイズですが iPhone6 のサイズで用意しても問題ありません。 

## 1.最初にレイアウトを選ぶ

スクリーンショットを埋め込む iphone 上部または下部にテキストを載せることができます。

![スクリーンショット 2015-07-03 8.44.32.png](https://qiita-image-store.s3.amazonaws.com/0/27210/7967eb87-5323-255e-0fbf-50f32e71ee47.png "スクリーンショット 2015-07-03 8.44.32.png")

## 2.iPhone に埋め込むスクリーンショットを選択します

D&D で画像をアップロードします。

![スクリーンショット 2015-07-03 8.44.44.png](https://qiita-image-store.s3.amazonaws.com/0/27210/3c6a0be4-fee8-c325-1bf9-07872027717a.png "スクリーンショット 2015-07-03 8.44.44.png")

## 3.説明文や色を指定する

iPhone の色や説明文、背景色などを指定します。各サイズでのプレビューも同時に確認できます。

![スクリーンショット 2015-07-03 8.45.02.png](https://qiita-image-store.s3.amazonaws.com/0/27210/88709ca4-a8d1-0d85-aa4f-fe8a8ab91757.png "スクリーンショット 2015-07-03 8.45.02.png")

## 4. スクリーンショットを追加する

一枚目の編集が終わったら次のスクリーンショットを追加し、説明を追加していきます。

![スクリーンショット 2015-07-03 8.48.58.png](https://qiita-image-store.s3.amazonaws.com/0/27210/ed18d361-4412-8aa4-3424-c2a137a8859c.png "スクリーンショット 2015-07-03 8.48.58.png")

## 5. エクスポートする

作業が終わったら "Export Screenshots"を選択します。各画面サイズにリサイズされたスクリーンショットが zip でまとめられ、ダウンロードリンクがメールで送られてきます。

![スクリーンショット 2015-07-03 8.51.01.png](https://qiita-image-store.s3.amazonaws.com/0/27210/ebf8d5f9-8e25-55e4-391c-173376c396f4.png "スクリーンショット 2015-07-03 8.51.01.png")

# まとめ

メールが送られてきたらあとは AppStore に D&D でアップロードするだけです。今までスクリーンショットを用意するのが面倒だったのですがこれを使うとかなり楽になりました。
facebookチャットとletschatを連携させるbot書いた


普段プライベートや社外ではfacebookチャット(messenger)を使っているけど、社内にはオンプレミスのシャットサービスが立っている。社内のチャットへのアクセスはインターネット側からはできなくて不便。かといって全部facebookチャットに乗り換えるのも色々と大変。

というニッチなニーズに対して、そうだ両者の間でメッセージを双方向でリレーさせればいいじゃない、ということでbotを作りました。会社のファイヤウォールに穴を開けたりする必要なく、社内から外部への接続性があれば利用できます。

## 環境
+ 社内に[letschat](https://github.com/sdelements/lets-chat)サーバが立っている。
	+ letschatは少人数グループ用のオンプレミスのチャットソフトウェアです。
+ 社内のletschatサーバにアクセスできるサーバ上でこのbotを動かします。そこから外部(インターネット)にアクセスできる必要があります。
+ facebook, letschatそれぞれにbot専用のアカウントを用意したほうが良いでしょう。

## 実装面
+ nodejsで実装しています。
+ letschatとの連携部分は[hubot-lets-chat](https://github.com/sdelements/hubot-lets-chat)を使っています。
+ facebookとの連携部分は、昨今facebook側のAPI変更などもありましたが、XMPPなどを使わない[facebook-chat-api](https://github.com/Schmavery/facebook-chat-api)を使っています。
+ 原因まで終えていませんが、主にfacebook連携側がエラーを吐き続けることがあるので、エラーが発生した場合にはbot自体を終了させるようにしています。foreverを使ってこのbotを起動するのがオススメです。


## 使い方
+ githubで公開しています。[face-lets-bot](https://github.com/mtdmn/face-lets-bot)

## 制限事項
+ facebook-chat-api側の制約により、アップロード画像のリレーには対応していません。
電子回路 > schemeit > ノードを追加 >  SHEMATIC SYMBOLS -> Ports -> PORT, NODE

http://qiita.com/7of9/items/63669d0879daa717b0d6
で紹介したschemeitの使い方。

ノード(を追加するには

    SHEMATIC SYMBOLS > Ports > PORT, NODE

を選択する
Go入門@環境構築編(IntelliJ IDEA 14.1.4)


# 構築環境  
- OS:Windows7 64bit
- go1.4.2
- IntelliJ IDEA 14.1.4
- go-lang-idea-plugin 

# Go のインストール  
1.  [ここ](https://golang.org/dl/)から**go1.4.2.windows-amd64.msi**をダウンロード
![01_go_lib.jpg](https://qiita-image-store.s3.amazonaws.com/0/85009/022ef1dc-f7fc-1cda-7b83-bf2ed79b97cc.jpeg)
1. インストーラーはデフォルト設定でOK  
  - PathとGo Rootが自動的に設定されている  
![02_go_lib.jpg](https://qiita-image-store.s3.amazonaws.com/0/85009/672f8839-48fc-46f3-0bda-4f22f0ced39e.jpeg)



# IntelliJ IDEA の インストール
1. [ここ](https://www.jetbrains.com/idea/download/)から**ideaIC-14.1.4.exe**をダウンロード
 - Community Edition は 無料で使用できる
![03_intellij.jpg](https://qiita-image-store.s3.amazonaws.com/0/85009/5dc8bb5e-ad7f-90e1-8755-f3de1a3c3916.jpeg)
1. インストーラーはデフォルト設定でOK  

# go-lang-idea-pluginのインストール
1. [ここ](https://github.com/go-lang-plugin-org/go-lang-idea-plugin/releases/tag/%23201)から**Go.201.zip**をダウンロード
2. IntelliJ IDEA を起動
3. Configure -> plugins -> Install plugin from disk で **Go.201.zip**を選択。
![04_intellij.jpg](https://qiita-image-store.s3.amazonaws.com/0/85009/8b34bfe8-ebaf-7f2c-27a9-d63d8637f022.jpeg)
![05_intellij.jpg](https://qiita-image-store.s3.amazonaws.com/0/85009/b1d020fb-1101-f6aa-3430-cb4e77df8f29.jpeg) 
4. 正常に読み込みできれば、下記のようになるのでOKで再起動
![06_intellij.jpg](https://qiita-image-store.s3.amazonaws.com/0/85009/22b3a91c-ce36-1f53-b464-743362c36bee.jpeg)
5. Configure -> Project Defaults -> Project Structure 
6. Platform Settings SDKs -> [+] -> [Go SDK] からPATHを指定し、OK
![07_intellij.jpg](https://qiita-image-store.s3.amazonaws.com/0/85009/a319fa86-2355-0e0b-beaa-5a483ff2b661.jpeg)

# その他設定
- [git.exeの場所＠SourceTree](http://qiita.com/makoto2468/items/5ebfe8542a67e36760f6)
- [IntelliJ IDEA 日本語化](http://qiita.com/makoto2468/items/6abf614b82cab865b745)
"Bundle install"時のYou may need to add a javascript runtimeエラーの対処法


##エラー内容

```terminal
Important: You may need to add a javascript runtime to your Gemfile in order for bootstrap's LESS files to compile to CSS. 

**********************************************

ExecJS supports these runtimes:

therubyracer - Google V8 embedded within Ruby

therubyrhino - Mozilla Rhino embedded within JRuby

Node.js

Apple JavaScriptCore - Included with Mac OS X

Microsoft Windows Script Host (JScript)

**********************************************
```

##対処法

```terminal
gem install execjs
```
UnityでC#だけでToastを出してみた(Android)

短いコードだったらAndroidJavaなんちゃら使って書いたほうが楽かなーなどと思ったけどなんか引っかかったのでメモ。
あまりネイティブは分からないが…。

とりあえずToast作成に必要な物を考える
javaだとandroid.widget.Toastをインポートして
Toast.makeText(Context context, CharSequence text, int duration) を使って作成するらしい
(new Toast(Context context)でやったら「makeText使わないで作成しただろ」とエラーが出てしまった)
それぞれの引数は
context → currentActivity.getApplicationContextで出せる
text → CharSequence型とか分かんないけど、表示したい文字列なのでstringでできるだろう
int → Toastクラスに定数が用意されているので、GetStatic\<int\>で受け取る

それで以下のように書いた

```
AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject activity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
AndroidJavaObject context = activity.Call<AndroidJavaObject>("getApplicationContext");

AndroidJavaClass toastClass = new AndroidJavaClass("android.widget.Toast");
AndroidJavaObject toast = toastClass.CallStatic<AndroidJavaObject> ("makeText",
										  context,
										  "Test Toast",
										  toastClass.GetStatic<int>("LENGTH_SHORT")
										  );
toast.Call ("show");
```

けど、Looper.prepare()がどうのこうのとエラーが出たため、調べて以下のように修正。

```
AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject activity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
AndroidJavaObject context = activity.Call<AndroidJavaObject>("getApplicationContext");

activity.Call("runOnUiThread", new AndroidJavaRunnable(() => {
	AndroidJavaClass toastClass = new AndroidJavaClass("android.widget.Toast");
	AndroidJavaObject toast = toastClass.CallStatic<AndroidJavaObject> ("makeText",
										  context,
										  "Test Toast",
										  toastClass.GetStatic<int>("LENGTH_SHORT")
										  );
	toast.Call ("show");
}));
```

こいつで見事"Test Toast"が表示された。
後は好きな文字列を入れられるようにするのがいいかな。

ClassだObjectだCall(Static)だGet/Set(Static)だと出てきてちんぷんかんぷんになってたけど、C#でも同じことしてるだろ、と考えたら少しは書けるようになった。
でも書いてて自分があまり理解してないとこがあるので、もうすこしネイティブを勉強せねばだ。
[Parse]Jobのスケジュール設定について

最近Parseでちょいちょい遊んでいるのですが
Jobのスケジュール設定でちょっとした罠があって
それにドハマリしたので、
注意喚起をかねつつ、愚痴をかきつつ、
間違い・勘違いがあれば教えて欲しい（本音）っていうことで書きます

## 問題

**Cloud Code**機能で**job**を登録すると
Parseの管理画面でjobのスケジュール設定が出来るようになります。
スケジュールなのでもちろん定期的に実行とかも

![jobのスケジュール設定画面](https://qiita-image-store.s3.amazonaws.com/0/33521/1c0f9559-890e-3cfc-2edc-af5b60798cfb.png)


その設定画面がコチラ

ジョブの説明、実行するジョブ（Cloud Codeで登録したジョブ名が一覧で出ます）
そして、実行時に渡せるパラメータ

この渡すパラメータに罠がありました

### 詳細

json形式でとhintが書かれているので
`{"name": "hoge"}`という感じで入力してみました

そしてソレを受け取るjobはこんな感じ

```js:main.js
Parse.Cloud.job('MyJob', function(request, status) {
    console.log(request.params);
    console.log(request.params.name);
    status.success('finish');
});
```

ドキュメントを見ていると`request.params`で受け取れそうだったので
こう書いてみます

結果のログはというと

> {"name":"hoge"}
> No Message provided

こういう感じ。`request.params.name`が取れません

**なんで？！**ってめちゃ悩みました。。

## 原因

そもそも、これ何者なんだろうっていう疑惑がわいたので
`console.log(typeof request.params)`
とやってみました

**string**

(つд⊂)ｺﾞｼｺﾞｼ...
( ✧Д✧) ｶｯ!!
...(╹⌓╹ )
( ‘д‘⊂彡☆))Д´) ﾊﾟｰﾝ

みたいな...

ま、よくよくログをみると、
自分で出してるログの他に
Parseが標準で出してくれるログがあるんですけど
そこでは

> Input: "{\"name\":\"hoge\"}"

ってでてて、めちゃエスケープされとる...って気づくんですけど...（汗）

## 対策

ということで、object化してあげて、引き出せばokです

```js:main.js
Parse.Cloud.job('MyJob', function(request, status) {
    var params = request.params;
    // 何かのひょうしでjsonオブジェクトになってくるかもなので
    // タイプチェックをいれとく
    if (typeof params === 'string') {
        params = JSON.parse(params);
    }
    console.log(params.name);
    status.success('finish');
});
```

こんな感じ
~~もちろん、stringってわかっちゃったので、
一つだけしかなかったら、そのままつかえばいいし
カンマ区切りでsplitとかやってもいいと思いますけど~~

そもそもjsonフォーマットじゃないとパラメータのとこに保存出来ないので
この文字列をsplitとかっていうのは無理そうです...m(_ _)m

## おわりに

ということで、利用する際はお気をつけを
というか...
世のParse使いのみなさん、どうですか？これ、そうなんですか？（汗）
なんか僕間違ってますか？..みなさん出来てますか？やってない？試してみませんか？（笑）
何か正しい？出来るよ！っていうのがあれば、教えて欲しいです

## 参考

[Introducing Background Jobs](http://blog.parse.com/announcements/introducing-background-jobs/)
ここの、設定画面のスクショとコードが罠の根源！
さもjsonフォーマットで設定したら、`request.params.plan`とかで取れるぜーみたいな書き方
まぁ、そもそもスクショで設定してるパラメータを引き出してるわけではないんですけど
ええ、八つ当たりですよ！(´;ω;)ﾁｸｼｮｰ!!

[Cloud Code - JavaScript Developers Guide | Parse](https://www.parse.com/docs/js/guide#cloud-code)
c++ builder > TeeChart > 「A component named Series3 already exists. / コンポーネントSeries3はすでに使われています」

```txt:動作確認
C++ Builder XE4
```

TChart型のChart1とChart2を作成し、Chart1で作成済のSeries(名前をSeries3とする)と同じ名前のSeries3をChart2に作成しようとすると投稿タイトルのエラーとなる。

1つのフォーム内に複数のTChartを配置する時、Seriesの名前がユニークになるように割り当てないといけない。

別々のフォームにChart1とChart2を配置した場合はこの問題は起きない。

Chart1とChart2で同じ項目のデータをグラフ描画するとき、SeriesNameを凡例表示に使おうと考えていたが、１つのフォーム上ではダメっぽい。
gulpの設定を簡単に行える、gulpfile generatorを作りました。


gulpfile.jsをGUIで作成できるgulpfile generatorを作りました。現在の自分のベストプラクティスです。順次更新していいものにしていきます。

##URL
[http://steelydylan.github.io/gulp-generator/](http://steelydylan.github.io/gulp-generator/)


##スクリーンショット
![Screen Shot 2015-07-05 at 9.35.13 AM.png](https://qiita-image-store.s3.amazonaws.com/0/20980/a0260c37-45ef-eeb3-8fe0-1b514eb0afc6.png "Screen Shot 2015-07-05 at 9.35.13 AM.png")


##使い方
使用したいオプションにチェックをするだけです。
画像の最適化や、アイコンフォント生成なども利用できます。

##オプション

###CSS

- CSSの構文をチェックする

- プリプロセッサーを使用する

- オートプリフィクサーを使用する

- CSSのプロパティ順を整理する

- CSSのメディアクエリを整理する

- CSSを圧縮する

- スタイルガイドを使用する

###JavaScript

- Browserifyを利用する

- altJSを使用する

- JSの構文をチェックする

- JSを圧縮する

- JSを結合する


###HTML

- テンプレートエンジンを使用する
- HTMLを圧縮する

###その他

- BrowserSync
- 画像の最適化
- アイコンフォント作成
EC-CUBE3 用のプレーンな Bootstrap テンプレートをつくってる過程で分かったことなど


EC-CUBE3 からデフォルトのテンプレートに Bootstrap3 が採用されていますが、カスタマイズが諸々ほどこされているので、Twig の練習も兼ねプレーンな Bootstrap で実装をしてみています。

ソースコードはこちら。

https://github.com/ynakajima/eccube3-bootstrap-plain-template

そして、TOPページはこんな感じです。

![スクリーンショット](https://raw.githubusercontent.com/ynakajima/eccube3-bootstrap-plain-template/master/screenshot.jpg)


## 制作方針

なるべく素のままの Bootstrap で実装するように、以下のことを心がけながら制作しています。

* Bootstrap で定義されているクラス名以外は使用しない（EC-CUBE の処理上どうしても必要な箇所は除く）
* スタイル（外部CSS、style要素、style属性）は一切加えない
* JavaScript も足さない（EC-CUBE で用意されているものは利用する）
* レイアウト用の素材として画像は一切使用しない（ダミー用の商品写真、バナー等は除く）

## 製作中にわかったことなど

### テンプレートの変更方法について

#### 手っ取り早く default を上書きしてつかう方法

* EC-CUBE の `app/template/default` に自分で作成して Twig ファイルを置くことでデフォルトのテンプレートを上書きすることが可能。
* 上書きするファイルについては `src/Eccube/Resource/template/default` 以下のファイルを参照。
* Twig ファイルを上書きしても反映されない場合は `app/cache/twig/default` 以下にあるキャッシュファイルを消去。

#### 新規テンプレートとして登録する方法

（※ 以下の方法は手探りでやってみたらできた事のメモなので、正式には違うかもしれません。誰か正解を知っている方がいたら教えて下さい。）

新規のテンプレートとして登録したい場合はまず、DBにテンプレートデータを追加（`my_template` という名前を仮定）。

```sql
INSERT INTO `dtb_template` (`device_type_id`, `template_code`, `template_name`, `create_date`, `update_date`)
VALUES (10, 'my_template', 'My Template', NOW(), NOW());
```

つぎに、EC-CUBE の `app/template` と `html/template` 以下に先ほどDBに登録した `template_code` と同名のディレクトリを用意。（html/template 以下に設置するディレクトリについてはとりあえず default のをコピーして利用するとよいかも）

```sh
$ mkdir {EC-CUBEのディレクトリ}/app/template/my_template
$ cp -R {EC-CUBEのディレクトリ}/html/template/default {EC-CUBEのディレクトリ}/app/template/my_template
```

最後に、管理画面の `設定 > オーナーズストア > テンプレート` 画面にアクセスして、`テンプレート一覧` にある `My Template` を選択して `登録` 。


## ご指摘とかあったら頂けますとうれしいです

正直試行錯誤でつくっているので、「こういうふうにするといいよ」等のご指摘を頂けますとうれしいです。
Webサーバが稼動していない状態でファイアーウォールの動作を確認する

# Webサーバが稼動していない状態でファイアーウォールの動作を確認する

- `nc`コマンドで特定のポートをlistenさせる

```shell-session
# while true; do ( echo "HTTP/1.0 200 Ok"; echo; echo "Hello World" ) | nc -l 《port》; [ $? != 0 ] && break; done
```

## 8081ポート開放、80ポートlistenの場合

```shell-session:server
# netstat -lntp | egrep ":80|:8081"
#
# iptables -L -n -v | egrep ":80|:8081"
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:8081
#
# while true; do ( echo "HTTP/1.0 200 Ok"; echo; echo "Hello World" ) | nc -l 80; [ $? != 0 ] && break; done
```

```shell-session:client
# curl http://192.168.56.101
curl: (7) couldn't connect to host
# curl http://192.168.56.101:8081
curl: (7) couldn't connect to host
```

## 8081ポート開放、8081ポートlistenの場合

```shell-session:server
# netstat -lntp | egrep ":80|:8081"
#
# iptables -L -n -v | egrep ":80|:8081"
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:8081
#
# while true; do ( echo "HTTP/1.0 200 Ok"; echo; echo "Hello World" ) | nc -l 8081; [ $? != 0 ] && break; done
```

```shell-session:client
# curl http://192.168.56.101
curl: (7) couldn't connect to host
# curl http://192.168.56.101:8081
Hello World
```

- アクセスがあるとサーバ側に出力される

```shell-session:server
# while true; do ( echo "HTTP/1.0 200 Ok"; echo; echo "Hello World" ) | nc -l 8081; [ $? != 0 ] && break; done
GET / HTTP/1.1
User-Agent: curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.15.3 zlib/1.2.3 libidn/1.18 libssh2/1.4.2
Host: 192.168.56.101:8081
Accept: */*

^C
```
BmWhってどんなソフト？

#"BMSEクリップボード偽装ソフト"です
とありますが、ググっても解説が出てこないので書いてみました。

# たとえばこのように入力すると
![image](https://qiita-image-store.s3.amazonaws.com/0/78152/3c1ab488-ecc8-6308-1fed-a58115659ef9.png)

![#WAV01～#WAV04を16分音符の間隔で8ループ分繰り返す](https://qiita-image-store.s3.amazonaws.com/0/78152/0d8a7afd-a79c-82f6-c11a-15680977a1fc.png)

#つまり

![image](https://qiita-image-store.s3.amazonaws.com/0/78152/d37ee862-ccda-6f5c-f9c4-7bf962a0f7e2.png)

なるほど。

#もちろんiBMSCでも使えます

![image](https://qiita-image-store.s3.amazonaws.com/0/78152/c6286d0e-6ee9-a821-4159-7f8a16d5d904.png)


#逆順もできます

![image](https://qiita-image-store.s3.amazonaws.com/0/78152/aa12d4b7-8f48-c7ee-c9f5-15839ad2450a.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/78152/96da56d2-29c3-9189-83b5-d2622c1c46ab.png)

#FFにチェックを入れると、定義番号に00～ZZではなく00～FFを使用します。

![image](https://qiita-image-store.s3.amazonaws.com/0/78152/5ba8c7d5-bad4-42ad-7288-2744d1bc91ef.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/78152/fae649f8-05c4-c5cb-f671-65debf268b6e.png)

#乱にチェックを入れると、定義番号がランダムになります。

前衛的なBMSを作るのに非常に役に立つのではないでしょうか。

![image](https://qiita-image-store.s3.amazonaws.com/0/78152/14d88acd-6498-985a-1e53-c6e113252085.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/78152/3a337860-c23b-2432-89b2-4e3ffaac6cfa.png)

#以上です

興味のある方は[**こちら**](http://cerebralmuddystream.nekokan.dyndns.info/index.html)からダウンロードできるようです。
[bash]特定カラムを対象に数値順でソートする

# [bash]特定カラムを対象に数値順でソートする

```shell-session
# cat /etc/passwd | sort -t ":" -k 3,3n
```

- 区切り文字`:`で第3フィールドを数値順にソートする

```text
-t	区切り文字指定
-k	ソートフィールド指定
-n	数値順で評価
```

```shell-session:実行結果
# cat /etc/passwd | sort -t ":" -k 3,3 -n
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
oprofile:x:16:16:Special user account to be used by OProfile:/home/oprofile:/sbin/nologin
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
rpc:x:32:32:Rpcbind Daemon:/var/cache/rpcbind:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
gdm:x:42:42::/var/lib/gdm:/sbin/nologin
apache:x:48:48:Apache:/var/www:/sbin/nologin
haldaemon:x:68:68:HAL daemon:/:/sbin/nologin
vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
usbmuxd:x:113:113:usbmuxd user:/:/sbin/nologin
avahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin
abrt:x:173:173::/etc/abrt:/sbin/nologin
vboxadd:x:496:1::/var/run/vboxadd:/bin/false
pulse:x:497:496:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
saslauth:x:498:76:Saslauthd user:/var/empty/saslauth:/sbin/nologin
rtkit:x:499:497:RealtimeKit:/proc:/sbin/nologin
vagrant:x:5000:5000::/home/vagrant:/bin/bash
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
```
技術英語 > double > Test double

Test doubleという用語がある。
doubleはstunt doubleのように「代役」の意味。

http://www.martinfowler.com/bliki/TestDouble.html
> The generic term he uses is a Test Double (think stunt double). Test Double is a generic term for any case where you replace a production object for testing purposes. There are various kinds of double that Gerard lists:
- Dummy...
- Fake...
- Stubs...
- Spies...
- Mocks...

参照: [テストダブルの種類](http://qiita.com/k5trismegistus/items/94599074a961074d9237)
[bash]バッファの無効化

# [bash]バッファの無効化

```sh
awk {fflush()}
grep --line-buffered
sed --unbuffered 
```

# 参考情報

1. [grep, awk, sed でバッファしない方法]http://www.techscore.com/blog/2012/12/06/grep-awk-sed-%E3%81%A7%E3%83%90%E3%83%83%E3%83%95%E3%82%A1%E3%81%97%E3%81%AA%E3%81%84%E6%96%B9%E6%B3%95/
[bash]時刻付きでログファイルに出力する

# [bash]時刻付きでログファイルに出力する


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

echo "Hello world"

exec 1> >(awk '{print strftime("[%Y-%m-%d %H:%M:%S]"),$0 } { fflush() } ' >>stdout.log)
exec 2> >(awk '{print strftime("[%Y-%m-%d %H:%M:%S]"),$0 } { fflush() } ' >>stderr.log)

echo "stdout"
echo "stderr" >&2

exit 0
```

```shell-session:実行結果
# ./output2logfile.sh
Hello world
#
# ls -l
合計 12
-rwxr-xr-x 1 root root 250  7月  5 06:40 2015 output2logfile.sh
-rw-r--r-- 1 root root  29  7月  5 06:52 2015 stderr.log
-rw-r--r-- 1 root root  29  7月  5 06:52 2015 stdout.log
#
# cat stdout.log
[2015-07-05 06:52:03] stdout
#
# cat stderr.log
[2015-07-05 06:52:03] stderr
#
```

# 参考情報

1. [bashのプロセス置換機能を活用して、シェル作業やスクリプト書きを効率化する](http://sechiro.hatenablog.com/entry/2013/08/15/bash%E3%81%AE%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E7%BD%AE%E6%8F%9B%E6%A9%9F%E8%83%BD%E3%82%92%E6%B4%BB%E7%94%A8%E3%81%97%E3%81%A6%E3%80%81%E3%82%B7%E3%82%A7%E3%83%AB%E4%BD%9C%E6%A5%AD%E3%82%84%E3%82%B9#f2)
2. [シェルスクリプトが '> $logfile 2>&1' だらけにならなくて済んだ話](http://memo.laughk.org/2014/04/24/shell_exec_log.html)
3. [（今さら） vmstat の結果に時間をつけてファイルに出力する](http://d.hatena.ne.jp/higher_tomorrow/20110601/1306887919)
bashテンプレート

# bashテンプレート

```sh
#!/bin/bash

# Parameter
## User setting
readonly PARAMETER="hogehoge"
readonly ARRAY=( "foo"
                 "bar"
                 "baz" )
declare -Ar HASH=( ["key1"]="value1"
                   ["key2"]="value2" )
readonly HOGE_FILE="/path/to/file.txt"
readonly HOGE_DIR="/path/to/dir"
readonly HOGE_FILENAME="file.txt"
readonly HOGE_DIRNAME="dir"
## Administrator setting
readonly WORK_DIR=$(dirname $(readlink -f $0))

# Subroutine
function usage() {
cat <<_EOT_
Usage:
  $0 -u username -p password [-f filename] arg1 ...

Description:
  hogehogehoge

Options:
  -u    uuuuuuuuuu
  -p    pppppppppp
  -f    ffffffffff
  -h    display help
_EOT_
exit 1
}

function validate_input_data() {
  local _input_data=$1
  local _message=$2
  
  if [ -z "$_input_data" ]; then
    echo $_message 1>&2
    return 1
  fi
  return 0
}

function validate_file() {
  local _filename=$1
  local _message=$2
  
  if [ ! -f "$_filename" ]; then
    echo $_message 1>&2
    exit 1
  fi
  return 0
}

# Main
## check options and arguments
if [ $# = 0 ]; then
  usage
  exit 1
fi

if [ "$OPTIND" = 1 ]; then
  while getopts u:p:f:h OPT
  do
    case $OPT in
      u)
        readonly USERNAME=$OPTARG
        echo "[debug]USERNAME is $USERNAME"            # for debug
        ;;
      p)
        readonly PASSWORD=$OPTARG
        echo "[debug]PASSWORD is $PASSWORD"            # for debug
        ;;
      f)
        readonly FILENAME=$(basename $OPTARG)
        echo "[debug]FILENAME is $FILENAME"            # for debug
        validate_file $FILENAME "No such file: '${FILENAME}'"
        ;;
      h)
        echo "[debug]h option. display help"           # for debug
        usage
        ;;
      \?)
        echo "Try to enter the h option" 1>&2
        ;;
    esac
  done
else
  echo "No installed getopts-command" 1>&2
  exit 1
fi

echo "[debug]before shift"                       # for debug
shift $((OPTIND - 1))
echo "[debug]display other arguments [$*]"       # for debug
echo "[debug]after shift"                        # for debug

if [[ -z $USERNAME || -z $PASSWORD ]]; then
  echo "No specify argument(s) of -u option or -p option" 1>&2
  exit 1
fi

## main
echo "show array"                         # for debug
for i in ${ARRAY[@]}
do
  echo "$i"
done

echo "show array"                         # for debug
for (( i=0; $i < ${#ARRAY[@]}; ++i ))
do
  echo ${ARRAY[$i]}
done

echo "show hash"                          # for debug
for key in ${!HASH[@]}
do
  echo "${key} -> [${HASH[$key]}]"
done

exit 0
```
Xcodeでデバッグ実行中にクラッシュした時に捗るブレークポイント設定


ずばりこの設定です。

![Screen Shot 2015-07-04 at 12.41.55 PM.png](https://qiita-image-store.s3.amazonaws.com/0/19398/6b3345fe-37a6-65c7-f621-ab071bba012e.png "Screen Shot 2015-07-04 at 12.41.55 PM.png")

Exceptionは`All`でも良いですが、実際の動作に問題無い内部例外に反応しちゃったりするので`Objective-C`にしてます。
**[`po $arg1`について気になると思いますが、そこだけ見たい方はこちら](http://qiita.com/mono0926/items/bf70c7ef15db046ee163#po-arg1について)**

通常、クラッシュするとここでブレークしちゃうため、

![Screen Shot 2015-07-04 at 12.44.34 PM.png](https://qiita-image-store.s3.amazonaws.com/0/19398/34f0df8a-83af-0cfa-b333-6ba7747f24a1.png "Screen Shot 2015-07-04 at 12.44.34 PM.png")


左下の＋ボタンから、これを追加しておくとクラッシュ時に原因箇所で止まって捗るテクはそこそこ有名だと思います。

![Screen Shot 2015-07-04 at 12.43.47 PM.png](https://qiita-image-store.s3.amazonaws.com/0/19398/cc97277c-573f-a8b6-7969-fe16bc6e310c.png "Screen Shot 2015-07-04 at 12.43.47 PM.png")

このようにブレークする場所が分かりやすくなる:
![Screen Shot 2015-07-04 at 12.45.57 PM.png](https://qiita-image-store.s3.amazonaws.com/0/19398/35718b69-4b66-b129-c4a8-9130c538d0c2.png "Screen Shot 2015-07-04 at 12.45.57 PM.png")

# `po $arg1`について

さらに、こちらは有名じゃないと思いますが、`Debugger Command`アクションに以下を入力しておくと、

```objc
po $arg1
```

このようにブレークすると同時に自動的に原因のログを出力してくれます。

![Screen Shot 2015-07-04 at 12.48.48 PM.png](https://qiita-image-store.s3.amazonaws.com/0/19398/a54d2e8e-eedf-ba6e-67e1-2cd5951362ac.png "Screen Shot 2015-07-04 at 12.48.48 PM.png")

無設定だと、1回目にブレークした時点ではクラッシュについてのログは何も出ていなくて、1・2回デバッグcontinueボタンを押すと、ログが吐き出されます。
即座に原因が出力されると、地味にけっこう捗ります。

もちろん`po $arg1`は手動で打っても良いですが、それを自動的にやってくれる指定ということです。

# ネタ元

ここで盛り上がってて、試してみたら便利だったのでご紹介しました(　´･‿･｀)

- [Xcode: One Weird Debugging Trick That Will Save Your Life](http://natashatherobot.com/xcode-debugging-trick/)
Pyinstaller で Python スクリプトを Windows で実行可能な .exe にする

# Python スクリプトを Windows で実行可能な .exe にする

これまでは、py2exe や CX_Freeze など、setup.py をいちいち書かないといけませんでした。最近は PyInstaller がオススメということらしいので試してみた。

# インストール

`pip install pyinstaller`

# 対象スクリプト

```
C:\Users\kounoike\Documents\python\installer-test>type hello.py
#!python
# coding: utf-8

print "hello world"

C:\Users\kounoike\Documents\python\installer-test>python hello.py
hello world
```


# .exe の作成

`pyinstaller hello.py`

これだけ。面倒な setup.py の記述も何もなし。dist\hello 以下に hello.exe と必要なライブラリ群が出来上がる。

# 問題点

どうも py2exe などに比べて過剰にパッケージを取り込んでしまうようで、

```py
#!python
# coding: utf-8

import matplotlib.pyplot as plt

print "hello world"
```

と書き換えただけで、dist 以下が100MBにも膨れ上がる。見てみると、IPython とか、QT4、OpenGLなど余計なものがまぎれこんでいるのがわかる。

# そこで virtualenv ですよ。

というわけで、virtualenv を使いましょう。http://qiita.com/kounoike/items/14bfd7c328be0d69c770 などを参考にしてください。

PyInstaller を virtualenv で使う際の注意点は一つ。pywin32 を easy_install で入れておきましょう。

# 追記＠2015/07/21

あれ、やっぱり日本語フォルダに置くとうまく動かない・・・

* ネットワークドライブの日本語フォルダ作ってそのフォルダをシフト右クリックしてコマンドプロンプトで開く→大丈夫
* デスクトップに日本語フォルダを作ってそのフォルダをシフト右クリックしてコマンドプロンプトで開く→ダメ

なんでネットワークドライブだと大丈夫なんだろう？
Xcode6.3で作成したMacOSアプリケーションがMavericksで起動できない問題

先日MacOS用クリップボード拡張アプリ「[Clipy](http://clipy-app.com)」をリリースしました。
Clipyの開発については[先日のQiitaの記事](http://qiita.com/econa77/items/1848bf3fdfb7127ca9b8)を参照ください。

Clipyですが、リリース当初より、Maverickseで起動できない問題が報告されておりました。
こちらでMavericksの実機デバッグを行っていなかったためのバグだったのですが、修正に時間がかかったため修正方法を記載しておきます。

## Mac OS10.9でStoryboardが使用できない
Xcode6.3でCocoaアプリケーションを作成した際、起動時のファイルはデフォルトでStroyboardが使用されています。
今回が初Macアプリケーションの作成ということもあり、なにも疑わずにこのまま作成したのですが、StoryboardはYosemiteからしか使用できません。
[Stackoverflow](http://stackoverflow.com/questions/24203113/storyboards-for-osx-app-in-xcode-6)

そのため、Mavericks対応アプリケーションを作成するためには、起動ファイルをxibで作成しなければなりません。

## xibの作成
Xcodeの`New file`より、`OS X` → `User Interface` → `Main Menu`より選択してください。

<img src="https://qiita-image-store.s3.amazonaws.com/0/1500/95aefdef-1f02-cfa4-c544-8873a378ad21.png" width="400px" />

この時、Windowから作成してもいいのですが、plistファイルにxibの定義が自動で挿入されないため、MainMenuでの作成をおすすめします。

その後Main Interfaceを作成したxibに変更してください。

<img src="https://qiita-image-store.s3.amazonaws.com/0/1500/7d4a47a2-c6d3-d96f-2923-030af0cc8e88.png" width="300px" />


まさかMavericksでstoryboardが使えないと思わずかなりはまってしまいました。
RSenseがすごい

※追記 (2017/4/3)
neocompleteとrsenseはもう古い!
[Neovim](https://github.com/neovim/neovim) + [deoplete](https://github.com/Shougo/deoplete.nvim) + [deoplete-rct](https://github.com/Shougo/deoplete-rct)を使いましょう。

※追記 (2016/3/27)
rsenseは開発が再開された模様 [rsense/rsense](https://github.com/rsense/rsense)
ただneocomplete-rsense.vimはgithubから削除されたのでこのままでは使用できない。
時間ができたら調べる予定。

※追記 (2015/9)
2010年頃から追記時点(2015/9)では開発が止まってる模様。

RSenseとvim neocompleteを連携させることによってpry並の補完が得られる。
(pry並は言い過ぎかもしれない)

補完だけでなく定義へのジャンプ機能なども備えている。
RSenseの詳細は公式サイトを参照
http://cx4a.org/software/rsense/index.ja.html


プラグインとその設定は以下の通り。
なおneocompleteの導入や設定などは各自で済ませてほしい。

```vim
" rsenseをインストール
" NeoBundle 'marcus/rsense' :helpが正常動作しない (執筆時点)
NeoBundle 'NigoroJr/rsense'
NeoBundleLazy 'supermomonga/neocomplete-rsense.vim', {
    \ 'autoload' : { 'insert' : 1, 'filetype' : 'ruby', } }

" 補完の設定
if !exists('g:neocomplete#force_omni_input_patterns')
  let g:neocomplete#force_omni_input_patterns = {}
endif
let g:neocomplete#force_omni_input_patterns.ruby = '[^.*\t]\.\w*\|\h\w*::'

let g:rsenseUseOmniFunc = 1
```

これで強力な補完が使えるようになる。
~~うまく型を認識できない事もあるが、今後改良されるはず。~~

ちなみにmarcus/rsenseとNigroJr/rsenseの違いはコメントにもある通り、\:helpが正常に動作するかどうかという点。(執筆時点)
Windows で Python Virtualenv を作成して Jupyter を立ち上げるまで

# Python の導入

導入直後に Virtualenv を作成するので何でもかまわないです。(ここでは Python(x,y)でやってます。64bit 版だと numpy で一苦労するらしいです）

# virtualenv の導入

Python(x,y)などなら導入済みです。生の Python を入れた場合は `pip install virtualenv` `pip install virtualenvwrapper-win` などしましょう。

# virtualenv の作成

```
C:\Users\kounoike>mkvirtualenv jupyter
New python executable in jupyter\Scripts\python.exe
Installing setuptools, pip, wheel...done.
(jupyter) C:\Users\kounoike>lsvirtualenv

dir /b /ad "C:\Users\kounoike\Envs"
==============================================================================
jupyter

```

# numpy のインストール

たいていのパッケージは pip で入るのだけど、そうじゃないパッケージがいくつかあって、それらは easy_install で入れないとならない。そのひとつが numpy なので、個別にインストールしておく。

http://qiita.com/icoxfog417/items/02e1f6f34dc147afaa27 を参照すると以下の手順でインストールできる。

## ダウンロード＆展開

http://sourceforge.net/projects/numpy/files/NumPy/ から python のバージョンにあったバイナリをダウンロードする。python2.7 なら numpy-1.9.2-win32-superpack-python2.7.exe をダウンロードする。

更にダウンロードした exe を 7-Zip などを使って展開すると numpy-1.9.2-sse3.exe などが出てくるので、それをどこかに保存する。

## インストール

`easy_install numpy-1.9.2-sse3.exe`

# Jupyter のインストール

pip で入るので `pip install ipython[notebook]` するだけ。

# matplotlib のインストール

Jupyter(IPython) 単体じゃ面白くないので matplotlib や pandas を入れておく（このために numpy が必要だった）。numpy さえ入っていれば pip で終わり。


`pip install matplotlib pandas`

# Jupyter の実行

`ipython notebook`

# この後

せっかく Jupyter なので、R なり Julia なりのカーネルを入れましょう。
Array.prototype.indexOf は線形検索してる。

##事象
JavaScriptで数値配列を扱ってたところ、ソート済の数値の配列の中に目的の数値があるか探すところで速度がでない。

##原因
Array.prototype.indexOfが線形探索らしいので、遅いらしい。
最初に書いたコードが概ねこんな感じ
`var numberList = [1,5,9, .... , 25321];`
`var exists = !(numberList.indexOf(number) < 0)`
処理時間はO(n),配列が増えるほど比例的に処理時間が増加してしまう。

##対応
ソート済の配列が相手だったので、[二分検索](https://ja.wikipedia.org/wiki/%E4%BA%8C%E5%88%86%E6%8E%A2%E7%B4%A2)すればO(log2 N)まで落ちる。
ちょっと探せば実装はあったのでこれを仕込んで処理時間の問題を解決した。
https://gist.github.com/Wolfy87/5734530

##ライブラリを使おう
そのあとに、
underscore.jsやlodash.jsの_.indexOfはフラグ渡したら二分検索するで！ってかいてあるのに今きづいてシュンとした。
プログラミングクイズ的なところに実装をコピペで投稿してたからライブラリ使いにくかったんだよ。と言い訳して終わり。。。はぁ
CentOS7でのポート転送

#概要
チラ裏が止まらない・・・。
CentOS7を再インストールした時に、何故かputtyでポート転送するとエラーが出た時の覚書。

#原因/解決方法

CentOS7を再インストールした際は、hostname(/etc/hostname)だけではなく、hosts(/etx/hosts 127.0.1.1)を追記する必要がある！
こうしないと、puttyで転送先にホスト名を入れても、何故か見つけてくれない。

```bash:/etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

127.0.1.1   wakisuke.myhome.cx
```

##エラーログ

エラーでてたのはこんな感じ。（転送テストでlocalhost:8080 <-> wakisuke.myhome.cx:80の設定時）

```bash:/var/log/secure
Jul  5 00:53:35 wakisuke sshd[3642]: error: connect_to wakisuke.myhome.cx port 80: failed.
Jul  5 00:54:16 wakisuke sshd[3642]: error: connect_to wakisuke.myhome.cx port 80: failed.
Jul  5 00:59:56 wakisuke sshd[3642]: error: connect_to wakisuke.myhome.cx port 80: failed.
Jul  5 00:59:56 wakisuke sshd[3642]: error: connect_to wakisuke.myhome.cx port 80: failed.
Jul  5 01:00:58 wakisuke sshd[3642]: error: connect_to wakisuke.myhome.cx port 80: failed.
Jul  5 01:01:08 wakisuke sshd[3642]: error: connect_to wakisuke.myhome.cx port 80: failed.
```

##メモ

putty側のポート転送先をlocalhostとしておけば、SSHアクセス先のサーバ（自分自身）を的確に指せるため、繋ぐことができる。
でもホスト名指定しているのになんで効かないねん！てきなね、、、
![a.PNG](https://qiita-image-store.s3.amazonaws.com/0/32577/3f9a0cc2-5c20-7d9a-2c96-0f8d01c59598.png)

###sshd_confg
今回のポート転送では、自宅 <-> 外部だけで、踏み台となるようなサーバもいないため、下記設定で事足りる。
<dl>
  <dt>AllowTcpForwarding: Yes</dt>
  <dd>ポート転送の許可</dd>
  <dt>GatewayPorts: No</dt>
  <dd>踏み台が１つあって、その踏み台はローカルの外からアクセスがあって、それを更に転送するような場合の転送許可</dd>
</dl>
Swiftで列挙型を使う


# 基本形

例えば、性別に関する列挙型を利用したいとします。

まず、`NSObject`のサブクラスとして`Sex.swift`というファイルをつくります。
作成したら、以下のようなクラスがつくられるかと思います。

```
import UIKit

class Sex: NSObject {
   
}
```

これを、以下のように書き換えます。

```
import UIKit

enum Sex {
	case MAN
	case WOMAN
}
```

そうすると、他のViewControllerなどでは以下のように利用できます。

```
println(Test.WOMAN.hashValue)
→ 1
```

# WOMANの値に数値を指定して、取ってみよう
次に、MANとWOMANがどういった値を持つかを指定してあげます。
上記のコードを以下のように書き換えます。

```
enum Sex:Int {
    case MAN = 1
    case WOMAN = 2
}
```

すると、WOMANの値を取り出すときは、以下のように書きます。

```
println(Test.WOMAN.rawValue)
→ 2
```

# WOMANのとき、文字列を取れるようにしてみよう
次に、指定した定数によって、ある文字列を返したり、数値を返したり等いろいろとやりたいという場合があると思います。
今回は、WOMANを指定した時は「女性」という文字列を取れるようにしたいと思います。

以下のように列挙型の中に関数を入れることで、それを可能にします。

```
enum Sex:Int {
    case MAN = 1
    case WOMAN = 2
    func toString() -> String {
        switch(self) {
        case .MAN:
            return "男性"
        case .WOMAN:
            return "女性"
        }
    }
}
```

すると、以下のように呼び出すことができ、「女性」という文字列を取得できます。

```
println(Sex.WOMAN.toString())
→女性
```
NSTextViewのフォントがうまく変更できないとき

### 問題

XcodeのStoryboardで`NSTextView`に対するフォントの変更が上手くいかない。

### 詳細

下の画像の`YuMincho Medium 13.0 [T]`の部分を押すとフォント選択パネルが出てくるが、そこで目当てのフォントをクリックして選択しても閉じると元に戻ってしまう。

### 解決法

![Main_storyboard_and_keisei.png](https://qiita-image-store.s3.amazonaws.com/0/15144/07426645-ca3e-e32a-4cdc-62e3ebeb189e.png)

矢印の部分のフォントがそのまま設定になるようです。

上手く行かない場合はPagesやTextEditなどで設定したいフォント及びフォントサイズで文字列を描画してコピーペーストしてみてください。

Macの、文字列のスタイルを保持するシステムが悪さしていたようです。
CentOS5にpdftoppmをインストールする


CentOS6には標準で入っているのにCentOS5だとyum install popplerしても何故かpdftoppmが含まれない・・。しかたないのでソースから直接インストール。

## 手順

```
# 必要なライブラリをインストール
sudo yum install fontconfig-devel libjpeg-devel

# pdftoppmのコンパイル、インストール
wget http://poppler.freedesktop.org/poppler-0.22.4.tar.gz
tar xzvf poppler-0.22.4.tar.gz
cd poppler-0.22.4

./configure
make
sudo make install

# 日本語のpdfを画像化するのに必要
wget http://poppler.freedesktop.org/poppler-data-0.4.6.tar.gz
tar xzvf poppler-data-0.4.6.tar.gz 
cd poppler-data-0.4.6
sudo make install
```

動作確認

```
$ type pdftoppm
pdftoppm is /usr/local/bin/pdftoppm
```


## 参考
- [さくらインターネットでpdftoppm | ダリの雑記：WEBプログラム版](http://www.nandani.sakura.ne.jp/web_all/server/2670/)
- [Popplerをインストール - oosukaの日記](http://d.hatena.ne.jp/oosuka/20110709)
ES6/TypeScriptでヒアドキュメント

JavaScriptでは文字列を扱う機会が多いのに、他の言語ではよくある[ヒアドキュメント](https://ja.wikipedia.org/wiki/%E3%83%92%E3%82%A2%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%88)が無く、１行ごとに繋いだりしていた。

ES6/TypeScript(v1.4以降)では「[テンプレートストリングス](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/template_strings)」という名前で使えるようになっている。最初は変数展開のコード例しか見当たらなかったので出来ないのかと思っていたが、複数行もちゃんとできる。

## コード

```ts:ES6/TypeScript
"use strict";
let hoge = 123;
const HERE = `
	<xml>
		<tag>ANY</tag>
		<tag>${hoge}</tag>
	</xml>
`;
console.log(HERE);
```

## 出力：

```
% node src/Heredoc.js        

	<xml>
		<tag>ANY</tag>
		<tag>123</tag>
	</xml>

```

## 参考：ES3/5むけコード

ちなみに`tsc -t "ES5"`でコンパイルすると以下のコードが吐かれていた。

```javascript
"use strict";
var hoge = 123;
var HERE = "\n\t<xml>\n\t\t<tag>ANY</tag>\n\t\t<tag>" + hoge + "</tag>\n\t</xml>\n";
console.log(HERE);
```

改行やタブが`\n`や`\t`に変換されるようだ。
自前スクロールバーを出しつつスクロールしたい

# スクロールバーが嫌いだ！
「自分でスクロールバーをCSSでいじりたい」かつ「`mousewheel`や`touchstart`をいじりたくない」という思いがあったので、ちょっと試してみたのがこちらのコード。
https://jsfiddle.net/lovalotta/azdjee3g/

# これだとクリックイベントを処理しない
残念ながら、上記コードだとコンテンツ部分 `.content` のマウスイベントは `mouse-events: none` によって破棄（スルー）されてしまうので、`<a href>`なんかがあってもクリック対象にならない。これはがっかりだ。

どうやって解決していいかは思いつかないです。
docker コマンド 基本のキ（nginx のコンテナを実行してみる）

:::note info
Docker Desktop を使ったバージョンはこちらです。docker コマンド自体は何も変わりませんが:blush:
[[docker コマンド 基本のキ（nginx のコンテナを実行してみる）[2025年4月最新]](https://qiita.com/thirota/items/a4cb744c539a0a154181)
:::

こんにちは。
Docker の軽快な動作に驚いている者です。
[前回](http://qiita.com/thirota/items/4797db465150f5ac8f63)は boot2docker のインストールまで試しました。
今回は nginx のコンテナを作成しながら、基本的な docker コマンドを学びたいと思います。

# 環境
* Mac OS X Yosemite
* VirtualBox 4.3.28
* boot2docker 1.7.0

# 準備
`boot2docker up` で Linux 仮想マシンは起動しているものとします。

# Docker イメージの取得
Docker Hub から最新の Docker イメージを取得します。

```
$ docker pull nginx:latest
```

取得済みのイメージは `docker images` で確認できます。

```
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
nginx               latest              319d2015d149        2 weeks ago         132.8 MB
```

# コンテナの作成と実行
`docker run` でコンテナを作成して実行します。

```
$ docker run --name my-nginx -d -p 8080:80 nginx:latest
```

# コンテナの状態確認
```
$ docker ps
CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS              PORTS                           NAMES
ea496b1839ff        nginx:latest        "nginx -g 'daemon of   3 minutes ago       Up 3 minutes        443/tcp, 0.0.0.0:8080->80/tcp   my-nginx
```

# nginx の動作確認
仮想マシンのIPアドレスを確認後、ブラウザで nginx へアクセスします。
ポート番号は `docker run` で指定した8080番です。

```
$ boot2docker ip
192.168.59.103
```
```
http://192.168.59.103:8080/
```

# コンテナの停止
```
$ docker stop my-nginx
```
```
$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
```

`-a` オプションを付けると終了したコンテナを確認できます。

```
$ docker ps -a
CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS                          PORTS               NAMES
6337c95a1542        nginx:latest        "nginx -g 'daemon of   2 minutes ago       Exited (0) About a minute ago                       my-nginx            
```

# コンテナの再実行
終了したコンテナを再度実行します。

```
$ docker start my-nginx
```
```
$ docker ps
CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS              PORTS                           NAMES
6337c95a1542        nginx:latest        "nginx -g 'daemon of   5 minutes ago       Up 18 seconds       443/tcp, 0.0.0.0:8080->80/tcp   my-nginx            
```

# コンテナの削除
終了したコンテナを削除します。

```
$ docker rm my-nginx
```
```
$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
```

# Docker イメージの削除
不要な Docker イメージを削除します。

```
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
nginx               latest              319d2015d149        2 weeks ago         132.8 MB
```
```
$ docker rmi nginx:latest
```
```
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
```

# まとめ
Docker イメージの取得からコンテナの実行と停止、イメージ削除までの一連の作業を確認できました。
慣れるまでは多少わかりにくいので、コンテナのライフサイクルをご自分で絵に描いてみると理解が深まると思います。

# 参考
* Dockerエキスパート養成読本
    * http://www.amazon.co.jp/dp/4774174416
* https://registry.hub.docker.com/_/nginx/
「第１章」Eclipse スタート

<h2>Eclipseとは</h2>
Eclipse（「イクリプス」または「エクリプス」）は、IBMによって開発された統合開発環境 (IDE) の一つ。高機能ながらオープンソースであり、Javaをはじめとするいくつかの言語に対応する。Eclipse自体はJavaで記述されている。

**<h1><font color=orange>１．Eclipseのダウンロード</font></h1>[Link] http://mergedoc.osdn.jp/**

①　Eclipse 4.5 Mars Pleiades All in One クリック。
![image](https://qiita-image-store.s3.amazonaws.com/0/84788/600e7034-a10f-28bb-7f97-3f59dd7803b9.png)

②　・64bit Full Edition **Ultimate** Download。※ 約1.49GB
![image](https://qiita-image-store.s3.amazonaws.com/0/84788/1c5b8d17-c0e7-ed5f-8c84-866f19a1ed8b.png)

③　ZIP解凍。
:bangbang: ファイル名を変更し、「C:/」の直下で解凍する（名前が長すぎて解凍に失敗するので）:bangbang: 
pleiades-e4.5-ultimate-jre_20150624.zip　→　e.zip　に変更し解凍。
![eclipse.jpg](https://qiita-image-store.s3.amazonaws.com/0/84788/16e80d02-ea36-e584-28cd-5dc60f3fd9b8.jpeg)

④　Eclipse 実行。（初期実行は結構時間がかかる）
![image](https://qiita-image-store.s3.amazonaws.com/0/84788/7491913b-fe8a-de7c-fb50-7e7eca2a929e.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/84788/57861bc9-ae70-d6db-e5a9-e71098e27ca0.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/84788/949f14fd-73f6-eee2-bd88-d8b1011e0cff.png)

⑤　チェックボックスに☑を入れて、OKボタンを押す。
![image](https://qiita-image-store.s3.amazonaws.com/0/84788/98da4522-9fc3-cd7d-e029-679e54433fa3.png)

⑥　Pythonのパス設定ウィンドウが出てくる。選択された変更を適用を押す。
![image](https://qiita-image-store.s3.amazonaws.com/0/84788/189534c6-0d00-024e-f223-a1ccbd445372.png)

⑦　インストール完了。 :white_flower: 
![image](https://qiita-image-store.s3.amazonaws.com/0/84788/ee2bf00c-93bf-e550-0e66-e3c88392ff6a.png)
「第０章」目的

<h2>「JAVA７公式サポート終了」</h2>
　2015年4月30日に、オラクルコーポレーションが提供している「Java SE 7（Java Platform, Standard Edition 7）」の公式サポートが終了しました。
　公式サポートが終了すると、新たな脆弱性が発見されても、アップデートが提供されなくなります。アップデートが提供されなくなると、脆弱性を悪用した攻撃によるウイルス感染などの危険性が高くなります。


**<h1><font color=orange>「幅広い知識を身につけよう」</font></h1>**
　JAVAだけではなく、他の組込み技術やLinuxなど幅広い知識を身につけることで視野が広がり、JAVAの良さや改善点が見えてきます。

**<h1><font color=orange>「最新の技術を身につけよう」</font></h1>**
　JAVAの最新版は現在バージョン8です。
ハードウェアの生産がそのスピードに追いついていないために、市販されているハードウェアで動いているのはバージョン7が主流です。けれども、技術はどんどん進化しています。1年後にはJAVA8使ったハードウェアが主流になっているかもしれません。開発を行うため、最新の技術を身につけておく必要があります。

**<h1><font color=orange>「作成中」</font></h1>**
・・・
今更ながらmacでdockerを試す

今更ながら、macでdockerを試す。
ただのメモ。

# 準備
以下のものをインストールしておく必要があり。
・ Virtual box
・ Homebrew


# 環境準備
Virtual boxのみインストールしていなかったため、インストール。
以下のサイトからダウンロード。
https://www.virtualbox.org/wiki/Downloads
※VirtualBox X.X.XX for OS X hosts　からダウンロード

# boot2docker のインストール
以下のコマンドでインストール

```
brew update
brew tap homebrew/binary
brew install docker boot2docker
```

※brew updateを実行した時に以下のエラーが出た
```Error: undefined method `to_sym' for nil:NilClass```
以下のコマンドで解決

```
brew doctor
brew update
```

# イメージをダウンロードとVMの作成
以下のコマンドを実行
```boot2docker init```

# boot2dockerのVMの起動
以下のコマンドでVMを起動
```boot2docker up```

以下のコマンドでrunningとなっていればOK
```boot2docker status```

以下のものが出力されるので、環境変数に追加するため、.bash_profileに追記

```
export DOCKER_HOST=(略)
export DOCKER_CERT_PATH=(略)
export DOCKER_TLS_VERIFY=1
```

# Centosのイメージのダウンロード
以下のコマンドでCentos6のイメージをダウンロード
```docker pull centos:centos6```
centos6ではなく、latestを入力すると最新バージョンがダウンロードできるが、Centos7は色々と仕様が変わり、不慣れなためCentos6を使用。

ダウンロードしたイメージの一覧は以下のコマンドで確認できる。
```docker images```


※dockerのコマンドを入力した時に、x509: certificate is valid for ......というエラーが出てきたが以下のサイトに書いてある方法を試したら解決。
> boot2docker ssh
> sudo vi /var/lib/boot2docker/profile
> /var/lib/boot2docker/profile
> wait4eth1() {
>         CNT=0
>         until ip a show eth1 | grep -q UP
>         do
>                 [ $((CNT++)) -gt 60 ] && break || sleep 1
>         done
>         sleep 1
> }
> wait4eth1
> exit
> boot2docker stop
> boot2docker up
http://qiita.com/74th/items/d77dc293140783afbfd0


# 名前をつけてコンテナを作成
以下のコマンドでコンテナを作成し、起動
```docker run -t -i -d -p 80:80 --name centos6 centos:centos6 /bin/bash```

抜けるときは、以下のコマンドを入力
```exit```

コンテナが作成されたことは以下のコマンドで確認可能
```docker ps -a```

コンテナを操作したいときには以下のコマンドを入力
```docker attach centos6(コンテナ名)```

# コンテナの動作を試してみる
コンテナに以下のコマンドで、httpdをインストール。

```
yum install httpd
service httpd start
```

この状態で、コンテナのIPにブラウザからアクセスすると、apacheのデフォルトのページが表示される。
コンテナのIPは以下のコマンドで確認
```boot2docker ip```

# 最低限なコマンド
コンテナの削除
```docker rm (コンテナ名)```
コンテナの停止
```docker stop (コンテナ名)```
コンテナの起動
```docker start (コンテナ名)```
「第２章」MySQLのインストール


![image](https://qiita-image-store.s3.amazonaws.com/0/84788/01cc7581-40cc-bf42-927d-cd6c07dba90e.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/84788/9c2013c0-4be1-c73a-82f9-86fdda36a41c.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/84788/43b9b47a-c74b-8876-4d1d-43172d2da6f5.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/84788/38d96b7e-ba8e-fdf0-789a-ab8a6781c38f.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/84788/8e8f8944-2621-392d-a1ce-a5092a4cb283.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/84788/62b3171a-d6f2-11a1-9f46-5c13d49d66a6.png)
インクルードしているファイル一覧を作る(2)


[前回](http://qiita.com/tokudiro/items/05d079812cd7f679153a)のファイル一覧というのでは、
実際のヘッダファイルがどこにあるか不明だった。
なので、ファイルを特定したいと思う。

# スクリプト
絶対パスヘッダリストのファイルから、
該当のヘッダファイルを特定するスクリプトを作成する。

- salvage_match.rb

```rb
def salvage(fpath, fpaths)
  list = []
  fpath.gsub!(/\\/){'/'}
  fpath = File.expand_path(fpath, '/') # remove double dots from relative path
  fpath.gsub!(/^[A-Z]:/){''} # for Windows
  fpath.gsub!(/^\//){''} # relative path

  #puts "salvage keyword = #{fpath}"

  reg = Regexp.new(".*\/#{fpath}")

  File.open(fpaths) do |f|
    f.each_line do |line|
      line.chomp!
      line.gsub!(/\\/){'/'} # for Windows
      if line =~ reg
        list << line
      end
    end
  end
  list
end

file = ARGV[0].dup
files = ARGV[1]

exit(-1) if file == nil
exit(-1) if files == nil

salvage(file, files).each do |x|
  puts x
end
```

# 使ってみる

```
ruby salvage_match.rb ../include/a.h list.txt
```

用意した絶対パスヘッダリストは以下の通り。
- list.txt

```text
C:\work\test-src\include\a.h
C:\work\test-src\include\b.h
```

- 結果

```
C:/work/test-src/include/a.h
```

特定できている。
さて、前回のスクリプトと組み合わせてみよう。
次回に続く(予定)。