OmniAICreator/Qiita-1.07M huggingface dataset:
Rails6 のちょい足しな新機能を試す38（Module#parent 編）

# はじめに

Rails 6 に追加されそうな新機能を試す第38段。 今回は、 `Module#parent` 編です。
Rails 6 では、 `Module#parent` , `Module#parents` , `Module#parent_name` を使うと `DEPRECATION WARNING` になります。
代わりに、 `Module#module_parent` , `Module#module_parents` , `Module#module_parent_name` が追加されています。

Ruby 2.6.3, Rails 6.0.0.rc1 で確認しました。Rails 6.0.0.rc1 は `gem install rails --prerelease` でインストールできます。

```shell
$ rails --version
Rails 6.0.0.rc1
```

# スクリプトを書く

今回は、簡単なスクリプトを書いて確認してみます。

```ruby:bin/parent_deprecated
#!/usr/bin/env ruby

require 'active_support/core_ext'

module Foo
  class Bar
  end
end

puts '-- DEPRECATION WARNING --'
p Foo::Bar.parent
p Foo::Bar.parents
p Foo::Bar.parent_name

puts '-- OK --'
p Foo::Bar.module_parent
p Foo::Bar.module_parents
p Foo::Bar.module_parent_name
```

# 実行してみます


実行してみると、 `module_` のプレフィックスがついていないメソッドは、 `DEPRECATION WARNING` が表示されていることがわかります。

```shell
$ bin/parent_deprecated
-- DEPRECATION WARNING --
DEPRECATION WARNING: `Module#parent` has been renamed to `module_parent`. `parent` is deprecated and will be removed in Rails 6.1. (called from <main> at bin/parent_deprecated:11)
Foo
DEPRECATION WARNING: `Module#parents` has been renamed to `module_parents`. `parents` is deprecated and will be removed in Rails 6.1. (called from <main> at bin/parent_deprecated:12)
[Foo, Object]
DEPRECATION WARNING: `Module#parent_name` has been renamed to `module_parent_name`. `parent_name` is deprecated and will be removed in Rails 6.1. (called from <main> at bin/parent_deprecated:13)
"Foo"
-- OK --
Foo
[Foo, Object]
"Foo"
```

# ちょい足しされた理由

Model の scope の名前に `parents` を使うと無限ループになったことから、 `parents` などの名前は一般的すぎるということで、 `module_` というプレフィックスをつけることが提案されたようです。


# 試したソース

試したソースは以下にあります。
https://github.com/suketa/rails6_0_0rc1/tree/try038_parent_deprecated

# 参考情報

* [What is new in Rails 6.0](https://bogdanvlviv.com/posts/ruby/rails/what-is-new-in-rails-6_0.html)
* [Prefix Module#parent, Module#parents, and Module#parent_name with module](https://github.com/rails/rails/pull/34051)
* [Add `parents` to BLACKLISTED_CLASS_METHODS to prevent SystemStackError](https://github.com/rails/rails/pull/20901)
Chromeのブックマークレットで全角の空白を表示させる

Chromeのブックマークレットで遊んでいて全角の空白が半角になることがわかった。

この問題について以下の通り調べた。

# バグの再現手順

1. ブックマークバーを表示させる

2. ブックマークバーの右クリックからページを追加

3. 以下をURLに貼る
`javascript:(()=>{var a="　";})()`
変数`a`の値が全角の空白になっている。

4. 全角の空白が半角に変わる

Firefoxでは再現しない。

# どのようにしたらChromeのブックマークレットで全角の空白を表示させられるか

- ブックマークマネージャからブックマークレットを作る
URLに貼ると`javascript:(()=>{var a="%E3%80%80";})()`に変わる。

- `zenkaku_kuhaku=String.fromCharCode(12288)`を使う

- `zenkaku_kuhaku=decodeURIComponent('%E3%80%80')`を使う

Chromeのバージョンは75.0.3770.100。

### 半角スペースを2つ出すときも同じ問題が発生

ブックマークバーの右クリックからページを追加でブックマークレットを追加したら、半角スペース2つが1つに変換させられた。

半角スペース2つを出すために、` " " + " " `や`` `${" "}${" "}` ``と記述する必要があった。
Jestがtimeoutして処理が終了してしまう問題

# 結論

- 設定ファイルでtimeoutの時間を伸ばす
- エラーログで丁寧に指示が出るのでそれ通りに

## 方法

```js
// jest.config.js
module.exports = {
  setupFilesAfterEnv: [
    `${process.cwd()}/jest.setup.js`
  ]
}
```

```js
// jest.setup.js
jest.setTimeout(30000);
```

## 参考

[Async callback was not invoked within the 5000ms timeout specified by jest.setTimeout](https://stackoverflow.com/questions/49603939/async-callback-was-not-invoked-within-the-5000ms-timeout-specified-by-jest-setti/52543554)

[公式ドキュメント](https://jestjs.io/docs/en/configuration)
[Rails]gem "OmniAuth" の脆弱性対策

gem "OmniAuth" で脆弱性が指摘されていたとのこと。
[https://github.com/omniauth/omniauth/pull/809](https://github.com/omniauth/omniauth/pull/809)

それに対応するgemが発表されているとのこと。
[https://github.com/cookpad/omniauth-rails_csrf_protection](https://github.com/cookpad/omniauth-rails_csrf_protection)

対応gemの使い方は以下。

```ruby:Gemfile
gem "omniauth-rails_csrf_protection"
```
上記追記してbundle install。

```ruby:ビューファイル
= link_to "/auth/google_oauth2", method: :post
```
SNS認証へのlink_toに、`method: :post`を追記する。
ルーティングは変更する必要ない。元がgetならgetのままでOK。
これで問題なく認証できればOK。
【Ruby】メモアプリを開発

**Rubyのみで動作するアプリ。**
**機能としては、好きなサッカー選手やチームを追加したり、一覧表示できる。**

#完成コード

```memo.rb
def make_memo
    print "好きな選手→"
    player = gets.chomp
    print "好きなチーム→"
    team = gets.chomp
    memo = {"選手" => player, "チーム" => team}
end

def show_memos(memos)
    puts "入力された内容"
    memos.each do |memo|
        puts "あなたは、" + memo["選手"] + ":" + memo["チーム"] + "が、好きなんだね！"
    end
    puts ""
end    

memos = []

while true
    puts "好きなサッカー選手やチームを教えてね！フットサル選手やチームでもOK!"
    puts "新規追加は【add】と入力"
    puts "一覧表示は【show】と入力"
    print "どちらか選んでね→"
    mode = gets.chomp

    if mode == "add"
        memos.push(make_memo)
    elsif mode ==  "show"
        show_memos(memos)
    else
        puts "エラーだよ"    
    end
end 
```

####表示される部分
```memo.rb
while true
    puts "好きなサッカー選手やチームを教えてね！フットサル選手やチームでもOK!"
    puts "新規追加は【add】と入力"
    puts "一覧表示は【show】と入力"
    print "どちらか選んでね→"
    mode = gets.chomp

    if mode == "add"
        memos.push(make_memo)
    elsif mode ==  "show"
        show_memos(memos)
    else
        puts "エラーだよ"    
    end
end 
```
- if文で、選手やチームを「追加」時のコードと「一覧表示」時のコードをまとめて書く。
- gets.chomp(getsでターミナルに入力できるようになる、chompで改行しないようにする)
- ==で、addまたはshowどちらのmodeを選んだか判断する。
- while true文でループ文にする。

###選手やチームを追加する部分
```memo.rb
def make_memo
    print "好きな選手→"
    player = gets.chomp
    print "好きなチーム→"
    team = gets.chomp
    memo = {"選手" => player, "チーム" => team}
end
```
- def endで項目をまとめる(make_memoメソッド)
- gets.chomp(getsでターミナルに入力できるようになる、chompで改行しないようにする)
- 入力された選手とチームをハッシュでまとめる。

###選手やチームを表示する部分
```memo.rb
def show_memos(memos)
    puts "入力された内容"
    memos.each do |memo|
        puts "あなたは、" + memo["選手"] + ":" + memo["チーム"] + "が、好きなんだね！"
    end
    puts ""
end

