OmniAICreator/Qiita-1.07M huggingface dataset:
[備忘録]Wagbyが起動しない 　XAMPP(のTOMCAT) が起動しない

## WagbyDesignerが起動しない
WagbyDesigner が起動しない理由の一つに環境変数で、CATALINA_HOMEが**設定されていると動かない**とある。
>環境変数 CATALINA_HOME または TOMCAT_HOME が設定されていると起動が行えないことがあります。この環境変数を削除してください。


https://wagby.com/faq7/index.html#tutorial

## XAMPP のTOMCATが起動しない
TOMCATのStartボタンを押すと下記のエラーが表示され、起動できない。
>10:25:31 AM  [Tomcat] 	Attempting to start Tomcat app...
10:25:33 AM  [Tomcat] 	Tomcat Started/Stopped with errors, return code: 1
10:25:33 AM  [Tomcat] 	Make sure you have Java JDK or JRE installed and the required ports are free
10:25:33 AM  [Tomcat] 	Check the "/xampp/tomcat/logs" folder for more information

![TOMCATのStartボタン押下](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559813/66af4c62-de5f-bd94-044a-93757d640911.png)

理由の一つに環境変数で、CATALINA_HOMEが**設定されていないと動かない**とある。
https://stackoverflow.com/questions/34069038/trying-to-get-tomcat-running-with-xampp


## 問題点
Wagbyは環境変数があると動かないし、XAMPPは環境変数がないと動かないので、いちいち環境変数を設定しなければならない。

## とりあえずの解決策
XAMPP側のcatalina_start.batを直接たたくと下記のエラーになるので、
>  C:\xampp\tomcat>call "C:\xampp\tomcat\bin\setclasspath.bat" run
  The JRE_HOME environment variable is not defined correctly
  This environment variable is needed to run this program

JRE_HOME を設定してから呼び出してあげるbatを作る(かcatalina_start.batを編集する)。

```my_catalina_start.bat
set "JRE_HOME=C:\Program Files\Java\jre1.8.0_251"
call .\catalina_start.bat
```

これでこのバッチをたたけばXAMPPで利用しているTOMCATが起動できるようになった。
(XAMPPのStartからは起動できないけど。)

TOMCAT停止も同じくbatを用意してあげる。

```my_catalina_stop.bat
set "JRE_HOME=C:\Program Files\Java\jre1.8.0_251"
call .\catalina_stop.bat
```
複雑な内包表記やreduceを読みやすく書くためのPythonライブラリを作った

