OmniAICreator/Qiita-1.07M huggingface dataset:
bash history から特定のコマンド履歴を削除する

## 履歴番号を指定して履歴削除する
パスワードを平文でコマンドラインに書いた場合など、狙い撃ちで履歴から削除したい場合がある.

```
history -10
history -d 履歴番号
```
* 直近10個のコマンド履歴を表示して履歴番号を確認し、番号を指定して削除する.

## 特定パターンを履歴削除する
これが、この記事の本題.
grep、diff、less、man、git status、git log などの内容確認や状況確認コマンドは、セッション中は履歴に残して Ctrl+R や Ctrl+P で再利用したいが、仕事が終われば作業記録上のゴミである. そこで履歴をファイルに書き出し、egrep -v で不要なパターンを除去して、その結果を履歴に読み込むことで履歴から削除する. この一連の作業をシェルスクリプトにしたいところだが、履歴はシェル環境に保持されており、シェルスクリプトは実行開始時にシェル環境を複製し、終了時に破棄してしまうので不適切. そこでシェル関数として作成し、それを ~/.bashrc に直接書くか、関数記述ファイルを ~/.bashrc から source で取り込む.

``` function.sh

histclean()
{
  # save current history to $HISTFILE.
  history -w
  if [ "$1" == "-e" ]; then
    # edit history
    ${EDITOR:-vi} $HISTFILE
    history -c && history -r $HISTFILE
  else
    # remove status check commands from history.
    local new=$(mktemp)
    command egrep -vw \
      -e '^(ls|ll|lt|la|l|h|[ef]?grep|ps|diff|less|man|help|histclean)' \
      -e '^git (status|show|grep|diff.*|log.*|[a-z]l|st|ss|crlf)' \
      $HISTFILE > $new
    history -c && history -r $new && history -w
    command rm $new
  fi
}
```
* egrep に与える除外パターンはお好みで調整する.
* -e オプション指定時は、エディタで履歴ファイルを編集する.

## 全履歴を消す
過去のコマンド履歴を全て忘れたい.

```
history -c && history -w
```
*  history -w を忘れると、今回セッションの履歴は消えるが、前回セッションの履歴は残るかもしれない.
*  ログアウト処理で $HISTFILE への書き戻しをどのようにしているのかに依存する.

## 最初から履歴に入れないための設定
ここから先は、改めて書くことでもないが、網羅的な資料としたいのであえて記す.
履歴用の変数を設定することで、履歴対象から外すことができる. 設定は ~/.bashrc に記入すればOK.

### 重複コマンドなどを履歴に残さない

``` ~/.bashrc
HISTCONTROL=ignoreboth
```
* 直前と同じコマンドは履歴に残さない. 
* コマンド行の先頭に空白を入れると履歴に残さない.

### 指定したパターンに合致するコマンドを履歴に残さない

```~/.bashrc
HISTIGNORE='?:??:???:exit'
```
* 履歴に残したくないパターンをコロンで区切って記述する. 上記の例では１～３文字のみのコマンド(ls,cd,pwd 等)および、exit を除外指定している.

##【おまけ】コマンド実行日時を履歴に記録する設定

```~/.bashrc
HISTTIMEFORMAT='%F %T '
```
* 設定する書式は strftime と同じ。詳細は ```man strftime```
docker for macコンテナ内の時刻を日本時間に[Aws\S3\Exception\RequestTimeTooSkewedException]

表題の件、

```docker-compose.yml
container_name:
  volumes:
    - /etc/localtime:/etc/localtime:ro
```

としてるのに時刻がUTC。


```
$ date
Fri Mar  3 10:33:46 UTC 2017
```

そのおかげでS3のSDKがエラーをはくようになった、困る。

```
[Aws\S3\Exception\RequestTimeTooSkewedException] The difference between the request time and the current time is too large.
```

そこでコンテナの時刻を合わせるには
下記のようにしたらできた。

```docker-compose.yml
container_name:
  volumes:
    - /etc/localtime:/etc/localtime:ro
  links:
    - mysql-common:mysql
    - apache-api:apache-api-fsefo.local.lcl
  environment:
    VIRTUAL_HOST: tag-manager-fsefo.local.lcl
    TZ: Asia/Tokyo
  entrypoint: /etc/services.sh
```

以前の環境はwindows x vagrantの上にdockerのっけていたのだが(docker-toolbox, docker-machine使用)
docker for macではそれらとはまた別の仮想環境が使われるため
おかしなことになったのだろう。

いろんなとこ見てもうまくいかなかったので一応残しておこう。。
Vueでの配列番号直指定での編集はダメ。ゼッタイ。

# 概要
こういう配列番号を直指定で上書く書き方よくやるんだけど、Vueを使用してる時はしてはいけない。

```js:js
var test_array = [1, 2, 3, 4]
test_array[1] = 5 // [1, 5, 3, 4]
```

なぜか。

それは**算出プロパティ**が正しく動かなくなるからである。

# 何があった？
リストの編集機能とかよく作るじゃない。
で、編集用の子コンポーネントモーダル作って、編集したらプレビューさせる親コンポーネントに表示するとする。
親コンポーネントに表示する際、

* プレビュー用の値
* サーバ送信用のhiddenのname/value

を更新したいとすると、子コンポーネントから受け取った値を加工したい場合もあって、
算出プロパティ使って多少処理をいれたりするじゃない。

その際、編集時の処理で親コンポーネントで配列の値を直指定で更新してました。
コードはこんな感じ。

```coffeescript:sample.coffee
Vue.component('child_component', {
    template: '#child_template'
    method:
        setOption: (value, index)-> # [1]編集時にこのメソッドを呼び出す
            hub.$emit 'set-option', value, index
})

Vue.component('parent_component', {
    template: '#parent_template'
    data: ->
        { return options: [] }
    computed:
        computed_options: -> # [3]ここで、optionsが変更された際に再評価してほしいが、されない・・！
            # ここでoptions使ってdisp_optionsを用意する
            return disp_options
    created: ->
        self = @
        hub.$on "set-option", (value, index) ->
            self.options[index] = value # [2]optionを子コンポーネントの値で更新
})

hub = new Vue()
```

# なぜ？
Vueの公式サイトにこう書いてあった。

**JavaScript の制限のため、Vue は配列で以下の変更を検出することはできません**

```text
1. インデックスでアイテムを直接設定するとき。例: vm.items[indexOfItem] = newValue
```

なんてこった。。。

# どうしたら？
こうしたら良いのだって。