memos = [] 
```
- def endで項目をまとめる(show_memos(memos))
- (memos)は、引数。memos = [] 内に追加された選手やチームを情報をshow_memosへ渡す。
- each文で、追加された選手やチームを順に表示できるようにする。
- Rubyは+でつなげる。
- puts ""で1行空ける。
node.js で定時に処理を実行する

この１年、トーク bot のコードばかり書いていた私。
なので、`http request` がトリガーのプログラムばかり作っておりました。

しかし！この度めでたく、定時アナウンスする bot を作ることになりました！ヾ(*´∀｀*)ﾉ ﾜｰｲ
総務の方が取りまとめている、宅配弁当の受付をもう bot で自動化しちゃおうよ！ってな流れです。
完成したらこちらも記事にしようと思っておりますが、まずは定時処理について。

`node.js` で定時処理をするには、[Node Cron](https://www.npmjs.com/package/node-cron) を使います。

## Node Cron を使う準備
まずは Node Cron をインストールします。

```
> npm install node-cron
```
プログラム内で `cron` を `require` します。

```app.js
const cron = require('node-cron');
```

これで準備完了です！かんたーん('ω')

## 使い方は本当に簡単！
強いて言えば、時間の設定が逆なことだけ注意ですね。
`'秒 分 時 日 月 曜日'` の６段階になります。

例えば、毎日9時に実行する場合は…

```app.js
cron.schedule('0 0 9 * * *', () => {
    console.log("おはよう！朝ご飯、ちゃんと食べた？( ﾟДﾟ)");
});
```
10時と17時に実行する場合は…

```app.js
cron.schedule('0 0 10,17 * * *', () => {
    console.log("お茶の時間だよ！適度に休憩しよう( ^^) _旦~~");
});
```
15時と20時でそれぞれ別の処理を実行する場合は…

```app.js
cron.schedule('0 0 15 * * *', () => {
    console.log("おやつの時間だよ！カレー屋さんへ今すぐダッシュ！(*'▽')");
});
cron.schedule('0 0 20 * * *', () => {
    console.log("おやつの時間だよ！屋台のラーメン食べに行こうよ！(*'▽')");
});
```
## 定時処理をテストするときに楽な方法
その時間まで待つのはいくらなんでも馬鹿らしいし、前の時間の処理と連動するようなプログラムの場合には単体で動かすわけにもいかないですよね。

そこで！テストする場合には変数を使って現在時刻の１分後を入れるようにしました！(^^)/

```app.js
const now = new Date();
let hour = now.getHours();
let min = now.getMinutes() + 1;
if(min == 59){
    min = 0;
    hour++;
}
let eat = false;
//cron.schedule('0 0 7 * * *', () => {
cron.schedule('00 ' + min + ' ' + hour + ' * * *', () => {
    console.log("もう我慢できない！ばくばくばくばく…( ･`д･´)");
    eat = true;
});
//cron.schedule('0 30 7 * * *', () => {
cron.schedule('00 ' + min + ' ' + hour + ' * * *', () => {
    if(eat) console.log("ケ■ッグコーンフ■スティ！ぐぅーれいとぉ！( ﾟДﾟ)");
});
```

別に１秒後とかでも良かったのですが、ちょっとくらいのんびりする時間も大事じゃないですか。
始まるまで、肩のストレッチでもしましょう。健康第一♪

なお、本来の動きはコメントアウトしときます。
書き直すの、面倒ですからね！(｀・ω・´)キリッ

## 他にも使い方は色々！

`cron.schedule` の設定はこちらの記事で、とてもわかりやすくまとめてくれています。
[Node.jsで定期実行メモ](https://qiita.com/n0bisuke/items/66abf6ca1c12f495aa04)

私の解説などよりとても見やすいですね。
ほんと、先輩方には頭が下がります。感謝。

#おわりに
ここまでお付き合いいただきありがとうございました。
cron さんと少し仲良くなれて嬉しいです。
もっと仲良くなりたいですね。

でも、時間で動いてくれると『プログラム』って感じで凄くいいですね！
・・・そんなことないですかね？私だけですかね。

ではまた！(^^)/

#参考にさせていただきましたm(_ _)m
[LINEWORKS Developers](https://developers.worksmobile.com/jp/document?lang=ja)
[Node Cron](https://www.npmjs.com/package/node-cron)
[Node.jsで定期実行メモ](https://qiita.com/n0bisuke/items/66abf6ca1c12f495aa04)
Compodocで@Injectに苦しんだ件

## 教訓
マイナーなOSSで躓いたらIssueを読みましょう
参考にしたIssue: https://github.com/compodoc/compodoc/issues/745

## 経緯
Angularで書いたソースのドキュメントを残すため[Compodoc](https://compodoc.app/)を使っていて、なぜかStatementが100%にならないコンポーネントがある。


今回はダイアログで詰まったのでそれをベースに。

```typescript
  /**
   * Creates an instance of DialogComponent.
   * @param {any} dialogData
   * @memberof DialogComponent
   */
  constructor(@Inject(MAT_DIALOG_DATA) public dialogData: any) {}

```

どうやらコンストラクタで `@Inject(MAT_DIALOG_DATA) public ~`と書いている部分で引っかかっているよう。

## 解決策
https://github.com/compodoc/compodoc/issues/745#issuecomment-467857947
これで100%になるよ！（意訳）とのことなので試してみたらマジでした。

どうやらコンストラクタ内の変数にDecoratorsが含まれる場合、対象の変数にDescriptionを書いてあげる必要があるらしい。

こんな感じで書く。分かりづらいけど、`@param`の行の最後に書いてる`Description of dialogData`というのがそれ。
ようは変数の説明文をきちんと書かないといけない、らしい。

```typescript
  /**
   * Creates an instance of DialogComponent.
   * @param {any} dialogData Description of dialogData
   * @memberof DialogComponent
   */
  constructor(@Inject(MAT_DIALOG_DATA) public dialogData: any) {}

```

これでCompodocさんに満足していただけた。

## 感想

Compodoc、ユーザーが少ないからかドキュメントが全く出てこない。
みんな使ってほしい。そして記事を書いてほしい。
個人に向き合い自己改善を促す仕組みづくり

## 人材育成って難しい
ひとを育てるって難しいですよね。
ひとは三者三様で、画一的な型にはめても上手くいくはずがない。
だからこそ、どれだけそのひとに向き合って、一緒に悩んで、考えて、課題を見つけていけるか。なんじゃないかと思いました。

また、従来のPDCAでは、プランに落とすまでに時間がかかったりチェックするタイミングが月イチだったりで、ひとを成長させるにはスピード感があまりにも遅い。って思ってました。

そこで、OODAを使ってできないか？と思い至ります。
（実際は、OODA良いかなと思いつつ、上司になんかいい方法ないか？って聞いたら「早くやりたいならOODAが良いと思う」って言われたので、もうコレだ！と決意）


> 早くやりたいならoodaが良いと思う
孫さんのは知らんけど。
> 
https://business-1.net/pdca-vs-ooda/
https://kigyotv.jp/news/d-ooda/
https://my-manekineko.hatenablog.com/entry/2018/03/30/083000

ありがたや

## OODAで自己改善を促す
OODAは取り敢えずの方向性を決めて行動しそれを観察するスタイル。
自己改善に使うには最も適してるんじゃないか？と思い、ぼくの場合はディレクターという職種のメンバーに対して、より円滑に仕事をするための改善にフォーカスして取り組んでみることにしました。
![KPT.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4736/6a219556-d599-caf5-a0b5-8299a2a35d64.jpeg)
（↑最初は「方向性」は空欄からはじめました）

そのためにも、まずは個人の課題を一緒に考えることからはじめました。

## 1on1で悩みに向き合う
そのひとの悩みは1つではないし、状況によって常に変化し続けます。
であれば、頻度は高いに越したことはない。じゃあ、1on1以外にありえないな。ということで、取り敢えず1on1を隔週30分で開催することにしました。

そこで悩みと改善作を顕在化するために「KPT」を使うことにしました。
2週間を振り返る。という意味でも「KPT」は適しているかなと。
![KPT2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4736/c15a1633-fd62-91cc-92d0-312663b034b1.png)

すると！！どうでしょう！ｗ
見える！見える！
業務での悩み、でも、どうしたら良いかわからないっ、という不安の数々が。

ここからは、ディレクターという職種に対してこの課題にどう取り組もうか？と考え始めます。

## ディレクターという職種にとって必要な課題とは
ディレクターという職種は、あらゆるステークホルダーと課題を整理し共有しあい同じ目標に向かってプロジェクトを進めていくことが必要で、そのためにはやはり「コミュニケーション能力」が問われます。

そこで、そのひと自身を数値化して捉えるために「EQ」の自己採点をしてもらいました。そしてそれをKPIの1つにしてみようと思ったんです。
![EQ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4736/2204623e-1755-24b9-7d95-c6b38a85b88f.png)

実は2年前に実験的に採点してたので変化まで捉えることができました。
上がっている人もいるし、下がっている人もいる。
でも、下がった部分が、聞いてきた悩みに直結したんです。
このひとの場合、「感情の調整」が低く出ていて、確かに悩みとしても、周囲の声や目線などへの不安を抱えいて、それがひどく感情に出てしまう状況でした。

こうやって、悩みを数値からも捉えられたため、
そのひとにとっての課題と目標を定めることができました。

## 課題と目標も明文化して、OODAの方向性に定める
![mission.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4736/3a43f669-77ef-ced2-58a4-8606c6537cc9.png)
ここまで、そのひととしっかり向き合って密に話し合っているため、お互いが納得できる目標が定められました。

だからこそ、そのひとは自分自身でどうしたら良いかを考えられるし、その悩みに前向きに取り組んでいく積極性も出てくるようになります。

やはり、ただトップダウンで命令・指示しているだけでは、ひとって自分で成長していくことなんかできなよな。と改めて実感しました。


## さらにチームの心理的安全性のために！
そして、これを個人だけで終わらせるのはもったいない。
そう思ったので、まずはディレクターのチーム内で、お互いの取り組みを公開することにしました。

狙いは、持っている悩みや心理的な特性を知り合うことで、お互いが寛容になれたり、認め合えたり、一緒に前に向かおうというマインドが生まれることでした。

結果は思ったとおり良好。
お互いを知ることで助け合えたり、許せたり、発言しやすくなったり、これが世に云う「心理的安全性」か！！と。

やっぱり、情報ってオープンになることが大事なんだな。というのも再発見でした。

---
ここまでが、現時点でやってきた仕組みづくりです。

実際は、ひとと向き合うには時間もかけないといけないし、サボれないし、大変なことは多いですが、だからこそ得られるものも大きいんじゃないかと思います。

どんな職種、組織、個人にでも適応できる仕組みのような気がしてるんで、みなさんのご参考になれば幸いです。
特定のポートを使用しているサービスをコマンド1発でkillする

Railsのチュートリアルで`ps aux | grep rails`してから`kill`みたいなことをしていた。
たぶん意味を理解しているならこっちのコマンド(関数)を登録しておいた方が便利。

以下を`~/.bashrc`とかに書いて`source ~/.bashrc`(読み込み)

```bash
killport () {
  kill `lsof -ti tcp:$1`
}
```

ちなみにfishなら

```bash
function killport
  kill (lsof -ti tcp:$argv[1])
