OmniAICreator/Qiita-1.07M huggingface dataset:
LaravelのSeeder実行時に「Class 'Database\Seeders\DB' not found」エラーが出たときの対処法

## 環境
Laravel Framework 8.5.0

## 現象
Seederファイルを用意した状態でSeederを実行するとエラーが発生する

```laravel
$ php artisan db:seed
Seeding: Database\Seeders\HogeTableSeeder

   Error 

  Class 'Database\Seeders\DB' not found

  at database/seeders/ArtistsTableSeeder.php:16
     12▕      * @return void
     13▕      */
     14▕     public function run()
     15▕     {
  ➜  16▕         DB::table('hoge')->insert([
     17▕             [
     18▕                 'user_id'       => '1',
     19▕                 'hoge_name'     => 'hoge',
     20▕             ],

      +8 vendor frames 
  9   database/seeders/DatabaseSeeder.php:18
      Illuminate\Database\Seeder::call("Database\Seeders\HogeTableSeeder")

      +24 vendor frames 
  34  artisan:37
      Illuminate\Foundation\Console\Kernel::handle(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
```

## 原因
コード内でDBファサードを使用しているのにuse宣言していないため

## 詳細
`php aritsan make:seeder HogeTableSeeder`を実行すると以下のSeederファイルが生成されます。

```php:HogeTableSeeder.php
<?php

namespace Database\Seeders;

use Illuminate\Database\Seeder;

class HogeTabelSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        
    }
}
```

DBファサードを使用するときは`use Illuminate\Support\Facades\DB;`を追記する必要があります。

```php:HogeTableSeeder.php
<?php

namespace Database\Seeders;

use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB; // ←これを追加

class HogeTabelSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        // DBファサードを使用してデータ追加
        DB::table('hoge')->insert([
            [
                'user_id'       => '1',
                'hoge_name'     => 'hoge',
            ])
    }
}
```

## 再度実行すると・・・
以下のように成功のメッセージが表示されました。

```
$ php artisan make:seeder HogeTabelSeeder
Seeder created successfully.
```