```js:pattern1.js
// Vue.set
Vue.set(example1.items, indexOfItem, newValue)
```
```js:pattern2.js
// Array.prototype.splice`
example1.items.splice(indexOfItem, 1, newValue)
```

予想外にハマって時間取られました。。。

# どうやって解決した？
時間かかってどうしようもなかったのでここで質問しました。
https://vuejs-jp-slackin.herokuapp.com/

質問してから30分程度で解決しました。
ありがとうございました！！！！！

# refs
* [算出プロパティ](https://jp.vuejs.org/v2/guide/computed.html#算出プロパティ)
* [リストレンダリング時の注意事項](https://jp.vuejs.org/v2/guide/list.html#注意事項)
「実践Vim」を読んで得られた考えをまとめてみた3（コマンドラインモード）

# はじめに

この記事は「実践Vim」を読んで得られた気付きや考え方を書籍の内容に沿ってまとめています。
何度かに分けて書いていますので関連記事も是非！

- [「実践Vim」を読んで得られた考えをまとめてみた1（ドットコマンド・ノーマルモード）](http://qiita.com/sfp_waterwalker/items/822bdcccb1b31f4b82ad)
- [「実践Vim」を読んで得られた考えをまとめてみた2（挿入モード・ビジュアルモード）](http://qiita.com/sfp_waterwalker/items/7558e80b0a7f6b36019e)
- [「実践Vim」を読んで得られた考えをまとめてみた3（コマンドラインモード）](http://qiita.com/sfp_waterwalker/items/22f30277de14fbb4ec4f)

# 各TIPのまとめ

## 第5章 コマンドラインモード

### TIP27： Vimのコマンドラインモード

**→Exコマンドは一度に大量の行を処理できる。**

:でコマンドラインモードになります。
コマンドラインモードで使えるコマンドは実は非常に多いのです。
以下はバッファ内のテキストに作用するExコマンドですが、ノーマルモードのコマンドに対応するものもあります。

| コマンド | 内容 | ノーマルモードで対応するコマンド |
|:------------|:------------|:------------|
|:delete（:d）|指定行を削除|d|
|:yank（:y）|指定行をヤンク|y|
|:put（:p）|指定行の下にプット|p|
|:join（:j）|指定行を連結|J|
|:copy {address}（:co {address}, :t {address}）|指定行を{address}で示される行の下にコピー||
|:move {address}（:m {address}）|指定行を{address}で示される行の下に移動||

コマンドラインモードのコマンドでよく知られているのは
* :substitute（:s）
* :write（:w）
* :quit（:q）
でしょう。
:%s/検索文字列/置換文字列/g
で一括置換はよくやりますし、当然保存や終了もやるでしょう。

ですが、今挙げたコマンドも覚えておくと便利です。
ノーマルモードのコマンドでやれることがコマンドラインモードでも実現できるのは理由があります。
現在のカーソルから離れたところを広範囲に編集できるのです。（多くのコマンドは範囲指定ができます。）
:%sも全行に対して置換をかけていることから、同様の考え方で成り立っていることがわかります。

### TIP28： 連続する行に対してコマンドを実行する

**→範囲指定のやり方もいろいろ。パターンマッチ、オフセットも使える /search/+1,/search/-1 仮想的な先頭行「0」も指定できる**

コマンドラインモードはアドレスを入力することで編集範囲を指定します。
編集範囲は開始行,終了行というような指定方法ですが、

- 仮想的な先頭行（0）を指定できます。
- パターンマッチを指定できます。（パターンにマッチする行だけ編集対象にできます。）
- オフセットも使えます。

/\<html\>/+1,/<\/html>/-1d
で<html>の1行下から</html>の1行上までを削除できます。コマンドラインモードの範囲指定は柔軟です。
以下はアドレスに使える記号ですが、これらを組み合わせて指定します。 

| 記号 | 意味 |
|:------------|:------------|
|1|1行目|
|$|最終行|
|0|1行目の前にある仮想的な行|
|.|現在行|
|%|全行（1,$） と同じ|
,で範囲指定ができる（2,6 → 2行目から6行目）

### TIP29： 「:t」／「:m」コマンドで行をコピー／移動

**→Exコマンドのコピー、移動も有効。カーソルから遠くの行もすぐに操作でき、レジスタに保存されないようにもできる。**

yypやddpなどでもできることですが、コマンドラインモードでも複製や移動が用意されています。
もちろんカーソルから離れたところに編集をかけることができる特長を持ちます。
:tや:mを使うとレジスタに保存されないようにもできます。
globalコマンドと組み合わせて使いこなせれば強力です。

### TIP30： 選択範囲に対してノーマルモードのコマンドを実行する

**→normalコマンドは@と組み合わせるとさらに強力**

同じ編集が50行も100行も必要になることがあります。
こんなときは、ビジュアルモードで範囲指定をしてからnormalコマンドでマクロを指定すると何度も繰り返す必要はありません。
normalコマンドはコマンドラインモードからノーマルモードのキーストロークを実行させるコマンドです。
このとき、「挿入モードに入ってキーを入力して、抜けて;まで飛んで...」などをそのまま指定しようとすると間違いやすいです。
normal @qなどとしてキーストロークをマクロで指定するとよいでしょう。

### TIP33： カーソル位置にある単語をコマンドプロンプトに挿入

**→コマンドラインモードでは、C-r C-wでカーソル位置にある単語を入力**

コマンドラインモードではカーソル位置の単語を<C-r><C-w>で入力できます。
私はマウスも使うので普通に貼り付けてしまいますが、キーボードオンリーだと便利かもしれません。

### TIP34： 履歴からコマンドを呼び戻す

**→コマンドラインウィンドウで、Exコマンド履歴を編集して実行できる**

q:（:qではない）でコマンドラインウィンドウを開き、コマンド履歴を参照できます。
コマンド履歴でもVimの操作ができるのです。
つまり、前回のコマンドをノーマルモードのコマンドで修正したり、
2つのコマンドをJでくっつけて調整して、1行のコマンドラインにできます。

### TIP35： シェルでコマンドを実行

**→外部コマンドやプログラムで編集できる。**

:read !{cmd}
で外部プログラムを実行して、標準出力を現在行の下に挿入できます。
範囲指定した箇所は標準入力になります。
外部プログラムはシェルのコマンドでもawkでもPHPでもRubyでも何でもOKです。
どんなやりかたでもテキストの編集ができるわけです。
GitBucketのインストール

##作業環境
-EC2
-CentOS 7.3

セキュリティグループの設定で
カスタム TCP ルールで「8080」ポートを空けておく

##手順

####JAVAをインストール

```bash:
# yum install -y java-1.8.0-openjdk java-1.8.0-openjdk-devel java-1.8.0-openjdk-headless
```
####Tomcatをインストール

```bash:
# yum install -y tomcat
```

####Gitbucketをダウンロード
※4.10はversion

```bash:
# wget -P /usr/share/tomcat/webapps/ https://github.com/takezoe/gitbucket/releases/download/4.10/gitbucket.war
```


####Tomcatを起動・自動起動

```bash:
# systemctl start tomcat
# systemctl enable tomcat
```

####Nmapコマンドで、使用中のポートを確認します。
入っていない場合はインストール

```bash:
# yum install -y nmap
```

Tomcatのデフォルポートは8080番なので、Portは開放されてます。

```bash:
# nmap localhost

