OmniAICreator/Qiita-1.07M huggingface dataset:
正規自己相互情報量NPMIが -1 ～ 1 な訳

# 自己相互情報量PMI

```math
PMI(x, y) = log{\frac{P(x, y)}{P(x)P(y)}}
```

これです。$P$ は確率分布です。
PMIは自然言語では、単語 $x, y$ の関連度合いが測れます。
ただ、$x, y$ の希少度が値に大きく影響してしまうので、参考にならないこともあります。
（参考：[自然言語処理における自己相互情報量](https://camberbridge.github.io/2016/07/08/%E8%87%AA%E5%B7%B1%E7%9B%B8%E4%BA%92%E6%83%85%E5%A0%B1%E9%87%8F-Pointwise-Mutual-Information-PMI-%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/)）
そこで、正規化します。

# 正規自己相互情報量NPMI

```math
NPMI(x, y) = \frac{PMI(x, y)}{-log{P(x, y)}}
```
最初に見た時は「これ正規化になってるの？」って思いました。
でも、 $-1 \leq NPMI(x, y) \leq 1$ なんです。
証明します。

# -1 ≦ NPMI(x, y) ≦ 1 の証明

$0 \leq P(x), P(y) \leq 1$ より $- logP(x)P(y) > 0$
よって 

```math
\begin{eqnarray}
PMI(x, y) &=& logP(x, y) - logP(x)P(y) \\
&\geq& logP(x, y)
\end{eqnarray}
```

また、 $0 \leq P(x|y), P(y|x) \leq 1$ より $logP(x|y)P(y|x) < 0$
よって

```math
\begin{eqnarray}
PMI(x, y) &=& log \frac{P(x, y)P(x, y)}{P(x)P(y)P(x, y)} \\
&=& log \frac{P(x|y) P(y) P(y|x) P(x)}{P(x)P(y)P(x, y)} \\
&=& log \frac{P(x|y) P(y|x)}{P(x, y)} \\
&=& log P(x|y) P(y|x) - log P(x, y) \\
&\leq& - log P(x, y)
\end{eqnarray}
```

したがって

```math
log P(x, y) \leq PMI(x, y) \leq - log P(x, y) \\
-1 \leq NPMI(x, y) \leq 1
```

以上です。
Wordpressの管理画面にオリジナルのCSS・JavaScriptを適用させる

# フォルダ構成

![qiita.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225361/2e6c251e-9fb6-93fb-0577-bbcdfb52dc2e.png)


# 必要な記述

```php:functions.php

<?php
/**
 * エディタースタイル適用
 * */

    add_editor_style(get_template_directory_uri()."/css/admin/editor-style.css");

/**
 * 管理画面スタイル適用
 * */

function my_admin_stylesheet()
{
    wp_enqueue_style('custom-admin-style', get_stylesheet_directory_uri().'/css/admin/admin-style.css');
    wp_enqueue_script('admin-script', get_stylesheet_directory_uri() . '/js/admin/admin-style.js', array(), '1.0.0', true);
}
add_action('admin_enqueue_scripts', 'my_admin_stylesheet');

/**
 * 管理画面にもfaviconをつける
 * */
function admin_favicon()
{
    echo '<link rel="shortcut icon" type="image/x-icon" href="'.get_stylesheet_directory_uri().'/img/favicon.ico" />';
}
add_action('admin_head', 'admin_favicon');

/**
 * ログイン画面CSS変更
* */

function my_login_stylesheet()
{
    wp_enqueue_style('custom-login', get_stylesheet_directory_uri().'/css/admin/login-style.css');
}
add_action('login_enqueue_scripts', 'my_login_stylesheet');
PlayCanvasの背景を透過canvasにする方法

#canvasの背景透過

HTML5のcanvas要素は毎フレームでレンダリングを行います。
canvasの背景を透過したいなんて声はググったりすると意外と多い気がします。

ちなみに、canvasの背景を透過したいなんて時は以下のようにalpha値を指定してあげれば良いです。

```js
gl.clearColor(0, 0, 0, 0)
```

#PlayCanvasの背景透過

PlayCanvasはどうしたらいいか。

PlayCanvasエディターのRENDERINGに**Transparent Canvas**という項目があります。
これにチェックを入れます。

![スクリーンショット 2019-12-26 17.37.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109168/a3842df4-347f-863d-2fe2-9b21601768a6.png)

これだけで背景は透明になったかというとそうでもなかったり…

EntityにCameraがある場合は、このCameraの**Clear Color**のAlpha値を0にしてあげるとちゃんと透過されます。

![スクリーンショット 2019-12-26 17.39.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109168/6dd98c99-2903-57b1-9134-dd00987b8efd.png)

また、SkyBoxを入れている場合もちゃんと透過されないのでご注意を。

これでCSSからbackground-colorを変更してあげると透過されているのがわかります。
![スクリーンショット 2019-12-26 17.42.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109168/f9b58e14-89b8-c184-338d-2ea153ca200a.png)
![スクリーンショット 2019-12-26 17.42.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109168/6fec5d9e-5a9f-36ef-0176-af30483f12f1.png)


Webで使う際には透過はよく使うので覚えておきたいですね。
自身が sidekiq のプロセスかどうか判定する

# 問題

Rails Server や Rake Task のプロセスで実行するパッチを Sidekiq のプロセスでは実行したくない。

# 最新の解決策

下記のメソッドを使って判定する。

```ruby
if Sidekiq.server?
  # sidekiq のプロセス
else
  # sidekiq のプロセスでない普通の rails のプロセス
end
```

# 以前の解決策

Sidekiq プロセスは起動時に config/sidekiq.yml を読み込み、 Sidekiq.options に格納する。したがって自身が Sidekiq プロセスかどうかを見るには config/sidekiq.yml にしか書かれていない情報がすでに読み込まれているかを確かめればよい。たとえば下のような分岐をする。

```ruby
if Sidekiq.options[:queues].present?
  puts "Sidekiq プロセス"
else
  puts "Rails Server プロセスをはじめとした Sidekiq 以外のプロセス"
end
```

config/sidekiq.yml 以外で queues を定義している場合はその限りでない。
Google MediaPipe

MediaPipeは、クロスプラットフォームマルチモーダルのMLパイプラインを構築するためのフレームワークです。 以前に、モバイル（Android、iOS）およびGoogle CoralなどのエッジデバイスでMediaPipeグラフとしてMLパイプラインを構築および実行することを実証しました。 

この記事では、WebAssemblyによって有効にされ、XNNPack ML Inference Libraryによって加速される、Webブラウザーでライブで実行されるMediaPipeグラフを表示できることを楽しみにしています。 このプレビュー機能をWebベースのVisualizerツールに統合することにより、グラフ設計をすばやく反復するための遊び場を提供します。 すべてがブラウザーで直接実行されるため、ビデオはユーザーのコンピューターから離れることはなく、各反復はライブWebカメラストリーム（およびすぐに任意のビデオ）ですぐにテストできます。

![alt](https://4.bp.blogspot.com/-aAmVDl3D_EA/Xi9ZE-C9SjI/AAAAAAAAIg8/e4-cyoRJy0o06jLnj_oMcufDeehk1LwwwCLcBGAsYHQ/s1600/fig1.gif)

####MediaPipeビジュアライザー
MediaPipe Visualizerはviz.mediapipe.devでホストされています。 MediaPipeグラフを検査するには、グラフコードを[エディター]タブに貼り付けるか、そのグラフファイルをビジュアライザーにアップロードします。 ユーザーは、マウスとスクロールホイールを使用して、グラフのグラフィカル表現をパンおよびズームできます。 グラフは、エディター内で行われた変更にもリアルタイムで反応します。
![alt](https://1.bp.blogspot.com/-nejtsX_74HI/Xi9ZXPT8EcI/AAAAAAAAIhI/dQ0FAqV-li8CzDbtbI8rpYN7-zmEACyCgCLcBGAsYHQ/s1600/fig2.png)

#### MediaPipe Visualizerのデモ
既存のMediaPipeグラフの例からいくつかのサンプルVisualizerデモを作成しました。 これらは、Chromeブラウザーで次のアドレスにアクセスすると、ビジュアライザー内で表示できます:

Edge Detection
Face Detection
Hair Segmentation
Hand Tracking

![alt](https://github.com/google/mediapipe/raw/master/mediapipe/docs/images/realtime_face_detection.gif)

現在、WebベースのMediaPipeのサポートにはいくつかの重要な制限があります:

- 上記のデモグラフの計算機のみを使用できます
- ユーザーは、テンプレートグラフのいずれかを編集する必要があります。 彼らは自分自身をゼロから提供することはできません
- ユーザーはアセットを追加または変更できません
- グラフのエグゼキューターはシングルスレッド（つまり、ApplicationThreadExecutor）でなければなりません
- GPUでのTensorFlow Liteの推論はサポートされていません

promote ads: 

![alt](https://1.bp.blogspot.com/-YR5hB3S-gTk/XkIrTp3h2YI/AAAAAAAAAH8/9tyUuSKpAUcoq0Psp4jph_1tu8hPz12hgCLcBGAsYHQ/s640/%25E6%25AD%25A3%25E6%2596%25B9%25E5%25BD%25A2%25E6%25B5%25B7%25E6%258A%25A5.jpg)
VueやNuxtでpugやstylusを使う設定

僕はpythonが好きで閉じタグを書くのがしんどく感じるのでpugやstylusが好きです。
coffeescriptはtypescriptに負けてて最近使ってませんが・・・
というわけでvueでも使えるようにしたいので毎回している初期の設定をメモしておこうと思います。

# loaderの用意
pugやstylusを利用するにはnpmでloaderを用意する必要があります。

## pug
```
$ npm i --save-dev pug pug-plain-loader
```

## stylus
```
$ npm i --save-dev stylus stylus-loader
```

# .vueファイルで
htmlの部分は`<template>`に、cssは`<style>`にlang属性をいれます。

```vue
<template lang="pug">
</template>

<style lang="stylus">
</style>
```

# 全体で`.styl`を読み込む
共通の.stylファイルを.vueに書きたくないことや、どのvueファイルからでもmixinを呼び出したいときなどもあるでしょう。
そういった場合、[@nuxtjs/style-resources](https://github.com/nuxt-community/style-resources-module)を利用します。（nuxtの話）
npmでインストールして、

```
$ npm i --save-dev @nuxtjs/style-resources
```

共通で読み込みたい.stylファイルを`/assets/stylus/xxx.styl'`とすると
`nuxt.config.js` に以下の記述を追記します。

```js:nuxt.config.js
export default {
  modules: [
    '@nuxtjs/style-resources',
  ],
  styleResources: {
   stylus: './assets/stylus/xxx.styl'
  }
}
```

複数の.stylファイルを読むこともできますが、メインの.stylを1つ読み込んでそのなかに`@import`を書いて上げる方法で良いと思います。

[nuxt-stylus-resources-loader](https://github.com/BKWLD/nuxt-stylus-resources-loader)を利用して共通の.stylを読み込む方法もありますが、おそらく@nuxtjs/style-resourcesの方が推奨されます。
書籍「15Stepで踏破 自然言語処理アプリケーション開発入門」をやってみる - 4章Step15メモ「データ収集」

# 内容
[15stepで踏破 自然言語処理アプリケーション入門](https://www.amazon.co.jp/dp/4865941320) を読み進めていくにあたっての自分用のメモです。
今回は4章Step15で、自分なりのポイントをメモります。（ほとんど書くことないですが）

# 準備
- 個人用MacPC：MacOS Mojave バージョン10.14.6
- docker version：Client, Server共にバージョン19.03.2

# 章の概要
書籍の最終章として、これまでに見てきた自然言語処理や機械学習を行う上で、各々の目的に合致したデータセットを公開データから探したり、自前で構築したりするときのヒント集となっている。

- データセットの収集
- クラウドソーシング

# 15.2 データセットの収集
## 公開データセットの利用

|データセット |特徴 |
|--- |--- |
|Wikipedia |Web百科事典で、公式に全データのダンプファイルが公開されている。 |
|青空文庫 |著作権の失効した文芸作品のテキストファイルを無料でダウンロードできる。 |
|livedoorニュースコーパス |ライブドアニュースの記事の一部がクリエイティブ・コモンズ・ライセンス（表示-改変禁止）で提供されている。|
|日本語WordNet |単語の意味の階層構造を表現したデータベースで、前処理や形態素解析の際に利用することが考えられる。|

この他にも有料であったり利用申し込みが必要なもの、利用用途に制限のあるものもある。

## クローリング
欲しい公開データセットがない場合、Webサイトをクローリングしてデータを収集することが考えられる。
教師なしデータは集めやすい。

- **多くのWebサーニスではクローリング目的の大量アクセスを規約で禁止している**
- データ収集先のWebサイトの利用規約で、**コンテンツの利用目的に制限が課されていることもある**

# 15.3 クラウドソーシング
クローリングは無料だが、教師ありデータを集めにくい。
クラウドソーシングを使うと有料（クラウドワーカーに報酬が必要）だが、タスクを設定することができる他、多数の作業者が並行して多数のタスクを安価に依頼できる。

日本語のデータセット構築では日本語話者の作業が必要となるため、必然的に国内のサービス（クラウドワークスやランサーズなど）を利用することになる。
#Rails + dotenv-rails / overload env files / not linux or OS or shell or docker container env


dotenv-rails does not prepare smart configuration for overload env ?

i write in 

`config/environments/development.rb`

or 

`config/application.rb`

( after Rails app configuration )

```rb
Dotenv.overload(*[
  Rails.root.join(".env.#{Rails.env}.local"),
  (Rails.root.join(".env.local") unless Rails.env.test?),
  Rails.root.join(".env.#{Rails.env}"),
  Rails.root.join(".env"),
].compact)
```

see 
https://github.com/bkeepers/dotenv/blob/v2.7.5/lib/dotenv/rails.rb#L57


# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2980








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Wordpressのカスタム投稿に必要な記述

カスタム投稿タイプ:キャンペーン(campaign)
カスタムフィールド名：ジャンル(genre-taxonomy)

```php

/**
 * 　カスタム投稿:キャンペーン追加
 */
function campaign_post_type()
{
    register_post_type('campaign', [ // 投稿タイプ名の定義
        'labels' => [
            'name'          => 'キャンペーン', // 管理画面上で表示する投稿タイプ名
            'singular_name' => 'キャンペーン記事',    // カスタム投稿の識別名
            'all_items' => 'キャンペーン一覧',
            'featured_image' => 'サムネイル画像(推奨: 350px : 150px)',
            'set_featured_image' => 'サムネイル画像を設定',
            'remove_featured_image' => 'サムネイル画像を削除',
            'use_featured_image' => 'サムネイル画像として使用'
        ],
        'public'        => true,  // 投稿タイプをpublicにするか
        'has_archive'   => true, // アーカイブ機能ON/OFF
        'menu_position' => 5,     // 管理画面で表示される位置。5は投稿の下、デフォルトは25（コメントの下）
        'show_in_rest'  => true,  // 5系から出てきた新エディタ「Gutenberg」を有効にする
        'parent'  => 'main',
        'supports' => array('title','editor','thumbnail')
    ]);
}
add_action('init', 'campaign_post_type');

/**
 * 　カスタム投稿:投稿数設定
 */
function campaign_posts_count($query)
{
    if (is_admin() || ! $query->is_main_query()) {
        return;
    }
    if ($query->is_archive('campaign')) { //カスタム投稿タイプを指定
        $query->set('posts_per_page', '6'); //表示件数を指定
    }
}
add_action('pre_get_posts', 'campaign_posts_count');


/**
 * 　カスタム投稿:検索後ページ設定
 */
function custom_search_campaign_template($template){
    if ( is_search() && is_post_type_archive('campaign') ){
        $post_types = get_query_var('campaign');
        foreach ( (array) $post_types as $post_type )
            $templates[] = "search-campaign.php";
        $templates[] = 'search.php';
        $template = get_query_template('search',$templates);
    }
    return $template;
}
add_filter('template_include','custom_search_campaign_template');


/**
 * 　カスタム投稿:タクソノミー設定
 */
function genre_taxonomy() {
    register_taxonomy(
    'genre-taxonomy', //タクソノミー名
    'campaign', //利用するカスタム投稿
    array(
        'label' => 'ジャンル',
        'singular_label' => 'ジャンル記事',
        'labels' => array(
            'add_new_item' => 'ジャンルを追加'
        ),
        'public' => true,
        'show_ui' => true,
        'show_admin_column' => true,
        'show_in_nav_menus' => true,
        'hierarchical' => true,
        'show_in_rest'  => true, // 5系から出てきた新エディタ「Gutenberg」を有効にする
        )
    );
}
add_action( 'init', 'genre_taxonomy' );
CentOS7にconcrete5をインストール

CentOS7の最小構成にLAMP環境とconcrete5バージョン8をインストールしてサンプルサイトを表示するまでの手順。

## Apache

### インストール

```
# yum install httpd
# systemctl enable httpd
```

### 設定

```:/etc/httpd/conf/httpd.conf
...
DocumentRoot "/var/www/html/<インストールディレクトリ>/public"
...
```

そのほかの設定はよしなに。

## MariaDB

### 最新版をインストール

```
# curl https://downloads.mariadb.com/MariaDB/mariadb_repo_setup | bash
# yum install mariadb-server
# systemctl enable mariadb
```

### 初期設定

```:/etc/my.cnf
[client]
...
default-character-set=utf8mb4
...
[mysql]
...
default-character-set=utf8mb4
...
[mysqld]
...
collation-server = utf8mb4_unicode_ci
init-connect='SET NAMES utf8mb4'
character-set-server = utf8mb4
...
```

そのほかの設定はよしなに。

```
# systemctl start mariadb
# mysql_secure_installation
```

ルートのパスワードを設定するなどよしなに。

### データベースとユーザーの作成

```
# mysql -u root -p
```
```sql
create database <データベース名>;
grant all on <データベース名>.* to <ユーザー名>@localhost identified by '<パスワード>';
```

## PHP

### 最新版（7.4）をインストール

```
# yum install epel-release yum-utils
# yum install https://rpms.remirepo.net/enterprise/remi-release-7.rpm
# yum-config-manager --enable remi-php74
# yum install php php-gd php-pecl-zip php-mbstring php-mysql php-xml
```

### 設定

必要に応じてよしなに。

## concrete5

### インストール

```
# yum install patch unzip
# curl https://getcomposer.org/installer | php -- --install-dir /usr/bin --filename composer
# composer create-project -n concrete5/composer /var/www/html/<インストールディレクトリ>
```

### 初期設定

```
# cd /var/www/html/<インストールディレクトリ>
# ./vendor/bin/concrete5 c5:install -i
```

質問に答える。時間帯は日本なら `JST` 。デフォルト言語は日本語なら `ja_JP` 。

## 仕上げ

### パーミッションとSELinux

```
# chown -R apache:apache /var/www/html/<インストールディレクトリ>
# restorecon -R /var/www/html/<インストールディレクトリ>
# setsebool -P httpd_can_network_connect_db 1
# setsebool -P httpd_unified 1
```

### ファイアウォール

```
# firewall-cmd --permanent --add-service=http
# firewall-cmd --permanent --add-service=https
# firewall-cmd --reload
```

### Apache 起動

```
# systemctl start httpd
```
docker imagesがSSDの容量を圧迫したのでHDDを増設してそっちに保存したメモ

# 最初に

- HDDマウントとdockerの保存場所変更を行っています。
- 保存先やUUIDは、各自で変更してください。

## OSとdocker のバージョン確認

```
$ cat /etc/os-release
NAME="Ubuntu"
VERSION="16.04.6 LTS (Xenial Xerus)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 16.04.6 LTS"
VERSION_ID="16.04"
HOME_URL="http://www.ubuntu.com/"
SUPPORT_URL="http://help.ubuntu.com/"
BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"
VERSION_CODENAME=xenial
UBUNTU_CODENAME=xenial
```

```
$ docker --version
Docker version 18.09.7, build 2d0083d
```

## HDDを自動マウントしたい

`/etc/fstab` を編集するとよいです。

### マウント先作成

```
$ sudo mkdir /mnt/hdd4000 
```

名前は任意。4TBのHDDなのでhdd4000

### 自動マウントするためのfstabを編集

- ディスク名のUUID取得

```
$ sudo blkid
...
/dev/sdc: LABEL="hdd4000" UUID="6e1266f3-3da9-4684-a396-xxxxxxxxxxxx" TYPE="ext4"
...
```

- /etc/fstab を編集

```
# hdd4TB 
UUID=6e1266f3-3da9-4684-a396-xxxxxxxxxxxx /mnt/hdd4000    ext4    defaults          1       2
```

を追加しました。オプションの説明は以下を参考。

参考： https://qiita.com/kihoair/items/03635447591358210772

* `fstab` 間違えるとOS起動しなくなるので注意です。（UUID 1文字間違えてハマった；；）

## dockerのイメージ保存場所変更

### 引越前にimageを全消し（移行は考えてません）
- docker コンテナを全削除する

```
docker ps -aq | xargs docker rm
```

- docker イメージを全削除する

```
docker images -aq | xargs docker rmi
```

参考：docker images を全削除する https://qiita.com/fist0/items/2fb1c7f894b5bdff79f4

### docker imageの場所を変更

`/etc/docker/daemon.json` を編集（新規作成）

```
{
    "data-root": "/mnt/hdd4000/docker/data"
}
```

参考：https://qiita.com/elm200/items/43497f76cbdd19c47d8b

### docker 再起動

```
$ sudo service docker stop
$ sudo service docker start
```

変更場所にファイルができたので完了です。
【ポケモン剣盾】Arduinoを用いた旧式自動ワット

##0.はじめに
・某掲示板ではArduinoを使用する方法はマイノリティとなっております。なのでArduino IDEを用いて作成したポケモン剣盾自動化プログラムを個人的なメモ書き程度ですがテンプレートの１つになればと思い投稿させて頂きます

・マイコンの導入方法に関しては既に多くの方が分かりやすく説明されてますので省略します

##1.概要
ポケモン剣盾自動化の基本中の基本、自動ワット回収のランクマバグを使用しない方式です。
なんで今更旧式なの？って感じですが万一バグが修正された時やWi-Fi環境が無い時に使えます。~~あと記事が少なくて寂しいから。~~
スピードはそこまで詰めてません。


####◯使用方法
・巣の目の前で開始
・開始時のワットの回収の有無は影響しないので気にしないで大丈夫です

##2.スケッチ
```ruby:
#include <SwitchControlLibrary.h>

//起動直後のズレ回避
void setup(){
  PressButtonR();
  PressButtonR();
  PressButtonR();
}

void loop() {
//巣の目の前で開始
  PressButtonA();
  delay(450);
  PressButtonA();
  delay(350);
  PressButtonA();
  delay(350);

//みんなで挑戦の直前
  PressButtonA();
  delay(1950);
//時間変更
  PressButtonHome();
  MoveHat(4); // down
  delay(25);
  MoveHat(2); // right
  delay(25);
  MoveHat(2); // right
  delay(25);
  MoveHat(2); // right
  delay(25);
  MoveHat(2); // right
  delay(25);
  PressButtonA();
  delay(800);
  // 設定画面
  SwitchControlLibrary().MoveHat(4); // down
  delay(1300);
  SwitchControlLibrary().MoveHat(8); // center
  delay(50);
  
  MoveHat(2); // right
  MoveHat(4); // down
  MoveHat(4); // down
  MoveHat(4); // down
  MoveHat(4); // down
  PressButtonA();
  delay(210);
  // 時間設定
  MoveHat(4); // down
  MoveHat(4); // down
  PressButtonA();
  delay(250);
  // 時間の変更　進める
  MoveHat(2); // right
  MoveHat(2); // right
  MoveHat(0); // up
  delay(60);
  PressButtonA();
  PressButtonA();
  PressButtonA();
  PressButtonA();
  delay(75);
  PressButtonHome();
  delay(350);
  PressButtonA();
  delay(750);
  PressButtonB();
  delay(650);
  PressButtonA();
  delay(2950);
  PressButtonA();
  delay(950);

}



// 以下省略用

//十字キーdelay(50)
void MoveHat(int direction){
  
  SwitchControlLibrary().MoveHat(direction);
  delay(50);
  SwitchControlLibrary().MoveHat(8);
  delay(50);
}

//Aボタン
void PressButtonA(){
  SwitchControlLibrary().PressButtonA();
  delay(50);
  SwitchControlLibrary().ReleaseButtonA();
  delay(50);
}

//Bボタン
void PressButtonB(){
  SwitchControlLibrary().PressButtonB();
  delay(50);
  SwitchControlLibrary().ReleaseButtonB();
  delay(50);
}

//Rボタン
void PressButtonR(){
  SwitchControlLibrary().PressButtonR();
  delay(500);
  SwitchControlLibrary().ReleaseButtonR();
  delay(500);
}

//Homeボタン
void PressButtonHome(){
  SwitchControlLibrary().PressButtonHome();
  delay(50);
  SwitchControlLibrary().ReleaseButtonHome();
  delay(400);
}


```

##3.一応解説
手動で行う無限ワットをそのままマクロにしただけですね、特に説明することはありませんが一点だけ。

31日→1日はワットが復活しないので復活しない分Aボタンが余ってしまいますが、"みんなで挑戦"のところは待機時間が長く、そのタイミングでAボタンが空撃ちされてます。なのでその日にワットの回収はできませんがループは崩れません。

一応ループ回数指定すれば対処は可能ですが、月日を気にせず回収開始できるのはそれなりにメリットだと思うのでこのままで十分かなと思います。~~決して面倒だった訳ではありません~~


ボタンを押して離す動作をまとめて短くしてありますので、delayを調整する際はソースコード下部を参考にしてください。



####◯参考
ワットの時給は46万/h程度となってます
delayを調整すればもっと早くなります

##4.おわりに
発売直後に自動化が流行り始め真っ先に自動化されたのがこの旧式自動ワットでしたね(多分)。既に出尽くしてるような気もしますが、これから始めたいって方もいらっしゃると思います。そんな時にこの記事が１つの参考になれば幸いです。

この記事を開いてくれた方、最後まで読んでくれた方、ありがとうございました。


何か御座いましたらコメント欄、もしくはTwitter @mega_ringuma までお願いします
【Python】データサイズが大きいcsvファイルをgeneratorを使って読み込む

```py

import csv


def csv_reader(file, header=False):
    with open(file, "r") as f:
        reader = csv.reader(f)

        if header:
            next(reader)

        yield from reader


def main():
    g = csv_reader("xxx.csv", header=False)
    print(next(g)) # => 一行目

if __name__ == '__main__':
    main()


```

---

```py

yield from reader
```

は

```py

for row in reader:
    yield row
```

でも実装できます。
Kaggle:A very simple XGB Regression Example for Beginners !

https://www.kaggle.com/frtgnn/beginner-s-stop-xgb-lgbm-blend

さくっとできそう。

## pandas_profiling

pp.ProfileReport(train)

で出てきている表がとにかくカッコいい。missingが分かりやすくてよい。
が、手元のjupyter labだと（テーマの営業か？）白黒で段組みもなく、expand-hideも効いてないのでガッカリ。

いったんhtmlに書き出してから読み込むとうまく表示されるとのことなので試してみる。

https://qiita.com/wakame1367/items/39faf5d91e20a5cf5772#_reference-a12e589891bdd7bf36e5

```
profile = pp.ProfileReport(train)
profile.to_file(outputfile="profile_report.html")

from IPython.display import HTML
HTML(filename='profile_report.html')
```
が、やはり黒背景には結構微妙だし、toggleも動かない・・残念。Jupyter LabはLight - Darkのテーマ切り替えがさくっと出来るから見にくいのはまあいいのだが。

で、結局は簡単にXGBとLGBMで出してブレンド、

```
y_pred_xgb  = pd.DataFrame( XGB.predict(test_scaled))
y_pred_lgbm = pd.DataFrame(LGBM.predict(test_scaled))

y_pred=pd.DataFrame()
y_pred['SalePrice'] = 0.5 * y_pred_xgb[0] + 0.5 * y_pred_lgbm[0]
y_pred['Id'] = test['Id']
```

これを提出して
```
Your submission scored 0.13666
```

まあ、何もやってないに等しいからな。

前回の何で出したかわからないやつのスコアは
0.21975
だった。

以上です。
特にやらなくてもいいと思う。
【バレンタイン特別企画】LINE相性診断作ってみた！

# バレンタインです

2月14日が近づいてきてそわそわしている男の人も多いのではないでしょうか？
今回はLINEのトーク履歴を使って気になる相手との相性を診断するシステムを作ってみました！

詳細については以下の動画で紹介しています
https://youtu.be/LNFFCBIHOXY


# どうやって作るの？

作り方は簡単です

1. 個人LINEのトーク履歴を保存
2. データ整形
3. 独自のアルゴリズムでスコア計算

※1はスマホアプリからとPCのアプリから保存するのではテキストのフォーマットが変わるのでスマホアプリから保存してください

# 個人LINEのトーク履歴を保存

以下の手順でトーク履歴を保存します

![line相性診断作ってみた_画像.004.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578529/280752f6-b2ab-9455-57c3-3748c00175f6.jpeg)

# データ整形

テキスト形式のトーク履歴をデータ整形していきます
メッセージとターンと会話という3つのデータ形式を定義します

![line相性診断作ってみた_画像.006.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578529/52327948-47bd-b2ca-b5a7-a52bb1d6a8a4.jpeg)

データ構造は一行メッセージがメッセージ、メッセージの集合がターン、自分と相手のターンの集合が会話という関係になります

![line相性診断作ってみた_画像.007.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578529/aebf4ac3-0348-1c3e-84cf-df2942eb29c1.jpeg)

# 独自のアルゴリズムでスコア計算

LINE相性診断システムには4つの評価軸があります

![line相性診断作ってみた_画像.009.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578529/4d2f93f0-f14c-ca46-2a1d-3672dd17dbf3.jpeg)

## 会話の長さ

会話の長さでは10日を満点として1会話ごとに計算します

![line相性診断作ってみた_画像.011.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578529/5b3c9a19-4515-af1f-6990-7e8fc5e1f438.jpeg)

## 返信間隔

返信間隔では6時間以上経過で0点になるように計算します

![line相性診断作ってみた_画像.013.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578529/6283cb9c-ecc9-4795-e6a5-ac0842c0caf6.jpeg)

## 内容の質

内容の質は今回は簡単に質問文または絵文字を含む場合に得点が入るようにしました
今後はword2vecやdoc2vecにより「好き」に近い単語が含まれている場合に加点するなどの処理を入れていきたいと思っています

![line相性診断作ってみた_画像.015.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578529/48318c29-71d7-f656-38b3-d39b8dd22cee.jpeg)

## 通話時間

通話時間の評価では1時間以上の通話を満点として全通話で平均をとります

![line相性診断作ってみた_画像.017.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578529/43a9ec10-ab98-bc47-e96f-250c57b394d6.jpeg)

# 結果

結果は以下のようになりました

![result.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578529/dd99c800-0fe7-7ee1-fd71-323d435f3f88.jpeg)

そこそこ厳しめに作ったので60点あれば上出来といったところです、わら

# まとめ

今回は簡単なアルゴリズムで相手との相性を数値化するシステムを作りました！
データがデータだけに心配ですがherokuなどで公開して使ってもらうのもよさそうですね
Craft CMS の各環境のデータを S3 を経由して同期するプラグイン

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8890/15701cdc-8c0e-1302-e657-decf2697825a.png)

複数の環境の Database/Assets を同期するためのプラグイン

> Env Sync
> https://plugins.craftcms.com/env-sync

細かい解説とかはこちらを読んだ。

> Syncing your DB and assets across environments in Craft 3
> https://weareferal.com/tldr/syncing-your-db-and-assets-across-environments-in-craft-3/

これは local が起点になってるけど、最新のデータがどこにあるか様々の場合とかどうなるんだろうな、、、

テンプレート周りとか、 CMS 自体はそれぞれの環境でやるってことかしら。
railsメモ

- ORMとは

wikiによると
>O/Rマッピングとは、オブジェクト指向言語におけるオブジェクトと、リレーショナルデータベースにおける>レコードとを対照させることである。ここでの「マッピング」とは「対応付ける」というほどの意味である。

>O/Rマッピングによって、リレーショナルデータベースのレコードがオブジェクトとして直感的に扱えるよう?になり、リレーショナルデータベースにアクセスするプログラムを記述する処理を容易にすることが可能となる。オブジェクトへのデータ取得などの処理を透過的に行えるようになるので、煩雑になりがちなデータベースに関する処理の記述がスマートになり、また柔軟なアプリケーションの構築が可能となる。

>なお、O/Rマッピング用のフレームワークやライブラリはO/Rマッパーなどと呼ばれる。代表的なものとしては、Java言語向けのHibernateやRuby言語向けのActiveRecordなどがある。

との事である。
つまり、ActiveRecordが入ってるおかげでスクリプト言語と同様に、翻訳しなくても自動翻訳して
データベースとやり取りすることを可能にしているというようなことだと思われる。

- database.ymlファイルの主な役割とは

db:createのコマンドを実行した時に作成されるデータベースの名称を指定する。

RailsアプリケーションがSQLサーバーにアクセスするときのソケットファイルの位置を指定する。

とのことであるがあまりよくわかっていない
Catalinaにアップデートしたらheroku pg:psqlがエラーで使えなくなった場合の対処法

いろいろ調べてググった結果はどれもNGだったので備忘録として。

# 現象

OSをCatalinaにアップデート後に、heroku-cliでコマンドを打つと以下のようにエラーが出るようになりました。

```console:console
$ heroku pg:psql -c "select count(*) from users;" --app hogehgoe

dyld: Library not loaded: /usr/local/opt/readline/lib/libreadline.7.dylib
      Referenced from: /usr/local/bin/psql
      Reason: image not found
```

で、ググるとシンボリックリンクを張るよう出てくるので、やってみる

```console:console
$ ln -s /usr/local/opt/readline/lib/libreadline.dylib /usr/local/opt/readline/lib/libreadline.7.dylib
```

そうすると再びエラーとなる

```console:console
dyld: Library not loaded: /usr/local/opt/openssl/lib/libssl.1.0.0.dylib
    Referenced from: /usr/local/Cellar/postgresql/10.3/lib/libpq.5.10.dylib
    Reason: image not found
```

再度シンボリックリンクをlibsslに貼るとまた別のエラーになる

```console:console
dyld: lazy symbol binding failed: Symbol not found: _CRYPTO_num_locks
  Referenced from: /usr/local/lib/libpq.5.dylib
  Expected in: /usr/local/opt/openssl/lib/libcrypto.1.0.0.dylib

dyld: Symbol not found: _CRYPTO_num_locks
  Referenced from: /usr/local/lib/libpq.5.dylib
  Expected in: /usr/local/opt/openssl/lib/libcrypto.1.0.0.dylib
```

この時点でこの対応は多分違うんじゃないかと気付いた次第。

# 対処

- rubyのバージョンを最新にアップデート（参考リンクを参照）
- readlineを最新にアップデート（Homebrew使用）
- postgresqlを最新にアップデート（Homebrew使用）

# 参考
https://qiita.com/Ficus/items/bdef5c2b504d7a4008fb
【データ移行】HiRDB（BLOB型） → PostgreSQL（bytea型）

HiRDB上のテーブルにBLOB型のカラムが存在していて、データ移行でPostgreSQLへ移行したい状況になったので、
備忘録的に書き留めておく。

<br>

流れは下記の通り。

1.  【HiRDB】BLOB型のカラム"以外"についてINSERT文を作成
2.  【HiRDB】対象テーブルのPrimaryキーとBLOB型カラムだけをSELECTし、バイナリファイルを出力させる
3.  【HiRDB → PostgreSQL】出力したバイナリファイルをPostgreSQLがインストールされているDBサーバーまでもっていく
4.  【PostgreSQL】移動させてきたバイナリファイルをUPDATE文により、既存レコードに適用させる
5.  【PostgreSQL】UPDATE文の実行

###①【HiRDB】BLOB型のカラム"以外"についてINSERT文を作成
省略
尚、ここで作成したINSERT文はPostgreSQL側に適用した状態で、BLOB型カラム以外はデータが存在している状態にしておく。

###②【HiRDB】対象テーブルのPrimaryキーとBLOB型カラムだけをSELECTし、バイナリファイルを出力させる
HiRDB側でWRITEという関数を用いてBLOB型カラムをSELECTすると、ドキュメントDirにバイナリファイルを出力してくれるらしい。
これによって、HiRDBのコンソールに出力されるのは、

PrimaryKey | それに対応したバイナリファイル名

となる。

```sql:sql
select [テーブルのPrimaryKey], WRITE([BLOB型のカラム名], '出力させたいDirのパス/ファイルの接頭辞(?)', 0) from テーブル名;
```
例）
・出力させたいDirのパス：/hirdb/doc
・ファイルの接頭辞：BLOBFILE
　出力させたいDirのパス/ファイルの接頭辞(?)
　　⇒/hirdb/doc/BLOBFILE

※出力させた２つの情報はファイル出力させたほうが後々楽になるのだが、ファイル出力の方法を知らなかったためこの方法で。

###③【HiRDB → PostgreSQL】出力したバイナリファイルをPostgreSQLがインストールされているDBサーバーまでもっていく
バイナリファイルをどう移動させるかは環境によって異なるため、やり方は省略する。
今回はffftpで一旦ローカルにバイナリファイルを移動させて、ローカルのファイルをPostgreSQLのサーバーへ移動させるという二度手間Styleで移動させた。

※PostgreSQLサーバーへの移動先についてだが、PostgreSQLのドキュメントDir(?)の確認用SQLに記載しているSELECT文で確認できたファイルたちが存在しているフォルダに移動させる。
この作業を行わないと、下記の通りになって次のUPDATE文でコケる。
*ERROR:  ファイル"xxxxxxxxxxx"のstatに失敗しました: No such file or directory*
　　　　　　　　xxxxxxxxxxxはファイル名


```sql:PostgreSQLのドキュメントDir(?)の確認用SQL
select pg_ls_dir('.');
```



###④【PostgreSQL】移動させてきたバイナリファイルをUPDATE文により、既存レコードに適用させる。

```sql:sql
UPDATE [対象テーブル名] SET [bytea型カラム名] = pg_read_binary_file('移動させてきたバイナリファイル名') WHERE PrimaryKey名 = '②で出力させた対応するPrimaryKey';
```
このUPDATE文をExcelでCONCATENATE関数を使って作成した。

###⑤【PostgreSQL】UPDATE文の実行


以上。
非線形最適化入門(私が)

# 1.要旨
　今回は，非線形最適化手法の中でも最も有名で，よく利用されているニュートン法について概略をまとめ，RおよびPythonでの実装例を載せました．多変量解析のある分析手法のパラメータ推定で利用した(する予定)ので，勉強も兼ねて実装しました．
# 2.非線形最適化
## 2.1 何それ？ 
　そのまんまですが，非線形関数の最適化(=最小化/最大化)のことです．非線形関数の例としては，$y = x^2$や$y = x\log_e x$などが挙げられます．例えば，$y = x\log_e x$を例にとると，この関数の最小値を与える点を得ようと思った場合，($0<x$で下に凸であることはわかっているとして，)$x$に関して微分して，
$$\frac{d}{dx}y = \log_e x + 1$$
この勾配が$0$となる点の関数の値を計算すれば良いです．つまり，
$$\log x_e + 1 = 0$$
の根を求めれば良いのです．ちなみに$\hat{x} = 1/e$です．
　このように，方程式をスパーンと単純に解ける場合(解析的に解ける場合)は，それでいいのですが，解が陽に表せない場合も多いです．そういった場合に非線形最適化手法が活躍します．
## 2.2 Newton-Raphson法
非線形最適化の中でも，最も有名で，シンプルで多岐にわたる場面で利用されている手法として，ニュートン法(Newton method, Newton-Raphson method, [wiki](https://en.wikipedia.org/wiki/Newton%27s_method))があります．数理的な詳細に関しては，[こちら(ニュートン法とは何か？？ニュートン法で解く方程式の近似解)](https://qiita.com/PlanetMeron/items/09d7eb204868e1a49f49)をご覧ください．丁寧に図解してくださっていて，高校数学がふんわりわかっていれば，大枠が掴めると思います．これを実装するためには，

*　勾配を計算するための数値微分
*　ニュートン法の更新式の反復

の二つが必要です．一つめに関しては，とりあえずは，

$$\frac{d}{dx}f(x) = \underset{h\rightarrow 0}\lim \frac{f(x + h) - f(x)}{h}$$

を実装しましょう．Rでは，

```{r}
numerical.differentiate = function(f.name, x, h = 1e-6){
  return((f.name(x+h) - f.name(x))/h)
}
```

で，pythonでは，

```{python}
def numerical_diff(func, x, h = 1e-6):
    return (func(x + h)-func(x))/h
```
みたいな感じでしょうか．これらとニュートン法による逐次計算を用いて，先ほどの

$$\log_e x + 1 = 0$$

を解いてみましょう．Rでの実行例は，

```{r}
newton.raphson(f.5, 100, alpha = 1e-3) # 0.3678798
```
pythonでの実行例は，

```{python}
newton_m(f_1, 100, alpha = 1e-3) # 0.36787980890600075
```
どちらも，先ほどの方程式の解$1/e\fallingdotseq1/2.718 = 0.3679176$に近くなっていることがわかります．
# 3.サンプルコード
雑コードですが...

```{r, newton_raphson.R}
numerical.differentiate = function(f.name, x, h = 1e-6){
  return((f.name(x+h) - f.name(x))/h)
}

newton.raphson = function(equa, ini.val, alpha = 1, tol = 1e-6){
  x = ini.val
  while(abs(equa(x)) > tol){
    #print(x)
    grad = numerical.differentiate(equa, x)
    x = x - alpha * equa(x)/grad
  }
  return(x)
}

f.5 = function(x)return(log(x) + 1)
newton.raphson(f.5, 100, alpha = 1e-3)
```

```{python, newton_raphson.py}
import math
def numerical_diff(func, x, h = 1e-6):
    return (func(x + h)-func(x))/h

def newton_m(func, ini, alpha = 1, tol = 1e-6):
    x = ini
    while abs(func(x)) > tol:
        grad = numerical_diff(func, x)
        x = x - alpha * func(x)/grad
    return x

def f_1(x):
    return math.log(x) + 1

print(newton_m(f_1, 100, alpha = 1e-3))
```
ニュートン法が，大域的最適解に収束するには，最適化する関数が，最適化する区間$[a,b]$に大域的最適解が存在し，その区間で凸でなければならないことに注意しましょう．私が昔かいたプログラムは，多変数の場合だったので，理解がいまいちでしたが，1変数の場合だと，シンプルで理解しやすいです．計算の精度は，tolパラメータとhパラメータに依存します．
Unreal Engine 4.24.2 on Ubuntu 18.04でUE4Editorがフリーズする問題の回避

# 概要

Unreal Engine 4.24.2(正確には4.23 〜 4.24のバージョン)をUbuntu 18.04で動かすと定期的にどこかのCPU使用率が100%になってUIスレッドが固まり、10秒ほどフリーズします。とても不愉快なので検索したらそれらしい回避方法が見つかったので共有します。

参照元 : https://answers.unrealengine.com/questions/936174/view.html

## 環境

- Unreal Engine 4.24.2
- Ubuntu 18.04 LTS
- GNOME 3

## 方法

UnrealEngineのソースコードのルートを基準として`Engine/Config/BaseEngine.ini`の以下の箇所を変更する。

```ini
[/Script/LinuxTargetPlatform.LinuxTargetSettings]
; When neither -vulkan nor -opengl4 are passed on the commandline, the engine will default to the first targeted RHI.
; ここをコメントアウトする。(;)でコメントアウト可能
; +TargetRHIs=SF_VULKAN_SM5

; OpenGL4 is deprecated, you can comment this back in to add it to your targeted RHI list
; ここのコメントアウトを消して有効化する
+TargetedRHIs=GLSL_430
```

この状態で再ビルドします。(iniの変更なので再ビルドしなくてもいいかもしれませんが、試してはいないです)
何やらGLSL_430はDeprecatedだからVulkan使えみたいな警告ウィンドウが出てきますが、無視しましょう。

## 所感

UE4はメインのレンダリングエンジンにVulkanを使う変更が最近入ったみたいで、できればそっちを使ってほしいみたいですが問題が修正されるのがはっきり確認できるまではこのやり方でいいと思います。安易にプロジェクトのバージョンを上げると戻せないので一旦コピーするとかbranchを切って確かめる等のバックアップを取りつつ最新版に合わせていきましょう。
ドライバーやパッチをあてたWIMファイルを作成する (A WIM file creation including drivers and patches)

MicrosoftからISOイメージをダウンロードする
ISOをマウントし、sources\install.esdファイルを、適当な場所（サンプルではc:\createフォルダ）へ、コピーする

install.esdからinstall.wim（Windows 10 Pro）を取り出す
-------
DISM /Export-Image /SourceImageFile:c:\create\install.esd /SourceName:"Windows 10 Pro" /DestinationImageFile:c:\create\install.wim /Compress:max /CheckIntegrity


以下の命令で適当な場所（サンプルではc:\mounts）へ、マウントする
-------
md c:\mounts
DISM /Mount-WIM /WimFile:c:\create\install.wim /Name:"Windows 10 Pro" /MountDir:c:\mounts


ドライバーをあてる
-------
DISM /Add-Driver /Image:C:\mounts\ /Driver:C:\Drivers\ドライバーフォルダ名またはinfファイル名


パッチを充てる
-------
パッチダウンロード先：http://www.catalog.update.microsoft.com/Search.aspx?q=windows%2010%20version%201909%20cumulative%20update
msuファイルを適当な場所（サンプルではc:\updates）へ、コピーしておく
DISM /Add-Package /Image:C:\Mount\Windows /PackagePath:"C:\updates\ downloaded update msuファイル名"

アンマウントする
-------
DISM /Image:C:\Mounts /Cleanup-Image /AnalyzeComponentStore
DISM /Image:C:\Mounts /Cleanup-Image /StartComponentCleanup /ResetBase
DISM /Unmount-Image /MountDir:C:\Mounts\ /Commit


Wimを取り出す
-------
DISM /Export-Image /SourceImageFile:c:\create\install.wim /SourceIndex:1 /DestinationImageFile:c:\create\Win10Pro.wim
DISM /Get-WimInfo /WimFile:c:\create\Win10Pro.wim /Index:1
DISM /cleanup-wim


...That's all. ☆ Knowledge of zealous young🌙🐰
Craft CMS のダッシュボードに Fathom Analytics の Widget を追加する Fathom Analytics プラグイン

> Fathom Analytics
> https://plugins.craftcms.com/fathom-analytics

Google Analytics みたいなものの1つで Fathom Analytics の状況をダッシュボードに表示してくれるプラグイン。

> Fathom Analytics
> https://usefathom.com/
LambdaでEC2内のシェルスクリプトを実行

## はじめに

### 本記事の対象となる読者

特定のトリガーでLambdaを起動して、EC2内のシェルスクリプトを実行したい

### システム概要

上記のやりたかったことを実現するために使用したサービスは以下です。

* AWS Lambda(以後Lambda)
* AWS System Manager(以後SSM)
* AWS Elastic Computer Cloud(以後EC2)

### 書かないこと

* EC2インスタンスの構築方法

## EC2

Amazon Linux2を使用して、無料利用枠でインスタンスを用意します。

### EC2インスタンスを作成

EC2インスタンスを作成する前に以下のポリシーをアタッチしたIAMロールを作成しておきます。仮に名前は`AWSServiceSSMRole`としておきます。

* AmazonEC2RoleforSSM
* AmazonSSMFullAccess

上記で作成したロールをインスタンスに割り当てインスタンスを作成します。

> ssm-agentのインストールは必要ありません。

### インスタンス内にbashスクリプトを作成

ssh接続をして以下を実行していきます。

```sh
# 自身で設定した情報を使ってSSH接続
$ ssh ec2-user@host -i ~~.pem

# 現在地の確認
$ pwd
# 結果：/home/ec2-user

# test.txtを作成
$ touch test.txt

# 実行するshファイルを作成
$ vi test.sh
```

vimで`test.sh`を開いたら以下を入力します。

```sh
#!/bin/bash

echo hoge >> test.txt
```

入力したら、保存します。

```sh
$ sh test.sh
```

と実行すると`test.txt`に`hoge`という文字列が書き込まれているかと思います。


## Lambda

今回はAPI Gatewayを使用して、そのエンドポイントにPOSTがあったらLambdaを実行するように作成します。
> serverless frameworkを使用して、lambdaを作成します。

```sh
$ sls create -t aws-nodejs -p myfunc

$ cd myfunc
```

上記を実行すると、 `handler.js` と `serverless.yml` が作成されます。

### serverless.yml

API Gatewayを使用するので、eventsを設定します。

```yml
service: myfunc
provider:
  name: aws
  runtime: nodejs12.x

functions:
  hello:
    handler: handler.hello
    events:
    - http:
        path: hoge
        method: post
        integration: lambda
```

### handler.js

AWS-SDK SSMクラスで用意されている`sendCommand`メソッドを使用します。
詳しくは[こちら](https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/SSM.html#sendCommand-property)を参照してください。

sendCommandは<b>SSMにあらかじめ登録されているドキュメントのコマンドを実行します</b>。
今回はデフォルトで用意されている`AWS-RunShellScript`ドキュメントを使用します。
`AWS-RunShellScript`はただEC2のシェルスクリプトを実行するだけですが、もちろんSSMに自分でドキュメントを作成してそれを実行することも可能です。

> lambdaではaws-sdkは標準でインストールされていますので、npm installなどでインストールする必要はありません。

```javascript
'use strict'

const AWS = require('aws-sdk')
const SSM = new AWS.SSM({region: 'ap-northeast-1'})
const REMOTE_WORKING_DIR = '/home/ec2-user'

module.exports.main = async event => {
  try {
    // 実行したいコマンド
    let command = 'sh exec.sh'

    let params = {
      DocumentName: 'AWS-RunShellScript',
      InstanceIds: ['作成したEC2のインスタンスID'],
      Parameters: {
        commands: [command], // 配列で指定するので複数実行も出来る
        workingDirectory: [REMOTE_WORKING_DIR] // どの階層で実行するかを指定
      },
      // SSMの実行結果をCloudWatchにロギング
      CloudWatchOutputConfig: {
        CloudWatchLogGroupName: 'SSMLogs',
        CloudWatchOutputEnabled: true
      },
      // タイムアウト設定
      TimeoutSeconds: 3600 // 1 hour
    }

    SSM.sendCommand(params, function(err, data){
      if(err){
        console.log(err, err.stack)
      } else {
        console.log(data)
      }
    })
  } catch(e){
    console.log(e);
  }
}
```

上記を保存後エンドポイントにPOSTして実行します。

```sh
$ curl -X POST "serverlessで作成されたエンドポイント" -d "{}"
```

以上となります。
Unityでアニメーションさせたらコライダーがずれる解決方法

blender2.8　でダメージを受けたら後ろに飛ばされるアニメーションを作って
unityで使用しようとしたところ

コライダーだけがその場に残ってキャラクターのアニメーションについてこない現象が起こりました。

解決方法

unityでアニメーションを動かして座標が動いているボーンを（数字が動く）探して
その子要素に空のゲームオブジェクトを作成。

コライダーと当たり判定のスクリプトをアタッチする。
あたりのtagづけなどの設定も忘れずにする。

以上。
悩んだ割に簡単でした。
![アニメーションにコライダーを.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560721/b9e85ccc-3d2f-0845-4406-55c145c4c3e6.png)
Xamarin.Forms で初めてCollectionViewを使ったのでメモ書きとして残しておく

参考にしたページ
https://devblogs.microsoft.com/xamarin/xamarin-forms-4-0-feature-preview-an-entirely-new-point-of-collectionview/


横に項目が５つ並んだリストを表示したかったので書いてみた。
２年前は先輩がカスタムレンダラーで作ってたので最近実装されたのかな？

```xml

<ScrollView x:Name="hoge" IsVisible="True">
            <CollectionView ItemsSource="{Binding fuga}">
                <CollectionView.ItemsLayout>
                    <GridItemsLayout Orientation="Vertical" Span="5"/>
                </CollectionView.ItemsLayout>
                <CollectionView.ItemTemplate>
                    <DataTemplate>
                        <Frame>
                            <Grid>
                                <Grid.RowDefinitions>
                                    <RowDefinition Height="Auto"/>
                                    <RowDefinition Height="*"/>
                                </Grid.RowDefinitions>
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="*"/>
                                </Grid.ColumnDefinitions>
                                <Image Grid.Row="0" Grid.Column="0" Source="{Binding Image}"/>
                                <Label Grid.Row="1" Grid.Column="0" Text="{Binding Title}"/>
                            </Grid>
                        </Frame>
                    </DataTemplate>
                </CollectionView.ItemTemplate>
            </CollectionView>
        </ScrollView>
```



記事を書いていて思うけれども、画面キャプチャがあると文字を見ない自分はとても理解しやすいと思う反面、
文字を読もうとしないから成長しないんだろうなと思うこの頃。

プログラミングの本なんであんなに分厚いの？
職場にあった『システムを「外注」するときに読む本』試し読みしてたら ~~小説~~ 駄文会話が書いてあって伝わりにくかった。勉強本としてはどうなのか悩ましい。

１０年前ぐらいの異世界転生ラノベ（夢小説）読みたい。
エラーで詰まったら、teratailに相談するのが超オススメ

本日初めてteratailを活用してエラー解決を図ったのですが、想像以上に素晴らしいサービスだったので一応Qiitaに残しておこうと思います。これからはteratailのいいところを箇条書きで示していこうと思います。

#返信が異常に早い

<img width="960" alt="SnapCrab_NoName_2020-2-12_14-51-25_No-00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/503537/d7e4d9ca-cd69-b8ff-a6e8-613202f12efa.png">

この画像を見てもらえればわかると思いますが、本当に即レスです。僕の場合は一分かかりませんでした。とんでもない速いスピードで助言をいただけたので非常に驚きました。

#コメントの中で議論が巻き起こる
これも驚いたのですが、teratailのコメントで「ああでもない」「こうでもない」と議論が起きていることはすごいことだなと感じました。
これによってさまざまな種類の解決法に気づくことができ、爆速でエラー処理をし知識も増やすことができるなと感じました。

teratailはほかの人のアンサー記事を読んでいるだけというのは非常にもったいないのでぜひ気軽に相談するのがいいと思います。
git環境下でローカルのファイル・ブランチを整理するためのコマンド


ローカルでいろいろやってると、作ったはいいけどコミットしなかったファイルとか、作ったはいいけどマージせずに使わなくなったブランチとか溜まっていきます。
そういうのが残っていると、どのファイルをコミットするべきかわからなくなりますし、逆に関係ないのにコミットしてしまったり、今使ってるブランチがどれかわからなくなったり…何かしら問題を引き起こしかねません。

そんな時に、ファイルを整理するコマンドをいくつかピックアップしました。

※ 使用は各自の責任でお願いします。

## ファイルを一括移動

トラックしてないけど使うっていうファイルは別のディレクトリを作成して退避させます。
そもそもgit管理下にあるのがあれなので…。

```
$ git ls-files --others --exclude-standard | xargs -I% mv % /path/to/directory
```

#### 参考
http://helloaworld.com/2015/08/25/git_memo.html

## untrackedなファイルを削除

いらないファイルは全て削除します。

```
$ git clean -f
```

ディレクトリも削除する場合は

```
$ git clean -df
```

削除前に確認したい場合は

```
$ git clean -n
```

#### 参考

https://qiita.com/tmyn470/items/c8359e4ec92d1f462bdf


## マージ済みのブランチを一括削除

```
$ git branch --merged | grep -v \\* | xargs -I % git branch -d %
```

これはエイリアスに登録して使っています。
実行前に`git fetch --prune`叩いたり。

#### 参考

https://qiita.com/kyanny/items/10a57a4f1d2806e3a3b8
https://qiita.com/hajimeni/items/73d2155fc59e152630c4


## マージしていないブランチも含めて全て削除

必要なブランチは全部リモートリポジトリにある！って時は綺麗さっぱり全部削除しましょう。

```
$ git branch | grep -v \\* | xargs -I % git branch -D %
```

これもalias登録しています。


※ 使用は各自の責任でお願いします。
【R】 意外と知らなかったif false

# if falseの実装（真偽式のある場合）

条件式をif構文に直接記述する場合、`!=`のように否定演算子`!`を使えばいいのは有名だが、

```R
> if(1 != 2) {
    print("FALSE")
  }
[1] "FALSE"
```

こういう書き方もできる。

```R
> if(!(1 == 2)) {
    print("FALSE")
  }
[1] "FALSE"
```

さらに、この書き方でもやってることは一緒である。

```R
> if((1 == 2) == FALSE) {
    print("FALSE")
  }
[1] "FALSE"
```

# if falseの実装（logical型データの場合）

論理型データに直接否定演算子`!`を付することでスマートに記述できる。

```R
> logi <- FALSE
> if(!logi) {
    print("FALSE")
  }
[1] "FALSE"
```


より直感的な記述法を使うこともできる。

```R
> logi <- FALSE
> if(logi == FALSE) {
    print("FALSE")
  }
[1] "FALSE"
```


さらに、真偽式の場合も同様に`!=`を使うことができる。

```R
> logi <- FALSE
> if(logi != TRUE) {
    print("FALSE")
  }
[1] "FALSE"
```

# より複雑な判定式（複数条件）

条件式が複雑になり、さらにif falseを組み合わせるとなれば、さらにスマートに書く必要がある。
そこで、判定式の結果をlogical型データとしてオブジェクトに保存して、それに対して否定演算子`!`を直接付するほうが、コードを見返すときや修正するときに便利である。

```R
num <- 100

logi.range <- 0 <= num && num < 1     # 0以上1未満の判定
logi.not.numeric <- !is.numeric(num)     # 数値型以外=TRUE
logi2 <- logi.range || logi.not.numeric  # 数値型以外または0以上1未満 = TRUE, 数値型で0～1に含まれていない = FALSE

if(!logi2) {
  print("numは0以上1未満でない数値型データである")
}
[1] "numは0以上1未満でない数値型データである"
```
“We develop the Custom WordPress Websites to empower your business opportunities”

We’re leading top-notch WordPress Development Company across the USA with command over essential latest technologies like HTML, CSS, JavaScript, REST API, MySQL as well as PHP.

Our WordPress developers have seamless proficiency in developing dynamic websites that are compatible with all business models and industry verticals.

As being a top-notch WordPress Development Company, our expertise in these WordPress Development Services:
Why 4Life is the right WordPress Development Company?

    Flexible WordPress development Services, we offer custom web design packages.
    Proven track record of delivering successful websites
    Fully Secured Websites
    In-house dedicated WordPress Developers
    We believe in the long-term competent and trustworthy business partnership
    Complete transparency throughout the WordPress Development process

We have expertise in developing custom multilingual websites. We help to convert your existing website as well as develop a new WordPress website with multilingual functionality.

As being bespoke WordPress CMS Development Company, We offer WordPress theme and plugin customization and  Invites you to contact us, today, for any of your WordPress development requirements.

Nowadays, Mobile devices are the most efficient and common way to surf the internet and it’s important that your business website must be designed for the type of devices used by your customers. As being a bespoke WordPress development company in USA, we develop adaptable,  SEO friendly and responsive websites that are easier to update and customizable each customer’s specific business requirements.

Stop letting your ideal customers give business to your competitors! Let’s get started by taking baby steps towards our WordPress Development Company
https://www.4lifeinnovations.com/wordpress-development-company-usa/
Amazon Athena で no viable alternative at input への対処法

## 背景

以前からあるCloudTrailのログをAthenaで分析したいと思いクエリを投げましたが、クエリが重いのでなんとかしたいと思いました。

Partitionを分割して時間とコストを節約しようと考え、Athenaのテーブルを作成しなおそうと思ったら、`no viable alternative at input 'create external'` のようなエラーに遭遇。

Syntaxがおかしいっぽいことまではわかるのだけど、これだけじゃどこを直して良いのかわからない。。。

とりあえず、公式ドキュメントを確認。さすがよくまとまってます。

https://docs.aws.amazon.com/ja_jp/athena/latest/ug/create-table.html

## DDL確認ポイント

公式ドキュメントから、確認ポイントを抜粋しました。
これらをひとつひとつチェックしていけば、ほぼ間違いなくエラーは消えるでしょう。

* テーブル名に特殊文字(アンダースコア(_)以外)を使ってる
* テーブル名を数値から始めている
* カラム名に特殊文字(アンダースコア(_)以外)を使ってる
* カラム名をクォートで囲っている
* 括弧が足りない
* アンダースコアから始まる名前がバックスラッシュで囲ってない
* カンマが欠落している
* 半角スペースが足りない
* カラムやパーティション指定時に、最後のカンマが余計についている
* パーティションのカラム名に、テーブルのカラム名と同じものが指定されている

テーブル名にハイフンを使いたくなるのはよくある話だけど、エラーになる。

で、自分の場合、全部チェックしたけどエラーは消えなかった。

なんで？:thinking:

## 自分がハマったところ

* パラメータの順番が違う

ちなみに、自分が投げたクエリはこんな感じ。

```sql
CREATE EXTERNAL TABLE my_cloudtrail (
    eventVersion STRING,
    userIdentity STRUCT<
        type: STRING,
        principalId: STRING,
        arn: STRING,
        accountId: STRING,
        invokedBy: STRING,
        accessKeyId: STRING,
        userName: STRING,
        sessionContext: STRUCT<
            attributes: STRUCT<
                mfaAuthenticated: STRING,
                creationDate: STRING>,
            sessionIssuer: STRUCT<
                type: STRING,
                principalId: STRING,
                arn: STRING,
                accountId: STRING,
                userName: STRING>>>,
    eventTime STRING,
    eventSource STRING,
    eventName STRING,
    awsRegion STRING,
    sourceIpAddress STRING,
    userAgent STRING,
    errorCode STRING,
    errorMessage STRING,
    requestParameters STRING,
    responseElements STRING,
    additionalEventData STRING,
    requestId STRING,
    eventId STRING,
    resources ARRAY<STRUCT<
        arn: STRING,
        accountId: STRING,
        type: STRING>>,
    eventType STRING,
    apiVersion STRING,
    readOnly STRING,
    recipientAccountId STRING,
    serviceEventDetails STRING,
    sharedEventID STRING,
    vpcEndpointId STRING
)
PARTITIONED BY ( region STRING, year STRING )
COMMENT 'CloudTrail table for cloudtrail archive'
ROW FORMAT SERDE 'com.amazon.emr.hive.serde.CloudTrailSerde'
STORED AS INPUTFORMAT 'com.amazon.emr.cloudtrail.CloudTrailInputFormat'
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION 's3://my-bucket-name/AWSLogs/my-account-id/CloudTrail/'
TBLPROPERTIES ('classification'='cloudtrail');
```

よくあるCloudTrailのログを元にAthenaにテーブルを作成するクエリ。
でも、これはエラーになる。

なぜなら、COMMENTとPARTITIONED BYの**行の順番が逆だから**。

つまり、DDLステートメント CREATE TABLE はパラメーターの順序もチェックするので、COMMENTとPARTITIONED BYの行を入れ替えて実行すると、**テーブルの作成が成功**します。

## まとめ

今回は、ドキュメントの読み方が良くなかったと反省しました。

簡易チェックには、Format Queryを使いましょう。
SQLを整形したタイミングで間違っていると、パッと見でだいぶ違和感ある感じに整形されるので気づきやすいと思います。

誰かが同じ道を踏んだ時に、お役に立てば幸いです。
dotnet fsiの入力遅延？

linux mint19.3(on ASUS E200HA)でapt経由で突っ込んだ
dotnetでfsiを動かすと、すっげー入力の反映が遅延する。

たとえばコードをコピペすると1文字ずつ入力していく様を眺めないといけなかったり、
中間に文字を打ち込んだりバックスペースで文字を1文字押すと
行頭から1文字ずつ再描画される(この間、何秒か待たないといけない)。

自分の環境だけかもしれんけど、理由がわからなくてうーんってなってる。
みんなこうなってないんだろうか？

同じような事象で苦しんでる人がいたっぽいけど、未解決のまま第三者にcloseされてる。
https://github.com/ionide/ionide-vscode-fsharp/issues/1242

僕の場合はvscodeでも純正ターミナルでも一緒で遅かった。

どうやって原因特定したもんかなぁ。

##やったけど関係なさそう
* zshかbashは関係ない(両方試したけど同じだった)
* デスクトップ環境を更新する(mint 18.3 SylviaのMate環境でも一緒やったので多分違う)
* dotnetを更新する(上記と同じで、18.3当時よりもdotnetはバージョン上がってるはずなので)

##これから試す事
* ターミナルの細かい設定？(vscodeから叩けるのって、システムのターミナル叩いてるだけなんですかね？)
→透過とか弄ってみたけど関係なさそう。もしかしてCursorsとかその辺の実装の差かな？
* Win10でも発生する？(これは別途検証する)
→発生せんかった。powershellで叩いたけど爆速ですやん

```txt:win10
.NET Core SDK (global.json を反映):
 Version:   2.1.602
 Commit:    04475eb7cf

ランタイム環境:
 OS Name:     Windows
 OS Version:  10.0.18363
 OS Platform: Windows
 RID:         win10-x64
 Base Path:   C:\Program Files\dotnet\sdk\2.1.602\
```
```txt:mint
.NET Core SDK (global.json を反映):
 Version:   2.2.402
 Commit:    c7f2f96116

ランタイム環境:
 OS Name:     linuxmint
 OS Version:  19.3
 OS Platform: Linux
 RID:         linux-x64
 Base Path:   /usr/share/dotnet/sdk/2.2.402/

```
おっと、mintの方が新しいですね...

2020/2/13 追記
コメントで頂いた通り、dotnetのバージョン上げたら治りました！
ありがとうございます！

apt updateとapt upgradeで更新されるもんだとすっかり勘違いしてましたｗ

```txt:mint
.NET Core SDK (global.json を反映):
 Version:   3.1.101
 Commit:    b377529961

ランタイム環境:
 OS Name:     linuxmint
 OS Version:  19.3
 OS Platform: Linux
 RID:         linux-x64
 Base Path:   /usr/share/dotnet/sdk/3.1.101/

```

fsiがすらすら動く・・・こんなにうれしい事はない・・・！！！
vscodeでrosをステップ実行してデバッグ

## はじめに

会社の方からデバッグの方法を教えてもらったときのメモ。
走り書きなので間違ってたらすいません。

## roslaunchをdebugで実行する

### 準備
・rosの拡張を入れる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196838/d1a4022e-6564-edb8-a35a-8b4ae618874d.png)


・実行ファイルをdebugオプションでビルド。特にcatkin build を使う必要はない。

```
$ catkin build [package] --cmake-args -DCMAKE_BUILD_TYPE=Debug
```



### launch.jsonの生成

・`launch.json`（vscode上で `F5` を押すと実行されるファイル）のROS拡張があるので、それを利用します。 `ctrl + shift + p` でlaunchって調べると`launch.json`が出てくるので開く。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196838/55b88b01-75ca-b152-eb30-2d7a24236ef3.png)

・`launch.json`の右下の `Add Configuration` を押すと基本構成がリストで出てくるので、`ROS: Launch` を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196838/bffb9026-3251-9768-da03-eeeb6cb2a735.png)

・targetのタグに実行したいlaunchファイルのパスを書き込む
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196838/268b05ec-4094-3c4c-f925-87b1e72369ca.png)

### 起動

・`launch.json`を開いて`F5`を押すと起動


### 解析

・exceptionとかがあると自動で止まってくれる。これはthisがnulptrだったとき。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196838/8ec7b993-19f1-5eab-79b4-4e20f9213263.png)


・左端のデバッガを押すと色々見える
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196838/bc1208cf-9c3d-89e4-e5c6-cda38c31a3e3.png)


・ブレイクポイントも貼れる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196838/2f6cf39b-f745-d61a-3857-93dfd7762eef.png)

・変数にカーソルを合わせると中身が見える
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196838/a7d3e472-3030-e72f-2378-6ae9fd878194.png)

・デフォルトだとvectorとかは中身が見えない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196838/455a781a-919a-a86b-e8a0-b6e70b5ea36f.png)

・ので、vscodeの `DEBUG CONSOLE` で以下のコマンドを打つ

```
-exec -enable-pretty-printing
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196838/110dc23d-34a5-a1af-5149-83ac00ca7d9f.png)


すると見える。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196838/37074216-855d-3958-3b21-21fafab4bb01.png)


・Exceptionのときのcall stackは左下のところに書き出される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196838/b8826936-6cfc-f23b-8e0a-182da3a38d4b.png)
ruby,実引数、仮引数学び

