OmniAICreator/Qiita-1.07M huggingface dataset:
Rubyのinheritedについて調べてそれを活かしたNaniyatsuというgemを作った話

# Rubyのinherited
https://docs.ruby-lang.org/ja/latest/method/Class/i/inherited.html
Rubyにはinheritedというサブクラスが定義されたときにコールされるクラスメソッドがある.
存在は知っていたが使う機会が一切無かったのでいろいろ実験して調べてみた.

## とりあえず使ってみる
```ruby:hoge.rb
class Hoge
  def self.inherited(subclass)
    puts 'ここでなんかできるよ'
  end
end

class Fuga < Hoge
end
```

```sh
> ruby hoge.rb 
ここでなんかできるよ
```

という具合でおもむろに定義しておけば継承にフックして勝手に実行される.

## サブクラスのサブクラスが定義されたときも呼ばれる
```ruby:hoge.rb
class Hoge
  def self.inherited(subclass)
    puts 'ここでなんかできるよ'
  end
end

class Fuga < Hoge
end

class Piyo < Fuga
end
```

```sh
> ruby hoge.rb 
ここでなんかできるよ
ここでなんかできるよ
```

## サブクラスでオーバーライドするとサブクラスのinheritedだけ呼ばれる
```ruby:hoge.rb
class Hoge
  def self.inherited(subclass)
    puts 'ここでなんかできるよ'
  end
end

class Fuga < Hoge
  def self.inherited(subclass)
    puts 'Fugaのinheritedだよ'
  end
end

class Piyo < Fuga
end
```

```sh
> ruby hoge.rb 
ここでなんかできるよ
Fugaのinheritedだよ
```

## 引数にはサブクラスのクラスオブジェクトが渡される
```ruby:hoge.rb
class Hoge
  def self.inherited(subclass)
    puts subclass.to_s
  end
end

class Fuga < Hoge
end

class Piyo < Fuga
end
```

```sh
> ruby hoge.rb 
Fuga
Piyo
```

## inheritedの実行タイミング
```ruby:hoge.rb
class Hoge
  def self.inherited(subclass)
    puts '呼ばれたよ'
  end
end

puts '1'

class Fuga < Hoge
  puts '2'
end

puts '3'
```

```sh
> ruby hoge.rb 
1
呼ばれたよ
2
3
```

