OmniAICreator/Qiita-1.07M huggingface dataset:
VSCode用のElectron+TypeScript+Vue+Webpackの開発・デバッグ環境のたたき台を作った

# 概要

`Electron`でデスクトップアプリを作ろうと思い立ち、
`TypeScript`に`Vue`を合わせた開発環境を構築しました。

バンドラーには`Webpack`使ってます。

ついでに`VSCode`でならMain/Rendererプロセスのデバッグも`launch.json`に設定済みなので、興味あればご一読あれ。

* 参考サイト

https://qiita.com/ghqian/items/a6325bc30676c7fa7b5d
https://qiita.com/mamo/items/084039c3e6d703b7b45f

# 環境

* OS

Windows10
※MacOSでもlaunch.jsonを少し変える程度です`electron.cmd` → `electron`

* エディター

|項目|Ver|
|---|---|
|VSCode|1.19.2|
|Debugger for Chrome|4.2.0|

* ミドルウェア

|項目|Ver|
|---|---|
|Node.js|9.8.0|
|Electron|1.8.2|
|TypeScript|2.7.2|
|Vue.js|2.5.14|
|Webpack|4.0.1|

# 使い方

```bash
# git clone
$ git clone https://github.com/rog-works/electron-with-ts
$ cd electron-with-ts

# `--no-optional`はMacOSでしかインストール出来ないパッケージがあるので、念のためつけてます
$ npm install --no-optional

# JSのバンドル
$ npm run bundle

# アプリケーション起動
$ npm run start
```

# デバッグ

* `VSCode`の拡張機能である`Debugger for Chrome`をインストール

<img width="478" alt="無題.png" src="https://qiita-image-store.s3.amazonaws.com/0/179791/1b387173-cbf4-cd98-7d6a-c64a0e792837.png">

* デバッグの種類を選んで`F5`!

<img width="634" alt="無題2.png" src="https://qiita-image-store.s3.amazonaws.com/0/179791/90463190-0765-4468-ffab-6d2f64e341cc.png">

# 最後に

最初は話題の`Parcel`使おうと思って色々悪戦苦闘したものの、ソースマップが上手く設定できない・ホットロードが外せない(オプションで`HMR`を有効にして欲しかった)と言う結果に至って諦めました。

`Vue`は簡単に使いたかったので、変な使い方しているかもですが、`Vue`初心者なのでご容赦を

他、記事に記載していない細かなことはGitHubのリポジトリを参照してください

以上
ユニコードエスケープ形式文字(¥u3042 etc)のデコード方法


ユニコードエスケープ文字のデコード方法についてのメモ。

# 結論
JDKに用意されている native2ascii に reverse オプションをつけて使用する。

```java:native2ascii
native2ascii -reverse before.properties after.properties
```

通常文字→ユニコードエスケープへのエンコードは、reverseオプションを外すことで実現できる。


以上。
AWS WorkMailでログイン後パスワードを変更する方法

AWS WorkMail　でログイン後のパスワード変更方法です。

ログイン後右上の歯車ボタンをクリックします。
<img width="1387" alt="1.png" src="https://qiita-image-store.s3.amazonaws.com/0/50783/8dd5a9c7-80a6-0d33-9db1-5d67b5f97dca.png">

クリック後の画面にある「Change password」をクリック
<img width="1387" alt="2.png" src="https://qiita-image-store.s3.amazonaws.com/0/50783/2cabc3dd-7916-a956-72a2-e7569a089f64.png">

ログイン画面に遷移するので、現在のパスワードでログインしてください。
<img width="1387" alt="3.png" src="https://qiita-image-store.s3.amazonaws.com/0/50783/7f5d0336-4aed-b8f8-5fc1-dd4dc3cb4e3f.png">

ログイン後、パスワード変更画面になるのでパスワードを変更してください。
<img width="1387" alt="4.png" src="https://qiita-image-store.s3.amazonaws.com/0/50783/b80eef2a-1311-86b7-ae30-01c093cf1145.png">
Ubuntu | Inkscape > 1mmあたりのpx数 > 3.5程度 (環境依存?)

```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)
scipy v0.19.1
geopandas v0.3.0
MATLAB R2017b (Home Edition)
ADDA v.1.3b6
gnustep-gui-runtime v0.24.0-3.1
INKSCAPE v0.91
```