- 実引数を定義し、それに答える仮引数の値はどんなものでも構わないが、
<br>仮引数で受け取ったメソッド内では仮引数で使った値を用いてプログラムを組み立てる。

どういう事かというと、

```
def aaa(input)
  input ** 2
end

bbb_input = 3
puts aaa(bbb_input)

9
```

大概の例題はこのような形でinputに似通ったものを使っていたりするので、

実引数、仮引数の関係がとてもわかりづらい。
なので、無茶苦茶にしてみる事にした。

```
def aaa(szxdcrftvgbsdfghdfghjdxfghldcfvgkml)
  bbb_input ** 2
end

bbb_input = 3
puts aaa(bbb_input)

111.rb:2:in `aaa': undefined local variable or method `input' for main:Object (NameError)
```
しかしこのままではエラーが出てしまう。

何故エラーが出るかというと、puts aaaはdef~end内で括ったメソッドを呼び出しているに過ぎないからである。


bbb_input = 3を定義し、aaa(bbb_input)とする事でaaaにbbb_input = 3を関連付けさせ、
puts aaaによってdef aaa endで定義したメソッドに仮引数を通じて値を渡し処理を実行しようとしているが、
def aaa end内では実引数が仮引数に変換されて処理をされるのでdef aaa end内の処理は、
仮引数を使って処理を記述しなければならないのである。

最初は非常にわかりにくいが、この仕組みが実はとても便利なのである。

エンジニア初心者のころは数列計算のような形でしか実引数、仮引数を扱わないと思うが、
これが例えば会計アプリを作成するとなった場合、
同じ処理を使いたいが実行結果のみ変えたいとなった時に、
実引数と仮引数が同じ処理を複数作る必要はなく、
その処理を行いたいメソッドに対して実引数さえ乗っけてしまえば、
後は仮引数が自動的に実引数を仮引数に変換してくれるので複数同じ処理を書かなくて済むのである。

先ほどまで記述していたコードで表すと、

```
def aaa(szxdcrftvgbsdfghdfghjdxfghldcfvgkml)
  szxdcrftvgbsdfghdfghjdxfghldcfvgkml ** 2
end


bbb_input = 3

a = 4

puts aaa(bbb_input)
puts aaa(a)

9
16
```

この通り"bbb_inpput"も"a"も無事に処理が完了する。
同じ処理はメソッド一つで済むという事である。