[複雑な内包表記を読みやすく書くためのTips](https://qiita.com/ukyo-su/items/3331c084e32738bf42f6)みたいな記事を前に書いたが、それを元にxcompというライブラリを作った。[Github](https://github.com/ukyo-su/xcomp)で公開中。

以下が基本的な目標。

* 通常のfor文の語順で、
* インデントも入れつつ、
* 状態変化なしで
* コレクションを初期化する

## インストール

```bash
pip install git+git://github.com/ukyo-su/xcomp@master
```

## comp(collector)

```python
for xcomp import comp

# a = [i for i in range(5)]の代わりに
@comp(list)
def a():
    for i in range(5):
        yield i

# a == [0, 1, 2, 3, 4]

# 和も取れる。dictとかsetも可能
@comp(sum)
def a():
    for i in range(5):
        yield i

# a == 10

# 複雑な内包も読みやすく書ける
@comp(list)
def fizz_buzz():
    for i in range(30):
        if i % 15 == 0:
            yield "Fizz Buzz"
        elif i % 3 == 0:
            yield "Fizz"
        elif i % 5 == 0:
            yield "Buzz"
        else:
            yield i
```

## multi_comp(*collectors)
一回のループで複数のコレクションを作りたい場合。

```python
from xcomp import multi_comp

data = [(0, 1), (2, 3)]

@multi_comp(list, list)
def a():
    for i, j in data:
        yield i, j

a_i, a_j = a

# a_i == [0, 2]
# a_j == [1, 3]
```

## reduce_comp(init, for_=None, for_nest=(), result=lambda x: x)

functools.reduceを少し読みやすく書くためのデコレータ。
Racketの[for/fold](https://docs.racket-lang.org/reference/for.html#%28form._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._for%2Ffold%29%29)が元ネタ。

```python
from xcomp import reduce_comp

# reduce(lambda sum_, i: sum_ + i, range(5), 0)
@reduce_comp(0, for_=range(5))
def a(sum_, i):
    return sum_ + i

# a == 10

# ネストしたforもOK
@reduce_comp([], for_nest=(range(3), range(2)))
def a(acc, i, j):
    return [*acc, (i, j)]

# a == [(0, 0), (0, 1), (1, 0), (1, 1), (2, 0), (2, 1)]

# 最後に一手間加える場合
@reduce_comp([], for_=range(5),
             result=lambda x: list(reversed(x)))
def a(acc, i):
    return [*acc, i]

# a == [4, 3, 2, 1, 0]

# break, continueも対応
@reduce_comp(0, for_=range(100))
def a(acc, i):
    if i > 5:
        raise BreakReduce
    return acc + 1

# a == 6

@reduce_comp(0, for_=range(10))
def a(acc, i):
    if i < 5:
        raise ContinueReduce
    return acc + i

# a == 35
```

（本当に読みやすいのか……？）

## multi_reduce_comp(*inits, for_=None, for_nest=(), result=lambda *args: args)

累積していく変数が複数ある場合の`reduce_comp`。Racketの`for/fold`にはこっちが近い。
 
```python
@multi_reduce_comp(0, [],
                   for_=range(5))
def a(sum_, rev_list, i):
    return sum_ + i, [i, *rev_list]

a_sum, a_rev_list = a

# a_sum == 10
# a_rev_list == [4, 3, 2, 1, 0]

@multi_reduce_comp([], set(),
                   for_=[0, 1, 1, 2, 3, 4, 4, 4],
                   result=lambda acc, seen: list(reversed(acc)))
def a(acc, seen, i):
    if i in seen:
        return acc, seen
    else:
        return [i, *acc], {*seen, i}

# a == [0, 1, 2, 3, 4]
```

## delay_arg(func, *args, **kwargs)

一つ目の引数を最後に回すための高階関数。`delay_arg(f, *args, **kwargs)(a)`は`f(a, *args, **kwargs)`になる。

`map`, `filter`, `reduce`なんかをデコレータとして運用可能。

```python
@list
@delay_arg(map, range(5))
def a(i):
    return i * 2

# a == [0, 2, 4, 6, 8]
```
AWS認定テスト合格の秘訣　初心者向け

#初めに
これからAWS認定テストを受ける方へ
アソシエイトレベルであれば絶対に合格できます。
当記事では勉強法とレベル感についてまとめていきます。

##どんな試験なの

レベル感は大体以下の感じです。

###例１
**ぶりの照り焼き定食があります。あなたは日本人です。今後はコスト削減のためにリサイクル可能な資源を使っていきたいと思っています。以下の道具の中で一番意向に沿うものなんでしょうか？**
       
* プラスチックの使い捨てお箸
* フォーク
* 木のMyお箸
* ナイフ

**答え**
木のMyお箸
理由：日本食にはお箸で食事するほうが食事する上でのオーバーヘッドが少なく、木を選択したことで使い終わったら洗って再度使用することコストの削減ができるから

大体各試験は上記のような形で出題されます。
明らかに違う答えが二種類。似ているが違う答えが一種類の四種類です。また以下の問題もあります。

###例２
 **会社のイベントでカレーを作ることになりました。社員全員分のカレーを作るので大量の材料がいります。あなたは調理担当です。効率よくカレーを作るうえで必要な作業はなんでしょうか？選択肢から二つ選びなさい。**

* カレーを一人前ずつ作る。それを社員数全員分繰り返す
* カレーを全員分一気に作る。
* 調理し終わったカレーは小分けにして保存がきくように冷凍する
* 調理し終わったカレーはいつでも食べれるように常にホットスタンバイしておく
* 事前にカレーを食べい人の人数を把握してから彼を人数分一気に調理する。

上記のような問題もあります。だいたい五択で二つ選びます。

あと問題文は英語を翻訳しているので以下のような問題文となることにも注意です。

###例３
**赤いケースに入っているケーブルをコネクタに接続する。あなたは何をすればよいか？**

* ケーブルを赤いケースから取り出し接続する
* 赤いケーブルをケースから取り出し接続する

これは一例ですが、翻訳された日本語の修飾語が適切でないので問題文が読みづらく意味が分かりにくいです。この状態でAWS専門用語(いわゆるサービス名やコンポーネント)が使われているともはや意味不明に陥りますので勉強は必要です。しかし、勉強としては各サービスの概要またはコンポーネントレベルまでの理解で事足ります。

##勉強法
* ホワイトペーパーの概要レベルで理解をとどめておく
    * 超詳細(ホワイトペーパー読破)まで必要ありません。出題のレベルが上記のような感じなので合格には無駄です。
* udemyの試験対策問題を購入
    * これはやっておいたほうが良いでしょう。答え合わせができるため必須となります。

###もう何がなんだがわからないよ...の人は
そもそも勉強の仕方がわからいという方は僕の[学習記事](https://qiita.com/drafts/7e2d09118ecf43ded57c)も参考になると思います。
実際に試験を受ける前の学習メモを残してあります。

* わからない用語はネストする形で意味を理解して整理していくことで、迷子にならずに元の問題へ戻ることができます。
    * ネスト
        * あるものの中に、それと同じ形や種類の（一回り小さい）ものが入っている状態や構造のこと。
            * http://e-words.jp/w/%E3%83%8D%E3%82%B9%E3%83%88.html

ネストすることで見返したときに何がわからなかったか・どのような思考順序で調べ物をしたかがわかります。またURLも貼っておくとなおよいでしょう。

##結論
こちらの記事でも紹介した通り[AWSの資格](https://qiita.com/fjisdahgaiuerua/items/c754f12a1157d3bf7f00)は必須なので頑張りましょう！
APIGateway + Lambda + Comprehend でサーバーレスなWeb API を作成する

#1.Lambda#
実行ロールにデフォルトの「管理ポリシー」に加えて、『ComprehendFullAccess』の「AWS 管理ポリシー」を付与する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/41215cca-2a57-0a08-8946-fc5a8d7bb264.png)

ランタイムは「python3.8」で、関数コードは以下のとおり作成。



```python:Comprehendfunction
import json
import boto3

comprehend = boto3.client('comprehend')

def lambda_handler(event, context):
    
    input_text = "とても美味しいです！"

    response = comprehend.detect_sentiment(
        Text='input_text',
        LanguageCode='ja'
    )    
    sentiment_score = response.get('SentimentScore')
    
    return {
        'statusCode': 200,
        'body': json.dumps({
            'sentiment_score': sentiment_score
        })
    }
```


テスト

```
Response:
{
  "statusCode": 200,
  "body": "{\"sentiment_score\": {\"Positive\": 0.0013845671201124787, \"Negative\": 0.00038266877527348697, \"Neutral\": 0.9982283711433411, \"Mixed\": 4.437819825398037e-06}}"
}

Request ID:
"f916f087-d681-4d0d-b533-3a2b734ef9f4"

Function Logs:
START RequestId: f916f087-d681-4d0d-b533-3a2b734ef9f4 Version: $LATEST
```

#2.comprehend#

※[comprehend] を参考にへLambda functionを編集する。 (https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/comprehend.html#Comprehend.Client.detect_sentiment)

```python:Comprehendfunction
import json
import boto3

comprehend = boto3.client('comprehend')

def lambda_handler(event, context):
    
    input_text = event['queryStringParameters']['input_text']

    response = comprehend.detect_sentiment(
        Text='input_text',
        LanguageCode='ja'
    )    
    sentiment_score = response.get('SentimentScore')
    
    return {
        'statusCode': 200,
        'body': json.dumps({
            'sentiment_score': sentiment_score
        })
    }
```

#3.APIGateway#

APIGatewayを作成し、デプロイし、動作を確認する。

![スクリーンショット 2020-04-28 18.43.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/f73b0fc8-fc29-8300-4a52-473e4d14141b.png)

(例)
https://**********.execute-api.ap-northeast-1.amazonaws.com/dev/comprehend/?input_text=最高です

以下の通り結果が表示される。

```
{"sentiment_score": {"Positive": 0.0013845671201124787, "Negative": 0.00038266877527348697, "Neutral": 0.9982283711433411, "Mixed": 4.437819825398037e-06}}
```
npm install でModule not found: Error: Can't resolve～のエラーが起こった時

Vue.jsで作成している画面をWEB上で表示させるまでに、エラーが発生したので備忘録を。
npmをよくわかっていないまま、エラーに遭遇し、いろいろと試して、失敗した経緯を残します。
いろいろ試したので、この中のどれかに当てはまる人は結構いるのではないかと・・・

##起こったこと
コードを渡されたので適当な配下において、該当のフォルダに移動後、`npm install`→`npm run serve`で開くはずといわれ、そのとおりにするも開かない。
WEB画面で`http://localhost:8080`にアクセスするも、「Module not found: Error: Can't resolve～」という文字が表示され、ファイルがないから表示できないよ！と注意された。

##その1:　webpack-dev-server.jsに目をつける
まずは、画面に表示されてるままにググると、どうやら、`webpack-dev-server.js`ファイルで書き換えが必要らしいとの情報を見つけ、言われるがまま書き換えてみる。
[【Webpackを使う時は、resolve.modulesの設定に気を付けよう。(特にModule not found: Error: Can't resolve～が表示された時)】]
(https://qiita.com/toris-birds/items/c0874a66865f7e3a09ee)

・・・が、なにも変わらない。
エラー表示も変わらないし、なんなら修正したコードがあっているのかも若干怪しかったが、効果なしと判断。

##その2:　webpack.config.jsに目をつける
次に、それっぽい記事2つめの対応を行う。
[【Module not found: Error: Can't resolve '〇〇'と表示された場合の解決策】]
(https://qiita.com/Dragon-taro/items/73fae72c037363b9f2b0)

・・・も、そもそも`webpack.config.js`の中にmodule.exportsと書かれている文言がないな～と思ってみているとそもそもエラーログの内容が全然違うということに気づき断念（←気づくの遅い）

まだだ、次だ次。
いくつかの質問箱を覗くも、全て自分とは状況が違うことに気づく。
なにを見て判断をしたらいいのか悩んでいると、そういえばpower shellで`npm install`を実行した時点で、エラーでてたよね？と思い出す。

##その3:　npm installした時のコマンドをみてみる
power shellに戻って、やはり`npm install`した後、赤い字で警告されていることに気づく。

```
found 30 vulnerabilities (28 low, 2 moderate)
  run `npm audit fix` to fix them, or `npm audit` for details

和訳：30件の脆弱性が見つかりました（28件の低レベル、2件の中レベル
  npm audit fix` を実行して修正するか、`npm audit` を実行して詳細を確認します。）
```
なるほど、これちゃんとinstallできてないじゃんと確信し、found 30 vulnerabilitiesで検索すると、いい記事を発見。
>概要記事
2018年4月にnpm v6.0.0がリリースされ、セキュリティチェックができるコマンドnpm auditが追加されました。
さらに2018年5月にはnpm6.1.0がリリースされ、セキュリティチェックに追加して脆弱性のある箇所を自動修正してくれるサブコマンドnpm audit fixが追加されました。
この機能は非常に便利で、node_modulesに存在する大抵の脆弱性を自動修正してくれます。しかし、パッケージの依存関係によって自動で直しきれない脆弱性が残ってしまうことがあり、現時点ではこれを手動で解消しなくてはいけません。その方法を共有します。
[【脆弱性の警告を受けたnpmパッケージの依存関係を力技で直す】]
(https://qiita.com/hibikikudo/items/0af352acac85fce28ec2)

結論を先に述べると、こちらで直りました。
私の場合は、自動修正だけで直ったので、`npm audit fix`だけでいけた。
そして、power shellで確認すると、すべて修正されたことが表示された。

```
fixed 30 of 30 vulnerabilities in 25743 scanned packages
和訳：
25743 個のスキャン済みパッケージの 30 個中 30 個の脆弱性を修正
```

そして、もう一度`npm run serve`を実行すると、無事にコンパイルされた！

```
vue-cli-service serve
 INFO  Starting development server...
98% after emitting
 DONE  Compiled successfully in 50675ms 

和訳：
vue-cli-serviceのサービスを提供します。
 INFO 開発サーバーの起動...
エミット後98%になりました。
 DONE 50675msで正常にコンパイルされました。 
```

#### 反省点
初学者が注意すべき点として、ググった解決方法が100%自分に当てはまることはほぼないので、まずはエラーをきちんと読むという大切さに改めて気づきました。意識していたつもりが、実際にはできてなかったということですね。もっとはやくエラーを読み込んでいたら、5分で解決できたじゃん。と反省しました。
スキマ時間趣味開発に役立ったツール5選

# スキマ時間趣味開発を効率化したい

開発って集中力がいりますし、集中して開発するのって楽しいですよね。
自分も夜手を動かし始めたらノっちゃって気づいたら朝だったみたいなのよくありました。
でも社会人になって、結婚して、子供が出来て、色んな事を並行してこなさなくなってくると優先度の比較的低い趣味の開発はどうしてもそのスキマにやるしかないですよね。
自分が楽しく能率的にスキマ時間開発をしたいと思い試行錯誤した中で気に入ったツールを紹介します！

# アイデア出し、記録💡

アイデアってふとした瞬間に出てくるのですが、ほっとくとすぐ忘れちゃうんですよね。
普段からすぐ取り出せるアイデアを溜めておけば、急に1時間暇になった時とかに引き出しやすいです。

## GoogleKeep

最初は手帳などにまとめていたのですが、持ち歩くのが面倒くさかったので、常に携帯しているスマホで記録するのが最も楽だと思い今はGoogleKeepに落ち着いています。

個人的には軽量なのに入力機能が優秀でアイデアメモツールとしては便利だと思っています。
以下気に入ってる所

- 軽量
- 音声入力が優秀
- 画像からの文字起こしが優秀
- 手描きできる
- ラベリングや検索機能など、整理整頓に力を入れなくてもいい感じに整理できる

記事の分類や記事同士を関連付ける機能は弱いので、本当にメモ用のツールです。
重厚な分析や整理には向かないので、そのフェーズは他のツールにパスした方がいいと思います。

自分は軽量なアイデアメモや気になった事を何でもすぐ入力して、5分とかのスキマ時間にラベリングしたり見返したりしてます。

# 整理整頓📑
## Notion
https://www.notion.so/

GoogleKeepと比較してリッチなメモツールです。
似たようなレベル感のツールは色々あるので、好みで何でもいいと思います。
自分はEvernoteを使っていましたが重くて検索機能が微妙で乗り換えました。

Notionで気に入ってる所
- GoogleChrome拡張でページクリップが出来る
- 整理の自由度が高い

自分はGoogleKeepからもうちょっと深堀りしたくなったらNotion上で調査結果等をまとめていきます。
個人的にはページクリップが重要だと思っていて、とりあえずクリップしておけばNotionの全文検索で見つけられるので参考ページはURLじゃなくてクリップ化して記録していきます。
「あれ？前参考になる記事見つけたのになんて検索したっけ？」
みたいに時間を消費せずに済むようになりました。

スキマ時間開発では「あれ、前どこまでやったっけ？」ってなることが多いので、作業ログもこちらで残しています。
あんまりきっちり分類するのは苦手だしそれに時間をかけたくなくて、Notionの自由度が高いのに直感的な分類方針は気に入っています。

## Trello
https://trello.com/ja

ある程度やることが具体的になったらTODOリストに格納しておきます。
個人趣味開発ならTrelloでラフに管理すればいい気がします。

自分はTodayリストにその日やるタスクを入れておいて、スキマ時間にそれを見ながら消化していきます。
こちらもGoogleChrome拡張でページをそのままカードにする機能が便利だったりします。
読みたい記事をクリップしてReadItLater的に使ったり、GithubのIssueのページをそのままカードにしたりしてます。

適当にリストを作ってカード入れていって、要らなくなったら消すとか、ダッシュボード的に使えるのもいいですね。

# 実行💻

実行段階になったらタスクに集中したいですよね。
スキマが1時間だったりすると集中出来るか否かでだいぶ進捗が変わると思います。

## Workona

https://workona.com/

ブラウザのタブをグルーピングするツールです。
タブの復元もグループ単位で行われるので、たくさんタブを開いてもぐちゃぐちゃにならずに済みます。
Bookmarkのようにグループにページを保存することも出来ます。
例えば複数のアプリを並行して開発している時とか、アプリ毎にグループを作成してGithubリポジトリをそれぞれに保存すると便利です。

個人的には滅茶苦茶便利で見つけた時衝撃を受けたんですが、あまり使ってる人いない気がします…。
開発用のグループを作ってタブを開きまくって中断しても、次回グループを開いた時にタブを復元出来て便利です。
作業の間が空くスキマ時間開発では、タブを復元して作業をスムーズに再開出来ることは重要です。



## マリナラ：Pomodoro® アシスタント
https://chrome.google.com/webstore/detail/marinara-pomodoro%C2%AE-assist/lojgmehidjdhhbmpjfamhpkpodfcodef

GoogleChrome拡張のシンプルなポモドーロタイマーです。
ポモドーロタイマーはポモドーロテクニックを実践するためのタイマーです。
ツールというよりポモドーロテクニックの効能がメインだと思われるのでそちらを書いていきます。

### ポモドーロ・テクニック🍅とは

タスク消化のための時間管理術のひとつです。
どんなものか先に説明すると

- 一定時間（25分等）集中してタスク
- 一定時間（5分等）休憩
- 上記を1サイクルとして数回（2〜4回）繰り返す
- 15〜30分の長めの休憩

ぶっちゃけ方法論だけが独り歩きして目的や効能が人によって違うような印象があります。
より厳密なものは下記のページが参考になります。
https://next-sapiens.net/study/focus/pomodoro-technique/

以下の点がスキマ時間開発に向いていると思います。

#### ポモドーロ開始が集中開始の合図・ルーチンになる
自分は上記アプリで休憩が終わってフォーカスが開始する時に「チーン！」って鳴らしてブラウザが切り替わるようにしてます。
「よし！やるか！」って気分になりますよね。
集中状態を作るのって難しいと思いますが、人間って習慣的な生き物なので「AがあったらBする」っていうのを長期的に繰り返していれば、再現性出てくると勝手に思ってます。
あとは作業を開始すると集中があとから付いてくるっていう話も聞きますね。
科学的根拠は自分にはわかりませんが、3ヶ月やった感じ、上記のことは正しい体感あります。

#### - 休憩をこまめにとることで、作業ログを残す

5分休憩すると「何やってたっけ？」ってなるので、必然的に作業のログを簡単に残すようになりました。
作業ログを残せば時間をおいてタスクを再開しやすくなりますし、それがスキマ時間の開発には重要だと思います。


# おわりに

いかがでしたでしょうか？
忙しい皆さんが趣味で楽しく開発出来る力になれば幸いです。
自分の会社がお手本にすべきセキュリティフレームワークはどれか

いつも忘れないように、コンセプトから。

###コンセプト
・お金かけてまでやりたくないのでほぼ無料でAWSを勉強する
　→ちょっとしたサービスを起動すると結構高額になりやすい。
・高いレベルのセキュリティ確保を目指す
　→アカウントを不正に使われるととんでもない額を請求されるので防ぐ

今回は何かを実装する訳ではないのでお金はかかりません。セキュリティを考える上で、いろいろなフレームワークがあるのですが、その位置づけの整理をしてみようと思います。有名だからやってみました、というのもイマイチですからね。。。よく話題になるフレームワークを比較してみます。

比較するフレームワークは以下です。
- NIST Cybersecurity Framework（NIST CSF）
- ISO 27002
- NIST SP800-53
- NIST Secure Controls Framework（SCF）
NISTはアメリカ国立標準技術研究所で、この辺りにおいてはデファクトスタンダードになっていると思います。といっても、NISTの中にもいろいろ分類があります。調べて初めて知りました。ISOは皆さんご存じなので問題無いでしょう。

概要をまとめてみました。以下のような感じになります。

| 評価項目 | CSF          | ISO27002     | SP800-53     | SCF          |
|:--------:|:-------------|:-------------|:-------------|:-------------|
|カバレッジ|緩やか|適度|厳しめ|厳格|
| 概要     |サイバーセキュリティ問題の内部および外部のコミュニケーションのための共通言語を作成|国際的に認められたサイバーセキュリティフレームワークであり、多くの要件（PCI DSS、HIPAAなど）に対応| 連邦政府の情報システムと組織のセキュリティとプライバシーをコントロールするためのフレームワーク |メタフレームワーク(フレームワークのフレームワーク）|
| 使用目的 | 開発チーム、セキュリティ、法務などの共通言語を定義。欠点は、NIST 800-171、PCI DSS、HIPAAなどの一般的なコンプライアンス要件と互換性がないこと | 多国籍企業や米国の連邦規制に特に準拠する必要のない企業で多く利用される。SP800-53よりも複雑さが軽減され、実装が容易 | 連邦情報セキュリティ管理法（FISMA）と国防総省情報保証リスク管理フレームワーク（DIARMF）はこのフレームワークに依存しているため、米国連邦政府との取引には必要な要件。金融、医療での適合事例も多い |内部統制にフォーカスされる。ビジネスをサポートし好ましくないイベントが防止、検出、修正されることを合理的に保証するように設計されたサイバーセキュリティとプライバシー関連のポリシー、標準、手順、およびその他のプロセスの集合体。|
| 補足 | スタートアップまたは規制のない企業向け。複雑なトピックを簡単に報告できるため、セキュリティを経営者に報告するためのレポートツールとしてよく使用される | 有料(http://www.iso.org/iso/home/store.htm)  | 無償提供|無償提供|


###結局何を使えばいいの？

調べてみた感じでは、一般企業であればCSFを参考にすれば十分だと思います。グローバル展開している会社や金融系の会社はNIST SP800-53を参考にするのが良いと思います。ISO27002でも良いのかもしれませんが、アメリカでの適合性を考えると、はじめからSP800-53を意識しておいたほうが賢明だと思います。アメリカ抜きでグローバル展開するということも事実上無いでしょうから。

###その他の参考

- [AWSのコンプライアンスプログラム](https://aws.amazon.com/jp/compliance/programs/)
- [AWSのコンプライアンススコープ](https://aws.amazon.com/jp/compliance/services-in-scope/)
- [AWS ATLAS](https://www.atlas.aws/)
ArduinoだけでOLED SSD1331に画像を表示する方法

#初のフルカラーディスプレイ
アマゾンで「HiLetgo 0.95インチ SPI OLEDディスプレイモジュールフルカラー65KカラーSSD1331 7ピンArduinoに対応」を購入したので、画像を表示させてみる。

##実行環境
・Arduino UNO マルツ版
・0.95インチ OLEDディスプレイ　SSD1331

**ライブラリ**
・Adafruit_GFX.h
・Adafruit_SSD1331.h
・SPI.h

##Arduinoに接続
###ピンの接続

|Arduino|SSD1331|
|:-----:|:-----:|
| 5V    | VCC   |
| GND   | GND   |
| 8     | DC    |
| 9     | RES   |
| 10    | CS    |
| 11    | SDA   |
| 13    | SCL   |

##画像の用意
画像の表示には、画像を「16ビットの符号なし整数型」に変換する必要がある。
変換のために、「lcd-image-converter」を使用した。
■設定
Optionsタブ→Conversion内
Preset:　Color R5G6B5
Prepare→　Type:Color,Main Scan Direction:Top to Bottom
Image→　Block type:16Bit
に設定した。
画像は事前に「96×64ピクセル」に変換しておく。
書き出すと96×64個の16bitデータが得られるので、それを画像データの配列に代入する。

##プログラム
```C
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1331.h>
#include <SPI.h>

#define sclk 13
#define mosi 11
#define cs   10
#define rst  9
#define dc   8
#define  BLACK 0x0000

//画像データ
const uint16_t Img_data [] PROGMEM = {
    0x0000, 0x0000,...,
};

Adafruit_SSD1331 display = Adafruit_SSD1331(&SPI, cs, dc, rst);

void setup() {
  display.begin();
  display.fillScreen(BLACK);
  display.drawRGBBitmap(0, 0,Img_data, 96, 64);
//display.drawRGBBitmap(最初のx座標,y座標,画像配列名,画像の幅,画像の高さ)
}

void loop() {
}

```

##結果
![DSC01227.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613597/1742bd7a-f14c-3d34-50e1-56a0a98a47ba.jpeg)
試しにドクターイエローの画像を表示させてみた。画像の変換にとても苦戦したが、思っていたよりも簡単に表示することができた。しかしArduinoの容量不足で画像を切り替えたりできないのが難点。SDカードモジュールを使えば解決できるそうだ。

##参考文献
[Arduinoでカラーディスプレイの制御](https://muratblog.com/oledarduinoiti)
[小型カラー液晶SSD1331とAdafruit GFX ライブラリを使用してbitmapを表示する](https://qiita.com/ELIXIR/items/cd634aff3a1b45398cf7)
[OLED Displays: A Beginner’s Guide to Display Text, Image & Animation Using Arduino](https://electropeak.com/learn/the-beginners-guide-to-display-text-image-animation-on-oled-display-by-arduino/)
TypeScript の http クライアントの使い方 (Post)

## ライブラリーのインストール

```bash
sudo npm install -g axios
```

## プログラム

```ts:http_post.ts
// ---------------------------------------------------------------
//	http_post.ts
//
//					Feb/28/2022
//
// ---------------------------------------------------------------
const axios = require('axios')

console.log ("*** 開始 ***")

var args = {
	data: { user: "jiro", password: "123456" },
	headers: { "Content-Type": "application/json" }
}
 
axios.post("https://httpbin.org/post", args)
	.then(function (response: any) {
		console.log(response.data)
		})
	.catch(function (error: any) {
		console.log(error)
  		})
	.then(function () {
		console.log ("*** 終了 ***")
		})

// ---------------------------------------------------------------
```

実行結果

```text
$ bun run http_post.ts 
*** 開始 ***
{
  args: {},
  data: "{\"data\":{\"user\":\"jiro\",\"password\":\"123456\"},\"headers\":{\"Content-Type\":\"application/json\"}}",
  files: {},
  form: {},
  headers: {
    Accept: "application/json, text/plain, */*",
    "Accept-Encoding": "gzip, compress, deflate, br",
    "Content-Length": "90",
    "Content-Type": "application/json",
    Host: "httpbin.org",
    "User-Agent": "axios/1.7.2",
    "X-Amzn-Trace-Id": "Root=1-667a7e5e-594431ab405e3cc169470bec",
  },
  json: {
    data: {
      password: "123456",
      user: "jiro",
    },
    headers: {
      "Content-Type": "application/json",
    },
  },
  origin: "219.126.138.166",
  url: "https://httpbin.org/post",
}
*** 終了 ***
```

次のバージョンで確認しました。

```text
$ node --version
v22.3.0

$ bun --version
1.1.16
```

## エラー

node v20.2.0 では次のエラーが出ます。

```text
Error [ERR_SOCKET_CONNECTION_TIMEOUT]: Socket connection timeout
```

解決策は、

```bash
# export NODE_PATH=/usr/lib/node_modules
export NODE_PATH=/usr/local/lib/node_modules
NODE_OPTIONS="--no-network-family-autoselection"
#
ts-node http_post.ts
```

参考ページ
[code: 'ERR_INTERNAL_ASSERTION' #47644](https://github.com/nodejs/node/issues/47644)
Arduinoことはじめ

# Aduinoことはじめ

友人がこれからArduinoを触ってみようという話だったので、現時点(2020.5.2)の環境構築手順をまとめてみる。
同じようにこれから始めてみようという方の力になれば幸い。

ざっと書き出しただけなので、何か間違えなどあれば、随時修正します。
まずは友人に実験台になってもらう。


## 準備

Arduinoアプリでの開発はコード補完とかテーマとか色々使いにくいので、今回はVSCodeを使って開発する環境を構築をしていく。
Arduinoアプリのみで開発する場合はArduinoのインストールと設定のみでOK。

### 必要なもの
| # | ソフト | 配布先 |
|:--|:-----|:---|
|1 | VScode |[公式](https://azure.microsoft.com/ja-jp/products/visual-studio-code/) |
|2 | Arduinoアプリ| [公式](https://www.arduino.cc/)|

## 手順

### VSCodeのダウンロード
[公式](https://azure.microsoft.com/ja-jp/products/visual-studio-code/) からVSCodeをダウンロードする。
`今すぐ無料でダウンロードする。`から、自分の環境に合わせてインストーラを選んでダウンロードする。
Microsoftアカウントへのログインは不要なはず。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558673/553f67be-8c56-6802-05fe-197fc2eebf69.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558673/16373c41-9434-890d-b9e2-c081a05d385b.png)

### VScodeのインストール
特に難しいところはないと思うので割愛

### Arduinoアプリのダウンロード
こちらも[公式](https://www.arduino.cc/)からダウンロードする。
ダウンロードページへはここから入る。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558673/f2a4df4b-5c2d-86b0-cf48-939a7937b928.png)

ダウンロードは好きなものを選んで。
と、言いたいところだが、WindowsApp版はフォルダの管理が面倒なのと、勝手にアップデートされる可能性があるのでオススメできない。
Windowsの人たちはInstaller版かZIP版を選びましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558673/c6fadd43-8cbd-b176-0aa6-91a5f86fd1fe.png)

### Arduinoアプリのインストール
これも難しいところないと思うので割愛。
インストールフォルダを弄ることがたまにあるので、インストール先は忘れずに。
デフォルトのままか、Documentなど触りやすいところにするのがオススメ。

### VScodeにプラグインを入れる
以下のプラグインを入れる。

- Arduino :VSCodeからArudinoのコンパイルや書き込みをできるようにするアプリ
- C/C++   :C++のコード補完とか
　

プラグインのインストールをするには、左のテトリスみたいなアイコンから管理ペインを出して、上の検索窓から検索する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558673/df2bdba4-37d9-e860-0924-9f894fa91b53.png)

これと
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558673/b027a276-f34e-b033-6838-e3c158b9ec54.png)

これ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558673/cc013604-4499-f935-d413-6022ea6a8f08.png)

インストールするには緑のインストールボタンを押す。（下記SSはサンプル）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558673/286b302f-dc60-1400-24e8-318513738731.png)

### プラグインの設定
Arduinoの設定。
設定を開き、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558673/12e8b727-3757-cabf-ab02-cb0f1e52aa47.png)

拡張機能からArduinoを開く

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558673/ff22f7a1-36b6-7e5e-c3f3-0a7bab5e7c4b.png)

最低限必要な設定は、ちょっと下に行ったところのこれ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558673/ee0ba873-a2a1-f488-8869-5c13b5f42aee.png)
Arduinoのexeがあるフォルダを設定する。
さっきインストールしたフォルダ。

## 環境設定はこれでおわり。
環境設定はここまで。
なお、環境によって手順が微妙に違うこともあるので、この手順を信じ切らないことが大切。
何が起きても驚かない大きな心で臨むこと。

次回はプロジェクトを作成して書き込みを行うところまでを書こうと思う。
TypeScript の http クライアントの使い方 (Get)

## ライブラリーのインストール

```bash
sudo npm install -g axios
```

## プログラム

```ts:http_get.ts
// ---------------------------------------------------------------
//	http_get.ts
//
//					Feb/28/2022
//
// ---------------------------------------------------------------
console.log ("*** 開始 ***")
 
const axios = require('axios')

const url = "https://httpbin.org/get"
axios.get(url)
	.then(function (response: any) {
	console.log(response.data);
	})
	.catch(function (error: any) {
		console.log("*** error ***")
		console.log(error)
		})
	.then(function () {
		console.log ("*** 終了 ***")
		})

// ---------------------------------------------------------------
 
 ```

## 実行結果

```text
$ bun run http_get.ts 
*** 開始 ***
{
  args: {},
  headers: {
    Accept: "application/json, text/plain, */*",
    "Accept-Encoding": "gzip, compress, deflate, br",
    Host: "httpbin.org",
    "User-Agent": "axios/1.7.2",
    "X-Amzn-Trace-Id": "Root=1-667a7dd6-495b2de22c0dde0e150ff73f",
  },
  origin: "219.126.138.166",
  url: "https://httpbin.org/get",
}
*** 終了 ***

```

## 確認したバージョン

```text
$ node --version
v22.3.0

$ bun --version
1.1.16
```
IftttでQiitaのRSSをLINEへ通知する

# やること
iftttでqiitaの指定タグがついた新着記事をLINEで受け取って読むように設定しました。

# ifttt
> https://ifttt.com/
> トリガーとなるサービス　→　実行されるサービス　をつなげるWebサービス

`何かのサービスが実行されたら、何かのサービスを実行する。`このセットをiftttでは`アプレット`（旧名称レシピ）と言います。
早速目的のアプレットを作成したいと思います。

# アプレットの作成
##1 トリガーとなるサービスの設定
画面右上　Exploreをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342467/5511bd68-cb25-db07-803c-58222b75fdcb.png)


Createをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342467/2030c26e-1854-76d8-0956-94c891ef732d.png)



ifのところらへんをクリックします。
![2020-05-01_00h26_14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342467/7f84a42b-8ffa-00d4-1cc4-25e69f752837.png)


RSSと入力して検索して、RSS Feedがでてくるのでクリックします。
 
![2020-05-01_00h24_49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342467/c6e4d8ab-ef34-f665-4f44-e955ff00c3ef.png)


New feed itemをクリックします。
![2020-05-01_00h25_33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342467/5a21b6d7-53d3-ebdf-a72d-5a8b31522ae8.png)


取得するFeedのURLを入力します。
`https://qiita.com/tags/取得したいタグ/feed.atom`
例`https://qiita.com/tags/GoogleAppsScript/feed.atom`

![2020-05-01_00h25_59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342467/043c4f64-e2a9-7c68-0463-5a574be61e20.png)

##2 トリガー後実行されるサービスの設定 
Thatのところらへんをクリックします。
![2020-05-01_00h26_14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342467/7f84a42b-8ffa-00d4-1cc4-25e69f752837.png)


トリガ―が後に実行されるサービスを選択します。
今回はLINEを選択します。
![2020-05-01_00h26_25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342467/d473d5fe-908d-8885-d0c9-47c376409dac.png)

![2020-05-01_00h26_34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342467/488ca239-81c4-402d-6731-94acf24eed4f.png)

![2020-05-01_00h27_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342467/11eb2253-59f7-5415-d502-87fcf839153d.png)

Messageの中身、配信するトークルーム、Photo URLは適宜カスタマイズできます。Create Actionをクリックするとアプレットが作成されアクティブになります。これで完了です。
１年間学習記録をつけてみたら人生で一番勉強できた話

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/629814/a2c63d79-03c8-11b9-ffd7-265320c4b851.png)

2019年4月から1年間、学習記録をつけてみたところ、仕事を除いて1158時間の学習(※)をすることができました。僕が1年間でこれだけ学習出来たのは初めてで、実力も上がって非常にオススメなので、紹介したいと思います。

※ より正確には、アウトプットも含めた自分にとって価値ある行動

# 記録の付け方

テンプレートは[こちら](https://docs.google.com/spreadsheets/d/1fVH18Wq7O0q-2TpWUlJeHd0vDwUqn4qs8l65h_cK7Kg/edit#gid=2096305874)。
`ファイル → ダウンロード → Microsoft Excel`でダウンロード。
Googleスプレッドシートで開いてすぐに使えます。
セルに数字を入れると、対応する数字の色がつきます。

# オススメの使い方

### テーマ(1~10)にはできるだけ具体的な目標を入れる

「なぜこれをやるのか？」が明確になります。

### 自分の時間を使う価値があると思うものなら、どんなテーマでも良い

「10kg痩せる」「彼女を作る」「読書」など。

少しでも自分のために時間を使えているという実感を持つことが、充実感をもたらし、継続へとつながります。

# 実際使ってみてどうだったか？

2019年4月から1年間使ってみた記録をまとめました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/629814/1afd2047-8fae-5247-5c00-b3f2ae714107.png)

感じたメリットは以下の通りです。

### 自分の学習スタイルがわかる

朝型か夜型か、インプットとアウトプットのバランス、平日と休日どうしてるか、移動時間どうしてるか、など。

### 学習能力を改善できる

自分の学習スタイルがわかれば、自分に合ったスタイルを見つけやすくなります。

### スキル獲得計画を立てやすくなる

何をやれば、どの程度できるようになるか、イメージしやすくなり、思わずニヤけます。

※こちらの[動画](https://www.youtube.com/watch?v=KY5XOG6rTks)も参考になります。
休校中のHPの更新頻度が異常で、確認がめんどくさいのでLINEで通知してみた。

<img width="1440" alt="スクリーンショット 2020-05-02 12.33.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488939/d26eae26-86bc-6df8-0fc2-7bf5e8c405e2.png">
この記事は下記の [#GWアドベントカレンダー](https://gw-advent.9wick.com/calendars/2020/87) の 4日目の記事になります。

すごくなりたいがくせいぐるーぷ　( @inoue2002  ） | GWアドベントカレンダー

# はじめに
みなさん休校中はしっかり家でStayHomeしてますか？みんなで力を合わして一刻も早い収束を願いしましょう！
今日は、休校中の学校からの連絡が**１日に何件も**あって、いつ更新されるかわかりません。

定期的にHPを確認→更新されてた/されてなかった

みたいな事があって非常に無駄な時間を費やしていたので無くしたいと考えました。

メールの一斉配信もありますが、なぜか来ない、配信されているやつといないやつがあるみたい。なので確実に更新情報を取得したい。

#構成
今回はRSS(Rich Site Summary, RDF Site Summary, Really Simple Syndication)というウェブサイトの更新情報を配信するための文書フォーマットを使いました。しかし、うちの学校のHPはRSSに対応していなかったので[feed43](https://node2.feed43.com/)というサービスを利用し、自分で型を作り、それをIFTTTで定期的に確認しに行って、LINEで通知するといった感じです。

#参考にした記事
[RSS配信をしていないサイトでRSSフィードを独自に作る方法](https://www.y-shinno.com/rss-feed43/)
基本的にこちらのサイトに書かれているようにやるとできます。

#feed43使い方
サイトにいく
ターゲットのURLを入れる
抽出パターンを決める
それだけ。
完成したサイトが[こちら](https://node2.feed43.com/7337448223750032.xml)

#IFTTT(イフト)に連携する
[RSS Feedの連携ページ](https://ifttt.com/feed)に行き、右上のアイコンをクリックする、そしてcreateをクリック
<img width="1440" alt="スクリーンショット 2020-05-02 12.36.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488939/c8eee31e-a907-6da5-594a-23b46bf940d6.png">
お決まりのIFTTTのif This Then Thatが出てくるのでここをRSSとLINEで埋めるだけで完成
<img width="1440" alt="スクリーンショット 2020-05-02 12.37.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488939/1e32c084-c961-39a4-0f8b-f5dab3c3fe72.png">
New feed itemを選択
<img width="1440" alt="スクリーンショット 2020-05-02 12.37.43.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488939/3884272d-9fe9-7777-1a44-9f3345f741d3.png">

<img width="1440" alt="スクリーンショット 2020-05-02 12.41.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488939/4e4e095f-4b9e-ccd7-3fd8-53e4030970c0.png">
<img width="1440" alt="スクリーンショット 2020-05-02 12.41.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488939/a1ed1e0c-59d7-c7fb-6098-9ca87b5c746c.png">


#できたやつ
<img width="354" alt="スクリーンショット 2020-05-02 12.43.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488939/ca795477-7204-c62f-983f-3988f409e5ea.png">
無事こんな感じで通知してくれました。これでメールの一斉配信とかが迷惑メールボックスに入ってても見逃すことはない！！

#終わりに
うちの学校も更新頻度高いからなんとかしたいと思ってる皆さんはぜひやってみてね。無料ですぐできるよ。
Selenium Pythonでタブを切り替えながら実行する

# 概要

検索結果一覧を出しながら、違うタブで詳細ページを開きながらスクレイピングしたい場合があったので方法を備忘録的に記載しておきます。

## 方法

```python

from selenium import webdriver

# ChoromeDriver
driver = webdriver.Chrome(executable_path='chromedriver.exe')

# URLアクセス
driver.get('https://qiita.com/')

# 新しいタブを作成する
driver.execute_script("window.open()")

# 新しいタブに切り替える
driver.switch_to.window(driver.window_handles[1])

# 新しいタブでURLアクセス
driver.get('https://www.google.com')

#前のタブに切り替え
driver.switch_to.window(driver.window_handles[0])
```
Docker BuildでHash Mismatchが起きる時の対策

hash mismatchが起きる主な原因はパッケージインストールの前にapt updateをしてないからです。

apt updateしても起きる場合は緊急対策として次のようにすれば一応buildできるらしい。

```
FROM ubuntu:18.04

RUN printf "Acquire::http::Pipeline-Depth 0;\nAcquire::http::No-Cache true;\nAcquire::BrokenProxy true;" > /etc/apt/apt.conf.d/99fixbadproxy
RUN apt update
```
今後のAWSエンジニアの需要とアマゾンの戦略について

#初めに
AWSがよりインスタ映えするようになりましたね。
https://aws.amazon.com/jp/certification/certification-digital-badges/

AWSIQの発表にもある通り資格取得者を今後はかなり優遇していきそうです。
https://aws.amazon.com/jp/iq/
> AWS IQ では、オンデマンドのプロジェクト業務のために AWS 認定サードパーティーのエキスパートを探し出し、安全にコラボレーションし、支払いも済ませることができます。AWS IQ のエキスパートは、ウェブサイトのホスティング、データベースの移行、ネットワークのセットアップ、分析ソリューションの構築、AWS のサービスの使用の最適化など、幅広いプロジェクトのための実践的な支援を提供することで、より迅速なプロジェクトの開始および完了をサポートできます。

また、AWSIQのサービス概要からわかるように完全にWEB上で完結する人貸サービスを始めたことで、資格を持っていればIQで仕事を受けて生計を立てるフリーランスの方がこれから出現していきそうな気もします。こうなってくると人材派遣業を主にしているSES企業はより厳しい状況に陥りそうですね。

#結論
5冠目指しておくことは今後、技術スタック的にも営業的にも必須となりますしエンジニアの二極化がならぬ全員AWSからアプリまでできる一極化が主流になってくるのではないかと思いました。
リアルタイムJavaScript調査メモ

# やりたいこと
リアルタイムにカーソル位置や相手の状態を共有したい。
同時編集して協働作業したい。

# 特定のJSがあるのか？
昔からあるみたいだが、これ以上のものも見当たらない。

TogetherJS: Mozilla Labs
https://togetherjs.com/


おそらく
- 実現したいことがアプリケーションごとに違う
- JavaScript だけで完結しない
- レイヤーに分れている
ことから、「これでいける」というものが、なさそう。


## 組み合わせ
- Phoenix + AngularJS で Markdown 同時編集ツールを作ってみる
    - 2015年 https://qiita.com/mserizawa/items/496da21bba2330eeb09a


もっと事例あるはずだが、一旦終了
Gitでよく使うコマンドまとめ

Gitでよく使うコマンドをまとめました:blush:
備忘録:pencil:
addやcommitなど基本的な操作は省いています。

| コマンド                                                             | 意味                                               | 備考                                   |
|----------------------------------------------------------------------|----------------------------------------------------|----------------------------------------|
| git checkout  {ファイル名}                                           | 作業ツリーの変更を元に戻す                         | 相対パスでOK                           |
| git reset HEAD .                                                     | addを取り消す                                      | ワーキングディレクトリは影響を受けない |
| git reset --soft HEAD                                                | 直前のコミットを取り消す                           | 修正したソースはそのまま               |
| git reset --hard HEAD^2                                              | ２個のコミット削除                                 | 修正したソースは２個分戻る             |
| git push origin +{コミットID}:{ブランチ名}                           | pushしたコミットを取り消す                         |                                        |
| git checkout -b {ローカルのブランチ名} origin/{リモートのブランチ名} | リモートリポジトリのブランチをローカルに持ってくる | リモートブランチに切り替わる           |
| git checkout -b {新しいブランチ名}                                   | 新しいブランチを作成する                           | 新しいブランチに切り替わる             |
| git pull origin master                                               | リモートのmasterブランチの変更を取り込む           |                                        |
| git diff --cashed                                                    | ワーキングディレクトリとステージングの差分確認     |                                        |
| git rm {ファイル名}                                                  | ファイルの削除                                     | 削除したあとはそれをコミットする       |
| git log                                                              | 全コミットログ確認                                 |                                        |
| git log {ファイル名}                                                 | 特定のファイルのコミットログ確認                   |                                        |
| git init                                                             | ローカルリポジトリ作成                             | これでgit管理下に置かれます            |
| git remote add {リポジトリ名} {リモートリポジトリのURL}              | リモートリポジトリ作成                             |                                        |
| git remote                                                           | リモートリポジトリ一覧の表示                       |                                        |
| git branch -m {変更前ブランチ名} {新しいブランチ名}                  | ブランチ名の変更                                   |                                        |
| git branch -d {ブランチ名}                                           | ブランチを削除                                     | 削除できなかったら「-D」にする         |
| git diff {ファイル名}                                                | 指定のファイルの変更履歴を表示                     |                                        |
| git diff {コミットID} {コミットID} {ファイル名}                      | 指定のファイルの２コミット間の差分を表示           |                                        |
Lambda関数をまとめてバックアップする

# 概要
WebGUIは便利だけど、修正が一発勝負になっている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185989/3dfd803d-2375-4424-ec6c-2f194628e85a.png)

とりあえず、夜間にでもLambda関数をまとめてバックアップしときます
バックアップファイルをGitに突っ込んでおけば、後追いの履歴管理ができる。ないよりはマシ



# Lambda関数の構造
１つの関数に対して

① 関数詳細（関数名・説明・ロール・メモリサイズなどなど）
② ソースファイル群

これらは、[Lambda.getFunction](https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/Lambda.html#getFunction-property)で取得することができる

※ソースファイルは、getFunctionのレスポンスに含まれているURLでzipファイルがダウンロードできる

# まとめて取得する
+ [Lambda. listFunctions](https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/Lambda.html#listFunctions-property) で関数一覧の取得→Functionsの構造体リストが取得できる
+ Functionsでループして、各関数の詳細を[Lambda.getFunction](https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/Lambda.html#getFunction-property) で取得する
+ 関数ごとに、①レスポンスファイル・②ソースダウンロード用URLからzipファイルをダウンロード

※S3の特定のバケットに、関数名のフォルダを作って①と②を保存しておく

# 運用自動化

CloudWatch Eventsのスケジューラで、毎日保存するようにする。
とか

# 続き

- 取得したバックアップをちょいといじって、DRサイト（別リージョン）で復元できるようにする
- CodeCommitに格納しているソースを、Lambda関数に更新する
【Nuxt.js】アプリ開発基礎編：Nuxt + Vuex + firebaseでシンプルToDoリスト

# 前置き
![input 5.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469755/ca2b1f24-b1bf-7826-cfcb-9c496cd78803.gif)
**本格的なTODOリストを作っていきます！**
すっごく簡単なTODOリストは以前やりましたが、
一時的な物なのでリロードしたら消えます💥😲
https://qiita.com/aLiz/items/7d9e907850c15cc546a6

**今回はfirebaseとVuexで
本格的TODOリストを作成します✨🎈**
・firebaseでデータ管理
・Vuexで状態を保持

**内容が濃いのでお知らせした通り、
有料記事になりました💰**
https://note.com/aliz/n/n8411db2c9a20
まずは基本のTODOリスト、
次回以降のカスタマイズとして
**・ログイン機能の追加
・リストに画像機能の追加**
も公開していきますよ！
CSSも追加したりして
自分好みのリストにしてみてください💕🥤☺️

# Stepについて

いつも通り超簡単なところから
だんだんと肉付けをしていきます。
初心者にも分かりやすく書きました💕
分からなくても基礎的な記事を
確認しながらやってみてください🍀

**【流れ】**
・index.vueでTODOリストを作成
・Vuexに置き換える
・Firebaseに置き換える

**【基礎】**
こちらはずっと無料です！
firebase導入編：https://note.com/aliz/n/nacc97fe7d019
Vuex基礎編：https://note.com/aliz/n/n497914c981c8
Vuexまとめ編：https://qiita.com/aLiz/items/6756268a42b0c864d024

**【心構え】**
・丁寧に1つずつ
・分かる所は飛ばしてもOK🌱
　分からなくなったら戻ってもOK🌱
・一気に全部やろうとしない
・記事を参考に公式の見方が
　分かるようにしましょう👀
　https://firebase.google.com/docs/firestore
　https://ja.nuxtjs.org/guide/vuex-store/

# Step1: リストの作成

**【解説/index.vue】**

予めdataにリスト項目を入れて
Mustacheで表示させるだけ🌟

```index.vue
<template>
 <div class="page">
   <ul>
     <li
       v-for="todo in todos"
       :key="todo"
     >
       {{ todo }}
     </li>
   </ul>
 </div>
</template>

<script>
export default {
 data () {
   return {
     todos: ['これと', 'あれと', 'それ']
   }
 },
}
</script>
```

# Step2: 入力フォームを追加
続きはこちら♪
https://note.com/aliz/n/n8411db2c9a20
Ruby on Rails チュートリアル 20日目

##20日目
今日は、railsチュートリアルの13章を触りました。
[13.3.2 マイクロポストを作成する](https://railstutorial.jp/chapters/user_microposts?version=5.1#sec-creating_microposts)の所の最後のテストでエラーが出てしまいました。

```terminal
 
$ rails test
Running via Spring preloader in process 12848
Run options: --seed 36198

# Running:

E..............................E..................

Finished in 1.956968s, 25.5497 runs/s, 133.8806 assertions/s.

  1) Error:
MicropostsInterfaceTest#test_micropost_interface:
ActionView::Template::Error: Missing partial shared/_micropost_form with {:locale=>[:en], :formats=>[:html], :variants=>[], :handlers=>[:raw, :erb, :html, :builder, :ruby, :coffee, :jbuilder]}. Searched in:
  * "/home/ec2-user/environment/sample_app/app/views"

    app/views/static_pages/home.html.erb:8:in `_app_views_static_pages_home_html_erb__3544967499218460547_45437360'
    test/integration/microposts_interface_test.rb:11:in `block in <class:MicropostsInterfaceTest>'

  2) Error:
MicropostsControllerTest#test_should_redirect_destroy_for_wrong_micropost:
NoMethodError: undefined method `destroy' for nil:NilClass
    app/controllers/microposts_controller.rb:16:in `destroy'
    test/controllers/microposts_controller_test.rb:27:in `block (2 levels) in <class:MicropostsControllerTest>'
    test/controllers/microposts_controller_test.rb:26:in `block in <class:MicropostsControllerTest>'

50 runs, 262 assertions, 0 failures, 2 errors, 0 skips

```
明日、修正していこうと思います。
【rails】一つのモデルを編集や削除　その子、孫のテーブルを書き換える

##　やりたいこと
①編集画面で親要素と一緒に子、孫を同時に書き換えたかった
②削除で孫まで同時に消したかった

##　原因と解決策
①編集画面で親要素と一緒に子、孫を同時に書き換えたかった
updateアクションで親要素しかupdateできていなかったため。
しかし孫まで同時に編集アップデートの方法がわからなかった。一旦断念。

②削除で孫まで同時に消したかった
親子孫を繋ぐ記述でdependent: :destroyが抜けていた。
これを書くことで親が削除された時同時に子要素を削除できる。

```
has_many :menus, dependent: :destroy
```

##　①を力技で解決
変更前

```events_controller.rb
 def update
    respond_to do |format|
      if @event.update(event_params)
        format.html { redirect_to @event, notice: '記録の変更完了' }
        format.json { render :show, status: :ok, location: @event }
      else
        format.html { render :edit }
        format.json { render json: @event.errors, status: :unprocessable_entity }
      end
    end
  end
```

変更後

```events_controller.rb
def update
    @event.destroy
    new
    @event = Event.new(event_params)
    respond_to do |format|
      if @event.save(event_params)
        format.html { redirect_to @event, notice: '記録の変更完了' }
        format.json { render :show, status: :ok, location: @event }
      else
        format.html { render :edit }
        format.json { render json: @event.errors, status: :unprocessable_entity }
      end
    end
  end
```

変更後では孫要素まで根こそぎ削除し、新たに作り直すという手法を使いました。
あまりスマートではないですが、見え方は直りました。

もっといいやり方があればご教授頂きたく存じます。

##参考文献
https://qiita.com/Tsh-43879562/items/fbc968453a7063776637
環境変数をAzure Build Pipeline上で設定する

.NET Core 3.1とVueの組み合わせでCI/CDを組んだ時の備忘録。
以下のリンクを踏んでもらった上でこの記事を読んでもらえば.NET Core + Vue.jsでハマらずにCI/CDを組めると思います。

> Build環境の参考記事
> ローカル環境でビルドまでは以下の記事を参考にした。
> [ASP.NET Core プロジェクトに Vue.js を入れ込んでみよう](https://blog.okazuki.jp/entry/2019/06/17/132755)

> Vue.jsで環境変数を外だしする
> [vue-cli 3.0 で作成したプロジェクトの環境変数(.env)の設定](https://qiita.com/h-reader/items/9e2f8dbc3b9eaec4f5ee)

↑
ここを補間する内容が本記事。
↓

> Azure Build
> [Azure Pipeline + Github使ってタダでCI/CDしちゃおう](https://qiita.com/nekia/items/b26f867180e7e8ab7b43)

## 使用ツール

- Prismic(Headless CMS)
- GitHub
- Azure Pipelines
    - Pipelines
    - Release
- Azure App Service

## 前提
Vue.jsでPrismicとAPI連携させるためにToken情報をVue.jsで持たせる必要があった。

```javascript
Vue.use(PrismicVue, {
  endpoint: window.prismic.endpoint + "?access_token=" + process.env.VUE_APP_API_TOKEN,
})
```

具体的なハマりポイントとしては`process.env.VUE_APP_API_TOKEN`を書いた.envをGitHub上に上げたくなかったため、Pipeline上で環境変数を設定する必要があった。

## Azure Pipelinesで環境変数を設定する
赤い印のところをクリックしすると変数を設定するフォームが開かれます。
<img width="1440" alt="スクリーンショット 2020-05-02 12.01.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235110/945c438a-c13a-299a-ca7f-c9a3ebd55bde.png">
「keep this value」を選択すると、設定した変数が**Azure DevOpsに入れる人に向けても**隠すことができます。
<img width="497" alt="スクリーンショット 2020-05-02 12.07.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235110/baf8ac8c-7be1-e0a9-177e-40cf9856212f.png">
設定した変数は`$(Variable Name)`で呼び出せます。
<img width="1440" alt="スクリーンショット 2020-05-02 12.02.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235110/988c882d-a978-8534-0832-37810a8760e0.png">
環境変数の設定は以下のような感じ。

```yaml
- task:  Bash@3
  inputs:
    targetType: 'inline'
    script: |
      cd < .NET Project name >/< vue cli project name >
      touch .env
      echo VUE_APP_API_TOKEN=$API_TOKEN >> .env
      ls -a
      cat .env
  env:
    API_TOKEN: $(API_Token)
```

これが設定できたらRUNして画面を眺めるだけ:roller_coaster:
pytestのmarkを使って一部のテストをデフォルトで実行しない方法

## 状況

- 毎回は実行したくないテストをpytestで書いている(エンドツーエンドテスト、負荷テストなど)。
- 引数なしのpytestコマンドだけで、必要なテストが実行できると便利。

## 問題

- pytestに引数を付けないと、すべてのテストが実行されてしまう。
- 負荷テストなどを選択して実行するときは、簡単な引数だと嬉しい。

## 解決方法

pytest.markを使って、普段実行しないテストをマークする(印を付ける)。pytest.iniで、マークしたテストを実行しないように設定する。

some_test.py:

```
import pytest

def test_something():
    ...

def test_another():
    ...

@pytest.mark.performance
def test_performance():
    ...
```

pytest.ini:

```
[pytest]
...
addopts = -m "not performance"
```

これで実行すると、デフォルトではperformanceのマークを付けたテストを実行しない。

```
> pipenv run pytest -v
========================================= test session starts =========================================
(中略)
collected 3 items / 1 deselected / 2 selected

test/some_test.py::test_something PASSED 
test/some_test.py::test_another PASSED
```

マークしたテスト(だけ)を実行するには、コマンドラインで -m 引数を付ければよい。

```
> pipenv run pytest -v -m performance
========================================= test session starts =========================================
(中略)
collected 3 items / 2 deselected / 1 selected

test/some_test.py::test_perfomance PASSED
```

## 補足

コマンドラインから個別のテストファイルやメソッドを直接指定するとき(node ID指定)も、-mオプションを付けないと無視されてしまうので注意。

@pytest.markでは任意の名前を指定できるので、ここをtypoすると絶対実行されないテストになってしまったりする。防止策として、pytest.iniのmarkersを書き、addoptsで--strictを指定しておくとよい。

pytest.ini:

```
[pytest]
...
addopts = -m "not performance" --strict
markers =
    performance: performance tests
```

間違ったマークを付けると、実行時にエラーになる。

```
> pipenv run pytest -v
========================================= test session starts =========================================
(中略)
collected 0 items / 1 error

=============================================== ERRORS ================================================
_________________________________ ERROR collecting test/some_test.py __________________________________
'peformance' not found in `markers` configuration option
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
========================================== 1 error in 0.12s ===========================================
```

マークをいろいろ使い分けるなら、コマンドライン(シェル)でエイリアスを設定しておくと便利かも。補完も効くし。

```
% alias
ppytest='pipenv run pytest'
ppytestperf='pipenv run pytest -m performance'
ppyteste2e='pipenv run pytest -m e2e'
```

## 参考

[Marking test functions with attributes - pytest documentation](https://docs.pytest.org/en/latest/mark.html)

[Configuration - pytest documentation](https://docs.pytest.org/en/latest/customize.html)

[テスト駆動Python (Amazon)](https://www.amazon.co.jp/dp/B07F65PFZN/)
【git】エラー文error: Your local changes to the following files would be overwritten by merge:の解決法

相手からのPRを反映させるために、検証用ブランチを作成し、検証用ブランチでgit pull origin masterをすると以下のようなエラーが出ました。

PRは自分のmasterブランチに送られています。

```
From https://github.com/shota0701nemoto/Portfolio
 * branch              master     -> FETCH_HEAD
error: Your local changes to the following files would be overwritten by merge:
	.DS_Store
Please commit your changes or stash them before you merge.
error: The following untracked working tree files would be overwritten by merge:
	.env
Please move or remove them before you merge.
Aborting
```

訳すと、
・マージによって、ローカルで編集中の.DS_Storeが上書きされる（重複する）から変になってるよ！マージする前にコミットかスタッシュして保存して！
・マージによって、ローカルで編集中の.envが上書きされる（重複する）から変になってるよ！マージする前に別の場所に動かすか削除して！


と言う意味です。


##対処

```
#検証用ブランチにいます。
$  git rm .env

$  git add .DS_Store

$  git commit -m".DS_Storeをコミット"

$  git log   

$  git fetch

$  git statusで確認。

$  git pull origin master 検証用ブランチにリモートのmasterブランチの内容を取り入れる

$  git push origin master 検証用ブランチで問題ないことを確認してからリモートのmasterブランチに変更したと記録を送る

$  git checkout master  masterブランチに入る

$  git merge like-model2  like-model2（検証用ブランチ）をmasterブランチにマージする

$  git push origin master 検証用ブランチをmasterブランチにマージしたことをリモートブランチに記録する

```
PHP 構文memo

#構文まとめ

##名前空間

    namespace 名前空間;
    class クラス名{
        public function __construct(){
            print ("test");
        }
    };


###参考
https://www.atmarkit.co.jp/ait/articles/1808/01/news009_2.html

PHPの基礎　参考サイト
https://www.atmarkit.co.jp/ait/series/1432/
Office365でなんちゃってSli.do（ぽいもの）を作ってみる

社外で私が参加する勉強会では、よくSli.doが出てくる。事前アンケートやセミナー中に参加者から質問やコメント取っていって、関心が高い（いいね！が多い）コメントから登壇者が回答していく。

オフラインでのセミナーでもそうだけど、ウェビナーだと参加者の反応が見えにくいので反応を引き出す仕掛けがあるほうがいい。[初めてウェビナーやってみて得られた知見](https://qiita.com/hisssa0102/items/28a8aa6a88125c262088)でも事前アンケートが功奏したことを書いた。前回はできる/できないというクローズ型のクエスションにしたけど、オープン型のクエスチョンにすると、おそらく関心の方法が見えて参加者の期待値もあがる。

このあたりのツールの使い方や勉強会のテクニックは本当に参考になります。


さて、ツール。Sli.doはとても良いツールなので、そのまま使いたい。だけど社内では使えないので、ありあわせで似たようなことできないかな・・・ということでOffice365で作ってみた。

要件：
・参加者はだれでも自由に質問できる
・質問は無記名（質問者の名前は出さない）
・いいね！をつけさせたい
・いいね！順に自動ソート
・回答済みの質問を管理側は完了登録できる

FormsとPower Automate、SharePointでいけんじゃね？ということでまとめてみた。慣れてるひとなら瞬殺レベルだけど、Power Automate初回の人にはちょうどいいかもしれない。
Forms→SharePointのAutomateは、一度見せると「この業務に使えるんじゃない？」という話にかなりつながったりします。

#Formsを作る
1行テキスト、必須の質問を1つだけ作成する。
無記名であることを明示したいので、[名前の記録]はオフにする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237698/671272df-734b-1da6-1d94-18247aa96ecc.png)


#SharePointでカスタムリストを作る

リストを1つ作る。
リストの設定 - 評価の設定　から、評価をオンにして、いいね！にする。

--
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237698/9c7a3389-659e-df69-4433-cd5554ed03ea.png)

--
列の追加から「完了」を追加する。「はい、いいえ」にしておいて、初期値はいいえ、にしておく。
見え方チェックのためにダミーで質問入れておきましょう。

--
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237698/bda0446a-d4b4-36b3-8833-c38fcd2eee9a.png)

--

ビューで、[完了]で昇順、[いいね!]で降順にする

--
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237698/6e374554-533d-ea4d-e5fc-821c67eac435.png)
--
#Power Automateで処理つくる

Formsに書いたら、リストに転記する処理を作る。

Power Automateを開いたら　＋作成 - コネクタから始める、にFomrsがあるので選択。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237698/77f032e0-08a9-d1a8-cfb8-4e90648391f1.png)


[新しい応答が送信されるとき]が表示されるので、以下入力フォームIDで、先ほど作成したフォームを選択。

|||
|:--|:--|
|フォームID|先ほど作成したフォームを選択|


アクションの追加で、Forms - 応答の詳細を取得する、を選択。
[応答の詳細を取得する]が表示されたら、以下入力。

|||
|:--|:--|
|フォームID欄|先に作成したフォームをさっきと同様に選択|
|応答ID欄|応答通知の一覧 応答ID|

選択肢が出てこないときは、[動的なコンテンツを追加]をクリックすればOK。
※さっき選んだやん？なんで2回も選択しなきゃいけないの？という意見はごもっとも。とりあえずは、「おまじない」と思って進めましょう。

アクションの追加で、SharePoint - 項目の作成、を選択。
[項目の作成]が表示されたら、以下入力。

|||
|:--|:--|
|サイトのアドレス|先ほど作成したリストの、保存先サイトを選択|
|リスト名|先ほど作成したリストを選択|
|タイトル|先ほど作成したFomrsの、1問目を選択


出てこないときは、[動的なコンテンツを追加]をクリックすればOK。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237698/923fb467-aa3f-1dc1-5093-7627bbb407c4.png)

忘れずに、保存。

#SharePointのページに、リストとFormsを埋め込む

ページを追加して、
先に既にある質問をみてもらいたいので、リストを左に配置。
それから質問してほしいので、Formsを右に配置。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237698/347c687f-92dc-f34a-bf98-58eacd6e164f.png)

テストして、正常に動いたことを確認して完成！
公開しましょう。

#説明会で

回答が終わった質問は、クイック編集で、完了列を「はい」に変更する。


#まとめ

この手の質問や意見は、説明会などのオープンな場で出せる人は少数派。どうやって質問を引き出すか、については一工夫する余地がある。事前に公開して、あえての無記名。説明会中も促しながら書いてもらうのが〇。

とはいえ、賛同の数がないと「誰かの意見」でしかなく「みんなの意見」として測れない。なので、いいね！が多く集まったほうがいい。数は力。
「私もそう思う、なら『いいね！』つけて！」と何かにつけて伝えたほうがいい。
それに、質問を出せない人でも、いいね!だけならハードル低いし。


また質問第1号はやっぱり勇気がいるので、サクラじゃないけど、みんなが思ってそうな質問予め書いておいて、いいね、もいくつかつけておいて、それから公開するといいかもしれない。