OmniAICreator/Qiita-1.07M huggingface dataset:
AtCoder Beginner Contest 140 参戦記

# AtCoder Beginner Contest 140 参戦記

## [ABC140A - Password](https://atcoder.jp/contests/abc140/tasks/abc140_a)

1分で突破. 書くだけ.

```python
N = int(input())
print(N ** 3)
```

## [ABC140B - Buffet](https://atcoder.jp/contests/abc140/tasks/abc140_b)

6分半で突破. 1-indexed と 0-indexed を調整するのがめんどくさいだけ.
最初 before に -1 を入れていたら、料理1始まりの時に誤爆して危なかった. 入出力例3に救われた.

```python
N = int(input())
A = list(map(int, input().split()))
B = list(map(int, input().split()))
C = list(map(int, input().split()))
before = N
result = 0
for i in range(N):
  result += B[A[i] - 1]
  if before + 1 == A[i] - 1:
    result += C[before]
  before = A[i] - 1
print(result)
```

## [ABC140C - Maximal Value](https://atcoder.jp/contests/abc140/tasks/abc140_c)

7分で突破. なんかややこしいけど手で解けばすぐ min(B<sub>i</sub>, B<sub>i-1</sub>) なのは分かるので、端だけ別処理して終わり.

```python
N = int(input())
B = list(map(int, input().split()))
result = B[0] + B[N - 2]
for i in range(1, N - 1):
  result += min(B[i - 1], B[i])
print(result)
```

## [ABC140D - Face Produces Unhappiness](https://atcoder.jp/contests/abc140/tasks/abc140_d)

敗退. どこをひっくり返しても増える幸福は2ということが見抜けず、一番長いやつと一番長いやつを繋げることに奔走してしまった…….  結果、TLE だらけ.

終了後に AC を取ったコードは以下.

```python
N, K = map(int, input().split())
S = input()
c = 0
for i in range(1, N):
  if S[i] == S[i - 1]:
    c += 1
print(min(N - 1, c + K * 2))
```

## [ABC140E - Second Sum](https://atcoder.jp/contests/abc140/tasks/abc140_e)

敗退. ナイーブに正しい値を求めるコードは書けたけど、10<sup>5</sup> * 10<sup>5</sup> の計算量では TLE 死.
sshコマンドで接続確認の質問に常にyesで答える

```bash
$ ssh -T git@github.com
The authenticity of host 'github.com (XX.XX.XX.XX)' can't be established.
RSA key fingerprint is SHA256:XXXXXXXXXXXXXXX...XXXXXXX.
Are you sure you want to continue connecting (yes/no/[fingerprint])? 
```

こんな感じの質問を受けたくないときがあるので、勝手に許可してくれるようにしたいです。

以下のように`-o "StrictHostKeyChecking no"`オプションをつけます。

```bash
$ ssh -o "StrictHostKeyChecking no" -T git@github.com
Warning: Permanently added 'github.com,XX.XX.XX.XX' (RSA) to the list of known hosts.
Hi USERNAME! You've successfully authenticated, but GitHub does not provide shell access.
```

自動で動いてほしいスクリプトの中などで使うと便利です。
laravel-adminのメモ


```
composer require encore/laravel-admin
php artisan vendor:publish --provider="Encore\Admin\AdminServiceProvider"
```


```
php artisan admin:install
```

```
http://localhost:8000/admin
開発用Admin
admin
admin
```


```
php artisan make:model Domain/Models/AdminUsersModel
php artisan admin:make AdminUsersController --model=App\\Domain\\Models\\AdminUsersModel
```



app/Admin/routes.phpに追加
$router->resource('admin-users-models', AdminUsersController::class);



$form->savingの部分でハッシュ化するのを書いてる。    



```:src/app/Admin/Controllers/UsersController.php
<?php

namespace App\Admin\Controllers;

use App\Domain\Models\UsersModel;
use Encore\Admin\Controllers\AdminController;
use Encore\Admin\Form;
use Encore\Admin\Grid;
use Encore\Admin\Show;

class UsersController extends AdminController
{
    /**
     * Title for current resource.
     *
     * @var string
     */
    protected $title = 'App\Domain\Models\UsersModel';

    /**
     * Make a grid builder.
     *
     * @return Grid
     */
    protected function grid()
    {
        $grid = new Grid(new UsersModel);

        $grid->column('id', __('id'));
        $grid->column('user_id', __('User id'));
        $grid->column('shop_id', __('Shop id'));
        $grid->column('password', __('Password'));
        $grid->column('created_at', __('Created at'));
        $grid->column('updated_at', __('Updated at'));

        return $grid;
    }

    /**
     * Make a show builder.
     *
     * @param mixed $id
     * @return Show
     */
    protected function detail($id)
    {
        $show = new Show(UsersModel::findOrFail($id));

        $show->field('id', __('id'));
        $show->field('user_id', __('User id'));
        $show->field('shop_id', __('Shop id'));
        $show->field('password', __('Password'));
        $show->field('created_at', __('Created at'));
        $show->field('updated_at', __('Updated at'));

        return $show;
    }

    /**
     * Make a form builder.
     *
     * @return Form
     */
    protected function form()
    {
        $form = new Form(new UsersModel);

        $form->number('id', __('id'));
        $form->text('user_id', __('User id'));
        $form->text('shop_id', __('Shop id'));
        $form->password('password', __('Password'));

        $form->saving(function (Form $form) {
            if ($form->password && $form->model()->password != $form->password) {
                $form->password = bcrypt($form->password);
                \Log::info($form->password);

             }
         });

        return $form;
    }
}

```
Python環境構築 [pyenv(パイエンブ)からAnacondaからのjupyter notebook]

#### Homebrewインストール済みでの前提
確認方法はターミナルで

    brew -v
    Homebrew 2.1.10
brew -vでHomebrewのバージョンが表示されればインストール済み

## pyenvとは
複数バージョンのpythonを管理できる。

## pyenv をインストール
    brew install pyenv

終わったら、確認

    pyenv -v
で、バージョンが表示されればOK!

## bash_profileの設定


    echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
    
    echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
    
    echo 'eval "$(pyenv init -)"' >> ~/.bash_profile
    
    source ~/.bash_profile


.bash_profileにこの3行が追加されてるのを確認

    cat .bash_profile


- export PYENV_ROOT="$HOME/.pyenv"
- export PATH="\$PYENV_ROOT/bin:$PATH"
- eval "$(pyenv init -)"


## pythonをインストール(バージョンは3.7.4)

    pyenv install 3.7.4

思いのほか時間がかかる。。

### インストール可能なpythonのバージョンを確認する場合

    pyenv install --list

    
## インストールしたpythonを使うために

    pyenv global 3.7.4

#### 確認 (-VのVは大文字)
    python -V

これで、先ほどインストールしたバージョンが表示されればOK

### 補足
インストール済みのバージョンを確認する場合

    pyenv versions



## Anacondaインストール
#### インストールできるバージョンを確認

    pyenv install --list

#### インストール
注) だいぶ時間かかる...。

    pyenv install anaconda3-5.3.1


#### インストールしたanacondaを使うように設定

    pyenv global anaconda3-5.3.1

## jupyter notebook立ち上げ

    jupyter notebook

で、ブラウザが立ち上がれば完了！！

以上！！
約三か月でAWS SAA 合格 をするロードマップ(2019/09)


## はじめに

約 3 か月間の勉強期間を経て、無事 AWS SAA 試験に合格することが出来ました。
以下に SAA 取得を目指したきっかけと学習ロードマップを示します。
SAA 取得を目指す誰かしらの参考になれば幸いです。

短期間で詰め込まずじっくりゆっくり勉強を進めたので、ストレスなく楽しく学習することが出来ました。
勤務先でも AWS 社内勉強会が週 2 回あり、それのおかげでモチベーションを保てていたのも合格の大きな要因だと思います。

## SAA を取得しようと思ったきっかけ

新卒 1 年目の時にアサインされた分析プロジェクトで、この rdp にアクセスしてこのアプリを開いて sql 叩いてデータ取ってきてくれ～、とタスクを振られました。
その際上司に、これはどういう基盤構成で成り立っている分析環境でこのアクセスしている DB 設計は、といった質問を投げかけましたが回答を得られませんでした。

とりあえず AWS とやらを利用しているらしい、としかこの時はわかりませんでした。
（クラウドって聞いたことあるけど、クラウドの概念すらわからない状態でした笑）
ならば自分で勝手に学習して詳しくなってやろう、というのが最初の学習のモチベーションでした。

仕事にも慣れだし、落ち着いてきた新卒 2 年目の 2019/06 から本格的な学習を開始し、AWS SAA 取得を設定しました。

## 学習ロードマップ

