OmniAICreator/Qiita-1.07M huggingface dataset:
1ファイルでいい感じのWEBサーバーを作るサンプル with Ruby/Sinatra

- 「Docker swarmを組んだから、とりあえずWEBサーバーを動かしたい」
- 「ECSでSSMからパスワードを取れているか確認したい」

そんな**とりあえず適当なWEBサーバーを動かしてみたい**ことが、時々ありますよね？

まあ、Sinatra でチョロっと書けばいいのですが、**Sinatraのドキュメントを調べたりしているうちに「チョロっと」に毎回３０分ぐらいかかっている自分**に最近気づいたので、次の機会のためにコードを記事と[Githubレポジトリ](https://github.com/doloopwhile/simple-http-server)に残しておきます。

ご自由に改変してお使いください。

# コード

一応、特長を挙げると

- １ファイルにまとめている（`views/`ディレクトリを掘るのが面倒臭い！）こと
- HAMLを使っている
- marx.cssを適用しているので表示が微妙にオシャレ
- reload に対応（reload しても `__END__` 以降の部分の変更が反映される）

下記ファイルをコピーして実行してください。

```ruby
# app.rb
#
# $ gem install thin sinatra sinatra-contrib haml
# $ ruby app.rb
#
require 'sinatra'
require 'sinatra/reloader' if development?

get '/' do
  # Reading lines below __END__ (Almost equivalent to DATA.read).
  # DATA.read does not work with sinatra-reloader.
  code = File.readlines(__FILE__).drop_while { |l| l !~ /^__END__$/ }.drop(1).join
  haml code
end

__END__
%html
  %head
    %title Test
    %link{rel: "stylesheet", href: "https://cdnjs.cloudflare.com/ajax/libs/marx/3.0.7/marx.min.css", integrity: "sha256-hPp3aL54H6hqtJdIpwV2551XMfx3e5ZqZDzmTsX0ol0=", crossorigin: "anonymous"}
  %body
    %main
      %h1 Test
      %h2 Host
      %pre= `hostname`
      %h2 Environment variables
      %pre= ENV.map { |k, v| "#{k}=#{v}" }.join("\n")
```
簡単♪Windows 10でLinuxを動かす方法

# はじめに
クライアントと動作環境をそろえるためにLinuxが必要になり、環境設定したのでその方法を書き記します。
調べてみると、仮想環境など、小難しい設定がなくインストールできました！
最近は、どんどん便利な世の中になっていくなぁ。。。

# 環境
**OS** : Windows 10 Pro

# インストール
1. まず、「ストア ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19460/bfcd3962-6e71-cf82-aabf-063543e210a6.png)」で「Linux」で検索します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19460/68acafb7-f789-e53a-e41a-910e3b5ea89b.png)

2. 今回は「Ubuntu」をインストールしました。
3. 「入手」をクリックしてインストールしたら完了したら、まず下記の設定を進めてから起動します。
4. Windowsマークを右クリックし、「アプリと機能 > プログラムと機能 > Windowsの機能の有効化または無効化」で「Windows Subsystem for Linux」にチェックを入れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19460/fe20fb82-c043-2f93-1ace-00c038e3dcb5.png)
5. ここまで完了したら、インストールしたUbuntuを起動させます。
6. するとUserID/Password（半角英数字、空白不可）を聞かれるので、お好みで設定します。（※忘れないように。）

以上
UnixtimeStampの変換ならChromeのプラグイン「Utime」が便利

UNIXタイムスタンプの変換に関してはツールやWebサービスはめちゃめちゃたくさんあります。
プラグインもあればWebで自作している人もいたりと様々です。
そのように色々ある中で私が気に入って使っているのがこちらの
Chromeの拡張機能の**Utime**です。
https://chrome.google.com/webstore/detail/utime/kpcibgnngaaabebmcabmkocdokepdaki

使い方は簡単で、
追加して有効かするとURLのバーの横にこのようにボタンが表示されます。
<img width="199" alt="スクリーンショット 2019-11-21 14.06.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452135/23aab02c-ab7d-9f4e-5500-f29b6e2ad314.png">

そこにタイムスタンプを入力するだけです。

<img width="323" alt="スクリーンショット 2019-11-21 14.05.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452135/24959168-b650-f28a-3d9b-d47664fef1e4.png">

特にできることが他と差別化しているかというとそうでもないですが、
強いて言うなら
ブラウザはベースをchromeで使っているのでchromeのプラグインだと便利だというのと、
UNIXタイムスタン→日付形式、日付形式→UNIXタイムスタンのどちらにも対応している、
表示形式（yyyy/mm/ddなど）をオプションで設定できるのは割と便利です。

<img width="322" alt="スクリーンショット 2019-11-21 14.07.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452135/a4755f5d-bf56-d68a-1c0b-8025b48559d1.png">
【pardot】メルマガ開封者、クリック者へメール送信【リスト作成】

pardotを活用したメルマガ配信でリアクションがあったユーザに再度メルマガを送信したいことってありますよね。
engagementstudioを使用すれば解決するのですが、シナリオ作成の代案を紹介します。

## リアクション者の確認
<img width="1350" alt="HOSHI３NEWS_191024_-_Pardot.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411120/ca5fe3c7-5891-a5bd-c835-2f7164b65c44.jpeg">
送信済みメールから「HTML 開封率」「クリック/開封率」の数値をクリックします。

---
## リストへの追加
<img width="313" alt="メールクリックプロスペクト___HOSHI３NEWS_191024_-_Pardot.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411120/7b2d6623-cffb-b86c-d860-d26bbd5e5661.jpeg">
プロスペクトの一覧が出てきますので「ツール」から「リストに追加」を押します。

---
<img width="771" alt="メールクリックプロスペクト___HOSHI３NEWS_191024_-_Pardot.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411120/09cfcdc0-fe03-2f1f-74d4-66e5659c28fb.jpeg">
追加先のリストを選択する項目が表示されますので、行いたい操作を選択します。

---
これでリストの追加は完了です。
あとはドラフトから送信先リストを選択することで、配信が可能です。
強化学習１６　Colaboratoryのファイル操作と最初のCartPole

※　chainerRLからtorchRLに替えて、やり直します。
強化学習１５が終了していることが前提です。

ほとんどのシェル系操作は、下のように！をつければ実行できます。

```
!ls
```

ディレクトリ移動は%

```
% cd drive
```

ランタイムについては、以下に詳しく書かれています。
秒速で無料GPUを使う。
https://qiita.com/tomo_makes/items/b3c60b10f7b25a0a5935
メモリー空間は膨大に用意されるようですが、そこにデータを入れないといけない。
Googleのインタラクティブ優先は理解できますが、
アクセスするたびに、新しいメモリー空間が用意されて、そこにデータを移すのは大変な作業です。
そこで、重宝するのがgoogleドライブ。
とても簡単にマウントできます。

マウントの詳細については、ググってください。

このドライブのマウントですが、とてもいいと思います。レンタルサーバーで気になっていたのがデータのアップロードとダウンロードでした。
この敷居はとても高くて、時間あたりの課金を考えると見積もりも大変。そもそも無料なのですが、さらにアップロードとダウンロードの手間が減ります。

それでは、実行中のipynbのホームディレクトリーはどこなのか。
試しに、前でも使ったプログラムを実行します。

```
import gym
env = gym.make('CartPole-v0')
for i_episode in range(20):
    observation = env.reset()
    for t in range(100):
        env.render()
        action = env.action_space.sample()
        observation, reward, done, info = env.step(action)
        if done:
            print("Episode finished after {} timesteps".format(t+1))
            break
env.close()
```
エラーで動きません。
displayがダメとのこと。env.render()がダメなんです。

いろいろな変更の結果です。

```
!apt update
!apt install xvfb
!pip install pyvirtualdisplay
```
```
from pyvirtualdisplay import Display
disp = Display()
disp.start()
```
```
import gym
from IPython import display
import matplotlib.pyplot as plt
from matplotlib import animation


env = gym.make('CartPole-v0')

obs = env.reset()

img = []
for _ in range(100):
    obs, r, disp, i = env.step(env.action_space.sample())

    display.clear_output(wait=True)
    img.append(env.render('rgb_array'))

    if disp:
        env.reset()

dpi = 72
interval = 50 # ms

plt.figure(figsize=(img[0].shape[1]/dpi,img[0].shape[0]/dpi),dpi=dpi)
patch = plt.imshow(img[0])
plt.axis=('off')
animate = lambda i: patch.set_data(img[i])
ani = animation.FuncAnimation(plt.gcf(),animate,frames=len(img),interval=interval)
display.display(display.HTML(ani.to_jshtml()))

```
こちらを参照してください。
https://qiita.com/ymd_h/items/c393797deb72e1779269
FortiGateの初期化

