OmniAICreator/Qiita-1.07M huggingface dataset:
slider V2 メモ

```js
  let btn = {
    next: $("btn要素"),
    prev: $("btn要素"),
  }

  let parts = {
    width: 406,
    left: 0,
    index: 0,
    $prent: $("スライドターゲット"),
    slide_anime: function() {
      $child = this.$prent.children();
      len = $child.length - 1;
      parts.$prent.stop().animate({
        left: -parts.width + "px"
      }, 600, function() {
        $child.filter(':first-child').appendTo(parts.$prent);
        parts.$prent.css('left', '');
      });
    },
    slide_prev: function() {
      $child = this.$prent.children();
      len = $child.length - 1;
      parts.$prent.stop().animate({
        left: parts.width + "px"
      }, 600, function() {
        $child.filter(':last-child').prependTo(parts.$prent);
        parts.$prent.css('left', '');
      });
    },
 
  };
```
letをvarに変えても同じ動きをします。

ブラウザ側で、見た時に、見えていない所に、要素を置いとくのもとても大事です。
例）　３←見えていない　１２３←見えている　１２３←見えていない　１２←見えていない。

あとは、コードを見ればだいたいわかっていたがけるかと思います。

では、参考までに
ajax通信で、取得したDOMを操作　メモ　（v2）

バージョンアップ版です。


```js
  $.ajax({
          url: '../表示させたい.html',
          dataType : 'html',
    }).done(function(data){
       $('#sample-text').html(data);
    
    }).fail(function(data){
        $('#sample-text').html(data);
    });
```

では、参考までに
[boost::range]chunkをsliceで分割してheaderをjoinしてみる

バイナリをchunkで分割し、そのサイズをヘッダーに付与してみた。
サイズは2byteで表現可能な64KBまで(256 x head[3] + head[2])

# 評価コード
```
#include <iostream>
#include <iterator> 
#include <fstream>
#include <sstream>
#include <boost/range/adaptor/sliced.hpp>
#include <boost/range/algorithm/copy.hpp>
#include <boost/range/join.hpp>

int main(){
  std::ifstream input( "1.jpg", std::ios::binary );
  std::vector<char> buffer((
    std::istreambuf_iterator<char>(input)), 
    (std::istreambuf_iterator<char>()));
  
  size_t chunkSize = 64 * 1024 -1; // 65535
  char head[4] = { 0x02, 0x01 };
  size_t end = 0;
  size_t byteSize = buffer.size();

  while(end < byteSize){
    size_t pos = end;
    end += chunkSize;
    if (end > byteSize)
      end = byteSize;
    
    int len = end - pos;
    head[2] = len;
    head[3] = int(len / 256);

    std::string str;
    boost::copy(
      boost::join(head, 
        buffer | boost::adaptors::sliced(pos,end)),
      std::back_inserter(str));
    
    // output test
    std::cout << "binary: ";
    std::stringstream ss;
    for (int x = 0; x < 10; x++)
      ss << std::hex << (int)(unsigned char)str[x];

    std::cout << ss.str();
    ss.str("");
    std::cout << " ... ";
    
    for (int x = str.size()-10; x < str.size(); x++)
      ss << std::hex << (int)(unsigned char)str[x];

    std::cout << ss.str() << std::endl;
    std::cout << "size: " << str.size() << std::endl;

    // std::ofstream ofs("out.bin", std::ios::binary);
    // ofs.write(&str[0], str.size());
  }
}
```

# 出力
```
binary: 21ffffffd8ffe0010 ... 1eae66bba547bd8836d8
size: 65539
binary: 21558d77b32e3232e1 ... 78d137b3c12e2bc1ffd9
size: 36185
```
LINE bot作業環境構築中に起こった出来事

#Composerのインストールで陥ったこと
###・mvの権限が無いと言われた
---
ターミナルからcomposerのインストールをした際、
`sudo curl -sS https://getcomposer.org/installer | php`
の入力後、composer利用のためにファイルを移す必要があり
`mv composer.phar /usr/local/bin/composer`
と入力をしたが
`mv: rename composer.phar to /usr/local/bin/composer: Permission denied`
と返って来た。
調べた結果、ファイル移動の権限が無いということなので、`sudo`コマンドで実行したら解決した。
`sudo　mv composer.phar /usr/local/bin/composer`
※作業環境：mac

---

###・ログの確認
---
herokuでデプロイ後
コマンドでエラーの確認時に役にたちます
`heroku logs --app [アプリ名] --tail -s app`
でlogの確認をすることができた。

---

そんなところです。あとはスムーズに行えました。
Atom+emmet環境でejs内でもhtml展開を有効にする

emmetにはユーザー拡張機能があるので、これを使用して有効にします。

### 拡張設定ディレクトリの確認

`Settings -> Packages -> emmet -> Settings`から`Extensions Path`のに設定されているディレクトリを確認します。
デフォルトでは`~/emmet`が設定されています。

### 拡張設定ファイルの配置

上記で確認した拡張設定ディレクトリに、以下の内容を記述した拡張設定ファイルを配置します。
ファイル名は`snippets.json`とします。

```json:snippets.json
{
    "ejs": {
        "filters": "ejs",
        "extends": "html",
        "profile": "xml"
    }
}
```

Atomを再起動すると、ejs内でもemmetが有効になります。
Shinjuku.LT行ってきた



botkitの話 @ftsan 
---

