OmniAICreator/Qiita-1.07M huggingface dataset:
[rails]gem 'payjp'の実装手順

1.gem 'payjp'をインストールする

#2.orderコントローラー作成記述する
```
  def index
    @order = Order.new
  end

  def create
    @order = Order.new(price: order_params[:price])
    #@orderにprice="1000"値段が入る
    if @order.valid?
      # 保存するための条件(空欄じゃない)をクリアすれば支払、データー保存される
      pay_item#支払をする
      @order.save#データーを保存する
      return redirect_to root_path
    else
      render 'index'
    end
  end

  private
  def order_params
    params.permit(:price, :token)#データー保存を許可したカラム
  end
  def pay_item
    Payjp.api_key = ENV["PAYJP_SECRET_KEY"]  # PAY.JPテスト秘密鍵
    Payjp::Charge.create(
      amount: order_params[:price],  # 商品の値段
      card: order_params[:token],    # カードトークン
      currency:'jpy'                 # 通貨の種類(日本円)
    )
  end
end
```
・token(カード情報)はorderテーブルに保存しない。
なので@orderにはprice: order_params[:price]で
ユーザーが入力したprice値段の情報が代入される

・pay_itemにより支払完了し
@order.saveでprice:1000、値段の情報をテーブルに保存する

#3モデルにバリデーションの情報を記述する
```
class Order < ApplicationRecord
validates :price, presence: true
end
```
・バリデーションとは？データーをテーブルに保存する際の条件

・今回はpriceの入力欄が空の状態で送信すると
データーを保存させないようにしている。

・token（クレジットカード情報）はテーブルに保存しないので、バリデーション
保存の条件を記述しない。
WSL2から外のサーバーにsshしようとしたらウイルスチェックソフトのファイヤーウォールにはじかれた

ファイヤーウォールに穴をあける必要があった。

~~`ip a`でeth0のIPアドレスを調べる~~

```sh
ip a
# 中略
4: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
# 中略
    inet 172.18.6.251/28 brd 172.18.6.255 scope global eth0
```

~~WSL2は起動のたびにIPが変わるらしいので、ネットワークごと22ポートを許可する。
`172.18.6.251/28`はネットワークアドレスが`172.18.6.240`、サブネットマスクが`255.255.255.240`だった。~~

---

これはダメだった。なんとWSL2が利用しているHyper-Vの仮想インターフェースのネットワークアドレスから丸ごと毎回変わりやがる。

仕方がないので、Hyper-Vの仮想スイッチと対応するNWインターフェースに対して22ポートを許可するように設定した。

これはもうちょい何とかならんのWSL2
【Swift】Alamofire 5.x~のタイムアウト値(timeoutInterval)設定方法

Alamofire 5.X系で、timeout 設定方法について
調べてもあまり参考になるサイトが出てこなかったので、備忘録

#環境
- Xcode: 11.3.1
- Swift5
- Alamofire 5.2.1

##・requestModifierを指定
```Swift:
        AF.request("https://xxxxxxxxxxxx",
                   method: .get,
                   parameters: parameters,
                   requestModifier: { $0.timeoutInterval = 5.0 }).responseJSON { response in
        }
```
AF.requestに「requestModifier: { $0.timeoutInterval = 5.0 }」を追加することで、
タイムアウト値をセットすることが可能となる。
※上記コードでは5.0秒にセットしています。こちらは任意の秒数に変更して下さい。
link_toの文字列部分にHTMLタグを挿入する方法

文字列部分にfontawesomeを使用したいときなどにすぐ思い出せるように自分用に残しておきます。

```index.html.erb
　<%= link_to new_user_session_path, class: "new-post__btn" do%>
　　　<i class="fas fa-edit"></i>  ///fontawesomeでコピーしたHTMLタグ
　<%end%>
```

:warning:無料で使う場合はproとついているフォントは使えない。
CentOS8にGolang/MariaDBをインストールし、DB接続してSQLを実行する

##概要
Golang学習用備忘録です。
今回以下URLを参考にさせていただきました。