`class Fuga < Hoge` この行で呼ばれるらしい.
このことを指して[記事冒頭に貼ったドキュメント](https://docs.ruby-lang.org/ja/latest/method/Class/i/inherited.html)では
> このメソッドが呼ばれるタイミングは クラス定義文の実行直前です。

と説明している.

## inherited内でのself
```ruby:hoge.rb
class Hoge
  def self.inherited(subclass)
    puts self.to_s
  end
end

class Fuga < Hoge
end

class Piyo < Fuga
end
```

```sh
> ruby hoge.rb 
Hoge
Fuga
```

## まとめ
要するに｢継承時に呼ばれる｣という点だけが特殊でそれ以外は普通のクラスメソッドと何も変わらないらしい.

# Naniyatsuというgemを作った

だいたいわかったのでお遊びでNaniyatsuというgemを作った.
リポジトリ: https://github.com/takuan-oishii/naniyatsu
RubyGems: https://rubygems.org/gems/naniyatsu

```ruby
require 'naniyatsu'

class Hoge
  extend Naniyatsu
end

class Fuga < Hoge
end

class Piyo < Fuga
end

Hoge.new.hoge? # => true
Fuga.new.hoge? # => true
Piyo.new.hoge? # => true

Hoge.new.fuga? # => false
Fuga.new.fuga? # => true
Piyo.new.fuga? # => true

Hoge.new.piyo? # => false
Fuga.new.piyo? # => false
Piyo.new.piyo? # => true
```

extendすると`class_name?`なメソッドを生やしてくれるmodule.
サブクラスのインスタンスは`super_class_name?`にもtrueを返すので挙動のイメージは`kind_of?`メソッドである.

本体はこのファイルだけで完結している.
https://github.com/takuan-oishii/naniyatsu/blob/master/lib/naniyatsu.rb

inheritedと似たメソッドのextendedも使っていていい感じに勉強になった.

# 余談
qiitaの話の流れ上書きやすかったので｢勉強したかったから勉強してついでにgem作りました｣という順番で書いたが実際は同僚が
**｢RailsのSTIって`class_name?`みたいなメソッド生やしてくれそうで生やしてくれないんだな｣**
と言うので｢じゃあそういうgem作るか｣という流れで始まったNaniyatsuのアイデアありきの勉強である.
macOS で minishift [導入から起動まで]

## minishiftとは？

Red Hat OpenShiftはDockerおよびKubernetesを基盤としたPaaSを提供するソフトウェアです。オープンソースで開発されており、Red Hat社によるサポートが提供されます。

MinishiftはOpenShiftをローカルで実行するのに役立つツールです。

詳しくは「[公式ドキュメント](https://docs.okd.io/latest/welcome/index.html)」をどうぞ

## 導入手順

minishift 導入

``` bash
# brew cask install minishift
# minishift version
```

mac用の仮想化ドライバー導入

``` bash
# brew install docker-machine-driver-xhyve
# sudo chown root:wheel /usr/local/opt/docker-machine-driver-xhyve/bin/docker-machine-driver-xhyve
# chmod u+s /usr/local/opt/docker-machine-driver-xhyve/bin/docker-machine-driver-xhyve
# git -C "$(brew --repo homebrew/core)" fetch --unshallow
```

minishift 起動

``` bash
# minishift start --vm-driver xhyve
```

oc コマンドのパスを通す

``` bash
# eval $(minishift oc-env)
```

ブラウザで動作確認

``` bash
# minishift openshift service nodejs-ex --in-browser
```

ログイン

``` bash
# oc login -u developer -p developer
```

minishift 停止

``` bash
# minishift stop
```

## その他(メモ)

/var/lib/minishift/ 配下には以下のファイルがある

``` bash
# ls -1 /var/lib/minishift/
hostdata
openshift.local.config
openshift.local.pv
openshift.local.volumes
```

●　hostdata
etcdのデータ

●　openshift.local.config
OpenShiftの設定ファイル群

●　openshift.local.pv
hostPath指定で作成されたPV

●　openshift.local.volumes
podにマウントされるVolume類
KotlinNative で HelloWorld する

## Kotlin 1.3 
Kotlin 1.3 が発表されて KotlinNative がベータ版として同梱するようになりました。
今までは JVM とか JavaScript といった環境でしか動かなかったものが、KotlinNative ではバイナリとしてOSから直接動かせるようになります。JVM に依存しなくなるので iOS アプリも Kotlin で作れるようになるのではと話題になっています。マルチプラットフォーム開発の本命となるのか気になりますね。

### サーバーサイド KotlinNative
ネイティブ化する恩恵はアプリだけでなく、サーバーとして動くプログラムでもえられます。JVM は仮想マシンの一種なのでアプリケーションの立ち上げに時間がかかってしまったり、ディスク･メモリの容量を余分に食ってしまったり、という欠点があります。しかし KotlinNative でバイナリとしてアプリケーションを生成できるようになれば、このオーバーヘッドなしに動かすことができるようになります。Docker 化するときもイメージが作りやすくなりそうですね。
また、Kotlin 1.3 から Coroutines が使えるようになったのでノンブロッキングなウェブサーバーを作れるようになりました。外部の通信やファイルの入出力などを CPU で待たずに処理できるようになるので、非常に効率よくリクエストを捌けるようになります。Kotlin の非同期ウェブフレームワーク ktor も 1.0.0 としてそろそろ正式リリースされるそうなので、これは是非試してみたいと思いました。
Python より型が厳密で、Goより取っつきやすい言語(※個人差があります)なので、もしかしたら一気に流行るのではと期待しています。

## HelloWorld する
今回は KotlinNative で Ktor を動かすところまで試そうと思ったのですが、まだ KotlinNative にフレームワークが対応していなかったり、そもそも自分で他の Kotlin ライブラリを導入するところで躓いたので、とりあえず HelloWorld までをまとめてみました。

[GitHub: Kotlin Native Support #571 - https://github.com/ktorio/ktor/issues/571](https://github.com/ktorio/ktor/issues/571)


__検証環境__

* OS: Ubuntu 16.04 
    * (Windows10 WSL上で実行)


### Kotlin のインストール

完全に Kotlin 1.3 がリリースされた気でいましたがまだでした…。(2018/10/17現在)
なので Github から直接落としてきます。
(リリース後は SDKMan を入れて `sdk install kotlin` で入るそうです)

```bash
# ダウンロード
cd /tmp
wget https://github.com/JetBrains/kotlin-native/releases/download/v0.9.3/kotlin-native-linux-0.9.3.tar.gz
tar -zxvf kotlin-native-linux-0.9.3.tar.gz

# 設置してパスを通す (場所はお好みで)
sudo mv kotlin-native-linux-0.9.3 /opt/
export PATH=$PATH:/opt/kotlin-native-linux-0.9.3/bin
```

`kotlinc-native` というコマンドが使えるようになってればインストール完了です。別途 Java が使えるようになってる必要があるかもしれません。


## HelloWorld する

```kotlin
fun main(args: Array<String>) {
    println("Hello Kotlin/Native!")
}
```

https://kotlinlang.org/docs/tutorials/native/basic-kotlin-native-app.html

KotlinNative の公式ページから HelloWorld のサンプルを ~~コピペ~~ 心をこめて手打ちします。

```bash
# コンパイル
kotlinc-native hello.kt -o hello

# 実行!!
./hello.kexe
```

<blockquote class="twitter-tweet" data-lang="en"><p lang="ja" dir="ltr">Kotlin Native 完全に理解した <a href="https://t.co/Syisqfw4r0">pic.twitter.com/Syisqfw4r0</a></p>&mdash; kimihiro_n (@kimihiro_n) <a href="https://twitter.com/kimihiro_n/status/1052524988236849152?ref_src=twsrc%5Etfw">October 17, 2018</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

:clap: :clap:  お疲れ様でした。:clap: :clap:



ちなみに Kotlin 1.3 から main の引数が不要になったので、

```kotlin
fun main() {
    println("Hello Kotlin/Native!")
}
```
のようにしてもちゃんと動いてくれました。Java っぽさが消えましたね。

Kotlin 1.3 や Ktor 1.0 の正式リリース楽しみですね。
Native でもウェブサーバー作れるようになったらまた試してみたいです。
React-Native@0.57.0でstyled-components@4.0.0が使えない時の対処法

2日程前に [styled-components@4.0.0](https://github.com/styled-components/styled-components/releases)がリリースされました。

react-native@0.57.0 環境化(もしかしたら `0.57.0` だけじゃないかも？)で試すとエラーが発生する。

これらのエラーを解消するには

`supports-color` をインストールすると解決する。

```
yarn add supports-color --dev
```
これで自分の環境では問題無く使えるようになった。

###余談
具体的な問題は不明だけど、react-native@0.57.0で `rn-cli.config` の破壊的変更があったけど、 metro bundlerが一枚嚙んでいるんじゃないかと思う。
あと、react-native周りはこういう突然使えなくなる系が多い気がする。大抵は関連するライブラリのissueを読み込めば解決策が見つかるけど、それでもこういうのに引っかかると面喰らってしまうのは僕だけだろうか、、、

現場からは以上です。

参考
https://github.com/styled-components/styled-components/issues/2044
a => func(a) と func は必ずしも等価というわけではない


```js
const funcB = a => funcA(a)
funcA(1)
// => 1
funcB(1)
// => 1
```


この funcA と funcB は同じだろうか？
`a => func(a)` は常に `func` と省略しても大丈夫だろうか？



```js
funcA(1, 100)
// => 101
funcB(1, 100)
// => 1
```

違うのである。


```javascript
const funcA = (v1, v2) => {
	return v1 + (v2 || 0)
}
```

funcB では第一引数以外を無視している点が違いますね。



## これによる想定外の動作

```js
const f = callback => {
	return callback({ left: 'pen', right: 'apple' }, null, 2)
}
```

たとえば上の関数を3通りの呼び出しかたで実行してみよう。

- `f(a => JSON.stringify(a))`
- `f(JSON.stringify)`
- `f((...a) => JSON.stringify(a))`



```js
f(a => JSON.stringify(a))
// => {"left":"pen","right":"apple"}
f(JSON.stringify)
// => {
//      "left": "pen",
//      "right": "apple"
//    }
f((...a) => JSON.stringify(a))
// => [{"left":"pen","right":"apple"},null,2]
```

JSON.stringify の第二引数以降の option 指定が働くため違った結果になりました。

## 言いたかったこと

**`a => funcA(a)` だから何も考えずに `funcA` に省略すると動作が変わる可能性がある** ということです。

とはいえ funcA の引数が明確であったり type を使っていたりすればそほど問題は起こらないかと思います。頭の片隅に入れとくべき程度の tips です。
【AdobeXD】プラグイン開発1



# 目標
プラグイン作成，実行までの流れを掴む

# console.adobe.ioでStarterProjectを作る(IDを生成)
[console.adobe.io](https://console.adobe.io/plugins)を開く
新しく作成し，名前をつけると以下のような画面が表示される

サンプルと同様に`myhelloworld`という名前にしました．

![スクリーンショット 2018-10-17 12.31.06.jpg](https://qiita-image-store.s3.amazonaws.com/0/113504/412e35c4-12b6-890e-b6bd-3fb97c5c07c3.jpeg "スクリーンショット 2018-10-17 12.31.06.jpg")

Download Starter Projectする．

# StarterProjectをプラグイン開発のフォルダに配置
メニューから
プラグイン > 開発版 > 開発フォルダーを表示でdevelopフォルダを開き，
ダウンロードしたStarterProjectをそこにコピペする．

manifest.jsonはプラグイン自体の設定ファイルです．

```manifest.json
{
   "name": "myhelloworld",
   "id": "ここに自動生成されたIDが入る",
   "version":"1.0.0",
   "description":"Sample plugin for Adobe XD, providing starter project scaffolding.",
   "icons":[
      {
         "width":96,
         "height":96,
         "path":"images/icon.png"
      }
   ],
   "host":{
      "app":"XD",
      "minVersion":"13.0.0"
   },
   "uiEntryPoints":[
      {
         "type":"menu",
         "label":"My Plugin",
         "commandId":"myPluginCommand"
      }
   ]
}
```

main.jsがプラグインの実行内容です．

```main.js
/*
 * Sample plugin scaffolding for Adobe XD.
 *
 * Visit http://adobexdplatform.com/ for API docs and more sample code.
 */

var {Rectangle, Color} = require("scenegraph");

function myPluginCommand(selection) {
    // Go to Plugins > Development > Developer Console to see this log output
    console.log("Plugin command is running!");

    // Insert a red square at (0, 0) in the current artboard or group/container
    var shape = new Rectangle();
    shape.width = 100;
    shape.height = 100;
    shape.fill = new Color("#f00");
    selection.insertionParent.addChild(shape);
}

module.exports = {
    commands: {
        myPluginCommand: myPluginCommand
    }
};

```

# 実行する
プログインの再読み込みを行う
![スクリーンショット 2018-10-17 14.36.12.png](https://qiita-image-store.s3.amazonaws.com/0/113504/1e8c2da2-9ab8-4bdd-5ee8-8ffb58975b73.png "スクリーンショット 2018-10-17 14.36.12.png")

すると，プラグイン以下に`My Plugin`というプラグイン名が追加されます．
この名前はmanifest.json > uiEntryPoints > labelで定義されています．

![スクリーンショット 2018-10-17 14.46.36.png](https://qiita-image-store.s3.amazonaws.com/0/113504/96889d31-3fee-fad8-b8d1-f8a22ebe366f.png "スクリーンショット 2018-10-17 14.46.36.png")

実行すると赤い長方形が生成されます

![スクリーンショット 2018-10-17 14.36.37.png](https://qiita-image-store.s3.amazonaws.com/0/113504/468788b5-5cb7-e0ee-4b34-8513756ecd37.png "スクリーンショット 2018-10-17 14.36.37.png")

# まとめ
Adobeのプラグインの作成ができた．
次はプラグインの中身の解析をします．
仮想CentOS6.5にMailCatcherを導入する顛末

仮想マシンのCentOS6.5にmailcatcherを導入しようと思うも、色々と躓くところがあったので顛末を記録しておく。

## 環境

- CentOS release 6.5 (Final)

## TL;DR

### 1. 必要になるライブラリをあらかじめ入れておく

```
$ yum install -y openssl-devel readline-devel zlib-devel　gcc-c++ sqlite sqlite-devel ruby ruby-devel rubygems
```
### 2. NSSの更新

```
$ yum update nss nss-util nspr
```

### 3. rbenv の導入と、もう少し新しいRubyのインストール

```
$ git clone https://github.com/rbenv/rbenv.git ~/.rbenv
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
$ ~/.rbenv/bin/rbenv init
$ git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build
$ rbenv install -v 2.0.0-p648
$ rbenv global 2.0.0-p648
```

### 4. mailcatcher インストールと起動

```
$ gem install mailcatcher
$ mailcatcher --ip=0.0.0.0
```

## Ruby周りの導入

まず mailcatcher は rubygems でインストールするのだけれど、その際に前提条件としてRubyのバージョンは1.9.3以上が必要になる。

```
mailcatcher requires Ruby version >= 1.9.3
```

CentOS6.5にバンドルされているRubyは1.8.7と古いので、この際 rbenv でもう少し新しいバージョンを入れておく。詳細は [rbenv/rbenv](https://github.com/rbenv/rbenv) と [rbenv/ruby-build](https://github.com/rbenv/ruby-build) を参考にされたし。

```
$ git clone https://github.com/rbenv/rbenv.git ~/.rbenv
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
$ ~/.rbenv/bin/rbenv init
$ git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build
```

rbenv が導入できたら2.0.0あたりを入れておく。

```
$ rbenv install --list # バージョンのリストを確認
$ rbenv install -v 2.0.0-p648
```

ここで `curl: (35) SSL connect error` のエラーが発生してRubyのダウンロードに失敗する（ここでの調査に結構な時間を要することになる）
結論から言うと「[pycurlで「\(35, 'SSL connect error'\)」が出るときの対処法\(のうちの1つ\) \- Qiita](https://qiita.com/beatdown0514/items/75563f1b3dd70f5b5007)」が参考になった。
NSSが脆弱性のあるバージョンで、アップデートの必要があるとのこと。

```
$ yum update nss nss-util nspr
$ rbenv install -v 2.0.0-p648
```

さらに Build Failed のエラーが吐かれるので、エラーメッセージに従って不足ライブラリをyumで入れる。

```
$ yum install -y openssl-devel readline-devel zlib-devel
$ rbenv install -v 2.0.0-p648
```

ビルドが通り、Rubyの2.0.0がインストールされた。globalに適用する。

```
$ rbenv global 2.0.0-p648
$ ruby --version
ruby 2.0.0p648 (2015-12-16 revision 53162) [x86_64-linux]
```

## Mailcatcherのインストール

Rubyの準備が整ったら gem コマンドで mailcatcher のインストールを行う。

```
$ gem install mailcatcher
```

エラーが吐かれたので不足しているライブラリを導入して再試行。成功した。

```
$ yum install -y gcc-c++ sqlite sqlite-devel
$ gem install mailcatcher
```

早速起動。IPアドレスはデフォルトだと127.0.0.1で都合が悪いので、0.0.0.0とする。

```
$ mailcatcher --ip=0.0.0.0
```

ホストからブラウザでアクセスできるようにポートを開放しておこう。

```
$ vim /etc/sysconfig/iptables
$ sudo /etc/init.d/iptables reload
```

## PHPからのメール送信をキャッチしてみる

PHPから使いたかったので、php.ini の sendmail_path を書き換える。送信テストは成功した。

```
sendmail_path = /usr/bin/env catchmail
```
無料でBITNAMIのwordpressをSSL化

# bitnamiで入れたwordpressをssl化したい

SEO的にSSL化は必須なのでしてくれと言われたのでやりました

お金がないのでletsencryptで証明書をもらってくる

## 証明書周り

#### サーバ内に入って、certbotを入れる
[domain name]は自分の環境のものを入れる
[mail adress]は自分のメアドいれました

```bash

sudo curl https://dl.eff.org/certbot-auto -o /usr/bin/certbot-auto
sudo  chmod 700 /usr/bin/certbot-auto
sudo certbot-auto certonly --webroot -w /var/www/html -d [domain name] --email [mail adress]
```

#### 証明書発行

```bash

cd /tmp && git clone https://github.com/letsencrypt/letsencrypt
cd letsencrypt
./letsencrypt-auto
```

#### 証明書をbitnamiのapache配下に移動

```bash

sudo cp /etc/letsencrypt/live/[domain name]/fullchain.pem /opt/bitnami/apache2/conf/server.crt
sudo cp /etc/letsencrypt/live/[domain name]/privkey.pem /opt/bitnami/apache2/conf/server.key
```

#### apache再起動

```bash

sudo /opt/bitnami/ctlscript.sh restart apache
```

これで、https://[domain name]に接続できるようになる

## SSLの適用
ふつうにアクセスするとhttpでアクセスしちゃうので、301でリダイレクトしたい
.htaccess書いたら、管理画面側が見れなくなったのでおとなしくプラグインを使う

**Really Simple SSL**
というプラグインを公式からダウンロード→有効化

私の場合は、wp-config.phpの権限がだめで書き込めない〜って言ってたから、chmodで777に変更（+wじゃだめだった）
そのあと、プラグインの詳細に行って「はい、SSLを有効化します」のボタンを押すと完了

![スクリーンショット 2018-10-17 21.02.09.png](https://qiita-image-store.s3.amazonaws.com/0/216967/0ce6b955-fa84-f7c1-6a2a-9294091e13c1.png)


ちゃんと証明書ついて、ちゃんとしたサイトぽくなりました
簡単
しかも、2,3日後にはGoogleもhttpsで認識してくれていた
PHP7で複数検索サイトの作り方

こんばんは！

複数検索サイトを作りました。

まずは画像です。

![OCT17-3.JPG](https://qiita-image-store.s3.amazonaws.com/0/200171/8d1e8a6e-a2a5-5cdb-0247-2a7e1151b682.jpeg)

名前と出身地を入れたら表示するような形式にしました。

単一検索サイトではforeachとifを使いました。

今回は、foreachを２回使います。

さて、コードを貼ります。

```
<!doctype html>
<head>
<title>
Sample
</title>
</head>
<body>

<form action="Sample01.php" method="POST">
	<p class="sample1">名前:<input type="text" name="handle" placeholder="名前入力"></p>
	<p class="sample2">出身地:<input type="text" name="live" placeholder="出身地"></p>
	<input type="submit" value="検索">
</form>

</body>
```
htmlではこのように記述しました。

では、サーバーサイド側です。

```PHP
<?php

$data1 = htmlspecialchars($_POST['handle'],ENT_QUOTES,"UTF-8");

$data2 = htmlspecialchars($_POST['live'],ENT_QUOTES,"UTF-8");


$arr1 = array(
			"山田太郎",
			"山田花子",
			"山田次郎",
			"山田三郎",
			"東郷平八郎",
			"新渡戸稲造"

);

$arr2 = array(
			"北海道",
			"青森県",
			"岩手県",
			"福島県",
			"山形県",
			"茨城県",
			"東京都",
			"千葉県",
			"神奈川県",
			"埼玉県"

);
	foreach($arr1 as $key => $val){
		foreach($arr2 as $key =>$val){
			if($data1 == $val || $data2 == $val){
				echo "名前は".$data1."です。"."<br>"."出身地は".$data2."です。"."<br>";
				break 2;
	 }
	}
}

?>
```

最後に break 2と入れていなかったら

複数階出てしまうことになります。

その点、注意をしてください。

また、配列に該当したものを入力したら

出力するというだけのものですので

前回の記事と同じくあまりいい作り方をしているわけではありません。

本来ならPDO(PHP PHP Data Object)を使って

mysql上のテーブルから複数の物を抜き出してくる

と言った形のものにするのが本来のやり方であり

さらにclassやfunctionと言ったものを

使えばさらにいいコードを書けることでしょう。

以上です。

いつも私のブログを見ていただきまして

誠にありがとうございます。
Macでpyenv,anaconda,を使ったpython開発環境2018秋

#はじめに
今回私の構築環境はMacBook Pro 2018です。
python開発環境について`pyenv`+`anaconda`
今回上記二つを扱う上で`仮想環境の起動($source activate 環境名）`ができなくなることがありました。
それについての`解決策`を書いていきます。
初心者向けに開発環境構築も書いてあります。

解決策は

#まずは覚えておくべき３セット
今回取り上げる`Homebrew`, `pyenv`, `anaconda`のとは何かを覚えておきましょう。
1. **Homebrew**：「Mac OS Xオペレーティングシステム上でソフトウェアの導入を単純化するパッケージ管理システムのひとつである」
2. **pyenv**：「様々なバージョンのPythonを管理するツール。導入することで，Python v2系とv3系など，複数のバージョンの切り替えが容易になる。」
3. **anaconda**：「Python本体に加え，科学計算やデータ分析などに使えるライブラリがセットで入っているパッケージ。」
`こちらの３つの概要については(https://qiita.com/aical/items/2d066801a7464a676994)より引用`

上記の概要がわかりにくい人は下記の概要で覚えましょう。

Macであらゆるソフトウェアの導入を簡単化する**Homebrew**
Macでpythonを扱うならこれだよね**pyenv**
データ解析、機械学習をやるならこれだよな**anaconda**
こう覚えておくと良いでしょう。

#それでは早速HomeBrewとpyenvのインストールしよう！！（＊anacondaは次のセクションでします）
以下のリンク先で`Homebrew`と`pyenv`のインストールをしましょう。
[Homebrewとpyenvのインストール](https://qiita.com/aical/items/2d066801a7464a676994)

#続いてanacondaのインストールをしましょう
以下のリンク先で`anaconda`をインストールしましょう。
[anacondaのインストール](https://qiita.com/kota_kuri/items/67f706814239f2940e33#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB)

#仮想環境の構築
**仮想環境とは**
Python を使って開発や実験を行うときは、用途に応じて専用の実行環境を作成し、切り替えて使用するのが一般的です。こういった、一時的に作成する実行環境を、「仮想環境」 と言います。

**例えば、仮想環境は次のような目的で使われます**

仮想環境には特定のバージョンのPython本体と、各種モジュールがインストールされます。あるプロジェクトで使用する仮想環境では Python 3.6 と Django 1.11をインストールし、別のプロジェクトの仮想環境には Python 2.7 と Django 1.10 を利用する、といった環境を簡単に構築でき、わけて扱えるようにできます。


`以下のリンク先で仮想環境の構築をしましょう。`
[仮想環境の構築](https://qiita.com/agumon/items/4d7826c2c39d0af868bd)

#pyenv上での仮想環境起動エラー
今回の肝はここです。私も**pyenv上**の**anaconda**で仮想環境を起動した際に、

```ruby:ターミナル
pyenv: activate: command not found
```

というエラーが出ました。
詳しいことは以下の記事参考
[仮想環境の構築エラー解決策](https://qiita.com/y__sama/items/f732bb7bec2bff355b69)
フルパスなら仮想環境の起動は行えるのです。なので

aliasコマンドでフルパスを省略させれば一件落着ということです。
`aliasコマンドとはコマンドを別名で登録することができるコマンドです
$ alias 登録名=登録するコマンド`

1.まずは仮想環境の起動のフルパスを省略

```ruby:ターミナル
echo 'alias フルパスの省略名="source $PYENV_ROOT/versions/anaconda3-2.5.0/bin/activate"' >> ~/.bash_profile
```

2.仮想環境を落とすフルパスの省略

```ruby:ターミナル
echo 'alias フルパスの省略名="source $PYENV_ROOT/versions/anaconda3-5.2.0/bin/deactivate"' >> ~/.bash_profile
$ source ~/.bash_profile
```

これで解決できました！！！:relaxed:

実行すると、

```ruby:ターミナル
$ activate 環境名
環境名 $ 
 ```

お疲れ様でした。


#最後に
引用ばかりですみません。一人でもこのエラーを解決できることを願っています。
Firebase Functionsを使って簡単にサーバー処理のAndroidアプリを作る ①環境構築編

#はじめに
この記事は3編構成になっていて、
[①環境構築編](https://qiita.com/Om0m/items/916a1252d2f34a6222e2)
[②Functions編](https://qiita.com/Om0m/items/afcb1a24d1667da60aa4)
[③アプリ編](https://qiita.com/Om0m/items/b3eec25d71941cd0d623)
になっています。

FirebaseのFunctionsとRealtime Databaseを使ってオンラインでじゃんけんができるAndroidアプリを作ります。
オンラインというのは、部屋を作成して遠くの友達が部屋に入って...的な感じです。
じゃんけん程度ならFirebase Functionsを使う必要はないのですが、サーバー側で処理をしてみたかったのもあって無理矢理使っています。

#前提条件 
- Firebaseのアカウント作成,プロジェクト作成
- Nodejsのインストール(v8.11.4で動作確認)
    - npmのインストール
- Android Studioのインストール 

[Android プロジェクトに Firebase を追加する](https://firebase.google.com/docs/android/setup?authuser=0)

##開発環境　（コピペ）
Android Studio 3.1.4
Build #AI-173.4907809, built on July 24, 2018
JRE: 1.8.0_152-release-1024-b01 x86_64
JVM: OpenJDK 64-Bit Server VM by JetBrains s.r.o
Mac OS X 10.13.4


#アプリ画面
オンラインで部屋を作成して入ってもらってじゃんけんをするアプリができます。
言語はKotlinです。
サンプル感丸出しでごめんなさい
<img src="https://qiita-image-store.s3.amazonaws.com/0/256383/26470b72-8025-f043-8c26-605535e9abb5.png" width=30%>

<img src="https://qiita-image-store.s3.amazonaws.com/0/256383/487cf522-4953-6736-001f-a5db38fa1392.png" width=30%>

#Firebaseに登録

##Realtime Databaseの作成
Firebaseのプロジェクト画面から下の画像にあるようにサイドバーから「Database」を押します。
<img src="https://qiita-image-store.s3.amazonaws.com/0/256383/75750962-1042-b4b2-a74c-0e4be9207385.png" width=30%>
その後Cloud Firestoreの作成がデカデカとでますが、押したい気持ちを抑えて下にスクロールすれば見つかると思います。「データベースを作成」を押します。
<img src="https://qiita-image-store.s3.amazonaws.com/0/256383/39ab0f1e-bc2e-196b-b681-7d0e8eec9829.png" width=90%>
その後は、テストモードにします。
これで、リアルタイムデータベースの作成は完了です。

##Cloud Functionsの設定
次のFunctions編で行います。
[②Functions編](https://qiita.com/Om0m/items/afcb1a24d1667da60aa4)
Zabbix4.0新機能のHTTPエージェント監視を使ってDocker Engine API情報を簡単に監視する

Zabbix4.0の新機能の1つとして、HTTPエージェント監視の機能が実装されました。
これは、監視アイテムのタイプの1つとして実装され、Zabbix Serverから指定したURLに対してHTTPリクエストを送付して値を取得するといった機能です。

これまでのZabbixの場合だと、別途HTTPのリクエスト処理を行うスクリプトを作成して外部チェックアイテムで監視したり、Zabbix AgentのUserParameterを用いてZabbix Agentからスクリプトを実行して監視したりといった対応が必要でした。

しかし、4.0からはZabbix Serverが直接HTTPリクエストを呼び出して監視する機能が搭載されています。
さらに、この機能とZabbix3.4以降で実装されている保存前処理のJSONパース、XMLパース機能を組み合わせて活用すると、WebAPIを呼び出して、その応答結果のJSONを取得し、JSONに含まれているとある情報を監視するといったことがZabbixの標準機能だけで完結して実施できます。

# 試したこと

試しに、Docker Engine APIを呼び出し、特定のコンテナの情報をHTTPエージェント機能を使って取得し、その中からどのImageで稼動しているコンテナなのかの情報を監視結果として取得できるようにします。

# HTTPエージェント監視アイテムの登録

タイプをHTTPエージェントと設定し、URLにDocker Engine APIのURLを指定します。

![qiita_zabbix_docker.png](https://qiita-image-store.s3.amazonaws.com/0/45851/3c915a36-e539-586a-7975-3348e0eefd42.png)

Docker Engine APIの情報は[公式ドキュメント](https://docs.docker.com/engine/api/v1.24/)を参照してください。

データ型はテキストに指定して、収集されるJSONをそのまま監視結果として保存できるようにしておきます。

# 依存アイテムの登録

先程のHTTPエージェント監視アイテムで取得されてきたJSONデータを元にその中に含まれるコンテナイメージ名情報を取り出すアイテムです。
このアイテム自体が個別にHTTPリクエストを呼び出して値を取りにいくわけではないのでAPI側に負荷をかけずに収集できるのも良いですね。

設定はこんな感じで行います。タイプを依存アイテムに設定し、マスターアイテムとして先程のHTTPエージェントアイテムを選択します。

![qiita_zabbix_docker2.png](https://qiita-image-store.s3.amazonaws.com/0/45851/ee88925e-671a-d75b-8206-d23506e954bd.png)

あとは、保存前処理設定を以下のように行い、JSONの取得する箇所を指定します。
![qiita_zabbix_docker3.png](https://qiita-image-store.s3.amazonaws.com/0/45851/2af888ed-91f3-705c-c856-ee4d3c891fdf.png)

これで監視が簡単にできます。

![qiita_zabbix_docker4.png](https://qiita-image-store.s3.amazonaws.com/0/45851/3ed69345-59a2-c972-8339-85808bc4b28d.png)

便利ですね。
TypeScriptで、相対URLからURLクラスのインスタンスを使う

たとえば、サーバーから相対URLを受け取ったとする。
そのとき、こんな感じで

```ts
class Sample {
    url: URL;
    constructor(url: string) {
        this.url = new URL(url);
    }
}
```

と書いても、エラーになる。

## 解決

自身の`baseURL`を渡したうえで、`URL`クラスのインスタンスを作る。

```ts
class Sample {
    url: URL;
    constructor(url: string) {
        this.url = new URL(url, document.baseURI);
    }
}
```

## 参考
https://url.spec.whatwg.org/#api

## バージョン
Typescript 3.1.1
Windows Server 2016コンテナにプリンタドライバーをインストールする方法

# 概要

[Windows Server 2016 コンテナ](https://hub.docker.com/r/microsoft/windowsservercore/) にプリンタドライバーをインストールする方法です。
Windows Server Core の docker イメージをベースにコンテナを作成しますが、Server Coreは通常の Windows Server 2016 よりも機能が絞られているためプリンタドライバーのインストールでエラーが多発しました。また、コマンドラインベースのためエラーの詳細が不明でエラーの原因の特定にも非常に苦労しました。ようやくプリンタドライバーのインストールまで実現できましたので手順を記載しておきます。

# 1. はじめに

今回はプリンタドライバーとして [FUJI XEROX DocuPrint 4050 ART EXドライバー](https://www.fujixerox.co.jp/download/docuprint/4050/win7_64/artex_w) を使用します。

このプリンタドライバーは、Microsoft Windows ロゴテストに合格しているため問題なくインストールができます。
合格していないプリンタドライバーを利用する場合はインストールに失敗する可能性があるので注意が必要です。

# 2. Dockerfileの作成

Dockerfileではプリンタドライバーのインストールに必要な以下の機能のインストールとサービスの開始を行います。

* Print-Server
* Spooler
* DeviceInstall

ダウンロードしたプリンタドライバーは展開しておき、Dockerfileと同じディレクトリへ配置します。

```Dockerfile:Dockerfile
FROM microsoft/windowsservercore:ltsc2016

RUN mkdir C:\printer-driver

ADD fxdp4050plw171210wxp6fja/cswnd /printer-driver

RUN PowerShell Install-WindowsFeature Print-Server
RUN PowerShell Set-Service Spooler -StartupType Automatic
RUN PowerShell Start-Service Spooler

RUN PowerShell Set-Service DeviceInstall -StartupType Automatic
RUN PowerShell Start-Service DeviceInstall

ADD Install.ps1 /

CMD PowerShell -File C:\Install.ps1
```

# 3. PowerShellスクリプトの作成

DockerfileのRUNからは何故かプリンタドライバーのインストールに失敗するため、CMDからインストールを行います。
インストールに必要なコマンドはPowerShellスクリプトとして用意しておきます。

```PowerShell:Install.ps1
$printername = "FX DocuPrint 4050"
$printerport = "LPT1:"

pnputil /add-driver "C:\printer-driver\ART_EX\amd64\001\fxlclji.inf" /install
Add-PrinterDriver -Name "$printername"
Add-Printer -Name "$printername" -DriverName "$printername" -PortName "$printerport"
```

作成したPowerShellスクリプトはDockerfileと同じディレクトリへ配置します。

# 4. dockerコンテナのビルドと実行

Dockerfileがあるディレクトリへ移動し、以下のコマンドでdockerコンテナのビルドと実行を行います。
正常に実行されている場合、Windows Server 2016 コンテナにプリンタドライバー「FX DocuPrint 4050」がインストールされます。

```:コマンドプロンプト
docker build -t printer-test -m 4G --isolation hyperv .
docker run --rm --memory 4G --isolation hyperv -it printer-test
```
pyaudio及びボイチェン用参考(になりそうな)リンク集　[WIP]


大きく分けると
  * pyaudio
  * sptk
の二つがよく使われているみたい。

# pyaudio

[Pythonで音響信号処理](https://qiita.com/wrist/items/5759f894303e4364ebfd)


# sptk

[pythonでボイスチェンジャー](http://d.hatena.ne.jp/seinzumtode/20161202/1480642318)
シェルスクリプトにおける%と%%(#と##)の違い

シェルスクリプトで変数展開するときに、時々見る％(#)記号...
qiitaで探しづらかったのでメモ

%と%%はどちらもsuffic除去、#と##はどちらもprefix除去ですが
記号が一つだとshortest match、記号が二つだと longest matchが適用されるらしい。


```sh
$ var="abcdefdefghi"
$ echo $var
abcdefdefghi
$ echo ${var#*def}
defghi
$ echo ${var##*def}
ghi
$ echo ${var%def*}
abcdef
$ echo ${var%%def*}
abc
```

## 補足(蛇足？)
\#\#や%%のようなものはググラビリティが低いので、全然検索に引っかからない...
qiitaではタグに記載されていると検索可能らしいので、実験もかねて##と%%をタグに含めました。
ElasticBeanstalkのワーカー環境で定期バッチ処理を動かしてみた

## はじめに
適当になりがちだけど、扱いに悩むことも多い定期バッチ処理。
ちょっとしたタスクならWebサーバ内のcronで呼び出しちゃったりするけど、コンテナ＋複数インスタンスの環境で、ちょっとスマートな感じにしたい。
定番はSQS+Lambdaかと思いますが、既にWebアプリ上に機能があったりする場合、**ElastiBeanstalk**（以下EB）の**ワーカー環境**が便利です！

![image.png](https://qiita-image-store.s3.amazonaws.com/0/135266/b5bf4bde-f7e4-0c8a-1672-8fc64543f667.png)

こんな仕組みらしい。
ややこしいキューの管理はEBにお任せできちゃいます。

公式ドキュメント：[AWS Elastic Beanstalk ワーカー環境](https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/using-features-managing-env-tiers.html)

EB環境の作り方等はドキュメントをご参考ください。
[AWS Elastic Beanstalk 環境を作成する](https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/using-features.environments.html)


## APIを用意する
ワーカー環境内のSqsdから**HTTP POST**で呼び出されます。
なので、通常のWeb APIとして処理を実装すればOK。
かんたんですね！

とはいえ、同じアプリケーションをWebに公開している場合は外部からアクセスされたくないので、**IP制限**的なものはかけておきましょう。
こんな感じで、ネットワーク外からのアクセスをブロック。

```Ruby
if (request.remote_ip =~ /(^10\.|^172\.(1[6-9]|2[0-9]|3[0-1])\.|^192\.168\.)/).nil?
  redirect_to root_path
end
```

## cron.yamlを用意する
タスクの名前と↑で用意したAPIのURL、実行スケジュールを定義した*cron.yaml*を作ります。
scheduleはcronの形式そのまんま。

```yml:cron.yaml
version: 1
cron:
 - name: "batch_task_1"
   url: "/batch/task_1"
   schedule: "* *1 * * *"
 - name: "batchtask_2"
   url: "/batch/task_2"
   schedule: "* */12 * * *"
```

cron.yamlに記述したschedule通りにEBがSQSのキューにメッセージを追加し、それを受け取ったEBのSqsdが**HTTP POST**でURLを呼び出されます。
という仕組みのようです。

あとは、ソースバンドルに含めてzip形式にしてアップすれば

## おまけ（ハマりポイントその１）<br>cron.yamlはECRのイメージ内に置いてもダメ

今回の環境はMulti ContainerなEB環境で、**Dockerrun.aws.json**のみをアップロードし、ECRからイメージを持ってきてデプロイしています。
試しにcron.yamlをプロジェクトルートに置いてECRにプッシュしてみたのですが、これではスケジュールは登録されず。
*Dockerrun.aws.json*と一緒にzip化したものをアップしてデプロイ時のソースバンドルとして指定したところ、無事登録できました。
問題なく登録できた場合は、EBダッシュボードのイベント内に

`Successfully loaded 2 scheduled tasks from cron.yaml.`

のように表示されるはずなので、これを確認しましょう。

## おまけ（ハマりポイントその２）<br>Lhaplusで圧縮したらうまく読み込まれない
これは本当に原因が謎。
ワーカー環境云々というより、EBの仕様かな？
ドキュメントに書いてある通り、`送る→圧縮(zip形式)フォルダー`（Window環境）としたら問題なくアップできました。

## おまけ（ハマりポイントその３）<br>なぜか5分に1度呼び出される
APIが
**204 No Content**
を返しているのが原因で、デッドレターキューにメッセージがいってた。。
API処理の最後に以下を追加して解決。（Rails）

```Ruby
    render body: nil
```
SWI-Prolog で JSON ファイルの要素を削除

```text:json_delete.pl
/* ------------------------------------------------------------------- */
/*
	json_delete.pl

						Oct/18/2018
*/
/* ------------------------------------------------------------------- */
:- use_module([ library(http/json) ]).
:- initialization main.
 
/* ------------------------------------------------------------------- */
% [8]:
data_out_proc(File_out,Dict) :-
	dict_keys(Dict,Keys),
	length(Keys,Ll),
	writeln(current_output , Ll),
	tell(File_out),
	json_write_dict(current_output, Dict),
	told.
/* ------------------------------------------------------------------- */
% [6]:
delete_proc(Dict,Key_in,Dict_bb) :-
	dict_keys(Dict,Keys),
	length(Keys,Ll),
	writeln(current_output , Ll),
	get_dict(Key_in, Dict, Value_aa),
	writeln(current_output , Value_aa),
	del_dict(Key_in,Dict,_,Dict_bb).
%
%
/* ------------------------------------------------------------------- */
% [4]:
reading_JSON_term(File_in,Dict) :-
	write(File_in),nl,
	open(File_in, read, Stream, [] ),
	json_read_dict(Stream, Dict, []),
	close(Stream).
%
/* ------------------------------------------------------------------- */
main(Argv) :-
	format('*** 開始 ***\n'),
	format('Argv: ~w\n', [Argv]),
	[File_in|Yy] = Argv,
	[Key_in|_] = Yy,
	write(Key_in),nl,
%
	reading_JSON_term(File_in,Dict),
%
	delete_proc(Dict,Key_in,Dict_bb),
%
	data_out_proc(File_in,Dict_bb),
%
	format('*** 終了 ***\n'),
	halt.
%
/* ------------------------------------------------------------------- */
```

実行方法

```bash
swipl -f ./json_delete.pl /var/tmp/json/cities.json t0928
```
JavaScript:簡単に無名再帰っぽくする

階乗です。普通に書けばこういうものです。

```js:
const fact = x => 
  x===0 ?  1
  : x * fact( x - 1 )
```
無名再帰っぽくしてみます。
[Python : lambdaの中でも再帰できた](https://qiita.com/ttatsf/items/46eba555fce3d45156f2)
これにのっとってJavaScriptでも階乗を書いてみました。

```js:
const fact = x =>
  ( f => f( f )( x ) )( f => x => x == 0 ? 1 : x * f( f )( x - 1 ));
//またはデフォルト引数を使って
const fact = 
  (x, f = f => x => x == 0 ? 1 : x * f(f)(x - 1)) => f(f)(x)
;
//使用例:
fact(5)
//=> 120
```
使えてはいます。でもちょっと何いってんのかわかりにくい。

#こんな風にしとけばわかりやすい?
再帰させる仕組みと、再帰する元になる条件分岐の式と、機能でわけます。あとで合成。


```js:
const recurse = f =>  f(f)  //再帰させる仕組み
const factSeed = f => x => x===0 ? 1 : x * f(f)(x-1)  //再帰する元になる関数
const fact = recurse(factSeed);  
fact(5);  //120
```
使い回せそう。
早速使ってみました。[JavaScript:カリー化してくれる関数#追記
](https://qiita.com/ttatsf/items/cf21381a386c89247200#追記20181017)ちょっと複雑ですが、ちゃんと使い回せているようです。

でも普通ので十分かな。
AWS CLIを使って、MFAのついたアカウントでAssumeRoleする

# 概要
MFAが有効になったIAMユーザーにRoleをアタッチするときにちゃんとドキュメント読んでなくてハマったのでメモしとく

# やり方
AssumeRoleに使うロールと、自分のプロファイルは`~/.aws/config`と`~/.aws/credentials`に入れておく

```~/.aws/config
[profile user] # 自身のユーザー
region=リージョン
output=json

[profile assumerole] # 対象のロール
role_arn=arn:aws:iam::xxxxxx:role/role-name
mfa_serial=arn:aws:iam::xxxxxx:mfa/username
source_profile=user
region=リージョン
```

```~/.aws/credentials
[user]
aws_access_key_id=XXXXXXXXXXXXXXXX
aws_secret_access_key=XXXXXXXXXXXXXXXXXXXXXXXXXXXXX
```

で、叩きたいAPIを叩くとMFAのトークンを入れるように聞かれる。

```
$ aws 使いたいコマンド --profile assumerole
Enter MFA code for arn:aws:iam::xxxxxx:mfa/username:
```

入れると結果が返ってくるようになる
phpの並び替えで空の値を最後に持ってきたいときの書き方

どうしてもPHP側でデータの並び替えをしないといけなかったので、usortを使ってみた。

##やりたいこと
メールアドレスを昇順かつ空のときには末尾に持ってくる。

##やってみた
usortで下記のソースを書くと、期待通りに並べ替えられた。

```
$data = array(
    '1'  => '',
    '2'  => 'sample@example.com', 
    '3'  => 'hoge@example.com',
);

usort($data, function ($left, $right) {
    $leftHoge  = mb_strtolower($left['mail']); // 小文字に統一
    $rightHoge = mb_strtolower($right['mail']);
    if (empty($leftHoge)) {
        return 1;
    }
    if (empty($rightHoge)) {
        return -1;
    }
    if ($leftHoge < $rightHoge) {
        return -1;
    } else if ($leftHoge > $rightHoge) {
        return 1;
    }
});

var_dump($data);

// $data = array(
    '1'  => 'hoge@example.com',
    '2'  => 'sample@example.com', 
    '3'  => '',
);

```
QiitaからQrunchに記事を転記できるツール　QtoQ.cf を作りました【個人開発】

**「もっと気軽にアウトプットできる」**を コンセプトにした 技術ブログサービス**「Qrunch（クランチ）」**にQiitaの記事を持って行けるツールを作りました！

![スクリーンショット](https://qiita-image-store.s3.amazonaws.com/0/180411/73cfb736-caca-ad9d-b067-56c79989fd9e.png)

TOP ページはまあ適当に作りました。Mac Chromeでしか確認していないのであしからず
# 作ったツール
- [QtoQ.cf](https://qtoq.cf/)
- [QtoQ専用のChrome拡張機能](https://chrome.google.com/webstore/detail/qtoq/onomhgkkilnbljdbplffoogfhfncndha)

*拡張機能をインストールしないと動作しません

# できること
- Qiitaの記事を一覧化できる
  - 記事数が多い人はメモリ不足で落ちる可能性が高い（数千件とか）
- 記事一覧から転記したい記事を選択すると拡張機能がなんとか転記してくれます
  - ひょっとしたら転記できないケースがあるかも
  - 文字列ベースの記事でしか試していない
  - 画像が含まれてたら失敗するかも・・・
  - qiitaの添付ファイルは直リンのままなのでお行儀が悪い

# 使い方

- [QtoQ専用のChrome拡張機能](https://chrome.google.com/webstore/detail/qtoq/onomhgkkilnbljdbplffoogfhfncndha) をインストールします
- [QtoQ.cf](https://qtoq.cf/)にアクセスして Qiitaでログインを押します
- 持っていくをクリックします
- 投稿するか確認されるのでOKを押します

# 免責

- Qiitaに許可は取ってないので利用は自己責任でお願いします
- Qrunchにも許可は取ってないので同上です。
- 格安低スペサーバに乗っているのでサーバが落ちたらすみません。
- 拡張機能が審査に入ったり公開停止になったらごめんなさい
- 仕組み上、無理矢理CSRFを突破するので気をつけてください（一応投稿確認を入れるようにして対策）

# フィードバック

時間があるときに対応しますのでコメント欄に書いておいてください
**対応を保証するものではありません**
レジストリ？設定ファイル？選ぶことすらめんどくせえ  (構想編)


# 要約

アプリケーション開発時にレジストリや環境変数、設定ファイルといった外部設定値を楽に扱いたい。
単に設定を外に出したいだけなのに、わざわざ技術ごとに違う実装なんて書きたくない。
そんな.NET Framework ライブラリを作ろうとしています。

# 想定読者

* アプリケーションを1から設計する人
* 動けばいいではなく、長期的な保守コストを考えたい人
* Windows、C#で開発する人 (には限らない話ですが、サンプルコードはこの辺です)

# 課題

Windowsで動くようなアプリケーションを開発する際、タイムアウト時間といったスペック依存なパラメータや、待ち受けするポートNoといったPC全体の資源を使うパラメータは、後から変更できるよう実装すると思います。
その際使われる主なものを挙げると次があります。
* 設定ファイル
* 環境変数
* コマンドライン引数
* レジストリ (Windowsなら)
* アプリケーション構成ファイル(*.exe.config)

どれも守備範囲が違いますので、自由に選べばよいと思いますが、アプリケーションからするとどれであろうと同じで、アプリケーションの外から値を変更できる「外部設定値」ですよね？

それに対して、実装はそれぞれ違っていて、例えばコマンドライン引数なんかはパーサーを自分で書かないといけなかったり、レジストリはnullチェックが必要だったりと、気軽にパッと使えるものではありません。

また、特にポリシーなく思いつくまま外部設定値の読み込みを実装するとコード上にバラバラに実装されることになり、外部設置値として何が変更可能かわからなくなります。
それに、レジストリのキーや設定ファイルの使い方が微妙に違ったりとか一貫性が保てません。


以上より、アプリケーション開発における外部設定値について、次の課題があると思います。
1. アプリケーション側から見ると同じなのに実装方法がまちまち
2. ポリシーなく実装するだけでは一覧性や一貫性が無い

# 解決策

上記の課題を解決できるOSSライブラリがあれば、と思い探していますが、良いものは見つかりません。
需要がないのか、単に探し方が悪いのか・・・

C#の例ですが、次のコードみたいな感じで、優先順位付きで簡単に外部設定を取得することができたらな、と思っています。

```C#
// C#

[ApplicationRegistry(
    BuiltInAccessors.CommandlineArguments,
    BuiltInAccessors.EnvironmenetVariable,
    BuiltInAccessors.UserRegistry,
    BuiltInAccessors.MachineRegistry)]
)]
public interface ISettings
{
    /// <Summary>
    /// 待ち受けするポートNo
    /// </Summary>
    int PortNo { get; }

    /// <Summary>
    /// バックアップの保存先
    /// </Summary>
    string BackupFolder { get; }
}


    static void Main()
    {
        int portNo = ApplicationRegistry.Get<ISettings>().PortNo;

    }

```

この例だと、コマンドライン引数→環境変数→レジストリ(HKCU)→レジストリ(HKLM)の順に以下の場所を探します。
無ければ、下へ下へと探索していくという感じです。

* コマンドライン引数: --ISettings-PortNo=(数値) の値
* 環境変数: MYAPP_ISETTINGS_PORTNO の値
* レジストリ: HKCU\Software\MyApp\ISettings の PortNo
* レジストリ: HKLM\Software\MyApp\ISettings の PortNo


また、適当なコマンドで外部設定の仕様をレポート化してくれれば、一覧性の問題も解決できます。

```
Format-ApplicationRegistry.exe --input MyApp.exe --output "ExternalSettings.html"
```

レポートの例 その1
プロパティ毎に変更可能な外部設定一覧

|![外部設定レポートの例1.jpg](https://qiita-image-store.s3.amazonaws.com/0/217768/a3a1ef2c-b480-a153-e121-732d46596956.jpeg)|
|:-:|

レポートの例 その2
レジストリやコマンドライン引数等、外部設定の場所ごとの設定値一覧

|![外部設定レポートの例2.jpg](https://qiita-image-store.s3.amazonaws.com/0/217768/19441fc0-46f3-226b-290e-4739f4d92c68.jpeg)|
|:-:|


# 開発中

ということで、自分で作っています。
需要があるかどうかわかりませんが、自分の仕事で使う可能性が高いので。
ちゃんと完成させるか、どこまで汎用性を持たせるかは、やる気次第ですね。

https://github.com/banban525/ApplicationRegistries

ちなみに、同じ目的で4年位前に一度作っていて、Nugetパッケージも公開していたのですが、
XMLベースということでいまいち煩雑で使いづらく、作り直しています。
そのため今回はバージョン2です。

それなりに完成したら、Qiitaに別の記事を投稿するつもりです。
キーワードベースのログ監視からの脱却を目指して、ログクラスタリングによるパターン毎の出力頻度ヒートマップ化を試してみる

ログの監視といえば、特定のキーワード(例えばErrorという文字列とか、Warningという文字列とか)をベースに監視ツールで検知させるといったことを実施するのが一般的かと思います。
ただ、この対処をするには、どういったログが出力されるのかを予め知っておく必要があり、その条件を決めるのもなかなか大変なのではないでしょうか。

そのようなケースに対し、もう少し分析技術の要素を取り入れて異常な状態に気づけるようにするアプローチを考えてみます。

# 試したこと

今回試したのは、ログを[gensim](https://radimrehurek.com/gensim/index.html)の[doc2vec](https://radimrehurek.com/gensim/models/doc2vec.html)でベクトル化し、k-meansでクラスタリング。
さらにそれを時間毎に区分けして各ログパターンの発生件数をヒートマップ化してみます。

# サンプルプログラム

Python3で、gensim、matplotlib、sklearnのKMeansを利用しています。

```python
#!/bin/env python

from gensim.models.doc2vec import Doc2Vec
from gensim.models.doc2vec import TaggedDocument
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
import pandas as pd

log_name = 'sample.log'
f = open('./{}'.format(log_name), 'r', encoding='utf-8')

training_data = []
for i,line in enumerate(f):
    training_data.append(TaggedDocument(words = line.split(), tags = [i])) # tagはincrementの番号を付与
f.close

m = Doc2Vec(documents= training_data, dm=1, vector_size=300, epochs=10, window=5, min_count=1, workers=4)

vectors_list=[m.docvecs[n] for n in range(len(m.docvecs))] # 各ログのベクトル値をlist化

kmeans_model = KMeans(n_clusters=20, verbose=1, random_state=1) # 20クラスタにK-Meansで分類
kmeans_model.fit(vectors_list)

result = pd.DataFrame()

result['data'] = training_data
result['cluster_id'] = kmeans_model.labels_

count_data = result['cluster_id'].value_counts()

n = 100 # データ分割の数指定
plot_data = []
for i in range(0, len(result), n):
    cluster_count_list = [0] * kmeans_model.n_clusters
    tmp = result[i:i + n]
    tmp_v = tmp['cluster_id'].value_counts()
    for index in tmp_v.index:
        cluster_count_list[index] = tmp_v[index]
    plot_data.append(cluster_count_list)

t_data = pd.DataFrame(plot_data).T

# plot heatmap
fig, ax = plt.subplots()
heatmap = ax.pcolor(t_data, cmap=plt.cm.Greens)
plt.xlabel('time')
plt.ylabel('cluster_id')
plt.colorbar(heatmap, ax=ax)
plt.savefig('{}.png'.format(log_name))
plt.show()

# save models
import pickle
f = open('{}_doc2vec.model'.format(log_name),'wb')
pickle.dump(m, f)
f.close

f = open('{}_kmeans.model'.format(log_name), 'wb')
pickle.dump(kmeans_model, f)
f.close
```

このプログラムでsample.logの内容を行ごとに取り込み、空白区切りでスプリットして単語化し、doc2vecにかけて300次元のベクトルに変換。
その内容をベースに20のクラスタに分類し、各クラスタ毎の出力件数をログの100件毎にカウント。
これをx軸を時間とy軸をパターン種別に設定し、ヒートマップ化してみます。

結果はこんな感じ。ヒートマップを見ると、今回分析にかけたログのおおよそ半分ぐらいの位置から出力傾向が変わってきているのがなんとなく見えてきます。今回は見える化するところまでですが、各パターン毎の時系列でのカウント数推移をさらに分析すると傾向の変化ポイントとかも見えてきそうです。

![samplelog_heatmap.png](https://qiita-image-store.s3.amazonaws.com/0/45851/83b97c78-81c3-585b-50e7-e0eba061333e.png)

# まとめ

今回紹介した内容はあくまでサンプルで、実際に使うにはログの内容から不要なものを取り除いたりと前処理をいろいろ実施しないといけないとは思いますが、教師なしの状態でも傾向や変化が見えてきそうな予感です。
どういった分析手法がベストかはわかってないので試行錯誤中ですが。。

TISではこのようにITシステムの運用現場にデータ分析の技術を取り入れ、運用作業効率化につなげていくための活動を実施中です。同じような点に取り組んでいるとか、こういった取り組みに興味があるといった方はぜひお声がけください。
jsdoでtensorflow.js その3

#概要
jsdoでtensorflow.jsやってみた。
keras風、高級APIを使わないで、coreとか言われるレベルでやってみた。
sin問題、やってみた。
バイアスとウェイトを取り出してみた。

#写真

![image](https://qiita-image-store.s3.amazonaws.com/0/18104/bc4a9674-9dff-c996-a7a2-f7ce2d767f1f.png)

#バイアスとウェイト

```
Tensor
    [1.1656082, -2.0180476, -6.9387307, 3.3653135, -1.7032033, -2.8969588, 0.0565524, -9.5316219, -5.7146306, -2.8060255, -0.3085915, -6.3642092]
Tensor
     [[0.6203325, -1.027319, 1.8841791, -3.2817535, 1.2214272, 0.9679314, 1.4196726, 7.171823, 1.3714954, 3.7268815, 0.0598045, 1.1944624],]
Tensor
    [-0.2928229]
Tensor
    [[-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 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 buffer = tf.buffer([20, 1]);
const buffer2 = tf.buffer([20, 1]);
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);
    buffer.set(x, i, 0);
    buffer2.set(y, i, 0);
}
draw(ty, 0);
const train_x = buffer.toTensor();
const train_y = buffer2.toTensor();
const w1 = tf.variable(tf.randomNormal([1, 12]));
const b1 = tf.variable(tf.zeros([12]));
const w2 = tf.variable(tf.randomNormal([12, 1]));
const b2 = tf.variable(tf.zeros([1]));
const optimizer = tf.train.adam(0.1);
function loss(pred, ypred) {
  	return pred.sub(ypred).square().mean();
}
function func(x) {
    const h = tf.tanh(x.matMul(w1).add(b1));
    return tf.tanh(h.matMul(w2).add(b2));
}
for (let i = 0; i < 9000; i++) 
{
    optimizer.minimize(() => loss(func(train_x), train_y));
}
const preds = func(train_x).dataSync();
draw(preds, 1);
var out1 = document.getElementById('src');
out1.value += b1 + '\n';
out1.value += w1 + '\n';
out1.value += b2 + '\n';
out1.value += w2 + '\n';



```

#成果物

http://jsdo.it/ohisama1/e3Nm/

以上。
DataSet・DataTableの備忘録

# DataSet・DataTableの関係図
DataSet・DataTableの関係がよく分からなくなるので図にしてみた。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/15241/0fa07a8b-4b29-bcf5-685b-c6681eb70a03.png)
UIActivityViewControllerでSafariを開くがデフォルトでない件

# UIActivityViewControllerとは

<img width="375" alt="IMG_3689.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/97817/64b135db-a07b-5687-9f24-4a9ac9de48f7.jpeg">

アプリでよくあるこういうやつ
詳しい使い方は
[[Swift]UIActivityの使い方まとめ](https://qiita.com/nashirox/items/56894599013d712faa0a)
を見ていただければわかると思います。


ただこの機能、デフォルトで「Safariで開く」がなくすごく不便だった・・
ほとんどのキュレーションアプリでみるからデフォルトかと思ってたらみんな自分で実装してたのか。。

# 実装自体はすごく簡単

まず`UIActivity`を継承したActivityを作成

```CustomActivity.swift
import UIKit

public class CustomActivity: UIActivity {
        
    // タイトル
    override public var activityTitle: String? {
        return "title"
    }
    
　　// 画像
    override public var activityImage: UIImage? {
       return UIImage(name: "imageName")
    }
    
    /*
    // 動作させるかどうか
    // ex.URLを開けるならtrue、開けないならfalse
    */
    override public func canPerform(withActivityItems activityItems: [Any]) -> Bool {
        return true
    }
    
    // 動く直前にしたい動作
    override public func prepare(withActivityItems activityItems: [Any]) {
    }
    
    // 選択されたときにしたい処理
    override public func perform() {
        self.activityDidFinish(true)
    }
    
}
```
それをぶちこんで遷移するだけ

```.swift
   let activity = UIActivityViewController(activityItems: [""], applicationActivities: [CustomActivity()])
   present(activity, animated: true, completion: nil)
```

# ライブラリにしてみた

ただSafariで開くはめちゃめちゃ需要高そうだし苦しむ人がいるのでは。。と思いライブラリを作成してみました。

[KSSafariActivity](https://github.com/kohei1218/KSSafariActivity)

```.swift
   let activity = UIActivityViewController(activityItems: [""], applicationActivities: [KSSafariActivity(title: "open safari", url: URL(string: "https://hogehoge")!)])
   present(activity, animated: true, completion: nil)
```

だけで

<img width="380" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/97817/9061eb8a-d1bf-9b72-8d75-f2b621b7b3ee.png">


ActivityViewControllerにSafariで開くをい追加できます！ぜひ使ってください〜〜ヽ(・∀・)ﾉ
awk コマンド

## awkコマンド

### 意味
```
空白などで区切られたテキストを処理するコマンドです。演算機能もあり、プログラミング言語
```
## オプション

```
-f ファイル名	awkスクリプトが書かれたファイルを指定する
-F 区切り文字	区切り文字を指定する（デフォルトは空白文字）
-v 変数名=値	変数を定義する

```

### 基本的な使い方
```
　「awk 'パターン {アクション}' ファイル名」で、テキストファイルを1行ずつ読み、パターンに合致した行に対して、アクションで指定された内容を実行
```


http://www.atmarkit.co.jp/ait/articles/1706/02/news017.html
PowerPointのノート部分だけを台本として切り出す方法

PowerPointでプレゼンテーションを作っていたのですが、何度も繰り返しプレゼンするし、自分よりもプロのナレーターに頼んだ方がいいなと思い、ノートに台本を書きました。
ナレーターに依頼する時に、PowerPointで作成したものをそのまま渡すわけにもいきませんので、音声を読み上げてもらう原稿としてWordに書きだそうと思いました。
でも、ノート領域からいちいちWordに書きだすのは面倒でやりたくないので、まさかVBAまで組んでやることでもないと思って、PowerPointの標準機能で書き出す方法を探したらありましたので紹介します。
# 発行
その機能は発行という名前でした。
リボンには標準でないようです。
なので、クイックアクセスバーに「発行」と入力します。
<img src="https://qiita-image-store.s3.amazonaws.com/0/247287/33c989c9-55a7-a160-ec49-cadde4c473d9.png" width=50%>
すると、発行できるので、その中から、Microsoft Wordで配布資料を作成を選びます。
<img src="https://qiita-image-store.s3.amazonaws.com/0/247287/a3870a2d-5fda-6e14-d121-769648eb2358.png" width=50%>
単純にWordに変換するならスライド下のノートがおすすめです。OKします。
<img src="https://qiita-image-store.s3.amazonaws.com/0/247287/f01f9bb8-22af-4d10-1921-9b00e31547ab.png" width="25%" >
Wordが起動し、ちょっと時間がかかりますが、書きだしてくれます。
# Wordで台本化
<img src="https://qiita-image-store.s3.amazonaws.com/0/247287/79ded7fb-4b53-df55-0c3b-fe18a517337c.png" width=50%>
この状態では、スライドの画像が入っていて、不要なので、Ctrl+Aで全部選択してコピーし、新しい用紙にテキストのみ貼り付けます。
<img src="https://qiita-image-store.s3.amazonaws.com/0/247287/ee9eaee2-a430-fb8e-b8c5-2ca0a590a431.png" width=50%>
あとは、置換で空白にして、段落記号が二重になっているところを一つの段落記号に置き換えれば、台本の完成です。
# Wordの音声合成に任せる
Wordにも「読み上げ」機能があって、クイックアクセスツールバーに「読み上げ」と入力すればそれで読み上げてくれるので、それを録音して、PowerPointの各スライドに音声データとして貼り付けてもよいでしょう。
Microsoft Harukaさんのナレーションが一番技術的なものには向いていると個人的には思います。
<img src="https://qiita-image-store.s3.amazonaws.com/0/247287/88751e3d-437a-7984-7e33-fea024be8b6e.png" width="25%" >
CoreOSを固定IP環境でインストール

普通はDHCP配下でセットアップするかと思うのですが、vmware & 固定IP環境でセットアップした時のメモです。

# 準備

## イメージダウンロード

## 仮想マシン作成

+ 仮想マシンを1GBだと動作しないので。2GB以上で作成
+ パワーオンしてからisoディスクイメージをマウント

## 固定IP設定

インストールするのにネットワークが必要なので下記コマンドでファイルを作成

```sudo vi /etc/systemd/network/static.network```

```:static.network
[Match]
Name=ens32
[Network]
Address=172.17.1.222
Gateway=172.17.1.254
DNS=8.8.8.8
```

ネットワーク反映
```sudo systemctl restart systemd-networkd```

暫定パスワードをコンソールから設定
```sudo passwd core```

これでcoreでログインできるようになる

#インストール

## パスワードの作成

下記コマンドにてパスワードの書かれたyamlを作る
```openssl passwd -1 > cloud-config.yaml```

## configファイルの作成

パスワードは作成済みなので、下記にように編集してcloud-config.yamlファイルを作成する。

```:cloud-config.yaml
#cloud-config

users:
 - name: core
   passwd: $1$Nsasasasiouef9oehp.
   groups:
    - sudo
    - docker

write_files:
 - path: /etc/systemd/network/static.network
   permissions: 0644
   content: |
     [Match]
     Name=ens32
     [Network]
     Address=172.17.1.222
     Gateway=172.17.1.254
     DNS=8.8.8.8
```

## インストール

下記のコマンドでvmtool入の初期イメージをインターネットよりダウンロードして/dev/sdaに書き込みます

```sudo coreos-install -d /dev/sda -C stable -c cloud-config.yaml -o vmware_raw```
[Swift] macOS Mojaveでシェアボタンからツイートする

# これはなに？

自作のmacOSアプリケーションのシェアボタンからツイートできるようにするframeworkです。
複数枚の画像の投稿もできます。

# なんで作ったの？

Mojaveからなくなったからに決まってるでしょ！！
ついでに複数枚画像の投稿機能も追加したからHigh Sierraとかでも有効よ！

# 使い方

### GitHubにあるよー

[GitHub TweetService](https://github.com/masakih/TweetService)

### Carthageが使えるよー

```Cartfile:Cartfile

github "masakih/TweetService"

```

### 組み込み方

## Step 0

Twitter Appを登録。
callback URLはカスタムスキームを設定。

## Step 1

Twitter Appの登録情報から`TweetService`を生成。

```swift
class ViewController: NSViewController {
    
    private var tweetService: TweetService?
    
    override func viewDidLoad() {
    
        self?.tweetService = TweetService(callbackScheme: "customscheme",  // カスタムスキームは何でもOK
                                         consumerKey: "########",
                                         consumerSecretKey: "###############")
        self?.tweetService.delegate = self
    }
}
```

## Step 2

`TweetServiceDelegate` Protocolに準拠。

ツイートパネルのparentViewControllerとなれるNSViewControllerを返す。

```swift
extension ViewController: TweetServiceDelegate {

    func tweetSetviceAuthorizeSheetPearent(_ service: TweetService) -> NSViewController? {

        return self
    }
}
```


## Step 3

`NSSharingServicePickerDelegate` Protocolに準拠。

`sharingServicePicker(_:sharingServicesForItems:proposedSharingServices:)` で `TweetService#sharingServicePicker(_:proposedSharingServices:)`の戻り値を返す。

```swift
extension ViewController: NSSharingServicePickerDelegate {
    
    func sharingServicePicker(_ sharingServicePicker: NSSharingServicePicker, sharingServicesForItems items: [Any], proposedSharingServices proposedServices: [NSSharingService]) -> [NSSharingService] {
                
        return tweetService?.sharingServicePicker(items, proposedSharingServices: proposedServices) ?? proposedServices
    }
}
```

## Step 4

アクションを作ってシェアボタンに接続。

```swift
extension ViewController {

    @IBAction private func tweet(_ button: NSButton) {
        
        let items: [Any?] = [
            textField?.stringValue,
            imageView?.image,
            imageView2?.image,
            imageView3?.image,
            imageView4?.image,
            ]
        
        let picker = NSSharingServicePicker(items: items.compactMap( { $0 } ))
        picker.delegate = self
        picker.show(relativeTo: .zero, of: button, preferredEdge: .minX)
    }
}
```

以上、たったこれだけであなたのアプリケーションからツイートが出来るようになります。


## おわりに

うちの環境では動かすことができてるけど、ほかの環境で動くかどうかはわからない。

一応、バグ報告とか要望とかには対応すると思う。
PRとかよくわからないからfork or 丸パクリ、アイデアを参考にするとかしたほうが早いかも。
Ruby二列からの入力4種

N M
a1 b1
a2 b2
... ...
an bn
は

```:ruby
N, M, *rest = $stdin.read.split
ABS = rest.each_slice(2).to_a
```

参考
https://yhara.jp/CompetitiveProgrammingInRuby

N T

c1 t1

c2 t2

:

cN tN

readlinesの場合

```:ruby
N, T = gets.split.map(&:to_i)
CTs = readlines.map{|l| l.split.map(&:to_i)}
```

参考
https://beta.atcoder.jp/contests/abc112/submissions/3415903

```:ruby
z,*a=$<.map{|s|s.split.map &:to_i}
```
参考
https://beta.atcoder.jp/contests/abc112/submissions/3353574

```:ruby
n,T=gets.split.map &:to_i;
```

さっぱりわかりません。