OmniAICreator/Qiita-1.07M huggingface dataset:
kivyを使ってGUIプログラミング ~その1 導入編~

#kivyとは
kivy(<https://kivy.org/#home>)はPythonのマルチプラットフォーム向けの
GUIプログラミングが行えるライブラリです。
特徴としては、Android　OS風なフラットデザインのGUIを簡単に作ることができたりします。
また、ライブラリの特徴として、kv languageという機能を有しています。
kv languageは、ソースファイル内に記述することで、オブジェクト(ボタンやラベル等)の
レイアウトとボタン等の処理を別々で管理できるようになります。
これを活用すると効率的に開発ができるようになると思います。

本エントリーでは、kivyの使い方について、複数回に渡って紹介していきます。

#環境
・mac mojave 10.14.3
・Ubuntu 16.04
・Python 3.7.2

macとUbuntuで環境構築をしたいと思います。

#導入します！
今回はanacondaは用いず、pipをメインで導入を進めたいと思います。

###mac
homebrewが必要ですの導入してください。
[参考記事です。](https://kivy.org/doc/stable/installation/installation-osx.html#using-homebrew-with-pip)
公式のチュートリアルでもvirtualenvが推奨されていたため、
もし入っていなければこちらを参考にして導入してください。
<https://qiita.com/Kodaira_/items/feadfef9add468e3a85b>

1.　必要なパッケージのインストール

```
$ brew install pkg-config sdl2 sdl2_image sdl2_ttf sdl2_mixer gstreamer
```

2.　pipで必要なライブラリのインストール

```
$ pip install --upgrade pip
$ pip install Cython==0.29.10 
$ pip install kivy
```

###ubuntu
こちらを参考に導入を進めます。
<https://kivy.org/doc/stable/installation/installation-linux-venvs.html#installation-in-venv>

1.　必要なパッケージのインストール

```
sudo apt-get install -y \
    ffmpeg \
    libsdl2-dev \
    libsdl2-image-dev \
    libsdl2-mixer-dev \
    libsdl2-ttf-dev \
    libportmidi-dev \
    libswscale-dev \
    libavformat-dev \
    libavcodec-dev \
    zlib1g-dev
```

2.　pipで必要なライブラリのインストール

```
$ pip install --upgrade pip
$ pip install Cython==0.29.10 
$ pip install kivy
```



#動作確認
``` test.py
from kivy.app import App
from kivy.uix.button import Button

class TestApp(App):
    def build(self):
        return Button(text='Hello World')

TestApp().run()
```

公式のサンプルプログラムを実行するとこんな感じのHallo, world!が出てきます。

<img width="805" alt="スクリーンショット 2019-09-30 10.02.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421817/74a9887a-d340-49ce-1324-d2d9bf0e4363.png">

ちなみに、kv languageを用いるとこんな感じで書くことになると思います。

``` test.py

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.button import Button
from kivy.uix.boxlayout import BoxLayout

#kv langage
Builder.load_string('''
<SampleScreen>
	Button:
		text: 'Hollo World!'
''')

#ボタンを押した時の処理など、ここ
class SampleScreen(BoxLayout):
	pass
	
class TestApp(App):
	def build(self):
		return SampleScreen()

if __name__ == "__main__":
	TestApp().run()

```

まだ画面一枚にでボタンが一つだけしかないのでメリットが感じられませんが、
機能を増やしていくとそのメリットを感じるようになると思います。

次回からはkv languageも用いて、いろいろ作って行きましょう！

#参考記事
導入記事とても参考になりました！

[Python Kivyの使い方① ～Kv Languageの基本～](https://qiita.com/dario_okazaki/items/7892b24fcfa787faface)

[Pythonで作るGUIアプリ with kivy 基礎編](https://qiita.com/phorizon20/items/21edc30b2d5afaa606c8)

[Python + Kivy 導入してみた](https://qiita.com/masa0209/items/65428c4a2a9e0ed62874)

[Kivyのインストール](https://qiita.com/silverskyvicto/items/810d5184135622108989)
CentOS７でyumのエラーメッセージが化ける件

ターミナルでの表示が文字化けする、エラーが文字化けする、とかいう症状には、

```
export LANG=en_US （英語にしたい場合）
export LANG=ja_JP.UTF-8 (日本語にしたい場合）
```

を.bashrcに書いておけ、とかいう対処法がネット上にたくさん落ちているのだけれど、普通のエラーメッセージはちゃんと日本語で出るのに、なぜかyumのエラーが化けることがある。もちろん、LANG変数はちゃんと正しく設定されているにもかかわらず。

```
[XXX@XXX ~]$ yum update
??????????:fastestmirror, langpacks
このコマンドを実行するには root である必要があります。
```

??????????が化けている部分。

これの直し方を、前に調べて簡単解決したのに、今検索するとなかなかヒットしない…
で、１５分後、LC_ALL環境変数がセットされていたのが問題だった、と学んだ。

```
[XXX@XXX ~]$ echo $LC_ALL
C
```

こうなっていると、LC_ALL変数はLANG変数よりも優先されるので、いくらLANG変数を書き換えても、プログラム関係のエラーメッセージなんかが化ける。

解除するには、単純に、

```
unset LC_ALL
```

とかやって、LC_ALL環境変数を空にしてしまえば、LANG変数の設定がほかにも反映するようになる。

もうたぶん通算３回くらい調べてて、そのたびに忘れる自分のポンコツ頭に嫌気がさしたので、自分用メモ。
Spring Bootでmaven install時にWildfly設定ファイルを追加する方法

# 00. 前提
#### やりたいこと
Wildflyの設定ファイルをwarの指定した場所に追加したい
・jboss-web.xml ・・・ 設定ファイル
#### 環境
・言語：Java8
・FW：Spring Boot
・Webサーバー：Wildfly
・エディター：Spring Tool Suite
#### 展開後の構成
*.war
├─META-INF
└─WEB-INF
　　jboss-web.xml
　　├─classes
　　└─lib
# 1. pom.xmlを編集する
以下の通りpom.xmlを修正

```html
<project 
	xmlns="http://maven.apache.org/POM/4.0.0" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
	http://maven.apache.org/xsd/maven-4.0.0.xsd">
	
  <modelVersion>*.*.*</modelVersion>
  
  <groupId>***</groupId>
  <artifactId>***</artifactId>
  <version>***</version>
  <packaging>war</packaging>
  <!-- <url>http://maven.apache.org</url> -->
  
  <name>***</name>
  <description>***</description>

  <parent>
    ***
  </parent>

  <properties>
    ***
  </properties>

  <dependencies>
    ***
  </dependencies>
  <!-- ★ここから★ -->
  <build>
	<finalName>***</finalName>
    <!-- プラグインの設定 -->
    <plugins>
      <plugin>
        <groupId>***</groupId>
        <artifactId>maven-war-plugin</artifactId>
        <configuration>
          <webResources>
            <!-- 設定ファイル -->
            <resource>
          　　<!-- 設定ファイルの保存場所 -->
              <directory>${basedir}/xml</directory>
              <filtering>true</filtering>
          　　<!-- 設定ファイルの出力先 -->
              <targetPath>WEB-INF</targetPath>
          　　<!-- 対象ファイル名 -->
              <includes>
                <include>**/jboss-web.xml</include>
              </includes>
            </resource>
          </webResources>
        </configuration>
      </plugin>
    </plugins>
  </build>
  <!-- ★ここまで★ -->
</project>
```
#### 補足.1
設定ファイルの保存場所と指定方法は以下の通り

```html
<!-- 設定ファイルの保存場所 -->
<directory>${basedir}/xml</directory>
```
${basedir}
├─src
├─lib
├─maven
└─xml
　　　jboss-web.xml
　pom.xml
#### 補足.2
出力先はtargetPathで指定する

※ WEB-INFの場合

```html
<targetPath>WEB-INF</targetPath>
```

※ META-INFの場合

```html
<targetPath>META-INF</targetPath>
```
#### 補足.3
他に追加したいXMLが存在する場合はpluginsタグ内に追加する

```html
    <plugins>
      <plugin>
        ***
      </plugin>
      <!-- ★ここから★ -->
      <plugin>
        <groupId>***</groupId>
        <artifactId>maven-war-plugin</artifactId>
        <configuration>
          <webResources>
            <!-- 設定ファイル -->
            <resource>
          　　<!-- 設定ファイルの保存場所 -->
              <directory>${basedir}/xml</directory>
              <filtering>true</filtering>
          　　<!-- 設定ファイルの出力先 -->
              <targetPath>WEB-INF</targetPath>
          　　<!-- 対象ファイル名 -->
              <includes>
                <include>**/jboss-web.xml</include>
              </includes>
            </resource>
          </webResources>
        </configuration>
      </plugin>
      <!-- ★ここまで★ -->
    </plugins>
```
# 02. warファイルの生成
#### 02-01. maven clean
対象のプロジェクトを選択して、「実行」→「maven clean」
#### 02-02. maven install
対象のプロジェクトを選択して、「実行」→「maven install」
以下のパスにwarファイルが生成されている
${basedir}
├─src
├─lib
│　commons-lang3-3.9.jar
├─maven
└─taeget
　　*.war
　pom.xml

warの内部は以下の通り
*.war
├─META-INF
└─WEB-INF
　　jboss-web.xml
　　├─classes
　　└─lib
maven installでwarファイルを作成した際に外部ライブラリを読み込む方法

# 00. 前提
#### やりたいこと
maven install時にwarファイルを作成する場合、外部ライブラリがwarに配置されないためライブラリの読み込みができない
外部ライブラリが読み込めるよう、warファイル内に配置されるよう修正する
※ 例としてJava apache commons lang3を読み込む
#### 環境
・言語：Java8
・FW：Spring Boot
・Webサーバー：Wildfly
・エディター：Spring Tool Suite
#### 展開後の構成
*.war
├─META-INF
└─WEB-INF
　　jboss-web.xml
　　├─classes
　　└─lib
　　　commons-lang3-3.9.jar
# 01.pom.xmlを編集する
以下の通りpom.xmlを修正

```html
<project 
	xmlns="http://maven.apache.org/POM/4.0.0" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
	http://maven.apache.org/xsd/maven-4.0.0.xsd">
	
  <modelVersion>*.*.*</modelVersion>
  
  <groupId>***</groupId>
  <artifactId>***</artifactId>
  <version>***</version>
  <packaging>war</packaging>
  <!-- <url>http://maven.apache.org</url> -->
  
  <name>***</name>
  <description>***</description>
  
  <parent>
    ***
  </parent>
  
  <properties>
    ***
  </properties>
	
  <dependencies>
    <!-- ★ここから★ -->
    <!-- commons-lang -->
    <dependency>
      <groupId>org.apache.commons</groupId>
      <artifactId>commons-lang3-3.9</artifactId>
      <version>3.9</version>
    </dependency>
    <!-- ★ここまで★ -->
  </dependencies>
  <build>
    <finalName>***</finalName>
    <plugins>
      <!-- ★ここから★ -->
      <plugin>
	    <groupId>org.apache.maven.plugins</groupId>
	    <artifactId>maven-install-plugin</artifactId>
	    <executions>
	      <execution>
	        <id>install-external</id>
	        <phase>clean</phase>
	        <configuration>
              <!-- ライブラリの保存場所 -->
	          <file>${basedir}/lib/commons-lang3-3.9.jar</file>
	          <repositoryLayout>default</repositoryLayout>
	          <groupId>org.apache.commons</groupId>
	          <artifactId>commons-lang3-3.9</artifactId>
	          <version>3.9</version>
	          <packaging>jar</packaging>
	          <generatePom>true</generatePom>
	        </configuration>
	        <goals>
	          <goal>install-file</goal>
	        </goals>
	      </execution>
	    </executions>
	  </plugin>
      <!-- ★ここまで★ -->
    </plugins>
  </build>
  
</project>
```
#### 補足.1
ライブラリの保存場所と指定方法は以下の通り

```html
<!-- ライブラリの保存場所 -->
<file>${basedir}/lib/commons-lang3-3.9.jar</file>
```
${basedir}
├─src
├─lib
│　　commons-lang3-3.9.jar
└─maven
　pom.xml
# 02. warファイルの生成
#### 02-01. maven clean
対象のプロジェクトを選択して、「実行」→「maven clean」
#### 02-02. maven install
対象のプロジェクトを選択して、「実行」→「maven install」
以下のパスにwarファイルが生成されている
${basedir}
├─src
├─lib
│　commons-lang3-3.9.jar
├─maven
└─taeget
　　*.war
　pom.xml

warの内部は以下の通り
*.war
├─META-INF
└─WEB-INF
　　jboss-web.xml
　　├─classes
　　└─lib
　　　commons-lang3-3.9.jar
「Vue.js&Nuxt.js超入門」コード修正

[Vue.js&Nuxt.js超入門](https://www.amazon.co.jp/dp/B07X6F1C2P/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)を読み進める中で、原本のコードだと上手くいかないところがあったので、修正したところを記載していきます。（気づいたら随時更新していきます。）


##p.93 「リスト2-10」

```original.html
<script>
	var app = new Vue ({
		el: '#app',
		data: data,
		render: (h)=>{
			return h("div", [
				h("p",
					{style:'font-size:20pt;'},
					data.message),
				h("ol",
					data.items.map(i=> v('li',i))//v is not defined!
				)
			]);
		}
	})
```


```revision.html
<script>
	var app = new Vue ({
		el: '#app',
		data: data,
		render: (h)=>{
			return h("div", [
				h("p",
					{style:'font-size:20pt;'},
					data.message),
				h("ol",
					data.items.map(i=> h('li',i))//vをhに修正！
				)
			]);
		}
	})
```
go test のテスト実行判定 flag.Lookup("test.v")

# flag.Lookup("test.v")でハマった話

今回はgo言語のflag.Lookup("test.v")でハマった話です。

タイトルに書いてある通り、テスト実行かそれ以外かの判定に`flag.Lookup("test.v")`を用いていたのですが、思わぬところに罠がありました。

## 判定方法
```go
func IsTestRun() bool {
	flg := flag.Lookup("test.v")
	if flg != nil {
		test, err := strconv.ParseBool(flg.Value.String())
		if err != nil {
			// テストフラグの値が真偽値でない等のエラー
			panic("テストフラグの値が真偽値でない")
		}
		if test {
			// テスト実行
			return true
		}
	}

	// テスト実行ではない
	return false
}
```

ざっくり書くとこんな感じです。

## 何にハマったか

`TestMain`からの呼び出し時にハマりました。
go言語のテストでは共通する部分をまとめて処理する等の目的で`TestMain`を定義することがあるのですが、`TestMain`が呼び出された時は`flag.Parse`が実行されないため、明示的に`flag.Parse`をしておく必要がありました。
`flag.Parse`を行わないと`flag.Lookup("test.v")`で取得できないためです。

```
// then the generated test will call TestMain(m) instead of running the tests
// directly. TestMain runs in the main goroutine and can do whatever setup
// and teardown is necessary around a call to m.Run. It should then call
// os.Exit with the result of m.Run. When TestMain is called, flag.Parse has
// not been run. If TestMain depends on command-line flags, including those
// of the testing package, it should call flag.Parse explicitly.
//
// A simple implementation of TestMain is:
//
//	func TestMain(m *testing.M) {
//		// call flag.Parse() here if TestMain uses flags
//		os.Exit(m.Run())
//	}
//
```

[testingパッケージより](https://github.com/golang/go/blob/master/src/testing/testing.go#L211)

## 最後に
パッケージのコメントを良く読もうと言う話でした
無駄な所でハマらないようにしましょう
シェルスクリプト + Packerで超お手軽AMI作成

AnsibleもChefも使わずシェルスクリプトだけでプロビジョニングしてAMIを作成するメモ。

# Packerのインストール

ローカルにインストールする。

```
brew install packer
```

# Packer設定ファイルの作成

## ディレクトリ構造

```
.
├── files
│   ├── main.sh
│   └── nginx.conf
└── myami.json
```

## myami.json

ポイント

- ローカルの `./files` ディレクトリを丸ごとリモートの `/tmp/files` にコピーしている。
    - ディレクトリ名の末尾にスラッシュをつけるかどうかでコピーの挙動が変わるので注意（詳しくは公式ドキュメントを）
    - コピーされたファイルの所有者はpacker実行時にsshしたユーザー（このサンプルでは `ec2-user`）になっているので、必要に応じて `chmod` `chown` すること。
- `main.sh` を `sudo` つきで呼び出すことにより、main.shに書いたコマンドは全部 `root` として実行される。

```json
{
  "builders": [
    {
      "type": "amazon-ebs",
      "ami_name": "MyAMI-{{isotime | clean_ami_name}}",
      "region": "ap-northeast-1",
      "source_ami": "ami-0ff21806645c5e492",
      "instance_type": "t3.micro",
      "vpc_id": "vpc-*********",
      "ssh_username": "ec2-user",
      "security_group_ids": [
        "sg-*****************"
      ],
      "subnet_id": "subnet-**************",
      "associate_public_ip_address": true
    }
  ],
  "provisioners": [
    {
      "type": "file",
      "source": "./files",
      "destination": "/tmp"
    },
    {
      "type": "shell",
      "inline": ["sudo bash /tmp/files/main.sh"]
    }
  ]
}
```

## main.sh

```bash
#!/bin/bash

set -e

yum install -y nginx

mv -v /tmp/files/nginx.conf /etc/nginx/nginx.conf
chmod 644 /etc/nginx/nginx.conf
chown root:root /etc/nginx/nginx.conf

systemctl enable nginx
```

# 実行

バリデート

```
packer validate myami.json

```

実行

```
packer build myami.json
```

# 参考

- https://qiita.com/mitzi2funk/items/c963483a11a1912e3c44
- https://www.packer.io/docs/provisioners/shell.html
- https://www.packer.io/docs/provisioners/file.html
JQuery: 入れ子になったリストをアコーディオンにする

## SAMPLE
未選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51324/22fafbfc-5eb9-f015-a46c-c9a49f96d3bb.png)

選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51324/1c8c8ffd-e796-8277-ba49-11f82d2ddd4d.png)

## REFENRECE
[jQueryとCSS3を使ったアコーディオンメニューを詳しく説明します](http://weboook.blog22.fc2.com/blog-entry-347.html)

## JQuery
```html
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
<script type='text/javascript'>
$(function() {
   $("#accordion li ul").hide();
   $("#accordion > li > a").click(function(){
       var click = $("+ul",this);
       click.slideDown();
       $("#accordion ul").not(click).slideUp();
       return false;
   });
});
</script>
```

## HTML
```html
<div>
    <ul id="accordion">
        <li><a>PARENT_MENU1</a>
        <ul>
            <li><a>CHILD_MENU1</a></li>
            <li><a>CHILD_MENU2</a></li>
            <li><a>CHILD_MENU3</a></li>
        </ul>
        </li>
        <li><a>PARENT_MENU2</a>
        <ul>
            <li><a>CHILD_MENU1</a></li>
            <li><a>CHILD_MENU2</a></li>
            <li><a>CHILD_MENU3</a></li>
        </ul>
        </li>
        <li><a>PARENT_MENU3</a>
        <ul>
            <li><a>CHILD_MENU1</a></li>
            <li><a>CHILD_MENU2</a></li>
            <li><a>CHILD_MENU3</a></li>
        </ul>
        </li>
    </ul>
</div>
```

## CSS
```css

@font-face {
    font-family: 'Typicons';
    src: url('fonts/typicons-regular-webfont.eot');
    src: url('fonts/typicons-regular-webfont.eot?#iefix') format('embedded-opentype'),
        url('fonts/typicons-regular-webfont.woff') format('woff'),
        url('fonts/typicons-regular-webfont.ttf') format('truetype'),
        url('fonts/typicons-regular-webfont.svg#TypiconsRegular') format('svg');
    font-weight: normal;
    font-style: normal;
}

#accordion{
  list-style: none;
  width: 500px;
  font-size: 16px;
  line-height: 1;
  background-color: #add8e6;
  -moz-background-size: 4px 4px;
  -webkit-background-size: 4px 4px;
  -o-background-size: 4px 4px;
  -ms-background-size: 4px 4px;
  background-size: 4px 4px;
  margin: 0;
  padding: 0;
  border-radius: 3px;
}

#accordion > li{
  padding: 0;
}

#accordion li a{
  display: block;
  position:relative;
  color: #333;
  text-decoration:none;
  padding: 15px 45px;
  border-bottom: 1px solid #79bfd6;
  border-top: 1px solid #eef7fa;
  -moz-transition: .3s;
  -webkit-transition: .3s;
  -o-transition: .3s;
  -ms-transition: .3s;
  transition: .3s;
}

#accordion > li:first-child > a{
  border-top: 0px;
}

#accordion li a:hover{
  color: #1b4958;
  background: rgba(0,0,0,.1);
  border-top-color: #c7e4ee;
}

#accordion li ul {
  list-style: none;
  background: #e1f1f6;
  margin: 0;
  padding: 0;
}

#accordion li ul li a{
  position:relative;
  background: none;
  line-height: 1;
  padding: 15px 70px;
  border-top: 1px solid #fff;
  border-bottom: 1px solid #a0d2e2;
}

#accordion li ul li:first-child a{
  border-top: 0px;
}

#accordion li ul li:last-child a{
  border-bottom: 1px solid #5fb3ce;
}
#accordion li ul li a:hover{
  background: #d4ebf2;
  border-top-color: #eef7fa;
}
```
Passportで認証したユーザ情報をsocket.ioに引き継ぐ

**2022-11-19 追記**
こちらの方法の方がより簡単です(原理は同じ)。

https://socket.io/docs/v4/middlewares/#compatibility-with-express-middleware

<hr>

[Passport](http://passportjs.org) で認証したユーザ情報を [socket.io](https://socket.io) に引き継ぐモジュールを作ってみた。

## プログラム

```socket.io-passport-session.js
module.exports = (session, passport)=>{
    return {
        express_session:
            (socket, next)=>{session(socket.request, {}, next)},
        passport_initialize:
            (socket, next)=>{passport.initialize()(socket.request, {}, next)},
        passport_session:
            (socket, next)=>{passport.session()(socket.request, {}, next)}
    }
}
```

## 利用例

```JavaScript
const express  = require('express');
const session  = require('express-session')({
                            secret:'secret',
                            resave:false,
                            saveUninitialized:false });
const passport = require('passport');

const socket_io_session
               = require('./socket.io-passport-session')(session, passport);

const app = express();

app.use(session);
app.use(passport.initialize());
app.use(passport.session());

const server = require('http').createServer(app);
const io = require('socket.io')(server);

io.use(socket_io_session.express_session);
io.use(socket_io_session.passport_initialize);
io.use(socket_io_session.passport_session);

io.on('connection', socket=>{
    console.log(socket.request.user);
    socket.on('hello', msg=>{
        console.log(socket.request.user);
        console.log('hello', msg);
    });
});

server.listen(3000);
```

## 動作原理

WebSocketは最初HTTPで接続し、その接続をWebSocketに「流用」する訳だが、最初のHTTPリクエストには認証のための Cookie ヘッダも含まれている。Cookie の値さえ分かればユーザ情報は復元可能なのだが、

 1. Cookie の値からセッションデータを復元
 2. セッションデータからユーザ情報を復元

する手順は express-session と passport に隠蔽されている[^1]。1はミドルウェア関数の ``session()`` で、２は ``passport.session()`` で処理されるので、これらのミドルウェア関数を呼び出してあげればよい。[^2]

ただし、``app.use()`` から呼び出されるミドルウェアの引数は、``(req, res, next)`` なのに対し、``io.use()`` から呼び出される関数は ``(socket, next)`` なので変換が必要になる。具体的には ``(socket, next)`` → ``(socket.request, {}, next)`` とすればよい。

結果のユーザ情報は ``socket.request.user`` に設定される。この情報は connect 時だけでなく emit の際にも設定されるようであるが、送信元の識別はユーザ情報ではなく ``socket.id`` で行うべき。

## npm モジュール

ちょっと手直しして npm に登録しました。

 - [@kobalab/socket.io-session](https://www.npmjs.com/package/@kobalab/socket.io-session)

[^1]: 2はアプリ側が ``passport.deserializeUser()`` で指定するので方法は自明だが、指定済みの方法を参照すべき
[^2]: ``passport.session()`` の前処理を ``passpport.initialize()`` で行うので、このミドルウエア関数も呼び出す必要あり
Python まとめ

#はじめに
[未来電子テクノロジー](https://www.miraidenshi-tech.jp/intern-content/program/)でインターンをしているsaijoです！

プログラミング初心者であるため、内容に誤りがあるかもしれません。
もし、誤りがあれば修正するのでどんどん指摘してください！！

今回は自分がPythonを勉強してきた上でインプットした知識を執筆していきます！

#仮想環境の構築
Pythonを扱うに当たって必要不可欠なのがこの「仮想環境」です。仮想環境を整えることのメリットとしては、多種多様なソフトウェアを最適な環境下で開発していけることが挙げられます。
では今回はVirtualenvを使用して実際に仮想環境を作成してみましょう。

```sh
# Pythonのversion関係なく仮想環境を構築
$ virtualenv <作成する環境名>

# Pythonのversionを指定して仮想環境を構築
$ virtualenv -p python3.7 <作成する環境名>

# 使用したい仮想環境を指定する
$ source <環境名>/bin/active
# もしくは、、、
$ .<環境名>/bin/activate

# 仮想環境から抜け出す
$ deactivate
```

流れとしては「仮想環境を作成」→「仮想環境を指定」→「仮想環境から抜け出す」の３つのみです！
仮想環境を整えるのは思ってたより簡単ですね。

#クラス・クラスの継承
続いてはPythonではおなじみのクラスについてまとめていきます！
まずはサンプルコードを以下に示します。

```python:sample.py
# MenuItemクラスの作成
class MenuItem:
   def __init__(self, name, price):
      self.name = name
      self.price = price
   def info(self):
      print('商品名: '+self.name)
      print('価格: '+self.price+'円')


# MenuItemクラスから継承したFoodクラスの作成
class Food(MenuItem):
   def __init__(self, name, price, calorie):
      super().__init__(name, price)
      self.calorie = calorie
   def info(self):
      print('商品名: '+self.name)
      print('価格: '+self.price+'円')
      print('カロリー: '+self.calorie+'kcal')
```

まずはMenuItemクラスの方から見ていきましょう！
中身を観察していくと、initメソッドが目に付きます。initメソッドとは、インスタンスが生成された直後に自動的に呼び出される関数のことです。これによりインスタンス生成と同じタイミングで、インスタンス変数を代入することができます！
またクラスのメソッドを定義する際は、第一引数をselfにしないといけないです。

次にMenuItemクラスから継承したFoodクラスの方を見ていきましょう！
まずはclass定義の書き方なのですが、上のコードのようにサブクラスを定義する際は継承先のクラスをFood(MenuItem)のように指定してあげる必要があります。
またサブクラスにもinitメソッドはあるのですが、その中身に注目してください。super()関数がありますね。super()関数では、親となるクラスから継承したいインスタンス変数の取捨選択ができます！これって超便利ですよね！！
またMenuItemクラスとFoodクラスの両方にinfoメソッドが定義されているのですが、Foodクラスのインスタンスがinfoメソッドを呼び出した際は、予測通りFoodクラスで定義したinfoメソッドが呼び出されます。
つまり親クラスと同名のメソッドを定義すると、そのメソッドは上書きされるってことです。

#実践編
最後に今まで勉強してきた中で、「これは実践でもよく使えるぞ！」と思ったテクニック？を記していきます。

##for文のカウンタ変数は省略できる
```python:sample.py
# カウンタ変数アリ
t = int(input())
string = []
for i in range(t):
   string.append(input())
print(string)


# カウンタ変数ナシ
t = int(input())
string = []
for _ in range(t):
   string.append(input())
print(string)
```

少し冗長になってしまいましたが、これは任意の要素数を持つ文字列リストを作成するプログラムです。
このプログラムのようにカウンタ変数をfor文処理で用いない際は、＿のように省略することができます！for文のネストをする時など、カウンタ変数を何にしようか迷う時があると思いますが、この知識を知っておくとそこで悩む回数が激減しますね！！

##イテラブルオブジェクトをまとめて処理する高階関数map
```python
arr = list(map(int, input().split()))
```
map関数はリストなどのイテラブルオブジェクトに対し、int関数などをまとめて作用させることができます。
ここでどこにもリストなんて書かれていないじゃないか！と言う人に対して一応説明を入れておくと、splitメソッドがセパレータで区切ってリスト化する機能を持っているので、input().split()は空白区切りのリストを表しています。
また注意点が一つあり、map関数の返り値はmap型となっているので、最後にlist()を作用させてリスト化させていきましょう！

##二次元リストの内包表記
```python
vector = [[i,j,k] for i in range(3) for j in range(3) for k in range(3) if not i+j+k==3]
```
これは三次元デカルト座標に０から３までの格子点のうち、各座標を足して３にならない格子点の座標を求めるプログラムです。
このように内包表記でforを複数記述しても問題はないです！
応用するといろんなことができそうですよね。笑

#まとめ
以上が僕がここ１ヶ月近く勉強してきたコンテンツとなります。
最後までご覧いただきありがとうございました！！
Swift：NSAttributedStringの高さを計算する

```swift
let attributes: [NSAttributedString.Key : Any] = [
    NSAttributedString.Key.font : NSFont.systemFont(ofSize: fontSize),
    NSAttributedString.Key.foregroundColor : NSColor.red
]

let attrStr = NSAttributedString(string: "Text", attributes: attributes)

let fieldW: CGFloat = 200 // 表示するテキストフィールドの幅
let rect = attrStr.boundingRect(with: NSSize(width: fieldW, height: CGFloat.greatestFiniteMagnitude),
                                            options: [.usesLineFragmentOrigin, .usesFontLeading], context: nil)

let calcHeight: CGFloat = ceil(rect.height)
```
rails s実行時に Address already in use が発生した時の対処法

rails s実行時に

```
in `initialize': Address already in use - bind(2) for "::1" port 3000 (Errno::EADDRINUSE)
```

と表示され、ローカルサーバが起動しなくなった時の対処法。

調べてみるとすでに0.0.0.0:3000が使われてしまっているというエラー表示のため、

```
lsof -i:3000
COMMAND   PID USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
ruby    38514        29u  IPv6 0x88vsddsreb9f0a63      0t0  TCP localhost:hbci (LISTEN)
ruby    38514        30u  IPv4 0x88ssffsbbdfsbbbb      0t0  TCP localhost:hbci (LISTEN)
```

ポート3000番使用PIN確認すると２つのUSERが使用中。

```
kill -9 38514
```

PIN番号指定してkill

再度rails sすると無事サーバーが立ち上がりました。
Qiitaで初めて記事を投稿する際に役立つ情報のまとめ

`投稿時期:2019/9/30`

#はじめに
quita投稿の際に役立つ情報をまとめます。

#結果
これであなたもquita投稿

# 準備
## quitaアカウントを準備する
- quitaアカウントの作成
- メール承認
- 二段階認証
 
各アカウントの作成はサクサクっとできると思います。
閲覧はできますが、メール承認しないと投稿はできないっぽいです。
GitHub, Twitter, Googleアカウントとの連携も出来て便利です。

## quita利用規約をチラ見
[コミュニティガイドライン](https://help.qiita.com/ja/articles/qiita-community-guideline)
[良い記事を書くためのガイドライン](https://help.qiita.com/ja/articles/qiita-article-guideline)

良いこと書いていますし、2-3分で読めますので読みましょう。

## Markdownの書き方をチラ見
[Markdown記法 チートシート](https://qiita.com/Qiita/items/c686397e4a0f4f11683d)
[Qiita Markdown 書き方 まとめ](https://qiita.com/shizuma/items/8616bbe3ebe8ab0b6ca1)
とか適当にググれば出てくる。
quita書くためにMarkdown覚えるぞ！ってなると本末転倒で敷居が高くなっちゃうので、書きたい時にggrばOKかと思います。

# 実践
## 記事作成
ヘッダーの「投稿する」を押せば、記事作成画面に遷移する。
左ボックスにMarkDown形式で記載すれば、右ボックスにプレビューが出るのすごく便利です。
左ボックスは上から

- タイトル
- タグ
- 本文

となっています。

## タイトル
[良い記事を書くためのガイドライン](https://help.qiita.com/ja/articles/qiita-article-guideline)

- 具体的で簡潔なタイトルをつけるべし。
- タイトルを見ただけで記事の中身を想像できるようにすべし。

らしいです。
広く見てもらうためにはタイトル付けも重要そうです。
誇大広告にならない様に気を付けて、ナウでヤングでトレンディなタイトルを付けましょう。

## タグ
検索される際などでタグhitするので付けておけば良いと思います。
僕も初投稿ですのでタグの重要性はよくわかりません。

## 本文
[良い記事を書くためのガイドライン](https://help.qiita.com/ja/articles/qiita-article-guideline)

- 環境や前提条件を説明する
- 引用元や参考元へのリンクを書く
- 著作権に気をつける
- ライセンスや秘密保持契約に気をつける
- 利用規約を守る

らしいです、著作権やライセンスには十分注意しましょう。
環境や前提条件やまとめ、があると必要な情報かをすぐに判断出来るので、見る人視点ではより良さそうです。
この記事の情報を知らなかった時の自分が、この記事を見たら嬉しくなるような内容の記事を書けるよう心がけたいです。
[OAuth]認証の仕組みを自分なりに理解したから、噛み砕いて図解してみた

#はじめに
`OAuth`(オーオース)の仕組みについて全く理解できていなかったので、こちらの記事を読み学ばさせていただきました。
[OAuth 2.0 全フローの図解と動画](https://qiita.com/TakahikoKawasaki/items/200951e5b5929f840a1f)

大まかにどんな役割をそれぞれの機能が担っているのかをざっくりと理解したので、噛み砕いて図解してみることにします。

※　間違っていることを記述している可能性は大いにありますので、その都度ご指摘していただけると助かります。

#リソースが返ってくるまでの流れ
##登場人物
まず登場人物は４つ

- ユーザー ... 利用者
- クライアント ... アプリとか
- 認可サーバー ...　認可に関して管理する窓口
- リソースサーバー ...　データとか商品とか持ってる

<img width="818" alt="スクリーンショット 2019-09-28 11.16.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475098/5788b276-bbd6-5258-9cc7-df279bcff47c.png">
##目的確認
ざっくりいうとこういうことしている。
①ユーザーはリソースサーバーが所持している商品がほしい
②アプリを使えばやり取りできる
③悪意あるユーザーの不正アクセスを防ぐために認可サーバーが認証のやりとりを行ってくれている

##認可フロー
###① 本人確認
前提として、新規登録は済んだ状態とします。
リソースがほしいユーザーに対してまず本人確認としてログインを求めます。
<img width="823" alt="スクリーンショット 2019-09-28 12.03.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475098/d64b11fb-f76b-4a0e-82b6-4ef113713430.png">

###② 権限許可
ユーザーへこのクライアントアプリに権限を与えるか許可を求めます。
<img width="821" alt="スクリーンショット 2019-09-28 12.06.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475098/60fe5d7f-e2aa-ba27-d056-c4f8de0447b8.png">

###③ 認可コードでトークン発行
アクセストークン発行に必要な認可コードを発行します。
（認可コードは有効期限が短いので注意）
認可コードを使用して、アクセストークンを発行します。
同時にリフレッシュトークンも発行します。
<img width="819" alt="スクリーンショット 2019-09-28 12.13.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475098/045fb4cd-3536-ea45-e879-6dae550deb61.png">

###④ 検証後、リソースをもらう
アクセストークンを使用し、検証後、リソースサーバーからリソースをもらう。
<img width="822" alt="スクリーンショット 2019-09-28 18.19.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475098/12c10c99-b759-2909-456d-7bd68519bd43.png">
これでリソースGet
おおまかにいうとこういう仕組みだと思われます。

## リフレッシュトークンについて
※ リフレッシュトークンについて、こちらのページを参考に記述しています。
[OAuth 2.0 コード付与フローを使用して Azure Active Directory Web アプリケーションへアクセスを承認する](https://docs.microsoft.com/ja-jp/azure/active-directory/develop/v1-protocols-oauth-code)

☆ ポイントは２つ

- **アクセストークン**は有効期間が短く、期限が切れた後もリソースにアクセスし続けるためにはトークンを更新する必要があります。
このとき、有効期間が比較的長い**リフレッシュトークン**を使用します。
（いちいち有効期限の短い認可コードを発行しなくてよいということ）

- リフレッシュトークンは、クライアントが既にアクセスを同意されている**すべてのリソースについて有効**です。

<img width="821" alt="スクリーンショット 2019-09-28 17.51.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475098/2b36a5dc-7165-29ab-28c8-0d2dd73c6ed2.png">
リフレッシュトークンの有効期限が切れる、失効する、または目的の操作のための十分な特権がない等の場合はエラーとなります。
その場合、現在のリフレッシュトークンを破棄し、新しい認可コードを要求します。

## アクセストークン検証について
図にはいらなかったのと手順が分かりづらくなりそうだったので省略しましたが、検証が成り立つために、こんな感じのやりとりがあります。
<img width="819" alt="スクリーンショット 2019-09-28 18.30.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475098/d19c35aa-7a68-561f-ebf7-481402a06211.png">
ただ検証方法には、識別子型、内包型、ハイブリット型とやり方が複数あり、そもそも認可サーバーとリソースサーバーを分けていないとか、、
けっこう複雑な仕組みであるので、ざっくりとしたものにしておきます。

現在勉強中です。
詳しくは、こちらの記事を参考に。
[OAuth アクセストークンの実装に関する考察](https://qiita.com/TakahikoKawasaki/items/970548727761f9e02bcd)

#おわりに
仕組みをおおまかに理解したので、アウトプットとしてまとめました。
適切な表現でない部分も多々あると思います。
`OAuth`はやりとりが多いものであるのに難しく書かれたものばかりでイメージがわかず、最初理解に苦しんだので、同じ気持ちの誰かの役に立てばいいなと思ってます。
Azure Backupの通知設定

# AzureBackupでバックアップエラーを通知するために
##概要
AzureBackupでバックアップ実行時の通知設定を行う。

##前提
AzureBackupとは？
https://docs.microsoft.com/ja-jp/azure/backup/
RecoveryServicesの事を指している(と思っている)。

##設定
1.コンテナ作成
そもそもコンテナが無いとバックアップできないので作成。
すべてのサービス→RecoveryServicesコンテナから追加で可能。

2.通知設定
2-1.バックアップアラート選択
1.で作成したコンテナをクリックし以下を選択。
![アラート.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505716/45fee61b-42c2-2b3f-f93d-f2bf6b1d69ab.png)

2-2.通知設定
以下の感じで通知の設定を行う。
![通知.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505716/a9adf66b-bb46-6334-0c34-eb417041bc4d.png)

##制約
・バックアップの開始、終了は通知されない。開始、終了通知をする場合はAzureMonitorを使用する必要がある。

・通知設定で"情報"を選択できるが、今のところ情報アラートは生成されないので無意味。

・一部のエラーは通知されない。

開始、終了までウォッチする必要がある場合はAzureMonitorを利用することを検討する。

##参考
https://docs.microsoft.com/ja-jp/azure/backup/backup-azure-monitoring-built-in-monitor
ロードバランサー要点まとめ

#ELB まとめ
ELBは登録されているターゲットの状態を監視し、トラフィックが正常なターゲットのみルーティングする。不具合ターゲットを検出したら自動で停止する負荷分散サービス。
リスナーを複数設定しておくことでルーティング可能な部分に分散できる。

**ELBのセキュリティグループ**
ALBやCLBにはロードバランサー自身のセキュリティグループ設定がある。これには2つの働きがあり

1、クライアント→ロードバランサーのアクセス制限
2、ロードバランサ→ターゲットのアクセス制限　　　　がある。
NLBの場合、セキュリティグループに対応しないため、ロードバランサーへのアクセス制限が出来ません。さらに、クライアントからターゲットへの直接のアクセスを抑制する手段がない。よって、クライアントから直接ターゲットへアクセスしているのか、NLBを経由して接続しているのかが区別がつかない。
NLBはIPアドレスが**固定**。一度アサインされたIPアドレスは固定されるので、独自ドメインを向ける先はDNS名とIPアドレスの両方が指定できる。Aレコード使用可。
　
ALBおよびCLBはIPアドレスが可変のためクライアントからのアクセスはDNS名を利用する必要があり、DNSで独自ドメインを向ける場合はCNAMEレコードないしALIASレコード(Route53)を設定。


**通信経路**...ALBとCLBはリバースプロキシと書いた通り、行き帰りともにロードバランサ
　　　　    ーを介しクライアントと通信する。
　　　　   **NLB**は、トラフィックの宛先IPをターゲットのIPに書き換えて転送する。
　　　　　　　　よって直接クライアントと通信する形となる。
**AutoScaling**...CPU使用率や時間を基準にサーバ数を一時的に増強して負荷に耐える。
**クロスゾーン負荷分散**…有効なすべてのAZの登録済みターゲットにトラフィックを分散。
「2つのAZがあり、両方にELBを設置。片側に2つのターゲット。もう片側に8つのターゲットがあるとする。クロスゾーン負荷分散が有効な場合、10個すべてに10%の負荷を与える。もしクロスゾーン負荷分散が無効であれば2つのLBに25%ずつ、8個側に6.25%を付与する。」
**Route53により、リクエストが送信できる。**

ELBは有効にした各AZにネットワークインターフェイスを作成し、それを使用して静的IPアドレスを取得する。必要に応じてEIPも使用可能。

**HTTP接続**…クラシックとALBは接続の多重化が使用される。接続の多重化を避ける場合は、HTTPレスポンスのconnection:close ヘッダーを設定してHTTPキープアライブを無効にする。
**CLB**…HTTP/0.9、HTTP/1.0、HTTP/1.1 のプロトコルをフロントエンド接続時使用する。
**ALB**…HTTP/1.0、HTTP/1.1、HTTP/2を使用。こちらもフロントエンド接続時
*HTTP/2*はHTTPSリスナーのみ使用。

CLB,ALB共にバックエンド接続で**HTTP/1.1**を使用する。



##ロードバランサー配置注意点↓
・内部向けかインターネット向けか選択する。
・インターネット向けであればパブリックIPアドレスが必要。
・インターネット向けロードバランサーのDNS名はノードのパブリックIPアドレスにパブリックに解決可能である。
・インターネット向けロードバランサーはクライアントからインターネット経由でリクエストをルーティングできる。
・内部ロードバランサーノードはプライベートIPアドレスのみを持つ。
・内部ロードバランサーのDNS名は、ノードのプライベートipアドレスにパブリックに解決
・インターネット向けも内部向けもプライベートIPアドレスを使用してリクエストをターゲットにルーティングする。よってターゲットは内部またはインターネット向けロードバランサーからリクエストを受信するためのパブリックIPアドレスを必要としない。
・AWS privateLinkを用いることでAWSサービス間のプライベート通信が行える。

※インタネット向け=VPC外と接続する場合
　 内部向け　　　     =VPC内で完結する通信を分散させたいとき。
EclipseでKeycloakをデバッグ開発(セットアップ)

# この記事について
会社の開発中のソフトウェアのログインにKeycloakを使用するというので、セットアップ中に起こった問題とそれらに対するトラブルシューティングを備忘録として残す第一弾です。初心者なので初歩的なコメント多々あります。:wink:
開発環境はmacOS Mojave 10.14.6とEclipseです。

日付: 2019/9/30



## 目次
- [KeycloakとEclipseのインストール](#KeycloakとEclipseのインストール)
- [KeycloakをEclipseにインポート](#KeycloakをEclipseにインポート)
- [ビルド](#ビルド)
- [デバック構成](#デバック構成)



## KeycloakとEclipseのインストール
**Keycloak**
まずは/Users/ユーザー名(以下ユーザー配下)にkeycloakのレポジトリーを以下のコマンドでクローンします。
```$ git clone https://github.com/keycloak/keycloak.git
```
**Eclipse**
[http://mergedoc.osdn.jp/](http://mergedoc.osdn.jp/)
このリンクから最新版のEclipseを選択し、UltimateのFull editionをダウンロードします。



## KeycloakをEclipseにインポート
Eclipseで新規のMavenプロジェクトを作成します。

シンプルなプロジェクトの作成にチェックを入れ、グループIdにKeycloak_server、アーティファクトIdにkeycloakを入力します。

作成したプロジェクトを右クリックしてインポートを選択、先ほどgitからクローンしたkeycloakをインポートします。

そうするとプロジェクトの中身が以下のようになります。

<img width="322" alt="スクリーンショット 2019-09-30 11.46.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504005/d0eeb1c8-a12c-2756-c2c8-aaaa3437a2ce.png">

これでインポートは完了です。





## ビルド
デバッグで動かす前にシェルでビルドします。

ビルドにはJDKとMavenが必要なので入れておいてください。

/Applications/Eclipse_2019-06.app/Contents/workspace/keycloak配下へ行き、以下のコマンドを入力します。(初回のみ)

```
$ mvn install -DskipTests=true
$ cd distribution
$ mvn install
```

これで準備完了

このコマンドでdistributionの中にSNAPSHOTができるので、
SNAPSHOT内のbinから```.standalone.sh```からkeycloakを動かすことも可能。

次からは以下のコマンドでビルド
```mvn -Ddistribution -DskipTests=true -Dmaven.test.skip=true -DskipTestsuite=true clean install```

-DskipTests=trueが無いと気が遠くなるほどテストを繰り返すので飛ばします。





## デバック構成と実行
上のメニューバーに虫の様なロゴがあるので、隣の小さい三角をクリックしてデバッグ構成を開きます。

左のリストの中からMavenビルドを右クリックして新規作成を選択し、以下の様に設定します。

<img width="707" alt="スクリーンショット 2019-09-30 11.53.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504005/abac1f8c-d0e9-6d02-14cf-1813473cdb01.png">


次にJREタブへ行き、VM引数に
```-Dkeycloak.connectionsJpa.url=jdbc:h2:./keycloak;AUTO_SERVER=TRUE -Dmaven.surefire.debug=true```
を入力します。

これによりEclipseでKeycloakを再起動した際に、前回設定した内容が引き継がれるのと、
デバッグする時にログが出力されます。

ここで、実行環境がjava8になっているか確認してください。
Keycloakはjava8じゃないとうまく動きません。(理由は不明:sweat_smile:)

【java8へのダウングレードは以下を参照】
[Macで動かすjavaをjava8へダウングレードする](#https://qiita.com/y-wai/items/73ebe42efe1ab43c7a99)

早速動かしてみましょう
また虫の隣の小さい三角をクリックすると、今度はkeycloak_runが出ているので選択します。

ターミナルで```Started Keycloak (http://localhost:8081/auth) in 25462 ms```と表示されたら起動完了です。


### 参考文献
[Keycloak 開発入門](#https://qiita.com/t-mogi/items/dc13c1c71030fcf84ad6#gui%E3%81%AE%E5%A4%89%E6%9B%B4)




### 備考
デバッグ構成のJREでAUTO_SERVER=TRUEにしましたが、これをすることで極端に起動が遅くなるのでせっかちな人にはおすすめしません:triumph:
Excelでテキストボックス内の文字列を置換するマクロ

現状Excelではテキストボックス内の文字列を置換する機能が備わっていないので、ネットの記事を参考にしてユーザーフォームを使うマクロを作ってみた。

2019/10/14 ユーザーフォーム内の記述をMeキーワードを使用するよう修正しました。

# ユーザーフォーム
こんな感じでユーザーフォームを作る。「置換」ボタンがCommandBotton1、「閉じる」ボタンがCommandBotton2。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480237/d497f9b2-106b-c1df-e3be-9ab28c51f8d4.png)

# コード
コードはこんな感じ。

```VB:
Private Sub CommandButton1_Click()
    Dim xWst As Worksheet
    Dim shps As Shape
    Dim xFindStrs As String
    Dim xReplaces As String
    Dim xValues As String
    
    xFindStrs = Me.TextBox1.Text
    xReplaces = Me.TextBox2.Text
    Set xWst = Application.ActiveSheet
    On Error Resume Next
    For Each shps In xWst.Shapes
        xValues = shps.TextFrame.Characters.Text
        shps.TextFrame.Characters.Text = VBA.Replace(xValues, xFindStrs, xReplaces, 1)
    Next
    Unload Me
End Sub

Private Sub CommandButton2_Click()
    Unload Me
End Sub
```

# ユーザーフォームの呼び出し
標準モジュールでこう。あとはこいつをキーボードショートカットで呼び出せるようにする。

```VB:
Sub TextBoxReplace()
    UserForm1.Show
End Sub
```
【swift4】動画から画像を抜き出したら、向きがおかしい時 ：　AVAssetImageGenerator

swift4
xcode9

動画からサムネイル画像を取り出す時に少しハマった。

```swift

let imageGenerator = AVAssetImageGenerator(asset:asset)
imageGenerator.appliesPreferredTrackTransform = true  // 忘れない！
```

二行目を忘れると、縦動画から画像を取り出しても横向きの画像が生成されてしまった。
RealSense435iファームウェアアップデート

#RealSense435iファームウェアアップデート

Touchdesignerで使おうとしたらファームウェア更新の注意が気になったのでアップデートメモ

##準備
###intel-realsense-dfuのダウンロード
コマンドラインを立ち上げてくれるやつでした
https://dev.intelrealsense.com/docs/firmware-releases
![NoName_2019-9-30_14-19-56_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48015/5bea4794-5b11-38b0-5c35-8b1f48d3f891.png)

###ファームウェアデータのダウンロード
binデータでした
![NoName_2019-9-30_14-19-15_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48015/953a93ba-9e2a-f7e7-231d-42488f156287.png)


##インストール

###intel-realsense-dfu.exe起動でメニュー表示
![NoName_2019-9-30_14-24-55_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48015/96e86828-bffa-bc28-f063-a7b1461213d2.png)

###「1」のカメラ更新を選んでEnter
![NoName_2019-9-30_14-24-21_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48015/846d5116-83ae-99eb-3204-458abe5e3ab7.png)


###「1」のカメラを選択してEnter

![NoName_2019-9-30_14-24-28_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48015/3b5e512e-506e-44e9-d4d1-3d2d287e3201.png)

###ファームウェアデータの場所を入力、コピペで入りました
```
C:\Users\user\Desktop\D400_Series_FW_5_11_11_100
```




##参考サイト
https://www.intel.com/content/dam/support/us/en/documents/emerging-technologies/intel-realsense-technology/FW_Update_for_RealSense_D400_Guide.pdf
二度と迷わない. python3の日本時間現在時刻をワンライナーで取得


毎回調べているのでもう二度と迷いたくない。


```py
from datetime import datetime, timezone, timedelta
date = datetime.now(timezone(timedelta(hours=+9), 'JST')).strftime("%Y%m%d%H%M")

> '201909301427'
```

以上
リマインダー: WatsonのRC/AIM環境への移行期限まで、あと１ケ月です！( as of 2019/9/30)

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/a5b41595-0003-88b4-c03b-50e45d9f181e.png)

# 古いCFベースのWatsonインスタンスは2019/10/30以降、使えなくなります！
(記事執筆時点:2019/09/30)
Watsonユーザーの皆様、お使いのWatsonは既にRC/AIM環境への移行はお済でしょうか? 昨年11月に以下の記事を公開しましたが、その**期限まであと１ケ月**となりました。知らずに期日を迎えて皆様の業務に支障が出ては困りますので、改めての注意喚起をさせていただきます。詳しくは下記の記事をご参照ください。

:newspaper: [【重要】従来型(古い)Watsonインスタンスをお使いの方は来年(2019)の10/30までに新しい環境に移行しないと、たぶん死にます（またはWatsonのRC/IAM移行のお話)](https://qiita.com/ishida330/items/bdfe56a757b7439d3754)

# 但し書き
:triangular_flag_on_post: 当記事の本質は「ベンダー告知の周知」なので、本来はQiitaに投稿するのが不適な点、重々承知しております。とはいえWatson関連の情報収集でQiitaを見ていただいている方も多いようですので、広くお知らせすべきと考え個人的に投稿させていただきます。当該記事は個人レベルで調査したことをまとめたものであり、**ベンダーからの公式の情報ではございません**。
:triangular_flag_on_post: 念のため。当件はパブリック・クラウドの**cfベースのWatsonのインスタンス**が止まるよ、という話です。**IBM Cloudでcf(Cloud Foundry)の環境自体が廃止されるわけでありません**ので、誤解なきよう。

# 移行やってみた

たまたま自身の環境にCFベースのWatsonインスタンスがあったので、移行をしてみました。以下手順例です。

---

![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108535/975212cf-1f5a-54a1-5ad7-0338670eec7d.png)

- 「リソース・リスト」の**Cloud Foundry Services**の下にWatsonのインスタンスがあり、マイグレーションのマーク（矢印と円)が表示されています。

---


![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108535/0fc2601a-3aef-3bc9-2943-872995fd9652.png)

- 同インスタンスを右クリックして「**Migrate**」

---

![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108535/183fa6a8-926d-4537-e269-c979c490f859.png)

- ガイドのパネルが表示されます

---

![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108535/12e9f2cd-ad73-8f82-df02-0af8b75b83d1.png)

- 対象のリソース・グループを選択して「**マイグレーション**」ボタン

---

![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108535/ec65d792-2b34-adaf-5fdc-25e6bcbc1f01.png)

- マイグレーションはすぐに終わりました。うまくいったようです。

---

![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108535/b950084c-a4cd-1bb2-1836-bee9c84d7e83.png)

- 元のCloud Foundryのエントリーはリンクとして残っています。

---

![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108535/7dc974ee-2f03-c002-2a31-ed53960bce73.png)

新しくServicesの下にインスタンスが表示されます。こちらが移行後のRC/AIM対応済のインスタンスです。

---

:triangular_flag_on_post: 移行はこの操作だけ完了すればいいわけではありません。AIM移行に伴いアプリケーションでの認証方式の変更などが必要になる場合もありますので、詳しくは冒頭の記事をご参照ください。皆様が安全に移行できますように！

以上です。
ChainerCVをpipで(Windows10)

メモ程度ですが...

hyper-vで環境作って、
画像解析のライブラリ使うために
入れた。
↓

>pip install chainercv

でうまくいかなかった。|ﾟДﾟ)シ✊💻

VisualStudio(2019)をインストール。

Windows関連にチェック入れた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469293/a25d598a-d323-12dd-0d9b-804de4e858f2.png)

↓
3時間くらいかかる説

ターミナルにて
>pip install chainercv


できました😆
【メモ】QGISでラスタレイヤが表示されない時

## ラスタレイヤが無い？？
プロジェクトを保存して再度開いたときにラスタレイヤだけ表示されない事があり、困っていた。

該当のラスタレイヤを右クリックして「レイヤの領域にズーム」を選択すると実はとんでもない位置にオブジェクトがあり、画面下にはUTMのXY座標値が表示されれている。

## 対処法
このケースでは、該当のラスタレイヤを右クリックして「CRSの設定」->「レイヤのCRSをプロジェクトのCRSに設定」とすることで解決した。
【備忘録】Laravelで学ぶ、依存性

どうもこんにちは！
先日プログラミングスクールを卒業し、11月からの入社に向けて、Laravelをやり始めた者です。
スクールでrailsを使用していた際は、依存性とか全く気にせず全ての処理をコントローラーに書き込んでいたのですが、Laravelをビジネスで使う上では、依存性の注入（DI）という概念が大事になってくるぽいので、
まとめてみようかなと思います。

#依存度を下げる＝機能分割する→変化に強い
ある値が処理の中で何度も登場するときは変数にしておきましょうという話は聞いたことがあると思います。

```Hello.rb
def hello
  puts "こんにちは！田中くん！"
  puts "こんにちは！山田くん！"
  puts "こんにちは！野口くん！"
end
```
ってやるより

```Hello.rb
def hello
  hello= "こんにちは！"
  puts "#{hello}田中くん！"
  puts "#{hello}山田くん！"
  puts "#{hello}野口くん！"
end
```
ってしておいた方が例えば「こんにちは」から「こんばんわ」にしたい時、変更点は一箇所だけだし、修正ミスが起こる可能性も一箇所だけだから低いですよね。あと今回は3つしかputsがないので、あれですけども、例えば１００近く同じ記述があったら、、、って考えるとよく利便性がわかると思います。
変数として処理の外から値を注入することで、値が1つ1つの処理に左右されていない、依存度が低い状態になっています。

#Controllerとかでの話

スクール時代に書いていたContoroller(railsの例)

```rails_controller.rb
class UsersController < ApplicationController

  def index
    if params[:keyword]==""
      @users=[]
    else
      @users = User.where('name LIKE ?', "#{params[:keyword]}%").where.not(name: "#{current_user[:name]}").limit(15)
    end
    respond_to do |format|
      format.json
    end
  end
```

indexの所にどっさり処理が書かれていますよね。

違う言語になるのであれですけど、
Laravelで依存度を低く意識した記述がこんな感じ

```TweetController.php
    public function store(TweetRequest $request)
    {
        TweetService::CreateTweet($request['content']);
        return redirect('/tweet');
    }
```

TweetService::CreateTweetはLaravelのクラスメソッドの書き方で、
別途用意したServiceClassに処理を書いて、それをコントローラー内で呼び出してます。

```TweetService.php
  public static function  CreateTweet($request)
  {
    $content= $request;
    $tweet = new Tweet($content, Auth::id());
    $tweet->save(); //TweetController@storeへ
  }
```

まぁ今はとりあえずはこんな感じで。
11月からの実務を経験して知識補完し次第追記か、別途人にお見せできるレベルの文を書いてみたいと思います。
ゼロから始めるマテリアルズ・インフォマティクス①

#はじめに
仕事で材料開発の研究を行うことになり、それなら機械学習を取り入れた材料開発である**マテリアルズ・インフォマティクス**に取り組みたいと思いました。2019年の現在、機械学習に関する記事や書籍は大量に世の中に出回っていますが、マテリアルズ・インフォマティクスに関するものはまだまだ少ないです。折角なので、自分がこの技術に取り組む過程を記事にしていきたいと思います。

**参考**
Quita:[機械学習でなんとなく材料研究者の気分を味わおう](https://qiita.com/KentoObata/items/7fd8c7527d586dffc329)
書籍  :[マテリアルズ・インフォマティクス-材料開発のための機械学習超入門](https://www.amazon.co.jp/%E3%83%9E%E3%83%86%E3%83%AA%E3%82%A2%E3%83%AB%E3%82%BA%E3%83%BB%E3%82%A4%E3%83%B3%E3%83%95%E3%82%A9%E3%83%9E%E3%83%86%E3%82%A3%E3%82%AF%E3%82%B9-%E6%9D%90%E6%96%99%E9%96%8B%E7%99%BA%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92%E8%B6%85%E5%85%A5%E9%96%80-%E5%B2%A9%E5%B4%8E-%E6%82%A0%E7%9C%9F/dp/4526079863)


#マテリアルズ・インフォマティクスの目的
そもそもマテリアルズ・インフォマティクスの目的ですが、端的に言うと「**ラクしてスゴイ材料を作りたい！！**」だと思います。笑
新しい材料を開発したい場合、先行論文やこれまでの経験、時には勘を頼りに合成に使う素材を決め、何時間もかかる実験を行い、失敗すればまた１からという過程を繰り返すのが普通ですが、これを機械学習によって**成功する可能性の高い素材を予測**したり、**実験結果を早い段階で予測する**ことで実験全体でかかる時間を短縮することが目的になります。


#まずはデータ集めから

機械学習には何よりデータが必要です。マテリアルズ・インフォマティクスで利用するデータは、主に下記の二種類になります。
・実験による測定データ
・計算による解析データ

実験による測定データを用いる場合、それらが研究室に十分に蓄積されていれば良いのですが、機械学習を行うのに十分な量のデータを自前で揃えるのはなかなか大変なのが現状のようです。
計算による解析データというのは、**第一原理計算**という量子力学のシュレーディンガー方程式に則って、物質の電子の運動をコンピューターの力を借りて計算し、計算結果から物質の性質を求めたものです。第一原理計算によって、実際に合成しなくても理論上は物質の性質がわかります。ただしめちゃくちゃ複雑で大きな計算コストが必要になります。

#オープンなデータベースを利用しよう
そもそもマテリアルズ・インフォマティクスの始まりは、2011年に米国のオバマ大統領によって開始されたMaterials Genome Initiative(MGI)と言われています。それ以降、世界中で同様のプロジェクトが立ち上がり始め、多くのオープンな材料データベースが整備されてきました。それらは発表された論文から地道にデータを取得している場合もあれば、第一原理計算によって片っ端からデータを揃えている場合もあります。日本では国立研究開発法人_物質・材料研究機構(NIMS)の[MatNavi](https://mits.nims.go.jp/)がありますが、今回はアメリカのカリフォルニア大学を中心に整備を進めているデータベースである[Materials Project](https://materialsproject.org/)を利用していきます。

#Materials Projectからデータを取得する

**必要なもの**
・python3.X
・Pandas
・pymatgen
・Materials ProjectのAPI


pymatgenは材料データを扱うのに便利なモジュールです。Materials Projectからデータを取得することもできます。
Materials ProjectのAPIは公式サイトからユーザー登録することで取得可能です。

まず、指定した元素の中から二種類を選ぶ組み合わせの化合物のデータを取得していきます。

~~~python3:getElements.py

from pymatgen import MPRester
import itertools
import pandas as pd

API_KEY = 'Your API' # Materials Project の API をここに入れる

#とりあえず第二周期まで。希ガスは省略
symbols = ["H", "Li", "Be", "B", "C", "N", "O", "F"]

#8種の元素から二種を選ぶ組み合わせ　C(8,2)=28組み
Comb_2 = itertools.combinations(symbols, 2) 

with MPRester(API_KEY) as m:

    df_COM = pd.DataFrame()

    for elements in Comb_2:
        
        compound = m.get_data(elements[0]+'-'+elements[1] , data_type='vasp')
        df_com = pd.DataFrame(compound)           
        df_COM = df_COM.append(df_com)

#結果を保存
df_COM.to_csv('compound_2.csv')
~~~

df_COMの要素数を調べると

~~~
df_COM.shape
>>(302, 28)
~~~

10種の元素から２個を選ぶ組み合わせから、302個の化合物の28項目に関するデータが取得できたようです。
３００個もあるのは、一酸化炭素COと二酸化炭素CO2のような元素が同じで組成比が異なる化合物が大量にあるからですね。


次回は取得したデータの中身を読み解いていこうと思います。
スターリンソートよりも速いO(1)のソート

#はじめに
みなさん、スターリンソートはご存じですね？

以下のツイートが有名でしょう。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">ソートされていない要素を粛清することでO(N)でソートできるスターリンソートとかいうのを見て爆笑してる</p>&mdash; やんぎん (@4116You) <a href="https://twitter.com/4116You/status/1155619860027547648?ref_src=twsrc%5Etfw">July 28, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


Qiitaの記事では

計算量O(n)の画期的なソートアルゴリズムであるスターリンソートをHaskell で実装してみた #Haskell
https://qiita.com/Tatsuki-I/items/380d6bd06515b872b2b2
や
計算量O(n)で噂のスターリンソートを実装してみた
https://qiita.com/MeilCli/items/721526d716851e92192a

などが有名ですね。
しかし、これでもまだ`O(n)`にしかなっていません。**我々が目指すべきは`O(1)`のアルゴリズムです。**
そこで、次のようなアルゴリズムを提案します。

#アルゴリズム

アルゴリズムは簡単。

**いかなる入力に対しても、あらかじめ用意したソート済み配列（リスト）を返す。**

これだけです。これなら問題なく`O(1)`を達成できますね。

#実装

では早速実装していきましょう
まずはRubyから

```sort.rb
module Mod
  SORTED = (1..10).to_a
  def sort(arr)
    SORTED
  end
end  
```

```result.rb
> sort([1, 2, 3])
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
```

続いてC#

```sort.cs
namespace MySort {
  public static class MySort {

    public static readonly int[] Sorted = Enumerable.Range(1, 10).ToArray();
    public static int[] Sort(int[] arr)
    {
      return Sorted;
    }
  }
}
```

```result.cs
> MySort.Sort(new int[] { 1, 2, 3 })
int[10] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }
```

最後にHaskell
これだけ空リストが来たときだけはお情けで空リストを返すようにしてあります

```sort.hs
module MySort where

sort    :: [Int] -> [Int]
sort [] = []
sort xs = [1 .. 10]
```

```result.hs
> sort [1, 2, 3]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
```

#まとめ

スターリンソートよりも高速なソートアルゴリズムを提案しました（ソートできるとは言ってない）
問題は名前ですが、「真実を握りつぶしあらかじめ決められた情報を流す」というイメージから

**大本営発表ソート**

なんてどうでしょう。大本営発表を英語にすると "Imperial Headquarters announcement" なのですが、長いので "Propaganda Sort" (プロパガンダソート) とかでもいいと思います。
ブラウザでJSONを見る時に、レイアウト整形してテーマ当てて見やすくするJSONViewが開発体験を想像以上に向上させた件

## DL;TL
ただ単にchrome拡張の [JSONView](https://chrome.google.com/webstore/detail/jsonview/chklaanhfefbnpoihckbnefhakgolnmc) を入れるとブラウザでJSONが見やすくなりますという話で、
記事的な価値は **僕が使っているバックグラウンドのcssスタイル** を貼るのでコピペして使ってみて！というところです。
所要時間1分。

---

## 前置き

API開発をしている時にターミナルでcurlするのもいいですが、grepなどの他のシェルコマンドと組み合わせるなどの目的がない場合は開発体験が決してよいものではありません。

ブラウザで表示するなら自動でリクエストヘッダーも付けてくれますし、他のchrome拡張との組み合わせもできるため飛躍的に扱いやすくなります。

JSONのレスポンスを整形して見やすくしたいと思ったのでchrome拡張を探したところ、自分でスタイルシートをいじれる[JSONView](https://chrome.google.com/webstore/detail/jsonview/chklaanhfefbnpoihckbnefhakgolnmc)を採用することにりました。


## 手順
こちらからchrome拡張を入れます。
[JSONView](https://chrome.google.com/webstore/detail/jsonview/chklaanhfefbnpoihckbnefhakgolnmc)

**サイトデータの読み取りと変更を行います ▶** の **拡張機能をクリックした時** を選択してもう使えます。
![スクリーンショット 2019-09-30 13.36.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119201/1f144c9c-1616-0d32-6f8e-328a12071f20.png)

## スタイルをいじりたい時

入れたら、 **拡張機能を管理** をクリックして
![スクリーンショット 2019-09-30 13.31.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119201/0829bd49-77db-772e-a1c7-30e2e5a5d982.png)

**Build custom theme with style editor** の **open** をクリックしてスタイル
![スクリーンショット 2019-09-30 13.32.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119201/5216dc6e-d969-e170-4cc8-e5e9ec8f865d.png)

この画面でスタイルを書き換えて **Save** すればOKです。
![スクリーンショット 2019-09-30 13.32.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119201/0607bcb6-1a0b-2922-73f5-59dd9b8c1ef3.png)


デフォルトでは白背景にスタイルがあたってますが、僕は眩しい画面だと辛いのでオリジナルのDark Themeを作成しました。
貼っておきますのでそのままコピペして使っても結構です。


```css

body {
  white-space: pre;
  font-family: monospace;
  background-color: #000;
  color: #eac;
}

.property {
  font-weight: bold;
}

.type-null {
  color: #f77;
}

.type-boolean {
  color: #4df;
}

.type-number {
  color: #cc2;
}

.type-string {
  color: #5c5;
}

.callback-function {
  color: gray;
}

.collapser:after {
  content: "-";
}

.collapsed > .collapser:after {
  content: "+";
}

.ellipsis:after {
  content: " … ";
}

.collapsible {
  margin-left: 2em;
}

.hoverable {
  padding-top: 1px;
  padding-bottom: 1px;
  padding-left: 2px;
  padding-right: 2px;
  border-radius: 2px;
}

.hovered {
  background-color: #345;  
}

.collapser {
  padding-right: 6px;
  padding-left: 6px;
}
a {
  color: #77aaee
}
```


以下スタイル付けにおける可読性と意味に沿ったこだわりポイント
integerは数値は1,2などの小さい数値でも目立つように明るめのイエロー
booleanは明るめのブルー
リンクはリンクだとわかればURLは重要ではないので、くすんだブルーで下線
nullはちょっと明るめのvividなピンク

そこそこ見やすいと思います。


気に入っていただけましたら **いいね** いただけると励みになります。