OmniAICreator/Qiita-1.07M huggingface dataset:
RubyMine + WSL： Remote の rbenv で使っている Gem を読み込ませる

# はじめに
## 記事作成に至るまで
RubyMine + WSL で Ruby on Rails 開発をしようとしていたところ、RubyMine にて次のようなエラーが発生しました。

![Inkedスクリーンショット 2018-06-21 22.15.11_LI.jpg](https://qiita-image-store.s3.amazonaws.com/0/166456/99ccf1e3-3a48-edf2-1aac-6b5a0cdf8319.jpeg)

**「RubyMine Gem Manager: RubyMine has detected that some of the gems required for 'プロジェクト名' are not installed」**と書いてあります。
どうやら WSL に rbenv でインストールした Gem を読み込ませることに失敗しているようでした。

## 原因
Ruby インストール時に **rbenv を用いた場合**、RubyMine の「リモートRubyインタープリターの構成」においてインストールパスを修正する必要があるようです。

私は公式ヘルプの『[リモートインタプリタの設定](https://pleiades.io/help/ruby/using-wsl-as-a-remote-interpreter.html)』をそのまま実行し、結果として前述のエラーが発生しました。

# Remote の rbenv で使っている Gem を読み込ませる
ここから本題（設定方法）です。

## 「リモートRubyインタープリターの構成」 を開く

※プロジェクト作成前の場合
![1-1.PNG](https://qiita-image-store.s3.amazonaws.com/0/166456/9e7c611d-af39-5336-c69d-277b91a64df2.png)

※プロジェクト画面の場合
![1.PNG](https://qiita-image-store.s3.amazonaws.com/0/166456/5636915c-e302-6e53-ea5b-07f2c90b1d33.png)

ここからは共通
![2.PNG](https://qiita-image-store.s3.amazonaws.com/0/166456/aa40719e-e889-bb9d-3f11-f8de9527ab30.png)

すると、「リモートRubyインタープリターの構成」ウィンドウが開く。

## インタープリターの追加

1. ```WSL```のラジオボタンを選択
2. Linux Distribution で ```Ubuntu```を選択
3. パスを変更する（後述）

![4.PNG](https://qiita-image-store.s3.amazonaws.com/0/166456/7ad07f1b-1bd8-1780-63f6-6f23013d7e0a.png)

### パスの変更
③のパスに、自分の環境での **Ruby インストールパスを入力する**必要があります。

インストールした Ruby のパスを確認するため、WSL の bash 上で以下のコマンドを実行します。

```bash:実行するコマンド
$ which ruby
```

```bash:表示される値（人それぞれ）
/root/.rbenv/shims/ruby
```

![スクリーンショット 2018-06-23 16.58.39.png](https://qiita-image-store.s3.amazonaws.com/0/166456/3f0bd5e1-87f4-0ded-ac2a-62f176bdbbff.png)

取得した値を先程の「Ruby インタープリター・パス」に入力するのですが、このままではエラーになります。
どうやら ```shims``` というディレクトリが実際には存在しないためだそうです。

ですので、```shims``` の箇所を正しいパスに修正し、「Ruby インタープリター・パス」に入力します。

```:誤
/root/.rbenv/shims/ruby
```

```:正
/root/.rbenv/versions/2.5.1/bin/ruby
```

※「versions/〇〇」の箇所には、インストールした Ruby のバージョン番号を入力してください。

```bash:「ruby2.5.1p57」→「2.5.1」がバージョン
$ ruby -v
ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-linux]
```

![スクリーンショット 2018-06-23 17.09.22.png](https://qiita-image-store.s3.amazonaws.com/0/166456/da795ce3-0232-46fe-52a5-b50160ee5c1a.png)

## 追加したインタープリターの適用

![5.PNG](https://qiita-image-store.s3.amazonaws.com/0/166456/3792aaf4-81a4-6c27-0e75-416947ca7ff2.png)


以上の操作で、Remote の rbenv で使っている Gem を読み込ませることが出来ます。

# 参考文献
- [Qiita｜RubyMineでremoteのrbenvで使っているgemを読みこませる](https://qiita.com/nabeen/items/ad9fb4def376c3133a7c)
- [ASCII.jp｜Windows Subsystem for Linuxのファイルシステムを知る](http://ascii.jp/elem/000/001/250/1250797/)
- [RubyMine2018.1ヘルプ｜リモートインタープリタとしてのWSLの使用](https://pleiades.io/help/ruby/using-wsl-as-a-remote-interpreter.html)
bundle installでMySQLのエラー

こんなエラーが出た場合

```
checking for ruby/thread.h... yes
checking for rb_thread_call_without_gvl() in ruby/thread.h... yes
checking for rb_thread_blocking_region()... no
checking for rb_wait_for_single_fd()... yes
checking for rb_hash_dup()... yes
checking for rb_intern3()... yes
-----
Using mysql_config at /usr/local/bin/mysql_config
-----
checking for mysql.h... yes
checking for errmsg.h... yes
checking for mysqld_error.h... yes
-----
Don't know how to set rpath on your system, if MySQL libraries are not in path mysql2 may not load
-----
-----
Setting libpath to /usr/local/Cellar/mysql/5.7.16/lib
-----
creating Makefile

To see why this extension failed to compile, please check the mkmf.log which can be found here:

  /Users/user_name/Programs/web/test-repo/vendor/bundle/ruby/2.3.0/extensions/x86_64-darwin-15/2.3.0-static/mysql2-0.4.4/mkmf.log

current directory: /Users/user_name/Programs/web/test-repo/vendor/bundle/ruby/2.3.0/gems/mysql2-0.4.4/ext/mysql2
make "DESTDIR=" clean

current directory: /Users/user_name/Programs/web/test-repo/vendor/bundle/ruby/2.3.0/gems/mysql2-0.4.4/ext/mysql2
make "DESTDIR="
compiling client.c
compiling infile.c
compiling mysql2_ext.c
compiling result.c
compiling statement.c
linking shared-object mysql2/mysql2.bundle
ld: library not found for -lssl
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [mysql2.bundle] Error 1

```




##①mysqlのバージョンを確認

```
$ mysql --version
```

##②5.8系の場合
uninstallする


```
$ brew uninstall mysql
```


##③mysql install mysql56を実行し5.6系をインストール

```
$ brew install mysql56
```

すでに入っていると言われたときは

```
$ brew reinstall mysql56
```

##④一度linkを外す

```
$ brew unlink mysql@5.6
```

##⑤再度linkをつなぎ直す

```
$ brew link --force mysql56
```

##⑥再度bundle install

成功する！

これでも失敗した場合は↓↓↓↓

##⑦アプリのディレクトリでmysql2をインストール

```
$ sudo gem install mysql2 -v ‘0.3.18’ --source ’https://rubygems.org/'
```

##⑧bundle install
解決！
getUserMediaとMediaRecorder APIを使ってブラウザから録音

#概要
mediaDevices.getUserMediaとMediaRecorder APIを使ってブラウザ上での録音を試してみました。


#やりたいこと
- 1つのボタンで録音の開始と停止を切り替える
- getUserMediaとMediaRecorderで音を録音する
- audioタグに録音した音を再生する
- 録音中以外はgetUserMediaはオフにする

#環境
Mac iOS 10.11.6
Chrome 66.0.3359.181


#ソースコード
```html
<!DOCTYPE html>
<head>
　　　　<title>recording</title>
</head>
<body>
　　　　<div style="display:flex;">
  　　　　<button id="recorder">Record</button>
  　　　　<audio id="player" controls></audio>
　　　　</div>
</body>
<script>
if (!navigator.mediaDevices) {
 alert("mediaDevices is unavailable");
}

var mediaRecorder = null;
var localstream;

// 録音開始
rec_start = function(){
  navigator.mediaDevices.getUserMedia({audio:true})
    .then(function(stream) {
      localstream = stream;
      mediaRecorder = new MediaRecorder(stream);
      mediaRecorder.start();
    })
    .catch(function(e){
      console.log(e);
    });
}

// 録音停止
rec_stop = function(){
  mediaRecorder.stop();
  mediaRecorder.ondataavailable = function(e) {
    document.getElementById('player').src = URL.createObjectURL(e.data);
  }
  localstream.getTracks().forEach(track => track.stop());
}

document.getElementById('recorder').onclick = function(){
  // ボタンの色で録音開始、停止を切り替える
  if (this.style.backgroundColor == ''){
    rec_start();	// 開始
    this.style.backgroundColor = '#c71585';
  } else {
    rec_stop();		// 停止
    this.style.backgroundColor = '';
  }
}
</script>
```
これだけでブラウザから録音ができるのはとても簡単で良いですね。
mediaRecorder.ondataavailable部分の処理を変えれば、ファイル形式を指定して保存など色々できそうですね。



#参考
[MediaDevices.getUserMedia() - Web API インターフェイス | MDN](https://developer.mozilla.org/ja/docs/Web/API/MediaDevices/getUserMedia)
[MediaRecorder API - Web API インターフェイス | MDN](https://developer.mozilla.org/ja/docs/Web/API/MediaRecorder_API)
Checkio sum を使用しないでリスト内の要素を足す方法

久々にcheckioをやってみて、sumを使用しないでリスト内の要素を足して行く問題があった。
自分のコードができない理由が不明のため、メモとして保存しておく。

下記問題文

Our new calculator is censored and as such it does not accept certain words. You should try to trick by writing a program to calculate the sum of numbers.

Given a list of numbers, you should find the sum of these numbers. Your solution should not contain any of the banned words, even as a part of another word.

The list of banned words are as follows:

sum
import
for
while
reduce
Input: A list of numbers.

Output: The sum of numbers.

回答コード

```
scal = 0

def checkio(data):
    global scal
    if len(data) == 0:
        return scal
    else:
        scal += data[0]
        del data[0]
        return checkio(data)
```
Google ColaboratoryのGPU速度比較メモ

Google ColaboratoryのGPU(K80)の速度はどんなものかとKerasのmnistにて、ローカルマシンのGPU(Taitan X, GTX 1070)と比較したメモです。

#テスト方法

- GitHubよりKeras のmnistサンプルをColaboratoryのローカルにダウンロード

```
import urllib

url  = "https://raw.githubusercontent.com/keras-team/keras/master/examples/mnist_mlp.py" 
urllib.request.urlretrieve(url,'./mnist_mlp.py')

url  = "https://raw.githubusercontent.com/keras-team/keras/master/examples/mnist_cnn.py" 
urllib.request.urlretrieve(url,'./mnist_cnn.py')
```



- MLPでの実行時間を測定

```
%%time
%run -i mnist_mlp.py
```

- CNNでの実行時間を測定

```
%%time
%run -i mnist_cnn.py
```
※1回目はデータのダウンロードがあるので、2回目以降でのテスト結果です。

#結果
|GPU |MLP|CNN| 
|---|---|---|
|K80 (Google colaboratory)|80秒|129秒|
|Titan X Maxwell(ローカルマシン) |58秒|79秒|
|GTX 1070(ローカルマシン)|47秒|79秒|
matplotlibで自分の好きなフォントを入れる

(急いでメモとして書いているので、修正が加わる場合があります。)

ここでは、matplotlibにオリジナルのフォントを使う場合についてまとめます。とりあえずmatplotlib使って色々図を作って見たけれど、フォントが気に入らないんだよなって人向けです。

とりあえず自分の環境は、以下の通りです。
>MacOS High Sierra
version 10.13.5
Python 3.6.4 (default, Mar  9 2018, 23:15:03) 
[GCC 4.2.1 Compatible Apple LLVM 9.0.0 (clang-900.0.39.2)] on darwin

## ダウンロードしたttfを使いたい
pythonで日本語化するなどの以下の記事が参考になります。
[【matplotlib】日本語の設定](http://kaisk.hatenadiary.com/entry/2015/02/15/215831)
[](https://qiita.com/keisuke-nakata/items/2309764d21438645f6b9)
要点だけを言えば、
(1) [IPAフォント](https://ipafont.ipa.go.jp)などをダウンロード
(2) 解凍して、ttfファイル達を以下で表示される場所に設置。

```py

import matplotlib as mpl
mpl.matplotlib_fname()
```

`/path-to-install/python3.6/site-packages/matplotlib/mpl-data/matplotlibrc`と表示された場合、ダウンロード先は、
`/path-to-install/python3.6/site-packages/matplotlib/mpl-data/fonts`

(3) cacheとjsonの削除

```py

mpl.mlp.get_cachedir()
```

で得られるdirectory内のfontList.cacheとfontList.jsonをremove。
fontList.jsonは中に、matplotlibが自ら探し出したfontの情報が書き込まれている。ここに書かれているfontであれば利用できる。

## 別プログラムのあのフォントが使いたい

前項の最後、に書いたfontList.jsonに任意のpathのフォントを読み込む。
ここでは、TeXLive2017でインストールした際に一緒に入っていたIPAフォントをmatplotlibで認識させる。そのためのpythonでのコードは以下の通り。ただし、IPAフォントのパスを`/path-to-install/texlive/2017/texmf-dist/fonts/truetype/public/ipaex`としておく。
先にfontList.json, fontList.cacheをremoveする必要があるかもしれない。

```py

from matplotlib import font_manager as fm, rc

path_to_install='/path-to-install/texlive/2017/texmf-dist/fonts/truetype/public/ipaex/'
font_files = fm.findSystemFonts(fontpaths=path_to_install) # pathにあるttfファイルを見つける
font_list = fm.createFontList(font_files) # フォントリストを作成
fm.fontManager.ttflist.extend(font_list) # matplotlibのフォントリストに追加

```

今、パス先のディレクトリ内には以下のttfファイルが含まれている。

```bash

ipaexg.ttf ipaexm.ttf ipag.ttf   ipagp.ttf  ipam.ttf   ipamp.ttf
```

この時、`font_list`を`print`すると、以下のように表示される(見やすくするために、改行している)。

```py

[
<Font 'IPAexMincho' (ipaexm.ttf) normal normal 400 normal>, 
<Font 'IPAMincho' (ipam.ttf) normal normal 400 normal>, 
<Font 'IPAPGothic' (ipagp.ttf) normal normal 400 normal>, 
<Font 'IPAPMincho' (ipamp.ttf) normal normal 400 normal>, 
<Font 'IPAGothic' (ipag.ttf) normal normal 400 normal>, 
<Font 'IPAexGothic' (ipaexg.ttf) normal normal 400 normal>
]
```

これらのファイルがfontList.jsonに追加される。
読み込みができたとして、matplotlibのフォントの変更は、

```py

rc('font', family='IPAPMincho')
```

として完了となる。
ちなみに図を作成する際に読み込みを失敗していたら、

```bash

/path-to-install/python3.6/site-packages/matplotlib/font_manager.py:1328: UserWarning: findfont: Font family ['IPAPMincho'] not found. Falling back to DejaVu Sans
  (prop.get_family(), self.defaultFamily[fontext]))
```

みたいなエラー構文が出る。

---
参考 :
https://stackoverflow.com/questions/35668219/how-to-set-up-a-custom-font-with-custom-path-to-matplotlib-global-font
https://matplotlib.org/api/font_manager_api.html
メモ: Ruby の Net::FTP で分割ダウンロード

:thinking::thought_balloon: docs.ruby-lang.org か rubygems.org に良い感じの実装が転がっている気がするんだけど、みつけられてない。 

- [`Net::FTP#retrbinary`](https://docs.ruby-lang.org/ja/latest/method/Net=3a=3aFTP/i/retrbinary.html) を使ってオフセットを指定
    - [`Net::FTP#resume=`](https://docs.ruby-lang.org/ja/latest/method/Net=3a=3aFTP/i/resume=3d.html)で resume モードにしておく必要あり
- [`IO.copy_stream`](https://docs.ruby-lang.org/ja/latest/method/IO/s/copy_stream.html)
    - 良い感じの file 結合処理を思いつけず `IO.copy_stream` を使った
    - 並行分割ダウンロード結果を統合するロジックを分かっていない
- 同時接続数を制限しているサーバ相手には機能しない

```ruby
require 'net/ftp'
require 'tmpdir'
require 'thwait'

DEBUG = !ENV.fetch('DEBUG', '').empty?
CONCURRENT = ENV.fetch('CONCURRENT').to_i
FTP_HOST = ENV.fetch('FTP_HOST')
FTP_PORT = ENV.fetch('FTP_PORT').to_i
FTP_USER = ENV.fetch('FTP_USER')
FTP_PASS = ENV.fetch('FTP_PASS')
FTP_PATH = ENV.fetch('FTP_PATH')

def establish_connection
  Net::FTP.new(FTP_HOST, port: FTP_PORT, username: FTP_USER, password: FTP_PASS, passive: true, debug_mode: DEBUG)
end

content_size = establish_connection.size(FTP_PATH)
page_size = (content_size.to_f / CONCURRENT).ceil

Dir.mktmpdir do |dir|
  threads = []
  CONCURRENT.times do |i|
    offset = page_size * i
    next if offset >= content_size

    threads << Thread.start(i) do |t|
      File.open("#{dir}/#{t}", 'wb') do |page|
        ftp = establish_connection
        ftp.resume = true

        retrieved = 0
        ftp.retrbinary("RETR #{FTP_PATH}", Net::FTP::DEFAULT_BLOCKSIZE, offset) do |chunk|
          rest = page_size - retrieved
          retrievable = [rest, chunk.bytesize].min
          break if retrievable <= 0

          retrieved += page.write(chunk[0, retrievable])
        end
      end
    end
  end
  ThreadsWait.all_waits(*threads)

  File.open('downloaded', 'wb') do |output|
    CONCURRENT.times do |i|
      path = "#{dir}/#{i}"
      next unless File.exist?(path)
      IO.copy_stream(path, output)
    end
  end
end

__END__

### e.g. 495MB CentOS ISO file

ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-darwin17]

1: 165.29 real         5.34 user         4.74 sys
3:  99.68 real         5.23 user         6.12 sys
5:  88.19 real         5.56 user         7.43 sys
```
brew install時の''/usr/local/Homebrew/.git/index.lock': Permission denied'の対処方法

#はじめに
初歩的だとは思いますが、brew install時に
`/usr/local/Homebrew/.git/index.lock': Permission denied'`
となってしまいinstallができない際の対処方法を備忘録を含め記録として残したいと思います。

##①sudo chown -R $(whoami) $(brew --prefix)の実行をすることで解決。

```
Cannot save the current index state
Error: Could not 'git stash' in /usr/local/Homebrew!
Please stash/commit manually if you need to keep your changes or, if not, run:
  cd /usr/local/Homebrew
  git reset --hard origin/master
```
とターミナルから返答があったっため、

```  
  cd /usr/local/Homebrew
  git reset --hard origin/master`
```
指示通りに実行しましたが、

`fatal: Unable to create '/usr/local/Homebrew/.git/index.lock': Permission denied`

とのことで拒否をされてしまいました。

以下のコマンドを押下することで無事にインストールができるようになりました。

`sudo chown -R $(whoami) $(brew --prefix)/*`

引用元
①https://www.jianshu.com/p/197212d6a4c3
②https://blog.csdn.net/jinleis/article/details/75029912

解決はしましたが、理由に自信が無いためコマンド入力の際はご注意頂ければ幸いです。
IntelliJでのscalaによるApache sparkことはじめ

表題のような記事がなかなかないので備忘録として記載しています。
IntelliJおよびscala, sbtのプラグインはインストールしたものとして進めます。ちなみに以下のURLを参考にしています。
[Creating a Spark Project with SBT, IntelliJ, sbt-spark-package, and friends](https://medium.com/@mrpowers/creating-a-spark-project-with-sbt-intellij-sbt-spark-package-and-friends-cc9108751c28
)
# sbt-spark-packageの追加
Apache sparkの起動が楽になるように、IntelliJのプラグインを作っているようです。
[databricks/sbt-spark-package](https://github.com/databricks/sbt-spark-package)
新しく作ったSBTプロジェクトにproject/plugins.sbtを作って以下を記載しましょう。

```
resolvers += "bintray-spark-packages" at "https://dl.bintray.com/spark-packages/maven/"

addSbtPlugin("org.spark-packages" % "sbt-spark-package" % "0.2.6")
```

重要なのは、sparkはscala2.12をサポートしていないということで、普通にインポートするとエラーが出る。build.sbtとproject/build.propertiesには以下を書いておく。sbtも最新のバージョンだとscala2.12以降を使っていて都合が悪い。[ここ](https://issues.apache.org/jira/browse/SPARK-14220)を見るともう少しで解決されそう。

```build.sbt
scalaVersion := "2.11.12"
sparkVersion := "2.2.0"
```

```project/build.properties
sbt.version = 0.13.17
```

これで準備が整った。

# Spark Shellの起動（REPL)
sbt consoleタスクを実行するといわゆるspark shell（インタラクティブモード）が実行できる。

sbt packageコマンドでJARを自動生成してくれる。これは便利。
ちなみに以下の感じで出力する名称の変更も可能なようだ。

```build.sbt
artifactName := { (sv: ScalaVersion, module: ModuleID, artifact: Artifact) =>
  artifact.name + "_" + sv.binary + "-" + sparkVersion.value + "_" + module.revision + "." + artifact.extension
}
```

いろいろと便利であることは分かったが、このパッケージは少しToo muchかもしれません。
普通にspark関連のパッケージを追加したりしたほうが楽かも。

普通にやる場合はこんな感じのbuild.sbtとなる。依存のコンポーネントは適宜追加が必要です。

```build.sbt
name := "spark_sample"

version := "0.1"

scalaVersion := "2.11.12"

// https://mvnrepository.com/artifact/org.apache.spark/spark-core
libraryDependencies += "org.apache.spark" %% "spark-core" % "2.2.0"
```

ワードカウントを作って動かしてみる。
これはlibraryDependenciesを"provided"にしていなければ、ローカルで普通に動きます。

```WorldCount.scala

import org.apache.spark.{SparkConf, SparkContext}


object WordCount{

  def main(args:Array[String]): Unit = {
    val conf = new SparkConf().setAppName(this.getClass.toString)
    try {
      conf.get("spark.master")
    } catch {
      case e: NoSuchElementException => conf.setMaster("local[*]")
    }
    val sc = new SparkContext(conf)

    val textFile = sc.textFile("C:\\Users\\takas\\Documents\\schema.log")
    val words = textFile.flatMap(line => line.split(" "))
    val wordCounts = words.map(word => (word, 1)).reduceByKey((a,b) => a+b)
    println(wordCounts)
  }
}

```
MySQL バージョンアップしたらオワタ

# したこと

```bash:update
$ brew upgrade --cleanup
```

```bash:version
$ mysql --version
mysql  Ver 8.0.11 for osx10.13 on x86_64 (Homebrew)
```

MySQL がバージョンアップされ色々と不都合が生じた
例えば

- テーブルが全部消えた
- Sequel Pro からアクセスできない
- MySQL を DB としたアプリが起動できない

上の3つの問題を解決したい

## テーブルが全部消えた

```bash:upgrade
 mysql_upgrade -u root -p
```

これやったら復活した
詳細覚えていない

## Sequel Pro からアクセスできない

まだ未解決

![image.png](https://qiita-image-store.s3.amazonaws.com/0/123610/e0604d8a-56c8-7f15-600d-c9c3ff7dd1aa.png)

データベース選択 ->
でエラーが発生します

解決できた方いたら、教えて欲しいです

## MySQL を DB としたアプリが起動できない

```bash:rails
$ bundle exec rails s
/Users/yuto.maejima/work/projects/[repository]/vendor/bundle/ruby/2.1.0/gems/mysql2-0.4.4/lib/mysql2.rb:31:in `require': dlopen(/Users/yuto.maejima/work/projects/[repository]/vendor/bundle/ruby/2.1.0/extensions/x86_64-darwin-17/2.1.0-static/mysql2-0.4.4/mysql2/mysql2.bundle, 9): Library not loaded: /usr/local/opt/mysql/lib/libmysqlclient.20.dylib (LoadError)
  Referenced from: /Users/yuto.maejima/work/projects/[repository]/vendor/bundle/ruby/2.1.0/extensions/x86_64-darwin-17/2.1.0-static/mysql2-0.4.4/mysql2/mysql2.bundle
  Reason: image not found - /Users/yuto.maejima/work/projects/[repository]/vendor/bundle/ruby/2.1.0/extensions/x86_64-darwin-17/2.1.0-static/mysql2-0.4.4/mysql2/mysql2.bundle
```

エラーのポイントはここ↓

```bash:error
Library not loaded: /usr/local/opt/mysql/lib/libmysqlclient.20.dylib (LoadError)
```

 該当のディレクトリを調べる


```bash:ls
＄ cd /usr/local/opt/mysql/lib
total 11M
drwxr-xr-x  8 yuto.maejima admin  256  4  8 16:02 ./
drwxr-xr-x 15 yuto.maejima admin  480  6 19 00:22 ../
-r--r--r--  1 yuto.maejima admin 5.2M  6 19 00:22 libmysqlclient.21.dylib
-r--r--r--  1 yuto.maejima admin 5.8M  4  8 16:02 libmysqlclient.a
lrwxr-xr-x  1 yuto.maejima admin   23  4  8 16:02 libmysqlclient.dylib -> libmysqlclient.21.dylib
-r--r--r--  1 yuto.maejima admin 9.4K  4  8 16:02 libmysqlservices.a
drwxr-xr-x  3 yuto.maejima admin   96  6 19 00:22 pkgconfig/
drwxr-xr-x 91 yuto.maejima admin 2.9K  4  8 16:02 plugin/
```

確かにない、 `libmysqlclient.20.dylib` が

名前変えちゃえ

```bash:rename
$ mv libmysqlclient.dylib libmysqlclient.20.dyli
```

これでなおった

## 参考

[rails\-mysql rake db :create \- Library not loaded libmysqlclient\.20\.dylib image not found \- Stack Overflow](https://stackoverflow.com/questions/33812922/rails-mysql-rake-db-create-library-not-loaded-libmysqlclient-20-dylib-image-n)

gem 入れ直してもダメでした
WindowsFormsHostをWPFで表示したときの問題

Windows用ソフトの開発で無駄に引っかかったのでメモ  

# WPF内にWindowsFormsHostを入れてはいけない

WPF内でもちゃんと拡縮を設定してやりさえすれば表示自体は問題なく成功する(サイズ変更をしているだけなので当たり前)
問題はScrollviewerなどの`実際にView自体は拡縮されずクリッピングして表示するビュー`の場合。
WidnowsFormsHostの表示がWPFのアイテムの上に表示されてしまう。
- ハイブリッド アプリケーションのトラブルシューティング
  - https://docs.microsoft.com/ja-jp/dotnet/framework/wpf/advanced/troubleshooting-hybrid-applications#overlapping-controls

> WPFでホストされるWindowsフォームコントロールは、常にWPFコンテンツの上に表示されます。

WPFが表示順序でWindowsFormsHostに負けるのは仕様でした。

## 対処方法
- WPFでWindowsFormsHostを使わない
  - 既存があるからと言って使ってもろくなことになりません  
  移植する場合はおとなしくWPFに書き換えるほうが無難


### どうしても使いたい
#### まだ現実的な方法
- WPFのアイテムにかぶらないようにレイアウトする
  - GridやStackPanelみたいないい感じに並べてくれるやつに入れる
- Scrollviewerのようなクリッピングで表示制限をするようなオブジェクトに入れない

#### できればやりたくない方法
- リサイズイベントで制御する
  - Scrollviewerの場合、スクロールさせるとめり込むので、表示領域より小さく表示させる必要がある  
  Scrollviewerに入っているにもかかわらずスクロールしないという気持ち悪いものができてしまう
- クリッピングを自前で作って頑張る
  - できるかどうかは知らないが、表示領域や、スクロール位置、更に上の階層の表示領域とスクロール位置...と考慮する必要があるから絶対やりたくない

まあそこまでして頑張るのもコストがかかる上に、今後同じコードを使う場合のことも考えると作り直すべき。
すでに作られているソフトをWPFにリファクタ、もしくは一部機能を移植して使ったりするとだいたい起きてしまう。

代々継ぎ足されてきた秘伝のソースはWPFを継ぎ足すと腐るのでやめておきましょうということです。

# まとめ
とにかくWPFとWindowsFormsHostの共存は基本的にしないようにしましょう。
どうしても使いたい場合絶対にScrollViewerのようなクリッピング表示をするViewに入れないこと。
そうでなければゴリ押しコードを書く羽目になります。
問題が起きる場合はUIの仕様を考え直すほうがコストは抑えられるはず。

# おまけ
## WindowsFormsHostを使用したときの描画問題
- http://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/2644120-bring-back-the-hwndhost-isredirected-and-compositi

- 要約
  - 投稿者: 4.5のプレビュー版で入ってた表示問題の機能が消されたけどどうして？  
あれがあったらみんなハッピーになれるんだけど入れてくれないの？
  - VSチーム: 残念ながらこの機能は追加しません(きっぱり)

この投稿も2012年の話なのでもう諦めるしかないようです。
Apache・getsslでhttpsサーバ構築

# Apache・getsslでhttpsサーバ構築

本稿はApache・getsslで[Let's Encrypt](https://letsencrypt.jp/)を使ったhttpsサーバを構築した際の自分用メモ。

## getsslの設定

### getsslの取得

以下からスクリプトを取得する。

https://raw.githubusercontent.com/srvrco/getssl/master/getssl

[Wiki](https://github.com/srvrco/getssl/wiki)の説明ではcurlを使用している。

```
$ curl --silent https://raw.githubusercontent.com/srvrco/getssl/master/getssl > getssl
```

取得後、以下のようにして実行権限を付与する。

```
$ chmod 700 getssl
```

### 設定ファイルを作成

getsslのcオプションで設定ファイルの雛形を作成できる。

```
$ ./getssl -c yourdomain.com
```

yourdomain.comの部分は自分が使用したいドメイン名である。
getsslは-hや--helpでヘルプを確認できる。

### 自分用の設定を追加。

作成した設定ファイル($HOME/.getssl/yourdomain.com/getssl.cfg)に、
必要に応じて設定を追加する。
設定なしでもデフォルトでいろいろな設定がされているが、
ACLやACCOUNT_EMAILなどは環境に応じて変える必要がある。
(ACCOUNT_EMAILを設定せずに動くようだが)

```
ACL=('/var/local/web/.well-known/acme-challenge')
ACCOUNT_EMAIL="me@example.com"
```

### SSL証明書の取得・更新

設定ができたら以下のようにして実行する。

```
$ ./getssl yourdomain.com
```

正常に実行できれば「$HOME/.getssl/yourdomain.com/」に
サーバ証明書やCA証明書、秘密鍵などが取得される。
上記のコマンドでSSL証明書の取得も更新も全てできる。
(必要に応じて-qなどのオプションを指定した方がいいが)

## Apacheの設定

Apacheはデフォルトでは、SSLモジュールは取り込まれていないのでモジュールを追加する。
また、当然SSL用の設定ファイルも使用されていないので、
取り込み設定を追加する。

```conf/httpd.conf
LoadModule ssl_module modules/mod_ssl.so

Include conf/extra/httpd-ssl.conf
```

ドキュメントルートやサーバ名など、本人用の設定、
またgetsslで取得したサーバ証明書や中間証明書、ドメインの秘密鍵などを設定する。

```conf/extra/httpd-ssl.conf
<VirtualHost _default_:443>
DocumentRoot "/var/local/web"
ServerName yourdomain.com:443
ServerAdmin you@yourdomain.com

SSLCertificateFile "/root/.getssl/yourdomain.com/yourdomain.com.crt"
SSLCertificateKeyFile "/root/.getssl/yourdomain.com/yourdomain.com.key"
SSLCertificateChainFile "/root/.getssl/yourdomain.com/chain.crt"
</VirtualHost>  
```

記載してないパラメータはデフォルトのまま。

## 参考

* https://github.com/srvrco/getssl/wiki
学ぶことを考えた話


# 学び方の種類

`poem`タグを有効利用してみます。
何かを学ぶ時、そこにはいくつかの枠組みがるなという感覚はあったのですが、先日、とある勉強会で「耳学問」というフレーズを仕入れたのでそれに倣って体系化してみました。

## 眼学問
誰かが書いたものから知りたいことを読み取るという学びの手法。

「読む」ことと「読み取る」ことは、重なってはいますが一致はしていません。「読み取る」のは非常に能動的なプロセスで、自分が知りたい事に対して何がどの程度得られているのかを常に意識しながら読み進める事でクオリテイを上げることができるようです。

## 耳学問
誰かの語りから知りたいことを聞き取るという学びの手法。

「聞き取る」については承前。眼学問に比べて1段階ぐらい受動的なプロセスだと思います。知りたいことという軸をしっかり持って、主体的に聞き取りに行く事も大切です。が、それに加えて、想定していなかった内容であったり喋り方や伝え方といったメタ的な情報を浴びるという体験を大切にするとクオリティを上げることができるようです。

## 手学問
自分の手を動かして知りたいことを知るという学びの手法。

キーボードを叩く、身体を動かす、考える、など、自分のバイオリソースを費やし、無いものを作り出す事で理解が進めます。非常に能動的なプロセスであり、必ず得られるものがあります。リソースの限界量がボトルネックになりますが、投資に見合う成果はよく相関します。何をどのぐらいどう投資するのかを動き出す前によく練り上げる事でクオリティを上げることができるようです。

## 口学問
誰かに自分の知っていることを伝える過程で知識を作るという学びの手法。

「知りたいことを知る」と、「知識を作る」というのは重なっていますが一致してはいません。「知る」というのは「知ったら終わり」です。「知識」は、他のヒトと共有できなければなりません。共有できるようにするためには、体系的なフォーマットを満たす必要があります。このプロセスを通して時間を止めることができます。これは非常に能動的なプロセスであり、投資量に対して成果量は必ずしも相関しません。どのフォーマットの上で誰を対象に何を知識として共有するのかを意識的に調整しないと、投資量だけ無尽蔵に増え続けるので注意が必要です。
Google CloudでKVMを使えるようにするには

Google CloudでKVMを使えるようにするには。
GCPで借りたVM上でKVMを使用してNested Virtualizationを実現するのが難しかったのでメモ

基本的には以下の手順に従って、Nested Virtualization可能なVMを作る。
https://cloud.google.com/compute/docs/instances/enable-nested-virtualization-vm-instances

特殊なAPIを発行する必要がある模様。

RHEL7やCentOS7でKVMを使えるようにするには？
https://www.linuxtechi.com/enable-nested-virtualization-kvm-centos-7-rhel-7/

更にその上でESXiを立てる際の考慮点
https://lists.centos.org/pipermail/centos-virt/2015-November/004780.html

◆KVM作成時のCPU設定
必ずCopy Host CPU Configurationにチェックする

![image.png](https://qiita-image-store.s3.amazonaws.com/0/245585/ac103385-6b22-ad0d-ecc6-c158ea40add6.png)
KerasでMNISTのメモ

以下の写経以外何もしてません。
- http://aidiary.hatenablog.com/entry/20161109/1478696865
- https://qiita.com/PinappleHunter/items/e4ddf4a0062726af08c8#%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E4%BD%BF%E3%81%88%E3%82%8B%E5%BD%A2%E3%81%AB%E5%A4%89%E6%8F%9B%E3%81%99%E3%82%8B

KerasのDocumentation
- https://keras.io/ja/


# 準備
裏でTensorflowを使っているので、Tensorflowを入れる

```
pip install tensorflow
```

Kerasのインストール

```
pip install keras
```

上記サイトでモデルの構造を画像で保存する機能を使っているので、その準備

```
brew install graphviz
pip install pydot
```


# 実装の写経
ただ上記を真似しただけ。

```python
# データセット準備
from keras.datasets import mnist
from keras.utils import np_utils

(x_train, y_train), (x_test, y_test) = mnist.load_data()

　#　インプットの形式変換
x_train = x_train.reshape(len(x_train),784)
x_test = x_test.reshape(len(x_test), 784)

x_train = x_train.astype("float32")
x_test = x_test.astype("float32")

x_train /= 255
x_test /= 255

print(x_train.shape[0], "train samples")
print(x_test.shape[0], "test samples")

nb_classes = 10

y_train = np_utils.to_categorical(y_train,nb_classes)
y_test = np_utils.to_categorical(y_test, nb_classes)


# モデル定義
from keras.models import Sequential
from keras.layers.core import Dense, Dropout, Activation
from keras.optimizers import Adam

def build_multilayer_perceptron():
    model = Sequential()
    model.add(Dense(512, input_shape=(784,)))
    model.add(Activation("relu"))
    model.add(Dropout(0.2))
    model.add(Dense(512))
    model.add(Activation("relu"))
    model.add(Dropout(0.2))
    model.add(Dense(10))
    model.add(Activation("softmax"))
    return model

model = build_multilayer_perceptron()

# modelのsummaryを表示＆画像でも表示
from keras.utils.vis_utils import plot_model

model.summary()
plot_model(model, show_shapes=True, show_layer_names=True, to_file="model.png")

# model構築
model.compile(loss="categorical_crossentropy", optimizer=Adam(), metrics=["accuracy"])

# 学習
from keras.callbacks import EarlyStopping

early_stopping = EarlyStopping(patience=0, verbose=1)
history = model.fit(x_train, y_train, batch_size=32, epochs=100, verbose=1, validation_split=0.1, callbacks=[early_stopping])

# 予測
model.evaluate(x_test, y_test)
# [0.07958280239470332, 0.979]
```
Ruby on Rails における build メソッドと new メソッドの違い

# 結論

違いはない
`build` は `new` のエイリアス

[build \- リファレンス \- \- Railsドキュメント](http://railsdoc.com/references/build)

## 用途の違い


> 暗黙の了解で、モデルを関連付けしたときにbuildを使うみたいな感じになっているんですね。

とのこと
参照：[newとbuildの違い \- Qiita](https://qiita.com/Kaisyou/items/8876f39e12631f4e5154#comment-8bf33790f4b7e10249f0)

## メモ

1対多 子クラス生成 方法

TODO: それぞれ違いをまとめておきたい

```ruby
# OK
thum = thumbnails.build(image: file)
thum.save!

# not reccomended
thum = Thumbnail.new(image: file)
thum.banner_id = self.id
thum.save!

# Also OK
thumbnails.create!(image: file)

# Also OK
thumbnails << Thumbnail.new(image: file)
```

## 参考

[Rails4で1対多のリレーションをモデルに実装する \- Rails Webook](http://ruby-rails.hatenadiary.com/entry/20141203/1417601540)
[【Rails入門】has\_many、belongs\_toの使い方まとめ \| 侍エンジニア塾ブログ \| プログラミング入門者向け学習情報サイト](https://www.sejuku.net/blog/26617)
おすすめのGoogle Slideテンプレート

## テンプレート
### [Slides Carnival](https://www.slidescarnival.com/ja/)
![Screen Shot 2022-06-09 at 21.33.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265961/a78a0f16-72d6-4dc1-abe9-030b47b5aa69.png)

- Link: [SlidesCarnival](https://www.slidescarnival.com/ja/)

### [Slides PPT](https://slidesppt.com/)
![Screen Shot 2022-06-09 at 21.35.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265961/f7817e3f-c850-b194-42df-7bd7e3bc695e.png)

- Link: [SlidesPPT](https://slidesppt.com/)

### [テンプレートパーク](https://template-parks.com/presentation)
![Screen Shot 2022-06-09 at 21.35.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265961/82501623-8234-4d49-a1c7-fdb070ef456b.png)

- Link: [テンプレートパーク](https://template-parks.com/presentation)

## アイコン
### [Google Cloud Official Icons and Solution Architectures](https://docs.google.com/presentation/d/1aGOTpNdCoO4GXZ2es38ZFO5qPGEAjTtDSVeHaDpwsas/edit)

![Screen Shot 2022-06-09 at 21.39.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265961/6f1fd5b2-6199-416c-d7e0-2fcba9dde4c4.png)

- Link: [Google Cloud Official Icons and Solution Architectures](https://docs.google.com/presentation/d/1aGOTpNdCoO4GXZ2es38ZFO5qPGEAjTtDSVeHaDpwsas/edit)
Twitter認証に404エラーで失敗するときのチェックリスト

#環境　
ローカル環境でRubyOnRailsを使用しています。
以下、認証に成功するまでにチェックしたポイントです。

#1.アクセスしているURLの確認

Twitter側の設定でWebsite項目に127.0.0.1:3000を登録している場合、localhost:3000を指定してアクセスすると認証失敗します。127.0.0.1:3000でアクセスしてください。

<img width="500" alt="スクリーンショット 2018-06-23 15.02.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/162167/92eb73a4-b26b-c186-64fd-50bd63faaf1e.png">


#2.Callback URLsの設定
Callback URLを設定しない場合、認証に失敗しました。

DeviceとOmniAuthの場合は、devise.rbに`callback_url: "http://127.0.0.1:3000/users/auth/twitter/callback"`を追加してください。

```ruby:config/initializers/devise.rb
# ==> OmniAuth
  # Add a new OmniAuth provider. Check the wiki for more information on setting
  # up on your models and hooks.
  # config.omniauth :github, 'APP_ID', 'APP_SECRET', scope: 'user,public_repo'

  config.omniauth :twitter,ENV['TWITTER_ID'],ENV['TWITTER_SECRET'],callback_url: "http://127.0.0.1:3000/users/auth/twitter/callback"
```
同じURLをTwitter設定側のCallback URLsに設定します。

#3.APP_ID, APP_SECRETが正しいか確認

認証にはConsumer keyとConsumer Secretを使用します。
指定は間違っていないか、スペースなど入っていないか確認しましょう。

<img width="451" alt="スクリーンショット 2018-06-23 15.19.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/162167/3dc650f3-ffb5-821d-de32-2441569b74d4.png">


#参照までに全体の設定状況です。

<img width="440" alt="スクリーンショット 2018-06-23 15.25.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/162167/dd77496a-84b8-82b4-d47b-ba16fff71f19.png">
VBAで自動的にサイトの特定箇所に文字入力をする際の注意点

一番初めに開いたサイトの次のページを表示し、そのページに自動で文字を入力させたい時の注意点を自分なりに発見したので記す。


プログラミングは細かく指示をしなくてはならない。
「どこに」「何を」「どのように」するのかを指示するのが重要である。

一番初めに開いたサイトの次のページに文字を入力させたい場合

例えば↓↓

```vb
Set objShell = WScript.CreateObject("WScript.Shell")
objShell.RegWrite "HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Zoom\ZoomFactor",100000,"REG_DWORD"

Set objIE = CreateObject("InternetExplorer.Application")
objIE.Visible = True

objIE.Navigate "一番初めのURL"

Do Until objIE.Busy = False
    WScript.sleep(250)
Loop

objIE.Document.Forms(0).Item(2).value = ""　’ログインし次のページに遷移
objIE.Document.Forms(0).Item(3).value = ""
objIE.Document.Forms(0).Submit

Set WSHShell = WScript.CreateObject("WScript.Shell")
WSHShell.AppActivate "Explorer"

WScript.sleep(7000)

Dim strUrl
strUrl = "ログイン後のサイトのURL"　’ここでログイン後のURLを指定

objIE.navigate strUrl

WScript.sleep(7000)

Dim htmlDoc
Set htmlDoc = objIE.document

htmlDoc.getElementById("name").Value = "入力文字"
```
のように、場所を指定してあげることが重要。

```vb
Dim strUrl
strUrl = "ログイン後のサイトのURL"　’ここでログイン後のURLを指定
```
これが抜けてしまうと、一番最初のページで入力すると言うことになってしまうので
「オブジェクトがない」と言うエラーが起こる。
Phar ファイルと Phar フォーマットと、「スタブコード」から呼ばれるエントリポイントについて


# Phar ファイルと Phar 形式

`*.phar` ファイルは “Phar file” と呼ばれる、PHP で複数のファイルをアーカイブして配布 and/or 実行する形式のファイル（アーカイブファイル）のこと。

Phar ファイルの形式としては 3 種類あり、Zip フォーマット、Tar フォーマットと、ネイティブで専用の Phar フォーマットとである（「Phar ファイル」と「Phar フォーマット」の違いに注意）。zip フォーマットと tar フォーマットはそのまま zip や tar のファイルで、メタ情報はアーカイブファイルのルートの `.phar/` に格納される。phar フォーマットではメタ情報はアーカイブコンテンツとは別の領域に格納される。

PHP コード内からであれば、ファイルシステム上のファイルへのアクセスのようにだいたい透過的にアクセスすることができるようになっている。

# Phar フォーマット

「phar ファイル形式は スタブ/マニフェスト/コンテンツ/シグネチャ で構成されており」 // [PHP: Phar ファイルフォーマット - Manual](http://php.net/manual/ja/phar.fileformat.phar.php)

この「スタブ」は PHP コードであり、Phar ファイルからプログラムを起動する際に用いられる。「スタブ」という用語的にはやや変な感じもするんですが、「スタブ」の語は「全体から、本質の部分を欠くか消費するかして残る小片」の意味があるので、「Phar ファイルから、本質部分である PHP コードの集合を除いた部分の、単なるブート用コード」の意味で「スタブ」と呼称しているものと思われる。

スタブコードを表示するには、 `phar(1)` コマンドを用いて以下のようにする。

```
$ phar stub-get -f composer.phar
#!/usr/bin/env php
<?php

// ... 中略 ...

Phar::mapPhar('composer.phar');
require 'phar://composer.phar/bin/composer';

__HALT_COMPILER(); ?>
```

`Phar::mapPhar` では、この Phar ファイルを第一引数で指定した Phar 名のエイリアスにマップする。正確に言うと、 `__HALT_COMPILER()` を呼んでいる Phar ファイルの `__HALT_COMPILER();` よりも後ろの部分（PHP コード中からは `__COMPILER_HALT_OFFSET__` で参照できるオフセット位置以降の内容）を Phar ライブラリを使ってアクセスできるようにマップする。

上の例であれば、

1. 本体（ `__HALT_COMPILER()` 以降のファイルの内容）を `composer.phar` の名前で Phar しとてマップして（ `mapPhar` ）
2. エントリポイントからを実行して（ `require` ）
3. おしまい（ `__HALT_COMPILER()` ）となる

「マニフェスト」は「積荷の目録」であり、「コンテンツ」に載っているファイル群の一覧である。そして「コンテンツ」はデータそのものが格納される領域。

そして `require 'phar://composer.phar/bin/composer'` しているわけだから、これがエントリポイントになる。

このローダコードを自分で書いて Phar ライブラリなり `phar(1)` コマンドなりでセットしても良いのですが、簡単に作ってくれる用のツールがある。 // [Box by box-project](https://box-project.github.io/box2/)



# コマンド

Phar フォーマットか Tar フォーマットの Phar ファイルかとか考えずに、 `phar(1)`
 コマンドや Phar ライブラリで統一的に扱える。

ファイル一覧。 
 
`phar tree -f /usr/local/Cellar/composer/1.5.2/libexec/composer.phar`

スタブコード表示。


`phar stub-get -f /usr/local/Cellar/composer/1.5.2/libexec/`
emacs の org-mode と google calendar を連携させる org-gcal



# 目的

google calendar の内容を org ファイルと同期連携させる


# 設定

1.  gogole calendar API の有効化
    1.  [Google Developers Console](https://console.developers.google.com/cloud-resource-manager) へアクセス
    2.  [プロジェクトを作成] を選択
    3.  [プロジェクト名] に [org-gcal] を入力
    4.  [作成] を選択
    5.  プロジェクトの選択より、[org-gcal] を選択
    6.  バーガーメニューより、[API とサービス] > [ライブラリ] を選択
    7.  [google calendar] で検索
    8.  [Google Calendar API] を選択 <sup><a id="fnr.1" class="footref" href="#fn.1">1</a></sup>
    9.  [有効にする] を選択
    10. [認証情報を作成] を選択
    11. [API を呼び出す場所] で [その他の UI (Windows、CL ツールなど)] を選択
    12. [アクセスするデータの種類] で [ユーザーデータ] を選択
    13. [必要な認証情報] を選択
    14. [OAuth 2.0 クライアント ID を作成する] にて、[org-gcal] を入力
    15. [OAuth クライアント ID を作成] ボタンを選択
    16. [OAuth 2.0 同意画面を設定する] で以下を設定
        -   メールアドレス : (メールアドレスを選択)
        -   ユーザーに表示するサービス名 : (適当に org-gcal など)
    17. [次へ] を選択
    18. [認証情報をダウンロードする] で [ダウンロード] を選択
    19. ダウンロードされた [client\_id.json] を開き、 client\_id、client\_secret の値を確認
        
        ```json
        {
          "installed": {
            "client_id": "ThisIsClientID",
            "project_id": "ThisIsProjectID",
            "auth_uri": "ThisIsAuthURL",
            "token_uri": "ThisIsTokenURL",
            "auth_provider_x509_cert_url": "ThisIsCertURL",
            "client_secret": "ThisIsClientSecret",
            "redirect_uris": [
              "ThisIsURN",
              "ThisIsHTTP"
            ]
          }
        }
        ```
2.  [カレンダー ID] の取得
    1.  [Google Calendar](https://calendar.google.com) にアクセス
    2.  [歯車マーク] > [設定] を選択
    3.  [マイカレンダーの設定] の中から同期したいカレンダーを選択
    4.  [カレンダー ID] の値をメモ (e.g. sample@foo.google.com)
3.  org-gcal.el のインストール (M-x package-install org-gcal)
4.  init.el を設定
    
    ```elisp
    (require 'org-gcal)
    (setq
     org-gcal-client-id
     "ThisIsClientID"
     org-gcal-client-secret "ThisIsClientSecret"
     ;; ID が sample@foo.google.com のカレンダーと ~/calendar.org を同期
     org-gcal-file-alist '(
                           ("sample@foo.google.com" .  "~/calendar.org")
                           ;; ("sample2@foo.google.com" .  "~/calendar2.org")
                           ))
    ;; token の保存場所を変更
    (setq org-gcal-dir "~/Dropbox/.emacs.d/local-lisp/org-gcal")
    ```
5.  M-x org-gcal-fetch を実行
6.  ブラウザが開いて、token が表示されるので、コピーしてミニバッファに入力


# 使い方

-   M-x org-gcal-sync で同期
-   M-x org-gcal-post-at-point でカーソル位置の内容をカレンダーに登録
-   M-x org-gcal-delete-at-point で削除


# やりたいけど、分からないこと

-   Time Zone の連携
-   M-x org-gcal-fetch/sync の定期実行方法
-   M-x org-set-tags-command との連携
-   M-x org-schedule との連携
-   階層のつけ方


# 参考

-   [Org sync with Google Calendar ](https://github.com/myuhe/org-gcal.el)


# &#33050;&#27880;

<sup><a id="fn.1" href="#fnr.1">1</a></sup> 同じアイコンの [calDAV] に注意
【AWSメモ①】EC2インスタンス作成からSSHログインまで

## 環境
・windows 10 Pro 64bit
・Tera Term (ホスト接続用)

## リージョンの設定

コンソールにログイン後、リージョンを「アジアパシフィック（東京）」に変更

<img src="https://qiita-image-store.s3.amazonaws.com/0/180939/5908a06f-1a34-24f5-8497-05252964f25d.png">

## インスタンスの作成

### Amazon マシンイメージ(AMI)

一番上の「Amazon Linux AMI （HVMタイプ）」を選択。

<img src="https://qiita-image-store.s3.amazonaws.com/0/180939/2cf567f2-a2af-f70e-ae2f-1af10f1264e3.png">

補足：「Amazon Linux 2 LTS」は Amazon Linux の後継OS

### インスタンスタイプの選択

AWS 無料利用枠の対象の「t2.micro」を選択。

<img src="https://qiita-image-store.s3.amazonaws.com/0/180939/5486018d-a451-2b53-bdca-99f72f86cb62.png">


補足：「t2.micro」インスタンスは最初の 12 か月間は、毎月最大 750 時間のマイクロインスタンスを利用できる。


### インスタンス詳細の設定

初期設定のまま「作成」ボタンを押下。


### キーペアの作成

「作成」ボタンを押下すると、キーペアの設定画面が表示されるので、「新しいキーペアの作成」を選択する。

<img src="https://qiita-image-store.s3.amazonaws.com/0/180939/a99b281a-8b53-88e4-375b-f6dabb21c878.png">

<img src="https://qiita-image-store.s3.amazonaws.com/0/180939/2a5b895b-bab6-74e6-0173-e5517660d1a7.png">


キーペア名を入力後、「キーペアのダウンロード」ボタンを押下してキーファイルをダウンロードする。
ダウンロードが完了したら「インスタンスの作成」ボタンを押下する。

<img src="https://qiita-image-store.s3.amazonaws.com/0/180939/78298f9f-1c4b-e4e0-9f41-205e8ef44080.png">

インスタンスの作成完了後、「インスタンスの表示」ボタンを押下する。
<img src="https://qiita-image-store.s3.amazonaws.com/0/180939/9efa77ef-0e1f-8aa9-fb77-4230dacf1f5d.png">

### セキュリティグループの作成

※ 後の手順でSSH接続で行うためパブリックDNSを控えておく。

作成したインスタンスの名前変更後、「launch-wizard-1」を押下する。
<img src="https://qiita-image-store.s3.amazonaws.com/0/180939/bd4f4bdf-65f9-0241-7cce-cd76fe30c23b.png">

「アクション」ボタンを押下して、「インバウンドのルールの編集」を押下する。
<img src="https://qiita-image-store.s3.amazonaws.com/0/180939/ac6b109c-8da5-babc-f038-5c1ec5988a0f.png">

「ルールの追加」ボタンを押下して、HTTP接続のルールを追加する。
追加が完了したら「保存」ボタンを押下する。
<img src="https://qiita-image-store.s3.amazonaws.com/0/180939/bb11b2c4-0c1e-c98b-a353-d80d8bc7ea73.png">

### サーバー接続

Tera Term を使用して接続する。
ホスト名に パブリックDNS を入力して、TCPポートが22(SSH)になっていることを確認後、「OK」ボタンを押下する。

<img src="https://qiita-image-store.s3.amazonaws.com/0/180939/0c5f97ca-b605-1b33-e759-9fe4a6e13cf5.png">

SSH認証ウィンドウのユーザー名の欄にユーザー名(初期ユーザーは ec2-user)を入力。
「RSA/DSA/ECDSA/ED25519鍵を使う」にチェックを入れる。
「秘密鍵」ボタンを押下して、キーペア作成手順で作成した秘密鍵を選択する。
ユーザー認証に必要な入力を終えたら「OK」ボタンを押下する。

<img src="https://qiita-image-store.s3.amazonaws.com/0/180939/19162d06-9007-a92c-f274-cdfbfc2eb433.png">

EC2インスタンス へ接続完了。
<img src="https://qiita-image-store.s3.amazonaws.com/0/180939/9b2a2341-19db-e0ea-9f9b-c3237b057551.png">

[](https://qiita.com/Kento75/items/e1478fead92f70fb757e)
[](https://qiita.com/Kento75/items/ca53d4266bc132cc13c6)
[](https://qiita.com/Kento75/items/bf8f7c91ee9dfb973d56)
RaspberryPi3 静的ルート(Static Route)の設定＋デフォルトゲートウェイの削除

RaspberryPi3（Raspbian stretch）での静的ルート　でハマったのでメモ


```
$ lsb_release -a
No LSB modules are available.
Distributor ID:	Raspbian
Description:	Raspbian GNU/Linux 9.4 (stretch)
Release:	9.4
Codename:	stretch
```
#環境

RapberryPi3(以下、端末)は以下のネットワークに接続されている。
IPは固定

10.0.0.0/8----ルーター(IF .1)---192.168.0.0/24---(usb0* IF .254)
端末（wlan0 IF .12）---192.168.2.0/24
*usbドングルによる接続

#要求
- 192.168.0.0/24は、10.0.0.0/8ネットワークにアクセスする場合のみ利用
- 基本、10.0.0.0/8ネットワーク以外は192.168.2.0/24ネットワークのみを利用

#問題
- 10.0.0.0/8のルート情報がない
- デフォルトゲートウェイの優先度がusb0の方が高い

#条件
- 10.0.0.0/8は192.168.0.1(GW)へいくルート情報の追加
- 192.168.0.0/24側のデフォルトゲートウェイの削除もしくは優先度の変更
- DHCPによる動的IPにおいても対応可能

#方法
デフォルトゲートウェイは、静的IPの割り当てであれば
/etc/dhcpcd.confファイルの追記の際に入れているstatic routersを削除すれば対応可能

```
interface usb0
static ip_address=192.168.0.254/24
static routers=192.168.0.1 ー＞コメントアウト
```

DHCPによる動的IPの場合はできない。


##方法1. /etc/network/interfaces.d/ 配下ディレクトリに設定(失敗)


```
$sudo vim /etc/network/interfaces.d/usb0
allow-hotplug usb0
iface usb0 inet static
post-up route add -net 10.0.0.0/8 metric 10 gw 192.168.0.1
post-up route del default dev $IFACE
```

結果として、10.0.0.0/8のルートはできるが、デフォルトゲートウェイの削除が不安定
（一旦削除されたあとさらに上書きされている）

##方法2. /lib/dhcpcd/dhcpcd-hooks/40-route　ファイルを追加(成功)


```
$sudo vim /lib/dhcpcd/dhcpcd-hooks/40-route
ip route add 10.0.0.0/8 via 192.168.0.1
ip route del default via 192.168.0.1
```

予定通り動作した。
ip routeで優先度も変更可能

以下参考URL
>https://www.raspberrypi.org/forums/viewtopic.php?t=163252


方法１でも中途半端に動作したため、解決に時間がかかった。
デフォルトゲートウェイを削除したいと思わなかったら方法２は知らないままだったので記録として残します。
【第二弾】Kubernetesベストプラクティス：namespace

# ベストプラクティス第二弾です

こんにちは、jackです。

Kubernetesベストプラクティスの第二弾です。前回の[第一弾](https://qiita.com/jackchuka/items/59d5316d50aa2e37fe4a)に引き続き、こちらのGoogle公式ブログから大事なことをざっくりまとめていきます。

[Kubernetes best practices: Organizing with Namespaces](https://cloudplatform.googleblog.com/2018/04/Kubernetes-best-practices-Organizing-with-Namespaces.html)

# TL;DR
* **namespace**（名前空間）を有効活用せよ
* namespaceを使うことで**開発スピードがあがる**
* デフォルトのnamespaceは**3つ**
    * default
    * kube-system
    * kube-public
* **[`kubens`、`kubectx`](https://github.com/ahmetb/kubectx)を駆使せよ**


# もう少し詳しく

## namespace作成方法

namespaceを作るのは`kubectl`コマンド一発でできます。

```sh
❯ kubectl create namespace test
```

YAMLを使ってapplyすることでも可能です。

```yml:test.yml
kind: Namespace
apiVersion: v1
metadata:
  name: test
  labels:
    name: test
```
```sh
❯ kubectl apply -f test.yml
```

## namespacesの取得

```sh
❯ kubectl get namespace
NAME                          STATUS    AGE
default                       Active    1y
kube-public                   Active    1y
kube-system                   Active    1y
test                          Active    1m
```

このように`default`、`kube-public`、`kube-system`と先ほど作成した`test` namespaceが確認できます。

## namespace上にリソースを作成する方法

```yml:pod.yml
apiVersion: v1
kind: Pod
metadata:
  name: mypod
  labels:
    name: mypod
spec:
  containers:
  - name: mypod
    image: nginx
```
例えばこんな`pod.yml`があったとします。
YAMLファイルに特にnamespaceの記載がない場合は下のようにnamespaceを指定してあげます。

```sh
❯ kubectl apply -f pod.yml --namespace=test
```
ただこれだと、declarative（宣言）的なやり方ではないので別の方法もあります。

先程のYAMLファイルの`metadata`部分にnamespaceを追加することで、特定のnamespaceに立ち上げることができます。
（また、この方法用いると`--namespace`オプションを渡せなくなります。）

```yml:pod.yml
apiVersion: v1
kind: Pod
metadata:
  name: mypod
  namespace: test
  labels:
    name: mypod
spec:
  containers:
  - name: mypod
    image: nginx
```

## namespace上のリソースの確認する方法

`kubectl get pods`は**アクティブなnamespace**上のリソースのみにしか問い合わせてくれません。

他のnamespace上のリソースを確認するにはアクティブなnamespaceを変更するか、`--namespace`オプションを渡して上げる必要があります。

```sh
❯ kubectl config set-context $(kubectl config current-context) --namespace=test
```
もしくは

```sh
❯ kubectl get pods --namespace=test
```

毎度このようにnamespaceを移動するのが大変なことが想定されますよね。そこで**kubens**の出番です。

## Kubensでnamespaceの切り替え

[https://github.com/ahmetb/kubectx](
https://github.com/ahmetb/kubectx)というOSSを使います。
使い方はいたって簡単！

```sh
# namespacesの取得
❯ kubens
default
kube-public
kube-system
test

# namespaceの切り替え
❯ kubens test
Context "minikube" modified.
Active namespace is "test".
```

これでnamespaceの切り替えがものすごく楽になりました。

# まとめ

いかがでしたか？
とにかく[`kubens`、`kubectx`](https://github.com/ahmetb/kubectx)がものすごく便利なのが伝わったかと思います。

毎回のことですが、公式ブログではこのまとめでは省いている情報が乗っていますのでそちらもどうぞ。

[Kubernetes best practices: Organizing with Namespaces](https://cloudplatform.googleblog.com/2018/04/Kubernetes-best-practices-Organizing-with-Namespaces.html)

それでは、また次回。
UniRxでドアを作りました

現状でベストのドアです。
コライダー内へ入ったところでボタンを押すと、アニメーションが再生されます。

UniRxを使用。

改良できたらまたアップします


```Door.cs
using UnityEngine;
using UniRx;
using UniRx.Triggers;
using System;

public class Door : MonoBehaviour
{

    [SerializeField] AudioClip OpenSound;
    [SerializeField] AudioClip CloseSound;
    [SerializeField] AudioClip LockedSound;
    private Animator animator;
    private AudioSource audioSource;
    private BoxCollider boxCollider;
    [SerializeField]private bool isOpen;    //ドアの状態
    [SerializeField]private bool isLocked;  //ドアの状態


    private void Start()
    {
        animator = GetComponent<Animator>();
        boxCollider = GetComponent<BoxCollider>();
        audioSource = GetComponent<AudioSource>();
    }

    private void OnTriggerStay(Collider other)
    {
        if (Input.GetKeyUp(KeyCode.LeftControl))
        {
            this.UpdateAsObservable().First()
                .Where(_ => Input.GetKeyUp(KeyCode.LeftControl))
                .ThrottleFirst(TimeSpan.FromSeconds(1.0f))
                .Subscribe(_ => DoorAction())
                .AddTo(this); 
        }
    }

    void DoorAction()
    {
        //鍵がかかっているかどうかで場合分けをしている。
        switch (isLocked)
        {
            case (true):
                audioSource.PlayOneShot(LockedSound);
                break;
            case (false):
                if (!isOpen)
                {
                    animator.SetBool("isOpen", true);
                    audioSource.PlayOneShot(OpenSound);
                    Invoke("ChangeisOpen", 1);
                }
                else if (isOpen)
                {
                    animator.SetBool("isOpen", false);
                    audioSource.PlayOneShot(CloseSound);
                    Invoke("ChangeisOpen",1);
                }
                break;
        }
    }

    private void ChangeisOpen()  //状態が変わったことを１秒遅れにするためにInvokeメソッド
    {
        isOpen = !isOpen;
    }
}


```
Android：ゴーストボタンで押した感を表現（Ripple Effectなし、画像なし、アニメーションなし、色も変えずに）

Buttonのbackgroundに設定するdrawableを工夫するだけでお手軽にできます。
## 完成イメージ
GIFだとカクカクして見えますが、実際はヌルサクで良い感じです(^^)
ちなみに、これはAndroid Studioのエミュレータを使って、メニュー内の「Record screen」から撮影しました。

<img src="https://qiita-image-store.s3.amazonaws.com/0/266061/5ec789bc-d8a6-d4ab-1743-f0af62432bb7.gif" width=40%>

## 方法
ポイントは`dimens.xml`に設定している`btn_padding_default`と`btn_padding_pressed`の値がちょっと違うこと。

``` my_drawable.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true">
        <layer-list>
            <item android:top="@dimen/btn_padding_pressed" android:right="@dimen/btn_padding_pressed" android:bottom="@dimen/btn_padding_pressed" android:left="@dimen/btn_padding_pressed">
                <shape android:shape="rectangle">
                    <stroke android:color="@color/my_color" android:width="@dimen/btn_border" />
                    <corners android:radius="@dimen/btn_radius" />
                </shape>
            </item>
        </layer-list>
    </item>
    <item>
        <layer-list>
            <item android:top="@dimen/btn_padding_default" android:right="@dimen/btn_padding_default" android:bottom="@dimen/btn_padding_default" android:left="@dimen/btn_padding_default">
                <shape android:shape="rectangle">
                    <stroke android:color="@color/my_color" android:width="@dimen/btn_border" />
                    <corners android:radius="@dimen/btn_radius" />
                </shape>
            </item>
        </layer-list>
    </item>
</selector>
```

``` dimens.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <dimen name="btn_padding_default">4dp</dimen>
    <dimen name="btn_padding_pressed">2dp</dimen>
    <dimen name="btn_border">1dp</dimen>
    <dimen name="btn_radius">12dp</dimen>
</resources>
```

Buttonにセットしてあげれば完成!

```
<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="BUTTON"
    android:background="@drawable/my_drawable"
    style="@style/Widget.AppCompat.Button.Borderless" />
```

## あとがき
個人開発した電卓アプリ[CalcLeaf](https://play.google.com/store/apps/details?id=com.byuubyu.freecalcleaf)にゴーストボタンを取り入れたテーマを追加した際、
なかなかしっくりくるボタン押下エフェクトが見つからなかった。
ゴーストなのにRipple Effectが出たり、色が変わったりするのはどうにも微妙。
そんな中で設定値を間違えてしまって偶然できて、使ってみたら意外と良かったのが今回の投稿内容です。
スマホではボタンをタップしたときに自分の指でボタンが一時的に隠れてしまいますが、
この「border拡大方式」なら指で覆われた部分から外側にちょっと拡大することで主張できるし、
指を離した後も元の大きさに戻る感じが残像でプルプルして見えるので個人的に気に入りました。

ゴーストボタンの実装を考えている方は参考にしてみてください！
MacでSQL*Plusを使ってSPOOLするシェルスクリプト作ったらオプションが効かなかった話

# 本記事の概要
Macを使い始めた頃に、Oracle DBからデータを定期的に収集するシェルスクリプトを作成したらオプションのECHO OFFだけが、なぜか効かないという事象にハマったのでメモとして記載します。
誤りやご質問等ありましたら、コメントお願いします。

# 1.前提
ご使用の端末がSQL*PlusからOracle DBに接続できる状態となっていること
まだの方はこちらなどがわかりやすいです。
＜ご参考＞
https://www.tank-sakurai.com/mac-os-x_oracle-database/

# 2.実行するSQLの準備
まずは、お好きなディレクトリに実行したいSQLを作成して下さい。
今回はホームディレクトリにtoolsを作成し、その中に格納します。
・ディレクトリ：Users/bar/tools

```:hoge.sql
set colsep ','
set trimspool off
set echo off

spool Users/bar/tools/output.csv

select * from hoge;

spool off
```

# 3.実行するシェルスクリプトの準備
お好きなディレクトリにシェルスクリプトを作成して下さい。
今回は手順2で作成したtoolsディレクトリの中に作成します。

```:hoge.sh
sqlplus -s user/password @ /Users/bar/tools/hoge.sql
```

# 4.注意点(ハマったところ)
SQL自体はsqlplusコマンドに対して、SQLスクリプトを標準入力をすることで実行することもできます。
※手順3との違いは「@」が「<」になっていること

```:hoge.sh
sqlplus -s user/password < /Users/bar/tools/hoge.sql
```
ただし、この実行方法だとSQL実行オプションのECHO OFFが効かなくなり、SPOOL ON/OFFやSELECT文自体もCSVファイルに出力されてしまう。これはECHOシステム変数がSQLスクリプトファイルを@やSTARTから実行した場合に設定するものだからです。このことに気づくのに1時間くらいかかってしまった...
＜Oracle公式＞
http://otndnld.oracle.co.jp/document/products/oracle11g/111/doc_dvd/server.111/E05784-01/ch12040.htm#i2698923

# 5.シェルスクリプトを実行する
という訳で、手順3のシェルスクリプトを実行すると、Users/bar/tools/output.csvが作成され、SQLの実行結果だけが出力されているはずです。

```:bash
/bin/bash hoge.sh
```
Huawei製Android端末でLogcatへのログ出力をする方法

テスト機として購入したHuawei P9 LiteがLogcatにログ出力が出来なくて困った。
対処法のメモ。

## 環境＆状況
- Huawei P9 Lite(開発者向けオプションは設定済み)
- Android Studio 2.3.1
- Log.dでlogcatへログ出力が出来ない

## 原因
どうやらHuawei端末にはログレベルを変更する隠しメニューがあるらしい。

参考
http://stackoverflow.com/questions/2250112/why-doesnt-logcat-show-anything-in-my-android/10963065#10963065

## 設定方法
1. 通話アプリを起動
- [\*#\*#2846579#\*#\*]にダイヤルする
- 隠しメニューが開く
- Background Settings > LOG Settingsを選択
- 全てのチェックボックスにチェックを入れてClose

これでlogcatへの出力がようやく出来るようになる！

## 備考
隠しメニューはLOG Settings以外にも色々あるので他にも何かあるかも・・・。