OmniAICreator/Qiita-1.07M huggingface dataset:
python入門(3)~演算子~

#演算子
##数値の計算に用いる演算子
計算に用いる演算子には次のものがあります．

|演算子|働き|
|:-:|:-:|
|+|足し算|
|-|引き算|
|*|掛け算|
|/|割り算|
|//|割り算(整数値)|
|%|余り|
|**|べき乗|

##代入演算子
「=」を使い左辺を変数，右辺を値とします．また，「=」は等しいという意味ではなく右辺を左辺に代入するという意味です．

|演算子|働き|
|:-:|:-:|
|+=|足して代入|
|-=|引きて代入|
|*=|掛けて代入|
|/=|割って代入|
|//=|割って整数を代入|
|%=|余りを代入|
|**=|べき乗して代入|

```python:ope.py
print('3+6は', 3 + 6)
print('3-6は', 3 - 6)
print('3×6は', 3 * 6)
print('3÷6は', 3 / 6)
print('3÷6の整数値は', 3 // 6)
print('3÷6の余りは', 3 % 6)
print('3の6乗は', 3 ** 6)
a = 20
a += 80
print(a)
```

```tex:実行結果
3+6は 9
3-6は -3
3×6は 18
3÷6は 0.5
3÷6の整数値は 0
3÷6の余りは 3
3の6乗は 729
100
```
##比較演算子
条件式を扱う時に使う演算子を比較演算子と言います．条件が成立した場合は「true」を，成立しない場合は「false」を返します．

|演算子|働き|
|:-:|:-:|
|==|等しい|
|<|小なり|
|>|大なり|
|<=|以下|
|>=|以上|
|!=|等しくない|

```python:ope2.py
a = 20
b = 30
print('a < b', a < b)
print('a > b', a > b)
print('a == b', a == b)
print('a != b', a != b)
```

```tex:実行結果
a < b True
a > b False
a == b False
a != b True
```

##論理演算子
論理演算子とはより複雑な条件を表す時に使います．

|演算子|働き|使い方|
|:-:|:-:|:-:|
|and|かつ|(a >= 0) and (a <= 10)|
|or|また|(a == 4) or (a == 5)|
|not|〜でない|not (a == 10)|
また下記のように条件式の結果によって処理を行うこともできます．このプログラムの二行目は条件式(a < 5)がtrueなら処理を実行し，falseなら処理を実行しないという意味です．また，三行目は逆に条件式(a < 5)がfalseなら処理を実行し，trueなら処理を実行しないという意味を持ちます．

```python:ope3.py
a = 3
(a < 5) and (print('aは5未満'))
(a < 5) or (print('aは5以上'))
```

```tex:実行結果
aは5未満
```
##三項演算子
三項演算子を用いると，条件式の結果によって処理が変化するプログラムを簡潔に書くことができます．

```python:ope4.py
point = 90
b = '合格' if point > 60 else '落単'
print(b)
```

```tex:実行結果
合格
```

##最後に
pythonは奥が深いので自分のペースでゆっくり学んでいきましょう．
ionic cordova build androidでgradleのエラー

$ionic cordova build androidで以下のエラーが出た

/Applications/Android Studio.app/Contents/gradle/gradle-4.10.1/bin/gradle: Command failed with exit code EACCES

gradleのパーミッションを修正したらビルドが通った
`chmod 777 /{AndrodiStudioのパス}/Contents/gradle/gradle-4.10.1/bin/gradle`


環境
ionic (Ionic CLI)  : 4.10.2
Ionic Framework    : ionic-angular 3.9.2
@ionic/app-scripts : 3.2.2
cordova (Cordova CLI) : 8.1.2 (cordova-lib@8.1.1)
Cordova Platforms     : android 7.1.4, ios 4.5.5
NodeJS : v10.15.0
npm    : 6.7.0
OS     : macOS Mojave
Xcode  : Xcode 10.1 Build version 10B61
Amazon Linux で最小限の設定とWEBとDBサーバを構築する

Amazon Linux を利用。

---

##1.ホスト名の変更##

```
$ sudo vim /etc/sysconfig/network

HOSTNAME=XXXX
## XXXXの部分を任意のものに置き換える。

$ sudo vi /etc/hosts

127.0.0.1 XXXX
## 任意のものに置き換えたHOSTNAMEのXXXXを追加する。

$ sudo reboot
```


##2.OS の言語設定##

```
$ sudo vi /etc/sysconfig/i18n

LANG=ja_JP.UTF-8
## en_US.UTF-8 から ja_JP.UTF-8 に置き換える。
```


##3.OS の時刻設定##

```
$ sudo cp /usr/share/zoneinfo/Japan /etc/localtime

$ sudo vim /etc/sysconfig/clock

ZONE="Asia/Tokyo”
## UTC から Asia/Tokyo に置き換える。
```


##4.必要なパッケージの導入##

```
$ sudo yum update -y
$ sudo yum install -y httpd24
$ sudo yum install -y php70 php70-mbstring php70-pdo php70-mysqlnd
$ sudo yum install -y mysql
$ sudo yum install -y git
```


##5.Apache の設定##

```
$ sudo vim /etc/httpd/conf/httpd.conf

<IfModule dir_module>
    DirectoryIndex index.php index.html
</IfModule>

## DirectoryIndex の変更、index.php を追加する。

ServerName = xxxx

## ServerName もコメントアウトを外して、hostname に変更する。

$ sudo /etc/init.d/httpd configtest

$ sudo chkconfig httpd on
$ sudo service httpd start
```


##6.PHP の設定##

```
$ sudo vim /etc/php.ini

extension=mbstring

# Dynamic Extensions の下の方に追加する。

mbstring.language = Japanese
mbstring.internal_encoding = UTF-8

# コメントアウトを外して、追加する。
```


##7.index.php を作成し、表示されるか確認する##

index.php ファイルを作成し、　/var/www/html/　におき、表示されるか確認しておく。

more udemy-aws-14days/Day4/index.php



##8.mysqlのインストールの初期設定

```
$ sudo yum install -y mysql57-server
$ sudo chkconfig mysqld on
$ sudo service mysqld start
$ mysqladmin -u root password

# rootのpasswordは任意のものに設定
```



##9.mysqlに接続し、サンプルテーブルを作成する##

```
$ mysql -u root -p

# 先ほどの手順で作成したpasswordでログインする。

$ create database test_blog;
$ use test_blog;
$ create table posts (id int not null primary key, title varchar(100), detail varchar(1000), image varchar(1000));
$ insert into posts values (1, "XXXX", "XXXXXXXXXX", "./img/img1.jpeg");
$ insert into posts values (2, "YYYY", "YYYYYYYYYY", "./img/img2.jpeg");
$ insert into posts values (3, "ZZZZ", "ZZZZZZZZZZ", "./img/img3.jpeg");
$ grant all privileges on *.* to root@"%" identified by 'パスワード' with grant option; 

# test_blogと言うデータベースを作成していく。
```



##10.Web サーバから mysql に接続する##

```
$ mysql -h x.x.x.x -u root -p

# x.x.x.xの部分はDBサーバのプライベートIP
TypeScript で型定義してないプロパティを投入するお話

こんにちは。
最近 TypeScript でそこそこ大規模な WebApp を書いていて、日々こけつまろびつしている私です。

ここ数日で似たような疑問が複数個所から聞こえてきたので、メモがてら記事に起こしておきます。

# Q. 型定義された値に対して、定義にないプロパティを含むオブジェクトを代入したい

## 提起
普通に型定義を含んで定義された変数に対して、その型に無いプロパティを含むオブジェクトを代入しようとした場合はエラーになりますね。

``` TypeScript
interface IHoge {
  str: string;
}

const hoge: IHoge = {
  str: 'str',
  arg: 'arg', // <= [TS2322] オブジェクト リテラルは既知のプロパティのみ指定できます。'arg' は型 'IHoge' に存在しません。
};
```

これに対して、型に定義されたプロパティを持ち、かつそれ以外の任意のプロパティを持つオブジェクトを代入したい場合にはどうするか。

## 公式回答
https://www.typescriptlang.org/docs/handbook/interfaces.html#excess-property-checks
ここには、明示的に「何でも追加できるよ」というのを無理やり定義する方法が書かれていますね。

```TypeScript
interface IHoge {
  str: string;
　[prop: string]: any;
}

const hoge: IHoge = {
  str: 'str',
  arg: 'arg',
};
```

なるほど。

更に追加で、「ちょっと驚きのテクかもしれないけど、いったんオブジェクト作ってから代入すればいいよ。(超訳)」
とも書かれています。

``` TypeScript
interface IHoge {
  str: string;
}

const hoge = {
  str: 'str',
  arg: 'arg',
};

const hoge2: IHoge = hoge; // <= arg が含まれてるけどエラーにならない (!!)
```

変数の初期化時には余計なプロパティの確認をするけど、代入時には確認しないという理解で良いのでしょうか。
言語の定義まで踏み込んでの理解はできていません。

## 回答の変形

ちょっと変形でこんな書き方もできますね。

```TypeScript
interface IHoge {
  str: string;
}

const hoge = <IHoge> {
  str: 'str',
  arg: 'arg',
};
```

更に踏み込むとこういう書き方も。

```TypeScript
const hoge = <{str: string}> {
  str: 'str',
  arg: 'arg',
}; // <= hoge には 「少なくとも str は入ってるよ」と伝えたい
```

この書き方に何の意味があるんじゃい。
と思いましたが、原プログラマの意図を伝えるには意味がありそうです。

```TypeScript
const hoge = <{str: string}> {
  str: 'str',
  arg: 'arg',
};