#工場出荷時への戻し
以下コマンド実行後に再起動すると初期状態に戻ります。
ただしリビジョン（旧コンフィグ）やログは消えないので後述の方法で削除します。

```
# execute factoryreset
```

#リビジョンの削除

ファームウェアのアップグレードなど行っていると内部に古いコンフィグが残っていることがあるため以下の手順で確認・削除します。

##リビジョンIDの確認

```
# execute revision list config 

ID TIME                   ADMIN                 FIRMWARE VERSION        COMMENT
 1 2099-11-21 01:00:00    daemon_admin          V6.0.0-build999-REL0    Automatic backup (upgrade)
 2 2099-11-21 02:00:00    daemon_admin          V6.0.0-build999-REL0    Automatic backup (upgrade)
```

##リビジョンIDを指定して削除

```
# execute revision delete config <revision id>
```

#ログ削除

```
# execute log delete-all
```
ANDROID STUDIO KOTLIN アンドロイドスタジオ アクションバーを非表示にする方法

#MainActivity.ktでActionBarを非表示にする

具体的にはMainActivityの中にあるonCreateで
ActionBarを隠すsupportActionBarメソッドをコールします。

```
MainActivity.kt
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
         setContentView(R.layout.activity_main)
+        supportActionBar!!.hide()
     }
```

#styles.xml　アプリケーションのテーマでActionBarを無効に
app/res/values/styles.xmlのAppThemeに、windowNoTitle trueを追加します。
但しkotlinで効かない場合もありますので注意してください。

styles.xml

```
 <resources>

     <!-- Base application theme. -->
     <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
         <!-- Customize your theme here. -->
         <item name="colorPrimary">@color/colorPrimary</item>
         <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
+        <item name="windowNoTitle">true</item>         
全ActivityのActionBarが非表示になるので注意
```

#styles.xml　プリケーションのテーマに非ActionBarを適用

app/res/values/styles.xmlのAppThemeのparentを、
Theme.AppCompat.Light.NoActionBarに変更します。

styles.xml

```
 <resources>

     <!-- Base application theme. -->
-    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
+    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
         <!-- Customize your theme here. -->
         <item name="colorPrimary">@color/colorPrimary</item>
         <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
全ActivityのActionBarが非表示になるので注意してください。
```

#AndroidManifest.xml　特定のActivityでActionBarを非表示
これも使用できない場合がありますので注意してください。

AndroidManifestでActivityのスタイルを、
Theme.AppCompat.Light.NoActionBarに変更します。

```
AndroidManifest.xml
         android:roundIcon="@mipmap/ic_launcher_round"
         android:supportsRtl="true"
         android:theme="@style/AppTheme">

-        <activity android:name=".MainActivity">
+        <activity android:name=".MainActivity"
+                  android:theme="@style/Theme.AppCompat.Light.NoActionBar">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN"/>
指定したActivityのみActionBarを隠せるメリットがあります。
```

以上
Spring Security OAuth2はあと数年でサポート終了、その代替策

# Spring Projectからの発表
https://spring.io/blog/2019/11/14/spring-security-oauth-2-0-roadmap-update

重要な点は下記2点です

- 世の中に認可サーバー製品がたくさんあるので、Spring Securityではサポートしないことを決定しました
- Spring Security OAuth2は、2.3.xは2020年3月でEOL、2.4.xはFeature Parityに達してから（？）1年はサポートします

ということで、Spring Security OAuth2を使っている方は、なるべく早く移行することをおすすめします（下記）。

# クライアントおよびリソースサーバーの移行
Spring Security 5.x本体のOAuth2機能を使いましょう。

# 認可サーバーの移行
Keycloakなど、他の製品に移行しましょう。

