OmniAICreator/Qiita-1.07M huggingface dataset:
Rubyを使って20分でスクレイピングの大元を作る

今回はRubyの`Nokogiri`というGemを使って、スクレイピングをするときの大元となる準備をまとめました。

## 対象読者
- 大量のURLページに対してスクレイピングをしたいけど、やり方がわからない
- Rubyでスクレイピングしてみたい人

## 環境
- Ruby2.5.0

## 実装
- プロジェクトのディレクトリ構造は以下の通りです。
- Gemは`vendor/bundle`配下にインストールするようにします。

```
.
├── Gemfile
├── Gemfile.lock
├── main.rb
└── vendor/bundle/*
```

### Gemインストール
- 以下のGemを入れましょう。
- 今回の主役となる`nokogiri`はもちろんですが、`pry`を入れることでデバッグが楽になります。

```rb
gem 'nokogiri'
gem 'pry-byebug'
```

### スクレイピングの為にページのHTMLを`Nokogiri::HTML::Document`に変換する
- では実際に動くコードを書いていきます。
- Nokogiriでスクレイピングする為には、**ページのHTMLを材料にして、`Nokogiri::HTML::Document`というオブジェクトを作る必要があります**。
- それを実現するのが、`Nokogiri::HTML.parse`メソッドです。

```rb
# htmlにはページのHTML（String型）が入る
Nokogiri::HTML.parse(html, nil, 'utf-8')
```

- ページのHTMLをString型として取得する方法なのですが、Rubyの`open-uri`を使う方法と、Shellの`curl`を使う方法とがあります。
- どちらでもいいのですが、以前`open-uri`だとうまく行かない場合があって、その時は`curl`の方を使いました。

```rb
# open-uriの場合
require 'open-uri'
html = open(url) { |f| f.read }

# curlの場合はkconvを使ってUTF-8にすること
require 'kconv'
html = `curl -s #{url}`.toutf8
```

- ではこれらを使って、「ページのURLを渡すと、`Nokogiri::HTML::Document`型にして返してくれるメソッド」を作りましょう。（今回は`open-uri`を使います。）

```rb
require 'open-uri'

def setup_doc(url)
  charset = 'utf-8'
  html = open(url) { |f| f.read }
  doc = Nokogiri::HTML.parse(html, nil, charset)

  # <br>タグを改行（\n）に変えて置くとスクレイピングしやすくなる。
  doc.search('br').each { |n| n.replace("\n") }

  doc
end
```
- これで第一ステップ完了です。

### `Nokogiri::HTML::Document`から、必要な情報を抽出する
- ページを`Nokogiri::HTML::Document`型にしたら、いよいよデータの抽出です。
- データの抽出には`XPath`というものを使います。（[こちら](https://qiita.com/rllllho/items/cb1187cec0fb17fc650a)に詳しく書いてありました！）
- 具体例だとこんな感じになります。

```rb
# ページのNokogiri::HTML::Documentを取得。
doc = setup_doc(url)

# ページのタイトル名と、詳細ページへのURLを抽出する。
page_title = doc.xpath('div/h1').text
detail_url = doc.xpath('div/h2/a').attribute('href').value
```

- RubyのXPathでよく使う書き方については後日また書きます。

### CSVへの出力
- 最後はCSVへの出力です。
- CSVに出力するには`csv`ライブラリを使います。
- CSVのファイルを開き（なければ自動で作成されます）、そこに必要な情報を格納した配列をpushしていくことで、CSVとして出力することができます。（配列内の順番は必ず揃えましょう）

```rb
require 'csv'

# CSVヘッダー
headers = ['Title', 'Detail URL', 'Page URL']

CSV.open('target.csv', 'w') do |csv|
  # 一行目はCSVヘッダーにする
  csv << headers

  # 今回はデータが一つだけだが、for文とかでたくさんpushすることができる
  csv << [page_title, detail_url, url]
end
```

### まとめ
- 全体をまとめるとこういう感じになります。（`main.rb`に書きます）
- 実装完了後、`ruby main.rb`を実行すれば、スクレイピングが実行されてCSVが出力されます。

```rb
require 'bundler/setup'
require 'nokogiri'
require 'open-uri'
require 'csv'

def setup_doc(url)
  charset = 'utf-8'
  html = open(url) { |f| f.read }
  doc = Nokogiri::HTML.parse(html, nil, charset)
  doc.search('br').each { |n| n.replace("\n") }
  doc
end

def scrape(url)
  doc = setup_doc(url)
  page_title = doc.xpath('div/h1').text
  detail_url = doc.xpath('div/h2/a').attribute('href').value

  [page_title, detail_url, url]
end

if __FILE__ == $0
  urls = [
    'https://www.example1.com',
    'https://www.example2.com',
    'https://www.example3.com'
  ]
  csv_header = ['ページタイトル', '詳細URL', 'URL']

  CSV.open('result.csv', 'w') do |csv|
    csv << csv_header
    urls.each do |url|
      begin
        csv << scrape(url)
      rescue
        # エラー処理
        # 例）　csv << ['err', 'err', url]
      end
    end
  end
end
```
bashの演算

#はじめに
このブログには授業で習ったことや自分で学習したものをまとめ、記事にしています

今回はBashの簡単な四則演算をしてみました。

---

#まずBashって何
BashとはUnixやLinuxで使われているシェルのひとつです。
主にユーザーからの操作命令を実行します。
OSをユーザーが操作するための言語といったほうが簡単かもしれないですね(-ω-)/

---

ちなみに、BashにはStringやintなどのデータ型は存在しません。
全て文字列です。

##数値の計算
数値の計算をするときはexprを使います。
＋-*/の使い方はCやC#と同じです
▼実際のコード

```suchihensu.sh
a=10
echo $a
echo $a+2
echo `expr $a + 9`
echo `expr $a - 8`
echo `expr $a \* 5`
echo `expr $a / 8`

echo `expr \($a + 5\) \* 3`

readonly r=10
r=40
```

##実行結果

```
10
10+2
19
2
30
2
45
2
./see.sh: 行 15: r: 読み取り専用の変数です
```

#最後に
今回は簡単な計算を動かしてみましたが、次はまた違うものをBashでやろうと思います('ω')
温かい目で見守ってください(>_<)

最後までお読みいただきありがとうございました！(-ω-)/
今日の日付表示


#今日の日付と時間を表示
```csharp
using System;

namespace sample
{
    class Program
    {
        static void Main(string[] args)
        {
            //日付
            DateTime a = DateTime.Now;
            Console.WriteLine(a);
        }
    }
}
```
実行結果

```
vmmap[50044]: [fatal]  child process status could not be determined; exit code unavailable.2018/07/05 16:31:59
```
バーチャルキャスト便利ツール一覧

# バーチャルキャスト便利ツール一覧

個人的なまとめです

## 番組を確認、見るのに便利
予約配信一覧表示 
https://vcas.bootjp.me/

現在放送中の番組をTwitterでおしらせ
https://twitter.com/notify_vcas

## configを作るのに便利
モデルのconfig.json作成
https://nico3d.raa0121.info/

config.json全体の作成
http://ramensoy.webcrow.jp/vc_json_creator/

config.yamlからconfig.jsonを更新
https://github.com/esperecyan/virtualcast-config

## スタジオ内に持ち込んで便利
ダイスポッド
http://ramensoy.webcrow.jp/virtualcast/dice_list.php

ドラム演奏
http://hitoikigame.com/blog-entry-3277.html

## モデル探しに便利
タグに「第三者使用可能モデル」を含む作品
https://3d.nicovideo.jp/search?perfect_match=1&word_type=tag&word=%E7%AC%AC%E4%B8%89%E8%80%85%E4%BD%BF%E7%94%A8%E5%8F%AF%E8%83%BD%E3%83%A2%E3%83%87%E3%83%AB
ランダム文字列

メモ。下記でできる。SEEDを設定しないと同じ文字列しか返ってこない。

```golang

package main

import (
	"fmt"
	"math/rand"
	"time"
)

func init() {
	rand.Seed(time.Now().UnixNano())
}
func main() {
	fmt.Println(generate())
}

func generate(length int) string {
	const letterBytes = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
	b := make([]byte, length)
	for i := range b {
		b[i] = letterBytes[rand.Intn(len(letterBytes))]
	}
	return string(b)
}

```
九九の計算結果

#九九の計算結果

```csharp

using System;

namespace sample
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("九九の答え");
            int answer = 0;

            for (int h = 1; h < 10; h++){
                for (int w = 1; w < 10; w++){

                    answer = h * w;
                    Console.Write("{0,5}",answer.ToString() + "");
                }
                Console.WriteLine();
            }
        }
    }
}
```
実行結果

九九の答え

    1    2    3    4    5    6    7    8    9
    2    4    6    8   10   12   14   16   18
    3    6    9   12   15   18   21   24   27
    4    8   12   16   20   24   28   32   36
    5   10   15   20   25   30   35   40   45
    6   12   18   24   30   36   42   48   54
    7   14   21   28   35   42   49   56   63
    8   16   24   32   40   48   56   64   72
    9   18   27   36   45   54   63   72   81
```
__init__.py