end
```

例えば8000ポートを使用しているサービスを`kill`したい場合は以下のようにする。

```bash
killport 8000
```

※シェルスクリプト初心者なのでもっと綺麗にかけたりできたら教えてください

# デモ

1. `python -m http.server`で8000ポートで簡易ウェブサーバを立ち上げる
2. `killport 8000`で`kill`

![output.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/91558/a98a8fae-ead9-e878-a1af-a38bc1ac8d36.gif)


べんりべんり
【Rust】MacにRustをインストールして動作確認をするまで

# 概要
RustをMacにインストールしてHello Worldまでやる

### 最終的にインストールされる重要な物
- rustc
Rustのコンパイラ

- cargo
Rustのパッケージマネージャ

- rustup
Rustのインストーラ

# インストール
```
$ curl https://sh.rustup.rs -sSf | sh
```
# チェック
```
$ rustc --version
$ rustup --version
$ cargo --version
//それぞれバージョンが表示されたらOK
```

# bash以外は自分でPATHを通す
```
$ echo 'export PATH=$HOME/.cargo/bin:$PATH' >> 任意の設定ファイル(例:~/.zprofile)
$ source 設定ファイル(例：~/.zprofile)
```

# Hello World
```rust:hello.rs
fn main() {
    println!("Hello World!");
}
```

# コンパイル
```
$ rustc hello.rs
```

# 実行
```
$ ./hello
Hello World!
```

# アンインストール方法
```
$ rustup self uninstall
```

# Happy Hacking :sunglasses: !

# 参考
https://doc.rust-jp.rs/the-rust-programming-language-ja/1.6/book/getting-started.html
바카라카지노•• 784YES.COM ••바카라카지노사이트

<a href="http://laviolle.com/?s=%EB%B0%94%EC%B9%B4%EB%9D%BC%EC%B9%B4%EC%A7%80%EB%85%B8%E2%9E%A0+784YES.COM+%E2%9E%A0%EB%B0%94%EC%B9%B4%EB%9D%BC%EC%B9%B4%EC%A7%80%EB%85%B8%EC%82%AC%EC%9D%B4%ED%8A%B8+%EB%B0%94%EC%B9%B4%EB%9D%BC%EC%B9%B4%EC%A7%80%EB%85%B8%EC%A3%BC%EC%86%8C+%EB%B0%94%EC%B9%B4%EB%9D%BC%EC%B9%B4%EC%A7%80%EB%85%B8+%EB%B0%94%EC%B9%B4%EB%9D%BC%EC%B9%B4%EC%A7%80%EB%85%B8%EC%B6%94%EC%B2%9C+%EB%B0%94%EC%B9%B4%EB%9D%BC%EC%B9%B4%EC%A7%80%EB%85%B8%EC%82%AC%EC%9D%B4%ED%8A%B8+%EB%B0%94%EC%B9%B4%EB%9D%BC%EC%B9%B4%EC%A7%80%EB%85%B8%EC%B6%94%EC%B2%9C+%EC%B9%B4%EC%A7%80%EB%85%B8+%EC%82%AC%EC%9D%B4%ED%8A%B8+%EB%B0%94%EC%B9%B4%EB%9D%BC%EC%B9%B4%EC%A7%80%EB%85%B8%EC%9D%B8%ED%84%B0%EB%84%B7" target="_blank">바카라카지노</a>
<br><br>
<a href="http://laviolle.com/?s=%EB%B0%94%EC%B9%B4%EB%9D%BC%EC%B9%B4%EC%A7%80%EB%85%B8%E2%9E%A0+784YES.COM+%E2%9E%A0%EB%B0%94%EC%B9%B4%EB%9D%BC%EC%B9%B4%EC%A7%80%EB%85%B8%EC%82%AC%EC%9D%B4%ED%8A%B8+%EB%B0%94%EC%B9%B4%EB%9D%BC%EC%B9%B4%EC%A7%80%EB%85%B8%EC%A3%BC%EC%86%8C+%EB%B0%94%EC%B9%B4%EB%9D%BC%EC%B9%B4%EC%A7%80%EB%85%B8+%EB%B0%94%EC%B9%B4%EB%9D%BC%EC%B9%B4%EC%A7%80%EB%85%B8%EC%B6%94%EC%B2%9C+%EB%B0%94%EC%B9%B4%EB%9D%BC%EC%B9%B4%EC%A7%80%EB%85%B8%EC%82%AC%EC%9D%B4%ED%8A%B8+%EB%B0%94%EC%B9%B4%EB%9D%BC%EC%B9%B4%EC%A7%80%EB%85%B8%EC%B6%94%EC%B2%9C+%EC%B9%B4%EC%A7%80%EB%85%B8+%EC%82%AC%EC%9D%B4%ED%8A%B8+%EB%B0%94%EC%B9%B4%EB%9D%BC%EC%B9%B4%EC%A7%80%EB%85%B8%EC%9D%B8%ED%84%B0%EB%84%B7" target="_blank">바카라카지노</a>
<br><br>
<a href="http://laviolle.com/?s=%EB%B0%94%EC%B9%B4%EB%9D%BC%EC%B9%B4%EC%A7%80%EB%85%B8%E2%9E%A0+784YES.COM+%E2%9E%A0%EB%B0%94%EC%B9%B4%EB%9D%BC%EC%B9%B4%EC%A7%80%EB%85%B8%EC%82%AC%EC%9D%B4%ED%8A%B8+%EB%B0%94%EC%B9%B4%EB%9D%BC%EC%B9%B4%EC%A7%80%EB%85%B8%EC%A3%BC%EC%86%8C+%EB%B0%94%EC%B9%B4%EB%9D%BC%EC%B9%B4%EC%A7%80%EB%85%B8+%EB%B0%94%EC%B9%B4%EB%9D%BC%EC%B9%B4%EC%A7%80%EB%85%B8%EC%B6%94%EC%B2%9C+%EB%B0%94%EC%B9%B4%EB%9D%BC%EC%B9%B4%EC%A7%80%EB%85%B8%EC%82%AC%EC%9D%B4%ED%8A%B8+%EB%B0%94%EC%B9%B4%EB%9D%BC%EC%B9%B4%EC%A7%80%EB%85%B8%EC%B6%94%EC%B2%9C+%EC%B9%B4%EC%A7%80%EB%85%B8+%EC%82%AC%EC%9D%B4%ED%8A%B8+%EB%B0%94%EC%B9%B4%EB%9D%BC%EC%B9%B4%EC%A7%80%EB%85%B8%EC%9D%B8%ED%84%B0%EB%84%B7" target="_blank">바카라카지노</a>
<br><br>
<a href="http://laviolle.com/?s=%EB%B0%94%EC%B9%B4%EB%9D%BC%EC%B9%B4%EC%A7%80%EB%85%B8%E2%9E%A0+784YES.COM+%E2%9E%A0%EB%B0%94%EC%B9%B4%EB%9D%BC%EC%B9%B4%EC%A7%80%EB%85%B8%EC%82%AC%EC%9D%B4%ED%8A%B8+%EB%B0%94%EC%B9%B4%EB%9D%BC%EC%B9%B4%EC%A7%80%EB%85%B8%EC%A3%BC%EC%86%8C+%EB%B0%94%EC%B9%B4%EB%9D%BC%EC%B9%B4%EC%A7%80%EB%85%B8+%EB%B0%94%EC%B9%B4%EB%9D%BC%EC%B9%B4%EC%A7%80%EB%85%B8%EC%B6%94%EC%B2%9C+%EB%B0%94%EC%B9%B4%EB%9D%BC%EC%B9%B4%EC%A7%80%EB%85%B8%EC%82%AC%EC%9D%B4%ED%8A%B8+%EB%B0%94%EC%B9%B4%EB%9D%BC%EC%B9%B4%EC%A7%80%EB%85%B8%EC%B6%94%EC%B2%9C+%EC%B9%B4%EC%A7%80%EB%85%B8+%EC%82%AC%EC%9D%B4%ED%8A%B8+%EB%B0%94%EC%B9%B4%EB%9D%BC%EC%B9%B4%EC%A7%80%EB%85%B8%EC%9D%B8%ED%84%B0%EB%84%B7" target="_blank">바카라카지노</a>
<br><br>
多値ロジスティック

```{r}

#多値ロジスティック

library(dummies)

data(iris)

data=data.frame(iris)

#学習率
mu=0.0001

#特徴量行列
X=as.matrix(data[,!(colnames(data) %in% c("Species"))])

#アヤメの種類
Species=unique(data$Species)

#目的変量の行列
Y=dummy(data$Species)

#重み係数
W=array(1,dim=c(ncol(X),length(Species)))

#閾値
b=array(1,dim=c(1,length(Species)))

#反復計算回数
ite=1000000

for(j in 1:ite){

Z=t(t(X%*%W)+c(b))

#予測確率（ソフトマックス）を入れる箱を用意
pthi_vec=array(0,dim=c(nrow(Z),length(Species)))

#予測確率の導入
for(i in 1:nrow(Z)){

pthi_vec[i,]=exp(Z[i,])/sum(exp(Z[i,]))  

}

#重み行列の更新量を計算
dW=t(X)%*%(Y-pthi_vec)

#閾値の更新量の計算
db=array(1,dim=c(1,nrow(X)))%*%(Y-pthi_vec)

#重みの更新
W=W+mu*dW

#閾値の更新
b=b+mu*db

#交差エントロピーの計算
cross_entropy=-sum(Y*log(ifelse(pthi_vec>0,pthi_vec,1)))

print(cross_entropy) 

}
```

```{r}

#pre broyden

library(dummies)

data(iris)

data=data.frame(iris)

#学習率
mu=10^(-5)

#特徴量行列
X=as.matrix(data[,!(colnames(data) %in% c("Species"))])

#アヤメの種類
Species=unique(data$Species)

#目的変量の行列
Y=dummy(data$Species)

x_vec=rep(1,ncol(X)*length(Species)+length(Species))