# 参考資料
- [基礎からのOAuth 2.0とSpring Security 5.1による実装](https://www.slideshare.net/masatoshitada7/oauth-20spring-security-51-121418814)
- [Spring Security 5.1でOAuth 2.0のリソースサーバーを作る](https://qiita.com/suke_masa/items/0f75fa75a22a6551065b)
- [Spring Security 5.1でRestTemplateを使ってアクセストークンをリフレッシュする](https://qiita.com/suke_masa/items/fb065443975f7ceb801e)
- [KeycloakのLogout Endpointでログアウトする](https://qiita.com/suke_masa/items/e04880c5cf7232b60004)
- [OAuth 2.0 with Spring Security 5.1の認可サーバーとしてKeycloakを使う](https://qiita.com/suke_masa/items/6b84826df81c083b384c)
VueのComponentのScriptタグの個人的定義順

## 背景

* 複数人でVueのコンポーネント作ってると、定義順がブレがち。
* ガチガチに合わせなくてもいいとは思うけど、秩序のあるものにしたいから俺的順番を考えてみた。

## 定義順（上から）

| 名前 | 用途や備考など |
|:---|:---|
|name|コンポーネント名（ファイル名と同じ）|
|components|使用するコンポーネント郡（importしている）|
|mixin|（あれば）|
|props|（あれば）|
|data|※localStateとも呼ばれる|
|watch|（あれば）|
|computed|※算出プロパティとも呼ばれる|
|methods|コンポーネント内で使う関数群|
|------------|ここからはVueのライフサイクルHook　----------------------|
|beforeCreate|インスタンス生成前に実行。data()は呼ばれていない。|
|created|インスタンスが作成された後に実行。elementへのマウントはされいない。|
|beforeMount|elementのマウント前に実行。elementへのマウントはされいない。|
|mounted|elementのマウント後に実行。SSRの場合は使えない。<br>子コンポーネントを全てマウントしたことは保証されない。それを待ちたい場合は※１参照|
|beforeUpdate|dataの更新があった際にレンダリングされる前に実行。SSRの場合は使えない。<br>更新前のDOMにアクセスできる|
|update|dataの更新があった際にレンダリングされた後に実行。SSRの場合は使えない。<br>状態変化を行う処理は使わない。<br>再描画の保証がないので、子コンポーネントの描画を待つには※１参照|
|beforeDestroy|インスタンスが削除される前に実行。SSRの場合は使えない。|
|destroyed|インスタンスが削除された後に実行。SSRの場合は使えない。|
|errorCaptured|エラー捕捉時に実行。※ver2.5.0以降|

```js:※１
mounted() {
  this.$nextTick(function () {
    ....
  })
}
```
Rake::Task#enhance利用時、タスク間の依存関係を知りたい

# はじめに
　Rakeタスクをフックする際、よく**Rake::Task#enhance**が利用されます。この際、タスク間の依存関係、フックしたタスクのパラメータ、起動タスク名を知りたかったのですが、軽くググった限りでは出てこなかったので備忘も兼ねて残します。

# 環境
|   | バージョン |
|---|:--------:|
| OS | macOS 10.14.6 |
| Ruby | 2.6.3 |
| Rake | 13.0.1 |

# サンプル
```ruby:Rakefile
namespace :sample do
  desc '孫娘タスク前に実行されるタスク'
  task :before_daughter do |_, args|
    hooked_args = args.instance_variable_get('@parent')
    puts "(before_daughter) args[:name]:'#{args[:name]}', 2nd_param:'#{hooked_args.to_a[1]}'"
  end

  desc '孫娘 タスク(孫息子タスクから呼ばれる)'
  task :grand_daughter, :name do |task, args|
    puts "(grand_daughter)  args[:name]:'#{args[:name]}', 2nd_param:'#{args.to_a[1]}'"
    puts "(grand_daughter)  before:#{task.prerequisites}, root:#{Rake.application.top_level_tasks}"
  end

  desc '孫息子 タスク(起動タスク)'
  task :grand_son do |task|
    Rake::Task['sample:grand_daughter'].invoke("invoked by #{task.name}", 'hogefuga')
    puts "(grand_son)       before:#{task.prerequisites}, root:#{Rake.application.top_level_tasks}"
  end

  desc '子タスク'
  task :child do |task|
    puts "(child)           before:#{task.prerequisites}, root:#{Rake.application.top_level_tasks}"
  end

  desc '父タスク'
  task :father do |task|
    puts "(father)          before:#{task.prerequisites}, root:#{Rake.application.top_level_tasks}"
  end

  desc '母タスク'
  task :mother do |task|
    puts "(mother)          before:#{task.prerequisites}, root:#{Rake.application.top_level_tasks}"
  end

  # before_daughter -> grand_daughter
  Rake::Task['sample:grand_daughter'].enhance(['sample:before_daughter'])
  # child -> grand_son
  Rake::Task['sample:grand_son'].enhance(['sample:child'])
  # father, mother -> child
  Rake::Task['sample:child'].enhance(%w[sample:father sample:mother])
end
```

# 結果
```bash
$ rake sample:grand_son
=> Executing Rake sample:grand_son ...
(father)          before:[], root:["sample:grand_son"]
(mother)          before:[], root:["sample:grand_son"]
(child)           before:["sample:father", "sample:mother"], root:["sample:grand_son"]
(before_daughter) args[:name]:'invoked by sample:grand_son', 2nd_param:'hogefuga'
(grand_daughter)  args[:name]:'invoked by sample:grand_son', 2nd_param:'hogefuga'
(grand_daughter)  before:["sample:before_daughter"], root:["sample:grand_son"]
(grand_son)       before:["sample:child"], root:["sample:grand_son"]
```

# 結論
- Rake::Task#enhanceで設定したタスク名は**Rake::Task#prerequisites**に保存される
- 起動タスク名は、どこからでも**Rake.application.top_level_tasks**で参照できる
- **Rake::Task#invoke**で渡したパラメータは、フックしたタスクでも参照できる
    + 名前付きパラメータは、特に意識せずに取得できる
    + 名前なしパラメータは、`args.instance_variable_get('@parent')`で直接参照するしかない
        - **Rake::RakeArgument#parent**に、フックしたタスクのパラメータが格納されている
VMware上のマネージメントポートを別の仮想スイッチに付け替える

#概要
ESXiセットアップ時、デフォルトで作成されている仮想スイッチ「vSwitch0」にアタッチされている
ポートグループ「Management Network」を、別途新規に作成した仮想スイッチにアタッチしようとしてハマったのでメモ

#試してNGだったこと
GUIからポートグループのアタッチ先を変更しようとしたが、
白抜きになってしまっていたため変更ができなかった
マネージメント用のVMkernel NICをもう一つ作成、ポートグループ「Management Network」へアタッチし
既存のVMkernel NICを削除しようともしてみたが、こちらも新しいVMkernel NICを作成しようとした時点で
既にマネージメント用VMkernel NICが存在するとエラーが出てしまった

#変更方法
既存のマネージメント用VMkernel NICを再作成し、新しく作成した仮想スイッチにアタッチされているポートグループに追加する
作業はESXiのshellから行う

```
VMkernel NICのポートグループ変更 (削除して再度作成)

##既存VMkernel NICの削除##
# esxcfg-vmknic -d "Management Network"

##新VMkernel NICの作成##
# esxcfg-vmknic -a -i 10.6.227.1 -n 255.255.255.0 Manage

##仮想スイッチの再起動1##
# esxcli network vswitch standard set -v vSwitch0

##仮想スイッチの再起動2##
# esxcli network vswitch standard set -v vSwitch1
```
asciidoctor-pdf で日本語が化ける for Windows10

## TL;DR

default-theme.yml にフォントフォールバックを設定するんだ！

```default-theme.yml
font:
  catalog:
    # Noto Serif supports Latin, Latin-1 Supplement, Latin Extended-A, Greek, Cyrillic, Vietnamese & an assortment of symbols
    Noto Serif:
      normal: notoserif-regular-subset.ttf
      bold: notoserif-bold-subset.ttf
      italic: notoserif-italic-subset.ttf
      bold_italic: notoserif-bold_italic-subset.ttf
    # M+ 1mn supports ASCII and the circled numbers used for conums
    M+ 1mn:
      normal: mplus1mn-regular-subset.ttf
      bold: mplus1mn-bold-subset.ttf
      italic: mplus1mn-italic-subset.ttf
      bold_italic: mplus1mn-bold_italic-subset.ttf
### 以下を追記
    M+ 1p Fallback:
      normal: mplus1p-regular-fallback.ttf
      bold: mplus1p-regular-fallback.ttf
      italic: mplus1p-regular-fallback.ttf
      bold_italic: mplus1p-regular-fallback.ttf
  fallbacks:
  - M+ 1p Fallback
### ここまで
page:
（略）
```

## 解説

[2019_09_Asciidocを使っていてせっかくAsciidoctor-PDF環境を構築したのに出力したPDFの日本語が表示されなくて困っている人へ](https://qiita.com/yuyhiraka/items/569dbcfa329c492654c6)より引用：

> 結論から書くと、
> 「デフォルトスタイルのフォントに日本語字体が含まれていないこと」と「デフォルトスタイ ルのフォントフォールバックについての仕様変更」が原因で「Asciidoctor-PDFで出力したPDFを開くと日本語が表示されない」問題が発生する。
> 
> なお、「フォントフォールバック」とはフォントに存在しない字体を他のフォントで補うことである。

中略

> Asciidoctor-PDFのdefault-theme.yml上で前述の日本語の字体を含む「mplus1p-regular-fallback」に「フォントフォールバック」する設定が残っていた最後のバージョンが2019年4月18日にリポジトリに上がっている「v1.5.0.alpha.18」である。
>
>そしてその次のバージョンであり2019年7月8日にリポジトリ上に上がっている「v1.5.0.beta.1」で削除されている。

とあるので、削除された分を補ってやるのが今回の手法です。

## 環境

OS: Windows10 バージョン 1909
RubyGems Environment:
  - RUBYGEMS VERSION: 2.7.6.2
  - RUBY VERSION: 2.5.5 (2019-03-15 patchlevel 157) [x64-mingw32]
asciidoctor：2.0.10
asciidoctor-pdf：1.5.0.beta.7
asciidoctor-pdf-cjk：0.1.3

## 手順

私の環境では、default-theme.yml が`C:\Ruby25-x64\lib\ruby\gems\2.5.0\gems\asciidoctor-pdf-1.5.0.beta.7\data\themes`内にあるので、default-theme.yml をエディタで開き、記事先頭で書いた追記を行いました。

## ハマリポイント

当たり前かもしれませんが、default-theme.yml を変更したら asciidoctor-pdf コマンドを実行しているターミナルソフトを再起動すると良いようです。

再起動しないと設定が反映されない？　ことがあります。
Xcodeアップデート後のエラー解消の手順メモ

Xcodeのアップデートを行なった後に出現する諸々のエラーの解消に行なった手順をメモしていきます。

## Xcodeのダウンロード
1.インストールしたいXcodeのバージョンを以下で検索(今回は `12.2.1` )
https://developer.apple.com/ios/download/

2.圧縮ファイルをダウンロードして解凍

3.元のXcodeを削除する(任意？)

→この状態でビルドの実行をすると色々エラーが起きる

## エラーの解消でやった手順
1.まずは紐づいているXcodeのバージョンを確認
<img width="797" alt="スクリーンショット 2019-11-21 11.28.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473856/e66e957a-fcd5-ab2f-a2f9-777965918c64.png">
2.古いバージョンが指定されていたので新しいバージョンに変更

3.DerivedDataの削除
↓Preferenceを押して
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473856/5c3d2635-f85e-c59e-0e6f-7e0d5571354e.png)

↓Locationsを開いて
<img width="838" alt="スクリーンショット 2019-11-21 12.40.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473856/7f295405-8815-b303-345d-458fe3cb0b58.png">

↓DerivedDtaのよく分からない中身を削除
<img width="1127" alt="スクリーンショット 2019-11-21 12.46.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473856/57922ace-7a12-8b8d-e801-8104229ac386.png">

4.ターミナルで `xcode-select --print-path` を実行

5.更に `sudo xcode-select --switch /Applications/Xcode.app` を実行

6.更に `bundle install` を実行

7.更に `bundle exec fastlane setup` を実行する

## 結果
新しいXcodeでビルドが実行できるようになりました。

### メモ
それぞれの手順が何の意味があるか分からず行なっているので、今後わかり次第に追記していきます。
線形系が縮退するアニメーションを死ぬほど汚いコードで書いた

#やってること
大学の後輩が線形系の縮退のイメージが湧かない，と言っていたので2次元線形系の固有ベクトルが融合していくようなアニメーションを作ろうと思いました．解いている方程式は至極単純で，次の形をしています．

```math
\frac{d}{dt}\Bigl(\begin{matrix}
x\\
y
\end{matrix} \Bigl)=
\Bigl(\begin{matrix}
-1 & -1\\
0 & -1-\epsilon
\end{matrix}\Bigl)\Bigl(\begin{matrix}x\\
y\end{matrix}\Bigl)
```
$2\times 2$行列の$(2,2)$成分だけに摂動$\epsilon$を入れておき縮退を予め解いてあります．そして，for文をぶん回して$\epsilon$を徐々に変化させ，そのステップ毎に複数の初期条件からscipyのodeintで積分していきます．
下のサンプルでは，安定なノードを縮退させています．もう少しfor文を回せば原点がサドルに変化するのも見れると思いますし，摂動の入れ方次第ではノードとスパイラルの転移も見れるはずです．

#実際に書いたコード
反知性的なコードなので公開するか半日悩みましたが，誰かに有意義なコメントをしてもらうことに期待して公開します．for文の中でステップ毎に摂動パラメータ$e(=\epsilon)$をステップ数に応じて計算させ，それを元に微分方程式を解いています．

```python:Linear_degenerate.ipynb

%matplotlib nbagg
import matplotlib.pyplot as plt
import numpy as np
from scipy.integrate import odeint
from numpy import sin, cos, pi
import matplotlib.animation as animation
# degeneration of linear system
def func(v, t, e):
    return [ -v[0] - v[1], -(1+e)*v[1] ] #  2-D linear system

#def func(v,t):
#    return [ -v[1] -0.5*v[0]*(v[0]**2+v[1]**2), v[0] -0.5*v[1]*(v[0]**2 + v[1]**2)]

# time length and unit step    
dt = 0.1
T = np.arange(0.0, 20, dt)
v0 = [[17,7], [17,17], [7,17], [-17,-7], [-17,-17], [-7,-17],[-7,17], [7,-17]]

# make animation
fig = plt.figure()

ims = []

for k in range(200):
    e = (150-k)/50
    #each initial state
    space = []
    for v, color in zip(v0, 'rbgrbgkk'):
        u = odeint(func, v, T, args=(e,))
        space += plt.plot(u[:,0], u[:,1], color)

    ims.append(space)
    
    
    '''u0 = odeint(func, v0[0], T, args=(e,))
    space0 = plt.plot(u0[:,0], u0[:,1], 'r')
    u1 = odeint(func, v0[1], T, args=(e,))
    space1 = plt.plot(u1[:,0], u1[:,1], 'b')
    u2 = odeint(func, v0[2], T, args=(e,))
    space2 = plt.plot(u2[:,0], u2[:,1], 'g')
    u3 = odeint(func, v0[3], T, args=(e,))
    space3 = plt.plot(u3[:,0], u3[:,1], 'r')
    u4 = odeint(func, v0[4], T, args=(e,))
    space4 = plt.plot(u4[:,0], u4[:,1], 'b')
    u5 = odeint(func, v0[5], T, args=(e,))
    space5 = plt.plot(u5[:,0], u5[:,1], 'g')
    u6 = odeint(func, v0[6], T, args=(e,))
    space6 = plt.plot(u6[:,0], u6[:,1], 'k')
    u7 = odeint(func, v0[7], T, args=(e,))
    space7 = plt.plot(u7[:,0], u7[:,1], 'k')

    ims.append(space0+space1+space2+space3+space4+space5+space6+space7)
    '''
plt.xlim(-17 ,17) 
plt.ylim(-17 ,17)
plt.xlabel('x')
plt.ylabel('y')
plt.grid()
ani = animation.ArtistAnimation(fig, ims, interval=27, blit=True, repeat=True)

plt.show()
```
##実行例
![Lin_Deg.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505603/5e979ab2-c173-7d7c-88b5-2c192fd7a0c1.gif)

$x$とは一次独立だった固有方向が段々$x$に潰れていくのが見えると思います．


##問題点
先に記載したコードは問題だらけで，
 ~~1:for文中で同じような操作を何度も行っている~~
 ~~2:自動化したかったが初期値に応じた色の変更をどうしようか考えていなかった~~
3:せっかく縮退を見ているのに固有方向のプロットを忘れている
などが挙げられます（なら自分で直しておけ，という話ですが）．

もっと賢いコード ~~が書けたらあとで何とかします．~~ を教えてくれた優しい方のおかげで問題1,2が解決しました．改めて感謝します．解決していただいた問題の部分ですが，一応自分の書いた汚いコードもコメントアウトで残しておくことにしました．
初期条件の場所ももう少し工夫できたらな，と思いましたが系によって見やすい場所は違うので結局手で入れるしかないのかなぁと．
Git操作まとめ 〜変更内容の取り消し(git reset)

この記事では、Ubuntu18.04LTSにインストールしたGit(version 2.17.1)を使用しています。

Gitを使っている際に、ステージングしたりコミットしたりしている中、「もとに戻したい」場合が出てきます。
基本的な表にまとめると下表のようになります。

- HEAD・・・現在の最新のコミット
- ステージングエリア(インデックス)・・・git addしたところ
- 作業ディレクトリ(ワークツリー)・・・現在編集しているところ

||HEAD|ステージングエリア|作業ディレクトリ|
|:-:|:-:|:-:|:-:|
|git reset --hard|◯|◯|◯|
|git reset --mixed<br>(no option)|◯|◯|ー|
|git reset --soft|◯|ー|ー|

optionごとに分けて書いていきます。

---

## HEADの位置、ステージングエリア、作業ディレクトリの全てを戻す

```shell
git reset --hard
```

--hardオプションをつける場合、HEADの位置・ステージングエリア・作業ディレクトリの3つ全部を元の状態に戻します。
全ての状態を元に戻してしまうということは、作業ディレクトリで編集していたものも戻ってしまうため、注意が必要です。

---

## HEADの位置、ステージングエリアの２つを戻す

```shell
git reset
```

```shell
git reset --mixed
```

上記２つのコマンドで同じ働きをします。
ステージングエリアの状態を変えてしまうので、安易にオプション無しでの使用は注意が必要です。

---

## HEADの位置のみを戻す

```shell
git reset --soft
```

HEADのみ変更したいとき、このオプションを使用します。

---

### 本記事目次ページ
[Git操作まとめ](https://qiita.com/tsweblabo/items/6aec9d022c08954f5024)

---

### 参考サイト
- [Qiita:[git reset (--hard/--soft)]ワーキングツリー、インデックス、HEADを使いこなす方法](https://qiita.com/shuntaro_tamura/items/db1aef9cf9d78db50ffe)
- [Qiita:git-resetは結局何を戻すのか](https://qiita.com/fnobi/items/ec036c1b5d7ee5a8517c)
[IntelliJ IDE] Terminalのスクロールバッファを増やす

設定の変更方法を探すのにやや時間を要したのでメモします。
デフォルトは1000行でしたが、私には少し足りませんでした。

スクロールバッファを増やすとパフォーマンスに影響を与える可能性がありますので、ご注意ください。

検証環境 :`PyCharm 2019.2`


# 手順

下記設定をした後に**再起動**して反映されました。

```
1. Cmd+shift+A
2. Type 'registry' in the search box
3. Click 'Registry...' to view registry details
4. Scroll down to 'terminal.buffer.max.lines.count' (or it may be near the top if it has been updated previously)
5. Click on the value in the Value column, enter new value (eg. '5000')
6. Click 'Close'
```

手順はサポートページから取得しました。

https://intellij-support.jetbrains.com/hc/en-us/community/posts/206381169-Terminal-Line-Buffer-increase

設定後、再確認するとこんな感じになります。
<img width="897" alt="スクリーンショット 2019-11-21 12.10.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110482/3e411b12-8740-9a52-f0a7-524452903879.png">


# 設定反映の確認

10000行に設定して、10000行以上遡れるかを確認しました。

```
COUNT=0
while [ $COUNT -lt 1100 ]; do
    echo $COUNT
    COUNT=`expr $COUNT + 1`
done
```
ここからスクロールして遡る
<img width="411" alt="スクリーンショット 2019-11-21 12.07.43.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110482/c7c06adb-fa0b-9b47-ee83-25d20e9274d6.png">
↓
ここでスクロールの限界を迎えました。
<img width="509" alt="スクリーンショット 2019-11-21 12.07.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110482/7612c457-96a7-49ee-91a5-8f55cd77c15b.png">

大体合っていので、OKとします :ok_hand:
[WIP]しょぼいBookmarklet集(G Suite関連)

## なにこれ

* Googleドキュメントとかスプシとか使ってて「こうだったらいいのにな」が無いため仕方なく書いたコード置き場

## 本文

### Googleドキュメント

#### 「このドキュメントのタイトルとURLをまとめてSlackとかmarkdownに貼り付けたいんだけど…」

```javascript
javascript:(function(){window.prompt('msg','[' + document.getElementById('docs-title-widget').childNodes[0].childNodes[0].innerText + '](' + location.href + ')')})();
```

なんで `id` 振られてないんだろ。めんどくさいので `childNodes[0]` で取得した。

### Googleドライブ

#### 画像置き場としてリンクを取得したい

```javascript
javascript:(function(){window.prompt('msg','[' + document.getElementById('docs-title-widget').childNodes[0].childNodes[0].innerText + '](' + location.href + ')')})();
```

### G Suiteに限らないやつ

#### GCPのdocumentとかでページ単位scrollすんのに邪魔なheaderを除去する

```javascript
javascript:(function()%7B(function%20()%20%7Bvar%20i%2C%20elements%20%3D%20document.querySelectorAll('body%20*')%3Bfor%20(i%20%3D%200%3B%20i%20%3C%20elements.length%3B%20i%2B%2B)%20%7Bif%20(getComputedStyle(elements%5Bi%5D).position%20%3D%3D%3D%20'fixed')%20%7Belements%5Bi%5D.parentNode.removeChild(elements%5Bi%5D)%3B%7D%7D%7D)()%7D)()
```

## 以下続刊
Vue.jsで処理待機中のクルクルが出るボタンを作った

こんにちは、猫チーズです。
![thumbnail.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268454/8faa6817-314f-b4f1-16e8-a1ae4c6d51f0.gif)
処理を待機している間クルクルが出るボタンを作る機会があったので、作ったものをここに共有します。
実際に書いたものは単一ファイルコンポーネントですが、今回は初心者もコピペで動作確認しやすいように、npm版のVueを使っています。

## 流れ
大まかにこのような実行順序です。

1. ユーザーがボタンを押す
2. クルクルが表示される
3. 非同期処理が始まる
4. 非同期処理が終わる
5. クルクルが消える


## コード
「C」マークのスピナーはCSSのborderなどを駆使して作っています。
スピナー画像を自前で用意したい方は、`span.spinner`の部分をimgタグに置き換えてみてください。

以下がコードです（約130行）
index.htmlなどのファイル名で保存すればそのまま動きます。

```HTML
<!DOCTYPE html>
<html lang="ja">
<head>
	<meta charset="UTF-8">
	<title>クルクル待機ボタン</title>
	<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
	
	<style>
		/* ボタン */
		.async-button {
			
			/* 見た目など */
			padding: 0.4em 0.8em;
			font-size: inherit;
			background: #36b5b0;
			color: white;
			outline: none;
			border-radius: 6px;
			cursor: pointer;
			
			/* 子要素のスピナーをposition:absolute;にするため */
			position: relative;
			
			/* 文字の位置をpaddingで動かすため */
			transition: padding 0.4s ease;
		}
		
		/* ボタンが待機中のとき */
		.async-button.waiting {
			padding-left: 2em;	/* スピナー分のスペースを空ける */
		}
		
		/* ボタンが押せない状態のとき */
		.async-button:disabled {
			background: gray;
			cursor: not-allowed;
		}
		
		/* スピナー（回転するC） */
		.spinner {
			
			/* 位置 */
			position: absolute;
			left: 0.7em;
			top: 0.6em;
			
			/* スピナーの形を作る */
			display: inline-block;
			width: 0.7em;
			height: 0.7em;
			border: 2px solid;
			border-bottom: 2px solid transparent;
			border-radius: 100%;

			/* アニメーションの指定 */
			animation: spin 1s infinite;
		}

		/* 回転アニメーションの中身 */
		@keyframes spin {
			from { transform: rotateZ(0deg); }
			to { transform: rotateZ(360deg); }
		}
		
		/* スピナーが登場&消えるときの動き */
		.fade-enter-active, .fade-leave-active {
			transition: all .4s;
		}
		.fade-enter, .fade-leave-to {
			left: 0;
			opacity: 0;
		}
	</style>
</head>
<body>
	<div id='app'>
		<async-button @click='do_something' :waiting='doing'>なにかのボタン</async-button>
	</div>

	<script>

		new Vue({
			el: '#app',
			
			data: {
				doing: false,	// 処理実行中か否か
			},

			methods: {
				
				// 何かしらの処理を行う
				do_something() {
					this.doing = true

					// 何秒後かに処理が終了する
					setTimeout(() => {
						this.doing = false
					}, 2000 + Math.random() * 3000)
				},
			},
			
			components: {
				
				// ボタンのコンポーネント
				'async-button': {

					template: `
						<button class='async-button' :class='{waiting}' :disabled='waiting' @click="$emit('click')">
							<transition name='fade'>
								<span class='spinner' v-if='waiting'></span>
							</transition>
							<slot></slot>
						</button>
					`,

					props: {
						// 処理の待機中か否か
						waiting: {
							type: Boolean,
							default: false,
						}
					},
				},
			},
		})
	</script>
</body>
</html>
```

## 猫チーズ
高校一年の頃からアプリ作りに没頭していて、今はアプリクリエイターとして生きるために奮闘中です。
今年の4月からサイバーブレイン株式会社でデザイナーを始めました。

**Twitter | 猫チーズ**
https://twitter.com/miyauchoi

**Hello 猫チーズ | 猫チーズと擬似会話ができるブログ**
https://blog.miyauchi-akira.app/post/20190927/

**ポートフォリオ**
https://miyauchi-akira.app
[Blender]選択されているものがメッシュかどうか確認するスクリプト

選択されているものがメッシュなら「this is mesh」とprintされる

```
import bpy
selectList = bpy.context.selected_objects
if selectList[0].type == "MESH":
	print("this is mesh")
else:
    print("this isn't mesh")
```

自分用メモ
GAEのPHP7環境でFireStoreに繋ごうとしたら "PHP Fatal error: ~~ requires the gRPC extension." って怒られた時のTips


## 結論

* GAEのPHP環境でgRPC拡張を利用するには、php.iniにモジュールを有効化する記載が必要
* php.ini に以下を追加し、ディレクトリトップに置いて、デプロイする必要がある

```INI
extension=grpc.so
```


## 解決までの流れ

### 発生
FireStoreにデータ保存するPHPアプリを作成して、ローカルで動作確認後
GAEにデプロイしたら以下のようなエラーが...

```
PHP message: PHP Fatal error: Uncaught Google\Cloud\Core\Exception\GoogleException: The requested client requires the gRPC extension. Please see https://cloud.google.com/php/grpc for installation instructions. in /srv/vendor/google/cloud/Core/src/ClientTrait.php:75 Stack trace: #0 /srv/vendor/google/cloud/Firestore/src/FirestoreClient.php(139): Google\Cloud\Firestore\FirestoreClient->requireGrpc() #1 /srv/libs/Model.php(154): Google\Cloud\Firestore\FirestoreClient->__construct(Array) #2 /srv/index.php(142): Model->__construct('/srv/copycat-ga...') #3 /srv/index.php(19): Moc->{closure}() #4 /srv/index.php(233): Moc->run() #5 {main} thrown in /srv/vendor/google/cloud/Core/src/ClientTrait.php on line 75" while reading response header from upstream, client: 169.254.1.1, server: , request: "POST /api/login HTTP/1.1", upstream: "fastcgi://unix:/tmp/go
```

`gRPC extension が必要だよ` (意訳) 

### 調査
gRPCは公式ドキュメントを見て composer に入れたはず…
https://cloud.google.com/php/grpc
なんでかなと思って詳しく見ていたら、php.ini の書き換えが手順にありました。

開発環境では公式ドキュメントに沿わず、 yum で php-pecl-grpc をインストールしていたので、
php.ini自動で書き換わっていて気づいていませんでした。

### 解決
以下の内容で、php.ini をディレクトリトップに作成し、デプロイしたら無事動きました。

```INI
extension=grpc.so
```


## まとめ

* 公式ドキュメントはちゃんと読もうね
[UE4]簡単にポイントライトを追加する

Lキーを押しっぱなしでViewportにクリックしたら、PointLightを追加することが出来ます。
![2019-11-21_12h31_53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369484/5fb55ffb-2833-5692-5fbc-c22bb31896e4.png)
virtual environment in Python


# Overview
* pyenv (Python version management)
* pipenv (Python libraries' version management)
* virtualenv

`pyenvとpipenvを組み合わせる`のが吉のよう。


# pyenvとpipenvで開発

```
$pyenv versions (python version check)
$pyenv install 3.7.0 (install the version signified in the project)
$pyenv local 3.7.0 (set and fix python version in the project)
$pip install pipenv (if pipenv is not installed yet)
$pipenv --python 3.7.0 (create virtual env with python 3.7.0)
$pipenv shell (go into the virtual env)
$pipenv install some_package (even in the virtual env shell, use pipenv install, not pip install)
# ここで開発
$exit (go out of virtual env)
```

### 注意
After you pip install some packages in the project, notify that to other members who are working on other branches. This avoids the conflict of package versions when these branches are merged.

以下、それぞれを細かく説明。

# Pipenvの詳細

```
# If you are the person who makes Pipfiles,,,  in the project root dir, launch python venv. This creates Pipfile and Pipfile.lock.
$pipenv --python 3.6
# If you would like to set up venv from Pipfiles made by another person, create venv and then install packages wirtten in Pipfiles
$pipenv install --deploy
(NOTE: --deploy causes build-fail when package has not been synced)
# Other commands
$pipenv import pandas==3.5  =  $pipenv run pip install pandas==3.5
# Import python package into venv
$pipenv --python
# Import python package (which is not used in src) into venv
$pipenv install --dev flake8
# terminate venv by deleting ve
pip env --rm 
# Go into the venv
$pipenv shell
# Go out of the venv
$exit
```


# virtualenvの詳細
まずpythonのバージョンをpyenvで指定し、その後virtualenv環境(名前はtest)を構築。
終了後はtestディレクトリを消してやる。

```
$ cd ~/path_to/lambda_data_agg
$ pyenv local 3.6.0
$ virtualenv test
$ source test/bin/activate
$ pip install -r requirements.txt
# 作業
$ deactive
$ rm -rf test
```

# requirements.txtの作り方/使い方

```
# create requirements.txt, at current directory
$ pipreqs .

# install packages listed in requirements.txt
$ pip install -r requirements.txt
```
【クラウド初心者向け】Amazon Connectの電話番号取得

# 概要
- Amazon Connectに接続するための電話番号を取得します。
- お客様はこの電話番号に電話を掛けます。
- 電話番号は以下の中から選択できます。
    - 直通ダイヤル（一般的な電話）
        - 取得可能な市外局番
            - 050
            - 03(申請が必要）
        - 料金
            - 使用料：0.10  USD/日 [^1]
            - 通話料：0.003 USD/分 [^1]
    - フリーダイヤル（発信者無料）
        - 取得可能な市外局番
            - 0800
            - 0120（東京リージョンのみ作成可能）
        - 料金
            - 使用料：0.48  USD/日 [^1]
            - 通話料：0.1482 USD/分 [^1]
- 翌日になったら復活していましたが、0120が枯渇している場合がありました。

## 使用ユーザー
-  IAMユーザー

## 手順
1. AWSにサインインします。
    1. アカウント、ユーザー名、パスワードを入力してサインインします。  
     [アカウント内（IAM）で作成したユーザーを使用してコンソールにサインインする](https://qiita.com/echolimitless/items/129495c920217916a14f#%E3%82%A2%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88%E5%86%85iam%E3%81%A7%E4%BD%9C%E6%88%90%E3%81%97%E3%81%9F%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%A6%E3%82%B3%E3%83%B3%E3%82%BD%E3%83%BC%E3%83%AB%E3%81%AB%E3%82%B5%E3%82%A4%E3%83%B3%E3%82%A4%E3%83%B3%E3%81%99%E3%82%8B)

1. 『AWSマネジメントコンソール』画面の右上にある《リージョン名》をクリックし、ドロップダウンます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520689/02487090-54eb-e851-6d7a-674e88da61c9.png)

1. 『AWSマネジメントコンソール』画面にある「サービスを検索」にConnectと入力し、検索結果から《Amazon Connect》をクリックし、Amazon Connect コンソール[（https://console.aws.amazon.com/connect/）](https://console.aws.amazon.com/connect/)を開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520689/28aff404-d3ae-b201-9ebb-b9839bde6ebf.png)

1. Amazon Connectのインスタンス一覧が表示されるので、該当のインスタンスをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520689/5846170a-bf01-6560-6687-9f970722c1bb.png)

1. インスタンスの概要が表示されるので《管理者としてログイン》をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520689/46c1f25e-b2e2-65ce-7972-1aa73f8441cb.png)

1. ダッシュボードが表示されるので右上の《English》をクリックし、「日本語」を選択して日本語に変えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520689/975591bd-24e9-c4d7-1ca4-8ea89661adf0.png)

1. 「コミュニケーションのチャネルの調査」の《開始》をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520689/7a271cce-48f4-8720-8d01-1151bd235c6a.png)

1. 電話番号を取得するため「国/地域」、「タイプ」、「電話番号」を選択し、《次へ》をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520689/ffd1853e-ee42-2a55-6be4-84465c8460d3.png)
この画面では、電話番号は選択肢の中からしか選択できませんが、後で選びなおすことは可能です。

1. 電話番号の取得が完了しました。《Continue》をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520689/4dc6ce7f-1024-18c7-308f-899d2a5d799a.png)

# 参考サイト

- [コンタクトセンターの電話番号](https://docs.aws.amazon.com/ja_jp/connect/latest/adminguide/contact-center-phone-number.html)


# 目次に戻る
- [【クラウド初心者向け】Amazon Connectでコールセンターを作る](https://qiita.com/echolimitless/items/e5044c73656f8ae29f93#%E7%9B%AE%E6%AC%A1)

[^1]: 2019/11/1現在
[UE4]マテリアルでワイヤーフレームを作る

マテリアルグラフのDetails > Material(プルダウン) > Wireframeにチェック
![2019-11-21_12h21_40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369485/bec19ee6-d8fc-43ca-2c86-142ced8cca7b.png)
![2019-11-26_11h28_35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369485/b78b6269-466b-294b-2829-8daf535e638b.png)
【クラウド初心者向け】Amazon Connectのインスタンス作成

# 概要
- Amazon Connectのインスタンスを作成します。
- インスタンスには、電話番号や処理のフローなどが含まれます。

## 使用ユーザー
-  IAMユーザー

## 手順
1. AWSにサインインします。
    1. アカウント、ユーザー名、パスワードを入力してサインインします。  
     [アカウント内（IAM）で作成したユーザーを使用してコンソールにサインインする](https://qiita.com/echolimitless/items/129495c920217916a14f#%E3%82%A2%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88%E5%86%85iam%E3%81%A7%E4%BD%9C%E6%88%90%E3%81%97%E3%81%9F%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%A6%E3%82%B3%E3%83%B3%E3%82%BD%E3%83%BC%E3%83%AB%E3%81%AB%E3%82%B5%E3%82%A4%E3%83%B3%E3%82%A4%E3%83%B3%E3%81%99%E3%82%8B)

1. 『AWSマネジメントコンソール』画面の右上にある《リージョン名》をクリックし、ドロップダウンます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520689/02487090-54eb-e851-6d7a-674e88da61c9.png)

1. 『AWSマネジメントコンソール』画面にある「サービスを検索」にConnectと入力し、検索結果から《Amazon Connect》をクリックし、Amazon Connect コンソール[（https://console.aws.amazon.com/connect/）](https://console.aws.amazon.com/connect/)を開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520689/28aff404-d3ae-b201-9ebb-b9839bde6ebf.png)

1. Amazon Connect コンソールを初めて開く場合や新しいリージョンで開く場合に、次のページが表示されるので《今すぐ始める》をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520689/d2fb1c60-4fc5-a98e-787b-7aa23caf6858.png)

1. 赤枠の部分を入力し、《次のステップ》をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520689/c4e29476-b8dc-ee9c-c43b-a4b30882f380.png)
注：存在するアクセスURLは利用できません。

1. 管理者は後で設定できるので「これをスキップ」を選択し、《次のステップ》をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520689/be9c1ba0-5c53-eebc-33ce-0a88bc859300.png)

1. テレフォニーオプションはデフォルトのまま《次のステップ》をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520689/439ed1b2-9122-1314-8228-3012c8265aaa.png)

1. データストレージはデフォルトのまま《次のステップ》をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520689/d261897a-a657-52f9-b18e-f76d221341aa.png)

1. 内容を確認し、《インスタンスの作成》をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520689/c6bb4c39-0140-cd5a-5e09-b30ddb115551.png)

1. インスタンスをセットアップできるまで1~2分待機します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520689/527d4b7a-2931-3edc-4790-8573b2d499d9.png)

1. インスタンスの作成が完了しましたので、電話番号の取得をするため《今すぐ始める》をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520689/d2b8ebd4-2446-7f41-9aac-c5707ea700ee.png)
この画面に遷移しない場合は次の電話番号の取得を参照してください。