Pythonパッケージをイニシャライズする。
ようは、 `__init__.py` ファイルをディレクトリに置いておくだけで、PythonではそのディレクトリはPythonのパッケージとして扱われるわけです。かんたん。

```
package/
  __init__.py
  file.py
  file2.py
  file3.py
  subpackage/
    __init__.py
    submodule1.py
    submodule2.py
```

`__init__.py` は空ファイルでも機能する。
よくやるのは、特定のクラスや関数をインポートしておくことだ。

例えば、`package/`直下の`__init__.py`に次の用に記述する。

```python
from file import File
```

すると、パッケージから`File`クラスをロードできるようになる。

```python
from package import File
```

ただ、ひとつずつ指定していくのは面倒くさい…。
そこで、`__all__`を使ってみよう。
`subpackage/__init__.py`に次のように定義をしてみる。

```py
from package import *
```
React の Class Component と Functional Component の書き方

# Class Component and Stateless Functional Component

`React Component`での基本的なコンポーネントの書き方をまとめます


```js
ReactDOM.render() {
  <Greeting name="Ronaldo" age=33 />,
  document.getElementById('root')
}
```
`ReactDOM.render()`で描画を行う
描画内容である、Greetingコンポーネントに`name`と`age`を`props`として渡します

> Class Component

```js
class Greeting extends React.Component {
  constructor(props) {
    super(props)
  }
  render() {
    return <h1>My name is {this.props.name}{this.props.age} years old.</h1>
  }
}
```

classに`React.Componet`というReactの基本的なコンポーネントを基底クラスとして継承します
`render()`メソッドを定義して、その戻り値でコンポーネントの表示内容を返します
propsをそのまま渡すだけなら、constructorを定義しなくとも問題ない


> Stateless Functional Component

基本的なjsの書き方で実装すると、

```js
function Greeting (props) {
  return <h1>My name is {this.props.name}{this.props.age} years old.</h1>
}

```

ES6のアロー関数を用いると、

```js
const Greeting = (props) => (
  <h1>My name is {this.props.name}{this.props.age} years old.</h1>
)
```
のように、`return`を省略できる

> Stateless とは？

処理結果が変わるようなデータを内部に持たない状態を持たないコンポーネントのこと
コードライクでは`this.state.`がない
このようなコンポーネントは上記の２つの書き方の内、`functional component`で実装することが推奨されている
[小ネタ]Docker コンテナに CPU 負荷を掛けた時のメモ

[小ネタ]Docker コンテナに CPU 負荷を掛けた時のメモ

小ネタ。
Docker コンテナに CPU 負荷を掛けた時の挙動を確認した時のメモ。

# 環境

```bash
$docker info
Containers: 3
 Running: 3
 Paused: 0
 Stopped: 0
Images: 3
Server Version: 17.12.1-ce
Storage Driver: devicemapper
 Pool Name: docker-docker--pool
 Pool Blocksize: 524.3kB
 Base Device Size: 10.74GB
 Backing Filesystem: ext4
 Udev Sync Supported: true
 Data Space Used: 639.1MB
 Data Space Total: 23.33GB
 Data Space Available: 22.69GB
 Metadata Space Used: 536.6kB
 Metadata Space Total: 25.17MB
 Metadata Space Available: 24.63MB
 Thin Pool Minimum Free Space: 2.333GB
 Deferred Removal Enabled: true
 Deferred Deletion Enabled: true
 Deferred Deleted Device Count: 0
 Library Version: 1.02.135-RHEL7 (2016-11-16)
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
 Volume: local
 Network: bridge host macvlan null overlay
 Log: awslogs fluentd gcplogs gelf journald json-file logentries splunk syslog
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Init Binary: docker-init
containerd version: 9b55aab90508bd389d7654c4baf173a981477d55
runc version: 9f9c96235cc97674e935002fc3d78361b696a69e
init version: 949e6fa
Security Options:
 seccomp
  Profile: default
Kernel Version: 4.9.85-38.58.amzn1.x86_64
Operating System: Amazon Linux AMI 2017.09
OSType: linux
Architecture: x86_64
CPUs: 1
Total Memory: 993.2MiB
Name: ip-172-31-11-19
ID: J7FY:XV4I:XVQE:STLY:AXXC:K4KJ:U64D:OZGB:GJQF:VO3A:LL5C:YLST
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): false
Registry: https://index.docker.io/v1/
Labels:
Experimental: false
Insecure Registries:
 127.0.0.0/8
Live Restore Enabled: false
```

# やってみた

以下で実施。

```bsah
# docker exec で bash を起動
$docker exec -it 865052a7af6f bash

# dd コマンドを実行
$dd if=/dev/zero of=/dev/null &
[1] 96

# bash を終了
$exit
```

これでOK.
確認

```bash
# docker stats で高い値
$docker stats 865052a7af6f
CONTAINER ID        NAME                                                               CPU %               MEM USAGE / LIMIT     MEM %               NET I/O             BLOCK I/O           PIDS
865052a7af6f       ecs-console-sample-app-static-10-simple-app-fa82a99aa2d39edd7600   99.64%              6.668MiB / 256MiB     2.60%               1.67kB / 0B         7.24MB / 4.1kB      0

# dd プロセスの %CPU が99.2
$top
 - 01:46:21 up 35 days,  3:09,  2 users,  load average: 0.44, 0.13, 0.04
Tasks: 121 total,   3 running, 118 sleeping,   0 stopped,   0 zombie
Cpu(s): 32.9%us, 67.1%sy,  0.0%ni,  0.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   1017056k total,   704388k used,   312668k free,   259880k buffers
Swap:        0k total,        0k used,        0k free,   235320k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
19330 root      20   0  4264  700  620 R 99.2  0.1   0:34.16 dd

```

EC2(t2.micron。これは vCPU が1) を使っていたが CPUUtilization メトリクスについてはずっと100%となっていた。
DjangoのMTVという考え方

プログラミング言語のフレームワークとしては、依然にLaravelやRailsが人気ですが、グローバルに見てみると、じわじわとPython勢が勢力を増しているように感じます。

Pythonで使われるフレームワークがFlask、そして、Djangoですね。

Flaskの方がよりシンプルで覚えやすいという声が多いですが、Djangoはその反面、リッチなコンテンツでセキュリティも強いと言われています。
あと
Youtube,　Dropbox,　Instagramなどが代表的なDjangoで作られたアプリケーションですね。

今回はそんなDjangoを包括的に理解するための根幹となる、MTV（モデル・テンプレート・ビュー）という考え方についてみていきたいと思います。

LaravelやRailsではMVC（モデル・ビュー・コントローラー）という考え方が使われているので、Djangoを使い始めた頃は私も理解するのに苦労しました。

しばらく使ってみて、やっと本質的なところがみえてきたので、シェアしたいと思います。

**元記事**
[DjangoとMTVの考え方について](https://just-python.com/article/article-django-mtv)

##そもそもなんでフレームワークを使うのか

Djangoに限らず、どんなフレームワークを使うにしろ、バックエンド言語でウェブサイトを作るということはそこにデータベースが必ず関わってきます。

MySQL, PostgreSQLなどが主な人気データベースですが、そのデータベースと連携することで写真、記事、動画、その他、ユーザーが入力した情報などを扱っていくわけですよね。

そして、データベースが絡んでくると基本的にはHTML・CSS・Javascriptだけではデータベースとの連携が取れなくなるため、少し厳しくなってくる。

そこで登場するのが、フレームワーク。

####ブログを作りたい、写真を共有したい

そのためには投稿された記事や写真を格納しておくためのデータベースが必要になってくる。

そして、その情報をユーザーのみている画面に持ってこなければいけない。

そこでサーバーサイドで活動するバックエンド言語を活用したフレームワークが登場というわけです。


##MTV（モデル・テンプレート・ビュー）という考え方

そもそもRailsやLaravelではMVC（モデル・ビュー・コントローラー）という考え方が採用されています。

MTVはざっくり言ってしまえば、TのテンプレートがMVCのビューを、VのビューがMVCのコントローラーの位置に属しています。

とはいうものの、全く同じであるとは言えず、MTV（モデル・テンプレート・ビュー）という考え方をざっくり覚えておきましょう。


##モデル

モデルは簡単に言えば、データベースと連携が取れる場所。

Djangoでアプリを作ると自動で生成されるmodel.pyがこれに該当します。

一例ですが、models.py　の記述の一例をあげてみます。

'''
from django.db import models
from django.contrib.auth.models import User


class Picture(models.Model):
    pub_date = models.DateTimeField()
    image = models.ImageField(upload_to='images/')
'''

classに続く場所がモデルです。　pub_dateやimageの部分では日にちと写真を扱っています。つまり、このクラスを呼び出せば、いつでもデータベースからこれらの日にちと写真を、扱うことができるのです。

しかもIDは自動生成されているので、そのIDを指定することで任意の写真を引っ張ってくることが可能なのです。

##ビュー

そして、次がビューの考え方。　Laravelなどに慣れていると、ビューの捉え方に戸惑うと思いますが、このビューはDjangoの考え方でいうと、モデルで引っ張ってきた情報をどのようにみせるかを記述していくところになります。

views.pyというファイルでDjangoが自動生成してくれるファイルです。

見せ方という点で、pythonのコードがここでは大活躍します。

If文やWhile文、リスト、その他どのような構文も見せ方という意味ではここで扱うことができるようになります。そして関数化することで次のテンプレートに渡すことができるのです。

さらにビューの場所では、関数ごとにどのHTMLファイルに情報を渡すのか、を指定します。それによりそれぞれの関数をテンプレートに紐付けていくことになります。

##テンプレート

テンプレートはMVCでいうビューにあたります。

簡単にいうと、HTMLファイル。つまり、ダイレクトにスクリーンに反映されるコードですね。

templatesというフォルダの中に＊＊＊.htmlという形で置き、CSSやjavascriptを用いて、さらに見栄えをよくしていくということになります。

このテンプレートでは、モデル（models.py)から直接情報を持ってくることはできません。

