OmniAICreator/Qiita-1.07M huggingface dataset:
Ruby の Hash#fetch が便利

`Hash#fetch` は便利なメソッドです。基本的には `Hash#[]` と同じ動作をしますが、キーが存在しない場合の動作が異なります。

## key が存在しない場合は例外が発生する

`Hash#[]` では指定した key が存在しない場合は `nil` を返します。

```rb
user = {
  id: 1,
  name: "Yamada Tarou"
}

p user[:name]  #=> "Yamada Tarou"
p user[:email] #=> nil
```

しかし、`Hash#fetch` メソッドでは指定した key が存在しない場合は例外が発生します。これは `Hash.new(0)` のようにハッシュにデフォルト値を設定していても発生します。

```rb
user = {
  id: 1,
  name: "Yamada Tarou"
}

p user.fetch(:name)  #=> "Yamada Tarou"
p user.fetch(:email) #=> `fetch': key not found: :email (KeyError)
```

例外が発生するため、key のスペルミスによるバグが発生しなくなります。


## デフォルト値を指定することが可能

`Hash#fetch` は第二引数にデフォルト値を指定することが可能で、key が存在しない場合はこのデフォルト値を返します。

```rb
user = {
  id: 1,
  name: "Yamada Tarou"
}

p user.fetch(:name)                       #=> "Yamada Tarou"
p user.fetch(:email, "dummy@example.com") #=> "dummy@example.com"
```

`Hash#[]` でも似たような操作を書くことは可能ですが

```rb
user = {
  id: 1,
  name: "Yamada Tarou"
}

p user[:admin] || true     #=> true
p user.fetch(:admin, true) #=> true
```

指定した key の値が `nil` や `false` の場合に期待した動作にならない場合があるので注意が必要です。

```rb
user = {
  id: 1,
  name: "Yamada Tarou",
  admin: false
}

p user[:admin] || true     #=> true
p user.fetch(:admin, true) #=> false
```

## ブロックを受け取れる

また、`Hash#fetch` ではブロックを渡すことも可能で、キーが存在しない場合はそのブロックの戻り値を返します。ブロック引数には指定した key の値が入ります。

```rb
user = {
  id: 1,
  name: "Yamada Tarou"
}

p user.fetch(:name)                       #=> "Yamada Tarou"
p user.fetch(:email) { |key|
  "#{key} not found"                      #=> "email not found"
}
```

これは第二引数に Proc オブジェクトを渡すことで同様のことが可能です。

```rb
default = -> (key) {
  "#{key} not found"
}

user = {
  id: 1,
  name: "Yamada Tarou"
}

p user.fetch(:name)            #=> "Yamada Tarou"
p user.fetch(:email, &default) #=> "email not found"
```


## 参考サイト

https://docs.ruby-lang.org/ja/latest/method/Hash/i/fetch.html
macOS Sierraの内蔵キーボードと外部キーボードを自動で切り替える

##事前準備(boostのセットアップ)
```shell-session:実行コマンド
$ wget https://dl.bintray.com/boostorg/release/1.65.1/source/boost_1_65_1.tar.gz
$ tar zxvf boost_1_65_1.tar.gz
$ cd boost_1_65_1
$ mv boost boost_1_65_1
$ sudo mkdir -p /opt/local/include
$ sudo mv boost_1_65_1 /opt/local/include
$ sudo ln -s /opt/local/include/boost_1_65_1/opt/local/include/boost
```

##ビルド
```shell-session:実行コマンド
$ git clone --depth 1 https://github.com/tekezo/Karabiner-Elements.git
$ cd Karabiner-Elements
$ make -j 4
```

##実行
Karabiner-Elements-11.0.0.dmgをクリックする。

##設定
Launchpadを起動し、Karabiner-Elementsがあるのでクリックして起動する。
deviceタブに移動。
modify events from this deviceの内臓キーボードのチェックを外す。
disable the built-in keyboard while one of the following selected device is connectedの外付けキーボードのチェックを入れる。
すると外付けキーボードが接続されてる状態だと内臓キーボードを無効にし接続されてない状態だと内臓キーボードを有効にしてくれる。

<img width="894" alt="スクリーンショット 2017-09-30 8.39.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/16794/2cd49f80-34df-3644-ccd7-b7c7cd904fdd.png">

### 参考サイト
http://blog.515hikaru.net/entry/2017/05/28/165002
link > Peformance of iterative solvers in the discrete dipole approximation by Maxim A. Yurkin (2016) | grouping of iterative solvers | Estimate of N_iter | spectral radius

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 16.04 LTS desktop amd64
TensorFlow v1.2.1
cuDNN v5.1 for Linux
CUDA v8.0
Python 3.5.2
IPython 6.0.0 -- An enhanced Interactive Python.
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
```

A presentation given at International Symposium on Electromagnetic Theory (EMTS 2016),Espoo, Finland, 17.08.2016.
https://www.researchgate.net/publication/307477398_Slides_EMTS-2016_iter


p8 
> asymptotic behavior of N_iter for large scatterers

p9

|  |  |
|:-:|:-:|
| QMR, QMR2, Bi-CG  | complex symmetric  |
| Bi-CGStab, Bi-CGStab(2)  | general CG-type method  |
| CGNR, CSYM  | solve normalized equations  |


p26 Estimate of N_iter
for large sizes

```math
N_{iter} \approx \frac{15 ln 10 \rho(Z)}{4 Im(1/(1-\epsilon))}
```

p28 Estimate of the spectral radius

```math
\rho(Z) \approx 4.5 + 0.14 x
```

The graph is drawn for x ranging from 10 to 100.


### link

[number of iterationve becoms large for QMR for specific Re{m} and Im{m} (e.g., m=1.5 + 0.001i)](https://groups.google.com/forum/#!topic/adda-discuss/jABMrH8pIMo)

> It gives several contour plots, similar to your ones, and provides a few analytical formula, but they are applicable only to either very small or very large particles. In your "resonant" case of particles comparable to the wavelength it is hard to predict anything, apart from the general trends - #ite inreases with size and refractive index, and almost real or imaginary refractive indices are the toughest.


[ADDA + Matplotlib > scatterplot of [the number of iterations] for various values of Re{m} and Im{m}, for different iterative solvers (e.g., bicgstab2, bicg, QMR, etc)](https://qiita.com/7of9/items/db74c768617aacbe9381)
Shinyproxyを始める

#Shinyproxyは、JavaとDockerを使ってShiny Appsを立ち上げることができます。


##必要なもの
Java
Docker

##環境設定
ポート番号2375を開ける(Docker用)
ポート番号8080を開ける(一般公開用、ローカルの環境では必要ないと思います)

##ダウンロードしてくるもの
Shinyproxy jar ファイル
[Shinyproxy jarダウンロードサイト](https://github.com/openanalytics/shinyproxy/releases)

##必要ファイル
Shiny appsの
ui.R
server.R

##参照
ShinyProxyのサイトを参照させていただきました。
[ShinyProxy](https://shinyproxy.io)

##追記
上記にある「環境設定」と「必要ファイル」 が用意されていましたら、すぐに下からのgithubのページからファイルを持って来て、Shinyproxyを走らせることができます。

[shinyproxyTemplate](https://github.com/noguchit/shinyproxyTemplate)

必要に応じて、Shinyアプリのui.R, serve.Rを書き換えて、Shinyproxyを走らせてください。

ユーザーのコントロールは、application.ymlで可能です。
それっぽいPythonコードのテンプレート


ちょっとしたツールを書かなければならなくなったとき、それが碌につかったことがないPythonを指定されること、よくありますよね。

Python素人がそれっぽいコードを書くための最低限なところをまとめてみました。
ちょっと表現がよくないかもですが、パッと見で「大丈夫そうだな」と思ってもらえるのが目標です。

## テンプレート

```py
# -*- coding: utf-8 -*-

"""
    hoge_tools.py

    プログラム全体の説明を書きます。
    実行方法とか必要なライブラリとか、
    動作確認しているPythonのバージョンとか書くとよいと思いました
"""


from logging import getLogger, DEBUG

# ログの設定
logger = getLogger(__name__)
logger.setLevel(DEBUG)

# 定数です
NUM_SPHERE = 4
NUM_TRYSAIL = 3


def main():
    """ エントリポイントだよ。

    """
    logger.debug("mainの開始")
    func_fugafuga(1)


def func_fugafuga(parm1):
    """ なんか関数ですよ

        @param parm1: この引数はとくにつかいません
    """
    logger.error("エラーです！！")

class MyClass:

    def __init__(self):
        """コンストラクタの説明
        """
        self._pv_v = "インスタンス変数"

    def process(self, parm1):
        """ メソッドの説明
        """
        logger.debug("process")

    def _pv_process(self):
        logger.debug("_pv_process")


if __name__ == "__main__":
    main()
```

### 定数

```py
# 定数です
NUM_SPHERE = 4
NUM_TRYSAIL = 3
```

Pythonでは定数を特に扱わないようなので、命名規約で縛ります。
全部大文字。

### ロギング

```py
# ログの設定
logger = getLogger(__name__)
logger.setLevel(DEBUG)
```

printを嫌って、ロギングにしてみました。
やってることは変わりませんが、printデバッグは避けた方が印象はよさそうです。

### mainブロック

```py
if __name__ == "__main__":
    main()
