OmniAICreator/Qiita-1.07M huggingface dataset:
AzureDevOpsを利用したAndroidの自動ビルド設定手順

# 意図しないビルドエラーを防ごう

* プルリク、プッシュ問わずいずれかのブランチへの同期が行われた場合に自動でビルドを実行するように設定を行います。
* ビルドの結果は同期処理を行ったユーザーへメールで通知されますので、同期を行った際に自分の変更したプログラムが他のメンバーで不都合が生じるプログラムなのかが自分で判断することができるようになります。
* ビルドを行いその結果を通知するだけであれば簡単に設定ができるのでどんどん活用していきましょう。

# STEP 1.

AzureDevOpsにアクセスし、Pipelines→Buildsを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80457/10c98c52-8976-9a18-f3ca-9e83930ddc85.png)

# Step 2.

Newをクリック → New build pipelineをクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80457/f6b9da32-5d6a-68b7-4d11-fe0179023e7e.png)

# Step 3.

Azure Repos Gitを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80457/2944ea47-d1be-5ad1-6b38-82d52c585158.png)

# Step 4.

プロジェクトとリポジトリーを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80457/9902c40b-46b6-3851-aa06-a8f9f4aff668.png)

# Step 5.

Androidを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80457/542f8678-a6c3-030d-4190-838cf73d1c0a.png)

# Step 6.

何も変更せずにSave and Runをクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80457/9e69655b-c96b-df55-0a52-6a0d8322a65c.png)

# Step 7.

コミットするための情報を記入選択し、Save and runをクリック。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80457/352c6df3-2b87-31b7-4c96-c4e2e7c18740.png)

# 設定完了

これで設定は完了です。ビルドが完了するまで待ちましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80457/570a698c-a955-755c-a8ae-4dd13c7d4f69.png)

# ビルドが完了すると

AzureDevOpsでのビルド完了画面と送られてくるメールの図です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80457/3c15b632-18ee-e50d-fc92-b67cbd3bb390.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80457/8691cf2d-8381-3445-7e56-820e17043aa7.png)

# おわり

ビルド定義ファイルがコミットされて、そのビルド定義ファイルが含まれているブランチに対する同期処理が行われた際に自動でビルドが実行されます。

ここで設定したのは基礎中の基礎で実際にプロジェクトで運用しているのは特定のブランチでのみ実行されるパイプラインやブランチによって変わる構成を切り替えAPK生成まで行うものを構築して運用しています。
その辺の設定はまた別に記述したいと思います。
「STM32」タグについて

### 対象
(件数は2019-06-28現在)

- https://qiita.com/tags/stm32 : 148記事


### 説明

STMicroelectronics社のマイクロコントローラに関する記事。
https://www.st.com/ja/microcontrollers-microprocessors/stm32-32-bit-arm-cortex-mcus.html

### 型番違い
(件数は2019-06-28現在)

- https://qiita.com/tags/stm32f4-discovery : 13記事
- https://qiita.com/tags/stm32f4discovery : 4記事
- https://qiita.com/tags/stm32f4 : 2記事
- https://qiita.com/tags/stm32l : 1記事
- https://qiita.com/tags/stm32l4 : 1記事

### 関連タグ
(件数は2019-06-28現在)

- https://qiita.com/tags/stm32cubemx : 50記事
- https://qiita.com/tags/nucleo : 36記事
- https://qiita.com/tags/stm32cubeide : 8記事
- https://qiita.com/tags/st-link : 4記事
- https://qiita.com/tags/cubemx : 2記事
Laravel5.7のServiceコンテナをモック化してする方法

Laravelに限らずですが外部のAPIを通信したり、重い処理を実行しているの部分があるのでテストの時はモックにしたい、といった場面は多々あると思います。
今回はServiceコンテナをモック化する方法をまとめていきます。


# Serviceコンテナが使われているコード

```
    public function store(Request $request, User $user)
    {
        // ScrapeManagerの生成
        $scrapers = resolve('app.bookInfo.scrapeManager');

        // ScrapeManagerの実行
        $newBook = $scrapers->searchByIsbn((string)$isbn);

        // ......
```

Serviceコンテナのキーを使ってresolveで生成しています。
この中身をモック化できればいい感じにテストができそうです。

(Managerなんて責務の大きい名前を使ってんじゃねぇ、という意見は却下します)


# テスト内でモック化する

```
    public function setUp()
    {
        // モックを作成
        $mock = \Mockery::mock(ScrapeManager::class)
            ->shouldReceive('searchByIsbn')
            ->andReturn($this->book)
            ->getMock();

        // モックを適用
        $this->app->bind('app.bookInfo.scrapeManager', function() use ($mock) {
            return $mock;
        });
    }
```

実はこれだけです。
`Mockery::mock`でモック化対象のクラスを指定します。
`shouldReceive`で対象メソッドを指定します。
`andReturn`で対象メソッドの戻り値を設定します。
あとは最後に`getMock`を実行してモックのインスタンスを獲得することを忘れないようにしてください。

次に作成したモックをresolveで解決できる形に設定する必要があります。
`$this->app->bind`を使います。
第一引数にresolve時に使うキーを指定し、第二引数にはモックを返す関数を設定します。

テスト終了後に`Mockery::close()`を実行することを忘れないようにしましょう。

あとはただただテストをするだけです。
そうすれば処理の中でモック化したキーのresolveが使われれば、モックオブジェクトが呼び出されて任意の処理になります。

# テストについて

Laravelでコントローラーテストをする場合にはこちらの記事をご覧ください。