必ずビュー(views.py)を通して、関数化、パッケージ化されたデータをテンプレートで扱うことになります。

今回は説明しませんが、htmlの中で、特殊な記述で、{{ }} や {% %} の間に記述することで関数をビューから引っ張ってくることができます。

この一連のつながりを料理である、うどんに例えるなら、

まず、モデルの部分で、うどんの原材料となる小麦粉系を調達しにいきます。

ビューの部分ではそれをこねて、成形して、湯がいていきます。

テンプレートの部分で出汁や他の材料等と合わせてうどんが完成するというわけですね。


##まとめ
　
Djangoは非常にリッチなフレームワークです。そして、何よりその利点として、数値計算や機械学習といった様々なPythonの機能をそのままWebに反映できるというところではないでしょうか？

近年、AIというワードが頻繁に使われるようになってきました。それを簡単に扱うことのできるPython。そして、それをWebに反映させることができるのはPythonのフレームワークの魅力なのかな、と思っています。

以上、もう一度簡潔にまとめなおすと、モデルがサーバーとの連携。ビューがサーバーで抜きだしてきた情報の関数化。テンプレートで関数化された情報を反映。

もちろん、Djangoには他にも多くの設定があり（Settings.py,　urls.py)、デプロイのためにはそれらの知識も欠かせませんが、まずはMTVという考え方を知ることで、実装がグッとわかりやすくなります！
IoT

#様々なIoT
少し前からよく聞くIoTですがいろいろな技術があることが分かったのでまとめたいと思いました

#IoTとは
IoTとはInternet of Thingsの頭文字を取った単語
日本語では一般的に「モノのインターネット」と呼ばれています
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/249275/4919e6a0-6fba-e4d2-028e-5872ceded452.png)

#身近なIoT
身近なもので言えばエアコンです
家に帰る前に自分のスマートフォンからエアコンのスイッチを入れ、
帰宅したときには快適な温度になっているというものです
自動車分野では自動車とスマートフォンを接続することにより、カーナビを利用しなくても道順を知ることができたり、車内で音楽を楽しむことができたりするスマートデバイスの活用が進められています。

#AmazonダッシュボタンもIoTデバイス
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/249275/ed4fe5df-cd23-d7c2-f3ee-90f4caa868b2.png)
ボタンを押すと、即、対象商品の注文が完了する仕組みです。2017年8月現在の取り扱い商品は100種類を超え、さらに増え続けています。
#IoTはこれからも進化し続ける
IoT技術はこれからも進化し続けるといわれています
ITの技術の進化とともに様々なことができるようになると思います
Android Studio3.2の「Migrate to AndroidX」を試す


## やりたい事

AndroidXパッケージを試したい
↓
せっかくなので、Android StudioのAndroidX変換機能を試してみたい！

