OmniAICreator/Qiita-1.07M huggingface dataset:
EC-CUBE4 自動送信メールが迷惑メールフォルダに入る

#症状
仮会員登録などでEC-CUBEから自動送信されたメールが、Gmailで迷惑メール判定されてしまう。

Gmailさんが迷惑メールと判定した理由はこちら。
【このメールが [迷惑メール] に振り分けられた理由 送信者のメールアドレスが無効です。】
![gmail.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102434/2ac92ab0-9712-eb45-739d-7722e9fab0f5.png)

#解決策
###店名を短くする

内部で[店名+メールアドレス]の文字数制限をかけているようです。
そのため、店名が長いとメールアドレスが途中で途切れてしまい「送信者のメールアドレスが無効」と判定されてしまいます。

.envファイルを何度も編集したりしましたが、思わぬ落とし穴がありました。
Elasticsearch > Elastic Cloud > Kibanaを日本語化する



Elastic Cloudのデプロイ編集画面から、対象のデプロイの編集画面へ行き、

Kibanaの設定エリアの`User setting overrides`を開いて、`i18n.locale`の設定を追加する。


```
i18n.locale: "ja-JP"
```

![スクリーンショット 2020-10-20 16.37.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49910/aedfaedc-6ea9-9c10-9574-b777eded6b35.png "スクリーンショット 2020-10-20 16.37.06.png")


下の方にスクロールして、SAVEボタンをポチッと

![スクリーンショット 2020-10-20 16.39.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49910/05bd8214-fdc3-c887-8942-3954f96fb446.png "スクリーンショット 2020-10-20 16.39.21.png")


処理が完了するとKibanaが日本語化されてます。

![スクリーンショット 2020-10-20 16.35.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49910/138f84d9-ed74-4cda-8c6a-482cefb97699.png "スクリーンショット 2020-10-20 16.35.23.png")
Makefileの変数展開の書き方、${}と、$()の違いはなに？

## 結論

違いは無い。

## なぜ違いは無いのか

マニュアルに記載がある。

> A substitution reference substitutes the value of a variable with alterations that you specify. It has the form `‘$(var:a=b)’ (or ‘${var:a=b}’`) and its meaning is to take the value of the variable var, replace every a at the end of a word with b in that value, and substitute the resulting string. 

置換参照は、変数の値を指定した変更で置換します。これは `'$(var:a=b)' (または '${var:a=b}')` という形式を持ち、その意味は、変数 var の値を取り、その値の中の語尾の a をすべて b に置き換え、その結果の文字列を代入することです。

source: https://www.gnu.org/software/make/manual/html_node/Substitution-Refs.html

## 補足

ShellScriptの`$()`はサブシェルの起動となるが、makeはシェルではないので`$()`の挙動はシェルのそれとは異なり、Makefileの`$()`は、`${}`と同様に変数が展開される。
sourcetreeをプロキシ環境下で実行する方法

## sourcetreeインストールできない
gitサーバーを作成し、sourcetreeでgit管理をしようと思っていて、プロキシ環境下windowsでインストールを試みたところ、インストールすら行えなかった。

そんな場合の対応

## 解消法
・アトラシアンお持ちでない場合は、アカウントを作成。  
・最新のインストーラーをダウンロードします。
・インストーラーを実行します。手順を進めます。
・Atlassianログインポップアップが表示されたら、インストーラーを終了します。
・ディレクトリに移動します 。`%APPDATA%\..\Local\Atlassian\SourceTree` 
・passwd.txtという名前の空のテキストファイルを作成します。
・accounts.jsonというJSONファイルを作成
・以下のテキストを.jsonファイルに貼り付けます。
・「YOUREMAILHERE」という単語を、アトラシアンアカウントに使用したメールに置き換えます。
・更新したjsonファイルを保存します。
・インストーラーを再実行します。
・魔法が起こる！

```accounts.json
[
 {
   "$id": "1",
   "$type": "SourceTree.Api.Host.Identity.Model.IdentityAccount, SourceTree.Api.Host.Identity",

   "Authenticate": true,
   "HostInstance": {
     "$id": "2",
     "$type": "SourceTree.Host.Atlassianaccount.AtlassianAccountInstance, SourceTree.Host.AtlassianAccount",
     "Host": {
       "$id": "3",
       "$type": "SourceTree.Host.Atlassianaccount.AtlassianAccountHost, SourceTree.Host.AtlassianAccount",
       "Id": "atlassian account"
     },
     "BaseUrl": "https://id.atlassian.com/"
   },
   "Credentials": {
     "$id": "4",
     "$type": "SourceTree.Model.BasicAuthCredentials, SourceTree.Api.Account",
     "Username": "YOUR EMAIL HERE"
   },
   "IsDefault": false
 }
]
```