[Laravel5.7でAPIコントローラーをメソッドとしてテストする方法](https://nakka-k.hatenablog.com/entry/2019/06/28/110621)


# まとめ

処理の重い部分、特に外部に影響を与える部分はちゃんとモック化しましょう！！
日々の進捗ノート_言語処理100本ノック03

# 03.円周率
>"Now I need a drink, alcoholic of course, after the heavy lectures involving quantum mechanics."という文を単語に分解し，各単語の（アルファベットの）文字数を先頭から出現順に並べたリストを作成せよ．

```gengo03.py
sen = "Now I need a drink, alcoholic of course, after the heavy lectures involving quantum mechanics."
sen = sen.replace(",", "")
sen = sen.replace(".", "")
sp = sen.split(" ")
res = []
for i in sp:
    res.append(len(i))
print(res)
```
####結果
`[3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5, 8, 9, 7, 9]`

####備忘録
・replaceじゃない記述法がある気がする
・分割するときはsplit
・forでリストに格納していくときは予め空のリストを宣言しておく
→appendとかのメソッドを使うためにはもととなるものがないとダメ
・円周率はだいたい3
cwltool の入れ方 201906

# 概要

（石井、まだ書きかけです。）

cwltoolの入れ方がいろいろあるので、どれがよいのか、2019

# 結論

混ぜないほうがよいので、すでに既存環境整備している人は、それを使うのが良いかと思います。

debian/ubuntu の人は、apt
pip の人は、pip
conda の人は、conda

まっさらの人は、、、

## debian/ubuntuの場合

```
apt-get install cwltool
```

## pip の場合

python2系はそろそろサポートがおわるので、

```
pip3 install cwltool
```

ただ、このとき、コンパイルが必要なものがあるので、
必要があれば

```
apt-get install build-essential python3-dev
```

# conda の場合

conda-forgeだと比較的最新版が入るとのこと。


# 参考情報
React Native Androidで画像を表示すると品質が低下する

## 現象
React Nativeで開発しているものです。iosでは問題ないのに、androidで画像を表示すると、品質が落ちるということがありました。

## 原因
原因はReact Nativeの不具合らしく、下記の記事によると、0.56以降のバージョンで起きるみたいです。

<https://stackoverflow.com/questions/53402308/react-native-0-57-x-image-large-images-low-quality>

## 対策
Imageタグではなく、FastImageを使用する。
[公式サイトはこちら](https://github.com/DylanVann/react-native-fast-image)

### インストール方法

```console
$yarn add react-native-fast-image
$react-native link react-native-fast-image
```


Androidの場合は、下記の設定が必要です。
(+)になっているところを追加する。
[参考ページ](https://github.com/DylanVann/react-native-fast-image/blob/master/docs/installation-manual.md)

```android/settings.gradle
rootProject.name = 'MyApp'

include ':app'

+ include ':react-native-fast-image'
+ project(':react-native-fast-image').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-fast-image/android')
```


```android/app/build.gradle
apply plugin: 'com.android.application'

android {
    ...
}

dependencies {
    implementation fileTree(dir: "libs", include: ["*.jar"])
    implementation "com.android.support:appcompat-v7:${rootProject.ext.supportLibVersion}"
    implementation "com.facebook.react:react-native:+"  // From node_modules
+   implementation project(':react-native-fast-image')
}
````




```android/app/src/main/java/.../MainApplication.java
package com.myapp;

+ import com.dylanvann.fastimage.FastImageViewPackage;

....

    @Override
    protected List<ReactPackage> getPackages() {
        return Arrays.<ReactPackage>asList(
            new MainReactPackage()
+           ,new FastImageViewPackage()
        );
    }

}
```
macOS+XAMPP+phpMyAdminでアクセスできなかった時の解決法

概要
--
macOS で、XAMPP をインストールし、phpMyAdmin を使用する時に、「アクセス禁止！」が表示された時の対処法。

環境
--
MacOS X Mojave, XAMPP 7.3.6, PHP 7.3.6, Apache 2.4.34, MariaDB 10.4.6

方法1
--
1. XAMPP の「Volumes」タブで、「/opt/lampp」：「mount」を選択
2. /opt/lampp/etc/extra/httpd-xampp.confを開く。

```xampp:/opt/lampp/etc/extra/httpd-xampp.conf
# since XAMPP 1.4.3
<Directory "/opt/lampp/phpmyadmin">
    AllowOverride AuthConfig Limit
    Require local
    ErrorDocument 403 /error/XAMPP_FORBIDDEN.html.var
</Directory>
```

20行目付近、```Require local```を```Require all granted```に変更する。

```xampp:/opt/lampp/etc/extra/httpd-xampp.conf
# since XAMPP 1.4.3
<Directory "/opt/lampp/phpmyadmin">
    AllowOverride AuthConfig Limit
    Require all granted
    ErrorDocument 403 /error/XAMPP_FORBIDDEN.html.var
</Directory>
```

Apache を再起動すればアクセス出来る。

方法2
--
XAMPP の Network 設定を開く。
![スクリーンショット 2019-06-28 10.04.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398489/e5e5f76f-98e3-ccd1-5fe0-9ffdbdc7e455.png)

```localhost:8080 -> 80 (Over SSH)```を選択し、Enable を選択。
これで```http://localhost:8080/phpmyadmin/```からアクセス出来るようになった。

感想
--
学校の実習で XAMPP を使用する際に phpMyAdmin にアクセスできなかったので解決策を調べました。これで問題なく授業が受けられそうです。

参考
--
・[macOS+XAMPP+phpMyAdminで「アクセス禁止！」が出る時の対策](https://jet-consulting.tech/blog/mac_xampp_phpmyadmin_ng/)
・[MacのXAMPPでphpMyAdminにアクセス
](https://qiita.com/Scstechr/items/24ba0d50aa5dc3beae66)
IBM Cloud ゾーン内の異なる pod の1つ目の VLAN を格安で手に入れる方法


# はじめに
通常 "Premium VLAN" を追加するには $28/月 がかかってしまいますが、異なる pod の1つ目の "Automatic VLAN" については格安で手に入れることができます。

# Placement groups を作成

>[Managing placement groups](https://cloud.ibm.com/docs/vsi?topic=virtual-servers-vsi_managing_placegroup#vsi_managing_placegroup)

![Kobito.Arvln6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/e0ab1ede-e6ac-0c09-3dac-ac756c0d92c3.png "Kobito.Arvln6.png")

# 作成した Placement groups を指定して仮想サーバーを作成

![Kobito.LE4UD5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/f10f5c6f-b6ae-2dc6-16b8-e77616753b1f.png "Kobito.LE4UD5.png")

# 新規に異なる pod の1つ目の VLAN が払い出されたことを確認

![Kobito.lcd3eZ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/799c0700-d3a1-c68f-ceb6-5ece537413ba.png "Kobito.lcd3eZ.png")

![Kobito.zENn8M.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/14c2b9f5-971c-1a0a-e0ec-7a2e5e08d41e.png "Kobito.zENn8M.png")

# まとめ

新規に異なる pod の1つ目の Automatic VLAN を入手できたことで、この Automatic VLAN をターゲットにした、サーバー払い出し・IPアドレス追加等をおこなうことができます。
その後、今回作成した仮想サーバーは削除して問題ありません。
Automatic VLAN は、最後のサーバーキャンセルから48時間後に削除がスケジュールされます。
また、無料の Portable Private IP を Automatic VLAN に購入しておけば削除対象になりません。
vimのGoの言語補助プラグインでUnknown functionバグが発生した

vimをupgradeさせた時に唐突にvimがエラーを吐き出し始めました。
エラーは吐き出すもののとりあえず動いてはいました。
ですが`vim-go`のある部分でエラーが発生しているようでした。

`Error on startup: Unknown function: go#config#CodeCompletionEnabled`

とりあえず`vim-go`のissueを探していると今回の問題に関係ありそうなissueを発見しました。

[Error on startup: Unknown function: go#config#CodeCompletionEnabled](https://github.com/fatih/vim-go/issues/2262)


このissueに書いてあることを要約すると「`sheerun/vim-polyglot `から使用される言語系プラグインを、`vim-polyglot`より先に読み込んではいけない。」というものでした。
`vim-polyglot`を最後に読み込むようにコードを書き換えて再度読み込みすれば解決しました。
私の場合はdein.vimを使っていたのでキャッシュを削除してもう一度プラグインのインストールを走らせる必要がありました。
はじめてのJulia "JupyterのJuはJuliaのJu"

WEB+DB PRESS の最新号で Julia が特集されていましたのでやってみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225878/7bec193f-ce45-a266-c649-b92056d2ca29.png)

マサチューセッツ工科大学（MIT）発のこの言語は高速に動作するため、科学計算の分野で高い関心を集めており、深層学習やビッグデータの処理に期待できると思っています。

ダウンロードページ https://julialang.org/downloads/ からバイナリを取得してインストールします。
Hello, World! と四則演算はこんなかんじです。演算は数式そのままでいける。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225878/39f9e672-360b-9a5d-aa0a-8e184026d0d5.png)

I/Oストリームへの書き出しと読み込みの例です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225878/708376ae-60d0-bf03-4ce4-3765e6728799.png)

第三章は [mrknさん](https://twitter.com/mrkn) が執筆された「Juliaによるデータ解析」。"JupyterのJuはJuliaのJu"だそうです。
[Jupyter Blog (I Python, You R, We Julia)](https://blog.jupyter.org/i-python-you-r-we-julia-baf064ca1fb6) によると、Jupyterは現代科学界の柱となっているJulia、Python、Rの各言語の頭文字をとって命名されたようです。

実際に使いこなすには IJulia.jl をインストールして Jupyter Notebook で動かすのがいいようです。

私の Jupyter Notebook は Python しか動かせないので次は Julia が動かせるようにして統計解析や機械学習などの練習をしてゆきたいと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225878/5419d94b-c7d2-92eb-2573-7929b39fbe6f.png)

JuliaTokyoのSlack招待リンク が connpass の [JuliaTokyo #9](https://juliatokyo.connpass.com/event/107996/) の情報ページにあったので Slack に参加して情報交換できるようにしておきました。
Spring Boot 2.xのコンテキストパスの設定

#SpringBoot2.Xのコンテキストパスを設定するには？

SpringMVCではweb.xmlに以下のように設定しましたが、SpringBootのやり方がわからなかったのでメモ

```xml:web.xml
    <servlet>
        <servlet-name>appServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath*:META-INF/spring/spring-mvc.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>appServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
```

## 背景
SpringBootでAPI開発しようと思って、`http:///localhost:8080/api/v1/app`のように設定しようと思ったらデフォルトでは`http:///localhost:8080/app`でマッピングされるので`/api/v1`を`Controller`の`RequestMapping`に実装するのも冗長だなと思い。

## 本題
意外と検索しても情報が違う。。。と思ったので調べてみました。

[SpringBoot公式Appendix](https://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html)を見ると該当しそうなプロパティが3つ。

`server.servlet.context-path=`
`server.servlet-path=`
`spring.mvc.servlet.path=`

### server.servlet-path
[本家](https://github.com/spring-cloud/spring-cloud-netflix/issues/3090)では現在非推奨とのこと。`spring.mvc.servlet.path`を使え!!

### spring.mvc.servlet.path
コンテキストパスではなくサーブレットパス。初め、これを設定してしまいました。
`spring.mvc.servlet.path`設定して`RequestMapping`でマッピングした`Controller`が動くので
勘違いしていました。

Thymeleafのリンク式がうまくレンダリングされなかったので調べた経緯。

### server.servlet.context-path
コンテキストパスの設定はこれでした

## 結論
コンテキストパスなら以下のように設定するのが正解

```properties:application.properties
server.servlet.context-path=/api/v1
```

コンテキストパスとサーブレットパスがごっちゃになっていたようです。
ちなみに`SpringBoot1.X`では`server.context-path=/api/v1`で設定できます。

## 補足
Thymeleafのリンク式では`/`で始めるとコンテキストパスが追加されます。

```html:元のhtml
<a th:href="@{/app/member}">メンバ表示</a>
```

```html:render
<a href="/api/v1/app/member">メンバ表示</a>
```



## 参考URL
[Spring Boot Change Context Path](https://www.baeldung.com/spring-boot-context-path)
DataCampのチートシートが秀逸な件について

https://www.datacamp.com/community/data-science-cheatsheets

PDF一枚で良くまとまってると思いました。
↓こんな感じで
![WS000014.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273349/024b98c1-2d25-847d-7aa8-2e6239ff5c0e.jpeg)


scikit-learnやkerasなど主要なところは抑えられています。
よく使うやつは印刷して手元に置いておくと良いと思います。
Clean Architecture メモ

学習した事をノート代わりにまとめていきます。
主に自分の学習の流れを振り返りで残す形なので色々、省いてます。
Webエンジニアの諸先輩方からアドバイスやご指摘を頂けたらありがたいです！

#第19章 方針とレベル
最初に書かれていることは今までやった事のまとめに近い内容である。
コンピュータプログラムは、入力を出力に変換をどのように行うかの方針を決めたもの。

アーキテクチャの技芸ではまとめたコンポーネントを上位の物から下位の物にと[有向非循環グラフ](https://mathwords.net/dag)にすることがよくある。この様にするのがアーキテクチャの仕事

###重要な事
>優れたアーキテクチャではこうした依存性の方向は接続するコンポーネントのレベルで用の様な設計にするのかを決める。どの様な場合でも、下位レベルのコンポーネントが上位レベルのコンポーネントに依存する様にしっかりと設計する必要がある。

#レベル
レベルによって上位と下位を決めている。
「入力と出力からの距離」から離れていれば上位に、近ければ下位になる。

- 以下の図の場合
 - 文字の読み取りが入力
 - 文字の書き出しが出力
になる。

この場合、入力と出力からもっとも離れているコンポーネントはTranslate(変換)になる。
これがシステム上最上位のコンポーネントになる。
![スクリーンショット 2019-06-24 18.51.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394657/117b8de2-8145-6bb9-b980-a1421ee91a76.png)
ここで重要なのが**ソースコードの依存性はデータフローから切り離しレベルで結び付けるべき**であるという事。

 encrypt()は良くない、上位が下位の物に依存しているからだ

```jsx

function encrypt()
 while(true)
  writeChar(translate(readChar()));
```

>図19-2のEncryptは自分の処理を変える必要がない、これはソースコードの依存性を上位レベルの方針に向けているからである

#第２１章　ビジネスルール
>データの処理の仕方をエンティティと呼ぶ。

![スクリーンショット 2019-06-24 19.23.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394657/7b1e1fa1-7c5c-5e27-cf08-d16866a51f73.png)

**これはプレイベートで内部的なプロパティ**

```jsx
-principle
-rate
-period
```

**Publicなmethod**

```jsx
-principle
-rate
-period
```

>Railsはmethodにビジネスロジックを書く
[Plain Old Ruby Object](https://qiita.com/itume/items/1c4382b94dee9e90d7d9)

ここで重要なポイント
**エンティティなどは上位レベルとして定義される（ビジネスロジックは遠い物になるので）、この場合はユースケースなどは下位になる様に設計すべきである。**

>リクエストとレスポンスのモデル
ユースケースなどがSQLやHTMLに直接干渉してはいけない。

#第２2章　叫ぶアーキテクチャ
最初の例で言っているのは建築士なら設計図を見たら作ろうとしているものが何であるかわかる、つまりエンジニアもアーキテクチャを見ればこれが何であるかを理解することができるという事を言いたい。
>日本ではあまりなじみの無い例えをここの章ではされている。アメリカの１戸建ての家では普通うのダインングルームの別にお客様用のダイニングスペースがあるこれがダイネットエリアのことである。

- だがウェブはどうか？<br>
　例として2020年の東京オリンピックのチケット販売のページで大量の人からのリクエストをさばかないといけないので待ち行列にしている点もエンジニアとしたらどうかと考える人も多いだろうが、ビジネスロジックとしては優れたものと言える。

- フレームワークはツールであり、生き方ではない<br>
 ここで言いたいのはRailsにおける初めはRailsのレールに100%従う方針で問題無いがRailsのレールを乗りこなせる様になることができればケースによって自分でどの様にレールを外れてフレームワークを活用するか考えることが大事であるという事を言っている。

- テスト可能なアーキテクチャ<br>
　しっかりとクリーンアーキテクチャでこれまで述べてきた通りにエンティティやユースケースなどは分離されており、依存関係がしっかり設計されているのでユニット単位でしっかりとテストができている状態である、逆にできなければ設計が間違えているという事だ。

- まとめ<br>
　Railsにおいてmodelがしっかり書かれておりそのビジネスロジックを見ればどういうものが分かる。

>しかし最後の「それは詳細だから、まだ気にする必要はないよ。あとから決めよう」という部分は全てをあとから設計するのは難しい点がある。
モバイルCP/M

cpm8266のシリアルにHC-05をつなぎBluetoothで利用できるようにしてみました。

![写真（2019-06-27 12.59）.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/6667780e-3e64-80cb-3875-d29df4918121.jpeg)

HC-05はエッジの接続パターンはそんなに強くないので、剥がれてしまうことがあるので注意したほうが良いです。変換基板もありますが、ちょっと大きくて使い勝手が悪そうなので、いろいろ考えてリードで浮かせて四隅を基板に接続してあります。それ以外はワイヤーで必要なところだけ接続しています。

これをAndroidで使ってみます。Bluetoothのterminalアプリを探してみたのですが、いくつかあり古いアプリですがBlueTermを試してみました。

![スクリーンショット 2019-06-28 9.15.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/b7a7d449-a1b3-8fa3-c7ff-0af13bafcb4a.png)

スマホの入力はとっても不得意なのでキーボードもBluetoothのもの利用します。

Control keyの設定がPreferencesの中にあるのでLeft Altにして、Connect deviceします。

とりあえず使えますが、キーがコンフリクトしているようなところがあり、あまり快適ではありません。

![写真（2019-06-28 8.38）.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/7480e39e-4a8e-cc81-c9d2-450602a01003.jpeg)

良いアプリあったら教えてください。
Python でテキストマイニング（WordCloud）

#はじめに#
この記事では、[ある地域ブログ](https://blog.sagafan.jp/)の最新記事200件のタイトルを Web スクレイピング（beautifulsoup）で取得し、テキストマイニング（wordcloud）を行います。

#環境#

+ Windows 10 Pro
+ Python 3.6.8 (anaconda)
+ wordcloud 1.5.0
+ beautifulsoup 4.7.1

#Web スクレイピング#
Web スクレイピング（beautifulsoup）で、最新記事200件のタイトルが表示されているページ（[https://blog.sagafan.jp/allentry](https://blog.sagafan.jp/allentry)）から、タイトルを取得。

タイトルは h3 タグで表示されているので、soup.find_all('h3') で全てのタイトルを配列として取得します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/425339/68f0e653-5924-1e53-cef8-64be79831a5a.png)

```python
import requests
from bs4 import BeautifulSoup

## さがファンブログの新着記事200件の URL
url = 'https://blog.sagafan.jp/allentry/'

## Web スクレイピングでタイトルを取得
response = requests.get(url)
response.encoding = response.apparent_encoding
 
soup = BeautifulSoup(response.text, 'html.parser')

title = []

for i in soup.find_all('h3'):
    
    ## タイトルの先頭は HH:MM␣ なので、7行目以降をタイトルとして取得
    ## 改行コードを削除
    title.append(i.getText()[6:].replace('\n', ''))
```
#テキストマイング（wordcloud）#
##wordcloud の日本語表示##
wordcloud を日本語表示するため、IPA フォントをダウンロードし、ワークディレクトリに保存します。
[IPAフォントのダウンロード](https://ipafont.ipa.go.jp/old/ipafont/download.html)

##テキストマイング##
タイトルより名詞のみを抽出し、wordcloud を作成します。

```python
from janome.tokenizer import Tokenizer
from wordcloud import WordCloud

## 除外する単語リスト
## 今回は除外なし
ignore_words = ['']

## タイトルの名詞のみをスペース区切りのテキストへ変換
t = Tokenizer()

words = []

for i in title:
    tokens = t.tokenize(i)
    
    for token in tokens:
        ## 品詞を抽出
        pos = token.part_of_speech.split(',')[0]
        
        ## 品詞から名詞だけ抽出
        if pos in ['名詞']:
            ## 必要ない単語を省く
            if token.base_form not in ignore_words:
                words.append(token.base_form)
                
text = ' '.join(words)

## wordcloud の実行
## 日本語フォントを指定
wordcloud = WordCloud(background_color='white', 
                      font_path='./IPAexfont00301/ipaexg.ttf', 
                      width=800, height=400).generate(text)

## 結果を画像に保存
wordcloud.to_file('./wordcloud.png')
```

#wordcloud の結果#
![wordcloud.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/425339/4432c3e2-0cb9-c485-c23c-c3846acb1f0c.png)

#今後#
今後、テキストマイニングの分野は以下を勉強予定。

+ 共起ネットワーク
+ ネガポジ分析
+ word2vec を利用した文書の類似度を計算
Breadcrumb NavXTでリストの途中に項目を追加する

# 内容

Breadcrumb NavXTの`bcn_after_fill`アクションでリストの途中に項目を追加する方法です。
`array_splice`関数を使用しますが、この関数の`replacement`パラメータは、実行時に配列への強制的な変換を行います。このため、`new bcn_breadcrumb()`で生成したインスタンスをそのまま引数にすると分解されてしまうので要注意です。単数のインスタンスでも、意図しない変換が行われないように配列へ代入しておきます。

# コード

```PHP:functions.php
function bcn_insert_test($breadcrumb_trail) {
  $breadcrumb = new bcn_breadcrumb();
  $breadcrumb->set_title('test');
  $breadcrumb->set_url(home_url('test/'));
  array_splice($breadcrumb_trail->breadcrumbs, 1, 0, [$breadcrumb]);
  return $breadcrumb_trail;
}
add_action('bcn_after_fill', 'bcn_insert_test');
```
NodeJSバックエンドでユーザー認証を扱う

 `NodeJS`バックエンドでユーザー認証を扱うのに使いそうなモジュール。

## パスワードをハッシュ化する
パッケージ:

```bash
yarn add bcrypt
yarn add --dev @types/bcrypt
```

### 想定される状況
* クライアント側から送られてきたパスワードをハッシュ化してデータベースに格納する。
* データベースに格納されたハッシュ化したパスワードと認証のために送られてきたパスワードを比較する。


```typescript
...
import bcrypt from 'bcrypt';
...
action: async (request: Request, response: Response) => {
    const saltRounds: number = 10;

    const hashedPassword: string = await bcrypt.hash(request.body.password, saltRounds);
    const result: boolean = await bcrypt.compare(request.body.password, hashedPassword);
    const result2: boolean = await bcrypt.compare('wrong_password', hashedPassword);

    console.log(hashedPassword); // --> ハッシュ化されたパスワード
    console.log(result); // --> TRUE 
    console.log(result2); // --> FALSE
...
```
GitHub の Organization の private レポジトリ一覧取得

ちょっとそのような用事があったので、備忘録を残します📝

ASP.NET Core の TargetFramework は `netcoreapp2.2` にします。

[Refit](https://github.com/reactiveui/refit) をインストール

```bat
dotnet add package refit
```

API を定義

```csharp
namespace GitRepo.Interfaces
{
    [Headers(
        "User-Agent: GitRepo/0.1",
        "Accept: application/vnd.github.v3+json",
        "Authorization: token"
    )]
    public interface IGitHubApi
    {
        [Get("/orgs/{org}/repos")]
        Task<FoundRepos[]> ListOrgRepos(string org, string page);
    }
}
```

**Note:** `User-Agent` は必須項目です。ないと 403 エラーになりました。

モデルを定義

```csharp
namespace GitRepo.Models
{
    public class FoundRepos
    {
        public string name { get; set; }
        public string full_name { get; set; }
    }
}
```

Organization の private レポジトリ一覧を取得します。

```csharp
	var api = RestService.For<IGitHubApi>("https://api.github.com", new RefitSettings
	{
		AuthorizationHeaderValueGetter = () => Task.FromResult("TOKEN"),
	});

	var allRepos = new List<FoundRepos>();
	for (int page = 1; ; page++)
	{
		var reposList = await api.ListOrgRepos(
			org: "ORGNAME",
			page: page.ToString()
		);
		if (reposList.Length == 0)
		{
			break;
		}
		allRepos.AddRange(reposList);
	}
```

TOKEN は [Edit personal access token](https://github.com/settings/tokens) で取得してください。

private レポジトリ一覧化に必要な scope は `repo` です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364126/3c954f49-fb67-8361-aaad-b631f15bfbd5.png)

今回のポイントは、繰り返し取得が必要な点です (ページネーションされているので)
Route Model Bindingしているルートに対してテストするときのコツ

HTTPテストを書くとき
ミドルウェアを無効化したほうが都合がいい時があるかと思います
(公式: https://readouble.com/laravel/5.1/ja/testing.html#disabling-middleware　)

そんなとき
`use WithoutMiddleware;`
とかしてミドルウェアを全部無効化しちゃうという対応をされることも珍しくないと思います。

ですが、これが
Route Model Bindingしているルートに対してHTTPテスト
となると、ひと手間必要だったのでメモっときます


# Route Model Bindingしているルートに対してHTTPテストを書くとき

`route('user.update', $user->id)`は
web.phpにて

```php
Route::patch('{user}/update', 'UserController@update');
```
と定義されたルートであることを仮定します


順当に書くとしたら

```php

    use WithoutMiddleware;
    
    public function testUpdate()
    {
        $user = User::find(1);
        $response = $this->actingAs($user)
            ->patch(route('user.update', $user->id), ['name' => 'taro' ]);
    }
```

こうなんですが、これだとRoute Model Bindingされません

Route Model Binding自体が何かしらのmiddlewareを使って機能しているからだ、と思われます

なので最小限のミドルウェアのみを無効化して対応しましょう


```php

    use WithoutMiddleware;
    
    public function testUpdate()
    {
        // ルートモデルバインディングをしているので、対応するため無効化するミドルウェアを最小限にする
        $this->withMiddleware();
        $this->withoutMiddleware([VerifyCsrfToken::class, Authenticate::class]);

        $user = User::find(1);
        $response = $this->actingAs($user)
            ->patch(route('user.update', $user->id), ['name' => 'taro' ]);
    }
```



参考: https://github.com/laravel/framework/issues/16260
Amazon SESを使うならサンドボックスの外にいくこと

# 概要

Amazon SESでメール送信できるまでがわかりづらかったので、その手順を残したいと思います
※以下ではSESと略します

メール送信の要件は以下になります

- 自社サービスのメール送信サーバ（SMTP）をAmazon SESにする
- 自社サービスを利用しているユーザにメール送信する
- 自社サービスの対象はB2Bである

# 結論

上記の要件を満たすためには「**[Amazon SES サンドボックスの外への移動](https://docs.aws.amazon.com/ja_jp/ses/latest/DeveloperGuide/request-production-access.html)**」をしなければならない
サンドボックスの外にいけたらあとはSMTP接続用のアカウントを[こちら](https://docs.aws.amazon.com/ja_jp/ses/latest/DeveloperGuide/smtp-credentials.html)で取得し、設定するなり。APIから使ってもよし
要件（固定ユーザーに送信）によってはこの手続きなしで十分に運用できるかと思いますので、その際はスキップしてください

初期状態のSESは、**受信者のメールアドレスが検証済みでないとそのユーザーにメールを送信することはできない**
しかし、サンドボックスの外への移動ができると、受信者のメールアドレスは検証なしで送信できます
このような仕様になっているのは、迷惑メール配信者を排除する目的だと思われます

※検証済み･･･そのメールアドレスが存在するかどうかを確認するためのメールが送信され、受信者がメールに記載された検証リンクを踏んで初めて検証済みになります
※送信者のメールアドレスのドメインまたはメールアドレスは必ず検証しなければならない

## サンドボックスの外への手順

基本的に上記の手順に従って進めばOK
以下の項目がわかりづらかったので補足させて頂きます

- 「私は明確にリクエストされた受信者にのみメールを送信します」  
  受信意思がないユーザにメールを一方的に送り付けていないかの設問になります  
  なので、上記の要件のようにサービス利用者に送信するメールは一方的なメール送信ではないため、「はい」と回答できます
- 「バウンスや苦情を処理するプロセスがあります」
　バウンス（メール不達）や苦情（迷惑メールとして通報）を[モニターリング](https://docs.aws.amazon.com/ja_jp/ses/latest/DeveloperGuide/monitor-sender-reputation.html)し、適切な処置ができる場合は、「はい」と回答できます  
  
ちなみに私は初回のケースで却下されたが、内容の齟齬を解決し、許可を頂きました
AWSチュートリアル / サーバーレスのウェブアプリケーションを構築する

## やりたい事
AWSのチュートリアルがすごく充実していたので勉強がてらやってみたい。

## 参照ページ
サーバーレスのウェブアプリケーションを構築する
https://aws.amazon.com/jp/getting-started/projects/build-serverless-web-app-lambda-apigateway-s3-dynamodb-cognito/module-1/

## 作業ログ

1.S3でバケットを作成「serverless-test-20190627」って名前で作成した

2.AWSCLIの設定

```aidl
$ aws configure --profile [profilename] 
```

3.テンプレートをコピー

```aidl
$ aws s3 sync s3://wildrydes-us-east-1/WebApplication/1_StaticWebHosting/website s3://serverless-test-20190627 --region ap-northeast-1 --profile [profilename]
```
※ ユーザにアクセス権限がなかったのでIAMから「AmazonS3FullAccess」の権限を付与した。

4.パブリック読み込みを許可するバケットポリシーを追加する
- GUI上でバケットの中に入る
- ブロックパブリックアクセス
- [パブリックアクセスをすべてブロック]のチェックを外す

5.ウェブサイトのホスティングを有効にする
- プロパティタブを開く
- Static website hosting のカードを選択
- [このバケットを使用してウェブサイトをホストする] を選択し、インデックスドキュメントに「index.html」と入力
※ 他にも暗号化やログの記録についてのプロパティがあるので一通り見ておくと後学のために良いかもしれない。
- ダイアログ の上部にあるエンドポイント URL を書き留めてから、[保存] を選択します。
※ AWS が提供する Amazon S3 ウェブサイトのエンドポイント URL を使用します。形式は、http://{your-bucket-name}.s3-website.{region}.amazonaws.com のようになります
- アクセス権限タブ → バケットポリシー → エディターが出てくるので下記を入力
※serverless-test-20190627の部分は作成したバケット名

```aidl
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "PublicReadForGetBucketObjects",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::serverless-test-20190627/*"
        }
        ]
    }
}
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270608/6cbd9a76-9a9b-ede0-38ca-9f5f28985cf7.png)

AWSが用意してくれてたサンプルHTMLが公開されました。

今回練習でやっただけなので最後にバケットを削除しておしまい。
WebサイトでMathJaxを利用する

# Latexが使いたい
はてなブログやここQiitaだとLatexで数式がかけてとても美しいが、自分で作るサイトでもLatexが使いたい。
WebでLatexを使うならMathJaxかな（はてなはMathJaxだった気がする）と思い、導入してみたら意外と簡単だった。

# 公式ページ
おそらく公式ページのGettingStarted
https://www.mathjax.org/#gettingstarted

下記のスクリプトタグを自信のWebサイトのheadタグ内に埋め込むだけ。

```html
<script src='https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-MML-AM_CHTML' async></script>
```

バージョンごとお最も最新のものを自動で読み込みたい場合のタグもあるがそちらは公式ページをみてください（ほとんど差はないけど）

# npmライブラリ
npmライブラリもある模様。入れるとなんのメリットがあるのかはよくわかっていない。

```bash
yarn add mathjax
```

# 参考
* https://www.mathjax.org/#gettingstarted
* https://utano.jp/entry/2018/02/hello-mathjax/
テーマパークテック 日経コンピュータ 2019.06.27

AIとARでレジャーを進化させる。
[目的]
・顧客に対して、より施設を楽しんでもらえるように
・施設としては、ログ/利用状況を分析し、パーク体験の向上や改善させる

#東京ディズニーランド
###取り組み
2019年夏からファストパスをアプリで取得できるようにする

###目的
ストレスなくパークを楽しんでもらう

###今後
アプリの利用状況を分析する。
パーク体験の向上をどのような指標で測るべきか検討し、向上させる。

#富士急ハイランド
###取り組み
2018年7月から搭乗口に顔パス方式採用

###目的
入場料を無料化したことにより、来場者の安全性と安心感を高める施策が必要となった

###今後
顔認証システムで取得したデータによるマーケティングに力を入れる
行動ログからリピータを増やしたり、人員配置や食材調達の最適化につなげる計画

#アクアワールド茨木県大洗水族館
###取り組み
専用アプリで魚を撮影するとその魚の開設がでてくる
その図鑑を作れて、帰ってからも参照できる

###目的
水族館の娯楽性を高める

###今後
生き物を増やすのはキャパ的にも難しいので、それ以外のどうやって
来場者を楽しませるのか、よりAI/ARを活かしていく
RubyでSlackの絵文字(emoji)を一括エクスポート

# はじめに
- タイトルの通りです。
- Slackのワークスペースを引っ越しするというイベントがございました。
- すでに諸先輩方に書いていただいたものをRubyで書いてみただけです。


# Special Thanks
- [Slackのカスタム絵文字を全てダウンロードする](https://qiita.com/kure/items/7938d92532bb7577d8b8)
- [Slackの絵文字(emoji)を一括エクスポート＆インポートする](https://qiita.com/ne-peer/items/cbdef4f02b1bb6103e51)
- [scivola](https://qiita.com/scivola)様
    - レビューありがとうございます :bow:

# こちらでSlackのAPI(emoji.list)をお試しいただけます
- [slack api](https://api.slack.com/methods/emoji.list/test)

# 作品
```ruby
require 'open-uri'
require 'json'
require 'pathname'

# https://api.slack.com/apps
# |> Create New App
# |> Add features and functionality
# |> Permissions
# |> Scopes
# |> emoji:read
# |> xoxp-****
# |> replace TOKEN
TOKEN = 'とーくん'
URL = "https://slack.com/api/emoji.list?token=#{TOKEN}"
IMAGES_DIR = Pathname('images')

IMAGES_DIR.mkpath

body = open(URL, &:read)
emojis = JSON.parse(body)['emoji']

f = ->(_, url) { url.start_with?('alias') }
size = emojis.reject(&f).size

emojis.reject(&f).each.with_index(1) do |(key, url), i|
  #puts "#{key} => #{url}"
  extention = url.split('.').last

  filepath = IMAGES_DIR + "#{key}.#{extention}"
  filepath.binwrite open(url, &:read)

  print "%3d %%\e[G" % (i*100/size)
end

```

# 動作確認環境
```
$ ruby -v
ruby 2.6.1p33 (2019-01-30 revision 66950) [x86_64-darwin18]
```
- MacBook Pro(13-inch,2017,Two Thunderbolt 3 ports)
- macOS Mojave バージョン 10.14.5
iTerm2を接続先に切り替える際に参考になった記事

サーバーにssh接続する際、今自分がローカルにいるのか、サーバーにいるのかわかりやすくするために接続先ごとにiTerm2を色分けしたかった。

調べると色々やり方はあるようだが、下記の記事が簡単で使い勝手が良さそうだった。

https://dev.classmethod.jp/tool/iterm2-ssh-change-profile/
スクレイピング(自分用)


```scraping.rb
class Scraping
  def self.movie_urls
    #①linksという配列の空枠を作る
    #②Mechanizeクラスのインスタンスを生成する
    #③映画の全体ページのURLを取得
    #④全体ページから映画20件の個別URLのタグを取得
    #⑤個別URLのタグからhref要素を取り出し、links配列に格納する
    #⑥get_productを実行する際にリンクを引数として渡す
  end

  def self.get_product(link)
    #⑦Mechanizeクラスのインスタンスを生成する
    #⑧映画の個別ページのURLを取得
    #⑨inner_textメソッドを利用し映画のタイトルを取得
    #⑩image_urlがあるsrc要素のみを取り出す
    #①①newメソッド、saveメソッドを使い、 スクレイピングした「映画タイトル」と「作品画像のURL」をproductsテーブルに保存
  end
end
```

#答え
```scraping.rb
class Scraping
  def self.movie_urls
    links = []
    agent = Mechanize.new
    current_page = agent.get("http://review-movie.herokuapp.com/")
    elements = current_page.search('.entry-title a')
    elements.each do |ele|
      links << ele.get_attribute('href')
    end

    links.each do |link|
      get_product('http://review-movie.herokuapp.com/' + link)
    end
  end

  def self.get_product(link)
    agent = Mechanize.new
    page = agent.get(link)
    title = page.at('.entry-title').inner_text
    image_url = page.at('.entry-content img')[:src]

    product = Product.new(title: title, image_url: image_url)
    product.save
  end
end
```
Rails の ActiveRecordで 任意のカラムに対してだけの Attributes を得る

例

```rb
User.select(:id, :name).first.attributes
# => {"id"=>14, "name"=>"俺だぜ"}
```








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
jsdoでクワイン

#概要

jsdoでクワインやってみた。

#サンプルコード

```
eval(s='document.write("eval(s=&#39;"+s.replace(/&/g,"&amp;")+"&#39;)")')
```

```
function f() { document.write(f, "f()"); }f()
```

#成果物

http://jsdo.it/ohisama1/kOWp

以上。
おじさん構文でチャットするLINEbotを作ってみた。

#はじめに
研究室の同期たちとそれぞれ何か面白いものを作ってみようという思いつきから、特に有用性のない、（一部の）おじさんみたいな返信をするだけのLINEbotを作ってみたので、その記録。
計画ではdocomoの雑談APIを用いて実装する予定だったが、公開が終わっていたので断念...
そこで[hachidori](https://hachidori.io/)というノンプログラミングでBotを作れるサービスがあったので、それを使ってBotを作った。（あくまで完全にネタなので...）

この記事がとても参考になった。
[hachidoriを使用したノンプログラミングなBot作成](https://qiita.com/Shota_Fukuda/items/4e2b04caad2920a9ef75)
[ノンプログラミングで今話題のLINE Botを開発できる「hachidori」を試してみた](https://dotstud.io/blog/line-bot-with-hachidori/)

#hachidoriとは
・ブラウザからノンプログラミングでBotシナリオを作成できる
・LINEやFacebookのmessage APIに対応
・外部APIにも対応

全く触ったことがない自分でも簡単なBotが作成できた。

#とりあえず作ってみた
##1.LINE Developersに登録
[LINE developersアカウントの登録とMessaging APIの基本設定](https://symfoware.blog.fc2.com/blog-entry-2166.html)
このあたりを参考にしながら登録。
少し仕様が変わっていたが、説明通りにやれば問題なくできた。

##2.hachidoriでBot作成
こんな感じで適当に作成。
![スクリーンショット 2019-06-28 5.50.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449214/3dbb89ed-04be-a288-a456-188eca7818d4.png)
こちらも説明通りに進めていけば完了。

##3.LINE側とhachidori側の各種設定
ここでサーバ設定をする。LINE連携設定で
**・CHANNEL ID、CHANNEL SECRET、アクセストークンの設定**
**・Webhook送信を利用する。**
**・自動応答メッセージを利用しない。**
**・WebhookURLを設定する。**
これさえやっておけば多分大丈夫。

##4.シナリオ作成
あまり時間がないのでシンプルに。
・挨拶
　挨拶をするとおじさんがお寿司を食べに行くお誘いをしてくる。
　寿司か寿司以外かで分岐する。
・おじさん構文テンプレート
　何か話してとお願いすると、おじさん構文のテンプレートのような内容で返信してくれる。
![スクリーンショット 2019-06-28 6.00.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449214/8a6893aa-b2a7-41b6-3d05-7bc5073707f1.png)


##5.追加で、Web APIを使って天気がわかるようにしてみた
せっかくなので外部WebAPIを使って、気象情報を教えてくれるようにしてみた。
WebAPIは[livedoor天気情報](http://weather.livedoor.com/weather_hacks/webservice)を使った。
####1.テンプレート連携
新しいテンプレートを作成を選び、気象情報という名前で作成し、livedoor天気情報のURLを設定する。
地域はとりあえず福岡に固定。
テストURLも同じものでok。
![スクリーンショット 2019-06-28 6.10.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449214/6179846f-5e00-94de-e69e-6f3f59706bb3.png)

####2.APIを呼ぶためのシナリオ作成
気象情報を教えてもらうためのシナリオを、天気という名前で作成。
チャットで「天気」と入力するとその日の気象情報を教えてくれる。
この時、BotのアクションでAPIリクエストを追加するのを忘れがちなので注意。
APIから持ってきた情報はAPIのレスポンスから自由に追加できる。
![スクリーンショット 2019-06-28 6.00.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449214/e92f9e91-46f8-0add-1e93-fc8ce934bac5.png)
↓APIリクエスト
![スクリーンショット 2019-06-28 6.16.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449214/9eed4caf-7b08-0826-d6d2-1078fd1dbe68.png)


##動かしてみる
最低限できたので動かしてみる。
<img width="300" alt="oji01.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449214/99a1879c-560c-93ef-c078-3685dbf7a034.jpeg">
<img width="300" alt="oji02.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449214/d413ac69-01bd-2184-2a5c-26979853048d.jpeg">
<img width="300" alt="oji03.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449214/ec06eb9f-f9e1-0449-86ed-6d9e4a2f9cce.jpeg">
<img width="300" alt="oji04.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449214/91a3c6a3-bda0-1bda-22d4-3402c396da8f.jpeg">

シナリオ通りに動いてる感じがするので、とりあえずはよしと。
コードを書かずにここまでできるのはすごい。

#終わりに
・プログラミングをせずにここまでできるのは面白い。
・外部APIももっとたくさんあるので使ってみたい。
・この設計だとまだ汎用性がなさすぎるので、さらに応用もした方がいいなという感じ。
・ただ、ちょっと遊びで作るならこれくらいがちょうどいいきもする。

以上、ここまで備忘録でした。
就活生がGitHub PagesとBootstrapで自己紹介サイト作ってみた

#背景
就活（サマーインターン）の時期になりESを書くことが多くなってきました。めんどくさいなあと思っていた時に、GitHub Pagesを使ってwebサイトを簡単に作っている記事をいくつか発見([GitHub Pagesで静的サイトを簡単に作る](https://qiita.com/ririli/items/0e06b21cb709beae4514)とか)。
ESはどの会社もだいたい同じことを聞いてくるので、じゃあESで書きそうな内容全部まとめてwebサイトに書いちゃえばよくね？ということで自己紹介サイトを作ることにしました。

理想としては、ESにはリンクを貼るだけ！みたいにしたいのですが社会はそれを許してくれるのだろうか…。

#やりたいこと
- 自己紹介サイトを作る目的
    - 自分のことを知ってもらう場として
    - ESに書きそうなことを保管する場として

だったので

- 実装（したかった）内容
    - 自分語りをするパート
    - ESに書きそうなことをまとめておくパート（時間の都合で実装できず…）

です。

現時点での僕のwebサイトは[こちら](https://rtakaha.github.io/Rtakaha/)

#GitHub Pagesの作成
こちらのサイトを参考にさせていただきました。
[GitHubのmasterブランチをWebページとして公開する手順（GitHub Pages）](https://qiita.com/tonkotsuboy_com/items/f98667b89228b98bc096)

とにかくレポジトリ作って、SettingsからGitHub Pagesを有効にするボタンを押せば公開できます。超簡単ですよね笑。

#Bootstrap
HTMLはともかくCSSはめちゃくちゃ初心者だった僕ですが、[Bootstrap](https://getbootstrap.com/)がなんとかしてくれました。これを使えばCSSあまり分からなくても、webサイトをそれなりに整えてくれます。めっちゃ綺麗なわけではないですが、webサイトを自分で作るのは今回が初めてなのでとりあえず良しとしました。
今回僕がやりたかったことは、
- 写真の挿入
- 表の作成
- ボタン押したら同じページ内を移動するアレ
- ヘッダーとフッダー

でした。[このページ](https://www.w3schools.com/bootstrap4/)のチュートリアル（英語ですが）を読めばほとんどすべて実装できました。

#終わりに
今回は途中までの実装となってしまったのですが、サーバーを立てたりすることなく自分で書いたコードをオープンできるのはすごく良いですよね。BootstrapもHTML/CSS初心者にとってはとてもありがたいツールだと思います。自己紹介サイトはもっとかっこよくしていきたいと思います。

他の記事を参照しまくりの初投稿ですが、これからもQiitaにも投稿していこうと思います。
最後まで読んでいただきありがとうございました！
Kubernetesの概要

# Kubernetsとは
コンテナ化さえたアプリケーションのデプロイ、スケーリングなどの管理を自動化するためのプラットフォーム（コンテナオーケストレーションエンジン）※オーケストラの指揮者のようなものです。

## Kubernetesでできること
- 複数のKubernetes Nodeの管理
    - YAML or JSON形式で記述した宣言的コード（マニフェスト）によって管理
- コンテナのスケジューリング
    - どのKubernetes Nodeに配置するかを決定する
- ローリングアップデート
    - 同時に全サービスを停止するのではなく、徐々にアップデートしていく
- スケーリング／オートスケーリング
- コンテナの死活監視
- 障害時のセルフヒーリング
    - プロセスの停止を検知して、再度コンテナをスケジューリングする
- サービスディスカバリ
    - 端的に言うと特定の条件の対象となるメンバを列挙したり、名前からエンドポイントを判別する機能
- ロードバランシング
- データの管理
- ワークロードの管理
- ログの管理

## Kubernetes導入のメリット
- 頻繁なアプリケーションのデプロイを可能にする実行基盤
- 停止できないサービスに適した高可用性な基盤
    - セルフ・ヒーリングを実現することにより止まらないサービスを提供できる
- コンテナで開発したアプリの本番アプリの運用に適する運用基盤
    - アプリケーションの開発とテストが完了して登録したコンテナのリポジトリのアドレスとイメージ名を指定して、Kubernetesクラスタへデプロイする事ができる
- オーケストレーションが可能な運用基盤
- 特定企業に支配されない標準技術
- 軽量高効率なコンテナ技術
- 活発な開発が継続
- マルチクラウドへの適用

## Kubernetesの基礎
![kubernetes概念図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113395/96f0fea1-b47d-9cd3-b7d7-45d229cef620.png)

### リソースの概要
- Workloadsリソース
    - クラスタ上にコンテナを起動するためのリソース
        - Pod、Deployment、ReplicaSet etc
- Discovery & LB リソース
    - コンテナを外部公開するようなエンドポイントを提供するリソース
        - Service、Ingress etc
- Config & Storage リソース
    - 設定／機密情報／永続化ボリュームに関するリソース
        - Secret、ConfigMap、PersistentVolumeClaim etc
- Cluster リソース
    - セキュリティやクォータなどに関するリソース
        - Node、Namespace、PersistentVolume etc
- Metadata リソース
    - リソースを操作する系統のリソース
        - LimitRange、HorizonalPodAutoscaler etc

次回は各<a href="https://qiita.com/k_r_5376/items/10a529cedde4d59fcd47">リソースの概要</a>説明
cronで数分おき、数秒おきに指定コマンドを実行する方法

調べればこの手の情報は沢山出てくるが、個人的メモとして。

#数分おきに指定コマンドを実行

[Man page of CRONTAB](https://linuxjm.osdn.jp/html/cron/man5/crontab.5.html)によると、第1〜5フィールドは*/xでxおきと表現できる。
これを使うと、例えば1分おきに~/hoge.shを実行するには次のように書く。

```vim
*/1 * * * * ~/hoge.sh
```

当然、分だけでなく時間、日、月、曜日も同様に対応可能。

#数秒おきに指定コマンドを実行

設定できる最小単位が分なので、秒ごとの実行はできないと思ったが、そんなことはなかった。[cronを秒単位で指定する方法](https://tech.mktime.com/entry/376)より、sleepを上手く使うと実現できた。
例えば、10秒単位で~/hoge.shを実行したい時は次のように書く。

```vim
* * * * * for i in `seq 0 10 59`;do (sleep ${i}; ~/hoge.sh) & done;
```
seqの箇所の10を変えることで、任意の秒ごとの実行も可能。

#参考文献
- [Man page of CRONTAB](https://linuxjm.osdn.jp/html/cron/man5/crontab.5.html)
- [cronを秒単位で指定する方法](https://tech.mktime.com/entry/376)
奇数か？偶数か？

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">膝から崩れ落ちろ、未来への希望を抱く若者たちよ。<br>こんなんザラやぞ。<br>いいか。<br>ザラや。普通や。<br>覚悟しろ。 <a href="https://t.co/YLMaJTm8Qw">pic.twitter.com/YLMaJTm8Qw</a></p>&mdash; しんやさん (@NAGAYASU_Shinya) <a href="https://twitter.com/NAGAYASU_Shinya/status/1143868066440216577?ref_src=twsrc%5Etfw">2019年6月26日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

![D9_V8O8U8AEQ_xH.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/69767/59280b96-58ad-653a-30fe-850c0724c2d1.jpeg)

まじめに実装しました。

```c:odd.c
#include <stdio.h>

int main() {
  unsigned long max = 4294967295;
  FILE *out = fopen("odd.vbs", "w");
  fprintf(out, "Public Function a(b)\n\tSelect Case b");
  for(unsigned long i = 1; i <= max; i++) {
    fprintf(out, "\n\t\tCase %lu\n\t\t\ta = %s", i, i & 1 ? "True" : "False");
  }
  fprintf(out, "\n\tEnd Select\nEnd Function");
  fclose(out);
  return 0;
}
```

以下を実行すると、

```bash
gcc odd.c && ./a.out
```

このようなvbのコードが生成されます。(117GB)

```vb
Public Function a(b)
    Select Case b
        Case 1
            a = True
        Case 2
            a = False
        Case 3
            a = True
        Case 4
            a = False
          :
        (中略)
          :
        Case 4294967295
            a = True
    End Select
End Function
```

可読性が非常に高いですね！Long型をサポートしてとても親切設計です。

gitで管理すると炎上間違えなしです！納品物に含めると大変お客様に喜ばれるでしょう！
デスマーチについて と　最初のWebサービスにRuby on Railsを選んだ理由

##### はじめに
大手SIer　→　ブラック　→　ブラック　→　ヤクザブラック　→　グレーだけど潰れそう(今ここ)
という経歴を渡り歩いてきたとある社内SEです。胃カメラの経験なら同年代に負ける気はしません。


## 背景
社内でWebサービスを作ろうという流れになりまして、
じゃあ私が作るという話になりました。
一応なんでもできますよ～てへぺろ(汗)って言って入社したので。

作ると決まったときは、もうどうしようかと。
がちがちのクラサバアプリならすぐ作れるんですが、
Webサービスなぞ作ったことがなかったので。。。
（ASP.NETで真似事したくらい。。。）

でも、どうせならMicrosoftの呪縛から離れて、まったく知らないやつを
やってみようと思い立ちました。
で、選んだのがRuby(on Rails)


## なぜか
絶対ゆずれないポイントとしてあったのが、**挫折しづらいものであること。**
世の中でプログラムを勉強して、やったるぞ！って人は無数にいると思いますが、
たぶん80%くらいの人は途中で挫折してるんじゃないでしょうか。

なぜか。

エラーが出て動かなかったり、そもそも意味が分からなかったり、
動く画面に全然たどり着かなかったり、エラーをぐぐっても英語ばかりだったり。
で、楽しくなくなって放棄・挫折ていうパターンかな。
だから、挫折しないように疑問点がすぐわかったり、Webサービスをすぐに作れるやつとして
Rubyを選びました。（Rubyなら日本人が開発した言語だし、日本語で解説しているサイト
がたくさんありそうだし、Railsならすぐに作れるって聞いたし。）

過去を振り返ると
Sier時代に学んだJavaとか、.NET周りの知識はあったので、完全に新規スタートではありませんが、
SIer時代はただ天才的な人が作ったF/W上で、よく分からんけどEcripse入れて、
良い感じにコピペして持ってきて、ぼそぼそ書き換える程度でした。それも最初の1年くらいで、
その後は仕様設計とマネジメントとデスマーチ案件の火消し役ばかりやっていました。
あの頃はやばかったなあ。
入社→研修→デスマーチ→とても楽→デスマーチ→デスマーチ→身体壊れそう→そして伝説へ

みたいな感じで、とてもプログラムのスキルは身につくことはありませんでした。
ただただ、社内外調整と並列タスク管理とリスクマネジメントのスキルのみ向上して
いった感じです。でも、そのころの経験があって、今があるとも言えます。
**目を見れば、だいたい修羅場くぐってそうな人分かりますｗ**
当時書いたメモは今も大事に保管しています。上司の愚痴ばかりでしたが、こういう
上司になりたくないというメモ。その当時の感情の赴くままに書いたメモです。
一部抜粋

**・いくら体調悪いからといって、あの勤務態度はない**
→当時のPJリーダーが体調不良で朝来ない、重要なテスト日に来ない、3日連続来ない
　というのを繰り返していたことから出たやつ。実際は単純に不摂生によるものだった。
　ちなみに私は始発で会社を退社していました。

**・てめえのはいいから、メンバーの体調管理くらい責任持てよ**
→「明日、お前が倒れても俺は責任持てないからな」と言われたことを受けて。確かに
　体調管理は自己責任のところもあるが、おめえには言われたくない。ってこと。
　体調管理は上司の責任でもあります。自己責任でもありますが、上司の指示で働いてもらっている以上
　気を遣うのは当然。そもそも体調不良でパフォーマンス出るわけないし。ミス多いし。
　人にうつるし。一日しっかり休んでもらったほうが生産性が絶対に良い。

**「私はあなたより長く働いているから、分かっている」**
→PJの目的達成が全てであって、人間的なフォローは優先度最低。で、上の発言。何を分かっているの？
　長く働いているから偉いの？分かっているなら、なんでこうなってるの？今までもそうやって、
　過重労働を前提に働いていた無駄な経験があったから、こうなったんじゃないの？長時間労働前提。
　だから、こんな思いを部下にさせたくないという思いがあって、生産性向上・効率化を
　マスターしようと心に決めましたとさ

で、自分が上司だったら・・・ていうのを書いている。恥ずかしいのでこちら省略。
ほんとになんか心に刺さることを書いているなあと。
みなさまもデスマーチ・追い詰められている最中だからこそ感じる熱い感情・思い・
アイデアが必ずあると思います。
それを感情のままに書きなぐっておくことで、それがのちのち財産になります。

あ、でも１つ注意点。
デスマーチを経験したからといって、みんな修羅場くぐった眼をするわけではないです。
条件は２つ
・逃げなかった
・頭を停止させなかった

上記経験を糧に今もなんとか生きています。胃カメラの経験も豊富です。


## 最後に
あれ？Ruby(on Rails)を選んだ理由を書いていたのに、デスマーチの心得みたいな話になってしまいました。
社内SEになった１つの原因でもありますね。
次回こそは技術的な話をします。たぶん。
でもほんとRuby(on Rails)いいっすよ。日本語での解説、QA量が圧倒的に多いです。

では、全国の社内SE頑張れ！
try - Go の新しいエラーハンドリング (Go 1.14で導入予定)(でしたが，却下となりました)

~~Go 1.14 で try というシンプルなエラーハンドリング方法が導入予定です。~~

**2019/07/17 追記**
 議論の結果、try は一旦却下となりました。詳しくは提案者 Robert Griesemer 氏の[コメント]( https://github.com/golang/go/issues/32437#issuecomment-512035919)を参照下さい。

# error

Go でのエラーハンドリングはややタイプ数が多い。

```go
	f, err := os.Open(filename)
	if err != nil {
		return fmt.Errorf("...", err)
	}
```

のようなエラー処理コードを何度も書かないといけないことにストレスを感じることがあるかもしれません。

それで，去年(2018年)の GopherCon で Go 2 のドラフトデザインが発表された際，エラーハンドリングの提案が含まれていました。
`check` と `handle` を使う提案です。

# check と handle

```go
	handle err {
		return fmt.Errorf("...", err)
	}

	f := check os.Open(filename)
```

戻り値の最後が error 型の場合，関数呼び出しの前に `check` と書けば， error が `nil` でない場合に `handle` が実行されるという提案です。
ただ，`handle`と`defer`の機能が重複しているのではないか，複雑すぎるのではないか等の意見がありました。
この提案が出てから議論が重ねられ，現在，より単純化された `try` を使ったエラーハンドリングが Go 1.14 で導入予定になっています。

# try

```go
func FuncXXX() (err error) {
	defer func() {
		if err != nil {
			err = fmt.Errorf("...", err) 
		}
	}()
	f := try(os.Open(filename))
	// ...
	return
}
```
try を使う条件として，関数の返り値の最後のパラメータは error 型である必要があります。
err は関数の名前付き返り値パラメータです。err 以外の名前でもいいですし，使わないのであれば名前なしでもかまいません。

このコードは，次のコードと同等になります。

```go
func FuncXXX() (err error) {
	defer func() {
		if err != nil {
			err = fmt.Errorf("...", err) 
		}
	}()
	t1, te := os.Open(filename)
	if te != nil {
		err = te // te を error型の返り値パラメータに代入する
		return   // try のまわりの関数 (この場合，FuncXXX) から返る 
	}
	f := t1      // エラーが発生しなかった時だけ代入が行われる
	// ...
	return
}
```

なお，try の導入と同時に fmt パッケージに HandleErrorf というヘルパー関数が入る予定です。
これを使えば， defer 部分は簡潔に，

```go
    defer fmt.HandleErrorf(&err, "...")
```
のように書けます。

## try の利点

`check`, `handle` は演算子ですが， `try` はビルトイン関数であることが大きな違いです。
`check`, `handle` に比べ， `try` にはどんな利点があるのでしょうか？

- Go のすでにある機能 `defer` とビルトイン関数を使うので， 言語が複雑化しない。
- Go に新たな構文を導入しなくてすむ。
- 完全に後方互換性を保てる。
- カッコを書く必要があるのはちょっと面倒に見えるかもしれないが，優先順位にあいまいなところがない。
- `try` は単なる糖衣構文

簡単で Go 言語の良さを邪魔しない提案ですね。

# 使用例
これを使えば，以下のようなコードが書けます。

```go
func printSum(a, b string) error {
        fmt.Println(
                "result:",
                try(strconv.Atoi(a)) + try(strconv.Atoi(b)),
        )
        return nil
}
```

`try(strconv.Atoi(a)) + try(strconv.Atoi(b))` と 1 行で書けるのが気持ちいいです。

# 感想
昔話になりますが，昔はエラーは os.Error という型でした。ほぼすべてのコードで os パッケージをインポートしていました。
[error ビルトイン型](https://go言語.com/pkg/builtin/#error)は大きな進歩だと感じていましたが，また一歩進みますね。
実際に Go で使えるようになる前にまだ変更が入るかもしれませんが，とても楽しみな改善です。
Generics のほうの設計も進んでいるようです。
今年の GopherCon も楽しみです！

# 参考
[Proposal: A built-in Go error check function, try](https://go.googlesource.com/proposal/+/master/design/32437-try-builtin.md)
[Next steps toward Go 2](https://blog.golang.org/go2-next-steps)
[error ビルトイン型](https://go言語.com/pkg/builtin/#error)
Git 作業流れ(通常一例)

命名規則:
┗自分が作業するファイルはfeature/k_0628_blade_editの様につける
　（feature/[名前頭文字]_[日付]_[作業内容]）


1.最初にブランチを作成、ほかの人のデータ取得

````
git branch -b feature/k_0628_blade_edit develop    <---作成
git branch -a                                      <---ブランチリスト表示
q                                                  <---戻る
git merge remotes/origin/feature/yamashita         <---マージ
````

2.作業する
3.作業終了

4.ステージング、コミット、マージ、プル

````
git add .                           <---ステージング追加           
git commit                          <---コミット        
git merge remotes/origin/develop    <---デベロップとマージ    
git push                            <---プッシュ
````

5.プルリクエストを投げる
Git コマンドまとめ


最初に、
CMDを使っていて、画面操作が出来なくなったとき
````q````若しくは````:q````若しくは````[esc]:q````
どれかで戻ってこれるはず。


0.状態確認用コマンド

````
git status     <----(変更点・コミット前)
git branch     <----(ブランチ確認)
git branch -a  <----(ブランチ確認全体)
git log        <----(コミット履歴確認・ハッシュ値探し)

git remote -v  <----(リモートの確認)
````


1.プル

````
git pull
````

2.ステージングにのせる

````
git add [ファイル名]　 <---個別
git add .             <---すべて
````
2.5ステージングにのせる

````
git reset HEAD [ファイル名]　 <---個別
git reset HEAD .             <---すべて
````

3.コミット

````
git commit
````
3.5コミット打消し

````
git reset --hard HEAD^
git revert [コミットのハッシュ値]
````
https://qiita.com/takuyanin/items/c092b724bb8b241f768a


4.プッシュ

````
git push [ファイル名]
````

5.マージ

````
git merge [ファイル名]
````


6.スタッシュ

````
git stash　　　　　　　　　　　　<---コメント無し保存
git stash save "your comment"  <---コメントあり保存
````


7.スタッシュ状態を確認

````
git stash list       <---一覧表示
git stash list -p    <---詳細表示
````

6.スタッシュを戻す

````
git stash apply stash@{0}  <---listで確認した物の左辺を入れる
````

7.スタッシュを削除する

````
git stash drop stash@{0} <---listで確認した物の左辺を入れる
````


8.チェックアウト

````
git checkout [ブランチ名]
````

9.ブランチを作る

````
git checkout -b feature/[名前] develop
git checkout -b [作るファイル] [元のファイル]
````
[memo] Herokuで Could not find 'bundler' (2.0.1) と言われた

# 簡潔に言うと

Herokuに `git push heroku master`したときにbuildが失敗して次のようなエラーメッセージが表示されますが、エラーメッセージの通り確認してみてもちゃんと`bundler 2.0.1`がインストールされています。

> remote: -----> Detecting rake tasks
> remote: 
> remote:  !
> remote:  !     Could not detect rake tasks
> remote:  !     ensure you can run `$ bundle exec rake -P` against your app
> remote:  !     and using the production group of your Gemfile.
> remote:  !     Activating bundler (2.0.1) failed:
> remote:  !     Could not find 'bundler' (2.0.1) required by your /tmp/build_94d6a4f5d4fbb862672998d5d06d2506/Gemfile.lock.
> remote:  !     To update to the latest version installed on your system, run `bundle update --bundler`.
> remote:  !     To install the missing version, run `gem install bundler:2.0.1`
> remote:  !     Checked in 'GEM_PATH=/tmp/build_94d6a4f5d4fbb862672998d5d06d2506/vendor/bundle/ruby/2.7.0', execute `gem env` for more information
> remote:  !     
> remote:  !     To install the version of bundler this project requires, run `gem install bundler -v '2.0.1'`
> remote:  !

あまり詳しく見ていないのですが、このstackoverflowの回答にあるように数日前からbuildが失敗するようになったとのことで、rubyとbundlerのバージョンを上げると直るようです。
https://stackoverflow.com/questions/56680065/heroku-installs-bundler-then-throws-error-bundler-2-0-1
気になる人は公式サイト読んでください。
https://devcenter.heroku.com/articles/bundler-version#bundler-2-0-2

# rubyとbundlerのバージョンを上げる

幸いコードが軽かったため無邪気にバージョンを上げます。
mac + rbenv環境だと次のような感じになると思います。

```
$ brew update && brew upgrade ruby-build
$ rbenv install 2.6.3
$ rbenv local 2.6.3
$ gem install bundler -v 2.0.2
$ rm Gemfile.lock
$ bundle install
$ git add .ruby-version Gemfile Gemfile.lock
$ git commit -m 'version up ruby'
$ git push heroku master
```

これでdeployが成功しました😀
`remote: Verifying deploy... done.`
シェルのメモ

自分用のメモなのでかなりてきとうです。

# vim

delete word

```
dw
```
delete 文末まで

```
d$
```

delete word 空白は消さない

```
de
```

単語の移動

```
3w
```

単語の移動(終端まで)

```
3e
```

オペレータによる削除 d オペレータ

```
d2w
d3e
```

文末に移動

```
$
```

3行を削除

```
3dd
```

コマンド取り消し

```
u
```

行全体の取り消し

```
U
```

削除した文を貼り付け

```
p
```

文字列の置き換え

```
r
```

単語の置き換え

```
cw
```

文末まで置き換え


```
c$
```

ファイルの状態表示

```
CTRL + G
```

最下行に移動

```
G
```

先頭に移動

```
gg
```

行に移動

```
行番号 G
```

検索

```
/
```

進む

```
n
```

戻る

```
N
```

逆方向に検索

```
?
```

対応する括弧に移動

```
%
```

行を置換

```
:s/old_text/new_text/g
```

範囲置換

```
:10,20s/old_text/new_text/g
```

ファイル全体で置換

```
:%s/ふるいなまえ/あたらしいなまえ/g
```

確認しながら置換

```
:%s/ふるいなまえ/あたらしいなまえ/gc
```

外部コマンドの実行

```
:! ls
```

ファイルの作成

```
:w sample.txt
```

次の行にインサート

```
o
```

前の行にインサート

```
O
```



```
R
```

カーソルの下にある単語を後方検索

```
*
```

カーソルの上にある単語を後方検索

```
#
```

# tmux

新しいペイン

```
%
```