console.log(hoge.arg); // <= [TS2339] プロパティ 'arg' は型 '{ str: string; }' に存在しません。
```

あるのに！:laughing:

## どういう時にこの知識使うの？

とても specific に graphql-request の options に値を追加したい際にこの問題に遭遇しました。

呼び出し側のコード

```TypeScript
import {GraphQLClient} from 'graphql-request';

const request = new GraphQLClient('http://hogehoge', {method: 'get', proxy: 'anywhere'});
  // <= [TS2345] オブジェクト リテラルは既知のプロパティのみ指定できます。'proxy' は型 'Options' に存在しません。
```

内部で呼ばれている fetch に対して proxy を渡したかったのですが、options の引数定義に用意されていなかったんですよね。
ちょっと悩んだ挙句、とりあえず下記のようにして回避した。
というお話でした。

```TypeScript
import {GraphQLClient} from 'graphql-request';

const options = {method: 'get', proxy: 'anywhere'};
const request = new GraphQLClient('http://hogehoge', options);
```

何かの参考になれば。
macのvimでヤンクしたテキストがクリップボードにコピーされない問題を解決

# 本記事の目的
1. vimでヤンクしたテキストをmacのクリップボードに保持したい。
2. 既存のvimを削除したくない。(検索した際、既存のvimを削除する記事が多かった。)

# 前提
1. osバージョン
`macOS Mojave Version 10.14.2`

2. vimは既存のものを使用していた。
`path: /usr/local/bin/vim`

3. clipboardが無効であることを確認済み(`-clipboard`と表示されれば無効。)

```
$ vim --version | grep clipboard
-clipboard         +jumplist          +persistent_undo   +vartabs
+eval              -mouse_gpm         +syntax            -xterm_clipboard
```

# 作業内容
## 1. brewでvimをインストール
```
$ brew install vim
```

## 2. brewでインストールしたvimのパスを設定
```
$ vim ~/.bash_profile
Note--------------
以下を追記
export PATH="$PATH:/usr/local/Cellar/vim/8.1.0850/bin"
------------------
$ source ~/.bash_profile
```

※ vimのパスは環境により変動(`/usr/local/Cellar/vim/XXXXX/bin`)

## 3. .vimrcを編集

```
$ vim .vimrc
Note--------------
以下を追記
set clipboard=unnamed
------------------
```

`.vimrc`の編集で作業終了です。

以下のコマンド結果となり、vimでヤンクしたテキストをmacのクリップボードにコピー出来るようになっているかと思います。

```
$ vim --version | grep clipboard
+clipboard         +jumplist          +persistent_undo   +vartabs
+eval              -mouse_gpm         +syntax            -xterm_clipboard
```
Mac 起動時に Homebrew を自動アップデートする

### 概要
  
Homebrew と、 それを使ってインストールしたパッケージを、いつも最新の状態にするための設定をしてみます。具体的には、Mac が起動した時に、シェルスクリプトで brew update と brew upgrade を自動的に実行します。  
  
Homebrew については、以下のサイトをご参照ください。  

* [Mac に Homebrew をインストール](https://stangler.hatenablog.com/entry/2019/01/30/100414)
* [よく使う Homebrew のコマンド](https://stangler.hatenablog.com/entry/2019/02/05/115729)


### ホスト

#### Mac

* [MacBook Pro ( 13-inch, Early 2011 )](https://support.apple.com/kb/SP619?locale=ja_JP&viewlocale=ja_JP) 魔改造済み
* メモリ: 16 GB
* ストレージ: SSD 512 GB
* OS: macOS Sierra 10.12.6
  
### シェルスクリプト
#### ファイル作成
  
まずは、シェルスクリプトを作成します。ここでは、Mac のターミナルで vim を使って作成します。ファイルの置き場所は、適宜決めてください。今回は「 /Users/ユーザー名/ 」の配下にします。シェルスクリプトのファイル名も、ご自分の好きな名前を付けてください。ただし、拡張子は、「 command 」としてください。ここでは「 update.command 」としておきます。  
  
```
% vim /Users/XXXXXX/update.command
```  
  
スクリプトの中身は以下となります。  
  
```
#!/bin/sh
sleep 30
brew update
brew upgrade

apm update
anyenv update
```  
  
「 sleep 30 」は、Mac が起動して Wi-Fi の電波を掴みに行くための時間で、今回は 30 秒としました。ついでなので、Atom と anyenv のアップデートも入れておきました。  
  
anyenv については、以下をご参照ください。  
* [Mac に anyenv をインストール](https://stangler.hatenablog.com/entry/2019/01/18/161956)


  
#### パーミッション
  
実行権限を付与します。  
  
```
% chmod u+x /Users/XXXXXX/update.command
```
  
#### テスト
  
スクリプトが走るかどうか、update.command をダブルクリックして確認してみましょう。  
  
### 自動起動
  
次に、Mac にログインした時に、シェルスクリプトを動作させるための設定を行います。Mac のシステム環境を開きます。ユーザーとグループをクリックし、「ログイン項目」タブを開いきます。  
  
![20190207_brew_update_自動起動01_システム環境設定01.png](https://qiita-image-store.s3.amazonaws.com/0/344724/7347d3f1-d812-aa86-bbb9-7d6207ab87b9.png)

  
「 + 」マークをクリックします。    
  
![20190207_brew_update_自動起動02_ユーザーとグループ01.png](https://qiita-image-store.s3.amazonaws.com/0/344724/e7ef2432-1a55-967c-a3fd-2dbc56714989.png)

  
先ほど作成した update.command を選択します。  
  
![20190207_brew_update_自動起動03_update_command_追加01.png](https://qiita-image-store.s3.amazonaws.com/0/344724/9739e85a-1f81-66ba-ff97-d59fc07b076b.png)

 
  
するとログイン項目に update.command が追加されました。  
  
![20190207_brew_update_自動起動04_update_command_追加02.png](https://qiita-image-store.s3.amazonaws.com/0/344724/e8839c89-7dd7-d9e7-27a8-c40cbcebdb76.png)

  
### 確認
  
Mac を再起動して、スクリプトが走るかどうかを確認してみてください。  
  
以上です。
GAEとCloud IAPでGoogle認証でアクセス制御付きのサイトを作る

# やりたいこと
社内向けサイトの構築にあたってGoogle認証を使ってアクセス制御をしたいと思っていました。
上記のアクセス制御を実現できるIdentity-Aware Proxy(Cloud IAP)というサービスがあるのを知ったので検証してみました。
Gmailの独自ドメイン(Gsuite)を使用していてドメインでサイト（アプリ）のアクセス許可をしたい！という場合の手順になります。


# 事前作業
## GCPのアカウントを取得する
大前提ですね。GAEを使用しますので、クレジットカードの登録が必要です。

## Cloud SDKをインストールする
アプリをデプロイする際に必要ですのでインストールしてください。
[このページ](https://cloud.google.com/sdk/?hl=ja)からダウンロードできます。

## GAEにアプリをデプロイしておく
アプリの作成方法がわからない方は、Google公式のドキュメントがありますので、[こちら](https://cloud.google.com/appengine/docs/standard/php/getting-started/hosting-a-static-website?hl=ja)を参照してください。

# 手順

## GCPコンソールにログインしてApp Engineのダッシュボードからアプリケーションを作成する
無料枠を利用する場合はus-のリージョンを選択することに注意してください。

## Identity-Aware Proxyの設定を行う
OAuthの同意画面を設定していない場合、この段階で同意画面を作成するように促されるので、適切に設定してください。

Identity-Aware Proxyの設定画面を表示し、アクセス制限の対象とするアプリケーションを選択してください。
その後、右側のカラムに表示されている「メンバーの追加」ボタンを押します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/223632/146fe76b-0451-bc1d-5b19-70e8cca91df7.png)

アクセスを許可したいドメインやGoogleグループ、アドレスを入力します。
役割は「Cloud IAP > IAP-secured Web app User」を選択してください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/223632/5d9d4726-8599-466e-525b-fa3c70f4e293.png)

設定完了後、IAPを有効にしてアクセス制御が動いていることを確認してください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/223632/cd2048de-7858-0280-7f72-6d73941d6cfa.png)


# 補足
コンテキストルート直下のindex.htmlにはアクセス制御がかからない？
IAPの設定反映に時間がかかるのか、設定そのものが悪いのかわかりませんが、コンテキストルート直下のindex.htmlには認証なしでアクセスできたことがありました…
対策としてindex.htmlはリダイレクトするだけのページにして、下位ディレクトリのhtmlに飛ばすようにしました。
Vuex Store設計

メモ
あとで記事にする

https://medium.com/studist-dev/ddd-vuex-c47055f6c1ba
mapstate、mapmutaionは使わない？

mapState, mapGettersはcomputed内
mapMutations, mapActionsはmethods内

https://www.webopixel.net/javascript/1240.html
https://engineer.recruit-lifestyle.co.jp/techblog/2016-09-15-try-vue-flux/
https://zukucode.com/2017/04/vuex-mutation-state.html
mutationをコールするとき、mutationの指定は文字列で行います。文字列をconstで定義しておけばmutationの宣言やコールを全て定義したconst変数で行えるため、コーディングミスが減り、保守性も上がります。

API汎用性
https://kntmr.hatenablog.com/entry/2018/02/28/200112
https://nxpg.net/blog/?p=11992


Vuex利用シーン

ページをまたぐ
APIのデータをキャッシュ
UIの操作として活用　→ モーダルなどグローバル領域にアクセス

Vuexをどこまでとするか

コンポーネント内で使うデータはコンポーネントのdataプロパティとして使う
コンポーネントを超えて、共有するものは
pauseコンテナについて

#概要
kubernetesのpodには自動的にpauseコンテナというコンテナが起動する。
こいつは何者なのか？という話
kubernetes を運用している中で、podがteminatingのまま消えない現象の時、pause コンテナがout of memory で kill されている現象が起きていたことが多かったのでついでに調査。

#実装
非常に短い。C言語 が読めるならすぐ。
なんでgo じゃないんだろう？？
https://github.com/kubernetes/kubernetes/tree/master/build/pause

#コンテナとはノードのリソースを割り当てられたプロセス
題名の通り、「コンテナ」とは Linuxのプロセスに対し、名前空間とcgroup でいろんなリソースを隔離して与えられたプロセス。

ここら辺を参考に
http://gihyo.jp/admin/serial/01/linux_containers/0002

#pauseコンテナはネットワーク名前空間とPID名前空間に関係する
このあたりを
https://www.ianlewis.org/en/almighty-pause-container

##PID名前空間
隔離されたPID名前空間(つまり、コンテナとして起動されたプロセスが存在するPID名前空間のこと)では新たなプロセスIDが1から振られる。

ここで通常のプロセスの関係を思い出すと、子プロセスが死ぬと親プロセスがwaitするまではカーネルのプロセステーブルに残り続ける。いわゆるゾンビプロセス。
先に親プロセスが死んだ場合は、子プロセスの親はプロセスID 1、つまりinitプロセスになる。

この関係を覚えたままPID名前空間に戻ります。プロセスID 1 には子プロセスを看取る役割がある。
ということはコンテナとして起動されたプロセスにもその役割が期待される。それを担当するのがpauseコンテナ。
実装を見ても waitpid に引数 -1 を渡して実行(任意のプロセスを待つ)しているのが見て取れます。

https://github.com/kubernetes/kubernetes/blob/master/build/pause/pause.c

```c
static void sigreap(int signo) {
  while (waitpid(-1, NULL, WNOHANG) > 0)
    ;
}
```

ただこういうpauseコンテナがなくても、コンテナとして起動されたプロセスはカーネルから見たらただの一つのプロセスにすぎないため、最終的には親プロセスが死んだとしても結局はinit プロセスの子プロセスになるのだと思われる。
podにゾンビプロセスを溜めないための仕組みといった感じを受ける.


##ネットワーク名前空間
docker を例に説明します。
docker では通常コンテナを起動するときに新たにネットワーク名前空間が付与される。
https://tech.uzabase.com/entry/2017/08/07/172411



ただ、オプションですでに起動しているコンテナのネットワーク名前空間を使用することもできる。
上で紹介したサイト内の一部を抜粋。

```bash
docker run -d --name ghost --net=container:pause --ipc=container:pause --pid=container:pause ghost
```

つまり、最初にネットワーク名前空間を規定しているコンテナが存在すれば、後から起動するコンテナ達(まとめてpod となる単位)はそのネットワーク名前空間を共有できる。
おそらく、ネットワーク名前空間上で実行しているプロセスが死ぬとその名前空間が消滅するので用意しているのかな～と思ってます。

参考
https://tenforward.hatenablog.com/entry/20160726/1469533536

#結局terminating との関係は？
調査中
メモ書きレベルの LINE BOT With GAS＋FusionTables

# メモ書きレベルの LINE BOT With GAS＋FusionTables

ゆっくりですが日々情報追記していきます。

## やりたいこと
- LINEBOTから送信（reply）されたメッセージの受信
- 送られてきたメッセージに対し、決められた文字列をDB登録

## やったこと
1. LineBotの作成
   省略
  
1. GAScriptの作成
   省略

1. FusionTablesの作成
   新規テーブル作成
   
1. 行き詰ったこと

データINSERTするために権限(*)を付与する必要がある。
*)GAScript側で設定を行う。※Selectは権限不要だが、INSERT,DELETEは権限必要らしい。
  GAS->リソース->Google拡張機能->FusionTablesAPIをONにする
  これらのサービスを Google Cloud Platform API ダッシュボード でも有効にする必要があります。のリンクへ飛ぶ。
  GCP->APIとサービスを有効化->検索する「FusionTables」->有効にする->アカウントを許可

作成した②③の間でデータのやりとりができるようになる。
->SQLが実行できるようになる。

1. FusionTablesとのSQLでのやりとり

```JavaScript:GASでSelectCount
  var id = <検索したいuserID>
  var tableId = <対象テーブルのdocId>

  var sql = "SELECT count(id) FROM " + tableId + " WHERE id = '" + id + "';";
  var result = FusionTables.Query.sqlGet(sql);
  return result.rows[0]; //0とか1などの件数