Starting Nmap 6.40 ( http://nmap.org ) at 2017-03-03 16:16 JST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.0000020s latency).
Other addresses for localhost (not scanned): 127.0.0.1
Not shown: 991 closed ports
PORT     STATE SERVICE
21/tcp   open  ftp
22/tcp   open  ssh
25/tcp   open  smtp
80/tcp   open  http
443/tcp  open  https
3306/tcp open  mysql
8009/tcp open  ajp13
8080/tcp open  http-proxy
9000/tcp open  cslistener
```

####GitBucketにブラウザでアクセス

http://サーバIPアドレス:8080/gitbucket/

デフォルトのユーザIDとパスワードは下記の通りです。
- ユーザID: root
- パスワード: root
GitBucketのAdministrator権限ユーザー追加後、rootユーザーを削除する。


####GitBucketのアップロード
gitbucket.war を削除→最新版ダウンロード→tomcatの再起動で可能。

```bash:
# rm /usr/share/tomcat/webapps/gitbucket.war
# wget -P /usr/share/tomcat/webapps/ https://github.com/takezoe/gitbucket/releases/download/[GitBucketのバージョン]/gitbucket.war
# systemctl restart tomcat
```

以上。
smbclientを利用したUNCパスに対するファイルの読み書き


# 概要
Linuxからsmbclientを利用して、Windowsの共有フォルダへの読み書きをする場合
以下のようにして読み書きができます。

# イメージ
![IO Image](http://qiita-image-store.s3.amazonaws.com/0/138821/895aa5bd-ca17-4156-ab33-327ae63c62d6.png)

# ファイルを読み込む(取得する)
ファイルを取得する際にはFTPコマンドと同様に、作業ディレクトリに取得したファイルが置かれるので、
smbclientコマンドで取得する前に、一度cdで移動してからsmbclientコマンドでファイルを取得する。
また、前提条件としてファイル取得ディレクトリへの書き込み権限がある必要がある。

```bash:getの場合
$ cd /var/log/hoge
$ sudo smbclient '\\10.255.1.1\testshare' 'Passw0rd' -U Administrator -D '\SharedDir' -c "prompt;get route.log"
```

# ファイルを書き込む(置く)
ファイルを置く際には、現在の作業ディレクトリにあるファイルをUNCパスに対して置くことができる。

```bash:putの場合
$ sudo smbclient '\\10.255.1.1\testshare' 'Passw0rd' -U Administrator -D '\SharedDir' -c "prompt;put app.log"
```

# 参考
smbclientを使ってフォルダごとダウンロード
http://t12488mac.blogspot.jp/2011/08/smbclient.html

smbclientコマンド
http://itpro.nikkeibp.co.jp/article/COLUMN/20070618/275055/
Cloud9でAngular2公式Tutorialをやるための環境設定

# TL;DR

```json:bs-config.json
{
  "port"  : "8080",
  "server": {
    "baseDir": "src",
    "routes": {
      "/node_modules": "node_modules"
    }
  }
}

```

# はじめに
[Cloud9](https://c9.io/) はRails Tutorialで出会って以来お気に入りのIDEで、環境構築が簡単なので仕事でもよく使う。
今回、同僚にAngular2 Tutorialをやってもらうにあたり、簡易Webサーバ立ち上げのところでつまずいたのでメモ。

# 手順
## Quickstart用テンプレートをGit Cloneする
```
git clone https://github.com/angular/quickstart.git quickstart
cd quickstart
npm install
```

## lite-serverの設定を変更
lite-serverのポート設定はアプリケーションルートのbs-config.jsonに記載されている。
`"port" : "8080"` を追加。

```json:bs-config.json
{
  "port"  : "8080",
  "server": {
    "baseDir": "src",
    "routes": {
      "/node_modules": "node_modules"
    }
  }
}
```

## 簡易サーバを立ち上げる
```
npm start
```
URLはCloud9上で、Share->Applicationから取得できる。

Cloud9にはnode.jsもnpmも入っているからこれだけで開発が始められる。すごいね。
VMWare on Windows 10のブリッジ接続でインターネットに繋がらないを解決する

例えば、VMware上の仮想マシンでWebアプリ開発し、IEでブラウザチェックしたいときなど、NAT接続じゃなくてブリッジ接続でネットワークにつなぎたい場合があります。

基本的にはVMwareの設定でブリッジ接続を選択し、ネットワーク環境をホストOSと合わせればよかったのですが、ホストOSがWindows 10で久しぶりに使おうとしたらゲストOSからインターネット接続できず、調べると`VMware Bridge Protocol`の設定がキモでした。

![capture1.png](https://qiita-image-store.s3.amazonaws.com/0/27707/1b9f6ab9-1f0e-3c6d-cf2e-5d51b3f15f95.png)

設定の方法は、「コントロールパネル」→「ネットワークとインターネット」→「ネットワークの共有センター」の画面で、「アダプター設定の変更」に進みます。

![capture2.png](https://qiita-image-store.s3.amazonaws.com/0/27707/6ee83f37-25d4-4ff7-755e-8b0f1e6cecf4.png)

すると、Windowsに設定されているネットワーク接続一覧が出てきます。この中で、**実際にブリッジ接続で使う接続の VMware Bridge Protocol のみチェックを入れる**のがポイントです。

![capture5.png](https://qiita-image-store.s3.amazonaws.com/0/27707/6650937a-6a2f-248a-6753-d1b18c3f8c76.png)

各接続のプロパティで設定できます。そもそも、`VMware Bridge Protocol`の設定項目がない、という人は以下の記事を参照。
[Windows10でVMware Bridge Protocolが無い場合の対処方法 - ボールを蹴りたいシステムエンジニア](http://toriaezu-engineer.hatenablog.com/entry/2016/07/30/152111)

![capture3.png](https://qiita-image-store.s3.amazonaws.com/0/27707/9d954a3a-d338-2d0b-0c18-17b7c1a4a748.png)

今回は無線接続基本のノートPCなので、Wi-Fiの接続設定のみチェックを入れました。これで無事解決。めでたしめでたし。

![capture4.png](https://qiita-image-store.s3.amazonaws.com/0/27707/bdc4139b-2dc3-bf01-3119-0f4ed6878ad3.png)

参考記事
[VMwareでブリッジ接続するときに迷ったところ（覚書） - BlogIsHowMuch](http://howmuch.hatenadiary.com/entry/2016/04/17/220910)
[Unityで学ぶC#] 3 スクリプトのルール1


## スクリプトを書くときにはルールがあります．

---
## その中でも特に基本的なものを示します．

---
#　目次
1. 中かっこ{}はペアにする
2. 処理は基本的に関数の中に書く．
3. 終わりに「;」をつける．

---
## 1. 中かっこ{}はペアにする

---
## {}の例
<img width="349" alt="スクリーンショット 2017-03-03 18.09.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/113504/ffabcbbc-6f0a-96cb-ea18-04e6d1986e00.png">

{}は範囲を示すものです．したがって始まりと終わりが必要です．

---
## {}の例
<img width="349" alt="スクリーンショット 2017-03-03 18.09.49.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/113504/77f75fc4-f9bc-ad6c-88f0-54fe6519e9e2.jpeg">

デフォルトのスクリプトにも3つの範囲がありますね．

---
## {}のペアの確認の仕方
![kakko.gif](https://qiita-image-store.s3.amazonaws.com/0/113504/709002ba-5d8b-aeb1-3328-84608e6ae97d.gif)
このように{}の片方をクリックすると，対応する{}がオレンジ色になります．

---
## {}のペアがないとどうなるか
<img width="321" alt="スクリーンショット 2017-03-03 18.27.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/113504/ac9a5fab-2924-4a19-b9b1-8d108e6c9000.png">
まず，赤い波線が出ます．

---
## {}のペアがないとどうなるか
<img width="444" alt="スクリーンショット 2017-03-03 18.29.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/113504/83bbfc9f-8d64-b2b8-9053-397b57f5656e.png">
そのままセーブしてUnityを開くと上記のようなエラーが出ます．

エラーの名前は{}の場所によって変わりますが，上記のエラーはセミコロンか{}のペアができてないかのどちらかであることが多いです．

---

## 2. 処理は基本的に関数の中に書く．

---
## 関数とは
<img width="349" alt="スクリーンショット 2017-03-03 18.09.49.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/113504/77f75fc4-f9bc-ad6c-88f0-54fe6519e9e2.jpeg">
さきほどのこの{}の範囲の中，青い範囲のことです．

---
## 処理を書く例
<img width="341" alt="スクリーンショット 2017-03-03 18.43.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/113504/a1176f27-bbe9-461a-6479-1d1823ebd4fb.png">

↑これはOK

<img width="328" alt="スクリーンショット 2017-03-03 18.44.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/113504/ff4ee7cc-34a1-1798-3444-7e7367d87ccc.png">
↑これはだめ

---
## ダメなところに書くと
<img width="440" alt="スクリーンショット 2017-03-03 18.46.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/113504/446be0e2-5559-2785-832b-447beb680711.png">

こんなエラーが出ます．

---
## 大丈夫なもの
<img width="339" alt="スクリーンショット 2017-03-03 18.48.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/113504/10d6f8b2-9563-053e-3ab8-493a30c0ba66.png">
変数の宣言等は関数の範囲外でも大丈夫です．


---
## 3. 終わりに「;」をつける

---
## 3. 終わりに「;」をつける
C#では文の終わりに;を打つことでそこまでが一文という範囲だと示すというルールがあります．

その例外は{}です．
{}は始まりから終わりまでという範囲を示すものなので， ;は必要ありません．

---
## 3. 終わりに「;」をつける
<img width="600" alt="スクリーンショット 2017-03-03 18.54.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/113504/5052725c-c6d7-7997-ac12-5385577aa9c5.png">

セーブして戻るとこのようなエラーが出ます．

「14行目らへん， ; ないよ」って言われてるので，探しに行きましょう．

---
# おわり
GitLab Meetup Tokyoに行ってきた

### 日時
2017年3月2日(木) 19:30〜22:00 (開場 19:00)

### 会場
ピクシブ株式会社
東京都渋谷区千駄ヶ谷4-23-5 (JPR千駄ヶ谷ビル2F)

### ピクシブ社からの挨拶
* 最初40人くらいだったのに、200人くらいきるとはｗ
* スポンサーが4社つきました
  - 株式会社ドリコム
  - 株式会社Ruby開発
  - 株式会社アイリッジ
  - ピクシブ株式会社
* 社員は全然おっけーですが、オフィス側は映らないように

### 会場に対する所感
* Pixiv綺麗
* エレベータ降りたらすぐにPixiv感が伝わった
* ひな壇に座ったんだけど、見やすかったし、良いオフィスだなぁって思った
* 最前列の人がスクリーンに近すぎて、スライドの下の方が見えないことが多かった
    * ひな壇に座ってたのに見れなかったから、普通に座ってた人やばかったんじゃない？
    * 残念なことに下に長いスライド作ってる人が多かったのもあって、きつかった
* スポンサー様のおかげもあって、ピザ25枚あって笑ったｗ
    * スポンサー様ありがとうございますｍｍ

### 発表内容
発表のスライドは、基本[ここ](https://gitlab-jp.connpass.com/event/49755/)にまとまっているので、それぞれ見て欲しい。
[Togetter](https://togetter.com/li/1086484)もまとめが出てるので見てもらえれば、その日の盛り上がりが伝わるのじゃないだろうか。

### 印象的だったもの
<table align=center>
  <tr>
    <td WIDTH=400px><a href="https://sue445.gitlab.io/gitlab-meetup-tokyo-1/">ここがすごいよGitLab CI #gitlabjp</a></td>
    <td WIDTH=150px><a href="https://sue445.gitlab.io/gitlab-meetup-tokyo-1/"><img style="float:left;margin-right:.5em;" src="http://capture.heartrails.com/120x120/cool?https://sue445.gitlab.io/gitlab-meetup-tokyo-1/" width="120" height="120" /></a></td>
  </tr>
</table>

* Werkerとの比較が面白かった
    - 2つ以上のジョブが合流して、てのがWerkerだと出来ないっていうのは初めて知った。
    - ちなみに[Concourse CI](https://concourse.ci/)でも今回の話と同じこと出来ます
        - これなら合流も書けるし、yamlで管理出来ますしお寿司
        - (まぁそんなことしなくても良いのがGitLab CIのメリットなんだってのは分かってますが。)
* あとGitLab CIで不向きな事例を聞けたのは嬉しかった
    * 更新が早いみたいだから、不向きな事例も減ってくるかも、と思った
* Terraform、Squid使ってる人に会えて嬉しかった
* Twitterは見ちゃいけないって言われたから見てない怖い

### 全体的な感想
* GitLab管理者、コントリビューター、の集まりだったと思われる。
    * CI/CDの実例をもっと聞きたかった自分としては物足りなかった
        * それゆえにドリコムさんの事例がとても楽しかった
    * 正直コントリビュートする話とかGitLabの運用話は大事だと分かってるけど、それ系が多すぎたかな
* 今度はLTとかやってみようと思った
    * GitHubとかとの強豪との値段、機能、運用面での比較とかの話聞きたい人いるかな？
PHPでMySQLに疎通確認するときのワンライナー

「PHPからMySQLに繋げられるか確認したいんだけどー」というあなたに。PDOとMySQLですが他の組み合わせでもちょろっと変えるだけで確認できるはず。
注）DB名とかuser名とか、それぞれの環境で変える必要があります。


```bash
$ php -r "var_dump((new PDO('mysql:host=localhost;dbname=hoge_db', 'username', 'password'))->query('SELECT 1')->fetch());"
> array(2) {
  [1]=>
  string(1) "1"
  [2]=>
  string(1) "1"
}
```
なんか１件じゃないけど、とりあえずおｋで。
Google Cloud Machine Learningではまったポイント(2017年3月時点)

TensorFlowのチュートリアルや自作コードなどを、GCPのCloud Machine Learning(ML-engine)で動作させてみたのですが、いくつか自分がはまったポイントを記録しておきます。

# Pythonのバージョン

動いているPythonバージョンは2.7です。3系ではありません。

# TensorFlowのバージョン

1.0.0になったんだしそれが動いているのだろう、と思っていたがそんなことはありませんでした。執筆時点(2017/03/06)では0.11rc2でした。

追記(2017/4/25): 1.0ベースに変わったとのアナウンスがメールで送られてきました。

## 確認方法

こちらの記事がヒントになりました。

* [Google Cloud DataflowにプリインストールされているPythonパッケージを調べてみた](http://qiita.com/hayatoy/items/0fdcf0019643fb1842b0)

以下のようなコードを実行するだけのジョブを投入し、ログを確認することでバージョンを把握できます。

```py2
import tensorflow as tf
import os

def main(_):
        os.system('pip list')

if __name__ == '__main__':
        tf.app.run()
```

## seq2seqのサンプルが動かない

上記の要因で、1.0.0向けに記述されたseq2seqサンプルが動きません。tf.nn.rnn_cellはtf.contrib.rnnに変わりました。tf.nn.seq2seqもtf.contrib.legacy_seq2seqに変わっています。

# スタックトレース全体がログで確認できない

上記問題を把握するためにログを見ていたのですが、スタックトレース出力が長すぎて途中で打ち切られている感じでした。これは私の探し方が悪く、実は見る方法があるのかもしれません。

解決策を見つけられなかったので考えた結果、以下のようにtf.app.run()の例外をCloud Storageに保存するようにしました。

```py2
try:
if __name__ == '__main__':
    try:
        tf.app.run()
    except:
        import traceback
        with tf.gfile.Open("gs://bucket-name/log.txt", "w") as f:
            traceback.print_exc(file=f)
```

# setup.pyのオプションでtypo

最初、setup.pyを以下のように記述していたのですが、localでは動作するもののcloudで動かないという現象に悩まされました。

```py2
from setuptools import setup

if __name__ == '__main__':
    setup(name='trainer',
          package=['trainer']
      )
```

正しくは以下になります。

```py2
from setuptools import setup

if __name__ == '__main__':
    setup(name='trainer',
          packages=['trainer']
      )
```

packagesとすべきところをpackageと書き間違えていました。ローカルで動作していたのは、カレントディレクトリのtrainer/以下にあるファイルを参照できてしまっていたせいだと思われます。
cloud環境だと一旦wheelパッケージを作成し、ローカルにインストールした上で動作するので、

* packages引数がない
* パッケージにtrainer以下のファイルが含まれないパッケージが出来上がる
* python -m trainer.task等を実行しようとした時trainer/task.pyが参照できなくてエラー発生

という挙動をしていました。

# gcloudコマンド更新

ドキュメントには"gcloud beta ml"で実行せよと書かれていますが、つい最近の更新で"gcloud ml-engine"に変わりました。一応古い形式もまだ受け付けてくれますが、警告が出ます。

# 最後に

Google Cloud MLは今もベータ版であることに変わりはないので、今後も何かしらの非互換な変更(いくつかのdeprecatedなメソッドが使えなくなる等)ことは発生すると思われます。その点に注意しつつ利用しましょう。
.debファイルの作成 (DEBIAN/control)

カレントディレクトリ以下を.debにパッケージングする。

## 参考

* [Man page of deb-control](http://jnug.net/po4a/monyo/deb-control.ja.5.html)
* [社内利用のための deb パッケージング入門 - Cybozu Inside Out | サイボウズエンジニアのブログ](http://blog.cybozu.io/entry/2016/05/16/111500)

## 準備

```
mkdir -p usr/local/
mv * usr/local

mkdir DEBIAN
touch DEBIAN/control
```

```bash:DEBIAN/controlの中身(最低限)
Package: local-pear
Maintainer: tukiyo3 <tukiyo3@local>
Architecture: all
Version: 1.0
Description: hogehoge
```

* Architecture: all だと全環境。amd64など指定もできる。異なるとインストールできない。
* なんでか./DEBIAN/ディレクトリの権限が2755になっていた場合は`chmod g-s ./DEBIAN/`する。

## build

```
fakeroot dpkg-deb --build .
```

* `..deb`が生成される。

```bash:インストールできることを確認
mv ..deb local-pear.deb
dpkg -i local-pear.deb
dpkg -L local-pear
```
Implementing functional languages を頑張って読む.21日目

# 21日目
20日目は全訳して無駄に長かったので躓いたところとExerciseだけ書く

## 2.7 Mark 5: Structured data
今の実装じゃ構造型はきつい

#### Exercise 2.18
なぜ`case`式は今のマシンで取り扱うのが難しいか?(case式でinstantiate関数がどう動くか見よ)
→ わからん.

### 2.7.1 Building structured data
実装するべきものを2.7.3で書いていてくれてるので,すぐ実装せずに2.7.3を参考にする.

一般的なcase式を実装するのは難しいので簡単なBooleanから実装する.

### 2.7.2 Conditionals

BooleanはMirandaではこのように書かれる.
`boolean ::= False | True`
2つのコンストラクタ,True,Falseがある.それぞれアリティは0で,私たちは任意に1をFalseに,2をTrueに当てはめられる.
よってCore Languageでは以下の定義を得る:

```
False = Pack{1,0}
True = Pack{2,0}
```

#### Exercise 2.19
条件式の状態遷移ルールを完成させよ.3つのルールが必要である: 2つは既にifの条件式が評価されている場合; 1つはまだ評価されていない場合である(Rule 2.9を参考にせよ).最初の2つの場合は間接参照ノードを用いるのが良い.
さらなるルールが1つ欠落している.なんだろうか?(ヒント: 条件式の評価が終了した時,条件式はどのように再試行されるだろうか?)

| h |   |
|---|---|
| a | **NPrim** If |
|ac | **NAp** a b |
| t | **NData** 2 [] |
| f | **NData** 1 [] |
|at | **NAp** ac bt |
|af | **NAp** at bf | 

| a : ac : at : af : [] | d | h[ac: **NAp** a t ] | f |
|---|---|---|---|
| a : [] | d | h[af: **NInd** bt] | f |

| a : ac : at : af : [] | d | h[ac: **NAp** a f ] | f |
|---|---|---|---|
| a : [] | d | h[af: **NInd** bf] | f |

| a : ac : at : af : [] | d | h[ac: **NAp** a b] | f |
|---|---|---|---|
| b : [] | (ac : at : af : []) : d | h | f |

| a : [] | s : d | h[a: **NData** _ _] | f |
|---|---|---|---|
| s | d | h | f |

#### Exercise 2.20
Core Languageでのor,xor,notの定義を与えよ.全てextraPreludeDefsに追加せよ.

```
and x y = if x y False
or x y = if x True y
not x = if x False True
xor x y = or (and x (not y)) (and (not x) y)
```

### 2.7.3 Implementing structured data
構造体,条件分岐,比較を実装するのに必要な変更一覧がある.

- NData コンストラクタをnode データ型に追加せよ.showNodeをNDataを表示できるように拡張せよ.
- PrimConstr, If, Greater, GreaterEq, Less, LessEq, Eq, NotEqをprimitiveに追加せよ.instantiateVarで適切に実体化できるように適切なペアをprimitivesに追加せよ.
- instantiateConstr(Update)の定義を与えよ.
- isDataNode関数をNDataノードも認識するようにせよ.
- step関数の中のdispatchが補助関数のdataStepを呼ぶことによりNDataを扱えるようにせよ.
- dataStepを定義せよ.これはnumStepと非常によく似ている.
- primStepをPrimConstrやその他新しいプリミティブを対処できるように拡張せよ.PrimConstrやIfは補助関数を呼ぶと良い.比較は大体primArithが使える.

primConstrはprimitivesには入らない.型が違う.
primDyadicに条件分岐をぶん投げてるのが大丈夫かわからない.
自明にgreaterとeqさえあれば自明その他の演算子は構成可能なので後で減らせるかも.
そもそも遅延評価なのでifをプリミティブにする必要すらない.
K x y = xとF x y = y でOKだし,and/orもコンビネータで書ける.

#### Exercise 2.21
全ての変更を実装せよ.全て実装できていれば以下の関数が実行可能.

```
fac n = if (n == 0) 1 (n * fac (n-1)) ; main = fac 3
```

出力(fact 6)

```
Stack [ (top)
  34: NNum 720
]
heap size 106


Total number of steps = 176
Total number of reductions = 34
Total number of supercombinator reductions = 8
Total number of primitive reductions = 26
Maximum of stack depth = 4
```

***2.7.3が終わり.5時間で3ページ.ひどい.***

diffはもう一回一回が長いので貼らない.そのうちgitに上げるのでlogでも見て
Async Functionでポーリングを書くとループになるので簡潔でよい

Async functionを使うとポーリングがループで書けて便利だったので共有します。

下記のようにサーバーサイドでバックグラウンド処理が完了したら次の画面に遷移する、というような状況で、`wait`って関数でポーリングすると想定してください。

```js
startBackgroundProcessing();

wait().then(() => {
  moveToNextScreen();
});
```

まずヘルパー関数を定義します。Promise版`setTimeout`と、ポーリング先のAPIを叩く関数です。

```js
const sleep = (n) => new Promise(resolve => setTimeout(resolve, n));

const isProcessing = async (id) => {
  const {processed} = await new Promise((resolve, reject) => $.ajax({
    type: 'GET',
    url: '/api/v1/somewhere',
    dataType : 'JSON',
    success: resolve,
    error: reject
  }));

  return !processed;
};
```

Async functionを使わない場合の`wait`の実装例。継続渡しになって補助関数を定義しないといけないし、難しいです。

```js
const waitWithContinuation = (id, cont) =>
  sleep(POLLING_INTERVAL).then(() =>
    isProcessing(id).then(processed => {
      if (processed) {
        cont();
      } else {
        waitWithContinuation(id, cont);
      }
    })
  );

const wait = (id) => new Promise(resolve => waitWithContinuation(id, resolve));
```

Async functionを使う場合。簡潔に書けました。

```js
const wait = async (id) => {
  while (await isProcessing(id)) {
    await sleep(POLLING_INTERVAL);
  }
};
```

エラー処理は省略しています。
New Relicのハイセキュリティモード

# パブリッククラウドのセキュリティについて
エンタープライズのお客様から、

「現在オンプレ環境でシステムを運用しており、パブリッククラウドの移行も検討しているが躊躇している。最大の理由はセキュリティ上の不安」

という声をよく聞きます。私もそうでした。たしかに、マイナンバーみたいな機微な情報がクラウド上に置かれて大丈夫なのか？・・・と言われれば外出しすることが心もとなくなる気持ちもわかります。

しかし、昨今、AWSのトレーニング（ASA、SysOps、DevOps）を受けて考え方が変わりました。パブリッククラウドは本当に危ないのでしょうか？

AWS上で高いセキュリティを維持している金融系の事業者様もいらしゃいます。一方でがちがちのオンプレ環境でも機密情報が流出する事例が後をたちません。"パブリッククラウドかオンプレか"の二元論ではなく"やりかた"の問題であると思います。つまるところ、セキュリティレベルは使い方（システム設計とそれを運用する人）次第で高くも低くもなります。

# New Relicの場合
New RelicはSaaS型の監視サービスです。監視対象サーバー上のエージェントから、パブリックネットワーク上にあるNew Relicサーバ宛にアプリケーションやSQL文等の情報が送信されます。このときサーバとNew Relicサーバ間の通信経路は443ポートで秘匿されています。通信経路上での盗聴・改ざんのリスクは低いと考えられます。問題は安全な経路を使って機密データをNew Relicサーバに送信しうることです。

# New Relicのハイセキュリティモード
この問題に対し、機密データを New Relic へ送信されないことを保証するためのハイセキュリティモードが有償版では使用できます。エージェントからも管理画面からも設定することができます。ハイセキュリティモードにすると下記が設定されます。

- HTTP パラメーターのキャプチャの防止
- メッセージキューのパラメーターのキャプチャの防止
- 生の SQL文 のキャプチャの防止
- ユーザー属性のキャプチャの防止
- カスタムイベントの防止

設定方法などは下記から。
[High security mode](https://docs.newrelic.com/docs/agents/manage-apm-agents/configuration/high-security-mode)

機会があれば検証してみたいと思います。

以上
PerlでOLEモジュールを用いてExcelファイルの読み書きをする

# PerlでOLEモジュールを用いてExcelファイルの読み書きをする

## 使い方
使い方は以下のコードを見れば一目瞭然です。

```ctrlExcel.pl
#!/usr/bin/perl
use Win32::OLE qw(in with);
use Win32::OLE::Const 'Microsoft Excel';

# エクセルオブジェクトを取得(新たにExcelを立ち上げる)
my $excel = Win32::OLE->new('Excel.Application') || die "cannot get active excel!";

# エクセルオブジェクトを取得(既に立ち上がってるExcelから取得する)
# my $excel = Win32::OLE->GetActiveObject('Excel.Application') || die "cannot get active excel!";

# ブックを追加
my $book = $excel->Workbooks->add();

# シートを取得
my $sheet = $book->ActiveSheet;

# セルに値を書き込む
$sheet->Range("A1")->{Value} = "Col1";
$sheet->Range("B1")->{Value} = "Col2";
$sheet->Range("C1")->{Value} = "Col3";

# セルの値を取得する
my $data = $sheet->Range("A1")->{Value};
print $data . "\r\n";

# セルの値を取得する(範囲指定)
my $array = $sheet->Range("A1:C1")->{Value};
print $$array[0][0]  . "\r\n";
print $$array[0][1]  . "\r\n";
print $$array[0][2]  . "\r\n";

# ブックを名前を付けて保存する
$book->SaveAs('C:\test.xlsx');

# ブックを閉じる
$book->Close();

# エクセルを閉じる
$excel->Quit();
```
[c++] boost::functionでincomplete typeエラーが起きる

boost::functionはデフォルトで10個までしか引数をサポートしていない。
増やすには例えば:

```cpp
#define BOOST_FUNCTION_NUM_ARGS 11
#include <boost/function/detail/maybe_include.hpp>
#undef BOOST_FUNCTION_NUM_ARGS
#define BOOST_FUNCTION_NUM_ARGS 12
#include <boost/function/detail/maybe_include.hpp>
#undef BOOST_FUNCTION_NUM_ARGS
```
NetworkXでグラフを描画する

## はじめに
この記事は、Pythonで(ノードとエッジを持つグラフ理論においての)グラフを作成するためのパッケージである`NetworkX`で作成したグラフを、Matplotlibで可視化する方法をまとめたものです。

基本的に、NetworkXのリファレンスの和訳記事となっています。

## グラフの描画
NetworkXで作成したグラフを描画するには、以下の2通りの方法があります。
1. Matplotlibを利用する
2. `networkx.drawing`パッケージを利用する
`networkx.drawing`パッケージは、まだバージョン3.0以上のPythonとの互換性がないため、注意が必要です。

Matplotlibを利用して描画を行う場合には、Matplotlibをインポートしてください。

```Python
from matplotlib import pyplot as plt 
```

importしたnetworkx.drawingパッケージがうまく動作するかを確認するには、以下のコードを実行してみてくだ

```Python
nx.draw(G)
nx.draw_random(G)
nx.draw_circular(G)
nx.draw_spectral(G)
```

ディスプレイに表示するためには、以下のコマンドを実行してください。

```Python
plt.show()
```

描画されたグラフをファイルに保存したい場合は、以下のようにしてください。

```Python
nx.draw(G)
plt.savefig("path_to_fig.png")
```

## References
* http://networkx.readthedocs.io/en/networkx-1.11/reference/drawing.html
startxで起動した場合のキーマップを変える


古いノートにLinux入れようとしたらGNOMEがやたら重かったので
fluxboxいれるも、X上のキーマップがusになってしまっていたので
昔からの方式でやろうとしたら、エラーも出ず反映もされなかったので調べたメモ


#### 今は/etc/X11/xorg.confは使わないらしいΣ(ﾟдﾟlll)ｶﾞｰﾝ


+ setxkbmapを使えとの事
https://wiki.archlinuxjp.org/index.php/Fluxbox#.E3.82.AD.E3.83.BC.E3.83.9C.E3.83.BC.E3.83.89.E3.82.92.E9.81.A9.E5.88.87.E3.81.AB.E8.A8.AD.E5.AE.9A.E3.81.99.E3.82.8B

#### Fluxboxでのばあい
~/.fluxbox/startup
はfluxboxを直接xinitrcに記載して起動している場合は読み込んでくれない
http://fluxbox.org/help/man-startfluxbox.php

+ startfluxboxを使うように設定

```text:.xinitrc
exec startfluxbox
```

```text:~/.fluxbox/startup
setxkbmap jp
exec fluxbox
```

ウィンドウマネージャはやっぱ軽くて良い…
次はSKKだ…
タスク・ランナーとしてのMake

Makeはタスク・ランナーとして使うことができます。

通常はMakefileに記述するルールのターゲットはファイルですが、本当のファイルではないPhonyターゲット(偽ターゲット)のルールを作成することができます。

```make:Makefile 
.PHONY: taskA taskB taskC

taskA:
	@echo 'Starting $@'
	sleep 1
	@echo 'Finished $@'

taskB:
	@echo 'Starting $@'
	sleep 1
	@echo 'Finished $@'

taskC: taskB
	@echo 'Starting $@'
	sleep 1
	@echo 'Finished $@'
```

引数として指定したタスクを実行します。

```console
$ make taskA
Starting taskA
sleep 1
Finished taskA
```

複数のタスクを指定すると、順次実行します。

```console
$ make taskA taskB
Starting taskA
sleep 1
Finished taskA
Starting taskB
sleep 1
Finished taskB
```

-jオプションを使うと、タスクを同時に実行します。

```console
$ make -j taskA taskB
Starting taskA
sleep 1
Starting taskB
sleep 1
Finished taskA
Finished taskB
```

タスクの依存関係を判断して実行します。

```console
$ make taskC
Starting taskB
sleep 1
Finished taskB
Starting taskC
sleep 1
Finished taskC
```

最後に、私が使っているMakefileのテンプレートを紹介します。

```make:Makefile 
MAKEFLAGS += --no-builtin-rules
MAKEFLAGS += --warn-undefined-variables
SHELL := /bin/bash
.SHELLFLAGS := -eu -o pipefail -c
ALL_TARGETS := $(shell grep -E -o ^[0-9A-Za-z_-]+: $(MAKEFILE_LIST) | sed 's/://')
.PHONY: $(ALL_TARGETS)
.DEFAULT_GOAL := help

help: ## prints this message
	@echo 'Usage: make [target]'
	@echo ''
	@echo 'Targets:'
	@awk 'BEGIN {FS = ":.*?## "} /^[0-9A-Za-z_-]+:.*?## / {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}' $(MAKEFILE_LIST)

taskA: ## executes task A
	@echo 'Starting $@'
	sleep 1
	@echo 'Finished $@'

taskB: ## executes task B
	@echo 'Starting $@'
	sleep 1
	@echo 'Finished $@'

taskC: taskB ## executes task C (depends on task B)
	@echo 'Starting $@'
	sleep 1
	@echo 'Finished $@'
```

使いやすくするために、各ターゲット名の後ろに##を付けてコメントを記載し、helpターゲットでヘルプを表示するようにしています。

```console
$ make
Usage: make [target]

Targets:
help                           prints this messages
taskA                          executes task A
taskB                          executes task B
taskC                          executes task C (depends on task B)
```

#### 参考

* [Makefileを自己文書化する | プログラミング | POSTD](http://postd.cc/auto-documented-makefile/)
jsdoでヒートマップ

#概要
jsdoでヒートマップ、やってみた。
opendataのresasから人口データ取って、D3.jsとCesiumとGoogleMapで表示してみた。
geojsonは、下記を使用。
https://github.com/niiyz/JapanCityGeoJson

#写真
![](http://jsdo-static-contents.s3.amazonaws.com/images/capture/U/T/z/UTzP.jpg?t=1488514875)

#成果物
http://jsdo.it/ohisama1/UTzP

#写真
![jj.jpg](https://qiita-image-store.s3.amazonaws.com/0/18104/9a2567ec-2efd-9e0e-b9ee-b48b9a3cf14b.jpeg)


#成果物
http://jsdo.it/ohisama1/mDah

#写真
![ss.jpg](https://qiita-image-store.s3.amazonaws.com/0/18104/5acf5937-d71c-fe47-5eed-44ea5d395cd4.jpeg)

#成果物
http://jsdo.it/ohisama1/CDrB

#苦労した所
geojsonの読み込みが非同期なので、色が付かなくて、参った。
そして、僕はQiitaチームを解約してしまった。

ということで、GitHubのWikiに力技で移行し終わったので、Qiitaチームを解約した。
正直な処、GitHubと2重で課金しているのは都合が悪い。

デザイナーまでならGitHub Wikiで良い。

某歌手すら知っていた、ギフハブかもしれないGitHub。
もしかすると将来的にもGitHubがBizdevにまで侵食するかもしれない。

知人のデザイナーはGitHubをどんどん現場に浸透させようとしていた。

それは極端かもしれないけれど、GitHubがプログラミングだけのツールじゃなくなる気がした。
Windows10でMySQLのODBCがインストールできないときの対策

Windows 10に`mysql-connector-odbc-5.3.7`をインストールしようとしたときにエラーが出てインストールできなかったので、そのとき実行した対策です。

# 状況
以下のようなエラーが出ました。

```
「Error 1918.Error installing ODBC driver My SQL ODBC 5.3 ANSI Driver, ODBC error 13:システムエラー コード126: 指定されたモジュールが見つかりません。…\myodbc55.dll)のために、MySQL ODBC 5.3 ANSI Driver ODBC ドライバーのセットアッププログラムを読み…」
```

<img width="298" alt="スクリーンショット 2017-03-03 17.06.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/48446/dcf43bbc-8c51-b608-9caf-fddafbf75451.png">


# 原因
1. VC++ 2010のランタイムがない (以前も似たようなことでハマった記憶が…)
2. (1. を解決しても駄目な場合)VC++ 2013のランタイムがない (私はこれも必要でした)

# 対策
1. VC++ 2010ランタイムをインストール
 - [Download Microsoft Visual C++ 2010 SP1 再頒布可能パッケージ (x64) from Official Microsoft Download Center](https://www.microsoft.com/ja-jp/download/details.aspx?id=13523)
 - [Download Microsoft Visual C++ 2010 SP1 再頒布可能パッケージ (x86) from Official Microsoft Download Center](https://www.microsoft.com/ja-JP/download/details.aspx?id=8328)
2. VC++ 2013ランタイムをインストール
 - [Download Visual Studio 2013 の Visual C++ 再頒布可能パッケージ from Official Microsoft Download Center](https://www.microsoft.com/ja-jp/download/details.aspx?id=40784)

# 参考
- [Windows10 に MySQLのODBCドライバがインストールできない原因と対策 | Dr.Clover's Computer Clinic](http://mumu.jpn.ph/forest/computer/2015/12/29/2187/)
- [Windows10にMySQLのODBCドライバをインストールする | n-portal](http://n-portal.com/system/mysql_odbc)
EXE、DLLが32bitなのか64ビットなのか確認する方法

先日、EXE実行時にBadImageFormatExceptionでEXEが落ちた。
原因がEXE、DLLに32bit、64bitモジュールが混在しているときに発生するらしいので、その調査方法をメモ

#１．タスクマネージャで確認
起動ができる場合、タスクマネージャに表示される。

![タスクマネージャ.png](https://qiita-image-store.s3.amazonaws.com/0/143913/eff8016a-ae49-015a-9c4f-c70b89cd756e.png)

#２．VisualStudioのツールで確認
DLL、起動しないEXEはこちらで確認する。

『Visual Studio 2005 コマンドプロンプト』で下記のコマンドを実行(通常のコマンドプロンプトではない)
dumpbin /headers "確認するファイルパス" | findstr machine

![VSツール０.png](https://qiita-image-store.s3.amazonaws.com/0/143913/cacad96f-2efb-804b-fcd2-e43bdf9aad52.png)

![VSツール１.png](https://qiita-image-store.s3.amazonaws.com/0/143913/7129f4a4-4c50-b2d8-6582-956195913f23.png)

![VSツール2.png](https://qiita-image-store.s3.amazonaws.com/0/143913/4687cdf0-1f16-6de9-c5f6-dd65bd3bc977.png)
Nginxでメンテナンス中でも別ポートからアクセス可能にする方法

# 概要
Nginxでメンテナンス画面を表示させてかつ、
特定のポートからは普通に画面表示させる方法を調べました。

Nginxでメンテナンス画面を表示させる方法は
[「Nginxでお手軽にメンテナンス画面を表示する方法」](https://keikenchi.com/nginx-maintenance-how-to)を参考にしました。

# やりたいこと
* /var/tmpにmaintというファイルがあればメンテナンス中とする
* メンテナンス中はポート443でアクセスされると強制的にmaintenance.htmlを表示
* メンテナンス中でなければポート1443でアクセスされると強制的にno_maintenance.htmlを表示

# confファイルの設定内容
```xxx.conf
server {
  listen       443;
  listen       1443;
･･･
  root /var/www/xxx/public;
  set $maint "";
  set $maint_page "/maintenance.html";
  # maintファイルがあればメンテ中
  if (-e /var/tmp/maint) {
    set $maint MAINT;
  }
  set $maint "${maint}${server_port}";

  # 無限ループを防止
  if ($uri ~ "/maintenance.html") {
    set $maint "";
  }
  if ($uri ~ "/no_maintenance.html") {
    set $maint "";
  }
  if ($uri ~ "/maintenance.jpg") {
    set $maint "";
  }

  # メンテ中で443アクセスの場合は503を返却
  if ($maint = MAINT443) {
    return 503;
  }
  # メンテ中ではなく1443アクセスの場合は503を返却
  if ($maint = 1443) {
    set $maint_page "/no_maintenance.html";
    return 503;
  }
  error_page 503 "${maint_page}";
･･･
}
```

ifが並んで見づらいですが、Nginxはifを入れ子にできず論理演算子も書けないのでこういう書き方になっています。

(参考：[「Nginxで複数条件のIF文を書く方法がすごいｗ」](http://qiita.com/ukitazume/items/ab1c929783e87227e466))
VMwareのクローン作成

# クローン作成時に気を付けること
VMware 6.0でクローン作成しようとして対象の仮想サーバに右クリックでクローン作成できるのかと思ってたら
できなくて、エクスポートしてからインポートする手順でやったときにはまりました。

## 1 ネットワークが起動しない
起動しようとすると以下のエラーが出ました。
systemctl restart network.service
Restarting network (via systemctl):  Job for network.service failed. See
'systemctl status network.service' and 'journalctl -xn' for details.

んでこんなのが出て
 systemctl status network.service
network.service - LSB: Bring up/down networking
   Loaded: loaded (/etc/rc.d/init.d/network)
   Active: failed (Result: exit-code) since 金 2015-10-09 18:55:59 JST; 2s
ago
  Process: 22402 ExecStop=/etc/rc.d/init.d/network stop (code=exited,
status=0/SUCCESS)
  Process: 23109 ExecStart=/etc/rc.d/init.d/network start (code=exited,
status=1/FAILURE)
 
10月 09 18:55:59 cinder network[23109]: RTNETLINK answers: File exists
10月 09 18:55:59 cinder network[23109]: RTNETLINK answers: File exists
10月 09 18:55:59 cinder network[23109]: RTNETLINK answers: File exists
10月 09 18:55:59 cinder network[23109]: RTNETLINK answers: File exists
10月 09 18:55:59 cinder network[23109]: RTNETLINK answers: File exists
10月 09 18:55:59 cinder network[23109]: RTNETLINK answers: File exists
10月 09 18:55:59 cinder network[23109]: RTNETLINK answers: File exists
10月 09 18:55:59 cinder systemd[1]: network.service: control process exited,
code=exited status=1
10月 09 18:55:59 cinder systemd[1]: Failed to start LSB: Bring up/down
networking.
10月 09 18:55:59 cinder systemd[1]: Unit network.service entered failed
state.

# 2 MACアドレスが既存のままでした。
色々ぐぐって確認してこれやったりあれやったりしたのですが、だめでした。
「ip addr」で確認すると設定しているはずのIPが出るはずが出ない。。。
なぜだ。。。デバイスが認識してないのかな。。。
と。。。MACアドレスを確認すると、VMのMACアドレスはインポートするときに自動で新しいものが作成されるが
centos側は元のMACアドレスのまま。これをVMのMACアドレスと同じものにしてあげれば
うまくいきました。

これで問題なく繋がりました。
vagrantの共有フォルダ設定

# vagrantの共有フォルダ設定

ただのメモ。
vagrantで共有フォルダが設定されていなかったので設定した。

以下のようにVagrantfileを設定すると、Vagrantfileがあるフォルダと、
仮想マシン上の/vagrant が共有フォルダになる。

```
  # Share an additional folder to the guest VM. The first argument is
  # the path on the host to the actual folder. The second argument is
  # the path on the guest to mount the folder. And the optional third
  # argument is a set of non-required options.