f=function(x){

w_vec=x[1:(ncol(X)*length(Species))]

W=matrix(w_vec,ncol=length(Species))

b=x[(ncol(X)*length(Species)+1):length(x)]

Z=t(t(X%*%W)+c(b))

#予測確率（ソフトマックス）を入れる箱を用意
pthi_vec=array(0,dim=c(nrow(Z),length(Species)))

#予測確率の導入
for(i in 1:nrow(Z)){

pthi_vec[i,]=exp(Z[i,])/sum(exp(Z[i,]))  

}

#重み行列の更新量を計算
dW=t(X)%*%(Y-pthi_vec)

#切片の更新量の計算
db=array(1,dim=c(1,nrow(X)))%*%(Y-pthi_vec)

return(c(c(dW),db))

}

#反復計算回数
ite=10^(6)

#ヤコビアンの初期値
H=diag(f(x_vec))

for(l in 1:ite){

#以前の座標点を保存
X_pre=x_vec  

#座標点を更新
x_vec=x_vec-mu*H%*%f(x_vec)  

#以前の座標点と更新された座標点の差のベクトル(s)
s=x_vec-X_pre

#以前の座標点と更新された座標点の関数値の差のベクトル(y)
y=f(x_vec)-f(X_pre)

#ヤコビアンの近似行列を更新する
H=H+((s-H%*%y)/as.numeric(t(s)%*%H%*%y))%*%t(s)%*%H

print(sum(abs(f(x_vec))))

}