```

//随時追記
Androidエンジニアの僕が行きたい国内カンファレンスメモ

自分が出たい年１レベルで開催されるカンファレンスのメモ 国内に絞っています
最新のものは既に終わってたり、予約締切したりしているものもありますが、時期感とこのようなことをしてるんだ
という規模感を忘れないようになるべく最新のものを記載しています

もしこういうのもあるよ　というのがあればぜひ教えてください！

### 企業系

| Name                         | Date       | URL                                      |
|------------------------------|------------|------------------------------------------|
| Mercari Tech Conf            | 2018/10/4  | https://techconf.mercari.com/            |
| Yahoo Tech Conference        | 2019/1/26  | https://techconference.yahoo.co.jp/2019/ |
| AbemaTV DEVELOPER CONFERENCE | 2018/10/13 | https://developer.abema.io/2018/         |
| DeNATechCon                  | 2019/2/6   | https://techcon.dena.com/2019/           |
| Cookpad Tech Conf            | 2019/2/27  | https://techconf.cookpad.com/2019/       |
| Sansan Builders Box          | 2018/11/10 | https://jp.corp-sansan.com/sbb2018/      |

### Android

| Name                         | Date       | URL                                      |
|------------------------------|------------|------------------------------------------|
| Droid Kaigi            | 2019/2/7,8  | https://droidkaigi.jp/2019/            |
| Kotlin Fest        | 2018/8/25  | https://kotlin.connpass.com/event/91666/ |

### UI/UX, デザイン
| Name                         | Date       | URL                                      |
|------------------------------|------------|------------------------------------------|
| WHY DESIGN TOKYO            | 2019/2/9,10  | https://eventregist.com/e/whydesignokyo2019            |
| UX DAYS TOKYO        | 2019/4/5-7  | https://2019.uxdaystokyo.com/ |
| DesignShip | 2018/12/1,2 | https://design-ship.jp/         |

### 開発手法
| Name                         | Date       | URL                                      |
|------------------------------|------------|------------------------------------------|
| Regional Scrum Gathering Tokyo           | 2019/1/9-11  | https://2019.scrumgatheringtokyo.org/index.html            |
| XP祭り        | 2018/9/8  | http://xpjug.com/xp2018/ |
| Agile Japan        | 2018/7/19  | https://www.agilejapan.org/ |
PHPとKotlinのパフォーマンス比較

# PHPとKotlinのパフォーマンス比較

## 条件

- 共通
    - /helloにアクセスするとHello World!を出力する
    - それぞれ数回実行して、だいたいの平均を取る

- php
    - docker-composeで構築
    - php-fpm:7.2
    - opcache あり/なし
    - nginx
        - (opcacheありの場合のみ) Unixソケット/TCPソケット
    - slim/slim:3.12.0 (Webマイクロフレームワーク)

- kotlin
    - kotlin:1.3.11
    - com.sparkjava:spark-kotlin:1.0.0-alpha (Webマイクロフレームワーク)

## 結果

### ab -c 1 -n 5000

- php: 140 r/s
- php + opcache + TCP: 740 r/s
- php + opcache + Unix: 870 r/s
- kotlin: 6800 r/s

### ab -c 100 -n 5000

- php: 620 r/s
- php + opcache + TCP: 3700 r/s
- php + opcache + Unix: 3900 r/s
- kotlin: 18500 r/s
Amazon VPCについてまとめてみた

まずVPC内でどのようなIPを利用していくか範囲を指定します。
# IPv4 CIDR blockの決め方
IPv4 CIDR blockはプライベートIPアドレス帯から指定します。
前提として、IPアドレスは大きくグローバルIPアドレスとプライベートIPアドレスの2種類あり、
グローバルIPアドレスが、「インターネットに接続する際に利用されるIPアドレス」、
プライベートIPアドレスが「閉じた世界で通信を行う際に利用されるIPアドレス」です。
VPCはAWSクラウド上の仮想ネットワークであり、そのリソース内で通信を行うため、プライベートIPアドレス帯から選択する必要があります。

10.0.0.0 - 10.255.255.255 (10.0.0.0/8)
172.16.0.0 - 172.31.255.255 (172.16.0.0/12)
192.168.0.0 - 192.168.255.255 (192.168.0.0/16)

# サブネット
先ほど作成したVPCから、さらに区分けしたものがサブネットです。
AWSリソースは、指定したサブネット内に配置することができるため、用途に応じてVPCを区分けします。
## パブリックサブネット
インターネットに接続する必要があるAWSリソースにはパブリックサブネットを割り当てます。
## プライベートサブネット
インターネットに接続しないAWSリソースにはプライベートサブネットを割り当てます。

# ルートテーブル
後日
# インターネットゲートウェイ
後日
# DHCPオプションセット
後日
# Elastic IP
後日
# NATゲートウェイ
後日
【Unity】UIと重なったオブジェクトをタップする

## UIと重なったオブジェクトをタップする

モバイルアプリで、オブジェクトのタップをRayCastで検知する実装の場合
オブジェクトと重なったUIの操作とオブジェクトのタップの両方を
処理してしまう場合があります。

## EventSystem .IsPointerOverGameObjectを使う

そんな時は、EventSystem .IsPointerOverGameObjectを使用すると良いらしいです。

``` cs
if (Input.GetMouseButtonDown(0)) {
   // UIの上なら、タップとみなさない
   if (EventSystem.current.IsPointerOverGameObject(Input.GetTouch(0).fingerId)){
         return;
   }
}

