OmniAICreator/Qiita-1.07M huggingface dataset:
Gatsby-cliのエラー (Error: Cannot find module 'ink')

Gatsbyでnpm run startをしたら以下のようなエラーが出たので、
今後同じことが起きた時のメモとして自分用に解決方法を残しておきます。

```
➜ gatsby clean
/usr/local/lib/node_modules/gatsby-cli/node_modules/yoga-layout-prebuilt/yoga-layout/build/Release/nbind.js:53
        throw ex;
        ^

Error: Cannot find module 'gatsby-core-utils'
Require stack:
- /usr/local/lib/node_modules/gatsby-cli/lib/reporter/errors.js
- /usr/local/lib/node_modules/gatsby-cli/lib/reporter/index.js
- /usr/local/lib/node_modules/gatsby-cli/lib/create-cli.js
- /usr/local/lib/node_modules/gatsby-cli/lib/index.js
    at Function.Module._resolveFilename (internal/modules/cjs/loader.js:794:15)
    at Function.Module._load (internal/modules/cjs/loader.js:687:27)
    at Module.require (internal/modules/cjs/loader.js:849:19)
    at require (internal/modules/cjs/helpers.js:74:18)
    at Object.<anonymous> (/usr/local/lib/node_modules/gatsby-cli/lib/reporter/errors.js:13:18)
    at Module._compile (internal/modules/cjs/loader.js:956:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:973:10)
    at Module.load (internal/modules/cjs/loader.js:812:32)
    at Function.Module._load (internal/modules/cjs/loader.js:724:14)
    at Module.require (internal/modules/cjs/loader.js:849:19) {
  code: 'MODULE_NOT_FOUND',
  requireStack: [
    '/usr/local/lib/node_modules/gatsby-cli/lib/reporter/errors.js',
    '/usr/local/lib/node_modules/gatsby-cli/lib/reporter/index.js',
    '/usr/local/lib/node_modules/gatsby-cli/lib/create-cli.js',
    '/usr/local/lib/node_modules/gatsby-cli/lib/index.js'
  ]
}
```

## 試したこと

gatsby-cliとgatsbyのバージョンを最新のものにする　→　しかしまだ同じエラーになる

## 解決方法

``node_modules``と``package-lock.json``を消して、

```$ npm install```
を行う

これで私の場合はエラーがなくなりました

## 参考記事
https://github.com/gatsbyjs/gatsby/issues/22109
StorybookでCannot read property 'query' of undefinedだと？！

### はじめに
あれ、最近ビジュアルリグレッションテストが落ちるな？と見てみると、なんとも見慣れないエラーが出ていました。それが`Cannot read property 'query' of undefined`です。

<img width="602" alt="スクリーンショット 2020-07-13 14.09.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252687/26cb749d-0ac8-aada-5f19-ba99ecfaa54f.png">

storybookで確認してみるとこんな感じ↓↓

<img width="603" alt="スクリーンショット_2020-07-13_13_54_28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252687/635ecc83-c081-a103-d302-7d8b194e5666.png">

reg-suitとstorybookを利用して、PR度に自動差分が出るようにしているのですが、毎度引っかかるようになってしまいました。まぁ、ちゃんと毎回確認しなかった自分が悪いです。はい。

### 原因
どうやら起因となったのは、以下を含むコンポーネントを作ったことのようです

```vue
<nuxt-link :to="{ path: 'hoge', query: $route.query }">hoge</nuxt-link>
```

そうコンポーネント内にrouteをみる記述があり、そのままだとstorybookではVueRouterを認識してくれないようです。

### 対応
これは絶対に誰かすでに詰まってるだろうし、`addon`あるっしょ！と思ってググってたらやはり見つけました。でも意外とスター少ない...(利用しているパッケージにはどんどんスターつけていきましょう！)

