OmniAICreator/Qiita-1.07M huggingface dataset:
【初心者】GASで、Webスクレイピング, スプレッドシート保存, メール送信するコードの振り返り

# はじめに
[【初心者】GASで、Webスクレイピング, スプレッドシート保存, メール送信するコード](https://qiita.com/Shin/items/e86ec7d28ddbb340f793)
の振り返り。

作っている時はトライアンドエラーで、

* ググって調査
* とりあえず動かしてみる
* エラー発生

を繰り返しながら、とにかくやりたいことが出来るように進めていますが、
実際にどういうことをやっていたのか、次回同様のことをする時により早く出来るようにざっくり振り返ります。


# 概要 - スクレイピング処理
1. Parserで、ざっくり必要な部分を取得する。
2. 1.で取ってきた、ざっくり部分から、必要な部分を正規表現（new RegExp）でちょいざっくり部分を取得する。
3. 2.で取ってきた、ちょいざっくり部分から、いらない部分を削除（replace）する。

# 詳細
### 1. Parserで、ざっくり必要な部分を取得する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14760/c6f7d818-c797-5dba-54c5-a17b1b6af9ae.png)


### 2. 1.で取ってきた、ざっくり部分から、必要な部分を正規表現（new RegExp）でちょいざっくり部分を取得する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14760/4ad9d48a-1fee-f1a6-6418-6c3525d0f4be.png)


### 3. 2.で取ってきた、ちょいざっくり部分から、いらない部分を削除（replace）する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14760/adbb30b7-ef98-9ebe-2dfc-801db1db0bb7.png)
Rustが敗北！？C++で書かれた新時代のWebアプリケーションフレームワーク「drogon」

つい昨日（日本時間では今日）、TechEmpowerが行っているWebアプリケーションのベンチマーク結果が更新されました。

https://www.techempower.com/benchmarks/#section=data-r19&hw=ph&test=composite

なんと、Round 18ではRustのフレームワーク「actix-web」が2位以下に大差をつけて圧勝していたにも関わらず、Round 19ではさらにそれを上回るライブラリが出現しました。

その名も[drogon](https://github.com/an-tao/drogon)!

名前からして素晴らしいフレームワークの予感がしますが、Rustのactix-webとはどのような点で異なり、またどのようにしてこの速度を達成したのか気になったので調べてみました。

# フルスタックのライブラリ

drogonはフルスタックのWebアプリケーションフレームワークとして実装されています。つまり、（actix-webとは違い）データベースとのやり取りを行うAPIやJSON, ORM, HMRなどさまざまな機能が盛り込まれています。

一方actix-webではWebサーバーを実装するための最低限の機能に関するAPIしか用意されておらず、データベースとのやり取りなどを行う際には外部ライブラリを読み込み、ライブラリ間の橋渡しは自分で実装しなければなりません。これは個人的な推測ですが、actix-webを用いた場合、データベースとのやり取りを行う際に外部ライブラリのAPIとの橋渡しを行うため、Query Builderの事前最適化ができなかったり、あるいはメモリを動的に確保・コピーを行う必要が出てくるために、パフォーマンスの劣化を招いているのではないかと考えられます。

ただしフルスタックのライブラリの場合は、個々の機能に関するAPIが限られているため、少し込み入った処理を行おうとした際に泥沼にハマるケースもあったりするので、何でもかんでもフルスタックにすべきという考えも危険なのではないかと思われます。

# コンパイル時ORM最適化

drogon_ctlというコマンドを使うと、事前にデータベースのテーブルの構造やテンプレートファイルなどを読み込んで、それに対応したC++のソースコードを出力することができます。これにより、テーブルの構造やテンプレートファイルの中身に対応した最適化を事前に行うことが可能となります。

例えば`drogon_ctl create model`というコマンドを使用すると、データベースの中のテーブルの構造をすべて読み込み、それぞれのテーブルに対応したModel Classが記述されたC++ソースを出力します。それぞれのモデルクラスは各テーブルの構造に合わせて最適化されているため、プロジェクトの中にこのソースを組み込んでコンパイルすれば、優れたパフォーマンスを達成することができるということになります。

# FastDBClient

ごめんなさい、これは説明読んでもよく分かりませんでした。ただ、データベースのクライアントとNetwork IOでイベントループを共有することによって、毎回無駄なロックを省略することができ、パフォーマンスが10〜20%ほど向上するそうです。ほんとかなあ。

# 感想とか

コンパイル時にデータベースを読み込んでテーブルごとに最適化してしまうという発想は面白いと思いました。実際私が経験してきた現場では、サーバが動いている最中にテーブルの構造を変えるということがなかったので、このアイデアは様々な場面で有効なのではないかと思います。
Javaのメリット・デメリット

# はじめに
JavaというAndroidやゲームに使われたりする素晴らしい言語のメリット・デメリットをまとめました。

※これはJavaについての記事です。JavaScriptは全く別の言語であるので注意してください。
# メリット
## オブジェクト指向
オブジェクト指向とは、プログラムの可読性をあげるものです。リストに追加するにはaddメソッド（処理のまとまり）を呼び出すという直感的なプログラミングができます。Javaにはクラスなどでオブジェクト指向のプログラミングができます。

```java:リストにアイテムを追加する
list.add(item);
```

## 型
型とは変数の値のタイプ（文字列、数値など）のことです。例えば変数numに数値が入っていると仮定して作られたプログラムがあるとします。しかしそのプログラムを使用する際に間違えて文字列を渡してしまうと実行時に数値でないためエラーがでます。Javaならコンパイルという文法チェックで型が違うと実行できません。面倒かと思いますが、実行前に気づけることはメリットです。

```java:型を使った例
int num;// 数値(Integer)しか入れることができない。また変数は宣言しないと使えない
num = "文字列";// "で囲むと文字列を使える。また整数でないのでエラーを出す

int num2;
num2 = num + 1;// 整数でないと計算できない
```

## 一つのコードで複数のOSで動かせる
OSに処理を依存することなくプログラミングができます。
# デメリット
## 記述が長い
記述が長く、少し読みにくいです。学習の場合はjshell（Javaのツール）をつかうことで簡単に学習できると思います。以下は画面にHello!と出力するプログラムです。jsellを実行する場合はターミナルで```jshell```と入力して開始できます。

```java:ファイルに書いた場合
public class Main {
    public static void main(String[] args) {
        System.out.println("Hello!");
    }
}
```

```java:jshellの場合
System.out.println("Hello, World");
```

## 環境構築が大変
windowsの場合、JavaをインストールするにはOracleのホームページでダウンロードし、インストーラーをし、環境変数に追加しないといけません。初心者には大変な作業です。Ubuntuだと```sudo apt install openjdk-jdk-11-headless```で完了できるのでおすすめです。

# おわりに
Javaだけに邪魔な言語ではなく、習得することでオブジェクト指向という本質を理解し、プログラミングが簡単だ楽しいことだと気づけるはずです。すでに他の言語を学んでいても試してみてください。
D言語を紹介するための引用記事5選

#D言語って何がいいの？
よく見る質問です。
D言語erにとってその質問は「肺呼吸って何がいいの？」って聞かれるのと同じレベルの質問なわけですが……。
さておき、そんな質問に答えるための引用記事を紹介いたします。

# 1. [Which language has the brightest future in replacement of C between D, Go and Rust? And Why?](https://www.quora.com/Which-language-has-the-brightest-future-in-replacement-of-C-between-D-Go-and-Rust-And-Why/answer/Andrei-Alexandrescu)
「DとGoとRustだと、どれがCに代わる最つよ言語？なんで？」とでも訳せばいいでしょうか。

中身は、DとGoとRustの各々が、そのほかの言語に比べて桁違いに秀でているところをまとめたものです。
D言語の部分だけ要約すると、D言語はコンパイルが高速で、プログラミングが楽ちんで、C/C++との共用が簡単にできて、テンプレートが強力だ、というようなことが記載されています。
ちなみに著者のAndrei Alexandrescu氏は、C++のテンプレートメタプログラミングで有名な、D言語の立役者の一人です。

# 2. [Why program in D?](https://wiki.dlang.org/Why_program_in_D)
D言語の公式Wikiのページです。
なぜDでプログラミングするのか？その答えに、いくつかのWalter Bright氏(D言語の作者)の言葉を引用しています。また、この記事と同じように、いろいろな記事を紹介しています。
Walter曰く「PythonとC++を混ぜて、Pythonの生産性とC++のパフォーマンスを得ようとするハイブリッドなアプローチ。このニーズを埋めようとしている」

# 3. [D言語をご紹介したい](https://qiita.com/cedretaber/items/90b7b34ee710eb5cc965)
D言語のここがすごい！という機能をそれぞれ簡単に紹介する記事となっています。

# 4. [D言語もくもく会を1年やってみた](https://qiita.com/outlandkarasu@github/items/310b505314f50f1ee26e)
D言語への愛に満ちた記事だと思います。
なんだかんだで、なんでD言語を使うのかといえば、愛じゃないかなと思います。

# 5. [私のTwitter投稿](https://twitter.com/mono_shoo/status/1149640126315634688)
手前味噌ですが…
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">普段C言語やってる人向けのD言語の紹介をと思って出たセリフがつよつよだったので紹介します。 <a href="https://t.co/8GtoxUupNk">pic.twitter.com/8GtoxUupNk</a></p>&mdash; SHOO (@mono_shoo) <a href="https://twitter.com/mono_shoo/status/1149640126315634688?ref_src=twsrc%5Etfw">July 12, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 

# まとめ
いかがでしたか？気に入ったなら是非、記事の左や下にある「LGTM」を押して下さいね！
それでは皆さん、良いプログラミングライフを！
覚え書き：Forwarderの一括管理

2020/6/1 追記
この記事の内容を実機で試すハンズオンを[こちらの記事](https://qiita.com/kyabe/items/7825a76791cf27458459)に公開しました．

## Forwarderってなに
*Splunk*には,外部マシンからデータを集める機能に*Forwarder*というのがあって,データを取得したいマシンに*Forwarder*をインストールした後に，データの送信先と送信するデータなんかを設定すると自動的にデータを送ってくれるようになるよ．

![forwarder から Indexerにデータが送信される](https://paper-attachments.dropbox.com/s_2DD598CCD095A25FB56DF4EC0399D14F8CF88344C2A776379C2D3F246AB053E9_1590756379553_Forwarder.png)

※ *Splunk*では生データを受け取る機能のことを*Indexer*というよ.
ついでに受け取ったデータを処理しやすい形に加工してくれるよ．

## *Deployment Server*で*Forwarder*を管理する
マシンの数やOSの種類が増えてくると管理負荷が上がってくるよね．
1台1台に手で設定するのは絶対嫌だよね．俺は絶対に嫌．
そういった時のために，*Splunk*には*Forwarder*を一括管理してくれる*Deployment Server*という機能があるよ．

*Deployment Server*は「このIPのマシンにはこの設定」って定義（*Server Class*というよ）を作れて，*Deployment Server*に接続した*Forwarder*（*Deployment Client*というよ）のIPから判断して，適切な設定ファイルを転送してくれるよ．*Deployment Client*はそれにしたがって，指定のデータを指定の*Indexer*に送るようになるよ．*Deployment Client*は定期的に更新有無をチェックしているから，設定を追加した時も勝手に取り込んでくれるよ．

![Deployment Server と Forwarder と Indexerの関係](https://paper-attachments.dropbox.com/s_2DD598CCD095A25FB56DF4EC0399D14F8CF88344C2A776379C2D3F246AB053E9_1590757817175_Deployment+Server.png)


公式ドキュメントにちょっと複雑化した図が載っているよ．
コピペしたかったけど[*Term of User*](https://www.splunk.com/en_us/legal/terms/terms-of-use.html)にダメって書いてあったから諦めた．
[Deployment server architecture](https://docs.splunk.com/Documentation/Splunk/8.0.4/Updating/Deploymentserverarchitecture)
ffmpegであさがおの成長を見る

# はじめに
コロナの影響で小学校が始まらない中、小学校からあさがおの種が届き、その観察をしましょうという課題が出された。
うちの子(小学校2年生)は喜んであさがおの種を植え始め、芽が出るのをその場を離れずにずっと見つめていた。
よし！どうせなら、ビデオカメラで撮影し続けて、それをffmpegで加工し、タイムラプスで再生させてみよう、ということをやったのだがハマりました・・・

# 機材
- ビデオカメラ
- WindowsPC

# やったこと
1. ffmpegのダウンロード
1. あさがおの種を植えた鉢に向けて、ビデオカメラを設置し、録画する
1. 録画データをパソコンに取り込み、ffmpegで加工

以下に記載の内容は全てコマンドプロンプト上での実行。


## ffmpegのダウンロード
以下の公式サイトからffmpegをダウンロード
https://ffmpeg.org/download.html

インストール作業はなく、ダウンロードしたものを解凍するだけ。
今回はCドライブ直下に配置したので、バイナリファイルは`cd c:\ffmpeg\bin`にある。
パスを通すのも面倒なので、作業はここで行うことにした。


## ビデオカメラの設置
あさがおの前にビデオカメラを固定して撮影開始。
朝9時頃から録画し続け、暗くなったら撮影終了しようと思ったら、17時頃には容量不足で撮影が自動で止まってた。
でも、日が暮れるちょっと前だからそれはそれでOK。


## 録画データをffmpegで加工する
ビデオカメラから取り出した動画ファイルは .mp4 ファイル。
これが複数ファイルに分割され、16ファイル分出来上がってた。
あさがおの成長なので、数分で何か変わるわけでもない。1日かけて撮影したものを数秒で再生しないと何もわからないので、1ファイルずつ再生速度を上げる加工をffmpegで行う。

### 再生速度を上げる
取り出した動画ファイルの再生速度を上げて、タイムラプスにする
以下のページを参考にやってみる。
https://trac.ffmpeg.org/wiki/How%20to%20speed%20up%20/%20slow%20down%20a%20video

ffmpegが置かれている場所に動画ファイル00001.mp4を置き、以下の通りコマンドプロンプト上で実行
00001.mp4を1000倍速にし、a.mp4として出力する場合

``` 
ffmpeg -i 00001.mp4 -filter:v "setpts=PTS/1000" a.mp4
```

しかし、変換してみると、再生ファイルが変換前に比べて短くなってないし、再生される音声も通常のスピードで聞こえる。
先ほどのwikiをよく読むと以下の記載があった。
`the audio stream is not changed, so it should ideally be disabled with -an.`
どうやらデフォルトでは映像のみ変更されるが、音声はそのまま変更されないようだ。
タイムラプスとして見るには音声はいらないので、`-an`オプションで音声を無効化してみた。

``` 
ffmpeg -i 00001.mp4 -filter:v "setpts=PTS/1000" -an a.mp4
```
これで1時間以上の動画ファイルが3秒程の動画ファイルになり、これだけでもしっかりとあさがおの成長がわかるようになった。ただ、3秒程度なので非常につまらない。
動画ファイルは16ファイルあるので、これらをバッチファイルで一気に変換開始。
その間にTVを見たり、子供と遊んだりで時を過ごす。


### 複数ファイルを結合
短くなった16ファイルを今度は結合して1つのファイルに。
以下のページを参考に試してみる。
https://trac.ffmpeg.org/wiki/Concatenate

mylist.txt というファイルを作り、そこに結合したいファイルを以下のように記載すればよいとのことでやってみる(以下は2ファイルを結合する場合)。

``` mylist.txt
file '/path/to/a.mp4'
file '/path/to/b.mp4'
```

そして、以下のコマンドを実行で、mylist.txtに記載したファイル達が結合され、ひとつのall.mp4ファイルになる(はずだった)・・・

```
ffmpeg -safe -0 -f concat -i mylist.txt -c copy all.mp4
```

うまくいかない・・・。エラーが出て進まない。

いろいろ調べると、この`/path/to/` というのが曲者で、パスをCドライブからの絶対パスでも、相対パスでもダメ、そのまま`/path/to/`と記載してももちろんダメで、いろいろやっても、以下のようなエラーで先に進まない。
Unsafe file name
Impossible to open

結果的には`C:ffmpeg\bin`配下に動画を置いている場合は、以下のように記載するのが正解。

``` mylist.txt
file /ffmpeg/bin/aaa.mp4
file /ffmpeg/bin/bbb.mp4
```

なんかよくわからないけど、Cドライブを示す`C:`は不要らしい・・・
そして、`\`(Windows上では円マーク)ではなく、`/`を使用するらしい。

試してないけど、LinuxやMACでやってたらこんな苦労しなかったのかな？

2ファイルの結合がうまくいったので、mylist.txtに16ファイル分を列挙し、以下のコマンドを実行。

```
ffmpeg -safe -0 -f concat -i mylist.txt -c copy all.mp4
```

無事、1日分のあさがおの成長を見ることに成功！
あさがおの種って、1日でこんなに成長するのか！？
でも、Qiitaでは動画を添付できない・・・。
JavaScriptHack Hackフォルダ　Form編

#JavaScript Hackとは　Form編

JavaScriptはDomとFormを押さえれば、実務ではかなりいけるはずという見込みのもと記事を書いていく。
その中でもFormを取り上げる。

きちんと学ぶ事も大事だが、まごまごしている間にいわゆる英語のように単語だけを並べ立てて強引にお客さんに乗り切られ、残念な結果は避けたい。

#コンテンツ
・分類する
・少しずつ例を持ってくる。
分類したものは全てカバーするとする。

##分類する
・ノンバリデーション
・バリデーション
・記法の違い
・部品による違い

##参考アドレスを多少変えて自分でFormを作成する。
・バリデーション

```   
      // Form validation code will come here.
      function validate() {
      
         if( document.myForm.Name.value == "" ) {
            alert( "Please provide your name!" );
            document.myForm.Name.focus() ;
            return false;
         }
         if( document.myForm.EMail.value == "" ) {
            alert( "Please provide your Email!" );
            document.myForm.EMail.focus() ;
            return false;
         }
         if( document.myForm.Zip.value == "" || isNaN( document.myForm.Zip.value ) ||
            document.myForm.Zip.value.length != 5 ) {
            
            alert( "Please provide a zip in the format #####." );
            document.myForm.Zip.focus() ;
            return false;
         }
         if( document.myForm.Country.value == "-1" ) {
            alert( "Please provide your country!" );
            return false;
         }
         return( true );
      }
      </script>      
   </head>
   
   <body>
      <H1>AWS友の会会員登録</H1>
      <form action = "/cgi-bin/test.cgi" name = "myForm" onsubmit = "return(validate());">
         <table cellspacing = "2" cellpadding = "2" border = "1">
            
            <tr>
               <td align = "right">お名前</td>
               <td><input type = "text" name = "Name" /></td>
            </tr>
            
            <tr>
               <td align = "right">メールアドレス</td>
               <td><input type = "text" name = "EMail" /></td>
            </tr>
            
            <tr>
               <td align = "right">コード</td>
               <td><input type = "text" name = "Zip" /></td>
            </tr>
            
            <tr>
               <td align = "right">出身国</td>
               <td>
                  <select name = "Country">
                     <option value = "-1" selected>[choose yours]</option>
                     <option value = "1">USA</option>
                     <option value = "2">UK</option>
                     <option value = "3">INDIA</option>
                  </select>
               </td>
            </tr>
            
            <tr>
               <td align = "right"></td>
               <td><input type = "submit" value = "Submit" /></td>
            </tr>
            
         </table>
      </form>      
```
参考アドレス
https://www.tutorialspoint.com/javascript/javascript_form_validations.htm



##テキストなどから例を持ってくる。




##シラバスを作成する。




##参考アドレス
参考資料
現代の JavaScript チュートリアル
https://ja.javascript.info/
JavaScriptのsubmitイベントで、フォーム送信をコントロールしよう
https://www.sejuku.net/blog/28720
【備忘録】画像つきメニューの仕組み・作り方

備忘録(メモ)です。必要に合わせてバンバン更新していくかも…

## こんな感じに作れる(例)
**サブタイトルあり・画像なし**
![693C4842-C964-40C2-BD1A-6C9C5A29D877.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/561438/83eef80d-7093-5109-b7e7-b2be609b0b5c.jpeg)
**サブタイトルあり・画像あり**
![6EAA6CEE-9F68-4953-9877-16ECF8B43E46.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/561438/708329e7-9824-22f6-2d25-510000f71cb1.jpeg)

## vCard 3.0 を使う
```
BEGIN:VCARD
VERSION:3.0
N:;タイトル;;;
ORG:サブタイトル;
PHOTO;ENCODING=b:<Base64エンコード>
END:VCARD
```
画像なしの場合は`PHOTO;ENCODING~`の行は削除してください。

## サンプル用ショートカット
![603981C9-C8E7-402A-9B6C-B2327CD201D7.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/561438/4dd90c7f-24ab-cb0d-6cf7-01ebd560d02f.jpeg)
・**テキストの拡張子を`.vcf`**
・**拡張子を変更したやつを[連絡先として]にする(下GIF画像)**
![41A9806E-6923-4494-B40D-B88F2BCCA10C.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/561438/4658982c-bae4-74c6-3767-ed7857384208.gif)
こいつらがミソです。
（JavaScript）即時関数の形にモヤモヤしているあなたに

仲間内で行った説明が好評だったので、Qiita用に纏めてみました。
#即時関数って？
通常の関数は、あらかじめ定義しておいて後で実行する形をとりますね。対して即時関数は、その名の通り関数定義後にそれを即実行するものです。無名関数でこのメソッドを使用することによって、名前空間の汚染を気にせずに変数を使えるといったメリットがあります。以下のような書き方が主流だと思います。

```javascript
(function() {
   ...
})();

(function() {
   ...
}());
```

しかし、あくまで主流です。即時関数の仕組みさえ理解していれば、もっと違う書き方も可能なのです！

まずは、前提となる無名関数の特徴についてから説明します。

#無名関数について知っておくべき前提
無名関数は、それ単体だけ書くとエラーを吐いてしまいます。

```javascript
function() {
    ...
}
//Uncaught SyntaxError: Function statements require a function name
```
しかし、**functionが行頭に無い**ならばエラーは吐きません（勿論そのままでは「ただそこにあるだけ」で、実行はされません）。

```javascript
!function(n) {
    ...
}
```

```javascript
[function(n) {
    ...
}][0]
```

```javascript
0 == function(n) {
    ...
}
```

```javascript
(function(n) {
    ...
})
```
#本題：括弧の正体
まずは関数を変数として宣言してみましょう！

```javascript
var a = function(n) {
    ...
}
```
次に、宣言した関数を使ってみましょう！

```javascript
a("引数");
```
関数を使用する際、皆さんは`関数名(引数)`という形で使用しますよね。この最後の括弧は、functionというオブジェクトに対しての「実行せよ！あっ、引数も受け取っておいてね！」という命令なんですね。事実、括弧無しで関数名だけポンと書いても、関数は実行されません。

```javascript
a;
//何も起こらない
```

じゃあこの理屈をそのままに、**変数宣言無しに**関数を定義し、即！実行してみましょう。

```javascript
//これが
var a = function(n) {
    ...
}
a("引数");

//こうなる
function(n) {
    ...
}("引数");
```
しかし、この記事の冒頭に書いてあった内容を思い出してください。「無名関数の場合、行頭にあるとエラーを吐く」という前提があったはずです。

```javascript
function(n) {
    ...
}("引数");
//Uncaught SyntaxError: Function statements require a function name
```

というわけで、この無名関数をエラーの出ない形、つまり**functionが行頭に無い形**に書き換えてしまいましょう。

```javascript
!function(n) {
    ...
}("引数")
```

```javascript
[function(n) {
    ...
}][0]("引数");
```

```javascript
0 == function(n) {
    ...
}("引数");
```

```javascript
(function(n) {
    ...
})("引数");
```

```javascript
(function(n) {
    ...
}("引数"));
```
見覚えのある形・無い形もあるかもしれませんね。しかしこれらは全て即時関数であり、キチンと機能します。もしここにある例よりも奇想天外かつコンパクトな即時関数をご存知の方は、是非！ご教授ください。

ご清覧ありがとうございました！

----
#おまけ
無名関数でなくとも、関数の定義後即実行は可能です。

```javascript
function a(n) {
    ...
}("引数");

a("引数2");
```
無名関数を使用するのは、大抵は名前空間を汚したくないといった理由かと思います。単に「名前空間なんざ知らない」「関数定義した後にひとまず即実行したい」「一度実行した後も別の場所でこの関数を再利用したい」といった方には、このような書き方もおすすめです。

#おまけ - 2
関数を変数として宣言する際、名前付き関数を入れても問題はありません（ただしその名前はその関数内でしか使えません）。

```javascript
var a = function b(n) {
    if(n < 10) {
        return b(n+1);
    }
    return n;
}(0);
//10

b(0);
//Uncaught ReferenceError: b is not defined
```
【swift】セグメントでの分岐の仕方

#セグメントの基本設定
UISegmentedControlの基本設定はstorybord上でできます。
<img width="607" alt="スクリーンショット 2020-05-29 22.32.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/380668/ac407c87-36b4-b630-99b9-6f4cf77db95a.png">
セグメントの数や、それぞれに入れる文言はここで設定します。
#セグメントによって処理を分岐する
選ばれたセグメントの場所(番号)でスイッチするのが良いでしょう。

```swift
@IBOutlet weak var segmentedControl: UISegmentedControl!

// セグメントコントロールが何番目に止まっているかでスイッチ
switch segmentedControl.selectedSegmentIndex {
  case 0:
    break

  case 1:
    break

  case 2:
    break

  case 3:
    break

  default:
    break
}
```
プログラミングElixir 第7章 練習問題 解答

##はじめに
最近[プログラミングElixir](https://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0Elixir-%EF%BC%A4%EF%BD%81%EF%BD%96%EF%BD%85%EF%BC%B4%EF%BD%88%EF%BD%8F%EF%BD%8D%EF%BD%81%EF%BD%93-ebook/dp/B01KFCXP04)の勉強をはじめたので、解答を残していきたいと思います。（おかしなところがあれば言ってください...）


##ListsAndRecursion-0
*sum関数はアキュームレータを使わずに実装できる。*
`iex>MyList.sum [1,2,3]`
`6`

```elixir:main.exs
defmodule MyList do
  def sum([]), do: 0
  def sum([head | tail]), do: head + sum(tail)
end
```


##ListsAndRecursion-1
*リストと関数を引数に取るmapsum関数を書いてみよう。リストの各要素に関数を適用して、その結果を合計する。*
`iex>MyList.mapsum [1,2,3], &(&1 * &1) `
`14`

```elixir:main.exs
defmodule MyList do
  def mapsum([], _func), do: 0
  def mapsum([head | tail], func) do
    func.(head) + mapsum(tail, func)
  end
end
```

##ListsAndRecursion-2
*リストの要素の最大値を返すmax(list)関数を書いてみよう*
`iex>MyList.max [2,4,1,6,5,3]`
`6`

```elixir:main.exs
defmodule MyList do
  def max(list), do: _max(list, hd(list))
  defp _max([], value), do: value
  defp _max([head | tail], value) when head > value, do: _max(tail, head)
  defp _max([head | tail], value) when head <= value, do: _max(tail, value)
end
```

##ListsAndRecursion-3
*Elixirのシングルクオートで囲まれた文字列は、実際は文字コードのリストだ。
リストの各要素にnを足して、足した結果、その文字がzを超えたらaにぐるっと回るようにする、caesar(list,n)関数を書いてみよう。*
@torifukukaiouさんのおかげでnが大きくなっても対応できるようになりました。

`iex>MyList.caesar('ryvkve', 13)`
`elixir`

```elixir:main.exs
defmodule MyList do
  def caesar([], _), do: []
  def caesar([head | tail], n), do: [char(head + n) | caesar(tail, n)]
  defp char(n) when ?a <= n and n <= ?z, do: n
  defp char(n), do: ?a + rem(n - ?z, ?z - ?a + 1) - 1
end

#iex> MyList.caesar('ryvkve', 1444444444444443)
#elixir
```
*2021/02/13 追記（nがマイナスつまり逆回りも対応しました。上のコードと若干変更があります。）

```elixir:main.exs
defmodule Mylist do
  def ceasar([], _), do: []
  def ceasar([head | tail], n) when n >= 0, do: [_calc(head, n) | ceasar(tail, n)]
  def ceasar([head | tail], n), do: [_calc(head, n) | ceasar(tail, n)]
  defp _calc(h, n) when ?a <= h + n and ?z >= h + n, do: h + n
  defp _calc(h, n) when n < 0, do: ?z + rem(h + n - ?z, 26)
  defp _calc(h, n), do: ?a + rem(h + n - ?z, 26) - 1
end
#iex> MyList.caesar('ryvkve', -1444444444444443)
#elixir
```
##ListsAndRecursion-4
*fromからtoまでの数のリストを返す関数MyList.span(from, to)をつくろう。*
`iex>MyList.span(1, 10)`
`[1,2,3,4,5,6,7,8,9,10]`

```elixir:main.exs
defmodule MyList do
  def span(from, to) when from > to, do: []
  def span(from, to), do: [from | span(from+1, to)]
end
```

##さいごに
~~なんか3番の回答が気に入らない。~~ -> @torifukukaiouさんの解答に修正させていただきました。
2020年末にはきちんとしたエンジニアになるためのメモ

自分を変えるために技術力をつける

・SIerだがプログラミング経験なしで上流工程をやらされる

・コードレビューをやるが当然わからない

・資料のコピー、エクセルに証跡のスクショを貼る日々

ここから解放されるために技術力をつけようと思う

期限は2020年末

【興味】

AI、機械学習
マーケティング
グロースハック


【身に着ける技術】

Pyhtonのスキル(スクラッチで機械学習モデルを制作)

HTML CSS JavaScript　フロントエンドの技術

フレームワーク

Git

SQL


最低限これは必要だと現時点では考えている。

※
基本的にはスキルをつけるために5分使い、以下の情報を今後こまめに投稿していく

・技術的に躓いたところ
・効率のいい勉強法
・失敗事例
・ロードマップと進捗
[エラー文]Permanently added the RSA host key for IP address '13.114.40.48' to the list of known hosts.



Githubに鍵を登録できたら、SSH接続できるかコマンドで確認していたら、
表題のエラーが発生した。

```:サーバー
[ec2-user@ip-172-31-23-189 ~]$ ssh -T git@github.com
Hi <Githubユーザー名>! You've successfully authenticated, but GitHub does not provide shell access.
```


また、同時成功の表示も出ていた。
下記リンクの対応で、無事にエラー文は消せました！

https://qiita.com/tdrk/items/a0554763c29f60e347b5
storybordでUIButtonを角丸にする方法

#UIButtonを角丸にしたい
UIButtonをコードなしで角丸にする方法です。
UIButtonを選択肢、画像の場所に書き込みます。

```
layer.cornerRadius Number 好きな数
```
<img width="1000" alt="スクリーンショット 2020-05-29 22.11.27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/380668/71e61119-50a2-b805-015f-d4635de55011.png">

ビルドすると角丸になっています
<img width="348" alt="スクリーンショット 2020-05-29 22.12.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/380668/2156d37d-cc30-4ad7-218b-e4f566472a52.png">

コーナーラディウスを100にすると、完全なる円になります。
EC2関連で使用するターミナルコマンド(順次追加予定)



```:ターミナル
chmod 600 ダウンロードした鍵の名前.pem
```
chmodは権限の変更。
chmod 600で所有者のみに読み込み権限と書き込み権限を付与してそれ以外は全て不許可


```:ターミナル
mkdir ~/ファイル名
```
ホームディレクトリに新規ディレクトリを作成するコマンド。
誰でも分かるVR(Virtual Reality)紹介

# VRとは
VR「Virtual Reality/バーチャル・リアリティー」って聞いた事ありますか？
VRは「仮想現実」とも言われます。
簡単に説明すると、目の前に現実ではない現実を体現できるということです。

概念だけだと、わかりづらいと思います。
具体例を説明しますと、ちょっと「3Dグラス」の超進化版みたいな感じです。
今は、ほとんどがゴーグル形です。
VRゴーグルを装着すると、
現実と違う世界を視界の360°が覆われ、物凄く没入する感覚が得られます。

# 近年の流れ
私は最初に「VR」というものに触れたのは、
二、三年前、Beat Saberα版予告編が公開された時でした。
その時、興味はわきましたが、
「VR」使うには機材と場所が必要で、そもそも学生なので機材を買うお金がありませんでした。

その後、「VR」に関するニュースはちょくちょく出る感じです。
（そもそもあんまり気にしていないから、ニュースがあっても知らない可能性が高いです。）

ゲームの方がやや詳しくですが、機材（値段）と使い心地などの問題で、
一般プレイヤーはほぼ「VR」体験不可能の状態になっています。
そもそも優先なゲーム自体が少ないため、設備を買うメリットはあんまりないかもしれません。
VR技術は少しずつ進歩していますが、設備の関係で、広がらない感じでした。

近年は、設備の改良や、あちこちで「VR」のイベントや設備を開催したおかけで、
多くの人に「VR」を接触、体現する事ができるようになりました。
「VR」もいろんな分野で普及し、貢献していますね。


（優秀なゲームも増えました。）

世界中で、多数の大手企業も「VR」関する開発を手に付けている状態です。
これから、すごい勢いで伸びる可能性が高いと思います。

# 終わりに
「VR」に興味ありましたら、
一回体験した方がいいと思います。

数年後には、「VR」技術は今のスマホのように、
誰でも簡単に使えるようになるかもしれません。
【Ruby on rails】rails db:migrate:resetコマンドでFATAL: Listen error: unable to monitor directories for changes.と表示される。【Rails tutorial】

##エラーについて
以下コマンド実行時にエラーが発生。

```
rails db:migrate:reset
```

```
FATAL: Listen error: unable to monitor directories for changes.
Visit https://github.com/guard/listen/wiki/Increasing-the-amount-of-inotify-watchers for info on how to fix this.
```

##対処法
調べてみると、inotifyのインスタンス上限を変更することで対処可能なようです。
catで以下ファイルについて確認。

```
cat /proc/sys/fs/inotify/max_user_instances 
```
```
128
```

128から524288に変更していきます。
設定ファイルに追記します。
```
echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf
```

```
fs.inotify.max_user_watches=524288
```

追記したファイルを反映します。

```
sudo sysctl -p
```

再びエラーだったコマンドを実行。

```
rails db:migrate:reset
```

無事にコマンドが通りました！
Ruby ハッシュについて

# ハッシュとは
ハッシュとは、キーと値の組み合わせでデータを管理するオブジェクトです。
配列は複数の値を並べて管理するのに対して、ハッシュはそれぞれの値にキーと呼ばれる名前をつけて管理します。

## ハッシュの作成
ハッシュを作成する場合は、以下のような構文(ハッシュリテラル)を使用します。　

```ruby:index.rb
#キーと値の組み合わせを2つ格納するハッシュ
{キー1 => 値1, キー2 => 値2}
```
(例)
キーと値の間は、=>で繋ぎます。要素と要素はコンマ(,)で区切ります。

```ruby:index.rb
{"fruit" => "apple", "color" => "red}
```
ハッシュは、Hashクラスのオブジェクトです。
コンソール上で空のハッシュ{}を作成し、そのクラス名を確認すると、Hashとなっていることがわかります。

```console
{}.class
```
結果

```console
=> Hash
```
## ハッシュを変数に代入
ハッシュを変数に代入できます。
(例)

```ruby:index.rb
fruit = {"apple" => "red", "lemon" => "yellow", "melon" => "green"}
puts fruit
```

結果

```console
{"apple" => "red", "lemon" => "yellow", "melon" => "green"}
```

## 要素の出力

ハッシュの各要素の値は、対応するキーを使って出力することができます。

(例)

```ruby:index.rb
fruit = {"apple" => "red", "lemon" => "yellow", "melon" => "green"}
puts fruit["apple"]
```

結果

```console
red
```

## 参考にした文献

[プロを目指す人のためのRuby入門](https://www.amazon.co.jp/dp/4774193976/ref=cm_sw_em_r_mt_dp_U_shaUEbXSFD416)
terraformでstateを入れ替える


## ステートを消す

```
terraform state rm aws_vpc_peering_connection.connection-a
```

grepしてリソースが管理されているかまずチェック

```
terraform state list | grep xxx
```

## ステートをインポート

```
terraform import aws_vpc_peering_connection.connection-a pcx-xxxxxxxxxxxxx
```

インポートする際には、リソースを定義しておく

```
resource "aws_vpc_peering_connection" "connection-a" {
  peer_vpc_id = data.aws_vpc.vpc.*.id[0]
  vpc_id      = aws_vpc.vamdemic-vpc.id

  tags = {
    Name = "vamdemic-and-xxx"
  }
}
```

インポートするだけなら、リソースの中身はいらない

```
resource "aws_vpc_peering_connection" "connection-a" {
}
```
TerraformでvpcをDataSourceで取得するとき

# VPCをDataSourceで取得する
- filterでタグ名を指定している
- 複数のリソースが取得されないように、フィルター条件は多い方が良いかも

```
data "aws_vpc" "vpc" {

  filter {
    name   = "tag:Name"
    values = ["vamdemic-vpc"]
  }
}
```

# DataSourceを利用する場合
- リスト型で取得されるので、1つ目の要素を取り出します

```
data "aws_route_table" "route" {
  vpc_id = data.aws_vpc.vpc.*.id[0]

  filter {
    name   = "tag:Name"
    values = ["vamdemic-route"]
  }
}
```
Dockerについて

#前提
本日学んだことを書いていきます。

#本題

#コンテナとは
内部にものを貯める容器・運搬可能

容器にはアプリケーションが入っている。
自宅のPCやラップトップ、データーセンターで稼働しているサーバー
AWSやAZUREやGCPの仮想サーバーへ持ち運び、アプリケーションを実行することができる。

#従来の技術モデル
アプリケーションが実行される環境が変わってきている。
一つのハードウェアに一つのOSがあり複数のアプリケーションをインストールして使用する。
このような形が従来型のアプリケーションの実行環境。
少々リソースに無駄があり、コストが高くつくのが難点。

#仮想化技術
ハードウェア、OSについては同様。
ハイパーバイザーというシステムをインストール（VMWereやXen、Hyper-V）。
ハイパーバイザーにWindowsやLinuxなどのOSをインストールし、仮想的に一台のサーバーを実行できる（Virtual Server）
ハイパーバイザーは複数のバーチャルサーバを実行することができ、EC２などの仮想サーバーもバーチャルサーバとして実行されている。
##メリット
OS丸ごとのバックアップの取得が簡単。

#コンテナ
ハードウェアやOSは同様。
コンテナエンジン、コンテナデーモンをインストール。（Dockerが一番有名）
コンテナ同士は独立しており、互いに鑑賞することはない。
それぞれの実行環境がコンテナという一つの容器にまとまっている形をイメージ。

##なぜ軽量なのか
コンテナのOSと異なっていてもLinuxのカーネルは互換性があるため互換性の範囲内であればアプリケーションは動作できる。
→コンテナはLinuxイメージが動作している

Linuxイメージ = filesystem / libraries
OS = filesystem / libraries + kernel
それぞれのコンテナ（RedhatやSuze、Ubuntu）はホストOSのカーネルを共有しており、カーネルまで含めて仮想化しているバーチャルサーバと比べて動作が軽量。

#コンテナのライフサークル
・Dockerデーモンをホストマシンにインストール
→コンテナイメージを実行したり、ネットワーク周りを管理したり、コンテナ全般の管理を行うもの

・Dockerclientをインストール
→デーモンに対して指示を出す役割のもので、デーモンに対してビルドやコマンドやランコマンドを実行したりする。

・Registry
Dockerイメージを保管する領域。
DockerHubが有名。
AWSではECR、Elastic Container RegistryというプライベートなDockerイメージのアップロード場所をサービスとして提供している。


Dockerclientが<code>Run</code>コンマンドをデーモンに対して実行。
↓
デーモンは場合によってRegistryからコンテナイメージをダウンロードし、コンテナとして実行。
※buildコマンドでどのようなコンテナイメージを作成するかによる


#コンテナの人生
DockerHubなどのコミュニティにある様々なコンテナ
↓
自分のパソコン（Dockerclient）にpull
↓
行いたい作業に合わせて編集しDockerHubなどのコミュニティ（Registry）にpush
↓
Dockerデーモン（ホスト）に対してRunコマンドを実行
↓
DockerデーモンはRegistryよりイメージをダウンロード
↓
コンテナの実行
computed内での「()=>()=>{}」

# Q.()=>()=>{}
下記のようなコードにおいて、
`()=>()=>{}`
とアロー関数が2つ続いているのは何？

```
computed: {
    hoge: () => (obj) => {
      return {
        name: obj
      }
    }
}
```



# A.computed内の関数に引数を渡すため
computed内の関数に引数を渡すための書き方

以下と同様

```
computed: {
    hoge(){
      return (obj) => {
        return {
          name: obj
        }
      }
    }
}
```
ゼロから始めるLeetCode Day40「114. Flatten Binary Tree to Linked List」

#概要
海外ではエンジニアの面接においてコーディングテストというものが行われるらしく、多くの場合、特定の関数やクラスをお題に沿って実装するという物がメインである。

その対策としてLeetCodeなるサイトで対策を行うようだ。

早い話が本場でも行われているようなコーディングテストに耐えうるようなアルゴリズム力を鍛えるサイト。

せっかくだし人並みのアルゴリズム力くらいは持っておいた方がいいだろうということで不定期に問題を解いてその時に考えたやり方をメモ的に書いていこうかと思います。

[Leetcode](https://leetcode.com/)

[ゼロから始めるLeetCode 目次](https://qiita.com/KueharX/items/6ee2502c3b620c795b70)

前回
[ゼロから始めるLeetCode Day39「494. Target Sum」](https://qiita.com/KueharX/items/cd08167d7626c2be8787)

基本的にeasyのacceptanceが高い順から解いていこうかと思います。

[Twitter](https://twitter.com/kueharx)やってます。

40回目です。そろそろ辞め時が分からなくなってきました。

# 問題
[114. Flatten Binary Tree to Linked List](https://leetcode.com/problems/flatten-binary-tree-to-linked-list/)

難易度はMedium。
Top 100 Liked Questionsからの抜粋です。


二分木が与えられるので、フラットなリストに変換するようなアルゴリズムを設計してください。

これだけでは分かりづらいので例を見てみましょう。

```
    1
   / \
  2   5
 / \   \
3   4   6
The flattened tree should look like:

1
 \
  2
   \
    3
     \
      4
       \
        5
         \
          6
```

やはり例を見ると分かりやすいですね。

# 解法

```Python
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def flatten(self, root: TreeNode) -> None:
        prelevel = None
        """
        Do not return anything, modify root in-place instead.
        """
        def dfs(node):
            if node:
                dfs(node.right)
                dfs(node.left)
            
                nonlocal prelevel
                node.right = prelevel
                node.left = None
                prelevel = node
        
        dfs(root)
# Runtime: 36 ms, faster than 74.14% of Python3 online submissions for Flatten Binary Tree to Linked List.
# Memory Usage: 14.6 MB, less than 8.70% of Python3 online submissions for Flatten Binary Tree to Linked List.     
```

dfsで解きました。
prelevelで代入する要素を保持し、ひたすら`node.right`に要素を、`node.left`に`None`を代入し、`prelevel`に次の要素を入れる、というものです。

良い感じの回答にまとまりました。
今回はこの辺で。お疲れ様でした。
【Rails】TwitterのOGPを設定する

Gemなしです。

TwitterのOGPを表示させるために必要なmetaタグについては以下の記事を参考にしました。
[【2020年版】Twitterカードとは？使い方と設定方法まとめ](https://saruwakakun.com/html-css/reference/twitter-card#section3)


## 実装
```app/helper/application_helper.rb
def full_title(page_title = '')
  base_title = 'MC BATTLE CHANNEL'
  if page_title.empty?
    base_title
  else
    "#{page_title} | #{base_title}"
  end
end

def full_url(path)
  domain = if Rails.env.development?
             'http://0.0.0.0:3000'
           else
             'https://mcbattle-ch.jp'
           end
  "#{domain}#{path}"
end
```
```erb:app/views/layouts/application.html.erb
<head>
  <!-- ogp -->
  <meta name="twitter:card" content="summary_large_image" />
  <meta name="twitter:site" content="@McBattleChannel" />
  <meta property="og:title" content="<%= full_title(yield(:title)) %>" />
  <meta property="og:url" content="<%= request.url %>" />
  <meta property="og:description"
    content="<%= content_for?(:description) ? yield(:description) : 'MCバトルの総合サイトです。' %>" />
  <meta property="og:image"
    content="<%= content_for?(:image_url) ? yield(:image_url) : full_url('/assets/other/ogp_default.png') %>" />
```
```erb:app/views/hoge/fuga.html.erb
<%= content_for(:title, "この個別ページのタイトル!") %>
<%= content_for(:description, "この個別ページの説明文!") %>
<%= content_for(:image_url, full_url("assets/mc/hoge.img")) %>
```

## 本番環境で表示されない場合
ステージング環境では表示されて、本番環境では表示されない場合、たぶんOGPのキャッシュが原因です。
以下の「OGPの表示を確認するツール」を使うと、表示確認と同時にキャッシュがクリアされます。
https://cards-dev.twitter.com/validator
バッチで使えるコマンド抜粋（初心者向け）

自分が使ったバッチを、保守の時にササっと見返せるように備忘録としてメモ書きしていく。

##■set
変数の設定・計算・ユーザーからの入力情報の取得に使う

```
set [変数名]=[代入したい文字列]
```
(例)今日の日付を変数に入れる

```
set T=%date%    　Tに日付を代入
set Y=%T:~0,4%　　Tの左1番目から4文字だけ取り出し、Yに代入
set M=%T:~5,2%　　Tの左6番目から2文字だけ取り出し、Mに代入
set D=%T:~8,2%　　Tの左8番目から2文字だけ取り出し、Dに代入
```
**＜ヒント＞**
`%変数名%`　…変数の中身を参照したいときは、変数を「%」で囲む
`%date%`　　…今日の日付を文字列にして返してくれる（現時点で　2020/05/29）
↓　「/」のように、ファイル名としては利用できない文字が含まれているので除外する
`%変数名:~m,n%`　…ある変数の先頭（文字列の左端）からm番目の文字からn文字だけを取り出す
※先頭は「0」が1番目となる

ちなみに上記の数字をすべて結合させるときは

```
%date:~0,4%%date:~5,2%%date:~8,2%
```
⇒結果は「20200529」となる。

##■tree
フォルダ構成をツリー形式で表示する

```
tree [表示させたいフォルダ]
```
(例)USBメモリなどのEドライブ直下の構成を、Cドライブに作ったlogフォルダの中に
　　treeOutput_日付 というタイトルのテキストを出力し、追記する

```
tree E:\ >> C:\log\treeOutput_%Y%%M%%D%.txt
```
**＜ヒント＞**
`%変数名%`　…変数の中身を参照したいときは、変数を「%」で囲む
`>>`　　　　…ファイルに追記

##■robocopy
ファイルサーバ等のファイル/フォルダをアクセス権ごとコピーできる

```
robocopy [コピー元] [コピー先]
```
(例)Eドライブ直下のフォルダとファイルをCドライブのtmpフォルダにアクセス権ごとコピーする。
　　そして、Cドライブのlogフォルダにoutput_日付 というタイトルのテキストを出力し追記する。
　　さらに、コピー後は元のEドライブ直下のファイルを削除する。

```
robocopy E:\ C:\tmp /S /MOV >> C:\log\output_%Y%%M%%D%.txt
```
**＜ヒント＞**
`%変数名%`　…変数の中身を参照したいときは、変数を「%」で囲む
`>>`　　　　…ファイルに追記
`/S`　　　　 …セキュリティ(NTFSアクセス権)情報
`/MOV`　　　 …ファイルを移動する（コピー完了後にコピー元から削除する）

##■rd
ディレクトリを削除する

```
rd [ディレクトリ名]
```
(例)Eドライブ直下の空ではないディレクトリも含め、確認なしで削除する


```
rd /s /q E:\
```
**＜ヒント＞**
`/s`　…空ではないディレクトリも削除
`/q`　…sオプションが設定されているとき、確認しない


以上、ここには載っていないがまだまだ多くのコマンドやオプションがあるので、必要に応じて調べていくことを勧める。
[WordPress] 検索結果の並び順

検索結果の並び順の根拠をたまに聞かれるので。
（追記）ロジックに関して追記しました。
https://twitter.com/tekapo/status/1266621537324371969

# デフォルトは関連順

デフォルトの検索ウィンドウでサイト内検索した場合の記事の並び順。
3.7から関連順になってる。

https://wpdocs.osdn.jp/Version_3.7
> 検索の改善
> より関連性のある検索結果となるよう改善

検索結果を表示するときの SQL

```
ORDER BY wp_posts.post_title LIKE '%検索してるテキスト%' DESC, wp_posts.post_date DESC
```

順序のロジックはこちら
https://core.trac.wordpress.org/changeset/25632

>The ordering logic is as follows:
- Full sentence matches in post titles.
- All search terms in post titles.
- Any search terms in post titles.
- Full sentence matches in post content.
Each section and any remaining posts are then sorted by date.

投稿のタイトル＞投稿本文の順で検索して行って同じ関連度なら日付でソート。

# 検索結果の並び順を変えたいとき
`pre_get_posts` ではなく `posts_search_orderby` フックで変更。
SQLのORDER BY句をそのまま記述する形で返す。
https://developer.wordpress.org/reference/hooks/posts_search_orderby/
例：日付順にする場合

```
/**
 * 検索結果は日付順にする
 */
add_filter( 'posts_search_orderby', 'my_posts_search_orderby', 10, 2 );
function my_posts_search_orderby( $search_orderby, $wp_query ) {
	return 'post_date desc';
}
```

現場からは以上です。
Unityでオブジェクトのスケールをマイナスにしたらポリゴンが反転するみたいなので調査してみた (Odd Negative Scaling)

# 概要
Unityでオブジェクトのスケールをマイナスにしたらポリゴンが反転しているのが気になったので、
調査したことを共有しようと思います。

# 経緯
「変換行列でスケールを反転させてもポリゴンは反転しないよね？」って思ったんですが、
実際に確認したところ、Unityでは反転してるみたいなのでちょっと調査してみることにしました。

# 動作環境
- Windows 10
- Unity 2019.3.14f1
- UE4 

# 検証パターン

左側がスケールをそのまま、右側はZスケールを-1に設定したものです。
![capture_with_inspector.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188798/6a0bd8c7-a958-51f1-461a-2da19930f116.jpeg)
![zreverse_normal.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188798/522a2b12-060f-8451-f239-19df0e14b925.gif)
Zスケールを 1 -> -1 にアニメーションさせています。
スケールがマイナスになったときに、ポリゴンが反転していますね。

## ポリゴンが反転しない場合のイメージ
**※あくまでイメージのために作成した画像です。実際にはこうなりません。**
右側のモデルはシェーダーでフロントフェイスカリングにしています。

![flipped.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188798/a37fce54-a2bb-640f-6a30-3457b84270b5.png)
![zreverse_guess.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188798/0afa1a67-9ca1-b87f-fd38-4bd48a1e2c27.gif)


# 仮説
調査前は以下のように予想してました。

## 仮説1. ポリゴンを反転させた別モデルを用意して、スケールが負のモデルに使用している
この場合、モデルに対するグラフィックメモリの消費が増えますが、バッチング対象にはなります。

## 仮説2. フロントフェイスカリングに切り替えている
レンダリング前に`GL.invertCulling(true)`をコールしているイメージです。
バッチング対象外になるぐらいがデメリットでしょうか。


# 調査結果
**ドキュメントが見つからなかったのでわかりません！**

ですが、１つ気になる動きがありました。
Frame Debuggerで「検証パターン」を確認したところ、以下のようなメッセージが表示されていました。

![framedebugger.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188798/49638f15-f37c-dd02-01fe-59f9185a7137.jpeg)

X, Y, Z スケールのうち奇数個がマイナスの場合は、バッチング対象外になるようですね。
ということで *仮説2* が近いのかなと思いました。

古い資料ですが [こちら](https://blogs.unity3d.com/2017/04/03/how-to-see-why-your-draw-calls-are-not-batched-in-5-6/) にも"What breaks batching"の中に"Odd Negative Scaling"とありますね。


# 結論
詳細は不明だが、UnityはOdd Negative Scalingのオブジェクトの場合、ポリゴンを反転させている。


# 余談、UE4の場合
じゃあUE4はどうなってるのかな？ってことで調べてみました。

Unreal Editor 4.24.3で確認しました。

## Actor(オブジェクト)をOdd Negative Scalingにした場合
反転しました。
![ue4_reversed.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188798/6b53c8c3-88c5-9561-99ee-9fa66814d829.jpeg)


## 親をOdd Negative Scalingにした場合
反転しませんでした。
親のスケールはカリングに影響しない仕様なのかもしれません。

![ue4_parent_reversed.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188798/46b5c219-f9dd-d49a-dade-7358c849b021.jpeg)


# 雑感
よくよく考えてみると、スケールが負になったときにポリゴンを反転させた方がいろいろと好都合な気はしました。
ポリゴンを反転させなかったらモデルの見た目がおかしくなるので、反転モデル向けに専用マテリアルが必要になるなど考慮することも多くなりそうですね。

あと、記事を書いていて「ポリゴンの反転」がゲシュタルト崩壊しそうになりました。。。
牛乳パックを使ったPCスタンド

#始めに
僕はコロナの為に学校が休みになってしまい暇をもて遊ぶ様になり、何か家で出来る事を考えていました。そして考えた結果、利用時間が増えて自分のPC周りをやろうと思い以前思いついた物を形にしました。
#牛乳パックPCスタンドの作り方
始めに牛乳パックを写真の様に二等分にする(下の写真を参照)。２等分にしたパックを互い違いに重ね、テープなどで２つを止めて完成。
![IMG_2618.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581846/be099b40-af81-b705-ec19-2c54a077edbf.jpeg)
後は、下の写真の様に挟めばキーボードの高さを上げて作業効率をあげることが出来る。
![IMG_2617.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581846/83c96c1c-7992-1a51-0664-7001e66fe4b6.jpeg)
#最後に
最後まで見ていただきありがとうございます。
今回記事にしたスタンドは紙で出来ているのに安定感は抜群です。
しかし、やり方で支えるのはあまりmacbookによろしくないかも知れないのでこの方法を試すときは自己責任でお願いします。
日記アプリ探してみた

`notes daily`で検索するとヒットした。

* stup
    * bashで書かれた巨大なシェルスクリプト。
    * カテゴリごとに分けてメモを残したい場合など
    * macではエラーが出る。
* dn
    * shellで読み込んでから使う。
    * とてもシンプルなので、これを元に自前のメモ環境を作れる。
    * macでも動く
    * `dn メモ`、`dnv`など。端末に引きこもりたい時に最適
* [notes-cli](https://github.com/prdpx7/notes-cli)
    * gist保存もある。設定が不要でシンプル
    * 面倒さが一切ない

<img width="960" alt="スクリーンショット 2020-05-29 19.56.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/58c37fe7-a5d5-4392-286a-06551a294a5c.png">

## dn

```sh
curl https://raw.githubusercontent.com/tomlockwood/dn/master/dn > dn
```

```sh
source dn
```

```sh:編集
dnet
```

### .md の拡張子をつけてみる

```sh
# https://raw.githubusercontent.com/tomlockwood/dn/master/dn
# Daily Notes Aliases
export DN_PATH=~/Documents/dn

dn() {
  echo " * $1" >> $DN_PATH/$(date "+%Y-%m-%d").md
}

dno() {
  echo " * $2" >> $DN_PATH/$1.md
}

dnoe() {
  vim $DN_PATH/$1.md
}

dnt() {
  echo $(date "+%Y-%m-%d")
  cat $DN_PATH/$(date "+%Y-%m-%d").md
}

dnte() {
  vim $DN_PATH/$(date "+%Y-%m-%d").md
}

dnv() {
  find $DN_PATH/$1* -type f -exec basename {} \; -exec cat {} \;
}
```

## stup

### インストール

```
curl https://raw.githubusercontent.com/iridakos/stup/master/stup > stup

chmod +x stup
```

```sh
./stup configure
```

> Press enter to use the default location or fill in your desired destination: 

`.`

あとはEnter連打

### 起動

```
./stup edit
```
【Rails】whenever による定時バッチ処理

#【Rails】whenever による定時バッチ処理

Wheneverを使ってRailsでのバッチ処理を実装したのでまとめます。

## 目次
* [動作環境](#動作環境)
* [やりたいこと](#やりたいこと)
* [手順](#手順)
  * [wheneverのインストール](#wheneverのインストール)
  * [railsにlibを加える](#railsにlibを加える)
  * [バッチ処理の記載](#バッチ処理の記載)
  * [schedule.rbの作成・編集](#schedule.rbの作成・編集)
  * [実行結果](#実行結果)

---------------------------------------
## 動作環境
`OS : macOS Mojave 10.14.6`
`ruby : 2.6.3p62`
`rails : 5.2.4`

## やりたいこと

決まった時間に定期的に実行するタスクを作成したい

## 手順

### wheneverのインストール
   
```ruby:Gemfile
gem 'whenever', require: false
```

インストールの実行

```bash
Bundle install
``` 

### railsにlibを加える

Railsがlibフォルダを読み込めるように設定します
libフォルダにバッチ処理をするファイルを置くためです.


```ruby
class Application < Rails::Application
  config.autoload_paths += Dir["#{config.root}/lib"]
end
```
### バッチ処理の記載

libにbatchというフォルダを作成し、その中に定期実行するファイルを作成します。
Batch::以降は任意の名前で良いです。

例
`batch/deadline_cleaner.rb`

```ruby:deadline_cleaner
class Batch::DeadlineClear
  def self.deadline_clear
    puts DateTime.now
    puts 'Test'
  end
end

```

#### 確認

```bash
$ bundle exec rails runner Batch::DeadlineClear.deadline_clear

Running via Spring preloader in process 77676
test
```


### schedule.rbの作成・編集

アプリケーションのルートフォルダに移動し、以下のコマンドを実行

```bash
$ cd blog-app
$ bundle exec wheneverize .
```

実行すると `config/schedule.rb`が作成されます。

その後、以下のようにschedule.rbにスケジュールと実行したいタスクを記載します。


```ruby
set :output, 'log/crontab.log'
set :environment, :development

every 1.day, at: '00:00 am' do
  runner 'Batch::DeadlineClear.deadline_clear'
end
```

以下のコマンドでCRONへ反映します.

```bash
$ bundle exec whenever --update-crontab 
```

### 実行結果

実際に1分ごとにバッチ処理がされていることがわかります.

```bash
$ cat log/crontab.log 
Running via Spring preloader in process 78244
2020-05-29T19:50:01+09:00
test
Running via Spring preloader in process 78534
2020-05-29T19:51:01+09:00
test
Running via Spring preloader in process 78598
2020-05-29T19:52:00+09:00
test
Running via Spring preloader in process 78652
```
Flaskを使用し、外部ファイルを実行する

# やったこと
Flaskでウェブページを作成。  
ボタンをクリックすると外部のスクレイピングファイルを実行させる。



#Flaskの準備
Flaskのインストール

```
pip install Flask
```

元となるファイルを作成

```py:root.py
from flask import Flask

app = Flask(__name__)


@app.route('/')
def hello():
    return 'Hello!'


if __name__ == "__main__":
    app.run(debug=True)

```

実行

```
python root.py
```

その後

```
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
```
と、出力されるのでhttp://127.0.0.1:5000/ へアクセスします。

![スクリーンショット (57).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533114/cbbd4703-d5e3-9836-56ab-4e3f6f4616cd.png)

Hello!が表示されています。

# テンプレートエンジン「Jinja2」を使ってHTMLを書く

import等追加する

```py:root.py
# from flask import Flask
# 追加↓
from flask import Flask, render_template

app = Flask(__name__)


@app.route('/')
def hello():
  #return 'Hello!'
  # 追加↓
  return render_template('layout.html', title='Scraping App')


if __name__ == "__main__":
    app.run(debug=True)

```

templatesフォルダを作成し、その中にlayout.htmlを作ります。
buttonタグをクリックすることでGETメソッドを送信するようにします。

```html:layout.html
<!doctype html>
<html>

<head>
  <!--       ↓　render_templateの中で書いたtitleが入る      --> 
  <title>{{ title }}</title>
</head>

<body>
  <div class="member">
    <img src="/static/img/akimoto.jpg" alt="img1">
    <h2>秋元真夏</h2>
    <form method="GET" action="/scraping">
      <button type="submit">Start Scraping</button>
    </form>
  </div>
</body>

</html>
```

staticフォルダを作成し、中にcss、img作成し、見た目を整える。



# 最終的なファイル中身

```py:root.py
from flask import Flask, render_template
# ↓　Flaskを通し実行したいファイルをインポート
import scraping

app = Flask(__name__)


@app.route('/')
def hello():
    return render_template('layout.html', title='Scraping App')

# ↓ /scrapingをGETメソッドで受け取った時の処理
@app.route('/scraping')
def get():
    # ↓　実行したいファイルの関数
    return scraping.scraping()


if __name__ == "__main__":
    app.run(debug=True)

```

```html:layout.html
<!doctype html>
<html>

<head>
  <title>{{ title }}</title>
  <link rel="stylesheet" href="/static/css/index.css">
</head>

<body>
  <div class="member">
    <img src="/static/img/akimoto.jpg" alt="img1">
    <h2>秋元真夏</h2>
    <form method="GET" action="/scraping">
      <button type="submit">Start Scraping</button>
    </form>
  </div>
</body>

</html>
```

↓　今回実行したスクレイピングファイル
[乃木坂46ブログの画像をスクレイピングで取得する](https://qiita.com/xxPowderxx/items/e9726b8b8a114655d796)


### 最終のフォルダ構成
+ /root.py
+ /scraping.py
+ /templates
    + layout.html
+ /static
    + /css
      + /index.css 
    + /img
      + /akimoto.jpg

### 表示画面
![スクリーンショット (55).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533114/cf9170a7-6db7-5d14-1afe-0dbe17dc643e.png)

### ボタンをクリック後、作成されたフォルダ
![スクリーンショット (56).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533114/a23f4f56-7fde-94b4-708e-78ea53d4ddc8.png)

これまでコンソールから実行していたPythonファイルをウェブページを通して行えるようになりました！
Create Simple PHP 7 CRUD REST API with MySQL & PHP PDO

This is a step by step PHP 7 & MySQL REST API tutorial, In this tutorial i am going to share with you how to create a PHP 7 CRUD (Create, Read, Update, Delete) RESTful API with MySQL database.

click here to read more:
https://www.positronx.io/create-simple-php-crud-rest-api-with-mysql-php-pdo
Github Actionsのスクリプトでgit commitする時に更新がなかった場合エラー(Process completed with exit code 1.)が出る問題の対処法

例えば下記の様なスクリプトがあった場合、何もgitレポに更新がないと、```git commit -m "By Yamada Taro"```だけだと```Process completed with exit code 1.```が出てしまう。

エラーが出て見栄えが悪いだけで、別になんの問題もないようですが、

```bash
git commit -m "By Yamada Taro" || echo "No changes to commit"
```

と、```||```でエラーをキャッチしてあげることで、エラーが記録されなくなりサッパリとします。


```YAML
# This is a basic workflow to help you get started with Actions

name: 適当な名前

# Controls when the action will run. Triggers the workflow on push or pull request
# events but only for the master branch
on:
  push:
    branches: [ master ]
  pull_request:
    branches: [ master ]

# A workflow run is made up of one or more jobs that can run sequentially or in parallel
jobs:
  # This workflow contains a single job called "build"
  build:
    # The type of runner that the job will run on
    runs-on: ubuntu-latest

    # Steps represent a sequence of tasks that will be executed as part of the job
    steps:

    - uses: actions/checkout@v2

    - name: Cache node modules
      uses: actions/cache@v1
      env:
        cache-name: cache-node-modules
      with:
        # npm cache files are stored in `~/.npm` on Linux/macOS
        path: ~/.npm
        key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('**/package-lock.json') }}
        restore-keys: |
          ${{ runner.os }}-build-${{ env.cache-name }}-
          ${{ runner.os }}-build-
          ${{ runner.os }}-
          
    - name: Install NPM dependencies
      run: npm install

    - name: Run Script
      run: npm run dosomething

    - name: Push any changes to the Git repo
      run: |
        git config user.email "info@yamada-tarou.com"
        git config user.name "山田太郎"
        git push origin HEAD:master
        git add .
        git commit -m "By Yamada Taro" || echo "No changes to commit"
        git push

```

参考にしたページ：[How to let Jenkins git commit only if there are changes?](https://stackoverflow.com/a/32507305)
rubyでtripleDESやったらめちゃハマった話


## やりたいこと
tripleDESのCBCモードで暗号化したデータを先方のサーバーにリクエストすると、同様の方式でデータがレスポンスされるので復号する。

で、このtripleDESについて全く無知だったのでググってみると、Rubyの記事って案外情報が見つかりにくいんですね。
色々検索してこちらのページにたどり着きました。
http://timolshansky.com/2011/10/23/ruby-triple-des-encryption.html

実際ここで書かれているコードを実行すると、ちゃんと動くんです。が、ここからが長かった。

## 先方の認証サーバーにリクエストするもうまくいかない
いただいた鍵を使って、その他パラメータを何度確認してもミスはない。ぐぬぬ...

恥を忍んで先方の方が暗号化の際に使っているコード（別の言語）を見せていただくと....おや？暗号化したバイトの先頭に何かくっつけているぞ？

## 初期化ベクトルというもう一つの鍵
実は、今回の暗号化方式(des-ede3-cbc)では、秘密鍵の他に**初期化ベクトル**という物を実質鍵のように使って暗号化しているんですね。
これに気づくのに随分と時間がかかった。なんでかっていうと、↑に挙げたページやその他ぐぐったページでは 'pkcs5_keyivgen' というメソッドを使っているんですよ。
要は インスタンス作る -> pkcs5_keyivgenで鍵と初期化ベクトルをセット -> 暗号、復号する  という流れなんですが、これだと同じ初期化ベクトルを使っていることになる。だから復号できる。

が、今回の条件は **こちらの手元で暗号化 -> 相手サーバーで復号 となるので、相手は秘密鍵だけでなく初期化ベクトルの情報を知らなければいけない** んですね。 (先頭に初期化ベクトル入れるってのはtripleDESの仕様なのでしょうか？これはググってもわからんかった)

## 実装
というわけで、実際にやってみたのがこちら。今回は、先頭8byteが初期化ベクトル。

```ruby
class TripleDES
  class << self
    IV_LENGTH = 8
    SECRET_KEY = 'your__awesome_Secret_Key'

    def get_cipher
      cipher = OpenSSL::Cipher.new('des-ede3-cbc')
      cipher.key = SECRET_KEY
      cipher
    end

    def encrypt(plain_string)
      cipher = get_cipher
      cipher.encrypt

      # 初期化ベクトルを生成する
      iv = OpenSSL::PKCS5.pbkdf2_hmac(SecureRandom.alphanumeric(10), SecureRandom.alphanumeric(10), 2, IV_LENGTH, 'sha1')
      cipher.iv = iv

      output = cipher.update(plain_string)
      output << cipher.final

      # 生成した暗号の前に初期化ベクトルを入れる
      iv + output
    end

    def decrypt(encrypted_byte_string)
      cipher = get_cipher
      cipher.decrypt

      # 初期化ベクトルと本文をそれぞれ取り出す
      iv = encrypted_byte_string.byteslice(0, IV_LENGTH)
      cipher.iv = iv
      target_bytes = encrypted_byte_string.byteslice(IV_LENGTH, encrypted_byte_string.chars.count)

      output = cipher.update(target_bytes)
      output << cipher.final
    end
  end
end
```

## 余談
pkcs5_keyivgenは非推奨メソッドってちゃんと書いてあるのにしばらく気づかなかった。笑
https://docs.ruby-lang.org/ja/latest/method/OpenSSL=3a=3aCipher/i/pkcs5_keyivgen.html

こちらの方が詳しい。そうなんですよ、pkcs5_keyivgenはivを取って来れないんですよね。
https://techmedia-think.hatenablog.com/entry/20110527/1306499951

今後実装される方のヒントになれば幸いです。久々にハマった....
XcodeGenを使ってUI Testing Bundle (UIテスト用ターゲット) を追加する

Product Typeに `bundle.ui-testing` を指定するとUIテスト用ターゲットを追加できます。
https://github.com/yonaskolb/XcodeGen/blob/master/Docs/ProjectSpec.md#product-type

project.ymlでUIテスト用ターゲットの定義と、メインのターゲットでのtestTargetの定義をすれば追加できます。

```project.yml
targets:
  ExampleApp:
    type: application
    ...
    scheme:
        testTargets:
            - ExampleAppUITests
  ExampleAppUITests:
    type: bundle.ui-testing
    platform: iOS
    scheme: {}
    sources: ExampleAppUITests
    dependencies:
      - target: ExampleApp
    settings:
      INFOPLIST_FILE: ExampleAppUITests/Info.plist
```

ちなみにいきなり xcodegen コマンドで生成しても良いですが、テストクラス以外にInfo.plistが必要になります。
XcodeでUIテスト用ターゲットを通常通り作ってからXcodeGenで管理するようにしても良いと思います。

`Product > Test` か `Cmd-U` して、テストが実行されればOKです。
決定木(Decision tree)とは

決定木とは
ーある基準に基づいて分類分けをしていくアルゴリズム。



よくある例
花の分類
ー花びらの長さ・幅に基準を設けて分ける。(iris)

具体的には
2.45cm以下の長さの花びらを持つ花はヒオウギアヤメ(Setosa)。
それ以上のものはさらに花びらの幅1.75以上以下で2種類（versicolor, virginica）に分ける。

ではその基準をどう決めているのか。
ー（分類前の不純度ー分類後の不純度）を最大にする値で基準を決める。


意味わかんないでしょうwww

最初から説明すると、どんだけきれいに分かれているかを最大化するという話です。


まず、不純度とはどれだけのいろいろなクラスの観測地が混じり合っているかを示すものです。高いほどグループとして揃ったデータではなく、低いほど同じものが同じグループとして分類されていることを示します。

例えば、3種類の花（Setosa, versicolor, virginica）を設定した基準で分けた後に間違って違うグループに入ってしまう割合を花の分類における不純度といいます。これを最小にするように基準を設けようという話です。

決定木とは分類後と分類前で不純度の最小化をして最適な分類の基準を設けて分けていくアルゴリズムというわけです。



この決定木のメリットとしては
 　・理屈や途中の基準がほかアルゴリズムと比べても分かりやすい（ホワイトボックスといわれる）
   ・分類・回帰両方に利用可能。

デメリットとして
　　・過学習になりやすい（Non-parametric model）
＜ーー＞線形回帰は元々回帰モデルを決定する際に人による教師あり学習ができて過学習になりにくい（e.g 回帰曲線は人間が決めるから）
　　・外れ値の影響を受けやすい(元々整理されたデータでないと不純度が上がりやすく分類が正確でない)


　　
対策として
　・パラメータを適切に設定する（過学習対策）。
　・木の深さの上限を決める必要がある。（分類しようと思えばいくらでもできてしまうから）


過学習の状態とは、ある機械学習において訓練データを適合しすぎると検証データで逆に精度が低くなる現象のことです。

すごくわかりやすく例えると、視野が狭くなって頑固になってしまう人のようなものです。同じようなこと繰り返しすぎてしまってそれ以外のことが下手になる。
ことわざの”一芸は百芸に通ずる”はAIの機械学習において間違いです。
　　
最後に、過学習や分類のし過ぎは分類の目的を失っています。

分類の目的は物事に重要で信頼できる区切りを見つけようということです。