OmniAICreator/Qiita-1.07M huggingface dataset:
Docker + Nginx + PHP-FPM + MySQL 8 + CakePHP3.8でチュートリアル環境をサッと作る

# 概要 🎂
[CakePHP3のチュートリアル](https://book.cakephp.org/3.0/en/tutorials-and-examples.html#)を試すのにDockerを使いました
https://github.com/yotasasaki/cakephp3-docker に置いてあります。

## 構成
* タイトルの通りです。チュートリアルを進めるための最低限の構成です。
    * Docker Desktop for mac
    * Docker Compose
    * Nginx
    * PHP-FPM
    * MySQL 8
    * CakePHP3系 (3.8.4)

# 使い方

```bash
$ cd /YOUR/PROJECT
$ git clone https://github.com/yotasasaki/cakephp3-docker.git .
$ cd docker/
$ docker-compose up -d
$ docker ps --format="{{.Names}}"
cake-nginx
cake-mysql
cake-phpfpm
$ docker exec -it cake-phpfpm bash
// in phpfpm container
/var/www/html # rm cms/empty && composer self-update && composer create-project --prefer-dist cakephp/app:^3.8 cms
... composer install ...
/var/www/html # exit
```

```php5
// config/app.php の編集
    'Datasources' => [
        'default' => [
            // ... more configurations
            'host' => 'cake-mysql',
            'username' => 'cakephp',
            'password' => 'password',
            'database' => 'cake_cms',
```

http://0.0.0.0:8080/ にアクセスするとCakePHP3のデフォルトトップページにアクセスできるはずなので、`Database` 項目が `CakePHP is able to connect to the database.` になっていればOKです。

<img width="986" alt="スクリーンショット 2019-09-28 23.02.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87716/351a893a-52d7-463e-d1c3-962ee28d6477.png">


# チュートリアルを進める上での注意点
CakePHP 3.8.4 でもほぼチュートリアルの通りでも問題ありませんが、1点だけ。

*  [検証ルールの更新](https://book.cakephp.org/3.0/ja/tutorials-and-examples/cms/articles-controller.html#articles) にて、 `->allowEmptyString('title', false)` の引数に関して警告が出ます。`->allowEmptyString('title', null, false)` のように引数の順番を変えてやると直ります。[参考:3.8移行ガイド](https://book.cakephp.org/3.0/ja/appendices/3-8-migration-guide.html)

```
Deprecated (16384): You are using a deprecated argument order for Cake\Validation\Validator::allowEmptyString. You should reverse the order of your `when` and `message` arguments so that they are `message, when`. - /var/www/html/cake/vendor/cakephp/cakephp/src/Validation/Validator.php, line: 855
```

# 補足
* MySQL8系を使うために `--default-authentication-plugin=mysql_native_password` としました。
* 大体皆がハマる`intl` に関しては、phpfpmコンテナ上で有効化してあるので、`composer create-project` はコンテナにログインして行うようにしてます。ローカルPC上で実行すると`intl`設定したりまた面倒な事になるので。
* 今回は`docker-compose up`時にチュートリアル用のテーブルも作ってしまう様にしました。不要な場合は、[1.create-schema.sql](https://github.com/yotasasaki/cakephp3-docker/blob/master/docker/mysql/initdb.d/1.create-schema.sql) を削除すれば、テーブルは作成されません。
* `cms` ディレクトリを他の名前にする場合は、以下を修正して、`docker-compose down --rmi all`してから再度`up`してください
    * `docker-composer.yml`のvolumes
    * `nginx/default.conf`のroot
    * CakePHPのDL前なら `composer create-project`コマンドの最後の引数

# 参考
環境構築に関してはすでにたくさん分かりやすい記事があるので、本記事は補足情報程度にして頂ければと思います。

* [Docker + Nginx + PHP-FPM なら40秒くらいで環境を準備できる docker-compose が楽しくなってきました。](https://qiita.com/mochizukikotaro/items/b398076cb57492980447)
* [DockerでCakePHP3.7 + Nginx + MySQLの環境を構築してみた！](https://blog.adachin.me/archives/10097)
Djangoのrequestという引数について誤解していたこと

#requestって何の役目？
Djangoの勉強中に下記のようなコードを書いていて、
急に`def signupfunc(request):`のrequestという
引数が何なのかわからなくなった。

```
from django.shortcuts import render

# Create your views here.

def signupfunc(request):
    # requestのメソッドがポストがそうでないかでターミナルにメッセージを表記
    if request.method == 'POST':
        print('this is post method')
    else:
        print('this is not post method')
    #今回はファンクションベースドビューを作成。｛｝は辞書型データでコンテキストと言われて、モデルを指定する。
    return render(request, 'signup.html', {'some':100})
```


#何がわからないのか
何も定義した覚えもないのに、requestという引数名は何か
特殊な機能を果たしているのかと思った。
Djangoのビルトインの引数が何かなのかと思った。
例えば、下記のような場合

```
from django.shortcuts import render
#djangoにビルトインのビューをインポート
from django.views.generic import ListView, DetailView, CreateView, DeleteView, UpdateView
#models.pyからデータの型TodoModelをインポート
from .models import TodoModel
from django.urls import reverse_lazy

# Create your views here.
# ListViewのクラスの作成
class TodoList(ListView):
    # htmlファイルの指定
    template_name = 'list.html'
    # データの型をTodoModelに指定
    model = TodoModel
```
`class TodoList(ListView):`のListViewはDjangoのビルトインされている機能
なのだが、`from django.views.generic import ListView, DetailView, CreateView, DeleteView, UpdateView`とちゃんとインポートして使っている。
けど、今回の場合は、インポートもしていないのに、なぜ機能しているのかがわからなかった。
自分の理解している範囲のpythonの機能ではそんなことはあり得ないのではないかと疑問に思った。

#結論
ただの仮引数だった。別に引数名はrequestじゃなくてもよくてわかりやすいから一般的にそう命名されているだけだった。
間違っていたらだれか詳しい人教えてください。
Rust製のディレクトリお気に入りツール

#自己紹介
最近Rustを学んでいる[@1125__rui](https://twitter.com/1125__rui)です。
普段はPythonで競技プログラミングをしたり、ラーメンを食べたりしています。


#diar
開発をしているときに、頻繁に訪れるディレクトリのパスをいちいち入力するの、めんどくさくないですか？？
Webブラウザにあるようなブックマーク機能があったら、移動が楽なのになぁとか思ったのでRust初心者の友人[@4afS_](https://twitter.com/4afS_)と一緒にツールを作成しました。

作成したものが[これ](https://crates.io/crates/diar)です。
"directory" の "dir" と "dear" をまぜて "diar"です。割と名前が気に入っていたりします。
使い方、インストール方法は[README](https://github.com/Index197511/diar/blob/master/README.md)に書いてあるので、そちらを参考にしてください。
Rust側からcdコマンドを実行する方法が見つからなかったのでシェルスクリプトを追記しないと動作しないのが残念です:cry:


```bash
diar-jump(){
  local selected=$(diar jump $1)
  local flag=0

  if [[ -n $selected ]]; then
    if [[ $selected =~ "Is this what you are jumping?" ]]; then
      diar jump $1
      flag=1
    fi
    if [[ $1 = "-h" ]]; then
      diar jump $1
      flag=1
    fi
    if [[ $flag -ne 1 ]]; then
      \cd $selected
    fi
  fi
}
```

非常に不格好に見えますし、jumpだけハイフンを間に挿入しないといけないのはイマイチ気に食わないので、近いうちに修正したいなとか考えています。

#使用したライブラリ
* [sled](https://github.com/spacejam/sled)

これがとても便利です。パスを渡すだけで手元にファイルとしてDBを構築できてしまいます。
今回はこのライブラリをメインに使用して、お気に入りのディレクトリとそれに対するキーを保持するようにしています。

* [clap](https://github.com/clap-rs/clap)

Rustでコマンドラインツールを作るときに最も王道なライブラリだと思います。
紹介記事や詳しい仕様方法などは[公式](https://clap.rs/)を参照してください。


#まとめ
Linux環境での動作は確認しています。ぜひ使い勝手などを教えてくださるととてもありがたいです。
よろしくお願いします:pray:
【Unity(C#)】EditorWindowで一括リネーム

##Prefabなら簡単
Prefab であれば一括で変更するのは容易です。

ただ、別のオブジェクト同士を一つのジャンルとして区分し、リネームしたい時や、
名前のおしりにインデックスをつけて整理したいときなどにはそうもいきません。

##デモ
Hierarchy上で選択したオブジェクトの全ての子に対して
インデックス付きでリネームするEditor拡張です。

![ReName.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244071/193537b7-6066-c33a-d3b2-ecd963611cc4.gif)

##コード

何気にEditorWindowの拡張機能を使いこなせていなかったので
しっかりとメモしておこうと思います。

```C#:ツールバーに表示されるMyToolsから実行
#if UNITY_EDITOR
using UnityEngine;
using UnityEditor;

public class RenameAllChildren : EditorWindow
{
    static EditorWindow window;
    string textField = "";
    
    [MenuItem("MyTools/RenameAllChildren")]
    static void ShowWindow()
    {
        window = EditorWindow.GetWindow(typeof(RenameAllChildren));
        window.position =new Rect(Screen.width*2, Screen.height/2, 300,100);
    }

    void OnGUI()
    {
        GUILayout.Space(25);
        
        EditorGUILayout.BeginHorizontal();
        
        GUILayout.Label( "ObjectName" );
        textField = GUILayout.TextField( textField , GUILayout.Width(window.position.width/1.5f));
       
        GUILayout.EndHorizontal();
        GUILayout.Space(25);
        
        if( GUILayout.Button( "Change all names of ChildrenObject" ) )
        {
            int num = 1;
            
            GameObject selectionObj = Selection.activeGameObject;

            for (int i = 0; i < selectionObj.transform.childCount;i++)
            {
                Transform childTransform = selectionObj.transform.GetChild(i);

                childTransform.name = textField + num;
                num++;
            }
        }
    }
}
#endif

```

##EditorWindowの大きさ、位置調整

`EditorWindow.GetWindow();`とするのではなく、
一度変数に入れて`.position`でプロパティを編集できるようにします。

```C#:変数を用意
    window = EditorWindow.GetWindow(typeof(RenameAllChildren));
    window.position = new Rect(Screen.width*2, Screen.height/2, 300,100);
```

また、`Screen.width`、`Screen.height`は画面の大きさを取得できるので調節に便利です。

##GUIを横並びにする

画像のように並べる方法です。

![Rename.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244071/1007a695-af35-5b16-438c-21d4dfd1bc2b.png)

```C#
EditorGUILayout.BeginHorizontal();
//横並びにしたいGUI達
GUILayout.EndHorizontal();
```

##Hierarchy上で選択中のオブジェクトの取得

`Selection.activeGameObject`で選択中のオブジェクトが取得可能です。

`transform.GetChild(i)`で子のオブジェクトを順番に取得してリネームしています。

`transform.childCount`が子のオブジェクトが無い場合には0になるので
ループの条件ではじかれてエラーは出ません。


##まとめ
`Selection.activeGameObject`のおかげでいろんなEditor拡張ができるようになると思います。
あると便利な機能はどんどんEditorWindow化していこうと思います。

参考リンク：[Hierarchy上で選択したオブジェクトの子どもを一括でNavMeshArea設定を変える方法](https://qiita.com/MizoTake/items/32319c9a311a29e81cc5)
EC2のLaravel6.0環境のBladeテンプレートの基礎を学ぶ　AWS/Laravel連載(8)

# はじめに

前回の記事でデバッグバーを入れました。

[EC2のLaravel6.0環境にデバッグバーを入れる　AWS/Laravel連載(7)](https://qiita.com/rf_p/items/8d25b25b712a52390657)

今回はLaravelのテンプレートエンジンであるBladeと、Laravelのヘルパーを読み解いていきます。

# Bladeテンプレート

LaravelはBladeというテンプレートエンジンを使っています。
普通のPHPファイルとは異なり、見やすく書きやすいコードを書くことができます。

まずは以下ドキュメントをざっと読んで試してみてください。
https://readouble.com/laravel/6.0/ja/blade.html
https://readouble.com/laravel/6.0/ja/helpers.html

いくつか試してみます。

```php:resources/views/home.blade.php
...
                    You are logged in!
...
```

と書かれている箇所に2行追加します。

```php:resources/views/home.blade.php
...
                    {{ Auth::user()->name }}さん<br>
                    {{ auth()->user()->name }}さん<br>
                    You are logged in!
...
```

<img width="1141" alt="echo.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199678/2a0f783f-0ed3-d9f7-3ab4-46923fa865aa.png">

今回、testというユーザー名で登録したので「testさん」と出ています。
書き方は少し違いますが、どちらでも表示できています。実際サービスとして運用する場合は、コーディングルールとしてどちらかに統一した方が良さそうです。

ちなみにBladeテンプレートではなく普通のPHP記述だと

```php:resources/views/home.blade.php
...
  <?php echo auth()->user()->name ?>さん
```

となります。（厳密にはエスケープされているので、htmlentitiesで括った時と同じ挙動です)
Bladeテンプレートでは、こんなものもサポートされています。

```php
@php echo $hoge @endphp
```

という書き方は(一応)できますが冗長なので、echoしたいのなら{{ }}で書くようにしましょう。

# FizzBuzz問題を解いてみる

BladeテンプレートでFizzBuzz問題を解いてみます。
FizzBuzz問題とは、１から数字をカウントアップしていき、3の倍数の時にFizz、5の倍数の時にBuzz、3の倍数かつ5の倍数の時にFizzBuzzと表示する遊びのことです。
プログラミング言語では、記法を学ぶ上での初歩的なクイズとして出されることがあります。

Bladeテンプレートで書くと以下のようになります。

```php:resources/views/home.blade.php
...
                    @for ($i = 1; $i <= 100; $i++)
                      @if ($i % 15 == 0)
                        FizzBuzz
                      @elseif ($i % 3 == 0)
                        Fizz
                      @elseif ($i % 5 == 0)
                        Buzz
                      @else
                        {{ $i }}
                      @endif
                      <br>
                    @endfor
...
```

<img width="316" alt="fizzbuzz.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199678/f76e262c-d52e-1751-e04f-6e0b85ab4d34.png">

if,for,foreachといった構文はもちろんですが、Railsでは使えるのにPHPだとサポートしていないunless。

```php
if(!$hoge){
 ~~
}
```

と書かないといけないところ

```php
@unless ($hoge)
 ~~
@endunless
```

をサポートしていたり、未定義変数参照のNoticeエラー回避用の

```php
if(isset($hoge)){
 ~~
}
if (empty($hoge)){
 ~~
}
```

を

```php
@isset
 ~~
@endisset

@empty
 ~~
@endempty
```

とサポートしているので便利です。

本日は以上です。
日経BP主催 RPA/ビジネスAIカンファレンス2019Fallに行ってきた話

先日恵比寿のウェスティンホテルで行われた「[日経BP主催 RPA/ビジネスAIカンファレンス2019Fall](https://project.nikkeibp.co.jp/event/rpa190926/)」に行ってきた。午後から参加したのだが、一番人気を集めて満席だったセッションが日立ソリューションズ社の『**ロボットが頻繁に止まる、開発人材が足りない、ユーザ部門に活用されない、「RPAあるある問題」解決の秘訣を一挙公開！**』というセッションだった。とても面白いセッションだったので、学んだことを感想とともに簡単にメモしてみたので参考にしてほしい。

# RPA導入後に活用できなくて困っている人が多数いるらしい
このセッションの人気ぶりは、やはり流行りもののRPAに飛びついたものの、しっかり運用できていない企業が多いことを表しているのだろう。

RPA導入済みの企業は**85%** (従業員1,000人以上)だが、一方、導入しては見たものの期待していたほどの効果が出ない、投資対効果がわからないという企業は**40.5%**にも及ぶという。

また、全社展開まで進んでいる企業は**3%**しかないという深刻な状況のようだ。

# 全社展開されない理由
まさに、タイトルにある通り「**ロボットが頻繁に止まる、開発人材が足りない、ユーザ部門に活用されない**」の3つが代表的な理由とのこと。

このため「**重要な業務に使えない、自動化対象業務が集まらない、部門内/特定業務でしか使われない**」となる。これはうなずける。

また、良い製品の選定というところに力を使いすぎて、製品選定がゴールになってしまい、肝心の展開プロジェクトがおろそかになっている現状もあるとのこと。これも、あるある。

# 取り組み事例
基幹システムがいままで部分最適されていたのを、グループ内標準化でできた現場との溝の部分をRPAで埋めたとのこと。なるほど、こういうケースもあるのだと思った。

どの業務をRPA向けに拾い上げるかはユーザー部門にそのまま投げてもダメで、ヒアリングテンプレートをもとに作り上げていくことが重要とのこと。

製品選定は「**開発生産性・メンテナンス性**」を重視、「**ロボットの稼働監視・アクセス管理**」なども重要だという。

# 全社展開に必要な機能と製品 = Automation Anywhere
日立ソリューションズ社では製品にAutomation Anywhereを選んだということで、ここからは半分同製品の宣伝であった。社内導入・運用に不可欠な機能で比較・検討した結果であるということだった。

Automation Anywhereはスクリプト型のユーザーインターフェイスに見えるところがとっつきにくいのだが、コマンドのドラッグ＆ドロップだけで進めることができ、使ってみると開発生産性、メンテナンス視点でフローチャート型より有利になるという。

実際に作成されているロボットの平均ステップは**200ステップ以上** (200～500が多い、最多は2,950ステップ)ということで、これをフローチャート型であらわすと**開かないと中身がわからない、変更前後の差分がわからない、メンテナンスが困難になる**、とのことだった。

画面に200ステップのフローチャートが表示されていたが、これではたしかにフローチャートではよくわからない、フローチャートは20ステップくらいまでの短いステップでないと使い物にならない、と感じた。また、Automation Anywhereはスクリプト型ならではのメリット、**一覧性がある、新旧差分が一目でわかりやすい**、といったことがあるとのこと。

またサーバ型で管理性にも優れており、管理機能やメンテナンス性のない製品を選んでしまうと、必ずSI開発をする必要があり、莫大なコストがかかり、改変があるたびにコストを準備する必要あり。

また、運用についてはCOEを作って取り組む必要があるとのこと。

# 課題:「ロボットが頻繁に止まる」の解決策
Automation Anywhereのサーバ機能「Control Room」でもある程度の管理が可能だが、実行状況を元にした実行スケジュールの再調整、ロボットの空き時間への業務の配置など少し複雑な管理をしようとすると手作業による管理が発生してしまう。それは日立のソリューション「JP1/AJS3」で可視化と実行が可能だという。たしかに、画面で実行状況の可視化やスケジュール管理を見せられると、とても分かりやすく使いやすそうに感じた。イベントの翌日に[関連ソリューションの発表](https://news.mynavi.jp/article/20190927-900558/)がなされているので、詳細はサービスメニューを見てみると良さそうだ。

# 課題:「ユーザ部門に活用されない」の解決策
AIチャットボットなどとの連携でユーザー部門が使いやすくなるとのこと。たとえば、セミナー受付業務はチャットボットでユーザー部門と情報をやり取りしたうえで、判断結果をRPAで実行する (メールを申し込み者に送信)といった連携をすることで、RPAがより使いやすくなるとのことだ。

# 課題:「開発人材が足りない」の解決策
社内展開における教育、掲示板による社内情報交換、部品・サンプル、ガイドライン、ヘルプデスク、FAQなどにより軽減されるという。
Apexトリガの備忘録

よく忘れるので備忘録として残しておきたいこと

## プロセスビルダーとトリガを両方使うときの注意
主従関係になっているオブジェクトで親オブジェクトに積み上げ集計項目がある場合、親オブジェクトのトリガで子オブジェクトを更新するような処理を`trigger.after`で実装すると

1. 親の更新
2. 子オブジェクトの更新
3. 積み上げ集計でもう一度親の更新

みたいな動きをしてトリガを再帰的に呼び出してしまうことがある。
トリガ側ではガバナ制限を考慮してコーディングしていたとしても、プロセスビルダー側の条件でガバナ制限に抵触することがあるので呼び出されないようにコーディングをしておく必要がある。
一番いいのは[自動化ツールを一つにまとめること](https://help.salesforce.com/articleView?id=process_considerations_design_bestpractices.htm&type=5)だけれども、たまにどうしようもないことがあるので注意。

## triggerの中のtre-catch
たまにトリガの中でtry-catch文を書いてるのにexception発生時に何もしてない残念な感じのコードがあって、エラーになって保存できていないのに素通りしてることがある。
この状態よりはまだエラーになった方がマシだけど、どうせなら[SaveResultクラス](https://developer.salesforce.com/docs/atlas.ja-jp.220.0.apexcode.meta/apexcode/apex_methods_system_database_saveresult.htm#apex_methods_system_database_saveresult)を使ってDML操作が成功したかどうか判断してから[エラークラス](https://developer.salesforce.com/docs/atlas.ja-jp.220.0.apexcode.meta/apexcode/apex_methods_system_database_error.htm#apex_methods_system_database_error)の`getMessage()`メソッドでエラーメッセージだけaddErrorしてあげると良い感じになる。[^1]

[^1]:  https://tyoshikawa1106.hatenablog.com/entry/2014/02/23/042845
M5Stack+BLE開発環境の構築

#概要
ノートPCを買い替えたため、忘備録としてM5Stack+BLEの開発環境構築方法を残しておきます。

#M5Stack開発環境構築
[初心者向けM5Stackの始め方（ArduinoIDE編）](https://raspberrypi.mongonta.com/howto-start-m5stack-arduinoide/)
M5Stackに同梱されているマニュアルを丁寧に日本語で解説しているサイトです。
同梱されているマニュアルには、USB-UARTドライバのインストールについて触れられていないので、こちらのサイトを見て始めることをオススメします。

M5Stackで使われているUSB-UARTのICは**CP2104**というSilicon Lab社のICなので、最新版のドライバを使いたい、という方は、[Silicon LabのDriverサイト](https://jp.silabs.com/products/development-tools/software/usb-to-uart-bridge-vcp-drivers)からドライバを落としてインストールしてみてください。(自分はこちらを利用しました。)

#BLEライブラリの導入
「ESP32_BLE_Arduino」というライブラリを導入します。
1. 下記のサイトからライブラリのzipファイルをダウンロード
　　[https://github.com/nkolban/ESP32_BLE_Arduino](https://github.com/nkolban/ESP32_BLE_Arduino)
2. Arduino IDEのメニューの「スケッチ>ライブラリ>ライブラリのインクルード>.ZIP形式のライブラリをインストール」を選び、上記でダウンロードしたZIPを選択

#テスト
せっかくなので新たなデモでコンパイルしてみます。

[cc_imu_ble_midi_sample.zip](http://dwtweb.html.xdomain.jp/make/m5stack
/cc_imu_ble_midi_sample.zip)(M5Stack Gray専用)

[M5StackでBLE MIDIコントローラーを作ってみよう(1)](https://qiita.com/wdice02136/items/e929b033c4db7cc5d686)のIMU版です。横に倒すとCUTOFFを、縦に倒すとPEAKをコントロールできるデモです。
PythonでYahoo!ファイナンスから時系列データをダウンロードする方法

# 目次
株のデータ収集についての記事一覧を[こちら](https://qiita.com/fjunya/items/dbe5ef36246c88acd983)に記載しております。

#目的
- Yahoo!ファイナンスから東京証券取引所に上場している銘柄の時系列データをダウンロードする
- Pythonのライブラリのインストール手順などは省略しております
- 時系列データでは始値、高値、安値、終値、出来高、調整後終値が取得できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149245/9bb17295-863c-e621-5212-806665a17c25.png)

#事前準備
- [Yahoo!ファイナンスVIP倶楽部](https://info.finance.yahoo.co.jp/vip/pr/)に加入する。(VIP倶楽部に加入すると時系列データをcsvファイル形式でダウンロードすることが可能になります。)
- 証券コードを取得する為に、事前に[日本取引所グループ](https://www.jpx.co.jp/markets/statistics-equities/misc/01.html)から東証上場銘柄一覧をダウンロードする
- ダウンロードした東証上場銘柄一覧のコードの列のみをコピーしてファイル名をcodeList.txtとして保存する(ヘッダー行は不要)

```text:codeList.txt
1301
1305
1306
〜
9995
9996
9997
```
#実装
##Yahooにログインする
- Seleniumを使ってYahooにログインします。
- Seleniumのインストール、webdriverのダウンロードのなどの手順は省略しております。
- Seleniumのインストール手順などは[こちら](https://tanuhack.com/python/selenium/#Selenium)のサイトが参考になります。

```python
from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException

driver = webdriver.Firefox(executable_path="./geckodriver")
LOGIN_URL = "https://login.yahoo.co.jp/config/login?.src=www&.done=https://www.yahoo.co.jp"
USER_ID = "yahoo_user_id"
PASSWORD = "yahoo_password"
self.driver.get("https://www.yahoo.co.jp/")
self.driver.get(LOGIN_URL) #Yahooのログインページに遷移
self.driver.find_element_by_id("username").send_keys(USER_ID) #テキストボックスにユーザiDを入力
self.driver.find_element_by_id("btnNext").click() #次へボタンをクリック
self.driver.implicitly_wait(5) #5秒待機
self.driver.find_element_by_id("passwd").send_keys(PASSWORD) #テキストボックスにパスワードを入力
self.driver.find_element_by_id("btnSubmit").click() #ログインボタンをクリック
```
##Yahoo!ファイナンスから時系列データをダウンロード
- Yahoo!ファイナンスから東証に上場している銘柄の時系列データをダウンロードします。
- Yahoo!ファイナンス!では時系列データのダウンロードページのURLは証券コードの後に市場略称を付与するルールとなっているようです。
- Yahoo!ファイナンス!の東証の市場略称は`T`となっているので、URLの最後に`T`を付与します。
https://www.yahoo-help.jp/app/answers/detail/p/546/a_id/45387

```python
SECURITIES_CODE_LIST_PATH = "./codeList.txt" #事前準備で作成したcodeList.txt
with open(SECURITIES_CODE_LIST_PATH, "r") as code_list:
    for code in code_list:
        # 東証のデータのみをダウンロードするので証券コードの後にTを付与
        csv_url = "https://stocks.finance.yahoo.co.jp/stocks/history/?code={0}.T".format(code)
        self.driver.get(csv_url)
        self.driver.implicitly_wait(3)
        try:
            # 指定したURLが存在しない場合はfor文の先頭に戻る
            self.driver.find_element_by_class_name("selectFinTitle")
            time.sleep(1)
            continue
        except NoSuchElementException:
            pass
        try:
            self.driver.find_element_by_css_selector('a.stocksCsvBtn').click() #時系列データをダウンロード(CSV)のボタンをクリック
        except NoSuchElementException:
            pass
        time.sleep(5)
最も簡単な「一次のローパスフィルタ」を作る方法

# はじめに
先日、このようなツイートが流れてきました。
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">上司に「フィルタなんて過去N回分の入力値の平均でいいんじゃないの？」と言われたことを思い出したので、一次のローパスフィルタ(LPF)を作る方法を適当にまとめました。<br><br>４枚目はノイズを含んだサイン波をフィルタに通した結果です。 <a href="https://t.co/9VZs3JKT1z">pic.twitter.com/9VZs3JKT1z</a></p>&mdash; 水色の男@名古屋のプログラマ (@mizuiro_0718) <a href="https://twitter.com/mizuiro_0718/status/1177800886115958784?ref_src=twsrc%5Etfw">2019年9月28日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


無類の制御工学愛好家である私は、即座にRTとファボを押しました。
その後もRT、ファボは伸びていったのを見て、「以外と皆知らないんだなぁ…」と思ったりしました。と同時に、内容に少しだけ（ほんの少しだけ）難しいところがあるなと思いました。

なのでここでは、最も簡単な作成方法について紹介させて頂きます。

# 「難しいところ」はどこか、どう簡単にするか
<b>「離散化の手法として、双一次変換を利用している」</b>という点です。
双一次変換の利用は、全く間違ったことではないのですが個人的にはLPF(ローパスフィルタ)であれば双一次変換でなくてもよいと考えます。なおHPF(ハイパスフィルタ)の場合も同様です。

じゃあ何を使うべきかというと、<b>後退差分</b>です。具体的な内容は次節。

双一次変換はどこに使うべきかというと、BPF(バンドパスフィルタ)やBSF(バンドストップフィルタ)等、「周波数の管理をシビアにすべきフィルタ」に使うべきです。というか、このへんのフィルタは双一次変換を使わないとダメです。後退差分では設計通りの性能を得ることは難しいです。

# 後退差分による離散化
連続時間系の伝達関数におけるsは、後退差分による離散化では下記のように変換されます。ここでTは離散時間系のサンプリング周期です。

```math
s=\frac{1-z^{-1}}{T}
```

LPFの伝達関数はこうでした。τはLPFの時定数です。

```math
Y(s)=\frac{1}{1+\tau s}R(s)
```

余談ですが、LPFのカットオフ周波数Fと時定数τの関係は下記です。

```math
\tau = \frac{1}{2\pi F}
```

本論に戻って、伝達関数を離散化することで下記式が得られます。

```math
(T+\tau (1-z^{-1}))y[n] = Tr[n]\\
y[n] = \frac{\tau}{T+\tau}y[n-1] + \frac{T}{T+\tau}r[n] 
```

すなわち、<b>LPF出力の前回値と入力信号の今回値を合成することで、LPF出力の今回値が得られます。</b>しかも合成の比は、<b>τ(またはT)をτとTの和で除することで得られます。</b>めっちゃ簡単じゃないですか？
また上式の別の解釈として、こうも書けます。

```math
y[n] = ay[n-1]+(1-a)r[n]\\
where \quad a=\frac{\tau}{T+\tau}
```

aを使う場合とそうでない場合、好きなほうで式を覚えて頂ければと思います。
Terraform Cloud、個人で使ってもめちゃくちゃ便利

# はじめに

9月の上旬に[Terraform Cloudの完全版リリース発表](https://www.hashicorp.com/blog/announcing-terraform-cloud)がありました。

これまではEnterprise版でしか利用できなかったようなチーム開発に便利な機能の一部が
最大5ユーザーまで無料で使えるようになったものです。
参考： [価格/機能一覧表](https://www.hashicorp.com/products/terraform/pricing)

複数人での開発における利便性向上が主なアピールポイントのようですが
1人で学習用などにTerraformを使う上でも嬉しいことがあったので
もっと広まればいいなーと思い紹介します。
→ https://app.terraform.io/

# 1.  Backendの提供

従来は自分で用意しなくてはいけなかったtfstateファイルの置き場を
無料・無制限で提供してくれます。

```hcl:backendブロックの書式はこうなります
terraform {
  backend "remote" {
    hostname     = "app.terraform.io" //Terraform Cloudのホスト上に保存
    organization = "<Your Organization Name>"
    workspaces {
      name = "my-sample-app"
    }
  }
}
```
デフォルトで「tfstateのバージョン管理機能 & ロック機能付き」のBackendが無料！！

特にこれまでバージョン管理有効にしたS3+ロック用のDynamoDB を作ってた方は
嬉しいんじゃないでしょうか。。
（個人利用だとDynamoDBまで用意する方は少なそうですが）

地味に、Backendアクセスのためだけの認証情報を持たせなくてよくなるのも楽でした。
Terraform Cloudの認証情報はコードに持たせない作りになっています。

# 2. Remote Runs & Applies
`terraform (plan|apply|destroy)`のコマンドが
ローカル端末ではなくTerraform Cloudのサーバーで走るようになります。
サーバー上には実行ログが残ります。

Workspace(tfstateファイル1つが対応) `my-sample-app` の実行履歴一覧
![スクリーンショット 2019-09-28 21.21.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174283/fb30cc3a-6bdc-7e9f-3e12-66f52a3613a5.png)

開くとそれぞれ実行時のログが見える
![スクリーンショット 2019-09-28 21.13.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174283/6805dc03-755d-6cae-40b8-4c2538017c42.png)

これまではローカルのターミナル上で
儚く埋もれ散りゆくのみだった実行結果が、いつでも確認できます…

各tfstateごとに最新の実行結果が確認できるので、
リソースのお片付け(削除)漏れがわかりやすくなるのも助かります。
destroy失敗したまま忘れちゃって、忘れちゃったことすら忘れちゃってリソース残しっぱ…とかが防げるかも。
忘れちゃったことくらいは思い出せる。


# 3. Private Module Registry

効率いいやり方はあるかもですが、
例えばちょっとAWSで検証したいなーってときに
本質じゃないNW構成を毎回記述するのが結構めんどくさいです。。
![AWS.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174283/15bec70c-d453-6e83-2a91-ac5321713b57.png)

私のAWSアカウント内には既存のゴミVPCがたくさん散らばってますが（…）、
構成もわかったもんじゃないし等々、そちらも使いたくない。

そんなとき、Private Module Registryという
TerraformのModuleをTerraform Cloud上に保管してくれる機能が役立ちます。

- モジュールのソースをGitHub等のVCSにリポジトリを作って配置
- リポジトリにバージョンタグ(`vN.N.N` の形)を付ける
- Terraform CloudとVCSを連携させて、ちょちょっと設定

以降は通常のTerraformのModuleと同じように使えます。
私の場合は今後、上図のNW設定を以下の4行で作成できるようになりました。
(Cidr等はdefault値を設定して、変更したいときだけ記述する形にしています)

```hcl:sample
module "basic-networks" {
  source  = "app.terraform.io/<Your Organization Name>/basic-networks/aws"
  version = "0.2.0" # タグで指定したバージョン
}
```

従来の自作Moduleを毎回新規のリポジトリの中に持ってきて管理すると手間なことが多かったですが
そのへんがスッキリして楽になりました。
（もっと良いやり方もあったのかな…）

きれいなものでもないですが上記のNW構成をモジュール化したソースは
サンプルとして[こちら](https://github.com/pypypyo14/terraform-aws-basic-networks)に置いています。


# まとめ
いろんなめんどくさいことが解消されるし無料なので
チーム開発じゃなくても試しに使ってみたら良いと思います！
わかりませんが、個人でこれ使ってたら仕事で従来のOSS版使うのが辛くなってしまう感じはあるけどそのへんどうなんだろう。特にRemote Runのログ。
CentOS 6にPHP-FPM 7.0をインストール（SCL）

# はじめに

Software Collection(SCL)を利用してCentOS6にPHP-FPM7.0をインストール
親記事：[PHP, PHP-FPMの各種インストール方法とEOLまとめ](https://qiita.com/witchcraze/items/dfe3823554b7caba6f6a)
参考：[Quick Start — Software Collections] (https://www.softwarecollections.org/en/docs/)　　　

## サポート

本手法で導入した場合、[Red Hat Software Collections Product Life Cycle - Red Hat Customer Portal](https://access.redhat.com/support/policy/updates/rhscl)より、2019-11がEOLだと思われる。
それ以降に報告された脆弱性や不具合への対応は実施されない可能性がある。

## LOG

### インストール

```shell-session
# cat /etc/redhat-release
CentOS release 6.10 (Final)

# yum install -y centos-release-scl;yum install -y rh-php70-php-fpm;scl enable rh-php70 bash
... 略
```

### php-fpm起動/停止

```shell-session
# service rh-php70-php-fpm start
Starting php-fpm:                                          [  OK  ]

# service rh-php70-php-fpm status
php-fpm (pid  146) is running...
```

```shell-session
# service rh-php70-php-fpm stop
Stopping php-fpm:                                          [  OK  ]

# service rh-php70-php-fpm status
php-fpm is stopped
```

### php-fpm自動起動設定/設定解除

```shell-session
# chkconfig rh-php70-php-fpm on
# chkconfig --list rh-php70-php-fpm
rh-php70-php-fpm        0:off   1:off   2:on    3:on    4:on    5:on    6:off
```

```shell-session
# chkconfig rh-php70-php-fpm off
# chkconfig --list rh-php70-php-fpm
rh-php70-php-fpm        0:off   1:off   2:off   3:off   4:off   5:off   6:off
```

### 各種確認

```shell-session
# which php
/usr/bin/which: no php in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin)

# which php-fpm
/opt/rh/rh-php70/root/usr/sbin/php-fpm

# php-fpm -v
PHP 7.0.27 (fpm-fcgi) (built: Apr  4 2018 13:50:47)
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2017 Zend Technologies

# yum info rh-php70-php-fpm
Loaded plugins: fastestmirror, ovl
Loading mirror speeds from cached hostfile
 * base: ftp.iij.ad.jp
 * centos-sclo-rh: ftp.iij.ad.jp
 * centos-sclo-sclo: ftp.iij.ad.jp
 * extras: ftp.iij.ad.jp
 * updates: ftp.iij.ad.jp
Installed Packages
Name        : rh-php70-php-fpm
Arch        : x86_64
Version     : 7.0.27
Release     : 1.el6
Size        : 3.9 M
Repo        : installed
From repo   : centos-sclo-rh
Summary     : PHP FastCGI Process Manager
URL         : http://www.php.net/
License     : PHP and Zend and BSD
Description : PHP-FPM (FastCGI Process Manager) is an alternative PHP FastCGI
            : implementation with some additional features useful for sites of
            : any size, especially busier sites.
```
Slimでリンクを作りbootstrapを当てるとき

すぐ忘れるのでメモ。
link_toはキーワード引数使ってないからこの順番に引数を渡さないとエラーになるみたい。
ぐぐらないと順番わからない。

元のソース読んでも引数の名前だけでわからない。
中身読んでも難しい。

```ruby

= link_to '一覧', blogs_index_path, class: 'btn btn-primary'
```


参考サイト
[Slimでlink\_toにHTMLタグを含む文字列にリンクを貼る \- Qiita](https://qiita.com/kiyodori/items/7523538d96339d2ffb8f)
swift5 ライブラリー導入の仕方

# はじめに
今回はCocoaPodsでライブラリーを自分のプロジェクトに入れるやり方をご紹介します。
※CocoaPodsの**インストールの仕方ご紹介しません**。
## 開発環境
Xocde10.2
swift5
## 手順
1. Podファイルをディレクトリに生成する
2. 生成したファイルを編集する
3. 保存してXcodeを立ち上げる

## 実際に作業する
### ディレクトリの階層まで行く
まずターミナルでライブラリーを入れたいプログラムのディレクトリの階層まで行きます。
### Podファイル生成
階層まで到達したら、コマンドに以下を記述します。

```terminal:ターミナル
pod init
```
### Podファイル編集
Podファイルが生成されたら今度編集して入れたいライブラリーのパスを入力します。
Podを生成した階層で以下を打ちます。

```terminal:ターミナル
vi Podfile
```
するとPodFireの中身が見れます。
入力できるようにキーボードの「**i**」を打ちます。

```terminal:Podfile
# Uncomment the next line to define a global platform for your project
# platform :ios, '9.0'

target '自分のプロジェクト名' do
  # Comment the next line if you don't want to use dynamic frameworks
  use_frameworks!

  # Pods for 自分のプロジェクト名
  pod '自分の入れたいPod名'
end
```

入力したら書き込んだ内容を保存する必要があるので、キーボードの「**esc**」を打ち、続けてキーボードの「**w**」とキーボードの「**q**」を打ち、キーボードの「**Enter**」を押します。

### 書き込んだ内容をファイルに反映させる

初めてライブラリーを入れる時は以下を打ちます。

```terminal:ターミナル
pod install
```
ライブラリーを入れるのが2回目以降の場合は以下を打ちます。

```terminal:ターミナル
pod update
```

ちなみにPodfileに書き込んだライブラリーを消す時はPodFileから入力したライブラリーを消して「**pod update**」をコマンドで打てば更新されて消えます。

### Xcodeを立ち上げる
まず、今回PodFileを生成した自分のディレクトリに行きます。(Finderで見てください)
今までは拡張子が「**.xcodeproj**」以下①画像の物をタップして立ち上げてたと思いますが、
ライブラリーを入れた後にこのファイルで立ち上げるとエラーが出てしまいます。
①<img width="70" alt="スクリーンショット 2019-09-28 22.04.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397376/3723474d-4233-d27c-7736-079a1e3252a3.png">

ライブラリーを入れたら、拡張子が「**.xcworkspace**」以下②画像の物が出てくると思うのでそれをタップして実際に使いたいクラスに「**import**」して使ってください

②<img width="68" alt="スクリーンショット 2019-09-28 22.05.27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397376/be033020-d9a7-50e2-3eba-0a76f56d428a.png">

#終わりに
ライブラリーはすごく便利なものがたくさんあります。
ローカルのDBを生成してくれる物や仮想通貨のやりとりをできるようにする物などなど、かっこいいUIや素晴らしい機能インターフェースが簡単に実装できてしまいます。初心者の頃からライブラリばかりに頼るとカスタマイズでの実装をするときに技術不足で大変な思いをしてしまうので、ライブラリーに頼るのも程々にした方がいいなと思いました。
ライブラリーを作ってくれた方々全てに感謝です。:grin:
Windows10・Git bash環境にてdirenvを導入する

教本「macOSにてdirenvを導入する場合は`brew install direnv`です。かんたんでしょ＾＾」
ワイ「WinOSではどうするんですかねえ（素人並感）」

日本語情報が全然出てこなくて手間取ったので、記録を残します。
直接参考にしたのは↓です。
[How to run on windows?](https://github.com/direnv/direnv/issues/343)

## 前提
direnvとはなんぞやとか、使い方はどうぞやとかは触れません。↓なんかがわかりやすいんじゃないかと思います。
[いまさら direnv の解説](https://qiita.com/ngyuki/items/fda1bbf29384bef7a805)

Git bashを使います。↓の記事等を参考にGit for Windowsを導入しましょう。
[いまさらGit for Windowsのインストール、GitHubに接続してみた。](https://qiita.com/manabu-watanabe/items/ecf1b434baf305adaa00)
（コマンドプロンプト/Powershellでは「.bashrcで`direnv hook bash`」をどうすればいいかわからず、おとなしくbashを使うことにしました。スマートなやり方をご存知でしたら、何卒コメントでご教示ください。）

また、CUI操作わけわからん人向けにGUIゴリ押しで進めていきます。


## 手順
1. https://github.com/direnv/direnv/releases から「direnv.windows-amd64.exe」をダウンロードしてくる。
2. 適当な場所に配置する。今回は「C:\Program Files/Git\usr\local\bin」を作って置いた。
3. その場所にパスを通す。  
  1. コントロールパネル → システムとセキュリティ → システム → システムの詳細設定 → 環境変数  
  2. [ユーザー名]のユーザー環境変数 から Path を選択して編集ボタンを押す  
  3. 新規ボタンを押して2のパスを貼り付け、OK
4. Git bashのホームディレクトリ（Git bashにて`echo ~`で確認）に「.bashrc」ファイルを作成し、以下の通り記述して保存する。  
  alias direnv="/usr/local/bin/direnv.windows-amd64.exe"  
  eval "$(direnv hook bash)"
5. Git bashを再起動する。


## 確認
1. 適当なフォルダに「.envrc」ファイルを作成し、「export TEST_ENV=test」と記述して保存する。  
2. Git bashでそのフォルダにcdし、`echo $TEST_ENV`を実行→「test」と出力される。
3. 別のフォルダにcdし、再度`echo $TEST_ENV`を実行→何も出力されない。

上記の通り動作すれば導入完了です。タブンネ。
CentOS 6にPHP-FPM 7.3をインストール（Remi's RPM repository）

# はじめに

Remi's RPM repositoryを利用してCentOS6にPHP-FPM7.3をインストール
親記事：[PHP, PHP-FPMの各種インストール方法とEOLまとめ](https://qiita.com/witchcraze/items/dfe3823554b7caba6f6a)
参考：[Remi's RPM repository](https://rpms.remirepo.net/wizard/)

## サポート

本手法で導入した場合、[PHP: Supported Versions](https://www.php.net/supported-versions.php)/[PHP: Unsupported Branches](https://www.php.net/eol.php)より、2021-12-06がEOLになると思われる。
それ以降に報告された脆弱性や不具合への対応は実施されない可能性がある。

## note

- インストール後の更新は `yum --enablerepo=remi-php73 update`

# LOG

### インストール

```shell-session
# cat /etc/redhat-release
CentOS release 6.10 (Final)

# yum install -y https://rpms.remirepo.net/enterprise/remi-release-6.rpm
... 略

# yum install -y --enablerepo=remi-php73 php-fpm
... 略
```

### php-fpm起動/停止

```shell-session
# service php-fpm start
Starting php-fpm:                                          [  OK  ]

# service php-fpm status
php-fpm (pid  175) is running...
```

```shell-session
# service php-fpm stop
Stopping php-fpm:                                          [  OK  ]

# service php-fpm status
php-fpm is stopped
```

### php-fpm自動起動設定/設定解除

```shell-session
# chkconfig php-fpm on
# chkconfig --list php-fpm
php-fpm         0:off   1:off   2:on    3:on    4:on    5:on    6:off
```

```shell-session
# chkconfig php-fpm off
# chkconfig --list php-fpm
php-fpm         0:off   1:off   2:off   3:off   4:off   5:off   6:off
```

### 各種確認

```shell-session
# which php
which: no php in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin)

# which php-fpm
/usr/sbin/php-fpm

# php-fpm -v
PHP 7.3.10 (fpm-fcgi) (built: Sep 24 2019 12:36:48)
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.10, Copyright (c) 1998-2018 Zend Technologies

# yum info php-fpm
Loaded plugins: fastestmirror, ovl
Loading mirror speeds from cached hostfile
 * base: ftp.riken.jp
 * epel: nrt.edge.kernel.org
 * extras: ftp.riken.jp
 * remi-safe: ftp.riken.jp
 * updates: ftp.riken.jp
Installed Packages
Name        : php-fpm
Arch        : x86_64
Version     : 7.3.10
Release     : 1.el6.remi
Size        : 4.2 M
Repo        : installed
From repo   : remi-php73
Summary     : PHP FastCGI Process Manager
URL         : http://www.php.net/
License     : PHP and Zend and BSD and MIT and ASL 1.0 and NCSA
Description : PHP-FPM (FastCGI Process Manager) is an alternative PHP FastCGI
            : implementation with some additional features useful for sites of
            : any size, especially busier sites.
```
n個のファイルをjoinコマンドで連結する (動的にパイプを構築するには)

再帰を使うとevalを使わずにすむ。
分析結果を表にまとめるときに~~稀に~~たまに使う。

```bash
multi_join() {
  case $#
  in 0) cat -
  ;; 1) join - "$1"
  ;; *)
    if [ ! -p /dev/stdin ]; then
      join "$1" "$2" | { shift 2; multi_join "$@"; }
    else
      join - "$1" | { shift; multi_join "$@"; }
    fi
  esac
}
```

```
$ cat file1
1 a
2 b
3 c
$ cat file2
1 100cm
2 200cm
3 300cm
$ cat file3
1 1kg
2 2kg
3 3kb
$ multi_join file1 file2 file3
1 a 100cm 1kg
2 b 200cm 2kg
3 c 300cm 3kb
```
cut & paste でもなんとかなる気もしている。
なぜUITableViewControllerを使うなと言われるのか

なぜ**「[UITableViewController](https://developer.apple.com/documentation/uikit/uitableviewcontroller)を使わずにUIViewControllerにUITableViewを乗せましょう」**言われるのか。

理由はいくつか考えられます。

1. レイアウト変更に弱い
2. 自動処理がカスタマイズの邪魔になる場合がある

これらを説明していきます。

# 1. レイアウト変更に弱い

今では[UICollectionLayoutListConfiguration](https://developer.apple.com/documentation/uikit/uicollectionlayoutlistconfiguration)など最新のAPIが存在して、「UICollectionViewで動的なレイアウトを組んでいきましょう」という流れがありますが、以前は表現したいものに応じてTableView or CollectionViewの使い分けでした。

その際に、最初はTableViewを使って画面を組んでいたとしても、アプリのアップデートに応じて「テーブルの上にグラフを表示したい」などのレイアウト要件が発生するかもしれません。

そのような時に[UITableViewController](https://developer.apple.com/documentation/uikit/uitableviewcontroller)では対応が難しいです。なぜなら、ViewControllerの上にTableViewが張り付いていて、Storyboardの上からプログラマがtableViewの制約を変更したり新しいUI要素を付け加える事ができないからです。(Containerパターンを利用すれば一応対応は可能ですが、少し複雑になってしまいます)

このように、実際のプロジェクトで「後々レイアウトの対応が大変になる」という経験をしたプログラマの人たちは、**「[UITableViewController](https://developer.apple.com/documentation/uikit/uitableviewcontroller)を使うな」**と言います。

# 2. 自動処理がカスタマイズの邪魔になる場合がある
[UITableViewController](https://developer.apple.com/documentation/uikit/uitableviewcontroller)は、UIViewControllerのサブクラスであり、自身にUITableViewDataSourceとUITableViewDelegateを適応させています。

そして、その恩恵として以下のような自動処理が適応されています。

- キーボード上げ下げ時のcontentInset調整を自動対応
- ViewControllerのsetEditingを自動でTableViewに伝搬
- UITableViewCellの「swipe to delete」modeをViewControllerに伝搬
- viewWillAppear()で自動でデータをリロード、セレクションのクリア
- viewDidAppear()で自動でUIScrollViewのindicatorをflash

などなど。

基本的なPros/Consとしては以下になると思います。

## Pros
「あまりTableにカスタマイズを多く施さない場合は自動化の恩恵を十分に受けられ、Appleのチームによって良く考えられた工夫をタダで得られてお得」

## Cons
「UITableViewをかなりカスタマイズして独自の処理を頑張りたい時には、自動で処理を伝搬されるのが、むしろ邪魔になる」

このようにPros/Consが裏表の関係になっていますが、「作り始めは良かったけど、カスマイズの要件が膨らんでいくごとに自動処理へのoverride対応が大変になってしまい、むしろUITableView with UIViewControllerで作るよりコード量が増えてしまった」のような経験をしたプログラマの人たちは**「[UITableViewController](https://developer.apple.com/documentation/uikit/uitableviewcontroller)を使うな」**と言います。


# まとめ
以上のように、非常に便利な反面、要件への柔軟な対応という観点では幾らか問題もあり、変化し続けるビジネスの要求により耐えやすい「UITableView with UIViewController」の構成が好まれるようになった。という話でした。

みなさんはどのような状況で「UITableViewControllerを使ってはダメだ」と思われたでしょうか？よければコメントで教えてください。
VScodeをかっこよくした話　peacock編

# はじめに

こんにちは
私は主としてインフラエンジニアをしていますが
アプリケーションコードとインフラコードの両方を管理しています

以下のようなディレクトリ構成になっています

### アプリケーションコード　

- ”Optimind-App-A”
- ”Optimind-App-B1”
- ”Optimind-App-B2”

### インフラコード

- ”Infra-Optimind-App-A”
- ”Infra-Optimind-App-B1”
- ”Infra-Optimind-App-B1”

特にインフラコードはよく似ているので変更を加えるインフラコードを間違えがちでした

# peacockとの出会い

いつものようにtwitterを見ているとこんなつぶやきが、、、！！！
> Visual Studio Codeを複数開いて利用する時に便利な、ワークスペースの色を変えられる拡張機能「Peacock」が、30万ダウンロードを突破する人気ぶり❗️#VSCode #エディタ


https://twitter.com/ayatokura/status/1177655260212387840

これは導入するしかない！

# 導入編

最初はこんな感じ
**自分がどのディレクトリを編集しているか直感的には分かりにくかったVScodeですが**
<img width="1530" alt="スクリーンショット 2019-09-28 21.28.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429104/8368d156-53cf-4cbe-f4ee-2a78ff295996.png">

**匠の技によって**
![なんということでしょう.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429104/a3c10062-9e1f-0999-5963-da8fec59794a.jpeg)

**なんということでしょうか**

**こんなにも分かりやすいVScodeになりました**

<img width="1566" alt="スクリーンショット 2019-09-28 21.19.30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429104/20598942-06d3-4285-8409-b4fcfcde018a.png">


# 導入方法


1. vscodeを開く
2. Shift+Command+Xで拡張を開く
3. peacockと検索しinstallする
4. F1を押し、コマンドパレートを開く
5. "peacock"と検索
6. "Peacock: Change to a favorite color"を選択
7. 好きな色を選ぶ

ディレクトリに
.vscode/setting.json
が存在していてその中に変更が記載されるのでvscodeを閉じても変更は保存されたままになります

# 最後に

最後まで読んでいただきありがとうございます
[Rails]デバックツール、byebugの使用方法について

#はじめに
今回、Railsで使用できる`Gem byebug`を使用したデバック方法があまり使用してなく、理解出来てなかったのでその使用方法などについて説明します。
##導入方法
Gemfileに以下の記述があれば導入不要です。

```ruby:Gemfile
group :development, :test do
  # Call 'byebug' anywhere in the code to stop execution and get a debugger console
  gem 'byebug', platforms: [:mri, :mingw, :x64_mingw]
end
```
導入されてない場合は`byebug`を`bundle install`して下さい。

##使用方法
確認したい所にbyebugの記述をします。

```ruby:videos_controller.rb
class VideosController < ApplicationController

  before_action :move_to_index, except: [:index, :show]

  def index
    byebug ←アクション内に記述
    @videos = Video.order("created_at DESC").page(params[:page]).per(5)
  end
```
次に`Rails s`でサーバーを立ち上げ該当のページへ移動します。するとbyebugが立ち上がり、コマンドを入力出来るようになります。

```ruby:ターミナル
[2, 11] in /Users/samplename/projects/simonapp/app/controllers/videos_controller.rb
    2: 
    3:   before_action :move_to_index, except: [:index, :show]
    4: 
    5:   def index
    6:     byebug
=>  7:     @videos = Video.order("created_at DESC").page(params[:page]).per(5)
    8:   end
    9: 
   10:   def new
   11:     @video = Video.new
(byebug) 
```

後はちゃんとデータが取れているか、入力して確認します。
今回は`Video.order("created_at DESC")`でちゃんと中身が取得出来ているか確認しています。

####成功した場合

<img width="895" alt="スクリーンショット 2019-09-28 21.34.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435517/f8f5427e-a08f-2209-1803-61912e1c026d.png">

####失敗した場合

<img width="895" alt="スクリーンショット 2019-09-28 21.38.27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435517/36c8cdb2-3bd5-5ac5-8f18-f651e75ca0a3.png">

少し見難いですが、このように`byebug`を使用する事で値が取得出来てるか、など確認する事が出来ます。
コマンドのヘルプ表示は`h`終了は`q!`で出来ます。

#最後に
デバッグツールを使用してのアプリ作成はあまり慣れてなかったので、今後さらに理解を深めて使いこなせるようになりたいと思います。
簡単な説明しかしてませんので、以下の記事も参考にして下さい。
####参考資料
https://qiita.com/jnchito/items/5aaf323ab4f24b526a61#byebug%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%9F%E3%83%87%E3%83%90%E3%83%83%E3%82%B0%E3%81%AE%E3%83%87%E3%83%A2
https://qiita.com/nishina555/items/e5886339d381db61b412
scpで対象フォルダ内の全てのファイルをアップロードするttl

```ttl:scp_MultiFile_UL.ttl
; *****************************************************
; scpで転送元フォルダ内の複数ファイルをアップロードする
; ※注意点
;   事前に file_UL フォルダ内に
;   アップロード対象ファイルのみ格納しておく
; *****************************************************
souceFolder = 'C:\Users\test\Desktop\file_UL'       ; 転送元フォルダ
destFolder = '/tmp/'                                ; 転送先ディレクトリ

; マクロを実行してるフォルダから、転送元フォルダへ変更する
setdir souceFolder

extpat = '*.*'                                      ; 検索対象ファイル名
; 転送元フォルダ内のファイル名を取得
findfirst dh extpat filename

While result
	; .(ピリオド)と..フォルダを除外させる
	getfileattr filename
	If result and not $10 then
		If result and not $11 then
			; 転送元ファイルのフルパスを取得
			makepath fName_fullPath souceFolder filename
			scpsend fName_fullPath destFolder   ; scpでアップロード
			pause 1
		EndIf
	EndIf
	findnext dh filename
EndWhile
findclose dh
塾の講師のお手伝いをしました(A/Bクラス振り分け)

#点数によって合否の振り分けを行う
今日知人の塾講より、生徒の点数によってA,Bクラス自動で分けるアプリない?と言われました。
生憎そんなアプリは知りませんが、pythonでできんじゃないかなーと思って、作ってみました。

##仕分けのルール
1.国語・数学・理科・社会・英語の５教科
2.理系の子は、数学・理科・英語の３教科で240点取ればAクラス。足りなければBクラス。
3.文系の子は、国語・社会・英語の３教科で240点取ればAクラス。足りなければBクラス。
4.文系・理系共に、５教科で380点取らなければ、Bクラス。

補足：
・学生IDが1から順につけられている。
・学力差で授業を行っているので、人数に偏りがあっても良い。
・「文/理(l/s)　国語　数学　理科　社会　英語」の順で打ち込んでもらう

##コード例
```py
count = int(input())
a = []
ID = 0

list = [input() for i in range(count)]
for i in list:
    ID += 1
    x = i.split()
    total = int(x[1]) + int(x[2]) + int(x[3]) + int(x[4]) + int(x[5])
    if x[0] == "l":
        score = int(x[1]) + int(x[4]) + int(x[5])
    if x[0] == "s":
        score = int(x[2]) + int(x[3]) + int(x[5])
    if score >= 240 and total >= 380 :
        a.append(ID)

print (len(a))
```

##解釈
幸い学生IDが1から順にあるとの事で、変数`count`には生徒の人数を入れてもらいます。
`a`のリストには、Aクラスの条件を満たした学生IDが入るようになっています。

##最後に
もっと簡略的に書けないのかなーなんて思っていますが浮かびません。。。
ご一読頂いた方でお力添えをいただけると嬉しいです。
2019-09-28 LPC > LPCXpresso54628 > IDE > setupと実行

```txt:動作環境
OS: Ubuntu 18.04 LTS
基板: LPCXpresso54628
IDE: MCUXpresso IDE v11.0.1 [Build 2563] [2019-09-01]
```

### IDE

- [MCUXpresso Integrated Development Environment (IDE)](https://www.nxp.com/design/software/development-software/mcuxpresso-software-and-tools/mcuxpresso-integrated-development-environment-ide:MCUXpresso-IDE?tab=Design_Tools_Tab#nogo)から入手する
    - アカウント登録が必要

Linux用にはdeb.binファイルが取得できる。
deb.binファイルはshコマンドで実行し、インストールが完了する。

### 実行

資料: MCUXpresso IDE - User Guide REV 11.0.1
4.3 Running the MCUXpresso IDE
4.3.2 From bash

ideのパスを通す。入手したバージョンでは

```
export PATH="/usr/local/mcuxpressoide-11.0.1_2563/ide/:$PATH:"
```

実行は以下となる。

```
SWT_GTK=3 UBUNTU_MENUPROXY=0 mcuxpressoide &
```
ROS2のインストール･環境設定･動作確認

![ros2-logo-e1587785895950-890x500.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484973/14b62e61-7514-f557-0daf-41c6338bfe60.png)

# ROS1の無効化
ROS1セットアップ済み環境下でROS2のセットアップを行うとエラーの原因になりますので，まずROS1を無効化します．
~/.bashrcを開き，以下をコメントアウトすれば無効化完了です．

```
# source /opt/ros/melodic/setup.bash
# source ~/catkin_ws/devel/setup.bash
# source `catkin locate --shell-verbs`
```

# ROS2のインストール
```
// ロケールのセットアップ
$ sudo locale-gen ja_JP ja_JP.UTF-8
$ sudo update-locale LC_ALL=ja_JP.UTF-8 LANG=ja_JP.UTF-8
$ export LANG=ja_JP.UTF-8

// ATPソースリストの設定
$ sudo apt update
$ sudo apt install curl gnupg2 lsb-release
$ curl http://repo.ros2.org/repos.key | sudo apt-key add -
$ sudo sh -c 'echo "deb [arch=amd64,arm64] http://packages.ros.org/ros2/ubuntu `lsb_release -cs` main" > /etc/apt/sources.list.d/ros2-latest.list'
$ sudo apt update

// ROS2パッケージの一括インストール
$ sudo apt install ros-dashing-desktop python3-colcon-common-extensions python3-rospkg python3-catkin-pkg python3-rosdep python3-argcomplete
$ sudo rosdep init
$ rosdep update
```

#環境設定
~/.bashrcに以下を追記．

```
source /opt/ros/dashing/setup.bash
```

# デモプログラムによる動作確認
ターミナルを2つ立ち上げ，以下のコマンドを打てば，talkerノードのPublishしたTopicをlistenerノードがSubscribeして表示する動作が確認できます．

```
// ターミナル1
$ ros2 run demo_nodes_cpp talker

//ターミナル2
$ ros2 run demo_nodes_cpp listener
```

# 追記
ワークスペースを作成し，ビルドした際には，以下を~/.bashrcに追記しましょう．

```
. ~/(ワークスペース名)/install/setup.bash
```
EC2のLaravel6.0環境にデバッグバーを入れる　AWS/Laravel連載(7)

# はじめに

前回の記事で、Laravel6.0にauthを入れて日本語化しました。
[EC2のLaravel6.0環境に入れたauth(認証機能)を日本語化する　AWS/Laravel連載(6)](https://qiita.com/rf_p/items/f07a3ef1dbaa6f3813ab)

本格的に開発を進めていく前に、デバッグ用のデバッグバーを導入しましょう。

導入イメージ
画面下部に、どんなSQLが流れているのかであったり、変数やリクエストパラメータの中身を確認できます。
<img width="1440" alt="debug.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199678/6b5a091d-bc4b-7740-bb2f-ca370a793f76.png">

# 導入方法

非常にシンプル。
composerでLaravel-debugbarを導入します。

https://github.com/barryvdh/laravel-debugbar

```powershell
$ composer require barryvdh/laravel-debugbar --dev
```

もしメモリが足りず入れれない場合は、t2.smallぐらいに変更してみましょう。

# 完成図

あとはページにアクセスするだけで、下部にデバッグバーが出てきます。
<img width="1440" alt="debug.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199678/6b5a091d-bc4b-7740-bb2f-ca370a793f76.png">

オン／オフ切り替えは、.envのAPP_DEBUGで設定できます。

```config:.env
...
APP_DEBUG=false
...
```

上記記載で非表示になりますし、逆に下記記載で表示されます。

```config:.env
...
APP_DEBUG=true
...
```

今回は短いですが以上です。
【Vue-CLI】body margin 8px を解決する

## はじめに
　最近Vue-cliを触り始めて、以下の赤矢印で示すような余白ができてしまうことがあった。
![図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431401/2c2584c2-177d-792b-d712-03c9e7ab4eaa.png)

　chromeの検証から見るとbody要素に強制的に```margin 8px```が入っている。そして、.vueファイル側で以下のように指定しても解決しない。

```css
<style scoped>
...
body {
  margin: 0;
}
...
</style>
```

## 原因
　chromeだとbody要素に強制的に```margin 8px```が入ってしまうことが原因。その他の要素でもmarginを入れているらしい。ちなみに開発ツールからも触ることができない。.vue側で効かないところまでは不明（ブラウザ側のvueの扱いだと思うのだが）。

## 解決方法
　解決方法としてはいくつかあると思うが、今回はindex.html側にcssを記載することで解決する方法を紹介する。

```html:index.html
...
<style>
body {
    margin: 0px;
}
</style>
```

　chrome側でその他要素やpaddingも自動で設定しているらしいので、以下のように一旦すべてリセットした方が自分の思った通りのcssになりやすいとか。

```html:index.html
...
<style>
* {
    margin: 0px;
    padding: 0px;
}
</style>
```

## おわりに
[こちら](http://shiru-web.com/2017/06/26/01-62/)を参考。
作業効率を上げるための、ポモドーロ・スクラムタイムマネジメント

最近、フルリモートで仕事をしている。

リモートで仕事をすると、オフィスで仕事をするときよりも自己管理の必要が増す。誰かの目が無いと、すぐにダレてしまうためだ。

気分が乗らないときでも、体調が悪いときでも、可能なら最低限のパフォーマンスを安定して出し続けられるに越したことはない。

そのために、ポモドーロテクニックと、スクラムの考え方を応用したタイムマネジメント術を実践した。今回は、その振り返りを書く。

## 目指す状態
自分一人でも怠けずにコツコツやるべきことをやれるようにしたい。

## 実践したこと
ポモドーロテクニックとスクラムのスプリントレトロスペクティブを組み合わせたようなことをやった。

まず、作業30分、休憩10分を１セットとし、これを繰り返した。

作業の内容によっては作業時間を変更し、プログラム設計やバグ調査など、じっくり向き合うことが必要な作業では作業を40分、資格の勉強など、覚えることが中心の作業では作業を25分にした。しかし、**休憩は10分にする。ここは変えない**。

休憩ではひたすら寝る。外部の情報を遮断することに集中する。

休憩後は、まず休憩前までの作業を思い出すことに集中する。作業に入る前に軽い運動をして脳に刺激を与え、活性状態にする。

休憩前までの作業を1分でふりかえる。文章を書いていたなら、「文章の目的は何か。自分が一番伝えたいことは何か」を再考する。デバッグ作業であれば、「目指すべき状態は何か。そこに辿り着くまでのやり方は合っていたか」を再考する。ふりかえりの時間が1分というのがポイント。**できるだけ時間を掛けずに改善策を出す**。

## 実施した結果
休憩時間後の作業で、突然良いアイデアが生まれた。休憩時間中に、脳がこれまでの作業内容を整理し、理解が促進されたのかもしれない。デバック作業のときは、バグの場所をあっさり見つけられた。文章を書く作業なら、伝えたいことに沿った言い回しが思いつきやすくなった。

また、日中は安定してパフォーマンスを維持することができた。**今まで夕方にはメールの返信が遅くなったりしたのが即レス出来るようになった**ので、朝の反応速度を夕方も維持できるようになったのが良かった。休憩を挟んだことが良かったのかもしれない。生活の中にリズムが生まれた。

## まとめ
自分１人という状況のなかで、継続的に状況を改善するための方法としてベターなやり方だと思っている。

特に、**休憩後の１分ふりかえり**。これが、自分にとってはとてもしっくりくる。「なんのためにやっているのか。改善点はどこか」を探す作業は、やっていて楽しい。**自分が成長している実感を得ることができる**。いままで、仲間に依存していたことが改善でき、パフォーマンスの安定化につながった。

1分ふりかえりは自分にとって良いやり方だと思う。

寝るときは、ノイズキャンセリングヘッドホンを付けても良いかもしれない。外部情報がより遮断できる。

## 参考情報
- https://www.amazon.co.jp/%E6%9C%80%E7%9F%AD%E3%81%AE%E6%99%82%E9%96%93%E3%81%A7%E6%9C%80%E5%A4%A7%E3%81%AE%E6%88%90%E6%9E%9C%E3%82%92%E6%89%8B%E3%81%AB%E5%85%A5%E3%82%8C%E3%82%8B-%E8%B6%85%E5%8A%B9%E7%8E%87%E5%8B%89%E5%BC%B7%E6%B3%95-%E3%83%A1%E3%83%B3%E3%82%BF%E3%83%AA%E3%82%B9%E3%83%88DaiGo/dp/4054066895
- https://www.amazon.co.jp/SCRUM-BOOT-CAMP-BOOK-%E8%A5%BF%E6%9D%91/dp/4798129712
- https://qiita.com/omokawa_yasu/items/a1e83faa8bb7a14154f8
- https://qiita.com/omokawa_yasu/items/23cff80298d9ea71d53a
- https://speakerdeck.com/yasuakiomokawa/hello-remote-world
c++ 初学者がvector.at()で配列要素を指定する理由

c++の配列を要素指定する際に配列要素.at()または配列要素[i]で要素指定する方法があると思います。

よくc++やプログラミング初学者はvector.at()を使うことを推奨されるのですが、なぜなのか理由をみていきます。

###環境
実行環境はGCC5.4.1です。(AtCoderのコードテストと同じ)

###理由:配列要素[i]で要素指定するとエラー文が出力されない

以下のようなコードがあるとします。

```c++
#include <bits/stdc++.h>
using namespace std;

int main(){
  	vector<int> vec(5);
	for(int i = 0;i<5;i++){
      cin >> vec.at(i);
      cout << vec.at(i) << endl;
    }
  	
}
```

このコードは

```
1 2 3 4 5
```

のような入力を取ってきて出力するだけの簡単なコードです。

この配列要素を指定している箇所のvec.at()を

```c++
cin >> vec[i];
cout << vec[i] << endl;
```

と書く2通りの書き方があるのですが、vec[i]で要素指定した場合は例えば
セミコロンを書くのを忘れてエラーになった場合にエラー文が出力されません。

なので、c++の文法に慣れてないうちはvec.at()で書くことが一般的には推奨されています。

ですが、個人的にはやはりvec[i]で要素指定する方がタイプしやすく他の言語の人がみたときの可読性も上がるのでエラーが出たときに要素指定の箇所を適宜コメントアウトしてvec.at()に置き換えてエラー文を出力させるといった方法を取るのがいいなと思います。

以上です。
Elmで書いたしりとりゲーム

# ソースとデモはこちら
[https://ellie-app.com/6MDXpy62q29a1]

今回はデータベースは使わずにプログラムの中に豚辞書18万語を入れてしまっています。

# 豚辞書について

こちらが入れた単語の末尾のひらかなで始まる単語を豚辞書の中からランダムに選んで返してくるので、まず絶対勝てません。

知らない単語がでてくるのはたぶん古い言葉です。

豚辞書はネットにあるクロスワードパズル用の辞書です。


# Elmと文字列操作

文字列操作の練習をしたいと思って作り始めました。

StringをListにしたり、Stringに戻したり手間をかけているわりには、機能がない。

勝ち負け判定もしていません。

下敷きはRubyで書いたしりとりゲームで、Rubyはなんでもできてしまうので関数型プログラミングに直すのに苦労しました。

関数型プログラミングはHaskelもそうですがコンパイル時に出るエラーが親切でエラーをこつこつ直しているといつのまにか出来上がるのが素敵というか不思議というか感動です。

# サンプル画像
<img width="400" alt="shiritori.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22116/de17330f-c3e4-4ac2-ffb4-7eb29b1f3e8b.png">
自分用　記憶に定着させるための勉強法

daigoが言ってたことをそのまま書く。
自分用

##１．本文を読む前
目次を読み、どんな内容が書いているのか想像する。

##２．本文を読んでいるとき
- セクションごとに、40秒で要約する。その際、自分の感想も踏まえる。
- 要約の表現を少し変えると面白い。（名言風など）

##３．読み終わった後
アウトプットする。

- 人に伝える。（妄想でも可）
- ブログ・メモ帳に残す。
- 技術的なことであれば、実際に手を動かし、モノを作る。（コードやツール等）
UIとUXについて

#はじめに
今回、会社の求人などを調べた際にUI/UXを扱う会社を多数見かけ、Web系の知識として覚える必要があるかと思い今回記事作成に至りました。
##UI(User Interface)とは
UIとはユーザーインターフェース(User Interface)の略で、ユーザーと製品・サービスの接触面を指し、ユーザーの目に触れる部分は全てUIに該当します。

ホームページの場合で表すと、パソコンやスマートフォンに表示されるデザイン、フォントなど、製品であれば製品そのものや外観などが全て`UI`となります。

##UX(User eXperience)
UXとはユーザーエクスペリエンス(User Experience)の略で、ユーザーが製品・サービスを通じて得られる体験を意味します。

ホームページの場合は、デザインが綺麗、フォントが読みやすい、商品のクオリティが高いなどサービスの質も`UX`となります。

##UIとUXの違いについて
簡単に言うと、`UI`は客観的に使いやすいかで`UX`は主観的に自分の欲求が満たせているかの違いです。

ユーザーにより良い体験`(UX)`をして貰うには優れた`UI`が必要です。理由は、ユーザーとの接触面である`UI`を蔑ろにしてユーザーがわかりにくくしてしまうと、ユーザーが離れてしまう恐れがあるからです。

なので`UI/UX`のどちらもターゲットを念頭に置く事が重要になります。

#最後に
UIとUXについてサイト等で調べ個人的にまとめました。説明不足な部分もあるかと思いますので、詳しい説明は以下を参考にして下さい。

####参考記事
https://qiita.com/ssaita/items/7c0b15e84c3ab7acbd36
https://ferret-plus.com/655
CloudFrontでWordPressのビジュアルエディタが表示されない

###functions.phpに以下を追加する

```php

function can_use_visual_editor() {
  
    global $wp_rich_edit;
  
    if ( get_user_option('rich_editing') == 'true' || !is_user_logged_in() ) {
        $wp_rich_edit = true;
        return true;
    }
  
    $wp_rich_edit = false;
    return false;
}
  
add_filter( 'user_can_richedit', 'can_use_visual_editor' );
```