OmniAICreator/Qiita-1.07M huggingface dataset:
matplotlib.pyplotでminor ticksを表示できない

# 前提
　初投稿です。
　皆様におかれましては日々の実験結果を図にまとめていらっしゃると思います。最終的には論文投稿を目指すことになりますが、その際に図の体裁にかなり気を配ることになり、基本的なグラフ作成のガイドラインを参照しながら頑張ることになると思います。
　特に、対数軸を使う時には目盛に気を付ける必要があり、例えば、$10^0$,$10^1$,$10^2$の点には長めの主目盛(major ticks)を描き、$10^0$と$10^1$の間には$2,3,4,,,$の点に副目盛(minor ticks)描く必要があります。
　筆者がpython3のmatplotlib.pyplotで図を作る際にminor ticks(副目盛)を表示できないという問題に遭遇しました。本記事では私の取った対処法を記します。

#環境
Python 3.7.3
Anaconda 2019.03
Jupyter notebook 5.7.8

# 状況
実験データを両対数グラフで表示します。
##問題
今回問題に出くわしたコードです。

```python:jupyter_notebook_cell
import matplotlib.pyplot as plt
# begin 本日いじるところ
plt.figure(figsize=(8,8)) #図の大きさ

plt.rcParams["font.size"] = 36 #文字の大きさ

plt.tick_params(which ="major",direction = 'in' ,axis="both"
                , length = 20 ,width = 2 ,pad = 10)
    #major ticks の大きさ
plt.tick_params(which ="minor",direction = 'in' ,axis="both"
                , length = 10 ,width = 1)
    #minor ticks の大きさ
# end 本日いじるところ

plt.xscale("log")
plt.yscale("log")

plt.xlim(10**1,10**6*3)
plt.ylim(0.5,10**4*2)

plt.xticks(10**np.arange(0,7,1))
plt.yticks(10**np.arange(0,5,1))

plt.xlabel("Time, " +r"$t$")
plt.ylabel("Number of RNA")

# 実験データ描画
param1 = [4,3,2,0]
param2 = [0,3,7,-1]

for i,j in zip(param1,param2):
    plt.plot(TimeList,A_3[:,i,j] ,linewidth = 5 ,zorder = 1)

plt.tight_layout()
plt.savefig("qiita\\dis1.png")
plt.show()
```
実行すると
![dis1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138900/912b550b-391c-2984-51d6-8fd18b08294a.png)
が得られます。横軸にもminor ticksを表示する設定のはずが表示されません。これはplt.tick_params()をいじっても解決しませんでした。

##解決策1-グラフを大きくする。
純粋に軸が狭いから表示を渋っているだけでは？という発想。作者の気持ちを考えていく。

```python:jupyter_notebook_cell
import matplotlib.pyplot as plt
# begin 本日いじるところ
plt.figure(figsize=(14,8)) #図の幅を広げた

plt.rcParams["font.size"] = 36 #文字の大きさ

plt.tick_params(which ="major",direction = 'in' ,axis="both"
                , length = 20 ,width = 2 ,pad = 10)
    #major ticks の大きさ
plt.tick_params(which ="minor",direction = 'in' ,axis="both"
                , length = 10 ,width = 1)
    #minor ticks の大きさ
# end 本日いじるところ

#中略

plt.savefig("qiita\\dis2.png")
plt.show()
```
実行すると
![dis2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138900/2bf6f5df-450c-beab-7013-1a7b5f7787a2.png)
無事minor ticksが表示されました。よかったですね。

##解決策2-文字を小さくする。
窮屈なのがいけないんだな、という所感からやっていきましょう。

```python:jupyter_notebook_cell
import matplotlib.pyplot as plt
# begin 本日いじるところ
plt.figure(figsize=(8,8)) #図の大きさは戻した

plt.rcParams["font.size"] = 20 #文字を小さくした

plt.tick_params(which ="major",direction = 'in' ,axis="both"
                , length = 20 ,width = 2 ,pad = 10)
    #major ticks の大きさ
plt.tick_params(which ="minor",direction = 'in' ,axis="both"
                , length = 10 ,width = 1)
    #minor ticks の大きさ
# end 本日いじるところ

#中略

plt.savefig("qiita\\dis3.png")
plt.show()
```

実行すると
![dis3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138900/2011859d-b237-cb2a-bb9a-f037e70e0b92.png)
無事minor ticksが表示されました。よかったですね。

#結論
　図の中身が犇めき合っていると、想定した部品が表示されないことがあるようですね。今回は完全な現象論的アプローチだったのでエンジニア的には褒められたものではないかもしれませんね。
　しかし、こんな些細なことで貴重な時間を失ってしまう人が1人でも減ればうれしいです。
ecs run-taskやecspresso runでecs-cli compose run相当を行う

# 問題

`ecs-cli compose run` ではコマンドを指定して実行することができる。
https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/cmd-ecs-cli-compose.html

`aws ecs run-task`や`ecspresso run`でコマンドを指定するには`overrides`パラメータにjson文字列を渡す必要があり、json内にコマンドを埋め込む必要がある。

さらにコマンドは

```json
{
  "containerOverrides": [
    {
      "name": "string",
      "command": ["string", ...],
    }
  ]
}
```

とarrayにする必要があり、さらにめんどくさい。

https://docs.aws.amazon.com/cli/latest/reference/ecs/run-task.html

# 対処