```

トップレベルに処理をガリガリ書くのではなく、mainとして実行されたときのみ処理が実行されるようにする、Pythonのスタンダードな方法です。
例えば、テストケースを書くときにこのpyをimportなどしたときなどはmainが実行されないので、便利です。

### 命名規約
関数名、変数名はスネークケース、クラス名はキャメルケース、プライベートは"_"始まり。
と、これくらいは問題ありませんが、変数名は悩ましい。
Pythonを書いていると型でちょっと苦労することがあるので、ハンガリアンで命名したほうがよいのかも。
ただ、ベターだとも思えない。
Pythonはリストと辞書のネストが深くなりがちだし、それをコメントで説明するのも微妙な気がする。

### ドキュメンテーションコメント
あまりルールが決まっていないっぽいです。いくつかライブラリのコードを見て参考にしてみました。
特にパラメータなどはバラバラですね。パラメータの説明などはJavaっぽく「@param」と書いてしまいましたが、これは絶対ではありません。
使っているエディタとかによるかも。
とはいえ、内容をしっかり書いておくと、ちゃんとしたプログラムっぽく見えます（姑息）

## さいごに

まず、Pythonのバージョンは2なのか3なのかは最初に決めておこう！（自戒）


おわりです。
.ipa file を実機にインストールする方法(iTunes 12.7)

##はじめに
先日 .ipa fileをiTunes(12.7)経由でインストールしようと思ったら少し手間取ったのでメモとして残しておきたいと思います。

Ad hoc
iOS バージョン：11.0
Xcode バージョン：9.0
iTunes バージョン：　12.7
Swift バージョン：Swift3 - Swift4(funcに@objcを追加)


以前のiTunesではAppというサイドメニューがあり、そこへipa fileをドラッグ＆ドロップすれば問題なくインストールできました。
しかし、iTunes12.7からサイドメニューにあったAppが無くなっていました。

そこで使うのが、"Apple Configurator 2.3" です。
下記リンクからオフィシャルサイトで確認してみてください。
https://itunes.apple.com/us/app/apple-configurator-2/id1037126344?mt=12
##簡単な使い方

1, Apple Configuratorをインストールします。
![Screen Shot 2017-09-29 at 3.12.06 PM.png](https://qiita-image-store.s3.amazonaws.com/0/188686/0eca6acb-8bcd-148d-dff8-f75b1f5c0f9e.png)

2, 自分のiOSデバイスをUSBでMacに接続します。
![Screen Shot 2017-09-29 at 3.05.34 PM.png](https://qiita-image-store.s3.amazonaws.com/0/188686/ad14cad9-e226-dea5-1762-e3e3b30edf64.png)


3,フォルダーから作成した.ipa fileをAppsにドラッグ＆ドロップします。
![Screen Shot 2017-09-29 at 3.15.58 PM.png](https://qiita-image-store.s3.amazonaws.com/0/188686/f8e716e0-e7dd-a24d-e024-0a8e64173b4a.png)


4, うまくインストールが行けば、インストールの状況が表示されます。
![Screen Shot 2017-09-29 at 3.22.22 PM.png](https://qiita-image-store.s3.amazonaws.com/0/188686/426369fc-ce5e-2339-6ab7-c1a63f54f5e6.png)


5, iOSデバイスを確認してインストールされていれば、完了です。

＊もしインストールがうまくいかなかった場合。
.ipa fileに登録したデバイスのUDIDを確認してみてください。

##まとめ
今後、さらに詳しい内容を投稿できれば引き続き編集していきたいと思います。
direnvの"direnv: ([direnv export zsh]) is taking a while to execute. Use CTRL-C to give up."エラーに関して

# 現象

mac mini(late 2012)を[macOS High Sierra](https://www.apple.com/jp/macos/high-sierra/)にアップデートしたところ、[direnv](https://github.com/direnv/direnv)の読み込みで下記のようなエラーが出力されるようになりました。

```
Last login: Sat Sep 30 03:51:12 on ttys000
direnv: ([direnv export zsh]) is taking a while to execute. Use CTRL-C to give up.
direnv: ([/usr/local/Cellar/direnv/2.7.0/bin/direnv stdlib]) is taking a while to execute. Use CTRL-C to give up.
direnv: loading .envrc
direnv: ([/usr/local/Cellar/direnv/2.7.0/bin/direnv dump]) is taking a while to execute. Use CTRL-C to give up.
direnv: export +SOME_ENV
$ 
direnv: ([direnv export zsh]) is taking a while to execute. Use CTRL-C to give up.
$ 
```

このdirenvをzshのコマンドをhookするように設定していた場合、

```
direnv: ([direnv export zsh]) is taking a while to execute. Use CTRL-C to give up.
```

上記のエラー文が毎度出て非常に邪魔です。この原因と対処をまとめておきます。

# 原因
この問題は[Github上のISSUE](https://github.com/direnv/direnv/issues/272)でも議論されており、direnv実行時の処理タイムアウトに関するオプションを指定することでこの問題を解決した模様です。
この変更は[version 2.12.0](https://github.com/direnv/direnv/releases/tag/v2.12.0)以降に反映されています。

# 対処
direnvのバージョンを上げましょう。
macOSを使用している場合は `brew` コマンドでアップデートを行います。

```
$ brew upgrade direnv                                                    ```
```

macOSのアップデートを行った場合、Xcodeのバージョンを上げないと `brew upgrade` が実行できないため、併せてアップデートを実施しましょう。

```
$ direnv version 
2.13.1
```

その後シェルを再起動します。以上でエラー文は出力されなくなります。
もしこれでも出力されるようでしたら下記のオプションを `.zshrc`などに設定してタイムアウト時間を延長させましょう。

```
export DIRENV_WARN_TIMEOUT=100s
```
raspberrypi CentOS7でNTFSを使おうとしたらハマった件

ラズパイでCentOSを使おうとするのはやめたほうがいいんだろうか・・・
ググってもなかなか解決しないし。

今回は、デフォルトで入っているNTFSでマウントしたら、書き込みができなかった（読み込みはできた）。
結論から言うと、読み書きをするにはntfs-3gをビルドインストールしなくてはならない。

##環境
raspberry pi2 on centos7

```/etc/redhat-release.
CentOS Linux release 7.3.1611 (Core)
Linux version 4.4.26-v7.1.el7 (mockbuild@armv7-02.dev.centos.org) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-4) (GCC) ) #1 SMP Sat Oct 22 16:14:43 UTC 2016

cpuinfo: ARMv7 Processor rev 5 (v7l)
```

###事象
- rootなのに書き込めない。信じられん。

```
# mount -t ntfs /dev/sda1 /mnt/hdd001
# cd /mnt/hdd001
# touch test
touch: cannot touch 'test': Permission denied
```
- ちなみにraspberrypiにntfsはデフォルトで入ってるみたいなので、これでマウントして、あーでもないこーでもないってやってた。

```/proc/filesystems.
__(snip)__
nodev   mqueue
        ntfs　　　＜－
        fuseblk
nodev   fuse
nodev   fusectl
```

###今回色々試行錯誤してやったこと
- yumでntfs-3gのインストールを試みる

```
yum install ntfs -> No package ntfs available.
yum install ntfs-3g -> No package ntfs-3g available.
```

- releaseverを7から7.3.1611に書き換え。

```/etc/yum/vars/releasever.
7.3.1611
```

- yum update
- 再度 yum install ntfs

なんかいろいろアップデートされた。
だが、これでも解決せず。
ここで、yumでのインストールは諦める。

- 別マシンのWindowsで書き込み

スクショとってないけど、できた。
ちなみに、Windowsで作成したファイルに対しての書き込みはできるんだよなぁ。
##－－－－ここまで読む必要なし。－－－－

----

##NTFS-3Gをインストール
https://www.tuxera.com/community/open-source-ntfs-3g/
stableのバージョンをwgetしてくる。ちなみにいま現在は2017.3.23が最新だった。
*The latest stable version is ntfs-3g_ntfsprogs-2017.3.23, released on March 28, 2017.*

```
# cd ~
# wget https://tuxera.com/opensource/ntfs-3g_ntfsprogs-2017.3.23.tgz
# tar xvfz ntfs-3g_ntfsprogs-2017.3.23.tgz
```

解凍されるので、configureしてmakeしてmakeinstallする。

```
# cd ntfs-3g_ntfsprogs-2017.3.23/
# mkdir build
# ../configure
# make && make install ; echo $?
```

###インストール確認

```
# ntfs-3g
ntfs-3g: No device is specified.

ntfs-3g 2017.3.23 integrated FUSE 27 - Third Generation NTFS Driver
                Configuration type 1, XATTRS are on, POSIX ACLS are off

Copyright (C) 2005-2007 Yura Pakhuchiy
Copyright (C) 2006-2009 Szabolcs Szakacsits
Copyright (C) 2007-2017 Jean-Pierre Andre
Copyright (C) 2009 Erik Larsson

Usage:    ntfs-3g [-o option[,...]] <device|image_file> <mount_point>

Options:  ro (read-only mount), windows_names, uid=, gid=,
          umask=, fmask=, dmask=, streams_interface=.
          Please see the details in the manual (type: man ntfs-3g).

Example: ntfs-3g /dev/sda1 /mnt/windows

News, support and information:  http://tuxera.com
```