### 参考
[Laravel 5.5 データベース：シーディング
](https://readouble.com/laravel/5.5/ja/seeding.html)
Rustの個人的な細かい備忘録

# TL;DR
- Python歴2年ほど。最近、Rustを勉強中。
- 他の記事からはあぶれてしまうけど、記録しておきたいことをまとめていきます。
- 随時更新系の記事です。

# 実行環境
**ハードウェア**

|項目|情報|
|:---------|:------------------|
|OS|macOS Catalina(10.15.6)|
|ハードウェア|MacBook Pro (13-inch, 2019, Two Thunderbolt 3 ports)|
|プロセッサ|1.4 GHz クアッドコアIntel Core i5|
|メモリ|16 GB 2133 MHz LPDDR3|

**ソフトウェア**

|項目|情報|
|:---------|:------------------|
|言語|Rust(1.46.0)|

# 1. 不変な変数と定数との違い
Pythonでは、変数はもちろん、定数も変更可能です。というより、変数・定数としての区別は命名規則や開発方針に委ねられています。以下はどちらも変更可能ですが、`CONST`は定数として捉えられます。

```python:python.py
val = "2020"
CONST = "20200923"
```

一方、Rustでは、変数もデフォルトでは不変であり、定数も不変です。変数は、`mut`を付けた場合のみ変更可能になります。また、Rustでは定数を宣言する際に型も一緒に宣言してあげなければなりません。

```rust:rust.rs
// 変数
let val_1 = "2020";
let mut val_2 = "0923";

val_1 = "20200923";  // ×: コンパイルエラー, 不変な変数に再代入している
val_2 = "20200923";  // ◯


// 定数
const val: &str = "2020";  // △: UpperCaseにするよう、Warningが出ます
const VAL: &str = "0923";  // ◯

VAL = "20200923";  // ×: コンパイルエラー, 定数に再代入している
```

変数もデフォルトで不変ならば、変数を使い分ければ良いのではないか？と思いますよね。違いとして、下記の5つがあります。

1. 定数は常に不変。
2. UpperCaseName。
3. 定数には型情報が必須。
4. グルーバルスコープを含む任意のスコープで宣言可能。
5. 定数式のみ設定可能。

## 1.1. 定数は常に不変
定数には、`mut`を付けて可変にすることは出来ません。また、再代入を行おうとするとコンパイルエラーが発生します。

## 1.2. UpperCaseName
上記でも出てきましたが、UpperCaseではない定数名を付けるとWarningが出ます。エラーにはならないようですが、UpperCaseで命名しましょう。

## 1.3. 定数には型情報が必須
変数とは異なり、定数には型情報がないとコンパイルエラーが発生します。

## 1.4. グルーバルスコープを含む任意のスコープで宣言可能
例えば以下のような書き方が可能です。

```rust
const VALUE: &str = "2020";

fn main() {
    const VAL: &str = "0923";
}
```

変数は、スコープ外に出すことは出来ません。上記のような書き方を変数でやろうとすると、コンパイルエラーが発生します。


```rust
let value = "2020";  // ×: コンパイルエラー

fn main() {
    let val = "2020";
}
```

## 1.5. 定数式のみ設定可能
定数には、処理結果や実行時に計算されるような値を設定することは出来ません。処理の如何に関わらず、値は常に一定になるようになっています。

# 2. 変数の上書き「`シャドーイング`」
定数と変数との違いで、`mut`を付けていない変数は不変だとありました。しかし、Rustは下記のような書き方で、変数を「上書き」することが可能です。

```rust
fn main() {
    let x = 5;

    let x = x + 1;

    let x = x * 2;
}
```

また、下記のようなことも可能です。

```rust
fn main() {
    let x = "value";
    let x = spaces.len();
}
```

ただし、下記は出来ません。（なぜ。。。）

---
*追記：2020年09月24日*
@scivola さんから、コメントで教えて頂きました。

シャドーイングとは、**同じ変数名で別の変数を宣言する**とのことです。別の変数扱いとなるため、最初に宣言した際の型とシャドーイング時の型が異なっていても問題が無いそうです。

しかし、下記は一度宣言した変数に異なる型の値を再代入しようとしているため、コンパイルエラーが発生します。

そして、シャドーイングは、（変数のルール通り）スコープ内でのみ有効であり、スコープを外れるとシャドーイング前の値にアクセス可能になります。（@scivola さんからのコメントに参考コードがあります）

---

```rust
fn main() {
    let mut x = "value";
    x = spaces.len();
}
```

# 3. `range`の書き方
Rustでは、`range`の書き方が2種類あります。

## 3.1. ◯以上・△未満の範囲
これは、基本的な`Range`型で、数字の間に`..`を書きます。

```rust:main.rs
fn main() {
    for num in 1..5 {
        println!("{}", num)
    }
}
```

```terminal
$ cargo run
1
2
3
4
```

## 3.2. ◯以上・△以下の範囲
一方こちらは、`RangeInclusive`型で、数字の間に`..=`を書きます。

```rust:main.rs
fn main() {
    for num in 1..=5 {
        println!("{}", num)
    }
}
```

```terminal
$ cargo run
1
2
3
4
5
```

# 参考情報
- [Rust - Variables and Mutability](https://doc.rust-lang.org/book/ch03-01-variables-and-mutability.html)
Yarn: ○○が依存している□□だけをアップデートする

npmパッケージの中で、node-forge というライブラリに脆弱性があったので、それだけアップデートしようとしました。

```
% yarn upgrade node-forge
```

ところが、yarn.lock には何も変化なし。

webpack-dev-server が selfsigned に依存していて、selfsigned が node-forge に依存しているという関係です。

```
% yarn upgrade selfsigned
```

これでも何も起きず。

yarn.lock を直接開き、該当するパッケージの情報を削除してから `yarn install` するとうまくいきました。

```text:yarn.lock
- node-forge@0.9.0:
-   version "0.9.0"
-   resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.9.0.tgz#d624050edbb44874adca12bb9a52ec63cb782579"
-   integrity sha512-7ASaDa3pD+lJ3WvXFsxekJQelBKRpne+GOVbLbtHYdd7pFspyeuJHnWfLplGf3SwKGbfs/aYl5V/JCIaHVUKKQ==

- selfsigned@^1.10.7:
-   version "1.10.7"
-   resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.7.tgz#da5819fd049d5574f28e88a9bcc6dbc6e6f3906b"
-   integrity sha512-8M3wBCzeWIJnQfl43IKwOmC4H/RAp50S8DF60znzjW5GVqTcSe2vWclt7hmYVPkKPlHWOu5EaWOMZ2Y6W8ZXTA==
```

参考: https://github.com/yarnpkg/yarn/issues/4986#issuecomment-395036563
IntersectionObserver 遅延読み込み

# IntersectionObserver

> Intersection Observer APIは直訳すると交差監視APIという名前です。これは要素と要素の交差を検知するAPIになります。(参照: https://ics.media/entry/190902/)

## 従来の遅延読み込み
従来はscrollイベントや
[lazyload](https://github.com/tuupola/lazyload)といったライブラリなどを使って遅延読み込みを行います。

## なぜInterSectionObserverを使ったか

> ・SEO的に良さそうだから
　Googlebotが認識できる
・パフォーマンス的に良さそうだから
　scrollイベントのように絶えず要素の位置を確認することを避けられる
*参照: https://liginc.co.jp/498877

その他にも、個人的に
・ライブラリを読み込まず生のJavaScriptで実装できる
・JavaScriptを書くので実装している感が味わえるのではないか

と思い、今回使ってみました

## 実際に使ってみた
<p class="codepen" data-height="265" data-theme-id="light" data-default-tab="html,result" data-user="nakamoto_yuto" data-slug-hash="qBZLyzX" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="qBZLyzX">
  <span>See the Pen <a href="https://codepen.io/nakamoto_yuto/pen/qBZLyzX">
  qBZLyzX</a> by なかもと ゆうと (<a href="https://codepen.io/nakamoto_yuto">@nakamoto_yuto</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

### 感想
思ったより簡単にシンプルに実装できて楽でした:v_tone4:
生のJavaScriptで書いているので実装感があり楽しかったです。
Babel polyfillでIE対応そのままできてくれないかなーと願っていたのですがさすがにそこまでは無理でした:baby_tone5:
もし,いやbabel polyfillでいけるよ？という方いらっしゃいましたらぜひご教授していただけるととても嬉しいです。

## IE対応
今回は[intersection-observer](https://www.npmjs.com/package/intersection-observer)というnpmを使用し,IE対応を行いました。
npmの[ドキュメント](https://www.npmjs.com/package/intersection-observer)にはいくつか対応の方法が書かれていまして、実際に行なった方法を最初に紹介し、その後にその他の方法を紹介していきます。

### 今回の方法(npmをインストールし対応)

```terminal
//terminalにて intersection-obseverをインストール
$npm install --save-dev intersection-observer
```
インストール後遅延読み込みを行うjsファイルにて

```javascript
import 'intersection-observer'; // intersection-observerをimportし対応。

const lazyLoad = function () {
    // ターゲット指定
    const targets = Array.from(document.querySelectorAll("img[data-src]"));
    const img_path = "data-src";
    const options = {
      // 上下100px手前で発火
      rootMargin: "100px 0px"
    };
.....下記省略
```

もしくは

```javascript

require('intersection-observer'); 

const lazyLoad = function () {
    // ターゲット指定
    const targets = Array.from(document.querySelectorAll("img[data-src]"));
    const img_path = "data-src";
    const options = {
      // 上下100px手前で発火
      rootMargin: "100px 0px"
    };
```

記述量かなり少なく済んだので楽でした！

### HTML内でnpmを読み込み対応

```html
<!-- Load the polyfill first.（IE対応するためのnpmを最初に読み込む） -->
<script src="path/to/intersection-observer.js"></script>
 
<!-- Load all other JavaScript. -->
<script src="app.js"></script> <!-- 遅延読み込みを行うjsファイル -->
```

### モジュールバンドラーにて読み込みを行い対応(Webpack or Browserify)

```javascript
// Require the polyfill before requiring any other modules.
require('intersection-observer');
 
require('./foo.js');
require('./bar.js');
```

## おわりに
IntersectionObserver 他に比べて導入コストもほとんど変わらず楽にできるし,
jsを書いている感覚で楽しいのでぜひ一度も使ってみたことない方いらっしゃいましたら使ってみることをおすすめします！:muscle_tone2:

## 参照記事
[ics.media JSでのスクロール連動エフェクトには
Intersection Observerが便利](https://ics.media/entry/190902/)
[画像を遅延読み込みしてみよう！Intersection Observer編](https://liginc.co.jp/498877)
[lazyload](https://github.com/tuupola/lazyload)
ターミナルとVSCodeに見た目おしゃカスタマイズをしてみた

# TL;DR
- 連休で時間があり、普段はしない~~おしゃれ~~視認性アップ系のカスタムをしました。
- Mac向けの記事です。

# 実行環境
**ハードウェア**

|項目|情報|
|:---------|:------------------|
|OS|macOS Catalina(10.15.6)|
|ハードウェア|MacBook Pro (13-inch, 2019, Two Thunderbolt 3 ports)|
|プロセッサ|1.4 GHz クアッドコアIntel Core i5|
|メモリ|16 GB 2133 MHz LPDDR3|

# 1. ターミナルにテーマを適用
今回は、**`Iceberg`**というテーマを使いました。調べてみると、どうやら定番のテーマらしく、個人的にも気に入りました。

## テーマのダウンロード
[こちらのページ](https://cocopon.github.io/iceberg.vim/)の最下部にあるリンクから、ダウンロードします。

![スクリーンショット 2020-09-23 18.43.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136144/609bff2d-66b5-cb30-496e-dc4cf17ae7aa.png)

ダウンロードしたら、解凍します。解凍後のフォルダですが、自分はホーム直下に、`Iceberg_terminal`という名前で置きました。

## テーマの適用
ターミナルを開いて、環境設定を開きます。

![スクリーンショット 2020-09-23 18.48.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136144/20bf185b-3b5f-4017-d7b8-6dbfc3fc60a5.png)

「プロファイル」タブに移動して、左下にある「歯車」ボタンから、「読み込む」を選択します。先ほど、解凍したフォルダ内にある**`Iceberg.terminal`**を選択します。

テーマの変更はこれで完了です。現在の設定ダイアログは開いたままにしておいてください。

![スクリーンショット 2020-09-23 20.10.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136144/da80c127-fd03-bb0b-10e3-081a7d4f9c23.png)

# 2. フォントの適用
今回は、**`Ricty`**を設定します。

## フォントのダウンロード
`brew install ricty`後のコマンドはインストールが完了すると、**ターミナル上に表示されるので、実行する際にはそちらを参照してください。**

```terminal
$ brew tap sanemat/font
$ brew install ricty

$ cp -f /usr/local/opt/ricty/share/fonts/Ricty*.ttf ~/Library/Fonts/
$ fc-cache -vf
```

## フォントの適用
### ターミナル
先ほどのターミナル設定ダイアログから、「フォントの変更」をクリックします。そこから、`Ricty`を選択すれば完了です。
フォントサイズは好みによりますが、`14` or `18`あたりが良いと思います。

![スクリーンショット 2020-09-23 20.17.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136144/801d5b11-59ef-c398-340b-10e8893a5fea.png)

### テキストエディタ
こちらも、ターミナルと同様に、設定ダイアログからフォントを変更します。

![スクリーンショット 2020-09-23 20.21.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136144/e2d1ef2e-3736-0c38-27f0-07bc15282317.png)


### VSCode
VSCodeも同じ要領で、エディター部分とターミナル部分のフォントを変更します。メニューバーから、Code > 基本設定 > 設定 > 「font」で検索すると、設定箇所が出てきます。

![スクリーンショット 2020-09-23 20.23.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136144/b62ace8a-272d-343d-feaf-534816bc3056.png)

![スクリーンショット 2020-09-23 20.24.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136144/dd81f16e-1d30-ad92-2bcd-1e6c332af5b3.png)

# 3. 表示内容の修正
デフォルトのプロンプトは不要な情報が多かったので、ここも修正します。

```config:.zshrc
export PS1="%F{blue}[%T]%f %F{yellow}%c%f \$ "

# 同じコマンドをヒストリに残さない
setopt hist_ignore_all_dups

# ヒストリに保存するときに余分なスペースを削除する
setopt hist_reduce_blanks
```

```terminal
$ source ~/.zshrc
```

結果、下記のような表示になります。時間・カレントディレクトリのみ！

![スクリーンショット 2020-09-23 20.29.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136144/97de1099-a44a-dd23-b6fb-a9d046cb029d.png)


# 参考情報
PowerVS IBM i 日記(7): サポートに Case で問い合わせる(2)  - IBM Support のポータルとの併用

# サポートに Case で問い合わせる(2)  - IBM Support のポータルとの併用

[前回](https://qiita.com/6onoda/items/48202ef599aca1186b4e) から、ずいぶん時間がたってしまいました。
[前回](https://qiita.com/6onoda/items/48202ef599aca1186b4e) クラウドのポータルからサポートに問い合わせてわかったことがあります。

残念ながら、**現時点**では、サポートは、クラウドのポータルでは完結しないそうです。

# クラウドのポータルと IBM Support のポータルとの併用

**現時点**では、クラウドのポータルと IBM Support のポータルを併用して、サポートをリクエストするそうです。

## Cloud インフラへのサポートは、クラウドのポータルへ

Cloud インフラとしてのサポートが必要な場合は、[前回](https://qiita.com/6onoda/items/48202ef599aca1186b4e) のようにクラウドのポータルから Case をオープンします。
この場合、Case番号は「CS」で始まります。

## OS のサポートは、IBM Support のポータルへ。製品は「IBM i on Cloud」

OSに対するサポートが必要な場合は、[IBM Support のポータル](https://www.ibm.com/support/home/) で Case を起票します。
[IBM Support のポータル](https://www.ibm.com/support/home/) は、PA やオンプレ用の SWMA でのサポートが必要な時に Case を起票するところですね。

[IBM Support のポータル](https://www.ibm.com/support/home/) は、IBM の日本語文書では「サポート・コミュニティ」と表記されています。
詳しくは、こちらをご覧ください。

> [「サポート・コミュニティ」とは](https://www.ibm.com/support/pages/%E3%80%8C%E3%82%B5%E3%83%9D%E3%83%BC%E3%83%88%E3%83%BB%E3%82%B3%E3%83%9F%E3%83%A5%E3%83%8B%E3%83%86%E3%82%A3%E3%80%8D%E3%81%A8%E3%81%AF)

こちらの場合、PA やオンプレ用の SWMA の Case と同様に「TS」で始まるCase番号になります。

この時に重要なのは、**対象製品として「IBM i on Cloud」を選ぶ**ことです。くれぐれも「IBM i」を選ばないようにしてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/1a32be9a-c431-513d-2552-60b639545bdf.png)

この選択で、PowerVS IBM i としてサポートが得られます。

---
2020/09/24 - 当初「IBM Support Community」と表記したものを「IBM Support のポータル」 に変更。「サポート・コミュニティ」の日本語表記について補足

---
当日記のIndexは[こちら](https://qiita.com/6onoda/items/f146c78c0c1bbe905a42)です。

---
許可の無い転載を禁じます。
この記事は筆者の個人的な責任で無保証で提供しています。
当記事に関してIBMやビジネスパートナーに問い合わせることは、固くお断りします。
MySQLの基本的な関数

###COUNT関数
行数を取得することができる。

![スクリーンショット 2020-09-23 17.41.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197834/269944a9-8c93-720e-584c-cba27fa6d82b.png)

````sql
-- count関数の引数に*を渡した場合、nullのレコードもカウントされる
select count(*) from Shohin;
````

![スクリーンショット 2020-09-23 17.46.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197834/beedde8c-83cd-9a59-31d9-dca479c0b8f9.png)

````sql
-- 引数で列名を渡した場合、対象の列がnullのレコードはカウントされない
select count(shiire_tanka) from Shohin;
````

![スクリーンショット 2020-09-23 17.51.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197834/6b0b6e79-fb52-258f-aae5-783654dac8c8.png)

重複を除いてカウントしたい場合、distinctを使用する。

````sql
select count(distinct shohin_bunrui) from Shohin;
````

![スクリーンショット 2020-09-23 18.36.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197834/b4d27db6-43b7-aab0-688e-e5ba3d4cdd6f.png)


###SUM関数
合計を取得することができる。
また、集約関数は引数に列名をとった場合、計算前にnullを除外する。
※count(*)は例外的にnullを除外しない

````sql
select sum(shiire_tanka) from Shohin;
````

![スクリーンショット 2020-09-23 18.17.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197834/81dc006a-23c8-74f0-2590-44a7675a411b.png)

###AVG関数
平均値を取得することができる。

````sql
select avg(shiire_tanka) from Shohin;
````

![スクリーンショット 2020-09-23 18.24.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197834/9e58d95a-8970-6e5b-6490-fd75a1e4d066.png)


###MAX関数、MIN関数
最大値、最小値を取得することができる。
構文はSUM関数、AVG関数と同じだが、
SUM関数、AVG関数は数値型の列に対してのみ使用できる点に対し、
MAX関数、MIN関数は原則的にどのような型の列にも使用できる。

````sql
-- 数値型の列を指定
select min(shiire_tanka) as "最小値", max(shiire_tanka) as "最大値" from Shohin;
-- 日付型の列を指定
select min(torokubi) as "最小値", max(torokubi) as "最大値" from Shohin;
````

![スクリーンショット 2020-09-23 18.33.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197834/40b2b59d-8ba3-a63b-cabc-91a596e5bb95.png)
内包表記

#　内包表記

Pythonには内包表記と呼ばれる記法があります。
内包表記とは、リストコンプリヘンションと同じ意味です。

三種類ありますが、リストの内包表記から説明していきます。
リストオブジェクトとループを利用して新たなリストを生成する構文。
他の言語にはあまりない独特な構文ですが、慣れると非常に便利そして非常に高速というのがメリット

内包表記の基本的な書き方
[式　for　変数　in  シーケンス]


リスト内包表記を使用しない場合

>num_list = [1, 2, 3, 4, 5]
>number_list = []
>for num in num_list:
 >   new_num = num * 2
  >  number_list.append(new_num)
 
>print(number_list)

 >[2, 4, 6, 8, 10]

リスト内包表記を使用する場合

>num_list = [1, 2, 3, 4, 5]
>number_list = [num * 2 for num in num_list ]
>print(number_list)

># [2, 4, 6, 8, 10]

要はリスト内包表記を使うことによって、短くまとまった記載にできるということです。
	

以下のように表記することでif文を使用することも可能です。

[式 for 変数 in シーケンス if リスト要素に対する条件]

>num = “1, 2, 3, 4, a,5"
>number = [int(s) for s in num.split()  if s.isdigit()] 
>print(number)

> [1, 2, 3, 4, 5]

ディクショナリ内包表記

リスト内包表記と同じく、辞書型の要素をまとめて処理することができる。 使い方はリスト内包表記と同じ。

内包表記の基本的な書き方
{キー:for 変数 in シーケンス (if 条件)}

>subject = {‘kokugo’: 75, ‘suugaku’: 64, ‘eigo’: 92}
>num = {point: str(n) + ‘点’ for point, n in subject.items()}
>print(num)
> {‘kokugo’: 75点, ‘suugaku’: 64点, ‘eigo’: 92点}

セット内包表記
集合内包表記とも呼ばれます

セット内包表記の基本的な書き方
{式 for 変数 in シーケンス (if 条件)}

>num_set = {number for number in range(19) if number % 3 == 0}
>print(num_set) 
> {0, 3, 6, 9, 12, 15, 18}

## イテレータとは、

集合の要素に準々にアクセスする場合に使用するインターフェースで、コレクションを繰り返し使うためにあるものです。
リスト、セット、マップなど複数の種別がありますが、イテレータはそれらにアクセスするための仕組みです。
例えば、javaでは、Set#iteratorメソッドIteratorを取りだし、順番に要素を取得しますが、Pythsonではイテレータオブジェクトを使用します。
イテレータを使用することで、要素へのアクセスを記述することが可能です。
Pythonのfor文においてはiterableを範囲にとって、暗黙的にiteratorを利用する点を指して内部イテレータと呼ばれる場合もある。	

※インターフェース
コンピュータで、異なる機器・装置のあいだを接続して、交信や制御を可能にする装置やソフトウェアのこと

※コレクション
リストやSetのように、複数の要素を扱うオブジェクトです。
【Ubuntu 20.04】日付・時計に曜日も表示する

# 曜日を表示する
画面上部中央の時計は曜日も表示できる。

# Tweaksのインストール
ターミナルを開き、次のコマンドを入力してTweaks(GNOMEの詳細設定用ソフトウェア)をインストールする。

```
$ sudo apt install gnome-tweaks
```

# Tweaksの設定
Tweaksを起動し、[トップバー]を選択、[曜日]をONにする。
![Screenshot from 2020-09-23 18-20-03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135111/dad58c5e-ea1d-dcea-21b4-ac9081492a62.png)
下図のように曜日が表示されるようになる。
![Screenshot from 2020-09-23 18-20-19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135111/d648f09b-033e-6fff-ae49-ed830ad71e5a.png)


# 参考
[Ubuntu 20.04 LTSをインストールした直後に行う設定 & インストールするソフト](https://sicklylife.jp/ubuntu/2004/settings.html)
10. 【Android/Kotlin】ライブラリを追加

#はじめに
DreamHanksのMOONです。

前回は動的にViewを追加する方法について説明しました。
[9. 【Android/Kotlin】動的にViewを追加](https://qiita.com/DreamHanks/items/7f2449b01aabf3fe42c7)

今回はライブラリを追加する方法について説明していきます。

#ライブラリを追加する方法
Android Studioにはライブラリを追加する方法が三つがあります。
　１．jarファイルをlibsフォルダに貼り付ける
　２．Project Structureを利用する
　３．gradleに直接経路を書き込む

今回はライブラリ一つを上記の方法で追加していきます。

###１．jarファイルをlibsフォルダに貼り付ける
![2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/708649/c96a4ade-528f-7f4d-75e9-97994f0de0ce.png)
①jarファイルをプロジェクトの「app/libs」パース以下に入れます。

![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/708649/39d4c4cc-ab83-0fd6-f2b1-ac73c55a39ff.png)
②入れたライブラリを右クリックし、「Add As Library」をクリックします。

![4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/708649/1115bc32-8d0d-33ee-83bf-b55e850d3bb5.png)
③「OK」ボタンをクリックします。

![5.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/708649/0c1dc892-8b1f-f40e-e70c-761b34d7da3a.png)
④「③」の作業が終わったら、build.gradleファイルの「dependencies」に写真の青色のように入られます。

⑤以降からはライブラリを使用することができます。

###２．Project Structureを利用する
![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/708649/94891e82-2641-11b8-5524-cc8fdd40593c.png)
①Android Studioで「File⇒Project Structure」をクリックします。

![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/708649/8a3456ed-aaeb-e047-91ea-b6503f1401e2.png)
②「Modules」カテゴリーをクリックし、「+」ボタンをクリックします。

![8.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/708649/bab764b8-dfc9-a97d-e4f3-7d5d6bc12b1b.png)
③項目中に「Import .JAR/.AAR Package」をクリックして「Next」をクリックします。

![9.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/708649/4e469cb8-a179-55f7-ec3d-7169c97db275.png)
④ライブラリのパースを選択し、Subproject nameを作成します。

![10.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/708649/27eb3e4e-61d6-a075-04d2-6fdb57840110.png)
⑤ライブラリのModuleが追加されたことを確認し、OKボタンをクリックします。

![12.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/708649/80b6e82d-4c50-2a29-5581-2776697fee3a.png)
⑥追加したModuleに対するbuild.gradleファイルが生成されたことを確認します。

⑦以降からはライブラリを使用することができます。

###３．gradleに直接パースを書き込む
![11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/708649/1367d009-64d9-1d5e-0891-32035e373594.png)
①build.gradleファイル内のdependenciesにgradleに対するライブラリのパースを作成します。
②「Sync Now」ボタンをクリックしてビルドします。
③以降からはライブラリを使用することができます。

この三つの方法中に「３．gradleに直接パースを書き込む」が一番便利な方法です。

#終わりに
今回はライブラリを追加する方法について説明しました。

次回はToastという通知メッセージについて説明していきます。
[11. 【Android/Kotlin】Toast](https://qiita.com/DreamHanks/items/f35807698c0456a69534)

最新内容については下記のリンク（DreamHanksのブログ）で確認することができます。
[DreamHanksブログ（Android/Kotlinアプリ開発）](http://blog.dreamhanks.com/android-kotlin%e3%82%a2%e3%83%97%e3%83%aa%e9%96%8b%e7%99%ba/)
[UE4C++]クラスの作成

#はじめに
一応前回の続きとして、今回はC++クラスの作成のやり方について記す。

#手順
####1.コンテンツブラウザを右クリック→**新規C++クラス...**を選択
![スクリーンショット (103).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695645/ed922e60-ab64-9665-00b8-f5ac51622d1f.png)
****
####2.親クラスを選択
![スクリーンショット (104).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695645/77fbdec4-9830-69d9-9298-3066be062f5e.png)
****

右上のチェックボックスにチェックを入れると継承できる全てのクラスを表示できる
![スクリーンショット (105).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695645/9d7a4b7b-ba2f-df0a-d267-11094a955130.png)

今回はテストなので、Actorを選択する
![スクリーンショット (106).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695645/5bc3996b-9ef8-9ca0-8704-1a3474e69850.png)
****
####3.ファイル名とパスと指定する
次へを押すと作成するファイル名（オブジェクト名）と保存するファイルパスを指定する画面が表示される。
ファイル名を"TestActor"に変更
![スクリーンショット (107).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695645/651aab0b-83ff-ba3e-909a-82ba9cac19f5.png)

**フォルダを選択**を押す
![dsa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695645/bf768627-f62f-0833-270a-fec0913c219c.png)

エクスプローラーが開くので、
**Object**フォルダを作成→**Actor**フォルダを作成→**TestActor**フォルダを作成
※クラスのファイルを分かりやすいようにフォルダ分けしているので、ここは個人のやり方でOK
![スクリーンショット (108).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695645/17253993-9b9b-adf7-78d5-86ceae87b2f3.png)
![スクリーンショット (109).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695645/4ea66bac-07ff-ece2-5e20-84ac7c77d3d1.png)
![スクリーンショット (110).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695645/115d312b-e64b-de70-aaec-1393cc9a66cc.png)
フォルダーの選択を押す
****
####4.作成
**クラスを作成**を押す
![スクリーンショット (111).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695645/05cb38b7-2660-5b87-c124-8d5548b2fdcd.png)
VisualStudioが開き、作成したクラスのファイルが開く
![スクリーンショット (112).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695645/3354ee9d-ff0f-6567-622c-418601b289dc.png)

これでC++クラスの作成は完了
ソリューションエクスプローラーはこんな感じ
![スクリーンショット (113).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695645/7b67c5c4-d8fe-9731-5c67-ef7908fdfaea.png)

#まとめ
1.コンテンツブラウザを右クリック→新規C++クラス...を選択
2.親クラスを選択
3.ファイル名とパスと指定する
4.作成

#余談
ファイルパス指定が絶対パス指定になっているが、相対パスには出来ないのだろうか。。。

次回はC++クラスのコードの基本形について書く
FlaskでSQLiteからMySQLへ書き換えてみた

FlaskのチュートリアルではSQLiteを用いて掲示板アプリを作られていると思いますが、デプロイする際にMySQLに書き換える必要があったため書き換えたのでそれをここにも残しておこうと思います。

## schema.sqlの書き換え

```schema.sql
DROP TABLE IF EXISTS user;
DROP TABLE IF EXISTS post;

CREATE TABLE user (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  username TEXT UNIQUE NOT NULL,
  password TEXT NOT NULL
);

CREATE TABLE post (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  author_id INTEGER NOT NULL,
  created TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  title TEXT NOT NULL,
  body TEXT NOT NULL,
  FOREIGN KEY (author_id) REFERENCES user (id)
);
```

```db_mysql.py
import MySQLdb
import os

def mysql():

    # 接続する 
    # ローカルでのDB用
    conn = MySQLdb.connect(
        unix_socket = '/Applications/MAMP/tmp/mysql/mysql.sock',
        user='root',
        passwd='root',
        host='localhost',
        db='flask',
        charset='utf8'
    )

    return conn

def create_table():

    conn = mysql()

    # カーソルを取得する
    cur = conn.cursor(MySQLdb.cursors.DictCursor)

    user_drop = "DROP TABLE IF EXISTS user"
    post_drop = "DROP TABLE IF EXISTS post"
    cur.execute(user_drop)
    cur.execute(post_drop)

    # テーブルの作成
    user_table = """
        CREATE TABLE user (
        id INTEGER AUTO_INCREMENT,
        password TEXT NOT NULL,
        username VARCHAR(10) UNIQUE,
        PRIMARY KEY (id)
        )
    """

    cur.execute(user_table)

    post_table = """
        CREATE TABLE post (
        id INTEGER AUTO_INCREMENT,
        author_id INTEGER NOT NULL,
        created TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
        title TEXT NOT NULL,
        body TEXT NOT NULL,
        PRIMARY KEY (id)
        )
    """

    cur.execute(post_table)

    cur.close
    conn.close
```

schema.sqlにはSQLiteでテーブル作成のコードが書かれています。それをdb_mysql.pyにMySQLで書き換えました。MySQLdbを使うため下記コマンドを打つ必要があります。

```
$ pip3 install mysqlclient
```

##  db.pyの書き換え

db.pyを少し書き換えました。flask init-dbコマンドをするとdb_mysql.pyのcreate_table関数が実行されテーブル作成が行われます。

```db.py
import click
from flask import current_app, g
from flask.cli import with_appcontext
from . import db_mysql


def close_db(e=None):
    db = g.pop('db', None)

    if db is not None:
        db.close()

def init_db_mysql():
    db_mysql.create_table()

@click.command('init-db')
@with_appcontext
def init_db_command():
    """Clear the existing data and create new tables."""
    init_db_mysql()
    click.echo('Initialized the database.')


def init_app(app):
    app.teardown_appcontext(close_db)
    app.cli.add_command(init_db_command)
```

以上でテーブルの書き換えが完了したので、あとはデータを入れたり取ってくるコードを書き換える必要がありますね。全部書くのはあれなんで一部抜粋です。


##  blog.pyの書き換え

```blog.py
conn = db_mysql.mysql()
db = conn.cursor(MySQLdb.cursors.DictCursor)
db.execute(
    'SELECT *'
    ' FROM post'
    ' WHERE post.id = %s',  
    (post_id,)
)
posts = db.fetchone()
```
connでDB接続、dbで操作準備、db.executeで操作、db.fetchoneで取り出す。

以上がsqliteからMySQLに書き換える流れです。


# まとめ

若干SQLiteとMySQLでは書き方が違うので多少戸惑った点があったのですが、慣れてしまえば大丈夫でした。間違い等ありましたらご指摘して頂けると幸いです。
Hands-On-Data-Structures-and-Algorithms-with-Rust

Rust入門にはちょうど良い感じのコードを見つけた。
[Source Code:Hands-On Data Structures and Algorithms with Rust](https://github.com/PacktPublishing/Hands-On-Data-Structures-and-Algorithms-with-Rust)
上記は、下記書籍のコードリポジトリ。
[Book:Hands-On Data Structures and Algorithms with Rust](https://www.amazon.co.jp/-/en/Claus-Matzinger/dp/178899552X)

同名のオンラインコースもある様子。
[Udemy:Hands-On Data Structures and Algorithms in Rust](https://www.udemy.com/course/hands-on-data-structures-and-algorithms-in-rust/?utm_source=adwords&utm_medium=udemyads&utm_campaign=LongTail_la.EN_cc.ROW&utm_content=deal4584&utm_term=_._ag_77879424134_._ad_437497333833_._kw__._de_c_._dm__._pl__._ti_dsa-1007766171312_._li_1009314_._pd__._&matchtype=b&gclid=EAIaIQobChMIzZfUlvf-6wIVRteWCh1MfgrAEAAYASAAEgLrsfD_BwE)
SMLの参照型変数の宣言、値の参照及び更新

Standard ML(以下SML)における参照型の利用方法（宣言、値の参照、更新）を記します。

# はじめに
実行環境はUbuntu18.04.5 LTSで、バージョン等は以下の通りです。
$ sml
Standard ML of New Jersey v110.79 [built: Tue Aug  8 23:21:20 2017]

記法等を示す際のメタ変数は[メタ変数名]で示します。
例えば、変数の宣言は、次のように書きます。

val [変数名] = [値]

特に示さない限り、例示を行う場合は上記のsmlコマンドを行った時の入出力を示します。

本記事は私の学習内容をまとめること及びその内容の発信を目的としており、内容の正確性は保証いたしかねますが、間違いの指摘等のコメントは歓迎します。

# 対象読者
SMLを使用して簡単なプログラミングを行ったことがある方を対象とします。変数の宣言、型、関数についてある程度理解していることを前提とします。

# 参照型の利用方法
## 基本
参照型とは、値への参照を示す型のことです。参照型を利用することにより、手続き的な処理を容易に行うことが可能となります。

## 宣言方法
参照型を宣言するときは、次のように書きます。

val [変数名] = ref [値]

以下に参照型を宣言する具体例を示します。

```
- val x = ref 1;
val x = ref 1 : int ref
- val s = ref "qiita";
val s = ref "qiita" : string ref
```

変数xはint型の値1への参照を示し、変数sはstring型の値"qiita"への参照を示します。これらは、int ref型や、string ref型というように表記されます。一般に、t型の値への参照をする型はt ref型となります。考え方はC言語におけるポインタと同様です。

## 値の参照方法
参照型の変数が示す値を参照するには、次のように書きます。[^1]

![変数名]

[^1]: 厳密には、「!」は(t ref->t)の関数として定義されているので、上記は変数[変数名]を関数!に適用していることになります。ここで、tは任意の型を示すものとします。そのため、!と[変数名]の間に空白が存在しても同様に参照できます。

以下に具体例を示します。

```
- val x = ref 5;
val x = ref 5 : int ref
- !x;
val it = 5 : int
- Int.toString (!x + 10);
val it = "15" : string
```

変数xはint ref型であるため、!xはint型の式です。上の例の場合、3行目以降で!xと書くことと5と書くことは同義です。

## 値の更新
参照型変数が示す値を更新するには、次のように書きます。

[変数名] := [値]

以下に具体例を示します。

```
- val x = ref 1; 
val x = ref 1 : int ref
- x := 3;
val it = () : unit
- x := !x * 10;
val it = () : unit
- !x;
val it = 30 : int
```

変数xをint型の値1への参照として宣言し、次に値を3に更新しています。更新前の値は!により参照できるため、5行目のようにxが参照する値を10倍するといった操作も可能です。最終的に、xが参照している値は30に更新されます。

# まとめ
参照型変数の宣言、参照型変数が示す値の参照及び値の更新について記しました。参照型は値が更新されることを前提とした型で、C言語等の手続き型言語の変数と似た方法で使用できます。使用した記法は以下の通りです。

宣言
val [変数名] = ref [値]

値の参照
![変数名]

値の更新
[変数名] := [値]

# 参考文献[^2]

[^2]: 参考文献は、次の形式で示しています。著者名，『書籍名』，出版，初版発行年

大堀淳，『プログラミング言語Standard ML入門』，共立出版，2001
文系SEでも覚えておきたいweb広告用語

# はじめに
Googleアナリティクスの登場でアクセス解析がより身近になりました。
SEには関係ない話だと思っていましたが、導入やデータ集計を~~なすりつけらr~~任せられることが増えました。
そこで最低でもこの用語は知っておいたほうがいい、というものをまとめてみました。
※本記事では、Googleアナリティクスの導入方法、利用例等には触れません。

# 用語集
## PV : Page View
- Webサイトが閲覧された回数
- カウント対象はサイト(ページ)なので、F5アタックで回数の水増しが容易

## セッション
- webサイトへの訪問回数（セッションが切れると再カウント）
- 訪問中の行動としては、サイトの閲覧やイベントの発生など
- セッションが切れる条件は以下のとおり
    - サイト内での行動が30分以上何もないとき
    - 日付けが変わるとき
    - 参照元が変わったとき

## UU : Unique User
- Webサイトを訪れたユーザーの人数
- カウント対象はユーザだが、現状ユニークユーザをカウントすることは不可能　※後述

## UB : Unique Browser
- Webサイトへのブラウザごとの訪問回数
- カウント対象はブラウザ(Cookie)

# それぞれの関係性
## 数値の大小
- PV > セッション >= UB

## PVとセッション
- PVはサイトが閲覧されるたびにカウントされる
- セッションはセッション内(同じサイト)であればカウントされない

|アクション|PVカウント|セッションカウント|
|---|---|---|
|トップ画面の閲覧|1|1|
|詳細画面へ遷移|1|0|
|トップ画面へブラウザバック|1|0|
|別のサイトへ移動|0|0|
|カウント合計|3|1|

## UUとUB
- ユニークユーザ(UU)をカウントすることが不可能な理由
    - 異なるブラウザからアクセスした場合、ブラウザ毎に別ユーザ扱い
    - 異なるデバイスからアクセスした場合、デバイス毎に別ユーザ扱い
    - ログイン必須サイトなどであればログインユーザを元にカウント可能
        - 集計対象サイトがログイン必須であれば実現可能
- サイトにアクセスしているブラウザー数(UB)を、サイトのユーザー数の指標としてレポート
    - UUとUBを混合しているツールは多くあるので注意
    - 1UBを1ユーザと解釈すると実態との間に齟齬が発生
        - Yahoo全体のUB数（1.92億人）が日本の人口を超えている
    - UUとUBで言い方が統一できていないのが原因なので、UU≒UBでも間違いではない

## PVとUB
- 同じPVでもUBが同じとは限らない
- 100PVされたサイトでも以下のようにUBは異なる

|アクション|パターン①|パターン②|
|---|---|---|
|GoogleChrome|25|50|
|FireFox|25|50|
|IE|25|0|
|Safari|25|0|
|PVカウント|100|100|

## セッションとUB
- セッションはセッションが切れれば再カウント
- UBはcookieなのでcookieの有効期限が切れれば再カウント
- セッションとcookieで切れるタイミングが異なるので数値に差が発生

|アクション|UBカウント|セッションカウント|
|---|---|---|
|トップ画面の閲覧|1|1|
|詳細画面へ遷移|0|0|
|トップ画面へブラウザバック|0|0|
|別のサイトへ移動|0|0|
|セッション切れ|0|0|
|再度トップ画面の閲覧|0|1|
|カウント合計|1|2|

# 集計単位
- それぞれの用語の接頭辞に以下を付与
    - 日次：D(Daily)　→　DUU、DUB
    - 週次：W(Weekly)　→　WUU、WUB
    - 月次：M(Monthly)　→　MUU、MUB

# おわりに
広告担当の方が横文字使っていた際はこちらのページを思い出していただければ幸いです。
ちなみにQiitaのviewはPV扱いらしいですがF5アタックはできなかったですw
[Android/Kotlin]コードからtextViewに取り消し線を付ける

# 結論
```kotlin:kotlin
textView.paint.flags = textView.paintFlags or Paint.STRIKE_THRU_TEXT_FLAG // 取り消し線
```

```xml:xml
<TextView
    android:id="@+id/textView"/>
```

`textView.paint.flags = Paint.STRIKE_THRU_TEXT_FLAG`だけだとアンチエイリアスが切れてギザギザになる

# 別解
`paint.flags`は`paintFlags`でもいいらしい

```kotlin:kotlin
textView.paintFlags = textView.paintFlags or Paint.STRIKE_THRU_TEXT_FLAG // 取り消し線
```

取り消し線とアンチエイリアスは個別に指定しても良さそう

```kotlin:kotlin
textView.paint.flags = Paint.STRIKE_THRU_TEXT_FLAG // 取り消し線
textView.paint.isAntiAlias = true // アンチエイリアス
```


# その他
`STRIKE_THRU_TEXT_FLAG`のところ変えれば下線とかもできる
wordpress予約投稿失敗の解決策

#失敗の原因
WordPressのcronは本来の意味でのcronではなく擬似cronを使用しているからです。
擬似cronは指定の頻度ではなく、ユーザーの訪問にトリガーされ、実行されます。
つまり、ユーザーがサイトにアクセスするたびに、WordPressは、実行する必要のある保留中のcronジョブがあるかどうかを確認し実行します。
basic認証があるとこの擬似cronファイルにアクセスしないので失敗します。
キャッシュ系プラグインはWPファイル読み込まないので実行されないので失敗します。

#解決策
そこで主な解決策は下記３つです。

##1.プラグインを使用する
一番簡単なやり方です。

- [Scheduled Post Trigger](https://ja.wordpress.org/plugins/scheduled-post-trigger/)
- [Automatic Post Scheduler](https://ja.wordpress.org/plugins/automatic-post-scheduler/)
- [WP Missed Schedule](https://ja.wordpress.org/plugins/wp-scheduled-posts/)

上記プラグインどれかを選び `ダウンロード→インストール→有効化` で完了です。

##2.basic認証を外す又はサーバIPのみ許可してあげる
basic認証があるとwp-cron.phpにアクセス時に認証出来ないので投稿が失敗します。
なので、サーバのIPのみ許可させると直ります。

```apache:.htaccess
<Files wp-cron.php>
order deny,allow
deny from all
Allow from xxx.xxx.xxx.xxx #WordPress設置サーバのIP
Satisfy Any
</Files>
```

##3.代替Cronを使う

WordPressには予約投稿がうまく動作しない時のために、「代替Cron」という仕組みが用意されているようです。
ルートディレクトリにある「wp-config.php」に以下の記述を追加するだけで有効になります。

```php:wp-config.php
define('ALTERNATE_WP_CRON', true);
```

※上記の1.のプラグインと同時に使うと効かない場合があります。

#参考サイト
https://oxynotes.com/?p=7309
https://ja.wordpress.org/support/article/editing-wp-config-php/#%e4%bb%a3%e6%9b%bf-cron
COCO'S朝食バイキング実施店舗一覧PDFファイルを取得してCSVにする

###Change Log
(2020/10/13, 22:50)default-jdk不要です。削除しました。
(2020/9/24, 05:30)ソート前のsjis版画像を追加しました。
(2020/9/24, 05:30)sort & uniq処理のスクリプトを少し手直ししました。
(2020/9/25, 05:00)sort & uniq処理のスクリプトを少し手直ししました。

##はじめに
[COCO'S朝食バイキング実施店舗一覧](https://www.cocos-jpn.co.jp/menu/morning/morning_viking.html)のPDFファイルを取得してCSVにしてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159724/84a246e0-bedb-ca7e-406d-de661253bceb.png)

###なお
- 本記事ではRaspberryPi 4とPython3.7.3で実行しています。が、そこは大きな依存ポイントにはならず、たいていの環境で動くでしょう。
- また、出力結果確認は楽なWindows上のExcelとテキストエディタで行っていますが、そこもよしなに。

##準備 どこでもいいです
```
$ pwd
/home/dk4130523/scripts/cocos
$ mkdir -p pdf
$ mkdir -p csv
$ pip3 install tabula-py
```

##スクリプト
###pandas2x.py
```
import pandas as pd
import tabula

for p in range(1,5):
    dfs = tabula.read_pdf("./pdf/bvshoplist.pdf", lattice = True, pages = p)
    for df in dfs:
        df.to_csv("./csv/bvshoplist.sjis.csv", index = None, mode = 'a', encoding = 'shift_jis')
        df.to_csv("./csv/bvshoplist.utf8.csv", index = None, mode = 'a', encoding = 'utf-8')
```

###getbreakfast.sh
```
#!/bin/bash
# download latest pdf file
wget -O ./pdf/bvshoplist.pdf https://www.cocos-jpn.co.jp/menu_pdf/bvshoplist.pdf

# convert to csv by pandas and tabula
rm -rf ./csv/bvshoplist.csv
python3 ./pandas2x.py

# sort and uniq if required
cat ./csv/bvshoplist.sjis.csv | sort -t. -k1,1n -k2,2n | uniq > ./csv/bvshoplist.u_s.sjis.csv
cat ./csv/bvshoplist.utf8.csv | sort -t. -k1,1n -k2,2n | uniq > ./csv/bvshoplist.u_s.utf8.csv

# copy to some nice location
cp ./csv/bvshoplist.unique.sorted.*.csv /home/pi/Public/cocos/
```

###chmod +x
```
$ chmod +x ./getbreakfast.sh
```

##実行 トータル20秒くらいです
```
$ ./getbreakfast.sh
--2020-09-23 17:32:10--  https://www.cocos-jpn.co.jp/menu_pdf/bvshoplist.pdf
Resolving www.cocos-jpn.co.jp (www.cocos-jpn.co.jp)... 52.197.112.230, 52.68.53.187
Connecting to www.cocos-jpn.co.jp (www.cocos-jpn.co.jp)|52.197.112.230|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 524703 (512K) [application/pdf]
Saving to: ‘./pdf/bvshoplist.pdf’

./pdf/bvshoplist.pdf
100%[================>] 512.41K  1.39MB/s    in 0.4s    

2020-09-23 17:32:10 (1.39 MB/s) - ‘./pdf/bvshoplist.pdf’ saved [524703/524703]
$
```

##出力結果確認
###保存先
(僕の用途では、ソート&ユニークにしたものだけあれば十分です。ソート&ユニークする前のものも、元の場所に残してあります。今回、ソート&ユニーク後のsjis版とutf8版で、どちらも同じ223行であることのみ確認しました。)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159724/970971a9-7a4c-e5a5-5f6f-56c8a4494b15.png)
###sjisソート前
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159724/f64a32e8-a8e7-ddeb-b24c-85eef5dbd1d8.png)
###sjisソート後 ラズパイで自動ソートしたものをExcelで開いただけの状態
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159724/d642e1e8-32dd-cb88-1641-132c4c154284.png)
###utf8
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159724/9790d918-6ab3-f093-5564-9cf010a98616.png)

##おしまい
本記事の紹介はここまです。この先は用途に応じて適宜。よかったですね。😺💕

##参考
大いに参考にさせていただきました。ありがとうございました。😺💕
[【自動化】PDF内の表をPythonで抜き出す](https://qiita.com/konitech913/items/4ef70e1f7753c824b40f)
CSSのidとclassの使い分け

#プログラミング勉強日記
2020年9月23日
よくCSSでclassを使うが、classの方が複数指定できるし便利なのでは？idを使う必要はないのでは？と思った。なので、idとの使い分けについてまとめる。

#id属性とclass属性とは
　CSSのセレクタ(`h1`, `p`)などでスタイルを指定することはできるが、`h1`や`p`要素は多く利用されるので、同じ要素でも別のスタイルを使用したいときにHTMLのid属性やclass属性を使う。

　CSSはHTMLのどこの部分のなにをどのようにするか指定することができ、書き方は以下のようになる。

```書き方の例
どこの(セレクタ) {
  なにを(プロパティ): どうする(値);
}
```
　このセレクタをid属性とclass属性の属性値(名前)を指定することができ、自由にスタイルを変えることができる。<b>class属性の場合は名前の前に`.`を、id属性は名前の前に`#`をつける。</b>


```html:HTML
<h1>こんにちは</h1>
<p class="red">私の名前は田中太郎です</p>
<h1>こんにちは</h1>
<p class="blue">私の名前は田中次郎です</p>
<p id="green">よろしくお願いします</p>
```

```css:CSS
h1 {
  color: orange;
}
.red {
  color: red;
}
.blue {
  color: blue;
}
#green {
  color: green;
}
```
![0923.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642821/680f1d1b-a34f-8f1d-796d-8ce060f6ef55.png)

#id属性とclass属性の違い
　上で述べたようにid属性とclass属性を指定することで自由にスタイルを変えることができる。どちらでスタイルを呼びだしても結果は変わらないし、<b>読み込み速度も変わらない</b>。

　ただ、<b>class属性は1ページに何度でも使用できるのに対し、id属性は1ページに1度しか使ってはいけない。</b>
　一見id属性は不便なように思うが、規模の大きいホームページになるとCSSが複雑になっていくので、id属性とclass属性を使い分けたほうが編集や修正に便利になる。

　※id属性を複数使っても正しくスタイルが反映される場合があるが、文法的には間違えてるので注意する。

#id属性とclass属性の使い分け
　ここで本題になります。
　class属性は何度でも使用することができるので、頻繁に呼び出すCSSはclassで定義して、一度しか使わないCSSはidで定義する。
　特にid属性は一度しか使わないヘッダーやフッターで使われることが多い。


#参考文献
[idとclassをわかりやすく説明！ゼロから始めるHTML/CSS講座Vol13](https://blog.codecamp.jp/id_class)
[classとidの使い方](https://sakichin.com/chapter02/chapter02_step02_04.html)
cloud9にPostgreSQLをインストールする。

##まずはPostgreSQLをインストール！

```terminal
$ sudo yum install postgresql postgresql-server postgresql-devel postgresql-contrib
```
##インストールしたPostgreSQLを初期化

```terminal
$ sudo service postgresql initdb

#サーバをまっさらにするのがinitdbコマンドです。実行するのは、PostgreSQL の非互換なバージョンアップのときだけです。
```
##PostgreSQL始動！

```terminal
$ sudo service postgresql start

# service  
# start 
```
続いて
##gemfileの編集を行う
場所はlsして見つけてください。

```terminal
  【変更前】　　　　　　　　【変更後】
gem 'mysql3'    →→　　gem 'pg'
```
##database.ymlの編集
上と同じくlsで見ると **config** ディレクトリがあるので、cdで移動、その中にdatabase.ymlがあリます。下記の様に編集する。

```terminal
【変更前・例】
default: &default
  adapter: mysql2
  encoding: utf8
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password:
  host: localhost
```
```terminal
【変更後・例】
default: &default
  adapter: postgresql
  encoding: unicode
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: postgres
  password:
  host: localhost

```
##データベース作成

```terminal
$ rails db:create
```
##マイグレーション適用

```terminal
rails db:migrate
```
マイグレーションとは、DBに保存されているデータを保持したまま、テーブルの作成やカラムの変更などを行うための機能です。まだよくわかりませんw

##参考リンク
[Cloud9の開発環境のデータベースをPostgreSQLに変更する方法](https://qiita.com/yuki_0920/items/94196f34125e4a4b4e93"Cloud9の開発環境のデータベースをPostgreSQLに変更する方法")
プリンターのコマンドラインでの削除を実現！

#1.なぜコマンドラインを用いるのか
会社内のプリンターを更改する際、
利用者の端末１つ１つからプリンタ情報を消していくのはとても面倒です。

そんな問題を抱えたときにいっぺんに削除する方法を
自分用ナレッジとして残します。

#2.どのような動きをするのか
プリンタを削除する際に行うことは、以下になります。
①プリンタ自体の削除
②プリンタドライバの削除

これをパワーシェルで消していきます。
それぞれの情報はpowershellコマンドの下記コマンドでそれぞれ確認できます。
get-printer
get-printerdriver

単純に"remove-printer"と"remove-printerdriver"を組み合わせても実現可能かと思いましたが、
端末内のデバイス一覧にプリンタが残ったままになるので、以下コマンドを採用しました。

#3.パワーシェルでどのように書いたか

####1) 基本的な変数定義

このパワーシェルで定義が必要なのはプリンタ名・ドライバ名程度なので、
その内容を定義します。
あとは削除前の件数カウントの際に使う数値の"1"と、ログファイル用に使う日付データを定義しておきます。

```
$Printer="プリンタ名"
$Driver="ドライバ名"
$ReturnCheck=1
$ExecutionDate=Get-Date -Format "yyyyMMddHHmm"
```

####2) ログの開始を定義
任意の出力先にログを出力していきます。
わかりやすいように日付を末尾に付けます。

```
Start-Transcript ログファイル名_$ExecutionDate.log
```

####3)プリンター削除(判定部分)
削除前に判定を入れます。

Get-WmiObject Win32_Printerコマンドでは、端末内に入っているプリンタ一覧を出力できます。
その結果削除対象をが存在するならば(1以上ならば)削除するように分岐させます。

```
$ResultPrinter=@(Get-WmiObject Win32_Printer  | Where-Object { $_.Name -eq $Printer }).count
```

####4)プリンター削除(削除部分)
上記のcount結果で1件以上見つかった場合に処理します。

rundll32.exeとは、DLL関数を呼び出すために使用します。
この中のprintui.dllを使用するという意味になります。
更にprintui.dllの中でPrintUIEntryを使用します。

それぞれのオプションの意味は以下の通りです。
  /dl ローカルプリンタを削除する
  /n　プリンタ名を指定する

```
if($ResultPrinter -ge $ReturnCheck){
rundll32 printui.dll,PrintUIEntry /dl /n $Printer
echo "該当プリンタ有り"
}else{
echo "該当プリンタ無し"
}
```

####4)念のためのwait設定
検証していたら稀に"プリンタが使用中のため削除できない"というメッセージがあり、
失敗するケースがありました。
その対策としてwaitを仕込みます。

```
Start-Sleep -s 60
```

####5)ドライバー削除
ここから先はプリンタと同じです。
使うコマンドはrundll32ではなく、普通にpowershellコマンドで削除します。
削除判定もプリンタと同様です。

```
$ResultDriver=@(get-printerdriver | Where-Object { $_.Name -eq $Driver }).count

if($ResultDriver -ge $ReturnCheck){
Remove-PrinterDriver -Name $Driver
echo "該当ドライバ有り"
}else{
echo "該当ドライバ無し"
}
```

####6)ログストップ
最後にログ出力を止めます。

```
Stop-Transcript
```

#総括
rundll32を使うという発想に至らなかったのが嵌りポイントでした。
ログ出力や途中のechoなどデバッグ感がありますが、そこは後々の課題になります。
VDIよりもデータレスPC?

【小岩井乳業事例の研究】
リモデ環境整備の一環として、VDI導入より低コストかつ運用負荷の低減の見込めるデータレスPCの導入を行なった同社。
O365との相性も良いとのこと。

◆背景
BCPの一環としてリモデ環境の整備として導入を実施。
BYODも検討されたが、昨今ではPCを所有しない人も多いのでPCの配布という選択をした。

◆環境
VDI導入は300名ほどの従業員へ導入する上で、費用＆運用のコスト面で難しかった。
PC更改のタイミングでOneDriveのポリシーによる利用制約を見直した
ネットワーク管理はグループ全体で行なっているが、PCアップデートに関しては自社での対応が必要だった。社員数に対してWSUS導入が重いため、Unifer CastとAppSelfを導入。アップデート管理や端末内部の管理を行う。

◆決めて
費用＆運用コスト
Waasへの対応
従来のOSへの対応（VDIは不可）
WSUSがなくてもWindowsアップデートへ対応可能
管理者のユーザビリティの良さ
エンドでアプリケーションのインストール可能で情シスの負荷軽減
◆特徴
ローカルデータは強制的にOneDriveへ保存されるため、ローカルへ保存されない
◆どういった環境に合っているか


PassiveDriveによるデータレスPCの導入


*1 BYOD：私物端末の業務利用
C# .NET のDataGridView入力イベントでハマった

おしごとでDataGridViewで一覧表示・編集するアプリを作っていて、タイトルの通りハマった話。

セルに入力があった場合に別の列の値を参照してDBに書込みに行くような処理を書いていた。
DataGridViewは：

 - 列により入力可否を設定　（デザイナー画面で「列の編集」を開き、動作＞ReadOnlyで設定）
 - DataGridViewにKeyDownイベントを設定
 - KeyDownイベントでは入力セルのある行で特定の列の値を取得してアレコレ

こんな感じでやっていたのだけど、どういうわけか入力時に処理が走らない。
そのうえ入力不可の列でキーを叩くとイベントが走っている。（これは想定内で、イベントハンドラで対応しているのでOK）

#ReadOnly:falseの列ではKeyDownイベントが発生しない
ググってみると、どうやらセル入力時にはセルそのものではなくセルの中にTextBoxが配置され、そのTextBoxを編集しているらしい。

【参考】
>DataGridViewでセルが編集中の時にキーイベントを捕捉する
>
>https://dobon.net/vb/dotnet/datagridview/textboxevent.html


でも同じやり方で過去に作った同じ.NET 4.6.1のアプリだと動いているんだよなあ…何が違うんだろう。
ちょっとモヤモヤするけど、とりあえず解決したので備忘録がてら。
Better_errors導入後、エラー画面が変わらない

#better_error入れて見たがエラー画面変わらず
エラー画面をリッチに使いやすくするruby gem "Better_errors"。
リポジトリ見ると、railsであれば素直にbundle installすれば使えるよと書いてあるが
エラー画面は変わらず…


#解決策
以下を追記して解決しました。

```ruby:/config/environments/development.rb
BetterErrors::Middleware.allow_ip! "0.0.0.0/0"
```

▼参考:Dockerコンテナでbetter_errorが働かない
https://github.com/BetterErrors/better_errors/issues/270
▼gitのソースはおそらくここ
https://github.com/BetterErrors/better_errors/wiki/Allowing-access-to-the-console

DockerやVagrantを利用して開発する場合は
railsがbetter_errorsを許可するか判断するので
設定が必要になるそうです。

gitの質疑だとDockerのIPアドレス入れても上手く行かない!と言っているので
じゃあもう0.0.0.0/0にして全てのIPアドレスを許可いた状態にしよう!という話しをしています。

localhostのIPアドレスでもOKなので

```ruby:/config/environments/development.rb
BetterErrors::Middleware.allow_ip! "127.0.0.1/0"
```
これでもいけました。

###因みに　127.0.0.1　とは
ローカル･ループバック･アドレス。
自分自身を表す特別なIPアドレス。localhostのIPアドレスと言ったらこれにあたる。
▼参考
https://www.atmarkit.co.jp/ait/articles/0610/14/news021.html

です。


ご参考までに。
kivy JsonStore でUnicodeDecodeError を解決する

# 問題のエラー
Kivyでstorageモジュールを使ってjsonを扱う際、以下のようなエラーに遭遇した。
※環境はpython3.8 ですが、大した差異はないと思います。

```
   File "C:\programing\project\hoge\main.py", line 33, in _init_load
     self.store = JsonStore('test.json', )
   File "C:\Users\user\AppData\Local\Programs\Python\Python38\lib\site-packages\kivy\storage\jsonstore.py", line 29, in __init__
     super(JsonStore, self).__init__(**kwargs)
   File "C:\Users\user\AppData\Local\Programs\Python\Python38\lib\site-packages\kivy\storage\__init__.py", line 134, in __init__
     self.store_load()
   File "C:\Users\user\AppData\Local\Programs\Python\Python38\lib\site-packages\kivy\storage\jsonstore.py", line 43, in store_load
     data = fd.read()
 UnicodeDecodeError: 'cp932' codec can't decode byte 0x82 in position 85: illegal multibyte sequence
```

親の顔より見たUnicodeDecodeErrorですね。日本語が入ってることが原因ですかね？
このエラーは基本的にopen関数の引数にencoding='utf-8'を追加すれば解決できます。
というわけでstorageモジュールの中でjsonファイルを開く部分をサクッと変更します。
31行目に読み込みを行う関数があるので、そこのopen部分にキーワード引数を追加します。

```kivy/storage/jsonstore.py
def store_load(self):
        if not exists(self.filename):
            folder = abspath(dirname(self.filename))
            if not exists(folder):
                not_found = IOError(
                    "The folder '{}' doesn't exist!"
                    "".format(folder)
                )
                not_found.errno = errno.ENOENT
                raise not_found
            return
        with open(self.filename, encoding='utf-8') as fd:    # ココ
            data = fd.read()
            if len(data) == 0:
                return
            self._data = loads(data)
```

# 結果

正常に読み込むことに成功しました。
日本語はややこしいですね。。。
サクラエディタメモ

便利だと思ったものを書いてメモにするぞ

### エクセルの縦列を横列に並べ替える
サクラエディタに貼り付けて、
置換前：\r\n
置換後：\t
ですべて置換
あとは置換したものを貼り付け

### エクセルの縦列をカンマ区切りにする
置換前：$
置換後：,
のあとに
置換前：\r\n
置換後：

### 小文字→大文字にする
範囲選択して
Ctrl+F7



随時増えます
Rails  ページング機能 [gem kaminari]を導入する流れについてまとめてみた。

#kaminari導入の仕方
#1.Gemfileにkaminariを追加して保存
```rails:Gemfile
gem 'kaminari','~> 1.2.1'
```
#2.kaminariをインストールする
Gemfileに追記できましたら、以下コマンドを実行して、kaminariをインストールします。
`$ bundle install`
さらに、kaminariの設定ファイルを作成します。
以下のコマンドを実行しましょう。
`$ rails g kaminari:config`
最後に、kaminariがページャで利用するテンプレートを作成します。
以下のコマンドを実行しましょう。
`$ rails g kaminari:views default`
#3.ページャを実装する
```Rails:app/views/books/index.html.erb
 <%= @books.each do |book| %>
        :
        :
 <% end %>
 <%= paginate @books %> #このコードを追加
```
```Rails:app/controllers/books_controller.rb
@books = Books.all.page(params[:page]).per(10) #.page以降追加
```
この場合1ページの表示件数が10件まで表示される。

10件以上投稿するとこのように次のページへと分かれる。
<img width="300" alt="アイコン" src="https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F607423%2Fc37a24ff-48dd-bdf7-7322-2a3c34c0d5fc.png?ixlib=rb-1.2.2&auto=format&gif-q=60&q=75&s=485ea57d5348d87cd14e3b99a14ec0c6">
#4.kaminariにBootstrapを適用させる
Bootstrapをすでに導入していれば簡単にkaminariに適用させることができる。

`$ rails g kaminari:views bootstrap3`

Bootstrap4の人は
`$ rails g kaminari:views bootstrap4`

これでapp/views/kaminariフォルダにBootstrap用のViewが生成され、Bootstrap用のテンプレートに適用される。
【Universal Links】apple-app-site-associationのMIMEタイプをapplication/jsonにする

##Universal Linksで使うapple-app-site-associationのMIMEタイプを.htaccessでapplication/jsonにする

```.htaccess
<Files apple-app-site-association>
  ForceType application/json
</Files>
```
参考：[ForceType ディレクティブ](https://httpd.apache.org/docs/2.4/ja/mod/core.html#forcetype)
overflow: scrollが反映されなかった原因

#【目次】
1.overflow:scrollとは
2.原因
3.反省
4.最後に

#1.overflow:scrollとは
親要素の表示範囲から、はみ出した子要素が存在する時、はみ出した分に関してはスクロール表示にすることができるというCSSの1つです。overflowというプロパティに対して様々な値を指定することができ、指定した値の種類によって、はみ出した子要素に対してどのような表示形式を指定するか決めることができます。

#2.原因
widthとheightを指定していなかった為。（表示範囲を決める記述がなかった為）
「overflow」「効かない」といった単語を並べて検索したがヒットせず、初心者向けのoverflow解説記事を読んでいて気付きました。親要素からはみ出した分についての表示形式を定めるプロパティなのに、親要素のサイズが決まっていなければ、はみ出したかどうかの判定も行われていないのでスクロール表示がされないということですね。

#3.反省
###1.エラー原因の検索する前に、公式リファレンスや初心者向けの解説記事を読んでみる。
エラーの原因を直接的に探る検索も大切ですが、そもそもプロパティの使い方を1から読み直すこともエラーを解決する上では大切だと思います。私のような初心者のエラーは基本的な使い方に問題のある場合があります。あまりに基本的すぎるエラーは、現象を直接検索してもエラーの事例としてヒットしないことがあると思いました。

###2.サイズ指定を忘れがち
検証ツールでサイズ指定していない部分を選択しても、コンテンツの分だけサイズがあるように表示されます。しかし、それはコンテンツを空にすれば表示領域は0になってしまうということです。コンテンツを入力しているとサイズが指定されていると錯覚してしまうことがあるので注意する必要があると感じました。
メモをしていなかったので例を出せませんが、サイズ指定をするだけでCSSが反映されないというエラーを解消できた例を他にも経験した記憶があるので、詰まったらサイズ指定を考えてみるというのも1つの方法かと思いました。

#4.最後に
まだまだ初心者で誤った記事を投稿してしまうかもしれないので、変なことを書いている場合は指摘してもらえればと思います。
今後も自分がプログラミングをしていて気付いたことや、エラーの体験談とその解決について投稿していこうと思いますので宜しくお願い致します。
MySQLのselectの基本操作

###あるテーブルの全ての列を出力する

````sql
-- *で全ての列を指定することができる
select * from Shohin;
````

###あるテーブルの特定の列を出力する

````sql
-- select句の後に対象の列名を記述する
-- また、複数ある場合はカンマで区切る
select shohin_id, shohin_mei, shiire_tanka from Shohin;
````

###別名をつける
ASを使用する。
日本語をつけることもできるが、その場合ダブルクォーテーションで囲む必要がある。

````sql
select shohin_id as ID, shohin_mei as "商品名", shiire_tanka as "仕入単価" from Shohin;
````

###重複を除く
distinctを使用する。
nullについても、1つの種類として扱われる。

````sql
select distinct shohin_bunrui from Shohin;
````

複数列の前にdistinctを記述した場合、
複数行の組み合わせが全く同じ行が1つにまとめられる。

````sql
-- 以下の場合、shohin_bunrui、torokubiの組み合わせが同じもののみが1つにまとめられる。
-- 例えばshohin_bunruiの値が同じでも、torokubiの値が同じでなければ1つにまとめられない。
-- distinctは先頭の前にしか書くことができない。
-- そのため、distinct shohin_bunrui, distinct torokubiとは書けない。
select distinct shohin_bunrui, torokubi from Shohin;
````

###条件の指定
whereを使用することで検索条件を指定することができる。

````sql
select * from Shohin where shohin_bunrui = "衣服";
```