[参考](https://community.atlassian.com/t5/Sourcetree-questions/How-to-install-SourceTree-through-proxy/qaq-p/642198)
OpenWrt の ssh パスワードなし rootログイン 鍵の置き場所






ローカルユーザ直下に ~/.ssh/id_rsa に鍵があり
OpenWrtサーバーにrootパスワードありログインしている環境を例にします。



#ターミナルから ssh-agent を起動

```ruby:
$ ssh-agent $SHELL
```
_$SHELL_ は何者かと・・・　echo $SHELL すれば　/bin/bash であり、シェル指定ですね。


#ssh-copy-id コマンドで鍵をログイン先にコピー

```ruby:
$ ssh-copy-id  -i ~/.ssh/id_rsa.pub root@192.168.0.38
```




### 途中でパスワードを聞かれます
```ruby:
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "~/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys

root@192.168.0.38's password: 　　　　　　＜＝ここでログインパスワードを入力します

Number of key(s) added:        1　　　　　＜＝転送されました

Now try logging into the machine, with:   "ssh 'root@192.168.0.38'"
and check to make sure that only the key(s) you wanted were added.
```

###/root/.ssh/authorized_keys にコピーされました・・・これでもログイン時にパスワードを求められます

```ruby:
root@OpenWrt:~# ls -al /root/.ssh/authorized_keys 
-rw-------    1 root     root          /root/.ssh/authorized_keys
```




# /etc/dropbear 下にコピーするとOK

```ruby:
root@OpenWrt:~# cp /root/.ssh/authorized_keys /etc/dropbear/authorized_keys
```

これでパスワードなしログインできるようになります。



# ssh-agent 参考
https://qiita.com/Yarimizu14/items/6a4bab703d67ea766ddc
Sales研修2-CxOとの会話

最近は、エンジニアなのにSales研修まで受けさせられる。せっかく勉強するのであれば、無駄に時間を過ごしたくない＋聞き流すのはもったいないし、あまりこの手の情報（特に海外の本）なんかは読まないので、メモを取っておく。

#CxOとの会話する際に話すべき内容

- [How to Get Executive Decision Makers to Act Now (Corporate Visions)](https://corporatevisions.com/selling-c-suite/)
    1. Highlight External Factors
    2. Identify Business Initiatives
    3. Introduce Unconsidered Needs
    4. Provide a Solution Story
    5. Quantify the Business Impact
- [Make Executive Sales Conversations More Insightful With This 20-minute Cheat Sheet](https://corporatevisions.com/cheat-sheet-executive-conversations/)
    - 最初の7分半
        - External Factors
        - Business Initiatives
        - Forward-looking Statements
        - Business Metrics
        - Significant Trends
    - 次の15分
        - In the income statement
        - Balance sheet
    - 最後の5分
        - Management discussion & analysis
        - Notes to the financial statements


#CxOとの会話する際に心がけておく内容

- [How to Sell to the C-Suite Like a Pro](https://blog.persistiq.com/how-to-sell-to-the-c-suite-like-a-pro)
    1. Preparing For The Meeting Ahead of Time
        - Research the company’s goals and objectives
        - Deduce the executive’s professional goals and interests
        - Understand the industry’s trends, challenges, and market leaders
        - Plan out the conversation’s major milestones
    2. Managing The Meeting Effectively
        - Remind the executive who you are
        - Start the conversation on a personal note when appropriate
        - Begin the business conversation in a way that establishes your credibility
        - Ask intelligent questions
        - Expect to be tested and critiqued
        - Add value to the conversation
        - Leave the meeting with a clear next step
    3. Following Up Appropriately
        - Quickly deliver on your post-meeting promises
        - Remain the single point of contact during the sales process
        - Adjust to fit their schedule
ファイルのパーミッションの"T"はスティッキービット

Chefでファイル作成した時、modeを`0644`とするところを`644`とタイプミスしってしまったため
ファイルのパーミッションが以下のようになってしまった。

```
--w----r-T   1 root root
```

このTとはなんぞ？　と思ったので、調べてみました。


# スティッキービット

Tは、スティッキービットと呼ばれ、以下のような特徴があるらしいです。

```
スティッキービットの最も一般的な使用法は、ディレクトリに対して使う場合であり、
セットされるとディレクトリ配下のファイルのファイル名変更や削除は
そのファイルの所有者、ディレクトリの所有者、スーパーユーザーのいずれかしかできなくなる。
```

[スティッキービット](https://ja.wikipedia.org/wiki/%E3%82%B9%E3%83%86%E3%82%A3%E3%83%83%E3%82%AD%E3%83%BC%E3%83%93%E3%83%83%E3%83%88)


# スティッキービットの設定方法
じゃあどうやったらスティッキービットを設定するの、という話ですが、以下の方法で設定できるようです。


```
chmod 1777 hoge
```

[UNIXの部屋 コマンド検索:chmod (*BSD/Linux)](http://x68000.q-e-d.net/~68user/unix/pickup?chmod)
laravel８系でVue.jsを連携するまで　備忘録

##前提知識
Laravel6.0以降は自前でVue.jsをインストールし、resources/js/app.jsを編集する必要がある。（前は標準搭載

インストール→コンパイル→VueComponentの作成→app.jsで接続設定→bladeのテコ入れ→連携の確認
##インストール
npm:パッケージマネージャー

package.jsonで使用しているパッケージの名前とバージョンに関する情報が書かれていて、それに基づきパッケージがinstallされる。
あと古いモノをアップデートしてくれるらしい。

ルートディレクトリで

```
npm install
```
以上でインストール完了。
ただし同じ環境を作る際は以下の視点が必要
https://blog.minimalcorp.com/users/jigen/posts/6f325dc9b8a00370b6aedf47a34cb3ce

###vuejsは別にコンポーネントのコンパイルが必要
```
npm run dev
```
```
npm run hot
```
hotの場合、Hot Module Replacement(HMR)有効な状態でビルドされ、リアルタイムで編集が反映される


##Vueコンポーネントを作成
resources/jsディレクトリ配下にcomponentsフォルダ作成しそこにVueコンポーネントを作成
以下例

```vue:resources/js/components/Sample.vue
<template>
    <div>
        <h1>Sample Component</h1>
    </div>
</template>

<script>
    export default {
        mounted() {
            console.log('Component mounted.')
        }
    }
</script>
```
##app.jsの編集
これまで　参考：https://www.larajapan.com/2019/10/14/app-jsとbootstrap-js/
https://qiita.com/shonansurvivors/items/1715a483ac4298162ccd

Vue.jsとVueコンポーネント(Sample.vue)を使用するよう定義。

```js:resources/js/app.js
import './bootstrap'
import Vue from 'vue'
import Sample from './components/Sample'

Vue.component('sample-component',require('./components/Sample.vue').default);

const app = new Vue({
    el: '#app',
    components: {
        Sample
    }
});

```

memo:ネットで参考にしたrequireとwindowの方法では繋がらなかった

##blade
例を見た方が早いのでwelcome.blade.phpを編集

```html:welcome.blade.php

<!DOCTYPE html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <meta name="csrf-token" content="{{ csrf_token() }}">

        <title>Laravel</title>

    </head>
    <body>
       
        <div id="app">
            <sample-component></sample-component>
        </div>

    <script src="{{ mix('/js/app.js') }}"></script>
    </body>
</html>
```

ポイント


`・<meta name="csrf-token" content="{{ csrf_token() }}">
・<script src="{{ asset('js/app.js')}}">
・<div id="app"><sample-component></example-component></div>
`
それぞれ、
・head内metaタグにcsrf対策のコードの埋め込み
・Vueで描画する領域としてdivタグを設置
・laravel mixがコンパイルする先のファイルの指定を行っている

参考：https://www.ritolab.com/entry/171

## トップページにSample.Vueの内容が表示されているか確認。

http://localhost:8000/

これでLaravelとVueが連携できたことが確認できる
Ubuntu20.04で日本語入力ができなかった状態を改善した

# はじめに

Ubuntu20.04で、
日本語を打ちたくなったときに「半角/全角キー」を押してもアルファベット表記から変わらない！
という問題に遭遇し、それを解決したのでその方法を書き記しておきます。

# 環境
- Virtual Box 6.1
- Ubuntu20.04

注意：Ubuntu20.04のLanguageにはEnglishを指定しています。


# 解決方法（結論）

結論から述べると、
Japanese(Mozc)というものを導入すると、日本語入力が可能になりました。


# 解決方法（解決経路　画像込み）


日本語入力できなかったとき、以下のようにInput sourcesにはJapaneseのみが指定されている状態でした。
**Japanese入ってるのに、どうして日本語入力できないんや！**といった具合でかなり困惑していましたが、
Japanese(Mozc)というものを導入すると解決するようです。


## 導入手順

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549712/515ced1a-e651-1632-31f9-5277633a30a1.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549712/a0e2036f-dfa1-012a-a042-91d62f5b6224.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549712/5079952c-3ce8-950e-0538-492019b50793.png)

以上の手順により、Input SourcesにJapanese(Mozc)が追加されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549712/b7c3d3ec-8233-7061-8504-e46b3af88cfb.png)

補足として、画面右上にこのような記載があり、Japanese(Mozc)となっていることを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549712/55b1df66-82d5-1fbf-d716-801736d3c617.png)

以上の手順で「半角/全角キー」を使ってアルファベット/ひらがな表記の切り替えが可能になりました。

## そもそもMozcって何だったの

> Google 日本語入力は、Android、Chrome OS、Windows でご利用いただけます。Linux ではオープンソース版の Mozc をご利用ください。
 [Google 日本語入力](https://www.google.co.jp/ime/)


# おわりに

Japanese(Mozc)ではないPureなJapaneseは、「キーボードをUSではなく日本語キーボード(JISキーボード)として認識する」機能だけを持つようです。
そしてJapanese(Mozc)では、これに加えて「ひらがななどの日本語を入力をする機能」がされるのかな、と解釈しています。


# 参考
-  [Google 日本語入力](https://www.google.co.jp/ime/)
-  [Ubuntu 18.04: iBus + Mozcで日本語入力する](https://www.hiroom2.com/2018/04/29/ubuntu-1804-ibus-mozc-ja/)
EC2で画像アップロードができなくなったがImageMagickをインストールすると改善された話

EC2上のrailsのアプリで、前回まで動いていた画像アップロードができなくなりました。

２種類（carrierwave, ActoveStrage）使ってるのですが、両方動かなくなりました。

色々と調べているとcarrierwaveの画像アップロードでImageMagickのエラーが出ていることに気付きました。

以下のインストールコマンドを実施するとcarrierwave, ActoveStrageの両方の画像アップロードが正常に動くようになりました。

```
sudo yum install ImageMagick
```
 
細かい事情はちょっと理解していないですが、ローカルでは動いていますし、EC2でも元々動いていたので、
何かのタイミングで削除されてしまったのでしょうか。
もしわかる方がいたらご教示いただきたいと思いです。
Docker - OCI runtime create failed エラー ("process_linux.go:449: container init caused \")

# エラー内容

```sh
$ sudo docker run --rm --gpus all nvidia/cuda:11.0-base nvidia-smi

~　省略　~

docker: Error response from daemon: OCI runtime create failed: container_linux.go:349: starting container process caused "process_linux.go:449: container init caused \"process_linux.go:432: running prestart hook 0 caused \\\"error running hook: exit status 1, stdout: , stderr: nvidia-container-cli: requirement error: unsatisfied condition: cuda>=11.0, please update your driver to a newer version, or use an earlier cuda container\\\\n\\\"\"": unknown.
```



# はじめに

エラー文を全部読まず脳死でコピペしてしまった自分に対する戒めです．
こんな簡単なエラーを脳死でググっているようでは一行に成長しませんね．反省しかありません．
（ご丁寧にどうすればいいのかすら書いてくれているので優しいエラー文．．．）

## ホスト環境
- Ubuntu18.04
- Docker 19.03


# 結論
現在インストールされているNVIDIAドライバーのバージョンが低いためCUDA11.0以上に対応していないことが原因です．
``nvidia-smi``を叩いてCUDA Versionの欄が11.0以上でないといけません．

また，
> vidia-container-cli: requirement error: unsatisfied condition: cuda>=11.0, please update your driver to a newer version, or use an earlier cuda container

と出力してくれていて，エラー文を全部読まずにGoogleに投げてしまう癖を直さないといけないなと再確認しました．

上記から，NVIDIAのドライバーを最新にしましょう．

普段，ホストマシーンはCUDAのバージョンが10.0だったためこのようなドライバーとCUDAの整合性でエラーがでることがなかったので，良い機会ですのでドライバーの再インストールの手順も一応残しておきます．
また，私は直接runファイルを手動で実行してインストールしているため，aptを使って入れている方はaptの手順に従ってアップグレードしたら大丈夫だと思います．

# 再インストール手順
今回は，最新のドライバーがCUDA 11.0以下に対応しているため``nvidia-smi``を叩いてCUDA Versionが11.0にすることを目指します．

1. ``sudo nvidia-uninstall``でドライバーのアンインストールをする．
1. 再起動する
1. 最新のドライバーを[公式サイト](https://www.nvidia.co.jp/Download/index.aspx?lang=jp)から取得する．（ここではNVIDIA-Linux-x86_64-450.80.02.runがダウンロードされたとします．）
1. ``sudo bash NVIDIA-Linux-x86_64-450.80.02.run``でドライバーをインストールする．
1. 再起動する

# まとめ
プログラムを書いているときも，初めて見るエラー文は少し読んでとりあえず先人の知恵を使おう精神ですぐ検索してしまうことが多いので，これからはしっかりエラー文を読むように心がけたいと思います．
また，最近になって，遅ればせながらDockerを使ってコンテナ上でGPUを使えるようにしたんですが，もっと早くしておけばよかったです．
【Unity】FungusのLuaで非同期処理を待機する方法

# 結論

Fungusが提供しているLua関数群の「runwait」を用います。

# 前提
C#側の関数は「IEnumerator」を戻り値にする必要があります。

# 応用方法

[前回の記事](https://qiita.com/Humimaro/items/1214733563e60daf550a)のLuaが終了するまで待機する方法とあわせると、

+ Fungus側で会話１
+ Unity側でイベント
+ Fungus側で会話２
+ Unity側で終了を検知

することができるので、チュートリアルやRPGのイベントなどの表現の幅がぐっと広がります。

# 例

例）番号順に処理されます

C#側

```c#
// UnityのButtonで呼び出す関数
public async void OnFungusAsync()
{
    Debug.Log($"1 Luaの呼び出し開始");

    await _luaScript.OnExecuteAsync();

    Debug.Log($"6 Luaの呼び出し終了");
}

// Luaで呼び出している関数
public IEnumerator OnMoveCoroutine()
{
    Debug.Log("3 C#側で開始");

    // DoTweenを使い移動処理を行う
    transform.DOMove(new Vector3(1f, 1f, 0f), 5f);

    // 移動が終わるまで待機する
    yield return new WaitForSeconds(5f);

    Debug.Log("4 C#側で終了");
}
```

Lua側

```lua
say("2 Lua開始")

-- C#側の非同期関数を呼び出す
runwait(mainmanager.OnMoveCoroutine())

say("5 Lua終了")
```

# その他

非同期を投げっぱなしにする関数「run」も用意されています。

Fungasが提供している関数は

\Assets\Fungus\Thirdparty\FungusLua\Resources\Lua\fungus.txt

を参照するとわかると思います。
SELECT文について

SQLのSELECT文について学習をしたので、記録として残しておきます。
## SQLとは

- SQLとはデータベースを操作するための言語。Structured Query Languageの略。
- データを定義するDDL,データを操作するDML,データを制御するDCLの３つに分類される。

## SELECT文基本構文
- SELECT文はDMLのうちの１つ。基本構文は以下のとおり。

```sql

SELECT <カラム名> FROM <テーブル名>;
``` 

<カラム名>に複数の項目を指定することも可能。

```sql

SELECT カラム名１,カラム名2・・・ FROM <テーブル名>;
``` 
<カラム名>に```*```を指定することで全てのカラムのデータを取得できる。

```sql

SELECT * FROM <テーブル名>;
``` 

### order by 句
並び変えを行うことができる
``order by カラム名 DESC or ASC``で降順or昇順に並び替え可能。（ASCは省略可能、DESCの場合は必要）

```sql:ORDERBY
SELECT * 
From users 
ORDER BY age ASC;
```
この場合、usersテーブルの全ての値を年齢順(昇順)で並び替えて取得できる。

### where 句
条件を指定してデータを取得できる
``SELECT <カラム名> FROM <テーブル名> WHERE 条件``で使用する。

```sql:WHERE
SELECT * 
From users 
WHERE id = 1;
```
条件以外のデータを取得したい場合は``!=``または``<>``を使用する。 

### and、or
``WHERE``句に続けてANDやOR使うと条件を並べて指定することができる。

```sql:AND
SELECT  カラム名１,カラム名2・・・ 
FROM 　 users
WHERE   first_name = "鈴木"
AND     age > 20
```

andの場合はAかつB、orの場合はAまたはBという意味になる。

### GROUP BY
指定のデータをグループ化するときに用いる。

```sql:GROUPBY
select <カラム名> from <テーブル名> GROUP BY <グループ化する要素名>;
```
### count句
```GROUP BY```によってグループ化されたデータの件数をカウントする。

```sql:COUNT
SELECT open_time,
COUNT('open_time')
FROM shops
GROUP BY open_time;
```

実行結果↓

|open_time |COUNT('open_time')  |
|---|---|
|5:00:00  |7  |
|6:00:00  |2  |
|7:00:00  |6  |


とりあえずここまで。
グループ化に関しては、集計関数も大きく関係しているみたいなので学習を進めつつアウトプットしていきます！
Sales研修1-信頼を得ることの重要さ

最近は、エンジニアなのにSales研修まで受けさせられる。せっかく勉強するのであれば、無駄に時間を過ごしたくない＋聞き流すのはもったいないし、あまりこの手の情報（特に海外の本）なんかは読まないので、メモを取っておく。


#なぜ「信頼」を得ることが重要か？

「信頼(Trust)」を得ることがセールスにとっては一番重要。信頼」を得られることで、お客様と良好な関係を築き、信頼できるアドバイアー(Trusted Advisor)として耳を傾けてくれる。 [Becoming a Trusted Advisor Can Earn You a Seat at the Table](http://blogs.richardson.com/2015/04/15/becoming-a-trusted-advisor-can-earn-you-a-seat-at-the-table/)

#「信頼」の定義
- [The Speed of Trust](http://www.amazon.com/The-SPEED-Trust-Changes-Everything-ebook/dp/B000MGATWG)という本の著者である[Stephen M R CoveyのYoutube動画](https://youtu.be/gHL_HzQFBwU)
    - この著者によると、信頼の定義とは以下である。
    - `Simply put, trust means confidence. The opposite of trust—distrust—is suspicion. When you trust people you have confidence in them—in their integrity and their abilities. When you distrust people, you are suspicious of them—of their integrity, their agenda, their capabilities, or their track record.`
- [Insight Selling](http://www.amazon.com/Insight-Selling-Surprising-Research-Differently-ebook/dp/B00K3KGZTC/)という本の著者のことば。
    - `Trust is critical for sales success. But today's buyers are busier than ever and, at the same time, have access to more information and choices. This makes their time harder to get, and their trust harder to build.`
    - 同著者による[7 Ideas for Building Trust in Sales](https://www.rainsalestraining.com/blog/7-ideas-for-building-trust-in-sales)という記事もある。
- [The Trusted Advisor](https://www.amazon.com/Trusted-Advisor-David-H-Maister/dp/0743212347)
    - 著者らによると、「信頼」は以下の式で書けるらしい。[Understanding The Trust Equation for Business Professionals](https://youtu.be/sZac-L_elpw) <br> $Trust = (Credibility + Reliability + Intimacy) / SelfOrientation $ 

# 信頼を得る方法・損なう方法

- [The Trusted Advisor](https://www.amazon.com/Trusted-Advisor-David-H-Maister/dp/0743212347)
    - 上記著書に記載のある「信頼」を得るための10のTips
    - これが、Credibility + Reliability + Intimacyの要素？
        1. Listen to everything.
        2. Empathize—for real.
        3. Note what they’re feeling.
        4. Build that shared agenda.
        5. Take a point of view, for goodness’ sake!
        6. Take a personal risk.
        7. Ask about a related area.
        8. Ask great questions.
        9. Give away ideas.
        10. Return calls unbelievably fast.
- [The Trusted Leader](http://www.amazon.com/Trusted-Leader-Robert-M-Galford/dp/0743235401/)
    - 上記著書にある「信頼」を損なう12の行為
    - これがSelf-Orientationの要素？
        1. Your need for promotion, power, and recognition
        2. Your personal agenda (unaligned with your client’s strategy)
        3. Your unpredictable personality
        4. Your consistent underperformance
        5. Your renegotiation of agreements
        6. Your inconsistent messages
        7. Your false feedback
        8. Your failure to notice real issues
        9. Your inflexibility
        10. Your unwillingness to accept blame
        11. Your paralysis in the face of difficulty
        12. Your failure to trust others
【Laravel】public/css内のCSSを読み込まないエラー　〜 net::ERR_CONNECTION_CLOSED〜

##【背景】
AWSからVagrantにローカル環境を変えて、開発を行う。
Viewを作成時に、コンパイルしたcssを読み込もうしても、Viewに反映されず行き詰まる。

##【状況の確認】

Bladeファイルのheadタグ内にCSSを読み込む記述がされているか確認。

```
 <link href="{{ secure_asset('css/app.css') }}" rel="stylesheet">
 <link href="{{ secure_asset('css/style.css') }}" rel="stylesheet">
```
次にchromeの検証ツールでエラー内容を確認。エラーは検証ツール画面の右上の設定マークの横にある赤いバツ❌をクリックします。
![スクリーンショット 2020-09-07 17.47.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/671576/c7e4ca9b-cfa6-e9a5-18d1-d0aca0b66a46.png)
 net::ERR_CONNECTION_CLOSED　と表示されています。
 どうやら接続ができない様子。Javascriptの方もできていない。

##【解決法】
Blade内のsecure_の部分を消す。

```
 <link href="{{ asset('css/app.css') }}" rel="stylesheet">
 <link href="{{ asset('css/style.css') }}" rel="stylesheet">
```

同ファイル内のJavascriptの部分も直します。

```
 <script src="{{ asset('js/app.js') }}" defer></script>
```
これでブラウザで確認すればCSSが反映されていると思います。

##【原因】
Web環境のhttpsを使った環境だとsecure_を付ける必要がある。
今回、開発環境をAWSからローカル環境のVagrantに変えたので、記述を変える必要があったようです。
Automation360  - 日付処理用パッケージ

#日付処理用ユーティリティ

先日作っていたサンプルBotで必要な文字列が、月の開始日と終了日。
例えば、2020年2月であれば、「20200201」と「20200230」。
開始日は１日に固定ですので良いですが、終了日は「うるう年」により変わってきてしまうのでどう作ろうかなと。。。

##Automation360 標準パッケージ
まずは、標準パッケージ。
Automation360 の標準でも日付処理用のパッケージは用意されています。
ですが、できる事が結構限られてしまっています。
これだと「うるう年」の判定は出来ません。
いや、単にロジック決まっているので、そういうサブタスク組んでも良いんですけどね、でも、簡単に実装したいじゃないですか。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/615564/a57743c6-bcef-2e8b-b381-31da24e56c76.png)

ということで、他のパッケージも探します・・・

##AA作成のDatetime(Japan)パッケージ
https://botstore.automationanywhere.com/bot/a2019-datetime-japan/
標準パッケージでは出来ない、祝日の判定や「令和」とかにも対応しています。
いいですね。。。でも、「うるう年」の判定は無いと。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/615564/d6e049f6-7bcb-5da2-0c6f-601d32dd3f71.png)



ということで、更にパッケージをチェック。。。

##A2019 - Datetime Utilities

https://botstore.automationanywhere.com/bot/a2019-datetime-utilities/
こちらは、日本のパートナーさんが作ったパッケージのようですね。

ありました！！！
うるう年＝Leap Year。「Is Leap Year」アクション発見です！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/615564/9edb9137-d6e0-40e9-39e7-81e0e1e6f6d9.png)

##早速試してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/615564/6ef44ee1-42f2-091e-8c8a-f50f9c5ddefb.png)

良い感じ♪
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/615564/6066a1da-a8ea-00d8-cae3-9e30e208b6d0.png)

他にも、Get Length of Monthというのがありますので、最終日はこれを使えば更に簡単に作れそうですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/615564/63893c12-3698-17de-5abc-79c879c8a585.png)

###2021/12/23追記
A2019とAutomation360の色々変わってきていますので、そもそもこの投稿の内容が利用可能なのかもわかりませんが、
とりあえず、A2019からAutomation360に変更します。
【Bash】複数行内容の複数ファイルへのリダイレクト

- Bash利用時に、shellscript内で内容が複数行の文字列を、複数ファイルへ書き込みたい場合がある。
- その際に、複数`echo`や複数`>`で、つい逐次書いてしまい、長くなったり重複が目立つことがある。
- そのため今回は、一括で複数行内容を複数ファイルへ書き込む(リダイレクト)方法を記録する。

## 結果
- 以下に結果の内容を示す。
- こちらはBashの**ヒアドキュメント**と**teeコマンド**を利用した方法である。

```bash
function multi(){
	# ヒアドキュメントにて複数行文字列の定義
	cat <<-EOF
		# list data
		aaa bbb ccc
		ddd eee fff
		ggg hhh iii
	EOF
}

# teeコマンドへ渡して、書き込み(リダイレクト)対象ファイルを指定
# 非出力のため、/dev/nullへ捨てる。
multi | tee result.txt result.bak.txt > /dev/null
```

- 任意のshellファイルへ記述後、実行と作成確認が出来たら完了。

## 内容

### ヒアドキュメントの活用
- 複数文字列定義の際に、[ヒアドキュメント](https://linuxize.com/post/bash-heredoc/)を利用する。
- その際に意識した以下の2点。
    - **`<<-`を指定して、インデントを可能にする。**
        - こちらを指定して先頭のタブ文字を削除して、見栄えを整える。
    - **関数の中に入れる。**
        - 書き込み内容は、直指定でも変数だとしても関数の中に入れて定数化しておく。
        - 「書き込み内容の整理・利用の汎用性(パイプ等)」につながる。

### teeコマンドの利用
- **入力から、出力と書き込みを同時に行う**`tee`コマンドを利用する。
- そうすることにより、定義した内容をteeへ渡すことで、出力と指定ファイルへの書き込みを同時に行ってくれる。
    - **※ただし出力は行わないため、`/dev/null`へ内容を渡して非出力**

## 参考
- [tee](https://linuxjm.osdn.jp/html/GNU_coreutils/man1/tee.1.html)
- [ヒアドキュメント](https://linuxize.com/post/bash-heredoc/)
- https://teratail.com/questions/172518
画像の間の隙間

###画像の中に隙間ができてチョベリバ( *｀ω´)


###cssの親子要素に以下を加えいました

.top-logo-class{
  position: fixed;
  text-align:center;//加える
}
.header-image{
  width: 100vw;
  height:20vh;
  vertical-align:top;//加える

##直りましたーー
IPアドレスやEC2のアドレスではサイトに入れるのに、独自ドメインでは「応答時間が長すぎます。」となってしまう現象の解決。

###環境
Mac
EC2
ELB
Route53
ACM(https化)
Amazon Linux2
unicorn
Nginx
Capistrano

# 突然独自ドメインのサイトに入れなくなった！
##発端
今まで普通に表示できていた開発中のhttps://＜独自ドメイン＞のサイトが突然表示されなくなり、<b>応答時間が長すぎます。</b>という画面で止まってしまう。
##確認
まず原因がサーバーなのか、ドメインなのか、ブラウザなのかなど特定する必要があります。

①→サーバー（EC2）が起動しているか確認
AWS　EC2のインスタンスに記載されている<b>パブリック IPv4 アドレス</b>や<b>パブリック IPv4 DNS</b>で表示できるか試したところここでは表示されるので、サーバーやブラウザの問題ではなく、ドメインの通し方だけが問題だとわかる。

②→ターミナルで、<b>% dig ○○.com</b>(←独自ドメイン) あるいは <b>% dig ns ○○.com</b>を入れてANSERが返るか確認すると、ANSERが返ってきているので、ドメイン発行元は問題ない。

③→HTTPSがネットワーク中で何かうまくいっていないところがあるかもしれないので、ACMで証明書を当てている（https通信の発生元）ところはロードバランサー（ELB）になるのでそこを確認、通信を制限するのは<b>セキュリティグループのインバウンドルール</b>→httpsのソースがマイIPになっている※もしくはカスタムでIPアドレス指定になっている
![2ce6c750f6fa48f08ba3cdb75ecc8ca0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/696835/620b34a1-c2b4-9931-d597-ab0bd1b83db3.png)


##解決
ロードバランサーのセキュリティグループが自宅のIPアドレスになっていたため、wifi接続場所を移動するとサイトにはいれなかった。ソースを「任意の場所」と変更すると0.0.0.0/0となるので、これで接続先を制限することなく、サイトの表示が可能になるということでした。

参考
https://teratail.com/questions/220615
mac + vscode + vim でキーボードの連打を有効化したい

## 概要
VSCode に　Vim を入れてjを連打しようとした時にできなかった。


## 解決方法

https://stackoverflow.com/questions/39972335/how-do-i-press-and-hold-a-key-and-have-it-repeat-in-vscode

ここにあるように、
`terminal` を開いて、（iterm じゃダメなので注意）

```
defaults write com.microsoft.VSCode ApplePressAndHoldEnabled -bool false
```

を実行し、VSCodeを立ち上げ直すだけ。
【Rails】 "rails routes"による行き先の決め方


"rails routes"こちらをターミナルに表示させたのはよいがどの様に使うのかイマイチ理解ができなかたった
のでノートに書いていることを纏めました。

#rootメソッド
プログラミングにおいてMVCという概念は必要になります。
その際にクライアントからリクエストがあった際に、リクエストに対応した行き先を定義します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698439/9cf4bea4-6900-bb2c-68d2-c6ce3f6d558b.png)

今回は最初のrootメソッドの設定をしたいと思います。

```sample.rb
Rails.application.routes.draw do
  root to: "posts#index"
end
```
```
ターミナル
rake routes(rails routesでも可)

Prefix Verb   URI Pattern    Controller#Action　   
                   
root   GET    　　　/            posts#index                                                                           
                   
```
#rootの書き方は以下になります

```
root to: 'コントローラー名#アクション名'
``` 
     
#解説
`'コントローラー名#アクション名'`
これはrails routesのController#Actionをそのまま引用。
更に""(ダブルコーテーション)を使って出来上がりです。

`root to: "posts#index"`
これにより、googleとかで検索してHPをクリックしたらトップページが表示される様になります。



#【Rails】link_toメソッドで指定したviewファイルに飛ぶ方法

#書き方
```link_to.rb
= link_to prefix名_path, HTTPメソッド名 クラス名  do
```

```sample.rb
 link_to root_path do
 link_to "Our Blog", root_path, class: "header__title--text" do
 link_to "新規投稿", new_post_path, class: "header__right--btn" do
```

下はrails routesのターミナルによる結果

```
Prefix     Verb      URI Pattern      Controller#Action
  root     GET          /                posts#index
  posts    POST     /posts(.:format)     posts#create
  new_post GET     /posts/new(.:format)   posts#new
```

#HTTPメソッドとは
GETはフォームを表示し,DELETEは削除するという意味がある。以下は参考して下さい。
場所はrails routesでVerbに記述している。
![“スクリーンショット” 2020-10-20 15.55.07.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698439/34e21b5c-e4ff-027c-8fcf-02c644b19b59.jpeg)


但し、Prefixが同じ場合は２行目から省略される
![“スクリーンショット” 2020-10-20 15.02.03.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698439/c461b7c1-3d04-6618-f52d-425a4c3aebd4.jpeg)

この場合は`method: :HTTPメソッド名`を指定しないとエラーが起きるので必ず記述すること。

```sample.rb
<%= link_to '編集', tweet_path(@tweet.id), method: :get %>
<%= link_to '削除', "/tweets/#{@tweet.id}", method: :delete %>
```
CSSを変更しても、サイズが変わらない設定方法


CSSを変更しても、サイズが変わらない設定方法
---

自分への備忘録として、たぶん忘れてしまいそうだから。


.cssのpaddingを変更したことにより、
大きさが変更されてしまった。固定したい場合の記述。

paddingやborderの設定変えても、
要素の大きさはwidthやheightで指定したサイズのまま変更しない設定方法

```app/assets/stylesheets/application.css
* {
  box-sizing: border-box;
}

```

上記を忘れないよにすれば、大丈夫。
【ReactNative】横画面にはuseWindowDimensionsではなくDimensionsを使おう

# はじめに
ReactNative with Expo でアプリを作成しており、横画面の挙動も担保する必要が出てきたのですが、ヘッダーなどが不具合を起こしており、原因調査にかなり時間を使ったので、同じ問題で困っている人の助けになればと思い共有します。

# 問題の原因
`useWindowDimensions` を用いて画面のサイズを取得していたのですが、 `useWindowDimensions` は画面サイズの変化を検知して動的に変更する機能を持っていません。

# 対処法
`useWindowDimensions` の代わりに `Dimensions` を使いましょう。
`Dimensions` はウィンドウのサイズが更新されると更新される特性を持ちます。

```sample.js
// 修正前（画面の向きに応じて動的に変化しない）
const windowWidth = useWindowDimensions().width;
const windowHeight = useWindowDimensions().height;

// 修正後（画面の向きに応じて動的に変化する）
const windowWidth = Dimensions.get('window').width;
const windowHeight = Dimensions.get('window').height;
```

# まとめ
`useWindowDimensions` と `Dimensions` を上手く使いこなしていきたいですね。
Google SpreadSheet: ハイパーリンクを一括抽出する


(2022/11/21) この記事の手法ではうまくいかないケースについても記事にしました [Google SpreadSheet: 複数のリッチテキストからURLを抽出する](https://qiita.com/matsukatsu/items/9a96650194b39795a816)

---

スプレッドシートのセルから、文字ではなくハイパーリンクのURLを取得したい場合があります。
みなさん四苦八苦されているようです。
1. [スプレッドシートでハイパーリンクからURLを抽出する方法は結局これが一番簡単なんじゃないかな？](https://liginc.co.jp/509121)
2. [GASを使って一覧表からハイパーリンクURLを一瞬で抽出する](https://google-apps-script.net/instructions/?p=1544)

2の方に近いやり方なのですが、私のやり方も紹介してみようかと思います。
簡単に実現できて使い回しやすいんじゃないかなと思います。

## step1
この関数をスクリプトエディタで作成します

```GAS
function getLinks(value) {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getActiveSheet();
  var range = sheet.getRange(value);
  var vals = range.getRichTextValues();
  var row = [];

  for( var i=0; i<vals.length; i++ ){
    var col = [];
    for( var j=0; j<vals[i].length; j++ ){
      col.push(vals[i][j].getLinkUrl());
    }
    row.push(col);
  }
  return row;
}
```

## step2
関数をセルに入力して、引数にリンクを取得したい範囲を文字列で与えます
![スクリーンショット 2020-10-20 14.56.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423506/fca1f4c2-f08f-4930-8206-4bcffb7ddc1a.png)
Autohotkey でFキーを拡張してmediaキーを追加した


最近ずーど使っていたBluetoothのキーボードがおかしい挙動を繰り返していたため、安い有線キーボードを買い替えました。こんな感じです（Amazon ロジクール K120 商品ページより）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457921/13b16742-f749-9012-e716-bc9aec2b5863.png)


そこで2つの問題がありました。

- 前のキーボードではFキーに便器な機能（音量調整やPlay&Stopなど）がついていたが、これにはなかった。（安いものだから）
- 英語のOS環境下、JIS配列には使わないキーがいくつあります。
  - 「変換」、「無変換」など

今回はその使わないキーをFnキーをCombiにして、Fキーに機能を拡張してみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457921/a1ce7519-69b3-0c06-4044-acf4b30f1b45.png)


## 環境

- Windows 10 64bit
- Autohotkey v1.1.33.02　（https://www.autohotkey.com/）
    - 基本操作は理解している
        - 公式ドキュメント（https://www.autohotkey.com/docs/Tutorial.htm）
        - 日本語リファレンス（https://sites.google.com/site/autohotkeyjp/）
        



## Solution

今回解決したいことの本質は、「キーマップの変更」です。

しかし、「変換」「無変換」など、Autohotkeyでは既存のリストにはありませんでした。例えば

| Symbol | Description              |
| ------ | ------------------------ |
| #      | `Win` (Windows logo key) |
| !      | `Alt`                    |
| ^      | `Ctrl`                   |
| +      | `Shift`                  |

リストの一覧は[こちら](https://www.autohotkey.com/docs/Hotkeys.htm)で確認できます


### 特殊キー（Special keys）を見つけ出す
ここで一番の問題は、Symbolのないキーをどうやって私のものになるのか。
そして使ったのは、Autohotkeyにある`Key history`という機能です。

まず任意のスクリプトに以下の行を追加して、強制的にkeyboard hookを動かせます。

```
#InstallKeybdHook
```
![Snipaste_2020-10-20_11-44-21.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457921/14ccef57-a6ba-2873-a616-3023fce0022d.jpeg)

一度スクリプトをリロードして、
次に`View=>Key history and script info`をクリックする。

![image-20201020114023856.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457921/9feafd66-c2a3-cddd-ff9c-2d3c7d75328b.png)



中身は大体こんな感じになります。


![Snipaste_2020-10-20_14-59-12.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457921/d15561dd-f6a3-faac-33d5-863ddb720634.jpeg)

ここで注目してほしいのは、`VK(Virtual Key)`&`SC(Scan Code)`です。

この場合、F5キーのVKは74、SCは03Fになります。

次に記録されている`VK:EB, SC:07B`というのは、「無変換」を押した時の記録です。これにより、Autohotkeyのスクリプトで「無変換」を指せます。

`vkEB`か`cs07B`であることを分かりました。（v1.1.27前のバージョンでは、`vkEBsc07B`という表記も可能です。）



※リフレッシュしても反応がない場合、スクリプトの中身を確認したり、リロードしたりして、再度確認してみましょう。


公式サイトにSpecial Keysに関する説明は[こちら](https://www.autohotkey.com/docs/KeyList.htm#SpecialKeys)で確認可能です。



### 拡張していきます

「無変換」+「Fキー」にmediaをコントロール機能（Multimedia keys）を拡張させれば良いのです。最終的に出来上がったスクリプトはこんな感じです。

```
sc07B & F9::Media_Play_Pause
sc07B & F10::Mute the volume
sc07B & F11::Increase the volume
sc07B & F12::Lower the volume
```

## 参考

[Autohotkey公式ドキュメント](https://www.autohotkey.com/docs/AutoHotkey.htm)
[Understanding AutoHotkey Keyboard ScanCodes and Virtual Key Codes](https://jacks-autohotkey-blog.com/2016/04/14/understanding-autohotkey-keyboard-scan-codes-and-virtual-key-codes-beginning-hotkeys-part-12/)

## おわりに

既製の機能をものを慣れていくのではなく、主導的に自分の習慣などを合わせていくのも面白かったです。
皆さんも自分の使わないボタンを活用して、Hotkeyを作ってみませんか。
LeetCode - 1. Two Sum

# Example 1
```
Input: nums = [2,7,11,15], target = 9
Output: [0,1]
Output: Because nums[0] + nums[1] == 9, we return [0, 1].
```

# Example 2
```
Input: nums = [3,2,4], target = 6
Output: [1,2]
```

# Solution
```
func twoSum(nums []int, target int) []int {
    temp := make(map[int]int)
    
    for k, v := range nums {            
        if index, ok := temp[target - v]; ok {
            return []int{index, k}
        } else {
            temp[v] = k
        }
    }
    
    return nil
}
```
【ReactNative】キーボード外をタップした際にキーボードを収納する

# はじめに
ReactNativeでTextInputなどの画面でキーボード外をタップしたときにキーボードを収納するようにしたいと思ったら意外にサクッとできました

# サンプルコード
`ScrollView` で対象の要素を囲むだけです。

```sample.js
<ScrollView
  contentContainerStyle={{flexGrow: 1}}
  keyboardShouldPersistTaps='handled'
  scrollEnabled={false} // スクロールさせたくなければ無効化する
>
  // 対象の要素
</ ScrollView>
```
Windows 用Tomcat8 のサービス名を変更してツールが起動しないときの対処法

#Windows 版 Tomcat8 のサービス名をTomcat8 以外に変更した場合のツールの起動方法
## ことの始まりは、ThingWorx のWindows用インストーラー
PTC 社のIoT プラットフォームThingWorx にはWindows 用のインストーラーが用意されています。JDK とPostgreSQL を予めインストールしておけば、後はインストーラーが必要なものを入れてくれるので便利です。
しかし、良いことばかりではありません。通常ならTomcat8 という名前でサービス登録されるのですが、このインストーラーはThingWorx-Foundation という名前で登録してしまうのです。

※下図の赤い囲み線の中、改変されたサービス名を確認できます。
![InkedTomcatService_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111405/90ce860f-c0a7-aa18-e20a-6124b4d746d0.jpeg)

## 問題はJDK アップデートの時に起こった
JDK はセキュリティなどの向上のためアップデートがしばしば起きます。通常であればJDK をインストールし、環境変数のPATH に新しいJDK のフルパスを登録し、さらにTomcat8w.exe というWindows 用のコンフィグツールを起動してjvmを指定すれば完了なのです。
しかしサービス名をデフォルトのTomcat8から変更してしまうと事態は一変します。Tomcat8w.exe を起動しても「そんなサービスは無いよ」とつれないメッセージを出して終わってしまいます。
![Tomcat8w_error.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111405/fc6fe889-3932-ffcf-eb2d-7ef388c8e0a1.png)

## 解決策は実に簡単だった
あちこち探しまわったのですが、結論は非常に単純でした。
Tomcat8w.exe のファイル名（拡張子は除く）を、Tomcat8を登録したサービス名に変更すれば良かったのです。今回のケースでは、ThingWorx-Foundation というサービス名に合わせて、ThingWorx-Foundation.exe にするだけです。念のため元のファイルを残してexeファイルをコピーして、それを改名したほうが安全です。
![Explorer.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111405/abdc4dab-c859-5624-5da0-6fa05643b163.png)

あとはいつも通り、改名したファイル（今回は、ThingWorx-Foundation.exe）を起動して、Java タブにある Java Virtual Machine の項を新しくインストールしたJDK に変更するだけです。
![InkedConfigTool02_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111405/fdafd9bf-b3e3-1c3e-aed7-04446dbe5ea3.jpeg)

参考ページ
[The specified service does not exist as an installed service](https://stackoverrun.com/ja/q/12065828 "The specified service does not exist as an installed service")

ThingWorx に限らず、同様の事態に陥った方のお役に立てれば幸いです。
[Rust] ReqwestでHTTP Requestのheaderを設定する

ReqwestでHTTP Requestのheaderを設定する方法
===

RequestBuilder（`post()`や`get()`の戻り値）のheaderメソッドに設定すればいいだけなのだけど，
`RequestBuilder::header()` はkeyとvalueを要求する.
https://docs.rs/reqwest/0.10.8/reqwest/struct.RequestBuilder.html#method.header
このkeyになる値は`reqwest::header::*`に定数として定義されてる．
https://docs.rs/reqwest/0.10.8/reqwest/header/index.html#constants

## 例

```rust
use reqwest;

let req_body = format!("{{\"key\": {} }}", value);

let client = reqwest::blocking::Client::new();
let resp = client::post("http://hogehoge.com/")
                   .header(reqwest::header::CONTENT_TYPE, "application_json")
                   .body(req_body)
                   .send()?;
```
UnityでVisual Studioがどうしても開かない場合にVSCodeで代用する方法

# UnityでVisual Studioが開かない

Unityでは，`Edit -> Preferences -> External Tools`から使用するエディタを指定することができます．通常であれば，Visual Studio 2019などがデフォルトのエディタとして設定されていますが，Unity 2020.1.9f1の環境で自動的に開かなくなりました．

Visual Studio Codeは事前にインストールされていると前提で話を進めます．

## パスを指定してVisual Studio 2019で開く方法

Cドライブにインストールされたのであれば，`C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\IDE\devenv.exe`にVisual Studio 2019の実行ファイルが存在します．

External Toolsの`Browse`で直接パスを指定すればVisual Studio 2019を認識します．

ところが，DドライブにVisual Studio 2019をインストールしてしまった場合，UnityはVisual Studioの実行ファイルを見つけることができません．仮にDドライブの`devenv.exe`を指定しても，今度はVisual Studio 2019がUnityを見つけられず，Visual StudioでUnityのプロジェクトを開けなくなります．具体的には，`Assemply-CSharp.csproj`で`このプロジェクトの種類の基になるアプリケーションが見つかりませんでした。`というエラーが表示されます．

### 正しく開けないことによる副作用

この状態だと形式的に開くことはできますが，エディタの補完が効かず，効率がかなり落ちます．メモ帳で作業しているのと同じです．Visual Studioのような専用ツールを使って開発するのは，**開発を効率化するため**なのでこの状態は放置できません．

## VSCodeで開く方法
Visual Studio Code（以下，VSCode）は，Visual Studioとは全く別物の統合開発環境です．ただし，Visual Studio相当のことはプラグインやコマンドの組み合わせで実現できます．

### UnityでVSCodeを登録する方法

VSCode自体は，標準のインストール先だと，`C:\Users\ユーザ名\AppData\Local\Programs\Microsoft VS Code\Code.exe`に格納されています．

Unityの`Edit -> Preferences -> External Tools`で`Browse`を選択すると，外部エディタの実行ファイルの位置を選択できるようになります．上記のパスにVSCode本体があるので，登録してください．

### VSCodeでUnityを使えるようにする方法

この段階の状態で，UnityのC#スクリプトを開くと様々なインストールを促されます．数百MB単位のデータのダウンロードが発生するため，通信環境は注意してください．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32219/de4317a2-1a55-a0f7-e47f-25e23e663a25.png)

図のようにFinish!と表示されたら，Unityに依存するC#関係のパッケージのインストールが完了します．

次に，プラグインのインストールですが，①プラグインボタンを押す，②プラグインを検索する，③選択したプラグインをインストールをする．という順番で操作します．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32219/cde912de-728b-80ee-f524-5fcd85592c70.png)


一応，VSCodeの現行バージョンv1.50.0でおすすめのプラグインは以下の通りです．

* C#
* Debugger for Unity
* Unity Tools
* C# XML Documentation Comments

好みによっておすすめ

* C# FixFormat （コードを自動整形するので見た目が確実にきれいになる）
* eppz! (C# theme for Unity)（色合いがオシャレになる）

基本的に，このあたりまでできると，UnityとVSCodeで開発しやすくなります．Visual Studioも高機能ですが，VSCodeもプラグインを入れればそこそこ高機能にはなります（さすがに，Intel VTuneほど便利にはなりませんが……）．Visual Studio CodeはPython，Ruby，PHP，Javascript等のWeb関係の言語と親和性が高いので，末永くお使いできる統合開発環境です．
【Ruby】素数を判定するプログラム

数字を入力して素数ならtrue、素数じゃなかったらfalseを返す。

```ruby
while str = STDIN.gets
  break if str.chomp == "exit"
n=str.to_i
count=0
for i in 1..n+1 do
    d=n%i
    if d==0 then
        count+=1
    end
end

if count==2 then
    print("true")
else
    print("false")
end
puts "\n"
end

```

## Rubyのお役立ち情報

https://wagtechblog.com/programing/ruby-school

https://wagtechblog.com/programing/ruby-book
Rにcoinをインストールするときにひっかかったこと

# はじめに
実験結果の処理にcoinを使おうとしたのですが,インストールに苦労したのでまとめておきます.
特に似たようなサイトにひっかからなかったので,初歩的なことなのかもしれませんが…

#環境
- Ubuntu16.04
- R version 3.6.3 

#発生したエラー
Rを起動して,以下のコマンドを入力

```
> install.packages("coin")
```
本来だと,この後インストールが終了するはずなのですが,以下のようなエラーが発生しました.

```
/usr/bin/ld: -lgfortran が見つかりません
collect2: error: ld returned 1 exit status
/usr/share/r/share/make/shlib.mk:6: ターゲット 'mvtnorm.so' のレシピで失敗しました

(中略)

install.packages("coin") で: パッケージ ‘coin’ のインストールは、ゼロでない終了値をもちました 

```

gfotranのリンク問題のようです.
いろいろ調べたのですが,Rで同様の問題が発生してる人は少ないようで,なかなか見つけられませんでした.

# 解決策
なんとか見つけたのが,以下のサイトです.

[/usr/bin/ld: -lgcc_s が見つかりません](https://scrapbox.io/kimiyuki/%2Fusr%2Fbin%2Fld:_-lgcc_s_%E3%81%8C%E8%A6%8B%E3%81%A4%E3%81%8B%E3%82%8A%E3%81%BE%E3%81%9B%E3%82%93)

このサイトのgcc_sをgfortranに読み替えて,実行していきます.

Rを終了し,端末に以下のように入力します.

```
$ locate libgfortran.so
```
たくさん出力されると思いますが,私の環境で/usr/lib/x86_64-linux-gnu以下に存在するlibgfortran.soは,このようになっていました.

```
/usr/lib/x86_64-linux-gnu/libgfortran.so.3
```
これを,Rが参照できるようにリンクを作成します.

```
$ sudo ln -s /usr/lib/x86_64-linux-gnu/libgfortran.so.3 /lib/x86_64-linux-gnu/libgfortran.so
$ sudo ldconfig
```
これで,リンクが作成できました.

もう一度,Rを起動して,以下のコマンドを入力すると,installできるはずです.

```
> install.packages("coin")
```
CognitoのAccessTokenを取得

# 背景
Cognitoでは、AccessToken、IDToken、RefreshTokenを取得できる。ここでサーバ側でAccessTokenの中身を使用してセッション管理に利用することができないか?


# 実装

### Cognito User Poolでユーザを作成する。
作成画面については別途サーバで構築した管理画面で実施
(APIGateway+Lambdaと S3に設置したViewでもOK:サーバレスで作成すると恐らく月額数円)

### UserPoolでランクの属性を追加
![スクリーンショット 2020-02-03 17.54.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79473/6cd55f5e-e080-f7c2-76f2-04665747306b.png)

### 認証が行われると3つのトークンが払い出される。今回はIDトークンを使用してセッション管理を行う。

|トークン名  |内容 |
|---|---|
|IDトークン  |name,emailなど認証されたユーザ情報が入る  |
|アクセストークン |認証されたリソースへのアクセスを付与  |
|更新トークン |新しい ID またはアクセストークンの取得に必要な情報が含まれる  |


### IDトークンはJWTなので下記のようなトークンをクライアント側に返すので必要な要素をセッションやCookieに格納するなどの処理を行う。ここでカスタム属性を設定した場合は、下記の情報にカス
タム属性が付与される。
ちなみにJWTはbase64-encodedされたJSONこのあたりは次の「検証方法」に詳細な記載がある。

```json
{
  "sub": "aaaaaaaa-bbbb-cccc-dddd-example",
  "aud": "xxxxxxxxxxxxexample",
  "email_verified": true,
  "token_use": "id",
  "auth_time": 1500009400,
  "iss": "https://cognito-idp.ap-southeast-2.amazonaws.com/ap-southeast-2_example",
  "cognito:username": "anaya",
  "exp": 1500013000,
  "given_name": "Anaya",
  "iat": 1500009400,
  "email": "anaya@example.com"
}
```

### 検証方法
https://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/amazon-cognito-user-pools-using-tokens-verifying-a-jwt.html#amazon-cognito-user-pools-using-tokens-step-1
【Ruby】入力された数字に応じてピラミッド状に文字を返す

イメージはこんなかんじ。

![スクリーンショット 2020-10-20 14.19.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/522445/c059bf7e-2ef7-c020-8905-f9a69dba84db.png)


```ruby
while str = STDIN.gets
  break if str.chomp == "exit"#文字列の末尾から改行コードを取り除いた文字列を返します
  n=str.to_i#文字列を整数に返すメソッド
  puts n
  for x in 0..n-1
    (n-x-1).times{printf(" ")}
    for y in 1..2*x+1
      printf("*")
    end
    puts "\n"
  end
end
```

## Rubyのお役立ち情報

https://wagtechblog.com/programing/ruby-school

https://wagtechblog.com/programing/ruby-book
子コンポーネントのデザインオプションを親コンポーネントから切り替える[Vue.js, Vuetify]

Vuetifyのデザインコンポーネントはとても便利で、オプションをちょっと書くだけでUIのデザインや機能まで簡単にカスタマイズできます。
さらに、少し工夫するだけで**親コンポーネントから**もオプション類を操作できるため、その手順をまとめます。

##やりたいこと

こんな感じで、バレーボールのポジションを選択する`v-select`だけのコンポーネントを作ります。
（なぜバレーボールなのかは無視してください）
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352532/fc2e294b-ea3f-593b-3145-2f12ab95c9e6.png" width=50%>

```vue:子コンポーネント
<template>
  <v-select
    prepend-icon=" mdi-volleyball "
    :items="positionList"
    label="ポジション"
  ></v-select>
</template>

<script>
export default {
  data() {
    return {
      positionList: [
        'ウィングスパイカー',
        'ミドルブロッカー',
        'セッター',
        'リベロ',
      ],
    }
  },
}
</script>
```

※本来は子コンポーネントで選択された値を親に返すために`v-model`でバインドしたり`$emit`を用いた処理を書いたりしないといけないですが、本題から外れるため省略しています。

この入力フォームを開くと以下のように選択リストが展開され、一つのポジションを選択できます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352532/104d53fd-5b2d-a765-5de4-b2a3de7db150.png" width=50%>

ここで、`v-select`は`multiple`というオプションを与えると複数選択できるフォームになります。

```vue:子コンポーネント（抜粋）
<template>
  <v-select
    prepend-icon=" mdi-volleyball "
    :items="positionList"
    label="ポジション"
    multiple
  ></v-select>
</template>

```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352532/98fa9102-cea2-7a42-7df9-66065498e295.png)


「親Aからこのコンポーネントを呼ぶときは単一選択でよいが親Bから呼ぶときは複数選択したい」ということもあるかと思います。例えば、「**私はこのポジションです**」という使い方なら単一でよいですが、「**経験したことがあるポジション**」を選択するときは、複数選択したいでしょう。

この`multiple`を、親コンポーネントから切り替えます。


##propsでBoolean値を渡す
この`multiple`、[Vuetify公式](https://vuetifyjs.com/en/api/v-select/#props)を見るとBoolean型でコントロールされていることがわかります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352532/566a0b71-8e69-80cc-7e8f-22afed45d707.png)

したがって、`multiple`を何らかのBoolean型の変数でバインドし、かつその変数を親から与えることで、マルチとシングルを切り替えることができそうです。

よって、親・子のコードは以下の通りになります。

```vue:親A（single）
<position-selecer> </position-selecer>
```
```vue:親B（multiple）
<position-selecer
 :multiple-flg="true"
>
</position-selecer>
```
```vue:子（position-selecer）
<template>
  <v-select
    prepend-icon=" mdi-volleyball "
    :items="positionList"
    label="ポジション"
    :multiple="multipleFlg"
  ></v-select>
</template>

<script>
export default {
  props: {
    multipleFlg: {
      type: Boolean,
      default: false,
    },
  },
  data() {
    return {
      positionList: [
        'ウィングスパイカー',
        'ミドルブロッカー',
        'セッター',
        'リベロ',
      ],
    }
  },
}
</script>
```

まず、子の`v-select`の`multiple`を任意のBoolean型の変数にバインドします。これを親から受け取りたいのでpropsに指定するのですが、普通に記述するだけだと子はすべてString型として受け取ってしまい、true/falseとして解釈できません。これは、propsをオブジェクト形式で記述し、`type`を`Boolean`と指定することで解決します。

また、今回は明示的な指定があったときだけマルチにしたいので、デフォルト値をfalseにしています。

次に親側の記述についてです。
上述のとおり子のデフォルトは`multiple: false`であるため、何もしなければシングルで表示されます。なので親Aは特に何か指定する必要はありません。

他方、親Bはマルチで呼びたいため`multiple-flg`に`true`を設定しています。このとき、普通は静的な値をpropsで渡す際に`:multiple`のようにバインドする必要はないのですが、今回のように**子がオブジェクト形式で型を指定してpropsを受け取るような場合は、バインドした状態で渡す**必要があります。（特にscript部で何かする必要はなく、template部で形式的にバインドするだけOKです）

以上のようにすることで、親からの呼び出しに応じて子のオプションを切り替えて使うことができました！
細かいデザイン的な要素も親から与えることで決定できるため、子コンポーネントの再利用性が高まると思います。

##参考
[Vueのpropsの書き方・使い方について解説](https://www.e-loop.jp/knowledges/3/)
php slimのRequestオブジェクトからリクエストURLの絶対URLを取得する

# 困ったこと

PHPの[Slim フレームワーク](https://www.slimframework.com/)で開発をしていてリクエストの絶対URLが取得したかった。

# TL;DR

ストリングでキャストするとでてくる。

```php
(string)$this->request->getUri();
```

# 経緯

slimで開発をしていて、ちょっとリクエストされたURIをセッションに保存して、別の処理をした後に、セッションから読み出して、リダイレクトで戻りたかった。

PSR-7のRequestオブジェクトが、こんな感じで、これを自分で結合していくのは面倒。

何かよい方法あるはずって探した。

```php

‌‌> $this->request->getUri()
‌< Slim\Psr7\Uri::__set_state(array(
   'scheme' => 'https',
   'user' => '',
   'password' => '',
   'host' => 'example.com',
   'port' => 443,
   'path' => '/oauth2/authorize',
   'query' => 'state=xxxxxx',
   'fragment' => '',
))
```

キャストするだけだった（笑）

```php
> ‌‌(string)$this->request->getUri()
‌< https://example.com/oauth2/authorize?state=xxxxx
```

# 参考文献

https://discourse.slimframework.com/t/building-the-full-request-url/626
[Swift] DataはSubSequenceもDataなので…

# はじめに

「`Data`の`SubSequence `も`Data`」という事実[^data-subsequence]。知らないとバグを作る。知っていてもついうっかりバグを作る。なるべくそのバグを減らそうというための記事。

[^data-subsequence]: https://developer.apple.com/documentation/foundation/data/subsequence

# 実例から学ぶ

## 最初のバイトをゲットだ

`Data`の最初のバイト(`UInt8`)を表示する関数を考えてみましょう：

```Swift:printFirstByte.swift
import Foundation

func printFirstByte(of data: Data) {
  if data.isEmpty {
    print("からっぽだよ。")
  } else {
    print("最初のバイトは \(data[0]) だよ。")
  }
}

let data = Data([0, 1, 2, 3])
printFirstByte(of: data) // -> "最初のバイトは 0 だよ。"
```

一見すると良さそうですねぇ。
では、次の場合はどうでしょう？

```Swift
printFirstByte(of: data.dropFirst()) // -> "最初のバイトは 1 だよ。"と表示される？？
```

では、実際に実行してみましょう。
どうでしたか？
手元の環境では"🚫illegal hardware instruction"で落ちました。
…何故でしょうか？

理由を知るために、まず

```Swift
// printFirstByte(of: data.dropFirst()) 
print(data.dropFirst().startIndex)
```

としてみてください。
表示された数字はなんでしょう？

**"1"** が表示されたはずです。

つまり、`data.dropFirst()`のインデックスは`1`から始まっているので、`printFirstByte(of:)`内の`data[0]`の行で(インデックス`0`はout of boundsなので)クラッシュしたということになります。

`SubSequence`(別名`Slice`)を返す実装の多くは、まるまる内容をコピーするのではなく、*「元のデータのこの部分」ということを指し示すようなインスタンス*を返します。`Data`も実際にそうなっていて、`dropFirst()`は元のデータの`startIndex`を1増やしただけのインスタンスを返してきます[^data-dropFirst]。
元のデータかスライスデータのどちらかに変更が加えられるときになって初めてコピーが行われます。

[^data-dropFirst]: 参考URL https://github.com/apple/swift/blob/50e6ae08bad884e22df39247c63474cfe54dc8a3/stdlib/public/Darwin/Foundation/Data.swift#L1758-L1806


### 正しい実装例

以上を踏まえ`printFirstByte(of:)`はどう実装すればよいのでしょうか？
一つの例としては、インデックスの値に頼らない方法を用いて実装することでしょう：

```Swift:correct-printFirstByte.swift
import Foundation

func printFirstByte(of data: Data) {
  if let firstByte = data.first {
    print("最初のバイトは \(firstByte) だよ。")
  } else {
    print("からっぽだよ。")
  }
}

let data = Data([0, 1, 2, 3])
printFirstByte(of: data) // -> "最初のバイトは 0 だよ。"
printFirstByte(of: data.dropFirst()) // -> "最初のバイトは 1 だよ。"
```

ね、簡単でしょ？


## バイトを列挙

スライスだろうとなんだろうと最初を0番目として表示したい場合は？
たとえば、`[4, 5, 6, 7]`というバイト列で

```console
#0: 4
#1: 5
#2: 6
#3: 7
```

と表示させたいとき…。
`print("#\(i): \(data[i])")`みたいな実装ではダメというのは上で見た通りです。渡される`data`の`startIndex`が`0`とは限らないからです。

正しい方法としてはいくつかの実装例が思いつきます。

```Swift:enumeration-解1.swift
import Foundation

func printAllBytes(in data: Data) {
  for ii in 0..<data.count {
    print("#\(ii): \(data[data.startIndex + ii])") // startIndexを足さないとダメ
  }
}

let sourceData = Data([0,1,2,3,4,5,6,7,8,9])
printAllBytes(in: sourceData[4...7]) // 期待通り
```

```Swift:enumeration-解2.swift
import Foundation

func printAllBytes(in data: Data) {
  for (ii, byte) in data.enumerated() {
    print("#\(ii): \(byte)")
  }
}

let sourceData = Data([0,1,2,3,4,5,6,7,8,9])
printAllBytes(in: sourceData[4...7]) // 期待通り
```

ね、簡単でしょ？(2回目)


# まとめ

大切なのは「`startIndex`は`0`とは限らない！」ということです。


# おまけ

こういった仕様は`Data`に限ったことではないので、汎用的に使えるよう`RandomAccessCollection`を拡張するのも手です。

https://github.com/YOCKOW/ySwiftExtensions/blob/master/Sources/yExtensions/RandomAccessCollection%2BRelativeIndex.swift

に実装例があるので参考までに…。