```
Concordia加拿大结业证购买康卡迪亚大学毕业证成绩单Q/微993398773仿真毕业证Concordia教育部认证留信认证Concordia修改GPA成绩Concordia加拿大本科学历Concordia硕士学位『诚招代理』国外文凭制作Concordia University

Concordia加拿大结业证购买康卡迪亚大学毕业证成绩单Q/微993398773仿真毕业证Concordia教育部认证留信认证Concordia修改GPA成绩Concordia加拿大本科学历Concordia硕士学位『诚招代理』国外文凭制作Concordia University
#加拿大毕业证#美国毕业证#学生卡#英国毕业证#澳洲毕业证#新西兰毕业证#法国毕业证#德国毕业证#修改成绩单#存档可查学历学位认证#大使馆认证#回国人员证明，QQ/微信:993398773远洋教育Adam
为留学生留学认证提供以下服务： 
【毕业证、成绩单等全套材料，从防伪到印刷，从水印到钢印烫金，跟学校100%相同】 
【真实使馆认证（留学人员回国证明），使馆存档可通过大使馆查询确认】 
【真实教育部学历认证，教育部存档，教育部留服网站100%可查】
联系人：Adam QQ/微信:993398773 
◆为什么您的学位需要在国内进一步认证？！ 
如果您计划在国内发展，那么办理国内教育部认证是必不可少的。一般企事业用人单位在您应聘时都会需要您提供这个认证。办理教育部认证所需资料众多且烦琐，所有材料您都必须提供原件，我们凭借丰富的经验，帮您快速整合材料，让您少走弯路。 

专业服务，请勿犹豫联系我 
如果您真实毕业回国，对于学历认证无从下手，请联系我，我们免费帮您递交 
诚招代理：本公司诚聘当地代理人员，如果你有业余时间，或者你有同学朋友需要办理，或者你想帮助他们，有兴趣就请联系我 
你赢我赢，共创双赢 
你做代理，可以帮助同学朋友 
你做代理，可以拯救失足青年 
你做代理，可以挽救一个个人才 
你做代理，你将是别人人生的转折点 
你做代理，可以改变自己，改变他人，给他人和自己一个机会

请联系我-远洋教育-金牌顾问 Adam
【此贴为实体公司营业注册所特有，勿被抄袭的无良商家坑骗！】

办理假毕业证在国内能用吗Q\微信993398773挂科拿不到毕业证怎么办Q\微信993398773毕业证丢了怎么办Q\微信993398773没有正常毕业怎么办理毕业证Q\微信993398773没毕业可以办学历认证吗Q\微信993398773您是否因为中途辍学、挂科而没有正常毕业Q\微信993398773您是否因为递交材料不齐而被拒之门外Q\微信993398773您是否因没正常毕业而导致回国得不到教育部认证Q\微信993398773在校挂科了不想读了、成绩不理想怎么办Q\微信993398773找工作没有文凭怎么办Q\微信993398773办理本科/研究生文凭Q\微信993398773有本科却要求硕士又怎么办Q\微信993398773办理本科/硕士毕业证Q\微信993398773网上买文凭可靠吗Q\微信993398773买国外文凭质量Q\微信993398773国外本科毕业证怎么办理Q\微信993398773国外大学文凭高仿真制作Q\微信993398773办国外文凭可找工作Q\微信993398773怎么办理国外假毕业证Q\微信993398773哪里可以制作毕业证Q\微信993398773美国哪里可以办理毕业证Q\微信993398773澳洲哪里可以办理毕业证Q\微信993398773留学生在哪里买毕业证Q\微信993398773加拿大哪里可以办理毕业证Q\微信993398773诚信办理毕业证Q\微信993398773申请学校办理成绩单Q\微信993398773办理水印成绩单Q\微信993398773办理悉尼大学成绩单Q\微信993398773多伦多办理成绩单Q\微信993398773修改成绩单GPAQ\微信993398773修改成绩单分数Q\微信993398773办理多大成绩单Q\微信993398773如何拿到国外毕业证Q\微信993398773快速拿到国外文凭Q\微信993398773快速办理国外毕业证Q\微信993398773假毕业证能查出来吗Q\微信993398773假文凭网上能查到吗
交差テーブルには関連の意味を表す名前をつけよう

## 問題

多対多の関連を作るときの交差テーブル（中間テーブル、関連テーブルなどとも呼ばれる）にどのような名前をつけていますか？

2つのテーブル名を単純につなげた `users_magazines` のような命名を見かけますが、これはあまり良い名前ではありません。

[実体関連モデル - Wikipedia](https://ja.wikipedia.org/wiki/%E5%AE%9F%E4%BD%93%E9%96%A2%E9%80%A3%E3%83%A2%E3%83%87%E3%83%AB)
> 実体 (entity) は名詞に対応すると考えることができる。例えば、コンピュータ、従業員、楽曲、数学的定理といった名詞である。
> 
> 関連 (relationship) は2つの実体間の関係を捉えたものである。関連は2つ以上の名詞句を結び付ける動詞に対応すると考えることができる。例えば、企業とコンピュータの間の「所有する」(owns) という関連、従業員と部門の間の「監督する」(supervises) という関連、アーティストと楽曲の間の「演奏する」(performs) という関連、数学者と定理の間の「証明した」(proved) という関連などである。

交差テーブルは関連（relationship）から生まれているものなので、関連の意味を表す命名をしましょう。


## 考え方

AとBというテーブルの交差テーブルの場合
 
A [動詞] B （AがBを○○する、した、している）
人 [動詞] A B （AにBを○○する、した、している）
 
となる動詞を考える。その動詞を「○○すること」と名詞の形に変えたものが必要な名前。これをCとする。
 
動詞の名詞形は、辞書を引くこと。場合によっては動詞語尾を変えた形よりも適切な単語がある場合もある。動詞と同形の場合もある。
見つからない場合は、動名詞(-ing)を使う。
 
Cが決まったら、ABCと連結した名前を作り、冗長なものや明らかなものを削る。
 
### 例：userとmagazineの場合
userがmagazineを購読する
購読する＝subscribe
subscribeの名詞形はsubscription
連結してuser_magazine_subscription
このDBの中でsubscriptionがuserとmagazineの関係であることが明らかなら、userとmagazineを省略しsubscriptionとする。

単数形にするか複数形にするかは別途規約で定めましょう。

ちなみに複数形を採用する場合、Cは抽象的な名詞や動名詞なので不可算名詞になることがありますが、気にせず複数形にするのがよいと思います。なぜなら「レコード」や「行」は数えられるものだからです。（“Two coffees”と言えるのと同じ理由）


## 名前の例
- subscription (user <=> magazine)
- belonging, membership (user <=> group)
- friendship, relationship (user <=> user)
- tagging (thing <=> tag)
- categorization (thing <=> category)
- enrollment (user <=> course)
- affiliation
- ownership
- assignment (user <=> task)
- offer (school <=> course)
- employment (employee <=> company)
- participation
- like, favorite


### 自己結合の場合のそれぞれの呼び方

- source, target
- origin, destination
- follower, followee
- object, subject

もっと例を集めて共有すれば、それだけでかなりの部分で適切な命名ができるようになるはず！
「OSI参照モデル」と「RFC1122」(「OSI参照モデル」に戸惑わないために)


ネットワークの入門者が必ずと言っていいほど戸惑う「OSI(基本)参照モデル」。
「RFC1122」とあわせて知ると、少し視界が晴れるかも。

「OSI参照モデル」と「RFC1122」について、説明します。


#「OSI参照モデル」は利用されていないモデル?

「OSI参照モデル」は「システムの相互接続を目的とする既存の規格及び今後制定する規格の相互調整に用いる枠組み」としてISO(国際標準化機構)によって策定されました。

>ISO/IEC 7498-1:1994 Information technology — Open Systems Interconnection — Basic Reference Model: The Basic Model — Part 1

>JISX5003:1987　開放型システム間相互接続の基本参照モデル
>1 適用範囲


しかし、この「OSI参照モデル」は、その目的を達成することができませんでした。
現在のコンピュータ間の通信は「OSI参照モデル」とは**【別の枠組み】**で実現されることになってしまったからです。
「OSI参照モデル」に準拠した規格は広く普及しませんでした。

目的を達成できなかったという意味で、「OSI参照モデル」は標準化に失敗した枠組みとも言えるかもしれません。


#インターネットプロトコル群
現在のコンピュータ間の通信は、TCP/IPを代表とする「インターネット・プロトコル群」で実現されています。
この「インターネット・プロトコル群」は「OSI参照モデル」では**【ない】**、別の枠組みを前提としています。その別の枠組みとは「RFC1122」に定義される以下のような4階層モデルです。


 - アプリケーション層
 - トランスポート層
 - ネットワーク層
 - リンク層

>RFC1122
>https://tools.ietf.org/html/rfc1122


#インターネット・プロトコル群と「OSI参照モデル」の対応
一般的な「OSI参照モデル」の説明を読むと、必ずといっていいほど「OSI参照モデル」(の各階層)とインターネット・プロトコル群の対応が出てきます。

>https://www.cisco.com/c/m/ja_jp/primer/osi-reference-model.html

このような説明を読むと、インターネット・プロトコル群が、まるで「OSI参照モデル」を前提に策定されている、もしくは準拠している、というような錯覚をおこします。

しかし、「OSI参照モデル」とインターネット・プロトコル群の対応は、**【別々の枠組みを"あえて"対応させる】**試みです。完全に整合性が取れるものではありません。
対応を進めると、「OSI参照モデル」とインターネットプロトコル群がうまく合致しないことに気づきます。

「OSI参照モデル」とインターネット・プロトコル群を対応させる試みと、そこに存在するギャップ、これがネットワーク入門者を混乱させる一つの要因だと思います。

ネットワーク入門者には「OSI参照モデル」の前に「RFC1122」の階層モデルを説明したほうが混乱が少ないと思います。

コンピュータ間の通信が、複数のプロトコルで段階的に構成されているという考え方を示すための階層モデルは「OSI参照モデル」でなくとも「RFC1122」でも伝えることはできますし、「インターネットを実現するプロトコルは、原則的にこの4階層にしたがって策定されている」と説明されたほうが理解が容易です。入門者が後に学ぶ各種プロトコルとも整合性があうため、ギャップに悩むことが少なくなると思われます。

#どうして「OSI参照モデル」を勉強するのだろう？

「OSI参照モデル」の階層は「開放型システムの基本要素，及びその構成と機能に関する幾つかの重要な事項を定め」た結果として7つ分割されています。
通信に必要となる構成、機能からモデルを作り上げているため、7階層の役割をみるだけで、通信に必要な構成や機能が俯瞰できるようになっています。

>JISX5003:1987　開放型システム間相互接続の基本参照モデル
>4 　4.3

一方で「RFC1122」の4階層モデルは、4つの階層になった理由については特に言及がありません。「RFC1122」が関係組織の「コンセンサス」であると言及していることから、「コンセンサス」から4階層になったと推測されます。

>RFC1122　1.  INTRODUCTION

このような経緯から、この4階層の役割だけで通信に必要な構成、機能が俯瞰する難しいでしょう(もちろん「RFC1122」読み込めば把握できるとは思います)。

この「OSI参照モデル」の階層が通信の構成、機能をよりよく説明している点が通信を学ぶ上で「RFC1122」よりも優位な点です。
「OSI参照モデル」を学ぶ一つの理由でしょう。

(ただ皮肉なことに、構成・機能に対する「OSI参照モデル」の厳密さは、実装する際の複雑さとなってしまい、広く普及しなかった原因の一つになってしまいました。)


#まとめ

ネットワーク入門者は「OSI参照モデル」だけではなく、先に「RFC1122」の4階層モデルを学び、次に「OSI参照モデル」を学ぼう。
「OSI参照モデル」からは通信に必要な構成・機能を学ぼう。
PythonをSupervisorでサービス化した際のPATH（対処療法）

###.confで環境変数を設定する方法は今のところ分かっていません（スミマセン）

備忘録的なものなのであんまり参考にならないと思います。
事の発端はnvencやらdecklinkやら有効にするため、ffmpegを自分でインストールしたマシンとffmpegをコピーしただけのマシンを並走した時でした。

ビルドしたほうのマシンはSupervisorで問題なく動くのに、コピーした方はSupervisorでは動きません。PATHは通っていますのでコンソールで動かす分には問題ありません。
色々調べて追記してみたりとかしたのですがどうもうまくいかず。
Supervisorの設定が違うのか調べてみてもほぼ変わらず。

```[hoge.conf]
environment=PATH=“$PATH:$HOME/“
```
なんて書いて見たものの反映されず。

ビルド、インストール時にパスが通っているところにインストールしているとの記事を見たので/use/binを見てみたところ・・・

```
ffmpeg -> /home/username/ffmpeg/ffmpeg
```

これでした。

コピーした側のマシンにもシンボリックリンクを作成して終了。

本来はSupervisorの設定で環境変数を設定したほうがいいのかもしれませんが、
今回は手っ取り早くすでに通っているところにシンボリックリンクを作成しました。
グロースさせる系 Web Developer なら知っておきたいサイト・ページ（随時更新）

## サイト

- [Search | Google Developers](https://developers.google.com/search/?hl=ja)
- [Web | Google Developers](https://developers.google.com/web/)
- [Web Fundamentals](https://developers.google.com/web/fundamentals/)
- [Make the Web Faster](https://developers.google.com/speed/)
- [Chrome DevTools](https://developers.google.com/web/tools/chrome-devtools/)
- [Lighthouse によるウェブアプリの監査](https://developers.google.com/web/tools/lighthouse/)
- [PageSpeed Insights](https://developers.google.com/speed/docs/insights/about)
- [PageSpeed Insights のルール](https://developers.google.com/speed/docs/insights/rules?hl=ja)
- [Google ウェブマスター](https://www.google.com/intl/ja_jp/webmasters/#?modal_active=none)
- [Google ウェブマスター向け公式ブログ](https://webmaster-ja.googleblog.com/)
- [Think with Google](https://www.thinkwithgoogle.com/intl/ja-jp/)
- [Google Search Console](https://search.google.com/search-console?hl=ja)
- [Google アナリティクス](https://analytics.google.com/analytics/web/)
- [Accelerated Mobile Pages Project – AMP](https://amp.dev/ja/documentation/guides-and-tutorials/?referrer=ampproject.org)
- [web.dev](https://web.dev/)
- [schema.org](https://schema.org/)
- [Test My Site](https://www.thinkwithgoogle.com/intl/ja-jp/feature/testmysite)

## 記事

- [Inside Google Marketing: SEO の効果を最大限に引き出すための 3 つのヒント](https://www.thinkwithgoogle.com/intl/ja-jp/articles/search/google-website-seo/)
- [検索エンジン最適化（SEO）スターター ガイド | Search Console ヘルプ](https://support.google.com/webmasters/answer/7451184?hl=ja)
- [Find out how you stack up to new industry benchmarks for mobile page speed](https://www.thinkwithgoogle.com/marketing-resources/data-measurement/mobile-page-speed-new-industry-benchmarks/)
- [How Loading Time Affects Your Bottom Line](https://neilpatel.com/blog/loading-time/)
- [Website Performance Optimization by Google | Udacity](https://www.udacity.com/course/website-performance-optimization--ud884)

## 逆引き

### リッチスニペットを出したい

- [Google 検索 構造化データの仕組みについて](https://developers.google.com/search/docs/guides/intro-structured-data?hl=ja)
- [schema.org](https://schema.org/)
- [Google 構造化データ テストツール](https://search.google.com/structured-data/testing-tool?hl=ja#)
- [JSON for Linking Data](https://json-ld.org/)
- [Google Search Console リッチリザルト テスト](https://search.google.com/test/rich-results?utm_source=support.google.com/webmasters/&utm_medium=referral&utm_campaign=7445569)
- [Google 検索 記事](https://developers.google.com/search/docs/data-types/article?hl=ja)
- [Google 検索 構造化データを含む非 AMP ページ](https://developers.google.com/search/docs/data-types/article?hl=ja#non-amp-sd)
- [schema.org Article](https://schema.org/Article)
- [schema.org NewsArticle](https://schema.org/NewsArticle)
- [schema.org BlogPosting](https://schema.org/BlogPosting)
AWSの全てのRDSについているタグを全て取得 PowerShell編

全てのRDSについて、タグ情報の一覧を作成したい、というときのお話です。

まあAWSのWeb画面で1つずつ見ていくのでも良いですが、RDSが20も30も、さらに多く存在すると、気が滅入りますね。

そこで、AWS CLIを使って実施します。

####EC2の場合
ECSの一覧は

``aws ec2 describe-instances ``

のコマンドで、**1回で**全EC2のタグ情報を拾うことができます。

####RDSの場合
RDSの一覧は、

``aws rds describe-db-instances ``

のコマンドで一覧は取得できます。
ただし、~~そこにはタグ情報は含まれていません！~~
<font color="brown"> [2021/7/11更新]
気が付いたら describe-db-instances に **TagList** が含まれるように変わっていました。
AWS CLIではいつから変わったのかログが無いですが、LambdaのPython(boto3)では日次で取得していたので結果を確認すると、2021/1/8 からTagListが含まれていました。
この記事は不要になりましたが、list-tags-for-resource でも取得は一応可能なので残しておきます。
</font>

RDSのタグ情報を取得する場合、個々のRDSに対して

``aws rds list-tags-for-resource --resource-name arn:aws:rds:xxx:xxx:db:xxxx``

を実行しないと取り出せませんでした。

よって、RDSが20個あると、

- **aws rds describe-db-instances 　が1回**
- **aws rds list-tags-for-resource　が20回**


合計**21回**実行することになります。

###PowerShellコード

PowerShellのコードで書くと、以下のような感じです。

```powershell

$rdsfile = "C:\temp\rds.txt"
$rdsfile_tag = "C:\temp\rds_tag.txt"
$region = "ap-northeast-1"
$accountid = "99876543210x"

