OmniAICreator/Qiita-1.07M huggingface dataset:
Trelloのカレンダーをgoogleと同期

Trelloのボード上で
<img src=https://qiita-image-store.s3.amazonaws.com/0/296108/2df5bf09-d4ce-c2c2-5105-b3c544eab9c7.png width=500>
画面右上の**[カレンダー]**をクリック

<img src=https://qiita-image-store.s3.amazonaws.com/0/296108/257f9fff-288d-3df0-b30c-27d0935b3bdc.png width=500>
カレンダーが表示されるので右上の歯車をクリック
iCalendarフィードのURLをコピーする

<img src=https://qiita-image-store.s3.amazonaws.com/0/296108/43a17b0d-513d-6951-8328-1af86ef7b51c.png width=500>
googleのカレンダーで**[カレンダーを追加]->[URLで追加]**をクリック

<img src=https://qiita-image-store.s3.amazonaws.com/0/296108/e5838cd2-52b8-ab3a-be49-2669cccdf475.png width=500>
画面が切り替わるので先ほどコピーしたURLをペーストし、**[カレンダーを追加]**をクリック



参考:
[Trelloで作成した予定をGoogleカレンダーに同期してみる](http://toaru-marke.com/2016/08/07/trello%E3%81%A7%E4%BD%9C%E6%88%90%E3%81%97%E3%81%9F%E4%BA%88%E5%AE%9A%E3%82%92google%E3%82%AB%E3%83%AC%E3%83%B3%E3%83%80%E3%83%BC%E3%81%AB%E5%90%8C%E6%9C%9F%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B/)
GoogleCTF #beginners/misc-security-by-obscurity

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/3b054e43-fc62-b59a-5bf1-493e50dd29ab.png)

#問題

https://capturetheflag.withgoogle.com/#beginners/misc-security-by-obscurity

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/2371c9d9-fa0f-3032-41a1-62491716ef29.png)


#解いてみた

添付ファイルをダウンロードします。

ZIPファイルを解凍するとまたZIPファイルがあるので解凍します。
またZIPファイルがあるので解凍します。
またZIPファイルがあるので解凍します。
またZIPファイルがあるので解凍します。
というように何回もZIPファイルがZIPされています。
途中7ZIPとかもありましたが、めげずに解凍します。
合計60回くらいやったでしょうか。
最後のZIPはパスワードがついていました。

パスワードのヒントとなるものが何もなかったので、Lhaplusを使って解読します。
数字、大文字、小文字で検索。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/fe9fcb7e-df23-2d24-fad5-78ad1aa5bb04.png)

このパスワードを使って解凍します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/747412cd-c2e6-7882-9e75-48466e4cfa1b.png)

ついにパスワードファイルです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/8b42e922-9ece-3dc1-290f-5f7d0cf7ba39.png)

正解後に再度クリックすると緑色になることがわかったので、今後はこのキャプチャ使います。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/d089526e-47df-7133-0caf-291af42ea3a6.png)
HTML&CSS初級編を終えて