```

---
知っていれば、すぐに使える機能。
だけど、知っていなければ使えない。
知るためには、とにかくコードを書いて、いろんな状況に出くわして
そして調べていかなければならない。

知識を深めるために、今はとにかく
いろんなコードを書いてみようと思いました。
bundle outdated で開発用の gem だけをチェックする

Bundlerには標準で `bundle outdated`という古くなっているgemを一覧表示するコマンドがありますが、実プロジェクトでは自動テストが未整備だったりテスト工数が取れなかったりして、gemを更新できないことも多いです。

とはいえ、rspecなどの開発ツールについてはアップデートしてもproductionに影響しない[^1]ので、うちではこんな風に**development と test のライブラリのみ古くなっていないかチェックしています。**

[^1]: 厳密にはproductionへ影響することもあります。`bundle update`ではrspecが依存するライブラリも自動でアップデートされますが、同じライブラリを本番でも使っていることもあるからです。ただ、実際にそれで不具合が起きた経験はありません。

```yaml
# .gitlab-ci.yml

# gem が古くなっていないかチェックする
# development, test のみをエラーにする
bundle-outdated:
  variables:
    GREP_PATTERN: 'in groups ".*\(development\|test\).*"'
  script:
  - 'set +o pipefail'
  - 'bundle outdated | grep "$GREP_PATTERN" | tee bundle-outdated-dev.txt'
  - '[ ! -s bundle-outdated-dev.txt ]'
  only:
    - master # master ブランチでのみチェック。開発ブランチでチェックするのは冗長だし、どのみち修正は別のブランチで行うため。
```
CentOSで作業ユーザ追加と公開鍵認証設定

##やりたいこと
- rootでの作業を止めて、作業ユーザを追加
- ID、PWログインを止めて、公開鍵認証に切り替え

##前提
- CentOSをインストール済み
- ホストPC(mac)からアクセスできる（root@IPアドレスでログイン）


##環境
- VirtualBox 6.0.4
- CentOS 6.10
- macOS 10.14.3

##前置き
どちらもコマンド画面で作業するので、初めてやった時ホスト側から打つのか、それともCentOS側から打つのかぐっちゃぐちゃになってしまったので、一括して以下の通りに書きます。

Host側 : mac
Guest側 : CentOS


##Guestにログイン

```terminal
$ ssh root@[IPアドレス]
```

>パスワードを聞かれるからrootで設定したPWを入力
>以下のようになればログイン成功

```terminal
[root@localhost ~]#
```


##作業ユーザの作成

```diff:Guest側
# su -
# useradd [作業ユーザ名]
# passwd [作業ユーザ名]
　　　　パスワードを2回入力
# exit
　　　　　一旦 rootから抜ける
```

###作業ユーザでログインしてみる。

```terminal:Guest側
# ssh [作業ユーザ名]@[IPアドレス]
パスワード入力

[[作業ユーザ名]@localhost ~]$
```

>成功！入れました。
>また後で、使うのでログインしたままでOK


##新しくターミナルを開いてHost側で、鍵を生成する。

```terminal:Host側
$ cd .ssh/
$ ssh-keygen -t rsa -b 4096
$ Enter file in which to save the key (/Users/<PCのユーザー名>/.ssh/id_rsa): <鍵の名称>
$ Enter passphrase (empty for no passphrase): <パスフェーズ>
$ Enter same passphrase again: <パスフェーズ>
```
>パスフレーズは入れなくてもOK

##作った鍵をVMの方にコピーする

```terminal:Host側
$ scp ./[鍵の名称].pub [コピーする作業ユーザ名]@[IPアドレス]:~/
##コピーする作業ユーザのパスワードを入力する

testtest.pub                               100%  756   856.5KB/s   00:00
```

##コピーしたファイルがGuest側にあるか確認

```terminal:Guest側
$ ls
testtest.pub
```

##.sshファイルを作る

```terminal:Guest側
##パーミッションの設定も。
$ mkdir .ssh
$ chmod 700 .ssh
```

.sshの中に鍵ファイルを移動

```terminal：Guest側
$ mv testtest.pub .ssh
$ cd .ssh
$ ls
testtest.pub
```

鍵ファイルをリネーム、パーミッション設定

```terminal：Guest側
$ mv testtest.pub authorized_keys
$ ls
authorized_keys
$ chmod 600 *
```

##rootに戻ってsshdを変更する

```terminal:Guest側/root
$ su -
# cd /etc/ssh
# ls
##sshd_configが入っているはずなので、それをvimで編集
# vi sshd_config
```

>**変更点**
- PasswordAuthentication no
- PermitRootlogin no
(#がついているのでコメントインにする)

>**補足**
vimで/を押すと下に文字を入力できる部分が現れる。
そこに検索したい文字を入力すると検索がかかる。

>該当するキーワードが複数ある場合は、Nを押すと次の候補に移動。


sshdを再起動させる

```terminal:Guest側
# service sshd restart
```

##ホスト側から再度ログインしてみる

```terminal:Host側
$ ssh [作業ユーザ名]@[IPアドレス]
[作業ユーザ名]@[IPアドレス]: Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
```
>sshdでパスワード認証ログインを不可にしたので、上のようなエラーが返ってくる

```terminal:Host側
$ ssh -i ~/.ssh/texttest [作業ユーザ]@[IPアドレス]
```
パスフレーズを設定していればこの次に聞かれるので、入力する

```terminal:Host側
[作業ユーザ@localhost ~]$
```
>こうなれば成功


##おまけ
毎度、ssh -i ~/.ssh/texttest [作業ユーザ]@[IPアドレス]を打つのは面倒なので、
簡単に接続する設定をします。

```terminal:Host側
$ vim .ssh/config 
```

```terminal:vim
##　すでに接続情報が書いてあれば消さずにその下に書きます

Host <sshコマンドで呼び出すホスト名>
　　　　　　　　　HostName <接続するIPアドレスかドメイン>
　　　　　　　　　User <作業ユーザ名>
    IdentityFile ~/.ssh/<秘密鍵の名称>
```


以上です。
やっとできた、、、、恥
Jenkinsサーバがディスクフルで死んでた


# はじめに
* Jenkinsサーバを運用中、Jenkinsのジョブ設定をいじろうとすると、ディスクがいっぱいでエラー
* /var/log/jenkins.log が **1TB超えてる**

* ログには以下のような文言が繰り返し

```
..Could not find record class for index..
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/108052/0d541c2a-d4b0-3ebc-d7d5-09cd12c1729e.png)

* 環境
    * OS : CentOS 7
    * Jenkins ver : 2.150.2

# やったこと

* 参考
    * https://issues.jenkins-ci.org/browse/JENKINS-29490


* 以下を設定
    * ファイルは: `/etc/sysconfig/jenkins`

```
JENKINS_JAVA_OPTIONS="-Djava.awt.headless=true -Dhudson.DNSMultiCast.disabled=true"
```

* DNS Multicast を無効化するオプションだとそうな。 (なにをやっているのか、今度調べる)

* サービス再起動

```
 service jenkins restart
```

```
$ ps -ef | grep jenkins
jenkins  21045     1 24 12:34 ?        00:00:27 /etc/alternatives/java -Dcom.sun.akuma.Daemon=daemonized -Djava.awt.headless=true -Dhudson.DNSMultiCast.disabled=true -DJENKINS_HOME=/var/lib/jenkins -jar /usr/lib/jenkins/jenkins.war --logfile=/var/log/jenkins/jenkins.log --webroot=/var/cache/jenkins/war --daemon --httpPort=8088 --debug=5 --handlerCountMax=100 --handlerCountMaxIdle=20
```

* 指定した `-Dhudson.DNSMultiCast.disabled=true` で動いていますね。

# 効果

* まだ判断できませんが、1週間くらいたっても起きなかったらこれで良しとします
【ServiceNow】最強に便利な「Dot-walking」 

#１．Dot-Walkingとは？
ServiceNow でリスト、フォーム、関連リスト を設計する際、ベースになるテーブル以外の項目をまとめて表示させたいときって、ありますよね。例えば、ベースになるテーブルには社員番号しかないけれど、表示は社員テーブルの方の氏名やメールアドレスも表示させたい場合など。こんな時にとても便利なのが「Dot-Walking」という機能です。(「最初に言ってよ～」ってレベルの痒いところに手が届く超便利機能です)

※本記事のServiceNow環境はLondonです。

# ２．Dot-Walkingの 使い方(リストレイアウト編)
今回はサンプルとして「インシデント」リストの「問い合わせユーザー」の隣にそのユーザーのメールアドレス(sys_userテーブル)を表示させます。サラッと見ると、リストに列を追加しているだけに見えますが、インシデントテールブルと異なるテーブルの値を表示させているところがポイントです。

