OmniAICreator/Qiita-1.07M huggingface dataset:
Golangの環境構築

本記事はGo初心者の備忘録になります。

## 環境
OS: Mac Catalina
Shell: Zsh

## Go のインストール

#### homebrew でGoをインストール

```sh
brew install go 
```

#### インストールが完了したか確認（バージョンも合わせて確認）

```sh
go version
# 出力結果例） go version go1.15.2 darwin/amd64
```

#### 環境変数$GOROOTの確認（Goのインストール先）

```sh
go env GOROOT
# 出力結果例） /usr/local/Cellar/go/1.15.2/libexec
```

#### 環境変数$GOPATHの確認

```sh
go env GOPATH
# 出力結果例） /Users/ユーザー名前/go

ls $(go env GOPATH)
# 出力結果例） ls: /Users/ユーザー名前/go: No such file or directory
```
※パッケージのインストールを終えていない段階ではまだ`$GOPATHのディレクトリは存在しない`。


## Goの環境設定

#### パッケージのインストール（gore）

```sh
go get github.com/motemen/gore/cmd/gore
```

#### GOPATHの確認とパッケージの確認

```sh
ls $(go env GOPATH)
# 出力結果) bin/ src/
```
※ `bin/` にはバイナリコード、`src/` にはソースコードが格納されている。

#### GOPATHの設定をする（インストールしたパッケージをコマンドとして利用可能にする）

```sh
vim ~/.zshrc
```

下記の内容を `~/.zshrc` の最後に追記

```vim:~/.zshrc
"Golangのパス設定
export GOPATH=$(go env GOPATH)
export PATH=$PATH:$GOPATH/bin
```
保存して閉じた後、`~/.zshrc` の再読み込み

```sh
source ~/.zshrc
```

#### インストールしたパッケージがコマンドラインで使えるようになったかの確認
gore は ruby の irb のように対話的にgoを実行できる 

```sh
gore -autoimport
 gore>
 gore> fmt.Println(Hello World)
 Hello World
 12
 <nil>
```
↑12バイト出力されて、エラーがなかったという意味
ctrl + d で終了

##### goreがより便利になる拡張ツールも合わせてインストール
コード補完、出力のハイライト、APIドキュメントの参照などをできるようにする。

```sh
go get github.com/mdempsky/gocode
go get github.com/k0kubun/pp
```

## プロジェクト管理ツールの設定

#### プロジェクト管理ツール *ghq* のインストール

```sh
brew install ghq
```
##### ghq の確認（自端末にインストールされているGoパッケージ（プロジェクト）の一覧を表示する）
```sh
ghq list

# 出力結果例）
# golang.org/x/tools
# golang.org/x/xerrors
# golang.org/x/sys
# golang.org/x/text
# golang.org/x/mod
# github.com/peterh/liner
# github.com/k0kubun/pp
# github.com/motemen/gore
# github.com/motemen/go-quickfix
# github.com/mdempsky/gocode
# github.com/mattn/go-isatty
# github.com/mattn/go-runewidth
# github.com/mattn/go-colorable
```
※自分で何かプロジェクトの作成を行う際も上記と同じ階層で開発を行う。
##### ghqでソースを取得してくるディレクトリを指定

```sh
git config --global ghq.root $GOPATH/src
```
ghq は裏で git コマンドを叩いていると思われる。

他の細かいところは必要になったら対応する。
AES、PKI、RSA、SHA-256

応用情報技術者平成28年秋期 午前39

データベースで管理されるデータの暗号化に用いることができ，かつ，暗号化と復号とで同じ鍵を使用する暗号化方式はどれか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/7f52de6a-973f-0800-8915-69d2bb504f1a.png)


１、
・AES
⇒○。AES(Advanced Encryption Standard)は、アメリカ合衆国の標準暗号規格として制定された共通鍵暗号方式です。

・PKI
⇒×。Public Key Infrastructureの略で公開鍵基盤のことです。暗号方式ではない。

・RSA
⇒×。公開鍵暗号方式であるRSAは、暗号化と復号に異なる鍵を使用します。

・SHA-256
⇒×。SHA-256は、入力値をもとに256ビットのハッシュ値を生成するアルゴリズムです。ハッシュ化は一方向性の変換なのでデータの暗号化は行えますがハッシュ値から元のデータへの復号は困難です。

２、SHA-256
出力されるハッシュ長のビット数からそれぞれSHA-256、SHA-384、SHA-512と呼ばれ、SHA-2と総称される。

用途は、SHA-2ハッシュ関数は、TLS/SSL、OpenPGP、SSH、S/MIME、IPsec、Bitcoinといった広く使われているアプリケーションやプロトコルで利用されている。


３、RSA暗号（RSAあんごう）とは、
桁数が大きい合成数の素因数分解問題が困難であることを安全性の根拠とした公開鍵暗号の一つである。 暗号[1]とデジタル署名を実現できる方式として最初に公開されたものである。


参照：
https://www.ap-siken.com/kakomon/28_aki/q39.html

SHA-256
https://ja.wikipedia.org/wiki/SHA-2
IFTTT改悪対策

IFTTTの改悪、もとい有料化に伴って
３つまでしか登録できなくなってしまった。
我が家のIOT環境では大打撃です。

うちは今下の感じになっている。
Google Home → IFTTT →　Slack → Hubot → rm mini3の
（参照）：Smart Home - Google Homeの喋らせ方　様
https://scrapbox.io/smart-home/Google_Homeの喋らせ方

自宅IOT環境を
IFTTTのフリーの３つまでの登録でどうにかしてみる。

そしてこれは　その備忘録。


構想としては下。

IFTTTのトリガーのGoogleAssistantの設定は
すべて頭に「[お願い]◯◯して」とする
もしくはgooglehomeのショートカット機能を利用して「電気消して」を「お願い電気消して」に変換する

アクションは
webhookで
raspberry pi上で実行しているnode.jsに渡す
google homeからということがわかるように
頭に[%GH%]とかつける。
http://xxxx/google-home-notifier?text=%GH%xxxxxxx
みたいな感じ

node.js上で
[%GH%]以降の文字列を判別してアクションを起こす。

アクションの選択は
RedisかGoogle SpreadSheetを使って変換テーブルみたいな感じにする。
あとで編集が楽だからGSSかな？スピード重視でRedisにするかも・・

アクション自体は
Raspberry上にアクション用のShellファイルを作成しておく。
Slackに送信、Lineに送信、RmMini3に送信などを作成しておいて、引数つけて実行する。
また、連続実行できるように、複数実行機能もつける

最後に実行完了を声でお知らせ
お知らせもVoiceTextを使って良い声を使う。

これができたらIFTTTで３つのみでもOKになる・・・はず。


まだできてないもの：
1.Node.jsでGSSをアクセス
　googlehomeからの文字列から、アクション種別、引数1、引数2、引数3、終了メッセージを返す
2.GSSのデータを正規表現で取得（REGEXEXTRACT関数利用）
3.ShellでRmMini3を実行
4.複数実行機能の実装
5.ShellでLine送信（優先度低）

これらを記事にする。


なお、すでにできているもの：
・Raspberry Piの設定
・Node.jsの設定
・Googlehomenotifierの設定
・VoiceTextの設定
・hubotの設定
・ShellでSlack送信
・ifttt側の設定
・Shellでmotion実行・停止
・Ngnixとかの設定

これらは後で忘れないようにそのうち記事にする。
【Ruby】getsメソッドの注意点

標準入力からの文字列との比較処理を行ったところ、なぜかうまく行かなかったので
その原因と解決策を備忘録として記載します。

## 問題点

`gets`メソッドは標準入力からの文字列を受け取るためのメソッドです。
このメソッドを利用して取得した入力文字列と別の文字列を比較しようとすると
思い通りの結果が得られませんでした。

```ruby
input = gets # hogeを入力
bool = (input == 'hoge')
print bool 
```

```
false
```

同じ値の文字列同士を比較してるはずなのになぜか`false`が返ってきました。

## 原因

調べたところ、どうやら`gets`メソッドは標準で末尾に**改行コード(\n)**を追加するみたいです。

```ruby
input = puts # hogeを入力
p input
```

```
"hoge\n"
```

改行コードが含まれている状態で比較しようとしていたので、比較しても弾かれてたみたいです。

## 解決策

末尾の改行コードを削除すればよさそうなので調べてみたところ、
そのためのメソッドとして`chomp`メソッドというのがあり、
こちらを利用したら、期待した結果が得られました！

```ruby
input = gets.chomp # hogeを入力
bool = (input == 'hoge')
print bool 
```

```
true
```

## 補足