```

Vagrantfileに書いてある説明の通りやっただけ。

```
$ vi Vagrantfile
```

```:Vagrantfile
~
  config.vm.synced_folder "./", "/vagrant"
~
```
XcodeのViewController.swift

お世話になります。XcodeでSingle View Application を選択して、
プロジェクトを作った後、ViewController.swiftのviewDidLoadに、
例えば、print("ありがとう") と書くと、その後、RUN すると、
出力ウィンドウが開いて、ありがとう と表示されるはずですが、
何も表示されません。どなたか、原因がわかる方、お知らせください。
Xcode 8.2.1 macOS Sierra 10.12.3 です。
BootsFacesの導入方法

#JSFでもBootStrapを使いたい
ちょっとしたWebシステムを開発する場合、言語問わず、BootStrapを使うことが多いです。なので、JSF+PrimeFacesな環境でもBootStrapを使いたいですが、そのまま使ってもたぶん競合するだろうなと考えていたら、BootsFacesというものを見つけたのでその導入方法をメモします。

#BootsFacesを導入する
##Mavenで、ライブラリをインストールする
pomに以下を追記します。参考までに、primefacesのdependency要素も記載しています。

```xml:pom.xml
<dependency>
    <groupId>net.bootsfaces</groupId>
    <artifactId>bootsfaces</artifactId>
    <version>1.0.1</version>
    <scope>compile</scope>