①「インシデント」リストの列名の[≡]ボタンをクリック＞「構成」＞「リストレイアウト」を開きます。
![ss013 - インシデント ｜ ServiceNow - Google Chrome.png](https://qiita-image-store.s3.amazonaws.com/0/340027/69a8bbed-ee6b-facb-de93-43d20536b403.png)

②開いた「リストレイアウト」の「利用可能」から「問い合わせユーザー」を探します。
　この時「問い合わせユーザー」が色付き項目になっていて右側に[+] がついていることがポイントです。
　これはインシデントテーブル内で「問い合わせユーザー」が外部参照列(参照フィールド)になっていることを意味しています。
　
　そして、「問い合わせユーザー」をクリックすると「利用可能」ボックスと「選択済み」の間に展開ボタンが表示されることを確認します。
![ss016 - ServiceNow - Google Chrome.png](https://qiita-image-store.s3.amazonaws.com/0/340027/754cb8de-7753-ec0f-b8e5-4fc64f290d3d.png)

③展開ボタンをクリックすると、「問い合わせユーザー」の参照先であるユーザーテーブルががばっと展開されます。

![ss017 - ServiceNow - Google Chrome.png](https://qiita-image-store.s3.amazonaws.com/0/340027/825c0bd4-8d9c-2ff8-360c-e78308f2c670.png)

④ここからリストに表示したい「メール」列を探して選択すると、「選択済み」ボックスに「問い合わせユーザー.メール」が追加されます。挿入位置は「問い合わせユーザー」の下に調整しましょう。
![ss019 - ServiceNow - Google Chrome.png](https://qiita-image-store.s3.amazonaws.com/0/340027/9ddac343-aad3-0d18-e9f5-2c1d589be1df.png)


⑥右上の「保存」ボタンをクリックすれば設定完了です。インシデントリストの「問い合わせユーザー」の隣に「メール」列が表示されていることが確認できます。
![ss020 - インシデント ｜ ServiceNow - Google Chrome.png](https://qiita-image-store.s3.amazonaws.com/0/340027/fab968b5-6275-32ae-4571-0a13a7967b27.png)


# ３．Dot-walkingの 使い方(フォームレイアウト編)
詳細は省略しますが、フォームレイアウトでも同じようにDot-walkingは使用可能です。


# ４．使用上の注意
①つなげすぎにはご注意を
Dot-walkinig は理論的には参照先の参照先のそのまた参照先の…と外部参照キーをたどってどこまでも行けそうですが、内部処理的にはテーブル間を内部結合しているハズですのでその分負荷が高くなります。外部参照キーをたどるのはせいぜい2～3までにするのが無難です。(後述の公式ドキュメントでも「チェーンの長さの推奨上限は 3 レベルです。」とあります)

②継承テーブルによっては参照できない列もある
実際に案件で困って、最終的に断念した話です。cmdb_ci_xxx のようなテーブルは大元のcmdb_ciテーブルを継承していますが、インシデントの「構成アイテム」はcmdb_ci に対する外部参照になっているため、例えば「cmdb_ci_server」固有の項目はDot―walkingでは引っ張ることができませんでした。残念！

# ５．参考
・公式：Dot-Walking(英語)
https://docs.servicenow.com/bundle/geneva-servicenow-platform/page/use/navigation/concept/c_DotWalking.html

・公式：ドット連結を使用した拡張テーブル フィールドのレポート(日本語)
https://docs.servicenow.com/bundle/london-performance-analytics-and-reporting/page/use/reporting/concept/extended-table-fields-dot-walking.html
Mac OS Mojave にしたら Sequel Pro がクラッシュするようになった

Sequel Pro 1.1.2 のお話です。

ついこの間、High Sierra から Mojave にしたら（といっても昨年のお話）
Sequel Pro がクラッシュするようになった。:rage::rage::rage:

アプリを閉じる、タブを閉じる、などの『閉じる』操作を行うとクラッシュするみたい。

GitHub の Issue がめっちゃ多い（笑）


と、笑っている場合ではなくて、
タブを何個も開いているときにこれをやっちゃうと凹むので、
なんとかならないかな〜Fixされないかな〜と思っていたら1つの一時的な解決策が！！！


テ　ス　ト　版　を　使　う
https://sequelpro.com/test-builds

ということで、（一時的に）解決しました:relaxed::relaxed:

おしまい
Python: if __name__ == "__main__"の有無による動作を確認

# はじめに
if \_\_name__ == "\_\_main__"の有無による動作を確認したメモ。  

# 結果  
- ソースコードは以下。

```client.py
# coding: utf-8
"""if __name__ == '__main__':について.

もしimportすると実行するようにしたければ以下のようにcalled.pyを書き変える。

＜変更前＞
if __name__ == '__main__':
    main()
＜変更後＞
main()

"""

print('client--------------------start')
import called
print('client--------------------end')
```


```called.py
# coding: utf-8
def main():
    print('呼ばれました')


if __name__ == '__main__':
    main()


# main()
```

- 実行例は以下。

```実行例＜変更前client.pyを実行＞.
client--------------------start
client--------------------end
```  

```実行例＜変更前called.pyを実行＞.
呼ばれました
```  


```実行例＜変更後client.pyを実行＞.
client--------------------start
呼ばれました
client--------------------end
```


# 参考  
[Pythonのif \_\_name__ == "\_\_main__" とは何ですか？への回答](http://blog.pyq.jp/entry/Python_kaiketsu_180207 "Pythonのif \_\_name__ == "\_\_main__" とは何ですか？への回答")
事前学習


# 全体図

## webプリケーションって？

平たく言うとブラウザーと、サーバーのやりとり　で、

1情報（データ）
2レイアウト
3ロジック（アプリケーションの動作の決まり）

をやりとりしている。


※このURLに図解あり
https://www.sejuku.net/blog/1046

## 上記3つをやりとりする役割を誰がになっているか？

情報（データ）　は　【DB】

レイアウト　は、【HTMLCSS】

ロジック（アプリケーションの動作の決まり）は、【ruby　rails】
※ロジックはrubyが担当。ロジックの塊をまとめて整理するのがrailsの役割


## 学習の流れ

1 レイアウトの学習
HTML CSS
2 ロジック（アプリケーションの動作の決まり）
ruby rails

3 簡単なアプリケーションを作ってみよう！

### こんなアプリを作るよ

https://github.com/Awtanabe/blog_for_feshman

torello
https://trello.com/b/wlLEUDSB/rails-app

4 情報（データ）
データベースについて。ここは時間があれば！


## まず！　
### progateの、HTML & CSS（学習編 ）上級までやろう!


## 補足　webアプリケーションの全体像【追記中】

https://magazine.rubyist.net/articles/0059/0059-Ruby-Rails-Beginners-Guide.html
Android Developers Blog 適当意訳 #2 Get your apps ready for the 64-bit requirement

# アプリの64-bit対応に備えてください
2019年1月15日

[原文](https://android-developers.googleblog.com/2019/01/get-your-apps-ready-for-64-bit.html)
**※英語の勉強と自分用のメモ程度のかなり適当なものです。**


64-bitのCPUはより早く、リッチな体験をユーザーに提供します。
加えて、あなたの64-bit対応のアプリはパフォーマンス改善を提供し、将来の技術革新や64-bitのみをサポートする端末への備えとなります。

我々はあなたの64-bit対応への手助けをしたいと思っていますし、あなたが計画を立てるための時間が必要だという事もわかっています。
我々はAndroid 5.0 Lollipop から 64-bitのCPUをサポートしてきました。また、2017年に始めてネイティブコードを使っているアプリは必ず64-bitバージョンのものを提供しなければいけない(加えて32-bitバージョンも)旨を [告知](https://android-developers.googleblog.com/2017/12/improving-app-security-and-performance.html) しました。
本日我々はより詳細な情報をお伝えすると共に、2019年に起こる変化に出来る限り簡単に対応するためのタイムラインを提供します。

### 64-bit対応: 開発者にはどんな意味があるのか

**2019年8月1日から:**

- 全てのネイティブコードを含む新規アプリと既存アプリの更新は Google Play への公開時には64-bitと32-bitバージョンのものが要求されます
- Unity5.6以下を使っている既存のアプリに関しては、Google Play は2021年8月までは32-bitのみのアプリの更新を受け入れます

**2021年8月1日から:**

- Google Play は64-bitに対応していないアプリの64-bit対応デバイスへの配信を停止します。つまり、64-bitに対応していないアプリは64-bit環境のデバイスの Play Store では利用出来なくなります
- これにはUnity5.6以下を使っているアプリも含まれます

**以下のものには64-bit対応は求められません**

- 明示的にアプリ、もしくは app bundles が Wear OS もしくは、 Android TV(64-bitに現在規格としてサポートしていない) をターゲットに指定しているもの
- アプリ、もsくは app bundles が Android9 Pie 以上向けに配布されていないもの

我々は32-bitへのサポートのポリシーへ変更していません。Google Play は32-bitのデバイスへ引き続きアプリを配布します。
今回の要求は32-bitのネイティブコードを使用しているアプリは同様に64-bitバージョンにも対応してくださいというものです。

### 64-bit対応への備え

我々は大半の開発者は64-bitへの移行は容易だと考えています。
なぜなら多くのアプリは全て非ネイティブコード(例えば Java や Kotlin)で書かれており、それらのアプリはコードの変更は必要ないからです。

**全てへ開発者:** 下記はあなたが64-bitの要求に対応するための概要です。より詳細な情報は我々のより詳細な [ドキュメント](https://developer.android.com/distribute/best-practices/develop/64-bit) を参照してください。

- APK もしくは、 app bundle を調査します。 [APK Analyzer](https://developer.android.com/studio/build/apk-analyzer) を使う事で .so ファイルを確認出来ます。 .so ファイルがあなたのコードから生成されたものか、あなたが使っているSDKもしくはライブラリから生成されたものかを確認してください。もし、 .so ファイルがない場合は、あなたのアプリは既に64-bitに対応しています。
- 64-bitアーキテクチャを有効にし、あなた自身が書いたコードからネイティブコード(.soファイル)を再生成してください。詳細は [ドキュメント](https://developer.android.com/distribute/best-practices/develop/64-bit) をご覧ください。
- 必要であれば、あなたのアプリが使用しているSDKとライブラリを64-bit対応バージョンに更新してください。もし、64-bit対応していないSDKもしくはライブラリがあったら、手を差し伸べてあげてください。我々は現在有名ライブラリのオーナーと64-bit対応を進めています。
- 問題がないかテストを行なってください
- [testing tracks](https://support.google.com/googleplay/android-developer/answer/3131213?hl=en) を使ってテスターに配布してください

**ゲーム開発者:** 3つのもっとも使われているゲームエンジン(Unreal, Cocos2d, Unity)は現在全て64-bitに対応しています。我々はサードパーティーのゲームエンジンの移行が大変で時間のかかる作業であるという事を理解しています。

最近になってUnityが2017年4月2018年2月に64-bit対応を提供したので、我々は5.6以下の既存のアプリは2021年8月まで64-bit対応の期限を延長しました。Unitが64-bit対応の[ガイド](https://docs.unity3d.com/Manual/UpgradeGuides.html)を提供しています。

**SDK、ライブラリオーナー:** アプリ開発者に対応する時間を与えるために、出来るだけ早く64-bit対応版を提供し、開発者に知らせてください。ユーザーへの提供を容易にするための最新のツールや情報を受け取るために、[あなたのSDK、ライブラリを登録してください](https://docs.google.com/forms/d/e/1FAIpQLSfpLu80YoKRpkb17s_Jxq3bQMmAvMBHjt3cnlECV-fasE3Tvg/viewform)。


**今後**

もしまだ64-bitに対応していない場合(既に対応していただいた方はありがとうございます)は、我々はあなたが出来るだけ早く64-bit対応を行えるよう手助けをします。
対応期限が近くにつれ、我々はアプリが対応しているかの確認方法を開発者用ドキュメントに記載します。
我々は64-bitのCPUがもたらすAI,機械学習,VR,ARなどの領域の未来にわくわくしています。
64-bitをサポートする事は、64-bit対応の最新のコンピューター機器がもたらす技術革新や64-bitのみをサポートするAndroid端末への備えになります。
ターミナル背景でRailsを動かす方法

一つのターミナル画面でRail開発していて面倒なのが、
起動してあるRailsを　コントロール + C で抜けて、
mysqlのコマンドをいじったりして、
再度Railsを再起動して、、、
といったターミナル作業である。

iTerm　などのターミナル画面を分割し同時進行できるアプリをインストールしてあれば
iTermを使うのがベストだが、ど〜〜してもiTermが使えない環境の場合は、

一つのターミナルの背景でRailsを動かしつつ、見えるところでmysql使う方法を利用すると便利。

#背景でRailsを動かす方法
ローカル環境でRailsを起動するいつものコマンド　に　`-d` を追加

```
$ rails s -b 0.0.0.0 -p 3000 -d
=> Booting Puma
=> Rails 5.1.6.1 application starting in development 
=> Run `rails server -h` for more startup options
```
`-d` は　`demon` の意味。
`demon` とは、リクエストが来るのを待っているプログラムのこと。
今は、Railsを　起動させてリクエストが来るのを待っている状態にさせて
背景でRailsを起動させている状態が作れる

#背景のRailsを止める方法

```
$ ps ax | grep puma
13803 ?        Sl     0:00 puma 3.12.0 (tcp://0.0.0.0:3000) [/]
13811 pts/1    S+     0:00 grep --color=auto puma
```

`ps ax`　で、　今走っている　プログラムを表示させている。
` | grep puma` で、更に　`puma`　という文字列が含まれているものを抽出した。

この`13803` は、`プロセスID`　と呼ばれるもの。
現時点では、動かしているRailsに相当するので、停止させたい場合は

```
$ sudo kill 13803
```

#背景のRailsが停止していることの確認
```
$ ps ax | grep puma
13815 pts/1    S+     0:00 grep --color=auto puma
```
13803　が　表示されていないので、確かにRails は停止している。
スマートコントラクトのセキュリティ〜【スマートコントラクト≠普通のプログラミング】

#スマートコントラクトは普通のプログラミングでは無い
イーサリウムのコントラクトは、普通のプログラミングではありません。
一度公開されたものは書き換えはできません。
完全な状態まで完成させてから公開しなくてはならないのです。
また、コードに欠陥があった時、必ず悪意を持った人間に攻撃されます。そして、そのプログラムによって起こったことは取り消すことができません。
以上の特徴を踏まえた上で、以下の項目がスマートコントラクトのベストプラクティスです。

##コードは最小限に、機能はシンプルに
プログラムの複雑性が増すと、バグや予期せぬ挙動が増えます。
できるだけコードは短く、できるだけ機能は限定的に、最小限のコードを書く。
##独自の発明をしない
広く用いられているライブラリーやコードを再利用する。広く用いられている手法は、より安全である。
独自の手法の発明は、常にリスクが伴う。
求めている機能を持つライブラリーやコードがないか、まず探すことを優先する。
##最大限の安全性への配慮
スマートコントラクトは、一度公開されると修正が効かない。よって、可能な限り最も厳しい基準で安全性を管理する必要がある。
##可読性、理解しやすいコード
見やすいコードを書くことを心がける。そうすることで、コードの評価がしやすくなる。
イーサリウムのスマートコントラクトは、全て誰もが見れる状態で公開される。このような性質から、スマートコントラクトはオープンソースと相性がいい。その際も、可読性を高めることでより多くの人から評価されることが期待できる。

##できる限りのテストをする
イーサリウム上で公開されるコードは、誰もが利用することができる。その際、開発者が意図した方法でそのが利用されるとは限らない。そのような不確定性があるので、思いつく限りの全てのテストを行い、挙動を確認する。
HTTPSでEC2へのアクセス

HTTPSでの通信を行うことができようになりした。

下記の参考がかなりわかりやすかったです。
なお、ALBのヘルスチェックがうまくできませんでしたが、詳細設定でパスを/ではなく、適当なphpを作成し追加し、
ポートを上書きにすることで買いけるすることができました。

[【AWS】【ELB】AWS初心者がELBのヘルスチェックではまったら](https://qiita.com/daikiichikawa/items/565e6a40bcbf6a32e397)
[AWS Certificate Manager で証明書を発行してALBに割り当てる](https://qiita.com/NaokiIshimura/items/014a163c60feebec570b)
centOS７でローカル上でLAMP環境立ち上げようとした時の話（１）

#１.ローカルでサーバーを立ち上げようとした時の話（１）

###環境とか
- vmware
- centOS7
- 前提条件として取り合えずログインまでしてる事

***
備忘録用にcentOS７でのサーバー構築に関するものになるかな。
サーバー立ち上げは結構やる事あるので、随時流れを更新していこうと考えてる

#2.centOS初期ではネットにつながってない模様
下記のコマンドを打ってもらうとわかるのだが

```command:command
$ nmcli　d
```
おそらく

```
DEVICE 　　　　　　　TYPE　　　 STATE        CONNECTION
(pcによって違うみたい？)    ethernet   disconnected    --
lo                 loopback    unmaneged      --
```
![キャプチャ.GIF](https://qiita-image-store.s3.amazonaws.com/0/356444/8f999a70-d885-40b2-9b80-72696541f562.gif)


***
このように表示されると思うがこれはネットにつながってないためだ

```command:command
$ nmtui
```
コマンドを打ち込むと下記のような画面になると思うので
![キャプチャ.GIF](https://qiita-image-store.s3.amazonaws.com/0/356444/784315cb-9b9a-a01f-92df-ae1bb952df11.gif)

Activate a Connection を選択してやり、activate,deactivateとか選択できる画面になるのでこいつをactivateにしてやるとどうやらネットにつながるようになる模様。
こんな感じ
![キャプチャ.GIF](https://qiita-image-store.s3.amazonaws.com/0/356444/cd812be8-a0b8-26b5-fba1-3b71f4dce334.gif)


再びコマンド画面上で

```command:command
$ nmcli　d
```

を打ってやると
![キャプチャ.GIF](https://qiita-image-store.s3.amazonaws.com/0/356444/dce34af2-8c8b-ea93-3581-1accb67217e6.gif)

これでどうやらネットに繋がった模様。
#3.ちなみに
centOS7ではipconfigが使えなくなっている

```command:command
$ ip addr
```
で確認できるようになってる。というか調べたら最近変わったぽい・・・
データベース操作（SQL）

####SQL(Structured Query Language)とは、

リレーショナルデータベース（RDB）の操作を行うための言語です。


:point_up:簡単にいうと、テーブルとして扱ってきた表形式の構造で管理するデータベースを操作する、ということです。

-------
###目的

ターミナルでデータベースを操作するコード集を作る

----

#####今回は、ターミナルでの操作をまとめて紹介します。

①mysqlにrootユーザーが接続します

```terminal.
mysql -u root
```
コレをすることで

```terminal.
mysql>
```
となります。


②データベース作成

```terminal.
mysql> CREATE DATABASE データベース名；
```


③データベースができているか確認

```terminal.
mysql> SHOW DATABASES;
```


＊データーベースを削除する場合

```terminal.
mysql> drop database データベース名 ;
```

:point_up_tone1:アプリを作った場合は、そのアプリ配下まで移動してコレ

```terminal.
$ rake.db:drop

```

---
#####続いて、USE文を使ってデーターベースを選択します。

```terminal.
USE データベース名;
```
```terminal.
myaql> USE test;
Database changed
mysql>
```

-----
#####テーブル構造の操作

◎データーベースに存在するテーブル一覧表示

```terminal.
mysql> SHOW TABLES;
```
◎テーブル作成

```terminal.
CREATE TABLE テーブル名 (カラム名 カラム名の型, ……);
```

:point_up:カラム名の型
      数字　　　　　　INT
      文字列　　VARCHAR(M)

文字列のVARCHAR(　)の( )には、文字列の最大の容量（つまり、(5)なら最大５文字文の容量を格納するということ)です。

```terminal.
mysql > CREATE TABLE sports ( id INT,name VARCHAR(20));
```

◎テーブル確認

```terminal.
SHOW TABLES;
```

◎テーブルの構造確認

```terminal.
SHOW colums FROM sports;
```

-----
#####作成したテーブルを操作

◎テーブル内容の変更
・カラムの追加

```terminal.
ALTER TABLE テーブル名　ADD (カラム名　カラムの型);
#2つ以上追加の場合は、　, を入れて書いていく
```

・カラムの修正

```terminal.
ALTER TABLE テーブル名 CHANGE 古いカラム名 新しいカラム名 新しいカラムの型;
```

・カラムの削除

```terminal.
ALTER TABLE テーブル名 DROP カラム名;
```
---

◎データを登録する
・テーブルのカラムにデーターを登録する

```terminal.
#全てのカラムに値を入れる
INSERT INTO テーブル名　VALUES(値１,値２,値3);

#特定のカラムのみに値を入れる場合
INSERT INTO テーブル名(カラム名１,カラム名2) VALUES(値１　, 値２);

#例
INSERT INTO SPORTS VALUES(1, "花子", テニス);

#例
INSERT INTO sports(id, name) VALUES(2, "山田");

```

・テーブルにあるレコードを全て表示する

```terminal.
SELECT * FROM sports;
```

・データの更新をする

```terminal.
UPDATE テーブル名 SET 変更内容 WHERE 条件;

例
UPDATE sports SET name =　"田中" WHERE id = 2;

#:WHERE は　どのデータを変更するのかを書く
例：　WHERE id = 2

```

・データの削除

```terminal.
DELETE FROM テーブル名 WHERE 条件;

例
DELETE FROM sports WHERE id = 2;
```


今回はターミナルでデータベースを操作するコードをまとめました。
python入門(2)~書式指定と入出力~

#書式指定と入出力
##書式指定の出力
pythonでは「%」を使って書式指定ができます．

```python:form.py
print('%d' % 3)
a = 2
print('%d' % a)
print('%d-%dは%dです' % (5, a, 5-a))
print('%.2fは%sです' % (3.14, '小数'))
```

```tex:実行結果
3
2
5-2は3です
3.14は小数です
```
pythonの書式設定ではc言語やjavaと違い「,」ではなく「%」を用います．また，複数のホフォーマットをカッコで囲んで利用することが出来ました．書式の種類は以下の通りです．

|書式|意味|
|:-:|:---------------:|
|%d|小数で10進数を表示 (1, -5)|
|%x|整数を16進数で表示 (1d)|
|%X|整数を16進数で表示 (2A)|
|%f|実数を表示 (2.00000)|
|%s|文字列を表示 (S, abc, た)|
###桁数の指定

```python:form2.py
print('%5d' % 12)
print('%-5d' % 12)
print('%05d' % 12)
print('%.5d' % 1.23)
```

```text:実行結果
   12
12   
00012
1.23   
```
##format()メソッド
format()とは文字列にデータを埋め込み，出力できるようにするメソッドです．

```python:form3.py
a = 'スーパー'
b = 'ウルトラ'
c = 'デラックス'
print('{}{}{}' .format(a, b, c))
print('{1}{0}{2}' .format(a, b, c))
```

```text:実行結果
スーパーウルトラデラックス
ウルトラスーパーデラックス
```
###書式指定の方法

```python:form4.py
print('{:,}' .format(4000000000))
print('{:>6}' .format(125))
print('{:<6}' .format(125))
print('{:^5}' .format(125))
print('+' * 6)
```

```text:実行結果
4,000,000,000
   125
125   
 125 
++++++
```
pythonの書式指定では上記のように「,」や空白によって桁数を揃えることができます．
##キーボードからの入力
pythonではinput()関数を使い入力を受け取ることができます．

```python:inPut.py
name = input('あなたのペットの名前は何ですか?:')
age = input('あなたのペットは何歳ですか?:')
print('{}は{}歳です．' .format(name, age))
```
```text:実行結果
あなたのペットの名前は何ですか?:ポチ
あなたのペットは何歳ですか?:3
ポチは3歳です．
```
##sepとend
sepは区切り文字を指定し，endは末尾に追加したい文字をして指定します．

```python:form5.py
print('フォ', 'ル', 'トゥ', 'ナ', sep=',', end='の')
print('瞳')
print('吾', '輩', 'は', sep='', end='')
print('猫', 'である', sep='', end='')
```

```text:実行結果
フォ,ル,トゥ,ナの瞳
吾輩は猫である
```
sepは区切りの部分に指定した文字を追加できます．endは末尾に指定した文字を追加できます．また，空文字を指定するとsepは何も表示せずendは改行なしになります．
##最後に
少しずつpythonを学んでいきましょう．
GithubDesktopからpushする際に、何回もgithubのemailとpasswordを入力させるポップアップが出て来る問題

##起きている問題
GithubDesktopからpushする際に、githubのemailとpasswordを入力させるポップアップが出て来て何回も入力しないとpushできない。

##原因
キーチェーンアクセスが拒否されている？(よーわからん)

##解決策
<img width="874" alt="キーチェーン.png" src="https://qiita-image-store.s3.amazonaws.com/0/246356/8de561f4-4be1-e9fa-a317-19603a61bd52.png">
このキーチェーンアクセス画面の左上の
<img width="85" alt="キー.png" src="https://qiita-image-store.s3.amazonaws.com/0/246356/8ab92c81-9b98-78b9-f654-5c22fe8a4271.png">
鍵マークをクリックしてロックし、再びクリックして解除すると、GithubDesktop上でキーチェーンアクセスを拒否or許可するかのポップアップが出て来るのでこれを`常に許可`にすると、githubのemailとpasswordを入力せずにpush できるようになります。
Spring Boot + Thymeleaf BootStrap導入方法メモ

thymeleafテンプレートエンジンを使用したアプリケーションでのbootstrapの導入に躓いたので、今後のためにも簡単にメモ

webjarsなるものをpomファイルに記述する
```xml:pom.xml
<dependency>
    <groupId>org.webjars</groupId>
    <artifactId>bootstrap</artifactId>
    <version>4.2.1</version>
</dependency>
```

htmlファイルでcssを読み込む
ハマったところ１
thymeleafを使っている場合は
th:href="@{webjars/bootstrap/バージョン/css/bootstrap.min.css}" とする。

ハマったところ２
セキュリティを入れている場合はwebjarsへのアクセスを許可しておかなければいけない。
```
public void configure(WebSecurity web) throws Exception {
		web.ignoring().antMatchers("/webjars/**");
	}
```

番外
自前でｃｓｓを用意するにはsrc/main/resourcesにstaticフォルダを用意して配置しないと読み込んでくれないようです。
python3で2重配列をflattenする

例えばこんなリストがあるとする。

```python
a = [[1], [1, 2, 3], [1, 2], [1, 2, 3]]
```

こいつをflattenしてこんな感じにしたいとする。

```python
b = [1, 1, 2, 3, 1, 2, 1, 2, 3]
```

###　方法1
reduceを使う。

```python
from functools import reduce
a = [[1], [1, 2, 3], [1, 2], [1, 2, 3]]
b = reduce(lambda x, y: x+y, a)
print(b)
#[1, 1, 2, 3, 1, 2, 1, 2, 3]
```

###　方法2
chainを使う。

```python
from itertools import chain
a = [[1], [1, 2, 3], [1, 2], [1, 2, 3]]
b = list(chain.from_iterable(a))
print(b)
#[1, 1, 2, 3, 1, 2, 1, 2, 3]
# chainオブジェクトに最後にlistを噛ませてやる必要がある
```

あとはnumpyのflatten()を使うとか。
condaコマンドnot found

#問題
```probrem.shell

$conda --version
bash: conda: command not found

```

#試したこと
まずはアナコンダの設定が記述されているかを確認

```catbashprofile.shell

cat .bash_profile
# added by Anaconda3 2018.12 installer

```

added by Anaconda3 2018.12 installerのような記述があれば
こちらが反映されている必要があるので
私の場合以下のコマンドにて適用させた。
（再起動でもいけるかもですがこの辺りはMacのshellスクリプトの設定によります。）
（bashrcやその他シェルスクリプトの設定をされている方はそちらの確認も必要になります。）


```source.shell
$source ~/.bash_profile
```

#コマンド確認

表示されるようになりました。


```version.shell

$conda --version
conda 4.5.12

```

#メモ
私の環境ではGUIのインストーラー（Mac）で
インストールしたのですが、condaコマンドは
Anaconda3ディレクトリ、homeディレクトリで実行可能だったので
グローバルにインストールされているものと予想されます。
初めてのVulkanプログラミング step4 イメージビュー

[目次に戻る](https://qiita.com/tositada_nakada/items/db0f01c1c8c2945f786b)

ソースコードは以下の場所に置いておきます。各自のバージョンに合わせたプロパティ設定をしてから自由にご利用ください。

[GitHub](https://github.com/nakadasanda/vulkanAppaddcal2018)

##はじめに
Imageオブジェクトは、プログラムが直接読み書きできません。その代わりに、ImageViewを使います。

![vkimage.JPG](https://qiita-image-store.s3.amazonaws.com/0/251306/4b86dfe1-5b88-bff1-b258-6e0765388e60.jpeg)

##VkImageの取得
Vkimageは、ウィンドウをに直接表示する画像です
スワップチェーンからイメージを取得するには、**vkGetSwapchainImagesKHR**を使う必要があります。

```cpp
void Window::_InitSwapchainImages()
{
	std::vector<VkImage> _swapchain_Image;
	std::vector<VkImageView> _swapchain_image_view;
    vkGetSwapchainImagesKHR(device, _swapchain, &_swapchain_image_count, nullptr);


	_swapchain_Image.resize(_swapchain_image_count);
	_swapchain_image_view.resize(_swapchain_image_count);
	vkGetSwapchainImagesKHR(device, _swapchain, &_swapchain_image_count, _swapchain_Image.data());
```

##VKImageViewの作成
VkImageをレンダーパスで使えるようにするには、VKImageViewを作成する必要があります。
イメージを1Dテクスチャー、2Dテクスチャーで扱うといったように、VKImageViewは、どのようにイメージにアクセスするか指定します。

```cpp

	
	for (int i = 0; i < _swapchain_image_count; i++) {
		VkImageViewCreateInfo image_view_create_info{};
		
		image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
		image_view_create_info.pNext = nullptr;
		image_view_create_info.flags = 0;
		image_view_create_info.image = _swapchain_Image[i];
```

**viewtype**、**format**で画像の取り扱い方法を指定します。
**components**を指定することで、任意の色だけ取り出すことができます。
今回は任意の色だけ取り出すことを考えていないので、**components**の値はデフォルトにします。

```cpp

		image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
		image_view_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
		image_view_create_info.components.r = VK_COMPONENT_SWIZZLE_IDENTITY;
		image_view_create_info.components.g = VK_COMPONENT_SWIZZLE_IDENTITY;
		image_view_create_info.components.b = VK_COMPONENT_SWIZZLE_IDENTITY;
		image_view_create_info.components.a = VK_COMPONENT_SWIZZLE_IDENTITY;
```

**subresourceRange**は、画像の目的が何で、画像のどの部分にアクセスするべきか示しています
**aspectMask**...Imageから取得するデータを明示します。


```cpp
		image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
		image_view_create_info.subresourceRange.baseMipLevel = 0;
		image_view_create_info.subresourceRange.levelCount = 1;
		image_view_create_info.subresourceRange.baseArrayLayer = 0;
		image_view_create_info.subresourceRange.layerCount = 1;

```

**imageViewCreateInfo**完成したので**vkCreateImageView**関数を呼び出します。

```cpp

		vkCreateImageView(_renderer->GetVulkanDevice(), &image_view_create_info, nullptr, &_swapchain_image_view[i]);
	}
}

```
##イメージビューの除去
イメージビュー、明示的に作成されたものであるため、プログラムが終了時に破棄する必要があります

```cpp

void Window::_DeInitSwapchainImages()
{
	for (auto view : _swapchain_image_view) {
		vkDestroyImageView(_renderer->GetVulkanDevice(),view,nullptr);
	}
}
```

###終わりに

次回からは、グラフィクスパイプラインといった、まったく新しい概念に触れていきます。

##連絡先
tweeter: tositada_nakada
mail: nakadasanda@outlook.com

## 寄付

paypal: [tositada_nakada](https://www.paypal.me/nakadasanda)
Amazon:[欲しいものリスト](http://amzn.asia/fGpGuJo)
【Python】フラクショナルカスケーディング実装

## 概要
フラクショナルカスケーディングは2次元領域において, 層状領域木を用いて指定した長方形領域に含まれる点を高速に探索する技術です。問い合わせ時間は$O(\log n + k)$, $n$はデータ点数, $k$は報告される点の個数です[1]。 

![frac.png](https://qiita-image-store.s3.amazonaws.com/0/154548/8c3a2c69-90b3-3d18-d9b3-5ad03e89cee1.png)

フラクショナルカスケーディングについて, 詳しくは[1], もしくは [fractional cascading](https://www.slideshare.net/secret/48dF2L2saJOz2e)を参考にしてください。

[<img width="633" alt="スクリーンショット 2019-04-04 19.46.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/154548/ad6676b5-0cc3-3350-ce92-74c905af77f6.png">
](https://www.slideshare.net/secret/48dF2L2saJOz2e)

ネットでもあまり, 実装例を見かけないので
このフラクショナルカスケーディングをPythonで実装しました。

## コード
開発環境: macOS Mojave(10.14.2), Python(>=3.7)
実装参考: [1]
https://gist.github.com/cf012cbc3caca173d2b9d2a89977f3bf

## 使い方


```python
from fractional_cascading import Tree, Point, Rectangle
```

### 層状領域木の作成

```python
# データ準備
points = list()
points.append(Point(name='A', loc=(1, 5))) # loc(x座標, y座標)
points.append(Point(name='B', loc=(2, 2)))
points.append(Point(name='C', loc=(4, 8)))
points.append(Point(name='D', loc=(5, 7)))
points.append(Point(name='E', loc=(5, 5)))
points.append(Point(name='F', loc=(8, 6)))
points.append(Point(name='E', loc=(7, 1)))
```


![output_2_1.png](https://qiita-image-store.s3.amazonaws.com/0/154548/04e24ef9-c94b-b207-7c5b-1f8c24aeb35d.png)



```python
# 木のインスタンスの作成
tree = Tree(sample_data)
```

![frac_tree.png](https://qiita-image-store.s3.amazonaws.com/0/154548/25b20bda-11fc-924d-318e-5264f483b6f3.png)


```python
# treeをpickleで保存
# tree.dump_pickle(pickle_file='sample.pickle')
# treeをpickleから読み込み
# tree = Tree(pickle_file='sample.pickle')
```

### 長方形領域探索

```python
# 探索領域を指定
R = Rectangle(x_min=1.5, x_max=5.5,
              y_min=1.5, y_max=5.5)
```


![output_5_1.png](https://qiita-image-store.s3.amazonaws.com/0/154548/a103e07d-e29a-5ab1-1660-7e1ef011d13e.png)



```python
# フラクショナルカスケーディングを実行 / 結果の出力
for elm in tree.query(R):
    print(elm)
>> name: B, loc: (2, 2)
>> name: E, loc: (5, 5)
```

## 参考
[1] De Berg, Mark, et al. "コンピュータ・ジオメトリ 計算幾何学: アルゴリズムと応用." (2000) 第5章
[2] https://www.slideshare.net/secret/48dF2L2saJOz2e
コード: https://gist.github.com/cf012cbc3caca173d2b9d2a89977f3bf
カラーミーでオプションプルダウンに価格も表示する方法

## やりたいこと
![クリップボード.jpg](https://qiita-image-store.s3.amazonaws.com/0/356382/cb3cf89b-5456-b4c5-2ecb-56f3b9a3c5bc.jpeg)

## 結論

```html
<{foreach from=$option item=i key=k}>
　<select name="<{$i.select_name}>">
　　<{assign var="count" value=0}>
　　　<{foreach from=$option_view_data[$k].data item=i2 key=k2}>
　　　<option value="<{$option_value[$k].id.$count}>"><{$i2.name}>　<{$i2.sales}></option>
　　　<{assign var="count" value=$count+1}>
　　<{/foreach}>
　</select>
<{/foreach}>
```

## 試行錯誤

参考にしたのは公式掲示板のこのトピックス
[オプションプルダウンに価格を埋め込むことは可能でしょうか？ - 助け合い掲示板 - カラーミーショップ](https://shop-pro.jp/wbbs/wbbs.php?e=thread&&tid=9590)

上記を利用したのですが、選択してカートに入れるをクリックしても商品が入らないことが判明。
ソースを確認した処、

```html
<option value="Array">100個　350円(税込378円)</option>
```

となっているが、正しく動いている分のソースは

```html
<option value="数桁の数値">100個　350円(税込378円)</option>
```

となっている。つまり、掲示板のコードの、

```html

<{foreach from=$option item=i key=k}>
　<select name="<{$i.select_name}>">
　<{foreach from=$option_view_data[$k].data item=i2 key=k2}>
　　<option value="<{$option_value[$k].id}>"><{$i2.name}><{$i2.sales}></option>
　<{/foreach}>
　</select>
<{/foreach}>
```
上記の```<{$option_value[$k].id}>```が効いていないと判断。

```option value=” ”```にいれるための数値を調べるために正しく動いているオプションプルダウンのソースを見る。数桁の数値がある。

[カラーミーショップで配列の中身を確認する方法 | UNORTHODOX WORKBOOK | Blog](https://theorthodoxworks.com/color-me-shop/check-color-me-variable-array/)を見て```<{$option_view_data|@debug_print_var}>```と```<{$option_value|@debug_print_var}>```を使用し、これらの中身を表示させる。
必要なものは、おそらく```$option_value```のid。

[商品詳細ページのオプション名 - 助け合い掲示板 - カラーミーショップ](https://shop-pro.jp/wbbs/wbbs.php?e=thread&&tid=8049)で、```$option_value[$k].id```の後ろに何かつければいいっぽいとわかる。
頭から数値をつなげてきゃ良いだろうということで、無理矢理```<{assign var=”count” value=0}>```と```<{assign var=”count” value=$count+1}>```で数値をカウントし増やしていく。
この部分、最初はindexでカウントしようとして```$smarty.foreach.loop.index```とかにしようとしてたんだけど、やり方が悪いためか何故かうまく動かなかったため原始的な方法でやった。

汚いので、もっと簡潔にやれるやり方があったら教えてほしいです。

これsmartyが何かほとんどわからない状況からここまでやったのできつかった……。
配列はprogateでjavascriptを軽くやったときに理解出来てないなということを理解してたんだけど、本当に連想配列とかそこらへん難しいですね。
なんとか動くようになってよかったです。

あとから調べたら```<{$option_view_data|@debug_print_var}>```と```<{$option_value|@debug_print_var}>```を[オプション項目をボタン入力する | naeco.jp](https://naeco.jp/product/input-options)でざっくり紹介されていました。これを見てればもっと早くわかったのに！