[未来電子テクノロジー](https://www.miraidenshi-tech.jp/intern-content/program/)でインターンをしているtsuyoshi514です。
#HTMLの見出しの作り方
HTMLはテキストを反映させるためにはタグが必要で、終了タグを忘れてはいけません。見出しにはh1、h2などを使用して作ります。大きさはh1の見出しが一番大きく次にh2が大きくなっています。改行するためにはこのように見出しの大きさを変えるか、もしくはp要素を使用して改行することができます。p要素を使用する際も終了タグが必要なので注意が必要です。

#CSSでのテキストの色の変え方や文字の大きさの変え方
CSSではHTMLで指定した要素に対してどこの何をどうするかを指定することができます。
例えば、colorを使用すれば文字の色を変えることができますし、font-sizeを使用すれば文字の大きさを変えることができます。ただ値を指定する場合にはコロンとセミコロンが必要となってくるのでこれを忘れないようにしましょう。

#Classを使用することでタグに名前を付ける
Classでタグに名前を付けることで、その名前を付けられた要素にのみ別のCSSを適応することができます。ただこのCSSを適用する際にClass名の前に.を付ける必要があります。そして複数のタグに同じClass名を付けるとその同じClass名の要素にCSSを適応することができるので、これを覚えておくと便利だと思います。

#レイアウトについて
レイアウトはdiv要素で構成されており、このレイアウトがwebサイト作成においてとても重要になってきます。
僕が使用したprogateではヘッダー、ボディー、フッターでサイトが構成されており、このレイアウトが最も単純なレイアウトだと思います。そしてheader、body、footerなどのようにclassで名前を付けて別々に画像を挿入したり送信ボタンを作ったりすることでサイトが完成します。

#最後に
初心者である僕が初めてプログラミングに触れて、classで名前付けすることがなかなか重要なのかなと思いました。progateでプログラミングの練習をしている時もこのclassで名前を付け忘れたりだとか、そもそも名前が間違っていたりしてうまくいかないことが多かったです。このような些細なことでもバグにつながるので慎重にこれからも練習していきます。
HomebrewでRicty Diminishedフォントをインストールする

# 結論

この２行でインストールできる。他のフォントも同様。

```sh
$ brew tap homebrew/cask-fonts
$ brew install font-ricty-diminished
```

# 詳細

```sh
$ brew search ricty
==> Casks
font-ricty-diminished
```

Ricty Diminished があることがわかる。

```sh
$ brew tap homebrew/cask-fonts
==> Tapping homebrew/cask-fonts
Cloning into '/opt/homebrew/Library/Taps/homebrew/homebrew-cask-fonts'...
:
Tapped 1936 casks (1,969 files, 14.6MB).

$ brew tap
homebrew/cask-fonts
homebrew/core
```

`homebrew/cask-fonts` をtapする。

```sh
$ brew install --cask font-ricty-diminished
==> Downloading https://rictyfonts.github.io/files/ricty_diminished-4.1.1.tar.gz
######################################################################## 100.0%
==> Installing Cask font-ricty-diminished
==> Moving Font 'RictyDiminishedDiscord-Regular.ttf' to ...
==> Moving Font 'RictyDiminished-BoldOblique.ttf' to ...
==> Moving Font 'RictyDiminished-Oblique.ttf' to ...
==> Moving Font 'RictyDiminished-Regular.ttf' to ...
==> Moving Font 'RictyDiminishedDiscord-Bold.ttf' to ...
==> Moving Font 'RictyDiminishedDiscord-BoldOblique.ttf' to ...
==> Moving Font 'RictyDiminishedDiscord-Oblique.ttf' to ...
==> Moving Font 'RictyDiminished-Bold.ttf' to ...
🍺  font-ricty-diminished was successfully installed!
```

インストール完了後すぐに使える状態になっている。

```sh
$ brew tap
homebrew/cask-fonts
homebrew/core
```

brew caskはhomebrew/coreに含まれるようになったっぽい
Android Studioでの重要なファイル

#初めに

こんにちは、もりやまです。

Androidのアプリを友達と作ることになったのでとりあえずAndroid Studioの[初めてのアプリを作成する](https://developer.android.com/guide/?hl=ja)をやったのでその時のメモになります。


#重要なファイル
##app > java > com.example.myfirstapp > MainActivity.java
このファイルはメインアクティビティです。アプリをビルドすると一番最初に表示されるUIの動作を書きます。

##app > res > layout > activity_main.xml
UIを決めるファイルです。ここで、最初に表示されるレイアウトを決めます。

##app > manifests > AndroidManifest.xml
ここに、アプリの重要な情報（コンポーネントやパーミッションなど）を決めます。

##Gradle Scripts > build.gradle
よくわかんないです。だれか教えてください。
FactoryBot で汎用的な skip Validation, save(validate: false)

パッと見どこにも書いてなかったので覚書

FactoryBotを使ってModelを作成するとき、Validationスキップする方法としてよくある書き方

```ruby:spec/factories/users.rb
FactoryGirl.define do
  factory :user do
    name 'HAZI'
    age 31

    to_create { |instance| instance.save(validate: false) }
  end
end
```

この方法だと、該当のモデル（この場合User）を作成するとき、全てにおいてValidationがスキップされるのでよろしくない。

なので、下記のように `trait` を使って `create(:user, :skip_validate)` と指定した時のみValidationを無効にする。

```ruby:spec/factories/users.rb
FactoryGirl.define do
  factory :user do
    name 'HAZI'
    age 31

    trait :skip_validate do
      to_create { |instance| instance.save(validate: false) }
    end
  end
end
```

が、そもそも `trait` は `factory` メソッドの外（ `FactoryBot.define` ブロック直下）で定義すると全てのFactoryで有効な`trait`として定義できる。

なので、 `spec/factories/traits.rb` などの名前でファイルを新規に作成し、そこで `trait` を定義をするようにすると、全てのモデルで `create(:XXX, :skip_validate)` が有効になる。

```ruby:spec/factories/traits.rb
FactoryBot.define do
  trait :skip_validate do
    to_create { |instance| instance.save(validate: false) }
  end
end
```
nodeでcsvの読み書き


node.jsでcsvの入出力をする機会があったのでメモ。

## やりたいこ

csvを読み込み、csvの特定のカラムに処理を加え、再度csvとして出力したい。
例えば下記のような感じ。

```
1,aaa,hoge
   ↓
1,AAA,hoge
```

2カラム目を大文字に変換して出力。

## 方針と準備

[node-csv](https://github.com/adaltas/node-csv)というモジュールがあるみたいなので、とりあえずそれを使ってみる。

```bash
npm install --save csv
```

テスト用のCSVファイルをindex.jsと同じ階層に作成。

```csv:test.csv
1,aaaa,hoge
2,bbbb,foo
```

## 実装

なんか独特の書き方。

```index.js
const fs = require('fs');
const csv = require('csv');

//処理（跡でpipeに食べさせる）
const parser = csv.parse((error, data) => {

    //内容出力
    console.log('初期データ');
    console.log(data);

    //変換後の配列を格納
    let newData = [];

    //ループしながら１行ずつ処理
    data.forEach((element, index, array) => {
        let row = [];
        row.push(element[0]);
        row.push(element[1].toUpperCase()); //2カラム目を大文字へ
        row.push(element[2]);
        //新たに1行分の配列(row)を作成し、新配列(newData)に追加。
        newData.push(row);
    })

    console.log('処理データ');
    console.log(newData);

    //write
    csv.stringify(newData,(error,output)=>{
        fs.writeFile('out.csv',output,(error)=>{
            console.log('処理データをCSV出力しました。');
        })
    })
})

//読み込みと処理を実行
fs.createReadStream('test.csv').pipe(parser);
```

>header行を読み飛ばすには下記のように、csv.parse()において、from_lineオプションを設定すればよい。

```js
csv.parse({ from_line: 2 }, (error, data) => {})
```

実行してみる。

```bash
node index.js
```

出力結果。

```csv:out.csv
1,AAAA,hoge
2,BBBB,foo
```

## その他

SJISとか読むならゴニョゴニョする必要があるらしい。
[RSpec] CapybaraでCSSの●番目の要素を指定したい！（同じ要素が複数あるとき）

# 例えば
`class: "fa-pen"`が３個あるとき

```ruby:
find(".fa-pen").click
```

→Rails「何個目の`".fa-pen"`だよ？？」

# こうする
```ruby:
first(".fa-pen").click
```
→１個目を取り出す

# ２個目以降は？？

```ruby:
second(".fa-pen").click
```

↓

```ruby:
 Failure/Error: second(".fa-pen").click
     
     NoMethodError:
       undefined method `second' for #<RSpec::ExampleGroups〜〜〜
```

<br />
ダメじゃん。。
<br />
# ２個目以降は、【配列から取り出す】

```ruby:
page.all(".fa-pen")[1].click
```
→配列のindexが1なので、2個目を取り出す
（1個目を取り出す場合は、[0]とする）

#お世話になりました

参考：Capybara で同名の CSS セレクタを持つ複数の HTML 要素から任意の要素を見つける
https://easyramble.com/find-html-element-with-capybara.html

<br />
おわり
<br />
[Firebase] 複数 project の rules を管理して deploy するには？

# 公式サポートはない

[この issue](https://github.com/firebase/firebase-tools/issues/590) みたいに development/staging/production で firebase.json の出し分けをしたいと思っても、それはサポートされていない...
つまり、例えば firestore なら `firestore.rules` の1ファイルだけが全プロジェクトの deploy 元として使われる。

これは環境別に rules を分けたい時に辛い。
**`firestore_devlopment.rules`, `firestore_production.rules` みたいに管理しする方法。

# [hooks](https://firebase.google.com/docs/cli/?hl=ja#predeploy_and_postdeploy_hooks) で頑張る
幸いにも `firebase deploy` には hook 機能があるので、 `predeploy` で頑張ればいける。
何をしたかというと、predeploy のタイミングで `firestore.rules` を上書くようにした。

## 1) rules 定義
環境ごとにファイルを作って定義。

* firestore_development.rules
* firestore_staging.rules
* firestore_production.rules

## 2) firebase.json の編集
```firebase.json
{
  "firestore": {
    "predeploy": "./predeploy_firestore.sh",
    "rules": "firestore.rules",
    "indexes": "firestore.indexes.json"
  }
}

```

こんな感じで predeploy を追加。

## 3) スクリプトを書く
```predeploy_firestore.sh
#!/bin/sh

environment="" # development, staging, production

# get environment (ex: "FooBar_development")
if [[ $GCLOUD_PROJECT =~ ^FooBar_([a-z]+)$ ]]; then  # 雑な正規表現
  environment=${BASH_REMATCH[1]}
else
  exit
fi

# overwrite 'firestore.rules' file
echo "${environment} 用の rules を firestore.rules にコピーします..."
cp firestore_${environment}.rules firestore.rules
echo "firestore.rules の上書きが完了しました。"

# Slack に通知
curl -X POST --data-urlencode "payload={\"channel\": \"#firebase\", \"text\": \"*$GCLOUD_PROJECT* の \`firestore.rules\` を更新します...\"}" [webhook url]
```

ポイントは、Firebase の [hooks で使える環境変数](https://firebase.google.com/docs/cli/?hl=ja#environment_variables) **`$GCLOUD_PROJECT`** を見ている点。

## 4) deploy

```terminal
$ firebase use Foobar_staging
$ firebase deploy --only firestore:rules 
```

# おわりに
そもそも rule が環境で違うくなるケースてそんなないから、あまり必要ない知識説はある、、
[RSpec] (feature) Capybaraでfill_in使って失敗するとき

# こんなコードがありました
```
<%= provide(:title, "Create New List") %>
<div class="listsnewPage">
  <div class="container">
    <%= form_with model: @list, url: lists_path, class: "new_list" do |f| %>
      <%= f.label :title, "List Title" %> <span>(1〜20 characters)</span>
      <%= f.text_field :title, autofocus: true, autocomplete: "off", class: "form-control listName" %>
      <div class="text-center">
        <%= f.submit "Create", class: "submitBtn" %>
      </div>
    <% end %>
  </div>
</div>
```

# こんなテストを書きました（feature spec, js: true）
```ruby:
fill_in "List Title", with: "created_now"
```

→ダメ

```ruby:
fill_in ".form-control", with: "created_now"
```

→ダメ！！！！

fill_in使ってるのにformに入力できない問題発生

#いきなりですが
参考：Rspec Capybaraで実際テストを書いて困ったシチュエーションの解消法
https://qiita.com/kon_yu/items/52a0f5f0016564486061


# fill_in
<b>form(input)にidまたはnameが指定されていないと使えない</b>

# class指定の場合は？？？
こうする

```ruby:
find(".form-control").set("created")
```

通ったーーーーー！！！！！！！

# けど
なんでf.labelに"List Title"って設定してるのに通らないんだろ？
わからん。。


#とりあえず
<b>fill_inでダメなときはfind使ってみるといいことあるかも</b>
（根本的な解決には至っていない可能性）

<br />
おわり
<br />
Google cloud functionsでGoを使う

# Google cloud functionsでGoを使う

betaだが公式でサポートされた
https://cloud.google.com/blog/products/application-development/cloud-functions-go-1-11-is-now-a-supported-language

Goのバージョンは1.11
※リリースタイミング


# 利用する前に
Goを使う場合、以下2つの関数として作成できる

* HTTP functions
* background functions

## HTTP functions
httpリクエストによって呼び出される関数。
追加のAPI Gateway層がなくても実行できる。
httpsもサポートしている。


## Background functions
イベントに応答して呼び出される関数。
例えば、GCSのバケットに変更があったことをトリガーに実行されるなど。


今回はHTTP functionsでHelloWorldを試してみる


# HelloWorld
## 作業用のディレクトリを作る
```
$ mkdir helloWorld
$ cd helloWorld
$ touch function.go
```

## 関数作成

```function.go
package function

import (
	"fmt"
	"net/http"
)

func HelloWorld(w http.ResponseWriter, r *http.Request) {
	fmt.Fprintf(w, "Hello, World!")
}
```

## デプロイ
今回はgcloudコマンド経由でデプロイする

```
$ gcloud functions deploy helloWorld --entry-point HelloWorld --runtime go111 --trigger-http
Deploying function (may take a while - up to 2 minutes)...⠏
availableMemoryMb: 256
entryPoint: HelloWorld
httpsTrigger:
  url: https://{REGION}-{MYPROJECT}.cloudfunctions.net/helloWorld
labels:
  deployment-tool: cli-gcloud
name: projects/{MYPROJECT}/locations/{REGION}/functions/helloWorld
runtime: go111
serviceAccountEmail: {MYPROJECT}@appspot.gserviceaccount.com
sourceUploadUrl: https://storage.googleapis.com/xxxxxxxxxxxxxxxxx
timeout: 60s
updateTime: '2019-01-26T08:26:46Z'
versionId: '1'
```

他にもデプロイ方法があって公式にある
（ちょっと分かりづらい）
https://cloud.google.com/functions/docs/deploying/?hl=ja

GCPのプロジェクトに紐づいているかどうか確認するには
```
$ gcloud config list
```

紐づいていない場合は以下のコマンドでセット

```
$ gcloud config set project {PROJECT NAME}
```


## アクセス
deployの時に出てきてた

```
httpsTrigger:
  url: https://{REGION}-{MYPROJECT}.cloudfunctions.net/helloWorld
```

にブラウザからアクセス。
無事Hello, World!が表示されたら完了
VBA_クリップボードに文字列を代入(clip.exe使用)

#1.概要
クリップボードにテキストを反映する手法において、clip.exeを使用したもの。
・WinAPIを使用せずに出来ないか考え作成した。(結局ソースは煩雑になったためあまり意味は無かったかも)
・tempファイルは実行後にKillしたかったが何故かメモリリークし上手くいかなかったので諦めた。

(備考)DataObjectは簡単にクリップボードにアクセスできるが、クリップボードに文字列を代入する場合、全角が含まれると失敗する。

#2.ソースコード

```vb
Option Explicit

Public Sub testRunClipEXE()
    
    Dim buf As String
    buf = "testテスト"
    
    Dim mypath As String
    
    Call RunClipEXE(buf)
    
    'この後ペーストすると"testテスト"が貼り付けられる
    
End Sub


'clip.exeを使用しクリップボードにarg_strを反映する。
'※clip.exe：Win標準のコマンドラインからクリップボードに値を挿入するプログラム
Public Function RunClipEXE(ByVal arg_str As String)

'手順：① 一時ファイル.txtを作成
'      ② 一時ファイルに引数を書き込み
'      ③ clip.exeで一時ファイルの内容をクリップボードに反映

'①
    '一時ファイルのパス
    Dim tmpPath As String
    tmpPath = ThisWorkbook.Path & "\RunClipEXE_temp.txt"
    
    'ファイル番号を取得し、一時ファイルを開く。
    Dim FileNumber As Integer
    FileNumber = FreeFile
    Open tmpPath For Output As #FileNumber
    
'②
    '一時ファイルに引数を書き込み
    Print #FileNumber, arg_str

    'ファイルを閉じる。
    Close #FileNumber
    
'③
    'WSHオブジェクトを作成
    Dim WSHobj As Object
    Set WSHobj = CreateObject("WScript.Shell")
    
    'clip.exeを実行し、でtmpPathのテキストをクリップボードにコピー
    '引数0はコマンドラインの非表示設定
    Call WSHobj.Run("cmd /c clip.exe < """ & tmpPath & """", 0)

End Function


```

#3.出力結果

～略～
atcoder ABC100

c問題は簡単だったが、D問題も冷静に考えることで解くことができた。
https://atcoder.jp/contests/abc100

#C問題
#方針
各aについて何回2で割れるかをカウントする。

#D問題
#方針
まず綺麗さ、美味しさ、人気度の絶対値の合計というところに注目する。これが絶対値でなければ、各ケーキについてこの三つの合計値を求め、ソートし上からM個足し合わせるだけで答えが求まるが、今回は絶対値の合計の最大値なので、綺麗さ、美味しさ、人気度それぞれが正の値の場合、負の値の場合の2通りあるので計8通りの値を各ケーキについて求めれば、それぞれについてソートし上からM個とったものの中から最大のものが答えになる。
AWS IAMの基本概念を概念モデルで整理した

AWS IAMに登場する概念はややこしく、初学者が理解するのは難しいと思います。
そこで、概念モデルを作成して、AWS IAMの基本概念を整理しました。

※ 一部の概念はTerraformのリソース名を参考に命名しています。

# 全体像

AWS IAMに登場する基本概念は、以下のように整理できました。

![aws_iam_model.png](https://qiita-image-store.s3.amazonaws.com/0/216010/4ff884a6-7013-d801-3c5e-7a5f8a7141ae.png)

それでは、以下の3つに分けてややこしい点を説明していきます。

* IAM Policy
* IAM Policy Attachment
* IAM Role

# IAM Policy

![aws_iam_model_iam_policy.png](https://qiita-image-store.s3.amazonaws.com/0/216010/38dd3713-692d-84b8-9b88-3a49b8109dcf.png)

IAM Policyとは、どの「リソース」へのどの「アクション」を許可 (拒否) するかを定義するものです。
例えば、「S3へのListBucketを許可」といった内容になります。

IAM Policyには「管理ポリシー」と「インラインポリシー」の2種類がありますが、「インラインポリシー」は非推奨とされています。
※ インラインポリシーはIAM Role、IAM Group、IAM Userに直接記述するものですが、非推奨ということもあり、今回作成したモデルではそこまで表現していません。

管理ポリシーには以下の2種類があります。

* AWS管理ポリシー
    * AWSがあらかじめ用意している管理ポリシー
* カスタマー管理ポリシー
    * カスタマーが独自に作成する管理ポリシー

JSONは一見ややこしいですが、少しじっくり見れば、実はそれほど難しくありません。
どのリソースへのどのアクションを許可 (拒否) するか、ただそれだけを表しています。

# IAM Role Policy Attachment

![aws_iam_model_iam_policy_attachment.png](https://qiita-image-store.s3.amazonaws.com/0/216010/0be22ea8-d0f8-b862-9345-12a70a717a68.png)

IAM Policyは何かにアタッチして始めて意味を成します。

アタッチできる対象は以下の3つです。

* IAM Role
* IAM Group
* IAM User

IAM Userに直接アタッチすることは推奨されていないので、IAM Userにポリシーをアタッチしたい場合は、代わりにIAM Groupにアタッチし、IAM UserをIAM Groupに入れましょう。

IAM Roleは少しややこしいので、以下で別途解説します。

# IAM Role

![aws_iam_model_iam_role.png](https://qiita-image-store.s3.amazonaws.com/0/216010/8036d8ec-eccd-25ad-08c8-02e3f74e8e2d.png)

IAM Roleは、あるリソースに対して他のリソースへのアクションを許可したい場合に使います。

例えば、EC2からS3にListBucketできるようにしたい場合、以下のステップを踏むことになります。

* S3へのListBucketを許可するIAM Policyを作成
* EC2をPrincipalに設定したIAM Roleを作成し、上記のIAM Policyをアタッチ
* EC2インスタンスに上記のIAM Roleをアタッチ

EC2をPrincipalに設定したのは、「このロールはEC2にアタッチできるものだよ」という意味です。
Principalはマネジメントコンソールやドキュメント上で「信頼」という言葉で表現されることがあります。

※ 実際には、EC2へのIAM Roleのアタッチは、インスタンスプロファイルを経由することになります

IAM Roleを使わずとも、IAM Userのアクセスキー、シークレットアクセスキーをEC2内の ~/.aws/credentials や、アプリケーションのプロパティファイルなどに設定すれば、EC2から他のリソースにアクセス可能になります。
しかし、その方法はアクセスキー、シークレットアクセスキーの漏洩というリスクを追うことになるため、非推奨とされています。

# おわりに

これでAWS IAMの基本概念を整理できました。
AWS Organizations、Permissions boundaryといったものを含めるとより複雑になりますが、第一歩としてはこのくらいかなと思います。

IAM関係は重要なわりに難しく、私もまだまだ理解が浅いので、もし間違いに気付かれた方はご指摘お願いします。
ストロングパラメーターを設定する

ログイン画面の実装をする際に入力する値に対してストロングパラメーターを実装する方法を紹介します。

## form_foからログイン情報を入力する

```
# app/view/sessions/new.html.erb
...
<%= form_for :session, url: login_path do |f|%>
  <div class="form-group">
    <%= f.label :email, class: "text-white"%>
    <%= f.text_field :email, class:"form-control"%>
  </div>
  <div class="form-group">
    <%= f.label :password, class: "text-white" %>
    <%= f.password_field :password,class: "form-control" %>
  </div>
  <%= f.submit "ログイン",class:"btn-block btn-white"%>
<% end %>
...
```
```
# config/routes.erb

Rails.application.routes.draw do
...
  post "/login", to: "sessions#create"
...
end
```
このフォームに「email」と「password」を入力してログインボタンを押すと、
paramsの中にsessionというハッシュがpostされます。
sessionの中にはemailとpasswordに関するハッシュが含まれています。

## コントローラーでストロングパラメーターを設定する
```
# app/cotroller/sessions_controller.rb

class SessionsController < ApplicationController
...
  def create
    user =User.find_by(email_params)
    if user && user.authenticate(password_params[:password])
      log_in  user
      redirect_to root_path,success: "ログインに成功しました"
    else
      flash.now[:danger]="ログインに失敗しました"
      render :new
    end
  end
...
  private
  def log_in(user)
    session[:user_id]=user.id
  end

  def email_params
    params.require(:session).permit(:email)
  end

  def password_params
    params.require(:session).permit(:password)
  end
...
end
```
createメゾットの中を説明していきます。
まず、ここではfind_byによってUserテーブルからemail_paramsに合った最初の値を取得します。

```
user =User.find_by(email_params)
```
email_paramsはprivate以下にあるメゾットです。
private以下にあるため、class外から呼び出すことができません。
ここでrequireメソッドによって、paramsから引数に設定したsessionの値を取得することができます。 
そしてpermitメソッドによってsessionの中のemailの値だけの使用を許可します。
passwordも同じように設定します。

```
def email_params
  params.require(:session).permit(:email)
end
```
次にその下のif文でuserとuser.authenticate()がTrueのとき
ログインが成功するようになっています。
authenticateメソッドは、引数に指定したパスワードの値と、userテーブルに登録されているpasswordと一致しているかを検証します。

```
if user && user.authenticate(password_params[:password])
```

ただし、このメゾットを使う場、modelsのuser.rbでhas_secure_passwordの記述が必要です。

```
# app/models/user.rb

class User < ApplicationRecord
...
  has_secure_password
...
end
```
再び、sessions_controller.rbのcreateメゾットに戻ります。
`log_in  user`はprivateのlog_in()メゾットの引数にuserを渡しています。
次の行のコードのredirect_toで第１引数に指定したURLにリダイレクトされます。

```
# app/cotroller/sessions_controller.rb

log_in  user
redirect_to root_path,success: "ログインに成功しました"
```
pirkaというAIを公開した感想

#はじめに
「[pirka](https://pirka-ai.github.io)」というAIを1月26日正午に公開したのでまとめてみた。どういうものかも含めてうだうだ書いていく。うだうだ。
#僕は誰?
##いとっぴー
・13歳。
・Pythonとモッツァレラチーズのピザが好き。
・デバッグの進み具合で一喜一憂する単細胞生物。
・[ECoder's](https://ecoder-s.github.io)や[学生LT](https://student-lt.tech)に参加している。
#pirkaとは?
僕がいつからか<sup><font color="Green">[いつ?]</font></sup>開発している、「人と楽しく会話することを目的とした」AI。ニューラルネットワークやらディープラーニングやらもやってみたいけど、メインPCがラズパイなので現時点では簡単な機械学習でガマン。だから知性は低い。MacBook Proほしいな。
##機能
・今の感情を4つの数値で表し、ユーザの発言によって変化させる。
・「こんにちは」「かわいいね」などの幾つかの決まった発言に対しては、今の感情に応じてそれぞれ決まった応答を返す。
・それ以外の発言は、テンプレートを使って返す。
・テンプレートはユーザの発言から学習する。
・「猫は可愛いね」「虹は七色」などの発言を「常識」と判定し、

```python3:
{
"猫" : ["可愛い"], 
"虹" : ["七色"]
}
```
というように学習する。
・学習した常識から三段論法を使って新たな常識を導き出す。
##名前の由来
「pirka」というアイヌ語の言葉が可愛いなと思ったのでつけた。「美しい」という意味。同じ名前のホッキョクグマが北海道にいる。可愛い。
#大変だったこと
いろいろある。
##MeCabがWindowsで使うのがクソめんどい
コンピュータに辞書を引かせてる処理「形態素解析」を行うmecab-pythonの、Windowsでのインストールが面倒らしい。ということで、セットアップ用のコマンドをOSごとに用意することにした。1月中にやりたい。公開直後、ダウンロードしてくださった方が教えてくださった。
##PyQt5の日本語資料が少ない
GUIモジュールPyQt5の日本語資料が少なすぎたので、自分で英語の資料を和訳する羽目になった。
##開発スピードにムラがある
バグ発生
↓
取り敢えずデバッグしてみる
↓
解決しない
↓
脳がフランス革命起こして開発意欲をギロチンに処す

こんなことを2、3日に一度繰り返してました。モチベの維持は難しい…。
#補足
(1月27日記)
この記事が10評価、GitHubのレポジトリが7評価いきました。ありがとうございます。
#まとめ
[こちら](https://github.com/pirka-ai/pirka-ai)からダウンロードしてみてください。
amazon cli

#amazon CLIをインストールしてみました
[Microsoft Windows で AWS Command Line Interface をインストールする](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/install-windows.html#awscli-install-windows-path)
を参考に環境設定を進めていきました。

手こずった２点
パスの設定の仕方がわかりませんでした。
結果以下の三点を追加してパスが通るようになりました。
C:\Users\10001176313\AppData\Local\Programs\Python\Python37\Scripts
C:\Users\10001176313\AppData\Local\Programs\Python\Python37
C:\Users\10001176313\AppData\Local\Programs\Python\Python37\libs
IAMユーザは最初からAWSアクセスの種類を選択する際にプログラムによってアクセスにチェックを入れておかないとエラーが返ってくるのかも、、、

AWS CLI が正しくインストールされたことを確認します
aws --version
aws-cli/1.16.96 Python/2.7.15 Windows/10 botocore/1.12.86

AWS CLI を設定　認証情報とデフォルト設定で AWS CLI を設定します
aws configure


AWSの画像認識API Rekognitionを試してみる(AWS　コマンド)
イメージ内のラベルの検出
(AmazonRekognitionFullAccess と AmazonS3ReadOnlyAccess のアクセス権限を付与する)
aws rekognition detect-labels --image "S3Object={Bucket="bucket",Name="file"}"
レスポンスが返ってくる

なんとなくCLIを使ってみることができた

今度は何らかの見やすいフォーマットで表示できるようにし、Lambdaを使いS3にアップロードをトリガに実行できるようにしてみよう
MSVCでクラステンプレート内変数テンプレートのバグ？

## std::enable_if<~~, std::nullptr_t> = nullptr ってクッソ長いよね

テンプレートパラメータ内でenable_ifを使うとき、enable_ifの条件文が長ったらしくなることがあった（ついでに複数ヶ所で同条件があった）のでクラス内変数テンプレートでまとめてみた...

``` c++:こんな感じ
#include <type_traits>

template <int x>
struct A {
    template <int y>
    static constexpr bool flag = x < y;

    template <int y, std::enable_if_t<flag<y>, std::nullptr_t> = nullptr>
    void f() {
    }
};

int main() {
    A<1> a;
    a.f<2>();
    return 0;
}
```

...ら　このコード、MSVCではビルドできない
xのライフタイムが期限切れとか言われる

GCC https://godbolt.org/z/s8o1jP
Clan https://godbolt.org/z/dCu8gg
MSVC https://godbolt.org/z/NO5Ofl

~~wandboxさんMSVC使えるようにならないかな...~~

## 対処

~~MSVCを使わない~~

一応、回避方法はあった

- テンプレートパラメータ内で変数テンプレートを使うのをやめる
 - enable_ifを戻り値などで使う
- 変数テンプレートではなく、クラス内にメタ関数みたいなクラスを作ってその中で変数宣言する

``` c++
#include <type_traits>

template <int x>
struct A {
    template <int y>
    static constexpr bool flag = x < y;

    // template <int y, std::enable_if_t<flag<y>, std::nullptr_t> = nullptr>
    // void f() {
    // }

    template <int y>
    auto g() -> std::enable_if_t<flag<y>> {
    }

    template <int y>
    struct Hoge{
        static constexpr bool value = x < y;
    };

    template <int y, std::enable_if_t<Hoge<y>::value, std::nullptr_t> = nullptr>
    void h() {
    }
};

int main() {
    A<1> a;
    // a.f<2>();
    a.g<2>();
    a.h<2>();
    return 0;
}
```

これならMSVCでもビルドできた
https://godbolt.org/z/CR25J-
Hello Qiita! I am zunda

#Hello Qiita!
```python.py
print("Hello")
```
##HelloWorld
###HelloWorld
|Hello     | Hello    | Hello     |
|:---------|---------:|:---------:|
|こんにちは | こんにちは| こんにちは |
|lkjdsflkjs|lkjdsfsdkj|jfjd|
##こんにちは
Qiitaに初めての投稿です。

いつもはzundaという名前で[ZundaHack](https://zunda-hack.com)というサイトでブログっぽいことをしています。

自分のサイトよりQiitaに投稿することがふさわしいであろうことを投稿していけたらなと思っています。
おそらくはほとんどが自分用メモになるかと思います。
#Qiita楽しい
このQiitaって初めて触ったんですが投稿画面が面白いですね。
HTMLではなくMarkdownというものなんですね、風のうわさ程度には聞いていましたが、自分の中では新鮮味があってちょっと楽しいです。

#あとがき
最初の謎のHello暴れはMarkdownを触ってみた方だけです。気にしないでください。
【PHP】print_r(false)をvar_dumpしたらtrueになった

タイトルの通りです。

``var_dump(print_r(false));``の結果は、``bool(true)``になります。

```php
<?php
print_r(true);                  // 出力結果：1
var_dump(print_r(true));        // 出力結果：1bool(true) print_rの出力(1)とvar_dumpの出力(bool(true))が同時に行われる

print_r(false);                 // 出力結果：なし
var_dump(print_r(false));       // 出力結果：bool(true)
```

公式サイトに答えがありました。

> [php.net〜print_r](http://php.net/manual/ja/function.print-r.php)
>> return パラメータがTRUEの場合は、この関数はstringを返します。それ以外の場合の返り値はTRUEです。

例えば``print_r($test, TRUE)``のように記述すると、その場で出力せずにprint_rの結果を返り値として渡します。

それをしない場合は、全て返り値はTRUEになるとのことでした。

```php
<?php
$test_true = print_r(true);         // 出力結果：1
echo $test_true;                    // 出力結果：1         
var_dump($test_true);               // 出力結果：bool(true)
echo gettype($test_true);           // 出力結果：boolean

$test_false = print_r(false);       // 出力結果：なし
echo $test_false;                   // 出力結果：1
var_dump($test_false);              // 出力結果：bool(true)
echo gettype($test_false);          // 出力結果：boolean

// 第二引数にTRUEを指定し、print_rの結果を返り値として受け取る
$test01 = 'test01';
$test02 = print_r($test01, TRUE);   // 出力結果：なし
echo $test02;                       // 出力結果：test01
```

出力値と返り値を混ぜていただけでした・・・
rust-gdb を真似たgo-gdbという簡単gdb起動スクリプト

# gdbでgolangをデバッグする方法

gdbでgolangをデバッグする方法は公式ドキュメントに書かれています。
[Debugging Go Code with GDB ](https://golang.org/doc/gdb)

しかし、オプションをつけたり、.gdbinit を作ったりしなくてはならないのでちょっと面倒くさい。
gdbでRustをデバッグするときもそのあたりの事情は同じはずなのですが、rust-gdbというコマンドがそのややこしさを隠蔽してくれています。

# go-gdbスクリプト

rust-gdb のshellスクリプト実装を見つけました。
https://github.com/rust-lang/rust/blob/master/src/etc/rust-gdb
これを真似てgolang用のものを作りました。


```shell:go-gdb
#!/bin/sh
set -e
GOROOT=`go env GOROOT`

GO_GDB="${GO_GDB:-gdb}"
exec ${GO_GDB} \
  --directory="$GOROOT" \
  -iex "add-auto-load-safe-path $GOROOT/src/runtime/runtime-gdb.py" \
  "$@"
```

gistにも置きました。
https://gist.github.com/tetsu-koba/648166471d7c3db6f02aa1ffec1f0259
<script src="https://gist.github.com/tetsu-koba/648166471d7c3db6f02aa1ffec1f0259.js"></script>

これをPATHの通ったディレクトリに置く。(例えば ~/bin )

# 使用例

```shell_session
$ go-gdb hello
GNU gdb (Ubuntu 8.1-0ubuntu3) 8.1.0.20180409-git
Copyright (C) 2018 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from hello...done.
Loading Go Runtime support.
(gdb) 
```

このように起動した時に`Loading Go Runtime support.` が出ていればOK。
golangのmain関数の先頭まで実行してブレークさせるには`start`コマンドが便利。

```
(gdb) start
Temporary breakpoint 1 at 0x483880: file /home/koba/go/src/hello/hello.go, line 5.
Starting program: /home/koba/go/src/hello/hello 
[New LWP 2361]
[New LWP 2362]
[New LWP 2363]

Thread 1 "hello" hit Temporary breakpoint 1, main.main ()
    at /home/koba/go/src/hello/hello.go:5
5	func main() {
(gdb) 
```

goroutineの一覧を見るには`info goroutine`。省略して`info go` でもOK。


```
(gdb) info go
* 1 running  runtime.systemstack_switch
  2 waiting  runtime.gopark
  17 waiting  runtime.gopark
  18 waiting  runtime.gopark
(gdb) 
```

残念ながらgoroutineの切り替えはエラーになってしまって現状は使えない。

```
(gdb) goroutine 2
Python Exception <class 'ValueError'> not enough values to unpack (expected 2, got 1): 
Error occurred in Python command: not enough values to unpack (expected 2, got 1)
(gdb) 
```

# emacsの中からgo-gdb を起動する

```
M-x gdb
```

を実行して、

```
Run gdb (like this): gdb -i=mi hello
```

これを以下のように書き換えるだけ。

```
Run gdb (like this): go-gdb -i=mi hello
```

参考。
[emacsの中からrust-gdbを起動する](https://qiita.com/tetsu_koba/items/9460b0516d3971606cb1)

# 補足情報
gdbはpython拡張機能が有効になったものが必要です。ubuntuのaptでインストールできるものはそうなっているので大丈夫。
自分でgdbをビルドする時には、`sudo apt install libpython-dev` をしておくこと。
C言語~ポインタ~

#アドレス演算子#
オブジェクトに**&演算子**を適用すると,そのオブジェクトのアドレスが得られる
`&a aのアドレス(aへのポインタを生成する)`

#ポインタ#

```c
Type x;
Type *p;

p = &x;
```

上の時,`pはxを指す`という.
Type型のオブジェクトxにアドレス演算子&を適用した&Xは,Type *型のポインタであり,その値はxのアドレスである.

#間接演算子#
ポインタに間接演算子`*`を適用すると,それが指すオブジェクトそのものを表します.
`*a aが指すオブジェクト`
`ポインタpがxを指すとき,*pはxのエイリアス(別名)となる.`


```c
Type x;
Type *p;

p = &x;

printf("%d", *p)
```

#関数の引数としてのポインタ#

```c
#include <stdio.h>

//ポインタの引数はこう
void swap(int *px, int *py)
{
	int temp = *px;
	*px = *py;
	*py = temp;
}

void sort(int *n1, int *n2)
{
	if (*n1 > *n2)
		swap(n1,n2);
}


int main(void)
{
	int na,nb;

	puts("2つの整数を入力してください.");
	printf("整数A:"); scanf("%d", &na);
	printf("整数B:"); scanf("%d", &nb);

    //渡し方はこう&をつける
	sort(&na,&nb);
	printf("%d,%d", na,nb);

	return 0;
}

```

上のように書きます.
*`swap(n1,n2);`とかきます.`swap(&n1,&n2);`ではないです.
`&n1`と`&n2`の型は,intへのポインタへのポインタ型となるかららしい.
頂点シェーダで曲面を作る



# やりたいこと

画像を任意の曲率で円柱型に曲げたときの画像を作る必要がありました。
![image.gif](https://qiita-image-store.s3.amazonaws.com/0/280975/a9ceda80-a4ba-2e23-fecb-370661561dc3.gif)
GIFでは曲率半径を1~3unitに変動させています。

# 幾何的な話

![fig.png](https://qiita-image-store.s3.amazonaws.com/0/280975/d0d72131-ffca-8684-ff30-490df87bbb1f.png)

点Pの座標とrが分かっていて、P'の座標を求めたい訳です。円の全周が2πr（2π）でそのうちのθだけなので、l=rθです。これでθが求まりました。あとはxはcos、yはsinで座標が求まります。

# 実装

C#で頂点バッファをいじってもいいのですが、シェーダでいじった方が手っ取り早そうなので今回はSurfaceShaderで書きます。モデルの方は適度に細かい網目状の長方形を用意しておきます。（横幅を1unitに）

C#から曲率半径を受け取るために、```_Radius```を宣言します

```cpp
Properties
{
    _MainTex ("Albedo (RGB)", 2D) = "white" {}
    _Radius ("Radius", Range(1, 20)) = 1.0
}
```

頂点シェーダを明示します。

```cpp
#pragma surface surf Lambert vertex:vert
```

頂点シェーダ本体です。簡便にするため、横幅1unitだったモデルをπunitに引き伸ばしてから処理しています。

```cpp
void vert(inout appdata_full v, out Input o )
{
    UNITY_INITIALIZE_OUTPUT(Input, o);
    float pi = 3.1415926;
    float l = v.vertex.z * pi / 2;
    float r = _Radius;
    float th = l/r;
    v.vertex.xyz = float3(v.vertex.x *pi/2, r*cos(th)-r, r*sin(th));
}
```

# コード全体

```cpp:arch.shader
Shader "Custom/arch"
{
    Properties
    {
        _MainTex ("Albedo (RGB)", 2D) = "white" {}
        _Radius ("Radius", Range(1, 20)) = 1.0
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 100
        Cull off

        CGPROGRAM
        #pragma surface surf Lambert vertex:vert
        #pragma target 3.0

        sampler2D _MainTex;
        float _Radius;
        struct Input
        {
            float2 uv_MainTex;
        };

        void vert(inout appdata_full v, out Input o )
        {
            UNITY_INITIALIZE_OUTPUT(Input, o);
            float pi = 3.1415926;
            float l = v.vertex.z * pi / 2;
            float r = _Radius;
            float th = l/r;
            v.vertex.xyz = float3(v.vertex.x *pi/2, r*cos(th)-r, r*sin(th));
        }

        void surf (Input IN, inout SurfaceOutput o) {
            fixed4 c = tex2D (_MainTex, IN.uv_MainTex);
            o.Albedo = c.rgb;
            o.Alpha = c.a;
        }
        ENDCG
    }
    FallBack "Diffuse"
}

```
[OutSystems]構造体の定義（Recordの活用）

# 初めに
OutSystemsでは通常、構造体をStructureとして定義しますが、ある程度の規模のシステムを開発していると、このStructureだらけになってきてしまいます。また、Entityとほぼ同じStructureを定義すると、初期作成が面倒なだけでなく、EntityのAttributeが変わったときにStructureまで変更するはめになり大変です。そこでRecordをうまく活用する方法を紹介します。

# 利用したOutSystemsのバージョン
* サーバー：Version 11.0.118.0
* Service Studio：11.0.207.0

# ケース1：一覧画面へのチェックボックスの追加
例えば以下のような画面を作成するとします。チェックボックスを選択し、Deleteボタンを押すと選択したレコードが削除されるといった機能を持ちます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/337041/306b5568-6eb5-a984-a291-28a678b6c688.png)

このデータは以下のSample_Employeeに保持されています。当然ながらこのEntityにはチェックボックスのAttributeは存在しません。そのため、どこかにチェックボックスの選択/非選択の情報を保持する必要があります。このときにStructureを一から作るのではなくRecordを使うと便利です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/337041/2263a853-6dd0-90dd-3ef1-217f9073302a.png)

以下のようにPreparationのGetEmployeesの中のSourcesにBooleanを追加します（Structure BooleanはRichWidgets配下にあります）。当然、この処理でこのBooleanに値が設定されることはありません。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/337041/592df890-43f8-0acb-9537-b6ebd3340bcc.png)

しかしながら先ほどのようにしておくことで、TableRecords内に配置したCheckBoxのVariableとしてBoolean.Valueが選択できるようになります。これによりEntity Sample_Employeeを拡張した（BooleanのAttributeを追加した）Structureを一から作ることなく、チェックボックスの値を保持できるようになりました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/337041/6d6d5297-cac9-716a-07ce-17c7ca5d93fd.png)

# ケース2：ActionのParameter、Variable
似たようなことはActionのParameterやVariableでも実現可能です。Data TypeとしてRecordを選択することで、任意のData Type（Basic、Entity、Structure）を組み合わせたRecordを作成可能です。再利用性の低いものはStructureを作成するのではなくRecordとして定義した方が効率的ではないかと考えています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/337041/e1d0b398-d94e-7de8-c7f1-2c06862c0c10.png)
QEMU上のゲストOSをbridge、tapを利用して外部と疎通させる方法

## 完成予想図

![qemu-bridge-tap.png](https://qiita-image-store.s3.amazonaws.com/0/132463/96e358c7-b292-fee4-02ed-9ae16e71fa31.png)


## 実行環境

ConohaのVPSを利用

```
# cat /etc/os-release | grep CENTOS_MANTISBT_PROJECT
CENTOS_MANTISBT_PROJECT="CentOS-7"
CENTOS_MANTISBT_PROJECT_VERSION="7"
# uname -r
3.10.0-957.1.3.el7.x86_64
```

## qemuのインストールとcirrosイメージのダウンロード

seabiosを入れないとbiosが無いといわれるので入れる

```
# yum install -y qemu seabios
# qemu-system-x86_64 --version

(process:13448): GLib-WARNING **: 02:11:04.004: gmem.c:489: custom memory allocation vtable not supported
QEMU emulator version 2.0.0, Copyright (c) 2003-2008 Fabrice Bellard
# wget http://download.cirros-cloud.net/0.4.0/cirros-0.4.0-x86_64-disk.img
# file cirros-0.4.0-x86_64-disk.img
cirros-0.4.0-x86_64-disk.img: QEMU QCOW Image (v3), 46137344 bytes
```

## bridgeとtapの作成

```
# brctl addbr br0
# brctl show br0
bridge name     bridge id               STP enabled     interfaces
br0             8000.000000000000       no
# ifconfig br0 192.168.2.1
# ifconfig br0
br0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 192.168.2.1  netmask 255.255.255.0  broadcast 192.168.2.255
        ether 00:00:00:00:00:00  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

# ip tuntap add tap0 mode tap
# ip tuntap show tap0
tap0: tap UNKNOWN_FLAGS:800
```

`br0`に`tap0`を追加する方法が２個ある
今回は方法１を使う

### 方法１：`/etc/qemu-if{up,down}`を使う方法
`/etc/qemu-if{up,down}`：qemuの{起動,終了}時に実行される

```
# cat /etc/qemu-ifup
#!/bin/bash
ifconfig $1 0.0.0.0 promisc up
brctl addif br0 $1
# cat /etc/qemu-ifdown
#!/bin/bash
brctl delif br0 $1
ifconfig $1 down
```

### 方法２：`/etc/qemu-if{up,down}`を使わない方法
qemu実行時に`script=no`と`downscript=no`を指定する必要あり

```
# ifconfig tap0 0.0.0.0 promisc up
# brctl addif br0 tap0
# brctl show
bridge name     bridge id               STP enabled     interfaces
br0             8000.2e734667a24c       no              tap0
```

## 親機とVMの疎通

```
# qemu-system-x86_64 

// 起動後
$ sudo ifconfig eth0 192.168.2.2
$ sudo route add default gw 192.168.2.1
$ ping -c 1 <host-ip>
PING <host-ip> (<host-ip>): 56 data bytes
64 bytes from <host-ip>: seq=0 ttl=64 time=1.485 ms

--- <host-ip> ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 1.485/1.485/1.485 ms
```

## VMと外部の疎通

IPフォワードの有効化、NATの設定

```
# echo 1 > /proc/sys/net/ipv4/ip_forward
# iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

// VM上で
$ ping -c 1 8.8.8.8
PING 8.8.8.8 (8.8.8.8): 56 data bytes
64 bytes from 8.8.8.8: seq=0 ttl=121 time=2.264 ms

--- 8.8.8.8 ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 2.264/2.264/2.264 ms
```

めでたしめでたし
atcoder ABC101

c問題は簡単だったが、D問題は500点ということもあり難しかった。
https://atcoder.jp/contests/abc101

#C問題
#方針
1の範囲をどんどん増やしていき全てを1にする最小回数を求める問題。考える方針としては、まず1の位置から左にk-1個ず範囲を伸ばしていき、左端までの回数を求めその回数をlとし、右側についても同様に求めその回数をrとするとl+rで答えが求まるように思える。しかし、左の個数がk-1より少なかったりした場合を考えてみるとl+rは明らかに最小でないことがわかる。なので、まず1より左側の個数について詳しく見ていく。この個数をleftnumとすると、leftnum % (k-1) = 0 の時は、前述の理論で答えが導けることがわかる。しかし、leftnum % (k-1) != 0の時は、その(k-1-あまり分)を右側の範囲を網羅するのに使えることがわかる。よって、はじめの段階で、左側について、leftnum % (k-1)について場合分けをすることで答えを求めることができる。
 
#D問題
#方針
まず厳密な考察は解説pdfに任せるが、sunuke数を実験的に見ていくと
{1,2,3,4,5,6,7,8,9,19,29,39,49,59,69,79,89,99,199,299}
とsunuke数(n+1)はsunuke数(n)についてnの各桁+1の範囲で1を加えた数になっていることがわかる。よって、sunuke数を見つけたら、その数について(nの桁+1)桁まで各桁に+1した値のn/S(n)を求めていき、その中で最小のものを次のsunuke数としていけば良い。
Global Accelerator はターゲットから何秒レスポンスがないとタイムアウトするのか

(2020-01-28 追記)

AWS Global Acceleratorのidle Timeoutは現在公式ドキュメントにて記載があります。
[https://docs.aws.amazon.com/global-accelerator/latest/dg/introduction-how-it-works.html](https://docs.aws.amazon.com/global-accelerator/latest/dg/introduction-how-it-works.html)

>Note
>The idle timeout for the network connection depends on the type of connection:
>
>The timeout is 300 seconds for TCP connections to endpoints with client IP address preservation enabled (Application Load Balancers and EC2 instances).
>
The timeout is 90 seconds for TCP connections to endpoints without client IP address preservation (Network Load Balancers and Elastic IP addresses).


#概要

AWS Global Accelerator について、ふと疑問に思った点がありました。
ターゲットとなるエンドポイントから、どれくらいの間レスポンスがなかったらタイムアウトするのでしょうか？

例えば、API Gateway の場合、バックエンドとの間のタイムアウトは 50msec ~ 29sec で設定可能となっています。
https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/limits.html#api-gateway-execution-service-limits-table

今現在設定する項目はなく、[制限情報のページ](https://docs.aws.amazon.com/ja_jp/global-accelerator/latest/dg/limits-global-accelerator.html)にも記載がないので、とりあえず実際に試してみたいと思います。

# 構成
Global Accelerator --- EC2(Web/Python)

すごくシンプルです。

## Webサーバー
Python でつくった簡単な Web サーバを EC2 で動かします。
3600 秒待ってからレスポンスを返すように作ってます。

```python:webserver.py
#!/usr/bin/python
import time
from BaseHTTPServer import BaseHTTPRequestHandler,HTTPServer

PORT_NUMBER = 8080

class myHandler(BaseHTTPRequestHandler):
	#Handler for the GET requests
	def do_GET(self):
		time.sleep(3600)
		self.send_response(200)
		self.send_header('Content-type','text/html')
		self.end_headers()
		# Send the html message
		self.wfile.write("Hello World !")
		return

try:
	server = HTTPServer(('', PORT_NUMBER), myHandler)
	print 'Started httpserver on port ' , PORT_NUMBER

	server.serve_forever()

except KeyboardInterrupt:
	print '^C received, shutting down the web server'
	server.socket.close()
```

```bash
$ sudo ./webserver.py
Started httpserver on port  80
```

# 計測結果

単純に curl で計測します。
とりあえず最大3600秒でタイムアウトする設定で測定しました。
Global Accelerator の2つのIPにそれぞれ２回、合計4回測定しましたが、概ね **75sec** でタイムアウトする結果となりました。


```bash
$ curl -m 3600 -kL 'x.x.x.x' -o /dev/null -w "%{http_code}\t%{time_total}\n" 2> /dev/null
000	75.184206
```

```bash
$ curl -m 3600 -kL 'x.x.x.x' -o /dev/null -w "%{http_code}\t%{time_total}\n" 2> /dev/null
000	75.134897
```

```bash
$ curl -m 3600 -kL 'y.y.y.y' -o /dev/null -w "%{http_code}\t%{time_total}\n" 2> /dev/null
000	75.318919
```

```bash
$ curl -m 3600 -kL 'y.y.y.y' -o /dev/null -w "%{http_code}\t%{time_total}\n" 2> /dev/null
000	75.947411
```

# まとめ
75秒、、、
net.ipv4.tcp_keepalive_intvlのデフォルト値が 75 なので関係があるのかな・・・
雑な検証なので、Global Acceleratorの仕様がこうというわけではなく、今回の環境ではこういう結果になったという感じですね。
RSelenium のすヽめ

RSelenium でスクレイピングをしようとした時に日本語の記事がほとんどなく、TOEIC200点の英語力に頼るのがしんどかったので設定からデータ取得の流れを置いときます。

以下のページをスクレイピングしてみます。
https://jglobal.jst.go.jp/search/anythings#%7B%22category%22%3A%220%22%2C%22keyword%22%3A%22%E3%82%AB%E3%83%96%E3%83%88%E3%83%A0%E3%82%B7%22%7D

# Dockerの準備
docker のインストールは省略

docker Selenium　のイメージを取得します。

```
docker pull selenium/standalone-chrome
```
Selenium コンテナを立てます。


```
docker run -d -p 4444:4444 selenium/standalone-chrome
```

以上でdocker の設定は終了です。

# Rの準備
`RSelenium`を準備します。

```R
install.packages("RSelenium")
library(RSelenium)
remDr = remoteDriver(remoteServerAddr = "localhost", port = 4444, browserName = "chrome")
remDr$open()
```

上記により、seleniumコンテナとRの接続が完了しました。

# スクレイピングしてみよう

```R
url <- 'https://jglobal.jst.go.jp/search/anythings#%7B%22category%22%3A%220%22%2C%22keyword%22%3A%22%E3%82%AB%E3%83%96%E3%83%88%E3%83%A0%E3%82%B7%22%7D'
remDr$navigate(url)
Sys.sleep(5)
planeHtmlList <- remDr$getPageSource()
write(unlist(planeHtmlList), "getPage.html")
```
この時、「ページの読み込み」と「ページの取得」の間隔が狭いとページをうまく取得できないので注意してください。
また、この時、ページの型は`list`であるので注意してください。

では、ここからタイトルをスクレイプしてみましょう。

```R
#install.packages("rvest")
#install.packages("XML")
library(rvest)
library(XML)
html <- read_html("getPage.html")
parsed_doc <- htmlParse(html)
title <- xpathSApply(doc = parsed_doc , path = "//a[@href]", xmlValue)
```

できた。
MySQLユーザ作成について

私は今までPHP学習にMySQLを使ってきていましたが、ユーザや権限周りをあまり触ってきませんでした。
DB操作は全てroot権限で行なっていました。ユーザ作成や権限周りに触れる機会があったので、自分用にまとめてみようと思います。

## DBにアクセス

```shell
$ mysql -u root -p
```

## MySQLユーザー作成

### ユーザの確認

MySQLのユーザ一覧を確認。

```sql
SELECT  host, user FROM mysql.user;
```

```
+-----------+------------------+
| host      | user             |
+-----------+------------------+
| localhost | mysql.infoschema |
| localhost | mysql.session    |
| localhost | mysql.sys        |
| localhost | root             |
+-----------+------------------+
4 rows in set (0.00 sec)
```

### ユーザの作成

```sql
--ユーザ作成
CREATE USER 'user_name'@'localhost';

--MySQL 5.7以前パスワード設定 / 変更
SET PASSWORD FOR 'user_name'@'localhost' IDENTIFIED BY 'user_password';

--MySQL 8.0　以降パスワード設定 / 変更
ULTER USER 'user_name'@'localhost' IDENTIFIED BY 'user_password';

--ユーザ作成&パスワード設定 バージョン共通
CREATE USER 'user_name'@'localhost' IDENTIFIED BY 'your_password;
```

試しにやってみる。

```sql
CREATE USER 'test'@'localhost' IDENTIFIED BY 'test';

SELECT  host, user FROM mysql.user;
```

```
+-----------+------------------+
| host      | user             |
+-----------+------------------+
| localhost | mysql.infoschema |
| localhost | mysql.session    |
| localhost | mysql.sys        |
| localhost | root             |
| localhost | test             |
+-----------+------------------+
5 rows in set (0.00 sec)
```

### ユーザ削除

```sql
DROP USER test;
```

## ユーザの権限設定

### 権限の確認

```sql
mysql> SHOW GRANTS FOR 'test'@'localhost';
```

```
+------------------------------------------+
| Grants for user@localhost                |
+------------------------------------------+
| GRANT USAGE ON *.* TO `user`@`localhost` |
+------------------------------------------+
```

### 権限の追加

概要などは下記URLが詳しいので参考になりました。

[[MySQL]権限の確認と付与](https://qiita.com/shuntaro_tamura/items/2fb114b8c5d1384648aa)
コードレビュー、検証時にみる順番

# 概要

コードレビューの時にみる順番を自分なりに整理して見た。

# 型

1. 型を見る
2. 型に対しての別の型だった場合の処理がどうなっているのかを見る。
3. 連想配列の場合はキーが間違っていないかを見る。→整合性があるかも含める
4. if文がある場合は、その判定が正しいかを確認する。→型が関係ある場合にはそれを確認する


# 変数名

1. 文法的に変数の宣言自体に問題がないか
2. 変数名が適切か
3. 変数が使われている箇所の型に整合性があるか
4.

# メソッド

1. 役割に対してメソッド名は適切か→広すぎず、狭すぎないか
2. 引数の型
3. 返り値はあるか
4. 返り値がある場合は、その型は何か
5. 返り値を利用している箇所においてその使われ方は適切か
6. 

# ユニットテスト

1. ユニットテストが用意されているか
2. データプロバイダとユニットテストは分離されているか
3. DBに関係がある場合はそのためのファイルが用意されているか
4. 他のユニットに意味のない依存をしている箇所はないか
5. テストのパターンは足りているか→if文などに対して試していないパターンはないか
Homebrew で macOS に MongoDB を爆速で導入する手順

## 概要
Homebrew で macOS に MongoDB を超簡単に導入する手順の備忘録。

### 前提
2019年1月1日時点の情報です。また、以下の環境になっている前提です。

- OS： macOS Mojave (10.14.2)
- Homebrew: v1.9.3

## MongoDB を導入

homebrew でインストール

```bash
brew install mongodb
```

インストールはコレで終わり。

### インストール中にエラーが出る場合

ほとんどの場合、権限エラーによるものなので、権限が無いと怒られたディレクトリに対して全て以下のコマンドを打てば良い。

```bash
sudo chown -R $(whoami) /usr/local/該当するディレクトリ
```

例： `sudo chown -R $(whoami) /usr/local/Frameworks`
必要があれば、 `sudo` で必要なディレクトリなど作ってから行う。

### 確認

バージョン確認コマンドを利用して、入ったか確認

```bash
mongod -version
```

### 起動

```bash
brew services start mongodb
```

コレで、MondoDB が利用可能となる。
`mongo` と打てばインタラクティブモードで MongoDB を実行できる。

## 管理ユーザ作成と認証機能有効化

### 管理ユーザ登録

```bash
# MongoDB に入る
mongo

# admin データベースに接続する。
use admin

# 管理ユーザを登録
db.createUser({user:"admin", pwd:"Zaq12wsx", roles:[{role:"root", db:"admin"}]})

# ユーザの存在確認
db.getUsers()

# もしくは以下でもユーザ確認できる (パスワードはハッシュ化されているので文字列になっている)
db.system.users.find()
```

管理ユーザ登録時は以下に注意

- user: 管理者 ID を適当に決めてください（任意）。上記は一例。
- pwd: 適当なパスワードを決めてください（任意）。上記は一例。
- roles: 上記に記載のとおりに書いてください（固定）

### MongoDB 認証有効化 (その1)

```bash
# 一度 MongoDB から抜ける
exit

# 認証・認可を有効にして再起動
mongod --auth --dbpath /usr/local/var/mongodb
```

### MongoDB 認証有効化 (その2)

その1 の認証付き再起動コマンドがエラーでうまくいかない場合は、こちらで試してください。

```bash
# 一度 MongoDB から抜ける
exit

# 一度 MongoDB サービスを停止
brew services stop mongodb

# 設定ファイルを編集 (sudo 不要でできるならそれで OK)
sudo vi /usr/local/etc/mongod.conf
```

以下の記述を、設定ファイルの末尾に直接追記する

```conf:/usr/local/etc/mongod.conf
:
# 認証機能を使用しない場合, 下記をコメントアウト
security:
  authorization: enabled
```

設定後、MongoDB 再起動

```bash
# MongoDB サービス再開
brew services start mongodb
```

コレで認証設定も完了。`mongo` コマンドで入ることはできても、検索や登録・更新などを行うと認証エラーの記述が表示される。

`mongo -u ユーザID -p パスワード -authenticationDatabase admin` で mongo に入るか、
`mongo` で入った後に `use admin` → `db.auth("管理者のID", "パスワード")` を実行して中でログインすると、
問題なく検索・登録・更新などが行える。

前者のやり方は、サーバでコマンドログの記録などを行なっている場合は、推奨されない。（パスワード情報が履歴に残っちゃうので）


以上で、MondoDB の構築から認証設定まで完了。
chroma をつかってコードハイライトを生成するサンプル

go のコードの一部です。

```go
type Ping struct {
	Status int
	Result string
}

func Sample(w http.ResponseWriter, r *http.Request) {
	lexer := lexers.Get("ruby")
	style := styles.Get("monokai")
	if style == nil {
		style = styles.Fallback
	}
	formatter := html.New(html.WithClasses())
	iterator, err := lexer.Tokenise(nil, "def hoge; x=3; 6; end")
	buf := new(bytes.Buffer)
	err = formatter.Format(buf, style, iterator)
	if err != nil {
		fmt.Println(err)
	}

	sourceCode := buf.String()
	ping := Ping{http.StatusOK, sourceCode}
	res, _ := json.Marshal(ping)
	w.Header().Set("Content-Type", "application/json")
	w.Write(res)
}
```

これで、以下のような json を得る。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/45822/64a227fe-9376-85d9-de8a-80d582fa7d67.png)
Postgresql(11.1)をHomebrewで構築するときにエラー

# 環境
MacOS sierra
Homebrew
PostgreSQL 11.0

# エラー内容
Railsのアプリ作成中にpostgresqlをインストール。
データベースに繋がりませんでした。

```
Is the server running locally and accepting
connections on Unix domain socket "/tmp/.s.PGSQL.5432"?
```

# 解決方法
エラーをググり、解決方法を試すもだめ。なんか雰囲気が違うので、エラーをしっかり読むことに。
あー、
brewがちゃんと教えてくれてました！

```
To migrate existing data from a previous major version of PostgreSQL run:
  brew postgresql-upgrade-database
```

既に私のMacにpostgresql(10.~)がインストール済みだったみたいで、
データベースのアップグレードが必要だったみたい。
言われたとおりに以下実行

```
brew postgresql-upgrade-database
```

ちゃんと接続できました。

```
psql -l
                        List of databases
Name    |  Owner  | Encoding |   Collate   |    Ctype    |  Access 
```


いろんな解決方法があるみたいですが、自分が探していたときにはこのやり方ありませんでした。
（そりゃこんなハマり方するやついないだろうってことなんでしょうが...）
自分の備忘録にとっておきます。
MacでPaste Imageが使えない時

## 症状
Macのスクリーンショット機能（Shift+⌘+4+control）でスクリーンショットを撮影し、VSCodeの拡張機能である[Paste Image](https://marketplace.visualstudio.com/items?itemName=mushan.vscode-paste-image "Paste Image")を使って、Markdownに画像の挿入が出来ずに困っていた。

## 解決方法
最終的にキーバイントを変えて対応した。

https://qiita.com/kinchiki/items/dabb5c890d9c57907503
を参考にして
⌘+Alt+V → control + ⌘ + a
に変更した
Batでプログラミングの楽しさを知ろう

目次:https://qiita.com/New_enpitsu_15/private/479c69897780cabd01f4


Windows環境で簡単にプログラミング(らしきもの)を体験できるものといえば

 - batch
 - PowerShell
 - VBA

と呼ばれるものたちです。
その中でもbatchとPowerShellはWindows(7以上)さえあればすぐにでもできます。
今回はより簡単なbatchの方を触ってみましょう。

#0.下準備

ファイルを作ってみましょう。拡張子を`.bat`にしてあげると歯車のアイコンになると思います。
それをテキストエディタで開いてあげましょう。
そうしたらあとは無限の世界が広がっています。

#1.Hello world

この界隈ではおなじみ、`Hello world`です。
これは

```
@echo off
echo Hello world
pause > nul
```

と書いて保存実行すれば表示されるはずです。

###適当な解説。興味がなければ飛ばしてください。

無駄なものを削ると

```
echo Hello world
pause
```

となります。
これでも一応Hello worldは出力されていますね。

batでは
頭に`@`がついた行のコマンドは画面に表示されません。
`echo off`は実行された行以降のコマンドの表示をやめるというコマンドです。

すると、` @echo off `は`Path> コマンド`を非表示にする処理ですね。

続いて、`echo Hello world`は`echo`に`Hello world`を引数として指定しながら実行していることになります。echoは画面に指定した文字を表示するコマンドです。
試しに`echo 好きな文字`と書き換えてみてください。指定した文字が画面に表示されたはずです。

続いて`pause`。
pauseを書かないと実行した瞬間にウィンドウが閉じて`Hello world`が拝めません。
なんでやねん。
それはpauseが実行されたら一時的に処理を中断するからです。
`続行するには何かキーを押してください . . .`
というメッセージからだいたいわかるでしょうか。

最後に`> nul`。
これは出力(画面に表示される文字)を`nul`というファイルに送っているという処理になります。
nulは一時ファイルで、使わないデータを適当なところに押しやりたいときに使うものです。
試しに`> null`で実行してみると、実行ファイルと同じフォルダに中身が`続行するには何かキーを押してください . . .`と書かれている`null`ファイルができます。

#2.ファイルを一つダブルクリックするだけでよく使うファイルが全部開けたら便利じゃない？

batch(コマンドプロンプト)は、ファイル[Path](#補足)が指定されると、指定されたファイルを実行してくれます。それを利用して、

```
そこまでのPath\ゆっくりムービーメーカー3.exe
そこまでのPath\AviUtil.exe
```

などと書いて保存、そのファイルを実行してあげると、ゆっくりムービーメーカー3とAviUtilが立ち上がります

```
start そこまでのPath\ゆっくりムービーメーカー3.exe
start そこまでのPath\AviUtil.exe
```

でもいいですね。

`start`だとURLを指定したとき既定のWebブラウザで開いてくれるので便利ですね。

#プログラミングの楽しさ

プログラミングにも、ゲームプログラミングやらなんやらいろいろあると思いますが、私がプログラミングが楽しいと最初に思ったのは__自分で面倒なことを自動化できたとき__でした。
batは一番初歩的な自動化です。あの時の感動が忘れられずこの記事を書いたといっても過言ではないですね。

#参考

https://qiita.com/sawa_tsuka/items/4703a9743777d4ea30de
https://cheshire-wara.com/powershell/ps-textbooks/basic-knowledge/powershell-started1/

#補足

#####Pathとは？

Pathとは、PC上のファイルの位置を示すものです。
例えばデスクトップ上のファイルを示す場合、Windows10(2019/1/26現在)環境では通常
`C:\Users\ユーザー名\OneDrive\デスクトップ\指定したいファイル.その拡張子`
となります。