AndroidXについてはGoogle Developerのブログを読むべし
[Google Developers Japan: AndroidX の紹介](https://developers-jp.googleblog.com/2018/05/hello-world-androidx.html)


## 環境
```
Android Studio 3.2 Beta 2
Build #AI-181.5281.24.32.4860949, built on June 26, 2018
JRE: 1.8.0_152-release-1136-b04 x86_64
JVM: OpenJDK 64-Bit Server VM by JetBrains s.r.o
macOS 10.12.6
```

- Android Studio 3.2のベータ版をインストール済み
  - 2018/07/05時点では3.2ベータ版でのみ「Migrate to AndroidX」が使用可能
- Androidプロジェクトは作成済み

## 準備

今回使用するプロジェクトはこれ
https://github.com/banbara23/AAC-Sample/tree/coroutine

- まだAndroidX変換前の状態
- KotlinでAACアーキテクチャ + Retrofit2 + Croutineを試したプロジェクト


## 変換→失敗

ではさっそく変換してみる

Android Studioでプロジェクトを開いて、Refactor > Migrate to AndroidX

![スクリーンショット 2018-07-05 12.26.49.png](https://qiita-image-store.s3.amazonaws.com/0/52227/ecb082c5-f261-56fd-bd30-439936c07af9.png "スクリーンショット 2018-07-05 12.26.49.png")

と選択したところ...

何かメッセージがでた

![スクリーンショット 2018-07-05 15.11.52.png](https://qiita-image-store.s3.amazonaws.com/0/52227/877b8f51-8fc3-3a0e-31c8-b5040da5b024.png "スクリーンショット 2018-07-05 15.11.52.png")

どうやら必要条件があるらしく
- compileSdk 28 が必要
- project gradle plugin version 3.2.0　が必要

この条件をクリアするようプロジェクトを修正する必要がある。

## 修正

compileSdkを `28` へ変更

```diff:app/build.gradle
 android {
-    compileSdkVersion 27
+    compileSdkVersion 28
```

project gradle plugin version を `3.2.0-beta02` に変更

```diff:build.grade
     dependencies {
-        classpath 'com.android.tools.build:gradle:3.1.0'
+        classpath 'com.android.tools.build:gradle:3.2.0-beta02'
```

[コミットログ](https://github.com/banbara23/AAC-Sample/commit/5a393bbe1dbf292fd201debfea3c0d54c0d05c82?diff=unified)

これで必要条件を満たすことができたはず

## 変換→成功

再度、Refactor > Migrate to AndroidX

![スクリーンショット 2018-07-05 12.26.54.png](https://qiita-image-store.s3.amazonaws.com/0/52227/0d8a7201-35f1-0056-9792-9ddb50a31fd8.png "スクリーンショット 2018-07-05 12.26.54.png")

migration前の確認ダイアログが出てきた。
チェックONでzip形式でプロジェクトのバックアップも可能らしい。

[Migrate]を押すと、AndroidXに変換する候補の一覧が出てきた

![スクリーンショット 2018-07-05 12.29.06.png](https://qiita-image-store.s3.amazonaws.com/0/52227/6f212b07-fa0f-942b-0079-039cbd66b2ad.png "スクリーンショット 2018-07-05 12.29.06.png")

ここでAndroidXに変換したい箇所を選択できるらしい。

今回は全選択してして、[Do Refactor]を押した。

![スクリーンショット 2018-07-05 12.31.02.png](https://qiita-image-store.s3.amazonaws.com/0/52227/a4f8be7c-85b5-c393-587e-5d1b98d48034.png "スクリーンショット 2018-07-05 12.31.02.png")

おお、パッケージが`androidx`に変換されてる！

git diffで見てみる

![スクリーンショット 2018-07-05 12.32.03.png](https://qiita-image-store.s3.amazonaws.com/0/52227/36330f32-ff5c-be65-aeda-73c9be260046.png "スクリーンショット 2018-07-05 12.32.03.png")

build.gradleのライブラリのバージョンまで最新に変換されていた。
（kaptも！）

コミットログを見ると分かりやすいはず
[Migrate to AndroidXのコミットログ](https://github.com/banbara23/AAC-Sample/commit/3c02f8cb4dfd58c6b78c04847b55b9f4ae20bc2f)

ちなみに、SyncもビルドもバッチリOKだった。

## 結論

Android Studioの機能で一括変換してくれるのはかなり楽

人の手でAndroidXパッケージに変えるよりも速いし、ミスもなさそう

しかし、`compileSdk 28`　かつ `project gradle plugin version 3.2.0` をクリアしているプロジェクトが世の中にどれだけあるんだろうか？

また、このAndroidX変換機能のためにcompileSdkを変更するというのも...

いずれは compileSdkが28以上が当たり前の時代がきた時、この「Migrate to AndroidX」が役に立つ日が来るかもしれない。
やらかしたメモ

#目的
やらかしたしょうも無いことを記載する。
以下の構成で記載する
###タイトル[年月日]
- 状態
- 原因
- コメント


###セルフの罠に引っかかる(web.Releace.comfog)[20180705]
- 状態
 - デバグ時では正常に動いているのにwebApp発行すると途端になぞのエラーが発生していた問題。
- 原因
 - タイトルどおりのweb.Releace.comfog機能のせいでした。
- コメント
 - 完全なやらかしだが、これを昔のDBにしたまま発行を繰り返していたためだ。
当時画期的だなと入れたものにまんまと引っかかる……忘れぬようにせねば。

 - もちろん現状は影響でないようにコメントアウトしてますヨ・・・

###読みづらい(ファイル名)[20180705]
- 状態
 - プロジェクトを構成しているファイル名が読みづらい
- 原因
 - ファイル名の頭になぜかverの記載をしている。
 - ver変わるたびに書き換えるつもりなのだろうか・・・・・・。
- コメント
 - 昔良かれと思ってやったことって結構だめなのが多い。
いまだと絶対にやらないなぁ・・・ｗ

###うわ見つけちゃったゼhogehage[20180705]
- 状態
 - テスとコードのままで作成している箇所発見
- 原因
 - デバグ中に発見メール発送処理で使ってた・・・・・・。
- コメント
時間があるときに直そう。

###FileZilla出の文字化け[20180706]
- 状態
 - アップロードしたファイル(日本語込みのjpgファイル)が読み込めない
- 原因
 - FileZilla上では正常に記載されていたが、格納サーバーには文字化けしたファイルが格納されていた。
- コメント
 - 文字コードをカスタム[SJIS]にして修正。
 - そもそも日本語名使わなかったら良いわけで・・・・・・

###ファイル(画像)をアップロードしたのに更新しない・・・？[20180706]
- 状態
 - アップロードしたプロジェクトのファイル(画像)が表示されない、右クリックからリンク取得しても反映前のもののなっている。
- 原因
 - 古いキャッシュが残っている模様。
- コメント
 - キャッシュの更新。
Cognos Analytics 11.0.12 新機能紹介

#Cognos Analytics 11.0.12 リリース
2018/6/29にCognos Analytics 11.0.12がリリースされました。

今回は小さなリリースだったようで、Blogで紹介されている新機能は以下の2つのみです。

#ダッシュボードのリセット
ダッシュボードでナビゲーション・パスとか、色々な手段で分析を行い、ふと頭がこんがらがってしまい、分析開始時点に戻りたい場合のために、ダッシュボードのリセット機能が追加されたようです。

まあ、つまりダッシュボードの保存時点に戻るという事なので、一回閉じて開き直すのと同じ事なのかなと思いますが、そこを一発でできる機能という感じのようです。

#ダッシュボードの多言語対応
ユーザーの個人別設定にある、「コンテンツ言語」により翻訳先言語が決まるようですが、ダッシュボードの中で使用されている単語を、他の言語では何と記載するかをCSVファイルベースで登録しておけるようです。
こちらの方は、今度CA 11.0.12の環境を作った後にやってみて、再度フィードバックしますね。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/147246/cf00d6a0-e688-8852-b88b-0bde4c357c2c.png)

簡単ですが、Cognos Analytics 11.0.12がリリースされました、というお知らせでした。

#参考
**New Release Alert! Cognos Analytics 11.0.12 is Available**
https://www.ibm.com/communities/analytics/cognos-analytics-blog/new-release-alert-cognos-analytics-11-0-12-is-available/
富士通PRIMERGYのBIOSやFWを更新してみよう

検証サーバを使って色々と作業をする前に久しぶりにBIOSやファームウェア類を最新化しておきます。その流れをここに記しておきます。

まずは必要なファイルをダウンロードしましょう。
http://azby.fmworld.net/app/customer/driversearch/ia/drviaindex?

今回は
PRIMERGY オンボードCNA ファームウェア 11.2.1194.36アップデートツール
PRIMERGY RX2540 M1 BIOS1.35.0 / iRMC9.08F SDR3.73 アップデートツール
を落としました。

それぞれ
F1026176.exe
F1025366.exe
を実行すると、同一フォルダに色々と解凍されます。

今回は既にESXiをインストールしてしまったためWindowsやLinuxのようにOS上からは行なえません。より汎用的でオンラインのままできるiRMCのWEB画面からやってみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/115778/d702683d-e75a-685d-b785-5f151128bee4.png)

Remoteフォルダの中にある「RX2540M1_BIOS1350_Remote.UPC」を選んで指示に従うだけです。簡単ですね。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/115778/c62d39a4-7ea3-ad97-3332-f82ba370f4d5.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/115778/f07223c7-5121-4796-bbcb-0f02052b358e.png)BIOSファームウェアのアップデートが開始されました。アップデートを続行するにはシステムの再起動が必要です。

と表示されたら、再起動しましょう。同じくiRMCの電源制御から再起動してビデオリダイレクションで眺めているだけでOK。
こんな風に適用しています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/115778/659412ee-6193-5aa4-f036-0f30b1275794.png)

画面はBIOS更新後です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/115778/a0a36b69-1912-985c-cafb-d6ec5d470d89.png)


iRMCも同様です、簡単ですね。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/115778/b0fd270b-8a70-1320-0b01-48cb766bce38.png)
Let's Encryptを使ってSSL設定の覚書(ubuntu + nginx)

#はじめに
決済導入のためにサイトをSSL化した時の覚書です。

#実装
##1.nginxに設定する

https証明書を発行するとき、 
http://<domain>/.well-known/acme-challenge/ にアクセスすることで認証を行うため、ここに設定を置いておかないと404エラーなどになってしまう。

```/etc/nginx/conf.d/server.conf
server {
    ...

    location ^~ /.well-known/acme-challenge/ {
      default_type "text/plain";
      root /usr/share/nginx/html;
    }
```

##1.443ポートを通す

```
$ sudo ufw allow 443
```

##2.証明書をとる

```
git clone https://github.com/letsencrypt/letsencrypt.git
cd letsencrypt
$ ./letsencrypt-auto certonly --webroot -w /usr/share/nginx/html -d hoge.com
```

##3.確認する

```
$ sudo ls /etc/letsencrypt/live/hoge.com

>この下にpemが配置
cert.pem  chain.pem  fullchain.pem  privkey.pem  README
```

```/etc/nginx/conf.d/server.conf
server {
    listen 443;
    ....
 	ssl on;
    ssl_certificate /etc/letsencrypt/live/hoge.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/hoge.com/privkey.pem;
```

5.httpもhttpsにredirectしておく

```/etc/nginx/conf.d/server.conf
server {
    listen 80;
    server_name hoge.com;
    #return 301 https://hoge.com;
    return 301 https://$host$request_uri;
}
```


6.localで起動する場合、thinを使うと便利。

```
$ gem install thin
$ bundle exec thin start --ssl -p 3001

https://localhost:3001
```
EndNoteで複数のレコードのReference Typeを一挙に変更する

## 状況
* EndNoteのレコード（reference）編集は、基本、１アイテムずつ。
* `Tools`＞`Change/Move/Copy Fields…`を使うと、表示されているすべてのアイテムの任意のフィールドを一斉に編集できるが、「Journal Article」や「Book Section」といったReference Typeはフィールドではないので、この方法では一斉に変更できない。

## 方法
* `References`＞`Show Selected References`や、一次的にGroupをつくって対象ファイルを入れるなどして、Reference Typeを変更したいファイルだけが表示されている状況をつくる。
* `Edit`＞`Find and Replace…`を実行。
  * こちらの`Select a field…`プルダウンメニューには、Reference Typeが含まれているので、選択する。
  * 変更対象のReference Type名と、変更後のReference Type名を入力して「Change」をクリック。
    * （X8では）Reference Type名がプルダウンメニューで表示されるような親切設計にはなっていないので、変更前後のReference Type名を正確に入力する必要がある。予め確認してコピペできる文字列を用意しておくと吉。
九九の表示プログラム

<h1>for文を使って九九を表示</h1>
今回は、C言語でfor文を使って九九が表示できるプログラムを作った。
for文を二つ使い2重ループを使ってる。
そもそも、2重ループって何？
2重ループとは、for文を2つ使って繰り返しの中に繰り返しを書くことができます。
繰り返しができるので便利です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/249283/c9f2eded-1fc8-4312-6079-678944ca65c9.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/249283/c8c28353-4af9-70ce-4bee-3158d4465490.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/249283/62e9c483-6664-4cc1-a04c-3b9c6dad8b91.png)
SSHの鍵を設定してLinuxに接続する

# はじめに

LinuxにSSHで毎回ID/PASS入力するのが面倒なので、鍵交換で接続できるようにします。
ID/PASS方式でSSH接続できていることが前提です。以下を参考にさせていただきました。

* [鍵交換方式によるssh接続](http://kazmax.zpp.jp/linux/lin_sshrsa.html)

# 環境

* 接続元:Windows10
* 接続先:上記のHyper-Vで動いているDebian([ここ](https://qiita.com/amama-nagigi/items/9a80484da7daf392a6d7)で作ったもの)
* 接続クライアント:WinSCP + PuTTY

# 手順

流れとしては、以下の手順で進めます。

1. PuTTYgenを使用して秘密鍵、公開鍵を作成
2. 接続先マシンの設定変更
3. 公開鍵を接続先マシンに配置

## 秘密鍵、公開鍵の作成

### 鍵の作成
[PuTTYgen](https://www.putty.org/)を使用して鍵を作成します。
「generate」をクリックして、マウスをぐりぐり動かすと鍵が出来ます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/174324/3221b1b4-0085-ae3a-5250-c25a65ca88e1.png)

出来ました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/174324/7580d695-d22c-aaa8-f1a9-be25b35dc26b.png)

### 秘密鍵の保存
「Save private key」で秘密鍵を保存しておきます。ここでは`id_rsa.ppk`として保存します。

秘密鍵を保存する際、パスフレーズを入力しないと警告が出ます。
パスフレーズは「秘密鍵を使うためのパスワード」みたいなもので、ログイン時に秘密鍵と合わせてパスフレーズが必要になります。今回はそもそもそのパスワード入力が面倒だから鍵交換方式にしようとしているので、パスフレーズは空欄のまま警告を無視して秘密鍵を保存します。

### 公開鍵の保存

公開鍵は「Save public key」ではなく、画面に表示されているキーをコピペしてテキストファイルに張り付けます。`Public key for pasting into OpenSSH authorized_keys file:`と書いてあるところの下の部分ですね。
右クリックして「すべて選択」してから`Ctrl+C`でコピーするのがよいかと。また、後々のためにファイル名は`authorized_keys2`にしておきます。

鍵が出来たのでPuTTYgenは閉じてOKです。

## 接続先マシンの設定

接続先のLinuxでは以下の設定が必要です。

* 鍵交換方式のSSHログインを許可する設定
* 作成した公開鍵の設定

### 鍵交換方式のSSHログインを許可

`/etc/ssh/sshd_config`を編集し、設定を変更します。
以下の2行を探してコメントアウトを解除。

```config:sshd_config
PubkeyAuthentication yes
AuthorizedKeysFile	.ssh/authorized_keys .ssh/authorized_keys2
```

### 作成した公開鍵の設定

先ほど作成した`authorized_keys2`を、`/home/[ログインするユーザー]/.ssh/`以下にコピーします。
中身はただのテキストファイルなので、viなどでコピペしてもいいし、WinSCPでコピーしてもいいです。

### SSHの設定を反映

以下のコマンドでsshdを再起動し、設定を反映します。

```sh
$ sudo service sshd restart
```

## 接続

WinSCPでホスト名とユーザー名を指定します。パスワードは空欄に。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/174324/96314570-53ac-f95c-c108-efb0068cffa6.png)


設定→SSH→認証で、作成した秘密鍵をWinSCPに設定。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/174324/9ecd59d9-aec5-acd2-ec0b-b0ef6183d423.png)

これで接続できます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/174324/0617a377-ca0b-95f1-d0b1-871428b21d8c.png)

PuTTYでもパスワードが求められなくなりました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/174324/61081e22-640f-65aa-8075-756c0b569633.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/174324/6d7cf74f-0de0-5f1b-befb-93b8778dae3f.png)