[storybook-router](https://github.com/gvaldambrini/storybook-router/tree/master/packages/vue)
<img width="604" alt="スクリーンショット 2020-07-13 14.15.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252687/62c210ee-7405-d20e-f167-c52b43022b60.png">

> デコレータは、実際には VueRouter インスタンスをラップする関数です。storybook内でナビゲーションのプロトタイプを構築したい場合や、 ルータ自体をより制御したい場合に使用することができます。

VueRouterをラップしたものであるとシンプルでありますが、こういうのあるってありがたいですね！

では、早速インストールして、以下のように対象の設定ファイルに追記するだけ。自分の場合はルートの`.storybook/preview.js`に設定記述をまとめてるのでそちらに書きます。コンポーネントストーリーファイルごとに設定している人は、そちらに書きましょう。

```js
（略）
import { addDecorator } from '@storybook/vue'
import StoryRouter from 'storybook-vue-router'

addDecorator(StoryRouter())
```

これで完了。特定のルートにだけ含めたいなどの場合には、`StoryRouter`の第２引数にオプションを渡せば良さそうです。

### さいごに
storybookを導入しているかつ、`this.$router.name`や`this.$router.query`を使っているコンポーネントがあってエラーが出る場合は、参考にしてみてください
laravel 6.x to 7.x upgrade

移行手順は以下のサイトを参考にする。
[Laravel 7.x アップグレードガイド](https://readouble.com/laravel/7.x/ja/upgrade.html)


#### composer.jsonを修正する。
`laravel/ui`も利用している場合は`laravel/ui`も修正する。

```json:composer.json
{
  "require" : {
    "laravel/framework": "^7.0",
    "laravel/tinker": "^2.0",
    "laravel/ui": "^2.0",
    "facade/ignition": "^2.0",
    "nunomaduro/collision": "^4.1",
  },
]
```


#### Exceptionクラスの修正
Symfony 5.xになりExceptionクラスからThrowableクラスに変わったので
Exceptionクラスで引数を渡している個所の修正が必要

新規なら問題ないが既存アプリだと`app/Exception/Handler.php`の`render`や`report`の引数
ExceptionをThrowableに変更。

```php:app/Exception/Handler.php
/* use Exception; */
use Throwable;

/* public function report(Exception $exception) */
public function report(Throwable $exception)

```
#### config/session.phpの修正
```php:config/session.php
/* 'secure' => env('SESSION_SECURE_COOKIE', false), */
'secure' => env('SESSION_SECURE_COOKIE', null),
```

`composer update`実行でアップグレード完了。
Rails Tutorial　第6章完了 

#2020/6/24 (0.5時間：Tutorial外）
Sass/SCSSを私は使ったことがなかったので、いったんrails Tutorialを離れ、ドットインストールで学んでみることにしました。
#2020/6/25 (0.5時間：Tutorial外）
Sass/SCSSをドットインストール。
#2020/6/26 (0.5時間：Tutorial外）　2時間
Sass/SCSSのドットインストールを3日計1.5時間で完了しました。
HTML/CSSの知識は昔のままだったので、このような便利なも
のができたなんて知りませんでした。

6章を始めるにあたり、5章の復習を15分ほどやりました。
途中で参照にされていた、Duck TypingについてのMatzの動画を見はじめたら面白くてやめられなくなりました。

#2020/6/27　1時間
Railsチュートリアルには演習の解答がないので、ネットに公開されているサイトをいくつか参照しています。mochikichiさんの転職の記事がとても興味深かったです。http://mochikichi.hatenablog.com/entry/career_change_episode_3

演習の解答のページだけを見ていたときは、自分がつまずいたところも整然と解答が書いてあるので、他のプログラミング言語の経験が長くてRailsを始めた方なのかなと想像していました。

ところが実はプログラミングは未経験で、その後エンジニアに転職したと書いてあり驚きました。

#2020/6/28　2.5時間
正規表現を理解するのに時間がかかりました。謎めいて見えますが、サイトに入力してテストするうちに、何となく分かってきました。じっと考えるより手を動かして慣れるほうが自分には理解がしやすいです。

#2020/6/29　0.5時間
演習がエラーのまま、朝やれる時間が終わってしまいました。

#2020/6/30　0.5時間
昨日の演習のエラーは、正解を見ても間違いが見つかりません。試しにいったん全部消して手で打ち直したら、なぜか直りました。原因不明です。

#2020/7/1
これまでリモートワークが主で、たまに出社だったのですが、7月から出社が主でたまにリモートワークへと社の方針が変わりました。朝から会議なので勉強の時間がとれず、夜やるつもりでした。ですが、帰宅して夕食が終わったら21時になり、疲れてやれなかったです。

#2020/7/2　0.5時間
昨日の反省で朝に時間をとってやりました。3密回避で出社時刻を10時に遅らせてよいことで、朝の勉強時間が取れました。

#2020/7/3　1時間
有休休暇で朝にやれました。

これで6章を完了しました。
所要時間は8時間です。

感想ですが、毎朝30分のペースがつかめてきました。SassでWebの進化を感じられたのも良かったです。
MacのAutomatorでクイックアクションを再度開く方法

# したい事
クイックアクションを作成したものの，そのクイックアクションの処理を変更したい時にどうやって開けば良いかわからない．

# 解決方法

1. 右クリックで`クイックアクション > カスタマイズ...`を選択する．
2. システム環境設定の拡張機能が表示される．
3. 編集し直したいクイックアクションを右クリックし，`Finderに表示`を選択する．
4. そのクイックアクションの存在するディレクトリが表示される．
5. クリックすればAutomatorで開くことができる．

私の環境では，`/Users/<ユーザ名>/Library/Services`にありました．そのためAutomatorで`ファイル > 開く`から`/Users/<ユーザ名>/Library/Services/<クイックアクション>`で開くこともできます．
OpenCVのimshow()の注意点

## OpenCVのimshowでズラっと何か表示される

授業でopenCVを触ることになったので、まずはinstall。ちなみにmac勢、Python 3.7.4

```
pip install opencv-python
```

そして、画像を表示するだけのtest.pyを作成。

```test.py

import cv2
img = cv2.imread('mona.jpg')
cv2.imshow('image', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
```

実行すると画像は表示されたものの、

```
objc[62826]: Class RunLoopModeTracker is implemented in both /Users/ユーザー名/.pyenv/versions/anaconda3-2019.10/lib/python3.7/site-packages/cv2/.dylibs/QtCore (0x1139e97f0) and /Users/ユーザー名/.pyenv/versions/anaconda3-2019.10/lib/libQt5Core.5.9.7.dylib (0x128195a80). One of the two will be used. Which one is undefined.
QObject::moveToThread: Current thread (0x7fc0f7435300) is not the object's thread (0x7fc0f9f02cc0).
Cannot move to target thread (0x7fc0f7435300)

You might be loading two sets of Qt binaries into the same process. Check that all plugins are compiled against the right Qt binaries. Export DYLD_PRINT_LIBRARIES=1 and check that only one set of binaries are being loaded.
QObject::moveToThread: Current thread (0x7fc0f7435300) is not the object's thread (0x7fc0f9f02cc0).
Cannot move to target thread (0x7fc0f7435300)

（後略）
```

後略の部分には「You might be-」と似たような文書がズラッと続きます。
画像が表示されているとはいえ、流石に気になる。

少し調べてみると[こちら](https://stackoverflow.com/questions/60271645/qt-complaining-2-sets-of-binarie)で似たような事例の方を発見。

「複数のパッケージがGUIの機能を持ってるとマズイから、GUIの機能の無いverをインストールすればいい」
とのことでGUI機能の無いopencv-python-headlessをインストールすれば良いらしい。

```
pip install opencv-python-headless
```

謎の数百行は無事消滅。一安心。ちなみに、画像を選択した状態でキーボード入力をすると終了します。

しかし、[公式と思われるサイト](https://pypi.org/project/opencv-python/)曰く、適切な物を一つだけインストールしないといけないらしいので、opencv-pythonをuninstall。

```
pip uninstall opencv-python
```

すると、必要なheadlessも纏めてuninstallされたっぽいので、再びinstall。

```
pip install opencv-python-headless
```

以上、終了。
UbuntuでMacキーボードをいつも通りに使う方法

# そもそも英数・かなキーが認識されていない!?
英数キーは`Zenkaku Hankaku`として認識されていたものの、かなキーがマッピングされていないことがあるようです。
マッピングされていないのか、キーバインドされていないのかを判断するためにターミナルで`xev`と入力してキー入力をしてみてください。

## 見方がわからん！
<img width="709" alt="スクリーンショット 2020-07-13 13.24.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312202/0c7551d6-87f5-0667-1d7d-100b747d4851.png">
こんな感じの出力があったものの見方がわからんでしょう。
ざっくりと必要な部分だけ説明します。

- `keycode 120`
    - キーコードが120のキー
- `(keysym 0xff22, Muhenkan)`
    - Muhenkanって名前で認識されています
    - No Symbolsになっていれば認識されていないってことになります

## No Symbolsに名前をつけようじゃないか！
本当はちゃんとしないといけないんですが面倒なので.bashrcに直書きしちゃいます。

```.bashrc(追記する)
xmodmap -e 'keycode 120 = Muhenkan'
```
これで名前を付けられました(簡単！)
ただし、Linux好きには教えないでください。魔女狩り案件です。

# Mozcの設定を変えよう！
## キー設定の選択の編集ボタンを押してキー設定を行います。

- IMEを有効化のエントリー
    - 全部削除！
- 直接入力のZenkaku/Hankaku
    - 半角英数に入力切り替え
- 直接入力のMuhenkan (自分でエントリー追加しないとダメかも)
    - ひらがなに入力切り替え

## 再起動して幸せになれ！
ターミナルに Matrix が降ってくる Hack

### 1. ターミナルに雪を降らせるスクリプトというのがあるそうで

```shell:shell
ruby -e 'C=`stty size`.scan(/\d+/)[1].to_i;S=["2743".to_i(16)].pack("U*");a={};puts "\033[2J";loop{a[rand(C)]=0;a.each{|x,o|;a[x]+=1;print "\033[#{o};#{x}H \033[#{a[x]};#{x}H#{S} \033[0;0H"};$stdout.flush;sleep 0.1}'
```

### 2. 実行したらこうなるよ

![snow.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84749/d1559a86-935f-2519-b1c4-db9bcc2d019a.gif)

※ ネタ元は [ここの](http://climagic.org/coolstuff/let-it-snow.html) コメント欄らしいです

### 3. ruby の部分を取り出して、読みやすくリファクタしてみました

```ruby:ruby
width = `stty size`.split(' ').last.to_i
positions = {}
puts "\033[2J" # clear screen
loop do
  positions[rand(width)] = 0
  positions.each { |column, row|
    print "\033[#{row};#{column}H " # erase snow
    positions[column] += 1
    print "\033[#{positions[column]};#{column}H❃" # draw snow
  }
  sleep 0.1
end
```

### 4. で、改造したくなりました

```ruby:ruby
width = `stty size`.split(' ').last.to_i
positions = {}
print "\033[40m\033[32m" # black and green
puts "\033[2J" # clear screen
loop do
  positions[rand(width)] = 0
  positions.each { |column, row|
    positions[column] += 1
    print "\033[#{positions[column]};#{column}H#{[*' '..'z', *'ｦ'..'ﾝ'].sample}"
  }
  sleep 0.1
end
```

### 5. ワンラインに戻すよ

```shell:shell
ruby -e 'w=`stty size`.split(" ").last.to_i;p={};print"\033[40m\033[32m\033[2J";loop{;p[rand(w)]=0;p.each{|c,r|;p[c]+=1;s=[*" ".."z",*"ｦ".."ﾝ"].sample;print"\033[#{p[c]};#{c}H#{s}";};sleep 0.1}'
```

### 6. 実行したらこうなるよ

![matrix.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84749/72d86ebd-5153-9657-8431-abf8fcf9a85a.gif)

### 7. まとめ

タイトルはわざと頭悪そうにしてみました。釣りです 😐

### 8. おまけ

雪を多重スクロール化してみました。ターミナルをフルスクリーンにしてから実行してみてね :hatched_chick: 

```shell:shell
ruby -e 'puts "\033[2J";Y,X=`stty size`.split(" ").map(&:to_i);z={"."=>1,"*"=>2,"❃"=>3};a=[];loop{a<<[rand(X),0,z.keys.sample];a.map{|b|;print "\033[#{b[1]};#{b[0]}H ";b[0]+=rand(3)-1;b[1]+=z[b[2]];print "\033[#{b[1]};#{b[0]}H#{b[2]}";b};a.reject!{|b|b[1]>Y-(4-z[b[2]])};$stdout.flush;sleep 0.1}'
```

実行するとこう

![snow2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84749/2f49e45e-4148-4f24-b913-5b68a35d097b.gif)

コードはこう

```ruby:ruby
height, width = `stty size`.split(' ').map(&:to_i)
snow = { '.' => 1, '*' => 2, '❃' => 3 }
positions = []
puts "\033[2J" # clear screen
loop do
  positions << { x: rand(width), y: 0, z: snow.keys.sample }
  positions.map { |position|
    print "\033[#{position[:y]};#{position[:x]}H " # erase snow
    position[:x] += rand(3) - 1
    position[:y] += snow[position[:z]]
    print "\033[#{position[:y]};#{position[:x]}H#{position[:z]}" # draw snow
    position
  }
  positions.reject! { |position| position[:y] > height-(4-snow[position[:z]]) }
  sleep 0.1
end
```
SEO対策は新時代か旧時代か

キーワードは意味がなくなる？キーワードを使ったSEO対策が終わると言われてから数年がたちました。良質なコンテンツこそが生き残ると言われ、キーワードの使い方よりも中身重視の年があったものです。

一方で外部SEO対策も重要度を増してきていました。世間ではいわゆるホワイトハットの必要性が問われていて、外部SEO対策は過去のことのように言われたものです。

現在では外部SEO対策の重要性はましてきている。コンテンツマーケティングで成功してきて、その後に急激にアクセスが落ち込む例が見られます。

これは内部SEO対策に偏った反動。コンテンツ至上主義がいきすぎだったのでしょう。例えば<a href="https://ps-game-cheap.net/" >https://ps-game-cheap.net/</a>のサイトは外部SEO対策よりも内部SEO対策重視のサイトです。

これは現在2020年5月ごろから苦戦中。これからはキーワードよりは何が必要か？キーワードの重要性は変わらないでしょう。ただし扱い方が昔と違うということ。タイトルやHタグに入れるだけ、比率を高くするだけでは効果が出ません。
インターフェース、java interfaceについて

#インターフェースとは
コンピュータで、異なる機器・装置のあいだを接続して、交信や制御を可能にする装置やソフトウェア
###ハードウェアインターフェース
ハードウェア機器同士を接続するためのコネクター(接続機)に関する形状の規格や、送受信の方法を定めたもの
（例）USB
###ソフトウェアインターフェース
プログラム同士の間でデータのやり取りをする際の形式を定めたもの
（例）API

###ユーザーインターフェース(UI)
コンピューターとそれを使用する人間側を結びつける役割を指している。つまり、パソコンと人間の仲介役。
（例）「ユーザーインターフェースが使いにくい」 = 操作手順が複雑で、操作性が悪い

#javaのインターフェース(interface)
Javaで使われる`interface`とは、クラスに含まれるメソッドの具体的な処理内容を記述せず、変数とメソッドの型のみを定義したもの

インタフェースのメンバー変数は自動的にpublic static finalが付けられるので定数になる。

＜宣言＞

```java
interface インターフェース名{}
```
＜実装＞

```java
class クラス名 implements インターフェース名{}
```
cron.dの設定について

## cronとは
OSに入っているプログラムの一つで、その時間になったらプログラムを動かしてくれる。
cronは実行する期間ごとに起動するファイルが異なる
![スクリーンショット 2020-07-13 12.59.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417196/96bc6e42-cca2-71ca-c57b-1b888b488f7e.png)
参考:https://www.express.nec.co.jp/linux/distributions/knowledge/system/crond.html

## cron.d
五分ごとに `docker-compose build` を実行したかったので/etc/cron.dの配下にファイルをつくりました。

## 順序
1. sshでサーバーに接続
2. `cd /etc/cron.d`でcron.dのディレクトリに移動
3. `touch hoge`ファイルの作成 (cornのファイルは拡張子が必要ない)
4.  ファイルを編集

```terminal:/etc/cron.d/hoge
*/5 * * * * root  'cd /root/プロジェクト名 && /usr/local/bin/docker-compose build プロジェクト'


```

## ファイルの編集について
cronの時間の設定は特殊な書き方をするので、以下を参考にした。
参考：https://crontab.guru/every-5-minutes

docker-compose buildを実行したいプロジェクトまで移動する必要があるので `cd`で移動する。
その後、docker-composeが置かれている絶対パスを指定してあげる。絶対パスはwhichコマンドで確認できる。

## logの確認
五分ごとに実行されているか確認する必要がある。
OSによってlogの出力先は違うようだが、Ubuntuはsyslog

```
vim /var/log/syslog
```

これで5分ごとに実行されていれば、実行コマンドを確認することができる。
【Python】変数の作成時にandとorを使う

## andとorの知らなかった使い方

<b>論理演算子and, orでは、True, Falseなどのbool型を出力するだけでなく、条件によって数値や文字列、リストなども出力できる。</b>  

#### 条件
> 
式 x and y は、まず x を評価します; x が偽なら x の値を返します; それ以外の場合には、 y の値を評価し、その結果を返します。  
式 x or y は、まず x を評価します; x が真なら x の値を返します; それ以外の場合には、 y の値を評価し、その結果を返します。  
6. 式 (expression) — Python 3.8.3 ドキュメント

##### 偽(False)とみなされるオブジェクトは以下の通りである

* bool型のFalse
* None
* 数値（int型やfloat型）の0, 0.0
* 空の文字列''
* 空のコンテナ（リスト、タプル、辞書など）[], (), {}

#### 例
```python
x = 5  # True
y = 0  # False

print(x and y)
# 0

print(x or y)
# 5

print(not x)
# False
```
```python
x = 10  # True
y = 100  # True

print(x and y)
# 100

print(y and x)
# 10

print(x or y)
# 10
```

参考サイト
[https://note.nkmk.me/python-boolean-operation/:embed:cite]
久しぶりに資格試験のお勉強をした話（CompTIA 編）

CompTIA が提供しているセキュリティ資格をすべて取得しました。
折角なので、CompTIA のセキュリティ資格やお勉強に役立った教材をかるーくご紹介します。

# CompTIA ってどんな団体？
CompTIA は、グローバルなベンダーニュートラル資格を提供している団体です。
日本での試験は、CompTIA 日本支局が実施しています。現時点で、クラウド／インフラ／セキュリティなど 13 の資格があります。


# CompTIA のセキュリティ資格一覧
CompTIA のセキュリティ資格は、下の 4 つがあります。

* CompTIA Security+
* CompTIA Cyber Security Analyst (CySA+)
* CompTIA PenTest+
* CompTIA Advanced Security Practitioner (CASP+)

レベル分けすると、下のような感じになります。

* レベル 1：CompTIA Security+
* レベル 2：CompTIA Cyber Security Analyst (CySA+) / CompTIA PenTest+
* レベル 3：CompTIA Advanced Security Practitioner (CASP+)

CompTIA が推奨するセキュリティに関するキャリアパスです。
CompTIA CASP+ が CompTIA セキュリティ資格の最上位に位置付けられています。

<img alt="20181101_cybersecurity_careerpath.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661070/97262c01-4130-42f1-ad59-35f89dd50009.png">
引用元：https://www.comptia.jp/cert_about/certabout/

# 学習方法
学習方法としては、下の 4 つくらいかなと思います。

1. 有償のトレーニング研修を受講する
CompTIA のパートナー企業が有償トレーニングを提供しています。
トレーニングを実施している企業一覧を CompTIA の公式サイトから確認できます。
https://www.comptia.jp/training/training/


2. 有償のオンライン模擬試験を受講する
こちらも CompTIA のパートナー企業が模擬試験を提供しています。
https://web.tac-school.co.jp/it/comptia/index.html


3. CompTIA 公式の参考書を読む
CompTIA が提供している学習ガイドになります。結構なお値段しますー。
https://jp-store.comptia.org/training/c/11300?facetValueFilter=tenant~user-type%3aindividual%2ctenant~certification%3acomptia-security%2ctenant~certification%3acomptia-pentest%2ctenant~certification%3acomptia-csa%2ctenant~certification%3acomptia-casp&


4. CompTIA パートナーの参考書を読む
TAC が参考書を提供しています（※ 他にも提供してるパートナーがいたらごめんなさい）。CompTIA 公式の参考書よりは安いです。
https://bookstore.tac-school.co.jp/book/koza/022/

# 役に立った学習教材
* Security+
  * 有償のオンライン模擬試験：『Security+ Web模擬試験（SY0-501試験対応）』 ( https://web.tac-school.co.jp/it/comptia/scplus501.html#web )
  * CompTIA パートナーの参考書：『実務で役立つIT資格CompTIAシリーズ Security+テキスト SY0-501対応』 ( https://bookstore.tac-school.co.jp/book/detail/08297/ )
  * CompTIA パートナーの参考書：『実務で役立つIT資格CompTIAシリーズ Security+問題集 SY0-501対応』 ( https://bookstore.tac-school.co.jp/book/detail/08298/ )
 
* CySA+
  * 有償のオンライン模擬試験：『CySA+ Web模擬試験（CS0-001対応）』 ( https://web.tac-school.co.jp/it/comptia/csa001.html#web )
  * CompTIA パートナーの参考書：『実務で役立つIT資格CompTIAシリーズ CySA+テキスト CS0-001対応』 ( https://bookstore.tac-school.co.jp/book/detail/08231/ )
  * CompTIA パートナーの参考書：『実務で役立つIT資格CompTIAシリーズ CySA+問題集 CS0-001対応』 ( https://bookstore.tac-school.co.jp/book/detail/08232/ )

* PenTest+
  * 有償のオンライン模擬試験：『PenTest+ Web模擬試験（PT0-001対応）』 ( https://web.tac-school.co.jp/it/comptia/pentest001.html#web )
  * CompTIA 公式の参考書：『The Official CompTIA PenTest+ Study Guide』 ( https://jp-store.comptia.org/p/PEN-001-JPPD-20-C )

* CASP+
  * CompTIA 公式の参考書：『The Official CompTIA CASP+ Self-Paced Study Guide』 ( https://jp-store.comptia.org/p/CAS-003-JPPP-20-C )
 

# 受けてみた感想
* 非常に実用的で業務に直結する
シナリオが与えられ、こういう場合にはどうしますか？って内容が多かったです。
実業務で様々な相談を受けることがあるので、自分の立場に置き換えながら学習することができました。

* 幅広い知識が問われる
最上位 の CASP+ 試験では、選択肢の中から回答を選ぶ問題だけではなく、コマンド操作を伴う実技問題がありました。
参考書や模擬試験だけではなく、実際に手を動かす学習も必要かと思います。
ubuntu 18.04 日本語入力まわりのキー設定

#目的
ubuntuで日本語入力するにあたって以下の２点の設定をいい感じ(個人的に)できたので記しておきます。

- 英数キーでローマ字入力, 英数入力の切り替え
- Capslock -> Capslock + shift にキー変更

#前準備
今回はGUI環境のubuntu LST 18.04.3を想定して説明しています。
###必要なもの

- Mozc(デフォルトでインストール済み)
- GNOME Tweaks

###GNOME Tweaksのインストール
####手順
1. Ubuntu ソフトウェアで"GNOME Tweaks"を検索
2. インストール
![GNOME-Twaks.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256678/118c5d41-c27d-0acd-41fc-1bd02362ff30.png)


# 英数キーでローマ字入力、英数入力の切り替え
1. Mozcのプロパティを開く
2. 下に表示されている、"キー設定の選択"の右の"編集…"をクリック
![MozcProperty.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256678/cbfac864-cdef-c39c-f490-c455cacbf2ef.png)

3. Mozcキー設定の下に表示されている"入力キー"をクリック
4. キー設定一覧をスクロールし、カテゴリが"入力キー"が"Eisu"のところまで移動させる
5. "Eisu"の右のカテゴリ"コマンド"の部分をクリックし以下の画像のように設定する。
![MozcKeySetting.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256678/19c0f559-4d66-dec5-e5a9-232247786ff4.png)

# CapsLockをcapslock+shiftに変更する
1. Tweaksを起動する
2. 右のカテゴリより"キーボードとマウス"を選択
3. "追加のレイアウトオプション"を選択
![tweaks-propaty.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256678/a52da05f-a076-1584-fd45-846e80e5f10a.png)

4. "追加のレイアウトオプション"の"その他の互換性に関するオプション"カテゴリにある"Both shift together enable Caps Lock"にチェックを入れる
![addLayoutOpt.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256678/be1037b8-d4a7-802c-a411-b2743b50120a.png)


#おわりに
とりあえず、触ってみた感じ大丈夫そうでしたが、もっといい設定とか見つかったら更新します。
また、こうした方がいいや、この設定はまずいなど、あれば教えていただけると幸いです。
Railsコマンド叩くとコンテナが落ちてたけどECSのメモリとCPUの設定を変えたら直った話


## 結論
下記のようにECSのコンテナメモリとCPUユニット数を変更したら直った

- コンテナメモリ：300MiB → 1024MiB
- コンテナCPU：500 → 512ユニット数
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260354/f027fa8e-054a-1211-7737-2bca0513eb58.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260354/00e0cae3-5965-1d23-2ed3-c13e3ea32b13.png)
([フリー画像です](https://kumamine.blogspot.com/2019/12/blog-post_27.html))


## 事象

- コンテナに入ってRailsコマンドを叩くとコンテナが落ちる
- 502 Bad Gatewayで画面表示さえされない時もあった
 - なぜか本番環境では落ちてなかった
 - ステージング環境だけ落ちてた → ECSのインスタンスが落ちては自動立ち上げの無限ループ
- Rails 6系にバージョンアップするとステージング環境の画面も表示されるようになった
 - 相変わらずRailsコマンドを叩くとコンテナは落ちた

## EC2のインスタンスタイプ
- 本番環境：m4.large
- ステージング環境：t3.large

## 参考資料

- [ちょっと待ってください!あなたが使うべきは本当にT系インスタンスですか!?](https://dev.classmethod.jp/articles/ec2-t-or-m/)
- [ECSでEFSを使いこなすための一歩としてEC2ベースでのCPUとメモリ設定にトライしてみた](https://dev.classmethod.jp/articles/ecs-resources-knowledge-for-ecs-with-ec2/)

## 試したことメモ
- Railsコマンドテスト
 - `rails -v` は問題なかった。ほかRailsコマンドはダメなのでRailsアプリ内のスクリプトが動くとだめなのかも?
 - spring killしてRailsコマンド実施
 - springを起動しない設定の `DISABLE_SPRING=1` を環境変数に設定してRailsコマンド実施
 - 直接指定 → `$ DISABLE_SPRING=1 RAILS_ENV=staging ./bin/rails console`
- 環境変数とか見直し
- Railsバージョンを上げてみた
- Railsコマンドが走ってた場所まで戻して試してみた
- topで実行プロセス見てみた → springじゃね?に繋がる
- タスク定義の不要なやつを削除してみた
- ほかAWSで紐づけている設定見直し
- ECSのメモリ制限をハード制限・ソフト制限ともに3000MiBに設定

## まとめ
多分ECSコンテナの要領不足。な気がします。
メモリよりCPUユニット数の方が決定打でした。

EC2のインスタンスタイプも適当に設定しちゃダメだと痛感しました。
インフラ周り疎いので詳しい方いたら教えてください。

## 余談
ちなみにコンテナCPUを500 → 1024に設定するとタスク定義が更新できなくなってしまった。
適切なユニット数を設定するのが大事みたい。
→ CPU1024MiBにすると、ECS常時2インスタンスだとして、切り替えのタイミングで2→4になり1024MiB*4が要求されて要領を超えてしまってた
heteml で scpコマンド使うときにはまった4つのポイント

Windows10で scp コマンドを使ってレンタルサーバ（heteml）にファイルやり取りした際に躓いたところを覚書。

## 1. ローカルパスはフルパスにする

```powershell
# NG
scp -P 2222 <Username>@ssh-<id>.heteml.net:<Path> ~\desktop
# > ~/desktop: No such file or directory

# OK
scp -P 2222 <Username>@ssh-<id>.heteml.net:<Path> C:\Users\<User>\desktop
```

## 2. ポート番号はオプションで渡す ※位置も注意

hetemlの場合SSHポート番号が `2222` に設定されているのでコマンドも設定を要する。

```powershell
# NG
scp ~\desktop\<File> <Username>@ssh-<id>.heteml.net:2222<Path>
scp ~\desktop\<File> -P 2222 <Username>@ssh-<id>.heteml.net:<Path>
scp -F <Path>\.ssh\config ~\desktop\<File> <Username>@ssh-<id>.heteml.net:<Path>
# > ssh: connect to host ssh-tokyoweld.heteml.net port 22: Connection timed out
# > lost connection

# OK
scp -P 2222 <Username>@ssh-<id>.heteml.net:<Path> C:\Users\<User>\desktop
```

## 3. リモートパスのルートの `/` は不要

```powershell
# NG
scp -P 2222 ~\desktop\<File> <Username>@ssh-<id>.heteml.net:/web/
# > scp: /web/: Is a directory
scp -P 2222 ~\desktop\<File> <Username>@ssh-<id>.heteml.net:/web/<Path>
# > scp: /web/<Path>: No such file or directory

# OK
scp -P 2222 ~\desktop\<File> <Username>@ssh-<id>.heteml.net:web
scp -P 2222 ~\desktop\<File> <Username>@ssh-<id>.heteml.net:web/
scp -P 2222 ~\desktop\<File> <Username>@ssh-<id>.heteml.net:web/<Path>
```

## 4. プロトコル（ssh://）は不要

```powershell
# NG
scp -P 2222 ~\desktop\<File> <Username>@ssh://ssh-<id>.heteml.net:/web/
# > C:\\Windows\\System32\\OpenSSH\\ssh.exe: Could not resolve hostname ssh: \202\273\202\31...
# > lost connection

# OK
scp -P 2222 ~\desktop\<File> <Username>@ssh-<id>.heteml.net:web
```

### Open SSH 参考

* [scp(1) - OpenBSD manual pages](https://man.openbsd.org/scp)
* [scpコマンド チートシート - Qiita](https://qiita.com/rock619/items/2bbbe379ae0fdd2ae00f)
美大生のためのプログラミング入門：四角形に関する様々な関数（その 2）

※ Qiita では、本文部分のみの印刷に苦労します。そのため、同じ内容を以下のページにも掲載しています。プリンツアウトしたり PDF 化したい人は、こちらのページを利用して下しさい：

http://gurakura.sakura.ne.jp/hellomondrian/rect3/

一覧はこちら：
http://gurakura.sakura.ne.jp/series/美大生のためのプログラミング入門/

Qiita 版の総合目次：
https://qiita.com/iigura/items/37180d127da93d0b8abb

# 不自由な四角形の描き方
　さて、自由な四角形に対し、不自由な四角形の描き方を紹介してこのセクションは終わりとします。不自由な四角形の定義にも色々あるかとは思いますが、ここでは、誰が描いても同じ形となる（＝相似となる）、自由度の少ない四角形としてまずは正方形を取り上げたいと思います。

　正方形の描画は square 関数で行います。引数は square(x,y,l) です。x,y は正方形の左上の位置で、l が辺の長さです。

備考：ちなみに、(x,y) が示す基準とする位置は rectMode 関数で変更可能です。

```Java
background(250,250,250);
size(500,500);

strokeWeight(10);
stroke(0,64,255);
fill(255,0,0);
square(100,50,200);
```

![square.png](http://gurakura.sakura.ne.jp/img/helloMondrian/square.png)

-------------

# コラム：quad,rect,square の関係
　quad 関数を使って rect 関数を表すことができます。また、rect 関数を使って square 関数を表すことができます。rect(x,y,w,h) で描かれる四角形は、(x,y), (x+w,y), (x+w,y+h), (x,y+h) という頂点で構成されます。なので、rect(x,y,w,h) は

```Java
quad(x,y, x+w,y, x+w,y+h, x,y+h)
```

と表すことができます。同様に、square(x,y,l) も、

```Java
rect(x,y,l,l)
```

と表すことができ、これももちろん quad 関数で表すことができます：

```Java
quad(x,y, x+l,y, x+l,y+l, x,y+l) 
```

　このようにプログラミングでは、同じ表現を様々なコードで記述できます。故に、ソースコードには作者（＝プログラマ）の個性が現れてきます。

プログラミングを知らない人からすると、プログラミングは無味乾燥な作業に思えるかもしれませんが、実は結構個性が現れる行為だったりします。

----------------

# Comp-Position in Color α

　モンドリアンの Composition in Color A をよく見てみると、青い四角形の上に重なる赤い四角形のうち、下の青い四角形との間に隙間のあるものが存在します。例えばこのような部分です：

<img src="http://gurakura.sakura.ne.jp/img/helloMondrian/composition_zoom.png" width=300px>

　これはこの章のはじめに挙げた図の一部を拡大したものです。このような絵はどのようにしてプログラムで実現したら良いのでしょうか？

　今、我々が知っている技術は四角形を描くことと直線を描くことのみです。これらの知識のみでどうやってこのような表現を実現したら良いのでしょうか？

何も考えずに青い四角形の上に赤い四角系を描き、後から白い線で描くのでしょうか。

それとも下の青い四角形を 2 つの四角形に分割し、Ｌ字型の四角形を描画するのでしょうか（つまり、実は重ならない四角形の集合として描く）。

様々な方法が考えられると思います。

　実は、この問題にも正解など存在せず、どのような方法でも皆さんが望んだ結果になれば、それが正解です。

　ここでは、rect 関数で描画される四角形では輪郭線も描画できることを活用し、輪郭線により隙間を表現する方法を紹介して、この章を終わりたいと思います。なお、Composition in Color A を題材とするプログラムは後ほどまた出てきますので、今回はアルファバージョンの意味で in Color $ \alpha $ と名付けています。

```Java
// comp-position in Color alpha
background(250,245,230);
size(500,500);

strokeWeight(10);
stroke(250,240,240);  // same as background
fill(0,80,160);       // blue
rect(60,120, 200,150);

fill(220,60,20);      // red
rect(230,70, 160,150);

noStroke();
fill(80,80,80);       // black
rect(270,230,80,15);
```

![comp-position-alpha](http://gurakura.sakura.ne.jp/img/helloMondrian/comp-position-alpha.png)

　このように、輪郭線を輪郭線として使用しない方法もあります。また、Processing にて絵を描く場合、様々な機能が Processing には備わっており、それをどのよに用いれば、どのような効果・表現が得られるのかを良く知っている必要があります。

---------
# コラム：αバージョン、βバージョン
　コンピュータの世界では、アルファバージョンとかベータバージョンなどという言葉を良く耳にします。これは一体何なのでしょうか？ソフトウェアで $\beta$ 版（ベータバージョン）というのは、ほぼ完成であるが、まだ若干直すべきところが残っているもの、というような意味あいです。

ネットワークゲーム等では、ベータテストといって、ほぼ完成しているソフトウェアで実際に遊んでもらって、バグ出しやシステム全体の調整やサーバーの性能評価を行ったりします。

ちなみに、リリース（出荷＝つまり製品版）の候補となり得る程度の完成度のものは Release Candidate（リリースキャンディデート）と呼び、RC などの略号が使われます。

　アルファ版（アルファバージョン）というのは、ベータの前という意味で、ほぼ完成というにはまだまだ作業が必要であるが、でもまあ、そこそこ動く、といったような意味です。

上で作った comp-position in Color も、モンドリアンの Composition in Color A と比べるとまだまだ足りない部分があります。しかし、それでもなんとなく絵のようなものは描けるので、
アルファ版であるとの意味を込めて comp-position in Color $\alpha$  としました。
UIAlertController(ActionSheet)のタイトルの枠を削除する

日本語の記事がなかったので、書いておきます。

# 困っている内容
タイトルとサブタイトルの枠が残ってしまう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/514870/ad0e9a8d-ff98-a023-b10b-a43b105a684f.png)


# 実装したいもの
タイトルの枠を削除する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/514870/a8646974-ff2e-51ff-97d4-a272b3e8374f.png)



# 実装方法
titleとmessageをnilにする

```ViewController.swift
let alertController:UIAlertController = UIAlertController(title: nil, message: nil, preferredStyle: .actionSheet) 
```

# 参考ソース
https://stackoverflow.com/questions/29777342/how-to-hide-title-message-frame-in-a-uialertcontroller
Faust: 自分好みのChorusを作ってみた

[最も簡単にVST/AudioUnitプラグインを作ってDAWで使ってみる方法](https://qiita.com/SacredTubes/items/39c06d7f36956e5e6555)を読んで、そういえば、Faustでコーラスのexampleってなかったな、どうやって作るのかな?と思って記事を書いてます。
こっちの方が簡単だぜ!しかも無料だし!とか、張り合ってるわけではないです。

コーラス自体は結構簡単な構造です。
遅らせた音を遅延時間をサイン波で変調しながら原音に足す、です。

Faustでやってみました。

```js:myChorus.dsp
declare name "myChorus";
import("stdfaust.lib");

process = chorusMono(0.0), chorusMono(phaseDiff);

chorusMono( phaseDiff ) = _
    <: _, de.sdelay(maxSample, itplSample, delaySample)
    : si.interpolate(wet)
        with{
            maxSample = ma.SR * 0.02 ;
            itplSample = 1024 ;
            delaySample =  maxSample * 2.0 / 3.0 
                * ( 1 + depth / 2.0  * os.oscp( rate,  phaseDiff * ma.PI ) ) ;
        };

chorusGrp(x) = hgroup("[0]myChorus", x);
depth     = chorusGrp( hslider("[0]depth[style:knob]", 0.1, 0.0, 1.0, 0.01)) ;
rate      = chorusGrp( hslider("[1]rate[style:knob][unit:Hz]", 1.0, 0.01, 5.0, 0.01)) ;
phaseDiff = chorusGrp( hslider("[2]phaseDiff[style:knob]", 0.5, -1.0, 1.0, 0.1)) ;
wet       = chorusGrp( hslider("[3]Wet[style:knob]", 0.5, 0.0, 0.5, 0.001) ) ;
```
<img width="402" alt="スクリーンショット 2020-07-13 12.54.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61597/dfd1cde8-dd61-8b5d-b863-97c4ac727d21.png"><img width="652" alt="スクリーンショット 2020-07-14 14.25.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61597/e80f49b4-ce59-e758-9ae3-c5025b22c6f0.png">
<img width="732" alt="スクリーンショット 2020-07-14 14.26.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61597/287a060b-c67f-cc55-cda2-67708bb533c0.png">


delayはいくつか用意されていますが、値を動かしてもバツバツいわないのが de.sdelay です。これを使えばよい。
maxSampleは聴感上このくらいかな、で決めました。itplSample はドキュメントの例にあった値のままです。

これを、FaustLive.app や online editor で コンパイルしてvstが作れます。以前はAUも作れたんだけど何故か今はできないようです。
<img width="512" alt="スクリーンショット 2020-07-13 13.02.36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61597/836f2efa-1b49-b27f-1114-d4aadabc1d73.png">

また、JUCEを選択すると、そこからGUI付きの vst3, AU が作れます。
![スクリーンショット 2020-07-12 17.59.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61597/238e7d49-8da9-bfb3-3db6-814da729a866.png)


参考記事：
[関数型音声処理言語、Faustをはじめよう](https://qiita.com/tomoyanonymous/items/30ff7c862c362aa90a7d)
[Faust&JUCEによる超高速VST開発](https://qiita.com/tomoyanonymous/items/79b3e551984a707b5c9a)
[JUCE=>VST3 : JUCE_VST3_CAN_REPLACE_VST2 を 0 にすれば書き出せる](https://qiita.com/ttatsf/items/7095984291823890eb49)
TkinterでHEXで表示可能なSpinboxを作る

Python GUI TkinterでHEXで表示可能なSpinboxを作る。

![HEX.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506495/f8281410-8257-75ab-1c19-8be6d1061a6e.png)

Tkinterではformatオプションを使ってもSpinboxがHEX対応していません。
ただ、内部的な加算などはHEX対応しているものと思われます。
(increment=1はHEXでも有効)
バイト数を明示的に示すサンプルプログラムを下記のように記載してみました。

```python:HexSpinbox.py
import tkinter as tk

class HexSpinbox(tk.Spinbox):
    def __init__(self, *args, **kwargs):
        self.var = tk.StringVar()
        self.bytenum = kwargs.pop('bytenum')
        max_val = 0x1<<(self.bytenum*8)
        super().__init__(*args, **kwargs, textvariable=self.var, from_=0,to=max_val,
                         increment=1, command=self.cange )

    def set(self, val):
        s = "0x{:0%dx}" % (self.bytenum*2)
        self.var.set(s.format(int(val)))
        
    def get(self):
        hstr = super().get()
        return int(hstr, 16)

    def cange(self):
        val = super().get()
        self.set(val)


if __name__ == "__main__":
    print("HexSpinbox")
    win = tk.Tk()
    hex = HexSpinbox(win, bytenum=2)
    hex.set(0xAA55)
    hex.pack()
    
    win.title("HexSpinbox test")
    win.mainloop()
Python 日付の演算

#1 この記事は

定義した文字型日付(例2020/7/13)を日付型に変更し、日付型の足し算を行う


#2 コードの内容


```python:test.py
import datetime

##(1)日付の定義をする##

date0='2020/01/06' #日付0を定義する。
date1='2020/01/09' #日付1を定義する。


##(2)文字型から日付型に変換する##

tdate0=datetime.datetime.strptime(date0, '%Y/%m/%d') #日付0を文字型から日付型に変換する
tdate1=datetime.datetime.strptime(date1, '%Y/%m/%d') #日付1を文字型から日付型に変換する
print(type(tdate0)) #   結果：<class 'datetime.datetime'>


##日付1と日付2の引き算を行う##

dif=tdate1-tdate0 #日付1と日付2の差を計算する。
print(dif.days)   #結果：3

##日付1に2日加算する。

tdate2 = tdate1 + datetime.timedelta(days=2)  #日付1に2日を追加する
print(tdate2) # 結果：2020-01-11 00:00:00
```

##(追加) 本日の日付と1年前の日付を取得する

```python:test.py
import datetime

Y=datetime.date.today().year#年
M=datetime.date.today().month#年
D=datetime.date.today().day#日

START_DATE= datetime.date(Y,M,D)
END_DATE= datetime.date(Y-1,M,D)  

print(START_DATE)
print(END_DATE)
```
Could not load the 'listen' gem. Add `gem 'listen'` to the development group of your Gemfile (LoadError)

vagrant環境で「bundle install --without production」とするとエラー

```
Could not load the 'listen' gem. Add `gem 'listen'` to the development group of your Gemfile (LoadError)
```

解決方法

```
bundle config --delete without
bundle config --delete with
bundle install
```
vagrant環境で rails s をするとFileUtils関連のwarningが発生する

vagrant環境で rails s をするとFileUtils関連のwarningが発生する。rails の起動はしている。

```
/home/vagrant/.rbenv/versions/2.5.7/lib/ruby/2.5.0/fileutils.rb:90: warning: already initialized constant FileUtils::VERSION
/home/vagrant/.rbenv/versions/2.5.7/lib/ruby/gems/2.5.0/gems/fileutils-1.4.1/lib/fileutils.rb:105: warning: previous definition of VERSION was here
/home/vagrant/.rbenv/versions/2.5.7/lib/ruby/2.5.0/x86_64-linux/etc.so: warning: already initialized constant Etc::SC_AIO_LISTIO_MAX
/home/vagrant/.rbenv/versions/2.5.7/lib/ruby/2.5.0/x86_64-linux/etc.so: warning: already initialized constant Etc::SC_AIO_MAX
・
・
```

解決策

```
gem uninstall fileutils
gem update fileutils --default
```

```
gem cleanup
```

```
bundle clean --force
```

(https://obel.hatenablog.jp/entry/20181023/1540286546)
(https://qiita.com/taaaaak/items/1b05ce33ffebd2670e6f)
(https://stackoverflow.com/questions/51334732/rails-5-2-0-with-ruby-2-5-1-console-warning-already-initialized-constant)
Freelancer

皆さん、こんにちは。私はウェブ開発者で、外国人です。今、東京都で働いてます。夜は暇な時間が多いので、Freelancerとして、働きたいです。誰かプロジェクトがあれば、参加したいと思います。私のスキルはPHP/Laravel, NodeJS, Vuejs, Angularjs, Javascript, jQuery. ありがとうございます。
Sass::SyntaxError: File to import not found or unreadable: bootstrap-sprockets.

assets:precompile でのエラー

```
bundle exec rails assets:precompile RAILS_ENV=production
```

```
Sass::SyntaxError: File to import not found or unreadable: bootstrap-sprockets.
```

bootstrap4を使っているのに、bootstrap3の設定があった為
bootstrap4では

```
app/assets/stylesheets/application.scss
@import “bootstrap-sprockets”;　
```

がいらない

（http://binbo-roku.com/bootstrap/programming/study/bootstrap より引用）
[Rails]パンくずリストを作る

## 対象読者

- Railsでパンくずリストを実装したい人。
- 使い方忘れた人。
- 初学者向けになっています。内容も初歩的なところを解説しています。

## gretelって何？

パンくずリストです。ヘンゼルとグレーテルの話のやつ。
パンくず落としていって自分の辿って来た道がわかる。

## Gemのインストール

[gretelのgithubはこちらから]("https://github.com/lassebunk/gretel")

```Gemfile:Gemfile
gem 'gretel'
```

`bundle install`したら必要なファイルを生成します。

```shell
$ bundle install
$ rails g gretel:install
```

以下のようにファイルが生成されればOKです。

```shell
Running via Spring preloader in process 6675
      create  config/breadcrumbs.rb
```

これが中身。

```ruby:breadcrumbs.rb
crumb :root do
  link "Home", root_path
end

# crumb :projects do
#   link "Projects", projects_path
# end

# crumb :project do |project|
#   link project.name, project_path(project)
#   parent :projects
# end

#
#
#以下省略
#
#
#
```

## 設定を書く

先ほどの`breadcrumbs.rb`というファイルはパンくずを落としていく設定ができるファイルになります。
例えば、

`Home > カテゴリ`

のようなパンくずを落としていきたい場合は

```ruby:breadcrumb.rb
crumb :root do
  link "Home", root_path
end

crumb :articles do
  link "記事一覧", articles_path #パスは該当ページのパスを書く（ここでは記事一覧）
  parent :root
end
```

カテゴリの前のページをHomeにしたいのでparentは`:root`を指定します。

## Viewに表示させる

あとはViewの方で出力してあげるだけです。

```erb:application.html.erb
<!DOCTYPE html>
<html>
  <head>
    <title>パンくずアプリ</title>
    <%= stylesheet_link_tag    'application', media: 'all', 'data-turbolinks-track': 'reload' %>
    <%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %>
  </head>
  <body>
    <%= breadcrumbs separator: " &rsaquo; " %> #ここを追加
    <%= yield %>
  </body>
</html>
```

```erb:articles/index.html.erb
<% breadcrumb :articles %>
```

これで

`Home > 記事一覧`

のパンくずリストが出来上がります。


## 登録してあるデータをパンくずに表示したい

`Home > 記事一覧 > [記事のタイトル]`

みたいにしたい場合は少し工夫が必要になります。

以下のように、Viewの方から`breadcrumb.rb`へデータを送ってあげないといけません。
今回は記事のタイトルをパンくずとして出力してあげたいので、`@article`を第２引数に指定してデータを渡してあげます。

```erb:articles/show.html.erb
<% breadcrumb :article_show, @article %>
```

```ruby:breadcrumb.rb
crumb :root do
  link "Home", root_path
end

crumb :articles do
  link "記事一覧", articles_path #パスは該当ページのパスを書く（ここでは記事一覧）
  parent :root
end

crumb :article_show do |article| #ここで受け取ってる
  link article.title, article_path(article) #<表示する文字列>、<記事詳細のパス>
  parent :articles  #親を設定する
end
```

`Home > 記事一覧 > パンくずリストを作ってみた`

作成日時を出力させたいと思ったら、

```ruby:breadcrumbs.rb
crumb :article_show do |article|
  link article.created_at, article_path(article) #変更（title => created_at）
  parent :articles
end
```

に変更すればOKです。
Tezos v7.2 を carthagenet で動かす

tezosにはプロトコルのバージョン(babylonnet, carthagenet) とは独立してソースコードのバージョンがある。今回はソースコードバージョン `v7.2` で carthagenetネットワークのノードを動かす。

## ソースコード取得

```sh
git clone -b v7.2 git@gitlab.com:tezos/tezos.git
```

## ビルド

```sh
make build-deps
make
```
## ノードの開始

ソースコード `v7.0` から multinetworkという機能が導入された。これまではプロトコルごとにソースコードブランチが存在したが、同一のソースコードでプロトコルを切り替えることができるように変わったみたいだ。

* https://tezos.gitlab.io/releases/version-7.html#multinetwork-node

昔のように何も考えずにnodeを動かし始めるとデフォルトでmainnetにつなげ始めるので注意。 `carthagenet` が希望なら最初に初期化でネットワークを教えてあげることができる:

```sh
./tezos-node config init --data-dir ~/tezos-carthagenet --network carthagenet
```
あとはこれまでと同様に:

```sh
./tezos-node identity generate --data-dir ~/tezos-carthagenet
./tezos-node run --data-dir ~/tezos-carthagenet --rpc-addr 127.0.0.1
```


## 確認
```sh
./tezos-client rpc get version | jq
```

```json
{
  "version": {
    "major": 7,
    "minor": 2,
    "additional_info": "release"
  },
  "network_version": {
    "chain_name": "TEZOS_ALPHANET_CARTHAGE_2019-11-28T13:02:13Z",
    "distributed_db_version": 0,
    "p2p_version": 1
  },
  "commit_info": {
    "commit_hash": "6b9f3bc3c90d99d4a2bd5cd26e6f3efbcb977090",
    "commit_date": "2020-06-19 18:24:43 +0200"
  }
}
```
Flutterでアンドロイドアプリをビルドする際のエラー

#Plugin project :firebase_core_web not found. Please update settings.gradle. Plugin project :cloud_firestore_web not found. Please update settings.gradle.と言われたときの対処法

settings.gradleに以下のように追記します。

```/android/settings.gradle
def flutterProjectRoot = rootProject.projectDir.parentFile.toPath()

def plugins = new Properties()
def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins')
if (pluginsFile.exists()) {
    pluginsFile.withReader('UTF-8') { reader -> plugins.load(reader) }
}

plugins.each { name, path ->
    def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile()
    include ":$name"
    project(":$name").projectDir = pluginDirectory
}
```

##まとめ
flutterの学習しはじめに詰まったところを共有しました。
僕と同じような初学者の参考になれば幸いです。

##参考元
https://github.com/FirebaseExtended/flutterfire/issues/2599
英語読むのめんどくさい。
Mac+英字キーボード環境でAmazonWorkSpaces（windows）のかな英数変換

Amazon WorkSpacesの仮想デスクトップでWindowsOSを使うが、手元の操作端末がMac+英字キーボードであり、「かな↔英数」の変換方法がわからない人向け。

キーボードを適当に押しまくってたら切り替え方法を見つけたのでメモしておきます。

手元（PC）の環境
　- Mac
　- 英字キーボード
Amazon WorkSpacesの仮想環境
　- Windows10

## まずはWorkSpaces上のキーボードのセッティング

- まず、英字キーボード配列自体が認識されるようにキーボードの指定を変更します。
    - デスクトップ左下の虫眼鏡アイコンをクリックし、検索窓に「設定」と入力。設定機能を開く。
    - あとはこちらのやり方に従って設定を変更する。 
        - https://hacknote.jp/archives/39507/
- 一番最後の「日本語キーボード（106/109キー）」の選択を**「英語キーボード（101/102 キー）」**にする
- （このあと一度ログアウトされ再起動される）
- これで英字キーボードとして認識されているはず

## かな↔英数変換は「option + `」を押す
英字キーボードが認識された状態で、**「option」キーを押しながら「`」キーを押す**。  
これでかな↔英数変換ができているはず。
![uskey.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100780/609e17f7-57d6-9d45-68ff-149200c2f8cb.png)
GooglePlayリジェクト(Violation of Families Policy Requirements)がでたときは、ターゲット ユーザーおよびコンテンツを修正せよ！

#これを読んで解決すること
Google Play Consoleにて下記のエラーが発生した時に、解決することが可能です。
#エラー内容
| Issue: Violation of Families Policy Requirements |
|:--|:--|
| Apps that contain elements that appeal to children must comply with all Families Policy Requirements. We found the following issue(s) with your app: |
|  |
| Version(s) | Eligibility Issue |
| APK:1 | Metadata |
| We don't allow apps with misleading, irrelevant, excessive, or inappropriate metadata, including but not limited to the app's description, developer name, title, icon, screenshots, and promotional images. Your app must include metadata text and images that accurately reflect the app experience. |
| For example, the app launcher icon does not accurately reflect the app experience. |
| For more details, please read through the Metadata policy. || Issue: Violation of Families Policy Requirements |
|:--|
| Apps that contain elements that appeal to children must comply with all Families Policy Requirements. We found the following issue(s) with your app: |
##実際にGoogleから送られてきたメールをスクリーンショットしたもの
![図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631096/8f708515-dfb7-3c9d-6ecb-2f21aaf40a15.png)

#解決方法（２ステップ）
（１）対象年齢を変更する
Google Play Consoleの左タブ
ストアでの表示＞アプリのコンテンツ＞ターゲットユーザーおよびコンテンツ＞対象年齢
を編集
（私の場合は、13-15歳のチェックマークをはずせばOKがでました。結果16歳以上のアプリになってしまいました。）

![図dさd1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631096/97421bd1-d551-6803-387b-e4361d93e3ba.png)

（２）アプリを再送信する
Google Play Consoleの左タブ
ストアでの表示＞ストアの掲載情報
内のどこかの文言を編集すると
したの画像右下のあるボタン"アプリを再送信"が押せるようになります。
※したの画像は”アップデートを送信”ボタンになっています。これは公開になったあとにスクリーンショットをとったのでこうなりました。リジェクト直後は”アプリを再送信”というボタンになっています。
この”アプリを再送信”ボタンを押せばリジェクト完了です。
![３４２４２図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631096/cb05d1cc-991c-aa7a-0512-ab349e97fe32.png)


#参考にした記事
stackoverflow.com
https://stackoverflow.com/questions/57027059/how-to-fix-issue-violation-of-families-policy-requirements

#リジェクトから公開までにかかった時間
→６時間程度？
深夜2時半にリジェクトの通知がGoogleからメールできました。
参考記事をみながら解決案に辿りつき”アプリの再送信”ボタンをおしたのが深夜3時半。
その後、アプリの公開が分かったのが朝の11時ごろ。

#最初の審査からリジェクトまでにかかった時間
最初の審査：7/8（水）夜
リジェクトの通知：7/13（日）AM2:30ごろ

#この解決方法のデメリット
実際に、試していないので定かではないですが
どこかの記事かなにかに書いてあったので記載しておきます。
アプリの対象年齢を引き上げると、対象年齢未満のスマートフォンではそのアプリを遊べなくなるそうです。
つまり、Google Storeで表示されないでそうです。（定かではない）。
WSL2のトラブルシューティングまとめ

## WSL2で/mnt/c や /mnt/d にアクセスすると IO Errorが表示される
WSL2の再起動をする

```terminal
C:\Users\User>wsl2 --shutdown
```
(参考元)[https://qiita.com/melty12/items/285b65a5e8ef6aeebb39]

## WSL2のterminal内で名前解決に失敗する（ホストが見つかりません問題）

```bash
#vim /etc/resolv.conf
nameserver 172.29.0.1 
↓
nameserver 8.8.8.8
```
vscode remote development でポートフォワードでログインするときのエラー

# error 内容

```
CreateProcessW failed error:2
 posix_spawn: No such file or directory
> プロセスが、存在しないパイプに書き込もうとしました。
```

## 環境
- 手元のPC windows10
- サーバーPC EC2(linux) ubuntu
- docker debian linux

手元のPCからEC2上で立ち上げたdockerへvscode のremote developmentの機能を使用して入ろうとした。
git for windowsからだとログインできるが、vscodeのremote developmentだと入れない。
vscode内でエラー内容確認すると

```
CreateProcessW failed error:2
 posix_spawn: No such file or directory
> プロセスが、存在しないパイプに書き込もうとしました。
```

ssh config の設定ファイルは以下

```config
Host EC2
    HostName {EC2 ip}
    User ubuntu
    IdentityFile {EC2 key pass}
    CheckHostIP no
    ControlMaster auto
    ControlPersist  600
    IdentitiesOnly yes
    ForwardAgent yes
    RemoteForward 22 127.0.0.1:22
    ServerAliveInterval 60
    ServerAliveCountMax 3
Host EC2_docker
    HostName 127.0.0.1
    User root
    Port {docker port}
    IdentityFile {docker key pass}
    ProxyCommand ssh -W %h:%p EC2
```

# 解決方法


vscodeのremote developmentで使用するssh.exeを
git for windowsの方へ変更することで解決した。

下記画像の
Remote.SSH: Pathをgit for windowsのsshへ変更
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295881/e9062f92-9af6-b06e-6732-5829bd492993.png)
面の頂点 右回り 左回り の整理 Springhead OpenGL WebGL FBX DirectX Blender Unity UnrealEngine

ときどき忘れるのでメモ

面の頂点の指定順序の話
======================

※結論 CW CCW で切り替えられるのでそちらを意識した方が良い

右手系 左手系 という呼び方は違和感があるので
右回り 左回り と呼ぶことにします
(右手系 左手系 はどちらかというと 3D の軸の向きに使う呼称だと考えます)
(軸は [こちら](https://note.com/it_ks/n/nb13311509f0a) が参考になります)
※軸(座標系 右手系 左手系)が違っていてさらに右回り左回りも違っていると結果的に元に戻る(正常に観える)ので間違いに気付かないケースあり
※回転行列の回転方向はまた違うので注意


右回り
------
- Springhead

左回り
------
- FBX


Matrixについて
--------------

右から掛けるか左から掛けるかと右回りか左回りかは無関係
どちからというと右から掛けるか左から掛けるかは vector が縦か横かと関連
Matrix のメモリ上の格納順も「列→行」「行→列」の違いがある(これも上のグループ分けとは独立)
ただし格納順の違いは vector に Matrix を掛ける過程で(右からか左からか)吸収されるというか「メモリ上の格納順は同じ」だったりする


UVについて
----------

原点が左下か左上か
これも上の右回り左回りとは別に存在する
Go製インタプリタに見る動的値型まとめ

Go言語でインタプリタを作っているのだが、動的値型の宣言の仕方でぜんぜん実行速度が変わってくるので、メンテナンス性と実行速度いろいろ検討してみる。

# 構造体に全部の型を詰め込むパターン

動的値型を作る上で最も直感的に使えるのが全部の型を構造体に詰め込むパターン。あまり考えなくても使えるがメモリ効率はよくない。

```struct.go
type Value struct {
    TypeNo int
    IntValue int
    StrValue string
}
// 必要な時に変換関数を呼ぶ
func (v *Value) ToInt() int {
  if TypeNo==TypeInt { return v.IntVaue }
  if TypeNo==TypeStr { return StrToInt(v.StrValue) }
}
func (v *Value) ToString() string { ... }
```

# 全てをinterface{}で表現するパターン

動的値型をinterface{}で表す方法。必要に応じて、任意の型にキャストして使う。キャストが面倒なので使い勝手は良くない上に間違えると落ちる。しかし、Go言語の機能を使うため動作速度は比較的早い。メモリも必要最小限。

```if1.go
type Value interface{} 

// switchで型を分けて使う
func ToInt(v Value) int {
  switch v := v.(type) {
    case int: return v.(int)
    case string: return StrToInt(v.(string))
    default: return 0
  }
}
func ToString(v Value) string { ... }
```

- (参考) [go-lua > types.go](https://github.com/Shopify/go-lua/blob/d97add4bf105cd6563db108af5a58dbce10337ae/types.go)
- (参考) [DCLua > value.go](https://github.com/milochristiansen/lua/blob/337d4249b58456f9c70648a04fa924cb78decf74/value.go)

# Goの型を利用しつつinterfaceで変換メソッドを用意

Goの型を利用しつつもメソッドを追加して共通型として利用する。メモリ効率もよくinterfaceの良さを活かしつつ、それなりに安全に運用できる。Gopher-luaの作者の型はこの部分が動作ネックになっているとブログに書かれていたが、Go製のLuaの中ではGopher-luaは速い方。

```if2.go
type Value interface {
  ValueType() int
  ToInt() int
  ToString() string
}

type MyInt int
func (p MyInt) ToInt() { return p }
func (p MyInt) ToString() { return IntToStr(p) }

type MyStr string
func (p MyStr) ToInt() { return StrToInt(p) }
func (p MyStr) ToString() { return p }
```

- (参考) [Gopher-lua > value.go](https://github.com/yuin/gopher-lua/blob/master/value.go)

# interface{}を利用しつつも構造体に閉じ込める

内部的には、interface{}を利用しつつも、構造体とそのメソッドと安全に動的値型を操作できる。ただし、動的値型を生成する際に、一枚皮を被せているので、インタプリタ実装時大きなオーバーヘッドが必要となる。この記事執筆時点なでしこGo版では、この方式を採用しているが、値型の生成がとにかく遅い。

```structif.go
struct Value {
  ValueType int
  value interface{}
}

func (v *Value) ToInt() int {
  switch value.(type) {
    case int: return v.value.(int)
    case string: return StrToInt(v.value.(string))
  }
}
```

- (参考) [なでしこ3Go > value.go](https://github.com/kujirahand/nadesiko3go/blob/844f5b333a6953e73826663c691930338628a2b5/value/value.go)

> なお、筆者が作っている日本語プログラミング言語「なでしこ」のGo言語実装版は[こちら](https://github.com/kujirahand/nadesiko3go)。

# その他

その他、参考になりそうな点

- [GoでUnion型/直和型をいい感じに表現する方法](https://qiita.com/sxarp/items/cd528a546d1537105b9d)
SlackでプライベートチャンネルのチャンネルIDを取得する

SlackAPIでプライベートなチャンネルのメッセージを取得したり、プライベートなチャンネルに投稿したりする場合、そのチャンネルのIDが必要です。

チャンネルIDは users.conversations APIから取得することができます。

[users.conversations](https://api.slack.com/methods/users.conversations)

users.conversations APIはデフォルトでパブリックなチャンネルしか返さないので、プライベートなチャンネルを取得するときはtypeを指定する必要があります。tokenも追加すると大体以下のような形でプライベートなチャンネルを取得することができます。

```terminal
curl https://slack.com/api/users.conversations\?types\=private_channel\&token\=トークン
```

レスポンスはJsonでPHPを使って配列に直してみると以下のような感じのものが返ってきます。このidの部分がチャンネルIDです。

```php
array(26) {
      ["id"]=>
      string(9) "ID"
      ["name"]=>
      string(33) "チャンネル名"
      ["is_channel"]=>
      bool(false)
      ["is_group"]=>
      bool(true)
      ["is_im"]=>
      bool(false)
      ["created"]=>
      int(1572395271)
      ["is_archived"]=>
      bool(false)
      ["is_general"]=>
      bool(false)
      ["unlinked"]=>
      int(0)
      ["name_normalized"]=>
      string(36) "チャンネル名"
      ["is_shared"]=>
      bool(false)
      ["parent_conversation"]=>
      NULL
      ["creator"]=>
      string(9) "ユーザーID"
      ["is_ext_shared"]=>
      bool(false)
      ["is_org_shared"]=>
      bool(false)
      ["shared_team_ids"]=>
      array(1) {
        [0]=>
        string(9) "チームID"
      }
      ["pending_shared"]=>
      array(0) {
      }
      ["pending_connected_team_ids"]=>
      array(0) {
      }
      ["is_pending_ext_shared"]=>
      bool(false)
      ["is_private"]=>
      bool(true)
      ["is_mpim"]=>
      bool(false)
      ["last_read"]=>
      string(17) "1579251521.004700"
      ["is_open"]=>
      bool(true)
      ["topic"]=>
      array(3) {
        ["value"]=>
        string(0) ""
        ["creator"]=>
        string(0) ""
        ["last_set"]=>
        int(0)
      }
      ["purpose"]=>
      array(3) {
        ["value"]=>
        string(48) "チャンネル名"
        ["creator"]=>
        string(9) "ユーザーID"
        ["last_set"]=>
        int(1572395273)
      }
      ["priority"]=>
      float(0.017359568987192)
    }
```
webpack-merge が v5 で build が失敗する

新しい API が増えて import する部分での書き方が変わったようで

```
const merge = require('webpack-merge')
```
これを

```
const { merge } = require('webpack-merge')
```
こうしてあげればとりあえずは build 出来るようにはなります
取り急ぎの対策にはなってしまいますが
LaravelでQueryBuilder利用時にsql_safe_updatesを有効にする

Eloquent利用時は対象のモデルをUPDATE,DELETEしますが、QueryBuilderを利用する際は対象のレコードは`WHERE`を適切に利用しなければ関係のないレコードも対象になってしまう可能性があります。

基本的には実装時、あるいはレビュー時点で気づくことと思いますが、MySQLの`sql_safe_updates`という機能を利用することで実装漏れをしてもレコードを守ることが出来ます。

## sql_safe_updatesとは

mysqlへのクエリ実行の際にこのフラグを有効にすることでUPDATE,DELETE時にWHEREもしくはLIMITまたその両方が指定されていない場合はクエリ実行ができなくなります。

```sql
mysql>SET sql_safe_updates=1
```

これをQueryBuilder利用時にも有効にすることで事故を減らそうという試みです。

## QueryBuilder利用時にsql_safe_updatesを有効にする

`Illuminate\Database\DatabaseManager`から`connection`を取得し、`SET sql_safe_updates=1`を`statement`で実行するようにします。

```php
$connection =  $this->databaseManager->connection();
if ($this->databaseManager->getDriverName() === 'mysql') {
    $connection->statement('SET sql_safe_updates=1');
}
return $connection->table($this->tableName);
```

この`connection`を利用していれば意図しないUPDATEやDELETEを防ぐことができます。
また、実装時も例外になって処理が失敗してしまうのでWHERE漏れに気づくことが容易になります。