`chomp`は何かの略称かなと思って調べてみたところ、teratailでの回答が参考になりました。
[chompってなんの略？](https://teratail.com/questions/258497)

> 推測をかなり含んでいますが
もともと、chopというのがあり末尾1文字を消す事ができました。
テキストファイルの末尾は改行で終わるのが(Unixの)マナーだったのでこれで問題なかったのですが
末尾に改行がついてないことや1文字でない環境もあったりと問題になり
「末尾の改行を削除する」関数が追加されchopのmultiline用だからchompになりました。

`chop`を末尾1文字から改行コード削除用にしたのが、`chomp`メソッドみたいです。

## 参考

https://stackoverflow.com/questions/21504202/why-is-stringchomp-named-like-this
LaravelのFactoryで連続した日付データの挿入

<br>
####Laravelのseederやらfactoryについて勉強中、連続した日付データの挿入に苦戦したので備忘録
<br>
<br>

<b>schedule_table</b>

|id|title|schedule_day|
|-----------:|------------:|------------:|
|1|aaa|2020-09-27|
|2|bbb|2020-09-28|
|3|ccc|2020-09-29|
|4|ddd|2020-09-30|
|5|eee|2020-10-01|

↑こんな感じで日付が連続したテストデータが欲しかった
<br>
<br>
実行するシーダーファイルを記述

```php:DatabaseSeeder.php
class DatabaseSeeder extends Seeder
{
    public function run()
    {
        $this->call([
            UserSeeder::class,
            ScheduleSeeder::class
        ]);
    }
}
```

<br>
対象のカラムはシーダーファイルから値を指定するので空文字にしておく

```php:ScheduleFactory.php
$factory->define(App\Models\Schedule::class, function (Faker $faker) {
    return [
        'title' => $faker->words,
         // seederファイルから上書きするので空にしておく
        'schedule_day' => '',
    ];
});
```

<br>
modify('+1day')でタイムスタンプを変更しつつ、その日付をfor文で一件ずつ挿入していく

```php:ScheduleSeeder.php
class ScheduleSeeder extends Seeder
{
    public function run()
    {
        $scheduled_date = new DateTime();
        for ($i = 0; $i < 5; $i++)
        {
            factory(App\Models\Schedule::class, 1)
            // createに配列でカラム名、値をセットするとfactoryファイルの内容を上書きできる
            ->create([
                'schedule_day' => $scheduled_date->modify('+1day')->format('Y-m-d')
            ]);
        }
    }
}
```

<br>
この辺、あまり参考記事がないので難しい、、
<br>
Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2) のエラー対処法


## 記事の目的
初学者の為、間違っているところはご指摘頂けると幸いです。
備忘録・アウトプット目的で投稿です。

##Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)

初学者の私は、こちらのエラーに何度も苦しみました。
 
このエラー以外にもCan't connect to local MySQL server through socket '/tmp/mysql.sock'(38)だとか、ERROR! The server quit without updating PID fileというエラーにも悩まされました。記事をみてみると、対処法として①PIDファイルの作成②権限の変更③再インストール対応が挙げられていましたが、色んな記事を試してもダメでした。（初学者なので、記事の理解・原因の理解ができていないからだと思います。）
同じように悩まれている初学者の方が私の解決策が参考となればと思い、残したいと思います。
（原因の理解はまだできていないので、解説抜きです。）
なので、試す場合は自己責任でお願いします。

##対処法
私の場合、mysql8.0をインストールしており、それで不都合が出るようでした。
なのでアンインストール対応します。

```
brew uninstall mysql
```

こちらのコマンドを打ちます。

```
sudo rm -rf /usr/local/Cellar/mysql*
sudo rm -rf /usr/local/bin/mysql*
sudo rm -rf /usr/local/var/mysql*
sudo rm -rf /usr/local/etc/my.cnf
sudo rm -rf /usr/local/share/mysql*
sudo rm -rf /usr/local/opt/mysql*
sudo rm -rf /etc/my.cnf
```

次にmysql@5.7をインストールして下さい。

```
brew install mysql@5.7
```

その後、パスを通すので、以下のようにexportかけます。

```
export PATH="/usr/local/opt/apr-util/bin:$PATH" >> ~/.bash_profile
export PATH="/usr/local/opt/mysql@5.7/bin:$PATH" >> ~/.bash_profile
source ~/.bash_profile
```

その後、mysql.server startを打ちます。

```
mysql.server start
```
Starting MySQL..SUCCESS!となるでしょうか？
パソコンを再起動すると、毎回このエラーが出ますが、私の場合は上記の対処法でエラーを解決することができます。
Rails6でActiveStorage導入でNameError: uninitialized constant ::Analyzableエラーが発生した対処

### エラー内容
```
NameError: uninitialized constant #<Class:0x0000000000000000>::Analyzable
from /bundle/ruby/2.7.0/gems/activestorage-6.0.3.3/app/models/active_storage/blob.rb:26:in `<class:Blob>'
```

### 発生した環境
- rails 6.0.3.3
- ruby 2.7

### 対処
https://railsguides.jp/upgrading_ruby_on_rails.html#rails-6でclassicモードのオートローダーを使う方法

```rb
# config/environments/development.rb

config.autoloader = :classic
```

### 関連 Issue
https://github.com/rails/rails/issues/38681
[AWS CLI v2]バージョンチェックとアップグレードをラクにしよう

# はじめに

何事も最新化しておくことは重要ですが 「XXX(Software) アップグレード」とググって手順を１つずつ実施...は手間ですよね...
今年(2020年)GAされた **[AWS CLI v2](https://aws.amazon.com/jp/blogs/news/aws-cli-v2-is-now-generally-available/)の最新バージョンチェックとアップグレードを楽に行う方法** を見つけたので本記事でシェアします。改造版も掲載していますので良ければご利用ください。

## 前提

当たり前かもしれませんが **AWS CLI v2 がインストールされていること** です。

- インストールしていない方は [AWS CLI v2 のインストール](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/install-cliv2.html) を要チェック

## 導入

[jamesls/alias](https://gist.github.com/jamesls/3623e9589db175509ec2c61536b6c6b9) のシェルを `~/.aws/cli` の階層に`alias`という名称で作成するだけです。(再起動は不要) 

主な用途は

- AWS CLI v2のバージョンチェック
- AWS CLI v2のアップグレード

になります。
それぞれ以下２つの用法をご確認ください。

# 用法１：AWS CLI v2 の バージョンチェックを行う

下記コマンドを実施することで **最新バージョンと手元のcliのバージョンが一致しているか確認** できます。

```code:shell
aws check-upgrade
```
# 用法2：AWS CLI v2 の アップグレードを行う

下記コマンドを実施することで **最新バージョンにアップグレードする** ことができます。
なお、既に最新版が導入されている場合も最新版インストールの処理が実行される仕様になっています。

```code:shell
aws upgrade
```

# 改修版：最新バージョンでなかった場合、アップグレードする

個人的には **「check-upgradeでバージョンが異なったらupgradeしてほしいな」** と思ったので
[Gistに手を加えてみました](https://gist.github.com/seiyashima/24bd19f0f5224e82a1b0b1f793acbd4b)。
是非ご利用ください。

# おわりに

非常に簡素な記事で恐縮ですが、同様の記事がなかったためシェアすることを目的に記載しました。
ちなみに **[awslabsのalias](https://github.com/awslabs/awscli-aliases/blob/master/alias)も非常に有用** ですので、ご利用を検討することをオススメします。
バリデーションメッセージを Decorator で加工する

のっぴきならない事情があり、フォームの入力パターンに応じて、バリデーションメッセージを生成後に加工したかったのでメモ。
例えば、下記のようなフォームがあったとする。

```ruby:new.slim
= form_for post_form, url: confirm_post_path do |f|
  - if post_form.errors.present?
    ul
      - post_form.errors.full_messages.each do |msg| 
        li = msg
```

しかし、フォーム内の特定の選択肢を選んだ場合に、バリデーションメッセージを変えるという要件が加わったとする。
この場合、errors.full_messages は Array なので、Decorator で中身を1件ずつチェックして力技で置換した。

```ruby:new.slim
= form_for post_form, url: confirm_post_path do |f|
  - post_form_decorator = ::PostFormDecorator.new(f.object)
  - if post_form.errors.present?
    ul
      - post_form_decorator.post_error_display(post_form.errors.full_messages).each do |msg|
        li = msg