1. Amazon Connectが開きました。右上の《English》をクリックし、「日本語」を選択して日本語に変えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520689/74be473b-c5fa-71de-fa8c-d4f98ab179cd.png)

1. 電話番号を取得するため《今すぐ始める》をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520689/1ba2cbfe-e1cf-8cb1-7dc7-ef97f5d0ccc4.png)

以降の説明は[Amazon Connectの電話番号取得](https://qiita.com/echolimitless/items/)の8番からになります。

# 参考サイト

- [仮想問い合わせセンターのインスタンスを作成する](https://docs.aws.amazon.com/ja_jp/connect/latest/adminguide/amazon-connect-instances.html)

# 目次に戻る
- [【クラウド初心者向け】Amazon Connectでコールセンターを作る](https://qiita.com/echolimitless/items/e5044c73656f8ae29f93#%E7%9B%AE%E6%AC%A1)
[UE4] Viewportで指定したActorのコンテンツブラウザのロケーションをわかる

Viewportで指定したActorのロケーションを知りたかったら、
指定したままでCTRL+Bを押したら、コンテンツブラウザでそのアクターのロケーションをわかるようになります。

動画を見るためクリックして下さい。
[![IMAGE ALT TEXT HERE](http://img.youtube.com/vi/ORaak8ZD7gQ/0.jpg)](http://www.youtube.com/watch?v=ORaak8ZD7gQ)
ラズパイで拠点間のWiFiを張ってみた

#はじめに
会社の契約しているネットが契約の関係でぶっちんするという恐ろしい事態が起きてしまったので（笑）
しかも、ラズパイとUSBWiFiアンテナが売るほどたくさんあって、肝心なWiFiルータが無いということで、昔やったAPを作って一時しのごうと思う。
（こんなSE居て良いんかね。。。

## 　機材
本体：Raspberry pi3
アンテナ　IOdataのなにか（転がってたもの）　RTL8192CUのチップを積んでる

## 　構造
A棟　インターネット <-光-> ONU/ルータ　<-LAN-> WiFiアクセスポイント
間　WiFiアクセスポイント（A棟） <-WiFi(2.4Ghz)-> ラズパイ（B棟）
B棟　ラズパイWiFi-ラズパイ固定LAN　<-LAN-> WiFiアクセスポイント <-WiFi->　ユーザの端末

#設定
## 　raspberry pi 準備編
1.[raspbien](https://www.raspberrypi.org/downloads/raspbian/)を落とします。
　　ちなみにこちらは面倒なので、Raspbian Buster Liteで落としてます
2.[SDcardFormatter](https://www.sdcard.org/jp/downloads/formatter/)でフォーマットします。
3.[etcher](https://www.balena.io/etcher/)で１で落としたファイル.imgを書き込みます
4. 電源ケーブル以外をラズパイに接続します
5. 電源ケーブルを接続して、設定開始！

## 　raspberry pi 設定編
注意：普通のdesktop版を入れるとGUIがくっついてきてきれいですが、CUI一本で乗り切ろうとしている人なので、いろいろ読み替えてあげてください。。。
### 　キーボードの初期化
日本語キーボードを追加する。
1. `pi@raspberrypi:~ $ raspi-config`を叩く
2. `4 Location Options`を開いて`I3 Change Keyboard Layout`を更に開く
3. `Generic 105-key PC(Intl.)`を選択し、その後`Other`を選択。
4. `Japanese` を選択し、再度出てきたものでも`Japanese`を選択。
5. 出てきたものにdefaultで赤になってるのを選択しまくって最初の画面に戻るまで待つ

### 　内蔵WiFi Bluetooth 無効化
1. `pi@raspberrypi:~ $ vi /boot/config.txt` を開く
2. 次のものを書き込む

```bash:config.txt
# Additional overlays and parameters are documented /boot/overlays/README
#turn wifi and bluetooth off
dtoverlay=pi3-disable-wifi
dtoverlay=pi3-disable-bt
```

### 　固定IPをLAN側に振る
1. `pi@raspberrypi:~ $ vi /etc/dhcpcd.conf` を開く
2. 次のものを一番うしろとかに書き込む
3. `pi@raspberrypi:~ $ sudo reboot` で一旦再起動 
4. `pi@raspberrypi:~ $ ifconfig` で確認する

```bash:config.txtの記入例
interface eth0
static ip_address=192.168.0.1/24
static routers=192.168.0.1
static domain_name_servers=192.168.0.1
```

## 　hostapdを入れる
通常だとhostapdは`apt-get install hostapd`でよいのだが、rtx819x系なので、ドライバが別途必要。
調べてみると[こちらのサイト](https://penkoba.hatenadiary.org/entry/20130806/1375742819)で紹介されている方法を使うことにする。

1. まずはデスクトップディレクトリまでいく
2. `pi@raspberrypi:~ $ wget http://www.adafruit.com/downloads/adafruit_hostapd.zip `　して落とす
3. `pi@raspberrypi:~ $ unzip adafruit_hostapd.zip` して解凍

4. `pi@raspberrypi:~ $ sudo mv /usr/sbin/hostapd{,.orig}`
5. `pi@raspberrypi:~ $ sudo mv hostapd /usr/sbin/`
6. `/etc/hostapd/hostapd.conf`を開いて、`driver=rtl871xdrv`にする。なお、ssid, channel, wpa_passphraseは、

## 　WiFiのアクセスポイントと有線LANポートを繋げる
今回は、固定LAN側でDHCPをつけて捌く必要も無いので単にFirewallの設定をするだけ
1. `pi@raspberrypi:~ $ sudo vi /etc/sysctl.conf`で開く
2. `net.ipv4.ip_forward=1`　でforward機能を有効について繋がるようにする
3. 再起動
4. 次を入力　`sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE`
5. 次を入力`sudo iptables -A FORWARD -i eth0 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT`
6. 次を入力`sudo iptables -A FORWARD -i wlan0 -o eth0 -j ACCEPT`
7. 次を入力`sudo sh -c "iptables-save > /etc/iptables.ipv4.nat"`
8. `pi@raspberrypi:~ $ sudo vi　/etc/network/interface`　で開く
9. 最後に次を追加　`up iptables-restore < /etc/iptables.ipv4.nat`

# あとがき
トラフィックが多いと熱暴走は結構起こります。CPUのヒートシンクは必須です。
→結構落ちました
またできればケースはアルミとか金属で、ファン付きをお勧めします。

あと、場所的な問題もありますが、速度が頑張っても100Mbpsぐらいが限界でした。
なので、あまり期待はしないほうがいいなぁーってのが感想です。
とりあえず、繋がるぜ！っていうレベルならこれで十分かなぁとか思ってます。
Pythonの隔離環境（venv環境）を作成する手順

# Pythonの隔離環境を作成する手順

とりあえずpyenvインストール

```bash
$ git clone https://github.com/yyuu/pyenv.git ~/.pyenv
```

特定のバージョンをインストール

```bash
$ pyenv install 3.7.3
```

隔離環境のベースになるディレクトリを作成して移動

```bash
$ mkdir sandbox
$ cd sandbox
```

ローカルバージョンを指定

```bash
$ pyenv local 3.7.3
```

venv環境を作成

```bash
$ python -m venv venv
```

venv環境に切り替え

```bash
$ source venv/bin/activate
```

使用しているpythonの確認

```bash
$ which python
~/sandbox/venv/bin/python
```
Apache で Basic 認証の値が PHP などに渡っていない時の対処法


PHP 側で BASIC 認証を処理する時は、サーバーからPHPに BASIC 認証の値を渡して上げる必要があるけれど、Apache の config で下記を設定しないと引き渡されないというのにハマる。


## 設定方法

以下を httpd.conf に追記。
(許可している場合は) .htaccess にても設定可能。


```
SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1
```


## テスト方法

Basic 認証で入力された ID や PW が表示されます。


```
<dl>
    <dt>PHP_AUTH_USER</dt>
    <dd><?php var_dump($_SERVER['PHP_AUTH_USER']); ?></dd>
    <dt>PHP_AUTH_PW</dt>
    <dd><?php var_dump($_SERVER['PHP_AUTH_PW']); ?></dd>
</dl>
```

うまく渡っていない時は、Null が返されてしまいます。

Apache をしばらく使っていないと、こういうのを忘れてしまいます。
GAEのデプロイ時のトラフィック移行について

# 1. はじめに
現在Associate Cloud Engineer試験の資格取得に向けて勉強をしています。
模擬試験でGAEのデプロイ時のトラフィックについての問題があり、気になったので調査しました。

## 1-1. 気になったこと
GAEでは、以下のコマンドでデプロイした場合、新バージョンへ自動的にトラフィックが移行します。
では、逆に移行させない方法はあるのでしょうか…？

```bash
$ gcloud app deploy
```

## 1-2. 結論
デプロイ時に以下のオプションを指定する事で、トラフィックを移行させない事が可能です。

```bash
$ gcloud app deploy --no-promote
```

`--promote`オプションについては、リファレンスに記載がありました。
https://cloud.google.com/sdk/gcloud/reference/app/deploy
> --promote
  Promote the deployed version to receive all traffic. Overrides the
  default app/promote_by_default property value for this command
  invocation. Use --no-promote to disable.

デフォルトは`--promote`になっており自動で新バージョンにトラフィックが移行します。

トラフィックを移行させたくない場合は、`--no-promote`を指定することで制御可能なようです。
その後、トラフィックを手動で移行させる場合は、以下のコマンドを実行します。

```bash
gcloud app services set-traffic [MY_SERVICE] --splits [MY_VERSION]=1
```
# 2. トラフィックの分割機能を利用している場合はどうなるか？
GAEのコンポーネントは以下のように構成されており、一つのサービスに複数のバージョンを構成できます。

<img src="https://cloud.google.com/appengine/docs/images/modules_hierarchy.svg?hl=ja">

GAEにはトラフィックをバージョン毎に分割する機能がありA/Bテストなどで利用されます。
![Untitled Diagram (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/525869/a969b904-9dda-84c0-271f-fa96e08c3bb9.png)

トラフィックの分割機能が有効な状態で、デプロイした場合はどのようにトラフィックが移行されるのでしょうか？

## 2-1. 結論
こちらも単純に`--no-promote`であれば、既存の分割設定が有効なまま、トラフィックは新バージョンに移行されませんでした。

`--promote`もしくは指定なしの場合は、新バージョンにトラフィックが100%で移行されます。

## 2-2. 確認内容
実際に、アプリデプロイ〜トラフィック分割〜トラフィック移行までを実施してみました。

### アプリのデプロイ（v1,v2)
アプリのバージョン1と2をデプロイします。

```bash
$ gcloud app deploy -v 1
$ gcloud app deploy -v 2
```
### トラフィックの分割設定
トラフィックの分割設定をv1=50%,v2=50%で設定します。

```bash
gcloud app services set-traffic default --splits 1=50,2=50
```
GCP Consoleでは以下のようになります。
<img width="757" alt="スクリーンショット 2019-11-21 11.25.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/525869/ef111331-837a-b9ef-c893-3f7daef1fb7b.png">

### アプリのデプロイ（v3）
アプリのバージョン3をデプロイします。`--no-promote`を指定するのでトラフィックは移行しません。

```bash
$ gcloud app deploy -v 3 --no-promote
```

GCP Consoleでは以下のようになりました。トラフィックはv1=50%,v2=50%のままです。<img width="757" alt="スクリーンショット 2019-11-21 11.35.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/525869/36e76be4-3951-90ab-6423-9d1cce9f8df4.png">

### アプリのデプロイ（v4）
アプリのバージョン4をデプロイします。`--promote`を指定するのでトラフィックが移行します。

```bash
$ gcloud app deploy -v 4 --promote
```

GCP Consoleでは以下のようになりました。トラフィックが新バージョンに移行しました。
<img width="757" alt="スクリーンショット 2019-11-21 11.41.13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/525869/b3f86f80-9d2f-e25d-dce6-4fd27c449008.png">

# 3.おわりに
`--no-promote`を実際に使うケースがあるか分からないですが、オプション一つで制御できるのは便利だと思いました。
また、トラフィックの分割機能もコマンド/GUIで簡単に制御できるのは素敵ですね。
（コマンドベースでトラフィックの分割設定情報を取得する方法はあるのでしょうか…？）
freenomで独自ドメインを取得してEC2で使う

## ドメインを取得
[freenom.com](http://www.freenom.com/)でドメインを取得してください

わからなければこちら
※[「独自ドメイン」を無料で取得する方法について](https://www.japan-secure.com/entry/site_that_you_can_get_a_free_domain.html)

## AWS route53でHostedZoneを設定

create hosted zoneで自分がとったドメインのHostedZoneを作る。

デフォルトの他に以下のrecord setを作る

|設定|値|
|:-------|:----------|
|Name:|自分でとったドメイン|  
|Type:|A - Ipv4Address|
|Alias:|No|
|TTL (Seconds):| 60|
|Value:| 設定したいIPaddress|
|Routing Policy:|simple|

## ネームサーバ設定
[freenom.com](http://www.freenom.com/)のマイページに入り、My Domainsからドメインの設定を開く。
ManegementTools > Nameserversの順に選択肢し、AWSの4つのネームサバーを設定。

AWSのNS
![Route-53-Management-Console2-640x395.png](https://qiita-image-store.s3.amazonaws.com/0/150799/c0013129-4c94-c38a-f663-cb056a09a6c0.png)
（[Elastic IP アドレスの設定とRoute 53から独自ドメインの割当](https://ja.amimoto-ami.com/2013/11/29/elastic-ip-and-route-53/)より）

freenomの入力部
![dottk-route53-18.png](https://qiita-image-store.s3.amazonaws.com/0/150799/107aabb1-6fcf-a470-323c-b63d530badbe.png)
([Dot TK 無料ドメインを Amazon Route53 で管理する](https://blog.apar.jp/web/2142/)より)

freenomの設定は24時間しないと変更されないらしいです。
待てば完成です。
![スクリーンショット 2017-05-11 13.39.04.png](https://qiita-image-store.s3.amazonaws.com/0/150799/29aa4f93-4334-5c42-7ad0-f342f95e6873.png)

追記
※設定の反映は結構すぐという情報も見ました。
Windows PowerShellで変数に値を格納する

# 目的

- PowerShellで変数に何かしらの値を格納して出力する方法を書く。

# 書き方の例

- PowerShellでは変数定義と変数への値格納を一緒に行うことができる。
- 下記に変数に任意の文字列を格納する方法と出力する方法を記載する。
- #の後ろに記載されている文字はコメントである。

```powershell

# 文字列を格納するとき
$変数名 = "格納したい文字列"

# 数値を格納するとき
$変数名 = '格納したい数値'

# 変数に格納された値をターミナル上に出力するとき
Write-Output $変数名
```

# より具体的な例

- 下記の処理をPowerShellのターミナルを開き記載することにより、処理を確認することができる。
- 下記に変数`string`に「おはようございます」を格納し、変数`number`に「123456789」を格納し、両変数を画面に出力する処理を記載する。

```powershell

# 変数stringに文字列を格納
$string = "おはようございます"

# 変数numberに数値を格納
$number = '123456789'

# 変数stringを出力
Write-Output $string
->おはようございます

# 変数numberを出力
Write-Output $number
->123456789

```

# まとめ

- PowerShellで変数に値を格納するときは`$変数名 = 値`
- PowerShellで変数を出力するときは`Write-Output $変数名`
PowerAppsで警告を回避する方法 (How to avoid warning in PowerApps)

![images (3).jfif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244597/fb4eafa7-8b77-efde-79d2-3303a848477d.jpeg)


PowerAppsを使う時に、Warningがあってケースと解決方法をメモいたしますので、このwerAppsを使う時に、Warningがあってケースと解決方法をメモいたしますので、この記事はよくアップデートするかもしれません :relaxed:
###1. Filter機能
Filterで複雑を書かないようにしてください。
例：

```
Warning
Filter('[dbo].[Table]',ProductTypeDataKey=0 && EndDateInt in [0, Value(Text(Today(),"[$-ja]yyyymmdd"))]) => Warning
理由
Warning の理由は　EndDateInt in [0, Value(Text(Today(),"[$-ja]yyyymmdd"))]
解決
Filter('[dbo].[Table]',ProductTypeDataKey=0 && (EndDateInt = 0 || EndDateInt >= Value(Text(Today(),"[$-ja]yyyymmdd"))))
```

### 2.DateTime
PowerAppsから、SQLServerのDateTimeを比較した時、僕が大変困りました。(一日何もできませんでした:frowning2:)
**理由**：SQL Serverのカラムを比較する際に、同じデータ刑にしないといけないので、PowerAppsのFunctionsで変換してみました。

```
方法1: PowerAppsのコンポネントをDateTimeに変換する　=> Error => 失敗

方法2: Integerに変換する　
Filter('[dbo].[Table]',
	Year(StartDate) >= Year(FromDatePk.SelectedDate) && 
        Month(StartDate) >= Month(FromDatePk.SelectedDate) && 
        Day(StartDate) >= Day(FromDatePk.SelectedDate)
); => got warning　=> 失敗　:frowning2:

方法３：DateValue(Text(StartDate)) >= DateValue(Text(FromDateS.SelectedDate))
また失敗した

```
**解決**
仕様がなかったので、もうSQLのTableに１つコラム（StartDateInt(interger)）を作って、「2019/12/01」は「20191201」を保存した。
この仕方で上手く動いた。それから、Datetimeと比較ケースがあると、Int刑にして、比較する。
` => Don't trying to compare datetime of Sql Server`

**アップデート中...**

読んで頂き、有難うございました。