関連: [Tinkercad + レーザーカッター > MDF積層状の構造物を作る案 | layered Delta Flyer v0.1-v0.3](https://qiita.com/7of9/items/893bc07a82bed2d2341e)

レーザーカット用の.svgファイルを作成している。
3mmのマージンがオブジェクト間で必要と聞いている。

INKSCAPEでは距離を測ることができるが、その距離はpxで表示される。

1mmは何pxなのか?

ファイルのサイズはA4 (210 x 297 mm)としている。
距離測定ツールで測るとおよそ 740 x 1040 pxとなる。

740 / 210 = 3.52 px/mm
1040 / 297 = 3.50 px/mm

だいたい3.50px/mmなのだろう。
（設定によって変化する可能性はある）。

上記の場合、3mmのマージンをとるには下記より１ピクセル程度あければよさそう。

3mm / 3.5(px/mm) = 0.85
マイニングリグのGPUの不調を察知してSlackに通知し自動でOSを再起動するツール

手前味噌エントリです。

ethOSで複数のGPUを駆使していると困った事がよく起きてました。

- 2〜3日ほど連続稼動しているとGPUがサボりだす(サボってても1枚あたり35Wほど電気を食べるため、無視はできない)
- autorestart という設定項目が local.conf 等にあるのだけど、機能しているところをまだみたことがない
- Web上( {rig-unique-address}.ethosdistro.com ) でリグの稼働状況を確認できるのですが、
情報の PULL はあっても PUSH がないという状態

![ethOS.png](https://qiita-image-store.s3.amazonaws.com/0/8751/56875b87-960f-9753-4dcd-2fcc5b037cd9.png)


つまり、 **自発的に情報を取りに行かないとわからないのは困る、何かあったらあちらから通知を送ってほしいし、適切に対処してほしい** という状況です。

# よろしい、ならば自動化だ

という事で、作ったのがこちら https://github.com/uupaa/tools-ethos

- node.js + ESModules
- 数分に1度、ethOSの稼働状況やGPUの稼働状況を監視する
- GPU がサボりだしたら Slackに通知して、OSをリブートする
- /etc/rc.local に追加しておけば OS起動時に自動的に起動して監視を行う
- 問題発生時の挙動を事前にテスト可能

といった機能があります。

Slack に来る通知はこのようになります。

<img width="739" alt="スクリーンショット 2018-03-11 13.40.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/8751/4e50c2e8-ffca-fc7c-6971-d1d0a9bfda60.png">


ethOS version 1.2.9 で動作を確認していますが、
おそらく version 1.3.0 以上でも動作すると思います(だめそうだったらコメントいただけると)
【vimめも】 1. vimについて



会社のPCのスペックが低く、IDEは辛い・・・
となったのがキッカケでvimを使い始めました(私もまだvim歴1年半ほど）
ただ、、
vimはIDEのみを使ってきた人にとっては
抵抗感が強い?と思ったので、
まずはどういうものか？や何を大事にするべきか？などを
伝えていきたいと思います

## Vimの特徴とは?

- OSを選ばない
- CUIで動く
- 軽い
- 設定の自由度が高い
- キーマップの幅が広い
- 日本人の開発者が多い（コミュニティが厚い）
- プラグインが多い


## 通常の操作の流れ

1. ファイル選択（マウス or ファイル探索）
2. 編集箇所に移動（マウス or 十字キーで1文字ずつ）
3. 文字を入力（キーボード）

マウス→キーボード→マウス　の繰り返し。


## Vimの操作の流れ

1. ファイル選択（キーボード Normalモード）
2. 編集箇所に移動（キーボード Normalモード）
3. 文字を入力（キーボード Insertモード）

キーボードのみ！ステキ！！


## Vimで目指すところ

- 少しでも自分のなかで無駄を感じたらすぐ設定を変更！
- 設定を増やし、操作を減らす
- マウスを使わない(キーボードのみで完結するようにする)
- ソースコードだけでなくVimで扱える範囲を増やす
  - メモ(markdownなど)
  - コマンドラインの操作など

なにも手を加えていないVimは
「ひっかく」しか覚えてないポケモンと一緒

## vimでこんなことができる

- ファイラー
- ファイルのあいまい検索、文言検索
- 入力補完、入力テンプレート
- 画面分割、画面移動、サイズ変更
- タグジャンプ（定義元）
- タブ機能
- コンソール

## まとめ

vimで出来ることは本当に広いです

日本人開発者が多く、vim使用者も多いのでvimのイベントなどもよく開催されています
わからないことがあればどんどん質問しましょう

`人のvimrcを使うのは、人のパンツを履くのと同じ` と仰っていたvimmerの方もいました
それくらい人それぞれのスタイルになっていきます

だれかの設定を丸コピして使うのではなく
自分にあった、自分だけのvimへと育てていきましょう！！



次回: [【vimめも】 2. normalモードの基本的な操作](https://qiita.com/r12tkmt/items/0e339b642db8693cd375)
『ブレスツールが現在のブートディスクを設定できませんでした。』エラーの対処方法

# 症状

Mac Pro (Mid 2010) OS 10.11.6 で起動ディスクを変更しようとしたところ ``ブレスツールが現在のブートディスクを設定できませんでした。`` というエラーメッセージが表示され設定変更できないトラブルがおこりました。

# 解決方法

PRAM(NVRAM) をリセットすることでなおりました。

https://support.apple.com/ja-jp/HT204063

# はまったポイント

USBキーボードをハブ経由でつなげていたからかちゃんとキー入力しているにも関わらずPRAMリセットされない状況が続きました。ちゃんと本体に直差ししましょう。

# 補足

ブレスツールが云々かんぬんでPRAMリセットしましょうというトラブルシュートになかなかたどりつかなかなかったので、他の人がはまったときにたどりつきやすくるため Qiita に投稿しました。

また、PRAMクリアすることでうちのMacProは起動時間も早くなりました。

- 今まで: ``電源ボタン押す（黒画面）→(4秒ぐらい経過)→起動音→（20秒ぐらい経過）→灰色``
- リセット後: ``電源ボタン押す（黒画面）→(4秒ぐらい経過)→起動音→（2秒ぐらい経過）→灰色``

※これもGoogle先生に聞いてもなかなか解決方法を見つけられなかった案件でした。

ハード周りでなんかおかしいなぁというときはPRAMリセットするのが良さそうです。
Anacondaでopencvをインストール

プログラムをする上で環境を整える作業が一番大変で、躓きやすいステップ…過去になんども苦しめられました。中でも一番四苦八苦したのが、画像処理ライブラリのopencvでした。
pipでインストールしてもimportするとエラーが返ってきて困り果ててました。
最近になって簡単にインストールできることがわかったので、備忘録としてここに残します。

# Anacondaのインストール
pythonをやるのであればパッケージの管理を簡単に行うことができるAnaconda(GUIver)をインストールすることをお勧めします。下記のリンクを参考にインストールを行います。

- [Anaconda で Python 環境をインストールする](https://qiita.com/t2y/items/2a3eb58103e85d8064b6)

AnacondaではJupter Notebookや仮想環境が容易に作れるなど優れた点が多いので、pythonを始めたばかりの方には特にお勧めです。

# 仮想環境の構築
Anacondaではコマンド１行で仮想環境が構築できます。

```:仮想環境構築
conda create -n [name] python=[version] anaconda
```

構築した環境に移行するには

```:環境移行
source activate [name]
```

```:環境離脱
source deactivate
```

また構築した環境一覧を表示は

```:一覧表示
conda info -e
```

削除は

```:環境削除
conda remove -n [name] --all
```

# パッケージのインストール
インストールしたAnaconda-NavigatorでEnvironments→構築した環境を選択するとインストールされているパッケージの一覧が表示されます。
ドロップダウンリストから「Not installed」を選択し、searchからインストールしたいパッケージを検索します。
今回はopencvをインストールします。
<img width="1280" alt="img1.png" src="https://qiita-image-store.s3.amazonaws.com/0/202715/953c30a7-9b93-04a0-54e0-6bd6e3de5aea.png">

# インストールできたか確認
仮想環境を構築した直後では当然ModuleNotFoundErrorになってしまいます。
<img width="585" alt="importError.png" src="https://qiita-image-store.s3.amazonaws.com/0/202715/1263f214-5653-e4da-65a6-f9518a0c185b.png">

しかしAnacondaでインストールしたあとではimportできていることが確認できます。
<img width="585" alt="importclear.png" src="https://qiita-image-store.s3.amazonaws.com/0/202715/9a96aee0-26d0-98e1-e74c-355c5ad0840b.png">
iPhoneのカメラを素早く起動するには

iPhonを下から上にスワイプすると下記のようにコントロールセンターが開きますので、
右下のカメラアイコンをタップすると素早くカメラを起動することができます。
<img width="375" alt="IMG_4655.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/242423/f807b3bf-58ec-ad88-8924-c264c615d9d7.png">
パスワードジェネレーター　改良版


```python:pwj.py
#coding: utf-8;

#パスワードジェネレーター ver1.0 (数字　アルファベット小文字大文字混合)
import random
import re

print("何ケタのパスワードにしますか？")

num = list(range(10))

eng = "abcdefghijklmnopqrstuvwxyz"
ENG = list(str(eng)+str(eng.upper()))

pw = num + ENG

user_select = int(input())
number = random.sample(pw, user_select)        # 数字リスト  

dic =str.maketrans("", "", " ,'")              # 置換する文字が少ない場合はreplaceで対応可。後の変更を想定してtranslate()関数使用。

pwd = str(number).translate(dic)
print(pwd)

```
UbuntuにLaravelをインストールする

お仕事でLaravelを使いそうなので、しれっとPHPの環境を整備したときの作業メモ。

チュートリアルに従って作業。
https://readouble.com/laravel/5.6/ja/installation.html

## coposerからinstallerを使用

```
$ composer global require "laravel/installer"
```

インストール先

```
.config/composer/vendor/bin/
```

この配下にlaravelコマンドまでのsymbolic linkがあるので
.bashrcにパス追加しておく。


で、確認。

```
$ laravel -v
Laravel Installer 2.0.1

Usage:
  command [options] [arguments]

Options:
  -h, --help            Display this help message
  -q, --quiet           Do not output any message
  -V, --version         Display this application version
      --ansi            Force ANSI output
      --no-ansi         Disable ANSI output
  -n, --no-interaction  Do not ask any interactive question
  -v|vv|vvv, --verbose  Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug

Available commands:
  help  Displays help for a command
  list  Lists commands
  new   Create a new Laravel application.
```

よさげ。

あとは laravel new hogehogeとかしてプロジェクトの雛形を作る。
Ubuntu | Inkscape > .svgファイルから余分なパスを削除する手順

```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)
scipy v0.19.1
geopandas v0.3.0
MATLAB R2017b (Home Edition)
ADDA v.1.3b6
gnustep-gui-runtime v0.24.0-3.1
INKSCAPE v0.91
```

関連: [Tinkercad + レーザーカッター > MDF積層状の構造物を作る案 | layered Delta Flyer v0.1-v0.3](https://qiita.com/7of9/items/893bc07a82bed2d2341e)

### .svgファイルの修正

レーザーカッター切断を依頼する.svgファイルを見ていると、ところどころばらばらになりそうなパスが見られる。

Inkscapeではパスを削除するにはどうするか。

1. パスを選択
2. [選択したノードでパスを切断]を選択
    - 参考: https://inkscape.paix.jp/manual/tools/node-tool/connect/\
3. Deleteキー(パスが削除される)
4. 近傍のパスを順次Deleteキーで削除

https://youtu.be/jW2jthVmnGY
Pythonでprogress barを出す方法

#はじめに
Pythonで重たいスクリプトを動かしている時に、今どこやっているのかなと気になったことはありませんか？そんな時に以下のコードをお使いください。

**@shiracamus**さんからシンプルな書き方を教えて頂いたので更新しました。
ありがとうございます。

```bar.py
import sys

def flush_progress_bar(barname, rate):
    number = int(rate/0.05)+1
    #元々の投稿
    #bar = ''.join(number*['#']+(20-number)*['-'])
    #sys.stdout.write("\r"+barname+" : ["+bar+"] {0:03.2f}%".format(rate*100));

    #@shiracamusさんから教えて頂いたシンプルな書き方
    bar = ('#' * number).ljust(20, '-')
    sys.stdout.write(f"\r{barname} : [{bar}] {rate*100:.2f}%")

def main():
    N = 1000000
    for i in range(N):
        flush_progress_bar("name",i/N)


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

実行すると以下のようになります。
<img width="1429" alt="スクリーンショット 2018-03-11 12.57.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/182836/4e799daf-d24a-508d-4d74-106569eea425.png">


別のモジュールを使った方法もいくつかあるようですね。
古いRubyを使う時に気をつけること

常に最新の ruby が使えればそれが一番だけど、実際はそうもいきません。
仕事で、ちょっと古いバージョンの ruby を使うことはしょっちゅうあります。
そして厄介なことに、今の ruby では大丈夫なコードでも、古い ruby だと問題が発生する場合があるんですよね。
パッと思いついたものを忘備録としてメモしました。他にもあったら教えてください。

## ruby 2.6以前

### self を付けて private メソッドを呼び出すことができない

```ruby
class Foo
  def test
    self.private_foo
  end

  private

  def private_foo
    puts 'private!!'
  end
end

Foo.new.test
#=> NoMethodError (private method `private_foo' called for #<Foo:0x00007f40a04bced0>)
```

ruby 2.6以前だと、private メソッドは基本的にレシーバ無しで呼び出す必要がありました。
2.7からは、 `self.private_foo` のような呼び出しが可能になりました。

## ruby 2.4以前

### Objectクラスの定数を、そのサブクラスから参照できてしまう

```ruby
CONST = 1

class A
end

class B
end

A::CONST
#=> 例外にならず、1が返される

A::B
#=> 例外にならず、Bクラスが返される
```

ruby 2.4以前で、Objectクラスの定数をそのサブクラスからガッツリ参照できてしまう問題です。
`A.superclass #=> Object` なので、確かに↑の動作は正しいんですが、やっぱり直感的ではないですよね。
Rails5 以前では、「const missing の発生を期待しているのにトップレベルの定数を参照しちゃう」という事故が起きたりしてました。

ruby2.5 からは、上記のような参照を行わなくなりました。


## ruby 2.1以前

### ユーザの入力に対して、 `#to_sym` を使ってはいけない。

（ヤバい例）

```ruby
if params[:aaa].to_sym == :xyz  # ここの to_sym がヤバい
  # ...処理...
end
```

ruby2.1 以前は、「一度作ったSymbolを絶対に忘れない」という仕組みになっています。ユーザの入力(paramsなど)に対して `to_sym` してしまうと、メモリリークを引き起こす可能性があり、とても危険です。

ruby2.2 からは Symbol GC という機能が導入され、気を遣う必要がなくなったので、いくらでも `to_sym` してください。
【Android】Androidでグラフを描画する - 線グラフ編

# 00. はじめに
Androidでアプリ開発を行っているとグラフを描画したい場面が発生する場合があります。
そこで今回は、Android用グラフ描画ライブラリ『MPAndroidChart』を使用し線グラフを描画する方法を見ていきます。
ただし、ごちゃごちゃ書くのはしんどいので基本的にGithubに上げたサンプルアプリの該当ソースへのリンクを張るだけにします。

# 01. projectへのMPAndroidChartの導入
build.gradleに以下を追加します。
この文を書いているときの最新はv3.0.3なので、それを使用します。

```gradle
android {
    repositories {
        maven { url "https://jitpack.io" }
    }
}

dependencies {
    compile 'com.github.PhilJay:MPAndroidChart:v3.0.3'
}
```

# 02. 静的な線グラフ
はじめからグラフ化する値が決まっているグラフの場合
## 02-01. 静的なグラフの描画
<img width=50% src="https://qiita-image-store.s3.amazonaws.com/0/235452/a2ea0d18-9ed5-9a2e-76f5-4745ac8536c9.png">

ソース | https://github.com/entan05/MPAndroidChartSample/blob/master/app/src/main/java/jp/team/e_works/mpandroidchartsample/activity/StaticLineGraphActivity.java
レイアウト | https://github.com/entan05/MPAndroidChartSample/blob/master/app/src/main/res/layout/activity_static_line_graph.xml

## 02-02. 静的なグラフの描画(複数)
<img width=50% src="https://qiita-image-store.s3.amazonaws.com/0/235452/e4e66157-926d-4307-5b6c-0a33468522bc.png">

ソース | https://github.com/entan05/MPAndroidChartSample/blob/master/app/src/main/java/jp/team/e_works/mpandroidchartsample/activity/StaticMultiLineGraphActivity.java
レイアウト | https://github.com/entan05/MPAndroidChartSample/blob/master/app/src/main/res/layout/activity_static_multi_line_graph.xml

## 02-03. グラフの保存
描画しているグラフを画像ファイルとして保存することができる。
まず、manifestでストレージへの書き込み権限を設定する。

```xml
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
```

LineChart#saveToGallery(String, int)をコールすることで保存することができる。

```java
if(mLineChart != null) {
    mLineChart.saveToGallery("saveFileName", 100);
}
```

第一引数が保存ファイル名、第二引数がクオリティ。
保存先は

```
/sdcard/DCIM/
```

となる。

# 03. 動的な線グラフ
グラフに描画する値が後から追加で来る場合
キャプチャ動画はfpsが出ていない感じだったので略
## 03-01. 動的なグラフの描画
LineChart#moveViewToX(float)でもオシロスコープのようにすることができるが、ズームをしていると描画位置更新の際にy座標を所定の位置に戻され見ずらいので、LineChart#moveViewTo(float, float, AxisDependency)を使用している。

ソース | https://github.com/entan05/MPAndroidChartSample/blob/master/app/src/main/java/jp/team/e_works/mpandroidchartsample/activity/DynamicLineGraphActivity.java
レイアウト | https://github.com/entan05/MPAndroidChartSample/blob/master/app/src/main/res/layout/activity_dynamic_line_graph.xml

## 03-02. 動的なグラフの描画(複数)
ソース | https://github.com/entan05/MPAndroidChartSample/blob/master/app/src/main/java/jp/team/e_works/mpandroidchartsample/activity/DynamicMultiLineGraphActivity.java
レイアウト | https://github.com/entan05/MPAndroidChartSample/blob/master/app/src/main/res/layout/activity_dynamic_multi_line_graph.xml

# 98. 参考
MPAndroidChart | https://github.com/PhilJay/MPAndroidChart
MPAndroidChartを使って「リアルタイム更新のセンサーデータ時系列グラフ」のサンプルを作ってみた | https://qiita.com/LyricalMaestro0/items/2ec88b4ecb85b18d0468

# 99. 更新履歴
|日付|内容|
|:--|:--|
|2018/03/11|投稿|
|2018/03/11|静的なグラフのキャプチャ画像を追加<br>動的なグラフのキャプチャ動画を載せない旨を追記|
ビルトイン関数と同じ変数名を使いたいときの対策

# はじめに

Pythonでは変数名と関数名の名前空間が分かれていません。こういうのをLISP-1形式というらしいですがそもそもPythonの場合、関数名とは関数オブジェクトを指す変数です。分けるという発想自体がありません。

本編に入る前に私が前にやらかしたボケをご紹介しましょう。

```py
>>> import json
>>> json = json.dumps({'abc': 123})
>>> json = json.dumps({'def': 456})
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'str' object has no attribute 'dumps'
```

あれ？(。´･ω･)?
はいそうです。関数と同様、モジュールも名前空間は分離されてません。JSON代入する変数だからとjsonって名前にするとモジュール参照している変数が上書きされます。大文字小文字は区別してくれるので以下のように書きましょう。

```py
>>> import json
>>> JSON = json.dumps({'abc': 123})
```

・・・冗談です。こんな書き方してるやつ見かけたらグーで殴ります。

前置き長すぎるのでそろそろ本題に入ります。

# Pythonの名前検索とビルトイン関数

Pythonが名前を探す際には次の順番で探されます。

1. ローカル変数
2. グローバル変数
3. ビルトイン関数

クロージャの話もありますが本筋じゃないので省略。
というわけで、以下のように書くと簡単にビルトイン関数をつぶせます。（後述するように正確に言うとつぶす＝その関数が完全に使えなくなるわけではないのですが感覚的な意味でつぶすと言う言葉を使っています）

```py
>>> sum = 1 + 2 + 3
>>> sum([1, 2, 3])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'int' object is not callable
```

まあこの例のようなコード書く人はいないと思いますが(笑)、言いたいことは**Pythonのビルトイン関数ってよく使う変数名が結構多い**ということです。idとかlenとかmaxとか。
以降、思いつき（半分ネタ）も含めてこれにどう対応していけばいいかを説明します。

# 変数名の前か後ろに_を付ける

敬虔なPythonistaの皆さまであれば毎日三回ビルトイン関数名を暗唱されていることと思います。そう、ビルトイン関数と同じ変数名を使うなどそもそもありえないということです。

というのは冗談、でもって私は敬虔なPythonistaじゃないので全ビルトイン関数の名前を暗記はしてません。ただ、Pycharmなどの開発環境を使ってると「お前これビルトイン関数隠してるじゃねえかぼけー」と言ってくれます。そういう場合は前か後ろに_を付ければビルトイン関数をつぶすことありません。

```py
>>> sum_ = 1 + 2 + 3
```

でもはっきり言ってダサい。

# 気にしない

私が主にやっている（？）方法です。つぶしても気にしません。
もう少しちゃんと説明すると**つぶすと言ってもせいぜいその関数内**、広くてそのモジュール（ファイル）内です。一つの関数で、ある名前をいわゆる変数として使いたいが同名のビルトイン関数も呼び出したいという状況はまずないでしょう。ていうかその場合、普通は変数の名前を変えます（「はじめに」でお見せしたようなボケを除く）

というわけで私は気軽にビルトイン関数と同じ名前を使ってます。

# 要らなくなったらdelする

delすると変数名がローカル変数一覧やグローバル変数一覧から取り除かれます[^1]。そうすると名前検索の際につぶされてたビルトイン関数まで行くようになります。つまりこういうことです。

[^1]: 念のため。両方一気に取り除かれるわけではありません。そのスコープの一番内側にある変数名が取り除かれるという意味です

```py
>>> sum = 1 + 2 + 3
>>> sum([1, 2, 3])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'int' object is not callable
>>> del sum
>>> sum([1, 2, 3])
6
```

# \_\_builtins__を使う

ビルトイン関数はビルトインモジュールに定義された関数です。
変数一覧には初めから\_\_builtins__というものが定義されており、このモジュールを明示的に指定することでつぶした後もビルトイン関数が使えます。

```py
>>> sum = 1 + 2 + 3
>>> __builtins__.sum([1,2,3])
6
```

# まとめ

というわけで変数名とビルトイン関数の関係、同じ名前の変数を使いたいときの対策を紹介してきました。方法としては以下のいずれかになります。

1. 前か後ろに_をつける
2. 気にしない
3. 要らなくなったらdelする
4. \_\_builtins__を使う

# 余談

「つぶすと言ってもせいぜいそのファイル内だけだ、気にするな」と書きましたがビルトインモジュールも含めて考えてみると以下のようなことができるなと思いました。

```py:override_builtins.py
import builtins

def fake_sum(*args):
    print('Hello!')

builtins.sum = fake_sum
```

```py
>>> import override_builtins
>>> sum([1,2,3])
Hello!
```

できるというだけでこれを使うとビルトイン関数上書きできるぜ！と推奨しているわけではまったくありません。敬虔なPythonistaではありませんが完全に邪道です。

ちなみにコンソールでは\_\_builtins__に代入できるのにファイルに書くとエラーになるんですね。なんかの実行方法の違いだとは思いますが。
家庭内の定期的なタスクについてもWunderlistで管理したい(その１)

## 〇前提 ##
我が家では主に買い物リストとしてWunderlistを使用していますが、
家事などについてもたまに登録して使っています。

## 〇現状の課題 ##
・毎週あるようなタスクも登録して可視化したい。
　でも、実施した際にチェックすると消えてしまうので毎回登録するがめんどくさい。

## 〇対応案 ##
### Wunderlistのタスクにて繰り返しを設定できる ###
ちょっと調べてみると、Wunderlistのタスクにて「繰り返し」で設定すると一回実施すると次回のタスクが作成される。
これで定期的なタスクを設定するという運用は可能になる
ただし、これだと実施した直後に次回分タスクが作成されてしまう
**これでは今回実施した作業に対しての達成感がない！！**

### 実施タイミングが近くなったときにタスクが作成されるようにしたい ###
何かしらの処理を作ればええやん。

## 〇基本設計 ##
Wunderlistのタスクはメールで設定できるのだから、バックエンド処理でタスクと期限を定期的にチェックして、
近くなったらメールすればええんと違う？

とすると、バックエンド処理に必要な情報としては
- タスク名：リストに表示される名称
- 通知するタイミング：曜日？前回からの間隔？日付？あたりか
- 担当
- タスクの期限：日付を指定する必要があるのであれば。


**あとは上記の情報をメールでWunderlistに登録する方法がわかればできそうな感じ。**

## 〇調査 ##
・今のところSubjectに設定するとタスク名になることはわかっているが、
担当や期限についてはどうやるのかわからないので調査。

ヘルプには書いてない・・・
https://6wunderkinder.desk.com/customer/ja/portal/articles/59709-wunderlist%E3%81%AB%E3%83%A1%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B

ググってもできなさそうな感じ。
※とりあえずサポートにできるかどうかの問い合わせはしてみたので、返事が来たら追記するかも。


## 〇いろいろと実際に試してみる。 ##
実際にメールで送信しながら、動作/処理結果を確認してみる

・アプリ内で割り当てを設定する際、[@+ユーザ名]を入力しているっぽいのでそれを真似してみる。

    [タスク名 @担当名]
    [タスク名 @メールアドレス]
    [タスク名 メールアドレス]
→いずれもダメ。設定されない。送信したSubjectのままで設定される。
  
  
・期限を設定してみる

    「2018/03/12 タスク名」
→できそう。が、「2018/03/12 タスク名」で送信したら、期限は[2019年6月3日]となった。

[2018年3月12日 タスク名]で送信すると、期限は[2018年3月12日]となった。
おそらく単純な/区切りだとUS式のフォーマットとして設定されるんでしょうな。

・ハッシュタグ(コンテキスト)を設定してみる

    [タスク名 #担当名 2018年3月12日]
→これだとハッシュタグっぽい表示にはなるが、押下した時に検索画面に遷移しない。
→気のせいだった。しっかりと押下してれば遷移した。

とりあえずこれが運用的に一番簡単になりそうな感じがするのでこの方針で進めてみることにする。
Wunderlist側の調査はここでいったん完了。次回は設定側の話の予定。


## 〇おまけ ##
直接は関係ないが、今回調査してたらこんなん出てきた。
https://internet.watch.impress.co.jp/docs/news/1055983.html

https://www.msn.com/ja-jp/news/techandscience/%E3%83%9E%E3%82%A4%E3%82%AF%E3%83%AD%E3%82%BD%E3%83%95%E3%83%88%E3%81%AE%E6%96%B0%E5%9E%8Btodo%E7%AE%A1%E7%90%86%E3%82%A2%E3%83%97%E3%83%AA%E3%80%8Cmicrosoft-to-do%E3%80%8D%E3%82%92%E5%BE%B9%E5%BA%95%E8%A7%A3%E8%AA%AC/ar-BBAvmei#page=2

将来的には移行する必要がありそうだが、今のところは機能的に物足りなさそうなのでまだ移行しないほうがよさそう。


## 〇おまけ２ ##
関係ないが、この辺でSlackと連携させれば
タスクを完了させたときに「おつかれさま！」みたいなメッセージを自動で出力させることができてやる気がでるかもしれないし、
でないかもしれない。
https://6wunderkinder.desk.com/customer/ja/portal/articles/2022059-slack%E3%81%A8%E3%81%AE%E9%80%A3%E6%90%BA
IT未経験者でも理解できるpython入門_第2回

# 第２回 計算式、データにラベルをつけよう(変数について）

## 前回の復習
前回はプログラムを書く前に
日本語で手順書を書いてみましょう、という内容でした。
書いてみましたでしょうか？

こんな感じで書ければOKです。

```
# 手順書と同じフォルダにあるpoem.txtファイルを開く(input)
# 1行ごとに.の箇所を!に変換する(処理）
# 編集したファイルをpoem_out.txtファイルとして別名で保存する(output)
```

日本人相手ならこの手順書でやってくれると思います。

「よし！早速この手順書をプログラム言語で書き直そうじゃないか！」

気持ちは分かりますが、このままチャレンジしたらまず挫折します。

## 今回の内容
まずはプログラム言語の基本、
**変数**と**データ型**に関して知る必要があります。

もし、この2つを**正確に**理解できたら、
冗談抜きで、pythonに限らずどんな言語でも驚くほど上達します。

今回は**変数**について**正確に**理解することがゴールです。


## コンピュータは短期記憶ができない

意外にもコンピュータは
処理をしても次の瞬間全てを忘れてしまいます。

あなた「1+2は？」
PC「3です！(｀･ω･´)ゞ」
あなた「あ、聞こえなかった、もう一度答えを教えて」
PC「え、何のこと？(・.・;)」

コンピュータは計算をする時は必ず
「メモリ」という作業机で計算し、結果を出すのですが、
処理が終わると「計算式」も「答え」も一括消去されます。

じゃあどうすれば計算式を覚えてくれるんでしょうか。


答えは、計算式にラベルをつけてあげるんです。

```python
a = 1 + 1
```

こんな風に、1+1という計算式に「a」というラベルを作って貼ります。
※ラベルは数字ではじまらなければどんな文字列でもOK。

そうすることで、
「1+1の答えは後で使うから、メモリから消さないで！」
と指示を送ることができ、「a」と打つといつでも1+1の答えである、
2を返してくれます。
※コメント計算した

※逆に言うと、ラベルを付けないデータは
すぐに消えて忘れさられます。注意！

## 変数の定義
このaというラベルのことを「変数」と言い、
ラベルを貼ることを「変数に格納する」と言います。

【これだけは覚えよう】
変数・・・PCに一時的に覚えさせておきたい計算式、データにつけるラベルのこと
変数に格納する・・・ラベルを貼ること
aという変数に格納する・・・aという名前のラベルを貼ること
1+1をaという変数に格納する・・・1+1を計算した結果にaという名前のラベルを貼ること



## 以下、変数を正確に理解するためのFAQ
Q.「ラベルを付けられるのは計算式だけなのか？」

いえいえ、計算式だけではなく

```python
a = 3
```

とすると、aを呼んだ時3が返ってきますし、
a = “hoge”
とした場合は、文字列”hoge” が返ってきます。

Q.「書き方は <変数> = <入れたい式、もしくはデータ>　と決まっているのか？」 

決まってます。
変数が=より左、記憶させたい式、データが=より右です。

Q.「 = 以外は使えるの？」 

使えません。また、プログラムの中での「=」は
ラベルを貼る、です。
数学のイコールとは意味が違います。

Q.「以下のように2回、同じ変数に違うデータを入れたらどうなる？」

```python
a = 3
a = 5
```

コンピュータは必ず「上から順番に」処理をしていきます。
3という数字にaというラベルを貼る。
次に5という数字にaというラベルを貼ろうとしますが、
「一つのラベルは、一つのデータにしか貼れません」
なので、
「3に張っていたラベルを剥がして、5に貼り直す」という動作になります。
ラベルを失った3は、すぐに消えて忘れさられます。

Q.「以下のようにラベルにラベルは貼れる？」

```python
a = 10
b = a
```

貼れます。b = aは
「bはaと同じ場所を見てね」っていう意味になります。
bを呼び出すと10が返ってきます。

Q.「bという変数をまだ付けてない状態でbを呼び出そうとするとどうなる？」
エラーになります。
あなた「bを呼び出して！」
PC「bなんて設定されて無いぞ！(# ﾟДﾟ)」(NameErrorと言います)

Q. 「搭載メモリ以上のデータを変数に格納しようとするとどうなる？」
例えば、メモリが2GBしかないPCに100GBのデータを読み込もうとした場合・・・

PCは2GBしか広さがない机に、無理矢理100GBのデータを載せようとします。
その結果、すでにラベルが貼ってある他のデータが押し出されてしまい、
障害に繋がる致命的なエラーになります。

あなた「100GBのデータにcってラベルをつけるよ」
PC「なんかやってみたけど、メモリからデータ溢れちゃった！！＼(^o^)／」
(このエラーをバッファオーバーフローと言います)


Q. 「変数は一回定義したらずっとメモリに残り続けるの？」
厳密には違うのですが、
今のところはプログラムが起動している間だけ有効、と覚えて下さい。
プログラムが終了すると、指定した変数は全て消去されます。


## 理解度チェック
以下、全問正解出来たら貴方も変数に関してはバッチリです！

(問題1)難易度:★☆☆☆☆

```python
a = 3 + 4
```

⇨aを呼び出すと、何が返ってきますか？


(問題2)難易度:★★☆☆☆

```python
a = 5
a = 100 + a
```

⇨aを呼び出すと、何が返ってきますか？


(問題3)難易度:★★★☆☆

```python
a = 2
a = b
```

⇨上記を実施すると、どんな答えが返ってきますか


(問題4)難易度:★★☆☆☆

```python
a = 5
b = a
```

⇨bを呼ぶと何が返ってきますか？


(問題5)難易度:★★★★☆

```python
a = 1
b = a
a = 100
```

⇨bを呼ぶと何が返ってきますか？

(第3回に続く)
ゼロから作るDeep Learning 学習備忘録 第２章パーセプトロン

# パーセプトロン
複数の信号を入力して、結果（1 or 0, True or False）を返すもの
身近なものだと論理回路

* AND
* OR
* NAND

## 基本式
* x1 x2 : 入力
* w1 w2 : 入力に対する重み weight
* b     : 出力を発火させるためのバイアス

パーセプトロンでは、入力に対する重み、 出力を発火させるためのバイアスは人間が決める

```
y = 
b + w1 *x1 + w2*x2 <= 0  -> 0
b + w1 *x1 + w2*x2 > 0   -> 1
```

### NAND
ANDの重みとバイアスの不等号を逆にする

### OR
ANDのバイアスを調整するとORになる

## 線形と非線形
上記論理回路は線形のパーセプトロンとして扱われるが、XORだと結果が非線形なので一つのパーセプトロンでは実現できない。
XORを実現するには、線形のパーセプトロンを複数利用して実現する。

```
def XOR(x1, x2)
    s1 = NAND(x1, x2)
    s2 = OR(x1, x2)
    return AND(s1, s2)
```

## NAND
基本的にNANDを複数利用すれば論理回路は構成できる。
下記がわかりやすかった。
http://www.yukisako.xyz/entry/2015/11/26/215802
IT未経験者でも理解できるpython入門_第1回

# 第１回　そもそもプログラミングって？
## 概要
この記事は新卒でIT業界に入って来られた方々が主な対象者です。
また、業務経験はあるが、これからプログラムを勉強しようという方も対象です。
文法はpythonを例に連載形式で解説していきます。

目標はズバリ**自立**
- 分からないことがあったら自力で問題解決できるようになること
これがこの連載の一番のゴールです。

- 易しく,楽しく
- 専門用語を使わずに
- かつ本質的に

を目指してやっていきたいと思います。

## そもそもプログラミングって何？できると良いことあるの？
例えばすでに作成した文章ファイル[poem.txt]
すべての文末に!をつけたいとします。

poem.txt

```
Change before you have to.
If you can dream it, you can do it.
Love the life you live. Live the life you love.
```

↓(処理後）

```
Change before you have to!
If you can dream it, you can do it!
Love the life you live. Live the life you love!
```

1ファイル30秒でできるならば、手動でもいいでしょう。
ですが、poem.txtが50個とか100個とかあった場合、
時間がかかって大変です。

なので、
**・人が手でやりたくないことをコンピュータにやらせる
・PCに命令を実行させるための手順書を作る**
これがプログラミングです。


【これが】
入力
「txtファイル50個」
↓
処理(ニンゲンが手作業で行う)
「全ての文末に！をつける」
↓
出力（何時間もかかりめっちゃ疲れる）
「！をつけたテキストファイルが保存される」


【こうなる】
入力
「txtファイル50個」
↓
処理(PCが勝手にやってくれる）
「全ての文末に！をつける」
↓
出力(10秒かからず）
「！をつけたテキストファイルが保存される」


「ほう、もし実現できたら素晴らしい。
じゃあ、どんな手順書を書いたらPCはやってくれるんでしょうか？


## 手順書の書き方
入力ファイル、処理、出力先の３つを指定すれば
手順書が完成します。
以下の質問に答えてみましょう。

1. 入力ファイルを指定
⇒ファイル名は何ですか？
⇒そのファイルはどのディレクトリにありますか？

2. 処理を書く
⇒入力ファイルに対して何をしたいんですか？

3. 出力先を書く
⇒どんなファイルの種類で出力したいですか？テキストですか？ excelですか？
⇒編集したら上書きしますか？別名で保存しますか？


まずは日本語で手順書で書くこと。
いきなりプログラミング言語で書こうとしないこと。
これがコツです。

([第2回](https://qiita.com/ta-wada/items/012ae08f9b03fb3fb023)に続く)
ElixirのSocketモジュールを使ってBroadcastを実装してみた

ElixirのSocketモジュールを使ってWebRTCのシグナリングサーバーを
実装してみようかなと思ったのですが、
そもそもBroadcast部分も自分で実装しないといけない雰囲気だったので実装してみました

使用モジュールは[elixir-socket](https://github.com/meh/elixir-socket) のみです

```elixir:lib/elixir_socket_testing/server.ex
defmodule ElixirSocketTesting.Server do

  alias ElixirSocketTesting.ClientAgent
  
  def start(port \\ 9000) do
    # クライアント保持用のAgent
    ClientAgent.start_link

    # WebSocketサーバーリッスン
    server = Socket.Web.listen! port

    loop(server)
  end

  def loop(server) do

    # クライアントからの接続を待ち受ける
    client = server |> Socket.Web.accept!
    client |> Socket.Web.accept!

    # クライアントをAgentに追加
    ClientAgent.add(client)

    # 各クライアントからのメッセージハンドリングは別プロセスで行う
    Task.async(fn -> recv(client) end)

    loop(server)
  end 

  def recv(client) do
    # クライアントからのメッセージをハンドリング
    case client |> Socket.Web.recv! do
      {:text, message} -> 
        broadcast({:text, message})
        recv(client)
      {:close, _, _} -> ClientAgent.remove(client)
      other ->  IO.inspect other
    end
  end

  def broadcast(packet) do
    # Agentに保持している全てのクライアントにメッセージを送信
    ClientAgent.all
    |> Enum.each(fn client -> Socket.Web.send(client, packet) end)
  end

end
```

以下の3点をやってるだけですね
- クライントのリストを保持しておくAgentを用意しておきクライアントから接続があったら
Agentにつっこんでおきます。
- クライアントからメッセージが来たら保持しているクライアント全てにメッセージを送信する
- クライアントからの接続が閉じたらリストから削除する

クライアントの保持用のAgentは以下のような感じになります

```elixir:lib/elixir_socket_testing/client_agent.ex
defmodule ElixirSocketTesting.ClientAgent do
  
  def start_link do
    Agent.start_link(fn -> [] end, name: __MODULE__)
  end

  def add(client) do
    Agent.update(__MODULE__, fn list -> [client | list]  end)
  end

  def remove(client) do
    Agent.update(__MODULE__, fn list -> List.delete(list, client) end)
  end

  def all do
    Agent.get(__MODULE__, fn list -> list end)
  end
end
```

iexで動かしてみます

```:サーバー
$ iex -S mix
iex> ElixirSocketTesting.Server.start
```

別窓を3つほど立ち上げてそれぞれ接続して、
クライアント1, 2 でrecvしたあとにクライアント3でメッセージを送ってみました。


![demo.gif](https://qiita-image-store.s3.amazonaws.com/0/55219/19146717-c6fa-b9a5-6f94-f90da17b8d81.gif)


自分にもメッセージを送ってしまっていますが、他のクライアントにもメッセージが
送られているのがわかります。


簡単な実装ではありましたが思いがけずAgentとTaskの練習になった気がしています
Taskで非同期にしている部分などはSupervisorにぶら下げるとよりElixirでの
アプリケーションっぽくなるのかなぁ。。。と思ったり。


今回のコードはgithubにもあげていいます
[elixir_socket_testing](https://github.com/tamanugi/elixir_socket_testing)
できる Google Keep 導入編

#狙い
日頃お世話になってるサービスをより一人でも多くの人に知ってもらって上で、
あわよくばユーザーとなっていただきたき、
サービスとして盛り上がる＝少しでも存続期間を長くしてほしいなーっといった目的で書いております。
ざっくり
導入編（本章）
利用編
といった構成で検討しておりますが、筆がのったらその限りではありません。

#で、Google Keepって何？？
Google が提供する高機能化したウェブブラウザでできる付箋紙です。

僕の印象で言い換えますと
かゆいところに手が届くクラウドベースのWebベースのポスト・イット(付箋紙)
が執筆時点でしっくり来る表現です

以下のような特徴があります。
- iOS Android そしてウェブブラウザ(PC上)で軽快に動作できます。
- 思いついたらすぐにメモができます。
- 指定した場所や時間でリマインダーを表示できます
- 繰り返しのリマインドもできる
- リマインドはGoogle Calendarに予定としても追加されるため漏れにくい
- 外出先でも音声メモで記録すれば自動的に文字に変換されます。
- ポスター、領収書、文書の写真を撮っておけば、後で簡単に整理、検索できます。
- チェックリストを作成することもできます。
- そのメモを友だちや家族と共有することも可能です。
- ショートカットキー(web)が至れり尽くせり
- イメージカラーが黄色
- 賢明な読者の方に既にお気づきかと思いますが、無料でご利用いただくGoogleアカウントが必要になります(ここでは説明しません）

と素晴らしい内容となっています。

## インストール先はリンクは以下です
[web](keep.google.com/)
[iOS App](https://itunes.apple.com/jp/app/google-keep/id1029207872?mt=8)
[Android App](https://chrome.google.com/webstore/detail/google-keep-notes-and-lis/hmjkmjkepdijhoojdojkdfohbdgmmhki?hl=ja)
[chrome 拡張](https://chrome.google.com/webstore/detail/google-keep-notes-and-lis/hmjkmjkepdijhoojdojkdfohbdgmmhki?hl=ja)

# 使い方(web編)
画面のメモ暫定![Google Keep (1).png](https://qiita-image-store.s3.amazonaws.com/0/74258/00dd83ee-dcfd-36c8-9623-c2553278a070.png)
ざっくりてな具合です
メモするものは画面中央に追う
画面左と上はフィルタリングするのをまとめている画面設計ですね。
CentOS7にGoの最新版をインストールする


最新版のgoをインストールする流れをまとめてみた
  ついでに各コマンドの意味もせっかくなので

## 全体の流れ

```
$ uname -m
x86_64
$ sudo su -
# cd /usr/local/src
# wget https://dl.google.com/go/go1.9.4.linux-amd64.tar.gz
# tar -zxvf go1.9.4.linux-amd64.tar.gz
# mv go /usr/local
# exit
$ vi ~/.bash_profile
下のようにPATHに/usr/local/go/bin を追加する

PATH=$PATH:$HOME/bin:/usr/local/go/bin
$ source ~/.bash_profile
```

## 各コマンドの説明

### uname -m

- `uname` はOSやアーキテクチャなど、使用しているシステムの情報を表示する
  - オプションなしで、OSを表示。
  - `-m`オプションで、アーキテクチャを表示する。

```
$ uname
Linux
$ uname -m
x86_64
```

### sudo su -

- ルートユーザーになる
  - /usr は一般ユーザーに編集権限がないので

### cd /usr/local/src

- `/usr` 直下のディレクトリはディストリビューションが管理
- `/usr/local` 以下のファイルは各システムの管理者が管理
  - `/usr/local/src` コマンドのソースコードが置かれる

### wget https://dl.google.com/go/go1.9.4.linux-amd64.tar.gz

- アーキテクチャに応じたファイルを/usr/local/src以下にダウンロードする

### tar -zxvf go1.9.4.linux-amd64.tar.gz

- ファイルを解凍する
  - `tar` ファイルの解凍・圧縮を行うコマンド
    - `-z` gz対応
    - `-x` 解凍(extract)
    - `-v` 圧縮・解凍状況を表示(なくてもいい)(verbose)
    - `-f` ファイル名を指定(filename)

### mv go /usr/local

- コマンドを置くディレクトリを移す

### vi ~/.bash_profile

- パスを通す



## 参考

- [The Go Programming Language](https://golang.org/doc/install)
swiftでサウンドを再生する

## 概要
swift4で `AVAudioPlayer` を使ってサウンドを再生する

## 環境
macOS Sierra 10.12.6
Xcode 9.2
swift4

## コード

#### `AVFoundation` のインポート

```ruby:ViewController.swift
import AVFoundation
```

#### `ViewController` に `AVAudioPlayer` のインスタンスを宣言

```ruby:ViewController.swift
class ViewController: UIViewController {
    
    var audioPlayer: AVAudioPlayer!
    
    // 省略
}
```

#### `ViewController` に `AVAudioPlayerDelegate` を継承させて拡張
`ViewCountrollerクラス` の下に、以下のコードを追記する。

```ruby:ViewController.swift
extension ViewController: AVAudioPlayerDelegate {
    func playSound(name: String) {
        guard let path = Bundle.main.path(forResource: name, ofType: "mp3") else {
            print("音源ファイルが見つかりません")
            return
        }
        
        do {
            // AVAudioPlayerのインスタンス化
            audioPlayer = try AVAudioPlayer(contentsOf: URL(fileURLWithPath: path))
            
            // AVAudioPlayerのデリゲートをセット
            audioPlayer.delegate = self
            
            // 音声の再生
            audioPlayer.play()
        } catch {
        }
    }
}
```

#### 再生させたいタイミングでメソッドを呼ぶ
音源ファイルが`SOUND_NAME.mp3`だった場合

```
playSound(name: "SOUND_NAME")
```

以上のコードで音声ファイルが再生できます。

### 画面load時にすぐに再生する場合のViewController全体コード

```ruby:ViewController.swift


import UIKit
import AVFoundation

class ViewController: UIViewController {
    
    var audioPlayer: AVAudioPlayer!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // mp3音声(SOUND.mp3)の再生
        playSound(name: "SOUND_NAME")
        
    }
}

extension ViewController: AVAudioPlayerDelegate {
    func playSound(name: String) {
        guard let path = Bundle.main.path(forResource: name, ofType: "mp3") else {
            print("音源ファイルが見つかりません")
            return
        }
        
        do {
            // AVAudioPlayerのインスタンス化
            audioPlayer = try AVAudioPlayer(contentsOf: URL(fileURLWithPath: path))
            
            // AVAudioPlayerのデリゲートをセット
            audioPlayer.delegate = self
            
            // 音声の再生
            audioPlayer.play()
        } catch {
        }
    }
}
```
SSL証明書の更新：失敗例＆対応内容（XREA&Value-Domainの場合）

2017年3月8日に1年契約で購入したSSL証明書。
(Alpha SSLという、年間1200円ほどのお手頃なものを購入しました)

この証明書について、有効期限の約1ヵ月前の2018年2月上旬に「延長手続」を行ったのですが、結果として、それだけではダメだったようで、有効期限である2018年3月9日から数時間の間SSLが無効になってしまいました。
一体何が起こったのか、解決のために何をしたのかを共有します。

##前提（使用サーバー・ドメイン）
サーバー：XREA Plus
ドメイン：Value-Domain

##2018年2月上旬：延長手続き
SSLの管理画面から、延長手続きを実施。
手続きは問題なく完了し、管理中のSSL証明書の画面に、購入したSSL証明書が追加される。有効期限は、2019年3月8日。

「よし、これで大丈夫だな」←これが勘違いでした。


##2018年3月9日 0:10：https接続が出来ない事に気づく
更新がうまくいったかを確認するために、自身のサイトに接続してみたところ「安全ではない接続」という警告が出現。あれ？更新がうまくいっていない？

このとき初めて気付いたのですが、SSLを購入して、そのまま放置するだけでは、ダメだったようです。

![貼り付けた画像_2018_03_11_11_06.png](https://qiita-image-store.s3.amazonaws.com/0/178307/6621b11c-88e7-4f0b-349f-2cff6ff4a734.png)



##2018年3月9日  0:10〜1:30：対応
原因は何なのか、ヘルプページを見たりググるなどして調査開始。
**結果、分かった事は、SSL証明書は、購入するだけではなく、サーバーにインストールしなければならなかったみたいです。**

ヘルプページで、それっぽいことを書いてあるところを見ながら作業開始。
https://www.xrea.com/support/manual/old/ssl/sni/

サーバーの管理画面に入り、SSLの設定画面から、購入した新しい証明書に記載されている文字列（証明書、中間証明書など）をコピペして保存。
それから数時間後、朝になって改めてhttps接続を試みたら、今度は接続成功。どうやら、新しいSSLが適用されたようです。


##教訓
「SSLは、買ったらサーバーにインストールする事だ。持ってるだけじゃぁ効果はないぜ」＊ドラクエの武器屋の店主っぽく
パスワードジェネレーター簡易版を作った

webサイトとか自分でちゃんとしたのが作りたいし、プログラミングスキルも成長させていきたいので、つい最近　
**ドットインストールプレミアム会員になりました！！**

#ドットインストールプレミアム会員になって思ったこと

ざっくりとやってすべては理解しきれてないけど
HTMLとCSSとjavascriptはすごくためになる。
サクサク進められるし、動かないなって思った時は
**講座のソースコードと自分で書いたコードを比較できるツール（差分チェック）**があるし
大抵自分のコードのスペル間違い位だからすぐ気づける。

javascriptでパスワードジェネレーターをつくろうっていうものがあってこれくらいなら自分でも作れそうって思ったので早速好きなPythonで作ってみた。

パスワードジェネレーター簡易版

```python:pwj.py
# coding: utf-8;
# パスワードジェネレーター簡易版(数字のみ)
import random 

num = list(range(10)) # 0 - 9までのリスト

user_select = int(input()) # 何桁のパスワードを作るかユーザー入力

number = random.sample(num, user_select)  #求められた桁数を取り出す

#コピペを想定して ","と " "←半角スペースを除去

print(str(number).replace(", ","")) 

```

改良してアルファベットや記号も含めれるようにしていく予定。

ドットインストールは種類が豊富で無料で学べる部分でもHTMLやCSSはすごくためになる。

古い記事もあるし、使ってるツールのバージョンとかも違って戸惑うことも色々あるけどなんとか今のところは調べながら完了できてる。

#これから

こんな感じでドットインストールで勉強しつつ、これ自分でも作れそうだなって思ったら調べるなりで自分の好きな言語で作っていくと完成させやすいし、完成で来た時の達成感が味わえるので幸せ。

動画見ながら作ってインプットしてQiitaやtwitterでアウトプットして
いろいろ力をつけよう。

#最近学んだこと

ターミナルで新規ファイルを作るときは

`1.echo "内容"　> ファイル名
 2.copy nul ファイル名
 3.type nul > ファイル名
`

自分は3番目をよく使うようになった
Shazam からなうぷれ共有ブックマークレット

## Mac の Shazam アプリ
最近これを使い始めて、ブラウザプレイヤーだろうと動画のオープニングだろうとひっくるめて曲を検知してくれるので能動的 siri な感じで楽しいです。
(回し者ではないです。)

[「Shazam \- 音楽認識」をMac App Storeで](https://itunes.apple.com/jp/app/shazam-%E9%9F%B3%E6%A5%BD%E8%AA%8D%E8%AD%98/id897118787?mt=12)

![Item-0_and_Item-0_and_Item-0.png](https://qiita-image-store.s3.amazonaws.com/0/40717/e5e2e0ad-7780-7698-5d13-0ff2783e7750.png)

# アプリで飛んだリンクから共有
[Shazam のページ](https://www.shazam.com/ja/track/257981147/%E5%88%B9%E9%82%A3%E3%81%AE%E6%9E%9C%E5%AE%9F#referrer=shazamformac) で使う共有用のブックマークレットを作りました。

実は普通に公式のシェアボタンがあります。
しかし、なぷれうツイートとしてカスタマイズして共有したかったのでブックマークレットにしました。

ブックマークレット

```js
javascript: (() => {
  const songTitle = document.title.replace(' | Shazam', '');
  const url = encodeURIComponent(window.location.href);
  const text = encodeURIComponent(`♫['w'] > ${songTitle}`);
  const hashtags = 'NowPlaying';
  const params = { url, text, hashtags };
  const query = Object.entries(params)
    .map((kv) => kv.join('='))
    .join('&');
  const shareUrl = `https://twitter.com/intent/tweet?` + query;
  window.open(shareUrl, '', 'width=550, height=420');
})();
```

下のようにウィンドウが開きます。

![Twitter_でリンクを共有する_and_tweet-shazam-nowplaying_js_—____ghq_github_com_elzup_bookmarklets.png](https://qiita-image-store.s3.amazonaws.com/0/40717/bd9b6c9e-db09-ccb7-79b5-223d7061ca06.png)



## その他

ブックマークレットの使いかたなど
[ブックマークレット活用・すばやい登録と呼び出し \- Qiita](https://qiita.com/elzup/items/1698767d77af39d8dd19)
Python 3 エンジニア認定基礎試験、合格体験記

#はじめに
しばらく前にPython認定試験を受験し、合格してきました。
勉強内容、雑感などをメモしておきたいと思います。

#受験前のスペック
保有資格
　Java SE8 Silver
　Ruby技術者認定試験Silver2.1
Pythonの経験
　インデントでブロックを作る、ということくらいは知ってました。

#勉強内容
合計時間は約 15h

##試験の概要を調査
以下のqiita記事が参考になりました。
　[Python 3 エンジニア認定基礎試験の勉強法と受験した感想](https://qiita.com/pio2/items/e98480483f7f759710ca)
　[受験記：Python 3 エンジニア認定基礎試験](https://qiita.com/sugar020855/items/415f781f316a4ec1949c)
勉強方法は二つ目の記事でも引用されている
　[Python3エンジニア認定基礎試験の効率的な勉強方法!](http://ccie-go.com/python-exam-study/)
という記事が詳しくてよいかと思います。

幾つかの記事を読んだ感触としては、
　　・公式の教科書があり、章別に出題数が決まっている。
　　・試験としての難易度は低い
　　・「あんまり意味がないのでは？」と言ってる受験者がちらほらいる
といったところでした。
三点目については、会社に受験料を払ってもらえることになっていたので、あまり気にしませんでした。

##PaizaのPython入門
JavaSilverを取った際も使ったPaizaの入門講座を一通り流しました。
プログラミング初学者向けのため、「繰り返し」や「条件分岐」とは何ぞや、というところから始まる感じなので、Python経験者や他の言語をやったことある方には不要だと思います。

環境構築不要でコードを動かせる[Paiza.IO](https://paiza.io/ja)は教科書を読んでコードを動かす際に便利でした。


##公式教科書「Pythonチュートリアル」を読む
とりあえず２回読みました。
リストやらタプルなどのRuby, Javaでは見かけなかった用語に戸惑いましたが、基本的には問題なく理解できました。


##模擬試験
[Dive into Code](https://diver.diveintocode.jp)というサイトで模擬試験を受けられるので、
　　模擬試験をやる⇔わからなかったところは公式教科書を読む、
というサイクルを繰り返しました。
捻った問題や長いコードを読ませるような問題はないので、教科書をちゃんと理解できていれば、すぐに合格点をとれるようになります。


#試験本番
難易度は[Dive into Code](https://diver.diveintocode.jp)の模擬試験と同レベルで、じっくり解いて見直しをしても30分くらいで終わりました。


#感想
ネット上の評判通り、他の資格で言うブロンズ相当の難易度で、実務経験者が新たにとって意味がある資格ではないでしょう。

プログラミング経験がない学生さんが挑戦するにはほどよい資格かと思います。

範囲となる教科書がネット上で公開されており（分野別の出題数も明示）、無料の模擬試験サイトもありますので、勉強がしやすいのは良い点ですね。受験料も学割がきけば5000円くらいです。

自分は漫然と教科書を読むより資格試験の勉強として取り組んだ方がやる気が出るタイプなので、まぁ受けてよかったかな、という感じです。受験料を出してもらえなかったら、受けなかったかなぁとも思いますが。

みんな言ってますが、Pythonエンジニア育成協会は[データ解析試験](https://www.pythonic-exam.com/exam)を早くリリースして欲しいものです。
期限が切れたBeta版のAmazon EchoのSkillを更新する


以前、[Amazon EchoのSkillを作成して申請してみました](https://qiita.com/ryo_naka/items/936d9a6853be85bae88b)が、
それとは別に完全プライベート用に遊ぶものとして他のスキルを作成して
Beta版として端末にインストールして使っていました。

が、Beta版は90日までしか使えないみたいで、先日期限が切れてしまいました。
※厳密にいうと、デベロッパーとEchoのアカウントが同一の場合はそもそもBetaテストとしなくても使えるはずです。

## 〇コンソールへログイン

久々にログインしてみたらコンソール画面が新バージョンになってた。(2018/03/10時点)
そしてこんなお知らせが。
<img width="809" alt="キャプチャ_01.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/106639/fd3915ac-a3bd-e92c-ef1b-7c10b11fedae.png">


そして、新しいコンソールだとBeta版情報をどこで管理しているのかがよくわからない
なので、旧バージョンに。

<img width="922" alt="キャプチャ_00.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/106639/6173093c-ff42-934f-2a25-ebc2bd99045c.png">

### 〇旧コンソールにて
Betaテストのステータスを確認すると確かに終了している。
<img width="145" alt="キャプチャ_02.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/106639/6df85e20-5373-7ebe-2ff3-8b7d2a9da894.png">

<img width="596" alt="キャプチャ_03.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/106639/6c2c540e-fcb5-1368-603c-6fd5f1b7b0b8.png">

「新しいテストを開始」というボタンがあるのでそれを押してみる。
<img width="866" alt="キャプチャ_04.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/106639/4679b3f4-afce-bd35-b350-0fbb08b4bdf3.png">

作成時に実施した「招待」と同じこことができるので、同様に招待したいメールアドレスを設定してテストを開始する。
と、Beta版を再開することができるようになっている。

## 〇おまけ
旧コンソールにて再開させた後に、新デザインもいろいろ探してみたら
たぶん以下でBetaテストの設定ができそう

<img width="748" alt="キャプチャ_05.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/106639/cc75faeb-4866-c74d-9583-d4dd3d357e51.png">

全体的に前のデザインよりも使いやすそうな感じがします。
※問題は前に作成したチュートリアルが使い物にならなくなったということ・・・
Seabornが自動で適用されない

# 実行環境
OS: Centos7
Python3.6 Jupyter Notebook
Seaborn 0.8.1
Matplotlib 2.0.2

# 実行したコード
```py
%matplotlib inline
import numpy as np
import pandas as pd
import seabron as sns

x = np.random.normal(size=100)
titanic = sns.load_dataset('titanic')
tips = sns.load_dataset('tips')
iris = sns.load_dataset('iris')

sns.jointplot('sepal_width', 'petal_length', data=iris)
```
上記のコード実行結果

![jointplot.png](https://qiita-image-store.s3.amazonaws.com/0/92606/256dfff5-8a8b-540e-b232-f252493490b4.png)

本当はこっちになるはず

![jointplot_.png](https://qiita-image-store.s3.amazonaws.com/0/92606/3cac1773-ac11-c4a3-9578-51f87a016364.png)

# 原因
seabornがimportされた際にset()が記述されてないというものでした。
seaborn0.7.1では上手く行ってたので、現行のseaborn 0.8.1とコードを比較しました。

```py:seaborn/__init__.py
# Capture the original matplotlib rcParams$
import matplotlib as mpl
_orig_rc_params = mpl.rcParams.copy()

import seaborn objects
from .rcmod import *
from .utils import *
from .palettes import *
from .regression import *
from .categorical import *
from .distributions import *
from .timeseries import *
from .matrix import *
from .miscplot import *
from .axisgrid import *
from .widgets import *
from .xkcd_rgb import xkcd_rgb
from .crayons import crayons
from . import cm # 0.8.1のみ

set() # 0.7.1のみ
__version__ = "0.8.1"
```
seabornが自動で適用されない場合は\_\_init\_\_.pyにset()を付け加えましょう。
というか公式にちゃんと書いてました。

> [seaborn公式](https://seaborn.pydata.org/whatsnew.html)
> v0.8.0 (July 2017)
> The default style is no longer applied when seaborn is imported. It is now necessary to explicitly call set() or one or more of set_style(), set_context(), and set_palette(). Correspondingly, the seaborn.apionly module has been deprecated.
>(importしてもseabornデフォルトのスタイルは適用されなくなったため、set()またはset_style(),set_context(),set_pallete()を明示的に呼び出す必要があります。)
ImageMagick + bash > .svgファイルを背景色設定して.jpgファイルに変換する

```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)
scipy v0.19.1
geopandas v0.3.0
MATLAB R2017b (Home Edition)
ADDA v.1.3b6
gnustep-gui-runtime v0.24.0-3.1
```

### 処理概要

[Tinkercad + レーザーカッター > MDF積層状の構造物を作る案 | layered Delta Flyer v0.1-v0.3](https://qiita.com/7of9/items/893bc07a82bed2d2341e)
にて作成したDelta Flyerのスライス画像が.svgファイルとして44枚ある。

これら.svgファイルの画像を逐次見ようとするが、eog(eye of GNOME)では背景が透明のため見れない。

ImageMagickを使って背景色を設定する。

### bashスクリプト

```bash:set_background_180311_exec
#!/usr/bin/env/bash

set -eu

for infile in $(ls *.svg)
do
	echo $infile
	outfile=$(echo $infile | sed 's/\.svg/\.jpg/g')
	echo $outfile
    convert $infile -background "#FFFFFF" -flatten $outfile
done
```

.svgファイルがあるところで、下記のように実行する。

```txt:run
$ bash set_background_180311_exec
...
```


生成したjpgファイルはeogにて手動アニメーション表示ができる。
PeekでキャプチャしてYouTubeにあげてみた。
https://youtu.be/N5jRZ0sEi3g

レーザーカッターで積層作成するには、船体後方と船体前方で芯材を通す穴位置を変えないといけないだろう。
芯材の候補としては料理用竹串(ノギス測定で2.60〜2.68mmの直径だった)が穴径が小さくてよいかもしれない。
俺言語 その20

#概要

俺言語をやってみた。
avrにアセンブラで実装してみた。
バグっていたので、対処。

#環境

avr studio 4
attiny85 1mhz
tera term
usb-serial

#bug

以下のプログラムが、ぐしゃぐしゃになる。

```
10 a=0
20 a=a+1
30 ?=a
40 #=a<10*20
```

#原因

タイマー０のコンプA割り込みが入ると、ソフトウェアシリアルがおかしくなる。

#対処

変数「'」を導入して、'=16で、TIMSKレジスタに16を書き込む。
（OCIE0Aの許可）
ボリュームで、明るさが変わるプログラムは、以下になる。

```
5 '=16
10 e=x
20 f=x
30 g=x
40 #=10
```


以上。
s3の特定ディクトリにファイルが上がっているかを確認する


S3のバケット・ディレクトリにファイルが上がっているか、ファイルが空でないかを検知したい。
  容量が大きいので手元にファイルをコピーはしたくない。`ls`だけでやりたい。
  ので、検知する用のシェルスクリプトを書いた。
  あまり綺麗な書き方ではないと思うのでもっといいやり方があれば知りたい。

## ディレクトリの想定

特定バケット以下の指定ディレクトリのファイルを確認。
  ディレクトリはこんな感じになっている想定。

```
nekootoko3_no_gohan/[matatabi | saba | catfood]/YYYYMMDDHH/ファイル
```

matatabi saba catfood ディレクトリ以下には毎時ファイルがアップロードされる。

## スクリプト

現在時刻から3時間前に上げられているであろうファイルを確認するバッチ。

```gohanchecker.sh
DATETIME=$(date -d '3 hours ago' '+%Y%m%d%H')
BUCKET_NAME='nekootoko3_no_gohan'
DIR_LIST="matatabi saba catfood"

ERR_MSG=''

for DIR_NAME in $DIR_LIST
do
    # 手動実行用に実行状況を出力
    echo "inspecting s3://$BUCKET_NAME/$DIR_NAME"

    RES=`/usr/local/bin/aws s3 ls s3://$BUCKET_NAME/$DIR_NAME --sum`
    if echo $RES | grep -sq 'Total Objects: 0'; then
        MSG="$DIR_NAME ni file ga naiyo!!\n"
        ERR_MSG=$ERR_MSG$MSG
    elif echo $RES | grep -sq 'Total Size: 0'; then
        MSG="$DIR_NAME no file size ga 0 dayo!!\n"
        ERR_MSG=$ERR_MSG$MSG
    fi
done

if [ -n "$ERR_MSG" ]; then
    echo -e $ERR_MSG >&2
fi
```

これをcron設定しよう。
  標準エラー出力だけは出力するようにしないとエラーメールが飛ばないので注意。

```
MAILTO=alert@alert.jp

5 * * * * /bin/sh どこかのディレクトリ/gohanchecker.sh 1> /dev/null
```

grepでチェックしててなんか変な感じ、、、
Tinkercad > Link > How to Split Objects In Tinkercad! @ YouTube

ブラウザ動作するAutoDeskのTinkercad。

下記のYouTubeビデオにて物体の分割方法が紹介されている。

How to Split Objects In Tinkercad!
https://www.youtube.com/watch?v=1SwSqROgLpY&t=80s

手順の概要は下記のようなものだろう。

1. オブジェクトの半分のサイズのBox(穴)を作る
2. Box(穴)をオブジェクトの半分に合わせる
3. コピー機能を使って反対側にBox(穴)を作る
4. オブジェクトを選択してコピーする
5. オブジェクトとBox(穴)をグループ化して半分のオブジェクトを得る

手順4で難しいのは、内部にあるオブジェクトを選択できないということ。
Chaor Core Tech氏による提案手順は以下

1. オブジェクトとBox(穴)をマウス範囲指定で選択
2. 片方のBox(穴)を選択解除

以上によりオブジェクトを分割できるようになる。
ボタンのタップ領域を拡張する

## はじめに
Try Swift2018の「関心の分離と単純化のためのSwiftコードの最適化」のセッションの中で紹介されていた内容を共有します。

例えば、デザイナーさんからHIGを無視した小さなボタンのデザインが来たが、デザインを変えずに、ボタンのタップ領域のみ拡張する例です。

#### 例1
個別にタップ領域を拡張する。

```swift:
button.frame = CGRect(origin: .zero, size: CGSize(width: 44, height: 44))
```

#### 例2
hitTestメソッドをオーバーライドしてタップ領域を拡張する。
使い方をUIButtonをMinimunHitAreaButtonに変更する。

```swift:
import UIKit

final class MinimunHitAreaButton: UIButton {
    
    let mimimumHitAreaWidth = 44
    let mimimumHItAreaHeight = 44
    
    override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
        guard !isHidden && isEnabled && isUserInteractionEnabled && alpha >= 0.01 else {
            return nil
        }
        
        let lengthOfTappableAreaOutside: CGFloat = 10.0
        let mimimumHitAreaSize = CGSize(width: mimimumHitAreaWidth, height: mimimumHItAreaHeight)
        
        // hitFrameをmimimumHitAreaSizeに変更する
        let buttonSize = bounds.size
        let widthToAdd = max(mimimumHitAreaSize.width - buttonSize.width, lengthOfTappableAreaOutside * 2)
        let heightToAdd = max(mimimumHitAreaSize.height - buttonSize.height, lengthOfTappableAreaOutside * 2)
        let largerFrame = bounds.insetBy(dx: -widthToAdd / 2, dy: -heightToAdd / 2)
        
        // 大きいフレームでhitTestを実行する
        let hit = largerFrame.contains(point)
        return hit ? self :nil
    }
}
```

## まとめ
やり方は、他にも色々ありますが、今回紹介された方法をご紹介しました。
参考になればと思います。
Google Tag Manager のイベント計測で特定のIPを弾く

# 背景
会社のサイト上であるボタンがどれだけクリックされているのか知りたいと思い、 Google Tag Manager で一通りタグを作り終わって Google Analytics を確認してみると、、、

「めっちゃクリックされてる？？！！いや、、でも待てよこのサイト公開したばっかりのはずなんやけど、、、」

社員がクリックしまくってるからでした。ということでイベント計測で社内アクセスを弾く設定をしていきたいと思います。

# 手順
## 変数の作成
左サイドバーにある```変数 > ユーザー定義変数```から```新規```で**カスタムJavaScript**変数を作成します。

ここでアクセスして来たユーザーのIPアドレスを取得するようなJSをかいてあげます。IPアドレスを返してくれるいい感じのサービスを見つけてきて、そこに```XMLHttpRequest```でリクエストを飛ばします。サイトがHTTPSなのでリクエスト先がSSL化してくれていると[Mixed Content](https://developers.google.com/web/fundamentals/security/prevent-mixed-content/what-is-mixed-content?hl=ja)にならなくて嬉しい！また入力するのは

> 「return」ステートメントを使って値を返す JavaScript 関数を指定してください

とのことなのでコードは以下のようになります。

```javascript
function () {
    if (window.XMLHttpRequest) xmlhttp = new XMLHttpRequest();
    else xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");

    xmlhttp.open("GET","https://jsonip.com/",false);
    xmlhttp.send();

    hostipInfo = (new Function("return " + xmlhttp.responseText))();

    if (hostipInfo['ip']) return hostipInfo['ip'];
    return false;
}
```
入力が済んだら適当な名前をつけて保存します。

![Screen Shot 2018-03-11 at 2.52.50.png](https://qiita-image-store.s3.amazonaws.com/0/203213/90a3b014-b3c7-e62e-8189-fee18754ccd0.png)

## トリガーの設定
サイドバーの```トリガー```から制約をかけたいものを選択し、**これらすべての条件が true の場合にこのトリガーを有効化**に以下のように入力します。

![Screen Shot 2018-03-11 at 2.57.37.png](https://qiita-image-store.s3.amazonaws.com/0/203213/835bb8ab-d2ff-5d64-13af-4843c86885e1.png)

一番左のテキストボックスには先ほどつけた変数の名前を、一番右のテキストボックスには会社のIPアドレスを入力。IPアドレスは[ここのサイト](https://grupo.jp/myip/)などで確認できます。弾きたいIPアドレスが複数ある場合は適宜真ん中のセレクトボックスで```正規表現に一致```を選ぶなり、条件のレコードを複数作るなりやってください。

あとはこのトリガーをもとにタグを作って、公開して完了です。

サイト上のあるボタンのクリック数知りたい！読了率測りたい！！内部の人のアクセスデータいらん！！！というのはビジネス要求としてよくあるものですよね。先ほどと同様に設定すれば汎用的に使える設定ですのでぜひお試しください。
MacでPATHを通し間違えてターミナルでほとんどのコマンドが使えなくなった話

プログラミングもコンピュータにも全然詳しくない初心者向けです(私が初心者なので)。なのにググってもまとまった解決法が見つからなくて苦労したので、書きます。	

#動機
既にAppStore経由でXcodeを入手していたMacで、標準搭載されているRubyではなく、Homebrewとrbenvを導入してバージョン管理をしたかった。

#発端
まず、[こちら](http://morei.hatenablog.jp/entry/2016/03/05/111627)を参考にターミナルからHomebrew本体をインストール。

```
$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```
ここまでは良かった。

#あーもうダメ。PATHの通し間違い
Homebrew本体のインストールが済んだので、使えるようにPATHを通します。PATHが何で環境変数がどうとかいうのは、WinでC言語の環境構築をした時に苦い思い出が。

```
$ echo 'export PATH=/usr/local/bin:SPATH' >> .bash_profile
$ source .bash_profile
```

出力結果がこちら。

```
-bash: source: command not found
```

あれ？やばげなニオイ。Linuxコマンドがnot foundっておかしいでしょ。
ここでコードの1行目を見てほしいのですが、

```
echo 'export PATH=/usr/local/bin:
```

の後が

```
SPATH
```

になっています。ここ。これがダメ。2時間潰した原因。サイトを目で見て自分で打っていた時に見間違えて打ち間違えたんですね。本当は

```
$PATH
```

となります。

#間違えたPATHを通した際は
そうでなくてもPATHを間違えちゃったよって人は多いのではないでしょうか。多くない？
正しいパスで何度も書き直しても、エラーこそ出ないものの、(一番上にあるものが優先されるために？)ほとんどのコマンドが使えなくなるのです。lsコマンドすらダメ。
ここで何とか正しいPATHに書き換えたいわけです。そこで以下の手順を行うとターミナルも復活しrbenvからRubyのバージョン管理もできるようになりました。

- 隠しファイルを表示させているか
	- している
	- していない  →  [command]+[shift]+[.(ドット)]を同時に押す

隠しファイルを表示している状態でホームディレクトリに移動すると、.bash_profileというファイルがあります。これを何らかのテキストエディタで表示すると…

######PATH=/usr/local/bin:SPATH

あった。このSPATHを$PATHに書き換えてやります。
私のようにターミナルから書き換えてやろうと何度もecho 'export〜とやっていると下に新しいのがいくつもできているはずですので、正しいPATH1行にしてください。
また、環境次第では他関係の正しいPATHもあると思うので、くれぐれも該当PATHのみ編集するよう気をつけてください。

#なぜそれだけのことに時間を食ったか
・最初は間違えたPATHを通していることに気づかず、この手順以降のコマンドを入力したりしていた
・PATHを通し直す方法を探しても、ターミナルからコマンド入力する方法ばかりが出てきた
・隠しファイルをターミナルコマンド以外で表示させる方法がなかなか見つからなかった
ということにありました。

PATHを通し直した後はbrew doctorを実行したりして、rbenvから任意のバージョンのRubyをインストールできました。この辺は[この記事から。](https://qiita.com/issobero/items/e0443b79da117ed48294)