</dependency>
<dependency>
    <groupId>org.primefaces</groupId>
    <artifactId>primefaces</artifactId>
    <version>6.0</version>
    <scope>compile</scope>
</dependency>
```

##Hello,BootsFaces
BootsFacesで「Hello,World」をするために、以下のようなxhtmlファイルを作成します。
このとき、名前空間に

```xml
xmlns:b="http://bootsfaces.net/ui"
```

を追記します。利用できるコンポーネントや使い方は[ここ](https://showcase.bootsfaces.net/layout/basic.jsf)を参照します。
一応、PrimeFacesのタグも使って動作確認します。

```xml:hello_bootsfaces.xhtml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
	xmlns:h="http://java.sun.com/jsf/html"
	xmlns:f="http://java.sun.com/jsf/core"
	xmlns:ui="http://java.sun.com/jsf/facelets"
	xmlns:p="http://primefaces.org/ui"
	xmlns:b="http://bootsfaces.net/ui">
<h:head>
	<title>Hello,BootsFaces</title>
</h:head>
<h:body>
	<b:container>
		<b:row>
			<b:column>
				<h1>Hello,BootsFaces!</h1>
			</b:column>
		</b:row>
		<b:row>
			<b:column>
				<p:spinner />
			</b:column>
		</b:row>
	</b:container>