aws rds describe-db-instances --region=$region --query "DBInstances[].{DBInstanceIdentifier:DBInstanceIdentifier}" --output text | Sort-Object > $rdsfile

foreach ($li in Get-Content $rdsfile) {
  $out_line = "$li"

  $tags = $(aws rds list-tags-for-resource --resource-name $("arn:aws:rds:${region}:${accountid}:db:" + $($li -split "\t")[0]) --output text)

  foreach ($othertag in ($tags | sls ^TAGLIST)) {
    $t_1,$t_name,$t_val = $othertag -split "\t"
    $out_line += "`t$t_name=$t_val"
  }

  echo "$out_line" >> $rdsfile_tag
}
```

$rdsfile_tag 変数で指定したファイルが生成されます。
ファイルの形式は、**TSV**(タブ区切りのテキストファイル)です。

なんでTSVなんだよ。
ということでjsonを出力するならこのようになります。

```powershell
$rdsfile = "C:\temp\rds.json"
$rdsfile_tag = "C:\temp\rds_tag.json"
$region = "us-east-1"
$accountid = "99876543210x"

aws rds describe-db-instances --region=$region --query "DBInstances[].{DBInstanceIdentifier:DBInstanceIdentifier}" --output json > $rdsfile

$outobj = @()
$rds_instances=$(cat $rdsfile -Raw | ConvertFrom-Json)

foreach( $item in $rds_instances ) {

  $arn = "arn:aws:rds:${region}:${accountid}:db:" + $item.DBInstanceIdentifier
  $rds_tags = $( $(aws rds list-tags-for-resource --resource-name $arn --output json) -join "" | ConvertFrom-Json)

  $rdsobj = [PSCustomObject] @{ DBInstanceIdentifier = $item.DBInstanceIdentifier }
  foreach( $tag in $rds_tags.TagList ) {
    $rdsobj | Add-Member $tag.Key $tag.Value
  }
  $outobj += $rdsobj
}

$outobj | ConvertTo-Json -compress > $rdsfile_tag

```

**全てのRDS**と書きましたが、不正確でした。**1つのリージョン内の全てのRDS**です。

###gist

- リストの1行目にヘッダを付ける
- 一部の指定したタグは除外する
- 一部の指定したタグ指定した順で表示する

このあたりを考慮したコードをgistに置いています。
https://gist.github.com/hayayu0/f067ccbbabaa3dc0d9121aa3eadbf322

###PowerShell編以外は？

PowerShellで自分の要望は満たせたので、今のところ記事作成予定はありません。じゃあ何で「編」付けたんだよって話ですが。
bash、Python、は探せばいくつかありそうです。

##参考にした情報
- [aws cliでEC2 RDSの一覧を取得する (Qiita)](https://qiita.com/katamuki/items/6dcf7425890fad7ff912)

- [WindowsにAWS CLIをインストールする (AWS公式情報)](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/install-windows.html)
PythonでWordPressに複数の記事を一括で自動投稿するプログラム

Pythonを使ってWordPressにフォルダに入っているテキストファイルの複数の記事を一括で自動投稿するプログラムです。

##使い方と詳細な解説
プログラムの使い方と詳細な解説はこちらに書いてあります。
[【3秒で記事投稿完了】Pythonでワードプレスに複数の記事を一括で自動投稿してくれるプログラム
](https://hashikake.com/python-wordpresspost)

##コード本文

```
from wordpress_xmlrpc import Client, WordPressPost
from wordpress_xmlrpc.methods.posts import GetPosts, NewPost
from wordpress_xmlrpc.methods.users import GetUserInfo
import os, glob
import ssl

ssl._create_default_https_context = ssl._create_unverified_context

try:
    wp = Client('URL/xmlrpc.php', 'ID', 'PASS')

    for filepath in glob.glob("./posts/*.txt"):
        title = os.path.basename(filepath).replace('.txt','')

        with open(filepath, encoding='shift-jis') as f:
            body = f.read()
            post = WordPressPost()
            post.title = title
            post.content = body
            post.post_status = 'publish'
            # 投稿した記事を下書きのままにしたい場合はpublishをdraftに変更
            # post.post_status = 'draft'

            # tagやcategory割当の場合
            post.terms_names = {
            #     'post_tag': ['Python', 'WordPress'],
                'category': ['WordPress', 'Python']
                }

            wp.call(NewPost(post))

        os.remove(filepath)

except Exception as e:
    print(e)
```
bundle open時のエディタにRubyMineを指定する

シェルの設定ファイルに1行追加するだけ(以下はMacOSの場合)

```sh
export BUNDLER_EDITOR="/Applications/RubyMine.app/Contents/MacOS/rubymine"
```

当たり前だけど`EDITOR`にRubyMineを指定してしまうと、gitとかtigでエディタを使う操作をするときに困るので注意

参考

- https://bundler.io/v2.0/man/bundle-open.1.html
Vagrant を本気で学ぶ (1)

# 目的
業務効率化

オリジナルのboxとvagrantfileを作ると最初に詰まるところ。

検証確認としては、各フレームワークさんの公式gitにあるvagrantfileで仮想マシーン立ち上げたやつは、マウントできてるので、できない場合は、最悪それを使う。ただそれだと勉強ならないので個人でvagrantfileを作れるようなることが最大な目的である。


LinuxのみよりもWindowsで修正してそれを仮想マシーンに転送したほうが効率よいので。Linuxコマンドでなんでもできちゃう方ならマウント必要ないですが、、

# Vagrantfile中身

``` ruby

Vagrant.configure(2) do |config|
  config.vm.box = "box名"
  Encoding.default_external = 'UTF-8'
  config.vbguest.auto_update = false
  config.vm.synced_folder "/data", "/var/www/html", owner: "vagrant", type: "virtualbox",create:"true",mount_options:["dmode=777,fmode=777"]
  config.vm.network "private_network", ip: "192.168.33.10"
  config.vm.hostname = 'centos7'
  config.ssh.forward_agent = true
end


```

# 課題
ホストOSとVMとの共有設定、マウントが上手くいかない

``` vim

Vagrant was unable to mount VirtualBox shared folders. This is usually
because the filesystem "vboxsf" is not available. This filesystem is
made available via the VirtualBox Guest Additions and kernel module.
Please verify that these guest additions are properly installed in the
guest. This is not a bug in Vagrant and is usually caused by a faulty
Vagrant box. For context, the command attempted was:

mount -t vboxsf -o dmode=777,fmode=777,uid=1000,gid=1000 var_www_html /var/www/html

The error output from the command was:

mount: unknown filesystem type 'vboxsf'
```
Google先生に翻訳使ってみると、、


VagrantはVirtualBoxの共有フォルダをマウントできませんでした。 これは通常です。ファイルシステム "vboxsf"が利用できないからです。 このファイルシステムは
VirtualBox Guest Additionsとカーネルモジュールで利用可能になりました。
これらのゲスト追加機能が正しくインストールされていることを確認してください。
ゲスト。 これはVagrantのバグではなく、通常欠陥があることが原因です。
放浪箱。 コンテキストでは、試みられたコマンドは次のとおりです。

```vim

mount -t vboxsf -o dmode = 777、fmode = 777、uid = 1000、gid = 1000 var_www_html / var / www / html

コマンドからのエラー出力は次のとおりです。

mount：未知のファイルシステムタイプ 'vboxsf'
```

# 解決策
ゲストOSでVirtualBox Guest Additionsがインストールし、うまく動作していないとvagrant plugin install vagrant-vbguestは利用できない

# 参考
[https://teratail.com/questions/84708](https://teratail.com/questions/84708)
[https://qiita.com/tamoryo37/items/df1f3435ba186fad1e05](https://qiita.com/tamoryo37/items/df1f3435ba186fad1e05)
FlutterでQRコードスキャナーを使ってみる

Flutterのbarcode_scanパッケージを使ってQRコードスキャンを行ってみた。

### 必要な設定とパッケージの導入

以下のURLのパッケージを使用する。
[barcode_scan \| Flutter Package](https://pub.dev/packages/barcode_scan)


#### Android

まずはAndroidManifest.xmlにpermissionとactivityを追加する。

```xml
<manifest>
  ...
  <uses-permission android:name="android.permission.CAMERA" />　←追加
  <application>
    ...
    <activity
        ...
        >
        ...
    </activity>
    <activity android:name="com.apptreesoftware.barcodescan.BarcodeScannerActivity" />  ←追加
  </application>
</manifest>

```

このパッケージはKotlinで書かれているためプロジェクトにKotlinサポートを追加する。
まず`android/build.gradle`に以下を追加する。

```
buildscript {
    ext.kotlin_version = '1.3.21'  ←追加
    repositories {
        google()
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.2.1'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"　←追加
    }
}
```

次に`android/app/build.gradle`に以下を追加する。

```
apply plugin: 'kotlin-android'　←追加
...
dependencies {
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version" 　←追加
    ...
}
```

#### iOS

iOSで使用するには、カメラの使用方法の説明をInfo.plistに追加する必要がある

```xml
<key>NSCameraUsageDescription</key>
<string>Camera permission is required for barcode scanning.</string>
```

--- 

`pubspec.yaml `にパッケージを追加し`Packages get`する

```
dependencies:
  ...
  barcode_scan: ^0.0.3