[Go 言語から MariaDB Server を使ってみる](https://www.s-style.co.jp/blog/2019/06/4130/)
[GoでMySQLに接続する](https://qiita.com/taizo/items/54f5f49c6102f86194b8)

##Golangインストール/動作確認

よろしければ、以下を参考にしてください。
[CentOS8にGolangをインストールする](https://qiita.com/tomotomo3/items/38e7fed248278a3295b9)

##MariaDBインストール/GoからMariadbへの接続準備

```bash:ターミナル
#Mariadbインストール
dnf install -y mariadb mariadb-server

#MariaDBを起動・自動起動設定
systemctl start mariadb
systemctl enable mariadb

#MariaDBのrootユーザーの初期パスワードを設定
/usr/bin/mysql_secure_installation

#Set root password? [Y/n] y　→「y」を選択
#New password: 　→入力
#Re-enter new password: →再入力
#Password updated successfully!

#Mariadb バージョン確認
mysql --version

#バージョン情報が表示されること

#gitがインストールされていない場合には、下記コマンドにて
#インストールを行う
dnf -y install git

#MariaDBからGo用Connectorが提供されていないため、
#GitHubで公開されているMySQL用ドライバを使用
go get github.com/go-sql-driver/mysql
```

 - 接続用Goモジュール作成

```go:check_mariadb_ver.go
 
package main

import(
        "database/sql"
        "fmt"
        _ "github.com/go-sql-driver/mysql"
)

func main(){
        //データベースに接続
        db, err := sql.Open("mysql", "ユーザ名:パスワード@/データベース名")
        if err != nil {
                fmt.Println(err.Error())
        }
        defer db.Close()

        //バージョン情報確認
        var version string
        db.QueryRow("SELECT VERSION()").Scan(&version)
        //バージョン情報出力
        fmt.Println("connected to:", version)
}
```

 - モジュール実行

```bash:ターミナル

#実行
go run check_mariadb_ver.go

#バージョン情報が出力されること
connected to: 10.3.17-MariaDB
```

##まとめ

GoからMariadbに接続して、SQLを実行するところまでをみていきました。
今後は、Goを活用してのAPI作成等行い、
最終的には、簡単なアプリケーションを開発してみたいと思います。
Cloud Functions用Cloud FirestoreトリガーのeventIdを使ったべき等関数の一部ケースに関する検証

Cloud Functions用Cloud Firestoreトリガーは、1回**"以上"**呼ばれる可能性があり、複数回呼ばれても大丈夫な設計が求められます。
※ PUSH通知を書く処理を書いていたとして2回呼ばれたら2回通知が飛んでしまいますね。

> イベントは必ず 1 回以上処理されますが、1 つのイベントで関数が複数回呼び出される場合があります。「正確に 1 回」のメカニズムに依存することは避け、べき等になるように関数を記述してください。
> https://firebase.google.com/docs/functions/firestore-events

Idempotent (べき等)については、こちらもご参考までにです。
何度呼ばれても結果がおなじになるように、ぐらいの意味ですね。
https://developer.mozilla.org/ja/docs/Glossary/Idempotent

さて、べき等にするためのヒントはこちらの資料にあります。
https://cloud.google.com/blog/products/serverless/cloud-functions-pro-tips-building-idempotent-functions

上記の資料によると eventId を使用すると良さそうですね。

```typescript
export const notifyToAdmin = functions.firestore
  .document('articles/{articleID}')
  .onCreate(async (snap, context) => {
    console.log(context.eventId)
})
```

このeventIDを1回目の処理の際にFirestoreに保存しておき
2回目以降はその値があると処理をやめるようにすると良さそうですね。

さて！今回、気になりましたのは

```typescript
export const notifyToAdmin = functions.firestore
  .document('articles/{articleID}')
  .onCreate(async (snap, context) => {
    console.log("notifyToAdmin:", context.eventId)
})

export const notifyToUsers = functions.firestore
  .document('articles/{articleID}')
  .onCreate(async (snap, context) => {
    console.log("notifyToUsers:", context.eventId)
})
```

このように同じドキュメントの変更に対してトリガーを設定した場合に
eventIDが違うものになるかということです。

もしおなじになってしまえば、先ほどの対応策は間違いということになります。
結果のログはこの様になりました。

![CleanShot 2020-09-08 at 09.28.59@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6678/980d8cba-183c-98cc-360a-0ee63480c99a.png)

途中までIDは一緒ですが最後の数字で区別しているようですね！
このようなケースでも、eventIDを利用して、べき等になるような関数を作ることが出来ることが確認できました。

最後にeventIDをUniqueでFirestoreに書き込む際の参考記事をご紹介します。
eventIDが保存されるのが必ず1回とすることにより関数が2回実行されてしまうことを防ぐことが出来ます。
[Cloud FirestoreでUniqueを実現する2手法とその使い分け
](https://qiita.com/yoneapp/items/10ece76fed7e8af6c871)
PG::ConnectionBad: could not connect to server: No such file or directory

#PG::ConnectionBad: could not connect to server: No such file or directoryというエラーがでた

##解決法

1,ターミナルでdesktopの前に行く。

2,
```$ cd /usr/local/var/log/
```

3,
```$ cat postgres.log
```

そうすると以下のようなエラーがでる
```dyld: Library not loaded: /usr/local/opt/icu4c/lib/libicui18n.62.dylib
  Referenced from: /usr/local/bin/postgres
```

4,以下の記事を参考に実行
https://qiita.com/eightfoursix/items/bf11693b085eced95e29

4-1
```$ brew upgrade
```

4-2
```$ brew postgresql-upgrade-database
```

自分の場合は、これで解決しました。
vscodeのneovim extentionが動かなくなったので、しょうがなくMacにHomebrew経由でneovim 0.5 をinstallするぜ

# これはなにか
vscodeでnvimのextentionを使っているのですが、動かなくなりました。
neovim の 0.5 が必要らしいです。
brew で普通にinstall && upgrade すると、0.4系しかinstallできませんでした。

# 解決方法

```shell
brew unlink neovim # すでにneovimをmacでinstallしている人はunlinkする必要がある
brew install --HEAD neovim
```

# エラーハンドリング

## cmake をreinstallしろよエラー

### error log
```
==> Checking out branch master
Already on 'master'
Your branch is up to date with 'origin/master'.
HEAD is now at a90cd6e Merge #12868 vim-patch:8.2.{1625,1630,1633}
Error: An exception occurred within a child process:
  RuntimeError: /usr/local/opt/cmake not present or broken
Please reinstall cmake. Sorry :(
```
### solution

```
brew install cmake
```

## luarocks をreinstallしろよエラー

```
==> Checking out branch master
Already on 'master'
Your branch is up to date with 'origin/master'.
HEAD is now at a90cd6e Merge #12868 vim-patch:8.2.{1625,1630,1633}
Error: An exception occurred within a child process:
  RuntimeError: /usr/local/opt/luarocks not present or broken
Please reinstall luarocks. Sorry :(
```

### solution

```
brew install luarocks
```

# まとめ

# neovim, nolife!

### twitterもフォローよろしくおねがいします。 ！
https://twitter.com/yoshixj
Linuxサーバーコマンド

Linuxサーバーコマンド

実行環境：Centos7 on Virtualbox , ユーザ名 vagrant

#####topコマンド: CPU、メモリ、プロセスを表示する
```$top
top - 09:48:52 up 2 min,  1 user,  load average: 0.18, 0.14, 0.06
Tasks: 109 total,   2 running, 107 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.0 us,  0.2 sy,  0.0 ni, 99.7 id,  0.0 wa,  0.0 hi,  0.2 si,  0.0 st
KiB Mem :   468520 total,   253376 free,    89544 used,   125600 buff/cache
KiB Swap:  1040380 total,  1040380 free,        0 used.   297560 avail Mem

 
PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
  353 root      20   0       0      0      0 S   0.3  0.0   0:00.07 xfsaild/dm-0
 1255 vagrant   20   0  139184   2108    912 S   0.3  0.4   0:00.23 sshd
    1 root      20   0   41272   3704   2428 S   0.0  0.8   0:01.25 systemd
    2 root      20   0       0      0      0 S   0.0  0.0   0:00.00 kthreadd
    3 root      20   0       0      0      0 S   0.0  0.0   0:00.02 ksoftirqd/0
    4 root      20   0       0      0      0 S   0.0  0.0   0:00.00 kworker/0:0
    5 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 kworker/0:0H
    6 root      20   0       0      0      0 S   0.0  0.0   0:00.00 kworker/u4:0
    7 root      rt   0       0      0      0 S   0.0  0.0   0:00.50 migration/0
    8 root      20   0       0      0      0 S   0.0  0.0   0:00.00 rcu_bh
    9 root      20   0       0      0      0 S   0.0  0.0   0:00.00 rcuob/0
   10 root      20   0       0      0      0 S   0.0  0.0   0:00.00 rcuob/1
```
Sentry の Slack 通知設定手順

Legacy でないほうの Integration 設定手順です。
2020年9月8日時点


## workspace との連携
Settings > Integrations > Slack > Add workspace (既に設定済みの場合不要)
private チャンネルの場合は通知したいチャンネルに `Sentry` ユーザーを Invite する。

## Alert の設定

以下どちらからでも設定可能

* Settings > Integrations > Slack > Configurations > Configure > Add Alert Rule
* Settings > Projects > (対象のプロジェクト) > Alerts > ViewAlertRules > Create Alert Rule

### 設定画面
![スクリーンショット 2020-09-08 9.41.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164275/c89c1d38-024f-3a88-fe66-62d252df774a.png)

##### Environment
* Sentry への Event 送信時に設定した Environment を指定出来ます。

##### Alert name
* Alert の設定名

##### AlertConditions (when)
* 通知対象の条件指定
    * `An Event Occurs` を指定して、後述の Rate Limit で通知間隔を指定することで、大量に通知が発生しても煩わしくなるほど流れることがありません。
* 後述の AlertConditions (then) で tags を指定する場合にアプリケーション毎に送信される tags が違う場合があるので、アプリケーション固有の tag 等を指定してし、アプリケーション毎に Alert を作成するとよいです。

##### AlertConditions (then)
* `Send a slack notifications` を指定
* show tags の項目に通知したい tag の情報を指定

##### こんな感じ
![スクリーンショット 2020-09-08 9.54.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164275/e0cd1236-a166-d3cd-48de-9381ff896f9f.png)




## 参考
https://docs.sentry.io/product/integrations/slack/
sFlowTrendのインストール

##sFlowTrend  – 無償版（フリー）のsFlow管理ツール –
sFlowTrend™ は、無償版（フリー版）のグラフィカルなネットワーク・サーバーのモニタリング・ツールです。sFlowTrend-Pro は、業界で標準的に使用されている sFlow® を使用し、リアルタイムにネットワーク帯域を使用しているトップ・ユーザやアプリケーションを表示します。また、sFlowTrend は、拡張されていくsFlowの仕様を利用し、物理あるいは仮想サーバのパフォーマンス、ネットワーク・サーバーへのリンク、アプリケーション・パフォーマンスをモニタリングして、ネットワーク化されたシステム・パフォーマンスのエンドツーエンドの状況を表示します。sFlowTrend は、５つまでのスイッチやホストからのsFlowデータを受信し、メモリー上に１時間の期間でデータを保持します。
機能強化有償版の[sFlowTrend-Pro](https://www.flownetsecure.com/sflowtrendpro/) は、モニターするスイッチやホストの数の制限はなく、一時間を超える過去のトラフィック情報をディスク上に保持します。

* 誰がネットワークを使用しているのか？、何をしているのか？を即座に把握
* 企業で許可されているネットワーク・ポリシーが順守されているかの管理
* 障害や異常トラフィックの原因を即座に把握
* 重要なホスト・パフォーマンスの要因を管理（例：CPUやメモリ使用率）
* 使用状況の傾向を把握し、正確にアップグレードを実施
* 現在、および、時系列的（１時間）なパフォーマンスの管理レポートを作成
![84b4925c6f829ca41bb8e30c5575de1b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/705452/44f282c3-10e3-d568-4814-3bd0ffed08f5.png)

### sFlowTrendの評価（ダウンロード）
sFlowTrend は、多くのプラットフォームで使用されているJavaで作成されています。
そのため、インストールするマシンには、Javaがインストールされていることが前提条件になります。sFlowTrendは、Java Version 8 以降を必要とします。
Javaのインストールに関しては、[Oracle web site](http://www.java.com/)を参照ください。
Javaインストール後は、インストーラーに従ってインストールしてください。[インストール方法](https://inmon.com/products/sFlowTrend/help/html/installation.html)参照
※ [MacOSでのインストールについて](https://inmon.com/products/sFlowTrend/macos-support.php)

Javaがインストールされたら、下記より適切なインストレーション・パッケージをダウンロードください。
インストールに関しては、インストレーション（英語）を参照ください。

ノート：以前にJava Web Startを使用してsFlowTrendをインストールしたことがある場合は、最初にアンインストールを行ってください。
これは、 javawa -viewer コマンドを実行することで可能です。

ソフトウェアを使用するにあたっては、 [ライセンス・アグリーメント](https://inmon.com/products/sFlowTrend/license.html) を確認・同意をお願いします。

現在のバージョンは、[リリースノート](https://inmon.com/products/sFlowTrendReleaseNotes.php) で詳細を参照ください。


ソフトウェア・ダウンロードは、以下InMonサイトから実施ください。;
https://inmon.com/products/sFlowTrend.php#download

sFlowTrendは、WebクライアントからsFlowTrendサーバーへ、http://localhost:8087 あるいは https://localhost:8443 (localhostあるいはサーバーURL/IPアドレス）でアクセスします。

[オンライン・ヘルプ（英語）](https://inmon.com/products/sFlowTrendHelp.php) は、sFlowTrend Help メニュー・アイテムをクリックすることで表示できます。オンライン・ヘルプでは、sFlowTrendを使用してトラフィックのモニタリングを開始するのに必要なステップや操作方法が説明されています。
問題がある場合は、オンラインヘルプ内の[トラブルシューティング](https://inmon.com/products/sFlowTrend/help/html/troubleshooting.html)を参照ください。
Goの学習備忘録 #1 環境設定とデバッグ

## 環境設定
### Goをインストール for mac
https://golang.org/
からダウンロード

terminalからgoを実行
command not foundの場合、terminalを再起動
それでもダメな場合、PATHを通す

```bash
export GOPATH="$HOME/go"
export PATH="$GOPATH/go//bin/:$PATH"
```

### パッケージをインストールしてみる
Goのドキュメントを見れるパッケージ
```bash
$ go get golang.org/x/tools/cmd/godoc
```
https://godoc.org/golang.org/x/tools/cmd/godoc

```bash
$ godoc fmt

# go doc fmt.Printfにコマンドが現在では変更されているらしい
```

## VSCodeでのデバッグのしかた
### delveをインストール
```bash=
$ go get -u github.com/derekparker/delve/cmd/dlv
```

## VSCodeでGoの定義元に飛ぶ
```json=
// settings.json

"go.useLanguageServer": true
```
untracked filesでのgit reset --hardの罠

# 要約
addした新規ファイルは`git reset --hard`によって消えるので注意．

# 恐怖の `git reset --hard`
それはある夏の日のことです．
gitリポジトリの中で，untrackedファイルを作成し，`git reset --hard`を行いました．
（まだgitのリポジトリにaddもcommitもされていない新規のファイルのことを，git上ではuntracked filesと呼びます．）

```sh
touch foo   # 新規ファイルを作成
git status
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#         foo
# nothing added to commit but untracked files present (use "git add" to track)

git reset --hard   # untrackedファイルには影響しない
```
untracked fileがある状態で`git reset --hard`をしても，それらのファイルには何の影響もありません．

しかし，<font color="Red">untracked fileをaddした状態で</font>`git reset --hard`をすると大変なことになります（なりました）．

```sh
touch foo   # 新規ファイルを作成
git add foo   # addする
git status
# Changes to be committed:
#   (use "git restore --staged <file>..." to unstage)
#         new file:   foo
git reset --hard   # addしたuntracked fileが消える
```

そうなんです．<font color="Red">addしたuntracked filesが消えて</font>しまいます．

これは，`git add`でインデックスに追加されたuntracked fileが`git reset --hard`によって，
ファイルの存在ごとリセットされてしまうことで起こります．

# 対策：`git reset --hard` する前に
上記の問題の対策として，`git reset`してから`git reset --hard`するのがよいのではと思います．

`git reset`をするとインデックス登録がリセットされるため，untracked filesの状態に戻ります．
そして，`git reset --hard`で変更があるファイルだけリセットされます．

毎回`git reset`を打つのは面倒なので，.bashrcなどにエイリアスを登録しておきましょう．

```sh
alias git reset --hard='git reset && git reset --hard'
```

その他，良い対策方法あればご教授ください～
【GCP】GCS/pubsub/functionsの連携

#実現してみたい構成
https://cloud.google.com/solutions/processing-marketing-submissions-using-video-intelligence?hl=ja

#公式ドキュメント
https://cloud.google.com/storage/docs/pubsub-notifications?hl=ja

#参考URL
https://qiita.com/hnw/items/b5d992f7bd2c64ee51a2
https://qiita.com/sinmetal/items/0438203034a0cb448448
https://qiita.com/t-yotsu/items/c6d3f6899a34caa60764

#参考記事
https://cloud.google.com/blog/ja/products/gcp/cloud-storage-introduces-cloud-pub-sub-notifications

#GCSにファイルを置いたら通知がくる設定
gsutil notification create -f json -t projects/PJ名/topics/example-topic gs://storage-lab-consle-mune

・上記のように入力すればOK
・topicsは入力すれば自動で作られる
・ストレージは作成済みのものを指定しないとエラーが出る
AccessDeniedException: 403 メアド does not have storage.buckets.get access to the Google Cloud Storage bucket.
・以下が成功メッセージ
Created Cloud Pub/Sub topic projects/PJ名/topics/example-topic
Created notification config projects/_/buckets/バケット名/notificationConfigs/3
・pub/subのトピックをみると作成されている
・-f jsonはJsonファイルで通知を受け取れますよということだと思う


・一度チュートリアルをやって基本はわかったので、以下の流れで試す。
https://qiita.com/Mune_robo/items/1f1046f8551cb2a7cebf

・storageを作成した時に作ったtopicにもメッセージは格納できる
gcloud pubsub topics publish トピック名 --message hello
gcloud pubsub topics publish example-topic --message hello
messageIds:
- 'xxxxxxxxxxxxxxxxxx'
格納された↑

gcloud pubsub subscriptions pull --auto-ack --limit=2 サブスクリプション名
┌───────┬──────────────────┬────────────┬──────────────────┐
│  DATA │    MESSAGE_ID    │ ATTRIBUTES │ DELIVERY_ATTEMPT │
├───────┼──────────────────┼────────────┼──────────────────┤
│ hello │ 1558007170896672 │            │                  │
└───────┴──────────────────┴────────────┴──────────────────┘
⇓
ということは、storageにいれた際のメッセージは上記でみれるはず。
storageにデータをいれたあと、上記のコマンドでみれた！
┌────────────────────────┬──────────────────┬──────────────────────────┬──────────────────┐
│      DATA              │    MESSAGE_ID    │      ATTRIBUTES          │ DELIVERY_ATTEMPT │
│ { 　　　　　　　　　　　　　        │ 1522743331216371 │ bucketId=xxxxxxxxxxxxxxx          
〜〜〜〜
│   "etag": "xxxxxxxxxE="  

# pub/subとfunctionsの連携
・pubsub⇛トピック⇛functionsへのトリガー⇛functionsの設定画面に行く⇛とりあえずデフォルトで作成してみてしまう。

Functionsに関数が作成される。（少し時間がかかる。うまく連携できてないとエラーが出る。）
Storageにデータを格納して、Functions⇛ログを表示をみると格納したデータの詳細がみれる。

# エラー
・app engine を起動して、pub/subのサブスクリプション作成からエンドポイントURLにapp engineのURLを入れたが、
エラーになって登録できなかった。
「エンドポイント URL が無効です」とのこと。

・gcloud beta pubsub subscriptions pull xxx
を打ったら以下のエラーが出た

ERROR: (gcloud.beta.pubsub.subscriptions.pull) HTTPError 404: <!DOCTYPE html>
ディスククローンで複製したWindows7が起動時に0x0000007Bエラー、ブート設定の修正

## バックアップ前にレジストリの修正

* https://support.microsoft.com/ja-jp/help/2773300/stop-0x0000007b-error-after-you-use-a-group-policy-setting-to-prevent

`HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\PnP\DisableCDDB`
`HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\PnP\DontStartRawDevices`

の値を 1から0に変更。
再起動せずにそのままバックアップする

![aa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/91bfe7ea-be64-5050-0d0f-ce24b7339a01.png)

* https://www.lifewire.com/how-to-rebuild-the-bcd-in-windows-2624508

```sh
c:
# 念のためバックアップ。使わないけど
bcdedit /export c:\bcdbackup
cd boot
# 変更の許可
attrib bcd -h -r -s
ren bcd bcd.old

# 再作成
bootrec /rebuildbcd
```

![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/e88bd243-2ee3-c597-ea2c-8e20ef6997ca.png)


## storport.sys 

セーフモードで起動すると`storport.sys`読み込み中、BSODになる場合、ドライバが足りていないっぽい。手詰まり

## イメージ化

* Microsoftが公式で出している Disk2vhd を使ってみて再挑戦してみる
* https://docs.microsoft.com/en-us/sysinternals/downloads/disk2vhd

```vb:vhdxをvdiに変換
"C:\Program Files\Oracle\VirtualBox\VBoxManage" ^
 clonemedium disk vmdisk.vhdx vmdisk.vdi --format VDI
```
SwiftPackageManagerを使用する際に「Communication with the service was interrupted.」と表示される際の対処法

![スクリーンショット 2020-09-07 23.58.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276894/9adffe60-50f8-ad46-d2a8-44d1da41d64a.png)

SPMの検索バーからURLを指定すると表題のエラーが出ました。
`~/.gitconfig`に`[includeIf "gitdir:xxxxx"]`が入っているとエラーが表示されるようです。

```~/.gitconfig
# 例:
[includeIf "gitdir:~/iOS/Company/"]
  path = ~/.gitconfig_company
```

## 対処法
SPMを利用してライブラリを追加する時だけでも、`[includeIf "gitdir:xxxxx"]`をコメントアウトまたは削除したら、
想定通りにバージョンやブランチを指定する画面にたどり着けました。

```~/.gitconfig
# コメントアウト
#[includeIf "gitdir:~/iOS/Company/"]
#  path = ~/.gitconfig_company
```

![スクリーンショット 2020-09-08 0.38.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276894/1de2c1ef-e88d-f5d3-562e-f287b28c74ab.png)


## 参考
- [Xcode 11 - "Couldn't communicate with a helper application." when attempting to add Swift Package - Stack Overflow](https://stackoverflow.com/questions/60857372/xcode-11-couldnt-communicate-with-a-helper-application-when-attempting-to)
- [Adding Package Dependencies to Your App | Apple Developer Documentation](https://developer.apple.com/documentation/xcode/adding_package_dependencies_to_your_app)
Kleisli category

3.2: Kleisli categoryのノート

### サブセットのカテゴリー
サブセット(relation of inclusion)を使ったカテゴリーを作ることができる

- idは、全てのサブセットは、自分自身のサブセットなのでOK　(reflexivity)
- compositionは、$a \subset b, b \subset c \to a \subset c$ なのでOK (transitivity)

![subset-a-b-c.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/499443/0e4e1daa-c97f-57cd-9161-1666364a4a65.png)

#### Preorderか？
- idがあって、Compose可能で、Associativeなので、Preorder。

#### Partial orderか?
- Loopは存在しないのでPartial order。もし、$a \subset b$ で、 $b \subset a$ ならば、$a = b$ になる。

#### Total orderか?
- 重複部分がなかったり、一部であったりするセットは存在し得るので、Total orderではない。

![disjoint_ol_sets.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/499443/3ac867e1-fefb-6691-21cc-eacc8f97ed91.png)

#### Diamond関係を作ることができるか?
![diamond.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/499443/20c1e606-8e89-815a-f9cf-c5339e0baecc.png)

- $b$と$c$は$a$のサブセット
- $d$は、$b$と$c$のサブセット

という関係。

![diamond-venn.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/499443/5fea2061-d189-3d41-fdbd-01da592ed31f.png)

という形で可能。

### 関数のComposition

#### 解決したい問題
C++のライブラリがある。ライブラリ内の全ての関数について、呼び出された時に、ログが取れるようにしたい

#### 解決方法
##### 実装1
グローバル変数`log`に、各関数からログを書き込む。

```cpp
string log = "";

bool negate(bool x) {
  log += "not!";
  return !x;
}
```

問題：
- `log`変数と`negate`関数の間に隠れた依存関係ができる
- マルチスレッド環境で、`log`変数についての競合状態が起こる

##### 実装2
`negate`を純粋関数にして、`log`を引数として渡す。

```cpp
pair<bool, string> negate(bool x, string log) {
  return make_pair(!x, log + "not!");
}
```

問題：
- `log`が`string`なので、入力に対して結果をmemoizeすることが難しい。
- `negate`関数は、入力`x`と`"not!"`については、知るべきだが、`log`変数や、`log`変数にログを追加する方法を知るべきではない。

##### 実装3
`negate`関数が知るべきでない情報を取り除く。

```cpp
pair<bool, string> negate(bool x) {
  return make_pair(!x, "not!");
}
```

問題：
- `string`をつなげて、ログを作るコードが存在しない。

##### 実装3のためのCompose関数1
実装3の呼出からログを作るために、まず、関数を合成する関数を考える。

```cpp
// B(A) means "takes A and returns B"
function<C(A)> compose(function<B(A)> f, function<C(B)> g) {
  return [f, g](A x) {
    B p1 = f(x);
    C p2 = g(p1);
    return p2;
  };
}
```

問題：
- 単純な関数の合成で、ログが取られていない

##### 実装3のためのCompose関数2
合成の結果として、ログを含んだ`pair`を返すようにする。

```cpp
function<pair<C, string>(A)> compose(
  function<pair<B, string>(A)> f, 
  function<pair<C, string>(B)> g
) {
  return [f, g](A x) {
    B p1 = f(x);
    C p2 = g(p1.first);
    return make_pair(p2.first, p1.second + p2.second);
  };
}
```

##### クライスリ カテゴリー
ここまでに定義した関数合成は、

- boolの反転と、文字列の結合はAssociative
- idは何もしない関数として書くことができる

```cpp
pair<A, string> id(A x) {
  return make_pair(x, "");
}
```

- オブジェクトはA, B, C。A, B, Cはタグ
- ログを記録している部分は、文字列結合なのでMonoid


として考えるとカテゴリーを成す。
このカテゴリーには名前がついていて、Kleisli Categoryと呼ばれている。

##### kleisli (クライスリ）Arrow
特に、今回使ったArrowは、Kleisli Arrowと呼ばれている。
Kleisli Arrowは、オブジェクト$a$と、$b$の間を結ぶArrowを、$a \to b$ではなくて、

$a -> (b, string)$

と定義する。
stringだけではなく、いろいろなembellishmentを使って定義できる。

### 余談
- これはMonadのある一面を見たもの。このArrowがCompose可能なのは、embellishmentがMonadだから。
- Monadは特別なものではなくて、一つの特殊な形式の関数をComposeするための方法にすぎない。
- 関数型プログラミングでは、OperationをCompositionを使って合成する。なにか追加のものを使って、追加の自由を得る。そして、その自由を使って合成をするということが、Monadを使うということ。

## 動画
Bartosz Milewski / Category Theory 3.2: Kleisli category
https://www.youtube.com/watch?v=i9CU4CuHADQ
[PHP]365日+曜日を出力する

今日の日付を出力するには下記のように記述する。

```day.php
<?php
print(date('n/j(D)'));
?>
```

``n``は月を取得する
``j``は日付けを取得する
``D``は英語の曜日（頭３文字）を取得する

timezoneの設定をしていなければ、直接記述することで変更できる。

```day.php
<?php
date_default_timezone_set('Asia/Tokyo');
print(date('n/j(D)'));
?>
```

ここで、1日後の日付＋曜日を取得するにはどうすれば良いか考える。

```day.php
<?php
print(date('n/j(D)', strtotime('+1day'));
?>
```

これで1日後の日付＋曜日を取得できた。

※``strtotime``とは``String to Timestamp``の略で
文字列をTimestamp型に変換できるファンクションのこと。

``+1day``なら1日後
``-1day``なら1日前
``+365day``なら1年後

とすることができる。

```
strtotime('+1day')
```

という部分をfor文を用いて365回繰り返せば良さそう。

```day.php
<?php
for($i=1; $i<=365; $i++); {
  $date = strtotime('+' . $i . 'day');
  print(date('n/j(D)', $date));
  print "\n";
}
?>
```

これで365日分取得できました。

---

###[ 解説 ]

①変数``i=1``として、``365以下``で繰り返し、毎回``変数iに１を足す``

```php
for ($i=1; $i<=365; $i++);
```

②``$date``という変数に``strtotime``の中身を``分解して代入``

```php
$date = strtotime('+' . $i . 'day');
//  strtotime('+1day')の、'+1day'の部分　１を$iとしている
```

③``strtotime``ファンクションを記述していた部分に変数``$date``を置く

```php
print(date('n/j(D)', $date));
```

④見やすいように改行する

```php
print "\n";
```

ちなみに、{}の部分は下記のように書き換えることもできる

```day.php
<?php
for ($i=1; $i<=365; $i++):
  $date = strtotime('+' . $i . 'day');
  print(date('n/j(D)', $date));
  print "\n";
endfor;
?>
```

こちらの方が何に対する閉じタグなのかがわかりやすい。
while文も同じで下記のように記述できる。

```php
while (....):
  ....
endwhile;
```

---

以上です。お疲れ様でした。
sympyで「薄肉球殻(Thin spherical shell)」をやってみた。技術士機械平成27年問Ⅲ-8	

①薄肉球殻のonline webを探しています。
 薄肉円筒の1/2でいいですか。
②薄肉円筒のonline webのおすすめを教えて下さい。
よろしくお願いします。
																											
# 技術士　01機械部門　平成27年問Ⅲ-8	

https://www.engineer.or.jp/c_topics/004/attached/attach_4134_3.pdf#page=7

＜　公式ホームページ

https://www.engineer.or.jp/c_categories/index02021.html

入力																	
```python
from sympy import *																												
var('σt π　t r p')																												
s = solve(Eq(π*r**2*p, 2*π*r*t*σt), t)																												
print("t=",s)																												
print("t=",Float(s[0].subs({σt:250,p:0.5, r:3000}),2))																												
```
																												
出力

```																												
t= [p*r/(2*σt)]																												
t= 3.0																												
```
																												
# (参考)【2015九大】薄肉円筒容器問題【材料力学院試対策演習】																												
https://www.youtube.com/watch?v=3RgGaSmcWYQ
listboxを使用して任意のサーバへログインするteratermマクロ

認証は暗号化したパスワードファイルを使用。
初回ログイン時のみパスワード入力し、次回以降は初回時に生成されたdatファイルを自動的に参照
下記内容をテキストに記載し、拡張子を.ttlにする

```ruby:qiita.rb
username = 'ユーザー名'
passwdfile = 'passwd.dat'
portnum = '22'

getpassword passwdfile username userpasswd

strdim HOSTNM 3　←合計数を記入
HOSTNM[0] = 'ホスト名'
HOSTNM[1] = 'ホスト名'
HOSTNM[2] = 'ホスト名'

strdim HOSTIP 3　※上記のホストに対応したIPをそれぞれ記入する
HOSTIP[0] = 'ipアドレス'
HOSTIP[1] = 'ipアドレス'
HOSTIP[2] = 'ipアドレス'
;============================================
listbox '接続するホストを選択して下さい' '接続ホスト選択' HOSTNM
if result >= 0 then
    HOSTADDR = HOSTIP[result]
else
    end
endif
 
COMMAND = HOSTADDR
strconcat COMMAND ':portnum /ssh /auth=password /user='
strconcat COMMAND username
strconcat COMMAND ' /passwd='
strconcat COMMAND userpasswd
strconcat COMMAND inputstr
 
connect COMMAND
 
end
```

単体サーバ向け

```ruby:qiita.rb
username = 'ユーザー名'
hostname = 'ip'
passwdfile = 'passwd.dat'
portnum = '22'

getpassword passwdfile username userpasswd

msg = hostname
strconcat msg ':portnum /ssh /auth=password /user='
strconcat msg username
strconcat msg ' /passwd='
strconcat msg userpasswd
strconcat msg inputstr

connect msg
```
もしくは

```ruby:qiita.rb
username = 'ユーザー名'
hostname = 'ip'
portnum = '22'

msg = hostname
strconcat msg ':'
strconcat msg portnum
strconcat msg ' /ssh /2 /auth=publickey /user='
strconcat msg username
strconcat msg ' /auth=pageant'
strconcat msg ' /ssh-A'
strconcat msg ' /ssh-agentconfirm=off'
 
connect msg
```

踏み台経由

```ruby:qiita.rb
username = 'ユーザー名'
hostname = '踏み台ip'
passwdfile = 'passwd.dat'
portnum = '22'

getpassword passwdfile username userpasswd

HOSTIP = '踏み台の先ip'

msg = hostname
strconcat msg ':portnum /ssh /auth=password /user='
strconcat msg username
strconcat msg ' /passwd='
strconcat msg userpasswd
strconcat msg inputstr
 
connect msg

wait '$' '#'

COMMAND = 'ssh '
strconcat COMMAND HOSTIP
sendln COMMAND

end
```

もしくは

```ruby:qiita.rb
username = 'ユーザー名'
hostname = '踏み台ip'
portnum = '22'

HOSTIP = '踏み台の先ip'

msg = hostname
strconcat msg ':'
strconcat msg portnum
strconcat msg ' /ssh /2 /auth=publickey /user='
strconcat msg username
strconcat msg ' /auth=pageant'
strconcat msg ' /ssh-A'
strconcat msg ' /ssh-agentconfirm=off'
 
connect msg

wait '$' '#'

COMMAND = 'ssh '
strconcat COMMAND HOSTIP
sendln COMMAND

end
```
class継承とその身近な例について

#class継承とその身近な例について#

おはようございます。Qiita初投稿です。

本日は、rubyのclass継承と、その身近な例についてお話しできたらと思います！
ちょうど最近、なるほどなあと思ったので、共有したいと思います。
もしかしたら、あたりまえすぎるかもしれません。

ただ、もし読んでいただいた方にとって、何かプラスになれば幸いです！


###１、クラス継承とは###
クラス継承とは、あるクラスを元に他のクラスを作成することです。
元になったクラスを親クラス、新しいクラスを子クラスといいます。
親から子に引き継ぐことで、引継ぎ前のクラスも使えつつ、新しいクラスを作成できます。
なんて感動的な親子関係。

###２、書き方###

小クラスの横に<をつかって親クラスを書くだけ

```example.rb
class Child < Parent
#ParentクラスをChildクラスに継承
```
クラスのなので、頭文字は大文字です。
こうすることで、親クラスを使えます。

###３、親クラスの何が使えるの？###

主に二つです。
・親クラスのインスタンス変数
・親クラスのインスタンスメソッド

以下に、クラス継承の例を記載しました。
処理の流れをざっと記載します。
①barcelonaと言う変数に、Barcelonaクラスのインスタンスを作成
②Barcelonaクラス作成時に、Soccer_playerクラスのinitializeメソッドが適用される。引数がインスタンス変数に代入される。
③barcelonaにBarcelonaクラスのplayerメソッドを適用している。

```example.rb
class Soccer_player #親クラス
  def initialize(name,position)
    @name = name
    @position = position
    #新しくインスタンスを作成
  end
end

class Barcelona < Soccer_player
  def player
    puts "私の名前は#{@name}、ポジションは#{@position}、現在、バルセロナに所属しています。"
    #Soccer_playerクラスのインスタンス変数を使用している。
  end
end

barcelona = Barcelona.new("メッシ","フォワード")
#Soccer_playerクラスを引き継いでいるので、Soccer_playerクラスのイニシャライズメソッドが適用される。
barcelona.player
#処理結果：私の名前はメッシ、ポジションはフォワード、現在、バルセロナに所属しています。
```

###４、身近な例###

ここまでクラス継承について記載しましたが、ぶっちゃけどうでしょう？
へぇーって感じじゃないですか？
なので、最近身近でなるほどな！と感じた例を紹介したいと思います！

クラス継承が行われている場面があります。
それは、railsのコントローラーです。

コントローラーの冒頭を見てみると、こんな記載があります。

```hoges_controller.rb
class HogesController < ApplicationController
```

これってつまり、ApplicationControllerをHogescontrollerへ引き継いでいるんですね。
ちなみにですが、作成したコントローラーには上記の記述が入っています。

なので、どのコントローラーもApplicationControllerの処理を実施できるわけです。
rails tutorial 第6章

#はじめに

独学で[rails tutorial](https://railstutorial.jp/)を進めていく過程を投稿していきます。

進めていく上でわからなかった単語、詰まったエラーなどに触れています。

個人の学習のアウトプットなので間違いなどあればご指摘ください。

初めての投稿なので読みにくいところも多々あるかと思いますがご容赦ください。


#第6章 ユーザーのモデルを作成する
##6.2.2 存在性を検証する
存在性の検証は:presenceで行うようです。
tutorialではよく省略されたコードが示されていますのでしっかり理解するまでは自分でフォローもしておこうかと思います。

```
validates :name, presence: true
#すべて括弧をつけると
validates(:name, {presence: true})　#第一引数には検証するカラム名を、第二引数には検証する内容
```
---
問題発生!!
リスト6.13のtestを実行すると

```
RuntimeError: RuntimeError: database is locked
```
と表示されエラーになってしまう。

解決のために試したこと

参考記事1
https://qiita.com/kambe0331/items/1eaf2383b39c721e7283
こちらの記事を参考にし、dbファイル下のtest.sqlite3というファイルの名前を一旦変更し再度元の名前に戻しました。

結果
上手くいかず、、、

次に

参考記事2
https://stackoverflow.com/questions/7154664/ruby-sqlite3busyexception-database-is-locked/62730905#62730905
こちらの記事を参考にし、DB Browser for SQlite、サーバー、プロンプトなどを一度全て終了して、改めて起動。

結果
テストをクリア出来ました。

余談
一時的にテストをクリアできましたが、どうやら根本的には解決出来ていなかったようで、こちらのエラーこれからも頻発します。

エラーの解決方法は別の記事にまとめました。
https://qiita.com/shun_study_p/items/fbb4cb2d4c392063c9a9


##6.2.3 長さを検証する
長さの検証は:lengthで行うようです。

```
validates :name,  presence: true, length: { maximum: 50 }
#わかりやすく括弧をつけると
validates(:name,  {presence: true, length: { maximum: 50 }})
```
先程と同様、慣れるまでは括弧を自分でフォローしておきます。
##6.2.5 一意性を検証する
一意性の検証は:uniquenessで行うようです。
:case_sensitiveというオプションを使うことで、大文字小文字を区別するか指定が出来るようです。

```
case_sensitive: false
```
とすることで:uniquenessの値が一意かどうかの検証で大文字と小文字を区別しないというオプションを追加しています。

---

問題発生!!
最後にrails testを実行したところ

```
Migrations are pending. To resolve this issue, run:
      bin/rails db:migrate RAILS_ENV=test
```
とのエラーが発生しました。
素直に表示されたコマンド実行するとmigrateできないとのエラーが、、、

解決
以下の記事を参考にし
http://kzlog.picoaccel.com/post-995/

```
rails db:rollback RAILS_ENV=test
rails db:migrate RAILS_ENV=test
```
上記のコマンドを実行すると正常に動作しました。
#終わりに
今回は少しエラーに躓きました。
しかし、6章の内容はしっかり理解が出来ました。
Rails 6で認証認可入り掲示板APIを構築する #3 RSpec, FactoryBot導入しpostモデルを作る

←[Rails 6で認証認可入り掲示板APIを構築する #2 gitとrubocop導入](https://qiita.com/rf_p/items/5ef018bec4ed2f16fc0e)

# RSpec, FactoryBotのインストール

前回の続きから。
テストに使うRSpecとFactoryBotを入れます。

```diff:Gemfile
 group :development, :test do
+  gem "rspec-rails"
+  gem "factory_bot_rails"
 end
```

```powershell
$ bundle
```

インストールできたので初期化をします。

```powershell
$ rails g rspec:install
...
Running via Spring preloader in process 6770
      create  .rspec
      create  spec
      create  spec/spec_helper.rb
      create  spec/rails_helper.rb
```

今後modelやcontrollerを生成した時に、一緒に自動生成されるRSpecの制御をします。
最低限のテストに収めるためmodelとrequestのみでいこうと思うので、それ以外を使わないよう設定します。

```diff:config/application.rb
  class Application < Rails::Application
...

+   config.generators do |g|
+     g.test_framework :rspec, 
+       view_specs: false, 
+       helper_specs: false, 
+       controller_specs: false, 
+       routing_specs: false
+   end
  end
...
```

ついでにFactoryBotをRSpecの中でクラスを書かなくてもメソッドが使える設定をします。

```diff:spec/rails_helper.rb
 RSpec.configure do |config|
+  config.include FactoryBot::Syntax::Methods
...
```

参考：[RailsアプリへのRspecとFactory_botの導入手順](https://qiita.com/Ushinji/items/522ed01c9c14b680222c)

ここまでいったらrubocop動かしてエラー潰し、エラーがゼロになったらgit commitしておきましょう。
なお`rubocop -a`の-aは自動修正可能なものを自動修正するコマンドなので、1回目大量のエラーが出て場合、もう1回動かすと自動修正後で数が一気に減るはずです。

# postモデルの生成

前準備が非常に長かったですが、これでようやく準備が整ったのでmodelを作っていきます。

```powershell
$ rails g model Post subject:string body:text
```

こちらのコマンドを実行するとmodel, migration, spec, factory_botの4ファイルが
生成されます。

```powershell
$ rails db:migrate
```

もし実行時に以下エラーが出たら、postgresが止まっているので起動します

```powershell
rails aborted!
PG::ConnectionBad: could not connect to server: No such file or directory
        Is the server running locally and accepting
        connections on Unix domain socket "/var/run/postgresql
...

$ sudo service postgresql95 start
```

# pryを入れる

rails consoleコマンドを実行時、標準のirbよりもpryの方ができることが増えます。

```diff:Gemfile
group :development, :test do
+   gem "pry-rails"
+   gem "pry-byebug"
...
end
```

```powershell
$ bundle
```

# rails consoleでpostの保存ができるか試す

controllerまで実装して動作確認だと手間がかかるので、rails consoleでmodelがDBに保存・読み込みができるか試します。

```powershell
$ rails c
...
[1] pry(main)> Post.create!(subject: "hoge", body: "fuga")
[2] pry(main)> posts = Post.all
  Post Load (0.6ms)  SELECT "posts".* FROM "posts"
=> [#<Post:0x0000000006e89850
  id: 1,
  subject: "hoge",
  body: "fuga",
  created_at: Sat, 05 Sep 2020 13:50:01 UTC +00:00,
  updated_at: Sat, 05 Sep 2020 13:50:01 UTC +00:00>]
```

[1]でpostを1件保存し、[2]で全件取得しました。
どうやら正常にcreate, readができていそうですね。

# 続き

→[Rails 6で認証認可入り掲示板APIを構築する #4 postのバリデーション、テスト実装](https://qiita.com/rf_p/items/0b2ccd908cac4bb6ecc6)

【[連載目次へ](https://qiita.com/rf_p/items/a846553c11571f4177eb#%E7%9B%AE%E6%AC%A1)】
Apache や　Nginx ログを sed コマンドで条件抽出する方法


ログ解析をする際、生のログファイルから、特定の条件を追加してログを絞り込んでいく方法を置いておきます。

# 特定のパスへのゲットリクエストだけを抽出

```
$ sed -n '/GET \[URL]/p' [Apache/Nginxログファイル] > [抽出先].log
```

例

```
# /about/intro 配下のアクセスだけを抽出する
$ sed -n '/GET \/about\/intro/p' [Apache/Nginxログファイル] > [抽出先].log
```

# Googlebot

## Googlebot からのアクセスを抽出する

```
sed -n '/Googlebot/p' [Apache/Nginxログファイル] > [抽出先].log
```

## Googlebot からのアクセスを除外する

```
sed '/Googlebot/d' [Apache/Nginxログファイル] > [除外処理後ファイル].log
```

# SVGファイル and/or 画像などのアセットのアクセスを除外する

```
sed '/.svg/d' [Apache/Nginxログファイル] > [除外処理後ファイル].log
```

JPEG,GIF, PNG, SVG, CSS, JS ファイルのアクセスログを削除する

```
sed '/(.jpg|.jpeg|.gif|.png|.svg|.css|.js)/d' [Apache/Nginxログファイル] > [除外処理後ファイル].log
```


# 特定 IP (例 8.8.8.8 ) のアクセスを除外する

```
sed '/8.8.8.8/d'  [Apache/Nginxログファイル] > [除外処理後ファイル].log
```

# サンプル実行例

前述のサンプルを参考に、条件を元に作業手順のコマンドを作って順番に実行していく。

access.log ログを home ディレクトリに作った作業ディレクトリにコピーし、Googlebot、画像などのアセット、192.168.1.1からのアクセス(例えば自社事務所の IP 等)を除外したものを access_final.log として抽出するサンプル実行例です。


```
$ mkdir ~/log_working
$ sudo cp /var/log/nginx/access.log ~/log_working/
$ cd ~/log_working
$ sed '/Googlebot/d' access.log > access_step1.log
$ sed '/(.jpg|.jpeg|.gif|.png|.svg|.css|.js)/d' access_step2.log > access_step3.log
$ sed '/192.168.1.1/d' access_step3.log > access_final.log
```

# 参考

https://linuxjm.osdn.jp/html/GNU_sed/man1/sed.1.html
Go言語で kintone REST API から データを取得する

Go言語からkintone REST API を叩いて、kintoneアプリのフィールド情報を取得するサンプルです。

APIは下記参照
https://developer.cybozu.io/hc/ja/articles/204783170#anchor_getform_fields

# 環境

* go version go1.14.2 darwin/amd64
* Mac

# 設定ファイル

GoDotEnvライブラリを利用。
.envファイルにkintone接続情報を設定します。
https://github.com/joho/godotenv

# サンプルコード

```go
package main

import (
	"bytes"
	"encoding/json"
	"fmt"
	"io"
	"io/ioutil"
	"log"
	"net/http"
	"os"

	"github.com/joho/godotenv"
)

func main() {
	err := godotenv.Load()
	if err != nil {
		log.Fatal("Error loading .env file")
	}
	ba, _ := fetchFieldsJson(os.Getenv("APP"), os.Getenv("SUB_DOMAIN"), os.Getenv("API_TOKEN"))
	var out bytes.Buffer
	if err := json.Indent(&out, ba, "", "  "); err != nil {
		log.Fatal("Error json indent", err)
	}
	out.WriteTo(os.Stdout)
}


func fetchFieldsJson(appid string, subdomain string, apitoken string) ([]byte, error) {
	client := &http.Client{}
	type Body struct {
		App string `json:"app"`
	}
	data := Body{appid}
	body, err := json.Marshal(data)
	if err != nil {
		log.Fatal("Error JSON Encode")
	}
	req, err := http.NewRequest("GET", "https://"+subdomain+".cybozu.com/k/v1/app/form/fields.json", bytes.NewReader(body))
	if err != nil {
		log.Fatal("Error request")
	}
	req.Header.Add("X-Cybozu-API-Token", apitoken)
	req.Header.Add("Content-Type", "application/json")
	resp, err := client.Do(req)
	if err != nil {
		log.Fatal("Error client")
	}
	defer resp.Body.Close()
	fmt.Println(resp.Status)
	ba, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		log.Fatal("Error read")
	}
	return ba, err
}
```



# 参考

* Go-lang https://golang.org/
* Package http https://golang.org/pkg/net/http/
* kintoneアプリのフィールド情報取得 https://developer.cybozu.io/hc/ja/articles/204783170#anchor_getform_fields

Go言語からkintoneのレコード取得の方法は、下記記事が参考になります。
[kintone REST API について (GET編)](https://qiita.com/RyBB/items/08cf511f1dbce6cf76bf)
PAST-Oも解ける！根からのパスにセグ木を載せるテク

##1. 必要な知識
・セグ木
・LCA
##2. やりたいこと
以下のような問題を解きたいです。
***
頂点に重みがついた $N$ 頂点の木が与えられます。以下のクエリを $Q$ 回処理してください。
・$2$ 頂点 $x,y$ が与えられる。$x-y$ 間のパス上にある頂点の重みの最大値を求めよ。

制約
$1≤N,Q≤2×10^5$
***
難しいですね。
##3. 解き方
まず、入力で与えられる木を根付き木にします。根は適当に決めてください。
また、頂点 $x,y$ のLCAを $z$ とします。
すると、$x-y$ 間のパスは$x-z$ 間のパスと $y-z$ 間のパスの $2$ つに分解できます。
よって各クエリで答えるべき値は、$max(($ パス $x-z$ 上の頂点の重みの最大値 $),($ パス $y-z$ 上の頂点の重みの最大値 $))$ となります。

ではそれぞれをどう求めればよいのでしょう？
→そう、セグ木を使うのです！！！

発想としてはこうです。
「根からある頂点までのパスは見ようによっては列なのでは？→ということはセグ木が使える！」

根から頂点 $x$ までのパス上の頂点の重みをセグ木に載せることを考えます。セグ木上のindexは各頂点の深さに対応します。
すると、パス $x-z$ 上の頂点の重みの最大値を求めるクエリはセグ木上での $[($ 頂点 $z$ の深さ $),($ 頂点 $x$ の深さ $)]$ に対するRMQと同義になります。
$x$ を $y$ に置き換えても同じことが言えます。

これをそのまま実装することで、この問題を $O(NQlogN)$ で解くことができました。
***
...はい、冗談です。しっかり高速化して、$O(NlogN+QlogN)$ まで落とします。

では具体的にどうすればいいのでしょうか？
ここで登場するのがクエリ先読みです。
つまり、DFS をしながらクエリに答えてあげればよいのです。

以下に具体的なやり方を図付きで示します。
図中の木は頂点 $1$ を根とし、$x=4, y=5$ なるクエリに答えようとしています。
また簡略化のため、頂点の番号と頂点の重みは等しいものとします。

見ての通り、頂点 $4$ と頂点 $5$ の LCA は頂点 $3$ です。
セグ木上にある頂点には色が塗られていて、DFS で今訪れている頂点は赤で塗って区別しています。
![スクリーンショット 2020-09-07 21.46.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599753/5c32b513-02c2-8d17-94d8-2df7f854f6fd.png)
根からDFSを行い、今見ているのは頂点 $4$ です。
セグ木には頂点 $1-$ 頂点 $4$ 間のパスに含まれる頂点の重みが載っています。
ここで、セグ木を用いて $[1,2]$ における最大値を求めます。(セグ木は 0-index とし、左端と右端はそれぞれ頂点 $3,4$ の深さに一致します)

その後見る頂点を変え、頂点 $5$ に移動します。
セグ木を更新し、$2$ 番目の要素を頂点 $5$ の重みに変えます。
![スクリーンショット 2020-09-07 21.45.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599753/3e545324-3972-4902-c6cd-6304b9d2277b.png)
こちらも先程と同様に、セグ木を用いて $[1,2]$ における最大値を求めればよいです。

それぞれの最大値は $4, 5$ なので、それらの $max$ である $5$ がこのクエリに対する答えです。
この流れはクエリが増えても同じで、計算量は $O(NlogN+QlogN)$ になります。
必要な情報は隣接行列などを用いて頂点ごとにメモしておきましょう。
##4.このテクのメリット/デメリット
####メリット
・HLD などの難しい知識が要らない
・重みが辺についていても対応でき、守備範囲が広い
・愚直な HLD よりオーダーが良い
####デメリット
・HLD とは違い貼るだけにはならない
・更新クエリが飛んできた瞬間破滅する
##5.解ける問題
ネタバレを含むので要注意です！
####PAST2-O
https://atcoder.jp/contests/past202004-open/tasks/past202004_o
まんまですね。重みが辺についているだけです。

以下、自分の提出です。
可読性が低いのはご容赦を...
https://atcoder.jp/contests/past202004-open/submissions/16401479
####技術室奥#5 Day2-H Second Path
https://yukicoder.me/problems/no/1212
このような問題にも応用が効くのがメリットです。
また、このテクはこの問題のために生み出されました。

以下、自分の提出です。Writerコードなので、PAST-O のものよりは読みやすいと思います。
https://yukicoder.me/submissions/542864
##6.おわりに
これは僕の初記事です。ミスなどがあれば修正するので、連絡をいただけると幸いです。

元々このテクは前述の Second Path のWriter解として編み出されたのですが、本番でこのテクを使っている人がほとんどおらず、もったいないなと感じたのでこうして記事にしました。
参考にしていただけたら幸いです。
localhostにスマホから繋げてみた!!(Mac編)

どうも、三町哲平です。

ローカル環境で開発している時に開発したアプリをブラウザで確認したい。
そういう時にlocalhostにアクセスするじゃないですか！

その時、__自分のスマホで見るとどういう風なデザインになるのだろう__という疑問が生まれますよね。
でも、パソコンから開いたlocalhostに別の機器でアクセスってどうやるんでしょう？
難しく思う方もいるかも知れませんが、実はすごい簡単です！

なので今回は、MacBookで起動したlocalhostにAndroidスマホとiPad、WindowsPCの３点からアクセスしてみます。

それでは、順を追っていきましょう！！

## 1. Wi-Fi環境を同じにする
まず最初にMacBook、Androidスマホ、iPad、WindowsPCを同じWi-Fi環境に接続してください。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/688029/daf582aa-6145-1910-3c16-a418cf732255.png" width=40%>
今回は、__Air-WiFi_0OXPYN__に接続しています。

## 2. MacBookのIPアドレスを確認する。
MacBookの __システム環境設定=>ネットワーク__ を開きます。

__Air-WiFi_0OXPYN1__に接続されていることを確認したら、
<font color="OrangeRed">__赤線部分__</font>のIPアドレスをメモやコピーしておきます。

今回の場合は、
__192.168.43.160__です。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/688029/2b902e91-eab6-7181-f9f1-91b197173938.png" width=80%>

## 3. localhostを起動する
今回は、ターミナルで、

```:
$ docker-compose up
```
を使用して、docker-composeで、localhostを起動します。
ポート番号は、__3000番__です。
![スクリーンショット 2020-09-07 2.42.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/688029/661282b6-e689-de3f-8c56-b8d2b0508cf9.png)

## 4. MacBookでlocalhost:3000にアクセス
![スクリーンショット 2020-09-07 2.47.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/688029/173bfcaa-78f8-1ce7-af88-8888ee1e5dd7.png)

無事、ページが表示されました。

## 5. その他の機器で試す
※MacBookからは今回の場合、__localhost:3000__とブラウザのURLに入力することで、表示されますが、その他機器では、__192.168.43.160:3000__と入力します。

### Androidスマホ
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/688029/22e3ff56-e316-f45d-7a44-98eddc89777b.png" width=40%>

### iPad
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/688029/92de108a-fc3d-9dec-3e61-fb5e333d111f.jpeg" width=60%>

### WindowsPC
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/688029/9cc3a0f3-9260-c3d7-7dee-d8dc68b98530.png)

このように、同じWi-Fiに接続することにより、Macで起動したloclhostにAndroidスマホとiPad、WindowsPCからもアクセスすることが出来ました。

参考記事:[localhostをスマホからアクセスする方法(同じWiFi環境の場合)](https://mako-channel.com/programming/localhost-wifi/)
【JavaScript・関数学習・output】

◆JavaScriptの関数の種類や違い。

▼関数定義の種類：特徴

・関数宣言/関数式：標準的な関数の定義。

・無名関数：関数を多く使用する時にコードである時に使用する。関数名の重複を避けることができる。

・即時関数：流用する可能性がない関数を定義する時に使用する。別途関数を定義する必要がない。

・アロー関数：無名関数または即時関数において、より省力したい時に使用する。

以降は具体的な記述式を書いていきます。

▼関数宣言/関数式
関数宣言の記述↓

```
function 関数名 ( 引数 ) {
  //関数内の処理
}
```

関数式の記述↓

```
変数 = function ( 引数 ) {
  //関数内の処理
}
```

・上記の関数宣言と関数式の違いは読み込まれるタイミングが異なることにあります。関数宣言が先に読み込まれます。実害はあまりないそうですが特徴として覚えておきます。


▼無名関数

無名関数の記述↓

```
const hello = function(){
console.log('hello')
}
```

・関数名無しで関数を定義できるためより簡潔にコードを記述できる。


▼即時関数

即時関数の記述↓

```
(function countNum(num) {
console.log(num)
})(1)
```

・()の中にfunctionから始まる関数定義そのものを配置することで、配置した関数を即実行する。
関数を呼び出す手間がはぶけます。


▼アロー関数

アロー関数の記述↓

```
const 変数名 = () => {
処理
}
```

・近年採用される事例が増えた、関数式の記述様式・・・・らしい。
functionを省力し()=>と記述し関数を定義する構文。より短いコードで関数を定義できる。


◆end
・私が学んだJavaScriptにある関数の種類outputは以上です。
最初ははてなブログをすすめられましたが、学んだ内容をoutputするにはQiitaが良いとあらためて感じました。
知らないメソッド、オブジェクトの概念、変数、関数、私はRuby,Ruby on Rails,JavaScript,GitHubを現時点で（２０２０/９/８）学んでいます。
学んだ内容をまとめたい時にまた書かせていただきます。
Ubuntu18.04以前のgeditで設定画面を開く方法

Ubuntu20.04ではgeditのメニューが改良されて、ウィンドウ右上の
ボタンから設定画面を呼び出せるようになった。これは素直にうれしい。
だがUbuntu18.04以前では、設定画面を求めてgeditのウィンドウ内を
あれこれクリックしても見つからなかったので設定を出す方法をメモ。

まずスクリーン左上のシステムメニュー（？）みたいなところに注目。
![gedit1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625591/e9d6ab18-28e3-c570-1e5a-1248a9714eb2.png)

ターミナルからおもむろにgeditと入力するとgeditが立ち上がる（当たり前）。
![gedit2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625591/29046b76-61f2-1861-27d8-ff17eff5b4cf.png)

Ubuntu18.04以前では、この「テキストエディター」と表示されるメニューに
設定画面が存在する。

フォントを変更したくて設定画面がないないと思っていた方へ。
AWS Client VPNをLinuxでも使いたい


AWS Client VPNはWindowsとmacOS向けにはクライアントが用意されているのですが、Linuxにはなく、UbuntuとかDebianとかopenSUSEを使いたい私はちょっと悲しかったのですが、プロファイル見たらOpenVPNのプロファイルだったのでオッと思ったのでした。

# tl;dr

* プロファイルを作ったらOpenVPNを使って接続しよう。
* https://docs.aws.amazon.com/ja_jp/vpn/latest/clientvpn-user/ubuntu.html を実施する。

# 前提

* AWS VPCが構築されていること
* AWS Client VPNの環境とプロファイルの用意ができていること
    * https://docs.aws.amazon.com/ja_jp/vpn/latest/clientvpn-admin/cvpn-getting-started.html とか。

# How to

CentOSやopenSUSEなどでもできると思うけれど、手元に構築してあったUbuntuで話します。
バージョンは 18.04LTS。

1. OpenVPNをインストール `apt install openvpn`
2. OpenVPNサービスを有効にする `systemctl enable openvpn`
3. OpenVPNサービスを起動する `systemctl start openvpn` （不要かもしれない）
4. opvnファイルを用意する。
  * ここでファイル名は `file.ovpn` とする。
  * プロファイルの作成マニュアルは https://docs.aws.amazon.com/ja_jp/vpn/latest/clientvpn-admin/cvpn-getting-started.html を参照のこと。
5. rootで接続する `sudo openvpn --config file.ovpn` 
6. ユーザー名とパスワードを入力して `Initialization Sequence Completed` がログで確認出来たら接続完了。

# 所感

意外にLinuxでClient VPNしたい人はいないのかなと思いました。
PMBOK ver 6 まとめ

#はじめに
私はある案件で要件定義を任された。しかし、経験がないため進め方がわからなかった。その時「これでは仕事にならない。」と指摘されたので、フレームワークを探した。調査の結果、PIMBOKがふさわしいと考えた。場数を踏むことが1番の近道というのは正解だが、”場数を踏む”というの私の踏み台にされた案件はどうなるのだろう。それはひどいものにきっとなる。したがって私の正とするプロジェクトマネジメント手法・軸を今日からPIMBOKとする。

# 参考にした図書
図解即戦力　PMBOK第6版の知識と手法がこれ一冊でしっかりわかる教科書

##プロジェクトの基本
PMBOKガイドはプロジェクトマネジメントの進め方についての知識体系のこと
### プロジェクトとは
「独自のプロダクト、サービス、所産（有形・無形を問わない成果物のこと）を創造するために実施する、有効性のある業務」。つまり、納期がある業務ってこと

* 独自の所産を創造するために実施する有期性のある業務のこと
* 独自性とはクライアントのワガママに合わせるということ
* 有期性とは納期のこと

## プロジェクトに置けるその他の要素
独自性と有期性がポイントだが変化・機能横断・リスクなどの要素がある。

* 変化
    * プロジェクトの実施後に、母体組織、つまり各人が所属している組織に何らかの転換をもたらす要素のこと。
* 機能横断
    * 異なるスキルも持つ多くの人が異なる部署から集められてプロジェクトに当たること。
    * 組織を横断してプロジェクトが実施されること
* リスク
    * 外部や内部の変化に常に対応すること。
    * 政治情勢や社内情勢など

## プロジェクトの種類
* トップダウン型
    * PMBOKが想定しているプロジェクト
    * 納期や予算などは決まっているが詳細は決まっていない。依頼者の要件を明確にする必要がある。
* ボトムアップ型
    * クライアントから要求される納期・予算・要求事項が明確である

## 定常業務とプロジェクト業務の違い
* 定常業務
    * 納期
        * ない
    * 独自性
        * ない
    * 変化
        * ない
    * 機能横断
        * ない
    * リスク
        * ない
* プロジェクト業務
    * 特有の要素がある
    * 定常業務になり得る可能性がある

## プロジェクトマネジメントとは
プロジェクトを滞りなく進めるためのツール。プロジェクトにおいて最も重要となる制約条件はスコープ・コスト・スケジュール。

## プログラム・ポートフォリオとは
* プログラム
    * プロジェクトの集合体
    * プログラムマネージャ
        * プログラムのマネージャ
        * 各プロジェクトのバランスを取る必要がある
* ポートフォリオ
    * 戦略目標を達成するために事業戦略に基づいて事業内全体の業務を調整する。

## PMO
プロジェクトマネジャーを支援する組織。第三者視点からPMに対して助言する。

* 支援型
    * プロジェクトにテンプレート・ベストプラクティス・トレーニングを行う。あんまり助けてくれない
* コントロール型
    * プロジェクトに対して組織のコンプラを要求してくる。ルール遵守やなどもふくまれる。
* 指揮型
    * プロジェクトに介入してくる。プロジェクトマネージャ派遣など

## プロジェクトの構成要素
* フェーズ
    * 工程のこと
* フェーズゲート
    * 各工程の評価点のこと。フェーズの最後にある。
    * 未実施の作業の有無
    * ベネフィットの有無
    * 次フェーズの計画の詳細化
    * 次フェーズに進むことに対する責任者の承認
    * リスクが高いプロジェクトはフェーズゲートを細かく設置する必要がある。
* プロセス群（４９のプロセスがある）
    * 各フェーズはプロセスで分けられている。
    * 立ち上げ
    * 計画
        * 監視コントロールプロセス群
    * 実行
        * 監視コントロールプロセス群
    * 終結

## 成果物とは
プロジェクトまたは各フェーズで生成される結果のこと。スペシャリスト成果物とマネジメント成果物の二種類ある。
* スペシャリスト成果物
    * プロジェクトにおいて専門職が生成する結果のこと
    * 例えば
        * 設計書
        * 仕様書
        * 開発されるシステム
* マネジメント成果物
    * プロジェクトを管理する上で必要な成果物のこと
    * 例えば
        * WBS
        * ガントチャート
        * 課題管理表
        * プロジェクト報告書

## プロジェクト成功の定義
何を持ってプロジェクトが成功したかを定義する必要がある。プロジェクトの成功は、成功とは何か。その成功の要素は何か、どのように測定されるのかの3点で定義する。
* 出力
    * スペシャリスト成果物のこと
* 結果
    * プロジェクトの出力を利用することからはせした変化のこと
* ベネフィット
    * 出力を利用することで得られた測定可能な利益のこと

## プロジェクトマネージャの役割と必要なもの
* 客観視できる視野
    * メンバの状況把握
* 正論と正解の区別
    * リーダーシップ
* 業務における十分なコンピテンシ
    * メンバにアプローチできるパワー
UbuntuでWacomのペンタブの左側しか使えないときの解決法

Androidモードが原因です。
PCモードへの切り替えは、タブレットの外側のボタン2つを10秒ほど同時に押すことで可能です。

# 参照
- https://github.com/linuxwacom/xf86-input-wacom/wiki/Known-Issues#issue-my-wacom-intuos-ctl-4100-or-ctl-6100-seems-to-be-miscalibrated-has-a-dim-status-led
- https://www.wacom.com/ja-jp/support?guideTitle=%E3%80%90%E3%82%88%E3%81%8F%E3%81%82%E3%82%8B%E8%B3%AA%E5%95%8F%E3%80%91Wacom-Intuos%E3%82%92Android%E7%AB%AF%E6%9C%AB%E3%81%A7%E4%BD%BF%E7%94%A8%E4%BA%88%E5%AE%9A%E3%81%AE%E3%81%8A%E5%AE%A2%E6%A7%98%E3%81%B8&guideId=016-502