</h:body>
</html>
```

##BootStrapのテーマを変える
せっかくなので、BootStrapのテーマを変えてみます。
[Bootswatch](https://bootswatch.com/)のテーマが使えるそうなので、web.xmlで利用するテーマを指定します。

```xml:web.xml
<context-param>
	<param-name>BootsFaces_THEME</param-name>
	<param-value>cyborg</param-value>
</context-param>
```

##完了
以上で、BootsFacesの導入は完了です。サンプル画面にアクセスして、Hello,Worldできていることを確認します。

![WS000046.JPG](https://qiita-image-store.s3.amazonaws.com/0/83813/80f26ebf-4254-6e35-b8cd-b966f5244c53.jpeg)
webpack で -d option で build すると Android4.4 で error が出るよ。


こんにちは、monpy です。

ハマったのでメモ

webpack は ver 1 -> ver 2 で Development shortcut `-d` の option の内容が変わりました。



ver1

```
--debug --devtool source-map --output-pathinfo
```

ver2

```
--debug --devtool eval-cheap-module-source-map --output-pathinfo
```

で、この `devtool` の値で コンパイルされたコーデは Android 4.4系の端末ではうまく読み込まれず。 `__WEBPACK_AMD_DEFINE_ARRAY__  is not defined` になります。

気をつけましょう。
sudo のパスワードを聞かれないようにする

- 毎回 sudo のパスワードを入力するのが面倒なときは、/etc/sudoers のファイルを編集します。
    - ユーザ inohana に NOPASSWD を追加。
- このファイルは sudo visudo という特殊なコマンドでのみ変更が可能です。
    - このコマンドはデフォルトで sudoers 編集用になっているので対象ファイルの指定は不要。

```
inohana@ino-ubuntu:~$ sudo cat /etc/sudoers
[sudo] password for inohana:
#
# This file MUST be edited with the 'visudo' command as root.
#
# Please consider adding local content in /etc/sudoers.d/ instead of
# directly modifying this file.
#
# See the man page for details on how to write a sudoers file.
#
Defaults        env_reset
Defaults        mail_badpass
Defaults        secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

