OmniAICreator/Qiita-1.07M huggingface dataset:
kotlinでアプリを試すお勉強1


## 動かす

GASで作ったシステムのトリガーをかけたいけどブラウザでURLにアクセスするのは面倒。
勉強がてら、簡単なボタンアプリにしたら便利かも。

IntelliJ IDEAでKotlin Androidアプリ開発環境構築！ 導入編 - Qiita
https://qiita.com/g0z4ru/items/24bca8e6fb691f29260f

	intellij IDEAでの初期設定
	Kotlinのプロジェクトじゃなく、Androidのプロジェクトなのね

IntelliJ IDEAでKotlin Androidアプリ開発環境構築！ 起動編 - Qiita
https://qiita.com/g0z4ru/items/033afabd7d06087df928

	デバイスを追加する事例
	結果、大体はSDKに促されるままインストールをしていくのでいけた

アプリケーションのビルドと実行 - 公式ヘルプ | IntelliJ IDEA
https://pleiades.io/help/idea/building-and-running-the-application.html#AddRunConfig

	物理デバイスをUSBで使う
	まだ未検証

［Android & Kotlin］ Buttonアプリを作ってみるとJavaよりシンプルだった
https://akira-watson.com/android/kotlin/button-sample.html

	シンプルなボタンを作る事例

初めてのAndroidアプリ開発(Kotlin編)- プログラミングの基本 - Qiita
https://qiita.com/TomiGie/items/fb60a80780689b86dc59#android-studio-%E3%81%AB-kotlin%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B

	良さげだけどまだみれてない

## IDEAとAndroid Studio

僕がEclipseをやめてAndroid Studioを使っている10の理由 - ナカザンドットネット
https://blog.nkzn.info/entry/2014/03/21/015914

	IDEAをベースにしているのか。。

Android - intellijでandroidの環境構築｜teratail
https://teratail.com/questions/141655

	どちらがいいのか。。


## HTTPSについての制限

KotlinでHTTP通信（FuelとHttpURLConnection） - Qiita
https://qiita.com/naoi/items/8df1409ad48ad8f3c632

	fuelでもconnectでもうまくいってくれない

Android 7 以降で mitmproxy が動作しない - Qiita
https://qiita.com/notona/items/8faf62872a032b2d728d

	android7かららしい

ネットワーク セキュリティ構成  |  Android Developers
https://developer.android.com/training/articles/security-config?hl=ja

App security best practices  |  Android Developers
https://developer.android.com/topic/security/best-practices

	この通りにしているつもりだけど、なかなかうまくいってくれない。。

`D/NetworkSecurityConfig: Using Network Security Config from resource network_security_config debugBuild: true` となっていて、debugBuildが関係しているのか、他の原因な気がする

kotlin.browser - Kotlin Programming Language
https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.browser/index.html

	きになる

Kotlin & AndroidでIIJmioでログインする - Qiita
https://qiita.com/otsuka_kohei/items/37bb15b5667ea0aa0286

	ブラウザに渡す方がいいのかなあ

## HTTPのためにプロキシ設定

Android Studioを使う前に - 2018 Socio Informatics Seminar Wiki Site
http://www.wakayama-u.ac.jp/~itou/SISeminar/index.php?Android%20Studio%A4%F2%BB%C8%A4%A6%C1%B0%A4%CB

	色々悩んだけど、結果的には簡単でプロキシを自動設定したらつながった
	
## GAS

GASをkotlinで開発する方法 - なおしむ論
https://naosim.hatenablog.jp/entry/2018/08/19/100546

	GASもいけるのね。。
macOSのFinderで選択中のパスをターミナル上で取得する

Finderで何かしらの操作をしていて、途中でそこのファイルをターミナルから操作したくなる時がある。例えばそれをlessで見たいとする。そんな時はターミナルを開いて

```bash
$ less 目的ファイルのフルパス
```
とやるわけだが、このパスを入力するのは面倒なので、例えばターミナルウィンドウの上に目的のファイルをドラッグアンドドロップすると、ターミナルにパスが入力できる。
でもまあ、それもまだ面倒なので、ターミナル上で、「Finderで現在選択中のパス」を取得するコマンドがあれば便利だろうなと思った。そのコマンドを仮にselectionと名付けたら、Finderで目的のファイルを選択(1回クリック)してから、ターミナルで

```bash
$ less $(selection)
```
としたら良い。調べてみたが、もとからそういうのがあるわけではなさそうなので、作って見ることにした。

## JavaScriptでosascript
macのターミナルでmacOSを操作するにはosascriptというコマンドがあって、従来この中でApplescriptを書いて色々やられているようだが、しばらく前からJavaScriptで代替できるようになったそうである。

参考 https://qiita.com/zakuroishikuro/items/1b02378bf9e940602d87

ここは馴染みのあるJavaScriptを使うことにした。
コマンドについては、macのスクリプトエディタのリファレンスで調べる。

## ターミナルで実験

```bash
$ osascript -i -l JavaScript
```
とすると、osascript-Javascriptか対話式に実行できる。
今、ホームディレクトリのtestというファイル(1つ)をFinderで選択中とする。
まず

```javascript
finder = Application('Finder');
finder.selection();
```
としたら、

```shell
=> [Application("Finder").startupDisk.folders.byName("Users").folders.byName("user_name").documentFiles.byName("test")]
```
とかえってくる。test, test2の2つを選択中だと、

```shell

=> [Application("Finder").startupDisk.folders.byName("Users").folders.byName("user_name").documentFiles.byName("test"), Application("Finder").startupDisk.folders.byName("Users").folders.byName("user_name").documentFiles.byName("test2")]
```
のように、配列に2つ入ってかえってくる。
とりあえず、一つのファイルを操作しよう。

```javascript
file = finder.selection()[0]
file.name()  // => "test"
```

このように、ファイル名を取得することはできる。が、このファイルオブジェクト(?)から直接フルパスを取得することはできないようだった。取れるのは、一つ上のディレクトリである。

```javascript
file.container().name()   // => "user_name"

```

どんどん辿っていけば、フルパスを作れそうである。

```javascript
file.name()   // =>  "test"
file.container().name()   // =>  "user_name"
file.container().container().name()   // => "Users" 
file.container().container().container().name()   // =>  "Macintosh HD"
file.container().container().container().container().name()   // =>  "ユーザーのMacBook Air"
file.container().container().container().container().container().name()
// =>  !! Error on line 1: Error: オブジェクトを取得できません。
```

ここから、Macintosh HD以降は切り捨てて、/Users/user_name/testという文字列を作ろう。

## スクリプト
以上の実験をもとに、以下のようなスクリプトを作った。

```javascript
#!/usr/bin/osascript -l JavaScript

const finder = Application('Finder');
const getFullPath = (file) => {
  const path = [];                  // ここに追加していく
  while(true){
    name = file.name();             // 名前を取得
    if(name === 'Macintosh HD'){    // Macintosh HDまで到達したら
      break;                        // ループを抜ける
    }
    else{                           
      path.unshift(name);           // pathの先頭に追加
      file = file.container();      // 上のディレクトリに移動
    }
  }
  return '/' + path.join('/');      // Macintosh HD以下を/で繋げる。先頭にはルートをつける
};
finder.selection().map(getFullPath).join('\n');    // 最後にこれを複数のファイルに対して施して、改行で連結して出力
```

このファイルをselectionと名付けて、実行権限をつけ、パスを通す。

```shell
$ selection
# 出力
# /Users/user_name/test
# /Users/user_name/test2
```

できた!
Ruby 基本 memo

Rubyの基礎を勉強し直して、
これあまり使わないけど残しておきたいなっていうmemoです.

## その他
- 定数に関して
 - 再代入時に警告は出るが、破壊的メソッドで変更を加えたときには警告は出ない

- ?+一文字
 - その一文字の文字列オブジェクトを作成

```irb
irb(main):001:0> ?a
=> "a"
irb(main):002:0> ?test
Traceback (most recent call last):
        1: from /Users/hogehoge/.rbenv/versions/2.5.1/bin/irb:11:in `<main>'
