OmniAICreator/Qiita-1.07M huggingface dataset:
ブラウザでnfcpyを使ってNFCタグのIDmを表示してみる

##はじめに
PaSoRiでNFCタグを読み取ってブラウザに表示するというのは他の方もやっていらっしゃるのですが([WebUSBでFeliCaの一意なIDであるIDmを読む](https://qiita.com/saturday06/items/333fcdf5b3b8030c9b05))、ただ自分の環境ではエラーが起きて使えなかったので、勉強も兼ねて別の方法で試してみることにしました。
※今回のこのNFCタグの読み取りはUbuntu環境で行いました。


##準備
nfcpyまでの準備はこちらの記事を参考にしました([Python で PaSoRiのセットアップ と FeliCaの読み取り](https://qiita.com/75u2u/items/010b602605d087edd1ee))
pythonのNFCタグ読み取り用の簡潔なコードも準備します
ファイル名は適当です。

```python:nf.py
import nfc
import binascii
from nfc.clf import RemoteTarget
 
try: 
    clf = nfc.ContactlessFrontend('usb')
    tag = clf.connect(rdwr={
        'on-connect': lambda tag: False
    })
    idm = binascii.hexlify(tag.idm)                                                                        
    print(idm)   
    
except AttributeError:
    print("error")
    exit()
```
実行すると

```
$python nf.py
>>010104124a1a4f0f
```
こんな感じでIDmのみ返してくれる。

##コード
メインのページはjQueryを使いました。jQueryからPHPを呼び出して、さらにPHPから上で書いたpythonのコードを呼び出します。

jQueryは初めて使うので、ほとんどの部分はこちらの方の記事を参考にさせていただきました。([【PHP】Ajaxで非同期通信を行う方法。](https://qiita.com/art_porokyu/items/ffb08251a83e4fe46d57))

```html:main.html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>カード読み取り</title>
</head>
<body> 
  <button id="button">読み取り</button>
  <div><br></div>
  <div id="result">IDmをここに表示します</div>
  <script src="https://code.jquery.com/jquery-3.2.1.min.js"></script>
  <script>

$(function(){
      
    $("#button").click(function(event){
      $.ajax({
        url: " main.php",
        dataType : "text",
        async: true,

      }).done(function(data){
        $("#result").text("カードのIDmは"+data+"です");

      })
    });
  });

  </script>
</body>
</html>
```
次は呼び出した先のPHP文

```php:main.php
<?php
$command="sudo -S  python nfc.py";
exec($command,$output);
$idm=$output[0];            
print $idm;        
exit();
?>
```
ここで注意なのがsudo権限が必要なことです。(本当はあまりよろしくないみたいですが…)
sudo権限なしではpythonの`clf = nfc.ContactlessFrontend('usb')`の部分でエラーが起きてしまい、値を取得することが出来ません。

apacheユーザー(www-data)に権限を付与するため`sudo visudo`で設定ファイルを開き、

```
www-data ALL=(root) NOPASSWD:ALL
```
を書き加えます。

#####追記
さすがにapacheユーザーにパスワード認証なしの権限を付与するのはまずいと思ったので修正します。
`sudo visudo`でsudo権限の設定ファイルを開き、上記の内容を下記に修正します。

```
www-data ALL=(root) ALL
```
で、Pythonのnfc.pyを呼び出すPHPのコード部分を以下のように修正します。

```php:main.php
$command=" echo 'www-dataのパスワード' | sudo -S python ../../nf.py";
```
パスワードが設定されていない場合、`sudo passwd www-data`でパスワードを設定できます。
#####追記終わり


これで完成です。
![Screenshot from 2020-04-07 16-18-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584794/ead68e8c-1ae1-74c4-cc8d-0eb37f6ff7d6.png)
ボタンを押してカードをPaSoRiにかざすと…
![Screenshot from 2020-04-07 16-18-15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584794/6b1d77c2-8718-43ee-b676-d02ce9eb00fe.png)
読み取れた！！

たぶんこれはいいやり方ではないと思うのですが、今現在の自分の力量これが限界です…
詳しい方がもっとうまいやり方を見つけてくれるはず…！

###おわりに
なんでこんなにまどろっこしいことをしたかというと、PHPを勉強中だったからなんとしてもPHPを使いたかったからという… 
まあ、これを使ってまた何か作れればいいかなと思っています。
[漏洞通告]jackson-2670/2680/jackson-databind JNDI注入导致远程代码执行

### 漏洞描述
近日,亚信安全网络攻防实验室跟踪到jackson-databind更新了3个jndi注入的黑名单类.如果在项目包中存在该类的jar包且JDK版本满足注入版本,则可以使用JNDI注入的方式导致远程代码执行.类名如下:

```
org.apache.openjpa.ee.WASRegistryManagedRuntime
org.springframework.aop.config.MethodLocatingFactoryBean
org.springframework.beans.factory.config.BeanReferenceFactoryBean
```

### 漏洞编号
Jackson内部编号2670
Jackson内部编号2680

### 漏洞威胁等级
中危

### 不受影响范围
无

### 漏洞验证
使用`jackson-databind 2.11.0.rc1`配合`org.springframework.beans.factory.config.BeanReferenceFactoryBean`验证

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491410/a080623f-e577-0ba6-3afd-0d434aba1915.png)

### 修复建议
等待官方更新

### 时间轴
[0] 2020/04/07 亚信安全网络攻防实验室分析&复现该漏洞并发布漏洞通告

### Reference
https://github.com/FasterXML/jackson-databind
create multiple refs with React.useRef()


```js


  const initForm = () => {
    const form: { [key: string]: string } = {}
    for (let i = 0; i < props.inputLength; i++) {
      form[i] = ''
    }
    return form
  }

  const [codeForm, setCodeForm] = React.useState(initForm())

  const formRefs = React.useRef(
    Object.keys(codeForm).map(() => React.createRef<TextInput>()),
  )

...

{Object.keys(codeForm).map((_, index) => (
     ref={formRefs.current[index]}
)}
```
クロスサイトスクリプティング(XXS)対策

##クロスサイトスクリプティング(XXS）
Webアプリケーションでは、外部からの入力などに応じて表示が変化するページを実装したいことがしばしばあります。
しかし、この部分のHTML生成の実装に問題があると、外部よりスクリプトを埋め込まれクッキーを盗まれたり、JavaScriptによる攻撃を受けてしまうおそれがあります。
こういった攻撃手法をクロスサイトスクリプティングと言います。
###XSSの攻撃例
では、実際にXSSの脆弱性を用いた攻撃例です。
ここでは登場人物を用いて説明します。
ユウスケ・・・ 一般ユーザ
タカシ ・・・攻撃を仕掛ける悪意のある者
1. タカシはXSSの脆弱性があるサイトに悪意のあるスクリプトを埋め込む
2. タカシは1.でスクリプトを埋め込んだサイトをリンクに指定する罠サイトを用意する
3. タカシはユウスケに罠サイトへ誘導するようなメールを送信する
4. ユウスケは罠サイトにアクセスし、タカシがスクリプトを埋め込んだサイトにアクセス
5. ユウスケのブラウザ上でタカシが埋め込んだスクリプトが実行される
※ここで出てくる罠サイトとは、スクリプトを埋め込んだXSSの脆弱性のあるサイトへのリンクを含んでいるページのことをいいます。
ここで実行されるスクリプトの例としては、cookieを攻撃者のサーバに送信されてしまったり、マルウェア(悪意のあるソフトウェア)を仕込んであるサイトにリダイレクトされウイルスに感染させられたりとJavascriptで記述することが可能なすべての攻撃を受けてしまう可能性があります。
##XSSの対策
XSSが発生する主要因として、フォームから入力されたHTMLタグがそのままページに反映されてしまっていることがあげられます。
したがって、XSSを防ぐためにはHTMLを生成する際に意味を持つ「"」や「<」を文字参照によってエスケープすることが基本となります。
### 文字参照
HTML上で直接記述できない特殊文字を表記する際に用いられる記法です。例えば、HTML中に「<」もしくは「>」と記述するとこの二つはタグの初め、終わりと認識されてしまいます。これでは文字列として上記の記号を用いることができません。そこで、文字参照を利用します。

| 変換前 | 変換後 |
|:--|:--|
| < | & lt; |
| > | & gt; |
| & | & amp; |
| " | & quot;|
| ' | & #39; |
上の表は、XSSを対策する際にエスケープすべき特殊文字の一覧です。これらの特殊文字を文字参照に変換して保存すれば、外部から埋め込まれたスクリプトが実行されることはありません。
###rawメソッド
文字列を文字参照にエスケープしないためのヘルパーメソッドです。
【例】

```
raw(文字列)
```
```
<%= raw(tweet.text) %>
```
Go言語でWebAssemblyを使う際の型変換

ちょっとつまづいたので、忘れないようにメモ代わりに書いておきます。
実行環境
OS:Windows 10 64bit
言語環境：go version go1.14.1
ブラウザ:Firefox バージョン: 74.0

```:index.html
該当部分だけ表示
 <body>
        <button type="submit" id="v1" onClick="action('100','result')">Action</button><br>
        <div id="result" >結果</div>
</body>

```

```:エラーになります
func act(this js.Value, i []js.Value) interface{} {

	value1 := i[0]
	value2 := i[0].String()
	value3 := i[0].Int()
	fmt.Println(reflect.TypeOf(value1)) //=> js.value
	fmt.Println(reflect.TypeOf(value2)) //=> String
	fmt.Println(reflect.TypeOf(value3)) //=> エラーとなる

	return nil
}
```
コンパイルは問題なく通りました。

```:これだと動く
func act(this js.Value, i []js.Value) interface{} {
	value1 := i[0].String()
	int1, _ := strconv.Atoi(value1)
	～～～～～～～～～～
}
```

数値型で扱う際は、いったんStrign型に変更後、型変換をする必要があります。
要注意ですね。
【Firebase】Vueプロジェクトでfirebase deploy した時に、Failed to load resource: the server responded with a status of 400 () が出た時の対処法


## `vue create [project]` で作ったwebアプリをbuild後、firebase にデプロイしたらconsole logでエラー発生

手順は、
`firebase deploy --only hosting` 後、指定された firebaseapp.comを開いても、ブランクページが表示される。
 
consoleのエラー内容は、
`Failed to load resource: the server responded with a status of 400 ()
`


## firebase.jsonを変更すればok
`npm run build` でroot配下に、`dist`ディレクトリが自動生成された事を確認後、


```firebase.json
{
  "hosting": {
    "public": "public",
    "ignore": [
      "firebase.json",
      "**/.*",
      "**/node_modules/**"
    ]
  }

```
ここの `public: "public" ` を`public: "dist`　に変えるだけ。


修正後のfirebase.json はこちら

```firebase.json
{
  "hosting": {
    "public": "dist",
    "ignore": [
      "firebase.json",
      "**/.*",
      "**/node_modules/**"
    ]
  }
```
sidekiqのキューが処理されずCPU負荷が上がって困っている人へ

# 現象

- CPU使用率が100%近くで張り付いてしまう
- sidekiqのキューが処理されない

<img width="542" alt="Compute_Engine_-_mixture_-_Google_Cloud_Platform.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/157051/dbe0e94a-0364-c525-57d7-840e390fcf6f.png">
<img width="782" alt="Sidekiq.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/157051/e0bb4d78-78e2-f7b7-f817-26655d2e0baa.png">


# 原因

redis3系で運用しているシステムで`sidekiq`のバージョンを`> 5.2.7`から`< 6.0`に上げた為。
`> 5.2.7`まではredis2.8(3.0.3)以上であれば使えていたけど、`< 6.0`からは4以上が必須に。
(※筆者は`mastodon`を`v3.1.3`にアップデートしたタイミングで発生)

# 解決策

redisのバージョンを4以上に上げてください
社内ネットワークが自己証明書を使っていてあらゆるインストールで「SSL Certificate Error」が出る時の対処法

つよつよエンジニアの皆さんは自己証明書を使っている会社なんかでは働いていないとは思いますが、私のようなクソザコエンジニアはこのような悲惨な環境で働いているわけであります。
さて、この度プロジェクトの環境構築でSSLエラーが頻発しまくり、四苦八苦しながらなんとか対処したのでまとめていきたいと思います。

# apt
apt.confというファイルを作り、それをUbuntu/Debianの`/etc/apt/apt.conf`と差し替えます。

```apt.conf
Acquire::http::Proxy "false";
```

Dockerfileの例はこんな感じ

```dockerfile
COPY ./docker/app/apt.conf /etc/apt/apt.conf
```

これで普通に`apt install`が使えるようになります。

# Git
SSLチェックをやめさせます。

```sh
git config --global http.sslVerify false
```

# Python
pipのコマンドオプションで「信用できるドメインを指定」することで対処します。

```bash
pip install --trusted-host=pypi.org --trusted-host=pypi.python.org --trusted-host=files.pythonhosted.org django
```

残念ながら同じようなオプションはPoetryやpipenvでは見つけることができませんでした。。。

# NodeJS
これもSSLの厳格なチェックをやめさせることで対処します。

```bash
npm config set strict-ssl false
yarn config set strict-ssl false
```

# VSCodeのプラグイン(!?)
VSCodeの中身はElectronであり、プラグインはJSのソースによって作られるため、NodeJSの環境変数に`NODE_TLS_REJECT_UNAUTHORIZED`を入れたら動くだろうと目論んだらその通りに行きました。
私の場合では特にremote-containerのインストールでエラーが起きました。

- C:\Users\ユーザーID\\.vscode\extensions\ms-vscode-remote.remote-containers-0.94.0\dist\extension.jsを開く
- 先頭に以下のコードを追加

```js
process.env["NODE_TLS_REJECT_UNAUTHORIZED"] = 0;
```
`ms-vscode-remote.remote-containers-0.94.0`のプラグイン名やバージョン情報の部分は適時読み替えてください。


以上です。
開発環境をRails5.2からRails6.0にバージョンを変更する

# 目的
　ローカルでの開発環境を現在のRails5.2からRails 6.0へ変更したい。
#### 現環境
 ruby 2.5.1
 rails 5.2.4
rvenvでrubyのバージョン管理を行っている。

railsのバージョンはrubyのバージョンに紐付いている。
rubyを別バージョンに変更してrailsを入れ直す。

## 1. rubyのバージョンをインストールする
```
rbenv install 2.6.4
```
## 2.  rubyのバージョンを切り替える
```
$ rbenv local 2.6.4
```
localの場合、フォルダだけでに適応する。
globalとするとPC全体で使用するバージョンが変更される。

## 3. rails6.0をインストールする

```
gem install rails -v '6.0.0'
```

## 4. エラーを解決する

```
gem install mysql2 -v '0.5.2' --source 'https://rubygems.org/' -- --with-cppflags=-I/usr/local/opt/openssl/include --with-ldflags=-L/usr/local/opt/openssl/lib
```
参考URL：[mysql2 gemインストール時のトラブルシュート](https://qiita.com/HrsUed/items/ca2e0aee6a2402571cf6)
each の基本1

##環境,前提
Ruby 2.5.1
MacOS Mojave Ver.10.14.6

本記事はRubyがインストールされた前提の記事です。
Rubyをインストールしたあと、とにかくRubyをいろいろ触ってみて慣れていくための記事です。お役に立てば幸いです。


# each

eachは配列や範囲オブジェクトで使用できるメソッドで、オブジェクトに含まれる要素を順番に取得することができます。基本的な書き方は以下のようになります。


```sample.rb

配列オブジェクト.each do |変数| 
 #処理 
end 

```

具体例で書きますと



```sample.rb
fruites = ["オレンジ", "イチゴ", "リンゴ"]
fruites.each do |fruite|
 puts fruite
end

```




出力結果は以下のようになります。

```:Tarminai
オレンジ
イチゴ
リンゴ
```

#解説
まずソースコードの1行目でfruitesという配列オブジェクトを用意しています。

そして配列オブジェクトfruitesの要素(オレンジ、イチゴ、リンゴ)を順番に変数fruiteに代入し、putsで出力しています。

。**配列の名前は複数形なのでfruites,each内での変数は単数形のfruiteになっています。**

また、**each内で使用したfruiteという変数は「ブロックパラメーター」と呼ばれています。**
bcpコマンドで楽々バックアップ

windows限定、超小ネタBAT芸です。

#1.バックアップしたいテーブルをtxtに列挙
```text:list.txt
MyDB.dbo.Table1
MyDB.dbo.Table2
MyDB.dbo.Table3
```

#2．以下内容のbatファイルをひな型に、自分の環境に修正
```text:export.bat
@echo off
SET User=[SQLServerユーザー名]
SET Pass=[SQLServerパスワード]
SET Server=[SQLServerアドレス]

FOR /F "" %%i IN (%1) DO @CALL :SUB %%i
goto Exit

:SUB
set args=%1
echo %args% のBackupを行います。

bcp "SELECT * FROM %args%" queryout %args%_export.csv -U%User% -P%Pass% -S%Server% -C65001 -t, -r\n -c

EXIT /B

:EXIT
pause
exit
```

#3.2で作ったbatに1で作ったtxtをドラッグアンドドロップして実行
```text:実行結果Sample
>export.bat list.txt
MyDB.dbo.Table1 のBackupを行います。

コピーを開始しています...
SQLState = S1000, NativeError = 0

597 行コピーされました。
ネットワーク パケット サイズ (バイト): 4096
クロック タイム (ミリ秒) 合計     : 563    平均 : (1060.39 行/秒)
MyDB.dbo.Table2 のBackupを行います。

コピーを開始しています...

360 行コピーされました。
ネットワーク パケット サイズ (バイト): 4096
クロック タイム (ミリ秒) 合計     : 234    平均 : (1538.46 行/秒)
MyDB.dbo.Table3 のBackupを行います。

コピーを開始しています...

147 行コピーされました。
ネットワーク パケット サイズ (バイト): 4096
クロック タイム (ミリ秒) 合計     : 78     平均 : (269.23 行/秒)
続行するには何かキーを押してください . . .
```

こんな感じで、1で用意したtxt内のtableを上から順にcsvで出力してくれるだけのbatです。

実行後、batファイルと同階層に
>MyDB.dbo.Table1_export.csv
>MyDB.dbo.Table2_export.csv
>MyDB.dbo.Table3_export.csv

のように、 *テーブル名_export.csv* がそれぞれ出力されます。

あとは、Excelに取り込んで加工するなり、何かあった時にimportしてリカバリするなりご自由にどうぞ。

あると、時々便利です。
wordpress自作テーマ作成中の備忘録

今回、ローカル環境で久しぶりにwordpressテーマを作ろうと思ったらファイルがうまく開けなかったので備忘録として残しておきます。
環境：
MAMP
MacOS

自作テーマをローカル環境で確認するときは、まずローカルのwordpressに自作環境を適用した状態で、`http://localhost:8888/wordpress/`にアクセスすると確認することができる。例えば、`http://localhost:8888/wordpress/wp-content/themes/(自作テーマ名)`としてもwordpress関数が読み込まれないので表示エラーが出てしまうことに注意です。
Xcodeでよく使うショートカットキー

#よく使うショートカットキー
・Shift＋Command＋O
<img width="564" alt="スクリーンショット 2020-04-07 15.25.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/537459/cd3ec500-0b62-6846-96ca-7ec344545f2d.png">
　上の画像のような検索バーが出てファイルを検索できる。

・Command＋B
　ビルド

・Command＋R
　ビルドして実行
<img width="500" alt="スクリーンショット 2020-04-07 15.40.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/537459/849cd5ef-0662-008f-bd29-05842c6817f1.png">
 上の画像のようなシュミレーターが起動する。

・Shift＋Command＋L 
　<img width="490" alt="スクリーンショット 2020-04-07 15.45.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/537459/92cd55b9-8144-74c1-4537-17e7cbf8b180.png">

　上の画像のようなUIツールが出せる

Cmd + →　右回転 

Cmd + ←  左回転
PostgreSQLのデータベースの存在を確認する

#  はじめに
Railsのコマンドから、PostgreSQLにデータベースを作成/削除をして、本当に作成されているか、削除されているか、確認してみる。

# 環境
Vagrant + Ubuntu 16.04.5 LTS
Rails 5.2.4.2

# 手順
Railsのプロジェクトファイルを作成する。

```cmd
$rails new test01 -d postgresql -B
$cd test01
```

データベースを作成する。

```cmd
$rails db:create
Created database 'test01_development'
Created database 'test01_test'
```
データベースの一覧を表示する。

```cmd
psql -l
```
確かに、作成されている事が確認できます。一覧は、**qキー**で閉じる事ができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94029/c808e132-0ce5-c80e-9a20-5bca1b443d7d.png)

>＜参考＞
https://db.just4fun.biz/?PostgreSQL/%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E4%B8%80%E8%A6%A7%E3%82%92%E8%AA%BF%E3%81%B9%E3%82%8B%E6%96%B9%E6%B3%95

次は、一旦作成したデータベースを削除します。

```cmd
$ rails db:drop
Dropped database 'test01_development'
Dropped database 'test01_test'
```

**psql -l**で確かに、削除された事が確認できます。

再度、データベースを作成して、マイグレーションのバージョンを確認すると、まだ、マイグレーションは１度も実行していないため、バージョンは0で表示される筈です。

```cmd
$rails db:create
$rails db:version
Current version: 0
```
適当に、**Users**テーブルを作成する。

```cmd
$rails g model Users name:string
$rails db:migrate
```
**Users**テーブルが確かに作成されている事を確認する。

```cmd
$psql -q -c 'select * from Users' test01_development
 id | name | created_at | updated_at
----+------+------------+------------
(0 rows)
```

マイグレーションをロールバックすると、先ほど作成した**User**テーブルは削除されるため、テーブルを参照するとテーブルは存在しませんと言われ、エラーになります。

>＜補足＞
psqlの**c**オプションは、SQLコマンドを投げるためのコマンドです。詳しくは、**psql --help**でコマンドの詳細が確認できます。

```cmd
$rails db:rollback
$psql -q -c 'select * from Users' test01_development
ERROR:  relation "users" does not exist
LINE 1: select * from Users
```
AWS CodeCommitでMFA認証してHTTPSで通信する方法

### Assume Role実施（以下はサンプルです）
```
RESPONSE = `aws sts assume-role \
        --duration-seconds 3600 \
        --role-arn $arn \
        --role-session-name session-$timestamp \
        --token-code $token \
        --serial-number $number \
        --profile xxx`

export AWS_ACCESS_KEY_ID=`echo ${RESPONSE} | jq .Credentials.AccessKeyId -r`
export AWS_SECRET_ACCESS_KEY=`echo ${RESPONSE} | jq .Credentials.SecretAccessKey -r`
export AWS_SESSION_TOKEN=`echo ${RESPONSE} | jq .Credentials.SessionToken -r`
```

### 以下の設定をCodeCommitのリポジトリに設定しましょう
```
$ git config --local credential.helper '!aws codecommit credential-helper $@'
$ git config --local credential.UseHttpPath true
```

ちょっとこれだけだと不親切な記事だと思うので、後日補足予定です。
ubuntuでsudo apt updateが使えない

#はじめに
タイトル通り。ハマったので未来の自分のためのメモ。

##エラー
```:コマンドとエラー
sudo apt update

>Unable to locate an executable at "/Library/Java/JavaVirtualMachines/jdk-14.jdk/Contents/Home/bin/apt" (-1)

```

##解決
`vagrant ssh`してないだけでした。あほ。
ナイーブソリューションとは何か

#リーダブルコードを読み始める
リーダブルコードの書籍を購入し、読んでいると知らない言葉に出会った。

>
例えば、「ヒューリスティック」・「ブルートフォース」・「ナイーブソリューション」などがそうだ。コメントが長くてくどいと感じたら、こうした表現を使えないか確かめよう。

この文章がでてきた背景には、情報密度の高い言葉を使おうという内容で、多くの意味を含んだ言葉や表現を使う事で、プログラムのコメントを読みやすくしようという事が狙いとなっている。そのアイデアとして、上記のアドバイスがされていた。

#naïve(ナイーブ)とは
naïveという言葉は、「世間知らず」や「単純」、「無邪気」といった意味があります。
英語で、naïveと打つと、iの上に点が2つ表記されます。これは、フランス語が語源の為みたいです。このフランス語のnaïveには、純粋や素直といったポジティブな意味と、世間知らずといったネガティブな意味の両方が含まれているそうです。
そしてNaïveには、芸術分野において、単純、無邪気、技巧を凝らさないといった意味があります。

#ナイーブソリューションとは
美しい(分かりやすい)コーディングを目指す事において、プログラミングも芸術であると思います。
となると、ナイーブソリューションのニュアンスとしては、単純で素朴な解決策という事でしょうか。
あるサイトには、「経験豊かなプログラマーが最初に浮かぶシンプルな解決策」を意味する専門用語とありました。
その方はさらに、「経験の浅いプログラマーは、その単純な解決策を受け入れよう。その単純な解決策に欠点が無いと思うのであれば、複雑な解決方法はおすすめしない」というアドバイスまで。

#まとめ
単純な方法で解決できないか考えてみて、その手法では実現できない事が分かったら別の方法を考えてみる。
docker-machine 解析環境

まずPythonのインストール。GCPを使う可能性がある場合、gcloudはpython2.7系統もいるから入れておく。

```
$ sudo yum install git -y
$ git clone https://github.com/yyuu/pyenv.git ~/.pyenv
$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(pyenv init -)"' >> ~/.bash_profile
$ source ~/.bash_profile

# コマンドが通るか確認
$ pyenv -v

# 依存関係と本体のインストール
$ sudo apt update
$ sudo apt install build-essential
$ sudo apt install libreadline-dev libncursesw5-dev libssl-dev libsqlite3-dev libgdbm-dev libbz2-dev liblzma-dev zlib1g-dev uuid-dev libffi-dev libdb-dev

# 下記のはうまくいかなかった
$ sudo yum install gcc zlib-devel bzip2 bzip2-devel readline readline-devel sqlite sqlite-devel openssl openssl-devel -y

$ pyenv install 2.7.14
$ pyenv install 3.6.2 
$ pyenv global 2.7.14
$ pyenv rehash

# バージョンがうまくいっているか確認
$ python --version
Python 2.7.14

# 複数入っているか確認
$ pyenv versions

```

次に必要なパッケージを入れていく。

```
# pip3でないと大変なことが起こるから注意
# pip で入れると2系に紐づくから注意
$ pip3 install numpy        # 数値計算
$ pip3 install spicy        # 数式処理
$ pip3 install matplotlib   # 可視化1
$ pip3 install seaborn      # 可視化2
$ pip3 install pandas       # データ操作
$ pip3 install sklearn      # 機械学習
$ pip3 install joblib       # モデルの保存
$ pip3 install jupyter      # Juptyer Notebook
$ pip3 install flask        # Webフレームワーク
```

次にJupyter Notebookを使うための設定をしていく。

まずJupyter Notebookへのログイン用パスワードを用意する。

```
$ python
>>> from notebook.auth import passwd
>>> passwd()
Enter password: 【パスワード入力】
Verify password: 【パスワード確認で入力】
【ここの文字列(sha1: から始まるやつ)をコピーしておく】
>>> exit()
```

ここでコピペしたパスワードは後で設定ファイルに貼り付けるのでとっておいてください。
それでは、設定ファイルを作って、編集まで行います。

```
$ jupyter notebook --generate-config
# ここでファイルが作られたパスが表示されるので
$ vim さっき表示されたフルパス
```

ここで出てきた画面を以下のように修正してください。
場所は上から、204,272,281,292で自分の時はありました。
やることとしては、コメントを外して、対応するように打ち込んでください。

```
## The IP address the notebook server will listen on.
c.NotebookApp.ip = '0.0.0.0' 

...

## Whether to open in a browser after starting. The specific browser used is
#  platform dependent and determined by the python standard library `webbrowser`
#  module, unless it is overridden using the --browser (NotebookApp.browser)
#  configuration option.
c.NotebookApp.open_browser = False

## Hashed password to use for web authentication.
#  
#  To generate, type in a python/IPython shell:
#  
#    from notebook.auth import passwd; passwd()
#  
#  The string should be of the form type:salt:hashed-password.
c.NotebookApp.password = 'さっきのpasswd()でコピーしたもの'

...

## The port the notebook server will listen on.
c.NotebookApp.port = 「受信ポートの規則を追加する」で宛先ポート範囲に指定したやつ(デフォルトは8888)

```

まだこれで環境設定は終わりではありません。
最後にAzureのサイトへ行き、インスタンスまたはネットワークのファイアウォールから、受信ポートの規則を追加してください。また先ほど設定したポート番号とは一致させてください。

```
# 起動方法
$ jupyter notebook
```

あとなんか追加で入れたもの。

```
# 株価見れるやつ
$ pip3 install pandas-datareader 
```
Windows10でdocker toolboxからdocker for windowsに切り替えたときのコマンドエラー

## 環境
Windows 10 Pro
Docker Toolbox(バージョン不明)
Docker For Windows 2.2.0.5

## やりたかったこと
Docker Toolboxで動かしていたのをDocker For Windowsで動くようにしたかった

## やったこと
下記URLからDocker For Windowsのインストーラーをダウンロード＆実行
https://hub.docker.com/?overlay=onboarding


## 発生したエラー
インストール完了後、コマンドプロンプトで下記コマンドを実行したところ、レスポンスまで３０秒くらい時間がかかった。

```
> docker --version
```

また、下記コマンド実行したところエラーとなった。（エラー内容忘れた…）

```
> docker run hello-world
```

docker toolboxをアンインストールし、 *docker --version* を再度実行したところ、下記エラーが出力された
> unable to resolve docker endpoint: open C:\Users\MyUserName\.docker\machine\machines\default\ca.pem: The system cannot find the path specified.

## 原因
docker toolboxの環境変数が、アンインストール後も残っていたのが原因。

## 対応方法
コントロールパネルから環境設定を開き、DOCKER_XXXをすべて削除する。
私の環境だと下記４つの設定が存在していた。
DOCKER_CERT_PATH
DOCKER_HOST
DOCKER_MACHINE_NAME
DOCKER_TLS_VERIFY

コマンドプロンプトを再起動して *docker --version* コマンドを実行したところ、バージョンが出力され、レスポンスもすぐでるようになった。


## 参考
https://github.com/docker/for-win/issues/1746#issuecomment-592917521
僕のFileIO(VB)

自分用備忘録

csvとかtsvとかを`Microsoft.VisualBasic,FileIO.TextFieldParser`で読み込む。

ライブラリ名が長いので、文頭で、Importしときます。
`Import Microsoft.VisualBasic.FileIO`

ファイルの読み込み

```vb
Dim row As string 
'オブジェクト生成
Dim fio As TextFileParser  = New TextFileParser(path,encoding)
   'オプション
path:読み込むファイルのパス
encoding:文字コード　System.Text.Encoding.GetEncoding("文字コード")で指定。

'区切り文字を指定
tfp.Deliminators = new string(){":",","}

'フィールドを読み込む
row = tfp.ReadFields()


```
ECSのタスクのスケジューリングを使用時に設定すべきこと

## やること
ECSのタスクのスケジューリングを使用する場合、タスク起動の失敗を検知して通知されるようにしておく。

## 理由
タスクのスケジューリング機能を使用すると、設定した時間にタスクが新規に立ち上がり、プログラムを実行した後、タスクは終了する。

しかし、何らかの理由でタスクの起動に失敗し、プログラムを実行しないままタスクが終了することがある。このとき、タスクの起動に失敗したからといって自動でもう一度タスクの起動を試みるということはない。

プログラムの実行中にエラーが発生したら通知する仕組みを入れていても、そもそもプログラムが実行される前にタスクが終了するので検知することができない。

つまり、タスクのスケジューリングでバッチを実行していた場合、バッチがコケたことに気づくことができない状況が発生する。

実際、本番運用中のシステムにおいてタスクのスケジューリングでバッチを実行していたが、検証時にバッチで更新されるはずのデータが更新されていないことに気付き、調査してはじめてタスクの起動に失敗している（バッチがコケている）ことが分かった。

## 具体的な方法
CloudWatch Eventでタスク起動の失敗を検知して通知する。

WebコンソールでCloudWatch Eventsのルールの作成からルールを新規に作成していく。
イベントパターンを選択し、サービス名は「Elastic Container Service (ECS)」、イベントタイプは「すべてのイベント」にし、あとはイベントパターンのJSONを編集して下記の内容にする。

```json
{
    "source": [
        "aws.ecs"
    ],
    "detail-type": [
        "ECS Service Action"
    ],
    "detail": {
        "eventType": [
            "WARN",
            "ERROR"
        ]
    }
}
```

ターゲットに、システム運用のエンジニアメンバーに通知するSNSトピック等を設定してルールを作成する。

設定は以上。これで検知できるイベントやイベント発生時に配信される内容の形式は公式ページを参照。
[Amazon ECS イベント サービスアクションイベント](https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/ecs_cwe_events.html#ecs_service_events)

以下は `detail-type` が `ECS Service Action` で、 `detail-type` の `eventType` が `WARN` または `ERROR` のイベントについての引用。

WARN イベントタイプのサービスアクションイベント
>**SERVICE_TASK_START_IMPAIRED**
>サービスは一貫してタスクを正常に起動することができません。
>
>**SERVICE_DISCOVERY_INSTANCE_UNHEALTHY**
>サービス検出を使用するサービスに、異常なタスクが含まれています。サービススケジューラは、サービスレジストリ内のタスクが正常でないことを検出します。

ERROR イベントタイプのサービスアクションイベント
>**SERVICE_DAEMON_PLACEMENT_CONSTRAINT_VIOLATED**
>DAEMON サービススケジューラ戦略を使用するサービス内のタスクは、サービスの配置制約戦略を満たさなくなりました。
>
>**ECS_OPERATION_THROTTLED**
>Amazon ECS API スロットルの制限により、サービススケジューラが調整されました。
>
>**SERVICE_DISCOVERY_OPERATION_THROTTLED**
>AWS Cloud Map API スロットルの制限により、サービススケジューラが調整されました。これは、サービス検出を使用するように設定されたサービスで発生する可能性があります。
>
>**SERVICE_TASK_PLACEMENT_FAILURE**
>サービススケジューラがタスクを配置できません。原因は、reason フィールドに説明されます。
>
>このサービスイベントがトリガーされる一般的な原因は、タスクを配置するためのクラスターでリソースが不足しているためです。たとえば、使用可能なコンテナインスタンスに CPU またはメモリ容量が不足しているか、使用可能なコンテナインスタンスがない場合などです。もう 1 つの一般的な原因は、Amazon ECS コンテナエージェントがコンテナインスタンスで切断され、スケジューラがタスクを配置できない場合です。
>
>**SERVICE_TASK_CONFIGURATION_FAILURE**
>設定エラーのため、サービススケジューラがタスクを配置できません。原因は、reason フィールドに説明されます。
>
>このサービスイベントがトリガーされる一般的な原因は、タグがサービスに適用されてはいるが、ユーザーまたはロールがリージョンで新しい Amazon リソースネーム (ARN) 形式にオプトインしていないためです。詳細については、「Amazon リソースネーム (ARN) と ID」を参照してください。もう 1 つの一般的な原因は、Amazon ECS が IAM ロールが提供するタスクを継承できなかったことです。

記事投稿日：2020/4/7
学校と同じ時間にチャイムを鳴らす

息子が4月から小学1年生、だったのですが、covid-19感染対応で4月いっぱい休校になってしまいました。
家にいるとダラダラ過ごしがちなので、せめて学校と同じ時間区切りで生活できる様に工夫します。
画像は[堺市の小学校の1日の例](https://www.city.sakai.lg.jp/kosodate/kyoiku/gakko/gakuryoku/yojishien/shiennote.files/waku31-full.pdf)、として上げられているものです。
<img width="366" alt="スクリーンショット 2020-04-07 15.00.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23964/bb17e006-9b15-0f89-7ec9-123b4b2ddc86.png">
幸いリビングにはUSBスピーカを繋いだraspbery piがあるので、チャイム音を入れて、wav形式に変換、aplayで鳴らせます。
あとはcrontab -e でチャイムを鳴らしたい時間に
```cron:crontab
30 8 * * 1-5 aplay /home/pi/sound/ScoolBell04-1.wav 
45 8 * * 1-5 aplay /home/pi/sound/ScoolBell04-1.wav 
30 9 * * 1-5 aplay /home/pi/sound/ScoolBell04-1.wav 
40 9 * * 1-5 aplay /home/pi/sound/ScoolBell04-1.wav 
25 10 * * 1-5 aplay /home/pi/sound/ScoolBell04-1.wav 
45 10 * * 1-5 aplay /home/pi/sound/ScoolBell04-1.wav 
30 11 * * 1-5 aplay /home/pi/sound/ScoolBell04-1.wav 
40 11 * * 1-5 aplay /home/pi/sound/ScoolBell04-1.wav 
25 12 * * 1-5 aplay /home/pi/sound/ScoolBell04-1.wav 
15 13 * * 1-5 aplay /home/pi/sound/ScoolBell04-1.wav 
35 13 * * 1-5 aplay /home/pi/sound/ScoolBell04-1.wav 
50 13 * * 1-5 aplay /home/pi/sound/ScoolBell04-1.wav 
35 14 * * 1-5 aplay /home/pi/sound/ScoolBell04-1.wav 
45 14 * * 1-5 aplay /home/pi/sound/ScoolBell04-1.wav 
30 15 * * 1-5 aplay /home/pi/sound/ScoolBell04-1.wav 
```
これで家でも学校気分？

<blockquote class="twitter-tweet"><p lang="und" dir="ltr"><a href="https://t.co/DEC4JR5zMH">pic.twitter.com/DEC4JR5zMH</a></p>&mdash; tatsushi (@tatsushi) <a href="https://twitter.com/tatsushi/status/1247353830947213312?ref_src=twsrc%5Etfw">April 7, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
Mac Laravel 環境構築初期やgit clone直後でローカルサーバを起動した時に500エラーが出た話

# 目的

- Laravelアプリの環境構築初期やgit clone直後にローカルサーバを起動すると500 Server Errorのエラーが出力される問題を解決した話をまとめる


# 問題のエラー

- Laravelアプリのディレクトリ内で`$ php artisan serve`を実行し、ブラウザから[http://127.0.0.1:8000/](http://127.0.0.1:8000/)にアクセスしたところ下記の画面が表示された。

    ![スクリーンショット 2020-03-18 13.54.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/66a179dd-92f2-084d-698d-5dd489335075.png)

# 原因

- Laravelアプリのルートフォルダ内に「.env」のファイルが存在しないことが原因である。
- 下記に問題発生時のLaravelアプリのルートフォルダ直下のフォルダ構成を記載する。

    ```terminal
    .editorconfig
    .env.example
    .git/
    .gitattributes
    .gitignore
    .styleci.yml
    README.md
    app/
    artisan
    bootstrap/
    composer.json
    composer.lock
    config/
    database/
    package-lock.json
    package.json
    phpunit.xml
    public/
    resources/
    routes/
    server.php
    storage/
    tests/
    vendor/
    webpack.mix.js  
    ```

# 解決法

1. 下記コマンドを実行して「.env.example」ファイルを元に「.env」ファイルを作成する。

    ```terminal
    $ cd laravelアプリルートフォルダ
    $ cp .env.example .env
    ```
1. 下記コマンドを実行してローカルサーバを起動する。

    ```terminal
    $ php artisan serve
    ```

1. [http://127.0.0.1:8000/](http://127.0.0.1:8000/)にアクセスしたところ下記の画面が表示された。

    ![スクリーンショット 2020-03-18 14.15.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/36ed2e52-d01e-368a-e7f1-ed775f036cc7.png)
1. アプリケーションキーがないので作ってくれと怒られたので、一旦ローカルサーバを止めて、ブラウザに記載されているコマンドを実行する。

    ```terminal
    $ cd laravelアプリルートフォルダ
    $ php artisan key:generate
    >Application key set successfully.
    ```
1. 下記コマンドを実行してローカルサーバを起動する。

    ```terminal
    $ php artisan serve
    ```
1. 自分が作成中のLaravelアプリのホーム画面がブラウザから確認することができた。

    ![スクリーンショット 2020-03-18 14.22.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/2f99f260-af83-9803-a100-bb87174445fd.png)
awscurlを使う

[署名](https://docs.aws.amazon.com/ja_jp/general/latest/gr/signature-version-4.html)を作成しなくてもインスタンスプロファイルから取得したクレデンシャルでAWSリソースの認可を取得できるので便利。

### awscurl

https://github.com/okigan/awscurl

### 留意点

アクセスキー等のクレデンシャルはexportして環境変数とするか、awscurlのオプションとして渡す必要がある。

参考：一時的な認証情報を使用した IAM 認証
https://docs.aws.amazon.com/ja_jp/neptune/latest/userguide/iam-auth-temporary-credentials.html
仮想ワークスペース Remo.co を試してみた！使用したハッカソンやるよ（2020/4/18開催予定）

<img width="1249" alt="スクリーンショット 2020-04-07 13.35.17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216883/fdd7fd61-6ff5-38ab-7643-3175cf84037a.png">

# Remo.co とは
https://remo.co/
Remo.coとはリアルタイムのコラボレーションを促進し、企業文化を強化する、リモートチーム向けのビデオファーストの仮想ワークスペース。
以下の機能が複合的に提供されていて、要はリモートチームでもオフラインに集まったような雰囲気でコラボレーションができる事が特徴。

1. ウェビナー機能（プレゼンテーション機能） <br>
　└その場にいる人全体にビデオ・プレゼンテーション配信　<br>
　└視聴者からの質問管理機能
2. テーブル別トークルーム（最大6名毎にオンラインディスカッションができる）<br>
　└同一テーブル（6名がけ）になった人とビデオチャットできる<br>
　└テーブルはダブルクリックで簡単移動。1人になりたかったら1人で。<br>
　└ソファも用意されていて、仕事スペースと休憩スペースが共存。<br>
3. コラボレーションツールも充実<br>
　└大声をあげて、みんなに一斉伝達も可能。<br>
　└全員参加のチャット機能、個別チャット機能<br>
　└ホワイトボードで簡単なディスカッションも可能<br>

[![IMAGE ALT TEXT HERE](http://img.youtube.com/vi/AvfjiukhgnE/0.jpg)](http://www.youtube.com/watch?v=AvfjiukhgnE)

## 1.ウェビナー機能
### その場にいる人全体にビデオ・プレゼンテーション配信
ホスト向けの機能として、参加者全員に対するビデオ・プレゼンテーション機能があり、画面左下の「Present」から配信画面に移行できる。
このビデオ・プレゼンテーション配信機能は、基本的に映像・音声共に、
ホスト対参加者の1対N構造になっている。
![remo.co.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216883/1612c3e7-9fd4-4a4d-ed03-e52d99c42d90.png)

### 視聴者からの質問管理機能
ビデオ・プレゼンテーションの配信中に、視聴者（参加者）から質問を受け付けられる。チャットでの対応も可能だが、「Participants」機能を使えば、視聴者も配信側に参加ができ、ビデオチャットに参加し質疑などが可能。この機能を使って、ゲストを登壇させ話してもらうこともできそう。

視聴者の配信側への参加は、配信ホストが「Participants」機能から、招き入れる。
（人形のアイコンをクリックし、緑色になるとその視聴者が配信側に招き入れられる）

<img width="1258" alt="スクリーンショット 2020-04-07 13.26.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216883/9204c537-ec17-cf8e-9683-10465f77c864.png">

## 2.テーブル別トークルーム
### 同一テーブル（6名がけ）になった人とビデオチャットできる
Remo.co の一番の特徴はここ。UI自体がオフィスの図面のようになっており、テーブルが多数配置されている。
参加者は任意のテーブルをダブルクリックするだけで「着席」したこととなり、アイコンが移動する。そのテーブルに別の参加者が座った場合、ビデオチャットが自動で開設され会話が可能となる。

いつ抜ける（違うテーブルに行く）かは参加者の自由であるので、あたかもフリーデスクのオフィス内を歩いて、作業場所を見つけ、知り合いがきたら会話をする、というオフィススタイルがそのまま実現されているようだ。
<img width="1262" alt="スクリーンショット 2020-04-07 13.32.03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216883/095a3ff1-876e-33f9-291d-95ccba417f9f.png">

また、ソファ席が用意されてるので、いわゆる「お仕事モード」では無いときには休憩したり、休憩している人同士で話す事ができそう。
同様に、誰もいないテーブルを1人で占拠し、もくもく作業することもできる。

## 3.コラボレーションツールも充実
Remo.coの更に特筆すべき点は様々なコラボレーションツールが提供されていることだ。
オフィス作業で必要な機能はある程度存在している。
### 大声で参加者に伝える機能
「Announce」機能があり、参加者全員の画面上に強制的にテキストを表示することができる。
オフィス全体に重要事項を伝達したい時などと似た使用方法もできるし、ワークショップを行っているときの作業交代場面などでも使用できる。
それ以外にもホワイトボード、Timerなども提供されている。

<img width="1182" alt="スクリーンショット 2020-04-07 13.09.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216883/0822aa95-34a9-db76-0a57-e345ceb517c8.png">


## Remo.coを使ったハッカソンやってみるよ
4/18（土）に「リモートワーク」をテーマに、オンラインハッカソンやります！
この場で使用するコラボレーションツールを探索している一環で、Remo.coを試したのですが、想像以上に使いやすい！、、というわけで、当日はRemo.coを使う予定でおります。（今の所）
ハッカソンに興味がある方や、Remo.coを使ってみたい！という方はぜひご参加くださいー。
▼ProtoOutハッカソン　-テーマ：リモートワーク #ProtoOut
https://connpass.com/event/172136/
<img width="564" alt="スクリーンショット 2020-04-07 14.56.30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216883/67ec7666-93eb-8eb3-8d2c-26805d88856c.png">


こちらのエントリーは以下 @hisayan の記事を参考にさせていただきました。
https://qiita.com/hisayan/items/05b4287e94ce2ce4e563?
【Git】Gitで現在のbranchを環境変数にセットする方法

# 方法
現在`develop`ブランチにいるとして下記を実行します。

```bash
$ export CURRENT_BRANCH="$(git branch --contains | cut -b 3-)"
$ echo $CURRENT_BRANCH
develop
```

`develop`ブランチが`$CURRENT_BRANCH`にセットされました。

# 何をやっているか
```bash
$ git branch --contains
* develop
```

>特定のコミットが所属するブランチを探す --contains を使えば、「現在のコミットの所属するブランチ」に絞り込むことができるので、今いるブランチが分かります。（ただし、今のコミットを含むブランチが複数あるときはあんまり意味ないです。当たり前ですが。）

[引用](https://qiita.com/negito6/items/01e0eddb0bd281d85206#--contains-%E3%82%92%E4%BD%BF%E3%81%86)

`--contains`は自動的にHEADを参照します。

これで現在のブランチを出力します。
ただこのままだとカレントブランチを表す`*`が含まれたままです。

```bash
| cut -b 3-
```

これでパイプで渡された標準出力の3バイト以降を出力します。
`* develop`では`d`行こうが3バイト目なので`d`以降が出力されます。

最後に`$()`で囲った処理を実行して`exoprt CURRENT_BRANCH`で`CURRENT＿BRANCH`にセットします。

```bash
$ export CURRENT_BRANCH="$(git branch --contains | cut -b 3-)"
```

# 参考
- [get current branch name](https://qiita.com/sugyan/items/83e060e895fa8ef2038c)
- [Git で今いるブランチを簡単に探す](https://qiita.com/negito6/items/01e0eddb0bd281d85206)
- [cutコマンドについてまとめました](https://eng-entrance.com/linux-command-cut)
Webの歴史とアーキテクチャスタイル「REST」

##Webの歴史

1965年 「ハイパーメディア」という概念の誕生
ハイパーメディアとはテキスト、音声や動画など多様なメディアを相互にリンクさせた概念
最も普及したハイパーメディアの実装がWeb
・必要最低限のリンク機能だけを備えている
・Web以前のハイパーメディアと比べてシンプル

1970年
コンピューター小型化性能向上、複数のコンピュータを組み合わせて処理を分散させ、全体として性能向上させる手法分散型システムが生まれる。

1980年
インターネットが登場し、複数のコンピュータを接続した分散システムが普及。
以下の理由によりウェブが普及した。
特定多数の情報をリンクさせあうことができる。
システムを大規模化させやすい(オープンである)
情報の集中的な管理が難しくリンク切れを起こしやすい欠点も。
ウェブのリンクはシンプルな単方向リンクだけ 実装が簡単。

2000年 Roy Fieling（アメリカの大学院生）
なぜめぐがこんなに成功したのか考え、これを「REST」と名付け、まとめた。


##アーキテクチャスタイル「REST」
アーキテクチャスタイル…(NVCモデル)とか実際のシステムは具体的なアーキテクチャを持っているその設計時の指針、作法、流儀のこと。
リソース…ウェブ上に存在する名前を持つありとあらゆる情報

「Rest」とは複数のアーキテクチャスタイルを以下の組み合わせて構築し、複合したもの。

1. クライアント/サーバー…クライアントとサーバに分離して処理
クライアントマルチフォームにできる
複数のサーバを組み合わせて冗長化可用性をあげれる

1. ステートレスサーバ…クライアントのアプリケーションの状態をサーバーで管理しないこと
サーバーを簡易化
リクエストに応じたあとすぐサーバーの計算機リソースを解放できる
↔︎ステートフル
クッキーを使ったセッション管理。
REST視点から見るとクッキーを使ったセッション管理は間違ったhttpの拡張であり、クッキーは必要最低限の利用にとどめる。

1. キャッシュ…リソースの鮮度に基づいて、一度取得したリソースをクライアント側で使います方式。
クライアントサーバ間の通信を減らす効率化
古いキャッシュを利用してしまい情報の信頼性が下がる

1. 統一インターフェイス…URIで示すリソースに対する操作を統一した限定的なインターフェースで行う
Http 1.1　８つのメソッドのみ定義
全体のアーキテクチャがシンプルに
サーバークライアントの独立性が高まる

1. 階層化システム…いくつかの階層に分離するアーキテクチャスタイルのこと

1. コードオンデマンド…プログラムコードをサーバーからダンロードしクライアント側でそれを実行する
EX　JS,Javaアプレット

この1~6を取捨選択するのが設計作業(理想はRESTに近づける（これをRESTfulという）のか、妥協するか考える)
無理やりRESTfulにする必要は無い

![REST.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/453293/3c00cb9b-d02a-d016-aabe-bd663cdd0d79.png)
ngrokで自分のhostsに設定した独自ドメインを指定して接続する方法

## 問題点

自分のローカルでサーバーを立てた際に、ドメインも指定して `sample.local:8000` などとした場合に、ngrokだと `localhost` を見に行く為、エラーになった。そこで、ホスト指定してngrokを起動することで、解決出来ることが分かったので、メモしておきます。

## --host-headerを使用

```terminal
ngrok http --host-header=sample.local 8000
```

このように `--host-header` オプションを使用することで、sample.localを見に行くことが出来るようになりました。
僕のClipboard,InputBox,MessageBox etc...

たま～に使うクラスのメソッドやら

###Clipboard

```vb
'クリップボードにコピー
Clipboard.SetData(datatype,value)
    'オプション
datatype:データの形式
- DataFormats.Bitmap            'ビットマップ形式
- DataFormats.EnjancedMestafile '拡張メタファイル
- DataFormats.Html              'HTMLテキスト
- DataFormats.Text              'ANSIテキスト文字列
- DataFormats.UnicoteText       'Unicodeテキスト

value:読み込む実体
```


###InputBox
```vb
Dim txt As String = Inputbox("何か入力してください")
```

###MessageBox
```vb
MessageBox("ここにテキストが出るよ")
```
MacOS：tmuxinatorがtmux 2.8 までしか対応していなかったのでtmuxをダウングレードする

# MacOSをバージョンアップしてCatalinaにしたらtmuxinatorがtmux(v2.8)までしか対応しておらず起動しなくなった

Homebrewでtmuxをインストールしようとすると、latestバージョンしかインストールできない
2020年4月7日現在ではtmux(3.0a)がインストールされる
# まずはtmuxアンインストール
```
$ brew uninstall tmux
```

# home に移動してgit cloneしてくる
```
$ cd
$ git clone git@github.com:Homebrew/homebrew-core.git
$ cd homebrew-core
```

# git log を確認してインストールしたいバージョンのSHAを探す
```
$ git log master -- Formula/tmux.rb
```

こんな感じで出てくる

```
commit 284cd20f3bbd1f773c82a3a2b6081facf9295657
Author: Mike McQuaid <mike@mikemcquaid.com>
Date:   Sat Mar 14 19:45:59 2020 +0000


    tmux: fix RuboCop Style/TrailingBodyOnMethodDefinition.

commit b0f75c35372d4708f7340c786ed0c24685cf553c
Author: BrewTestBot <homebrew-test-bot@lists.sfconservancy.org>
Date:   Thu Feb 27 18:41:43 2020 +0000

    tmux: update 3.0a_1 bottle.

commit 37bf45e0204fab5b79bc50896b02f3e6c923c7a1
Author: Yuk Pong Cheng (Daniel) <danielyp_cheng@apple.com>
Date:   Fri Feb 28 02:30:20 2020 +0800

    tmux: enable utf8proc and fix typo

    fix dependency order

    Closes #50773.

    Signed-off-by: Dawid Dziurla <dawidd0811@gmail.com>

commit f509634ee4adeb6c9857850133269f58f84b940e
Author: Daniel Cheng (鄭郁邦) <j16sdiz@users.noreply.github.com>
Date:   Fri Feb 28 01:53:28 2020 +0800

    tmux: enable utf8proc and fix typo
```

# commitログから欲しいバージョンのSHAでインストーする

```
brew install https://raw.githubusercontent.com/Homebrew/homebrew-core/[commit SHA]/Formula/tmux.rb
```

ver2.8の場合↓

```
brew install https://raw.githubusercontent.com/Homebrew/homebrew-core/9d2ab46c92cc88470b1c54f5da2d0a1595188533/Formula/tmux.rb
```

# バージョン確認してみる
```
$ tmux -V
tmux 2.8
```
Djangoのモデルでchoicesを使用した値をtemplateで表示したい場合

## 問題点

choicesを使用した際に、template側でchoicesのvalueを表示したいことがあった。
そこで、 `get_xxx_display` を使用することで表示出来たので、メモしておきたいと思います。

## モデル

```python
AREA_NAME_ASIA = 'asia'
AREA_NAME_EUROPE = 'europe'

AREA_NAME_CHOICES = (
    (AREA_NAME_ASIA, 'アジア'),
    (AREA_NAME_CHOICES, 'ヨーロッパ'),
)

area = models.CharField(max_length=50, choices=AREA_NAME_CHOICES, verbose_name='エリア名')
```

## template側

```python
{{ obj.get_area_display }}
```

これで、 `アジア` と表示することが出来る。
ドキュメントはちゃんと読まないといけないですね、、
請求情報だけにアクセス出来るRAMユーザを作りたい

Alibaba Cloud を使うに当たって適切な権限管理は大事になってきます。

請求情報をだけにアクセスをさせたい経理担当者などにコンソールにアクセスさせるには、料金関係の場所以外にはアクセスさせたくはありません。そこでRAMユーザを作成することになります。

逆に、アウトソーシング先など請求情報にアクセスさせたくない場合は、以下に挙げる `AliyunBSS***` ポリシーを付加しないようにします。

## Alibaba Cloud の料金は User Center で確認可能

料金関連は User Center というところにまとまっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70132/eb0999e9-4271-8159-3327-920b507e1588.png)

管理できる項目はこのくらいになります。

|項目|項目|
|:-----|:-----|
|Billing Management<br>Account Overview<br>Spending Summary<br>Bills<br>Credit Payment Bills<br>Orders<br>Usage Records<br>Renewal<br>|Payment Methods<br>Resource Packages<br>Account Balance<br>Coupons<br>Refer a Friend<br>Voucher Management<br>Reserved Instances|

## RAM ポリシー

|項目|項目|項目|
|:-----|:-----|:-----|
|AliyunBSSReadOnlyAccess|Billing System に対する読み取り専用権限を付与します。|料金が見えるようになります|
|AliyunBSSOrderAccess|Billing System に対する注文照会、支払いおよび注文取消し権限を付与します。|支払や注文取消などの一部オペレーションを追加します|
|AliyunBSSFullAccess|Billing System に対するフルアクセス権限を付与します。|すべての権限を付加します|

`AliyunBSSReadOnlyAccess` は、User Centerの多くにアクセスを出来るようになりますが、Overviewの一部やOrder Detailの一部で表示エラーが出ます。

`AliyunBSSOrderAccess` は、User Centerでの注文に関するWrite権限を付与します。この権限だけでは画面にアクセス出来ないので、`AliyunBSSReadOnlyAccess`とセットで利用するのが一般的かと思います。

`AliyunBSSFullAccess` は、 `AliyunBSSReadOnlyAccess` + `AliyunBSSOrderAccess` + α の機能を許可します。すべての機能が許可されます。


## 設定方法

1. 請求情報を操作する担当者RAMユーザーを作成する
2. 担当者RAMユーザーをRAMグループに所属させる
3. RAMグループに適切な権限を加える
4. 一度ログアウトして、RAMユーザでログインし直す
5. User Centerでアクセスする
読んでおきたい記事

ネットワークのインテリジェントな運用管理を
実現するMANO技術
https://jpn.nec.com/techrep/journal/g15/n03/pdf/150304.pdf

次世代ネットワークの運用管理を実現する技術
－MANO－
https://www.ctc-g.co.jp/report/column/5g_system/vol05.html

Cisco NFV インフラストラクチャ：ビジネス価値の提供
https://www.cisco.com/c/dam/global/ja_jp/solutions/collateral/service-provider/network-functions-virtualization-nfv-infrastructure/white-paper-c11-736645.pdf

ネットワーク仮想化（ NFV） - Fujitsu
https://www.fujitsu.com/jp/documents/about/resources/publications/magazine/backnumber/vol66-6/paper04.pdf

Cisco ACI
まるわかりガイド
https://www.cisco.com/c/dam/global/ja_jp/products/catalog/pdf/cisco-aci-perfect-guide.pdf

家庭内における新たなサービスを提供するフェムトセルサービス
https://www.nttdocomo.co.jp/binary/pdf/corporate/technology/rd/technical_journal/bn/vol17_4/vol17_4_019jp.pdf

ネットワーク機能仮想化（VNF）
オンボードプロセスの効率化
https://www.intel.co.jp/content/dam/www/public/ijkk/jp/ja/documents/vnf-on-boarding-process-jp.pdf

Network Functions Virtualisation (NFV);
Virtual Network Functions Architecture 
https://www.etsi.org/deliver/etsi_gs/NFV-SWA/001_099/001/01.01.01_60/gs_NFV-SWA001v010101p.pdf

NFVの標準化に向けた取り組み
https://www.nttdocomo.co.jp/binary/pdf/corporate/technology/rd/technical_journal/bn/vol24_1/vol24_1_004jp.pdf

RTP/RTCP
http://www.ieice-hbkb.org/files/03/03gun_04hen_05.pdf
プログラマ脳を鍛える数学パズルQ04棒の切り分け

#問題概要
長さnの棒をm人で切って1cm単位にする。ただし一回に切れるのは1人。何ステップで切れるか。

#Code
とりあえず何も考えずにやってみたバージョン。方針は「長いものから切っていく」

```
def cutbar(length, member):
    bar = [length]
    step = 0
    while bar != [1]*len(bar): #すべて長さが1なら終了
        for i in range(min(member, len(bar))):
            piece = bar.pop(0) #先頭(=最大値)を取り出す
            if piece == 1:
                break
            else:
                cut1 = round(piece/2)
                cut2 = piece - cut1
                bar += [cut1, cut2]
        bar.sort(reverse=True) #降順でソート
        step += 1
    return step

print(cutbar(20, 3))
print(cutbar(100, 5))
```

#再起を使って
再帰でやったほうがスマート。以下のコードはほとんど本文の受け売りですが、、、

```
#Q04棒の切り分け
#再帰を使って

def cutbars(length, member, pieces): #棒の最初の長さ、人数、現在の棒切れの数
    if pieces >= length: #切り終えた
        return 0
    elif pieces < member: #全部の棒切れを一様に切る
        return 1 + cutbars(length, member, pieces * 2)
    else: # member分の棒切れだけを切る
        return 1 + cutbars(length, member, pieces + member)
    
print(cutbars(20, 3 ,1))
print(cutbars(100, 5, 1))
```
Vue.js クラスとスタイルのバインディング

## クラスのデータバインディングの基本

- クラスを動的に変更するには`v-bind:class`を利用する
- クラスの付け替えが楽になる

```html:例
<p v-bind:class="{クラス名: 真偽値}">
```

```js:js
var app = new Vue({
  el: '#app',
  data: {
    isLarge: true // 真偽値を定義
    }
})
```

```html:html
<!-- isLargeがtrueなので、largeクラスが適用される-->
<p v-bind:class="{large: isLarge}">Hello Vue.js!</p>
```

## 複数のクラスを動的に切り替える

- カンマ区切りで、複数のクラスを指定できる。

```html:html
<p v-bind:class="{クラス名: 真偽値, クラス名: 真偽値, ...}">
```

```html:html
<p v-bind:class="{large: isLarge, 'text-danger': hasError}">Hello Vue.js!</p>
```

`'text-danger'`のように、クラス名にハイフンを含む場合は`''(シングルクォート)`で囲む。



## プレーンなクラス属性と共存させる

一般的なクラス定義と、データバインディングしたクラスは共存できる。

```html:例
<p class="クラス名" v-bind:class="{クラス名: 真偽値, クラス名: 真偽値, ...}">
```

## 配列構文によるクラスのデータバインディング

`v-bind:class`にクラスのリストを渡す事で展開できる

```html:例
<p v-bind:class="[プロパティ名, プロパティ名, ...]">
```

```js:js
data: { // dataにクラス名を持ったプロパティを定義
  largeClass: 'large', 
  dangerClass: 'text-danger'
}
```

```html:html
<!-- クラスを適用するにはブランケットで囲む -->
<p v-bind:class="[largeClass, dangerClass]">Hello Vue.js!</p>

<!-- <p class="large text-danger">Hello Vue.js!</p>
```

## オブジェクトのデータを利用する

複数のクラスをテンプレート(HTML)に書くと見通しが悪くなるので、オブジェクトで定義して`v-bind:class`に渡すことができる。

```html:例
<p v-bind:class="オブジェクト">
```

```js:js
data: {
  classObject: { //クラスのオブジェクトを定義
    large: true,
    'text-danger': true
    }
}
```

```html:html
<!-- largeクラスとtext-dangerクラスが適用される -->
<p v-bind:class="classObject">Hello Vue.js!</p>
```

## クラスの条件に三項演算子を使う

```html:html
<!-- isTrueがtrueの時、trueClassクラスが適用される -->
<p v-bind:class="isTrue ? trueClass : '' ">Hello Vue.js!</p>
```

三項演算子の結果に関わらず、常に適用したいプロパティがある場合は`[]`で囲んでカンマで区切る。

```html:html
<!-- fooClassは常に適用される -->
<span v-bind:class="[isTrue ? trueClass : '', fooClass ]">
```

## インラインスタイルのデータバインディング

- インラインスタイルを動的に変更するには`v-bind:style`を利用する

`data`オプションに、インラインスタイルで使用したいプロパティをセット

```js:js
data: {
    color: 'blue',
    fontSize: 48
}
```
`v-bind:style`でデータバインディングさせたインラインスタイルを適用できる。

CSSのプロパティ名は`キャメルケース`にする必要がある。

```html:html
<p v-bind:style="{color: color, fontSize: fontSize + 'px'}">Hello Vue.js!</p>

<!-- <p style="color: blue; font-size: 48px;">Hello Vue.js!</p> -->
```

`ケバブケース`で書きたいときは`''(シングルクォート)`で囲う

```html:html
<p v-bind:style="{'font-size': fontSize + 'px'}"></p>
```

また、クラスのようにオブジェクトを渡すこともできる。

```js:js
data: {
  styleObject: { // オブジェクトを定義
    color: 'blue',
    fontSize: '48px'
    }
}
```

```html:html
<p v-bind:style="styleObject"></p>

<!-- <p style="color: blue; font-size: 48px;">Hello Vue.js!</p> -->
```
クラウドってなに？

##クラウドコンピューティングとは##

クラウドコンピューティング、略して「クラウド」と言って、今は世の中に必要な存在になってきているサービスの１つです。

クラウドとは、情報処理を自分のPC行うのではなく、**インターネット**を介してクラウド事業者のPCで行うサービスのことを指します。

**クラウド**との対比用語として**オンプレ**という言葉があります。

オンプレとは、今まで企業がIT資産を保有しており、自社の情報を自社内に構築したシステムで処理していました。

それをクラウドというサービスを利用することで、インターネットにアクセスをし、Webブラウザやクラウドサービスソフト専用やソフトウェアを立ち上げ、自社でコストをかけて物理的にかかるコストを押させることが出来るようになったのです。

###:point_up_tone1:要はクラウドとは「銀行預金」のようなもの
　　　
よく例えられるのは、私たちはお金を銀行に預けますよね。
いわば、
###「金融資産」

を預けていますね。
お金を家の中のタンスに置いておくよりも、銀行に預けている方が安心！しかも、資産運用をすれば、増えるかも！というメリットまでも。
そして、お金は、世界のどこにいてもATMに行けば下ろすことができますよね。
このように、銀行にお金を預けるということは

「`安心して`
`お金を預けられて`
`世界のどこからでもATMがあればお金をおろせる`
そして
`運用もしてもらえる`」

クラウドとは
「`安心して`
`自社の情報をクラウド事業者のデータセンターに預けて`
`世界のどこからでもアクセスできる`
そして
`情報を的確に運用してもらう`」

ということになります！
ndarrayで行ベクトルを列ベクトルに変換するときに気を付けるべきこと

pythonのndarrayで、行ベクトルを列ベクトルに変換するときのお話です。
思わず、次のようにしてしまいがちですよね。
`print(np.array([1,2,3,4,5]).T)`
でもこれだと、結果は

```
[1 2 3 4 5]
```
となってしまい、行ベクトルに変換できません。
これは、行ベクトルが1次元配列で表現されているのに対し、
列ベクトルは2次元以上の配列でないと表現できないからです。
実際、
`print(np.array([[1,2,3,4,5]]).T)`
のように2次元配列で行ベクトルを渡せば、ちゃんと

```
[[1]
 [2]
 [3]
 [4]
 [5]]
```
という結果を得ます。

ちなみに
`print(np.transpose(np.array([1,2,3,4,5])))`
においても同様で、列ベクトルは得られません。

一次元配列としての行ベクトル`v`から(2次元配列としての)列ベクトル`m`を得たいときは、

`m = np.array([v]).T`

としましょう
文字コードについて


#❏文字コードについて
文字（記号）に対して、コンピュータ上でデータとして扱うために、
一文字ずつ固有の識別番号を付与したもの。
その数値と文字の対応関係を定めた規約のこと。
文字コードは以下の２要素からできている。

- 文字集合：どの文字を対象とするかの一覧
- 符号化方式：文字と数値のマッピング表
 
#❏符号化方式
 文字と数字を対応させるために、まず「どの文字を対象とするか」その一覧を作成する必要がある。
 欧米兼であればアルファベットと特定の記号で一覧化が容易であるが、
 漢字なども入れるとなるとどこまで入れるのかが焦点となる。
 また、それらをどのようなビット列（数値化）として定義するのかにも、現状様々な方式がある

#❏代表的な符号化方式

###◆ASCIIコード
最も基礎となる文字コード。
   数字・アルファベット・記号をそれぞれ1バイトで表現する。
###◆Shift-JIS
  Windows基本の文字コード
  日本語表記でWindowsを使用する場合はこの文字コードが使用される
  ASCIIコードに加えて日本語の文字を加えている。
  半角カタカナは1バイト起票でそれ以外の全角文字が2バイトでマッピングされている
###◆UTF-8
  ASCIIコードの文字に加え、世界中の文字を加えたのが、UTF-8
  文字集合としてはunicodeを使用。
  世界中の多くのソフトウェアはUTF-8に対応している。
  
#❏よくはまる例
###◆文字化け
データの転送の際に、対応する文字コードが異なることによって発生する。
コード変換に失敗した文字は「?」「■」となって置き換えられる。
原因は文字集合にあり、特に Shift-JISと、UTF-8の相互変換で発生しやすい。
Shift-JISで定めている難しい漢字「彅」（環境依存文字）は
UTF-8の文字集合に登録されていないため文字化けが発生する。

###◆改行コード
eclipse:windows でコードを修正し、PRを作成したら全行修正しているように見える
なんてことは改行コードが関係している。
改行コードは文字コードに対して、改行を識別するための定義である。
**Windows：0x0d0a**
   ASCII の制御文字 CR (キャリッジリターン), 0x0a は同じく制御文字の LF (ラインフィード) で判別している
   →「CRLF」と呼ばれている
**Linux：0x0a**
   ASCII の制御文字 LF (ラインフィード) のみで改行とみなす。
   →「LF」もしくは「LF only」と表現される
  
  window環境では「CRLF」、Linux/Macintoshでは「LF」となるアプリケーションが多いので、
  Linuxのファイルをwindowsで開こうとすると改行がされていなかったり
  その逆で、上述した「PR上ですべて変更されているように見える」といった事象が発生する。
  ただ、改行コードはアプリケーションごとに決定できるので、変換方法を変えてあげれば解決できる。
  Eclipseの場合は以下
  https://qiita.com/ponsuke0531/items/74833b2d7bd4bbf44057
  
#❏派生：URLエンコード

**目的・必要性**
URLに含むことが禁止されている文字があるため、それを形式に沿うよう変換すること

**具体例**

- 半角→ %〇〇
- 全角→ %〇〇が二つ分
- 半角スペース→ +

**エンコーディング規約**

- RFC3896

**エンコード方式**

- （ほとんど）UTF-8
  
#❏参考資料

- https://gihyo.jp/book/pickup/2019/0006
- https://milestone-of-se.nesuke.com/nw-basic/as-nw-engineer/charset-summary/
Doctrine で Oracle の日付を扱う時にすること

Symfony を使っていて Doctrine で Oracle データベースの日付を扱う時に

```
Could not convert database value "10-11-10" to Doctrine Type date
```

というようなエラーがでました。
Oralce が返してくる日付フォーマットと Doctrine のフォーマットが合わないので、このようなエラーが出ます。

`sqlplus` コマンドで、日付を含むテーブルをクエリしてみると、フォーマットがそのようになっています。`NLS_DATE_FORMAT` を指定すると、そのフォーマットで返ってくるようになります。

では、Symfony ではどうしたらよいのでしょう。

https://github.com/doctrine/DoctrineBundle/issues/217#issuecomment-68053651

こちらの答えがありました。

*service.yaml* に次の定義を追加します。

```yaml
    oracle.listener:
        class: Doctrine\DBAL\Event\Listeners\OracleSessionInit
        tags:
            - { name: doctrine.event_listener, event: postConnect }

```

このサービスは、Doctrine に初めから用意されているものです。

そのヘッダ部のコメントにこう書いてあります

```php
/**
 * Should be used when Oracle Server default environment does not match the Doctrine requirements.
 *
 * The following environment variables are required for the Doctrine default date format:
 *
 * NLS_TIME_FORMAT="HH24:MI:SS"
 * NLS_DATE_FORMAT="YYYY-MM-DD HH24:MI:SS"
 * NLS_TIMESTAMP_FORMAT="YYYY-MM-DD HH24:MI:SS"
 * NLS_TIMESTAMP_TZ_FORMAT="YYYY-MM-DD HH24:MI:SS TZH:TZM"
 */
```

翻訳すると

```
Oracle Server のデフォルト環境が Doctrine の要件と一致しない場合に使われます。
Doctrine のデフォルトの日付書式には以下の環境変数が必要です。
```

ということで、この設定をすると Oracle の日付フィールドを適切に扱えるようになります。
「システムを「外注」するときに読む本」を読んだ感想

##システムを「外注」するときに読む本

![51k0D-0hJZL._SX319_BO1,204,203,200_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473778/0cb2ad6c-6cd4-ac2f-df94-b252f87d6911.jpeg)


https://www.amazon.co.jp/dp/4478065799/ref=cm_sw_r_tw_dp_U_x_cwaJEbZPNYCPC 


システムつくる側の話（ベンダ）ではなく、システムをお願いする側（ユーザ）の話です。

システムをつくるプロジェクトの成功率は30%で残りの70%が失敗に終わるという。

ストーリー形式になっていて、ユーザー側が落ちやすい穴について書いてあります。

主人公がホモって設定が読んでいてキモいなと思いました。政府ICO補佐官のおっさんがつくってる思うとゾッとします。ゴーストライターであってほしい。


そんな素敵なストーリーの中身を要約すると、


**お互いが相手の気持ちになって、コミュニケーションをとれば失敗は回避できる**

ということが書いてあります（笑）

つまり、

**お互いが相手の気持ちになって、コミュニケーションをとれば戦争は回避できる**

というのと同じです。それができれば、2020年度の5兆3133億円という防衛費も不要だったのかもしれません。

話がそれましたが、ベンダは仕事する前にユーザーにこの本をプレゼントすれば喜ばれると思いますよ！

1980円＋税でプロジェクトの失敗が回避できればとても安いものです。

駅前で聖書を配ってくるおじさんと同じように思われるかもしれませんが。。。。



>##要件定義のポイント

>・システムを導入する目的を忘れないように書きとめておく

>・業務フロー図には、懸念事項や課題を漏れなく書き込む

>・システムを導入して誰が喜び、誰が困るのかを書き込む

>・システム化の範囲は、業務をどのように改善するかという「意志」をもつ

>・システム担当者となったからには、自分の思いは脇において、改善の推進者になるきる


>##発注者が最低限知っておくべきこと

>・システム担当者にはシステム化する対象事業の知識が必要

>・発注者側の責任で頓挫したプロジェクトの損害賠償責任は発注者にある

>・システム担当者がモチベーションを上げるには、経営者の視点でシステム導入の意味や目的を考えてみると良い


>##ベンダ選びのポイント

>・ベンダの示すプロジェクト管理項目と管理工数が十分化を見極める

>・信頼できるベンダは、自社内のリスクも含めて、ユーザーと共有する

>・要件の変更や追加をただ承諾するベンダにはプロジェクト管理義務違反の恐れがある

>・ベンダの示すリスクをまずは傾聴する

>##社内の協力を得るためのポイント

>・システム担当者は、往々にしてエンドユーザーの協力が得られずに孤立する

>・エンドユーザーにヒアリングをするときには、最低限の業務知識を得ておくこと

>・難解なIT専門用語を使わない

>・相手が忙しい中、時間を割いてくれていることに感謝する

>・システム担当者が他部門と調整するときは、その上司がフォローと支援をする

>・エンドユーザーの協力を得るには、システム開発の意義や目的について、経営トップからのメッセージングを繰り返す

>・経営陣は、システム開発も社員全員の本業であるという意識付けと仕組みの改革をすること


>##プロジェクトのリスクを的確に把握するポイント

>・ベンダにリスクを開示させるために、発注者側は真摯に聞く姿勢を忘れない

>・ベンダのリスクもプロジェクトのリスクと同じように、発注者側が知るべきことと認識する

>・ベンダのリスクは発注者側から引っ張り出す

>・定量的なプロジェクト状況やスキル評価、工数の妥当性のほか、プロジェクトに合わせて設定した評価軸でベンダのリスクを評価する


>##ベンダとコミュニケーションのキモ

>・期限までに要件を決めきれないことは日常茶飯事

>・要件定義工程完了前に「今後どうすべきか？」を改めて話し合い、チェックポイント会議を開く

>・ベンダの質問に遠慮は不要、技術でも業務でもどんどん聞くべき。そうすることで、ベンダ側の知識が醸成されることもある。

>・たとえパッケージソフトを使うときでも、どうしてもこだわりたい自社の長所は捨てずに入れ込む

>・発注者とベンダは、お互いに「自分たちがのほうが損している」と思う程度がちょうどいい


>##セキュリティ被害を最小限に抑えるポイント

>・機密情報を扱うシステムでは、漏洩時の影響を踏まえてトリアージを行い、重大度に合わせた対策を実行できるように準備しておく

>・情報漏えい時の見舞金や補償金の相場は500円から5000円程度といわれる

>・運用担当者にモチベーションを維持してもらうためには、必要な待遇改善を検討すべきだし、キャリアパスも定義する必要がある

>・情報漏えい時には、そのシステム自体を捨てる覚悟も必要で、たとえ良いシステムであっても、それに固執すると、企業の信用を損ねたり、再発を起こす可能性もある


ざっ、とこんな感じです。

そもそも、ユーザーはベンダからみればバカで無知ばっかりなんだから、PMが手の中で転がしてあげないとダメですよ。

お互いが相手の気持ちになって、コミュニケーションをとれる平和な世界がきますように・・・