```

### コードを書いてQRリーダーを起動する

ボタンタップでQRリーダー起動、QRコードのスキャンが成功したらボタンの下に読み取った内容を表示する簡単なアプリを作る。

まず必要パッケージをimportする

```dart
import 'package:flutter/material.dart';
import 'package:barcode_scan/barcode_scan.dart';
import 'package:flutter/services.dart';
```
QRリーダーは`BarcodeScanner.scan()`で起動し、スキャンした内容が戻り値として返ってくる。
以下のようなコードになる


```dart
String barcode = '';

  /// QRスキャン開始、結果取得
  Future scan() async {
    try {
      String barcode = await BarcodeScanner.scan();
      setState(() => this.barcode = barcode);
    } on PlatformException catch (e) {
      if (e.code == BarcodeScanner.CameraAccessDenied) {
        setState(() {
          this.barcode = 'The user did not grant the camera permission!';
        });
      } else {
        setState(() => this.barcode = 'Unknown error: $e');
      }
    } on FormatException{
      setState(() => this.barcode = 'null (User returned using the "back"-button before scanning anything. Result)');
    } catch (e) {
      setState(() => this.barcode = 'Unknown error: $e');
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            FlatButton(
              color: Colors.blueAccent,
              child: Text('QR SCAN', style: TextStyle(color: Colors.white),),
              onPressed: scan,
            ),
            Text(barcode)
          ],
        ),
      ),
    );
  }
```
[CakePHP3] 日付のバリデーションでフォーマットを指定する方法

## 通常の日付バリデーションの設定方法

> $validator = new Validator();
>
> $validator->add('<項目名>', [
>    'date' => [
>        'rule' => 'date',
>        'message' => '<エラーメッセージ>',
>    ]);
>

この場合、「2019/06/21」といったフォーマットだとバリデーションOKとなりますが、海外で使用される「06/21/2019」といったフォーマットだとエラーになってしまいます。

## 日付フォーマットを指定したバリデーションの設定方法①

> $validator = new Validator();
>
> $validator->add('<項目名>', [
>    'date' => [
>        'rule' => ['date', 'mdy'],
>        'message' => '<エラーメッセージ>',
>    ]);
>

この場合、「06/21/2019」といったフォーマットだとバリデーションOKとなりますが、逆にこれまでOKだった「2019/06/21」がバリデーションNGとなってしまいます。

## 日付フォーマットを指定したバリデーションの設定方法②

> $validator = new Validator();
>
> $validator->add('<項目名>', [
>    'date' => [
>        'rule' => ['date', 'mdy'],
>        'message' => '<エラーメッセージ>',
>    ]);
>

上記のようにフォーマットを複数指定することも可能で、この場合「2019/06/21」「06/21/2019」のどちらもバリデーションOKとなります。

## フォーマット一覧

最後に日付バリデーションで設定できるフォーマットを一覧にしておきます。

| フォーマット      | サンプル(2006年12月27日の場合）        |
|:-----------------|:------------------|
| dmy              | 27-12-2006 or 27-12-06 ※区切りは「-」「 」「.」「/」が可能 |
| mdy              | 12-27-2006 or 12-27-06 ※区切りは「-」「 」「.」「/」が可能 |
| ymd(default)     | 2006-12-27 or 06-12-27 ※区切りは「-」「 」「.」「/」が可能 |
| dMy              | 27 December 2006 or 27 Dec 2006 |
| Mdy              | December 27, 2006 or Dec 27, 2006 ※カンマ無しも可 |
| My               | December 2006 or Dec 2006 |
| my               | 12/2006 or 12/06 ※区切りは「-」「 」「.」「/」が可能 |
| ym               | 2006/12 or 06/12 ※区切りは「-」「 」「.」「/」が可能 |
| y                | 2006 |
Office365逆引きメモ

必用に迫られたOffice365逆引きメモ

# OneDriveのリセット方法

何らかの理由によりOneDriveの調子が悪い場合の対処方法。

1. 下記のコマンドを実行する。
2. スタートメニューからOneDriveを起動する。

```posh
%localappdata%\Microsoft\OneDrive\onedrive.exe /reset 
```

### 参考
* [OneDrive をリセットする - Office サポート](https://support.microsoft.com/ja-jp/office/onedrive-%E3%82%92%E3%83%AA%E3%82%BB%E3%83%83%E3%83%88%E3%81%99%E3%82%8B-34701e00-bf7b-42db-b960-84905399050c)

# セットアップについて

Office365のExchangeを正しく動作させるためにDNSの設定を行う必用が有る。

# 古いNASの共有フォルダにアクセスできない問題

共有のSMBがv1の場合、Office365のユーザでWindows10へログインしてPINを設定すると共有できなくなる。
SMBのv1を使うなということ。
Redmine逆引きメモ

必要に迫られたRedmineの逆引きメモ

## チケット登録が遅い問題
チケット登録だけにやたらと時間がかかる場合が有り、他の部分は軽い場合はメール送信関係に問題が有る。

## チケット登録にメールが飛ばない問題
BCCで送信されているため、存在しないメールアドレスに対してエラーが発生すると他メールアドレスにも送信されなくなる。

## CentOS + Unicon + NginxでRedmineがInternal errorになる問題
そもそもログイン画面すら表示されなくなる
UNICORNで動かしてると発生する問題らしくUNICORNのworkerがメモリ空間を食いつぶす。
UNICORN自体に解消する方策は無いらしくUNICORNを再起動すると解消される。
unicorn-worker-killer.なるgemが有るらしいが、うまく動作しなかったので、anacronで適当に毎日再起動させておく。
【Keras】 Kerasで訓練時だけじゃなく予測時にもドロップアウトを使う

タイトルの通りですが，日本語記事が見つからなかったので．

```without_dropout_in_prediction.py
x = Dense(dense_unit_num)(x)
x = Dropout(dropout_rate)(x)
```

これだと訓練時にしかドロップアウトが適用されません．

```with_dropout_in_prediction.py
x = Dense(dense_unit_num)(x)
x = Dropout(dropout_rate)(x, training=True)
```
training=Trueをつけると，予測時にもドロップアウトが適用されるようになります．trainingのフラグをTrueにしたら予測時にも適用される，というのは少し分かり辛いですね...

参考: [https://github.com/keras-team/keras/issues/9412](https://github.com/keras-team/keras/issues/9412)
なお，公式のドキュメントにもこの情報は書いてなさそうとのことです．



# なぜ予測時にもドロップアウトを使うのか？

ドロップアウトは経験的にニューラルネットワークの過学習を抑制してくれることが知られていました．そのため，訓練時にはドロップアウトを適用し，予測時には適用しない，というのが一般的となっていました．

しかし近年，ドロップアウトを使ったニューラルネットワークは，変分推論を行っていることと等価であり，ベイズ的に事後分布を求めることができることが示されました．そして，ドロップアウトが適用されたネットワークから予測された値は，その事後分布からサンプリングしていることと等しいこととなります．

日本語だとこの[記事](https://nykergoto.hatenablog.jp/entry/2017/08/14/%E3%83%8B%E3%83%A5%E3%83%BC%E3%83%A9%E3%83%AB%E3%83%8D%E3%83%83%E3%83%88%E3%81%B8%E3%81%AE%E3%83%99%E3%82%A4%E3%82%BA%E6%8E%A8%E5%AE%9A_-_Baysian_Neural_Network)が詳しいです．

簡単に言うと，**ニューラルネットワークによる予測の不確かさ**を知ることができます．なので，予測時にもドロップアウトが使いたかったのです．
「歴史」タグについて (タグシノニム: 「history」）

### 対象

(件数は2019-06-21現在)

- [https://qiita.com/tags/歴史](https://qiita.com/tags/%E6%AD%B4%E5%8F%B2) : 28件

### 説明

歴史的に長い製品、サービス、言語などの記事。

### タグシノニム
(件数は2019-06-21現在)

- https://qiita.com/tags/history : 39件

ただし、historyというコマンドがLinuxにあり、historyコマンドの記事の方が多い。
https://linux.die.net/man/3/history
Vimで表示中の色をそのままに Word とか OneNote とかに貼り付けたい

Vimのシンタックスハイライトは単純なものなら簡単に書けて便利です。

なので、`<ProjectRoot>/.vim/syntax/hogehoge.vim` とかにプロジェクト固有の設定を記載して `.local.vimrc`([localrcプラグイン](https://github.com/thinca/vim-localrc)) で読み込むってことをよくやります。

ソースコードだけでなく調査メモなどにもこの方法で色付けをしており、その色のままほかの人に展開したいってなったときに調べた方法を備忘録として残しておきます。
Vimで表示している色をなるべくそのまま Word/Excel/PowerPoint/OneNote で再現させる方法です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72083/e5326ae8-7a16-e5db-15a9-3a25c7f600d8.png)

かなり迂遠な方法なので、もっと簡単な方法があれば教えてください。

# 手順

HTML化して背景色を取り除きます。

## Wordを利用する

1. `TOhtml`コマンドでHTMLファイル作成
2. HTMLファイルをブラウザで開き、全選択してコピー
3. Word（新規作成）に貼り付け
4. 全選択し、フォントの設定をしておく
5. 全選択の状態のまま、「罫線」のメニューから「線種とページ罫線と網掛けの設定」を開く
6. 「網掛け」タブから「背景の色」を「色なし」を選ぶ
7. 全選択してコピーし、好きなところに貼り付け

![線種とページ罫線と網掛けの設定](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72083/4a154105-3b76-df43-23ac-a01d5da22d8c.png)
「線種とページ罫線と網掛けの設定」はこれ

## Excelを利用する

背景色を削除する手間はないですが、貼り付け先がWordやOneNoteだと、貼り付けたときに表形式になります。

1. `TOhtml`コマンドでHTMLファイル作成
2. HTMLファイルをブラウザで開き、全選択してコピー
3. Excel（新規作成）に貼り付け
4. 選択状態を維持し、フォントの設定をする
5. コピーし、好きなところに貼り付け
Mac OS X 備忘録(順次足していく)

- Finderで不可視ファイルの表示/非表示: ⌘+⇧+. (cmd+shift+.)
- Time Machineの「バックアップ対象から除外する項目」に追加したいもの
 - /Applications, /usr, ~/Library/Application Support/Google/, ~/Library/Caches, ~/Library/.../...Evernote, システムファイルとシステムアプリケーション
- 毎度， ``ssh-add``をしなくてすむように``.ssh/config``に以下を記述する:

```
Host *
  UseKeychain yes
  AddKeysToAgent yes