```

```ruby:post_form_decorator.rb
class PostFormDecorator
  delegate_missing_to :@post_form

  def initialize(post_form)
    @post_form = post_form
  end

  def post_error_display(error_full_messages)
    error_full_messages.each do |msg|
      if @post_form.category == 'music'
        msg.gsub!(/#{@post_form.model.class.human_attribute_name(:author)}/, '歌手')
      end
    end
  end
end
```

破壊的メソッドで中身を入れ替えているので、「!」を付けなければgsubで置換されないので注意。
BigQueryで便利だったことSQLメモ

# SQLをちょっと試したい時のUNNEST
都合良いデータが無いときは`union all`を繋げて複数行をテストデータ作ってたけど、`unnest`を使えば短いコードでテストデータが作れる。

```sql:unnestを使ったSQL確認方法
select a, b 
from
  unnest([null, 1]) as a,
  unnest(['x', 'y']) as b

-- SQL結果
| 行 | a   | b |
| 1  | null| x |
| 2  | null| y |
| 3  | 1   | x |
| 4  | 1   | y |

-- 同じデータをunion allで作った場合
select a, b
from (
            (select null as a)
  union all (select 1 as a)
),
(
            (select 'x' as b)
  union all (select 'y' as b)
)  
```
Automation Anywhere A2019 - IQ Bot ローカルデバイス(IQ Bot アドバンス パッケージ)

#Bot Runner上で稼働するIQ Bot
IQ Bot A2019.16から、「IQ Bot [Local Device]」というパッケージが登場しています。
（少し分かりづらいのですが、IQ Bot Advanceという名前のjarファイルとなっており、APeopleよりダウンロードできます。）

従来のIQ Botでは、ドキュメントは一旦IQ Botサーバー側に送信する必要がありましたが、
このパッケージを使うことで、サーバーにドキュメントを送信しない形での変換処理や、大量のドキュメントの一括処理が可能となります。

コマンドは至ってシンプル、「ドキュメントを処理」の一つだけです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/615564/4e0423a9-669f-3c55-3df9-7db8755e67a2.png)

##仕組み

下の表を見てください。
従来のIQ Botについては、各処理がIQ Botサーバー側にて行われていました。
ラーニングインスタンスの作成やValidationの「IQ Botサーバー」は、IQ Botサーバーにブラウザでアクセスして実施するという意味です。

それに対して、IQ Bot Advanceでは、ラーニングインスタンスの作成は従来と変わりませんが、
ドキュメント処理はローカル環境のBot Runnerマシン上で行われます。
つまり、複数のBot Runnerマシンを立てれば、それだけ同時に変換処理を行うことが可能となります。
注意点としては、現状、対応しているOCRエンジンがABBYYのみという事でしょうか。

| 処理/機能 | 従来のIQ Bot | IQ Bot Advance |
|:-:|:-:|:-:|
| ラーニングインスタンスの作成  | IQ Botサーバー  | IQ Botサーバー  |
| ドキュメントの変換処理  | IQ Botサーバー  | Bot Runnerマシン  |
| Validation  | IQ Botサーバー  | IQ Botサーバー または Bot等で実施  |
| OCRエンジン  | 対応エンジン全て  | ABBYYのみ  |
|  カスタムロジック | 対応  | 対応  |


##アクションコマンド
コマンド内のパラメータ指定も至ってシンプルです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/615564/64c032c0-7157-c6d7-6a6e-7fa0e93a3490.png)

| パラメータ | 設定内容 |
|:-:|:-:|
| ラーニングインスタンス名  | 利用するラーニングインスタンスを選択します。  |
|  入力ドキュメントフォルダーパス | 処理を行う帳票が置かれているフォルダを指定します。福薄うのファイルがあれば全て処理されます。  |
|  出力フォルダーパス | 結果が配置されるフォルダです。このフォルダ配下にSuccess / Fail / BotNotReadyといったサブフォルダが作成されます。  |
|  検証ツールの設定 | ValidationをIQ Botのウェブインターフェースで行うか否かの設定。チェックを外した場合は、IQ BotのValidationキューには入らなくなりますので、例えばInteractive Formsを利用したValidation用Botを作成する等の対応になります。  |

##変換結果

実行すると、下記の様にサブフォルダが作成され、処理結果のファイルが配置されていきます。

| サブフォルダ | 対象 | ファイルフォーマット |
|:-:|:-:|:-:|
| Success | csv変換処理に成功したドキュメント  | csvファイル  |
| Fail  | Validationルールに引っ掛かったドキュメント  | csvファイル  |
| BotNotReady  | （IQ Botの）BotのステータスがProductionではない  | pdfファイル  |

Failフォルダに入った場合は、何らかのValidationルールに引っ掛かっていますが、
csvファイルの中を見るとその理由が分かるようになっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/615564/adf2e95a-ad5e-9e28-c3e1-18cc75c65072.png)

##ローカルでValidationを行う方法
ValidationをIQ Botサーバーで行うように設定した場合、当然のことながらIQ Botサーバー側へファイルが送信されます。
どうしてもローカルで処理を完結させたいという事であれば、Validationをサーバー側で行わないように設定します。
A2019.16のInteractive Forms機能では、テーブル表示も可能となっており、
csvファイルから読み込んだテーブル変数の内容をそのまま表示／編集可能となっています。
~~（2020/9/26時点では、どうやらバグがあり日本語のフォーム表示が出来ないようです。。。）~~
このテーブル表示と、PDF/png/jpg等を表示するドキュメント表示をフォームに配置することで、Validation用の画面を実装できるようになっています。
また、ダイナミックエリアを利用し、帳票毎または表部分の行毎に表示させてあげるのも良いですね。

###注意点・・・
IQ Bot Advanceのパッケージですが、約1.2GBありますので、御利用は時間に余裕のある時で。
Vue CLI  よく使うであろうコマンド　コピペ用

「こんなコマンドも使用頻度高め！」と言うのがあれば、コメントください:relieved:


#テストする時
```console
npm run serve
```

#プラグイン追加
```console
npm install vue-router

npm install vuex

vue add vuetify
```

**※現在、Vue3の場合は**
`vue-router@next`
`vuex@next`
のようにnextをつけないといけないようです！
https://qiita.com/kokogento/items/5ec64b0704a3f0019eec


#プロジェクトを作る時
```console
vue create my-project
```

#環境に関するデバッグ情報を出力
```console
vue  info
```
一対一のアソシエーションの定義方法について

・解決したい疑問
　テーブル同士の関係が一対一の時に、どちらのテーブルがhas_oneになるのか知りたい。

・考え方
　二つのテーブルの関係を考えた時に、独立して存在できるテーブルには、has_oneを用いる。
独立して存在できずに、あるテーブルに依存して存在しているテーブルには、belongs_toを用いる。

 例えば、twitterのようなアプリがあるとする。ここで、仮にtweetsテーブルとcommentsテーブルがあり、そのアソシエーションが一対一だとする。その時、ツイートはコメントがなくても存在できるが、コメントは、ツイートがなければ、存在することができない。

よって、tweetsテーブルに、has_oneを、commnetsテーブルにbelongs_toを設定すれば良い。
なお、実際には、tweetsに対して、複数のコメントができるのが、絶対的なので、今回の具体例は、あくまで仮の例です。
SOQLの結果をCSVファイルとして保存するApexバッチ

さくっとSOQLの内容をcsvファイル化できればいいなと思って探していると
いいサイトがありました。

https://salesforcekings.blogspot.com/2016/10/how-to-create-or-generate-csv-file-in.html

早速、chatterの投稿を抜き出すcsvファイル作成バッチを作ってみました。

```
public class CrearFeedItemCsvBatch implements Database.Batchable<sObject>, Database.Stateful {
// *************************************************
// FeedItemを抽出してCSVファイルを作成する
// K.Otsubo 2020/09/26
//
//
// CrearFeedItemCsvBatch bat = new CrearFeedItemCsvBatch();
// ID jobId = Database.executeBatch(bat);
//
// *************************************************

public CrearFeedItemCsvBatch () {
}

public String csvColumnHeader;
public List<String> csvRowValues = new List<String>();

public Database.QueryLocator start(Database.BatchableContext BC){
//ここでParentIdを指定してください
String query = 'select Id,Title, Body,InsertedBy.Name,CreatedDate,ParentId from FeedItem where ParentId=\'005100000095q5sAAA\' ';
return Database.getQueryLocator(query);
}


public void execute(Database.BatchableContext BC, List<sObject> scope){
//Process retrieved SetupAuditTrail records and format field values.
for(FeedItem currFeed : (List<FeedItem>) scope){
//csvColumnHeader = 'Id, Title, Body, Create User Name, LastEditDate , ParentId\n';
String Ids = currFeed.Id != null ? currFeed.Id : '';
String Title = currFeed.Title != null ? String.valueOf(currFeed.Title).escapeCsv() : '';
String Body = currFeed.Body != null ? String.valueOf(currFeed.Body).escapeCsv() : '';
String CreateUser = currFeed.InsertedBy.Name != null ? String.valueOf(currFeed.InsertedBy.Name).escapeCsv() : '';
String formattedDate = currFeed.CreatedDate.format('M/d/yyyy h:mm:ss a z');
String pIds = currFeed.ParentId != null ? currFeed.ParentId : '';

String rowStr = Ids + ',' + Title + ',' + Body + ',' + CreateUser + ','+ formattedDate + ',' + pIds;
csvRowValues.add(rowStr);
}
}

public void finish(Database.BatchableContext BC){
List<Folder> folders = [SELECT Id, Name FROM Folder WHERE Name = 'Sales Tools'];

if(!folders.isEmpty()){
String documentName = 'FeedItem-'+ Datetime.now();
csvColumnHeader = 'Id, Title, Body, Create User Name, CreatedDate , ParentId\n';
String csvFile = csvColumnHeader + String.join(csvRowValues,'\n');
System.debug('******** csvFile=' + csvFile);
Document doc = new Document(Name = documentName, Body = Blob.valueOf(csvFile), FolderId = folders[0].Id, Type = 'csv', ContentType='application/vnd.ms-excel');
insert doc;
}
}

}
```

実行は、開発者コンソールで
Debug->Open Execute Anonymous windowで
CrearFeedItemCsvBatch bat = new CrearFeedItemCsvBatch();
ID jobId = Database.executeBatch(bat);
と入力してExecuteすれば、このバッチ処理が走ります。

csvファイルはclassicのドキュメントのsales toolsの中にできます。

ただ、csvファイルはUTF-8で作成されていますので
Excelでそのまま開くと日本語が文字化けします。
別途UTF-8が使えるテキストエディタで開いて、文字コードCP-932で保存すれば
Excelで開いても文字化けしなくなります。

ApexでUTF-8からCP-932に変換する方法はあるにはあるのですが、
（正確にはCP-932をUTF-8に変換）
１文字ずつ変換するのでヒープサイズの制限でエラーになりやすいです。
Apexでは制限があるので、実際にはコントローラ(Java Script）内で行っています。
ただし、今回は画面を作らずApexだけなので、文字コード変換は割愛です。
【検証】checkboxとlabelを使えば切り換え機能を伴うUIは全てjavascriptを使わずに実装できる説

<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

## 検証する説
今回お持ちした説は、こちらです。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142322/487cd39d-19fe-7852-cab9-39575c4b4ecc.jpeg" alt="checkboxとlabelを使えば切り換え機能を伴うUIは全てjavascriptを使わずに実装できる説" width="600">
※ [devroom](https://devroom.azurewebsites.net/Generator/Wednesday)さんを使わせていただきました。

## どのような仕組みか
* `<input type="checkbox">`の`id属性`と、`<label>`の`for属性`で関連づけさせることができる。
    * `<label>`をクリックすると、チェックの切り換えが可能になる。
* チェックボックスがチェックされている時、チェックボックスの状態が`checked`になるため、疑似クラスセレクター`:checked`が使える。
* 要素の後ろにある同じ階層のセレクタの指定(`~`)を駆使すれば、その状態を他要素に伝えることができ、表示の変更が可能。

これらをフルで使うことによって、on/off切り換え機能を伴うUIはすべてCSSのみで実装が可能であると考えました。

※ 仕組みがわかりやすいように、あえて直タグでスタイルを当てております。良い子は真似しないでください。
※ デザインは仕組みが伝わるレベルです。

## 1. アコーディオン
アコーディオンがHTML・CSSのみで作れる！という話をよく聞くので、これは確実にいけそうですね！

<p class="codepen" data-height="265" data-theme-id="dark" data-default-tab="css,result" data-user="yuvernacrew-the-scripter" data-slug-hash="vYGPxja" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="CSS accordion">
</p>

※ `details/summary`を使えばいいやん！と思った方もいるかもですが、あくまで今回は検証のため、`checkbox`と`label`で実装します。

## 2. ハンバーガーメニュー
ハンバーガーメニューも、理屈はアコーディオンと同じなので、作れそう！

<p class="codepen" data-height="265" data-theme-id="dark" data-default-tab="html,result" data-user="yuvernacrew-the-scripter" data-slug-hash="BaKbwaB" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="BaKbwaB">
</p>

htmlの構造はビミョーですが、ハンバーガーメニューとしては機能するものができました！

## 3. モーダル
用件を満たせるかは怪しいけど、無理やり頑張れば行けそう...

<p class="codepen" data-height="265" data-theme-id="dark" data-default-tab="css,result" data-user="yuvernacrew-the-scripter" data-slug-hash="abNxZyr" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="CSS modal">
</p>

labelタグを使いまくることで、モーダルを開くボタンをクリックすると開き、×ボタンもしくはoverlayをクリックすると閉じるモーダルが完成しました。

## 検証結果
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142322/939b9416-0830-810e-2cb5-878f2355f2ee.jpeg" alt="検証結果 コードが不格好なので、javascriptを用いて実装した方が良い" width="600">
※ こちらも[devroom](https://devroom.azurewebsites.net/Generator/WednesdayResult)さんを使わせていただきました。

実装はできますが、**コードの可読性の低下や、意味合いを意識したマークアップができない**などの懸念がございます。
止むを得ずjavascriptが使えない場合のみ、参考にしていただけたらなと思います。
チャレンジレスポンス認証方式の特徴


応用情報技術者平成28年秋期 午前38

チャレンジレスポンス認証方式の特徴はどれか。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/527deb91-d1eb-612e-3b89-592d6325316a.png)


１、チャレンジレスポンス方式は、
通信経路上に固定パスワードを流さないようにすることで、盗聴によるパスワードの漏えいやリプレイアタックを防止する認証方式です。

※リプレイアタック（Replay Attack）とは、
ネットワークの盗聴者がログインシーケンス（IDやパスワードを送る手順）をそのまま記録し、後にこのシーケンスを対象サーバーに投げることです。

２、チャレンジレスポンス方式では以下の手順で認証：
・サーバは、クライアントから要求があるたびに異なる乱数値(チャレンジ)を生成して保持するとともに、クライアントへ送る。

・クライアントは、利用者が入力したパスワードと(1)でサーバから送られた"チャレンジ"から所定の方法でレスポンスを計算する。

・クライアントは、(2)で生成した"レスポンス"と利用者が入力した利用者IDをサーバに送る。

・サーバは、クライアントから受け取った利用者IDで利用者情報を検索して、取り出したパスワードと(1)で保持していた"チャレンジ"を用いてクライアントと同じ手順でレスポンスを生成する（レスポンス照合データ）。

・サーバは、"レスポンス照合データ"とクライアントから受け取った"レスポンス"を比較し、両者が一致すれば認証成功とする。


３、
・端末のシリアル番号を，クライアント側で秘密鍵を使って暗号化して送信する。
⇒端末のシリアル番号は送信しません。端末ごとに固有の番号を使用するといつも同じ認証データが使われることになるので、リプレイアタックを受ける可能性があります。

・トークンという装置が表示する毎回異なったデータを，パスワードとして送信する。
⇒時刻同期式ワンタイムパスワードの説明です。チャレンジレスポンス方式ではトークンは不要です。


参照：
https://www.ap-siken.com/kakomon/28_aki/q38.html

リプレイアタック（Replay Attack）
https://www.secomtrust.net/secword/replayattack.html
Xcode 12 「Double-quoted include」エラーの対処法

#Xcodeを12にアップデートすると、エラーが大量に。。
![スクリーンショット 2020-09-26 13.51.09.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/238f3c1e-cc92-3127-e3f0-2fce0397e917.jpeg)
 
アプリをビルドすると、**GoogleDataTransport Group**から大量のエラーが発生しました。

```console
- Double-quoted include "pb.h" in framework header, expected angle-bracketed instead
- Double-quoted include "pb_common.h" in framework header, expected angle-bracketed instead
- Double-quoted include "pb_decode.h" in framework header, expected angle-bracketed instead
- Double-quoted include "pb_encode.h" in framework header, expected angle-bracketed instead
-
```

ダブルクオートが含まれているのが、エラーの原因か？？

#解決法
`project>Pods>Build Setting>Quoted include in..`. を以下のように変える
![スクリーンショット 2020-09-26 13.51.32.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/e913b757-52b2-25f2-716d-8c465f819050.jpeg)

これでDouble-quotedはエラーとみなされなくなりました！

#参考
https://github.com/firebase/firebase-ios-sdk/issues/5987
Lispでカプレカ数

#LISP引退おじさん
老兵はさるべき、とlispは引退し、たまに自作のISLisp処理系をメンテナンスする程度になりました。この度、久々にLispを思い出しつつ簡単なものを書いてみました。

#カプレカ数
題材はカプレカ数としました。自然数の各桁の数を昇順、降順にソートし、その数の差をとると不思議な性質があることがわかっています。インドの数学者、Kaprekarさんによります。

詳しくはこの動画をご覧ください。楽しい数学の先生です。
https://www.youtube.com/watch?v=GtKVrd-ap84


#ひさびさ、Lispで躓いた
関数名を　number_to_list と書いてエラーになるのでしばらく悩みました。
関数引数を与えるってどうするんだっけ？　#'なのを思い出すのにしばらくかかりました。
（人間は忘却の生き物なり　笑い）


#意地でも再帰で書くよ
「あなたの書くコードは再帰が多用されていてわかりにくい。」と言われました。職業プログラマの人？　いえいえ、アカデミックな世界の方ですよ。世の中、変わったものです。意地でも全部、再帰で書きました。（笑い）　効率は無視です。豪快にappendを使ってます。

というわけでコードです。

```lisp

;; when n is kakrekar-number t else nil
(defun kaprekarp (n)
    (let* ((ls (number-to-list n))
            (a (list-to-number (sort ls #'>)))
            (b (list-to-number (sort ls #'<))))
        (= n (- a b))))

;; when digits of n is 4, stop at kaprekar number 
(defun kaprekar (n)
    (let* ((ls (number-to-list n))
            (a (list-to-number (sort ls #'>)))
            (b (list-to-number (sort ls #'<))))
        (cond ((= n (- a b)) t)
              (t (print (- a b)) (kaprekar (- a b))))))

;; insert sort
(defun sort (x fun)
    (sort1 x nil fun))

(defun sort1 (x y fun)
    (if (null x)
        y
        (sort1 (cdr x) (insert (car x) y fun) fun)))

(defun insert (x ls fun)
    (cond ((null ls) (cons x ls))
          ((not (funcall fun x (car ls))) (cons (car ls) (insert x (cdr ls) fun)))
          (t (cons x ls))))

;; e.g. [1,2,3] -> 123
(defun list-to-number(ls)
    (list-to-number1 ls 0))

(defun list-to-number1 (ls n)
    (if (null ls)
        n
        (list-to-number1 (cdr ls) (+ (car ls) (* n 10)))))

;; e.g. 123 -> [1,2,3]
(defun number-to-list (n)
    (if (< n 10)
        (list n)
        (append (number-to-list (div n 10)) (list (mod n 10)))))



```

ISLispはミニマムでsortはありません。自分で挿入ソートを書きました。

#動作

```
> (kaprekar 2312)
1998
8082
8532
6174
T
> (kaprekar 2342)
2088
8532
6174
T

```

#せっかくなのでコンパイラテスト

コンパイラでも大丈夫か？テストしました。

```
Easy-ISLisp Ver1.3
> (compile-file "number.lsp")
type inference
initialize
pass1
pass2
compiling SORT 
compiling SORT1 
compiling INSERT 
compiling LIST-TO-NUMBER 
compiling LIST-TO-NUMBER1 
compiling NUMBER-TO-LIST 
compiling KAPREKARP 
compiling KAPREKAR 
finalize
invoke GCC
T
>(load "number.o")
T
> (kaprekar 1232)
1998
8082
8532
6174
T
> 

```

よかった！。バグはなさそう。

#久々な感想
モダン言語処理系に比較すると冗長な感じがします。しかしながら、三つ子の魂百まで、やはりLispは懐かしいのでした。
OP25B(Outbound Port 25 Blocking)

応用情報技術者平成28年秋期 午前37

ISP"A"管理下のネットワークから別のISP"B"管理下の宛先へSMTPで電子メールを送信する。電子メール送信者がSMTP-AUTHを利用していない場合，スパムメール対策OP25Bによって遮断される電子メールはどれか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/3ead3b72-918d-21ea-55dd-7f3b748b4342.png)


１、OP25B(Outbound Port 25 Blocking)は、
名前の通り、外向き(インターネット方向)のポート25番宛て(SMTP)パケットを遮断することでスパムメールを防ぐ仕組みです。

※スパムメールとは、受信者の意向を無視して一方的に繰り返し送られる迷惑メールのことを指します。

ISP管理下の動的IPアドレスからの電子メール送信について、管理外ネットワークのメールサーバへSMTP通信を禁止することで、ISPのメールサーバを介さずに外部のオープンリレーサーバと直接コネクションを確立して送信されるスパムメールを防ぎます。

OP25Bでは、
　1.動的IPアドレスからの送信である，
　2.ISPのメールサーバを経由しない　
という2つの条件を満たした場合のみTCP/25宛てのパケットを遮断します。

またISPのメールサーバを経由しない場合であっても
　・固定IPからの送信
　・SMTP-AUTHで認証済ノードからの送信
についてはOP25Bの影響を受けません。

※ ISP【インターネットサービスプロバイダ / アクセスプロバイダ / Internet Services Provider】とは、
公衆通信回線などを経由して契約者にインターネットへの接続を提供する事業者。「プロバイダ」と略称されることが多い。

参照：
https://www.ap-siken.com/kakomon/28_aki/q37.html
初心者がAWSを始めてみた(1)

#はじめに
最近、仕事でAWSに触れる機会が増えてきたので、
個人的に勉強がてら始めてみようと思いました。

ここでは、初心者目線でAWSに触れていく様子を書いていこうと思います。

#AWSとは？
AWSとは「Amazon Web Service」の略で、
かの有名なAmazon社が提供しているクラウドサービスのことです。

ネットワークを経由して仮想コンピューターやストレージをはじめとする様々なサービスが提供されています。

詳しいことは、またどこかのタイミングで投稿したいと思いますw

#とりあえずはじめよう！

AWSは様々なサービスを提供していますが、
全部を理解するのは難しいです。
そもそも触りながらの方が覚えやすいと個人的に思ってます。(「習うより慣れろ」っていうんですかねw)

AWSを利用するにあたりアカウントを作成する必要があります。
※アカウントの登録自体は無料ですが、サービスの利用にお金が発生することがあります。
※アカウント登録から１年間はサービス利用料が無料の枠もあります。(https://aws.amazon.com/jp/s/dm/landing-page/create-free-account/?all-free-tier.sort-by=item.additionalFields.SortRank&all-free-tier.sort-order=asc)

早速アカウントを作成してみましょう。

##AWSアカウント作成

**ステップ１**
まずは、AWS公式サイトから「今すぐ無料サインアップ」を押します。(https://aws.amazon.com/jp/)
![スクリーンショット 2020-09-26 12.46.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/745880/df89bb9f-bbbe-04be-4a1d-4c9141e3f902.png)

**ステップ２**
必要事項を入力します。入力し終えたら「続行」を押します。
![スクリーンショット 2020-09-26 12.49.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/745880/f546bd00-2b6d-1a53-db10-329103345cf0.png)

**ステップ３**
必要事項を入力します。入力し終えたら「アカウントを作成して続行」を押します。
※氏名や住所は半角英数字での入力が指定されています。
![スクリーンショット 2020-09-26 13.00.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/745880/ec0328c0-7643-c835-99cc-1b4d58888f7e.png)


**ステップ４**
支払情報(クレジットカード情報)を入力します。入力したら次の画面に移動します。
![スクリーンショット 2020-09-26 13.07.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/745880/3b4ab91e-6ff1-b431-ffef-292ca25bda18.png)

**ステップ5**
本人確認をします。必要な情報を入力して本人確認をしてください。
![スクリーンショット 2020-09-26 13.13.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/745880/c7fe7fb5-a69c-a854-3872-89aec267e74e.png)

**ステップ6**
プランを選択します。お金を描けないのであれば「ベーシックプラン」一択です。
![スクリーンショット 2020-09-26 13.18.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/745880/e7ece79c-75c0-3b4d-80b3-b6e1028adda2.png)


お疲れ様でした。
これでAWSアカウントを作成できたので「コンソールにサインイン」を押して、
AWSマネジメントコンソールにログインしましょう。

ログイン画面が表示されるので、ルートユーザーにチェックを入れて、
先ほど設定したアカウント情報でログインします。
![スクリーンショット 2020-09-26 13.28.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/745880/bd4b97b1-52a9-167a-80f0-5b9a1da8c8f0.png)

ログインが成功するとAWSマネジメントコンソールが表示されます。
![スクリーンショット 2020-09-26 13.32.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/745880/e41a77e4-2b3a-32a4-12f0-6e30366c7c2b.png)

#次回
今回はAWSアカウントを作成するところまでで終えたいと思います。
AWSマネジメントコンソールからAWSのサービスを操作できますが、
始めるまであともう少しだけ準備が必要です。

今回作成したアカウントは「ルートユーザー」というものです。
簡単に言ってしまえば「なんでもできる神様アカウント」です。
このアカウント情報が漏洩するととんでもないことが起きてしまうのはお分かりですね？w

そこで、次回はアカウント情報を守る設定とIAMユーザーについて投稿します。
是非読んでくださいね〜

https://qiita.com/nissy-y-hargen/items/da8e27e2e7b48ad57473
SOAP(ソープ，Simple Object Access Protocol)、REST(Representational State Transfer)、DCOM(Distributed Component Object Model)、SIP（Session Initiation Protocol）、CORBA(Common Object Request Broker Architecture)

応用情報技術者平成28年秋期 午前35 

ほかのコンピュータ上にあるデータやサービスを呼び出すためのプロトコルで，メッセージ記述がXMLのヘッダとボディで構成されているものはどれか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/ad215f92-7674-6d99-0d89-55d6b5466f27.png)

１、SOAP(ソープ，Simple Object Access Protocol)は、　※XML
ソフトウェア同士がメッセージを交換する遠隔手続き呼び出し(RPC)のためのプロトコルです。汎用なデータ形式であるXMLに基づいて記述されており、Webサービスにとって有効な手段の一つとなっています。

２、REST(Representational State Transfer)　※XML
簡単に言うとHTTPのGETメソッドをリクエストを送信するとXML形式のデータが返ってるものです。例えばAmazonで指定されたURLに対して要求したいサービスを示すパラメータを指定したリクエストを送ると、商品情報などが含まれるXMLデータを取得することができます。

３、DCOM(Distributed Component Object Model)
ネットワーク上に分散配置されたコンピュータ上のソフトウェアコンポーネント同士が通信するのためのマイクロソフト社独自の技術です。

４、SIP（Session Initiation Protocol）
ユーザ間で、音声や映像などのマルチメディア通信のセッションの確立、変更、切断を行うプロトコルです。

Session Initiation Protocol（セッション イニシエーション プロトコル、SIP、セッション確立プロトコル）とは 2 つ以上のクライアント間でセッションを確立するための IETF 標準の通信プロトコルである。IP電話の呼制御などに利用されている。

５、CORBA（Common Object Request Broker Architecture）
様々なコンピュータ上で様々なプログラミング言語で書かれたソフトウェアコンポーネントの相互利用を可能にするものです。

XML経由ではなく、直接に呼ばせる。

コンポーネントを外部から呼び出す方法などは共通のIDL（Interface Definition Language：インターフェース記述言語）と呼ばれる言語によって記述され、呼び出し時にはそれぞれの言語環境へのマッピング（変換）が自動的に行われる。

CORBAではコンポーネント間の通信はORB（Object Request Broker）と呼ばれるソフトウェアを通じて行われる。ORBはデータ形式の変換などを行い、言語間の違いなどを吸収する。異なるコンピュータで動作するORB間は通信ネットワークを通じてIIOP（Internet InterORB Protocol）と呼ばれるプロトコル（通信規約）で接続され、同じコンピュータのコンポーネントとほとんど同じ手順で別のコンピュータのコンポーネントを呼び出すことができる。


参照：
https://www.ap-siken.com/kakomon/28_aki/q35.html

CORBA
http://e-words.jp/w/CORBA.html

SIP
https://ja.wikipedia.org/wiki/Session_Initiation_Protocol
AtCoder Library インストールの覚え書き (MacOS, VSCode)



- macOS Catarina で zsh を利用している環境を前提とします。
- ここでは任意のインストール先を `/***/` と表現します。

## AtCoder Library のダウンロード

GitHub から Clone する

```
% cd /***/
% git clone https://github.com/atcoder/ac-library.git
```

## C++ のインクルードパスを設定

`.zshrc` に以下の一行を追加

```.zshrc
export CPLUS_INCLUDE_PATH="$CPLUS_INCLUDE_PATH:/***/ac-library"
```

## 以上！

VSCode C/C++ extention の
`c_cpp_properties.json` への追加も必要かな？とおもっていましたが、
`CPLUS_INCLUDE_PATH` に通しておけば intelliSense も問題なく効くようです。
ただし設定後に VSCode を再起動しておく必要があります。

あとはソースコード上で以下のように読み込めばすぐに使用できました。

```
#include <atcoder/all>
using namespace atcoder;
```
【LineAPI×GAS】bot作成時における動作しない（応答しない）時


# はじめに

想定読者はLineAPI、GASの初学者で、
bot作りに挑戦しようとするも動かなかった人です。
（実体験に基づく解決方法を記載します）

- [LINE Messaging API + GAS + Googleスプレッドシートで集計Botを自作する](https://qiita.com/batakoo3/items/95ea16923d45631e4090)
- [【30分でやる】Google Spread Sheetで管理するLINE BOTの作り方](https://qiita.com/WdknWdkn/items/b78ae572e7cb5c9dfdca)

こちらの記事を参考にbot作成をしておりましが、
解決に時間がかかってしまった部分があったので、
同じ状況の人が少しでも楽になると幸いです。


# ①手順通りに進めても動かなかった
基本的に手順通り進めていけば、不具合なく動作するはずですが、
こちらに関して動作しない場合は色々原因があるかとは思いますので、
それぞれ見ていきたいと思います。
## チャンネルアクセストークン
【確認事項】
1 Messaging API設定の最下部にあるコードを発行しているかどうか
2 コードのコピーを間違えていないかどうか
3 貼り付け先の''は削除していないかどうか

## ウェブアプリケーションとして導入
【確認事項】
1 Who has acsess to the appの項目をAnyone, even anonymousに設定しているかどうか
2 Webhook URLに貼り付けるコードのコピーを間違えていないかどうか
3 Official Account Managerからデフォルトの応答メッセージをオフにしているかどうか

## GoogleAppsSpreadsheet
【確認事項】
1 スプレッドシートのIDのURL場所はあっているかどうか
2 貼り付け先の''は削除していないかどうか

# ②独自修正をしたものの、反映されない
上記の確認事項を全て満たしているものの、動かない時に役立つかと思います。

## LINEデベロッパーサイト
【試して欲しいこと】
1 Messaging API設定のWeb hocksのON、OFFを切り替え、ONにする
2 チャネルアクセストークンを再発行してみる

## ウェブアプリケーションとして導入
【試して欲しいこと】
1 Project versionをnewにして更新してみる
2 更新後のURLを再度貼り付けし直す

# まとめ
私の場合はProject versionをnewにせず、そのまま更新をひたすらしていたため、
botでメッセージを送信しても動作しませんでした。
ただ今回はあくまで初歩中の初歩のため、
エラー時の解決方法はより詳しく勉強する必要がありそうです。

少しでも参考になれば幸いです。

# 参考
- [LINE bot でおうむ返しができない【初心者】](https://teratail.com/questions/160664)
[Mac]node環境構築メモ

##目的
「りあクト!TypeScript で始めるつらくない React 開発第3版」を購入したところ、
本の環境構築にはnodenvを使ってたので、せっかくなのですでにあるnvmをアンインストールしてnodenvをインストールする。

## 1. node.jsをアンインストールする
###1.1 nodebrewをアンインストール
```
% brew uninstall nodebrew
```
そしてvimで~/.zshrc ファイルのnodebrewのパスを消す。(ファイルはシェルの種類に合わせる .bash etc）
 /
※なぜかアンインストールしても、nodebrewのディレクトリは残ったままなんですが、これは消していいものか、、、（誰か教えてください）

##2. nodenvをインストールする
###2.1 any.envをインストール
```
% brew install anyenv
% echo 'eval "$(anyenv init -) >> ~/.zshrc //パス関連のコードが展開されるよう
% exec $SHELL -l // シェルスクリプトを実行
% anyenv install nodenv
% exec $SHELL -l
```

##3. nodenv関連のプラグインをインストール
```
% mkdir -p $(anyenv root)/plugins //anyenvプラグイン用のディレクトリを作成
% git clone https://github.com/znz/anyenv-update.git $(anyenv root)/plugins/anyenv-update // git cloneしてきたプラグインを上のディレクトリ直下に保存
% mkdir -p "$(nodenv root)"/plugins //なんでこっちは""を使っているのか不明？？
% git clone https://github.com/nodenv/nodenv-default-packages.git "$(nodenv root)/plugins/nodenv-default-packages"
% touch $(nodenv root)/default-packages
```
default-packagesの中身は以下にする。
---------------
yarn 
typescript 
ts-node
typesync

---------------
anyenv-update: .env関連のアップデート同時にでくるパッケージ。

##4. node.jsをインストール

```
% nodenv install -l
% nodenv install 14.12.0  //リストからversion選ぶ
% nodenv global 14.12.0
% node  //起動確認
```

##捕捉
他の.env関連のツールを入れている場合はanyenvにまとめるか削除した方が良さそう。

###.envファイルを.anyenvへ統合

```
% ls -d ~/.*env //他の.envの存在を確認
% mv ~/.rbenv ~/.anyenv/envs/rbenv //rbenvの場合　
```
さらに.zshrcなどに書かれたrbenvのパス関連のコードを消す。
[CSS] スクロールバーは表示されるが親要素が拡大されてスクロールが機能しない

# 背景

flex の要素にスクロールバーを追加するため、`overflow-y: scroll` を追加すると、スクロールバーは表示されるがスクロールしてくれない。

`height` を指定すれば解決するが、flex 要素なのでやりたくない。

### 理想

![Screenshot from 2020-09-26 04-40-08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104336/9b05801e-65ce-7dba-8a2e-3d0b44d41d0d.png)

### 現実

![Screenshot from 2020-09-26 04-39-47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104336/40e184c3-db60-725d-78c7-906168b67436.png)

# 結論

スクロールバーを追加したい要素の親要素を `overflow: hidden` としなければならない。

# ソースコード

https://codepen.io/buyoh/pen/vYGPgjx

```html
<div class="col" style="width: 320px; height: 240px;">
  <div class="flex">
    foo
  </div>
  <div class="flex row" style="overflow-y: hidden;">
    <div class="flex scroll">
      <div id="loongitem"></div>
    </div>
    <div class="flex">
      bar
    </div>
  </div>
</div>
```

```css
body{
  font-family: monospace;
}
div{
  margin: 1px;
  padding: 1px;
  border: 1px solid red;
}
.col{
  display: flex;
  flex-direction: column;
}
.scroll {
  overflow-y: scroll;
}
.row{
  display: flex;
  flex-direction: row;
}
.flex{
  flex: 1 1 auto;
}
#loongitem{
  width: 40px;
  height: 800px;
  background-color: #7cf;
}
```


# コメント

何が起きているのか、推測してみました。
デフォルトのvisibleの場合。

- `overflow:scroll` の付いた flex 子要素に、縦に長い要素をレイアウトする
- flex 親要素は、`overflow:visible` なので、子要素を全て描画する
- flex 親要素には高さ指定がされていないので、flex の計算値を無視して（？）子要素が全て描画されるような高さに調整する（？）
- 子要素の高さは、親要素の高さに追従する
- びよーん

hiddenの場合。

- `overflow:scroll` の付いた flex 子要素に、縦に長い要素をレンダリングする
- flex 親要素は、`overflow:hidden` なので、子要素を全て描画しない
- 全て描画する必要がないので、親要素の高さは子要素の高さに依存しなくなる
- 親要素の高さが依存するのは flex の計算値のみ
- 親は枠からはみ出ない

確かに、一般には要素の高さは親要素では無く子要素に依存しますよね。  
依存が逆転するようなケースの場合、子要素の大きさの依存を明示的に断ち切る必要があって、それが今回の `overflow:hidden`　では？
(Ruby on Rails6) 投稿された内容を"消去" する

#まえがき
ここでは、RubyonRails6を使用して、投稿内容を <strong>編集(内容の消去)</strong> を行う忘却録を記録します。
以前の投稿で <a href="https://qiita.com/Tateishi0819/items/f4b7ba7c84edd3345aa7" terget="blank">編集機能の実装</a> を行いました。編集機能の実装はそちらで記録しているので確認されたい方は、そちらでご確認ください。

#投稿された内容を"消去" する
この投稿を実装するためには、<strong>アクション</strong> に <strong>データの消去(クリック)・投稿一覧への転送</strong> を行います。
##routes の設定
routes に <strong>deleteアクション</strong> を作成します。
<strong>form/:id/delete</strong> で、消去したいidのURLを特定させています。
また、データベースを<strong>変更する</strong>場合はroutes上で "get" ではなく <strong>"post"</strong> で設定します。

```rb:config/routes
・
・
・
post "form/:id/delete" => "form#delete"
```

##View へのリンク設定
```erb:app/views/任意.html.erb
・
・
・
<%= link_to("削除", "/form/#{@post.id}/delete", {method: "post"}) %>
```

<strong>link_to </strong> を用いて、先ほど作成した deleteアクション へリンクしています。

###注意: get と post の違い
<strong>{method: "post"})</strong> をつけることで、routesのpostと紐づけることができます。
ややこしい!!

```erb:app/views/任意.html.erb
postでは↓エラー
<%= link_to("削除", "/form/#{@forms.id}/delete") %>

↓が正しい
<%= link_to("削除", "/form/#{@forms.id}/delete", {method: "post"}) %>
```

##データを取り出して削除する

```rb:app/controllers/任意.rb
  def delete
    @forms = Form.find_by(id: params[:id])
    @forms.destroy
    
    redirect_to("/")
  end
```

###↑の詳細

```rb:app/controllers/任意.rb
  def delete
    # find_byメソッドで、データを取得する
    @forms = Form.find_by(id: params[:id])
  end
```

```rb:app/controllers/任意.rb
  def delete
    # @テーブル名.destroy で削除する
    @forms.destroy
  end
```

```rb:app/controllers/任意.rb
  def delete
    # redirect_toメソッド でリダイレクトを設定する
    redirect_to("/")
  end
```

以上が、完了しエラーが怒らなければ、削除機能が出来上がっているはずです。
いかがでしたか？

#あとがき
ここまで読んでいただき、ありがとうございました。
データベースの設定から表示・修正の機能を実装していて、投稿に削除機能をつけると本格的なサイトみたいですね。
でも、投稿機能が無事に削除された時は嬉しいけど切ない気持ちになります(Why?)

データーベースの作成・編集・デリート と基本機能を今までで実装しました。
セキュリティーや詳細機能を今後は学びたいと思います。

#参考リンク

<a href="https://www.amazon.co.jp/Ruby-Rails-%E5%AE%9F%E8%B7%B5%E3%82%AC%E3%82%A4%E3%83%89-impress-gear/dp/4295008052" target="blank">Ruby on Rails6 実践ガイド</a>


#Myリンク
また、Twitter・Portfolio のリンクがありますので、気になった方は
ぜひ繋がってください。プログラミング学習を共有できるフレンドが出来るととても嬉しいです。

<a href="https://twitter.com/0819_tateishi" target="blank">Twitter</a>
<a href="https://ayu-portfolio.herokuapp.com/" target="blank">Portfolio</a>
<a href="https://github.com/ayu0819" target="blank">Github</a>
PHP Laravel 6 おすすめ映画投稿サイト作成過程 9:リレーション編

#リレーションの定義

##リレーション3パターン

###１対１
一つのモデルが一つのモデルと関係を持つタイプです。


###１対多
一つのモデルが多くのモデルを持つタイプです。



###多対多
三つ以上のモデルが存在し、それぞれが関係を持つタイプです。



##多対多で、タグをボタン選択式にして実装
今回のタグ付けには、多対多を使用します。
まず、recommendsテーブルとtagsテーブルを関連付けるためのrecommend_tagテーブルを作成します。

```
$ php artisan make:migration create_recommend_tag_table
```

次に、作成した　create_recommend_tag_table　を以下の内容に編集します。

```recommend/database/migrations/2020_09_26_103413_create_recommend_tag_table.php
public function up()
    {
        Schema::create('recommend_tag', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->unsignedBigInteger('recomend_id');
            $table->unsignedBigInteger('tag_id');
        });
    }
```



```recommend/app/Models/Recommend.php
class Recommend extends Model
{
    protected $fillable = [
      'title',
      'image_file_name',
      'image_title',
      'url',
      'description',
      'Impressions'
    ];

    //リレーション
    public function tags()
    {
    return $this->belongsToMany(tag::class);
    }
}
```


```recommend/app/Models/Tag.php
class Recommend extends Model
{
class Tag extends Model
{
    protected $fillable = [
      'title',
    ];

    //リレーション
    public function recommend()
    {
    return $this->belongsToMany(Recommend::class);
    }
}
```

recommendと連帯した表示をさせるため、コントローラにtagモデルを設定します。

```recommend/app/Http/Controllers/RecommendController.php
use App\Models\Recommend;
use App\Models\Tag;
// use Illuminate\Http\Request;
use App\Http\Requests\RecommendPostRequest;

```

recommendコントローラーにtagを渡します。

```recommend/app/Http/Controllers/RecommendController.php
public function create()
    {
        $tags = Tag::all();
        return view('recommends.create', compact('tags'));
    }


public function edit(Recommend $recommend)
    {
      $tags = Tag::all();
      return view('recommends.edit', compact('recommend', 'tags'));
    }
```


recommendのeditとcreateにtagをforeachで組み込み

```recommend/resources/views/recommends/create.blade.php
@foreach($tags as $tag)
  <th>
  <input type="checkbox" name="tag">{{$tag->title}}
  </th>
  @endforeach
```
グローバルアドレス、プライベートアドレス、ブロードキャストアドレス、マルチキャストアドレス

応用情報技術者平成28年秋期 午前33

IPアドレス208.77.188.166は，どのアドレスに該当するか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/04aa01cf-8001-3a1d-a81a-3abaf116f97c.png)


１、アドレスクラス
208（10進数）→11010000（10進数）。これは、クラスCですね。

IPアドレスは先頭数ビットによって以下のようにアドレスクラスが判断できるようになっています。
0 　 → クラスA
10 　→ クラスB
110  → クラスC
1110 → クラスD
1111 → クラスE


２、クラスCにおけるグローバルIPアドレスとプライベートIPアドレスの範囲は下表のように規定されています。

クラスA:
　グローバルIPアドレス：1.0.0.0 ～ 9.255.255.255
　プライベートIPアドレス：10.0.0.0 ～ 10.255.255.255　0000 1010
　グローバルIPアドレス：11.0.0.0 ～ 126.255.255.255

クラスB:
　グローバルIPアドレス：128.0.0.0 ～ 172.15.255.255
　プライベートIPアドレス：172.16.0.0 ～ 172.31.255.255 1010 1100=128+32+8+4
　グローバルIPアドレス：172.32.0.0 ～ 191.255.255.255

クラスC：
　グローバルIPアドレス：192.0.0.0 ～ 192.167.255.255
　プライベートIPアドレス：192.168.0.0 ～ 192.168.255.255 1100 0000=128+64
　グローバルIPアドレス：192.169.0.0 ～ 223.255.255.255

クラスD:
　IPマルチキャスト専用：224.0.0.0 - 239.255.255.255　（1110-で始まる）

クラスE：
　将来の使用のために予約されている：240.0.0.0 - 255.255.255.255　（1111-で始まる）


・IPマルチキャストとは、
IP（Internet Protocol）で制御されるネットワーク上で、特定の複数の相手に同じデータをいっぺんに送信すること。送信側はデータを一度送信するだけで、経路途上の通信機器が受信者のいる経路にだけデータを複製して送り届ける。一対多の放送型のデータ配信を効率的に行うことができる。


参照：
IP address - Global IP address / Private IP address
https://www.infraexpert.com/study/ip5.html
Gitで間違えてコミットしたファイルをadd前の状態に戻したい！泣

タイトルの通りです。
先に結論を書いておきます。

```
git reset HEAD^
```

以上です。これで解決です。

ここからは、読まなくても問題ないです。
タイトルだけだとよくわからないという方は、お読みください。

（経緯）
あるブランチで作業していたら、いったん今の作業を退避させて、別の作業をしたいと思い、
意気揚々と`git commit`し、
`git stash`しようとおもったのですが、

```
$ git stash
No local changes to save
```

あれ？
あーーー！！そうだ、なぜコミットしてしまったんだ、、、泣
(`git stash`はコミットしていない変更がある状態で上記のコマンドを実行すると、変更した部分が退避されます。)

やばいやばい、ここは`git revert HEAD`か？
いや、それだとこれまでに変更した作業が消えてしまう、、、、

このまま作業するしかないのか、というときに、やっぱりありました。
（まあそりゃありますよね）

```:対処前のコミット履歴
$ git log --pretty=oneline | awk '{print $1}'
376980ec2b9005f4a80862da7d0955bd850d9d57
f892d3ceb3632eb38f102ac9d0ed5b587f71a1e3
```

冒頭でも記載した`git reset HEAD^`これで解決です。


```:対処後のコミット履歴
$ git log --pretty=oneline | awk '{print $1}'
f892d3ceb3632eb38f102ac9d0ed5b587f71a1e3
d34480810741248c1bf8f1d8278f590bc61bc37d
```

はい、一番上のコミットが消えてますね！
そして、変更したファイルもそのままです。add前の状態に戻っています。

同じような境遇にあわれた方の参考になれば嬉しいです。
【Unity】ScrollRectを継承したクラスのpublic変数をInspectorに表示するEditor拡張

# 確認環境
Unity 2020.1.6fa

# 内容
ScrollRectを継承して無限スクロール、多重スクロールなどを実装しようとしたときに継承先のpublicやSerializeFieldの変数がInspectorに表示されなかったのでEditor拡張で表示させてみました。


```CustomScrollRect.cs

using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

namespace Custom.UI
{

    public class CustomScrollRect : ScrollRect
    {
        public Transform test;
        public GameObject hoge01;
        [SerializeField]private GameObject hoge02;
        public GameObject[] hoge03;
        public List<GameObject> hoge04;
    }

}
```
testやhoge01などが表示されていない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175167/3a6ef2b1-8638-119c-61ed-b20342404249.png)

---
ScrollRectなどは独自のEditor拡張されているので表示されないみたい。
ということで考えたら[ScrollRectEditor.cs](https://github.com/Unity-Technologies/uGUI/blob/eba27f4eca40e88ba5d76c3f439fef950f9f38a5/UnityEditor.UI/UI/ScrollRectEditor.cs)を継承したEditor拡張を作ればうまくいくと思いやってみました。

```CustomScrollRectEditor.cs
using UnityEngine;
using System;
using System.Reflection;
using UnityEditor;
using UnityEditor.UI;
using Custom.UI;

namespace Custom
{

    [CanEditMultipleObjects]
    [CustomEditor(typeof(CustomScrollRect), true)]
    public class CustomScrollRectEditor : ScrollRectEditor
    {
        public override void OnInspectorGUI()
        {
            serializedObject.Update();

            if (serializedObject.targetObject is CustomScrollRect customScrollRect)
            {
                Type classType = customScrollRect.GetType();
                FieldInfo[] fieldInfos = classType.GetFields(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);
                for (int i = 0; i < fieldInfos.Length; i++)
                {
                    FieldInfo fieldInfo = fieldInfos[i];
                    object[] attributes = fieldInfo.GetCustomAttributes(true);
                    bool isSerializeField = false;
                    foreach (var attribute in attributes)
                    {
                        if (attribute.GetType() == typeof(SerializeField))
                        {
                            isSerializeField = true;
                            break;
                        }
                    }
                    if (fieldInfo.Attributes != FieldAttributes.Public && !isSerializeField) continue;
                    SerializedProperty serializedProperty = serializedObject.FindProperty(fieldInfo.Name);
                    EditorGUILayout.PropertyField(serializedProperty);
                }
            }

            serializedObject.ApplyModifiedProperties();

            // 区切り線
            GUILayout.Box("", GUILayout.ExpandWidth(true), GUILayout.Height(2));

            base.OnInspectorGUI();


        }
    }
}

```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175167/6dfb47ad-ffb3-4b88-3280-0f4cee9b2342.png)

しっかり元のScrollRectの表示も維持してうまく表示されました。

# 最後に

ほかにもすでにEditor拡張されているクラスを継承したときにはこの方法を使えばうまく表示されると思います。
永田ゆかり『データ視覚化のデザイン』の誤植情報を集める

永田ゆかり『データ視覚化のデザイン』(SBクリエイティブ)

- 出版社サイト： https://www.sbcr.jp/product/4815604059/
- 正誤表： https://www.sbcr.jp/support/4815602851/

読み終えたのでまだ正誤表に載っていない誤植情報を集めてみます。
あとで問い合わせから報告しようと思います。
他にも見つけた方はコメントか編集リクエストで教えてください。

|頁|誤|正|
|:---:|:---:|:---:|
|57|「これは何の分析・視覚化なのか」を表すものなのかを伝える役割があります。|※文章がおかしい|
|58|どのようなタイトルであれ、オーディエンスを誤解されるようなことがあってはいけません。|オーディエンス**に**誤解される　または　オーディエンスを誤解**させる**|
|94|ワッフルチャートの例の図の下の赤枠の最初に¥マークが入っている||
|123|イギリスの不動産の販売価格その位置とともに確認できます。|イギリスの不動産の販売価格**が**その位置とともに確認できます。|
|138|上がっている指標の背景にはピンク、下がっているところにはブルーを使い|※色が逆かもしれない|
|149|eNPSの仕組みの図に12人いる|※正しくは11人|
|192|キャズムとは商品が行き渡る際に存在する生涯を意味します。|キャズムとは商品が行き渡る際に存在する**障害**を意味します。|
【Laravel】Eloquent:複数代入時の$guardedの使い方についての備忘録

#開発環境
PHP7.3
Laravel5.8
MySQL8.0

#フォームから送信した値を保存する時などに、「値を用意しない項目」を$guardedで指定する

```
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Message extends Model
{
    protected $guarded = ['id'];
}

// データ保存時に['id']は除かれる
// フォーム側で['id']を送信しなくともnullエラーが起きない
```

#逆に、「この値のみを保存したい」という時は$fillableで指定する

```
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Message extends Model
{
    protected $fillable = ['chat_room_id', 'context', 'post_user_info_id'];
}

// 送信した値の中から、'chat_room_id', 'context', 'post_user_info_id'のみを保存し、それ以外の値は除かれる
```

#まとめ
指定時の挙動から、
$fillableは「ホワイトリスト」
$guardedは「ブラックリスト」
と言われているらしい。