**1.そもそも SAA とは**
[AWS 認定ソリューションアーキテクト – アソシエイト](https://aws.amazon.com/jp/certification/certified-solutions-architect-associate/)
とりあえずゴールとする SAA がどんなものかを確認しました。
最初サンプル問題をみたときは問題文の意味さえわからず、焦りました。

**2. 入門書の読み込み(1 週間)**
[AWS 認定資格試験テキスト AWS 認定 ソリューションアーキテクト-アソシエイト](https://amzn.to/3xp97P8)

良書です。こちらを読み、AWS がどういったサービスを提供しているのかなんとなく掴みました。入門書としてこちらを推奨します。

**3. BlackBelt 通読・社内勉強会での口頭試問(2 か月半)**
[AWS サービス別資料](https://aws.amazon.com/jp/aws-jp-introduction/aws-jp-webinar-service-cut/)

上記リンク先に掲載されている資料が通称 BlackBelt です。
一つ一つ読み込み、社内勉強会での口頭試問で理解しているかを確認しました。
難解過ぎて辛くなる時もありますが、なんとか耐えました。
わからない用語や概念などはググったり有識者に聞いて解決しました。
合わせて FAQ や開発者ガイドを読んで理解を深めていきました。
ここを乗り切れれば何とかなります。山場です！

**4. 模試の受験(1 時間程度)**
AWS 公式の模試を約 2000 円で受験することが可能です。
実際の問題の出し方の把握や、自分が合格ラインにいるかどうかの現状認識ができるので是非受けましょう。

**5. 参考書の読み込み・問題集実践(1 週間程度)**
[この 1 冊で合格! AWS 認定ソリューションアーキテクト - アソシエイト テキスト&問題集](https://amzn.to/3yplpqQ)

[徹底攻略 AWS 認定 ソリューションアーキテクト – アソシエイト教科書 徹底攻略シリーズ](https://amzn.to/2TIwJj9)

[AWS 問題集](https://aws.koiwaclub.com/aws-exam2/)

上記 2 冊を通読し添付の問題集を解いたのと、上記最下部のリンク先の WEB 問題集を解き試験に備えました。
大体 1.5 周くらい解いたと思います。

## 補足

注意点としては、AWS SAA Certificate の有効期限は 3 年なので、3 年たつとまた受けなおす必要があります。
合格特典として、試験の割引や無料の模擬試験もあるので、修行を積んで SAP とれたらいいなあと考えております。

[AWS 認定の利点](https://aws.amazon.com/jp/certification/benefits/)

## 最後に  

ググると 1 週間で取得などのかっこいい記事があふれていますが、それをみてマネして寝ないで勉強みたいな無理をしたり、無茶な目標を設定する必要はないと思います。
私を含む多くの凡人は 1 週間足らずでは AWS SAA は取得できないです。でも凡人でも 3 か月じっくりゆっくりやればなんとかなります。
到達可能な目標を決めて、それに対して自分でスケジュールを組み、それを実現するために努力していくことが大事だと思います。
VScodeでArduinoに書き込みデバッグしたい！（導入）

#はじめに
今回はArduinoにVisual Studio Codeで書き込みデバッグできたので記事にしてみました。ArduinoにはArduino IDEという公式が出しているIDEがあるのですが、補完機能がないやらで正直使い安いとは言えないのでVScodeを使ってかけないかなと思って調べてみたらうまくいきました。参考にした記事(https://qiita.com/narikei/items/847613a8f01a9e1527d7)
だと私の環境では少しうまくいかなかったので導入までを今回記事にしてみます。

#環境
OS          : macOS Mojava 10.14.2（18C54）
VScode      : 1.38.0
Arduino IDE : 1.8.9

#前提
はじめに前提としてはArduino IDEのインストール、VScodeのインストールをしていることとします。もしそれができてない方は他の方の記事を参考にしてインストールしていただけたらと思います。

#準備
###拡張機能のインストール
それでは準備のためにVScodeにArduinoの拡張機能を入れていきたいと思います。入れるのは下の画像のMicrosoftのArduinoという拡張機能です。Arduinoと検索したら他にも出てきますが、今回はこれを使っていきたいと思います。
<img width="1224" alt="スクリーンショット 2019-09-08 11.42.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381337/1e871a25-6e1a-40d6-5c20-dba0980b1d03.png">

###設定
今の状態ではまだまくいかないので設定をしていきます。まずcommad + Shift + Pを押してArduinoと検索しコマンドが表示されたら拡張機能の導入は成功しています。
<img width="1220" alt="スクリーンショット 2019-09-08 11.49.43.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381337/55f9501f-9466-9cde-31f9-3aaef3d68be4.png">

それでArduino:Exampleをクリックしてみます。そうすると右下にArduinoのパスがないよ！的なことを怒られて設定が開かれるのでArduinoのアプリのパスを登録しましょう。私の場合はapplivationの下に置いていたので下図のようになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381337/5e52f828-c8bb-588d-3ae9-dae0398ebb23.png)

ここまでうまくいっているとさっきのArduino:Exampleをクリックすると下図のように表示されていると思います。（私はもう既に少しいじっているので下のExample for Arduino/Gennunio Unoがありますが最初は表示されていなかった記憶)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381337/7eb5eef6-b5a8-74ac-237f-511b17f927cf.png)

それではLチカのサンプルプログラムを開いてみましょう。Blinkというプログラムです。しかし、最初開いた時にはおそらく問題が8つほど出ていると思います。この解決に少し手こずりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381337/05be97b9-aeea-6d0a-2ba8-72e3ec28ef91.png)

結論から言って設定で"C_Cpp.intelliSenseEngine"と検索してそれを"default"から"Tag Parser"に変えてみたら上手くいきました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381337/d578dafd-2939-ee8d-1205-275a8a1a7685.png)

この後VScodeを再起動して再びBlinkというプログラムを再起動してみると無事問題は消えていると思います。

#終わりに
この後は先ほど紹介した記事（https://qiita.com/narikei/items/847613a8f01a9e1527d7）
の”ボードを選択”以降と同じようにやれば上手く言ったのでそれを参考にして実際に書き込んでみてください！それでは良いVScodeライフを！

#参考文献
https://qiita.com/narikei/items/847613a8f01a9e1527d7
https://another.maple4ever.net/archives/2328/
Raspberry Pi Mouseを始めようかなと検討してみた（その２）

【Raspberry Pi Mouseを購入する前のいろいろ調べ】
・[Raspberry Pi Mouse Simulator](https://raspimouse-sim-tutorial.gitbook.io/project/)のHP
・Logicool ウエブカム[C310を使った事例](https://www.koi.mashykom.com/Pimouse.html)のページ。
・本「Raspberry Piで学ぶ ROSロボット入門」の[作者上田さんのブログ](https://blog.ueda.tech/?tag=raspberry-pi-mouse)。
・[Raspberry Pi搭載ロボットをPCのブラウザから遠隔操縦する](https://meltingrabbit.com/blog/article/2018121902/)HP
・[Pythonでデバイスをリアルタイムに読み書きをする方法？](https://qiita.com/ossyaritoori/items/f676f5f9a2932922aec2)
・[Raspberry Pi Mouse - ROS Wiki - ROS.org](http://wiki.ros.org/ja/raspimouse_ros)
・[Raspberry Pi Mouse の /dev/rtswitch の挙動について](https://qiita.com/shotaro_tsuji/items/06fa0306651e1640ab6b)
・[ROS 設定編](http://www.cloudox.server-shared.com/~cloudox/sslfolder/ros_001_1.html)
・[Raspberry Pi Mouseシミュレーション環境のセットアップ](https://ros.youtalk.jp/2017/06/11/setup-raspi-mouse.html)
・[ルンバをRaspberry Piを使ってROSでコントロールできるように改造してみた（半田付け無しでOK）](https://karaage.hatenadiary.jp/entry/2017/05/12/073000)
・[ROS2でRasPiMouseを使う](http://hara.jpn.com/_default/ja/Topics/RasPi_ROS2.html)
・[ROS2でラズパイマウスを動かす](https://www.rt-shop.jp/blog/archives/11249)
・[Gazeboで走るRasPiMouse](https://products.rt-net.jp/micromouse/archives/3348)、ページ最後にシミュレーションのリンク集有り

Raspberry Pi MouseにUbuntuからアクセスしたい！
よって手持ちのWindowsパソコンでUbuntuを使うため、
USBメモリからUbuntuを起動させる為の高速のUSBメモリ購入しました。
![IMG_4547a.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298045/fbfdccf7-3243-ccbf-eb75-7ee35fb19d0c.jpeg)

UbuntuをUSBメモリから起動させる準備を進めていきます。
ROS使いたいので、Ubuntu 16.04のISOファイルを[ここ](https://www.ubuntulinux.jp/News/ubuntu1604-ja-remix)からダウンロードしました。
今後、[Ubuntu16.04LTSをUSBメモリにインストールする](http://yohaku6066.blog.fc2.com/blog-entry-44.html)を参考に進めていきたいと思います。
インストール終わったら、ラズパイマウスを発注したいと思います。
Macでrails-ERD を使った ER 図 の作成法

##はじめに

現在、作成しているアプリで、rails-ERDによるER図を作成したので、その方法を備忘録として残します。これを使用することでデータモデルの構造や関係性を示したER図（Entity Relationship Diagram）が自動作成され、以下のようなPDFファイルを作成することができます。

<img width="621" alt="スクリーンショット 2019-09-08 10.12.27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438093/e7c69fca-4242-e976-ccdc-e63c98e39953.png">


##前提条件
- ER図の作成対象となるアプリが作成されており、モデル作成とリレーション設定が済んでいること
- Graphviz(グラフビズ)がインストールされていること

## ER図作成の流れ
###1.Gemfileの変更
``` Gemfile.

group :development do
  gem 'rails-erd'  #追記
end
```
###2.rails-erd のインストール
```ターミナル.
$ bundle install --path vendor/bundle
```

###3.ER図の作成
```ターミナル.
$ bundle exec erd
```
Gemfile等と同じ階層に`erd.pdf`が作成されていればOKです。

##おまけ
今回が初めて`rails-erd`を使用したので当然`Graphviz`はインストールされてませんでした。その状態で`bundle exec erd`を実行すると怒られたので`Graphviz`をインストールしました。

```ターミナル.
$ bundle exec erd
Failed: RuntimeError: Saving diagram failed!
Verify that Graphviz is installed and in your path, or use filetype=dot.

$ brew install graphviz
```

作成したER図が他と一緒にコミットされないよう除外しました。

```gitignore.
<中略>

erd.pdf　#追記
```

##参考
https://www.sejuku.net/blog/66196
https://tech.mof-mof.co.jp/blog/try-rails-erd.html
「にしを番全」命令。日本語の関数化。

「にしを番全」命令は、日本語を関数化する命令である。音声分析と字句解析に関連する。

~~~
結果｜１０．５｜１＊１０＜ヤー、二番を整数にして、三番を計算して、全体を表示して、以上。
；結果１００
~~~

~~~~
仮定
日本語の熟語は、動詞と目的語を内包している。
熟語は、名詞であるが、厳密には名詞的である。
熟語を動詞化すれば、少ない時間で発声出来る。
関数は、命令と引数から成立している。
関数は、動詞と目的語から成立していると、日本語的に置き換える事が、まま、出来る。
１．動詞と目的語を判読できれば、関数を実行できる。

目的語の番号が判れば、厳密に、引数として抜き出せる。
番号だけではなく、集合として全体を引数として実行する場面は多い。
２．引数の指示番号と全体を指示する事が出来れば、引数を厳密にし、関数を実行できる。

結論
「にしを番全」命令を定義出来る。
にしを番全命令は数式化出来る日本語である。

例示
結果｜１０．５｜１＊１０＜ヤー、二番を整数にして、三番を計算して、全体を表示して、以上。
；結果１００

詳細
「にしを」は動詞化する規則変化である。名詞の「出力」を動詞化する場合を例示する。
出力にして
出力して
出力をして

「番全」は関数実行時に、引数を正確に渡す為に必要である。関数実行を別言語で示す。
引数１｜引数２｜引数３＜ヤー、一番を出力して、以上。
//console.log('引数１')
引数１｜引数２｜引数３＜ヤー、全体を出力して、以上。
//console.log('引数１','引数２','引数３')

「は」は、日本語の主語で、この言語的に要約語であろうが、今の所一つだけ。
「にしを番全命令は」である。

「ヤー」と「以上」は、命令の先頭と末尾を指示するが、蛇足として含めている。
直感的な仕様で、発声学的に必要かは不明。
出典を挙げる。無線応答は、末尾が必要で、グーグルグラスは、先頭が必要である。

純粋動詞の日常言語化に難点がある。
「音量を上げる」は「一番を上げる」だが、日常語として通用しない。
計算機言語の観点で考えると、純粋動詞は、非常に広範囲の用途がある関数となる。
上げるに関連する目的語は、階級を上げる。レベルを上げる他、様々ある。
//up(volume)
引数により、多様な応答をする事は、まず引数の判別が無限となる可能性がある。
通常の計算機言語による関数は逆である。
//volume(up)
ただ、純粋動詞は、目的語が一つだけである事が多い。
一対一の関係の場合、逆になる性質を利用して、倒置関数を用意する事で可能である。
また解析時の判別にも役立つ、一対一の場合は、倒置関数が用意されているかチェックする事である。
//up(x)
//~up(~x) //~up is x. ~x is up.
この事から、命令もまた、引数であると実行時に都合が良い。
~~~~
Anaconda3 unistall (Mac)

## 環境
Mac Mojava 10.14.6

## anaconda-cleanをコマンドからインストール

     conda install anaconda-clean

 Proceed ([y]/n)?
と、聞かれるので y で return押す。

次に、コマンドで

    anaconda-clean

すると、色々聞かれるので「y」とする
今回出てきた、(y/n)一覧


    Delete .anaconda? (y/n): y
    Backup directory: /Users/ユーザー名/.anaconda_backup/2019-09-08T103615
    Delete .conda? (y/n): y
    Delete .condarc? (y/n): y
    Delete .ipython? (y/n): y
    Delete .jupyter? (y/n): y
    Delete .matplotlib? (y/n): y


## anacondaのディレクトリを削除
anaconda3がある階層で

    rm -r anaconda3

## PATHを消す


    open ~/.bash_profile

で、bash_profile開いてanaconda部分を消す

今回消した部分


    # added by Anaconda3 2019.07 installer
    # >>> conda init >>>
    # !! Contents within this block are managed by 'conda init' !!
    __conda_setup="$(CONDA_REPORT_ERRORS=false '/Users/ユーザー名/anaconda3/bin/conda' shell.bash hook 2> /dev/null)"
    if [ $? -eq 0 ]; then
        \eval "$__conda_setup"
    else
        if [ -f "/Users/ユーザー名/anaconda3/etc/profile.d/conda.sh" ]; then
            . "/Users/ユーザー名/anaconda3/etc/profile.d/conda.sh"
            CONDA_CHANGEPS1=false conda activate base
        else
            \export PATH="/Users/ユーザー名/anaconda3/bin:$PATH"
        fi
    fi
    unset __conda_setup
    # <<< conda init <<<



## 確認

    Python 2.7.15 (default, Aug 22 2018, 16:36:18)

ここに、anacondaの名称がなければ成功。たぶん。。

これで、上手くいってなければ後日記述。
PythonのtkinterでGUIを作ってみる

#GUIに挑戦してみる
プログラムをいろいろ作っているうちに

「コマンドプロンプト（黒い画面）じゃなくてGUIのほうがイカしてるじゃん。」

って思ったので作ってみました。
（あいかわらず動機がしょうもない…）

#tkinterという便利なやつ
んで、もちろんPythonさんなわけですが
なんか標準で入ってるやつがあるみたいです。
ありがたいですね。


```py
import tkinter
import tkinter.messagebox
```


ほかにもGUIのライブラリはあるみたいですが
標準があるなら標準でいきましょう。
標準最高です。

#ひとまず完成

```py
import sys
import tkinter
import tkinter.messagebox

#ボタンイベント
def btn_click():
    xxxx = str(txt.get())
    if len(xxxx) == 0:
        tkinter.messagebox.showinfo('入力内容','何も入力されてないよ？')
        root.mainloop()       
    else:
        tkinter.messagebox.showinfo('入力内容','「 '+xxxx+' 」 が入力されました！')
        root.quit()
        root.destroy()

# tkクラス生成
root = tkinter.Tk()
# 画面サイズ()
w = 600
h = 300
wh = str(w)+'x'+str(h)#ここは小文字のｘじゃなきゃだめ
root.geometry(wh)
# 画面出現位置
screen_width = root.winfo_screenwidth()
screen_height = root.winfo_screenheight()
sw = (screen_width-w)/2
sh = (screen_height-h)/2
sw ='{0:.0f}'.format(sw)
sh ='{0:.0f}'.format(sh)
swstr = '+'+str(sw)
shstr = '+'+str(sh)
root.geometry(swstr+shstr)
# 画面タイトル
root.title('はじめてのGUI')
# ラベル
lbl = tkinter.Label(text='1.なんか入力して下さい')
lbl.place(x=30, y=80)
# テキストボックス
txt = tkinter.Entry(width=50)
txt.place(x=30, y=100)
# ボタン
btn = tkinter.Button(root, text='表示', command = btn_click)
btn.place(x=280, y=230)
#ウィンドウ表示 
root.mainloop()
```

はいできた～。
わりと簡単でした。

#ちょっと気になる点
実は作ってみて「んー、わからん」というところがありました。
自分はここで入力された内容を変数として保持したいんですが
関数内の処理結果は保持できないのでどうすればいいのか？
（globalをつかって切り抜けはしましたが納得いかない…）
解決方法がわかる人がいたら教えてほしいです。
Automation AnywhereでBotを作成する際に守るべきチェックリスト

Automation Anywhere (AA) の製品ドキュメントサイトに、Bot作成時の推奨事項がまとまっていたので、メモ代わりに記載しました。

[Bot の設計、作成、提出に関する推奨標準](https://docs.automationanywhere.com/bundle/enterprise-v11.3/page/enterprise/topics/aae-developer/aae-bot-store-introduction.html)

**重要なポイント**

* 標準に準拠しましょう
    * 推奨の定型テンプレートがあります。[Bot Storeからインストールできるので、](https://botstore.automationanywhere.com/bot/create-boilerplate-code-as-per-botstore-standards/)試してみるとよいでしょう。(英語ですが)
    * 変数名の命名規則の推奨。これは混乱を避けるため。
        * 変数は vPath のように、"v" で始める。
        * リストは lstMyList のように、"lst" で始める。
        * 配列は arrPirateBooty のように、"arr" で始める。
        * ランダムは rdmChoice のように、"rdm" で始める。
        * 整数を保持すると予想される変数の場合は "int"を使う。(AAに型はない)
        * 文字列を保持すると予想される変数の場合は "str"を使う。(AAに型はない)
    * エラー処理を適切に行うようにしましょう。
* 環境要因の排除
    * 他のパソコンでの実行を考えよう。ハードコードされたファイルパスやマシン環境依存の値は使わず、システム変数 `$AAApplicationPath$`などを活用しましょう。
    * ひとつのBotにたくさんのアクションを入れてしまうと再利用やデバッグが困難になるので、モジュールごとに分割しましょう。(他のタスクBot、Meta Bot、DLLなど)その際、入力/出力/入出力パラメーターを適切に設定します。
    * 値のハードコードはやめましょう。値はなるべく変数に格納して、変数の値だけを変えればよいようにします。
* セキュリティを考えよう
    * 資格情報はタスクにハードコードしたり変数に格納しない。必ずControl RoomのCredentialVaultを使うこと。
    * BotのロジックやDLLに組み込まれるVB.NET/C#などのコードが標準の安全なコーディング手法に従うようにしましょう。特に、ソフトウェアセキュリティ脆弱性をきちんとつぶしましょう。
* わかりやすさを考えよう
    * Botの設定はエンドユーザーにとってわかりやすいものにしましょう。
    * コードやアクションリストの記載には、コメントを必ず入れて何をやっているのかを分かるようにしましょう。
    * Readmeファイルを作成しましょう。
* その他のテクニック
    * [やらないほうがいいことリスト](https://docs.automationanywhere.com/bundle/enterprise-v11.3/page/enterprise/topics/aae-client/bot-creator/build-basic-bot/aae-considreations-for-bot-design-and-creation.html)を参考にしましょう。
超初心者がAtCoderのコンテストに初参加した話（AtCoder Beginner Contest 140）


練習と備忘録を兼ねてAtCoder参加した感触を記載します。

####環境
・Mac OS X 10.13.6
・Eclipse
・使用言語：Java8 (OpenJDK 1.8.0)

#きっかけ

職業訓練校でJavaを習い初めて１か月。
やっとfor文を使えるようになってきたレベルでAOJを勧められました。
１週間ほどAOJの問題をルンルンで楽しく解いていましたが昨日、、、朝からアクセスできない（泣）
でもせっかく休みだし何か問題解きたい！

そこで「コンテストってなんだか怖い」と敬遠していたAtCoderのページに行ってみる事にしました。


#AtCoder Beginner Contest 140
ちょうど今日（9/7）開催されるじゃないですかー！！参加ボタンを勢いで押しました。
参加したのは以下のコンテスト
[AtCoder Beginner Contest 140](https://atcoder.jp/contests/abc140)  

#結果
![スクリーンショット 2019-09-08 9.56.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/493727/dd473e7d-9baa-1918-42b9-36090a4fd12f.png)
![スクリーンショット 2019-09-08 9.50.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/493727/bde381ef-ba7c-dffa-e5c5-3ac56d16adde.png)
※ぜんぜん怖くなかった！むしろ終わった後の解説見たりとか楽しい！

#B問題でハマった

B問題、正解はしたものの終わった時点で70分、、、
C問題は見当がつけられませんでした。

####■B問題でハマった原因
・if文の中に二重括弧(())でコンパイルエラー（Eclipseではエラーが出ない）
・for文で回しながら要素を代入していったら配列の索字の数をオーバーする（ArrayIndexOutOfBoundsExceptionエラー）

####■B問題の問題と答え
#####問題　　[問題B ： Buffet ](https://atcoder.jp/contests/abc140/tasks/abc140_b)
#####正解した解答
```Java
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int N = sc.nextInt();
		int[] A = new int[21];
		int[] B = new int[21];
		int[] C = new int[21];
		int i = 0;
		int cs = 0;
		int csSum = 0;

		for( i = 0; i < N ; i++) { //入力2行目の入力をA配列に格納
			A[i] = sc.nextInt();
		}

		for( i = 0; i < N; i++) { //入力3行目の入力をB配列に格納
			B[i] = sc.nextInt();
		}

		for( i = 0; i < N-1; i++) { //入力4行目の入力をC配列に格納
			C[i] = sc.nextInt();
		}
		
		for(i = 1; i <= N; i++) { //料理を食べた回数だけ繰り返す
			int j = A[i-1];  //索字の中に配列を入れたくなかったので苦肉の策で代入
			if(A[i] == j+1) {  //もし現在食べてる料理の前の料理がi+1番目なら
				cs = B[j-1] + C[j-1];  //Bの満足度+Cの満足度
			}else {  //もしi+1番目ではなかったら
				cs = B[j-1];
			}
			csSum += cs;  //得られた満足度の合計に加算していく
		}
		System.out.println(csSum);
		sc.close();
	}
}
```

#まとめ
- [すべての提出](https://atcoder.jp/contests/abc140/submissions) を見て、解けた問題も他の方の解答方法を見て勉強します。
- 今まで解いてきた問題数が少なかったと改めて実感、もっともっと練習問題やります。
- そろそろアルゴリズムの勉強します。（バブルソートしか知らない）

#以下記事参考にさせていただきました！
[AtCoder コンテストについての tips](https://qiita.com/drken/items/8a6f139158cde8a61dce)（@drkenさん）
[AtCoder に登録したら次にやること ～ これだけ解けば十分闘える！過去問精選 10 問 ～](https://qiita.com/drken/items/fd4e5e3630d0f5859067)（@drkenさん）
[Qiita記事作成方法 初心者の備忘録](https://qiita.com/U-MA/items/996ae933ae94c5711883#%E3%81%9D%E3%82%82%E3%81%9D%E3%82%82markdown%E8%A8%98%E6%B3%95%E3%81%A3%E3%81%A6%E3%81%AA%E3%82%93%E3%82%84%E3%81%AD%E3%82%93)（@U-MAさん）
【Rails】deviseを使って新規登録した後に「/users」へリダイレクトされる場合の対処法

こんにちは！
ねこじょーかー（[@nekojoker1234](https://twitter.com/nekojoker1234)）と申します。

Railsでログイン機能の実装といえば、[devise](https://github.com/plataformatec/devise)を使うと簡単ですよね。

以下はgithubからの抜粋ですが、diviseを使うだけで、こんなにもたくさんの機能を簡単に実装することが可能になります。

>
- Database Authenticatable：パスワードをハッシュし、データベースに保存して、サインイン中のユーザーの信頼性を検証します。認証は、POST要求またはHTTP基本認証の両方で実行できます。
- Omniauthable：[OmniAuth](https://github.com/omniauth/omniauth)サポートを追加します。
- Confirmable：確認手順を記載したメールを送信し、サインイン時にアカウントが既に確認されているかどうかを確認します。
- Recoverable：ユーザーのパスワードをリセットし、リセットの指示を送信します。
- Registerable：登録プロセスを通じてユーザーのサインアップを処理し、ユーザーがアカウントを編集および破棄できるようにします。
- Rememberable：保存されたCookieからユーザーを記憶するためのトークンの生成とクリアを管理します。
- Trackable：サインイン数、タイムスタンプ、およびIPアドレスを追跡します。
- Timeoutable：指定期間内にアクティブでなかったセッションを期限切れにします。
- Validatable：電子メールとパスワードの検証を提供します。これはオプションであり、カスタマイズできるため、独自の検証を定義できます。
- Lockable：指定された回数ログインに失敗すると、アカウントをロックします。電子メールを介して、または指定された期間後にロック解除できます。

この中の`trackable`と`lockable`を使用できるようにしたところ、新規登録した後に「/users」へリダイレクトされるようになってしまったので、解決方法も合わせて残しておきます。

##trackableの解決方法

どうやら`trackable`は、新規登録後に`User`のサインイン数などを`Update`しているようなのです。

これだけだと「へーそうなんだ」と思うだけかもしれませんが、調べたらここに根本原因がありました。

ユーザー編集画面(`/users/edit`)で登録を完了すると、ユーザー詳細画面にリダイレクトするように、以下の処理を追加している人がほとんどではないでしょうか？

```ruby:app/controllers/registrations_controller.rb
  def after_update_path_for(resource)
    user_path(resource)
  end
```

**上記の処理が「新規登録後にも」動いているようで、このメソッドが悪さをしていました。**
そこで、新規登録後には動かないように、以下の分岐処理を追加すると、問題なく動作するようになります。

```ruby:app/controllers/registrations_controller.rb
  def after_update_path_for(resource)
    # trackableを有効にしていると、新規登録後に/usersへリダイレクトされてしまう
    # ユーザー編集画面からの更新時のみ、詳細画面へリダイレクトするよう条件を追加
    user_path(resource) if request.referer&.include?('/users/edit')
  end
```


##lockableの解決方法
`lockable`の場合は`trackable`の対処法ではダメで、新規登録後のパスを指定できる`after_sign_up_path_for`を使用して、明示的にパスを指定することで解決しました。

```ruby:app/controllers/registrations_controller.rb
  def after_sign_up_path_for(resource)
    # lockableを有効にしていると、新規登録後に/usersへリダイレクトされてしまうため、
    # 明示的にパスを指定する
    posts_path
  end
```

これらは調べた限りどこにも載っていなかったので、もしかしたら私の実装方法に問題があるのかもしれません。
しかし、同じことで悩んでいる人もいるかも？と思い記事にしてみました。

## あわせて読みたい

[HTMLもわからない初心者が、独学で「投稿型SNSサービス」を作ったって本当？【193日間の死闘】](https://qiita.com/nekojoker/items/2497b4f81ffd1cd7025c)

運営している PlayFab 専用ブログ
https://playfab-master.com
#エラー解消 RailsでMySQL bundle install エラー

#RailsでMySQLを使ってみた時に出たエラー
DBの指定は`rails new`時点で､DBをデフォルトのSQLiteからMySQLに指定することが可能ですがしていなかったので､
途中からDBをMySQLに指定しようとしたら出たエラーです｡


##したこと
Gemfileに `gem 'mysql2'`と記述し､`bundle install`をした｡


##エラー
`bundle install`後にエラー

```index:エラーメッセージ
Gem files will remain installed in
/Users/*ユーザー名*/*ペアレントディレクトリ名*/*カレントディレクトリ名*/vendor/bundle/ruby/2.5.0/gems/mysql2-0.5.2 for inspection.
Results logged to
/Users/*ユーザー名*/*ペアレントディレクトリ名*/*カレントディレクトリ名*/vendor/bundle/ruby/2.5.0/extensions/x86_64-darwin-18/2.5.0-static/mysql2-0.5.2/gem_make.out

An error occurred while installing mysql2 (0.5.2), and Bundler cannot continue.
Make sure that `gem install mysql2 -v '0.5.2' --source 'https://rubygems.org/'` succeeds before bundling.
```

##解決コマンド

```
bundle config --local build.mysql2 --with-opt-lib=/usr/local/opt/openssl/lib --with-opt-include=-I/usr/local/opt/openssl/include
```

```
bundle config build.mysql2 --with-opt-lib=/usr/local/opt/openssl/lib --with-opt-include=-I/usr/local/opt/openssl/include
```

2つともしてください｡

##もう一回

Gemfileに`gem 'mysql2'`と記述し､`bundle install --path vendor/bundle`

```index:メッセージ

Installing mysql2 0.5.2 with native extensions
Bundle complete! 19 Gemfile dependencies, 79 gems now installed.
Gems in the group production were not installed.
Bundled gems are installed into `./vendor/bundle`
```

解決〜！！
Qiita記事の方に感謝｡


[参考にした記事](https://qiita.com/ozin/items/03a300749040ae11da2a)
seleniumを使ってC#でIEの自動操作をする

#やりたいこと
1.IEで[https://www.google.co.jp/](https://www.google.co.jp/)を開く
2.テキストボックスに"Selenium"を入力
3.「Google 検索」ボタンをクリック
##環境
- Windows 7
- Internet Explorer 11
- Visual Studio Community 2019


##準備
1.C#のコンソールアプリでプロジェクトを作成
2.NuGetパッケージ管理にて以下をインストール
- Selenium.WebDriver
- Selenium.WebDriver.IEDriver

##ソース
```Program.cs
using OpenQA.Selenium;
using OpenQA.Selenium.IE;

namespace SeleniumIESample
{
    class Program
    {
        /// <summary>
        /// SeleniumでIEを自動操作するサンプル
        /// </summary>
        /// <param name="args"></param>
        static void Main(string[] args)
        {
            IWebDriver driver = new InternetExplorerDriver();
            IWebElement textbox;
            IWebElement findbuttom;

            //Webページを開く
            driver.Navigate().GoToUrl("https://www.google.co.jp/");

            //検索ボックス
            textbox = driver.FindElement(By.Name("q"));
            //検索ボックスに検索ワードを入力
            textbox.SendKeys("Selenium");

            //検索ボタン
            findbuttom = driver.FindElement(By.Name("btnK"));
            //検索ボタンをクリック
            findbuttom.Click();

        }
    }
}
```

##参考
[Selenium - Web Browser Automation](https://www.seleniumhq.org/projects/)
Bookmarkletを使ってQiita用にWebページのリンクをワンクリックで生成出来るようにしてみた。

# 背景

最近Qiitaに投稿するようになり、参考記事などを文中で紹介する際に
Markdown記法でさえ書くのが面倒くさいと思ってしまったため、作りました。（極度の面倒くさがり）

# 試した環境
Google Chrome 最新版（2019/9/8現在)

# つくり方、使い方
#### 1. 適当にどこかのページのブックマークを作る（押しやすいので、ブックマークバー推奨）
#### 2. ブックマークを編集し、以下のコードをURLの部分に貼り付けて保存。

```
javascript:(function(){window.prompt('Qiita貼り付け用ページタイトル&URL',"["+document.title+"]("+document.URL+")");})();
```
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490870/5829b490-1281-2106-0404-afa106a55c54.png)

#### 3. Markdown記法でのリンクを生成したいページで、作成したBookmarkを押す。
#### 4. メッセージプロンプトのウィンドウが開くので、ハイライトされている文字列をそのままCtrl+cでコピー。
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490870/7d84d1f6-3198-f2d1-a2bb-d872720d38d6.png)

#### 5. Qiitaの編集中の記事に貼りつける。
下記のようなフォーマットで対象のページのタイトルとURLをコピーできているのが判ります。
`[Automation Anywhereで、現在実行中のTaskのあるフォルダのパスを取得する方法 - Qiita](https://qiita.com/zamaezaaa/items/df784d0eaf75395aeb9c)`

#### 6. 完成!!、とっても便利!!
Unreal オンライン ラーニングの「ラーニングパス」でサンプルデータがどこにあるのかわからない

#はじめに
[Unreal オンライン ラーニング](https://learn.unrealengine.com/home/dashboard)で学習していたところ、どうみてもサンプルのデータを使いながら説明されているコースなのに、そのデータの入手先が分からないということがありました。
ラーニングパスからアクセスするとこの状況に陥るようですが、個別のコースのページにいくとサンプルデータが入手できるようです。

#ここから入手できるらしい
[新しい Unreal Engine 学習ポータルの紹介](https://learn.unrealengine.com/course/2581322)というコースの中で「学習アセットとコースファイルへのアクセス」というモジュールがあります。その中で学習アセットはマーケットプレイスから入手できるよ。コースポータルの詳細タブからMarketplace引き換えコードを・・・（以下省略）と説明されていました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433170/5cc1f99a-3070-d886-ce7b-b7a4fc01aa24.png)

#詳細タブが無いよ？？？
Unrealオンラインラーニングにはいくつかのコースをまとめたラーニングパスというものがあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433170/b2aa0e6b-9f79-b7dc-1a3a-98fa11f77b21.png)

たとえば「ブループリントの学習」というラーニングパスには
　・Unreal Engine 入門
　・ブループリントの基礎概念
　・ブループリントを使用したインタラクティブなマテリアル切り替え
　・エンタープライズ向けブループリント
という4つのコースが含まれています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433170/71788b72-b7ac-5afc-2ed7-53cd8f47565e.png)

この中の「ブループリントの基礎概念」「エンタープライズ向けブループリント」では、コース用の学習アセットを使って説明されているのですがその入手先がどこなのかわかりませんでした。
ラーニングパスの画面には「詳細タブ」が見当たりません。一体どこにあるのさ・・・。


#ここにあった！
ラーニングパスに含まれているコース名をコースライブラリで検索すると個別のコースを探すことができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433170/8b9a1143-b9be-aad5-01d3-06c525dc6bb1.png)

ここからコースを開いて詳細情報のタブに行くとダウンロード先のリンクがありました。マーケットプレイスからではなく直接ダウンロードできるようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433170/6a2aa388-fb9d-816d-9de9-e0c631d716ab.png)

無事に入手できました！これで学習がはかどりますねー。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433170/026924b6-91b3-6c02-09c6-5b4ac9c76537.png)

#まとめ
ラーニングパスは関連する内容を続けて学習できるので便利なのですが、学習用アセットにアクセスできませんでした。個別のコースからならアクセスできることに気づかない人もいると思うので、ラーニングパスのページからもリンクを張っていただけるとよいですね。
コマンドラインの操作をまとめてみた

#はじめに
未来電子テクノロジーでインターンをしている宮﨑です。
コマンドラインを少し学んだので、操作をまとめてみました。
もし誤りがあれば修正するのでどんどん指摘してください。



#操作

`$ touch ファイル名`・・・新規ファイルを作成する

`$ cat　ファイル名`・・・ファイルの中身を表示する

`$ mkdir`・・・ディレクトリを作成する
　　　　　　　　※mkdirは make directory の略
　　　　　　　　※ディレクトリはWindowsやMacでいうフォルダのようなもの

`$ cd ディレクトリ名`・・・指定したディレクトリに移動
　　　　　　　　　　　　※`..`で一つ親のディレクトリ、
　　　　　　　　　　　　　`cd`のみでホームディレクトリへ移動

`$ pwd`・・・一番親のディレクトリから現在のディレクトリまで表示する
　　　　　　　※pwdは print working directoryの略

`$ ls`・・・現在のディレクトリに含まれているファイルやディレクトリを表示

`$ mv ファイル/ディレクトリ名　移動先のディレクトリ名`・・・ファイル/ディレクトリの移動

`$ mv ファイル/ディレクトリ名　新しいファイル/ディレクトリ名`・・・ファイル/ディレクトリの名前の変更

`$ cp ファイル名　新しいファイル名`・・・ファイルのコピー

`$ cp -r　ディレクトリ名　新しいディレクトリ名`・・・ディレクトリのコピー

`$ rm ファイル名`・・・ファイルを削除する

`$ rm -r ディレクトリ名`・・・ディレクトリを削除する


#まとめ
今回はコマンドラインの操作をまとめてみました。
今までよくわからなかったものがわかるようになると楽しいです！
CLIからツイート


# TL;DR
https://github.com/sferik/t  
ただし `gem install t` しても 2019-09-08 時点では動かないので一工夫。


# Steps
注意: 私はRuby全然詳しくないのでもっと効率的なやり方があるかもしれません。

## 1. Gemをバージョン指定してインストールするためのGemを導入

```
gem install specific_install
```

## 2. 最新版の t をインストール

```
gem specific_install https://github.com/sferik/t  
```

## 3. セットアップ

```
t authorize
```

## 4. ツイート

```
t update "CLIからツイート"
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96286/2fe090e6-5f63-b37e-275e-4f56d7285908.png)


以上です。

# 参考
単に `gem install t` すると、2019-09-08 時点ではこんなエラーが起きます。

```
Traceback (most recent call last):
        8: from /Users/hiroga/.rbenv/versions/2.6.4/bin/t:23:in `<main>'
        7: from /Users/hiroga/.rbenv/versions/2.6.4/bin/t:23:in `load'
        6: from /Users/hiroga/.rbenv/versions/2.6.4/lib/ruby/gems/2.6.0/gems/t-3.1.0/bin/t:20:in `<top (required)>'
        5: from /Users/hiroga/.rbenv/versions/2.6.4/lib/ruby/gems/2.6.0/gems/thor-0.20.3/lib/thor/base.rb:466:in `start'
        4: from /Users/hiroga/.rbenv/versions/2.6.4/lib/ruby/gems/2.6.0/gems/thor-0.20.3/lib/thor.rb:387:in `dispatch'
        3: from /Users/hiroga/.rbenv/versions/2.6.4/lib/ruby/gems/2.6.0/gems/thor-0.20.3/lib/thor/invocation.rb:126:in `invoke_command'
        2: from /Users/hiroga/.rbenv/versions/2.6.4/lib/ruby/gems/2.6.0/gems/thor-0.20.3/lib/thor/command.rb:27:in `run'
        1: from /Users/hiroga/.rbenv/versions/2.6.4/lib/ruby/gems/2.6.0/gems/t-3.1.0/lib/t/cli.rb:84:in `authorize'
/Users/hiroga/.rbenv/versions/2.6.4/lib/ruby/gems/2.6.0/gems/t-3.1.0/lib/t/cli.rb:976:in `generate_authorize_uri': uninitialized constant Twitter::REST::Client::BASE_URL (NameError)
```

既知のISSUEのようです。  
https://github.com/sferik/t/issues/402
Raspberry Pi2で遊ぶ

　数年前に購入してしばらく遊んでいたRaspberry Pi2（以下、ラズパイ2）。ここ最近全然動かしていない。
　これまた数年前から稼働している古いThinkPad X41。
xUbuntuを入れて、Pythonの勉強やら、プロトタイプコーディングやらに使っているが、やはりちとスペックがきつい。しかし、キーボードが最高なのでよく使う。

　そこで、なんとかラズパイ2の脳みそを活用できないか？と思いついた。

　やることは簡単だ。ラズパイ２にVNCサーバーを立てて、ThinkPadからRealVNCでつなぐ。これだけで、最新OSと最高キーボードの組み合わせが実現できちゃう。今回の記事は、まさにこれで書いています。
![スクリーンショット_2019-09-08_09-34-45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283529/fa4ac367-499f-e6f1-34cc-dbb127355935.png)

##ラズパイ2にOSインストール
まず、数年前に導入してそのままになっていたOSを最新に入れ直し。
公式を素直にNOOBSで導入。
https://www.raspberrypi.org/downloads/raspbian/

最初はHDMIでテレビに画面出して、キーボードとマウスをつないで作業。
##ラズパイ2を固定IP設定
`sudo leafpad /etc/dhcpcd.conf`
で設定ファイルを開いて、以下の設定を有効化して、設定したいIPアドレスにする。(今回は192.168.11.7)

```
#profile static_eth0
static ip_address=192.168.11.7/24
static routers=192.168.11.1
static domain_name_servers=192.168.11.1
```
##ラズパイ2のSSH、VNCを有効化
「設定」→「RaspberryPiの設定」→インターフェイスから有効化する。
デフォルトのVNCはRealVNCの模様。
##ラズパイ2にsambaをインストール、設定
こちらを参考に
https://qiita.com/ARBALEST000/items/78f459567e1e90de99e5
##ThinkPadにRealVNCをインストール
↓からプラットフォームにあったインストーラを持ってきてインストール。
https://www.realvnc.com/en/connect/download/viewer/

今回は、xUbuntuだったので、Debian系x86をインストール。

２時間ほどで完成。ほとんどOSインストール時間だ。
![DSC_9151.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283529/d7f92451-8108-80e3-0b33-44a42544b3b4.jpeg)

##感想
　ThinkPad X41のCPUより、ラズパイ2のほうがリモート越しでも描画が速い。特に動画再生はアクセラレータがついてるラズパイが圧倒的だ。
　しかし、往年のThinkPadのキーボードと画面が使えるのは、ロマンチックだ！
　ありがとうVNC。
Insert処理一括ドーン！をするときに気をつけたいこと

CSVファイルを基におおよそ1万レコードをDBにドーンとする処理を書いていたら、下記のエラーが。

```
SQLSTATE[HY000]: General error: 1390 Prepared statement contains too many placeholders in XXX
```

あっ…（察し）
バインドしすぎってことね。

```php
    // 1万分の配列が纏まっている$hogeDataをコレクション化
    $collection = collect($hogeData);
    // chunk()で1000個ごとに分割する
    $hogeData = $collection->chunk(1000);


    try {
        DB::beginTransaction();
        // 1000レコードを約10回インサート
        foreach ($hogeData as $value) {
            DB::table('hoges')->insert($value->toArray());
        }
        DB::commit();
        return redirect('/hogehoge', 302, [], true)->with('create-success', 'データ登録が完了しました。');
    } catch (\Throwable $e) {
        DB::rollBack();
        Log::error($e->getMessage());
        abort(500);
    }
```

こんな感じでコレクション化して1000個ずつ分割したらいけた。


##### ※補足
あと、ドーンってするより適度に分けてやった方が勿論のことはやい。
プロジェクトマネジメントについて

#プロジェクトマネジメント
システムの場合、要件定義、設計、実装、テストなどの工程管理を指す。

##PMBOK(Project Management Body Of Knowledge)
プロジェクト管理の知識体系、ガイドライン

##スコープマネジメント
ツール｜WBS(Work Breakdown Structure)
目的｜作業範囲を明確にし、作業の漏れをなくす
概要｜成果物をもとに作業を洗い出し、細分化、階層化したもの

##タイムマネジメント
ツール｜アローダイアグラム(PERT図)
目的｜納期、作業時間、作業手順を管理
概要｜各作業の関連性や順序関係を視覚的に表現した図
　　　遅れると致命的な作業をクリティカルパスという。

ツール｜EVM(Earned Value Management)手法
目的｜進捗状況やコスト状況を分析、評価する
概要｜プロジェクトにおける作業を金銭の価値に置き換えて定量的に実績管理をする進捗手法

##コストマネジメント
ツール｜ファンクションポイント法
目的｜ソフトウェアの見積もり
概要｜開発規模の見積もりをソースコードのステップ数ではなく、機能の複雑さから算出する方法

##品質マネジメント
ツール｜パレート図
目的｜品質管理
概要｜棒グラフと折れ線グラフを合わせた複合グラフ
　　　分析対象から重要な要素を識別するために使用される。テスト報告会の不具合分析などで利用される。

#サービスマネジメント
完成したシステムを使って、効率よく安全にサービスが稼働するよう管理する方法

##SLA(Service Level Agreement)
サービス利用者と提供者とのサービスレベルの合意書。
このレベルまでやってくれれば、利用者は満足するという合意書。
Flutter 入門　-textFieldを開いたときにkeyboardを表示しない-

#TextFieldのキーボードを非表示にする
TextFieldを押した際にDialogなどを表示する際にキーボードにfocusがいって面倒だったためキーボードを非表示にする方法を探しました。


#classを作る
```disableFocusNode.dart
class AlwaysDisabledFocusNode extends FocusNode {
  @override
  bool get hasFocus => false;
}
```

#呼び出し元

```
TextField(
                keyboardType: TextInputType.number,
//classの呼び出し
                focusNode: AlwaysDisabledFocusNode(),
                controller: controller,
                onChanged: (value) {},
                style: TextStyle(
                  fontSize: 20.0,
                  height: 1.0,
                  color: Colors.black,
                ),
                onTap: () {},
              ),
```

#まとめ
アプリ制作中にTextFieldを開いた際にキーボードを表示させない方法が知りたかったのでリサーチしました。役に立てばいいねください。

#翻訳、参照元
[参照コード](https://github.com/flutter/flutter/issues/16863)
TableViewでハマったこと

#swift：TableVieｗ

TableViewは設定をミスると一生表示されないどころかAppDelegateで落ちてしまうので要注意です。

<img width="369" alt="スクリーンショット 2019-09-08 8.32.18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472705/d0fca4e1-2ae7-4036-6aac-20cf73947b09.png">

まず普通にstoryboardからTableViewをセットします。

でコードも書いていきます。

```ruby:sample.swift
import UIKit

class ViewController: UIViewController,UITableViewDelegate,UITableViewDataSource {

    let sampleList = ["にんじん","じゃがいも","豚肉","ルー"]
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return sampleList.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell :UITableViewCell = tableView.dequeueReusableCell(withIdentifier: "cell",for: indexPath)
        cell.textLabel!.text = sampleList[indexPath.row]
        return cell
    }
}
```

ソースはこれで特に問題ないですがこれでは何も表示されません。

<img width="450" alt="スクリーンショット 2019-09-08 8.41.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472705/8cb267f6-e10c-0c2d-2b2e-38f1e3ad51ba.png">

ここから設定を変更すれば表示されます。

<img width="370" alt="スクリーンショット 2019-09-08 8.43.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472705/76a8c877-509b-2a38-86bb-d8139d9b3b25.png">

まずここのdataSourceとdelegateの設定をします。
どうするかと言うと、、、

<blockquote class="twitter-tweet"><p lang="und" dir="ltr"><a href="https://t.co/eNTdtobIqX">https://t.co/eNTdtobIqX</a></p>&mdash; Mr.Brooks (@MrBrook27743251) <a href="https://twitter.com/MrBrook27743251/status/1170493677921157120?ref_src=twsrc%5Etfw">September 8, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<img width="452" alt="スクリーンショット 2019-09-08 8.54.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472705/5cd0e008-fd93-a72d-283c-66773feedf14.png">

そして次にIdentifierを設定します。

<img width="925" alt="スクリーンショット 2019-09-08 8.56.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472705/146f926e-e519-0100-9d4f-ecfea6211a35.png">

今回

```ruby:sample.swift
let cell :UITableViewCell = tableView.dequeueReusableCell(withIdentifier: "cell",for: indexPath)
```
withIdentifier: "cell"なのでIdentifierは同じくcellに設定します。

これで表示がされるはずです。

<img width="452" alt="スクリーンショット 2019-09-08 8.59.54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472705/c0783a29-da74-ec1d-b1f2-4b5590c42f78.png">

うまくできました。

設定もした上でソースを書いていくことを忘れないようにしないといけませんね。
C++ Builder 10.2 Tokyo > TeeChart > 系列の描画座標を取得する

```txt:動作環境
RAD Studio 10.2 Tokyo Update 3
TeeChart Standard v2016.17.160129 32bit VCL
```

### 概要

- TeeChartのSeries1の描画座標を取得する
    - SVG出力などに使う

### 実装例

Series1に対する関数を入力補完中に`CalcXPos()`を見つけた。

```Unit1.cpp
void __fastcall TForm1::Button1Click(TObject *Sender)
{
	int len = Series1->Count();

	float xval, yval;
	int xpos, ypos;
	String msg;

	for(int idx=0; idx < len; idx++) {
		xval = Series1->XValue[idx];
		yval = Series1->YValue[idx];
		xpos = Series1->CalcXPos(idx);
		ypos = Series1->CalcYPos(idx);
		msg = String().sprintf(L"%.2f, %.2f at %d, %d", xval, yval, xpos, ypos);
		Memo1->Lines->Add(msg);
	}
}
```

### コード全部

```Unit1.h
//---------------------------------------------------------------------------

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <System.Classes.hpp>
#include <Vcl.Controls.hpp>
#include <Vcl.StdCtrls.hpp>
#include <Vcl.Forms.hpp>
#include <Vcl.ExtCtrls.hpp>
#include <VCLTee.Chart.hpp>
#include <VCLTee.Series.hpp>
#include <VclTee.TeeGDIPlus.hpp>
#include <VCLTee.TeEngine.hpp>
#include <VCLTee.TeeProcs.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:	// IDE で管理されるコンポーネント
	TChart *Chart1;
	TButton *Button1;
	TLineSeries *Series1;
	TMemo *Memo1;
	void __fastcall Button1Click(TObject *Sender);
private:	// ユーザー宣言
public:		// ユーザー宣言
	__fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif

```

```Unit1.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include <memory>
#include <DateUtils.hpp>
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
	Chart1->Series[0]->XValues->DateTime = true;
	Chart1->BottomAxis->DateTimeFormat = L"nn:ss";

	TDateTime dt;

	dt = Now();

	double yval;
	for (int idx=0; idx < 10; idx++) {
		yval = (1+ idx) % 2;
		Series1->AddXY(dt, yval, "", clRed);
		dt = IncSecond(dt, 1);
	}

	//
	Memo1->Lines->Clear();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
	int len = Series1->Count();

	float xval, yval;
	int xpos, ypos;
	String msg;

	for(int idx=0; idx < len; idx++) {
		xval = Series1->XValue[idx];
		yval = Series1->YValue[idx];
		xpos = Series1->CalcXPos(idx);
		ypos = Series1->CalcYPos(idx);
		msg = String().sprintf(L"%.2f, %.2f at %d, %d", xval, yval, xpos, ypos);
		Memo1->Lines->Add(msg);
	}
}
//---------------------------------------------------------------------------
```

### 実行例

![2019-09-08_08h55_58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32870/6c413e88-2990-fab1-29c1-294e406a6ff6.png)
【初心者向け】データ型の整理

#データ型とは

オブジェクトがそのようなデータを表すのかを区別するためのもの。

- 文字列
「””」または「’’」で囲むことによって文字列を定義できる

- 数値
数字を入力して定義できる

##railsのデータ型
[ruby on rails のドキュメント](ActiveRecord::ConnectionAdapters::SchemaStatements)を参照.


| データ型　         | 概要　　      　　  |
|:-----------------|:------------------|
| string           | 文字列(1〜255文字)  | 
| text             | 長い文字列(1〜4294967296文字) |
| integer          | 整数               |
| float            | 浮動小数           |
| numeric          | 数値              |
| datetime         | 日時              |
| time	           | 時間               |
| date	           | 日付               |
| boolean          | 真偽値を保存する変数   |
PulseAudioの音量をコマンドラインから変更する方法

# やりたいこと
キーボードショートカットで音量を変えたかった。

# 環境
ArchLinux上に構築されたXfce4。キーボード押下時にコマンドを実行できる（他のDEでもできる？）。

# 方法
音量を5%上げる

```bash
pactl set-sink-volume @DEFAULT_SINK@ +5%
```

変数 `@DEFAULT_SINK@` に再生デバイスの番号が代入されているらしい

音量を5%下げる

```bash
pactl set-sink-volume @DEFAULT_SINK@ -5%
```

# 参考サイト

参考サイト様のコピペみたいなもんです。
備忘録として...ね？

[コマンドラインからpactlで音量を変更する件に関して - ゆたりんブログ](https://yutarine.blogspot.com/2017/03/pactl-paulseaudio-volume-change.html)
Expo（ReactNative）でSplashの表示時間（消すタイミング）を制御する


expoでsplashの表示を制御したい。

* SplashScreen.preventAutoHide()
* SplashScreen.Hide()

とかを組み合わせてるとできるみたい。詳しくは[こちら](https://docs.expo.io/versions/latest/sdk/splash-screen/?redirected)を。

とりあえず、3秒待ってみる。

>実際はコンテンツのロードとかを待つ感じかと。


componentDidMount()でSplash画面が自動的に消えるのを阻止し、後はお好みのタイミングでSplashScreen.Hide()とする。


```js:App.js
import React from 'react';
import { StyleSheet, Text, View, Image } from 'react-native';
import { SplashScreen } from 'expo';

export default class App extends React.Component {

    //Splashのステータス管理（標準false）
    state = {
        isReady: false,
    }

    //Splashが自動的に消えるのを防止
    componentDidMount() {
        SplashScreen.preventAutoHide();
    }

    render() {
        //ステータスがfalseなら
        if (!this.state.isReady) {
            return (
                <View style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}>
                    <Image
                        source={require('./assets/splash.png')} //いちおうSplashと同じ画像を表示（関係ないみたい）
                        onLoad={this.updateAsync} //読み込みが終わったらCallbackをキック
                    />
                </View>
            );
        }

        //標準画面（Splash後に表示）
        return (
            <View style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}>
                <Text>hoge</Text>
            </View>
        );
    }

    //コールバック
    //3秒待って、splash画面を隠す。そしてステータスをtrueに。
    updateAsync = async () => {
        await sleep(3000);
        SplashScreen.hide();
        this.setState({ isReady: true })
    }
}

//sleepコマンド作成
export const sleep = (sec) => {
    return new Promise(resolve => {
        setTimeout(resolve, sec);
    })
}
```
【YouTube動画で解説】オリジナルWebサービスをYouTubeで紹介してみた【顔出し】

どうも！Hiroyukiです＾＾

今日は、
###ボクが作ったオリジナルWebサービス（下記リンク）
###http://youtubematome.herokuapp.com
の紹介動画をYouTubeに投稿してみましたので、その動画の紹介となります！


#ボクの オリジナルWebサービス を見て下さい！
![IMG_4087.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489124/fbe9a197-9837-69d4-3fa8-1ebdd2a8cceb.png)

###https://www.youtube.com/watch?v=0hOUzMfh0HI
###↑クリックすると、YouTube動画で閲覧


#なぜ動画で解説したのか？

***自分の個人的なサービスを、自分でYouTube動画にアップするエンジニアも少ないと思います。***

なぜ、こんなことをしようと思ったかと言いますと、純粋に
###「ボクのサービスを見て、是非使って欲しかったから」
です。

そもそも、なぜこのサービスを作ったかというと、
###「エンジニア転職を目指し、学習の成果をアピールするため」
なのです！

サービスをリリースして、ふと気づいたのが、
###「サービスを作っても、実際に見られなきゃ意味ねぇええーーーーーー！！」
ということ当たり前のことでした。

ならば、
###「せっかくYouTube関連のサービス作ってるんだし、
###　自分でYouTubeにPR動画出そっか！！（＾O＾）」
と思い立ったが吉日、
***すぐに、動画を撮影→サムネ制作→その日のうちに動画アップロード！***
まで勢いでやっちゃいました（笑）

やってみて
###「動画での成果報告」も良いな〜
と思ったので、また折をみてYouTube動画にてサービス紹介をさせて頂きま〜す！

以下、オリジナルサービス紹介の過去記事です＾＾

###エンジニアになるためのオリジナルサービス完成！【PHPとYouTube Data APIを使って】
###https://qiita.com/Hiroyuki-Hiroyuki/items/2b900eb6103fde021a54
initまとめ(ざっくり)

# initとは

- initは他のプロセスを起動させる役割を持っており、全てのプロセスの親である
- Linuxカーネルの起動後、一番最初に起動される
- PIDは1が付与される

# initの確認

- PIDが1かどうかの確認

```bash
$ ps 1
  PID TTY      STAT   TIME COMMAND
    1 ?        Ss     0:01 /sbin/init maybe-ubiquity
```

- 全てのプロセスの親になっているかどうかの確認

```bash
$ pstree
systemd─┬─accounts-daemon───2*[{accounts-daemon}]
        ├─atd
        ├─cron
        ├─dbus-daemon
        ├─irqbalance───{irqbalance}
        ├─login───bash
        ├─lvmetad
        ├─lxcfs───2*[{lxcfs}]
        ├─networkd-dispat───{networkd-dispat}
        ├─polkitd───2*[{polkitd}]
        ├─rsyslogd───3*[{rsyslogd}]
        ├─snapd───11*[{snapd}]
        ├─sshd───sshd───sshd───bash───pstree
        ├─systemd───(sd-pam)
        ├─systemd-journal
        ├─systemd-logind
        ├─systemd-network
        ├─systemd-resolve
        ├─systemd-timesyn───{systemd-timesyn}
        ├─systemd-udevd
        └─unattended-upgr───{unattended-upgr}
```

# initの種類

|名前|説明|
|:--|:--|
|SysVinit|・最初期のinit<br>・プロセスの起動を並列処理できないといった欠点を持つ|
|launchd|・2005年に登場<br>・macOSで採用されている|
|Upstart|・2006年に登場<br>・SysVinitと完全な互換性を持ちながらも並列処理に対応していた<br>・しかし、プロセスが起動する条件を設定ファイルに記述する必要があり、条件が揃うと無条件で起動/停止されるため、不必要な操作が行われる可能性があった|
|Systemd|・RedHat社のLennart Poettering、Kay Sieversらによって2010年にリリースされた<br>・起動を高速にし、設定をシンプルにすることを設計思想としている<br>・批判的な意見もあったが、2011年頃からFedoraを皮切りに主要なLinuxディストリビューションで採用され始めた<br>・RHEL、CentOS、Debian、Ubuntu、Arch Linux等で採用されている<br>・Upstartと違い、必要なプロセスのみを起動できる作りになっている<br>・並列処理が可能|
|OpenRC|・Gentoo Linuxで採用されているinit|

# SysVinit/Upstartの起動の流れ

- SysVinit/Upstartではサービスと呼ばれる単位で処理を管理している
- 起動の流れとしては、まず`/sbin/init`がPID=1として実行され、その後、`/etc/inittab`によって２つのファイルが実行される
- まず１つ目は、`/etc/rc.d/rc.sysvinit`によってシステムの初期化(ファイルシステムの整合性チェック、マウント処理、スワップの有効化等)が行われる
- そして２つ目は、`/etc/rc.d/rc`によって`/etc/init.d/`以下に存在するファイルが順番に実行され、サービスが起動される
- また、SysVinit/Upstartは`service`コマンドによって操作することができる

# Systemdの起動の流れ

- SystemdはUnit(後述)と呼ばれる単位で処理を管理している
- Systemd環境でも`/sbin/init`は存在するが、大抵は`/lib/systemd/systemd`へのシンボリックリンクとなっている
- 起動の流れとしては、まず`/usr/lib/systemd/systemd`が起動する
- その後、Unitの依存関係を検索し、有効化すべきUnitの一覧が作成される
- 一覧を基に、順序関係に基づいてUnitを順番に有効化する
- 順序関係を持たないUnitは並列に起動処理が行われる
- ちなみに設定ファイルは`/usr/lib/systemd/system`と`/etc/systemd/system`に配置されている
- 前者はシステムが用意したデフォルトの設定ファイルで、後者は管理者がカスタマイズするための設定ファイルである
- 同名の設定ファイルがある場合、`/etc/systemd/system`が優先される
- また、Systemdは`systemctl`コマンドで操作することができる

# Unitとは

- `/usr/lib/systemd/system`と`/etc/systemd/system`以下に配置されているファイルは、拡張子が主に以下の５つのどれかになっており、拡張子によってUnitの種類が判別される

|Unit|説明|
|:--|:--|
|service|サービス(デーモン)|
|target|ターゲット(複数のUnitをグループ化したもの)|
|mount|マウントポイント|
|swap|スワップ領域|
|device|デバイス|

# journald

- journaldはSystemd環境で標準で提供されているログの管理サービスで、システムやサービスのログを収集している
- また、Linuxではrsyslogというログの管理サービスが存在するが、これはjournaldが必要に応じてrsyslogに転送している
- また、journaldは、`journalctl`コマンドで操作することができる