```
gpsの研究　その53

#概要

gpsを理解したかった。
u-bloxモジュールのフェイクを見つけた。


#写真

![DSCN0360.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/bc1b49fe-bc29-5196-b9b9-8ee92b2ac304.jpeg)


#u-center結果

![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/1a3c4c58-c5bb-f760-8d11-4ab3487829b7.png)

#説明

基板上のモジュールは、NEO-6M-0-001となってる。
u-centerで、UBX-MON-VER開くとHardwareは、00070000と出る。
フェイク。

以上。
Jetson Nanoにpygameをインストールする方法（Python2/Python3）

![IMG_4632.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81919/07cfc877-35cf-cf32-254f-58dc60a173d1.jpeg)


# Jetson Nanoにpygameをインストール
　需要あるかわかりませんが、結構はまったのでメモを残しておきます。Python2とPython3で大きく違うので注意下さい。

## Python2でpygameを使う場合
　apt-getで入れるだけです。簡単ですね。

```sh
$ sudo apt update
$ sudo apt install python-pygame
```

## Python3でpygameを使う場合
　Python3だとapt-getのバイナリはないので、pipで入れることになりますが、そのために色々必要なものがあります。

　まずは以下で必要なライブラリをインストールします（一部はインストール済みかもしれません）。

```sh
$ sudo apt update
$ sudo apt install libsdl-dev libsdl-image1.2-dev libsdl-mixer1.2-dev libsdl-ttf2.0-dev
$ sudo apt install libsmpeg-dev libportmidi-dev libavformat-dev libswscale-dev
$ sudo apt install libfreetype6-dev
$ sudo apt install libportmidi-dev
```

　必要なライブラリをインストールしたら、pipでpygameをインストールします。

```sh
$ sudo apt install python3-pip
$ pip3 install pygame==1.9.6
```

[pygame install時にエラー(Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-build-yovQQX/pygame/)](https://qiita.com/seigot/items/6e6e44ee55d344762155)

　インストールするライブラリに関しては、pipでインストールするとき、これ足りないぞ！ってエラーが出るごとに、探してインストールの仕方調べてインストールする感じでした。

　ちなみに、ラズパイだと以下でOKです（冒頭3行に関しては、こちらを参考にさせていただきました）。

[raspberry pi上のpython3にpygameを入れる際のエラーを解決](https://qiita.com/hisurga/items/28651689eafe6ec89227)



## Pygameテスト
　適当なサンプルを実行しましょう。以下グリーンのフルスクリーンを表示させた図。

![IMG_4632.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81919/07cfc877-35cf-cf32-254f-58dc60a173d1.jpeg)

```sh
$ wget https://raw.githubusercontent.com/karaage0703/jetson-nano-tools/master/scripts/pygame_test.py
$ python3 pygame_test.py
```

## pygameでMIDIを使いたい
　本当はこれをやりたかったのです。ただ、以下実行すると。

```python
>>> import pygame.midi
>>> pygame.midi
>>> pygame.midi.init()
```

　`/dev/snd/seq failed: No such file or directory`とエラーが発生します。`modprobe`もだめ。NVIDIAのフォーラムの以下スレッドをみると、どうもカーネルのビルドが必要な予感…

[/dev/snd/seq failed: no such file or directory](https://devtalk.nvidia.com/default/topic/1050933/jetson-nano/-dev-snd-seq-failed-no-such-file-or-directory/)

　~~手軽な方法ないのかしら、誰か助けて！~~

　カーネルビルドしてMIDIの使用に成功しました。以下記事参照下さい。

[Jetson NanoでMIDIを使うためにカーネルビルド](https://qiita.com/karaage0703/items/9bef6aeec9ad24f647c6)

# 関連ページ
[Jetson Nano関係のTIPSまとめ](https://qiita.com/karaage0703/items/b14c249aa33112669ee4)
Jetson Nano関係の情報は、上記ページにまとめていますのでよければ参照下さい。

# 変更履歴
- 2021/02/10 JetPack 4.5で動作確認
AIメーカーを使ったポテトチップス判別のLINE Botを作ってみた


画像認識AIを使ったLINE BOTを、ネタとしてポテトチップスを使って、作ってみました。

#はじめに
自分自身で撮影した画像を使って学習モデルを作り、LINE Botを通じて、画像認識させました。

#作り方
2z (@2zn01) さんの3つの記事を参考にしました。

[今話題のAIをweb上で誰でも気軽に作れる「AIメーカー」を作ってみた]
(https://qiita.com/2zn01/items/0d3147c9d9d804ad9880)

[今注目のAIアプリを簡単に作れる、「AIメーカー」のAPIを公開しました！]
(https://qiita.com/2zn01/items/c324c7f4d42e0b335bed)

[画像認識AIを使ったLINE BOTの作り方]
(https://qiita.com/2zn01/items/7f7b8c57054f67ef9528)


#LINE Botは便利
アプリを作る場合、iOSとAndroid版を作る必要があると思いますが、LINE Botだと１つ作るだけでいいのでUIとして簡単です。

#苦労したこと
学習モデルを作るために画像を自分自身で準備しました。AIメーカーはタグから自動で画像データを収集して学習するのが特徴になっていますが、今回は自分自身で撮影した画像を使って学習モデルを作りました。4種のポテトチップスを買ってきてお皿にいれて20枚ずつ角度を変えて画像撮影するのですが、やってみると結構大変でした。

準備した画像　
4種のポテトチップスを20枚ずつ、1280 pixel x 851 pixelの画像サイズで準備して、AIメーカー内で学習させました。


| 種類             |       写真例      |          サイズ          |用意した枚数     |
|:-----------------|------------------:|:------------------------:|:------------------:|
| うすしお         | ![うすしお4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269534/eac4ea66-61ec-0fe4-760a-8bfacd1496a5.jpeg)| 1280 pixel x 851 pixel |      20枚       |
| コンソメ         |![コンソメ2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269534/41d517a4-dc52-a05e-0753-ddc041f77d05.jpeg)| 1280 pixel x 851 pixel |      20枚       |
| のりしお           |![のりしお1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269534/6fac1302-a84a-23a8-1cfb-b1a8cc79365a.jpeg)| 1280 pixel x 851 pixel |      20枚       |
| 厚切り           |![厚切り2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269534/827710df-e049-3461-97c4-e75a91235a90.jpeg)| 1280 pixel x 851 pixel |      20枚       |


作ったAIメーカー：ポテトチップスを見分ける　は、[こちら](https://aimaker.io/app/image-classification/id/3157)。
2019年6月21日時点で総合ランキング111位になっています。

#動作
動作は、[Youtube](https://youtu.be/mjsmWnpTB5A)で見てください。

#QRコード
ポテトチップスを判定するLINE Botを試してみてください。

![1399.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269534/2b46b58b-dd34-4182-95b9-0673b6d96a41.jpeg)


#その後
その後、湖池屋・カルビーのポテチ判別も作りました。
湖池屋とカルビーのポテトチップス（うすしお）を見分けます。
前回は学習用の画像のサイズは、1280pixel x 851pixel　でしたが、画像認識の学習モデルに使用する画像は一般的にもっと小さくしてモデル学習に負荷をかけないようにしているようなので、この2回目のモデル作成には400pixel x 265pixelのサイズの画像を20～22枚程度使用しました。また、Negative（どれでもない）dataというのを入れることもあると知り、今回は、湖池屋 or カルビー　or どちらでもない　という画像セットを用意して学習させています。Negative dataには、湖池屋のり塩、カルビーのり塩、きのこの山、たけのこの里、アポロなどの画像で合計20枚の画像を使用しました。

これも試してみてください。


![1400.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269534/f83fed02-8d42-eb4c-fa9b-7dc5444993e9.jpeg)
C/C++とC#の整数型比較表

**"C#の整数型はC/C++とは異なるよ"**って話。

# 比較表

|bit数|符号|C|C++|C#|
|:---|:---|:---|:---|:---|
|8|なし|uint8_t|std::uint8_t|byte|
|8|あり|int8_t|std::int8_t|sbyte|
|16|なし|uint16_t|std::uint16_t|ushort|
|16|あり|int16_t|std::int16_t|**short**|
|32|なし|uint32_t|std::uint32_t|uint|
|32|あり|int32_t|std::int32_t|**int**|
|64|なし|uint64_t|std::uint64_t|ulong|
|64|あり|int64_t|std::int64_t|**long**|
|8以上|なし|unsigned char|unsigned char||
|8以上|あり|signed char|signed char||
|16以上|なし|unsigned short|unsigned short||
|16以上|あり|**short**|**short**||
|16以上|なし|unsigned int|unsigned int||
|16以上|あり|**int**|**int**||
|32以上|なし|unsigned long|unsigned long||
|32以上|あり|**long**|**long**||
|64以上|なし|unsigned long long|unsigned long long||
|64以上|あり|long long|long long||

```
C の long long型はC99以降
C の [u]intX_t型はC99以降 (ヘッダーは<stdint.h>)
C++ の long long型はC++11以降
C++ の std::[u]intX_t型はC++11以降 (ヘッダーは<cstdint>)
```

short/int/long等の整数型はC/C++とC#では定義が違うことがわかりました。
vimのreadコマンドで別ファイルの最終行から10行だけ読み込む

`:h :r`しても見当たらなかったので。
> :{range}readは現在ファイルの{range}行目に読み込むから違う操作のはず
? ++optのところにあるのかしら･･･？

正確には全行`:r`してから`:d`で消す操作を行う。

```vim
:r <filename> | .,$-10d 
```

現在行に読み込んだ<filename>に対して、現在行から最終行までを削除する。
もちろんshellコマンドの`tail`とか使ってもできるんじゃね？