SyntaxError ((irb):2: syntax error, unexpected '?')
?test
^
```

## Array
- Array#join
 - 配列の要素を文字列化。引数はセパレータとして使われる。

```irb
irb(main):036:0> t = [1,2,3]
=> [1, 2, 3]
irb(main):037:0> t.join
=> "123"
irb(main):038:0> t.join(',')
=> "1,2,3"
```
- Array#delete_if == Array#reject!
 - ブロックが真になるものを取り除いた配列をreturn 
 - どちらも破壊的メソッド
 - 破壊的に使わない場合はArray#reject
 
- Array#find_all== Array#select
 - ブロックが真になるもの要素のみの配列をreturn 
 - どちらも　非破壊的メソッド
 - 破壊的に使う場合はArray#select!

- Array#unshiftは引数がない場合何も起こらない
 - shift, unshiftは破壊的メソッド  

- Array#concat(other_array)
 - 引数の配列を自身の後ろに結合※破壊的メソッド

- Array#compact
 - 配列のnilを削除※非破壊的メソッド
 - 破壊的メソッドcompact!もあります

- Array#uniq
 - 重複を削除※非破壊的メソッド
 - 破壊的メソッドuniq!もあります

- Array#detect == Array#find 
 - ブロックの値を評価、真の最初のものを返す

```irb
irb(main):045:0> a = [1,2,3]
=> [1, 2, 3]
irb(main):046:0> a.find{|a| a==2}
=> 2
irb(main):047:0> a.detect{|a| a==3}
=> 3
```

- Array#map == Array#collect 
 - 配列の要素それぞれに対してブロック内の処理を施した配列を返す

- Array#zip(other_array, ...) 
  - 配列に対して引数の配列と組み合わせた新しい配列を作成。
  - 足りない場合はnilが入る
  - 非破壊的メソッド(破壊的メソッドはありません)


## String
- String#*(n)
  -  '文字列'*nでその文字列をn回繰り返した文字列を返却

- ヒアドキュメント
 - 終端識別子は左寄せ
 - 改行コードも入る
 - %q()や%Q()でもかける(Qだと#{}が使えます)

```irb
irb(main):060:0> s = <<EOB
irb(main):061:0" Hello, Ruby World
irb(main):062:0" Hi, Ruby
irb(main):063:0" Goodbye
irb(main):064:0" EOB
=> "Hello, Ruby World\nHi, Ruby\nGoodbye\n"
irb(main):065:0> s
=> "Hello, Ruby World\nHi, Ruby\nGoodbye\n"
#こんな書き方も
irb(main):078:0> s = %q(
irb(main):079:0' Hello, Ruby World
irb(main):080:0' Hi, Ruby
irb(main):081:0' Goodbye
irb(main):082:0' )
=> "\nHello, Ruby World\nHi, Ruby\nGoodbye\n"
```

- String#index(文字列、検索開始位置)
 - 引数の文字列がレシーバにあった場合その開始位置をreturn

- String#chop
 - レシーバから最後の1文字を取り除いた文字をreturn。！あり 

- String#chomp
 - レシーバから改行文字列を取り除いた文字をreturn。！あり 

- String#[検索位置, 長さ]
 - 検索位置の文字列をreturn,第二引数がある場合、そこからn番目までの文字列をreturn

- String#slice(検索位置, 長さ)
 - #[]と同意
 - 引数に正規表現が入った場合,matchする文字列を返却

- String#delete("文字列"),String#delete!(文字列)
 - #引数の文字列を削除  
 - 引数の文字列が"^文字列"の場合、その文字列以外を削除

- String#scan
 - 引数の文字列と一致している部分を抽出して配列を作成

- String#chr, Integer#ord
 - それぞれの文字コードに対応する数字と文字列に変換 

## Hash
- Hash#invert
 - key と valueをいれかえる。非破壊的

  
## 破壊的、非破壊的メソッドに関して
ここのサイトが一覧で良さそうでした。
http://web-tenna.com/ruby-destruction-method/
docker-composeを使った場合のデバッグ方法

#目的
docker-composeでDockerコンテナを動かした場合のコンテナ内で動作するコードのデバッグ．PycharmによるRemote Debugは設定が大変そうだったので断念し，pdbを使ったデバッグを試みた．
参照：https://stackoverflow.com/questions/30854967/docker-compose-and-pdb#comment56942332_30901026

#方法
ソースコードにpdbを挿入  

```python:/tmp/main.py
import pdb; 

if __name__ == "__main__":
    pdb.set_trace()
```

ymlファイルに```stdin_open: true```と```tty: true```を追加
(docker runにおける-i, -tオプションと効果は同様)
  
```docker-compose.yml
version: '2'
services:
  sample:
    image: "test"
    command: ["python", "/tmp/main.py"]
    stdin_open: true
    tty: true
...
```

対象コンテナを```docker-compose docker-compose.yml up -d```で起動後，```docker attach <containerid>```で対象のコンテナにattachすると，(pdb)のコンソールが起動してする．
固定電話をひく際の回線の種類について

# はじめに
社内ファシリティーに関する打ち合わせに参加した際に、
あまりにも電話について知らないことが多かったので、超ざっくりまとめ
（ど素人なので、うそありです。総務省の資料を中心に探しましたが古いことはあまり残っていない）

# 電話回線の種類
ざっくり３種類のいづれかを選ぶことで、電話が使えるようになる
`インス(INS)`というカタカナ言葉がNTT東西が提供しているサービス名ということに気づくまでに、どれだけのググったか。。。

- アナログ回線(加入電話)
- デジタル回線(ISDN, INS)
- 光ケーブル

## アナログ回線
- 選択肢のうち一番レガシーなもの
- 停電しても使えるという可用性の高さがポイント
- 2024年固定電話網のIP化の話があるが、既存の設備で電話が使えなくなることはない
  - 加入付加サービスなどによっては大きな影響がある場合がある

[総務省｜停電の際の固定電話サービスの利用について](http://www.soumu.go.jp/menu_kyotsuu/important/42182.html)
> 停電の際には、固定電話サービスについて、商用電源を使用しない電話機などを利用してアナログ電話を利用している場合を除き、基本的にご利用できなくなりますので、ご注意ください

[総務省 | ５．ＩＰ網への移行に関する諸課題への対応](http://www.soumu.go.jp/main_content/000509768.pdf#page=13)
> ＮＴＴは、ＩＮＳネット（ディジタル通信モード）の終了時期
について、2020年度後半から2024年初頭に後ろ倒す意向や
補完策に係る料金等を表明。


## デジタル回線(ISDN, INS)
- アナログ回線と同様に銅線を使ってるから安定性は高いかも
- より新しい回線(光ケーブル)を使える時代なので、光ケーブル工事が実施できない事情がない限り新たに選ぶ理由がないかも？
- アナログ回線様に2024年以降、一部の付加サービスが利用できなくなる場合がある

## 光ケーブル
- 実質的にアナログ回線やデジタル回線の後継にあたるもの
- インターネット接続提供などと共用して使われる
- NTT回線以外でも光電話、オフィスフォンを利用することができる
JavaでSHIFT-JISを見つけたら要注意

#経緯
Javaで作成したWEBアプリケーションにで"～"が文字化けするという不具合があった。
DBの文字コードがUTF-8、CSV出力がMS932であったため、異なる文字コードの変換による文字化けかと思って調査していたら、もっと単純な話だった。
結構時間を無駄にしたので、メモもかねて残しておく。

#原因
DBがUTF-8でも、Javaでは内部表現であるUTF16になるため、ここでは問題ない。
処理を追っていると、DBからデータ取得後、Javaの処理でSHIFT-JISに変換してからMS932に変換していた。"～"で出てくるSHIFT-JIS, MS932の変換問題かと思ったら、SHIFT-JIS、UTF16(Javaの内部表現)の変換問題だった。

#文字変換例
簡単なソースコードを作成して検証してみた。(java:1.8.0_121)
SHIFT-JISとMS932のバイト配列に変換してから、Javaの文字列を生成するとSHIFT-JISだけ文字化けが発生している。


```java
        String org = "～";

        byte[] sjBytes = org.getBytes("SHIFT-JIS");
        byte[] ms932Bytes = org.getBytes("MS932");

        String sj = new String(sjBytes, "SHIFT-JIS");
        String ms932 = new String(ms932Bytes, "MS932");

        String fmt = "%s\t文字列：%s, バイト配列：%s";
        System.out.println(String.format(fmt, "元の文字", org, DatatypeConverter.printHexBinary(org.getBytes())));
        System.out.println(String.format(fmt, "SHIFT-JIS", sj, DatatypeConverter.printHexBinary(sjBytes)));
        System.out.println(String.format(fmt, "MS932", ms932, DatatypeConverter.printHexBinary(ms932Bytes)));
```

#出力結果
元の文字	文字列：～, バイト配列：EFBD9E
SHIFT-JIS	文字列：?, バイト配列：3F
MS932	文字列：～, バイト配列：8160

#まとめ
そもそもUTF-8にすれば問題ないけど、仕様変更になるため扱いが厄介。
どうしてもSHIFT-JISを使いたい場合はMS932で十分なので、SHIFT-JISは使用しない。

[目次](http://qiita.com/csharpisthebest/items/57f27a33085f01211166)
PostgreSQLの外部参照の情報を返すクエリ

調べるのに意外と時間がかかったのでメモしておきます。

テーブルresponsesの列requestがrequestsテーブルの列idを指しているとします。

```
CREATE TABLE requests (id serial PRIMARY KEY, message text);
CREATE TABLE responses (request int REFERENCES requests(id), message text);
```

#制約のタイプ
information_schema.table_constraintsに制約のタイプ「FOREIGN KEY」があります。

```
select constraint_name, constraint_type
   from information_schema.table_constraints;
```

     constraint_name    | constraint_type 
------------------------+-----------------
 responses_request_fkey | FOREIGN KEY

#参照している列の情報
information_schema.key_column_usageに参照している列の情報があります。

```
select constraint_name, table_name, column_name
    from information_schema.key_column_usage;
```

     constraint_name    | table_name | column_name 
------------------------+------------+-------------
 responses_request_fkey | responses  | request

#参照されている列の情報
information_schema.constraint_column_usageに参照されている列の情報があります。

```
select constraint_name, table_name, column_name
    from information_schema.constraint_column_usage;
```

     constraint_name    | table_name | column_name 
------------------------+------------+-------------
 responses_request_fkey | requests   | id

#まとめ
これらの情報をまとめます。

```
select k.table_name, k.column_name, c.table_name, c.column_name
    from information_schema.table_constraints as t,
         information_schema.key_column_usage as k,
         information_schema.constraint_column_usage as c
    where t.constraint_type = 'FOREIGN KEY'
      AND t.constraint_name = k.constraint_name
      AND t.constraint_name = c.constraint_name;
```

 table_name | column_name | table_name | column_name 
------------+-------------+------------+-------------
 responses  | request     | requests   | id
PureScriptのガード節とwhere

ご存知の通り(?)、PureScriptはHaskell風の構文を持ったAltJSです。しかし、あくまでHaskell「風」であるため、パッと見た限りでは全く同じに見える構文でも実際に書いてみると思わぬ違いに遭遇することがあります。

## ガード節とwhereの組み合わせ

たとえばHaskellで書かれたこんなコードがあります。　([Wandboxで実行](https://wandbox.org/permlink/UrQWteBC7qSAVp7s))　　
若干わざとらしいコードですが、ガード節にまたがるwhereで定義した変数を見て、ガード節を使ってその値によって分岐をしています。

```haskell

compareWith10 :: Int -> String
compareWith10 n
    | c == LT   = show n <> "は10より小さいです。"
    | c == EQ   = show n <> "は10です。"
    | c == GT   = show n <> "は10より大きいです。"
    | otherwise = "ありえないです。"
  where
    c = n `compare` 10
```

PureScriptでもそのまま動きそうなコードに見えます。しかし、実際に実行してみると・・・（[Try PureScript!で実行](http://try.purescript.org/?gist=2688010942b3eb07cc300f42536a2c40)）

こんなエラーが出ます。

>  Unknown value c

そうなんです。PureScriptでは、whereで定義した変数はガード節をまたぐことはできないのです。

## PureScriptでのwhereのスコープ

whereで定義した変数がガード節をまたぐことができない一方で、PureScriptでは個々のガード節にwhereを書けます。 ([Try PureScript!で実行](http://try.purescript.org/?gist=521cc2befc5065baac63f91be4cc2ce0)）

```haskell

compareWith10 :: Int -> String
compareWith10 n
  | n `compare` 10 == LT = show n <> s where s = "は10より小さいです。"
  | n `compare` 10 == EQ = show n <> s where s = "は10です。"
  | n `compare` 10 == GT = show n <> s where s = "は10より大きいです。"
  | otherwise            = show s      where s = "ありえないです。"
```

Haskellではこのコードはコンパイルできません。 （[Wandboxで実行](https://wandbox.org/permlink/2w2DhjgnzUMRc8ln)）

## Issue

この「whereで定義した変数がガード節をまたげない」という問題、GitHubにissueが無いか探してみたら、3年以上前からありました。

[Move where clauses under guards · Issue #888 · purescript/purescript](https://github.com/purescript/purescript/issues/888)

個人的にとても不便なので、このまま放置され続けるようなら最悪自分で直せないかと考えながらPureScriptコンパイラのソースを読んだりしています。
【Python】ローパスフィルタで波形のノイズを除去する

Numpy の fft を用いて、ローパスフィルタで波形のノイズを除去します。前半部分はサンプル波形の生成、後半部分でノイズ除去の処理をしています。

```ruby:qiita.rb

# -*- coding: utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt
import math
import copy

# 波形からノイズを除去する。
# 前半：波形生成
# 　　　２つの周波数のcos波とランダムノイズの足し合わせ
# 後半：ノイズ除去
# 　　　元波形　　　f　元波形のfft　F
# 　　　処理後波形　g　処理後波形のfft　G
#
# 正規化とアンチエリアジングをやめて、
# 共役複素数の項を残すことにしました。18.12.05

def main():
    # データのパラメータ
    N = 40000             # サンプル数
    dt = 1*1e-5           # サンプリング間隔

    # 軸の計算    
    t = np.arange(0, N*dt, dt) # 時間軸
    freq = np.linspace(0, 1.0/dt, N) # 周波数軸

    # サンプル波形のパラメータ
    a = 10                # 交流成分
    fq1, fq2 = 25, 50     # 周波数
    phi1, phi2 = 0, 30    # 位相
    pi = math.pi          # π
    phirad1, phirad2 = phi1*pi/180, phi2*pi/180  # 位相ラジアン

    fc = 200         # カットオフ周波数
    fs = 1 / dt     # サンプリング周波数
    fm = (1/2) * fs # アンチエリアジング周波数
    fc_upper = fs - fc # 上側のカットオフ　fc～fc_upperの部分をカット

    # 時間信号を生成（周波数f1の正弦波+周波数f2の正弦波+ノイズ）
    noise = 0.5 * np.random.randn(N)
    f = a + 1*np.cos(2*np.pi*fq1*t+phirad1) \
          + 1*np.cos(2*np.pi*fq2*t+phirad2) \
          + noise

    # 元波形をfft
    F = np.fft.fft(f)

    # 正規化 + 交流成分2倍
    # F = F/(N/2)
    # F[0] = F[0]/2

    # アンチエリアジング
    # F[(freq > fm)] = 0 + 0j

    # 元波形をコピーする
    G = F.copy()
    
    # ローパス
    G[((freq > fc)&(freq< fc_upper))] = 0 + 0j

    # 高速逆フーリエ変換
    g = np.fft.ifft(G)

    # 振幅を元に戻す
    # g = g * N

    # 実部の値のみ取り出し
    g = g.real

    # プロット確認
    plt.subplot(221)
    plt.plot(t, f)

    plt.subplot(222)
    plt.plot(freq, F)

    plt.subplot(223)
    plt.plot(t, g)

    plt.subplot(224)
    plt.plot(freq, G)
    
    plt.show()

if __name__ == "__main__":
    main()

```


処理結果
上段　処理前　（波形とスペクトル）
下段　処理後　（波形とスペクトル）

![Figure_1.png](https://qiita-image-store.s3.amazonaws.com/0/298671/6cd6b412-1ea6-0bea-a7ab-bfdb36909023.png)
CentOS7 インストール (mac virtualbox)

# はじめに
私の Mac は SSD が 128GB しかないので、常にディスク容量不足に悩まされています。
そこで、開発は、要件毎に VirtualBox 上に環境を構築し、使わなくなったら外付けのハードディスクに退避するようにしました。
以下、Mac の VirtualBox 上に、**できるだけ手間をかけず** CentOS 開発環境を構築する方法を書きます。

# 環境
- VirtualBox: 5.2.20
- ホストOS: macOS High Sierra
- ゲストOS: CentOS7

# CentOS のダウンロード
[CentOS ダウンロードサイト](https://www.centos.org/download/)には、
- DVD ISO
- Everything ISO
- Minimal ISO
があります。

以前は、容量を食いたくなかったので`Minimal ISO`をダウンロードして必要なパッケージだけ追加インストールする手法をとっていたのですが、デスクトップ環境を構築したり、日本語の設定をしたりで、結構大変です。

そこで、`DVD ISO`をダウンロードします。

# 仮想マシンの作成
メモリはデフォルトの`1024MB`のまま。
ハードディスクは、デフォルトの`8GB`だと、デスクトップ環境を入れるとカツカツになるので、`16GB`にします。

# CentOS インストール
インストーラーに従ってインストールします。

`ソフトウェアの選択`では、次のように設定します。

- ベース環境: `GNOME Desktop`
- 選択した環境のアドオン：`開発ツール`

アドオンで、`GNOMEアプリケーション`とか`システム管理ツール`を入れていないと、ネットワークなどの設定をGUIでできないのではないかと不安になりますが、大丈夫です。基本的なツールはインストールされます。

インストールが終わったら、`再起動`をクリックして再起動します。

# ソフトウェアの更新
**注）** 最初に`Guest Additions`の設定をすると、固まります。(私の環境だけかもしれませんが。。)

まず最初に、`ソフトウェアの更新`をします。
`アプリケーション`→`システムツール`→`ソフトウェアの更新`を選択してソフトウェアの更新をします。
![VirtualBox_CentOS7_4_21_10_2018_11_09_46 2.png](https://qiita-image-store.s3.amazonaws.com/0/248817/f524429c-ee51-5481-57ec-058deae1dea6.png)

次に、`Guest Additions`の設定をします。
![スクリーンショット 2018-10-21 11.27.52.png](https://qiita-image-store.s3.amazonaws.com/0/248817/50d9f95c-2701-bd04-93fa-6014246797ce.png)

ディスプレイいっぱいに CentOS の画面が広がり、マウスポインタがゲストOS、ホストOS間でシームレスに移動するようになればOKです。

# 日本語入力
`アプリケーション`→`システムツール`→`設定`→`地域と言語`を選択し、`+`ボタンをクリックします。
`日本語`→`日本語（かな漢字）`を選択して`追加`をクリックします。
![VirtualBox_CentOS7_4_21_10_2018_12_42_31.png](https://qiita-image-store.s3.amazonaws.com/0/248817/59fe6c8c-462d-b588-febb-21eba5da092c.png)

画面右上の`ja`をクリックして`日本語（かな漢字）`を選択します。
![VirtualBox_CentOS7_4_21_10_2018_12_46_45.png](https://qiita-image-store.s3.amazonaws.com/0/248817/670449bd-ec85-7cc3-78fc-69ec857ce31b.png)
「かなキー」で日本語、「英数キー」で英数が入力できるようになります。
Macのコンソールでtreeコマンドを使ってディレクトリ構造を出力したい

# まずはHomebrewがインストールできているかを確認。
コンソールに

```
$ brew -v
```
と打ち込むと

```
Homebrew 1.7.7
Homebrew/homebrew-core (git revision 60d5a; last commit 2018-10-21)
```
みたいな感じで表示されると思います。
もし、Homebrewが見当たらないってひとがいたら、
[MacにHomebrewをインストールする
](https://qiita.com/_daisuke/items/d3b2477d15ed2611a058)
を確認してみてください。

# treeコマンドを使えるようにする
Homebrewが入っているだけだとtreeコマンドは使えないので

```
$ brew install tree
```

でコマンドを使用できるようにします。
あとはtreeコマンドを叩けば、ディレクトリ構造が簡単にコピペできます。

```
$ tree
.
├── images
├── javascripts
└── stylesheets
    └── style.css
```
Laravel5.5でSocialiteに含まれていないLINE認証

[こちらの記事](https://qiita.com/mayutan/items/9ff945f56718f5cb42cf)を参考に構築後

2018年10月21日現在の最新のバージョン

それぞれ以下

Socalite3.0
Laravel5.5
LINEログインv2

で動作するよう

LineProvider.phpを書き換えました。

```LineProvider.php

<?php

namespace App\Socialite;

use Laravel\Socialite\Two\AbstractProvider;
use Laravel\Socialite\Two\ProviderInterface;
use Laravel\Socialite\Two\User;

class LineProvider extends AbstractProvider implements ProviderInterface
{
    protected function getAuthUrl($state)
    {
        return $this->buildAuthUrlFromBase('https://access.line.me/dialog/oauth/weblogin', $state);
        
    }
    protected function getTokenUrl()
    {

        return 'https://api.line.me/v2/oauth/accessToken/';
        
    }
    public function getAccessTokenResponse($code)
    {


        $response = $this->getHttpClient()->post($this->getTokenUrl(), [
            'headers' => ['Accept' => 'application/json'],
            'form_params' => [
                'grant_type' => 'authorization_code',
                'code' => $code,
                'redirect_uri' => $this->redirectUrl,
                'client_id' => $this->clientId,
                'client_secret' => $this->clientSecret
            ],
        ]);

        return json_decode($response->getBody(), true);
    }
    protected function getUserByToken($token)
    {
        
        $response = $this->getHttpClient()->get('https://api.line.me/v2/profile', [
            'headers' => [
                'Authorization' => 'Bearer '.$token,
            ],
        ]);

        return json_decode($response->getBody(), true);
    }

    protected function mapUserToObject(array $user)
    {
        return (new User())->setRaw($user)->map([
            'id' => $user['userId'],
            'name' => $user['displayName'],
            'pictureUrl' => $user['pictureUrl'],
        ]);
    }
}

```
Macにzshとpreztoのインストール＆アンインストール、諸々の設定


Macを水没させた。何とか修理できたものの修理代金はapple storeで15万over。cpu以外は全取っ替え。apple storeの店員さんから「このMacがあなたのMacであることを確かめて下さい」と言われたとき、思わず「全て変わっているので何をどう確かめられれば…」とマジレスしてしまったw

超忙しい時期だったのに、homebrewもRすら入ってないMacを前にただ虚無を感じた。虚無。


と言うわけで、zshを入れてpreztoを入れるときにつまったのでメモ。

参考にしたのは以下の3つのページ
お前らのターミナルはダサい
https://qiita.com/kinchiki/items/57e9391128d07819c321
zshの環境をoh-my-zshからPreztoに乗り換える
https://qiita.com/andooown/items/9cd6972e08ff95793eac
AntigenでPreztoを導入
https://qiita.com/iri/items/2f9a39b9c47320f4c225


まずはzshのインストール

```:terminal
#インストール
$ brew update
$ brew install zsh
```

インストール後に/etc/shellsにzshのパス/usr/local/bin/zshを追加。

```:/etc/shells
/bin/bash
/bin/csh
/bin/ksh
/bin/sh
/bin/tcsh
/bin/zsh
# 追加
/usr/local/bin/zsh
```

ログインシェルの変更

```:terminal
$ chsh -s /usr/local/bin/zsh
```
Preztoのリポジトリをクローンします。

```:terminal
$ git clone --recursive https://github.com/sorin-ionescu/prezto.git "${ZDOTDIR:-$HOME}/.zprezto"
```

Preztoのインストール＆設定ファイルを作成。

```:terminal
setopt EXTENDED_GLOB
for rcfile in "${ZDOTDIR:-$HOME}"/.zprezto/runcoms/^README.md(.N); do
  ln -s "$rcfile" "${ZDOTDIR:-$HOME}/.${rcfile:t}"
done
```

とこここまではどこでも書いていることです。
一番言いたいのはここから！
お前らのターミナルはダサい
https://qiita.com/kinchiki/items/57e9391128d07819c321
を参考に設定を変更したのですが、エラーが出てしまいます。色々試作交互したのですが、'autosuggestions'を最後に入れないとエラーが出てしまうようです。
具体的には下記のような感じ。


```:~/.zpreztorc
# Set the Prezto modules to load (browse modules).
# The order matters.
zstyle ':prezto:load' pmodule \
  'environment' \
  'terminal' \
  'editor' \
  'history' \
  'directory' \
  'spectrum' \
  'utility' \
  'completion' \
  'prompt' \
　'syntax-highlighting' \ # 追加
  'autosuggestions' \ # 追加
```

これでエラーが出ずに通ります。
*2019/05/02追記　別のMacを再設定。その際、今度はこの順番でエラーが出たが「お前らのターミナルはダサい」の順番でやるとエラーが出なかった。どういうことなんや…

最後にpreztoのアンインストール
はターミナルで

```:terminal
rm -rf ~/.zprezto ~/.zlogin ~/.zlogout ~/.zpreztorc ~/.zprofile ~/.zshenv ~/.zshrc
```

と叩きます。
Storyboardを分割してもInterfaceBuilderでNavigationBarが表示されるようにする

この記事の内容は、Xcode 10で動作を確認しました。


# @ichimotsさんから[コメント](https://qiita.com/azechi/items/4c53af6ed7a80161c5f6#comment-1c1f74d7a5bc58370877)でちゃんとした対処方法を教えてもらいました。

~~Storybard Referenceを使ってStoryboardを分割したけど、InterfaceBuilderでNavigatonBarが表示されないから、InterfaceBuilderを使ってNavigationBarにボタンを追加したりできない。Storyboard内にダミーのNavigationControllerを用意することでInterfaceBuilderでNavigationBarが編集できるようになります。~~

InterfaceBuilderには、NavigationBarの表示を明示的に有効にする機能が存在しています。
https://qiita.com/azechi/items/4c53af6ed7a80161c5f6#comment-1c1f74d7a5bc58370877
MutationObserverで孫要素を取得しようとしてハマった話


# はじめに

[ゴシップサイトブロッカー](https://gsb.ikemo3.com/)というGoogle Chrome拡張機能を作成しています。ブロックには今まで別の方法を使っていたのですが、バグを修正するためにMutationObserverを使って書き直すことにしました。

その時にハマったことを書いておきます。

# 孫要素が稀に取得できない

例えば以下のような構造があるとします。

```html
<html>
  <body>
    <div>
      <a>...</a>
    </div>
  </body>
</html>
```

このときに、[MutationObserver][]を作成します。

```javascript
const observer = new MutationObserver((mutations) => {
  mutations.forEach((mutation) => {
    for (const node of mutation.addedNodes) {
      // ここでブロック判定
    }
  });
});

observer.observe(document.documentElement, { childList: true, subtree: true });
```

問題は「ここでブロック判定」の箇所で、ここで以下のような処理を行っています。
(実際はもっと複雑)

1. div要素かどうかをチェック
2. 1の場合、a要素があるかどうかをチェック

問題は、**ごく稀に(15回に1回くらい)、本来あるはずのa要素が見つかりません**。

# 原因

明確なソースは見つからなかったのですが、
親要素(div)が作成されていても、子要素(a)が存在するのは保証されないんだと思います。

# 対策

a要素が見つからなかったときには、divにMutationObserverを作成し、
見つかるまで待つことにしました。

[MutationObserver]: https://developer.mozilla.org/docs/Web/API/MutationObserver
ブックマーク

# ブックマーク

各種ツール類のブックマーク
※各所に散乱していたものをまとめたものです。完全に個人用です。
※特にdeliciousがなくなったから困る
※カテゴライズはいつも難しい。

## OSX

* [termhere](https://hbang.ws/apps/termhere/)

## Application develop

* [Simian](http://www.harukizaemon.com/simian/)

## Web Frontend

* [styled-components](https://www.styled-components.com/)

## IntelliJ

AndroidStudioも同じ

* https://plugins.jetbrains.com/plugin/93-metricsreloaded
* https://plugins.jetbrains.com/plugin/9829-duplicate-detector
* https://plugins.jetbrains.com/plugin/1137-pmdplugin
* https://plugins.jetbrains.com/plugin/9198-android-gradle-metrics--pmd


## VSCode

* [Japanese Language Pack for Visual Studio Code](https://marketplace.visualstudio.com/items?itemName=MS-CEINTL.vscode-language-pack-ja)
* [vscode-icon](https://marketplace.visualstudio.com/items?itemName=robertohuertasm.vscode-icons)
* [GitLens](https://marketplace.visualstudio.com/items?itemName=eamodio.gitlens)
* [Git History](https://marketplace.visualstudio.com/items?itemName=donjayamanne.githistory)
* [Bracket Pair Colorizer](https://marketplace.visualstudio.com/items?itemName=CoenraadS.bracket-pair-colorizer)
* [RESTClient](https://marketplace.visualstudio.com/items?itemName=humao.rest-client)
* [Bookmarks](https://marketplace.visualstudio.com/items?itemName=alefragnani.Bookmarks)
* [TODO Highlight](https://marketplace.visualstudio.com/items?itemName=wayou.vscode-todo-highlight)
* [Path Autocomplete](https://marketplace.visualstudio.com/items?itemName=ionutvmi.path-autocomplete)
* [Rainbow CSV](https://marketplace.visualstudio.com/items?itemName=mechatroner.rainbow-csv)
* [Partial Diff](https://marketplace.visualstudio.com/items?itemName=ryu1kn.partial-diff)
* [Rainbow Brackets](https://marketplace.visualstudio.com/items?itemName=ryu1kn.partial-diff)
* [Prettify JSON](https://marketplace.visualstudio.com/items?itemName=mohsen1.prettify-json)
* [Prettier - Code formatter](https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode)
* [WakaTime](https://marketplace.visualstudio.com/items?itemName=WakaTime.vscode-wakatime)
* [Output Colorizer](https://marketplace.visualstudio.com/items?itemName=IBM.output-colorizer)
* [Log File Highlighter](https://marketplace.visualstudio.com/items?itemName=emilast.LogFileHighlighter)
* [GitHub](https://marketplace.visualstudio.com/items?itemName=KnisterPeter.vscode-github)


### via

* [VSCodeのオススメ拡張機能 24選 (とTipsを少し)] (https://qiita.com/sensuikan1973/items/74cf5383c02dbcd82234)


## Webサービス

* [Prettier](https://prettier.io/)
* [gitignore.io](https://www.gitignore.io/)


## JavaScript

### JQuery

* [Japan Map ( jQuery plugin )](https://github.com/takemaru-hirai/japan-map)
[xbindkeys] ノーパソに Linux 入れた時に Fn キーの輝度調整が認識されない場合の対処

## やりたいこと

以下のキーに輝度調整の機能を割り振る.

- `<F3>`: 画面の輝度を下げる 
- `<F4>`: 画面の輝度を上げる

## 環境

- Ubuntu 16.04
- Zenbook

## インストール

```
sudo apt install -y xbindkeys xbacklight
```

## 設定

`~/.xbindkeys`

```
"xbacklight -dec 10"
  F3
"xbacklight -inc 10"
  F4
```

`~/.xinitrc` とか適当な場所に

```
xbindkeys
```
php-master-changes 2018-10-20

今日は buildconf が標準エラー出力へエラーを吐くようにする修正、古いビルドシステムで使われていた不要なファイルの削除、tests 下からの自動生成でない .php のリネーム、zend_isnan() / zend_isinf() / zend_finite() の実装で C++11 のシンボルを使うようにする修正があった！

# 2018-10-20
## mizunashi-mana: Fix [#77041](https://bugs.php.net/bug.php?id=77041): buildconf should output error messages to stderr
- https://github.com/php/php-src/commit/9f5cb626ed4bede914b57ec8e233808030671ee5
- [7.1~]
- buildconf がエラーを標準出力へ吐いてたのを標準エラー出力へ吐くよう修正
- とりあえず[ふぁぼって](https://twitter.com/Mizunashi_Mana/status/1053556920399753217)おいた

## petk: [ci skip] Update NEWS
- https://github.com/php/php-src/commit/13aae9f3d5cd1b4c74d5ade9e499c62a53a911ba
- [7.1~]
- ↑の NEWS への追記

## petk: Remove mkdep.awk
- https://github.com/php/php-src/commit/addcf2402d221d7c67fa01c170fde08e5fe312d6
- 古いビルドシステムで使われていた mkdep.awk を削除
- mkdep.awk で使われていたファイルに *.slo なファイルがあり、これは古い libtool で生成されるものだったが、今現在は生成もされなくなったので .gitignore から削除

## petk: Rename two *.php files in tests folders
- https://github.com/php/php-src/commit/d6c05c6cd1bab55f91dc986aaaecafc1840d0868
- run-tests は .phpt から .php を生成するような動作
- それで tests 下の .php は .gitignore へ入れているが、テストで生成されるのではない .php ファイルが 2 つあったので、混乱を避けるよう .inc と .phar へ名前が変更された

## weltling: Use C++ symbols with C++11, take 2
- https://github.com/php/php-src/commit/251bd9c2534690c10ac041c11cae4296a589f280
- [昨日いっぺん入れて](https://qiita.com/sj-i/items/62d0749d6bdcfe4a7b50#weltling-use-c-symbols-when-c11-or-upper-is-compiled)[リバートした](https://qiita.com/sj-i/items/62d0749d6bdcfe4a7b50#weltling-revert-use-c-symbols-when-c11-or-upper-is-compiled)修正のやり直し
- `extern "C++" {}` つけるようになってる 
- よう分からんけど

- ```
#ifdef __cplusplus
extern "C" {
#endif
```
みたくなってる文脈で使われる際にここだけ抜け出す用とかかな？
Subversionのリポジトリを作成する


# はじめに
svnリポジトリの作成方法を記録として残しておきます。

### 実行環境
- CentOS Linux release 7.5.1804 (Core)


# リポジトリの作成
```bash
svnadmin create /path/to/SvnRepos/MyProject
```

# リポジトリの設定

```bash
cd /path/to/SvnRepos/MyProject/conf
```

```svnserve.conf
# 以下をコメントアウトを外して有効にする
anon-access = none
auth-access = write
password-db = passwd
```

```passwd
[users]
# harry = harryssecret
# sally = sallyssecret
# ユーザとパスワードを設定する
MyUser  = MyUserPasswd
```

# Svnserveの起動
```bash
systemctl start svnserve
```
Svnserveを使うとTCP/IP接続でリポジトリにアクセスできます。

# ポートの開放
```bash
firewall-cmd --add-port=3690/tcp --zone=public --permanent
firewall-cmd --reload
```
Dynamics365の拡張アプリケーションの開発環境を構築し始める

#Dynamics365の拡張アプリケーションを作成する準備
最近になってOnlineに触れる機会が増えてきたのでOnlineの拡張開発もできるようになりたい。
だけど、認証周りが特によくわからないので、とりあえずサンプルを動かしてみたという話です。

##Visual Studioの準備
まずはVisual Studio 2017の無料版をインストールしました。
この辺は必要そうなものをてきとうに選択。
<img width="935" alt="1.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/190486/fc1ab68a-194f-bfe8-90ca-8862eee17d0f.png">

##サンプルのアプリケーションをダウンロード・
https://docs.microsoft.com/ja-jp/dynamics365/customer-engagement/developer/simple-program-web-services

上のURLに書いてある説明通りにやります。
NuGetがVisual Stuidoにない場合はメニューバーの [ツール]>[拡張機能と更新のスケジュール]で、
NuGet Packager をインストールすればよかったと思います。

##NuGetでライブラリを最新化
2.の手順でソリューションをVisual Studioで開きます。
3.の手順で言っているのはこれです。
<img width="518" alt="3.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/190486/a898f5ce-e3ab-44b8-6512-042f2e0b4dcf.png">

4.で言っているのはこれです。
上の「更新プログラム」を選択すればでると思います。
<img width="669" alt="5.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/190486/f2c764c6-6d38-232a-db0d-58627eb3e904.png">



##サンプルアプリケーションのデバッグ
とりあえずこれだけやってF5キーを押したらコマンドプロンプトが立ち上がりました。
<img width="1026" alt="6.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/190486/dc4cdfa5-ea2e-e2f1-3cad-8adaecc7a533.png">

6.各プロンプトに次の情報を入力します。
でCRMサーバーの名前を入力とありますが、
日本でトライアルを取得している場合は、crm7.dynamics.comになっていると思います。
画像はURL部分にCRMサーバー名が表示されています。
黄色く塗りつぶしている部分は組織名です。
<img width="702" alt="2.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/190486/679135db-5278-5437-9558-7e4470017881.png">

あとはてきとうに要求される情報を入力していくだけです。
<img width="745" alt="7.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/190486/8a69025b-1c3d-0309-9a4c-c63591fbc2a2.png">

勝手に動いていって、Dynamicsにレコードを作った、取得した、そしてアップデートしたというログが出てきました。
何回か起動したので３つできていますが、下記のようにDynamicsを見ると確かにレコードができていました。
<img width="581" alt="8.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/190486/120b9300-47b6-beaa-6c96-7108bf0f8e79.png">

##認証情報ができている
一度上記の手順を行うと、入力した内容から認証情報をXMLファイルに保存するとDOCに書いてあります。
下記のようなファイルが生成されていました。
ソースコードも読んでみましたが、この辺の情報でどうやって認証しているかわかるまでには時間がかかりそうです。
自分でアプリケーションを作るだけなら、これを流用してしまえば、いけるもんなんでしょうか。
<img width="817" alt="9.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/190486/b1a46eea-b78e-2c7c-6bac-c921bbe85c0c.png">

下記のコードがCredentials.xmlの保存先です。
C:\Users\\[UserName]\AppData\Roaming\CrmServer の下にファイルが生成されるようなコードになっています。
<img width="736" alt="10.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/190486/03e4528e-d76d-1df1-ca68-127a0cc7f864.png">

##レコードの作成、取得、更新
肝心のレコードを作ったり取得したりは、下記の画像のあたりのソースコードを参考にすればいろいろできそうです。
テストデータをDynamicsの試験環境に作ったり（標準のインポート機能で十分か）、
テスト用に本番環境からマスキングデータを生成するなどは簡単にできそうです。
<img width="972" alt="11.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/190486/ef7af0d4-db28-776e-63cc-b148c0c18aba.png">

あとはバッチ機能を想定して大量データ作成、更新するアプリケーションや
マッピング情報をファイルから読み込むようにして、いろいろなエンティティのレコードを汎用的に吸いだせるアプリケーションを作ってみたいです。
（だれかがもう作っているとは思いますが）
IntelliJのプロジェクトで外部のjarファイルを追加する。

#やること。
IntelliJのプロジェクトのExternal Librariesを追加します。
Eclipseで同様のことを行っている記事はたくさん会ったのですが、IntelliJではあまりないので備忘録として残しておきます。

#アウトライン
環境：Ubuntu18.04
1. 今回は/opt/oracle/instantclient_18_3内にあるojdbc8.jarを追加する。
2. 追加先はIntelliJ External Libraries。

#やってみる。
#####1. File -> Project Structureを選ぶ
![メニュー_006.png](https://qiita-image-store.s3.amazonaws.com/0/304366/82576c28-cd28-452c-c5ec-1e9ca6f8ce6f.png)

#####2. Modules-> Dependenciesを選ぶ。
![Project Structure_007.png](https://qiita-image-store.s3.amazonaws.com/0/304366/a74b8dba-0ddb-5009-6d6a-cc4b4ee5b210.png)

####3. scopeの右あたりにある+記号をクリック。
選択肢が表示される。
####4. Jars or directorues...を選択する

![メニュー_008.png](https://qiita-image-store.s3.amazonaws.com/0/304366/0f2bebec-4684-65a7-92a9-9e51152d59b0.png)

####5. /opt/oracle/instantclient/18_3/ojdbc8.jarを選択する。
![Attach Files or Directories_009.png](https://qiita-image-store.s3.amazonaws.com/0/304366/36110875-468d-3c09-0168-07eec5346961.png)

OKを押す。

####5. External Librariesを確認
![範囲を選択_012.png](https://qiita-image-store.s3.amazonaws.com/0/304366/8588011a-07cd-f820-e83b-7bf924af795a.png)

ありました。
Tracを導入してSubversionを管理する


## はじめに
Tracの環境を構築する際に色々とハマったのでメモとして残しておきます。

### 実行環境
- CentOS Linux release 7.5.1804 (Core)

## Tracのインストール
```bash
yum install subversion-python
```
今回はTracを使ってSubversionを管理するのでインストールします。
これがないとTrac上でSubversionの管理ができないようです。


```bash
easy_install Babel
easy_install Trac
```
Tracを日本語化するためにBabelが必要なようです。
インストールする順番もBabel→Tracにする必要あり。
※きちんと調べていないので正しい情報ではないかもしれません。


## プロジェクト環境の作成
```bash
trac-admin /path/to/MyProject initenv
```
プロジェクト名とデータベース接続文字列を入力する。
今回はデータベース接続文字列を特に指定しませんでした。

今回は自分自身のユーザアカウントに管理者権限を持たせます。

```bash
trac-admin /path/to/MyProject permission add MyUser TRAC_ADMIN
```


## ダイジェスト認証用パスワードファイルの生成
```bash
htdigest -c /path/to/htpasswd trac MyUser
htdigest    /path/to/htpasswd trac NextUser
```

## Tracのデプロイ
スタンドアローンサーバーの実行

```bash
tracd --port 80 --base-path trac --protocol=http --auth="*,/path/to/htpasswd,trac" MyProject/
```
80番ポートでサブディレクトリに/tracを指定しています。


### WEBサーバーでのTracの実行
Tracのcgi-binディレクトリの生成

```bash
trac-admin /path/to/MyProject deploy /path/to/MyProject/dist
chmod 777 /path/to/MyProject/dist/cgi-bin/trac.fcgi
```
MyProjectフォルダの中にdistフォルダを作ってcgi-binディレクトリを生成しています。
cgiファイルに実行権限をつけておきます。

```bash
chown -R apache:apache /path/to/MyProject
```
MyProject以下のファイルの所有者をapacheユーザに変更します。
変更しないと書き込み権限がなくエラーになってしまうようです。


#### FastCGIの導入
ライブラリのインストール

```bash
yum install httpd-devel gcc
```

```bash
cd /usr/local/src/
wget https://www-eu.apache.org/dist//httpd/mod_fcgid/mod_fcgid-2.3.9.tar.gz

tar zxvf mod_fcgid-2.3.9.tar.gz
cd mod_fcgid-2.3.9/

./configure.apxs
make
make install
```

Trac用にApacheの設定ファイルを作成

```bash
httpd -v
Server version: Apache/2.4.6 (CentOS)
Server built:   Jun 27 2018 13:48:59
```

```httpd-trac.conf
<Directory /path/to/MyProject/dist/cgi-bin/>
SetHandler fcgid-script
Options +ExecCGI

# Customize the next two directives for your requirements.
AllowOverride All
Require all granted
</Directory>

ScriptAlias /trac /path/to/MyProject/dist/cgi-bin/trac.fcgi/
DefaultInitEnv TRAC_ENV /path/to/MyProject/

<Location "/trac">
AuthType Digest
AuthName "trac"
AuthDigestDomain /trac
AuthUserFile /path/to/htpasswd
Require valid-user
</Location>
```
サブディレクトリに/tracを設定しています。
/tracにアクセスに来たときダイジェスト認証を行います。

以上でTracを利用できるようになっているはず。

## TracでSubversionリポジトリ管理
うまく設定できていればブラウザの管理コンソールからリポジトリの設定ができるはず。
コマンドラインでのリポジトリ管理も記載します。

```bash
# 管理中のリポジトリ一覧を表示します
trac-admin /path/to/MyProject/ repository list

# Tracプロジェクトに管理リポジトリを追加します
trac-admin /path/to/MyProject/ repository add MyProject /path/to/SvnRepos/Project/
```

```bash
chmod +x /path/to/SvnRepos/Project/hooks/post-commit
vim /path/to/SvnRepos/Project/hooks/post-commit
```
フックスクリプトに実行権限がないと失敗するので注意

Tracがsvnのコミットを検知する用にフックスクリプトを作成

```post-commit
#!/bin/sh

REPOS="$1"
REV="$2"

trac-admin /path/to/MyProject/ changeset added "$REPOS" "$REV"
```



## おまけ
今回はNginxをプロキシサーバーとして動かしています。
TracをApacheの設定で50080番ポートで実行しています。
Nginx:80->Apache:50080->Tracとなっています。

Nginxの設定ファイルもおまけで記載します。

```nginx-trac.conf
server {
    listen       80;
    server_name  localhost;

    access_log  /var/log/nginx/trac.access.log  main;
    error_log   /var/log/nginx/trac.error.log   info;

    location /trac {
        proxy_pass http://localhost:50080/trac;
    }
}
```
HadoopのData Nodeのファイルシステムは何が良い？

# 質問
* HadoopのData Nodeのファイルシステムは何が良い？
* HadoopのOSの推奨設定は？


# 回答
* [HDP 2.6.5 Document](https://docs.hortonworks.com/HDPDocuments/HDP2/HDP-2.6.5/bk_cluster-planning/content/ch_partitioning_chapter.html)
* [HDP 3.0.1 Document](https://docs.hortonworks.com/HDPDocuments/HDP3/HDP-3.0.1/cluster-planning/content/partitioning.html)

```
Hadoop Slave node partitions: Hadoop should have its own partitions for Hadoop files and logs. Drives should be partitioned using XFS, or ext4 in that order of preference. Do not use LVM; it adds latency and causes a bottleneck.
```

つまり、XFSか、EXT4が良い。
マインクラフトのログから特定の文字列が入っていたらディスコードに流すシェルスクリプト

マイクラのログから死因とか実績をとった際にdiscordに流す用のシェルスクリプトを作ってみた。
discordからwebhookのurlを取ってきて、そこに最新のログから送りたい文字列が入っていたら流す感じにしてる。
#コード
```bash:discordLog.sh
#!/bin/bash
tail -n0 -F ~/xxx/logs/latest.log |
grep --line-buffered -f ~/xxx/pattern.txt |
xargs -I @ curl -H "Content-Type: application/json" -X POST -d '{"username": "minecraftBot", "content":"@"}' url
```
tailでlatest.logの出力を書き出して、grepで条件指定して、curlで投げる。
ワンライナー?で出来るのでとってもお気軽:relaxed:
#メモ
```bash
tail -n0 -F ~/xxx/logs/latest.log |
```
`tail -F`で新しいlogを検出する、大文字のFオプションだとファイルが新規に生成されたりしてもいい感じに対応してくれる。
`-n0`のオプションで、最初のコマンド使用時に文末の文字を出力させないようにする。

```bash
grep --line-buffered -f ~/xxx/pattern.txt |
```
`--line-buffered`で渡された文字列をバッファさせないようにして、
`-f`オプションでpattern.txtの内容から検索条件を指定する。
pattern.txtの中身はこんな感じ

```
blew
burned
didn't
died
discovered
drowned
experienced
fell
got
hit
removed
starved
suffocated
tried
walked
was
went
withered
advance
WARN
```
死因の１単語目と実績(advance)、サーバ負荷などの警告(WARN)の単語が入っていたときにパターンマッチするようにしている。ここはやりたことに合わせて変更する。

```bash
xargs -I @ curl -H "Content-Type: application/json" -X POST -d '{"username": "minecraftBot", "content":"@"}' url
```
xargsで文字列を渡されるごとにcurlでdiscordに投げる。
最後のurlの部分はwebhook用のurlを入れる。

#死因の1単語目の一覧をスクレイピングするシェルスクリプト(おまけ)
https://minecraft.gamepedia.com/Health#Death_messages パターンマッチ用にここから条件に合うものをスクレイピングする。

```bash
curl https://minecraft.gamepedia.com/Health#Death_messages | grep '\[player\]' | awk '{print $2}' | sed 's/<\/li>//' | sort | uniq
```
冗長な気もするけど結果はokそうなので問題なし:sweat_smile:
#参考
http://takuya-1st.hatenablog.jp/entry/2017/05/11/073000
プログラマーが表現するテンソル

##はじめに(不要)
テンソルを今さら勉強したのでプログラマ向けにイメージの共有をします。
実装からテンソルがなにかの雰囲気を読み取れるかと思います。

#結論：テンソルは多次元配列で表現できる


#実装
### ベクトルの具体例

```ruby
#2次元のベクトル;sizeが2のList
vector2 = [1,2]
#3次元のベクトル;sizeが3のList
vector3 = [3,4,5]
```
### テンソルの具体例

```ruby
#0階のテンソル;数値型
tensor0 = 5
#1階のテンソル;sizeは自由なList;ベクトル
tensor1 = [1,2,3,4,5,6]
#2階のテンソル;Listが1階入れ子になったList
#各Listのsizeは自由
tensor2 = [[1,2,3],[4,5,6],[7,8,9]]
#3階のテンソル;Listが2階入れ子になったList
#各Listのsizeは自由
tensor2 = [ [[1,1,1],[2,2,2]] , [[3,3,3],[4,4,4]] ]
```
##モノクロ画像は2階のテンソルで表現できる

```ruby
#3*3のListを全部0で埋める
bw = Array.new(3){ Array.new(3,0)}
p bw
#=> [[0,0,0],[0,0,0],[0,0,0]]
p bw[2][2]
#=> 0
```

##RGB画像は3階のテンソルで表現できる
```ruby
#3*3*3のListを全部0で埋める
rgb = Array.new(3){ Array.new(3){ Array.new(3,0)}}
p rgb
#=>
#[[[0,0,0],[0,0,0],[0,0,0]], #赤色
#[[0,0,0],[0,0,0],[0,0,0]],　#緑色
#[[0,0,0],[0,0,0],[0,0,0]]]　#青色
p rgb[2][2][2]
#=> 0
```

#テンソル計算のイメージ
テンソルは空間と空間の積で得られる空間の元だと言えるが、いまいちピンと来ないので、イメージとしてベクトル空間同士の積をみてみる。
ベクトルは1階のテンソルであり、それらをかけ合わせたものは2階のテンソルとなる。
(積、と丸めているが、テンソル積のこと)

```ruby
#任意の(x,y,z)と(p,q,r)
double x,y,z,p,q,r

#ベクトル空間の元(1階のテンソル空間)
vctr2xy = [x,y,z]
vctr2pq = [p,q,r]

#ベクトルの掛け算を***で表現すると
#tnsr = vctr2xy *** vctr2xy
#2階のテンソル空間の元
tnsr = 
[[x*p,x*q,x*r],
[y*p,y*q,y*r],
[z*p,z*q,z*r]]
```

##あとがき
~~大学の授業全部寝ていた~~
なぜかテンソルを全く知らなかったので0から勉強しました、間違い等あれば教えてください。
IronRubyでWPFのウィンドウを表示する

# 概要
IronRubyを使い、WPFのウィンドウを表示するサンプルコードを掲載します。

# 環境
Windows 8.1（64ビット）
IronRuby 1.1

# コード
コードは次の通りです。

```wpf_show_window_01.rb
# coding: utf-8

require 'PresentationFramework'

include System::Windows

window = Window.new
window.title = "IronRuby"

app = Application.new
app.run(window)
```

# 実行方法
[1] DOS窓を開き、`wpf_show_window_01.rb`を実行します

```
> "C:\Program Files (x86)\IronRuby 1.1\bin\ir.exe" wpf_show_window_01.rb
```

[2] 実行すると空のウィンドウが表示されます。スクリプトを終了するにはウィンドウの×ボタンを押します

![wpf_show_window_01_result.PNG](https://qiita-image-store.s3.amazonaws.com/0/304851/a0e0c70e-d8da-7b83-cb3b-1597db20631a.png)

# 応用

ウィンドウにボタンを追加します。

````wpf_show_window_02.rb
# coding: utf-8

require 'PresentationFramework'

include System::Windows
include System::Windows::Controls

window = Window.new
window.title = "IronRuby"
window.Width="300"
window.Height="300"

button = Button.new
button.MinWidth = 150
button.Content = "あいさつ"
window.Content = button

button.Click do |sender, e|
	MessageBox.Show("こんにちは")
end

app = Application.new
app.run(window)
````

このコードを実行するとボタンが1つだけあるウィンドウが表示されます。
ボタンを押すと、"こんにちは"と書かれたダイヤログが出ます。

![wpf_show_window_02_result.PNG](https://qiita-image-store.s3.amazonaws.com/0/304851/5ff738c6-31bd-8874-c341-92b167192ea7.png)

WPFはXamlというXMLファイルに画面のレイアウトを作ることが多いですが、それもできます。
また、ここではWPFの話をしましたが、Formも利用可能です。

# 何がうれしいの？

IronRubyだけインストールした環境でGUIのプログラムが作れることです。つまり、導入が楽ということです。
RubyであればRuby-GNOME2などのGUIライブラリがありますが、追加のライブラリです。

実はこの記事は「IronRubyでExcelのマクロを実行する」というテーマの一環として作成しました。
Excelのマクロ実行環境はGUIエディタが付属しており、直感的にGUIを作成することができますが、この代わりの機能としてWPFを選択したというわけです。

なぜExcelのマクロ実行環境のGUIエディタを使わないのかというと、作られたウィンドウはリサイズすらできないなど柔軟性が低く、多少複雑なGUIを作ろうとしたときに行き詰る危険性があったからです。
jsdoでtensorflow.js その8

#概要
jsdoでtensoefllow.jsやってみた。
tensorflow.jsで学習した、ウェイトとバイアスを使って、wemosでsin回帰してみた。

#写真
![image](https://qiita-image-store.s3.amazonaws.com/0/18104/026ca390-0abe-b50e-33b1-446826f542e5.png)


#サンプルコード

```

double w1[12] = {0.6203325, -1.027319, 1.8841791, -3.2817535, 1.2214272, 0.9679314, 1.4196726, 7.171823, 1.3714954, 3.7268815, 0.0598045, 1.1944624};
double b1[12] = {1.1656082, -2.0180476, -6.9387307, 3.3653135, -1.7032033, -2.8969588, 0.0565524, -9.5316219, -5.7146306, -2.8060255, -0.3085915, -6.3642092};
double w2[12] = {-1.2655445, -1.0401167, 0.2071615, -0.4695872, -2.6633599, -0.5835096, 1.2490041, 1.2825323, -1.5088843, 0.6767025, 0.0224434, 1.6849496};
double b2 = -0.2928229;
int i;

double tanh(double x) 
{
	if (x > 20) return 1.0;
	else if (x < -20) return -1.0;
	else
	{
		double a = exp(x);
		double b = exp(-x);
		return (a - b) / (a + b);
	}
}

void setup()
{
	Serial.begin(115200);
	i = 0;
}
void loop()
{
  int j;
	i++;
	if (i > 20) i = 0;
	double x = i / 3.0;
	double sum = 0;
    double d[12] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
	for (j = 0; j < 12; j++)
	{
        d[j] += w1[j] * x + b1[j];
	}
	for (j = 0; j < 12; j++)
	{    
	    d[j] = tanh(d[j]);
    }
	for (j = 0; j < 12; j++)
	{
		sum += w2[j] * d[j];
	}
	sum += b2;
	sum = tanh(sum);
	Serial.println(sum);
}



```

以上。
jsdoでtensorflow.js その7

#概要

jsdoでtensorflow.jsやってみた。
学習したウェイトとバイアスを使って、tensorflow.jsを使わないでsinを回帰してみた。

#写真

![](http://jsdo-static-contents.s3.amazonaws.com/images/capture/s/5/q/s5qN.jpg?t=1540069311)

#サンプルコード

```
var canvas = document.getElementById("canvas");
var ctx = canvas.getContext("2d");
function draw(data, n) {
	var hc = n * 100 + 100;
    ctx.strokeStyle = "#f00";
    ctx.lineWidth = 1;
	ctx.moveTo(0, hc);
    for (var i = 1; i < 20; i++) 
    {
        ctx.lineTo(i * 10, hc - data[i] * 30);
    }
	ctx.stroke();
}
const tx = [];
const ty = [];
for (var i = 0; i < 20; i++) 
{
    var x = i / 3.0;    
    var y = Math.sin(x);
    tx.push(x);
    ty.push(y);
}
draw(ty, 0);

var w1 = [0.6203325, -1.027319, 1.8841791, -3.2817535, 1.2214272, 0.9679314, 1.4196726, 7.171823, 1.3714954, 3.7268815, 0.0598045, 1.1944624];
var b1 = [1.1656082, -2.0180476, -6.9387307, 3.3653135, -1.7032033, -2.8969588, 0.0565524, -9.5316219, -5.7146306, -2.8060255, -0.3085915, -6.3642092];
var w2 = [-1.2655445, -1.0401167, 0.2071615, -0.4695872, -2.6633599, -0.5835096, 1.2490041, 1.2825323, -1.5088843, 0.6767025, 0.0224434, 1.6849496];
var b2 = -0.2928229;
function tanh(x) {
	if (x > 20) return 1;
	else if (x < -20) return -1;
	else
	{
		var a = Math.exp(x);
		var b = Math.exp(-x);
		return (a - b) / (a + b);
	}
}

var i;
var j;
var y = [];
for (i = 0; i < 20; i++)
{
	var x = i / 3.0;
	var sum = 0;
    var d = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
	for (j = 0; j < 12; j++)
	{
        d[j] += w1[j] * x + b1[j];
	}
	for (j = 0; j < 12; j++)
	{    
	    d[j] = tanh(d[j]);
    }
	for (j = 0; j < 12; j++)
	{
		sum += w2[j] * d[j];
	}
	sum += b2;
	sum = tanh(sum);
    y.push(sum);
}
draw(y, 1);
          
          

```


#成果物

http://jsdo.it/ohisama1/s5qN

以上。
Rubyの意外と知られていないかもしれない"?文字"

Rubyだと`?a` と `'a'`は同じになるってことだけです。（はてなの後ろは一文字の文字だけがかけます）これを使うと少しタイプ数が少なくなります。


a-Zまでの文字列を作る例:

```rb
[*?a..?z, *?A..?Z].join
=> "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
```

あんまり使われているとこを見ない気がするので書いてみました。
emacsでよく使うキーバインド

# よく使うキーバインド

移動系は省略

## eshellを開く

`M-x eshell`

## eshellでctrl+cしたい

`C-c C-k`

## eshellから別ウィンドウでファイルを開く

`find-file-other-window <file名>`

## ファイルを開く

`C-x C-f`

## 任意のディレクトリをdiredバッファで開く

`C-x d`

## ウィンドウを移動

`C-x o`

## バッファを削除

`C-x k <buffer_name>`

## undo

`C-/`

## redo

`C-g C-/`

## start mark

`C-@`

## copy

`M-w`

## cut

`C-w`

## ファイル内文字列検索

`C-s`
`C-r`
その後同コマンド連打で次の箇所に引っ掛けてくれる
returnでその場所にfocus

## バッファ内全てをマーク

`C-x h (mark-whole-buffer)`

## マーク範囲のインデントを調整する

`M-x indent-region`

## ウィンドウサイズを縮める

`C-x-^`

## emacs中断

`C-z`
※戻る時は`fg`

## emacs終了

`C-x C-c`
"The timeout specified has expired"が読めなかった

# 問題

次のサイトにある、この一文がまったく読めなかった。
* <https://hub.docker.com/_/wordpress/>

> If the WORDPRESS_DB_NAME specified does not already exist on the given MySQL server, it will be created automatically upon startup of the wordpress container, provided that the WORDPRESS_DB_USER specified has the necessary permissions to create it.

とくに"the WORDPRESS_DB_NAME specified does not already exist"のところで、"specified"と"does not"が繋がっているところが解読できなかった。

もっと簡単なところでいうと、サーバのログとかも同じ。

> The timeout specified has expired

# 解決

Google翻訳で見てみたところ、次のように回答をもらって納得した。

> 指定されたタイムアウトがタイムアウトしました

つまり"specified"は"timeout"にかかっていたのだ。
「指定されたタイムアウトは失効しました」みたいな翻訳になる。

"The specified timeout has expired"と書かれないのが腑に落ちないが、とりあえず読めるようになりました。

# その他

最初の文章はこんな風に訳してみました。

> If the WORDPRESS_DB_NAME specified does not already exist on the given MySQL server, it will be created automatically upon startup of the wordpress container, provided that the WORDPRESS_DB_USER specified has the necessary permissions to create it.

> もし指定されたWORDPRESS_DB_NAMEが（オプションコマンドで）与えられたMySQLサーバ上に存在しない場合、Wordpressコンテナの作成前に自動で作成されます。ただし指定されたWORDPRESS_DB_USERが作成するための権限を持っている必要があります。

（"provided that"が「ただし〜ならば」という意味だってことも知らなかった）
Vue-cli3の.envファイルで環境変数が使えない時の対処法

リファレンスやサイトにはプロジェクトのルートディレクトリに ` .env `ファイルを置いて VUE_APPというプレフィックスをつけて環境変数を定義する。
みたいな事が書いてあるのですが、僕の環境ではそれが出来ずに困ったので同じ人がいるのではないかと思い対処法を共有したいと思います。

まず原因としては `vue init webpack プロジェクトを作成する場所 `でvue-cli3プロジェクトを作成すると起きる問題らしいです。

根本的な原因を探しに行ける程スキルを持ってないのが悲しい所です（泣

別の方法でプロジェクトを作り直せるならそれをするのが一番楽です。

まぁ早速対処法ですが、

ズバリ `config/dev.env.js `に書いてしまいましょう。

` config/dev.env.js`を見てみると

```
NODE_ENV: '"development"'
```
と書いてありますね！

これに続いて

```
NODE_ENV: '"development"',
BASE_API: '"APIのエンドポイント"'
```
と記述してあげるとコード側で

``` 
console.log(process.env.BASE_API)
```
みたいな感じで書けます。(VUE_APPのプレフィックスは不必要)

もちろん

test環境なら ` test.env.js `
本番環境なら ` prod.env.js `

に書いてくださいね！

.envが使える方法や間違い等がありましたらコメントお願い致します。
SVNユーザがGitで躓くポイント

# はじめに
長年SVNを使ってきた人からみると、Gitはなかなかとっつきにくい印象を持たれる方が多いように感じます。この記事では、SVNとGitの違いに焦点を当てて、SVNユーザがGitを理解するのに必要なポイントを見ていきます。

# Gitで分からないことを調べるとCLI(コマンド)ベースで検索結果が表示される
SVNを使ってる開発者は基本[TortoseSVN](https://tortoisesvn.net/)などのGUI環境を用いてSVNの操作をしているはずです。ほとんどコマンドを打ってSVNを操作している人はいないと思います。GitでわからないことやGitを学び始めようとした際にGoogleなどで検索すると、コマンドラインでの解説が掲載されていて、「何のことやらわからない」状態になってしまっている人が多いです。

## TortoseGitがおすすめ
そういう人には、[TortoiseGit](https://tortoisegit.org/)がおすすめです。TortoiseGitはTortoseSVNと同じようなGUIで操作できるので、コマンドをいちいち覚える必要がありません。コマンドを覚えるぐらいなら、***Gitの概念***を覚えることに注力したほうがいいです。
GUIクライアントはほかにも[Sourcetree](https://www.sourcetreeapp.com/)などあるので自分の気に入ったものを使えばいいです。

# リモートとローカルの概念
SVNにはそもそもリモートとローカルの概念がありません。Gitではリモートとローカルに別々のリポジトリが存在するので、そのことを常に意識していないといけません。これは慣れしかないです。

# ブランチを切らずにmasterで作業をしている
SVNではGitのように気軽にブランチを切ることができません。しかし、Gitでは作業ごとにブランチを切ることが、当たり前なので、ブランチを切らずに作業して、ほかの作業者のコミットとぶつかることがあります。作業ごとにブランチを切るようにしましょう。

#ブランチ戦略を理解できない
ブランチを作ること自体が不慣れなのでなかなか、ブランチのイメージがつかずに、間違ったブランチにマージしたり、masterに直接コミットしたりするSVNユーザがいます。

#さいごに
ここまでいろいろ書きましたけれども、やっぱり最後は***慣れ***が必要です。GitをインストールしてGUIクライアントを入れて、ブランチを切ってコミットして、masterにマージする、この一連の流れが理解できたら、ある程度は実務でも使えるはずです。まずはここを目指しましょう。そのあとrebaseなどを勉強して、実際に使ってみるとGit上級者になれます。

***「Gitは怖くないよ!!!」***