# Host alias specification

# User alias specification

# Cmnd alias specification

# User privilege specification
root    ALL=(ALL:ALL) ALL
user01  ALL=NOPASSWD: ALL
inohana ALL=NOPASSWD: ALL
# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL

# Allow members of group sudo to execute any command
%sudo   ALL=(ALL:ALL) ALL

# See sudoers(5) for more information on "#include" directives:

#includedir /etc/sudoers.d
Linux経由でリモートデスクトップ接続をフォワーディング

# 概要
リモートデスクトップ接続を通常の接続ではなく、Linuxサーバを経由して接続する場合、sshのポートフォワーディングなどの方法がありますが
これは接続しようとするユーザに、やや負担があります。

また、[Apache Guacamole](http://guacamole.incubator.apache.org/)を利用して、ブラウザ経由でリモートデスクトップ接続させることもできますが、環境構築がやや面倒ですし、できればWindow標準のリモートデスクトップクライアントで繋ぎたいです。

そこで、以下の方法でより簡易にフォワーディングすることができます。

# イメージ図
![Connection Image](https://qiita-image-store.s3.amazonaws.com/0/138821/bcf54867-808f-4535-50f2-e543d2d87485.png)

# インストール
まずLinuxサーバにsocatが入っていなければsocatをインストールします。

```bash
$ uname -a
Linux ip-hogehoge 4.4.44-39.55.amzn1.x86_64 #1 SMP Mon Jan 30 18:15:53 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
$ sudo yum install socat
$ socat -V
socat by Gerhard Rieger - see www.dest-unreach.org
socat version 1.7.2.3 on Mar  6 2014 21:44:52
   running on Linux version #1 SMP Mon Jan 30 18:15:53 UTC 2017, release 4.4.44-39.55.amzn1.x86_64, machine x86_64
features:
  #define WITH_STDIO 1
  #define WITH_FDNUM 1
  #define WITH_FILE 1
  #define WITH_CREAT 1
  #define WITH_GOPEN 1
  #define WITH_TERMIOS 1
  #define WITH_PIPE 1
  #define WITH_UNIX 1
  #define WITH_ABSTRACT_UNIXSOCKET 1
  #define WITH_IP4 1
  #define WITH_IP6 1
  #define WITH_RAWIP 1
  #define WITH_GENERICSOCKET 1
  #define WITH_INTERFACE 1
  #define WITH_TCP 1
  #define WITH_UDP 1
  #define WITH_SCTP 1
  #define WITH_LISTEN 1
  #define WITH_SOCKS4 1
  #define WITH_SOCKS4A 1
  #define WITH_PROXY 1
  #define WITH_SYSTEM 1
  #define WITH_EXEC 1
  #define WITH_READLINE 1
  #define WITH_TUN 1
  #define WITH_PTY 1
  #define WITH_OPENSSL 1
  #undef WITH_FIPS
  #undef WITH_LIBWRAP
  #define WITH_SYCLS 1
  #define WITH_FILAN 1
  #define WITH_RETRY 1
  #define WITH_MSGLEVEL 0 /*debug*/
```

# socatを起動
以下のように3389で待ちうけて、対象サーバへフォワーディングします。

```bash
$ socat tcp4-listen:3389,reuseaddr,fork TCP:35.160.1.26:3389
```

すると、「63.36.3.10」へ接続するだけで、うまく接続を「35.160.1.26」へフォワーディングしてくれます。
![RDP Client](https://qiita-image-store.s3.amazonaws.com/0/138821/6c647e04-543d-b7ef-33ea-2e5e8fd94f08.png)

# 試してダメだったこと
最初はnc(netcat)を利用してやろうとしましたが、できませんでした。
ncは標準で入っていたnc(BSD版?)やGNU Netcatでやりましたが、結果は同じく、繋いだ瞬間に"connection reset by peer"となりました。

```bash:BSD_netcat
$ mkfifo fifo
$ nc -l 3389 < fifo | nc 35.160.1.26 3389 > fifo
```

```bash:GNU_netcat
$ nc -L 35.160.1.26:3389 -p 3389 -vvv
```

# 追記
試しに多段経由もしてみましたが、問題なく接続できました。

# 参考
・[proxying through complex situations](http://geoffgarside.co.uk/2009/02/06/proxying-through-complex-situations/)
【解決済】bashのコマンドラインで指定する変数の挙動が怪しい

# 問題発生！　問題発生！

環境RHEL6にて、これらを打った時のコマンドの結果が違った。

```bash 
$ test=1 echo $test

何も表示されない
```

```bash
$ test=1 ./test.sh   (echo $testが書かれてるbashスクリプト）

1と表示される
```

これは一体なぜ？


# 理由


```bash
$ test=1 env | grep test
test=1
```

どうやらtestはenvを実行したプロセス内では`環境変数`のようだ。

環境変数であれば`test=1 ./test.sh`を実行した時に、子プロセスである`test.sh`の中で`echo $test`が成功するのも当然。（環境変数は子プロセスに引き継がれる）

では、なぜこれは何も表示しないのだろうか？

```bash
$ test=1 echo $test
```

echoが環境変数となった`test`を参照できそうなのに…。
envができたのにechoお前はなぜ駄目なんだ

## 予想

echo だと失敗する…？　もしかしてこいつ`bash`のビルトインコマンドだからでは？？

* [ビルトインコマンド (built-in command)とは｜「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典](http://wa3.i-3-i.info/word11741.html)

もしかしてビルトインコマンドは実行時のシェルで起動される？？

```
[envのケース(ps fの結果)]
bash
 \_ env ← envはforkされ子プロセスとして表示される

[echoのケース(ps fの結果)]
bash ←　ここで実行される？？
```

つまり、envを叩いた時は子プロセスに環境変数が定義されるのでenvが参照でき、echoを叩いた時は子プロセスに環境変数が定義されるけど、echoは親プロセスで動くから環境変数を参照できないということだろうか？？


ここまで予想は立てたけれど、本当かどうかわからない・・・
詳しい方教えていただけないでしょうか・・・
PHPで連想配列の先頭と末尾を取得 (keyが数字じゃなくても使える)

どうでもいい小ネタ。

```php
$last = end($array);
$first = reset($array);
```

順番をひっくり返すと副作用(内部ポインタズレ)が発生するので注意。
普通にコード書いてれば影響ないと思うけど、while使うような酔狂な人がいたら要注意。

keyも合わせて取得するならこんな感じ。

```php
$last = end($array);
$last_key = key($array);
$first = reset($array);
$first_key = key($array);
```
GoogleAPIsをMacローカル環境のDefault Credential(key指定なし)でアプリケーション上で使うやりかた

## 背景
- ローカルMacの開発でrails環境上から[google-cloud-ruby](https://github.com/GoogleCloudPlatform/google-cloud-ruby) を使いたい
- gcloud auth login([詳細](http://qiita.com/yuko/items/1c4ee5b081c5b6a3ac8a))しているのにapi使おうとすると認証エラー
- APIも有効にしたし、ユーザー権限も付与しているのになぜか認証エラー出る
- service accountの設定とかはちょっと面倒

## やって見る価値あるかも
```
gcloud auth application-default login
```

公式docより

> If you have installed the Google Cloud SDK on your machine and have run the command gcloud auth application-default login, your identity can be used as a proxy to test code calling APIs from that machine.




## 参考
https://developers.google.com/identity/protocols/application-default-credentials
【LINE Bot】チャット感覚の掲示板「TREND x TREND」を作ってみた【トレトレ] 

![new_TREND x TREND-logo-black.jpg](https://qiita-image-store.s3.amazonaws.com/0/168581/6d783261-172c-709d-d2dc-4ec92a2eeeba.jpeg)
# はじめに
[LINE BOT Awards](https://botawards.line.me/ja/)なるものが、現在行われているということで締め切り直前で滑り込みエントリーしてきました。
phpとhtmlで動いており、環境としてはさくらインターネットのレンタルサーバ スタンダードプランを使っています。共有SSLでもばっちり動きます。

# 今回作ったLINE BOT「TREND x TREND」とは
テーマが設定された「チャンネル」に参加した人同士でLINEチャットを共有できるサービスです。
公式チャンネルとしてテレビやグルメ・映画を用意していますが、ユーザもチャンネルを作成可能。
好きなテーマで皆で会話ができるようになっています。

トップ画面はこちら↓
![new_use.jpg](https://qiita-image-store.s3.amazonaws.com/0/168581/33eb2ca0-9501-f339-8e45-09bb16799d98.jpeg)
テレビやグルメなどのカテゴリを選択すると、チャンネルが選べるようになっています。（テレビだったら、テレ朝・フジテレビ・・・みたいな感じです。）

チャンネルに参加すると、他のユーザのコメントもPushで送られてくるようになっています。
チャンネルに参加しているユーザと、テレビの話をしたり、夜ご飯の話をしたり、リアルタイムでみんなと会話ができるBOTになっています。
![new_use2.jpg](https://qiita-image-store.s3.amazonaws.com/0/168581/bcd4639b-3785-b801-f9eb-04bd028149b0.jpeg)

# 自分でチャンネルが作れる！「ユーザチャンネル」
公式だけではなく、自分でテーマを作りたい！というユーザの方もたくさんいらっしゃると思います。
そんな時はLINE BOTに「チャンネル作成」と入力してみてください。
![new_use3.jpg](https://qiita-image-store.s3.amazonaws.com/0/168581/efea8e16-b4b4-ecec-92af-94129b2c6463.jpeg)

BOTに従って必要な項目を入力すると、自分の好きなテーマで新しいチャンネルを作ることができるようになります。
今回作ったチャンネルは「からあげくんの圧倒的なおいしさについて」というものですが、イベント会場での情報交換やアンケートなどにも活用できるBOTだと思います。

# まずは、友達登録して遊んでみてください！
初めてのBOTで緊張しますが、ご意見ご要望お待ちしています！
![image](https://qiita-image-store.s3.amazonaws.com/0/168581/1a009082-b0e8-04ea-6942-984eb9eda8c9.png)


# 【追記】チャンネルID指定
チャンネルIDを指定すると、LINE BOT上に表示されるチャンネル以外にも参加できるようになりました！
リッチメニューの下の段の真ん中ボタン「チャンネルID指定」を選択すると、IDに反応するようになります。
![new_use4.jpg](https://qiita-image-store.s3.amazonaws.com/0/168581/553980f5-64e9-889f-5f33-d3f8d435be42.jpeg)

各チャンネルのID確認は[公式ホームページ](http://tretre.net/index.php)からどうぞ。

LINE BOT Awardsについてのチャンネルも作成したので、みんなでLINEでおしゃべりしましょう！
LINE BOT AwardsチャンネルのIDは「18」です！
![image](https://qiita-image-store.s3.amazonaws.com/0/168581/d2d1380a-ccc1-f32f-5167-ca96119a7776.png)
JekyllでタイムゾーンなしのタイムスタンプがUTCになってしまう

#結論

Jekyll Front Matterのdateフィールドにタイムゾーンなしの日付を書くと、UTCとして扱われる。_config.yamlのtimezone指定はこれには影響しない。タイムゾーンを書くしかない

## 原因
Front MatterはSafeYAMLでパースされている。このパースの過程で、dateフィールドの文字列がTimeオブジェクトに変換されている。パースにはDateTime.parseが使われ、その跡でDateTimeオブジェクトがTimeオブジェクトに変換されている。

[DateTime.parseはタイムゾーン表記がない時はUTCとしてパースしてしまう](http://qiita.com/suzukis/items/b61340bfdd1a418b4b13)