chatbot作るには[howdyai/botkit](https://github.com/howdyai/botkit)が便利

crontab的な機能を入れたいときには[rschmukler/agenda](https://github.com/rschmukler/agenda)が良さそう


死んだら強くなる話
---

激務のあとに成長を感じた話

### 女性の下着を数える話を振られた

2,3人 x 9〜10時間/日 x 2週間 = 下着を数える期間

下着を数えて、大抵のことでは折れない心を手に入れた


### ダンプデータをSTGにレストアしたつもりが時空超越した話

(危険すぎるので省略)

以来無事故人生

### PTG（ストレス後成長）

つらい経験を乗り越えた70％の人に心理的な成長があるらしい


Phantom Type @to4iki
---

builderscon tokyo 2017やります

### Phantom Typeとは

型検査を利用したデザインパターン

型に状態を当て込む

条件を満たさないとコンパイルエラー

`execute()`するまえに`setA(String)`, `setB(Int)`を呼ばないとコンパイルエラーにすることが出来る。


日々がちょっと楽しくなるかもしれないやつを作ってみた
---

世の中の4桁の数字で10を作る遊び

作れないパターンだと悲しい

10が作れるか判定するプログラムを書いた！


SREとToilについて @mnuma 
---

### Toil

Operationが存在することがそもそもバグ GoogleのSREの中の人

OperationじゃなくてToilという言葉を使う

* 手作業
* 繰り返し作業
* 機械でできそうなこと
* 割り込み作業
* 永続的な価値がないこと
* サービス拡大に伴って増える作業

これらはToilな作業

Toilを50％以下にすることを目標としている
ほうっておくと100％になってしまう

### ソフトウェアエンジニアとインフラエンジニア

効率化を優先するソフトウェアエンジニアと、安定を優先するインフラエンジニア。

互いにリスペクトする事が大事。
SREチームの待遇を良くすることで推進のモチベーションとする。

つけ麺屋の話 @HomMarkHunt
---

良い雰囲気の良いチームが良い成果物を生み出すと考えていた。

悪い雰囲気の悪いチームが良い成果物を生み出すラーメン屋がある。

なぜか。

チームメンバーの利益となることをちゃんと共有していた。
モチベーションを確保していた。


Let's Mob Programming @hmaruyama 
---

### Mob Programmingとは

* 同じ場所
* 同じ時間
* 同じPC
* 同じ課題

を解決するコードを書く。


並に使うVim @8140i2865_3
---

絶対サクラエディタ環境からMac移行に伴ってVimに移行

疾走感のすごい発表だった。

```
$ vimtutor
```

でVimの入った環境ならチュートリアルが読める
initファイルへのproperty関連ファイルの関連付をソースを追って調べてみた。

initファイルへのproperty関連ファイルの関連付をソースを追って調べてみた。
# cm-12.1の場合
## 1. "system/core/init"を指定しているMakeファイルの探索
下記のコマンドで探索する
```
$ find ./ -name '*.mk' | xargs grep 'LOCAL_C_INCLUDES := system/core/init'  -lrns
./device/qcom/common/init/Android.mk
``` 
## 2. 見つかったAndroid.mkの中身の確認。
下記はLineageOSのandroid_device_qcom_commonリポジトリ中のものから一部抜粋すると,
```
ifeq ($(LIBINIT_USE_MSM_DEFAULT),true)
  LOCAL_SRC_FILES += init_msmdefault.c
else
  ifneq ($(TARGET_LIBINIT_DEFINES_FILE),)
    LOCAL_SRC_FILES += ../../../../$(TARGET_LIBINIT_DEFINES_FILE)
  else
    LOCAL_SRC_FILES += init_$(TARGET_BOARD_PLATFORM).c
  endif
endif
LOCAL_MODULE := libinit_msm
```
TARGET_LIBINIT_DEFINES_FILEが何だかそれっぽいので。。。。
## 3. TARGET_LIBINIT_DEFINES_FILEの定義を探索
```
$ find ./ -name '*.mk' | xargs grep 'TARGET_LIBINIT_DEFINES_FILE'  -lrns
./device/qcom/common/init/Android.mk
./device/samsung/hlte/BoardConfig.mk
```
ま、一つ目は先程出てきたものなので、ここでは無視して2つ目は
下記はLineageOSのandroid_device_samsung_hlteリポジトリ中のものから一部抜粋すると,
```
TARGET_INIT_VENDOR_LIB := libinit_msm
TARGET_LIBINIT_DEFINES_FILE := device/samsung/hlte/init/init_hlte.c
```
# cm-14.1の場合
## 1. "system/core/init"を指定しているMakeファイルの探索
下記のコマンドで探索する
```
$ find ./ -name '*.mk' | xargs grep 'LOCAL_C_INCLUDES := system/core/init'  -lrns
./device/samsung/msm8974-common/init/Android.mk
``` 
## 2. 見つかったAndroid.mkの中身の確認。
下記はLineageOSのandroid_device_samsung_msm8974-commonリポジトリ中のものから一部抜粋すると,
```
LOCAL_MODULE_TAGS := optional
LOCAL_C_INCLUDES := system/core/init
LOCAL_CFLAGS := -Wall -DANDROID_TARGET=\"$(TARGET_BOARD_PLATFORM)\"
LOCAL_SRC_FILES := init_msm8974.cpp
ifneq ($(TARGET_LIBINIT_MSM8974_DEFINES_FILE),)
  LOCAL_SRC_FILES += ../../../../$(TARGET_LIBINIT_MSM8974_DEFINES_FILE)
endif
LOCAL_MODULE := libinit_msm8974
```
差分は簡単なので以下説明を省略。
デザインパターン学習メモ：「Command」

## このパターンの目的
GoF本より引用する。

> 要求をオブジェクトとしてカプセル化することによって、異なる要求や、要求からなるキューやログにより、クライアントをパラメータ化する。また、取り消し可能なオペレーションをサポートする。

execute()のみをもつインタフェース(Java言語)を作成し、このインタフェースを実装したコマンド（命令）クラスを作る。
このコマンドクラスを要求として渡された処理の実行者は、その中身を知らなくてもexecute()を呼ぶことで実行することができる。つまり、処理の内部実装のカプセル化である。

さらに、カプセル化を用いて処理を抽象的に扱うことによって、共通の方法で要求の取り消しや再実行可能にする。
この場合は、状態の保存が必要になる。

## 実装例
『アジャイルソフトウェア開発の奥義』(P.203)をベースに作成。Commandパターンを利用したActive Objectパターンとして紹介されている。

```java:Command.java
// Command役
public interface Command {
	public void execute();
}
```

```java:ActiveObjectEngine.java
// Invoker役
public class ActiveObjectEngine {
	LinkedList<Command> itsCommands = new LinkedList<Command>();

	public void addCommand(Command c) {
		itsCommands.add(c);
	}
	
	// リストからコマンドを取り出し、一つずつ実行する
	public void run() {
		while(!itsCommands.isEmpty()) {
			Command c = itsCommands.getFirst();
			itsCommands.removeFirst();
			c.execute();
		}
	}
}
```

```java:SimpleCommand.java
// ConcreteCommand役
public class SimpleCommand implements Command {
	private String name;
	
	public SimpleCommand(String name) {
		this.name = name;
	}

	@Override
	public void execute() {
		System.out.println("Executed by " + name);
	}
}
```

```java:SleepCommand.java
// ConcreteCommand役
// 自身の処理が完了した後に、wakeUpCommandをEngineに登録する。
public class SleepCommand implements Command {
	private String name;
	private Command wakeUpCommand;
	private ActiveObjectEngine engine;
	private long sleepTimeMilliSec;
	private long startTime;
	private boolean started = false;

	public SleepCommand(String name, long sleepTimeMilliSec,
			ActiveObjectEngine engine, Command wakeUpCommand) {
		this.name = name;
		this.sleepTimeMilliSec = sleepTimeMilliSec;
		this.engine = engine;
		this.wakeUpCommand = wakeUpCommand;
	}

	@Override
	public void execute() {
		long currentTime = System.currentTimeMillis();
		if (!started) {
			System.out.println(name + " started.");
			started = true;
			startTime = currentTime;
			engine.addCommand(this);
		} else if ((currentTime - startTime) < sleepTimeMilliSec) {
			engine.addCommand(this);
		} else {
			System.out.println("Executed by " + name);
			engine.addCommand(wakeUpCommand);
		}
	}
}
```

### 実行例
```java.Main.java
public class Main {
	public static void main(String[] args) {
		ActiveObjectEngine engine = new ActiveObjectEngine();
		engine.addCommand(new SimpleCommand("SimpleCommand-A"));
		engine.addCommand(new SimpleCommand("SimpleCommand-B"));
		engine.addCommand(new SleepCommand("SleepCommand-C", 3 * 1000, engine,
				new SimpleCommand("WakeupCommand-C")));
		engine.addCommand(new SimpleCommand("SimpleCommand-D"));

		engine.run();
	}
}
```

```text:結果
Executed by SimpleCommand-A
Executed by SimpleCommand-B
SleepCommand-C started.
Executed by SimpleCommand-D
Executed by SleepCommand-C
Executed by WakeupCommand-C
```

基本的に順番通りに各Commandが実行されている。SleepCommandだけは、意図通りSleepしているため、完了が最後になっている。



## 参考文献
 * エリック ガンマ、ラルフ ジョンソン、リチャード ヘルム、ジョン プリシディース（1999）『オブジェクト指向における再利用のためのデザインパターン　改訂版』本位田　真一、吉田　和樹 監訳、SBクリエイティブ
 * ロバート・C・マーチン（2004）『アジャイルソフトウェア開発の奥義　第２版　オブジェクト指向開発の神髄と匠の技』瀬谷啓介訳、SBクリエイティブ
Windows10でpip.ini(pip.conf)の配置場所

pip 9.0.1 以降で pip list をすると何か出ますね。

```bash
$ pip list
DEPRECATION: The default format will switch to columns in the future. You can use --format=(legacy|columns) (or define a format=(legacy|columns) in your pip.conf under the [list] section) to disable this warning.
```

書かれている通り、pip.confを作って設定すればいいのですが、そもそもどこに配置すればよいのかわかりません。
ググるといくつか見つかりますが、残念ながらWindows環境の情報が見つかりません。
結論から言うと %APPDATA% に 「pip」というフォルダを作成して「pip.ini」という名前で配置すると認識されます。

```:%APPDATA%\pip\pip.ini
[list]
format=columns
```
Facebookページのいいね数をNode.jsでスクレイピングするメモ


dotstudioのFacebookページ https://www.facebook.com/dotstud10/ のいいね数を取得してみます。

スクレイピングなのでFacebookのHTML構成などが変更になったら動かなくなりますのでご了承ください。
(2017年5月21日現在)

## axiosのインストール

```
$ npm init --yes
$ npm i --save axios
```

## コード

調べてたら`#xff01;`と`&#x4ef6;`の間にいいね数があるので取得しました。
まじでそのうち動かなくなりそう。

```app.js
'use strict';

const axios = require(`axios`);
const FBURL = `https://www.facebook.com/dotstud10/`;

axios.get(FBURL)
  .then((response) => {
    const html = response.data;
    const like = html.match(/#xff01;(.*?)&#x4ef6;/)[1];
    console.log(like);
  })
  .catch((error) => {
    console.log(error);
  });

```

## 実行

```
$ node app
333
```

現時点のいいね数が333だったので確かに取得できています。

`const FBURL`の部分を別のFacebookページに変更しても取得できます。

お世話になっているDMM.make AKIBAさんのFBページ https://www.facebook.com/dmm.make.akiba/ で試してみました。

```
$ node server.js
5,285
```

5285という数字が取れました。

## 終わりに

あまり詳しくないけど設定などでFacebookページの見た目が違う場合は上手くいかないこともあると思います。また、Facebookのデザインが変われば動かなくなるのでとりあえずって感じだと思います。

自分が管理しているFBページであればAPIを使ったほうが良さそうです。
jupyter notebook起動時に自動でブラウザが開かない

jupyter nootbookを開こうとすると以下のようなエラーが表示され自動でブラウザが開かれなくなりましたのでその対処法を調べました。おそらくMac OSのアップデートが原因だと考えられます。

```
0:97: execution error: "http://localhost:8888/tree?token=2ab101b71b3d00b692865cb0039257b68afa12c9d57615fd"は“open location”メッセージを認識できません。 (-1708)
```

または

```
0:97: execution error: "http://localhost:8888/tree?token=2ab101b71b3d00b692865cb0039257b68afa12c9d57615fd" doesn’t understand the “open location” message. (-1708)
```

## 環境
- MacOS 10.12.5
- GoogleChrome 58.0.3029.110 (64-bit)
- Firefox 52.0.2
- Safari 10.1.1
- python 3.5.1
- jupyter 4.3.0

## 解決策
### ブラウザに依存しない方法
以下を`.zshrc`に追加することで解決。

```~/.zshrc
export BROWSER=open
```
以上で解決しない場合は以下を試してみてください。

### ブラウザがChromeの場合
以下を`.zshrc`に追加することで解決しました。

```~/.zshrc
export BROWSER=/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome
```

zshでない場合は`.zshrc`部分を`.bash_profile`などに適宜変更してください。

### ブラウザがSafari,Firefoxの場合
以下を`~/.jupyter/jupyter_notebook_config.py`に追加することで解決します。

```~/.jupyter/jupyter_notebook_config.py
c.NotebookApp.browser = u'Safari'
```
または

```~/.jupyter/jupyter_notebook_config.py
c.NotebookApp.browser = u'firefox'
```

## まとめ
Safariやfirefoxのやり方をchromeでしてみたり。chromeのやり方をSafariやfirefoxでやるとうまく行きませんでした。
できれば上のどちらかに統一したいですね。できたよーということがあればコメントくださると助かります。
また、自動でopenされなくて良いと言う場合は↑のようなことをする必要はありません。
今回は応急処置的に対処しましたが、公式で対応されれば自分たちで対策する必要がなくなると思われます。


## 参考
https://github.com/jupyter/notebook/issues/2438
chromeのヘッドレスを利用してみる

# chromeにヘッドレス機能がついた

[こちらのブログ](https://developers.google.com/web/updates/2017/04/headless-chrome?hl=ja)を参照していただきたい。

ついにchromeにヘッドレスがついたみたいなので早速扱ってみる。
下手をすると自動テストの歴史を塗り替えるかもしれないこの機能。
使っておくに越した事はない。
　
でも、自動テストはやらない。

作ったものは[こちら](https://github.com/miyatama/adoc-pdf-converter)。

先に言っておくと、
結果はちょっと残念な感じになった。

# 何をするか

10分ぐらい考えた結果、
ヘッドレスでPDF出力してみる。

動作は単純。

``dockerのvolumeで指定されたディレクトリ配下のadocをPDF化する。``

と言うもの。

「adocならPDFに出せる」とか言わないで欲しい。
野暮だ。

以下、環境

 + centos7
 + docker 17.05.0-ce

# 実践

って言ってもDLしてUPDATE.sh叩くだけ。

``` bash
git clone https://github.com/scheib/chromium-latest-linux.git
cd ./chromium-latest-linux
chmod +x ./*.sh
./update.sh
mkdir /opt/chrome
cp -r ./latest/* /opt/chrome/
ln -s /opt/chrome/chrome /usr/local/bin/chrome
cd /
rm -fr /chrome-latest-linux
```

後は簡単

``` bash
chrome --headless --disable-gpu --no-sandbox --print-to-pdf URL
```

でカレントディレクトリにPDFが出力される。

--no-sandboxは、無しで実行しようとしたら
「つけれ」って怒られたから付けた。

将来的にはなくなるのかもしれない。

# 結果

変換前は[こちら](https://github.com/asciidoctor/asciidoctor.org/blob/master/README.adoc)

変換後は↓
![from_pdf.png](https://qiita-image-store.s3.amazonaws.com/0/42445/bd10efa0-3bdb-139a-c646-912e948e8c08.png)

なんかちょっと残念な感じだ。
[よくある] Volumeが壊れているなどと言われた時[win7]

バイト先のLenovoB590（win7ノートパソコン）がCドライブでエラーを起こしているとのことで暇だったので直して見た

#正直CドライブがエラーとPCから言われているがなんのエラーなのか全くわからないので通過儀式的にchkdskをした
chkdskはwindowsの簡単なドライブエラーの５割は直せるなかなか最強コマンドです実行するには
コマンドプロンプトをWinキーを押した後にcmdを押して
####管理者権限で起動します!（これ大事）
![1.png](https://qiita-image-store.s3.amazonaws.com/0/171398/cb3df3c0-8d5b-fae2-194a-775b28bba156.png)
そうしたら
おなじみの黒い画面が出て来ますので、
##>chkdsk /f (/fが無いと読み取りのみで修復ができません)
![2.png](https://qiita-image-store.s3.amazonaws.com/0/171398/d3aa0a7b-534f-c2dc-0aa3-d2dd05f1cc9d.png)
と入力します。
するとボリュームが使用中なのでchkdskをできません、再起動時に実行しますかと言う旨のメッセージが出て来ますので
Y
を入力します。
お疲れ様です。あとは再起動するだけ。

##（蛇足）再起動をかっこよく決める
いつものようにGUIによる再起動もいいでしょう。
しかし折角コマンドラインを開いているのでそのまま再起動してしまいましょう！
>shutdown /r(再起動) /t 0(即時に)
![3.png](https://qiita-image-store.s3.amazonaws.com/0/171398/40df4838-68c5-8532-6af5-5e75de5b1474.png)

で再起動します。
##んで
![DSC_0472.png](https://qiita-image-store.s3.amazonaws.com/0/171398/72619674-8b28-1646-62a9-4d5e8b8dea1e.png)
バーっとコマンドが流れてだいたい５−６０分で終わるので、これでドライブエラーの５割は治ります。
これで治らないやつは多々ありますが、それはそのうち。。

#というかQiita初投稿（登校）
今ままでは[Ztaka](http://ztaka.com)で技術系も書いてたわけですが今回気まぐれでQiitaに投稿して見ましたがなんだこれめっちゃ描きやすいぞMarkdownつよいな
ただし 
##payload too large お前は許さん
MacでインストールされているJavaを確認する方法

恐ろしく記憶力が悪いのでメモしておきます。

# 現在使っているJavaを確認する
```zsh
# バージョン
$ java --version
openjdk 15.0.1 2020-10-20
OpenJDK Runtime Environment (build 15.0.1+9)
OpenJDK 64-Bit Server VM (build 15.0.1+9, mixed mode, sharing)
# 場所
$ which java
/usr/local/opt/openjdk/bin/java
```

# インストールしたJavaを全部見る
OSとか使ってるものとか・・・・環境によって様々なので過去も含めて全部書いておきます。


## /usr/libexec/java_home
- 環境 : macOS BigSur Version11.1
- 参考 : [macにjava8をインストール - Qiita](http://qiita.com/yanap/items/186d5bd1118f68f725d8)

```bash
# インストールされているJavaがある場合はこんな感じ
$ /usr/libexec/java_home -V
Matching Java Virtual Machines (5):
    1.8.0_131, x86_64:	"Java SE 8"	/Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk/Contents/Home
    1.8.0_45, x86_64:	"Java SE 8"	/Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home
    1.7.0_67, x86_64:	"Java SE 7"	/Library/Java/JavaVirtualMachines/jdk1.7.0_67.jdk/Contents/Home
    1.6.0_65-b14-468, x86_64:	"Java SE 6"	/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home
    1.6.0_65-b14-468, i386:	"Java SE 6"	/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home

/Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk/Contents/Home

# インストールされたJavaがないと何も出ないけど
$ /usr/libexec/java_home -V
# sudoつけてひつこく聞くと「Javaはないからサイト見てインストールすれば」的なメッセージが出る
$ sudo /usr/libexec/java_home -V
The operation couldn’t be completed. Unable to locate a Java Runtime.
Please visit http://www.java.com for information on installing Java.
```


## HomebewでインストールしたJava
- 環境 : macOS Sierra Version 10.12.4

`xxx/java_home -V`的なのはないので地味に`brew list`するか、ディレクトリを確認します。

```zsh
# バージョンが見えなくて・・・使いずらい
$ brew list | grep jdk
openjdk
openjdk@11
openjdk@8

# ディレクトリをみても・・・バージョンが見えなくて・・・使いずらい
$ ls -la /usr/local/Cellar | grep jdk
drwxr-xr-x   3 ponsuke  admin   96  3  3 20:29 openjdk
drwxr-xr-x   3 ponsuke  staff   96 10 23  2020 openjdk@11
drwxr-xr-x   3 ponsuke  staff   96 11 17  2020 openjdk@8
```

## /System/Library/Frameworks/JavaVM.framework/Versions/A/Commands/java_home
- 環境 : macOS Sierra Version 10.12.4
    - macOS BigSur Version11.1 ではこのディレクトリはありませんでした。
- 参考 : [OSXでJavaのバージョンを切り替える - Qiita](http://qiita.com/ringo/items/db58b34dc02a941b297f)

```bash
$ /System/Library/Frameworks/JavaVM.framework/Versions/A/Commands/java_home -V
Matching Java Virtual Machines (5):
    1.8.0_131, x86_64:	"Java SE 8"	/Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk/Contents/Home
    1.8.0_45, x86_64:	"Java SE 8"	/Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home
    1.7.0_67, x86_64:	"Java SE 7"	/Library/Java/JavaVirtualMachines/jdk1.7.0_67.jdk/Contents/Home
    1.6.0_65-b14-468, x86_64:	"Java SE 6"	/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home
    1.6.0_65-b14-468, i386:	"Java SE 6"	/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home

/Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk/Contents/Home
```


# Javaを切り替える
[Javaのバージョンを切り替える方法 - Qiita](https://qiita.com/ponsuke0531/items/795cd00d93b71c14d07b)

# Javaをインストールする
[Homebrewでjavaをインストールする方法 - Qiita](https://qiita.com/ponsuke0531/items/9be8dee67a91c6c78d4f)
MacでLAN内のパケットを盗聴する

# 概要

同一LANに接続しているコンピュータのパケットは盗聴しほうだいとよく言われますが、実際に可能なのかどうか気になったので調べてみました。

盗聴の手法はIPAの試験にも出てくる [ARPスプーフィング](https://ja.wikipedia.org/wiki/ARP%E3%82%B9%E3%83%97%E3%83%BC%E3%83%95%E3%82%A3%E3%83%B3%E3%82%B0) という奴で、ターゲットのコンピュータのARPキャッシュを強制的に自分のMACアドレスに書き換えて、ターゲット宛のパケットを全て自分のコンピュータを通すようにするという物です。
ARPキャッシュの強制書き換えには [Gratuitous ARP (GARP) ](https://ja.wikipedia.org/wiki/Gratuitous_ARP) を使います。

```盗聴イメージ.txt
デフォルトゲートウェイ
↓
ターゲットのコンピュータ
```

↓

```盗聴イメージ.txt
デフォルトゲートウェイ
↓
自分のコンピュータ (IP Forwarding)
↓
ターゲットのコンピュータ
```

今回は難しい知識が無くてもARPスプーフィングが出来る `arpspoof` というツールを使います。

# 注意

悪用、ダメ。ゼッタイ。
[有線電気通信法 第九条](http://law.e-gov.go.jp/htmldata/S28/S28HO096.html)
> 有線電気通信の秘密は、侵してはならない。

# 準備

- [MacPortsのインストールと設定メモメモ](http://qiita.com/us10096698/items/54195e60b7afb60105ef) でMacPortsを入れる
- `sudo port install dsniff` で arpspoof をインストール  
(`port` コマンドが使えなかったら、 `/opt/local/bin` と `/opt/local/sbin` にパスを通す)

# 実践

まず、下記コマンドで Mac の IP Forwarding 設定を有効にします。

```
sudo -S sysctl -w net.inet.ip.forwarding=1
```

次に、下記コマンドを打ってターゲットのパケットを自分のコンピュータを経由するようにします。
(コマンドを実行するとログが流れてターミナルを占有してしまうのでそれぞれ別ターミナルで実行する)

```
arpspoof -i en0 -t [ターゲットの IP アドレス] [ゲートウェイの IP アドレス]
arpspoof -i en0 -t [ゲートウェイの IP アドレス] [ターゲットの IP アドレス]
```

これでWireshark等のパケットキャプチャツールでパケットの流れを確認すると、ターゲットのパケットが自分のMacを経由していることが確認出来ると思います。

終わったらarpspoofを実行している画面で `ctrl+c` を押してから、下記コマンドで IP Forwarding の設定を無効にします。

```
sudo -S sysctl -w net.inet.ip.forwarding=0
```

# まとめ

よく言われる通り、同一LAN上のパケットは特別な知識が無くてもツールだけで簡単に盗聴出来るということがわかりました。
しかし、HTTPS通信は盗聴されても暗号化されていて中身が読めないので、公共LAN等でインターネットに接続する際はHTTPS対応のサイトに限定すべきでは無いかと思いました。
(そもそも公共LAN自体セキュリティがアレなので使うべきでは無いのかもしれない)

今回はツールに頼りっきりで内部で何をやっているかはイマイチわからなかったので、いつかは自作出来るようにしたいです。
fisherman で oh-my-fish テーマインストール時のエラー

[fisherman](https://fisherman.github.io/) で oh-my-fish のテーマである [zish](https://github.com/oh-my-fish/oh-my-fish/blob/master/docs/Themes.md#zish) をインストールしようとしてこんなエラーが出た。

```
> fisher omf/zish
You need fish 2.3.0 or higher to take advantage of snippets.
Without it some plugins might not work.

Refer to your package manager documentation
for instructions on how to upgrade your fish build.

If you can not upgrade, append the following code
to your ~/.config/fish/config.fish:

for file in ~/.config/fish/conf.d/*.fish
	source 
end

Installing 1 plugin/s
! Fetch zish github.com/oh-my-fish/plugin-zish
! There was an error installing zish or more plugin/s.
Try using a namespace before the plugin name: owner/zish
```

上半分はとりあえずバージョンに起因する文言なのでここでは置いとくとして、下の `Installing ...` 以降を読む限りどうも `omf/zish` だけではだめな模様。
なんでやって思ってググったら下記のような issue が上がっていたのでそれで解決。

https://github.com/fisherman/fisherman/issues/278

よって

```
> fisher omf/theme-zish
```

としてあげてインストール完了。
プログラミングにおけるHigh-Levelの意味。KerasはどうHigh-levelなのか調べてみた

機械学習の勉強をしていると、[Keras](https://keras.io/)というライブラリに行き当たります。これが何者なのか、なぜ必要なのかを理解するのに手間取ったので、書き留めておきます。端的に言えばプログラミングにおける"__High-level__"という単語の意味がわかれば一発で理解できるのですが、この理解に手間取りました。

無知を晒す記事ですが、私と同じく理解に戸惑った方がいたらお役に立てれば幸いです。

## Kerasとは

Kerasは、公式サイト曰く、

>Keras is a high-level neural networks API,  written in Python and capable of running on top of either TensorFlow or Theano.

らしい。

TensorFlowかTheanoの上で動作する__High-level__なニューラルネットワークAPIのライブラリ。

topとかHigh-levelとか、なんか上の方で作用するらしい。何がどう高いんだろう？

## High-levelの意味

プログラミングの文脈におけるHigh-levelは、より__抽象度の高い__、とか、__俯瞰的で広範的な__とかそういう意味らしい。高水準言語の「高水準」もHigh-levelの訳語だそうです。（[Wikipediaの該当ページより](https://en.wikipedia.org/wiki/High-_and_low-level)）

ちなみに私自身の不勉強を晒してしまいますが、高水準言語が何がどう高水準なのか私は今日まで正確には理解していませんでした。


### High-levelのざっくりした意味

英語のできる方と情報系の方には当たり前のことかもしれませんが、上の説明ではわからなかったのでもう少し深くHigh-levelを説明してみます。

High-level, Low-levelを語るときに使われる用語は、抽象度abstractです。抽象の対義語は具体であり、Low-levelな言語やライブラリとは、具体的に記述できる言語やライブラリということです。

例えば、
```hello_world.py
print("Hello, world!")
```
というコードがあります。このコードは、機械語よりもHigh-levelであり、より抽象的です。なぜなら、標準出力の定義とかASCIIコードとか具体的なことを何も気にせずに、"Hello, world!"という文字列を標準出力できるからです。

この一文を動作させるのに、Low-levelな部分では大量の0と1で具体的に計算されているはずです。
大量の0と1を全く気にせずに、抽象的にやりたいことを記述できるため、Pythonは高水準な言語に分類されます。

## Keras(High-level)とThensorFlow(Low-level)の違いとは？

Kerasは、deep learningにおける諸々の式の意味を深く考えなくてもそれっぽくプログラミングできるため、High-levelです。

modelを作っていくつかの関数でパラメータを指定するだけで、それっぽくdeep learningしてくれます。（もちろん、使いこなすにはちゃんとした理解が必要ですが）

一方、ThensorFlowでは、諸々の処理を自分で記述します。具体的な記述が必要なためlow-levelです。

各々の式を意識して記述しないとちゃんとした深層学習はできません。

## まとめ

* High-level: 人間に理解しやすく抽象的に記述することのできる道具。人間の言語に近く、機械語や数式をあまり理解していなくてもそれなりにプログラミングできる。
* Low-level: 機械語や数式に近い具体的な記述の必要な道具。本質的な理解がないとプログラミングできない。加えて、大きなものを作るのが大変。

Low-levelなものを組み合わせて、High-levelに記述できる道具を作り、それで大きなものを作る、というのがプログラミングの歴史のようです。

## 注意

High-levelな言語やライブラリはLow-levelな部分を隠してくれますが、実際に計算しているのは、Low-levelなプログラムです。ですから、High-levelなツールの上にあぐらを書かずにLow-levelなものを勉強しないと、効率や正確さ、その他諸々のパフォーマンスを追求することはできません。
KotlinをVS Codeでやってみようと思ったらKotlinの実行時にハマった

# 動機

　巷で騒ぎ始めているプログラミング言語「Kotlin」（2017年5月現在）が気になり、ちょっと動かしてみようと思ったのがきっかけです。
　でもそのためにわざわざ「InteliiJ(https://www.jetbrains.com/idea/) 」とか入れたくないのが正直な気持ち。そこで、すでに環境として構築済みである「Visual Studio Code」上で気軽にできたらいいかなと思って、いろいろ試してみた。

# 結論
* Java開発について知見が深ければおそらくハマらなかったかもしれない。
* Kotlinコンパイル時に指定するオプション引数は大事だってことが改めてわかった。

# 実際にやってみる
## 手元環境
* Mac Book Air (Early 2014)
* macOS Sierra 10.12.4
* Visual Studio Code April 2017 (version 1.12)(https://www.microsoft.com/ja-jp/dev/products/code-vs.aspx)
* homebrew(https://brew.sh/index_ja.html)

## Kotlin関係の準備
### Visual Studio Codeの機能拡張をインストール

機能拡張タブを押して、検索窓で`kotlin language`と入力して検索し、「Kotlin Language」をインストールする
![機能拡張インストール.png](https://qiita-image-store.s3.amazonaws.com/0/182552/4428bcdb-febf-5058-c867-e3eddbbb99d2.png)

### Kotlin環境を構築
homebrewを使う。

```bash
$ brew install kotlin
```

これだけ。インストール完了後、`kotlin`、`kotlinc`、`kotlinc-js`、`kotlinc-jvm`が使えるようになる。

## チュートリアルっぽく「Hello, Kotlin」をやってみる
### kotlinのコーディング
適当なディレクトリ上でCodeを起動し、`hello.kt`ファイルを作成する。

```kotlin:hello.kt
fun main(args:Array<String>){
    println("Hello, Kotlin")
}
```

### kotlinコードをコンパイルする

kotlinのインストール後に出てきたコマンド名から察するに`kotlinc`がコンパイラじゃね？と思ってそれを実行する。

```bash
$ kotlinc hello.kt
```

実行後に`HelloKt.class`なるファイルができる。

### kotlinを実行する

これもコマンドから察するに`kotlin`コマンドに先ほど生成されたファイルを入力として与えれば実行できるんじゃね？と思い立ち、それを実行する。

```bash
$ kotlin HelloKt.class
error: could not find or load main class HelloKt.class
```

あれ、動かねー。

### ググってみる

なんかInteliiJとかJetBeansあたりを前提とした記事しか出てこない。

### コマンドラインのみでKotlinやってそうなサイトを探してみる
公式のチュートリアルで「コマンドラインで実行する」手順があった。
https://kotlinlang.org/docs/tutorials/command-line.html

結局のところ`kotlinc`のオプション指定が問題だったことがわかった。

### リトライ

```bash
$ kotlinc hello.kt -include-runtime -d hello.jar
```

今度は`hello.jar`ファイルが生成される。これを`kotlin`コマンドで実行してみる。

```bash
$ kotlin hello.jar
Hello, Kotlin
```

できたーーー

# 終わりに

多分Java開発の知見があればハマらなかった問題かも。
あと、本格的に開発やるならばやはりInteliiJあたりの統合環境が必須になりそう。Android開発にKotlinが使えるようになったという話もあるぐらいなので、素直にAndroid Studioを使うべきか……。
gccとemacsライクなエディタを windowsで利用する

# 概要

この記事は、windows（windows 10を想定しています）で gcc とxyzzy（Emacsライクなエディタ）を使えるようにするための手順をまとめたものです。必要最小限のツールのみを入れますので、簡単なプログラミングの課題などを試すには十分であると思います。
以下ができるようになります。

- xyzzy（Emacsライクなエディタ）が使えるようになる
- gcc を使ってコマンドラインでコンパイルできる
- 作成したプログラムを実行できる

# インストール手順

## xyzzy のインストール

[xyzzy のサイト](http://xyzzy-022.github.io/)からダウンロードします。
zipファイルがダウンロードされるので、ファイルを展開するだけです。例えば、C:\xyzzy などに展開すると良いです。展開後の xyzzy.exe がエディタ本体です。

## gcc のインストール

MinGW というGNUのツールをWindowsで利用するための環境をインストールします。[MinGWのダウンロードサイト](https://sourceforge.net/projects/mingw/files) へアクセスして、Installの中にある「mingw-get-setup.exe」をダウンロードします。
ダウンロードした mingw-get-setup.exe を実行すると、セットアップが開始します。

セットアップの画面では、標準の内容でそのままインストールします。途中で、インストールするフォルダが表示されます（標準では C:\MinGW ）。この情報を次で使いますので、メモしておきます。

## パスの設定

gcc のパスを設定しておきます。ウィンドウ左下のウィンドウアイコンを右クリックして、メニューから「システム(Y)」を選択します。

さらに「システムの詳細設定」をクリックして、システムのプロパティウィンドウを表示します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/104404/3d9ba1fd-9274-a5ff-9ce0-fd6629e8e5a6.png)

「環境変数(N)...」をクリックして、「システム環境変数」にあるPathをダブルクリックします。パスの内容が表示されるので、「新規(N)」をクリックして、「C:\MinGW\bin」を追加します（インストールフォルダが C:\MinGW の場合）。

# 動作確認

ここでは、ドキュメントの中の「c_program」というフォルダがあるとして、その中に sample.c を作成します。
sample.c をコンパイルして実行するまでの手順を示します。

## xyzzy を使ってプログラムを入力する

xyzzy を起動して、プログラムを入力します。プログラムを入力する前に、保存をしてファイル名を確定させておくほうが、自動インデントの機能などが有効になるので便利です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/104404/0259e0e2-7d72-e95d-ac22-ce41c1cb1714.png)

## gcc でコンパイル、実行する

コマンドラインからコンパイルを行います。最初にコマンドプロンプトを起動します。

次に、先程のプログラムが置かれているフォルダに移動します。移動は、「cd Documents\c_program」です。 

![image.png](https://qiita-image-store.s3.amazonaws.com/0/104404/c4667cd4-20aa-0f6f-e8c5-b26dfa9b875a.png)

コンパイルは gcc です。「gcc sample.c」のようにしてコンパイルします。コンパイルに成功すると、「a.exe」が作成されます。これを実行します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/104404/e5fa0be9-1dfd-c334-ff27-ddef5154fcd1.png)
TypeScript で FizzBuzz

TypeScript を使った FizzBuzz を[お試しコーナー](https://www.typescriptlang.org/play/index.html)で書いた。

```TypeScript
const writeln = (s: string): void => {
    document.writeln(s + "<br>");
};

for (let i: number = 1; i <= 100; i++) {
  if (i % 3 == 0 && i % 5 == 0) {
    writeln("FizzBuzz");
  } else if (i % 5 == 0) {
    writeln("Buzz");
  } else if (i % 3 == 0) {
    writeln("Fizz");
  } else {
    writeln(i.toString());
  }
}
```

###学んだこと
- const で値の束縛 (Scala の val)
- let は変数宣言 (Scala の var)

TypeScript は型推論があり、現代的でいい感じ。
Guzzle で curl のエラーコードを取得する

## 結論

```php
try {
    // 名前解決に失敗するドメイン
    // ※エラーコードは CURLE_COULDNT_RESOLVE_HOST (6)
    $c->get('http://domaindoesnotexist.co.jp');
} catch (\GuzzleHttp\Exception\ConnectException $e) {
    echo $e->getHandlerContext()['errno'];
}
```

```:実行結果
6
```

## 補足

HTTP クライアントである [Guzzle](https://github.com/guzzle/guzzle) は内部で PHP 組み込みの curl を利用している。


通常、Guzzle を用いた際に curl でエラーが発生したときは `GuzzleHttp\Exception\ConnectException` が投げられ、エラーの内容はメッセージに入る。

```:ドメインを名前解決できないとき
GuzzleHttp\Exception\ConnectException with message 'cURL error 6: Couldn't resolve host 'domaindoesnotexist.co.jp' (see http://curl.haxx.se/libcurl/c/libcurl-errors.html)'
```

一方で、curl には[エラーコードが存在する](https://curl.haxx.se/libcurl/c/libcurl-errors.html)。
上記の例でも、ドメインの名前解決に失敗した祭には 6 というエラーコードが返されていることがわかる。

「ドメインの名前解決に失敗したときだけ、別の処理をしたい」などといった、特定のシチュエーションにおいてこのエラーコードを取得したいことがある。

例外のメッセージをパースする力技で取得することもできるが、冒頭の結論に書いてある方法を使うことによって正式な？手続きで取得することができる。
「Topから何%」をAutoLayoutで表現する

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">AutoLayoutの制約、Topから何%みたいな相対値で設定できるようにならないかな</p>&mdash; 🙌🐼ひらり🐼🙌 (@hiragram) <a href="https://twitter.com/hiragram/status/865059707374804992">2017年5月18日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

こんな話の流れで出てきた、ふたつの方法をまとめます。

# 方法1: StackView + Spacer

- Spacer(透明なダミーView)を用意し、対象Viewと一緒にStackViewに放り込む
- Spacerについて、
    - constant が `Spacer.height = 親View.height`
    - multiplier が `n : m`

のとき、対象Viewは、親Viewのtopから n/m の場所に表示される。

<img width="1035" alt="20170518_024628.png" src="https://qiita-image-store.s3.amazonaws.com/0/34405/8a3abb84-6f81-1a2e-f7a0-79daced5441d.png">
<img width="1041" alt="20170518_024644.png" src="https://qiita-image-store.s3.amazonaws.com/0/34405/4d49ba23-7b82-cb0b-bef7-03b7d3a082f3.png">
<img width="1040" alt="20170518_024732.png" src="https://qiita-image-store.s3.amazonaws.com/0/34405/24a6579b-6c41-1c3a-9e77-ff02265fff63.png">

# 方法2: `Center Y` constraints の multiplier を使う

@tarunon さん方式。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr"><a href="https://twitter.com/takasek">@takasek</a> <a href="https://twitter.com/hiragram">@hiragram</a> centerにして比率変えた方が速い</p>&mdash; uounɹɐʇ (@tarunon) <a href="https://twitter.com/tarunon/status/865069682348273664">2017年5月18日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>


対象の `Center Y` について、

- constant が `self.height / 2`
- multiplier が `2n : m`

のとき、対象Viewは、親Viewのtopから n/m の場所に表示される。

<img width="1039" alt="20170518_022714.png" src="https://qiita-image-store.s3.amazonaws.com/0/34405/5ad09c40-5aa7-2062-f44e-d0ebd91af637.png">
<img width="1032" alt="20170518_022802.png" src="https://qiita-image-store.s3.amazonaws.com/0/34405/2795f073-69ab-d261-775e-a83411871db3.png">
<img width="1040" alt="20170518_022824.png" src="https://qiita-image-store.s3.amazonaws.com/0/34405/ff4c3e53-5ade-e4af-669c-449e59bf58d7.png">

# メリデメ考えてみた

## `Spacer` 方式

- メリット
    - 仕組みがわかりやすい
    - 比率=multiplier なので指定が直感的
- デメリット
    - ダミーのViewが作られてしまう
    - 「Topから何%、Leftから何%」みたいな指定をしようとすると辛い

## `CenterY` 方式

- メリット
    - constraint一つで表現可能
    - 水平方向の指定も `CenterX` を追加するだけ
- デメリット
    - 理解するのに頭を使う
        - constant が `height/2` を示していることを表現できない
        - multiplier も比率と同じ値ではない
プログラミング言語Go読書会#9(5.8-6.2)[2017/05/17]

[Go読書会 #9](https://lancers-engineer.connpass.com/event/57232/) が[ランサーズ株式会社](https://www.lancers.co.jp/)で行われたので進捗と技術的なメモ書きを書いておきます。読書会の内容は[プログラミング言語Go](https://www.amazon.co.jp/dp/4621300253/?&_encoding=UTF8&tag=amesho-22&linkCode=ur2&linkId=7e29043d833086d36f8b64c2ed3721b2&camp=247&creative=1211)を冒頭から皆で読み進めていくというものです。

## 進捗した内容

+ 5章 関数
  + 5.8 遅延関数呼び出し
  + 5.9 パニック
  + 5.10 リカバー
+ 6章 メソッド
  + 6.1 メソッド宣言
  + 6.2 ポインタレシーバを持つメソッド
    + 6.2.1 nilは正当なレシーバー値

## 話題に上がった話

### 5.8 遅延関数呼び出し

ここでは、予約語deferの話がメインになっています。`defer構文を使うと、defer文を含む関数が完了するまでその実行が遅延される`ので、資源解放等の処理を確実に行うことが出来ます。また、この手の処理は資源獲得と対応付けて置かないと分かりづらくなるので、そう言う意味でもよく考えられている機能だと思います。

```go

func run() {
  defer fd.Close() // run終了後に実行される
}
```

面白いと思ったところは、無名関数を使用して`関数が呼び出し元に返す値を変更することさえできる`というところです。webframeworkだと割とありがちなafter hookとかが簡単に実現出来ます。

### 5.9 パニック

ここでは、Goのランタイムが誤りを検出したときに起きるpanicについての話でした。panic自体は他の言語の例外に似ているのですが、使用される状況が異なっていて`重大なエラーに対して使われる`ようです。

他に興味深かったのは、panicが起きたときのGoランタイムの挙動で、`Goのパニック機構はスタックが巻き戻される前に遅延された関数を実行する`というところでした。先程出てきたdefer文が実行されてから巻き戻されるんですね。(C++だと[こんな感じ](http://docwiki.embarcadero.com/RADStudio/Berlin/ja/%E4%BE%8B%E5%A4%96%E3%81%AE%E5%B7%BB%E3%81%8D%E6%88%BB%E3%81%97%EF%BC%88C%2B%2B%EF%BC%89)のようです。javaは[こんな感じ](http://hsmemo.github.io/articles/no3059qHd.html)のようです。)

+ 参考になりそうなURL
  + [Why does Go not have exceptions?](https://golang.org/doc/faq#exceptions)
  + [Defer, Panic, and Recover](https://blog.golang.org/defer-panic-and-recover)
  + [Java仮想マシンの実装技術](https://www.slideshare.net/KiyokuniKawachiya/java-66003903)

### 5.10 リカバー

ここでは、recover関数についての説明がありました。先程出てきたpanicが起きた場合にdeferで遅延関数内部にrecoverがあった場合、`パニックの現状を終了させてパニック値を返します`。こうすることで、panic状態から回復して関数が正常にリターンするところから復帰することができます。興味深かったのは、`公開APIは失敗をエラーとして報告すべき`であるといところで、所謂他の言語の例外のようにpanicを扱うべきでは無いというところです。こういう哲学がきっちり明示されていると開発する側もやりやすいです。

### 6.1 メソッド宣言

ここでは、`特定の型に関連づけられた関数`であるメソッドについて書かれていました。所謂OOPの様なことをGoで行うための機能です。関数定義に`レシーバ`というパラメータを追加して定義します。パッケージレベル関数宣言とメソッドの宣言は名前がぶつかっても違う存在のため問題は無い用です。

### 6.2 ポインタレシーバを持つメソッド

ここでは、型に紐付けられた値を更新したい場合にレシーバーはポインタ型である必要があることが主な内容なのですが、気になったところは、`慣習上、厳密に必要なくてもすべてのレシーバーはポインタレシーバーにすべき`というところです。このへんのGoの割り切り具合が私は結構好きです。

ここまで読んだところで時間になりました。次回は 6.3 構造体埋め込みによる方の合成　からです。
XFCE4上のfcitx+mozcで日本語を入力できなくないのを治す

## Prerequisites
`$ uname -orv
4.8.0-52-generic #55~16.04.1-Ubuntu SMP Fri Apr 28 14:36:29 UTC 2017 GNU/Linux`

name |package versison| version
---|---|---
xfce4 | 4.12.2 | 4.12
fcitx | 1:4.2.9.1-1ubuntu1.16.04.2 | 4.2.9.1
fcitx-mozc | 2.17.2116.102+gitfd0f5b34+dfsg-1ubuntu1.1 | 

## 現状把握
- 診断プログラムを走らせる
`fcitx-diagnose`

### 原因

- recovery modeでのgrubの文字化けを避けるためdefault localeはCにしていたが、`LC_CTYPE`は日本語のようが良さそうなので、/etc/default/locale を更新
```
$ sudo update-locale LANG=C LC_CTYPE=ja_JP.utf8
```

- .xprofileにとりあえず次のものを設定 (正直意味があるのかわからない)

```
export GTK_IM_MODULE=fcitx
export QT_IM_MODULE=fcitx
export XMODIFIERS=@im=fcitx # Support programs which only use XIM.
export DefaultIMModule=fcitx

```

- 一番ハマったとこの対応
gnome-terminalなどgtk3で動くものだとそもそも入力切換ができない。

  - どうやらgtk2とgtk3のアプリは混在して動くことが可能な模様
  - gtk3のGUIも追加する。
```
# apt install fcitx-frontend-gtk3
```

Xfce4だとgtk3関連のものが不要だと判断してuninstallしたのがまずかったらしい。
(Qtを使うアプリとかでも同様の手法で解決できるはず。)

### 参考
- [TroubleShoot on ArchLinux](https://wiki.archlinuxjp.org/index.php/Fcitx#.E3.83.88.E3.83.A9.E3.83.96.E3.83.AB.E3.82.B7.E3.83.A5.E3.83.BC.E3.83.86.E3.82.A3.E3.83.B3.E3.82.B0)
4層DNNで1変数関数近似

#概要
ChainerのOptimizerまでを理解するために、[これ](http://qiita.com/hikobotch/items/018808ef795061176824)を参考に、4層DNNで1変数関数近似のプログラムを書きました。このプログラムはなぜかChainを継承した__call__関数でforward計算をしていなかったので、これを修正することを以って精進としました。僕が直したプログラムは僕の[github](https://github.com/hamko/sample/blob/master/chainer/sin.py)に置きました。sin, exp, sqrt, abs, sqrt(abs(sin(exp(x)))を試しました。


#結果
##exp
いい感じ。
![DALP1ntVoAAs5fb.jpg](https://qiita-image-store.s3.amazonaws.com/0/115641/7912991a-1a8b-380e-4ed8-69a89c81757f.jpeg)
##sin
なんかブレてる場所がある。
![DALP2fQVYAAwK2x.jpg](https://qiita-image-store.s3.amazonaws.com/0/115641/a5218c7f-4f35-ba06-4877-06346bd9f167.jpeg)
###sqrt
いい感じ。
![DALP3N4VoAAHNdd.jpg](https://qiita-image-store.s3.amazonaws.com/0/115641/5b29cd38-7b7c-d46d-b0e3-04002804837a.jpeg)
###abs
予想に反していい感じ。
![DALQFWsUAAAtzuW.jpg](https://qiita-image-store.s3.amazonaws.com/0/115641/b86f6227-c48b-5a1e-2c40-9a48de92df15.jpeg)
##sqrt(abs(sin(exp(x)))
やる気は感じる。
![DALSLzHV0AQOL3L.jpg](https://qiita-image-store.s3.amazonaws.com/0/115641/743001da-63db-f898-94df-017429023b1d.jpeg)


#思ったこと
開発環境がひどく構築しづらい(Pythonのパッケージシステムのせい)。初回だけではなく、毎回の起動でめんどい。
Atomの開発環境

![あｓｆｄｓ.jpg](https://qiita-image-store.s3.amazonaws.com/0/20635/521b3e7a-fe7b-e070-74f4-5e278943b91e.jpeg)[参照元画像](https://www.sitepoint.com/7-atom-add-ons-for-running-code-and-previewing-changes/)

Atom再構築したので、プラグインメモ

#パッケージ
##とりあえず入れておけパッケージ
・[Project-manager](https://atom.io/packages/project-manager)
>プロジェクトごとに管理する

・[file-icons](https://atom.io/packages/file-icons)
>ファイルのパスなどを自動補完してくれる

・[atom-beautify](https://atom.io/packages/atom-beautify)
>様々なファイルの種類に応じて字下げを自動に行ってくれるパッケージです。

・[indent-guide-improved](https://atom.io/packages/indent-guide-improved)
>インデント毎に縦線が表示されわかりやすくなっています

・[pigments](https://atom.io/packages/pigments)
>カラーコードをハイライトしてくれる

・[remote-edit](https://atom.io/packages/remote-edit)
>各プログラミング言語毎にfileのアイコンを変更してくれる

・[autocomplete-paths](https://atom.io/packages/autocomplete-paths)
>サーバー内のファイルをいじるときにAtomでいじれるようにしてくれる

・[smart-tab-name](https://atom.io/packages/smart-tab-name)
>タブに表示されるファイル名にパスを追加してくれる

・[show-ideographic-space](https://atom.io/packages/show-ideographic-space)
>全角スペースのハイライト

・[platformio-ide-terminal](https://atom.io/packages/platformio-ide-terminal)
>Atom上でターミナルが触れる

##コードの検証
・[linter](https://atom.io/packages/linter)
>コードの検証を行ってくれる。バグを作らないために必要だよね。

・[atom-lint](https://atom.io/packages/atom-lint)
>エラー箇所をエディタ上で確認することができる。

・[linter-ruby](https://atom.io/packages/linter-ruby)
>ruby コードの検証を行ってくれる

・[linter-haml](https://atom.io/packages/linter-haml)
>エラー箇所をエディタ上で確認することができる。

・[linter-scss-lint](https://atom.io/packages/linter-scss-lint)
>scss コードの検証を行ってくれる

##Githubプラグイン
[git-plus](https://atom.io/packages/git-plus)
>Git コマンドを Atom 内で使用する為のプラグインです。ショートカットキー

[git-log](https://atom.io/packages/git-log)
>git log をグラフィカルに確認できます。

[git-blame](https://atom.io/packages/git-blame)
>git blame の結果を表示し、ファイル内の各行に対して誰がいつコミットしたのかを確認できます。

##ターミナル
・[platformio-ide-terminal](https://atom.io/packages/platformio-ide-terminal)
>Atom内でターミナルが使えるパッケージ

##コメント
他にもしオススメのプラグインがあればどなたか教えてくださると嬉しいでござる。
要望
・フロントエンド周り
・日本語タイポミス
・etc...
Dockerコンテナ内のCentOS7にPHP7をインストールする

# 環境

- OS X El Capitan 10.11.6
- Vagrant 1.9.3
- CentOS 7.2.1511
- Docker 17.04.0-ce

MacBookにVagrant,VirtualBoxをインストールして、
そこでCentOSを立ち上げて、その中でDockerでCentOSコンテナを使ってます。

# つまったところ

## その1　PHP7がインストールできない

ただ`yum install php`とやっても古いバージョンしかインストールできなかった。

### 参考にしたサイト

下記サイトを参考にリポジトリの追加やらを実行

https://www.lancork.net/2016/05/yum-centos67-php7-install/
http://www.kakiro-web.com/linux/remi-install.html
http://www.kakiro-web.com/linux/epel-install.html


## その2 Nodejsのインストールができない

### 参考にしたサイト

http://stackoverflow.com/questions/25899912/install-nvm-in-docker

# 結果のDockerfile

```Dockerfile
FROM centos:centos7
MAINTAINER dynamonda

RUN rm /bin/sh && ln -s /bin/bash /bin/sh

RUN yum -y install wget epel-release

RUN wget http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
RUN rpm -Uvh ./remi-release-7.rpm
RUN sed -i '4a priority=1' /etc/yum.repos.d/remi-php71.repo
RUN yum -y install --enablerepo=remi-php71 php php-fpm php-mcrypt php-cli php-common php-devel php-gd php-mbstring php-mysqlnd php-opcache php-pdo php-pear php-pecl-apcu php-pecl-zip php-process php-xml
RUN yum clean all

RUN yum install -y httpd
RUN yum clean all

RUN yum -y update
RUN yum clean all

RUN yum -y install git

ENV NVM_DIR /usr/local/nvm
ENV NODE_VERSION v6.10.3

RUN curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.26.1/install.sh | bash \
	&& source ~/.bashrc \
	&& source $NVM_DIR/nvm.sh \
	&& nvm install $NODE_VERSION \
	&& nvm alias default $NODE_VERSION \
	&& nvm use default

EXPOSE 80

```
[CentOS 7] ipv4 address を設定する


`nmtui` を使えばGUIでIPアドレスを設定できるが、今回は `nmcli` を使ってコマンドラインのみで設定する方法を書きたいと思います。

## 環境
- VirtualBox (仮想化ソフト)
- CentOS 7 (Guest OS)

# 設定内容
設定内容は適当に割り振ってあるので、各自で設定するときは自身の環境に合わせて変えてください

- ネットワークデバイス `ホストオンリーアダプター`
- ネットワークデバイス名 `enp0s8`
- IPv4アドレス `192.168.100.100/24`

# 設定してみる

```:command-line
# nmcli c m enp0s8 connection.autoconnect "yes"
# nmcli c m enp0s8 ipv4.method manual ipv4.addr "192.168.100.100/24"
```

設定が完了したら`systemctl restart network.service` などのコマンドで反映されます。

# 参考
- https://blog.apar.jp/linux/6277/
Bootstrap3をRails4に導入

1年くらい前に書いた記事ですが、お蔵入りさせるのも何なので公開します。実は先程新しいプロジェクトでもやって違うところがないか確認もしたので2017年現在でも有効じゃないかと思います。

Bootstrap導入するのに結構ハマりました。実際両方の方法を試しました。
最新はBootstrap4だけどα版のため現時点（2016年7月時点）では3が無難。
あと、世にある導入方法の殆どがscaffoldでまず何らかの雛形作らせるんだけど、当然読み飛ばしています。

## Gemを使う
以下はBootswatchをインストールする例だが、これだけだと動かない可能性あり、並行して手動のものもやってみました。
イイ感じのテンプレートができるとか言う有名なサンプルサイトはこちら。
http://bootswatch.com/
Rubyといえばお馴染みのこちらを参照。
http://dev.classmethod.jp/server-side/ruby-on-rails/ruby-on-rails_bootstrap3_sample/

```ruby:Gemfile
# 以下はお約束みたいなのでとりあえず入れる
gem ‘therubyracer’            # javascript runtime。lessをコンパイルするために必要
gem ‘less-rails’              # Railsでlessを使えるようにする。Bootstrapがlessで書かれているため

# Twitter Bootstrap
gem 'twitter-bootswatch-rails', '~> 3.1.1'
gem 'twitter-bootswatch-rails-helpers'
```

` bundle install
`

``` 
rails g bootswatch:install flatly
rails g bootswatch:import flatly
rails g bootswatch:layout flatly
```

-> view/layoutにファイルができるので（flatly.html.slim）
それをapplication.html.slimによしなにコピーする。
ちなみに設定してあるテンプレートの形に作ってくれるのでslimでもhaml（多分）OK。

```ruby:config/initializers/assets.rb
Rails.application.config.assets.precompile += %w( flatly.css )
Rails.application.config.assets.precompile += %w( flatly.js )
```

## 手作業によるインストール
以下丸パクリだけど上記と合わせると何故か動作した。こちらを参照。
http://dev.classmethod.jp/server-side/ruby-on-rails/ruby-on-rails_bootstrap3_sample/

- Bootstrap本家サイト（http://getbootstrap.com/getting-started/）から bootstrap-3.*.*-dist.zip をDL
- 展開する
 - fonts     vender/assets/にフォルダ毎コピー
 - css       vender/assets/stylesheet/に、中にある.cssファイルをコピー
 - js         vender/assets/javascript/に、中にある.jsファイルをコピー
- app/assets/stylesheets/application.css に以下を追加
`*= require bootstrap
`

- app/assets/javascripts/application.js に以下を追加
`//= require bootstrap
`
- config/application.rb の「class Application < Rails::Application」の中に以下を追加
`config.assets.paths << "#{Rails}/vender/assets/fonts"
`

パット見綺麗になりましたが、ここからレイアウトする必要あり。頑張ります。
RubyonRailsでデバッガを使う

Railsで開発していて、1行ずつ止めながら状態を見たりして不具合調査を行うのに最適なpryの使い方です。

## 前提
- Ruby 5.0.1
- Rails 2.3.0

## pryのインストール
### Gemの設定
Gemfileに以下を設定後、 `bundle install`を実行。限定された環境（開発、テスト）でしか動作しません。

``` ruby:Gemfile
group :development, :test do
  gem 'pry-rails'
  gem 'pry-doc'
  gem 'pry-byebug'
  gem 'pry-stack_explorer'
end
```

### 操作を簡単にする.pryrcの設定
Gemfileと同じところにでも置いておくとよろしいかと。

``` ruby:.pryrc
# Hit Enter to repeat last command
Pry::Commands.command /^$/, "repeat last command" do
  _pry_.run_command Pry.history.to_a.last
end

if defined?(PryByebug)
  Pry.commands.alias_command 's', 'step'
  Pry.commands.alias_command 'n', 'next'
  Pry.commands.alias_command 'f', 'finish'
  Pry.commands.alias_command 'c', 'continue'
end
```


## デバッギングポイントの設定
ソース上の任意の箇所に `binding.pry` と記載します。Controller, Model, HelperどこでもOK。

```
  def index
    binding.pry # set your break point
    if current_user.attr == 'admin'
      @articles = Article.currents.page(params[:page])
    elsif current_user.attr == 'editor'
      @articles = Article.where(user_id: current_user.id).where("articles.current_version = article_histories.version").order("articles.id desc").page(params[:page])
    end
  end
```

Viewに使う場合はこんな感じ。ちなみにSlimです。

```
= form_for @article, url: {action: 'confirm'} do |f|
  = f.fields_for :article_histories do |af|
    dl.field
      - binding.pry
      dt = af.label t :title
      dd = af.text_field :title, :size => 100, :class => "validate[required]"
```


## いざ実行→デバッグ方法

```
Frame number: 0/95

From: some_app/app/views/restaurant/index.html.slim @ line 11 ActionView::CompiledTemplates#_app_views_restaurant_index_html_slim__1023463305881903995_70286686367500:

     6:     h2 = t :restaurant_list_title
     7:
     8:     div.page_entries = page_entries_info @restaurants
     9:     - binding.pry
    10:
 => 11:     #restaurant_list
    12:
    13:       - @restaurants.each do |restaurant|
    14:         a href=((url_for controller:'restaurant', trailing_slash: true) + restaurant.id.to_s)
    15:           .box
    16:             h3

[1] pry(#<#<Class:0x007fd9cfe56220>>)>
```
**操作**
- n (next) 次の行に進む
- s (step) 対象行に入る（メソッドなどあればその中に入ります）
- b (break) 行指定でブレークポイントは貼る（そこの行で止まる）
- c (continue） 継続して実行する
**データの代入・参照**
- p (print) `p 変数名` で変数の参照
- `変数名 = データ` でデータの代入。ハッシュなど特殊なデータも可能

このPryはRSpecでのテスト時にも有効なのでテストが正しく動作しているのか確認するのにも使えます。

```
  describe "GET #index" do
    it "assigns all tag_orders as @tag_orders" do
      tag_order = TagOrder.create! valid_attributes
      binding.pry
      get :index, params: {}, session: valid_session
      expect(assigns(:tag_orders)).to eq([tag_order])
    end
  end
```


是非お試しください。
Markdownでのリンクを貼る時のエスケープシーケンス #Markdown

どこに需要があるかはさっぱり分かりませんが, 軽くググった感じネットに情報無さそうだったので書いときます.
[さっき書いた記事](http://qiita.com/Tatsuki-I/items/f9347f6d710d7edfaccc)にこういう1行があります.

>- ってか標準機能で取得h[(ry](http://dic.nicovideo.jp/a/\(ry)

これですが,URLがこうなってるんです.
`http://dic.nicovideo.jp/a/(ry`
んで, いつも通り`[(ry](http://dic.nicovideo.jp/a/(ry)`のように書くと
[(ry](http://dic.nicovideo.jp/a/(ry)
こうなります.
これ, どうやらURL内の`(`が変に判定されてるっぽいんですよね.

で, 解決方法ですが, URL内に`(`が含まれる時は, `\(`のようにエスケープシーケンスにしてやると上手くいきました
上の例ですと, `[(ry](http://dic.nicovideo.jp/a/\(ry)`のようにしたら
[(ry](http://dic.nicovideo.jp/a/\(ry)
はい, ちゃんと出ました.
リンク先も期待するページになっています.

##要約
**Markdownでリンクを張りたいURLに`(`が入ってたらエスケープシーケンスにしとけ**

(もっとも, そんなURLをMarkdownで貼りたい機会がどれだけあるかは知りませんが...)
Vim風の置換コマンドをSlackbotに実装してみた #Python

#Vimって良いよね！

みなさん, Vim使ってますか？
Vim使ってますよね？
Vim使ってないわけ無いですよね？
僕は使ってます.

ではVimmerの皆さん, Vimの日本コミュニティは知っていますか？
Vimの日本コミュニティは主に[Lingr](http://lingr.com/)上で活動しています.
で, ここのチャット部屋なんですが結構な数のbotが動いてて, すごく便利な機能がたくさんあります.
そんな中で, 僕が1番良いなと思った機能がこちらです.
<img width="293" alt="Screen Shot 2017-05-21 at 10.04.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/144917/4ca28f01-269c-8944-8c6a-7e1b6dec9cab.png">
これ, 凄くないですか？
Vimの置換コマンドを打ったらbotがすかさず修正版の文章を送ってくれるんです.
(全てのプログラマーはVimmerであるという前提の下で進めるため, Vimの置換コマンドについては説明しません. だってみんなVimmerでしょ？)

僕は前から常々思っていました.
**「これ, 自分とこのSlackにパクりてぇ」**
でもSlackbotは過去に諦めた経験があったので敬遠していたのですが, 
「もしかしたら今ならできるんじゃね？」
と思い至ってしまいました.

ってな訳で作り方行きまーす.

ソースは[こ↑こ↓](https://github.com/Tatsuki-I/vim-like-slackbot-replace)に置いときますね.

尚, 参考にさせて頂いたサイトは以下の通りです.

- [PythonのslackbotライブラリでSlackボットを作る](http://qiita.com/sukesuke/items/1ac92251def87357fdf6)
- [PythonでSlackbotを作る](http://blog.bitmeister.jp/?p=3892)


##作り方

###準備

今回は[こちらの記事](http://qiita.com/sukesuke/items/1ac92251def87357fdf6)を参考にさせて頂きました.
まずはパパっと[この辺](http://qiita.com/sukesuke/items/1ac92251def87357fdf6#slackbot%E3%81%AE%E5%88%9D%E6%9C%9F%E8%A8%AD%E5%AE%9A)まで準備しちゃって下さい.
ここまで終わったら今回の置換コマンドを作っていきたいと思います.

###置換コマンド

まず`plugin`ディレクトリの中に`bot_listen.py`というファイルを作って下さい.

中身はこうします.

```py3:bot_listen.py
from slackbot.bot import listen_to
import re

pastmsg = ''
pastmsg2 = ''

@listen_to(r'.+')
def savemsg(message):
    global pastmsg2
    global pastmsg
    pastmsg2 = pastmsg
    pastmsg = message.body['text']

@listen_to(r'^s/+\S+/+\S+/$')
def replace(message):
    before = re.findall(r'^s/(.*)/+\S+/', pastmsg)
    after = re.findall(r'^s/+\S+/(.*)/', pastmsg)
    if before[0] in pastmsg2:
        message.send('「' + pastmsg2.replace(before[0], after[0]) + '」って言いたかったんだね')
    else:
        message.send('前の文章に「' + before[0] + '」は入って無いよ？')
```

やってることとしては, 

- `pastmsg`と`pastmsg2`に直近2つのメッセージを保存しておく
- `s/なんか1/なんか2/`という形の発言があれば処理を行う
- `before`に`なんか1`の文字列のリスト, `after`に`なんか2`のリストを代入
- 2個前のメッセージの中に`なんか1`があれば, `なんか1`を`なんか2`に置換して, 結果をbotちゃんが教えてくれる
- マッチしなければ, botちゃんに馬鹿にされる

正規表現さえ使えれば大したことは無いですね.

##課題

- 直近2つのメッセージの保存が汚い
    - 標準機能で取得方法がありそう
- 置換コマンドの直前の文章にしか反応しないから, 自分が発言して誤字に気付いた後で他のユーザーが先に発言をしてしまうと置換が効かなくなる
    - 連想配列あたりで個↑々↓のユーザー毎に直近2つを保存しておけば良いかも
    - ってか標準機能で取得h[(ry](http://dic.nicovideo.jp/a/\(ry)
- どうせ`before`と`after`1つずつしか無いんだからリストじゃなくて良いけどマッチした文字列の取得方法が分からんかった
    - [ググれ](http://dic.nicovideo.jp/a/ググレカス)
C++のPointクラス

# Pointクラス
最近なぜか多用する自作クラス。
なぜか紹介。

``` C++
class Point
{
public:
	Point() { Point(0, 0); }
	Point(int x, int y) { this->x = x;this->y = y; }
	~Point();

	Point &operator=(Point &point);
	Point &operator+=(Point &point);
	Point &operator-=(Point &point);
	Point &operator*=(Point &point);
	Point &operator/=(Point &point);

	Point operator+(Point point);
	Point operator-(Point point);
	Point operator*(Point point);
	Point operator/(Point point);
	
	bool operator==(Point point);

	int getX() { return x; }
	int getY() { return y; }
	
	int getIndex(int width) { return (y*width+x); }

	static Point GetPoint(int x, int y) { Point point(x, y); return point; }

private:
	int x, y;
};

```

結構たいへんだった・・・
でも結構便利
ただ、テンプレート使えばよかった・・・
float とか使いたいし・・・

また気が向いたら作ります（殴