## その他

### rootユーザーによるSSHログインを許可

まず、`sshd_config`を編集してSSHログインを許可します。以下のコメントアウトを解除。

```config:sshd_config
PermitRootLogin prohibit-password
```

次に、公開鍵を配置します。
rootユーザーのホームは`/root`です。公開鍵設定済みのユーザーでログインし、公開鍵を`/root/.ssh`以下にコピーします。

```sh
$ sudo mkdir /root/.ssh/
$ sudo cp .ssh/authorized_keys2 /root/.ssh/
```

### ID/PASS方式のログインの禁止

これも`sshd_config`を編集すればOK。以下をnoに変更。

```config:sshd_config
PasswordAuthentication no
```

# おわりに

これで、PuTTYで毎回パスワードを入力しなくて済むぞー！
[Symfony][Monolog]特定のレベルのログは常に出力しつつ、エラー発生時は更に詳細なログを残す方法

## この記事の目的

- Symfony3.4
- Monolog
- Apache

上記の構成で

- ERROR発生時はDEBUGログ以上を出力
- INFOログは常に出力する

のようにログ出力を設定する必要があったのですが、
ググってもそのまま流用できるような情報が無かったので残しておきます。

## `FingersCrossedHandler`でログ出力レベルを柔軟に

`FingersCrossedHandler`を使用すれば、
特定のレベルを超えた場合のみログを出力することができますが、
デフォルトの設定だと正常終了時にログが何も出力されません。

常に出力したいログレベルがある場合は、このハンドラーのオプションで
`passthru_level`を指定する必要があります。

また、

> ERROR発生時はDEBUGログ以上を出力

こちらを満たすには
`fingers_crossed`の`action_level`に`error`を指定、
`nested`の`level`に`debug`を指定する必要があります。

以下、具体的な設定例になります。

### `config.yml`に記述した内容

```
monolog:
    handlers:
        main:
            type: fingers_crossed
            action_level: error
            handler: nested
            passthru_level: info
        nested:
            type: rotating_file
            path: '%kernel.logs_dir%/app.log'
            level: debug
            max_files: 7
        console:
            type: console
            process_psr_3_messages: false
```

### 参考

http://yonishiy.hatenablog.com/entry/2016/07/03/185402

> さらに
> ERROR以上のログが落ちた場合はINFOログ以上を出したいが、NOTICEログは常に出したいという場合があると思います。
>
> FingersCrossedHandler の constructor を見ると、常にログを落とす最低限のログレベルを指定できるようです。

Symfonyの`MonologExtension`では

https://github.com/symfony/monolog-bundle/blob/30a70a206c108dd50b1038a463edd63b2c433b9b/DependencyInjection/MonologExtension.php#L309-L350

この辺で`FingersCrossedHandler`の設定をしていて、
常に出力したいログのレベルについては、
`passthru_level`で設定できることがわかります。
macでスペイン語入力をするとき覚書

# スペイン語のアクセント記号入力の覚書
しばらくスペイン語を入力していなかったので、アクセント記号の付け方がすぐに思い出せなかったのでメモ。USキーボード。


### 母音（a,e,i,o,u）につくアクセント記号
上がりアクセント
「option」 + 「e」 + 「a」 = á

### ñ（エニェ）に使うティルデ

「option」 + 「n」 + 「n」 = ñ

### ¡! 感嘆符 signo de exclamcíon

「option」 + 「１」　 = ¡

### ¿? 疑問符 signo de interrogacíon

「option」 + 「shift」 + 「/」　= ¿
C言語　九九を表示

###始めに、、、
課題で出てきたので、九九を表示させたいとおもいます、、、

###ソースコード
```ruby:qiita.rb
#include<stdio.h>
int main()
{
	int i,j;

	for(j = 1; j<= 9;j++)
		for(i=1;i<=9;i++)
			printf("%d*%d=%d\n",j,i,j*i);
	getchar();
	return 0;
}
```
結果はこんなかんじ、、、、
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/249279/b6adae9a-bce2-ddf9-c18f-724dad6f758f.png)
9×9までずっと下に続いてます
###さいごに、、、
それでは、、、さらば！！
jQuery、マウスオーバーで色変化

##やってみよう！


