OmniAICreator/Qiita-1.07M huggingface dataset:
Javascript/JQueryでformから値を取得する方法

# Javascript/JQueryでformから値を取得する方法


```test.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
	<form id="formId" name="formName" method="post" action="FortuneAction">
		<label>
		    メール：
			<input type="text" name="mail" value="xxxxx@xxxx.xxx" size="20" />
			名前：
			<input type="text" name="name" value="yamada taro" size="20" />
		</label>
		<button type="button" onclick="jsMethodP1(formId)">submit p1</button>
                <button type="button" onclick="jsMethodP2(formName)">submit p2</button>
                <button type="button" onclick="jsMethodP3()">submit p3</button>
                <button type="button" onclick="jsMethodP4()">submit p4</button>
                <button type="button" onclick="jsMethodP5()">submit p5</button>
                <button type="button" onclick="jsMethodP6()">submit p6</button>
	</form>
</body>
    <script src="https://code.jquery.com/jquery-3.0.0.min.js"></script>
    <script>
	    var jsMethodP1 = function(f){
	    	console.log('pattern1 = ' + $(f).serialize());//id属性から取得
	    }
	    var jsMethodP2 = function(f){
	    	console.log('pattern2 = ' + $(f).serialize());//name属性から取得
	    }
	    var jsMethodP3 = function(){
	    	console.log('pattern3 = ' + $('form').serialize());//form要素から取得
	    }
	    var jsMethodP4 = function(){
	    	console.log('pattern4 = ' + $('#formId').serialize());//id属性から取得
	    }
        var jsMethodP5 = function(){
	    	console.log('pattern5 = ' + $(document.forms.formName).serialize());//name属性から取得
	    }
        var jsMethodP6 = function(){
	    	console.log('pattern6 = ' + $(document.formName).serialize());//name属性から取得
	    }
    </script>
</html>
```

```console:コンソール
pattern1 = mail=xxxxx%40xxxx.xxx&name=yamada%20taro
pattern2 = mail=xxxxx%40xxxx.xxx&name=yamada%20taro
pattern3 = mail=xxxxx%40xxxx.xxx&name=yamada%20taro
pattern4 = mail=xxxxx%40xxxx.xxx&name=yamada%20taro
pattern5 = mail=xxxxx%40xxxx.xxx&name=yamada%20taro
pattern6 = mail=xxxxx%40xxxx.xxx&name=yamada%20taro
```
[Python] importする別の方法

ファイルが存在しているか不明で、importを利用せず別module内の関数を使用したい場合があります。

アドオン的に別moduleから決まった関数を呼び出せます。下記の例は、machnery_test.pyからimp.pyををインポートして、test_func()を使用する例です。

machnery_test.py

```python
from importlib import machinery
import os

filename = '{}/imp.py'.format(os.path.dirname(__file__))

loader = machinery.SourceFileLoader('filename', filename)
module = loader.load_module()

print(module.test_func())
```

同じフォルダ内のimp.py

```python
def test_func():
    print('Test function')
    return 'Result from test_func'
```

出力

```python
Test function
Result from test_func
```
AWS Amplify API作成