おｋ。

###マウントしてみる

```
# umount /dev/sda1
# mount -t ntfs-3g /dev/sda1 /mnt/hdd001/
# cd /mnt/hdd001
# touch test
```
書き込めた！

### fstabに書いといた。
 
下記を追記。

```/etc/fstab.
UUID=xxxxxxxxxxxxxxxxxxxxx /mnt/hdd001 ntfs-3g defaults 0 0
```
kintone JavaScriptカスタマイズのためのwebpackビルド環境（Dropbox併用）

## はじめに
6月頃から、kintoneのJSカスタマイズのためにwebpack & Babelのビルド環境を使ってきました。すんごい便利で、もうこれナシでは開発できません僕は！
来週[kintone hack 2017 大阪予選会](https://kintonehack2017.qloba.com/)にも出ることですし、これまでの集大成として、webpackを使ってkintoneカスタマイズをするサンプルプロジェクトを作ってGitHubに公開しました！
https://github.com/TheRed/kintone_webpack

同じようなことやってる人は結構いる気がしますが、~~2017年9月現在、Google検索でヒットする情報は以下の2件くらい。~~2017年10月現在、Google検索でヒットする情報は以下の6件くらい。　[^1]

[^1]: ここ数ヶ月で一気に情報増えましたよね！この調子でkintone & webpackどんどん盛り上がってほしいです :blush: 

* [webpackを使ったワンランク上のモダンJSカスタマイズ_門屋 亮氏 - SlideShare](https://www.slideshare.net/kintone-papers/webpackjs)
* [Webpackを使ってkintoneモバイルカスタマイズにCSSを入れる | kintoneを便利に使う方法を紹介するブログ](https://www.joyzo.co.jp/blog/3780)
* [KintoneでWebpack + Babel + Vueを使ってモダンに爆速開発していくサンプル(1/2) | ikazoy.me](http://ikazoy.me/2017/07/31/kintonewebpack/)
* [BabelでES6で書いて、webpackでビルドして、mochaでテスト書いて、power-assertでassertの出力を見やすくして、karmaで複数ブラウザのテストを自動化して、カバレッジを出力するようにした - UUUM攻殻機動隊(エンジニアブログ)](http://system.blog.uuum.jp/entry/2016/09/16/110000)
* [モダンなkintoneプラグイン開発環境の例 – cybozu developer network](https://developer.cybozu.io/hc/ja/community/posts/115019062263)
* [R3 kintone js deployerを使ってkintoneカスタマイズをハッピーに！ - Qiita](https://qiita.com/ha_ru_ma_ki/items/d7c58a2929c14a55fb5e)

全部とても参考になるんですが、僕はちょっとスタンスを変えて「一式のプロジェクト」になったサンプルコードを作ってみました。GitHubから`clone`するだけで試せると取っ付きやすいですし、コード読める人には日本語よりもコード見せるのが早いですからね！

## ビルド方法
```shell-session
$ git clone https://github.com/TheRed/kintone_webpack.git
$ cd kintone_webpack
$ yarn install
$ yarn watch
```
GitHubのREADMEに書いた通り、これだけ。
`watch`しながら`src`ディレクトリ内のコードを編集して遊んでみてください。

webpack/Node.js/yarnなどの基本を知らない方は、
ネット上に参考になる記事色々あるので、僕が解説することはしません！
頑張って勉強してくださいね :smile: 

## Dropboxと併用する
プロジェクトには、kintone開発に即役立つための設定を色々と入れてます。
今日は時間がないので細かい解説はしませんが、一点だけ一番のミソを解説。

```js:webpack.config.js
  output: {
    path: path.join(os.homedir(), 'Dropbox/kintone/projectName'),
    filename: '[name].js',
  },
```

ここです！
`output`にホームフォルダ配下のDropboxフォルダを指定しています！
ビルド結果ファイルのDropbox URLをkintoneに指定しておけば、`yarn watch`で監視ビルドしながら、ビルド結果がDropbox経由でkintoneに同期されるわけです！素晴らしいでしょ！！！
`output`ファイルは、1アプリ1ファイル作成されるようにしています。今回の場合は「app1」「app2」の2アプリですね。

開発者サイトにある通り、kintone開発にDropbox同期を使うのは常套手段ですね。
https://developer.cybozu.io/hc/ja/articles/201308690-JavaScriptカスタマイズのデバッグをかんたんにするウラワザ

僕は最初「Dropbox同期できないから効率悪すぎじゃーん」と思って、それが理由でwebpack敬遠してたんですが、このワザを編み出してから万事がうまく回り幸せになりました！「webpackとDropboxを併用する方法」の解説は、おそらく本邦初公開だと思います。まぁ誰でも思いつきそうなことだけど、これを読んで新しく始めてくれる人が増えることを祈って投稿する次第です(`･ω･´)

もちろんプロジェクト全体をDropboxフォルダに入れても同期可能ですが、それだと`node_modules`もDropboxフォルダに入ってしまい、膨大な量のファイルがDropboxで同期されて恐ろしいことになります。。。その理由で諦めてる人がいたら、是非この方法で`output`だけDropboxに出してくださいませ！

その他のコードの解説は、また気が向いた時に書きます。GitHubのコードも、随時書き加えていきたいと思ってまーす。

## おわりに
kintoneカスタマイズは、まだまだフロンティアだと思います。こういうノウハウを全国のみんなで蓄積し合って、幸せにkintoneカスタマイズしましょうぜ！特に、フロントエンド開発をバリバリやってきたJSプログラマー達の参戦をお待ちしてます！

他のkintone & webpack使いの他の人たちは、普通どうやってるんだろう？npm-scriptsでビルド結果を監視しつつAPIで自動デプロイとかもできそうですけど、Dropbox以外に良い方法あれば教えてくださいね〜。

ではまた！
Flaskのサーバーはデフォルトだと公開されてない

Flask初見で詰まったので、メモを残しておく。

## Flaskで最も基本的なサーバー
```py
from flask import Flask

app = Flask(__name__)

@app.route('/')
def index():
    return 'Hello world'

if __name__ == '__main__':
    app.run(debug=False, host='0.0.0.0', port=80)
```

## 注意点
`host='0.0.0.0'` の指定が大事。
これがなければ、外部からアクセスすることができない。
参考: http://flask.pocoo.org/docs/0.12/quickstart/
> Externally Visible Server
> 
> If you run the server you will notice that the server is only accessible from your own computer, not from any other in the network. This is the default because in debugging mode a user of the application can execute arbitrary Python code on your computer.
> 
> If you have the debugger disabled or trust the users on your network, you can make the server publicly available simply by adding --host=0.0.0.0 to the command line:
python3でwebスクレイピング(Beautiful Soup)

python3でwebスクレイピングのために、
Beautiful Soupを利用した方法を紹介します

* ドキュメント：https://www.crummy.com/software/BeautifulSoup/bs4/doc/

## 環境

```console
$ cat /etc/redhat-release 
CentOS Linux release 7.4.1708 (Core) 

$ python3 -V
Python 3.5.4

$ pip -V
pip 9.0.1
```

# install

下記を使ってスクレイピングします。

- requests: HTTP ライブラリ
- beautifulsoup4: htmlパーサー(pythonから呼び出し)
- lxml: htmlパーサー(beautifulsoup4内部で利用)

```sh
pip install requests
pip install beautifulsoup4
pip install lxml
```

## インストール確認

```sh
pip freeze | grep -e request -e lxml -e beautiful 

beautifulsoup4==4.6.0 
lxml==4.0.0
requests==2.18.4
```

# 使い方

まずはインポートします。

```py
import requests
from bs4 import BeautifulSoup
```

次に、HTMLを取得してきます。

```python3
target_url = '***'
r = requests.get(target_url)         #requestsを使って、webから取得
```

htmlパース用のオブジェクト作成します。内部で利用するパーサーを指定する場合は、"html.parser"の部分を"lxml"などに変更します。

```py
soup = BeautifulSoup(r.text, "html.parser")
 or
soup = BeautifulSoup(r.text, 'lxml') #要素を抽出
```
lxmlは速度が早いのでおすすめらしい。下記がわかりやすかった。

>パーサの良し悪しを考えるとlxmlでチャレンジしてダメならhtml5libを試すのが良さそう。
[PythonでWebスクレイピングする時の知見をまとめておく][html-parser]
[html-parser]:http://vaaaaaanquish.hatenablog.com/entry/2017/06/25/202924

## 特定のタグを取得

```python3
soup.find_all("a")
soup.find("a")
soup.find_all("a", attrs={"class": "link", "href": "/link"})

import re
soup.find_all(re.compile("^b"))
soup.find_all("a", text=re.compile("hello"))

soup.select('a[href^="http://"]')
```

## サンプルコード

全てのaタグを取得し、リンク先URL（href属性）を表示します

```python3

import requests
from bs4 import BeautifulSoup

target_url = '***'
r = requests.get(target_url)         #requestsを使って、webから取得
soup = BeautifulSoup(r.text, 'lxml') #要素を抽出

for a in soup.find_all('a'):
      print(a.get('href'))         #リンクを表示
```
TypeScriptのclassをオブジェクトで初期化する

# 一般的な初期化方法
TypeScriptにおいてclassの初期化を行う際、多くの場合は`constructor`を利用するかと思います。以下の`Person` classを例にしてconstructorを使用した初期化処理を見てみましょう。

```ts
class Person {
  name: string;
  age: number;

  constructor(name: string, age: number) {
    this.name = name;
    this.age = age;
  }
}

const takashi = new Person('Takashi', 70);
```

ここでは、`Person` classは`name`と`age`という2つのプロパティを持っており、constructorにそれぞれの値を渡すことで、各プロパティの初期化を行っています。
これはごく基本的な初期化方法ですが、あらかじめ初期化に使用することのできるオブエジェクトをAPIサーバーなどから受け取っている場合、初期化を行うためのコードが冗長になりがちです。下のコードを見てみましょう。

```ts
// 何らかのAPIコールで人の情報を取得
server.getPerson().then(person => {
  // person === {name: 'Takashi', age: 70}

  const takashi = new Person(person.name, person.age);
});
```

上の例では、各プロパティを別々のパラメータとしてconstructorに渡しているため、コードの記述量が多くなってしまっています。`person`をパラメータとして直接渡せたらどんなに楽でしょう。それを実現するための手段が`Partial`です。


# Partial
`Partial`はTypeScript 2.1から導入されたtypeで、`Partial<T>`と指定した時に、`T`が持つ全てのプロパティをオプションとした型として振る舞う性質を持っています。これはどういうことでしょうか。以下の例を見てみましょう。

例えば、次のような`Person` classを定義していると仮定します。

```ts
class Person {
  name: string;
  age: number;
}
```

この際、`Partial<Person>`を使用すると、`Person`が持つ`name`と`age`というプロパティがオプションとなった型として扱われます。つまり、下記コードの`a`と`b`は、同じ型の変数として振る舞います。

```ts
const a: Partial<Person>;

const b: { name?: string, age?: number };

// aとbは同様の型として振る舞う
```

この効果を利用することで、上述したconstructorをより簡潔に記述することができます。

# Partialを使ったconstructor

それでは、`Partial`を利用したconstructorの記述例を見てみましょう。`Partial`を利用することで、冒頭で記述した`Person` classのconstructorは以下のように定義することができます。

```ts
class Person {
  name?: string;
  age?: number;

  constructor(init?: Partial<Person>) {
    Object.assign(this, init);
  }
}
```

見て分かるように、`Person`のconstructorには`Partial<Person>`のパラメータを渡すように定義しています。こうして渡されたパラメータを`Object.assign`を使用して自身へと割り当てることで、各プロパティへと値がセットされます。これにより、以下のように`Person`のconstructorに直接オブジェクトをパラメータとして渡すことができます。

```ts
const obj = {
  name: 'Takashi',
  age: 70,
};

const takashi = new Person(obj);

console.log(takashi.name); // => 'Takashi'
console.log(takashi.age); // => 70
```

# 継承したclassの場合

先ほどの `Person` classを継承したclass `Programmer`を定義することを考えてみましょう。この場合でも、constructor内で値をセットすることで、同様にオブジェクトからclassを初期化することが可能です。

```ts
class Programmer extends Person {
  salary: number;
  skills: Array<{ lang: string, rate: number }>;

  constructor(init?: Partial<Programmer>) {
    super();
    Object.assign(this, init);
  }
}
```

`Programmer`を初期化する例は以下の通りです。

```ts
const obj = {
  name: 'Takashi',
  age: 70,
  salary: 200,
  skills: [
    { lang: 'JavaScript', rate: 5 },
    { lang: 'Ruby', rate: 2 },
  ],
};

const takashi = new Programmer(obj);

console.log(takashi.name); // => 'Takashi'
console.log(takashi.age); // => 70
console.log(takashi.salary); // => 200
console.log(takashi.skills); // => [{lang: 'JavaScript', rate: 5}, {lang: 'Ruby', rate: 2}]
```

このように、`Partial`を利用することで、オブジェクトから簡単にclassを初期化することができます。やったね！ :tada:


# 参考
[TypeScript and field initializers](https://stackoverflow.com/questions/14142071/typescript-and-field-initializers)
ど素人がGitHubをとりあえず使う

素人がGitHubを使うための最低限のコマンド。
とりあえずバージョンを切ったり戻したりしたい人向け。
# 1：ローカルでバージョンを切る
例：pjディレクトリ

```bash
$ cd pj

$ git init # ここ以下のフォルダ、ファイルを管理する

$ git add . # 差分を登録する

$ git commit -m "初めてのコミット" # addした分でバージョンを切る
```

ローカルでやるならここまででOK

# 2：GitHubに上げる

GitHubで適当に登録しておこう。URLは.gitで終わるやつ。

```bash
$ git remote add origin https://github.com/xxx/xxx.git # URL登録

$ git push origin master # 切ったバージョンをアップ
```

# 3：特定バージョンまで戻す
アプリが壊れたら戻す。便利。
コミットIDはGitHubのコミットページ右上にあるよ。

```bash
$ git checkout --force [commit ID]
```
# 4：ブランチを使う
githubのpushをトリガーにデプロイしている場合、
brachを分けることで本番と開発を分けられる。

```bash
$ git branch [branch] #ブランチ作成

$ git checkout [branch] #ブランチ切替
```
んで普通にgit addやgit commitする

```bash
$ git checkout master #masterに切り替えてから

$ git merge [branch] --no-ff #取り込むブランチをマージ(コミットするオプションつき）
```

# 5：便利コマンド

初心者に便利なコマンド

```bash
# 前回コミットから今までの変更を確認
$ git diff
```


```bash
# 直前のコミットにコミット
$ git commit --amend --no-edit
$ git push -f origin master
```

```bash
# コミットのコメントを修正
$ git commit --amend
```

```bash
# どうにもpushできなくなったら.gitを消してinitからやり直す
$ rm -rf .git
```
MacでVPN接続時に自動ルーティングする


# はじめに

この記事は OS X 10.11 までの環境を想定しています。
macOS Sierra (10.12) から、標準VPNクライアントにPPTPは搭載されていません。

サードパーティー製のPPTP接続ツールにも有効な手法ですが、[Shimo](https://www.shimovpn.com/) のように独自のルーティング機構を備えたツールでは、そちらの機能を使う方がGUIからお手軽にルーティングを設定できます。

# 導入

Windowsほどではありませんが、Macでも標準VPNクライアントでのPPTPはルーティングの問題が悩ましいです。デフォルトゲートにすると全通信がVPNを通ってしまうのは同じなので、デフォルトゲートのチェックを外しつつ必要なルーティングを接続時に得るため `/etc/ppp/ip-up` を使います。

`/etc/ppp/ip-up` は **PPP接続が成功した時にシステムから実行される** スクリプトです。VPN接続後に設定したいルーティング情報をここに記述することで、必要なルーティングを得ることができます。

# 作業の前に

`/etc/ppp/ip-up` の設定はGUIではできません。
エディタ等でも編集できるかもしれませんが、権限昇格の操作を伴うので以降の作業はすべてコンソール経由で行うことを推奨します。

iTerm 等のターミナルソフトを使用してください。

# ip-up ファイルの生成

`/etc/ppp/ip-up` ファイルが存在しない場合は新規作成し、実行属性を付与します。

```bash
sudo touch /etc/ppp/ip-up
sudo chmod 755 /etc/ppp/ip-up
```

既に存在する場合は内容を確認の上、バックアップ後に新規作成または追記での設定など適宜対応してください。

# ルーティング編集

以下の雛形をもとにルーティング情報を編集します。
「どのVPNに接続したか」の判断は remoteip 変数で行います。

**remoteip = 接続先のデフォルトゲート**

ですので気をつけてください（VPN接続先ではありません）。

デフォルトゲートのIPが不明な場合は Debug output の echo行のコメントを外した状態でVPN接続してみてください。ログ（DEBUGFILE）に接続情報が出力されます。

「5: ...」のIPが remoteip 相当です。

ルーティング自体は route コマンドによる追加となります。
詳細は route コマンドのマニュアルを参照してください。

```bash
#!/bin/sh
#
# Script which handles the routing issues as necessary for pppd,
# including for PPTP tunnels. Save this script as /etc/ppp/ip-up
# and make sure it is executable.
#
# When the ppp link comes up, this script is called with the following
# parameters
#   $1      the interface name used by pppd (e.g. ppp3)
#   $2      the tty device name
#   $3      the tty device speed
#   $4      the local IP address for the interface
#   $5      the remote IP address
#   $6      the parameter specified by the 'ipparam' option to pppd

#
# Config
#
ROUTE=/sbin/route
DEBUGFILE=/tmp/ip-up-debug.txt


#
# Debug output
#
##echo "1:$1 2:$2 3:$3 4:$4 5:$5 6:$6" >> $DEBUGFILE

#
# vars
#
ifname=$1
ttyname=$2
speed=$3
localip=$4
remoteip=$5
ipparam=$6  # the current IP address before connecting to the VPN

#
# routing
#
case "$remoteip" in
    # my office vpn
    192.168.100.1)
        $ROUTE add -net  192.168.200.0/24 -interface $ifname
        $ROUTE add -host 192.168.10.30 -interface $ifname
        ;;
esac

exit 0;
```

【参考情報】
Modify PPTP Routing Table
http://www.macfreek.nl/memory/Modify_PPTP_Routing_Table

# 実行

対象のVPN接続を実行します。
接続後に `netstat -rn` して指定のルーティングが追加されていることを確認します。
Dockerコンテナを全部止めるaliasとDockerImageを全消しするalias

#全停止（DockerContainer）
zshで動作確認。
取り敢えず全部止められる。

```.zshrc
alias docker-all-stop='docker stop $(docker ps -a -q);docker ps'
```

```
$ docker-all-stop
712fc7dadddd
7e3893481a21
55850c094aab
a1a369928457
059ca6800484
901bf0b438eb
c6f4a0bdcfbe
03fd035dd3ca
bda3193f9a1b
8dee09be2ed9
019e1c8c2dc9
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
```

#全削除(DockerImage)

兎にも角にも全部消す。

```.zshrc
alias docker-all-image-remove='docker rmi -f $(docker images -q);docker images'
```

```
$ docker-all-image-remove
Deleted: sha256:001daf220567a67d37c6c53542e007eAAAA3a343459f7fc2ff4c281ad1533a2c
Deleted: sha256:4f857575187be89759500fffb57823ZXXXX721e1effff155ac3228e1970397e6
Deleted: sha256:b7dfd1eeea3bec4d9fbea17d24046a170ZXXXX4c413389a6fdbeb8e2ca13ed52
Deleted: sha256:5e19027ed0b2c14315398102c552d04a5bff12ZXXXXc9f4c8641afafb844ba8e
Deleted: sha256:a05cc95274e9fe501066da59a7236a71ZXXXX0443f3f9e98310c9baf7b161a6d
Deleted: sha256:072fb01df8da7e4e889cb1f0853c66089281dZXXXXe7500f30ca75d282f2067e
Deleted: sha256:da970aea741700e99e59e4c1810cab9a9d86cbf5b5ZXXXX9a5a40e272f6ff4e4
```

## Macなら

GUIからやったほうが安全のようだ。

<img width="830" alt="スクリーンショット 2018-03-28 13.40.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/93918/06d7c3b1-7696-3808-6600-557f0038a03f.png">



こんな感じ。
全削除の方は実行後にDockerプロセス(`com.docker.hyperkit`)が暴走したので、もうイロイロめんどくさくなっちゃったとき以外使わない方が良い。
きちんと調べてないが多分よくない。
Haxe統合開発環境 IntelliJ IDEAからVisualStudio Codeに変えた話

#IntelliJ IDEAでHaxe開発をしていた

満足はしていましたが、細かい挙動で気になっていました。

- switch caseでの対応不十分
 - switch{ case A(value):return value; } この場合にvalueが未定義と判定される
- Haxe4.0.0で導入される　is演算子（型判別）に未対応
- Compiler Servicesに未対応
    - コンパイラ自身が、コードからIDE向け情報を出力してくれる
    - https://haxe.org/manual/cr-completion-overview.html

いつか対応してくれるだろうと、
https://github.com/HaxeFoundation/intellij-haxe
を眺めてはまだか、という日々を送っていました。

# HaxeのトッププレイヤーはVisualStudio Codeしかつかっていない？

Haxe summit 2017がアムステルダムで開かれました。
http://summit.haxe.org/
そこで登壇され、デモされる方々のIDEはVisualStudio Code（以降VSCode）ばかりでした。
Haxedevelop（http://haxedevelop.org/ ）も無かったように思います。

# VSCode 使ってみよう

vshaxeプラグインを導入、使ってみました。
結論から言うともっと早く使ってみればよかったです。

- switch case →　OK
- is演算子 →　OK
- Compiler Service → OK
 - IntelliJ IDEAでは教えてくれなかった情報がバシバシでました
  - 未使用変数を教えてくれました（ほぼリアルタイムで）
  - 推奨の方法を教えてくれました
  　例：typdedef HasNew{function new();}ではなくConstructibleをつかえ、といった情報 

# VSCodeでできなかったこと

- Importが自動的に追加されない
- ローカル変数名でのリネームしかできない
 - Class名のリネーム、パッケージ移動はIntelliJ IDEAでも完全対応ではなく、手直しが必要でした
- コードフォーマッターはどこでしょうか　https://github.com/vshaxe/haxe-formatter vshaxeから外れたようですが・・

# 結論
VSCodeでコーディング、コミット前にIntelliJ IDEAでフォーマットしてます。
Javaのお勉強#5(繰り返し処理と無限ループ)

## 繰り返し処理
今回はwhile文を使って、例文を作って行きます。
while文は繰り返し処理を行う条件式
##通知を待つ繰り返し処理

```java
boolean alarm = true;//ここでtrueかfalseを代入
while (alarm) {
    System.out.println("更新ボタンを押す");
    System.out.println("3分待つ");
}
```

ちなみに、この処理を実行すると無限ループになってしまう。
また、falseの場合何も表示されない。

- whileという命令で、**繰り返し**を制御することができる。(whileは～の間という意味)
- whileの()には繰り返しを継続させる条件を書くこと
- 繰り返しを続ける条件が成り立つ限り、何回でも繰り返し実行される。(よって、無限ループに注意!!)

ifやwhileを制御構文という。
制御構文は、"条件式"と"ブロック"の2つの構成要素から成り立つ。

参考図

```java
if("条件式"){
    //ブロック
} else {
   //ブロック
}

while("条件式"){
    //ブロック
}
```

## まとめ
- ループでは、処理をよく考えてやらないと無限ループにハマってしまう。
- 繰り返しには、whileを使う。
- 次回はブロックについて

## 雑談
今日はここまでで…
進むペースが落ちてきていますが、これ以上早くやっちゃうとパンクしそうです＼(^o^)／
Qiitaは楽しいですね！勉強も楽しくできるし、こんな勉強メモにもコメントや編集をしてくださるので(^o^)
明日は土曜日ですが、仕事と飲み会で更新できるかどうか…
にしてもクラスの名前にもセンスが問われるかと思ってきて、久しぶりに英語の勉強も平行してやろうかと思うので、何かいいテキストを書店で見つけなければ(´・ω・`)
今手元にある英語の本といえば、**俺の妹がこんなに可愛いわけがないとやり直す中学英語**しかないのでｗ(ハルヒとかとあるシリーズもあったけどあれも同じ所なんだろうか…)
paperclipの使い方【Gem】

paperclipの使い方をまとめる。
[こちら](https://qiita.com/akishin/items/8bc2196500781ded2c0d)のページを追った。

projectの作成。

```
$ rails new paperclip
$ cd paperclip
```
Gemfileに追記。

```:Gemfile
gem 'paperclip'
```
`$ bundle install`


scaffoldの作成。
`$ rails g scaffold user name:string password:string`

userモデルに追記。

```app/models/user.rb
class User < ApplicationRecord
  has_attached_file :avatar, :styles => { :medium => "300x300>", :thumb => "100x100>" }, :default_url => "/images/:style/missing.png"
  validates_attachment_content_type :avatar, :content_type => /\Aimage\/.*\Z/
end
```
カラムを追加。
`$ rails g migration add_avatar_to_users`

```db/migrate/XXXXXXXXXXXXXX_add_avatar_to_users.rb
class AddAvatarToUsers < ActiveRecord::Migration[5.1]
  def change
  end
  def self.up
    add_attachment :users, :avatar
  end
  def self.down
    remove_attachment :users, :avatar
  end
end
```

`$ rake db:create db:migrate`

以下のように変更を加える。

```app/views/users/_form.html.erb
<div class="field">
  <%= form.label :avatar %>
  <%= form.file_field :avatar %>
</div>
```

```app/controllers/users_controller.rb
def user_params
  params.require(:user).permit(:name, :password, :avatar)
end
```

`$ rails s`

動いていることを確認。
prologue

# prologue
今までこういったものからは逃げてきたが、そうも言ってられない状況(※)になって<br>きたのでそろそろちゃんと向き合ってみる。

超初心者ですが仕事で<font color="orange">SSRS</font>に携わることになりそうなので、<br>拙筆ながらもここで勉強したことをまとめていこうと思います。

※    

- 子供のお迎えの関係で毎日残業出来ない。
- 残業出来ないくせに家で勉強しない。
- 勉強してないからアウトプットが出来ない。


会社の環境は非常に恵まれています。<br>上司も後輩もフォローしてくれます。休みも取りやすい<br>


 **がしかーし！！！(　-`ω-)**<br>
それでいいのか私。<br>
いつまでも甘ったれてていいのか私。<br>
2回も産休・育休もらっておきながらいつその恩を返すんじゃい！<br>
ということで勉強ガンバロウと思います。<br>
macOS High Sierra の起動可能なインストーラを作成する

macOS の起動可能なインストーラを作成する
https://support.apple.com/ja-jp/HT201372

上記ページにMavericks〜Sierraの手順例は書いてあるがHigh Sierraのものはない。
試しに.appのファイル名だけ書き換えれたところSierraなどと同様に起動可能なインストーラが作成ができた。

```
$ sudo /Applications/Install\ macOS\ High\ Sierra.app/Contents/Resources/createinstallmedia --volume /Volumes/MyVolume --applicationpath /Applications/Install\ macOS\ High\ Sierra.app
```
JavaScriptで console.log(1+1); //2 という形式の文字列を得る方法

#な…　何を言っているのか　わからねーと思うが

俺も一体何を書きたいのか、わからなかった。

とりあえず、あ・・・ありのまま、今書いたソースを伝えるぜ！

~~~HTML

<!DOCTYPE html>
<html lang="ja"><head>
  <meta charset="utf-8">
<script>

  var consoleLogComment = function(str) { 
    var result = (new Function('return ' + str + ';'))()
    return 'console.log(' + str + ');  //' + result;
  };

  var copyText = '';
  copyText += consoleLogComment("1+1");
  copyText += '<br />';
  copyText += consoleLogComment("parseInt('020')");
  copyText += '<br />';
  copyText += consoleLogComment("parseInt('020', 10)");
  copyText += '<br />';
  copyText += consoleLogComment("parseInt('020', 8)");
  copyText += '<br />';
  copyText += consoleLogComment("parseInt(020, 10)");
  copyText += '<br />';
  copyText += consoleLogComment("parseInt(020, 8)");
  copyText += '<br />';

  document.write(copyText)

</script>
</head><body>
</body></html>
~~~

※コメント欄で教えていただきました。もっと短くかけるって。

~~~
  const consoleLogComment = (s) => `console.log(${s}); // ${eval(s)}`
~~~

これで得られる結果は、これだ。

~~~js
console.log(1+1); //2
console.log(parseInt('020')); //20
console.log(parseInt('020', 10)); //20
console.log(parseInt('020', 8)); //16
console.log(parseInt(020, 10)); //16
console.log(parseInt(020, 8)); //14
~~~

ここで、parseIntは関係ねえ。

~~~js
console.log(何か)	//何かの答え
~~~
この形式で、文字列が取得できるってことだ。
JavaScriptの本とかでよく見かける、この形式のソースコードだ。


頭がどうにかなりそうだった…
そんなチャチなもんじゃあ　断じてねえ
もっと恐ろしいものの片鱗を　味わったぜ…


#ということで、
いちいち、console.logの出力内容をコピーして、//以降に記述しなくても、consoleLogComment を使うと、そのソース文そのものが文字列として手に入るって仕組みです。

コードを公開したい人(俺とかおまえとか)には、役に立つような気がしました。

どうぞ。
Windows環境でゲーム開発するなら入れておいて損しないツール


# Tunlookup(Mac版あり)
- URL
    - https://tun-application.github.io/
- 概要
    - 選択したテキストから翻訳してくれるツール

# ソースツリー(Mac版あり)
- URL
    - https://ja.atlassian.com/software/sourcetree
- 概要
    - Git管理のためのツール

# RLogin 
- URL
    - http://nanno.dip.jp/softlib/man/rlogin/
- 概要
    - Windows用のターミナルソフト。マニュアルが丁寧。

# Franz（Mac版あり）
- URL
    - http://meetfranz.com/
- 概要
    - チャットワーク、Twitterなど、複数のSNSを一元化するためのツール。

# VirtualBox（Mac版あり）
- URL
    - https://www.virtualbox.org/
- 概要
    - 仮想開発環境を作るためのアレ。

# Vagrant（Mac版あり）
- URL
    - https://www.vagrantup.com/
- 概要
    - 仮想開発環境を作るためのアレ。

# cyberduck（Mac版あり）
- URL
    - https://cyberduck.io/index.ja.html?l=ja
- 概要
    - FTPクライアントソフト

# HeidiSQL 
- URL
    - https://www.heidisql.com/
- 概要
    - MySQL管理クライアントソフト

# Unity（Mac版あり）
- URL
    - https://unity3d.com/jp/

# PupSQLite
- URL
    - https://www.eonet.ne.jp/~pup/software.html
- 概要
    - SQLite管理クライアントソフト

# EmEditor
- URL
    - https://jp.emeditor.com/
- 概要
    - 高性能テキストエディタ

# Evernote（Mac版あり）
- URL
    - https://evernote.com/intl/jp/

# Clibor
- URL
    - https://www.amunsnet.com/
- 概要
    - クリップボード履歴ソフト

# Screenpresso
- URL
    - https://www.screenpresso.com/ja/
- 概要
    - 画像と動画のキャプチャソフト

# StrokesPlus
- URL
    - https://sites.google.com/site/strokesplusjp/strokesplusno-dao-ru
- 概要
    - マウスジェスチャーソフト

# Adobe Creative Cloud（Mac版あり）
- URL
    - http://www.adobe.com/jp/creativecloud.html

# Jetbrains製品全般（Mac版あり）
- URL
    - https://www.jetbrains.com/
- 概要
    - PhpStormやResharperなど

# Android Studio（Mac版あり）
- URL
    - https://developer.android.com/studio/index.html

# Google日本語入力（Mac版あり）
- URL
    - https://www.google.co.jp/ime/

# iTunes（Mac版あり）
- URL
    - https://www.apple.com/jp/itunes/download/

# Lhaplus
- URL
    - http://www7a.biglobe.ne.jp/~schezo/
- 概要
    - 解凍、圧縮ソフト

# WinMerge
- URL
    - http://www.geocities.co.jp/SiliconValley-SanJose/8165/winmerge.html
- 概要
    - Diffソフト

# VLC media player（Mac版あり）
- URL
    - https://www.videolan.org/vlc/index.ja.html
- 概要
    - マルチメディアプレイヤー

# Boostnote（Mac版あり）
- URL
    - https://boostnote.io/
- 概要
    - Markdown編集も可能なメモツール

# Kobito（Mac版あり）
- URL
    - http://kobito.qiita.com/
- 概要
    - Qiita登録のためのMarkdownエディタ

# Clover
- URL
    - https://www.japan-secure.com/entry/for-japanese-of-clover.html
- 概要
    - ファイラー

# QTTabBar
- URL
    - http://qttabbar-ja.wikidot.com/
- 概要
    - ファイラー

# Launchy（Mac版あり）
- URL
    - https://www.launchy.net/index.php
- 概要
    - ランチャー

# 1Password（Mac版あり）
- URL
    - https://1password.com/
- 概要
    - パスワード管理
俺のbrew tap, brew list

v2018.09.27

```
$ brew tap
homebrew/core
homebrew/services
```

```
$ brew list
apr		automake	composer	freetds		git		imagemagick@6	libffi		libpng		libunistring	mhash		nodebrew	php@7.1		ruby-build	xz
apr-util	axel		curl		freetype	glib		intltool	libiconv	libpq		libxml2		mpfr		openssl		pkg-config	unixodbc
aspell		bison		direnv		gcc		gmp		isl		libidn2		libtiff		libzip		mysql@5.6	packer		pwgen		webp
autoconf	carthage	dnsmasq		gettext		icu4c		jpeg		libmpc		libtool		mcrypt		nginx		pcre		re2c		wget
```
DjangoのApache2+mod_wsgiで環境によって「settings.py」を分ける方法

Django:1.10

ローカル環境、開発環境、商用環境…

通常、環境によってデータベースやAPI等の接続先は違うかと思います。

https://docs.djangoproject.com/ja/1.11/topics/settings/

上記サイトによると、

```python:wsgi.py
os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings'
```

これを書き換えることによって、変更できるらしいです。

でも、デプロイする度に書き換えるのはめんどう。

解決策は、以下サイトに記載されていました。

https://stackoverflow.com/questions/25489009/set-up-the-django-settings-file-via-django-settings-module-environment-variable

Apacheの設定でprocess-groupにsettingsの名前を指定して、それをwsgi.pyで使う方法ですね。

僕はWSGIProcessGroupを使って、1行追加するだけで済むように対応しました。

```django.conf
WSGIProcessGroup mysite.settings_pr
```

wsgi.pyの方はサンプル通りに実装。
ImportErrorをハンドリングすることで、ローカルはApache使ってない！みたいな場合でも対応可能になってますね。

これでデプロイする度に読み込むsettings.pyを書き換えて設定する必要がなくなりました。

ちなみに、settings.pyの定義を使う時は以下のように書きます。

```python:xxx.py
from django.conf import settings
api_url = settings.API_URL
```
タイトル：シンギュラリティへの道：ディープラーニングしてみる：初めての学習編

前回はこちら：https://qiita.com/fs-shinji-tomiyama/items/1b3343e9861b3bbc07b3

 概要
本エントリーは、早くシンギュラリティが実現して、生理食塩の水槽に脳ミソ一つでプカプカ浮かびながら、無限大の時間と空間を飛び回りたいと望んでいる筆者のポエムです。

#ディープラーニング
「シンギュラリティ　＝　超AI」ということで、まずは流行りのディープラーニングを実際に動かして体験してみようというのが本エントリの目的です。

#ガイド本
独学で新しい技術を学ぶ時、１冊はそのテーマの実装方法が詳細してある技術本を購入して、実際に動かして遊んでみるのが早道だというのが私の経験則です。

ディープラーニングについては、2年ぐらい前から、良い本がないかと本屋をチェックしていましたが、なかなか丁度良い感じのものがなかったのですが、昨年末にこちらの本を見つけ、今回はこの本で紹介されているサンプルをとにかく全部動かしてみることを目的にしました。

実装　ディープラーニング　オーム社　¥3,200-　税別
![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f3132303333302f61623361343432372d343863622d316133652d663635392d6532376332363638643964362e6a706567.jpg](https://qiita-image-store.s3.amazonaws.com/0/120330/e225709a-bf46-2586-1aef-70670e20ac59.jpeg)

以上、ここまでテンプレ


# 早速動かして。。。その前にお勉強
前回のエントリで、ガイド本の１章　概要と準備でディープラーニングのための環境構築まで進みました。
早速、GPUをグリグリしたいところですが、サンプルコードを実際に動かすのは、ガイド本の４章からで、その前に２章、３章があります。
いきなり４章にいってサンプルコードを動かすこともできると思いますが、初めてのディープラーニングという方は、「２章　ネットワークの構成」はしっかり読むことをお勧めします。
図解入りで、基本的なことが解説されているので、後でサンプルコードを動かす時に「なるほどなるほど、そういうことね」になるとと思います。
ディープラーニングを机上でお勉強する際にハードルとなる行列系の数式はなく、出てきても足し算と掛け算ぐらいです。
とにかく単純な足し算と掛け算をパラメータを変えながら膨大な回数行うことがディープラーニングの実態だというのがよく理解でき、GPU使うと早くなる理由もなんとなく感じることができました。

３章は基本用語の章で、ディープラーニングの具体的な手法の解説です。
数式もだいぶ出てきますが、そこは軽く目を通すレベルで頑張って読み進みますw
最初に読む際は、ディープラーニングの学習フェーズと推測フェーズの具体的な流れを把握した上で、その際に使われるエポックとかウェートとかバリデーションとかの用語がなんとなくわかるレベルでいいと思われます。
この後行う、データの準備や、サンプルプログラムの実行を進めるにつれて、その実態がより理解出るようになりました。

そして、いよいよ４章に突入し、サンプルプログラム実行！

と行きたいのですが、４章の前半ではディープラーニングに使うデータセットの準備を行います。
公開されている画像データセットのダウンロードを行い、データ拡張を行って学習用データを増やしたりと、おそらく実戦でディープラーニングを行う時に必要となるデータの作成の基本的な流れを抑えることができたと思います。

注意点としては、画像データや、この後使うモデルなどをダウンロードすることが結構ありますが、でかいファイルが多いです。
回線状態は良いに越したことはないですね。

#そしてディープラーニング！
学習用のデータ作成ができたら、お待たせしましたディープラーニングです。
最初のお題は画像認識によるクラス分けです。
サンプルプログラムのコードベースでの解説もしており、後でもいいのでコードをしっかり読めば何をやっているか把握できると思います。
サンプルコードは書籍の巻末に全て印刷されていますが、記載されているURLからダウンロードできますので、写経する必要はありません。
実行はターミナルからのコマンド実行です。パラメータの指定などが結構長くてタイポしやすですが、記載内容をしっかり確認しながら入力すれば動くはずです。
そして、初めての学習がこちら。。。
![21032886_1523915194340962_8991113534003316306_n.jpg](https://qiita-image-store.s3.amazonaws.com/0/120330/fc20d7f7-375c-ba98-e7a9-3916f72511c7.jpeg)

いやー、なかなか地味ですね。
しかし、書籍内で出力されている数値の解説もあり、「ほうほう、なるほど、この数値がこうなっていくのね」というのがわかり、学習している時間中の約40分間、ディープラーニングしている気分にどっぷり浸れます。
ちなみにGPUなしだと、今時のCPUでも１０時間ぐらいかかる処理だとのことです。

ということで、初めての学習を実行したところまでで、一旦終了。

続き：https://qiita.com/fs-shinji-tomiyama/items/28dd4d942cc47ae25026
うっかり忘れやすい nodist v0.8 による npm 更新コマンド

# [nodist](https://github.com/marcelklehr/nodist) v0.8 でnodeを更新するとき

```cmd:8系最新版にするコマンド例
nodist + 8
nodist npm match
```

- 一行目の「nodist + <version>」コマンドだと npm は更新されない
- 二行目の「nodist npm match」でやっと node に合わせた npm が更新＆選択される
- これ同時実行してくれるコマンドは見当たらなかった
- 不要になった npm を消すコマンドも見当たらなかった

```path:手動でnpm消す場合の標準格納パス
C:\Program Files (x86)\Nodist\npmv
```
GitHubでjsのレポジトリを見るときにhide-files-on-githubが便利

ずっと愛用しているんですが、hide-files-on-githubが本当に便利です。
.gitignoreや.editorconfigなど邪魔なファイルを一行にまとめてくれます。
もちろん展開して見ることもできます。

![hide.png](https://qiita-image-store.s3.amazonaws.com/0/15319/1eee7dda-4598-47ee-1342-0d7e675ac009.png)


## Install
Chrome ウェブストアからダウンロード出来ます。
なお、作者はGitHubスター数世界一位のsindresorhus氏です。

https://chrome.google.com/webstore/detail/hide-files-on-github/lpnakhpaodhdkleejaehlapdhbgjbddp

GitHub https://github.com/sindresorhus/hide-files-on-github
vvvvでたくさんのパソコンを一度にコントロールするboygrouping

#ボーイグルーピング
boygroupノードを使うと一つのPCから複数のPCを同時に操作することができます。
おおよその使い方は下記の公式サイトに書いてあり、google翻訳を併用すれば英語が読めなくてもどうにかなります
https://vvvv.org/documentation/boygrouping
ですがやはりちょっと不親切なところがあったので、このチュートリアルの流れに補足を付ける形でboygroupingが出来るようになるまでを説明します

#パソコンの準備　hardwareSetup
2台のPCを使うとして説明します。
操作するPC（以下サーバー）と操作されるPC（以下クライアント）は同じネットワークやwifi、あるいは同じローカルネットワークに繋いでおきます。

#IPアドレスを調べる
クライアントとサーバーをつなげるためには双方PCのIPアドレスを知る必要があります。IPアドレスはしばしば住所に例えられるものです。

まずサーバーPCでコマンドプロンプトを起動します
（コマンドプロンプトがわからない人は`windowsキー+R`を押して出てきたウィンドウに`cmd`と入力してenterを押すと起動できます）
ここに`ipconfig`と記入してenterを押すと色々な文字列が出てきます
![image.png](https://qiita-image-store.s3.amazonaws.com/0/159270/55da9b9d-0912-99fc-3aee-9791cfa59433.png)
IPv4 アドレスというのが目当てのIPアドレスです。メモしておきましょう
同じ手順でクライアント側のIPアドレスも確認してください。
ちなみに、同じネットワークにつながれたPC達は下のデフォルトゲートウェイが同じ値になってるはずです。


#クライアント側でvvvvを設定する　　Preparations on the Clients
※公式サイトのDirectory Structureは必須ではないので飛ばします。
公式の説明では当たり前のように`commandline parameter` というワードが飛び出してますが、ざっくり言うと特別な方法でvvvvを起動するということです

##cmdのターン
まずクライアントPCでコマンドプロンプトを起動します
（コマンドプロンプトがわからない人は`windowsキー+R`を押して出てきたウィンドウに`cmd`と入力してenterを押すと起動できます）
`C:\Users\ユーザー名>`のような文字列があると思います。これが今いる位置（ディレクトリ。フォルダとも言う）です。よく分からなければ聞き流してください。
ここからvvvvのソフトウェアがあるフォルダに移動します。

例
vvvv.exeのある場所(ディレクトリ)が`C:\program\vvvv45`の中だとします
コマンドプロンプトに`cd C:\program\vvvv45`と入れてenterを押すと
![image.png](https://qiita-image-store.s3.amazonaws.com/0/159270/0d1b92af-d80d-f566-37d6-c30a85f37eda.png)
こんな感じになります（イメージ図）
これでvvvv.exeのあるディレクトリに移動できました。:)

さて、`commandline parameter`というのはソフトウェアを実行するときに付けられる追加オプションみたいなものと思ってください。[詳しい説明](http://e-words.jp/w/%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%83%A9%E3%82%A4%E3%83%B3%E5%BC%95%E6%95%B0.html)
これをくっつけてvvvv.exeを実行することでクライアントモードのvvvvやサーバーモードのvvvvを起動できます。

クライアントPCではクライアントモードのvvvvを起動したいので
`vvvv.exe /client `の後ろにさっき調べたサーバーPCのIPアドレスをくっつけてコマンドプロンプトに記入しenterを押します
例）　vvvv.exe /client 192.168.1x.xx
するといつものようにvvvvの起動ウィンドウが現れて
![image.png](https://qiita-image-store.s3.amazonaws.com/0/159270/1edff0f6-8419-9e0a-275b-a92e1d3c4087.png)

しばらく経ってこういうウィンドウが出てきたら成功です。
白く潰したところにはサーバーPCのIPアドレスが書いてあります。
##サーバー側の設定
クライアントPCで行ったのと同じようにコマンドプロンプトを起動し、vvvv.exeのあるディレクトリまで移動します。
サーバーモードのvvvvを起動したいので`vvvv,exe /server`と記入してenterを押します
![image.png](https://qiita-image-store.s3.amazonaws.com/0/159270/c07c1d29-323b-1e79-c538-aa1b3187833e.png)
いつものと変わらない白紙パッチが出てきます。タスクバーの名前が「SERVER」となってたら成功です

#クライアントとサーバーを同期させる
あとの作業は殆どサーバー側で行います。

サーバーのvvvv上で`boygroup(VVVV server)`を出します
clientピンに先程調べたクライアントのIPを入れます
![image.png](https://qiita-image-store.s3.amazonaws.com/0/159270/90772cbe-78f4-a2d7-c33b-0f1eaed05734.png)
正しく設定できれば出力のconnectedピンの値が1になりクライアント側に新しい白紙のパッチが表示されます。
これでboygroupingが完了しました

#クライアントと同期するノード、同期しないノード

![image.png](https://qiita-image-store.s3.amazonaws.com/0/159270/7d882d9d-9ad6-2cef-b766-599c749fbfca.png)

クライアントと同期したいノードは選択できます。ノードを選んで`ctrl+B`を押すとノードが青色になり、クライアント側にも表示されるようになります。
つまり灰色のパッチはクライアント側から見えないということです

同期した青いノードはサーバーでの変更がリアルタイムにクライアントにも反映されます。
クライアント側でノードを追加したり、ピンの値をいじることも可能です。


説明は以上になります
複数のUbuntuバージョンを入れた、マルチブートUSBメモリを作る

# はじめに
Ubuntuを使っているとインストール・動作確認用にLTSと非LTSそれぞれで現行バージョンと旧バージョンの計4種類のUSBメモリが欲しくなります。しかしUSBメモリは8GBでも700円ほどして小容量は割高ですし、まとめられれば物理的にスマートです。

ISOファイルから直接ブートさせることができれば作るのがとても簡単で理想的なのですが、それだとブート時にRAMディスクを使う必要がありなかなか大変です。しかし、UEFI+rEFIndであればISOファイルを展開する必要はあるものの、現物合わせでインデックスを作る必要がなく比較的簡単に作れます。

# USBメモリにパーティションを作る
ここではパーティションの作成に、GUIでパーティションの操作ができるGPartedを使っていますが、GDISKなどほかのものを使っても構いません。

まず「表示→デバイス情報」からパーティションテーブルがGPT（GUIDパーティションテーブル）になっているか確認します。GPTになっていない場合「デバイス→パーティションテーブルの作成」からGPTでパーティションテーブルを作り直してください。

それから次の表のようにパーティションを作ります。2.5GiBは2560MiBです。

| ファイルシステム | ラベル   | 容量   | フラグ   |
|:----------------|:---------|-------:|:---------|
| fat32           |          |  35MiB | boot,esp |
| ext4            | lts-a    | 2.5GiB |          |
| ext4            | lts-b    | 2.5GiB |          |
| ext4            | nonlts-a | 2.5GiB |          |
| ext4            | nonlts-b | 2.5GiB |          |

FAT32の小容量パーティションがESP（EFIシステムパーティション）です。ここにブートローダーを配置します。今回は1MiBも使わないため、小容量で構いません。GPartedだと33MiB以上でしか作れないので（理由は分かっていません）、ここでは35MiBにしています。ドライブの先頭パーティションは1MiBオフセットされますが、パーティションサイズを調整して、フラッシュメモリのブロックサイズである4MiB単位にパーティション境界が来るようにしましょう。

EXT4の大容量パーティションがUbuntuのISOイメージを展開するパーティションです。ISOイメージが1.5GiBほどですので、余裕を持って2.5GiB取っています。パーティションの数は少なくても、多くても構いません。

ブート時にパーティションラベルが判別の手段になります。分かりやすくするのであればバージョンを明記したラベルにしてください。ラベルはマウントしていないときならいつでも変更できます。

パーティションを作り終わったらディスク(gnome-disks)からUSBメモリの全パーティションをマウントします。

# ESPにrEFIndをコピーする
ブートローダーにはrEFIndを使います。[rEFInd \- Browse Files at SourceForge\.net](https://sourceforge.net/projects/refind/files/)から最新のrefind-bin-<var.>.zipをダウンロードして解凍してください。

それから次のようにEFIファイルをコピーし、設定ファイルを作成してください。

```
refind/refind_x64.efi -> <ESP>/EFI/BOOT/BOOTX64.EFI
refind/drivers_x64/ext4_x64.efi -> <ESP>/EFI/BOOT/drivers/ext4_x64.efi
```

```&lt;ESP>/EFI/BOOT/refind.conf
timeout 20
textonly
scanfor internal,external,optical
```

# rsyncでISOイメージをコピーする
ISOイメージを右クリックし「別のアプリで開く→ディスクイメージマウンター」を選択すると、ISOイメージをマウントできます。選択しても/media/\<user>配下にマウントされない場合は、ディスク(gnome-disks)を開き、手動でマウントボタンを押す必要があるかもしれません。

それからターミナルを開きrsyncでマウントしたISOイメージをさきほど作ったEXT4パーティションにコピーします。

```

# 初回
sudo rsync -rlptv '/media/<user>/<Ubuntu 17.04 amd64>/' '/media/<user>/<lts-a>'

# 2回目以降
DEST='/media/<user>/<lts-a>' &&
sudo rm "$DEST/casper/filesystem.squashfs" &&
sudo rsync -rlptv '/media/<user>/<Ubuntu 17.04 amd64>/' "$DEST"
```

コピー元のパスは、末尾にスラッシュを付けます。2度目以降のコピーでは「--delete」オプションを加えてください。

終わったらISOイメージのマウント先を右クリックしてアンマウントします。

# 使う
操作がすべて終わったらUSBメモリを抜き取ります。安全を見るなら、ディスク(gnome-disks)からUSBメモリの全パーティションをアンマウントしてから抜き取ってください。抜き取ったら、使いたいマシンに挿して起動させます。UEFIでUSBメモリをブート順1位に設定する必要があるかもしれません。

起動したらrEFIndの画面が表示されるので、希望のカーネルを選んでください。
ebay ユーザートークンの取得

##ebayのユーザートークン(OAuth)の取得
テストも兼ねているため、サーバー側の情報はすべてSandboxのもの。
まず、全体のソース

```php:usertoken.php
<?php
 //テストのため、SandboxのIDを使用した。
 $devID  = 'My Dev ID';
 $appID  = 'My App ID';
 $certID = 'My Cert ID';
 $runame = 'My RuName';

 //ログインフォームからリダイレクトした際に付加されるパラメーターを取得
 $_SESSION['code'] = $_GET['code'];
 //ユーザートークンのリクエストURL
 $token_url = 'https://api.sandbox.ebay.com/identity/v1/oauth2/token';
 //リクエストヘッダーのAuthorizationに挿入する変数
 $authorization =  base64_encode($appID.':'.$certID);

 //ユーザートークンのリクエストボディ
 $request_body = [
   'grant_type' => 'authorization_code',
   'code' => $_SESSION['code'],
   'redirect_uri' => $runame
 ];
 //ユーザートークンのリクエストヘッダー
 $request_header = [
   'Content-Type:application/x-www-form-urlencoded',
   'Authorization:Basic '.$authorization
 ];

 //念の為、リクエストの内容を確認できるようにしておく
 echo "<pre>";
 print_r($request_body);
 print_r($request_header);
 echo "</pre>";

 $curl = curl_init();

 curl_setopt($curl, CURLOPT_URL, $token_url);
 curl_setopt($curl, CURLOPT_POST, true); //POST
 curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($request_body));
 curl_setopt($curl, CURLOPT_HTTPHEADER, $request_header);
 curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
 curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
 curl_setopt($curl, CURLOPT_HEADER, true);

 $response = curl_exec($curl);

 $header_size = curl_getinfo($curl, CURLINFO_HEADER_SIZE);
 $response_header = substr($response, 0, $header_size);
 $response_body = substr($response, $header_size);
 $result = $response_body;

 curl_close($curl);

 echo "<pre>";
 print_r($result);
 echo "</pre>";

?>
```

##エラーしか帰ってこない。そして、その原因
リクエストの送信が出来たが、下記エラー文が帰ってきた。
{"error":"invalid_grant","error_description":"the provided authorization grant code is invalid or was issued to another client"}
ebayのフォーラムでも検索してみたがソースを見る限り、間違っていないようだったのであれこれいじってみて2時間以上。
思いつきでいじったところ、原因はURLに付加されたパラメーターの処理でした。

```php:usertoken.php
 //エラーが出ていた時
 $_SESSION['code'] = urlencode($_GET['code']);

 //urlencodeを外したらうまく行った
 $_SESSION['code'] = $_GET['code'];
```

ebayのドキュメントやフォーラムで他の人のソースを見る限りだと、urlencodeでうまくいっているみたいだから、正直コレであっているか解らんが、きちんとユーザートークンが取得できたので、とりあえずコレで進めていくしか無い。

##参考
[WebAPIを叩く(curl)](https://qiita.com/re-24/items/bfdd533e5dacecd21a7a)