デモイメージ↓
![download.gif](https://qiita-image-store.s3.amazonaws.com/0/268363/7e209146-9efb-b291-f945-d7b337c8dcc0.gif)

以下コードです。

```html:html
<div id="typo">マウス</div>
```

```css:css
#typo {
    background-color: #64bcfc;
    color: #fff;
    font-weight: bold;
    font-size: 150px;
    text-align: center;
    line-height: 500px;
    height: 500px;
}
```
```javascript:jQuery
//マウスオーバーしたときの色を指定
$("#typo").on("mouseover",function(){
    $("#typo").css({
        color: "#4dc0b2",
        backgroundColor: "#ffc042"
    });
});

//マウスアウトしたときに元の色に戻る
$("#typo").on("mouseout",function(){
    $("#typo").css({
        color: "",
        backgroundColor: ""
    });
});
```
Symfony 2.7.3 SonataAdmin 任意の画面のカスタマイズ

## サービスの定義に使うhtmlを明記

編集画面に表示要素を追加するとします

```app/config/services.yml
  #
  # 管理画面 会員管理
  #
  sonata.admin.member:
    class: AppBundle\Admin\MemberAdmin
    tags:
      - { name: sonata.admin, manager_type: orm, group: "項目", label: "会員" }
    arguments:
      - ~
      - AppBundle\Entity\Member
      - ~
    calls:
      - [ setTranslationDomain, [AppBundle]]
      - [ setTemplate, [edit, admin/member/edit.html.twig]]
```

setTemplate で admin/member/edit.html.twig を定義

## 編集画面のhtmlを用意

```app/Resources/views/admin/member/edit.html.twig
{% extends 'SonataAdminBundle:CRUD:base_edit.html.twig' %}
```

下記のファイルを参考に、必要に応じてブロックをオーバーライドする

```
vendor/sonata-project/admin-bundle/Resources/views/standard_layout.html.twig
vendor/sonata-project/admin-bundle/Resources/views/CRUD/base_edit.html.twig
```

サンプル

```twig
{% extends 'admin/base_edit.html.twig' %}

{% block form %}
{{ parent() }}
{% if admin.id(object) is not null %}
        <div class="col-md-12">
            <div class="box box-success">
                <div class="box-body">
                    <div class="sonata-ba-collapsed-fields">

                      <div class="form-group">
                        <label class="control-label">
                          年齢
                        </label>
                        <div class=" sonata-ba-field sonata-ba-field-standard-natural  ">
                          {{ object.age }}歳 ({{ object.birthday|date("Y年m月d日生まれ") }})
                        </div>
                      </div>

                      <div class="form-group">
                        <label class="control-label">
                          購入履歴
                        </label>

                        <div class="sonata-ba-field sonata-ba-field-standard-natural">
                          <table class="table table-bordered table-striped">
                            <thead>
                              <tr class="sonata-ba-list-field-header">
                                <th>注文番号</th>
                                <th>注文日時</th>
                                <th>売上金額</th>
                              </tr>
                            </thead>
                            <tbody>
                              {% for order in object.memberOrders %}
                              <tr>
                                <td><a href="{{ path('sonata_order_show', {'id': order.id}) }}">{{ order.orderId }}</a></td>
                                <td>{{ order.createdString}}</td>
                                <td>{{ order.totalString|raw }}</td>
                              </tr>
                              {% endfor %}
                            </tbody>
                          </table>
                        </div>
                      </div>
                    </div>
                </div>
            </div>
        </div>
{% endif %}
{% endblock %}

```
比較対象の文字列が同じか判定するプログラム　C#

#判定するプログラム文字列
判定するプログラム

```csharp
using System;
namespace sample

{

    class Program
    {
        static void Main(string[] args)
        {
            string a = "abc";
            string b = "abc";

            if (a == b){
                Console.WriteLine("等しい");
            }
            else{
                Console.WriteLine("等しくない");
            }
        }
    }
}
```

実行結果

```text
等しい
```

もし等しくなかったら「等しくない」と表示します
【Laravel5.3】テーブルを結合した後に該当のidレコードだけを抽出する

##テーブル構造
・usersテーブル
id | username | user_img

・itemsテーブル
item_id | user_id | title | content
##結合
コントローラファイル内の記述。
前のページから受け取ったitem_idを取得して、複数のテーブルからデータを抽出したい場合。
例えば、ECサイトのTOPページにて商品クリックされる->商品詳細画面を表示　みたいな動きをイメージ。

    public function index(Request $request){
      
      $items = Item::select()
                ->leftjoin('users','users.id','=','items.user_id')
                ->where('item_id',$request->item_id)
                ->get();
      return view('itemIndex', ['items'=>$items]); 
      
    }
上から順に。
・selectメソッドで、itemsテーブルを呼び出し
・usersテーブル、usersテーブルの中のidと、itemsテーブルのuser_idが等しいレコードをガッチャンこする。
・whereメソッドで、item_idがイコールitem_id（requestは前のページからPOSTでvalueを受け取っている）
・取得して$items（<-変数名なので自由に変えれる）へ入れる。
・itemIndexページ（ページ名なので自由に変えれる）を表示して、itemsとして変数を渡す。

そうするとitemIndexのページ内で、itemsとして全てのカラムを利用することができる。
例えば、itemIndex.blade.php内で、こんな感じに使う。

    <p>商品タイトル：{{ $items->title }}</p>
    <p>内容：{{ $items->content }}</p>
    <p>出品者：{{ $items->username }}</p>
    <p>プロフィール画像：{{ $items->user_img }}</p> 

ちなみに、コントローラの記述は特にきちんとインデントを揃えて記述することをお勧めする。
様々なテンプレートでは、アロー（->）が横続きになって一行で記述されているやつも多い。
最初そのせいでコードの意味がわからなかったが、改行したらすぐに明快になった。
上記のコードを見てもらったら想像できるとおり、テーブルはもっと複数結合することも可能。
##おまけ
ちなみに、今回「users」テーブルと「items」テーブルのカラム名は全てユニークにしている。
通常は、itemsテーブルの
"item_id"
これを単なる"id"と名づけたいところ。

しかし、これでやってみたところ、
テーブル結合した後に"id"が二つ重複して存在することになるようで、
"id"をうまく取得できなかった。
なので、今回はカラム名をユニークにしている。

テーブルが多くなるのとこのやり方は汎用性に欠けてくるので最適解ではないはず。
idがかぶる時の対処法は、別記事にて調べてみてください。
WireSharkの利用方法

自分用のメモです。

# 分割されたパケットキャプチャのマージ方法
Wiresharkの画面にまとめてドロップすればマージされる。

# フィルタリング
|key|val|説明|
|---|-----|-------------|
|tcp.flags.syn|1 or 0|SYNフラグの有無|
|tcp.flags.fin|1 or 0|FINフラグの有無|
|tcp.flags.reset|1 or 0|RSTフラグの有無|
|tcp.port|ポート番号|ポート番号でフィルタリング|
|tcp.srcport|送信元ポート番号|送信元ポート番号でフィルタリング|
|tcp.dstport|送信先ポート番号|送信先ポート番号でフィルタリング|
|ip.src|送信元アドレス|送信元アドレスでフィルタリング|
|ssl.handshake.type|1 or 2|1:Client Hello<br>2:Server Hello|
Redisの特徴について容易にまとめてみた

Redisというものがどういったものなのか
出来るだけ容易にまとめてみました。　

# Redis入門

## Redis とは何か

- Redis は、キーと５種類の値型の対応関係を格納する非常に高速な非リレーショナルデータベース(NoSQL)である

#### 非リレーショナルデータベースがリレーショナルデータベースと比較して有利な点
- ビックデータに強い  
  - 大量のデータが高速に入ってくる場合、非リレーショナルデータベースは、分散アーキテクチャに基づいて構築されているため、１つまたは、複数のデータベースサーバーもしくはノードが停止しても、システム内の他のノードがデータを失うことなく運用を継続でき、高い耐障害性が実現している
- データモデルが柔軟  
  - リレーショナルデータモデルは、テーブル間の定義された関係に基づき、それらのテーブルはあらかじめ決まったカラム構造によって定義されている。そのため、大量のデータを扱うとき、スケーラビリティとパフォーマンスの面で問題がある。  
一方、非リレーショナルデータモデルは、柔軟なデータモデルとなっているため、構造化・準構造化・非構造化データを問わず、安易に扱うことができる。

### memcachedとの比較
- 類似点
  - キーから値へのマッピングを格納することが可能
- 相違点
  - Redisは２つの異なる方法で、ディスクに自動的にデータを書き出すことができる。  
  - ４種類のデータ構造を格納できる。
  - 主データベースとして使うことも、他のストレージシステムの補助データベースとして使うこともできる。

#### 要素の削除方法
- memcached  
  - ブラックリストを使って、要素を隠し、読み出し/更新/書き込み(あるいはデータベースクエリーとmemcachedへの書き込み)の対象にならないようにする

- Redis  
  - `SET`を使い、要素を直接削除する

要素の削除の観点では、Redisを使うほうが、コードが短く、わかりやすくなる。また、高速になる(データを更新するためにデータベースを読み出す必要がなくなるので)

## Redisのデータ構造
値は以下５種類のデータ構造のなかのどれか１つ

- STRING
- LIST
- SET
- HASH
- ZSET
Java で Json を標準ライブラリだけで処理したいときに使うコード


ポイント
JVM標準で使えるライブラリにJavaScriptのエンジンがありますので、それを利用します。

【追記1】
↓こちらに改良版があります。
Java で Json を標準ライブラリだけで処理したいときに使うコード（改良版）gson 不要
https://qiita.com/oyahiroki/items/006b3511fc4136d02ad1

【追記2】
Java 17では Script Engine の除外にともない、この技は利用できません．
まあこの記事が必要な方はもうしばらく Java 8 だと思いますが。。

```java
package script;

import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;

public class JsonUtil {

	public static Object get(String json, String code) {
		// Get the JavaScript engine
		ScriptEngineManager manager = new ScriptEngineManager();
		ScriptEngine engine = manager.getEngineByName("JavaScript");
		String script = "var obj = " + json + ";";
		try {
			engine.eval(script);
			{
				return engine.eval("obj." + code);
			}
		} catch (ScriptException e) {
			e.printStackTrace();
			return null;
		}
	}
	// 使い方 / How to use
	public static void main(String[] args) {
		String json = "{'test':'this is test','test2':{'test3':'value3'}}";

		{
			Object value = JsonUtil.get(json, "test");
			System.out.println(value);
		}
		{
			Object value = JsonUtil.get(json, "test2.test3");
			System.out.println(value);
		}

	}

}


```

出力結果

```
this is test
value3
```
ゲーム作成の教本って小難しくて意味不明だからゲーム制作の基礎解説してみる(4)

ゲーム作成の本って小難しいし要領を得ないのでゲームの内容を解説します。

書くのが若干面倒になってきましたが、最近でも記事にいいねがつくので約半年ぶりに続きを書きます。

[第一回はこちら](https://qiita.com/OrotiYamatano/items/cb9819ea9f1815886879)
[前回はこちら](https://qiita.com/OrotiYamatano/items/c65d2f38e22ab8b7ce61)

#今回話すこと

- ゲームの処理ついてです

#タスク

ゲームにはタスクというものが存在します。 [^1]

タスクはオブジェクト指向言語のクラスのようなものです。
じゃあ、なぜココでクラスに置き換えて説明しないのか？
それはC言語でもタスクが作れるからです。

タスクは初期化と実行で構成されています。
実行は処理実行と描画実行の2つに分かれます。

初期化関数:
>タスクが呼ばれた直後に呼ばれる処理です。 [^2]

実行関数:
> 初期化後、タスクは毎フレーム実行を行う処理です。 [^3]

タスクは終了処理を書かない限り、延々と実行され続けます。
また、タスクは何個も呼ぶことができます。

わかりやすい処理で言うとシューティングの弾です。
シューティングの弾一つがタスクになっており、
自機の生成処理からタスクを起動すると自機の指定の位置で初期化された弾が
決まった動きで推進します。
敵やオブジェクトに弾があたるか画面外に出るまで弾は推進処理を続けます。
また、同時に出せる弾の数はプログラムで指定しない限り限度はありません。

# タスクの処理を関数型で書くとこんな感じ

```
void init(){
 //関数ポインタの配列内を実行
 //実行したら配列から消す
}

void exec(){
 //関数ポインタの配列を処理
}

void main(){
  for(;;){
     init();
     exec();
  }
}
```

#実際にタスクの実行処理で何をしているか
タスクの実行処理の中は座標位置を決めたり、物によっては衝突判定をしていたりしてます。
本来画面に画像を写すには、ポリンゴンを描画する必要があります。
それを映像として動かすには毎フレーム表示位置をずらすしたり、表示画像の変更する必要があります。
また、単純に表示するだけだと描画の際、映していた画像が残像として残ってしまいます。
そういった理由から、描画クリア処理も毎フレーム走らせています。

描画する順番を決めておかないと、本来手前に表示したいものが後ろに表示されたりしてしまう。
だから、どの順番で処理するかも決めてあげないと、いけません。[^4]
「半透明のオブジェクトがうまく表示されない」などのバグが発生した場合は、描画処理の順番を考慮しないといけません。
描画順などは念頭の置いておくといいと思います。

#もう少し知りたい方はコチラとか読むといいと思います
ゲームエンジンの中の話
https://www.slideshare.net/MasayoshiKamai/ss-55986522

#まとめ
今回はゲームの処理について解説しました。
Unityでは、オブジェクトおくだけで、できちゃう部分ですが
実際にはMonoBehaviourにて上記のような処理が行われているわけです。
抽象クラス様様ですね。
次回はメモリについて話せたらいいなぁ……。

[^1]: ここで言うタスクはUnityなどのゲームエンジンではオブジェクトと呼ばれることが多いです。私は私の師匠がタスクと呼んでいたので、そう呼んでるだけです。正式名称ではないと思います。多分C++のタスクシステムからの由来だとは思いますが……
[^2]: Unityで言うところのStartです
[^3]: Unityで言うところのUpdateです
[^4]: まぁ描画周りはゲームエンジンが勝手にやってくれるので、気にしなくても大丈夫ですが
Go言語のテスト


ディレクトリ構成
cal/calc.go
cal/calc_test.go


```go:calc.go
package calc

func sum(a, b int) int {
	return a + b
}

func minus(a, b int) int {
	return a - b
}
```


```go:calc_test.go
package calc

import "testing"

func TestSum(t *testing.T) {
	if sum(1, 2) != 3 {
		t.Fatal("sum(1,2) should be 3, but doesn't match")
	}

	if sum(4, 9) != 12 {
		t.Fatal("sum(4,9) should be 13, but doesn't match")
	}
}

func TestMinus(t *testing.T) {
}
```

テストの実行

```bash
go test -v ./calc
```

```shell-session
=== RUN   TestSum
--- FAIL: TestSum (0.00s)
	calc_test.go:11: sum(4,9) should be 13, but doesn't match
=== RUN   TestMinus
--- PASS: TestMinus (0.00s)
FAIL
FAIL	_/Users/bob/calc	0.010s
```

テストのカバレッジを確認

```
go test -cover ./calc
```

```shell-session
--- FAIL: TestSum (0.00s)
	calc_test.go:11: sum(4,9) should be 13, but doesn't match
FAIL
coverage: 50.0% of statements
FAIL	_/Users/bob/calc	0.011s
```
Mac OS Sierra (10.12.x)  allow apps download from anywhereを有効にする

### 標準で許可されていないアプリケーションをインストールすると出るエラー

```
xxx.app is damanged and cant be opened. You should move it to the Trash
```

- このアプリを許可するために`serurity & privacy`のところで設定を変える必要がある
- 具体的にはallow apps download from `anywhere`を設定する必要がある。
- でも、、、、

### そもそもその選択肢がない

- `System Preferences` > `Security & Privacy`> `General`を開く
- 下の方に`Allow apps downloaded from:`とあってオプションが二つある。

```
[] App Store
[] App Store and identified developers
```

この二つしか選択肢がない！と思って調べたらちゃんと解決法があった


### 解決

- 以下のコマンドを使う

```
sudo spctl --master-disable
Password:
```

- その後再び`System Preferences` > `Security & Privacy`> `General`を開くと`Anywhere`を選べるようになっている。
RDS for PostgreSQLでのログ出力について

## はじめに
ログ出力上、関係するパラメータグループの項目に`log_statement`と`log_min_duration_statement`があると思います。
この関連がいまいち理解できていなかったので、確認のためにまとめました。

## 早見表

| **log_statement** | **log_min_duration_statement** | **出力内容** |
| :---: | :---: | :---: |
| none | - | ログ出力なし |
| - | -1以外の数値 | 指定された値を上回る実行時間を要したクエリ、および実行時間がログに出力 |
| none | -1以外の数値 | `log_min_duration_statement`に有効な値を指定されている場合は、ログにクエリが出力 |
| all | -1以外の数値 | `log_statement`が出力したクエリは`log_min_duration_statement`の出力には含まれない |


## 参考リンク
[https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/USER_LogAccess.Concepts.PostgreSQL.html](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/USER_LogAccess.Concepts.PostgreSQL.html)

[https://www.postgresql.jp/document/9.6/html/runtime-config-logging.html#guc-log-statement](https://www.postgresql.jp/document/9.6/html/runtime-config-logging.html#guc-log-statement)


[https://www.postgresql.jp/document/9.6/html/runtime-config-logging.html#guc-log-min-duration-statement](https://www.postgresql.jp/document/9.6/html/runtime-config-logging.html#guc-log-min-duration-statement)
jQueryで外部CSVファイルをロードする

外部CSVファイルからデータを取得して、javascriptで操作したい場合がある。そんなときには、jQueryと[jquery.csv.js](https://github.com/evanplaice/jquery-csv/)を使うのが最も簡単である。

ところが、この方法を紹介しているサイトがいくつかあるのに、紹介されているコードを実行しても動作しなかった。これは、jquery.csv.jsのバージョンアップや開発環境の変化のためである。そこで、現在の時点（2023-04-13）で動作するコードを紹介する。


### jquery.csv.jp の環境変化
まず、jquery.csv.jpに起きた変化を上げる。他サイトのコードが動作しなかった原因である。

#### $.csv()(data) は使えない
jquery.csv.jsの現在のバージョンは1.0.21である。バージョンアップのため、他サイトで紹介されている

```javascript
var csv = $.csv()(data)
```

のようなコードは使えなくなっている。以下のように置き換える。

```javascript
var csv = $.csv.toArrays(data)
```


#### 開発場所
以前はGoogleのサイトで開発されていたようだが、現在はGitHubに移動している。

 https://github.com/evanplaice/jquery-csv/


#### CDNサイトの場所
最新版のURLは以下である。

 https://cdnjs.cloudflare.com/ajax/libs/jquery-csv/1.0.21/jquery.csv.min.js


#### $.get()でdataTypeを指定する
こちらは、jquery.csv.jsではなくjQueryの問題だが、$.get()でdataTypeを指定する必要がある。他サイトでdataTypeをつけていないコードがあったが、これを省略するとparseerrorが出る場合がある（ブラウザやjQueryのバージョンによるので、必ずエラーになるわけではない）。

```javascript
$.get(csvfile, readCsv);  -->  $.get(csvfile, readCsv, 'text');
```


### コードの例
以上に対応したhtmlのコード例をリスト1に示す。なお、test.csvはリスト2のようになっている。図1はブラウザ画面のスクリーンショットである。

```html:リスト1
<!DOCTYPE html>
<html lang="ja">
<head>
	<meta charset="utf-8">
	<script src="https://code.jquery.com/jquery-3.6.0.min.js"
	  integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4="
	  crossorigin="anonymous"></script>
	<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-csv/1.0.21/jquery.csv.min.js"></script>
	<script>
		function readCsv(data) {
			var target = '#csv-body';
			var csv = $.csv.toArrays(data);
			var insert = '';
			$(csv).each(function() {
				if (this.length > 0) {
					insert += '<tr>';
					$(this).each(function() {
						insert += '<td>' + this + '</td>';
					});
					insert += '</tr>';
				}
			});
			$(target).append(insert);
		}
		var csvfile = 'test.csv';
		$(function(){
			$.get(csvfile, readCsv, 'text');
		});
	</script>
	<link rel='stylesheet' href='list.css'>
</head>
<body>
	<table>
		<caption>紫陽花の名所</caption>
		<thead>
			<tr><th>名前</th><th>場所</th><th>種類</th><th>株数</th></tr>
		</thead>
		<tbody id='csv-body' />
	</table>
</body>
</html>
```

```text:リスト2
"恋し野の里あじさい園","和歌山県橋本市",30,6000
"矢田寺","奈良県大和郡山市",60,8000
"吉野山","奈良県吉野郡吉野町",,4000
(以下略)
```

<img style='margin-bottom: 0' src='https://qiita-image-store.s3.amazonaws.com/0/52659/233fdd86-b74b-9bae-0071-b6f67cf44817.png' /><div style='margin-top: 0'>図1 スクリーンショット</div>

### 変更履歴
* 2023-04-20: CDN におけるバージョンを修正（1.0.11 -> 1.0.21）
* 2021-12-08: jquery.csv.js のバージョンを修正（1.0.11 -> 1.0.21）
jquery.js のバージョン（3.5.1 -> 3.6.01.0.21）およびintegrityを修正
* 2020-10-14: jquery.csv.js のバージョンを修正（1.0.08 -> 1.0.11）
* 2019-12-27: jquery.csv.js のバージョンを修正（1.0.5 -> 1.0.8）
* 2019-10-19: jquery.jsのCDNについて、[jQueryサイト](https://code.jquery.com/)の指定に従って、&lt;script&gt;ノードの記述を変更
* 2019-08-26: jquery.csv.js のバージョンを修正（0.8.9 -> 1.0.5）
:placeholder-shown疑似クラス


## :placeholder-shown

プレースホルダーが表示されている要素 という擬似クラスです
input や textarea を指します
何か入力してプレースホルダーが表示されなくなるとスタイルが当たらなくなります

IE,edgeでは利用不可

```
<input placeholder="名前を入力" class="name">

.name:placeholder-shown {
  opacity: 1;
  color: #ff0000;
  background: #f0f0f0;
  font-weight: bold;
  border: 2px solid red;
}
```

## ::placeholder

プレースホルダーのテキストの疑似要素です。
::before や ::after の疑似要素はコロンが1つでもいいのですがこれは2つ必要。


```
<input placeholder="住所を入力" class="address">

.address::placeholder {
  opacity: 1;
  color: #ff0000;
  background: #f0f0f0;
  font-weight: bold;
  border: 2px solid red;
}
```

https://codepen.io/anon/pen/pKarrd

:not()とtransform　を利用することで下記のような動きのある入力フォームも作成できます。

https://codepen.io/anon/pen/ZRNygG
初めてのRuby on rails各種バージョンを調べる [Memo for neko]


<h1>Railsを学んでいる時にバージョンを知りたい時のメモです。*[Mac用]</h1>

<p>まずは，ご自身のパソコンでターミナルを開きます．
次に，以下のコマンドをコピペ（唱える）と情報ができてきます．

・Ruby のバージョンを調べる

```terminal:terminal
ruby -v
```

・RubyGems　のバージョンを調べる

```terminal:terminal
gem -v
```

・Rails　のバージョンを調べる

```terminal:terminal
rails -v
```

・Git　のバージョンを調べる
　> ```git --version```

```terminal:terminal
git --version
```
スキル申請時におけるアカウントリンク設定の注意点


Alexa で外部 API と連携するためには、アカウントリンクを利用する必要があります。

[今日の新刊](https://www.amazon.co.jp/Satoshi-Kondo-%E4%BB%8A%E6%97%A5%E3%81%AE%E6%96%B0%E5%88%8A/dp/B07DT4BDWW) というスキルを開発した際に、Google ドライブを利用するため、クラスメソッドさんが書かれている以下の記事を参考に実装し、申請したのですがリジェクトされてしまいました。

<!--
スキルを開発した際に、Google ドライブを利用するため、クラスメソッドさんが書かれている以下の記事を参考に実装し、申請したのですがリジェクトされてしまいました。
-->

[AlexaでGoogleとアカウントリンクしてみた](https://dev.classmethod.jp/voice-assistant/alexa-account-linking-with-google-apis/)


## どこが問題か？

スキル有効時に最初に表示されるページが、Google の認証ページになってしまう点です。

申請がリジェクトされた際のコメントで以下のように言われました。

> スキルが、アカウントのリンクを使用して、Alexaユーザーとスキルの開発者が提供していないサービスを接続する場合、スキルを有効にした後に表示する最初のランディングページは、スキルのプロバイダーが所有するページにする必要があります。アカウントリンクのすべての要件については、申請チェックリストのテストケース2.3を参照してください。


## どう設定すれば良いのか？

alexa developer console でアカウントリンクを設定する際に **認証画面のURL** を自身で管理するページにします。アカウントリンクを行う API の認証ページへはページ内にリンクを用意してユーザーのクリックにより遷移できるようにしておきます。

### サンプル

用意するページのサンプルを記載しておきます。

```oauth.html
<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width,initial-scale=1">
    <title>アカウントリンク</title>
  </head>
  <body>
    <div>
      <a id="link" href="#">
        アカウントリンクを行う
      </a>
    </div>
    <script>
      function setLink() {
        var url = "https://accounts.google.com/o/oauth2/auth?access_type=offline&approval_prompt=force"
        var target = document.getElementById("link");
        var queryStr = window.location.search.slice(1);
        url += "&" + queryStr;
        target.href = url;
      }      
      setLink();
    </script>
  </body>
</html>
```

**認証画面のURL**にパブリックに配置した上記ファイルへの URL を記載しておくと、Alexa アプリでスキルを有効にした際、このページへリダイレクトされます。その際に、OAuth 認証に必要なパラメータが渡されてくるので、そのまま利用し、サードパーティへのリンクを生成します。

## 参考

- [2.3. アカウントリンクを使用するスキル](https://developer.amazon.com/ja/docs/custom-skills/security-testing-for-an-alexa-skill.html?ref_=pe_679090_102923190#cert-account-linking)
- [今日の新刊スキル](https://www.amazon.co.jp/Satoshi-Kondo-%E4%BB%8A%E6%97%A5%E3%81%AE%E6%96%B0%E5%88%8A/dp/B07DT4BDWW)
Onメソッドでアロー関数を使う場合のthisについて

個人的な復習と健忘録として。

アロー関数内のthisは挙動が変わります。


``` js
//ES5記法
$('#hoge').on('click', function() {
  $(this).hide();
});
```

これをアロー関数で書いた場合

```js
// NG
$('#hoge').on('click', () => {
  $(this).hide();
});

```

これだと動かない。
`$(this)` ← これは undefinedになる


```js
// OK
$('#hoge').on('click', (event) => {
  $(event.currentTarget).hide();
});

```

- ES5記法だと、`on` メソッドの引数に渡した関数内での `this` はjQueryオブジェクトを返す。
- アロー関数の場合、`this` はオブジェクトに関連付けられたメソッドだと、呼び出し元となる関数オブジェクトやコンストラクタを指し、呼び出し元のオブジェクトがない場合はグローバルオブジェクトを指すので実は宣言時のthisが縛られることになる


つまり、イベント対象になっているターゲットを呼ぶことで動く。
eachメソッドとかでも同様。

引き継いだコードに合わせてES5記法で書いていると、
いざアロー関数を書こうと思ったときに忘れがちになるので気をつけましょうというお話でした。