[jo](https://github.com/jpmens/jo) でJSONつくったり、
envsubstやerbでテンプレート展開するのを検討したけどどちらもめんどくさいので既存でありそうな気もするけど小さいコマンドを書いた。

https://github.com/maruware/ecs-overrides

```sh
$ ecs-overrides -e XXX=abc -e YYY=def app echo hello world
{"ContainerOverrides":[{"Command":["echo","hello","world"],"Cpu":null,"Environment":[{"Name":"XXX","Value":"abc"},{"Name":"YYY","Value":"def"}],"Memory":null,"MemoryReservation":null,"Name":"app","ResourceRequirements":null}],"ExecutionRoleArn":null,"InferenceAcceleratorOverrides":null,"TaskRoleArn":null}%
```

ecspressoで使うときは↓

```sh
$ ecspresso run --config config.yaml --skip-task-definition --overrides=$(ecs-overrides app echo hello world)
```
jupyterをpyに変換する

jupyterだと長い処理を走らせておくのに、どうも心もとないと感じることがあるので、scriptファイルに変換する方法をメモしておきます。


```shell

jupyter nbconvert --to script myAnalysys.ipynb 
```

変換といいつつ、もとのjupyterも残るのでご安心を！

（変換というか、作成？）

注意点二つ

①コマンドはipythonで走らせる
```
ipython hoge.py
```

②matplotlibのinlineはコメントアウト
　画像を描画できない環境だとエラーがでる

```
No event loop integration for 'inline'. Supported event loops are: 
qt, qt4, qt5, gtk, gtk2, gtk3, tk, wx, pyglet, glut, osx
```

inlineで検索して該当箇所をコメントアウト
CODEOWNERSでreviewerを複数指定する

# CODEOWNERSでreviewerを複数指定する

CODEOWNERSについてはこちらの記事をご参照ください
https://qiita.com/FumiyaShibusawa/items/c7a3ff4d0793ca2d281f


複数のreviewerを指定したいときは以下のように、
半角スペースで区切ってかけば複数指定できるようになります

```
* @hoge @fuga @piyo
```

### よく間違えそうなパターン
以下のように書くと最終行のアカウントだけが反映されてしまいますのでご注意を。

```
* @hoge 
* @fuga 
* @piyo
```
【Storybook(vue)】ERROR in ./stories/button.stories.js Module not found: Error: Can't resolve '@/components/atoms/Button.vue' in '/webapp/stories' のエラー解決策

## 問題

vueのStorybook上で、@（アットマーク）を使用したcomponentのインポートができない。

```
ERROR in ./stories/button.stories.js
Module not found: Error: Can't resolve '@/components/atoms/Button.vue' in '/webapp/stories'
```

## 解決策


`storybook`の `webpack.config.js` に記述

```webpack.config.js
  config.resolve.alias['@'] = rootPath
```

これでいけるかと思ったが、`dynamicImport`の構文サポートは現在利用できませんエラーが出る。


```
Support for the experimental syntax 'dynamicImport' isn't currently enabled
```

そこで、`.babelrc`に以下のプラグインを記述する。

```.babelrc
{
  "plugins": ["@babel/plugin-syntax-dynamic-import"]
}
```


これでStorybook上で`@`を用いたコンポーネントのインポートができるようになる。
railsのroutingで、ディレクトリ構造だけ変化させてuriは変化させない方法

#### railsのroutingで、ディレクトリ構造だけ変化させてuriは変化させない方法

scope module記法を使用する。

```
  scope module: "hoge" do
        get "example" => "example#index" # /exampleで, Hoge::ExampleControllerのindex actionが叩かれる。
  end
```
Jmeterでお手軽負荷診断

# 初めに

最近徳井さんが脱税容疑で色々言われてますが、周りがそんなチマチマ言わなくていいやろ。と思う24才です。

さてこの記事では、業務で負荷診断をしないといけなくなった人向け簡単ツールの紹介です。
特に難しいことはしてません。※AWSを使ってる案件のみ有効

gitはこちら：https://github.com/yuyu1023/qiita_jmeter


## ツール構成

まず始めに今回紹介するツール構成はこちらです。

```
.
├── Makefile 
├── hoge.pem
├── init.sh
├── log
└── tests
   ├── hoge_live.jmx
   ├── hoge_preview.jmx
   └── hoge_staging.jmx
```

- ./Makefile  
必要なコマンド類をまとめ、簡単に実行できるようにしてます。  
- ./home.pem  
指定サーバーに接続する為に必要な鍵です。それぞれの環境に合わせて名前は変わると思うので、良きようにしてください。  
- ./init.sh  
jmeterを実行する上で必要な設定を諸々まとめてます。このファイルは指定サーバー内で実行されます。  
- ./log  
指定サーバー内にあるlogを格納する場所です。
- ./test  
シナリオを格納する場所。予めローカルでも挙動確認はしておいた方がいいです。

## 事前準備
1. EC2でCentOSを立ち上げる。(ぽちぽちで行けます)
2. 接続に必要な鍵を生成して保管。(./hoge.pemとの入れ替え想定)
3. jmeterシナリオを./test/に格納。
4. ./Makefile内の下記項目に今回利用するhost名と鍵名を設定。

```
# 構築対象のIPセット
HOSTNAME1 = ec2-xxx-xxx-xxx-xxx
# 鍵設定
KEY = hoge.pem
```

## 利用方法（基本的にコマンドぽちぽちしていくだけです）

1. 初期構築　make all/setup
指定サーバーにjmeterを動かすために必要な諸々をインストールして、jmeterのシナリオをコピーしています。 

2. 負荷診断実行　make jmx-exe time=`date +%Y%m%d-%H%M%S`
指定サーバー内に予めコピーしたシナリオをjmeterで実行します。実行結果は指定サーバー内 "/home/centos/log"配下に格納されます。

3. ログデータ取得　make jmx-get
指定サーバー内の"/home/centos/log"をローカルの"./log"にコピーする。

4. シナリオ再アップ　make jmx-up
条件を変えたシナリオを指定サーバーにコピーします。またこの時コピーするシナリオはMakefile内で指定してるので良きようにして下さい。

基本的には①〜④をグルグル回すだけの作業になります。


## まとめ
今回はサーバー1台想定でやりましたが、複数台でもこの構成使えます！(私は3台構成で実施しました)
Makefile周りを変更すれば実現可能ですので、是非触ってみて下さい。
※もし動かないよー！って人がいたらコメントください


参考リンク集
https://qiita.com/egawa_kun/items/714394609eef6be8e0bf
https://qiita.com/marumaru/items/1c79b9fef5bbeb1adb42
https://qiita.com/t-kubo0325/items/158e02aa6b8e62b76242
rails　todo

#Railsで簡単なTodoサービスを作ったった

##機能
この四つを実装していく
- 一覧表示
- 登録
- 更新
- 削除

1. アプリケーションファイルを作成してrailsが起動させる

```ruby:ターミナル
$ rails new app //app ファイルを作成
$ cd app //作成したファイルに移動
$ rails s //サーバーを起動
```
http://localhost:3000/ にアクセスして『Yay! You’re on Rails!』が見れることを確認しよう

2.DBを作成する

```ruby:コンソール
$ rails g model todo execution:text content:text memo:text
$ rails db:migrate
$ rails c

irb(main):001:0> task = Todo.new(execution:'1月1日',content:'水族館',memo:'お弁当')
irb(main):002:0> task.save
```
3.routes.rbを設定していく

```
Rails.application.routes.draw do
  get "/" => "home#top"
  get "home/new" => "home#new"
  post "home/create" => "home#create"
  get "home/:id/details" => "home#details"
  get "home/:id/edit" => "home#edit"
  post "home/:id/update" => "home#update"
  post "home/:id/destroy" => "home#destroy"
end
```
4.Controllerの設定

```
class HomeController < ApplicationController
    def top
        @task = Todo.all
    end

    def new
    end

    def create
       @task = Todo.new(execution: params[:execution],content: params[:content],memo: params[:memo])
       @task.save
       redirect_to("/") 
    end

    def details
        @task = Todo.find_by(id: params[:id])
    end
    
    def edit
        @task = Todo.find_by(id: params[:id])
    end

    def update
        @task = Todo.find_by(id: params[:id])
        @task.execution = params[:execution]
        @task.content = params[:content]
        @task.memo = params[:memo]
        @task.save
        redirect_to("/")
    end

    def destroy
        @task = Todo.find_by(id: params[:id])
        @task.destroy
        redirect_to("/")
    end
end

```
GitHub, Slack, Qiitaなどで使える！覚えておきたい絵文字コード集

# はじめに
:(コロン)で特定の英数字を囲うことで絵文字を挿入することができる絵文字コード (emoji code)に対応しているサービスもかなり増えてきた昨今、エンジニア界隈では1日の間に入力する絵文字の回数も増えてきました。
そこで、自分が暗記して使っている覚えやすくて汎用性の高そうな絵文字コードをまとめてみます。（他にもオススメがあれば教えてください:bow:）

# その前に・・・
絵文字がなぜ重要かなどについても語りたかったですが、すでに同じようなことを言ってくれている記事がありましたので引用させていただきます:clap:

- [今日から使える！Emoji入門 - Qiita](https://qiita.com/nownabe/items/1771afa2ace578ab4bf5)

また、絵文字コードにもメリット・デメリットがあると思うので、実際に絵文字を使うのか絵文字コードを使うのかはシチュエーションによって分けたほうがよいです。
例えば、Gitのcommit messageに絵文字を含める時、絵文字自体または絵文字コードのどちらにするかなどは統一しないとCLIで見た際などに差が生まれるのでルールがあると良さそうです。
また、Qiitaの見出しに絵文字コードを使うと目次のテキストは絵文字コードが表示されるのでその場合も絵文字自体を埋め込む方が良さそうです。

絵文字自体を使う場合は、macOSであれば`Ctrl + Cmd + Space`で絵文字ウィンドウを出せますので、一覧から探して入力するのが良いと思います。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128422/a7103ae4-1126-e97b-2488-7931c1601128.png" width=300>


# 😄 絵文字コード集
ではさっそくまいりましょう。シチュエーションごとにカテゴライズします。

## 👍 ポジティブ系
|絵文字|絵文字コード|備考|
|:-:|:-:|:--|
|:+1:|`:+1:`|おそらく使用する回数が最も多い絵文字です。<br>いいね的な意味で使ったり「LGTM:+1:」などで使います。<br>非常に簡単な絵文字コードでもあるので覚えておくのをオススメします！|
|:sparkles:|`:sparkles:`|キラキラ的な感じですね。絵文字コードも想起しやすいsparklesという単語なので覚えやすいです。|
|:muscle:|`:muscle:`|何かと筋肉好きなエンジニアは多いのでそういうネタの時に捗ります。頑張ります的な意味でも使います|
|:clap:|`:clap:`|拍手！clapはrではなくlですのでご注意を。|
|:tada:|`:tada:`|なんでtadaなのかは知らないですが、おめでたい時にはクラッカーを。|
|:beers:|`:beers:`|お疲れ様的なときにも、飲み会の時にも。単数形:beer: `:beer:`も使えます|
|:sunglasses:|`:sunglasses:`|長いですがドヤりたいときにどうぞ|
|:heart:|`:heart:`|ハート。なお、prefixに`色名_`をつけてあげると他の色になります(yellow/green/blue/purpleあたりが対応)|
|:v:|`:v:`|ピース。vだけなんでとっても覚えやすいです|

## 👎 ネガティブ系
|絵文字|絵文字コード|備考|
|:-:|:-:|:--|
|:scream:|`:scream:`|ムンクの叫び的な感じでscreamと覚えてます|
|:scream_cat:|`:scream_cat:`|ねこバージョン|
|:sob:|`:sob:`|号泣。むせび泣く的な意味だそうです|
|:cry:|`:cry:`|号泣するほどではない時にどうぞ|
|:disappointed:|`:disappointed:`|長いですが顔が可愛いのでよく使います|


## ✅ タスク系
|絵文字|絵文字コード|備考|
|:-:|:-:|:--|
|:white_check_mark:|`:white_check_mark:`|背景は緑だけどチェックマークは白なのでwhiteです（みやすいけど長くて覚えにくいのが難点・・・）|
|:running:|`:running:`|進行中の時に|
|:warning:|`:warning:`|注意を促したい時に|
|:x:|`:x:`|xだけで使えます|
|:construction:|`:construction:`|作業中の時とかにいいです|
|:fire:|`:fire:`|炎上案件にどうぞ|
|:bow:|`:bow:`|タスクをお願いする時に使いましょう。短くて覚えやすく汎用性が高いです|
|:pray:|`:pray:`|こちらもタスク依頼時に|
|:raising_hand:|`:raising_hand:`|立候補時にどうぞ|
|:ok_woman:|`:ok_woman:`|依頼された時などに。最近はok_manを使えるサービスも多いですが、こちらしか対応していないことも多く昔からの馴染みでよく使います|
|:no_good:|`:no_good:`|ok_womanに対してこちらはno_goodなので覚える時にご注意を|

## 😇 煽り性能高め形
取り扱いには注意しましょう:innocent:

|絵文字|絵文字コード|備考|
|:-:|:-:|:--|
|:innocent:|`:innocent:`|天使の輪っかがついてるのでそういう死ねる状況のときなどに。煽り以外にも使えます|
|:thinking:|`:thinking:`|うーん、おかしいぞ的なときに。普通に考えている時にも使えます|
|:shit:|`:shit:`|:shit:|
|:yum:|`:yum:`|てへぺろ|

## 💡 その他
|絵文字|絵文字コード|備考|
|:-:|:-:|:--|
|:eyes:|`:eyes:`|<●><●> みているぞ|
|:memo:|`:memo:`|注釈がわりにどうぞ|
|:information_source:|`:information_source:`|FYIとか使うくらいならこっちの方がわかりやすいですが、長くて覚えにくい・・・|
|:crab:|`:crab:`|「たし:crab:」または単体で確かにの意味でお世話になります|
|:bug:|`:bug:`|不具合やバグを表す時に使います|
|:cop:|`:cop:`|〇〇警察としてコードレビューの際などに取り締まりたい時にどうぞ|
|:bulb:|`:bulb:`|ひらめきとともにどうぞ|
|:mask:|`:mask:`|体調不良時にどうぞ|
|:zzz:|`:zzz:`|ねむいときはねむいのです|

# おわりに
どうでしたでしょうか？
絵文字を添えるだけで、コメントなどの印象もかなり変わると思うので、これを機に積極的に使っていきましょう！

## 参考リンク
- [🎁 Emoji cheat sheet for GitHub, Basecamp, Slack &amp; more](https://www.webfx.com/tools/emoji-cheat-sheet/)
Docker for mac で OSに設定した SOCKS proxy を利用して ssh サーバー経由で外部アクセスする ( #docker )

# Mac = host で SOCKS proxy を起動させておく

```
ssh -vND 8888 user@host
```


# docker コンテナで proxy 接続を確認

`host.docker.internal` を利用

proxy利用時と非利用時でIPが変わっていたら成功

```
$ docker run -it alpine ash
/ # apk add curl
/ # curl  https://httpbin.org/ip
/ # https_proxy=socks5://host.docker.internal:8888 curl  https://httpbin.org/ip
```

# 参考

[#docker で SOCKS proxy を利用して ssh サーバー経由の https 接続をする - Qiita](https://qiita.com/YumaInaura/items/fee7fff2c29faddfc10f)

[Networking features in Docker Desktop for Mac | Docker Documentation](https://docs.docker.com/docker-for-mac/networking/#i-want-to-connect-from-a-container-to-a-service-on-the-host)

>I WANT TO CONNECT FROM A CONTAINER TO A SERVICE ON THE HOST
The host has a changing IP address (or none if you have no network access). From 18.03 onwards our recommendation is to connect to the special DNS name host.docker.internal, which resolves to the internal IP address used by the host. This is for development purpose and will not work in a production environment outside of Docker Desktop for Mac.

>The gateway is also reachable as gateway.docker.internal.


# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2675








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Ruby on Rails チュートリアル 第14章　Relationshipモデル（フォロー・フォロワーの関係）

#Relationshipモデルについて
　ここでは、複数のユーザー間のフォロー・フォロワー関係を規定するrailsチュートリアルにおけるRelationshipモデルについて概要を述べる。
　あるユーザーAが別のユーザーBをfollowしているという関係を表現するためには、AがBをfollowする主体（AがBのfollower）であり、BがAにfollowされている(B is followed by A)という事態に着目して、以下のようなfollower_idとfollowed_idというデータ項目をもつRelationshipデータモデルを作成する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486493/25e881a9-c2f8-1b91-dc7c-0049a2daa5da.png)

このデータモデルを実装するために、

```ruby
$ rails generate model Relationship follower_id:integer followed_id:intege
```
でマイグレーションを作成する。
このユーザー・フォロワー間のリレーションシップはfollower_idとfollowed_idで頻繁に検索することになるので、それらのカラムにindexを追加しておく。

```ruby:db/migrate/[timestamp]_create_relationships.rb
class CreateRelationships < ActiveRecord::Migration[5.0]
  def change
    create_table :relationships do |t|
      t.integer :follower_id
      t.integer :followed_id

      t.timestamps
    end
    add_index :relationships, :follower_id
    add_index :relationships, :followed_id
    add_index :relationships, [:follower_id, :followed_id], unique: true
  end
end
```
　なお、このマイグレーションファイルには、follower_idとfollowed_idの複合キーインデックスを追加し、それらの組み合わせが一意であることを保証する記述があることに注意する。この一意性によりあるユーザーが同じユーザーを2回以上フォローすることを防ぐことができる。（2回目以降同じユーザーをフォローすると、既に登録されてある(follower_id,followed_id)の組み合わせが再び登場し、一意性が保てなくなりエラーが生じる。）
　
　次にUserとRelationshipの関連付けを行う。

```ruby:app/models/user.rb
class User < ApplicationRecord
  has_many :microposts, dependent: :destroy
  has_many :active_relationships, class_name:  "Relationship",
                                  foreign_key: "follower_id",
                                  dependent:   :destroy
  .
  .
  .
end
```

```ruby:app/models/relationship.rb
class Relationship < ApplicationRecord
  belongs_to :follower, class_name: "User"
  belongs_to :followed, class_name: "User"
end
```
　このuser.rbファイルでは、class_nameでUserと紐づけるクラス名(Relationship)を指定し、別々のデータモデルを繋げるkeyであるforeign_keyをRelationshipのfollower_idであると指定している。それらの記述を、has_manyメソッドに:active_relationshipsシンボルを渡したものに与えることで、一人のUserが、Realtionshipモデルのfollower_idで結び付けられる複数のactive_relationshipsデータを持てるようになる。また、relationship.rbファイルにより、一つのRelationshipはUserモデルのuser.idに対応したfollowerに一対一(belongs_to)の関係があることを指定している。この関連付けにより、以下のようなactive_relationshipが実現する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486493/99322847-0237-597b-efb0-11ab7e7af267.png)
Cloud Translation APIの料金体系が11月1日から変更になり、Firebase ExtensionsのTranslate Textでも無料枠が使えるようになった

##Translation APIの料金体系が変更された
私が運営する[メモや日記ついでに英語学習](https://translate.ameneko.com/)では、翻訳機能に、Firebase ExtensionsのTranslate Textを利用しています。
[Firebase Extensions](https://firebase.google.com/docs/extensions)

Firebaseの拡張機能であるTranslate Textは非常に便利ですが、Translate Textでは「Translation API v2」が利用されており、「Translation API v3」には存在する無料枠がなかったため、最初から使用するとお金がかかる状態でした。<img width="880" alt="translate.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267736/2ee71bd8-07c3-f19a-12fb-c9f5ec927a1d.png">




ところが、Googleより、１１月から価格設定が変わったとメールが届きました。
以下はメールの一部抜粋です。

>Current pricing for the Translation API v3 includes a free tier (no charges) for the first 500k characters of Text Translations each month. Effective November 1, 2019, we’re replacing the free tier with a $10 usage credit (equivalent to 500k characters of Text Translations), which will be applied to your billing account each month.

翻訳：Translation API v3の現在の価格には、毎月のテキスト翻訳の最初の50万文字の無料利用枠（無料）が含まれています。 2019年11月1日より、無料利用枠を10ドルの使用クレジット（テキスト翻訳の50万文字に相当）に置き換えます。これは毎月請求先アカウントに適用されます。

つまり、無料のクレジットの条件が変わり、Translation API v2とTranslation API v3の両方で使用できるようになりました。

##小さなプロジェクトなら50万文字相当で十分
月に10ドル分の無料クレジットがあれば、個人が運営するようなサービスならほぼ無料で使えるはずです。
FirebaseのTranslate Textを使ってみたいけど、お金がかかるから嫌だなと考えていた人には朗報です。
##宣伝：Firebase ExtensionsのTranslate Textを使っているプロジェクトを運営しています
最初に述べたとおり、Firebase ExtensionsのTranslate Textを使ったサービス「メモや日記ついでに英語学習」を運営しています。
このサービスは自分が書いたメモや日記が書いたついでにGoogle翻訳されて、単語帳のように管理できるサービスです。
Vue + Frebase + Buefyで構成しています。

サービス自体に興味ある、もしくはTranslate Textが実際にどんなもんかなと触ってみたい方はぜひお試しください。
[メモや日記ついでに英語学習](https://translate.ameneko.com/)
Antimalware Scan Interfaceを勉強中

#AMSI(Antimalware Scan InterFace)
- Microsoftが開発したWindows10から標準で搭載されているMalware対策用インターフェース
- Powershell,VBscript,JavaScriptなどと統合されており、実行されるスクリプトのほとんどはAMSIを通じてWindowsDefenderに送られスキャンが行われる。
  - AmsiProviderを独自で作成することでAMSIを通じて自身のProviderに実行されるスクリプトの情報を送ることが可能。そして、受け取ったスクリプトの情報から悪意のあるものか判別してスクリプトの動作を止めることができる。 

#PowerShellとAMSIの関係について主に勉強
- PowerShellで実行されるスクリプトはAMSIを通じてWindowsDefenderに送られる。
 - AMSIは実行されるスクリプトの原文を送信
- 具体的には、PowerShellの中ではwin32APIの中のAmsiScanBuffer関数かAmsiScanString関数がAMSIにスキャン要請を出している。
　　 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/528891/6949b478-8a4c-a9fd-2186-64842524e1ad.png)

引用元
https://docs.microsoft.com/en-us/windows/win32/amsi/how-amsi-helps

- 上記の図をPowerShellの部分だけ抜粋し，通常で行われている処理を簡単に表すと以下の図となる．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/528891/4e48cb9d-1967-f3d0-2620-31f99d2369d0.png)

#実際にいろいろ触ってみて得られた知見
- PowerShellを起動した際

裏で5回スクリプトが実行されており，初期処理が行われている．
（AMSIを通じてスクリプトが実行されていることを確認）

- スクリプト実行の際，エラーが起きた時

裏で5回スクリプトが実行されており，エラー処理が行われている．
（こちらもAMSIを通じてスクリプトが実行されていることを確認）
その後，エラー内容が表示されてプロンプトが起動する．
#アプリケーション作成者のAMSI使用方法
- AmsiInitialize関数　初期化処理　　　　　　　　　　　↓
- AmsiScanBuffer関数　スキャンを依頼する処理　　　　↓
- AmsiUninitialize関数　初期化前に戻す処理　　　　　　↓

この順番で実行することでスキャンを依頼できる。

- 関数の定義（c++）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/528891/8b73e682-e572-74c3-4e4b-03bc52f31cb0.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/528891/9d82f2e0-ae0e-a394-9a7f-a05b46dde0d0.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/528891/d0f99589-9020-6ec2-fd39-f713f932cc8c.png)

#使用の具体例（定義だけではわからない人向け）
- 変数定義

```c++

HAMSICONTEXT amsiContext = NULL;
HAMSISESSION amsiSession = NULL;
AMSI_RESULT result = AMSI_RESULT_NOT_DETECTED;
char buffer[]="スキャンしたい文字列"
```
- コード本体

```c++
AmsiInitialize(L"myapplication", &amsiContext);
AmsiScanBuffer(amsiContext,buffer,strlen(buffer), L"Scan Sample", amsiSession, &result);
AmsiUninitialize(amsiContext);
```



ここから先更新予定

#参考文献
- https://docs.microsoft.com/en-us/windows/win32/amsi/antimalware-scan-interface-portal
Rails belongs_toの関連カラム名し指定する

以下のようなモデルがある場合


```ruby
class User < ApplicationRecord
  self.table_name = 'wifi_agency_users'
  belongs_to :agency
end

class Agency < ApplicationRecord
  self.table_name = 'wifi_agencies'
  has_many :users
end
```

スキーマはこんな感じです

```
User(id: integer, email: string, wifi_agent_id: integer, created_at: datetime, updated_at: datetime)
```

`User.last.agency`で該当ユーザが所属している代理店を取得したいですが、Railsはデフォルトで`user.agency_id`と`agency.id`を紐付けるので、何も取得できないです。スキーマを見るとagency_idは存在しないから。でもwifi_agent_idっていうのがあるので、これと紐付けたい！

こういう風に外部キーをしてするだけでOKです！

```ruby
class User < ApplicationRecord
  self.table_name = 'wifi_agency_users'
  belongs_to :agency, foreign_key: 'wifi_agent_id'
end
```

そもそも前の人がagencyモデル作る時wifi_agencyにしたら楽なのに！！ヽ(`Д´ﾒ)ﾉ ﾌﾟﾝｽｶ！
PythonでFizzBuzz

#はじめに
みなさん FizzBuzz ってご存知ですか？恥ずかしながら主は先日まで FizzBuzz という言葉すら知りませんでしたよ、ええ。

ということで、復習がてら FizzBuzzについてまとめたいと思います。

#FizzBuzz とは
　元々は英語圏の言葉遊びで、複数のプレイヤーで以下の条件に従って 1 から順番に数字を発言するというゲームのようです。

* 3 で割り切れる数の場合は "Fizz" と発言
* 5 で割り切れる数の場合は "Buzz" と発言
* 3,5の両方で割り切れる場合は "FizzBuzz" と発言
* 上記のいずれにも該当しない場合は数字をそのまま発言

__例__
A「1」
B「2」
C「Fizz」
A「4」
B「Buzz」
...
A「13」
B「14」
C「FizzBuzz」

ま、こんな感じですね。
#実装
さて、それではルールに従って特に何も考えず単純に実装してみましょう。

```Python:fizzbuzz.py
for num in range(1,101):
    if num % 15 == 0:
        print("FizzBuzz")
    elif num % 3 == 0:
        print("Fizz")
    elif num % 5 == 0:
        print("Buzz")
    else:
        print(num)
```

```
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
16
17
Fizz
19
Buzz
```
はい、できました。非常に単純です。

#出力を変える
割る数や出力する文字を変えることができたら便利ですね。

```Python:fizzbuzz.py
div1, div2 = 4, 6
word1, word2 = "Nogi", "Zaka"
for num in range(1,101):
    if num % div1 == 0:
        if num % div2 == 0:
            print(word1+word2)
        else:
            print(word1)
    elif num % div2 == 0:
        print(word2)
    else:
        print(num)
```

最近 class についても学んだので class を使って実践

```python:python
class FizzBuzz:
    def __init__(self, div, string):
        self.div = div
        self.string = string

    def check(self,num):
        if num % self.div == 0:
            return self.string
        else:
            return ""

def main():
    fizz = FizzBuzz(4, "Nogi")
    buzz = FizzBuzz(6, "Zaka")
    for num in range(1, 101):
        result = fizz.check(num) + buzz.check(num)
        if result == "":
            print(num)
        else:
            print(result)
if __name__ == "__main__":
    main()
```
```
1
2
3
Nogi
5
Zaka
7
Nogi
9
10
11
NogiZaka
13
14
15
Nogi
17
Zaka
19
Nogi
21
22
23
NogiZaka
```
できました！乃木坂万歳！
CakePHPでコンバートができなくなった


タイトル通り、コンバートを掛けようとしたらエラーが出た。

```
Exception: SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: Name or service not known in 
[/usr/share/nginx/~~~/hogehoge.php, line 47]
```


環境は
- VirtualBox
- CentOS7
- CakePHP


##解決
```
レポジトリ/project/config/app.php

'Datasources' => ['source' => ['host' => **ここをIPアドレスに**]]
```

今回はこの方法で解決しました。
【＠大阪】Outsystems 関西交流会 ＃１ 　グランフロント12/20(金) 19:00～

OutSystemsのユーザー同士での情報交換、勉強を目的とした交流会です。

2019/12/20(金) 19:00 〜 21:00
グランフロント大阪 北館10F カンファレンスルームB04

参加資格：Outsystemsいいね！で当日１８名で楽しみます。
まだ、席ありますのでご参加希望のエンジニアは以下で
以下----------------------------------------------------
https://outsystems-kansai.connpass.com/event/152549/
以上----------------------------------------------------

ではでは、当日お会いできるのを楽しみにしております。

小嶋 秀治
数行でできる Django https有効化

###  まずDjangoのプロジェクト正常に動いてることを確認してください


```shell
pip install django-sslserver
```

```python:settings.py

INSTALLED_APPS = [
    ...
    'sslserver'
]
 ...
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
SECURE_SSL_REDIRECT = False
SESSION_COOKIE_SECURE = True
CSRF_COOKIE_SECURE = True
 ...

```
:point_up:SSL証明書を作ります

```shell:

openssl genrsa -out foobar.key 2048
openssl req -new -key foobar.key -out foobar.csr
openssl x509 -req -days 365 -in foobar.csr -signkey foobar.key -out foobar.crt
```

サーバーを再度立ち上げます

```
python manage.py runsslserver 0.0.0.0:8000 --certificate /path/to/foobar.crt --key /path/to/foobar.key
```

以上です:hugging:

と言いても形上のhttpsなので、証明書はちゃんとした所に発行してもらいましょう
GAEにデプロイしたDjangoからGoogle Cloud Storageの画像を読み出すとクソ重いのを直す方法

#問題発覚
Djangoをデプロイする場合、無心でGAEを利用している人が多いと思います。
その場合、誰でもかんたんなGoogleCloudStrageを利用している人が多いと思います。
https://django-storages.readthedocs.io/en/latest/backends/gcloud.html

その環境で50個ほどの画像を吐き出すAPIを作って見たんですが糞激重でした。

urlを見てみると
```
https://storage.googleapis.com/hogestorage/photos/hoge.png?Expires=1573177689&GoogleAccessId=hogehoge&Signature=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
```

DBを見てみると
```
/photos/hoge.png
```

・・・・・。

一つずつ名前解決して権限管理してるじゃねーか！

こりゃ重いわけだ。

今回利用するサービスについては公開画像がデフォルトなので変更します。

バケットをまるごと公開設定にして

```
GS_DEFAULT_ACL = 'publicRead'
```
をすると
APIのurlが
```
https://storage.googleapis.com/hogestorage/photos/hoge.png
```
となり爆速になります。
環境構築:GCP+Docker

# 環境構築　備忘録
GCP上にコンテナを立てて、分析環境構築を行う。
今一分かってないけど、どうやって立てたかを自分用にまとめる。


# GCPについて
GCPについては以下記事が非常によくまとまっているので読んでほしい。
このシリーズの第3回くらいまで読んでどんなものか大枠を把握した。
[【GCP入門編・第1回】エンジニア必読！今さら聞けない、Google Cloud Platform (GCP) とは？][1]

アカウント作成は第2回に記載。
[【GCP入門編・第2回】まずは、ここから！ Google Cloud Platform (GCP) の事前準備！][2]

GCEについての説明
[【GCP入門編・第3回】難しくない！ Google Compute Engine (GCE) でのインスタンス起動方法！][3]

# GCE　インスタンス作成
[GCPとDockerでKaggle用計算環境構築][4]
[GCP+DockerでKaggle用GPU環境構築][5]
2記事を主に参考にしたがDeepLearningVMを見つけられなかったために、
通常のインスタンス作成を行った。

GCEインスタンス作成画面で弄ったのは以下の項目
- マシンタイプ 8vCPU
- GPU NVIDIA TeslaP4
- ブートディスク Deep Learning Image: Base m36
- 他の項目は[GCPとDockerでKaggle用計算環境構築][4]を見たりした

注意：GPUを使う場合は割り当ての編集をする必要がある。
[割り当て編集についての質問][6] 
-> [GCPのDeep Learning VMインスタンスを立ち上げる][7]
申請してから2営業日以内に対応するわ！っていうメールが来るけど、その日の内だった。


MaketPlaceでPytorch NVIDIA GPU Notebook使っても良さそう。

# CloudSDKからインスタンスに接続
これも前節の記事参考にした。
加えて、[入門記事：GCE (Google Compute Engine) で作るJupyter分析環境][8]のJupyter環境構築(Docker)も参考にした。

アクセス情報の確認は[ここ][9]
インスタンスのファイアウォールの設定については[ここ][10]

# 構築終わり
これで言語処理100本ノックの残りに入れる。

# 課題
- imageダウンロードで済ましたDockerfileを書けるようになること
- DeepLearningVMが見つけられなかった
- GPUの確認はtorchでやるつもりだったが、忘れてた（現時点）

[1]:https://www.topgate.co.jp/gcp01-what-is-google-cloud-platform
[2]:https://www.topgate.co.jp/gcp02-getting-started-guide
[3]:https://www.topgate.co.jp/gcp03-google-compute-engine-launch-instance
[4]:https://qiita.com/lain21/items/a33a39d465cd08b662f1
[5]:https://qiita.com/yota-p/items/affe6d970ac4896d6e70

[6]:https://stackoverflow.com/questions/53415180/gcp-error-quota-gpus-all-regions-exceeded-limit-0-0-globally
[7]:https://qiita.com/y_kani/items/ddb7c4a5ca6fdf36cac4
[8]:https://www.case-k.jp/entry/2019/06/29/164802
[9]:https://www.cman.jp/network/support/go_access.cgi
[10]:http://vistylee.com/google-compute-engine-gce-firewall/
【意外と知らない】iOSアプリでのビルドコード

![スクリーンショット 2019-11-07 11.31.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49481/777478e0-0837-580c-c106-f36cd67e3f91.png)

意外と知らない人多いと思うのですが
***iTunes Connect***に送信するアプリ（iOS等）のビルドコードですが
バージョンコードが変われば同じものを使用してもいいんです。

Androidだとだめなはずなので勘違いしている人多いかもしれないですね。
python tips 

# python tips まとめ
備忘録として残しておきます。

## 文字→ascii。ascii→文字への変換

`ord`でアスキーコード取得

```
>>> ord('a')
97
```

`chr` で文字取得

```
>>> chr(97)
a
```


## リストの生成

リスト包括で書くと、メモリ保存しないから実行速度が速い。


```.py
num = 1000000000

# 通常の書き方
list_1 = []
for i in range(num):
   list_1.append(i)

# リスト内包表記
list_2  = [i for i in range(num)]
```

また、@konandoiruasaさんから以下のものが内包表記によるものとトントンか若干早いとアドバイスいただきました。

```.py
import numpy as np
a = list(np.arange(num, dtype=int))
```
## さなざまなものを連結させる "join"

join では文字列、数値、パスを連結させることができます。
`" ".join`で使います。

```.py
list = ['a', 'b', 'c']
result = ''.join(list)
print(result)

## abc
```

listに文字と数値がある場合、map関数でstrに全て変換

```.py
list = ['a', 'b', 1 ]
result = map(str, list)
result1 = ''.join(result)
print(result1)

## ab1
```

## split で分割


```.py
str1 = "a,b,c"
sep = str1.split(",")
print(sep)
## ['a', 'b', 'c’]
```


## np.arrayとlistの変換

```.py

import numpy as np
list = [1,2,3]

a = np.array(list)
print(a)
## array([1, 2, 3])

b = a.tolist()
print(b)
##[1, 2, 3]
```

## csvに書き出す方法

```.py

import pandas as pd

log = pd.DataFrame(
         columns=['epoch', 'lr', 'train_loss', 'val_loss']
         )

tmp = pd.Series([ epoch, lr, train_loss, val_loss ], index=log.columns) 
  
log = log.append(tmp, ignore_index=True) 
log.to_csv('log.csv'), index=False) 
```

## 終わりに

随時、追加していきたいと思います。
ご指摘があれば、ビシバシお願いします。
SMTP についてざっくりと

## 動機
メール送信のプロトコルであるSMTPについて理解していないことが多く、なんとなく使っていたので全体像を理解するために調べてみた。


## SMTP とは
SMTP は Simple Mail Transfer Protcol の略でメールを送信するプロトコル。[RFC5312](https://tools.ietf.org/html/rfc5321) で標準化されている。
POP とセットで出てくる。こちらは Post Office Protcol の略でメールを送信するプロトコル。

## well known port
* 25 ...認証なしで送信する用途に利用されていた。現在はプロバイダによっては利用できなくなっている（Outbound Port 25 Blocking）。認証を挟んでいないので非推奨になっている。認証をさせて、587番ポートと同じ役割を持たせることもある。
* 465...認証を必須として送信する用途に利用されている。暗号化は SMTP over SSL(SMTPS)で行われている。
* 587...認証を必須として送信する用途に利用されている。暗号化は TLS/STARTTLSで行われている。

## SMTP? SMTPS? starttls?
もともとのSMTP には送信者を認証するための仕組みがないため、自分が持っているSMTPサーバを第三者に迷惑メールの送信のために使われてしまうことを防ぐことができない。
現在は拡張仕様となるSMTP-AUTH が標準化されていて、送信の前段で認証をすることができるようになっている。

* SMTP-AUTH... ユーザIDとPasswordによる認証。メール送信時に認証を行い、認証されたときにメールが送信できるようにする仕組み。SMTPだと誰でも利用できてしまうため、それの対策のためにSMTPの拡張仕様として盛り込まれた。認証方式は[PLAIN, LOGIN, CRAM-MD5, DIGEST-MD5]がある。PLAIN, LOGIN は平文での認証。LOGINは標準仕様がなく、各社独自の仕様になっている。
* SMTP... メールの認証もなく、メール自体も平文で送られている。
* SMTPS... メールソフト<->メールサーバ の通信を最初から暗号化して通信する方法。最初から暗号化するので、どちらかが対応していないと通信ができない。
* STARTTLS... SMTPと同様に最初は暗号化せずにサーバとやり取りを行う。相手のサーバがTLS通信に対応しているかを確認して、可能であれば暗号化して通信を行う。この特性上、クライアントからSMTPサーバでは暗号化されるが、メールソフト（送信側のSMTPサーバ）からメールサーバ（受信側のIMAPサーバ）間のリレー時に平文に戻ってしまう可能性がある。

## 所感
メールを送信する際には暗号化がされるSMTPSまたはSTARTTLSを利用するのが一般的。STARTTLSはどちらかがTLS通信に対応していない場合に平文になってしまうので注意が必要。また、SMTPサーバからSMTPサーバにリレーする際にも平文になってしまう可能性がある。
SMTPSが一番安全だが、お互いが対応していなければならないので要件が厳しいといえる。
SMTP-AUTHはPLAINだとパスワードが平文で流れて、サーバも平文でパスワードを管理するので推奨できる感じではない印象。CRAM-MD5またはDIGEST-MD5での認証をしたい。
MySQLのレプリケーション機能を使う

#動機
社内のMySQLサーバーのホットスタンバイを作ろうと思った。サービス停止時間が長引くと自分の寿命が縮みそうなので・・・。

#環境
マスター・スレーブ共にOpenSUSE Leap 15.1です。マスター側は物理サーバーで、スレーブ側は仮想サーバー(Hyper-V)です。

それぞれのIPアドレスは、マスターが172.16.0.1/16, スレーブが172.16.222.124/16です。

mysql -Vは
`mysql  Ver 15.1 Distrib 10.2.25-MariaDB, for Linux (x86_64) using  EditLine wrapper`


#構築手順
##マスター側設定
###サーバー設定
とりあえず、以下の設定を行います。設定は

[MySQL 5.6 マスター/スレーブサーバの設定メモ|あぱーブログ](https://blog.apar.jp/linux/3163/)

を参考させて頂きました。

```
[mysqld]
# サーバーのID　重複しないようにする
server-id=1
# バイナリログの有効化（バイナリログとは、更新作業を行ったログが記録されるログ。これがないとレプリケーションできない）
log_bin=mysql-bin

# バイナリログをコミットと同時にディスクに書込む
sync_binlog=1

# クラッシュセーフなレプリケーション設定（ストレージエンジンがInnoDBでないと動かないとの情報あり）
relay_log_info_repository=TABLE
relay_log_recovery=ON
```

設定後、MySQLを再起動します

`systemctl restart mysqld`

スレーブ側からのレプリケーションのみに使用するユーザーを作成します。

`GRANT REPLICATION SLAVE ON *.* TO repl@172.16.222.124 IDENTIFIED BY '<パスワード>';`

###データベースの出力
スレーブに流し込むSQLを出力します。

```
mysqldump -u root -p \
--all-databases \
--events \
--single-transaction \
--flush-logs \
--master-data=2 \
--hex-blob \
--default-character-set=utf8mb4 > master_db.sql
```

一応、それぞれのオプションを説明しておきます

####all-databases
すべてのDB（ユーザー等含む）をバックアップします

####events
MySQL 5.1.8から追加された"events"テーブルも含めます（これをしないとワーニングが出る）

####single-transaction
ダンプ処理をトランザクションで囲む（DB全体をロックする？）

####flush-logs
バイナリログを一度削除して、新しいファイルを作る

####master-data=2
CHANGE MASTER TO句を含める。=2にした場合は、バイナリログの読み出し開始位置をコメントとして出力する

####hex-blob
バイナリ部分を16進数の形式でダンプする（そのままダンプするとただの文字列としてダンプしてしまう）

####default-character-set=utf8mb4
デフォルトの文字コード設定。これは各自自分のDBに合わせれば良いと思いますが、あまり検証していないので確証は持てません。

当たり前の事ですが、このコマンドはサービスを停止して実行するか、社内システムなら業務時間外に実行してください。

ダンプが完了したら、sqlファイルをスレーブ側に転送しておきます。

##スレーブ側設定
###my.cnf
```
# サーバーIDの設定（マスターとかぶらないようにする）
server-id=2
 
# 更新を禁止する（スレーブ用）
read_only
```

上記を追記して

`systemctl restart mysql`

でリスタートします。

###ダンプしたファイルの確認
ダンプしたファイルを確認し、バイナリログのファイル名と開始位置を確認します。

```
head -n 100 master_db.sql | grep CHANGE
```

実行結果は、例えば

```
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=342;
```

こんな感じで表示されます。

これを頼りに、以下のSQLを実行します。

```
CHANGE MASTER TO
 MASTER_HOST='172.16.0.1',
 MASTER_PORT=3306,
 MASTER_USER='repl',
 MASTER_PASSWORD='<パスワード>',
 MASTER_LOG_FILE='mysql-bin.000002',
 MASTER_LOG_POS=342;
```

この後

```
START SLAVE;
```

このクエリーを発行すると、レプリケーションが開始されます。

```
SHOW SLAVE STATUS\G
```

と入力し、表示された一覧に

```
Slave_IO_Running: Yes
```

と表示されていればOKです。

#トラブルシューティング
##Slave_IO_Runnigがconnectingのまま
ファイアウォールの設定で3306ポートを弾いてる可能性があるので、確認してください。

##Slave_IO_RunnigがNO
整合性が取れてない状態なので、もう一度やり直します。

```
mysql -u root -p < master_db.sql
```

でもう一度DBをリストアし直して、一度

```
MariaDB [(none)]> STOP SLAVE;
```

でスレーブを停止し

```
CHANGE MASTER TO
 MASTER_HOST='172.16.0.1',
 MASTER_PORT=3306,
 MASTER_USER='repl',
 MASTER_PASSWORD='<パスワード>',
 MASTER_LOG_FILE='mysql-bin.000002',
 MASTER_LOG_POS=342;
```

としたあと

```
START SLAVE;
```

で、再度スレーブを開始してください。
Rails modelでselfの使い方

modelでいつselfを付けるべきかがふんわりするので、まとめました。

簡単に言うと**クラスメソッドとして使いたい場合はselfを付ける、インスタンスメソッドとして使いたい場合はselfを付けない**

```ruby

class Sample < ApplicationRecord
  #Sample.class_methodでこのメソッドを呼ぶ
  def self.class_method
    "class_method"
  end

  #sample = Sample.new
  #sample.instance_methodの形でメソッドを呼ぶ
  def instance_method
    "instance_method"
  end
end
```
docker pullとかapt updateでコケる

```
$ uname -a
Linux raspberrypi 4.19.81-v7+ #1276 SMP Fri Nov 1 14:13:14 GMT 2019 armv7l GNU/Linux

$ lsb_release -a
No LSB modules are available.
Distributor ID:	Raspbian
Description:	Raspbian GNU/Linux 10 (buster)
Release:	10
Codename:	buster
```
2019/11初旬、sudo apt update して sudo apt upgrade して、sudo rpi-update した。
イメージ取得済のコンテナは動いていたので気づかなかったが、新たにイメージを取得しようとして以下のようなエラーが発生した。例は php:7.2-fpm だが、他のイメージでも同様。

```
 $ docker-compose build
...
Step 1/2 : FROM php:7.2-fpm
ERROR: Service 'php' failed to build: Get https://registry-1.docker.io/v2/: dial tcp: lookup registry-1.docker.io on [2404:1a8:7f01:a::3]:53: server misbehaving
```
調べてみるとDNS云々というトラブル事例が見いだされ、それをどうすればよいかよくわからず。
他に心当たりがないので先に行ったアップデートが原因だろうと、何も考えずにアップデートしてみようとしたら以下のようなエラーが発生した。

```
$ sudo apt update
エラー:1 http://raspbian.raspberrypi.org/raspbian buster InRelease
  'raspbian.raspberrypi.org' が一時的に解決できません
```

これはイカン。apt update で調べたら、以下の事例を発見。

<a class="embedly-card" href="http://engetu21.hatenablog.com/entry/2015/04/11/131949">【Raspberry Pi】apt-get updateで失敗する - かっこいいブログ名つけたい</a><script async src="//cdn.embedly.com/widgets/platform.js" charset="UTF-8"></script>

/etc/resolv.conf が問題だという。イメージ取得稼働中の他のラズパイの設定を確かめる。

```
$ cat /etc/resolv.conf
# Generated by resolvconf
nameserver 192.168.1.1
```
この内容を問題の発生しているラズパイに適用し、リロード。

```
$ sudo /etc/init.d/networking reload
[ ok ] Reloading network interfaces configuration...done.
```
これで解決した。
数値配列のすべての乗算のパターンを実行してその合計値を取得する

## 前提
表題のとおり、JavaScript で数値で構成された配列のすべてのパターンを実行してその合計値を取得します。
例えば[3, 1, 2]という配列がある場合には以下のパターンを実行します。

1. 3 * 1
2. 3 * 2
3. 1 * 2

そしてその全ての計算の合計値を取得してみます。

## コード

```javascript

function combination(input) {
  let numbers = input;
  let result = 0;
  numbers.forEach((number) => {
    numbers = numbers.slice(1)
    numbers.forEach((number2) => {
      result += number * number2;
    })
  });
  console.log(result);
}

combination([3, 1, 2]); //=> 11
```

slice() で配列を作り直しているところがポイントなのですが、もう少しマシに書けそうです。
cronを使って起動したプログラムはインタラクティブにできない？

## cronでインタラクティブなプログラムを動かしたかった
某所で書籍の貸し出し履歴を追跡するというプロジェクトを動かしていて、バーコードが正しく読み込まれたかどうかのフィードバックや記録そのものにRaspberry Piを利用したい。ISBNに基づいて管理する予定なので、バーコードリーダーの入力を受け取って、「ちゃんとISBNが受け取れていたらOK、そうでなければNG」というフィードバックを返すようなプログラムをPythonで作成。
現場は非エンジニアの人ばかりで、仕事で使っているPCと社内LANからSSH接続して起動するというのは難しそうだったので、

1. ラズパイを起動するタイミングでプログラムが実行されるようにcronを設定
2. 入力デバイスはバーコードリーダー、フィードバックはSense HatのLEDで表示する

という最小限の構成を組み立てて、これでよし...と思った矢先。

## 入力を受けられない
入力を受ける前にEOF Errorを吐いてプログラムが落ちてることが分かった。入力デバイスの有無はどうやら関係ないっぽい。EOF Errorということは入力のストリームを待たずして処理しようとしているということで、どうすればいいか全く分からず。

## Cronで起動したプログラムはターミナル実行ではない
いろいろ調べていると以下の記事に当たった。
[How to run an interactive Python script as cron job?
](https://stackoverflow.com/questions/41879590/how-to-run-an-interactive-python-script-as-cron-job)

ものすごくざっくりとした理解なので間違ってるかもしれないけど、要するにcronを利用してプログラムを立ち上げるときはターミナルで実行されてるのではなくバックグラウンドプロセスとして走るので、外部から入力を受けたりすることはできない...ということらしい。
じゃあバックグラウンドプロセスの標準入力はどう扱えばいいんだ？と思いさらに調べたらここに答えらしきことが書いてあった。

[バックグラウンドで実行するプロセスの標準入力は・・・](https://torutk.hatenablog.jp/entry/20090305/p1) (「torutkのブログ」様の記事より)

上記の記事ではmkfifoコマンドをうまく使って標準入力と標準出力を得るようにしているが、今回自分がやりたいのはPythonの`input()`で入力を受け取ってその内容を判定して...というような処理を回すことで、その辺の処理は全てPythonのプログラム中で完結させたいので、もう少し何か工夫が必要っぽい。
他にもcronに設定する段階で標準入力を `/dev/null` で指定するとうまくいくとかいかないとか...

## バックグラウンドプロセスの標準I/Oはめんどくさい？
単に自分の知識不足な感はあるものの、バックグラウンドプロセスに積極的に入力を渡すのはあまり得策ではなさそう、という知見は得られた。
Raspberry Pi 3にWindows10 IoT Coreをインストールする

#概要
Raspberry Pi 3にWindows10 IoT Coreをインストールする手順です。

#環境
PC/OS : Windows10
Raspberry PI 3 Model B
microSDカード
microSDカードリーダー

#PCへWindows 10 IoT Core Dashboard のインストール
ここからダウンロードします。
https://docs.microsoft.com/ja-jp/windows/iot-core/downloads

#Windows 10 IoT Core DashboardでWindows10 IoT CoreをmicroSDカードにインストール
![キャプチャ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/528926/ab14c3bf-9783-b694-968c-4533704087e8.png)
microSDカードへインストールが終わったら、Raspberry PI 3 Model Bへ挿入する。

#結果
初期設定を完了すると、以下のような画面になる。
![S__24748037.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/528926/1139dbdf-d17c-9610-2dba-d22bd0b030f2.jpeg)
php7.0から使える「宇宙船演算子」が名前がかっこいいw

php7.0系の新機能として「宇宙船演算子」なるものがありました。
私はそんなに使う場面ないですが名前がかっこいいのでせっかくなのでメモしておきますw

ちなみに英語版ドキュメントの表記では
「**Spaceship operator**」
でした。

確かに宇宙船演算子ですw

## 宇宙船演算子

二つの式を比較するために使うものです。

```
echo $a <=> $b;
```

``$a``が右辺の``$b``より大きい場合は ``1``
``$a``と``$b``が等しい場合は ``0``
``$a``が``$b``より小さい場合は ``-1``
 をそれぞれ返します。

下記の動作も公式のサンプル通り同様です。

```php
// 整数値
var_dump(1 <=> 1); // 0
var_dump(1 <=> 2); // -1
var_dump(2 <=> 1); // 1

// 浮動小数点
var_dump(1.5 <=> 1.5); // 0
var_dump(1.5 <=> 1.6); // -1
var_dump(2.1 <=> 1.5); // 1

// 文字列
var_dump("a" <=> "a"); // 0
var_dump("a" <=> "b"); // -1
var_dump("b" <=> "a"); // 1

```


https://www.php.net/manual/ja/migration70.new-features.php#migration70.new-features.spaceship-op
メーカーエンジニア歴7年間の備忘録　ー　入門

#はじめに
私は、とある計測装置メーカーのエンジニア（比率はソフト９、ハード１）をしています。
現在は持病のために自宅療養中で休職をしています。

時間を有意義に使用するために、これまでの技術歴を作業順に備忘録を残していこうと思います。

重視するのは、特別な技術でなく初心者から現場において経験してきた過程、当たり前のことだけど現場の経験でしか蓄積できない技術を残していくことです。少しでも新任エンジニアへの助けになれば幸いです。

出来るだけ説明を端折らない、誰にでも分かる、を目指しています。
技術書だけでは見えにく現場の視点で情報を発信できれば幸いです。

***

##一通りの技術内容
経歴書を兼ねて、現スキルを公開します。

### 【経験デバイス】
 - コンソール系
    - Windows PC (x86系)
    - Linux PC (x86系)
 
 - 組み込み系
    - Armadillo 400シリーズ (ARM Linux)
    - PIC (8、16、32bit、RTOS)
    - STM32 (ARM)
    - Intel SoC (FPGA + ARM)

###【経験アプリケーション】
 - Windowsアプリケーション
    - Visual Studio C++ ネイティブ (ハード制御のデバイスドライバ、Direct X)
    - Visual Studio C# .NET (Win Form、WPF)
 
 - Webアプリケーション
    - HTML + PHP + Java script (jQuery, Ajax, node.js)

 - 組み込みアプリケーション
    - Linuxカーネル修正
    - フロントエンドのGUI (LCD(液晶)、VFD(蛍光表示管))
    - デバイス制御用アプリケーション（ASICやFPGAのレジスタ制御）
    - SNMPアプリケーション
    - リモートコントロールアプリケーション
    
##【 経験OS・環境 】 
### Windows OS XP、7、10
 - 基礎ツール 
   - Office系（Woed、Excel(VBA、マクロ)、Power Point、Visio)
   - フリー系（Dia、FreeMind、GIMP）
   - Adobe製品（Photoshop Erements、Premiere Erements） 

 - ソフト開発環境
    - Visual Studio 2008、2015、2017
    - Visual Studio Code (C、C++、Web開発)
    - DS5 (ARM用 Eclipse)
    - Microsoft Expression Web 4
    - Apache
    - True Studio(STM32)
    - MPLAB(PIC) 

 - ハード開発環境
    - FPGA
        - Quartus Prime
    - 電子回路開発
        - OrCad

### Linux OS debian、ubuntu系
  - ARM系 組み込みLinux OS（クロスコンパイル vmwareでの仮想環境開発）
  - node.js 
  - lighthttpd
  - SNMP


##【 経験言語、ライブラリ 】 

 - 組み込み系：C、C++（STL） 
 - Win系：C++（STL）、VC++（MFC、DirectX 10）、VC#（.NET、WPF） 
 - WEB系：HTML、PHP、JavaScript（jQuery、Ajax、TypeScript、AngularJs）
JSON简单介绍

#1.简介
- JSON: JavaScript Object Notation(JavaScript 对象表示法)
- JSON 是存储和交换文本信息的语法。类似 XML。
- JSON 比 XML 更小、更快，更易解析。


#2.语法
**JSON 语法是 JavaScript 对象表示语法的子集。**

- 数据在名称/值对中
- 数据由逗号分隔
- 大括号保存对象：{}
- 中括号保存数组：[]

#3.值
- 数字（整数或浮点数）
- 字符串（在双引号中）
- 逻辑值（true 或 false）
- 数组（在中括号中）
- 对象（在大括号中）
- null

#4.例
```
{
  "sites": [
    {
      "name": “AA","url": "www.runoob.com","age": 30,"flag": true,"runoob": null
    },
    {
      "name": “BB","url": "www.google.com","age": 20,"flag": false,"runoob": null
    },
    {
      "name": “CC","url": "www.weibo.com","age": 10,"flag": true,"runoob": null
    }
  ]
}

```
#5.工具
http://c.runoob.com/front-end/53
webサイトを作る上でモックアップを作ってみた

# きっかけ

自分で何かサイトを作るときはだいたいなんとなく作り初めていたけどデザインでいろいろ迷ったりすることが多いので

モックアップを作ってみた

# モックアップ

そもそもモックアップ自体よくわかっていなかったのだけれど

コーディングはせず、何かしらのツールを使って実際のwebサイトのデザインを作成するものをモックアップと言うらしい。

実際の完成イメージを作成できるのでコーディング時にあれこれデザインで悩まず済む

自分の場合は

https://moqups.com/

このサイトを使って作成してみたが結構使いやすかった。

有料版にするとモックアップから自動的にhtmlを生成したりしてくれるそうで、結構便利そう。

# 試しに作って見たもの

![Screenshot from 2019-11-07 11-02-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/207921/527ae9a1-4789-2f65-0073-e82b86ed1dc6.png)



モックアップを作成することで必要な機能が見えて来たりするし

個人で何かサイト作るときもモックアップを作ったほうがかなり効率的に開発できそう。

おわり:sunny:
【Azure AD】Staged rollout やってみました！ 


#待望の AzureAD Staged rollout Public Previewです!!
参考: https://techcommunity.microsoft.com/t5/Azure-Active-Directory-Identity/Staged-rollout-to-cloud-authentication-now-in-public-preview/ba-p/82783

皆さんこんにちは、アイネットテクノロジーの上口です。
つい先日ですが、AzureAD Stagede rollout が PrivetePreview から PublicPreviewになりました。

では早速ご紹介しますね。

まず、この環境に不可欠なのでADFS環境があること、ADFSからAzureADに認証を変更する目的であること。
そのためにテストを行う必要があるかと思いますが、ドメイン単位で変更しなくてはいけないという
大きなリスクがありました。今回のStagedrolloutはドメイン単位ではなく、グループ単位で変更が可能
となるため、非常に便利で認証方式の移行ハードルを下げてくれます。
#0.AD FSの世界
<img src= "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521349/2c43b305-fa5a-ca8a-3df2-afaccdae98ee.png" width=90%>

#1.Good bye AD FS
####メリットはセキュリティの向上で、以下のことが挙げられるでしょうね。
・オンプレミスに認証の口を持たせなくてよい。（WAP、ADFS）
・SmartLockoutでブルートフォースやパスワードスプレー攻撃を自動的にブロック
・IPLockoutで危険だと判断されているIPからのアクセスをシャットダウン
####そして、何よりADFSがなくなれば、下記の点で良いでしょう。
・社内サーバーの可用性を気にする必要が無くなる。
・条件付きアクセスが使用可能のなる。
・危険なユーザーのサインインやリスク検知、自動対応が可能になる。
・サインインログなども一元管理されコンプライアンス的にも非常により。

#2.Staged rolloutを試します。

まず、AD・AADC・AD FS・WAP 環境を構築しました。 
では早速。

今は、リダイレクトされます。
<img src= "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521349/21dbe280-026c-ea33-03ef-e9d1dd40a57f.png" width=90%>


■ユーザーおよびグループの構成（AADCにて同期）
下記の通り、hoghogehoge.clubというドメインとユーザーを何名か作成。
<img src= "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521349/1997f611-2b5e-acbe-3ef2-9e3b0614ea86.png"width=100%>

今回、解りやすいようにADFSグループという名前のグループを作成し、ユーザーを投入します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521349/5ae06656-ec73-706d-cde8-5c876d9b65cd.png)

ではでは、下記の通り、[Azure AD Connect] → [クラウド認証の段階的なロールアウト]をクリックします。
<img src= "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521349/474dfefb-c47b-e27c-d689-2cb86a4263bb.png"width=80%>


今回パスワードハッシュ同期しているので、パスワードハッシュ同期を"オン"にし[グループをの管理]からグループを選択します。
<img src= "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521349/dde9010b-1a6f-a84a-1cd1-187e8e3d17c5.png"width=80%>

<img src= "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521349/5ebf454c-4b31-69cd-bdc2-e60b96f7b984.png"width=80%>

###いざ認証画面へ！！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521349/9db6b1b5-5371-0dee-19b9-081effcb8eed.png)

####リダイレクトされませんねー。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521349/674c3726-abd0-d878-9bb5-c2d86425cd1b.png)

###できました！！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521349/26a00c17-13a1-cb76-fe66-2f6d46869e9d.png)

####※Stagedrolloutの条件
・先進認証有効化（EXO&S4Bは2017年８月にテナント自動ON）
・クライアントアプリはOffice2013以降が基本です。
（認証方式はパスワードハッシュ同期が推奨）

これで移行のハードルもグンっ！！とさがりましたね♪♪

ではでは。また見てくださいね。
【VRChat】デスクトップモードで配信するためにカメラ視点を表示する

※この記事は、VRCSDK2を使った解説となっています。2021年12月現在はVRCSDK3を使うことが強く推奨されているため、本稿内で取り扱うVRC_Trigger(VRCSDK2でのみ使用可能)に相当する部分はVRCSDK3のUdon Graphを使って作成する必要があります、ご注意ください。

こんにちは！八ツ橋まろんです！

VRChatは、VRモードまたはデスクトップモードでプレイできるソーシャルゲームです。

VRモードでプレイする場合カメラ機能を使うことができるので、デスクトップにカメラ視点の映像を表示することで、VRゲームでありながら3人称視点の様子を配信したり動画にすることができます。

デスクトップモードの場合はカメラ機能を使えないため、1人称視点で配信しなければなりませんが、そうすると自分の姿が画面に映らないため、**「鏡の前に立つことで自身を映す」**とか、**「ワールドギミックで視界をハッキングし、ワールド内のカメラの映像を映すことで3人称視点を作る」**といった工夫をすることがあります。
![無題.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478685/049d40c8-8e2e-4ee1-c39d-cbda344770e9.jpeg)
スクショ：デスクトップモードでは、カメラが使えないので自分の姿が映らない

本記事では、後者の『カメラ映像を映す』やり方を解説します。

※VRChatにワールドをアップロードする手順やVRCSDKの詳細な説明は省きます


# 手順

①まずはVRChatにアップロードしたいワールドを適当に準備してください。

②ProjectにRenderTextureを作成します。大きさは1920 x 1080としておきましょう。
<img width="209" alt="Qiita1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478685/17d9cbf6-2ab3-6c89-0b9b-5e9b629727d3.png">

③HierarchyにCameraを追加し次のように設定します。作成したRenderTextureに、Cameraの映像が映るようになります。
<img width="292" alt="Qiita2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478685/3d00f464-b169-6df1-f4b6-fffa6c83150a.png">

④HierarchyにCanvasを追加し、その子にRawImageを追加します。CanvasとRawImageの設定は以下のようにしておきましょう。
<img width="282" alt="Qiita3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478685/9991ae48-91ae-468b-b2e2-52618d36a5ec.png">
<img width="290" alt="Qiita4.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478685/507f89ed-b4de-ea84-730b-ccdc4d8bfd89.png">

⑤空のGameObjectにVRC_Triggerを付け、キーボードの押下でRenderTextureがON/OFFするようにします。(ここではキーボードの"Qキー"に設定しています)
<img width="344" alt="Qiita5.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478685/3c6f6ff2-9201-08ee-0363-efa2b478ce14.png">

⑥RenderTextureを非アクティブにしましょう

これで準備完了です。VRChatでテストすると、キーボードのQキーで1人称視点とカメラ視点が切り替わります。
![無題a.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478685/ca22c1aa-dede-93be-c8f9-9a078de3761a.jpeg)
スクショ：カメラ視点になった！これでデスクトップモードでも自分が映る！


# 簡単な解説
「Screen Space - Overlay」設定になっているCanvasは、カメラにオーバーレイして表示されるため、1920 x 1080の大きさのRenderTextureが視界にオーバーレイすることで、カメラ映像そのままが画面に映ります。

以上、「デスクトップモードで配信するためにカメラ視点を表示する」でした💡


八ツ橋まろん

🌟🌟🌟こちらも覗いてみてねっ🌟🌟🌟
Twitter
https://twitter.com/Maron_Vtuber
pixivFANBOX (ツールの配布)
https://www.pixiv.net/fanbox/creator/16717003
Youtube (ツールの解説やVtuber活動)
https://www.youtube.com/channel/UCiIbLpncjzahHsp8cokG56g
【JavaScript】インクリメント/デクリメント演算子。i++と++iの違い

#### インクリメント演算子
`++`
【例】`++i`  iの値を1増やす
#### デクリメント演算子
`--`
【例】`--i`  iの値を1減らす

どちらもfor文やwhile文でよく使います。
JSを勉強し始めて、約2ヶ月程経ちますが、改めて基礎を振り返り、備忘録として書きます。
#### 

###### ▼変数のあとに「++」して代入
```javascript

let x = 2;
let y = x++;
console.log("x=" + x + " y=" + y);
```
結果： x=3 y=2


###### ▼変数のまえに「++」して代入
```javascript

let x = 2;
let y = ++x;
console.log("x=" + x + " y=" + y);
```
結果： x=3 y=3

##### 結果が異なる理由

▼参考にしたリファレンス

- [演算子の優先順位](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Operator_Precedence)
- [算術演算子(インクリメント)](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Arithmetic_Operators#Increment)

>オペランドの後に演算子を置く後置記法 (例: x++) で使った場合、加算する前の値を返します。
オペランドの前に演算子を置く前置記法 (例: ++x) で使った場合、加算した後の値を返します。

<img width="646" alt="スクリーンショット 2019-11-07 10.57.20.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491968/896a3acb-3e62-d5c6-67cf-394240ca6932.png">

「--」の場合も同じく、このルールに基づきます。
ド文系の私にとっては「常識」ではないこの分野のこと。
ひとつ勉強になりました。

以上です。
Swiftでの文字列操作まとめ

## Delegate
**・[[Swift]TextFieldに文字が入力される度に処理を実行する - Qiita](https://qiita.com/cyan/items/ce299d1b2fefde4c068e)**

## 取得
**・[Swift - swift テキストで入力された文字の取得｜teratail](https://teratail.com/questions/53620)**

## 操作
**・[SwiftのCharacterSetで文字列操作 - Qiita](https://qiita.com/shtnkgm/items/83e88f230366adfad8e8)**
**・[string from 文字列から最後の文字を削除します。スイフト言語 - 初心者入門サンプル](https://code-examples.net/ja/q/17013b0)**
**・[Swiftで任意の文字列が含まれるか判定 - Qiita](https://qiita.com/osamu1203/items/3ee63291c37d91428b55)**
**・[部分文字列の取得(Swift) [prefix, suffix, index, [], String.Index] iOS Objective-C, Swift Tips-モバイル開発系(K)](http://www.office-matsunaga.biz/ios/description.php?id=24)**
**・[[Swift4]StringのSwft4変更点と文字列操作 | RE:ENGINES](https://re-engines.com/2018/09/27/swift4string%E3%81%AEswft4%E5%A4%89%E6%9B%B4%E7%82%B9%E3%81%A8%E6%96%87%E5%AD%97%E5%88%97%E6%93%8D%E4%BD%9C/)**

**・[Swift Language - 文字列に定義されたセットの文字が含まれているかどうかを確認する | swift Tutorial](https://riptutorial.com/ja/swift/example/5336/%E6%96%87%E5%AD%97%E5%88%97%E3%81%AB%E5%AE%9A%E7%BE%A9%E3%81%95%E3%82%8C%E3%81%9F%E3%82%BB%E3%83%83%E3%83%88%E3%81%AE%E6%96%87%E5%AD%97%E3%81%8C%E5%90%AB%E3%81%BE%E3%82%8C%E3%81%A6%E3%81%84%E3%82%8B%E3%81%8B%E3%81%A9%E3%81%86%E3%81%8B%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%99%E3%82%8B)**
->`rangeOfCharachter`にもより詳細に記述できるやつがあるよという話
同一オリジンポリシーとCORS

# ざっくり説明
- **同一オリジンポリシー** : ブラウザの機能の一つで、異なるサイトからのアクセスをブロック。
- **CORS** : 異なるサイト間でリソースを共有するための仕様。

# 同一オリジンポリシー
- Javascriptなどであるサイトから他のホストにアクセスしようとするとWebブラウザがそれを阻止する。
- 同一オリジンの条件は、FQDN・プロトコル・ポート番号が一致していること。それ以外は別のホストとみなされる。


# CORS(Cross-Origin Resource Sharing)
- 同一オリジンポリシー下でも、異なるホスト間でリソースを共有するための仕様。
- サイトA(http://aaaa.com) からサイトB(http://bbbb.com) のリソースにアクセスする例で考える。
  
(1) AがBのコンテンツにアクセスしようとすると以下のようなHTTP HEADERが付与される。   

```
Origin:http://aaaa.com
```  

(2) Bはレスポンスヘッダに以下を付与してAからのアクセスを許可できる。

```
Access-Control-Allow-Origin:http://aaaa.com
```