amplify push をしたらエラーが発生。
[この記事](https://qiita.com/jre233kei/items/b30e2795e975311cb936)を参考に問題を解決しました。

しかし、amplify add apiで別のエラーに引っかかる。

```
MacBook-Air:ampIAM ****$ amplify add api
? Please select from one of the below mentioned services: GraphQL
SyntaxError: Unexpected identifier
    at serviceQuestions (/Users/******/.npm-global/lib/node_modules/@aws-amplify/cli/node_modules/amplify-category-api/provider-utils/awscloudformation/index.js:13:10)
    at Object.addResource (/Users/******/.npm-global/lib/node_modules/@aws-amplify/cli/node_modules/amplify-category-api/provider-utils/awscloudformation/index.js:54:10)
    at /Users/******/.npm-global/lib/node_modules/@aws-amplify/cli/node_modules/amplify-category-api/commands/api/add.js:24:35
    at processTicksAndRejections (internal/process/task_queues.js:89:5)
    at async Object.executeAmplifyCommand (/Users/******/.npm-global/lib/node_modules/@aws-amplify/cli/node_modules/amplify-category-api/index.js:176:3)
There was an error adding the API resource
```

とのことなので、とりあえずNode.jsの更新を行います。

```
$ npm install -g n
$ n --stable
$ n --latest
$ n latest
```


sudoを求められた場合は、npm install -g nの実行結果にあるnのフルパスを使って下記のように書くと実行できます。



```
sudo フルパス latest
```

再度apiを作成。

```
✔ Generated GraphQL operations successfully and saved at graphql
✔ Code generated successfully and saved in file API.swift
✔ All resources are updated in the cloud
```
うまくいきました！


@aws-amplify/cliのアップデートを行った際は、対応のバージョンにnpm及びNode.jsのアップデートが必要になるようです。
DjangoでWebサイトを立ち上げてみる。Part3〜Templateの作成〜

#この投稿について
学習しながらの作業を進めておりますので、作業進捗の備忘録、学習効果の向上を目的として記録していきます。

#開発環境
* macOS High Sierra 10.13.6
* Anaconda 3
* Python 3.7.7
* Djnago 3.0.6
* VisualStudioCode

#テンプレートとは
本来、HTMLファイル上にPythonコードを記述することはできませんが、Djangoのテンプレートシステムを活用することで、静的なHTMLに動的なPythonコードを記述することができます。
テンプレートタグを使用したコンテンツの表示等をはじめ、各ページのHTMLの共通部分（ナビゲーションバーなど）の記述をテンプレート（ひな形）として作成しておくことができます。
これを上手に活用することにより、HTMLの開発やメンテナンスが楽ちんになります。


#templatesフォルダの作成
今回はアプリケーションフォルダ（first_app）の直下にtemplatesフォルダを作成します。


#settings.pyの編集
templatesフォルダの存在をsettings.pyに記述します。

```py:first_project/settings.py
import os

# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
TEMPLATES_DIR = os.path.join(BASE_DIR,'first_app/templates')#追加

##################################

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [TEMPLATES_DIR,],#追加
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]
```

#テンプレートとなるhtmlファイルを作成
templatesフォルダ内に`base.html`を作成し、以下のように記述。

```html:templates/base.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>First App</title>
</head>
<body>
    <h1>Hello this is base.html!</h1>
    {% block bodyblock %}
    {% endblock %}
</body>
</html>
```
`{% block bodyblock %}{% endblock %}`という記述がありますが、このブロックタグで囲まれた部分が自由にHTMLの記述を挿入できる箇所になります。

例えば`index.html`を作成し、以下のように書きます。
```html:templates/index.html
{% extends 'base.html' %}

{% block bodyblock %}
<h1>{{ insert_me }}</h1>
{% endblock %}
```
`{% extends 'base.html' %}`の記述により`base.html`の記述を読み込んでいます。
また、ブロックタグ内に`<h1>{{ insert_me }}</h1>`と記述したものが、
`base.html`のブロックタグ内に挿入されて表示されることになります。



#views.pyファイルを編集
先ほど作成した`index.html`内に
views.pyに処理を記述することで、`{{}}`に囲まれた箇所に指定したレスポンスを返すことができます。
以下のコードでは`{{}}`タグにつけた名前`insert_me`の部分を`'Hello I am from views.py!'`と置き換えるよう記述されています。
置き換える対象については辞書型にまとめることができるみたいです。
`return render()`の部分で、index.htmlにたいして置き換えの処理を行ない、htmlを生成しています。

```py:first_project/first_app/views.py
from django.shortcuts import render
from django.http import HttpResponse

# Create your views here.

def index(request):
    #return HttpResponse('Hello World!!')
    my_dict = {'insert_me':'Hello I am from views.py!'}
    return render(request,'index.html',context=my_dict)
```

#サーバーを立ち上げて動作確認
```terminal:first_project/
python3 manage.py runserver
```
エラーが出る場合はPythonのバージョンが古い場合があります。
その場合はpython3のコマンドで実行するとうまくいきました。

http://127.0.0.1:8000/
にアクセスし、
`Hello this is base.html!`
`Hello I am from views.py!`
と表示されていればOK

#手順
１　templatesフォルダ作成
２　settings.pyにtemplatesフォルダを登録
３　templatesフォルダ内にテンプレート（HTML）を作成
４　views.pyにtemplateに処理を記述
【Mac / Windows】localhostでサーバーを立ち上げる際に立ち上がらない

**【状況】**
ローカルサーバー`(localhost:8080)`を立ち上げる際立ち上がらない！
特にエラーも吐かれていない！

**【原因】**
すでに立ち上げようとしているポート`8080`がLISTENされている可能性がある！

## Mac の場合

**【解決策】**

下記コマンドでLISTENされているポートとプロセス番号を確認する！

```bash
$ sudo lsof -i -P | grep "LISTEN"
java        998           miki  157u  IPv6 0x78963e449976890f      0t0    TCP localhost:8080 (LISTEN)
Code\x20H 24811           miki   38u  IPv4 0x78963e44c014124f      0t0    TCP localhost:38275 (LISTEN)
Code\x20H 27337           miki   38u  IPv4 0x78963e44c00d024f      0t0    TCP localhost:5023 (LISTEN)
Code\x20H 33904           miki   37u  IPv4 0x78963e44b07dfbcf      0t0    TCP localhost:13863 (LISTEN)
node      34867           miki   25u  IPv6 0x78963e449976a5cf      0t0    TCP *:6006 (LISTEN)
```

やはり`8080`がすでに立ち上がっている！！

下記コマンドで解放したいポートのプロセスをkillします。

```bash
$ kill -9 998
```

これで`8080`を使えるようになりました。

```bash
$ sudo lsof -i -P | grep "LISTEN"
Code\x20H 24811           miki   38u  IPv4 0x78963e44c014124f      0t0    TCP localhost:38275 (LISTEN)
Code\x20H 27337           miki   38u  IPv4 0x78963e44c00d024f      0t0    TCP localhost:5023 (LISTEN)
Code\x20H 33904           miki   37u  IPv4 0x78963e44b07dfbcf      0t0    TCP localhost:13863 (LISTEN)
node      34867           miki   25u  IPv6 0x78963e449976a5cf      0t0    TCP *:6006 (LISTEN)
```

【参考】
https://qiita.com/yokozawa/items/dbcb3b31f9308e4dcefc


## Windows の場合

**【解決策】**

下記コマンドでLISTENされているポートとプロセス番号を確認する！

```bash
$ netstat -nao
 TCP         0.0.0.0:80             0.0.0.0:0              LISTENING       65652
 TCP         0.0.0.0:2179           0.0.0.0:0              LISTENING       19892
 TCP         0.0.0.0:3306           0.0.0.0:0              LISTENING       65652
 TCP         0.0.0.0:3380           0.0.0.0:0              LISTENING       65652
 TCP         0.0.0.0:5040           0.0.0.0:0              LISTENING       39864
```

下記コマンドで解放したいポートのプロセスをkillします。

```bash
 taskkill /F /PID 65652
```

これで`8080`を使えるようになりました。

```bash
$ netstat -nao
 TCP         0.0.0.0:2179           0.0.0.0:0              LISTENING       19892
 TCP         0.0.0.0:3306           0.0.0.0:0              LISTENING       65652
 TCP         0.0.0.0:3380           0.0.0.0:0              LISTENING       65652
 TCP         0.0.0.0:5040           0.0.0.0:0              LISTENING       39864
```
AtCoder キーエンスプログラミングコンテスト2020 問題B 貪欲法についてメモ

# 概要
[AtCoder キーエンスプログラミングコンテスト2020](https://atcoder.jp/contests/keyence2020)に参加して、 [問題B](https://atcoder.jp/contests/keyence2020/tasks/keyence2020_b)をDPで解こうとしたがTLEなどが出て撃沈、問題A/Cしか解けずに点数がいまいちだった。

問題Bについて正解者の提出を見ていると「貪欲法」で簡単に解けることが判明。自分でも書いてみたら一瞬で終わって愕然（[提出#9585045](https://atcoder.jp/contests/keyence2020/submissions/9585045)）。

「プログラミングコンテストチャレンジブック（第２版）」(以下「蟻本」)）でも「貪欲法」はみていて、「そういうのがあるのね。でも解の厳密性が納得いかんなぁ。どういうときならOKかよくわからん」と放置していた。しかし今回のようなケースで点数をおとしていてはいかんので自分なりに今回のケースで貪欲法で解の厳密性が保証されているのか、考えてみた。

結論としては今回のケースでは貪欲ほうで解いても解の厳密性は保証されることに納得ができた。

#経緯
貪欲法で解く場合 X_i + L_i ロボットをソートして、その順番で
- すでに使うと決めたロボットと、腕が動く範囲が共通部分を持たなければ使うと決定する。
- すでに使うと決めたロボットと、腕が動く範囲が共通部分を持てば使わないと決定する。
を判別するだけである。超簡単。

ただこれだと。「ロボットiを使わない方がよい場合が最適化になる場合があるかもしれない、なんでこの方法で最適解がもとまると保証できるのか？」ということが直感的に咀嚼できなかった。

「蟻本」 P.45にも以下のような記載がある。
![greedy.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487301/dada89b3-ec34-25fd-013b-fd9ed9abf27b.png)
本のこの部分を読んだ時は、「うーんどういう時に貪欲法を安心して使えるか、よくわからんな。まぁいいかぁ」と思いスルーしていた。しかし、今回の問題は「蟻本」のP.43にある区間スケジューリング問題と実質的には全く同じ。ここでちゃんと理解していれば簡単に解けていた問題と思われる。

# 考察
なのでこの場合貪欲法で最適解が必ず求まるか考えてみた。結論としては最適解が必ず求まることは確認はできた。しかし考えるの結構面倒臭い。

添字が多くQiitaの書式では書ききれないのでOverleafで作成してPDFにしてみた。
![greedy-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487301/f5c2665c-a0b9-b49f-73a5-b99e99464672.png)

![greedy-02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487301/46b8e9da-044a-9a65-ebda-29d8f2a08bad.png)

![greedy-03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487301/0ef93aa7-e76a-dcb1-45d4-321606656860.png)

![greedy-04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487301/39394655-9f7b-af04-c93e-500269716c54.png)

![greedy-05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487301/6fc5bb41-f413-4549-5036-ecec82725981.png)

![greedy-06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487301/7a19d8ab-6755-72f8-4528-3795a1dd691f.png)


次回同じパターンなら安心して使えるが、違うパターンで貪欲法で出来そうな時に
解法として正しいか、正しくないのか確信をもって短時間に判断できるか不安がのこる。まだまだ修業が必要。
WindowsラップトップでWeb系開発

## はじめに ##

Web系の開発マシンといえばMacというくらいMacが普及しました。

私もMacを長期間あいようしていますが、Macを使い始めた理由は「安定したLinuxライクなラップトップが欲しいから」です。Macに対するこだわりはなく**Terminal**,**Linuxのコマンドツール群**,**Officeなどメジャーなツール**,**Docker**が使用できれば問題ありません。仕事ではMac、自宅ではUbuntuも両方つかってきてきたのですが、どちらも一長一短だなと感じ始めたので新しい刺激がほしくなりました。

Windowsが代替にならないかと情報収集していたら、昨年の中頃にWSL2がPreviewとして登場し、年の後半にはDockerがWSL2対応しました。
ツールが豊富なWindows機で、LinuxライクなことができてDockerも使えます これなら実用に耐えうるのでは？と思い早速X1Carbonを買って使い勝手をたしかめて見ました。

### WSL2 ###

- まだPreviewですが、大きな不具合はなさそうです。Windows上でここまでできるのか！ってくらい便利で速いくて快適です
- 
ttyが少し残念です。vimで日本語編集するならwsltty一択になります。wslttyは以外は、編集中に日本語が崩れます

- WindowsTerminalが一番良いでしょう。レンダリング、カスタマイズ性、タブ、高速・高機能です。
   - ただしvimのpluginのlightlineでlineinforを表示すると、編集箇所とlightlineの列番号が同時にレンダリングされて日本語表示がくずれます。
   - CJKの対応がやや弱いですが、pluginの設定で回避できるので良しとします
- wslttyは完璧に日本語環境に対応しています。
    - 起動したモニタの拡大率でフォントの表示サイズが決まるため、ラップトップのモニタで起動して他のモニタに移動するとフォントが異常に小さくなったり大きくなったりするのが欠点です
- Win-WSL間でクリップボードを共有するためには、win32yank.exeを使用して連携しないといけません。連携の設定がやや不便ですね。

### Docker Desktop WSL2 ###

[![Image from Gyazo](https://i.gyazo.com/5d9d1f488ebe11e685fcd0feb83d648f.png)](https://gyazo.com/5d9d1f488ebe11e685fcd0feb83d648f)

- wsl上でdockerを動かすことでWindowsでもdockerをnativeで使えるようになりました。
- Docker Desktopをインストールするためには、今のところWindows 10 Proが必要です。(いずれHomeにも対応するらしい)
- まだTechnical Previewなのですごく不安定です。ある日突然、動かなくなったりアンインストール・インストールを繰り返すと治ったり、まだ仕事に使うのは難しい。

### 仮想デスクトップ ###

[![Image from Gyazo](https://i.gyazo.com/291b8fd9183c40507dea09492561f009.gif)](https://gyazo.com/291b8fd9183c40507dea09492561f009)

- Windowも標準で仮想デスクトップがつかえるようになりました.Macと異なり全モニタが切り替わります。これは致命的に不便です。
- Macはモニタごとに独立してンダリングしているからか？同じモニタと同じ枚数を使っていてもWindowsと比べてレンダリングがスムーズです。

### トラックパッド ###

- Windowsのトラックパッドも昔と比べたら格段によくなったともいます
- それでもMacにはまったく勝てないです。Macは感度の加減、操作性の良さ凄まじい。

### VSCode ###

[![Image from Gyazo](https://i.gyazo.com/3bf95dbd694af6ad82c76a702d3469fc.png)](https://gyazo.com/3bf95dbd694af6ad82c76a702d3469fc)

- 問題なくつかえます
- WSL2につなげに行くため起動が遅いです。
- VSCodeを複数起動するとWSL2への負荷がどんどん増えていきもっさりします(serverプロセスを都度立ち上げている？)
- 大量のファイルを置換すると固まります

### Office/Slack/Dropbox/etc ###

- さすがWindows。まったくこまりません。
- Ubuntuをつかっていて一番つらかったのはこのあたり. Officeはズレる、Dropboxはスマートシンクが使えない。というか公式ツールがあればラッキー程度なので仕方がない


## まとめ ##

仕事でバリバリ使うにはまだ早いかなと思います。お仕事はもうしばらくMacです。

それぞれのOSの良いところ・気に入らないところをまとめておきます

### Mac ###

良いところ

- 豊富なツール
- MissionControlが神
- MS Officeが動く
- iTerm2という最強ターミナル
- CtrlとCmdキーの使い分けるができて便利
- トラックパッドの精度が神がかっている

気に入らないところ

- 性能のわりに高い
- 負荷をかけるとDockerがよく落ちる
- 開発環境を整えるとき、わざわざXCodeをインストールしないといけない

### Ubuntu ###

 良いところ

- OS無料
- Dockerがネイティブ動作する
- Gnome Terminalもなかなか優秀
- 開発環境セットアップが楽
- なんでもカスタマイズできる(要 頑張り)

気に入らないところ

- 不安定
- Officeが開けない(仕事では致命的)
- 情報源は基本英語
- Desktopユーザー向けの情報がすくなめ
- 細かいところを気にしだすと要頑張りが強いられる

### Windows ###

良いところ

- 豊富なツール
- 圧倒的情報量
- WindowsProならDockerがネイティブ動作する
- WSL2はまじLinux

気に入らないところ

- VSCodeのWSL2接続はもっさり
- WSL2関連はTechnical Previewなので不安定
- ターミナルエミュレータがwsltty一択だけどwslttyはそこまで高機能ではない
- フォント汚い‥
- MissionControlとくらべてマルチタスク使いにくい
- トラックパッドの精度がイマイチ
PostgreSQLを動かす

個人的メモです。

# PostgreSQLサーバを走らせる

```
$ brew services | rg postgres
postgresql@14 none        

$ brew services start postgresql@14

```

# シェルでの操作

```
# ユーザを作る
$ createuser <user名>

# DBを作る
$ createdb -O <ownerのuser>  <db名>

# デフォルトのDBのインタラクティブシェルに入る
$ psql -d postgres

# DB指定してインタラクティブシェルに入る
$ psql -d <接続先のdb名>　-U <接続するuser名>
```
* デフォルトのsuperuserの名前は`postgres`

# PostgreSQLインタラクティブシェルにて
スーパユーザでとログインすると`db1=#`, その他ユーザだと`db1=>`が表示されているはず。

```
# db1を使用(MySQLでいうUSE)
\connect データベース名

# データベース一覧
db1=>\l

# スキーマ一覧
db1=>\dn

# ユーザ一覧
db1=>\du
db1=>select * from pg_user;

#　現在のDBのテーブル一覧 (全スキーマの)
db1=>\dt

# テーブル作成
# スキーマを明示的に指定しないと、publicスキーマ内に作られる模様。
db1=>CREATE TABLE new_table(....);

# テーブル詳細
db1=>\d <table名>;

# テーブル削除
db1=>DROP TABLE <table名>;

# userのパスワード変更
db1=>\password
db1=>\password <user名>

# userに権限を与える
=# ALTER USER <user名> CREATEDB

# DBを削除する
=# DROP DATABASE "<DB名>";

# テーブルのスキーマを見る
=>\d <table名>
```

権限回りの操作は以下。

```
# それぞれのuserの権限を確認する
t-# \du

# super userの権限を与える
=# ALTER USER some_user WITH Superuser;

```
UnityでUnityちゃん3Dモデルを動かす（2020年版）

#概要
Unityちゃん3Dモデルを動かそうとしたらよく解らないバグが出て
すんなりいかなかったのでメモを残します。
Unityバージョン：2018.4.14f1 Personal
Unityちゃん3Dモデルバージョン：1.2.1


#本文
１．
最新のUnity本体（Unity Hub）をダウンロードする
https://unity3d.com/jp/get-unity/update
Unity Hubバージョン 2019.2.18


２．
Unityを起動して新規プロジェクト（3D）を作成する


３．
何も追加していない状態で再生ボタン（Play)を押す。
→Game画面に切り替わる
※切り替わったらもう一時再生ボタンをおしてScene画面に戻します。
![01.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/85572/8a70b014-8b52-a8ba-adf2-c3f8814bf1b1.png)
![02.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/85572/12a77232-17e7-c979-65d0-caad60d318f3.png)


４．
「Unityちゃん3Dモデルデータ」をダウンロードする。
https://unity-chan.com/download/index.php
バージョン 1.2.1

５．
ダウンロードしたUnityちゃんのデータ（UnityChan_1_2_1.unitypackage）を
Assetsフォルダにドラッグアンドドロップする。
→確認画面が出たら「import」を押す。
![03.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/85572/75625bf5-743e-a1db-2862-82a645a8c36b.png)
![04.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/85572/df5e4032-8295-e675-6762-6e13af78f57e.png)



６．
importが終わった後に再生ボタン（Play)を押すと、
「All compiler errors have to be fixed before you can enter playmode!」
のエラーが表示される。
![05.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/85572/261223cf-59f0-b1d1-1b6a-4656e3011d9d.png)


７．
Console の画面で赤い警告ボタンを押すと、エラーの詳細が表示される。
「Assets\UnityChan\Scripts\AutoBlink.cs(8,23): error CS0234: The type or namespace name 'Policy' does not exist in the namespace 'System.Security' (are you missing an assembly reference?)」
また、エラーメッセージをダブルクリックすると、エラーとなっているソースコードが開く。
![05b.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/85572/b0cfb49b-6a5c-dba1-331b-8b939d25b6e5.png)



８．
'Policy'がないと言われているので、
using System.Security.Policy;
をコメントアウトして保存します。


変更前

```cs
//
//AutoBlink.cs
//オート目パチスクリプト
//2014/06/23 N.Kobayashi
//
using UnityEngine;
using System.Collections;
using System.Security.Policy;

namespace UnityChan
{
```

変更後

```cs
//
//AutoBlink.cs
//オート目パチスクリプト
//2014/06/23 N.Kobayashi
//
using UnityEngine;
using System.Collections;
//using System.Security.Policy;

namespace UnityChan
{
```

９．
再生ボタン（Play)を押すと、Game画面に切り替わる。

１０．
Unityちゃんを追加します。
Assets > UnityChan > Prefabs > for Locomotion
の中にある
unitychan.prefab
をScene画面にラッグアンドドロップする。
![06.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/85572/c3bfce5b-bbce-f1ed-416d-71f33e9891ab.png)

１１．
再生ボタン（Play)を押すと、Game画面に切り替わる。
が、Unityちゃんが落下してどこかに行ってしまう。
![07a.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/85572/37f2f3e5-ba05-5c06-1183-bfc377d710fe.png)


１２．
床を作ります。
Scene画面で
Create > 3D Object > Planeを選択する。
![07.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/85572/e4b58883-f07b-126c-93a7-dc472955d7d5.png)


１３．
Unityちゃんが落ちなくなる。
Game画面内にある Interactionにある通り、動かすこともできる。
※方向キーの上で前進するバイオハザード方式
![08.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/85572/c1f195cd-d348-9755-e5a2-2927930b3162.png)


以上です。お疲れ様でした！


#参考ページ
【2019】UNITY-CHAN（ユニティちゃん）を最速で動かす具体的な方法
https://miyagame.net/unity-chan-move/
Reactでの条件分岐 4つの方法のメモ

# はじめに
Reactでの条件付きレンダリングの方法のメモです。

## 目次
1. returnするJSXを分岐
2. 変数にJSXを格納
3. もう少し短く!!
4. これで最後!!
5. まとめ

### 1. returnするJSXを分岐

stateを条件に、判定してJSXをそのままreturnしてあげる方式

```jsx
import React, { Component } from 'react'

export default class Greeting extends Component {

    constructor(props) {
        super(props);
        this.state = {
            isMorning: true
        };
    }
    render() {
        if (this.state.isMorning) {

            return <h2> Good Morning Tom</h2>

        } else {

            return <h2> Hye ! Tom </h2>

        }

    }
}
```

### 2. 変数にJSXを格納

変数にJSXを格納することで、returnの箇所が1つになりました。

```jsx
import React, { Component } from 'react'

export default class Greeting extends Component {

    constructor(props) {
        super(props);
        this.state = {
            isMorning: false
        };
    }
    render() {
        let message

        if (this.state.isMorning) {

            message = <h2> Good Morning Tom</h2>

        } else {

            message = <h2> Hye ! Tom </h2>

        }

        return <div>{message}</div>

    }
}
```

### 3. もう少し短く!!

もう少し短く書けます
`条件式 ? (trueの時) : (falseの時)`

```jsx
import React, { Component } from 'react'

export default class Greeting extends Component {

    constructor(props) {
        super(props);
        this.state = {
            isMorning: true
        };
    }
    render() {
        return (this.state.isMorning ?<h2> Good Morning Tom</h2> :<h2> Hye ! Tom </h2>)
    }
}
```

### 4.これで最後!!

falseの時に、何も表示させない時とかは
`条件式 && (trueの時)`
みたいに書ける

条件式が評価されて、trueなら次に行くので
条件式がfalseなら次に行かずに何も返さない

```jsx
import React, { Component } from 'react'

export default class Greeting extends Component {

    constructor(props) {
        super(props);
        this.state = {
            isMorning: true
        };
    }
    render() {
        return (this.state.isMorning && <h2> Good Morning Tom</h2>)
    }
}
```

### 5. まとめ
4つのパターンを見ましたが、最後の2つがシンプルかなと思います。
ありがとうございました。
CSSによる上下と左右の中央寄せ

<h1>CSSによる上下や左右の中央寄せの種類</h1>

<b>・左右の中央揃え</b>
１.text-align:center
　〇中身のテキストや画像といったインライン要素の中央寄せ
　☓ブロック要素はできない
　　セレクタはブロック要素である親要素を指定する。

２.margin: 0 auto;　margin-right:auto;　margin-left:auto;
 〇ブロック要素の中央寄せ(widthの指定が必須)
 ☓インライン要素には余白がないため使えない
 ※(display:blockでブロック要素にすれば使える)
　　
３.display: inline-block;
   ブロック自体は中央寄せ・中身は左揃え
***

<b>上下から中央寄せ</b>
１、vertical-align: middle;
　　〇インライン要素

２．position
   ブロック要素

***
<b>上下左右から中央寄せ</b>
１．vertical-align: middle;
　「vertical-align」が使えるのはインライン要素・テーブルセルのみ
　 上下中央寄せにしたいテキストを内包する要素にdisplay: table-cell;を指定。

２．position: absolute; + margin: auto;
　　left、width、rightがauto以外である
　　margin-leftとmargin-rightがautoである
　　ブロックにはwidth,height指定が必須です。
　　あまりよくない仕方である。

３．transform


４．display: flex;
   左右中央揃え‥justify-content: center; 
   上下中央揃え‥align-items: center;     



***
flex　transform
ブラウザによっては対応していないものがあり、「ベンダープレフィクス」というものを付ける場合があります。

　主要ブラウザのベンダープレフィックス
-moz-　　　Firefox
-webkit- 　　Google Chrome、Safari
-o-　 　　　 Opera
-ms-　　　　Internet Explorer









<h2>CSSによる横並びの種類</h2>
超つまった、困ってた。MAMP Pro5のローカル開発環境設定ができず、wpサイトをローカル表示ができなかった件

#私のスペック
ウェブエンジニアのバイトを初めて、数ヶ月のへっぽこ。

#困ったこと
MAMP Pro5のローカル開発環境設定ができず、wpサイトをローカル表示ができなかったこと。

#MAMP Pro5（有料）を使って、WordPressサイトのローカル表示ができなかった原因

今後つまった時に参考にしたいので、列挙します。

- 実際にMAMPに入力したNAMEに書いた名前と、本当のNAMEに書くためのNAMEの名前を勘違いしていた。
- MAMPで一番初めに入力する、NAMEがそもそも指定されてされていたものと間違っていた。
指定されているサイト名を書くべきだった。略したりしてはだめ。
- DBの入力違い。(DATABASE)
DBの内容はwp-config.phpに書いてある。
結構上の方に書いてある。
phpMyAdminでDBを入力する。

MAMP/bin/php/

```wp-config.php
// Local
define('DB_NAME', 'local');
define('DB_USER', 'root');
define('DB_PASSWORD', 'root');
```


最新バージョンのWordPress?が勝手にインストールされてしまい、指定のWordPress（WordPressのバージョン７より低い）バージョンと合っておらず、表示できなかった。

**そのため適当にMAMP上で適当なサイト作ってみる。これができれば、ヒントになると思ったから実行した。
指定されたwpのサイトと同じwpのバージョンを取ってくる、ここポイント。**

1.WordPressのダウンロードページへ行く。

https://ja.wordpress.org/download/

2.「すべてのリリース」をおし、指定のWordPressのバージョンをゲットする。
これ探すのに苦労した。わかりにくい・・・・。

https://ja.wordpress.org/download/releases/

![スクリーンショット 2020-01-19 15.20.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/524422/1103c139-ff85-06ec-7272-083ec47465fa.png)

- apacheのportを8888ではなく、80,81,443,7443,3306&11211にしなかったため。
- なかなかapacheとmysqlがつかなかった。しっかりパソコンの電源を落とし、クロムなどが自動で立ち上がらずに再起動させておけばそのようなことはなかったはず。
- 適当なindex.html(Hi.とか出力される程度のもの)を指定されたwpファイルの中におく。
- 適当なindex.phpを(Hello worldとか出力される程度のもの)を指定されたwpファイルの中におく。
- wpファイル構成を理解していなかった。 これが一番でかい気がする

参考にしたサイト
https://www.webdesignleaves.com/pr/wp/wp_folder_structure.html

wp-contentがwpファイルをいじる時にほとんど触るファイルとなっている。
ここから文の差し替えなど実行する。

#なぜ最新バージョンのワードプレスが勝手にインストールされてしまったのか
MAMP Proでhostを作るときに、Install WordPressにチェックを入れたからです。
そうすることによって、最新バージョンのワードプレスがダウンロードされる仕組みになっていたようです。

#解決した方法

求めているwpのverをwp公式サイトからダウンロードしてきて、wp-contentを指定されたサイトと置き換える。
ダッシュボードからテーマを変更。
これでおk。
FileMaker の DDR を見やすくする JavaScript

簡単な JavaScriptファイルをひとつ追加して、DDR（データベースデザインレポート）の可用性を向上させてみました。もちろん DDRを基にした FileMakerアプリ解析ツールは様々あるのですが、そこまでの大分析が目的ではなくて、WEBブラウザ利用はそのまま軽く閲覧と検索をしたいのだけれど、__デザイン的な不便さを何とかしたい__、という用途のものです。

## このツールで変わる事
* __スクリプトステップの行番号を表示するようになるよ。__
* __スクリプトステップ内の式や、カスタム関数が、コードそのまま表示になるよ。__
* __スクロールしても、スクリプト名が常に表示されるので、迷子にならないよ。__
* __前後のスクリプトへ移動するナビゲーションを除去したよ。__

## 行番号を表示し、式や関数はそのまま表示
FileMakerのステップは行番号が表示される（Pro 14～）ものの、DDRではリストスタイルが標準の黒丸「`list-style-type: disc`」のため、分析時に何行目なのか即座に判らないままです。このスタイルを「`list-style-type: decimal-leading-zero`」に変え、行番号を出すようにしました。
また、ステップ内の式を、記述そのまま（\<pre\>）の表示にすることで、1ステップ1行に強制されず読み下ししやすくなり、素早い箇所の特定に役立つようになります。こっちもスタイル「`white-space: pre`」を追加しただけです。

**_before_**
行番号が判らず、計算式を指定されているステップ行では式が改行されておらず読めません...💧
スクリプト名も判り難いと思います。
![DDR-SCRIPT-B.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535677/c80e8213-922e-4438-7d83-6ff2941a85a5.png)

**_after_**
行番号が判るだけでなく、オプションの計算式は記述したとおりに確認できるようになりました。👍
インポートステップなども、行展開されて表示されます。
![DDR-SCRIPT-A.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535677/7b841085-77a8-6a04-7403-0d9bf18982d7.png)

------------
**_before_**
カスタム関数カタログも、これではどんな式なのか判らない...💧
![DDR-FUNC-B.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535677/9bba81ab-db4c-85e3-7d8e-c1f34c1b193f.png)

**_after_**
こうなります。👍
![DDR-FUNC-A.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535677/c9764ba4-33c8-0e55-75e0-89ead4288163.png)



## 引っ付いてくれば迷子にならない
スタイル「`position: sticky`」を使って、スクロールしていても、スクリプト名などがウィンドウ上部に常に固定表示されるようにしました。
※ Chrome、Firefox のみで機能します。

**_before_**
検索ハイライトされている箇所が、**何というスクリプトの何行目なのか** さっぱり判らない。&#x1f61f;
![DDR-STICK-B.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535677/bf39e11d-0ce3-9b90-d648-bdc2fdcdcf12.png)

**_after_**
スクロールダウンしていても、表示箇所のスクリプト名と行番号が判ります。&#x1f600;
![DDR-STICK-A.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535677/8fd5f9ea-3f95-6f3f-9655-2024c6d84a83.png)



## 前後のスクリプトと上位フォルダへの移動ナビゲーション除去
個人的にこのナビゲーションを機能的に利用したことがなく、何より WEBブラウザでスクリプト名で検索した時に余計に検知されるので、要素そのものを除去（jQuery「`$(elements).remove()`」）しました。

**_before_**
このように、スクリプト名で検索した時に、余計にハイライトされ、検索結果数も正確でなくなってしまいます。&#x1f61f;
![DDR-NONAV-B.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535677/b275248f-2595-3559-c191-e83e924732de.png)



# ダウンロード
この [リンク](https://gist.githubusercontent.com/YasuhiroTambara/4e79f6a9dc0d7ee807683d406363c0d4/raw/72041ed72d8859e8b3505b669113c18d2c41ce0f/ddrfix.js) 先を保存してください。
# 使い方
###【注意】
CDNでホストされている jQueryを参照しているので、**インターネット接続が必要** です。
オフラインで利用する場合は、jQueryも別途ダウンロードして、代わりに参照させてください。
DOM操作だけを行うのが目的なので、jQueryでいいでしょう。

###【手順】
1. DDRをHTMLで生成する。
1. `Summary.html`（`概要.html`）の階層に本JSファイルを置く。
1. 各「`{{FileMakerファイル名}}_ddr`」サブフォルダの「`{{FileMakerファイル名}}.html`」 内の適当な位置に以下のスクリプトタグのリンクをつける。
1. あとは、ブラウザでページをリロードするだけです。
![ddrfix-jslinker.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535677/b8279db2-e212-0a5d-67d8-4d7daa45f117.png)

```html:{{FileMakerファイル名}}.html
...
<script src="../ddrfix.js"></script>
</head>
...
```


###ご意見、改善点などございましたら、ぜひフィードバックをください。
Promiseとasync/awaitを使った同期処理

Node.jsを使ったプログラムを書いていて、同期的に処理してほしいところを全て非同期でやっちゃう可愛いnodeのおかげでいくつか勉強になったことをまとめる。

#同期処理を考える手順
###1.まずはコールバック関数を使う
まず最初に思いつくのはこれ。コールバックを使えば、処理1の値を使った処理2みたいなことができる。
が、簡単な処理に関してはこれで十分だが、処理が複雑になってくるといわゆる「コールバック地獄」と言われる見た目も処理も地獄のようなプログラムができてしまう。要はネストが深くなって何がなんだかよくわからなくなる。

```sample.js
function 処理2{
 callback(処理1)
}
```

###2. Promiseを使う
そこで登場するのがPromise。こいつは結構優れもので、書き方を覚えてしまえばコールバック地獄を回避できる。
そもそもPromiseは何をしているかを簡単に説明すると、オブジェクト(引換券的なもの)を先に渡しておいて、resoleが返ってきた、つまり処理が終わればそのオブジェクトと結果を交換するよって感じ。
もっと砕いて言うと、電子レンジがPromiseで、人は何かを温めるとき電子レンジに食べ物を入れる。これが自分のものだよって言うことを示す引換券をもらうとして、温めが終わったら取りにいくイメージ。その間は何をしててもokだから要はPromise単体だと非同期処理を行なっている。

```sample.js
var result_1 = new Promise(function(resolve) {
 
    resolve("result_1成功");
 
});

result_1.then(function(){
 //処理
}).then(fucntion(){
})
・・・
```

同期処理にしたければPromiseのthenを使う。これは次々に処理を記述しているが、結局処理が終わらない(resoleが返ってこない)と次に進まないので同期的な処理になる。thenを使えば、コールバックを綺麗に記述でき、メンテナンス性も向上する。

###async/awaitを使った方がもっと綺麗
これに関してはいろんなサイトでごちゃごちゃ書いているが、要は使えたらいいので簡潔に言うと、asyncな関数で待ちたい処理をawaitにするだけ。

```sample.js
// await式を使いたいので、async関数を宣言する
const main = async () => {
    // 処理1のPromiseを宣言する
    const routine1 = new Promise(resolve => {
      //略
      resolve('end')
    })
    const result1 = await routine1; // 処理1の完了を待ち結果を受け取る
    // 処理2以下を記述……
  }
}

// 関数を実行
main();
```
async/awaitが最も綺麗にかけるのでおすすめ。

##注意事項　Promiseを変数に入れるか関数のreturnにするか
```sample.js
const routine1 = new Promise(resolve => {
      //略
      resolve('end')
    })

function routine1(){
 return new Promise(resolve =>{
 //略
});
}
```

この違いは結構大事。変数のroutine1を呼び出す場合は、呼び出す前にこの代入式を記述するとその時点で処理が実行される。一方で関数の場合は、呼び出した時点で初めてPromiseの処理が始まるという違い。
また、ループでなんどもPromise処理を使いたい時には、functionで毎回呼び出さす必要がある。変数だと一回resolveを返してしまえばそのPromiseは御役御免となり一生使えない。
Gitでコミット取り消す

# Gitでコミット取り消す

```console:cmd
git log --oneline
git reset --hard xxxxx
```

![git reset.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565572/7bbf0885-9f37-9764-18cc-6b1ca09864a0.png)
pip環境のdockerでjupyter notebookを使いたかった（opticspy）

## 背景
- Dockerで環境構築してpythonコードを書く際，画像の結果を見るのにjupyter notebookが楽
- opticspyというモジュールを使ったシミュレーションをしようとした時，pip installが前提となっていた
    - https://github.com/Sterncat/opticspy
- Jupyterは普段anaconda環境下で使っているので，どうしたら良いか調べながら対処した

## Dockerfile

```Dockerfile
FROM continuumio/anaconda3:latest


RUN apt-get update && apt-get upgrade -y \
 && apt-get install -y \
    git \
    make \
    build-essential \
    libssl-dev \
    zlib1g-dev \
    libbz2-dev \
    libreadline-dev \
    libsqlite3-dev \
    wget \
    curl \
    llvm \
    libncurses5-dev \
    libncursesw5-dev \
    xz-utils \
    tk-dev \
    libffi-dev \
    liblzma-dev \
    vim

RUN conda create -n p37 python=3.7 pip
```

## 実行コード

```terminal.sh
$ docker run -it -p 8881:8881 -v /hogehoge/:/mnt/ --name pip_in_conda pip_in_conda:1.0
$ source activate p37
$ pip install jupyter
$ pip install environment_kernels
$ jupyter notebook --generate-config
$ vim /root/.jupyter/jupyter_notebook_config.py
```

vimで追記する内容は以下の通り

```jupyter_notebook_config.py
c.NotebookApp.kernel_spec_manager_class='environment_kernels.EnvironmentKernelSpecManager'
c.EnvironmentKernelSpecManager.env_dirs=['/opt/conda/envs/']
```

```terminal.sh
$ pip install cffi
$ pip install numpy
$ pip install git+git://github.com/Sterncat/opticspy.git@master
$ pip install pyyaml
$ jupyter notebook --port 8881 --ip=0.0.0.0 --allow-root
```

## opticspyのサンプルコード実行の様子

![screencapture-127-0-0-1-8881-notebooks-mnt-05-lens-design-opticspy-sample-double-gauss-sample01-ipynb-2020-01-19-15_23_23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/68689/1b78b35d-bbc1-cd6a-4335-1a5a65c7d009.png)

￼
AWSの請求と料金

出展：[AWS認定資格試験テキスト AWS認定 クラウドプラクティショナー](https://www.amazon.co.jp/AWS%E8%AA%8D%E5%AE%9A%E8%B3%87%E6%A0%BC%E8%A9%A6%E9%A8%93%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88-AWS%E8%AA%8D%E5%AE%9A-%E3%82%AF%E3%83%A9%E3%82%A6%E3%83%89%E3%83%97%E3%83%A9%E3%82%AF%E3%83%86%E3%82%A3%E3%82%B7%E3%83%A7%E3%83%8A%E3%83%BC-%E5%B1%B1%E4%B8%8B-%E5%85%89%E6%B4%8B/dp/4797397403/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=3ERB303UT76DT&keywords=aws%E3%82%AF%E3%83%A9%E3%82%A6%E3%83%89%E3%83%97%E3%83%A9%E3%82%AF%E3%83%86%E3%82%A3%E3%82%B7%E3%83%A7%E3%83%8A%E3%83%BC&qid=1578744077&sprefix=AWS%E3%82%AF%E3%83%A9%E3%82%A6%E3%83%89%2Caps%2C266&sr=8-1)

#AWS料金モデル

##使った分だけの従量課金
・AWSでは必要なときに必要なリソースを使って、使った分にだけ請求が発生する
・資本の支出を***変動費***にすることができる
・消費モデルをエンジニアだけでなく組織全体で受け入れることにより、コスト最適化が進む

##課金体系
・課金体系はサービスによって異なる（使用していた時間/使った容量 等）
・同じサービスでもリージョンによって料金が異なるものもある

##多彩な料金モデル
・要件に応じて最適な料金モデルを選択することでコストを最適にできる

#請求ダッシュボード

##請求書
・各AWSサービスの料金の内訳を見ることができる
・どのリージョンでどのサービスのどの機能を使ったかが確認できる
・請求金額は月末まで待たなくても、月の途中でも確認できる

##コストエクスプローラとコスト配分タグ
・コスト配分タグによってROIの請求分析ができる
・コストエクスプローラでコスト配分タグで分けた結果を可視化したり、CSV形式でダウンロードしたりできる

##請求アラーム
・請求金額もCloudWatchメトリクスの1つ
・請求アラームによって使いすぎを抑止するための通知ができる

#マルチアカウントの運用
・AWSのアカウントは個人や組織で複数作成することができる
・環境を分けたい場合や、用途によって分けたい場合にアカウントを分離する

###AWS Organizations
・複数アカウントを一括管理、階層管理できる

###一括請求（コンソリデーティッドビリング）
・複数アカウントの請求を1つの請求にまとめることができる

##AWSのサポートプラン
・適切なサポートプランを選択することで、運用の安全性を保ち、***エスカレーションパス***（問い合わせ先）を確保できる

###ベーシックプラン
・AWSアカウントを作ったときに提供されている無料のサポートプラン
・技術サポートは、AWSサービスの稼働状況をモニタリングしているヘルスチェックについてのサポートのみ
・Trusted Advisorは最低限必要な項目のみ

###開発者プラン
・29USDか使用料の3%の大きいほう
・技術サポートを作成できるユーザは1ユーザ（9:00～18:00）
・構成要素についてのアーキテクチャサポート
・Trusted Advisorは最低限必要な項目のみ

###ビジネスプラン
・100USDか使用料に応じた計算式の大きいほう
・技術サポートを作成できるユーザは無制限（24時間）
・アーキテクチャはユースケースのガイダンス
・Trusted Advisorは全項目
・サポートAPIの使用可
・サードパーティソフトウェアのサポート

###エンタープライズプラン
・15,000USDか使用料に応じた計算式の大きいほう
・技術サポートを作成できるユーザは無制限（24時間）
・アプリケーションのアーキテクチャサポート
・Trusted Advisorは全項目
・サポートAPIの使用可
・サードパーティーソフトウェアのサポート
・テクニカルマネージャー（TAM）
・サポートコンシェルジュ
・ホワイトグローブケースルーティング
・管理ビジネス評価

#その他の請求サポートツール

##AWS簡易見積もりツール
・請求見込額を事前に計算しておくことができる

##TCO計算ツール
・AWSとオンプレミスのコストを比較するツール
CMSampleBufferのCの関数使わなくてよくなったみたい


これまでCMSampleBufferからImageBufferを取り出す時などは

```swift
let imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer)
```

という関数を使っていましたが、iOS13.0から


```swift
@available(OSX 10.15, iOS 13.0, tvOS 13.0, watchOS 6.0, *)
public var imageBuffer: CVImageBuffer? { get }
```

というプロパティが生えて、

```swift
sampleBuffer.imageBuffer
```

でアクセス出来るようになりました！
imageBufferの他、timingInfoやformatDescriptionも同様に取れるようになっていました。
便利ですね！
Firebase + Nuxtのデプロイでハマった話

# Firebase Hosting Setup Completeがでる

```
$ firebase deploy
```

が成功しているはずなのに、いくらキャッシュクリアしても「Firebase Hosting Setup Complete」がでる。

なんで？

# 結論を先に

私のケースでは、.firebaserc、firebase.jsonファイルがプロジェクトフォルダ内になかったから。この２つのファイルが重要だというのにたどり着くまで結構時間がかかった。

# なんでそんなことが起きるん？

私がハマった原因は、

```
$ firebase init
```

をプロジェクトディレクトリで実行せずに、適当なディレクトリで実行してしまったことだ。親切に説明しているサイトはたくさんある。説明も間違っていなかった。が、しかし、私がせっかちだった。とにかく書かれているコードを説明も読まずにターミナルに打ち込んでいると、同じ失敗をするかもしれない。

私のように、せっかちな人だと同じミスをする可能性があるので、ここに記録を残しておく。

## 余計なファイルを消そう

まずは、どっかにできたであろう、.firebaserc、firebase.jsonを一度消そう。おそらく、最初にfirebase initを実行した場所にあるはず。ただし、消す場合は自己責任でお願いします。他のプロジェクトをFirebaseで運用している場合は、慎重にお願いします。

## 自分のプロジェクトが置かれているディレクトリに移動してから！

これ大事。

```
$ cd プロジェクトのディレクトリ
$ firebase init
```
うまくいくと、そのディレクトリ以下に.firebasercとfirebase.jsonができているはず。
なんだかんだ、1時間以上ハマってた・・・。あー・・・、腰痛い。
グラフィカルなVIMエディター Neovim-Qt を導入する

素晴らしきエディターであるVIMの正統進化版、その名はNeovim-Qt。モダンな次世代なグラフィカルなVimらしく、聞くところによるとNo１エディタの呼び声高いらしい。
とにかく使わない訳はなく何がどう違うか分からないまま乗り換えることにした。


# Vimer遍歴
Vim △
Gvim ☓
Neovim ○
Neovim-qt ◎　いまここ

# インストール

```
sudo apt install neovim-qt
```

# 設定

##init.vim

neovimは設定ファイルが`.vimrc`ではないらしく。`~/.config/nvim/init.vim`から読み込むらしく、.vimrcのシンボリックリンクを作成した。

```:シンボリックリンクを作成
ln -s ~/.vimrc ~/.config/nvim/init.vim
```

##フォント変更

```~/.config/nvim/ginit.vim
Guifont DejaVu Sans Mono:h15
```

詳しく知りたい方はこちら
https://github.com/equalsraf/neovim-qt/wiki

# プラグインを使えるようにする
自分は`Vim Plug`を使わせてもらっているので、Neovim版の`Vim Plug`をcurlで頂いてくる。

```
curl -fLo ~/.local/share/nvim/site/autoload/plug.vim --create-dirs \
    https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
```

#まとめ
NERDTreeをファイルマネージャー感覚で扱えるのはGvim全般の魅力ですね。

こちらの記事の比較がよくわかりやすい。
https://vim.blue/what-is-neovim/
Laravel: 複数のDBに接続

mysqlとSQLite3の同時使用例

php.iniの場所

```console
$ php -r "echo phpinfo();" | grep "php.ini"
```

```php:php.ini
//使用するDBをコメントアウト
extension=pdo_mysql
extension=sqlite3
```
httpdの再起動
データベースの作成

設定

```php:.env
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE_1={データベース名}
DB_USERNAME=root
DB_PASSWORD=null

DB_CONNECTION=sqlite
DB_DATABASE_2={パス/データベースファイル名}
```

```php:config/database.php
'default' => env('DB_CONNECTION_1', 'mysql'),
//略
'sqlite' => [
    'driver' => 'sqlite',
    'database' => env('DB_DATABASE_2', database_path({フォルダパス})),
    'prefix' => '',
],
'mysql' => [
    'driver' => 'mysql',
    'host' => env('DB_HOST', 'localhost'),
    'database' => env('DB_DATABASE_1', 'forge'),
    'username' => env('DB_USERNAME_1', 'forge'),
    'password' => env('DB_PASSWORD_1', ''),
    'charset' => 'utf8mb4',
    'collation' => 'utf8mb4_unicode_ci',
    'prefix' => '',
    'strict' => false,
    'engine' => null,
],
```

```php:migration
//デフォルトDBにはconnectonメソッドは必要なし
Schema::connection('sqlite')->create({テーブル名}, function (Blueprint $table) {
}
```

データベースを指定してマイグレーション

```console
$ php artisan migration --database=sqlite
```

Modelでの接続設定

```php:Model
class Datas extends Model
{
    protected $connection = 'sqlite';
}
```
[React-router-dom]使い方

npmでパッケージ管理している前提です

```
#パッケージのインストール

$ npm install --save react-router-dom
```
BrowserRouter,Route,Switchをインポートします。
path指定し、そのpathに当てはまるコンポーネントを指定することで、Reactでのroutingを実現しています。


```jsx

import React from 'react';
import ReactDOM from 'react-dom';
import {
    BrowserRouter,
    Route,
    Switch,
  } from 'react-router-dom';
import Home from './pages/Home'
import Example from './pages/Example'
import PostEdit from './pages/PostEdit';

function App() {

    return (
        <div>
            <Switch>
                <Route path='/' exact component={Home} />
                <Route path='/posts' exact component={Home} />
                <Route path='/example' exact component={Example} />
                <Route path='/post/edit/:id' exact component={PostEdit} />
            </Switch>
        </div>
    );
}


ReactDOM.render((
    <BrowserRouter>
      <App />
    </BrowserRouter>
  ), document.getElementById('root'))


```
CentOSにcomposerをインストールする方法

#はじめに
phpを用いた開発の時によく用いられるcomposerについてインストール方法をまとめます。

そもそもcomposerとは一言で言うとphpのパッケージ管理システムです。
phpのパッケージ依存管理ツールであるComposerを利用することで、パッケージの管理コストを下げ開発効率をあげることができます。
composerはプロジェクトが必要とするライブラリやパッケージを管理していて、それをもとにインストールをすることができます。
例えば、あるライブラリをインストールしようとしたときにその前に特定のライブラリをインストールしなければならないような依存関係を自動的にインストールしてくれる便利なツールです。

#composerをインストールする
今回は公式のやり方とyumを用いてインストールする方法の2種類をまとめます。
他のパッケージをインストールする時にyumを用いている場合は依存関係などのバージョン管理しやすいようにするため、yumを用いてインストールする方法をおすすめします。
※今回はphpコマンドyumコマンドが使えると言う前提で話を進めます。
 phpはパージョン7.3系です。

##①公式のcomposerインストール手順

```php:command
# インストーラをダウンロードする(phpコマンド以外にもcurlやwgetなどのコマンドでダウンロードもできます。)
$ php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"

# ダウンロードしたインストーラのハッシュをチェックし、正しければ'Installer verified'と表示する
$ php -r "if (hash_file('sha384', 'composer-setup.php') === '48e3236262b34d30969dca3c37281b3b4bbe3221bda826ac6a9a62d6444cdb0dcd0615698a5cbe587c3f0fe57a54d8f5') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"

# インストーラを実行する
$ php composer-setup.php

# インストーラを削除する
$ php -r "unlink('composer-setup.php');"

#CentOSのどこからでも使えるようにするために、/usr/local/binフォルダにcomposer.pharを移動させる
$ sudo mv composer.phar /usr/local/bin/composer
```

##②yumを用いたcomposerインストール手順

```php:command
#yumでcomposerをインストールする
$ sudo yum install --enablerepo=remi,remi-php73 composer
#(中略)
エラー: パッケージ: composer-1.9.2-1.el7.remi.noarch (remi) 
要求: php-zip
```
php-zipがないと怒られてしまいました。。。
なので下記のようにphp-pecl-zipを指定してインストールされると成功しました！！
（php-zip指定してもなぜかできませんでした。。。なぜか分かる方いたら教えてください。。。）

```php:command
$ sudo yum install --enablerepo=remi,remi-php73 php-pecl-zip composer

```

##composerの配置とインストール確認
```php:command
#CentOSのどこからでも使えるようにするために、/usr/local/binフォルダにcomposer.pharを移動させる
$ sudo mv composer.phar /usr/local/bin/composer

#インストール確認する(大きくcomposerの文字とバージョンと出てくれば完了です)
$ composer -v
```



#さいごに
何かパッケージをインストールするときは公式のやり方を見つつ自分の開発環境とあっているか確認しながら行うと良いかと思います。

参考：[Composer を CentOS にインストールする手順](https://weblabo.oscasierra.net/php-composer-centos-install/)
（抱負）Qiitaにはじめて投稿するにあたって

#はじめに
私は、プログラミングで仕事を効率化している一般職です。
これまでの経験を発信したら、誰かの役に立つかもしれないと思い、投稿をはじめます。

#自己紹介
-  私立大理学部卒、非IT系企業正社員（一般職）
-  環境、よく使用するソフトウェア
    - Windows系OS
    - Microsoft製品（主にExcel、Word）
    - タスクスケジューラ
    - 社内データベース
-  プログラミング経験（数行書いただけも含む）
    - Excel/VBA
    - 正規表現
    - コマンドプロンプト/MS-DOS
    - Python
    - R

#きっかけ
投稿しようと思ったきっかけは、たまたま手にとって読んだ本でした。
羊土社という、生命科学や医学分野の出版社から発行されている本です。
[**やるべきことが見えてくる研究者の仕事術**
プロフェッショナル根性論](https://www.yodosha.co.jp/yodobook/book/9784758120050/)

#本音と建前
冒頭では綺麗事からはじめましたが、私は清廉な人間ではありません。もちろん建前です。
本音を言えば、自分が苦労して得た知恵を、誰かに無償で提供するなんてもったいないと思っています。それでも投稿しようと思ったのには、いくつか理由があります。
**おもしろい文章を書けるようになりたい**
学生時代、夏休みの感想文はきちんと書いておくべきでした。
読みやすくて面白い文章を書くには、（プログラミングと同じで）トライ&エラーが必要です。
もしコメントをいただけたら、よくも悪くも糧にする覚悟ですので！遠慮なくお寄せください。
**公開することによる自分へのプレッシャー**
不特定の相手に公開すると思うと、自然と慎重になります。
推敲を重ねられるし、目標を宣言したら引けません。
数ヶ月後、数年後、もしかしたら数日後に、挫折していたら笑ってください。
**ニッチな現状を活かしたい**
私は「プログラミングができる一般職」に出会ったことがありません。
技術的な課題解決力はありませんが、意外な気付きを提供できるかもしれません。
もし我こそはプログラミングができる一般職である！という方がいたら話を聞かせてください。

#さいごに
便利で簡単なパソコンの有効活用方法から、個人的に躓いている技術的な課題、最近納得がいかない件まで、ブログのように幅広い内容で投稿したいと思います。
[Pythonでweb開発] cookieを保存させる時の注意点

ブラウザにcookieを保存する場合、下記のコードで可能です。

```python
print (
    'Set-Cookie:{0}={1}; '
    'path=/; '
    'expires=Fri, '
    '5-May-2027 00:00:00 GMT;'.format(key, value))
```

実行し、他のscript実行すると、保存できません。予想ではhttpの環境が変更されるためだと思われます。

redirectすると保存できますので、cookieを保存しすぐにredirectしましょう。
インライン要素とブロック要素

<h1>インライン要素とブロック要素</h1>


<h2>●インライン要素</h2>

|      |        |     |
|-----------------|------------------|------------------|
|span            |              a |       strong        |
|    b   |    font |       img       |
|small|input|     br        |
|textarea   |   u |    button           |
|      label       |    script     |           |

※他にもインライン要素はあり一部のみ記載


〇text-align: center;   〇vertical-align:center

・<font color="red">特徴</font>
・要素の前後に改行が入らず、インライン要素同士<font color="red">横に並ぶ</font>
・横幅や高さを指定できない(※1)
・ブロックレベル要素のように上下の余白設定(margin,padding)が効かない(※2)
 

(※1)img、input、textareaなどの一部のタグは幅高さや余白の設定が可能です。
(※2)余白について厳密にいうと外部余白marginについては上下は効きません(左右は効きます)
内部余白paddingについては上下左右設定できますがブロックレベル要素のように正しく余白が取れません。
***

<h3>●ブロック要素</h3>     

|     |        |     |
|:-----------------|------------------:|:------------------:|
| div             |              p |        ul      |
| li         |            ol |     table     |
| header             |              main|        footer       |
| section           |                form |         h1-h6         |
※他にもインライン要素はあり一部のみ記載


×text-align: center;　〇margin: 0 auto;　　margin-right: auto;　　margin-left: auto;

横並びの要素を基準にするならば、インライン要素やインラインブロック要素にして、vertical-align:centerでOKです。
親要素を基準に中央寄せしたい場合は、親要素に高さ、display: table-cell、vertical-align:centerを指定します。

・<font color="red">特徴</font>
・要素の前後に改行が入り、ブロック要素同士<font color="red">縦に並ぶ</font>
・横幅や高さを指定できる
・余白(margin,padding)が指定できる

***
<h4>●インラインブロック要素</h4>
〇text-align:center

上下中央揃えでも、インライン要素と同じ考え方で問題ありません。
横並び基準ならvertical-align:center、
親要素基準なら親要素に高さ、display:table-cell、vertical-align:centerを指定。
***
<font color="red"><b>問題点</b></font>
・text-align:centerが効かない　 
　ブロック要素になっていませんか？ 
　親要素に対して指定していますか？

・margin: 0 autoが効かない
　インライン要素になっていませんか？
　親要素の幅が小さくなっていませんか？

・position: absoluteができない
親要素はrelativeになっていますか？
メモ「Chapter 5 – Dictionaries and Structuring Data」

# addInventory.py

```python
def displayInventory(inventory):
    print("Inventory:")
    item_total = 0
    for k, v in inventory.items():
        print(str(v) + ' ' + k)
        item_total = item_total + v
    print("Total number of items: " + str(item_total))

def addToInventory(inventory, addedItems):
    # The setdefault() method is a nice shortcut to ensure that a key exists.
    for i in range(len(addedItems)):
        inventory.setdefault(addedItems[i], 0)
        inventory[addedItems[i]] = inventory[addedItems[i]] + 1
    return inventory

inv = {'gold coin': 42, 'rope': 1}
dragonLoot = ['gold coin', 'dagger', 'gold coin', 'gold coin', 'ruby']
inv = addToInventory(inv, dragonLoot)

displayInventory(inv)
```
ElasticSearchのterm queryが反応しなかった時のTips


すごい時間とられたので覚書

## 結論
termを使用せず、[match](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-match-query.html)を使ってみる

## 詳細

termで出てこないのは、fieldが`text`になっているためと思われる

[ここ](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-term-query.html)に書いてある

> Avoid using the term query for text fields.
> By default, Elasticsearch changes the values of text fields as part of analysis. This can make finding exact matches for text field values difficult.
> To search text field values, use the match query instead.

text fieldはESの中で解析用に値を変えて保持するらしく、値によっては完全一致に引っかからないそうな

例）spaceが入っていたりなどすると、配列っぽく保持してるらしい

[6.8のリファレンス](https://www.elastic.co/guide/en/elasticsearch/reference/6.8/query-dsl-term-query.html)でわかりやすく説明されてる

SQLほど単純じゃなくて、つらみがつよい・・・
３本目：【eclipse】githubからプロジェクトを取得する

github上のソースを取得→実行にすこし手間取ったので手順を残しておく

- メニューバーから「File -> Import」を選択
- Select画面から、「Git -> Project from Git」を選択
- Select Repository Source画面から、「Clone URI」を選択
- 取得したいリポジトリのURLを設定した「Finish」で終了
DockerでTesseractの環境を構築してみた。。。

## はじめに
Googleが開発したTesseract（テッセラクト）の環境をDockerを使用して作成します。

## 目次
1. aptでインストール
2. Gitからソースを持って来てコンパイル
3. まとめ

### 1. aptで簡単にインストール

[公式のGitHub](https://github.com/tesseract-ocr/tesseract/wiki)を参考にします。

```Dockerfile

FROM ubuntu:18.04

RUN apt-get update \
    && apt-get upgrade -y \
    && apt-get install -y \
    tesseract-ocr \
    libtesseract-dev \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/*

```

```bash:Dockerfileのビルド
docker build --rm -f "tesseract/Dockerfile" -t tesseract:apt-install "tesseract"
```

ビルドが完了したらコンテナを立ち上げます。
`tesseract 4.0.0-beta.1`がインストールされていることが確認できます。

```bash:tesseractのコンテナ
root@99207ebd4115:/# tesseract -v
tesseract 4.0.0-beta.1
 leptonica-1.75.3
  libgif 5.1.4 : libjpeg 8d (libjpeg-turbo 1.5.2) : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.11 : libwebp 0.6.1 : libopenjp2 2.3.0

 Found AVX2
 Found AVX
 Found SSE
root@99207ebd4115:/# 
```

### 2. Gitからソースを持って来てコンパイル

次に公式のgitからソースコードを持って来てコンパイルしましょう。
[公式のGitHub](https://github.com/tesseract-ocr/tesseract/wiki/Compiling-%E2%80%93-GitInstallation)を参考にします。
ビルドに20分ほどかかります。

```Dockerfile

FROM ubuntu:18.04
 
RUN apt-get update \
    && apt-get upgrade -y \
    && apt-get install -y \
    automake \
    ca-certificates \
    g++ \
    git \
    libtool \
    make \
    pkg-config \
    wget \
    libicu-dev \
    zlib1g-dev \
    libtiff5-dev \
    libjpeg8-dev \
    libpng-dev \
    libpango1.0-dev \
    libcairo2-dev \
    && apt-get install -y --no-install-recommends \
    asciidoc \
    docbook-xsl \
    xsltproc \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/*
 
WORKDIR /opt
 
ENV TESSERACT_VER="4.1"
 
RUN wget http://www.leptonica.org/source/leptonica-1.79.0.tar.gz \
    && git clone -b ${TESSERACT_VER} https://github.com/tesseract-ocr/tesseract.git --single-branch \
    && tar -zxvf leptonica-1.79.0.tar.gz
 
WORKDIR /opt/leptonica-1.79.0
 
# leptonica-1.79.0のインストール
RUN ./configure \
    && make \
    && make install
 
WORKDIR /opt/tesseract
 
# tesseractのインストール(学習環境も併せて)
RUN ./autogen.sh \
    && ./configure \
    && make \
    && make install \
    && ldconfig \
    && make training \
    && make training-install
 
ENV TESSDATA_PREFIX="/usr/local/share/tessdata"
 
RUN wget https://github.com/tesseract-ocr/tessdata_best/raw/master/eng.traineddata -P ${TESSDATA_PREFIX} \
    && wget https://github.com/tesseract-ocr/tessdata_best/raw/master/jpn.traineddata -P ${TESSDATA_PREFIX} \
    && wget https://github.com/tesseract-ocr/tessdata_best/raw/master/jpn_vert.traineddata -P ${TESSDATA_PREFIX}


```

```bash:Dockerfileのビルド
docker build --rm -f "tesseract/Dockerfile" -t tesseract:compiling "tesseract"
```

ビルドが完了したらコンテナを立ち上げます。
`tesseract 4.1.1-rc2-22-g08899`がインストールされていることが確認できます。

```bash:tesseractのコンテナ
oot@76fa9e82e37d:/opt# tesseract -v
tesseract 4.1.1-rc2-22-g08899
 leptonica-1.79.0
  libpng 1.6.34 : zlib 1.2.11
 Found AVX2
 Found AVX
 Found FMA
 Found SSE
root@76fa9e82e37d:/opt# 
```

### 3. まとめ
Dockerを使用することで、簡単にTesseractの環境が手に入りました。
モデルのトレーニング方法なども追加で書く予定です。
ありがとうございました。