OmniAICreator/Qiita-1.07M huggingface dataset:
OUTLOOK ショートカット

```
Ctrl + R　返信画面へ　
Ctrl + Shift + R　全員への返信画面へ
Ctrl + F　転送画面へ
Ctrl + <　前のメールへ
Ctrl + >　次のメールへ
Ctrl + N　新しいアイテムの起動
Ctrl + Enter　メールの送信
Ctrl + E　メールの検索
Ctrl + Shift + <　フォントサイズを小さく
Ctrl + Shift + >　フォントサイズを大きく

Ctrl + 1　メール画面へ
Ctrl + 2　予定表画面へ
Ctrl + 3　連絡先画面へ
Ctrl + 4　タスクリスト画面へ

Ctrl + Shift + E　新しいフォルダーの作成
Ctrl + Shift + Q　会議画面へ

F12　ファイル名を付けて保存
Alt + F3 クイックパーツの登録
F3 + クイックパーツの挿入

Ctrl + Alt + R　会議出席依頼画面へ
Ctrl + Space　標準書式へ統一
Shift + 右クリック パスのコピー
Ctrl + K　ハイパーリンクの挿入
F7　スペルチェック
Ctrl + F7　辞書登録
Ctrl + Shift + I　受信トレイへ
Ctrl + Shift + O　送信トレイへ
Alt + 数字　クイックアクセスツールバー
Ctrl + Y　フォルダへの移動

Tab　次のマスへ移動
Shift + Tab　前のマスへ移動

Esc 閉じる/止める/クリア

```
vim コメントアウトの自動整形機能をOFFにする

#はじめに
コメントアウトしてある行で改行すると次の行も自動でコメントアウトされるのが鬱陶しいので


# 参考

[こちらをお読みいただくことをお勧めします！](https://amzn.to/2Vd0xRI)

#方法

```:.vimrcに追記
" コメントアウト自動整形機能OFF
autocmd FileType * set comments=
```
propsに配列を渡す記法まとめ

# この記事について
ファンクショナルコンポネントのpropsに配列を渡す記法をまとめました。

#### ファンクショナルコンポネントは、
statelessなコンポーネントを作りたい時に使います。

[【Qiita】【React】ファンクショナルコンポーネント(functional component)の記法まとめ](https://qiita.com/Hai-dozo/items/2b1c3c69e80abe651f28)
ここにベーシックなファンクショナルコンポネントの記法ついてまとめました。

# この先のコードについて、
ファンクショナルコンポネントはfunctionとアロー関数を使って作成することができ、
constで宣言した変数でも受け取れますし、class構文で受け取ることもできます。

- 1, 2 はファンクショナルコンポネントをfunctionとアロー関数を使って作成して、**constで宣言した変数で受け取ったときの記法**

- 3, 4 はファンクショナルコンポネントをfunctionとアロー関数を使って作成して、**class構文で受け取ったときの記法**

という風にまとめました。

# constで宣言した変数で受け取ったときの記法

## 1. function作成したファンクショナルコンポネント
```React
function List1(props){
  return <p>{props.tasks.join(', ')}</p>;
}

const ToDo1 = <p><List1 tasks={[ 'Windows', 'MacOS', 'Android' ]} /></p>;

ReactDOM.render(ToDo1, document.getElementById('todo1'));
```

アウトプット↓

```
Windows, MacOS, Android
```


## 2. アロー関数で作成したファンクショナルコンポネント
```React
const List2 = (props) => {
  return <p>{props.tasks.join(', ')}</p>;
}

const ToDo2 = <p><List2 tasks={[ 'Ruby on Rails', 'React', 'Flask' ]} /></p>;

ReactDOM.render(ToDo2, document.getElementById('todo2'));
```

アウトプット↓

```
Ruby on Rails, React, Flask
```

# class構文で受け取ったときの記法

## 3. functionで作成したファンクショナルコンポネント
```React
function List3(props){
  return <p>{props.tasks.join(', ')}</p>;
}

class ToDo3 extends React.Component{
  render(){
    return(
      <p><List3 tasks={[ 'Python', 'Ruby', 'JavaScript' ]} /></p>
    );
  }
};

ReactDOM.render(<ToDo3 />, document.getElementById('todo3'));
```

アウトプット↓

```
Python, Ruby, JavaScript
```


## 4. アロー関数で作成したファンクショナルコンポネント
```React
const List4 = (props) => {
  return <p>{props.tasks.join(', ')}</p>;
}

class ToDo4 extends React.Component{
  render(){
    return(
      <div>
        <List4 tasks={[ 'Kanban', 'Scrum', 'Waterfall' ]} />
      </div>
    );
  }
};

ReactDOM.render(<ToDo4 />, document.getElementById('todo4'));
```
アウトプット↓

```
Kanban, Scrum, Waterfall
```
Docker + NGINXにログインする方法

# Docker Compose で起動したNGINXにターミナルでログインする方法について明記します。

まず、作成済みのコンテナイメージをビルドして、コンテナイメージを起動します。
docker-compose ～を実行できるディレクトリは、 docker-compose.yml(Composefile)のある場所です。

```qiita:Terminal(コンテナイメージのビルドと起動)
$ docker-compose build
$ docker-compose up -d
（下記コマンドの様に省略可）
$ docker-compose up -d --build
```
と入力します。

イメージ起動後、ps コマンドでイメージの起動状態を確認します。
（「指定されたパスが見つかりません。」は気にしなくていいです。）

```
$ docker-compose ps
指定されたパスが見つかりません。
 Name                Command              State           Ports
------------------------------------------------------------------------
nginx     nginx -g daemon off;            Up      0.0.0.0:80->80/tcp
php-fpm   docker-php-entrypoint php-fpm   Up      0.0.0.0:9000->9000/tcp
```

Name の列に「nginx」と「php-fpm」という名前のイメージが起動していることが分かります。
State が「Up」となっていれば、起動中です。「Exit」となっている場合は、停止しています。

では、本題のログインコマンドは以下の様になります。

```
$ docker exec -it nginx /bin/sh
/ # 
```

ログアウトは exitコマンドを実行すればいいです。
以上です。
pointer-events: none と cursor: not-allowed を同時に使う

# やりたいこと
一部機能の提供廃止に伴い、既存のボタンをクリックできないようにする。
また、そのボタンがクリックできないことを視覚的にもわかりやすくしたい。

# 最初に調べたこと/やったこと
- ボタンのクリックをできなくする
    - `pointer-events: none`というCSSを使えば一発らしい。（JSかなんかでやると思ってた）
- クリックできないことを視覚的にわかりやすくする
    - `cursor: not-allowed`というCSSを使う。

そして最初に書いたコードがこちら。

``` html
<style>
.done {
    pointer-events: none;
    cursor: not-allowed;
}
</style>

<button class="done">実行</button>
```

しかし、これだとクリックはできないけどポインターは通常通り、、、
つまり、`cursor: not-allowed;`が効いてない。
CSSを指定する順番かな？って入れ替えてみたけど、結果は変わらず。

# 修正後

上記の通り、なかなかできず苦戦しましたが、色々調べて最終的に成功したソースコードがこちら。

``` HTML
<style>
.done {
    cursor: not-allowed;
}
.done button {
    pointer-events: none;
}
</style>

<div class="done">
    <button>実行</button> 
</div>
```

どうやら、親要素を作ってCSSを別の要素につける必要があるらしいです。
そんなん自力じゃたどり着けない、、、

# レビュー後

最終的にこんな感じのコードになりました。
他にもいろいろなCSSをつけましたが、社内のガイドラインなので最低限の雰囲気が伝わる感じで、、、

``` HTML
<style>
.done {
    cursor: not-allowed;
}
.done button {
    pointer-events: none;
    opacity: 0.4;
}
</style>

<div class="done">
    <button>実行</button> 
</div>
```

そう、もうボタンの透明度を変えて一目でクリックできないことが分かるようにしてしまうという。
`cursor: not-allowed;`を使うまでもなくわかりやすい方法がありました。

# 参考
- https://stackoverflow.com/questions/46665625/how-to-combine-cursor-not-allowed-and-pointer-events-none
flaskをつかってrequests でオブジェクトを送りたいとき

## 概要
**python**のウェブフレームワーク**flask**でサーバーを立てて、**立てたエンドポイントに向かって何かオブジェクト**(例えば文字列とか、リストとか、自作クラスのオブジェクトとか)**を送りたいときの話**。

毎回忘れてしまうことも多いと思うので、ここにまとめておきます。

## 忙しい人への結論
**送る側**は、
1. 送りたいものを文字列にして、
2. ディクショナリに入れて、
3. ```json.dumps()```

して送るのが一番（自分は）楽だと思います。

**受け取る側**は、データを受け取って、送る側がした作業を逆からやります。
1. ```request.data``` でデータの受け取り
2. ```json.loads()``` で文字列からディクショナリに戻す。
3. ディクショナリから値を取り出す。
4. 値を元の型に戻す。

## やりかた
流れはこうなります。概要です。
最終的にオブジェクトを文字列にして、その文字列をdictに入れて、json.dumpsしてから送る方法をよく使っています。

```送る側.py

〜〜〜〜
送りたいもの = something

case1 isinstance(送りたいもの, 何らかのクラスオブジェクト):　## もし送りたいものがオブジェクトのとき
    if 送りたいもの　can be binalized: ## もしオブジェクトがバイナリにできるとき
        'pickle.dumps()でオブジェクトをバイナリ(byte)にしましょう。'
        my_binary = pickle.dumps(送りたいもの)
        GO_TO case2

    else: ## もしオブジェクトがバイナリにできないとき
        'なんらかの方法でバイナリにするか、自作のclassオブジェクトの場合、
         シリアライズ関数を書く必要があります。たとえば、クラスがもつメンバ変数を全てディクショナリに書き出すような関数です。たとえば、to_dict()関数を実装する。'
        my_binary = 送りたいもの.to_dict()
        GO_TO case4

case2 isinstance(送りたいもの, byte): ## もし送りたいものがbyteのとき
    '送りたいものをbase64.b64encode()で文字列化しましょう。'
    my_str = base64.b64encode(送りたいもの)
    GO_TO case3

case3 isinstance(送りたいもの, str): ## もし送りたいものがstr（文字列）のとき
    'ディクショナリに入れましょう。'
    my_dict = {"my_object": 送りたいもの}
    GO_TO case4


case4 isinstance(送りたいもの, dict): ## もし送りたいものがすでにdictのとき
    '送りたいものを json.dumps()したら、準備完了です。'
　　 送りたいもの = json.dumps(送りたいもの)
    EXIT_CASE



assert type(送りたいもの) = 文字列(str), '最初に戻ってください。'

## print(送りたいもの)
## >>> '{"my_object": my_value}'

requests.post(url="<送り先のエンドポイント>", 送りたいもの,
                  headers={'Content-Type': 'application/json'})
```


```受け取る側.py

〜〜〜〜
@app.route('/receive')
def receive():
    data = request.data ## post で送られてきた「送りたいもの」はrequest.dataで受け取れます。
    data = json.loads(data)['my_object'] ## まずはjson.loadsでディクショナリにもどして、
## keyがmy_objectの値(文字列になっている送られてきたもの)を受け取ります。

    if dataをバイナリ(byte)に戻したいとき: 
        'data をbase64.b64decode()でbyteにデコードしましょう。'
        data2 = base64.b64decode(data)
        
    elif dataをクラスオブジェクトに戻したいとき:
        if もしpickle.loadsで戻せるとき:
            data3 = pickle.loads(data2)
        else もし自作クラスのオブジェクトなどで、pickleが使えないとき:
            '自身でdeserialization関数、dict_to_obj()のような関数を実装して、元のクラスオブジェクトに戻しましょう'
            data3 = dict_to_obj(data2)


```


## まとめ
今回は、flaskで立てたエンドポイントに向かってなにかオブジェクトをpostするときのやり方をまとめました。


今回はこの辺で。

おわり。
AI 株価予測ー新値３本　Stock Price AI Forecast - Three Line Break

https://randomwalkjapan.blogspot.com/2020/01/ai-stock-price-ai-forecast-three-line.html

新値３本をAI予測するツールを作って見た。なぜ、新値３本か？ Made AI tool to forecast three line break. Why three line break?
![3LBMUFG.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373401/ee88945e-4f09-1407-c369-90ddc43817be.jpeg)

注）この投稿はあくまで実験ベースです。計算結果に基づく実際の投資は一切行わないでください。
Caution) This article is for experiment only.  Never make any actual investment based on the result.

株価を予測するAIは多く発表されている。しかし、ARIMAモデルなど自己相関に基づくモデル、オシレーター系のテクニカルチャートを使ったモデルなど、いずれも時間軸に縛られたモデルが殆どで、位相の伸縮に対応できないのが難点だ。Lots of AI systems out there to forecast stock price. However, most of them are bound to time axis such as ARIMA model, based on auto-correlation or oscillator based technical chart models, hence they cannot cope with extension or shrinkage of phase.

一方、新値３本は時間軸を無視して値動きのみを捉えたテクニカルチャートだ。過去３回の新値が否定された場合方向が逆転する。上図はTSE東証 8306 MUFG (株)三菱ＵＦＪフィナンシャル・グループの新値３本チャートだ。ロウソク足チャートと比べ、かなりすっきり特徴だけが抽出されている。Meanwhile, three line break ignores time axis but focus only on price movement. Denial of last 3 line revert the direction. Picture above shows three line break on TSE 8306 MUFG. Looks much simpler depicting characteristics, compared to original candle stick chart.

このAIでは、2001年から現在までの日次の株価をベースにニューラルネットを教育する。新値３本の過去N本分（初期値は20）の値幅から、つぎの新値の値幅を予測する。厳密は逆転は考慮せず、方向性を見る。学習時間がかなりかかるため、エポックの初期値は３としてあるが、運用時は100位ないと収束しない。This AI train neural net based on daily stock price movement from yr 2001. Forecast next line break from previous N(default is set as 20) three line breaks.  Strict reversion is not considered but look for direction. Due to long run time, initial epoch is set as 3 but need to set to 100 for actual use.

すべてJavascript(github here)であなたのマシン上で実行される。WebGLがデフォルトで起動するので、強力なGPUがあるマシンの方が有利だが、なくても十分動作する。All run on your machine by Javascript(github here). WebGL will run on default, hence powerful GPU has advantage however, even if you do not have, it runs pretty ok.
Railsチュートリアル 第14章 ユーザーをフォローする - Relationshipモデル - Relationshipのバリデーション

# Relationshipに対するバリデーションのテスト

Relationshipモデルを生成した時点で、Relationshipモデルに対するテストである`test/models/relationship_test.rb`も生成されました。`test/models/relationship_test.rb`の内容は、以下のような内容とします。

```ruby:test/models/relationship_test.rb
require 'test_helper'

class RelationshipTest < ActiveSupport::TestCase

  def setup
    @relationship = Relationship.new( follower_id: users(:rhakurei).id,
                                      followed_id: users(:mkirisame).id)
  end

  test "should be valid" do
    assert @relationship.valid?
  end

  test "should require a follower_id" do
    @relationship.follower_id = nil
    assert_not @relationship.valid?
  end

  test "should require a followed id" do
    @relationship.followed_id = nil
    assert_not @relationship.valid?
  end
end
```

# Relationshipモデルに対するバリデーションの追加

Relationshipモデルに対し、「有効なレコードの`follower_id`と`followed_id`は、`nil`や空文字列(`""`)であってはならない」というバリデーションを追加します。

```diff:app/models/relationship.rb
  class Relationship < ApplicationRecord
    belongs_to :follower, class_name: "User"
    belongs_to :followed, class_name: "User"
+   validates :follower_id, presence: true
+   validates :followed_id, presence: true
  end

```

# Relationship用のfixtureの内容

Relationshipモデルとともに生成されたfixtureの内容では、マイグレーションで定義した一意性制約を満たすことができず、テストがうまくいきません。そのため、当該fixtureの内容は、さしあたって空にする必要があります。

```yaml:test/fixtures/relationships.yml
# 空にする
```

# この時点における、Relationshipモデルに対するテストの結果

* UserモデルおよびRelationshipモデルの内容の定義
* Relationshipモデルに対するテストの内容の定義
* Relationshipモデルに対するバリデーションの追加
* Relationshipモデルのテストに対するfixtureの内容削除

以上が終わった時点で`test/models/relationship_test.rb`に対するテストを実行すると、テストは成功するはずです。

```
# rails test test/models/relationship_test.rb
Running via Spring preloader in process 114
Started with run options --seed 16416

  3/3: [===================================] 100% Time: 00:00:01, Time: 00:00:01

Finished in 1.08988s
3 tests, 3 assertions, 0 failures, 0 errors, 0 skips
```

無事テストが成功しました。
Railsチュートリアル 第14章 ユーザーをフォローする - Relationshipモデル - User/Relationshipの関連付け

# 基本は`has_many`と`belongs_to`

User/Relationshipの関連付けは、以下の条件が基本となります。

* 1人のユーザーには1対多(`has_many`)のリレーションシップが存在する
* 当該リレーションシップには、フォローしているユーザーとフォローされているユーザー両方が属する(`belongs_to`)

最終的には、「`user`と`active_relationship`に関して以下のようなメソッドが使えるようになる」というのが完成像です。

* `active_relationship.user`
* `user.active_relationships`
* `user.active_relationships.create(followed_id: ...)`
* `user.active_relationships.create!(followed_id: ...)`
* `user.active_relationships.build(followed_id: ...)`
* `user.active_relationships.find_by(id: 1)`

# 「モデル名と関係名が異なる」という要件

しかしながら、今回は「Relationshipモデルに対して`active_relationship`（ならびに`passive_relationship`）という関係性を定義する」というのが要件です。1対多の関係の多側において、モデル名と関係名が異なります。

「モデル名と関係名が異なる」という要件の存在ゆえに、Userモデルにおける`has_many`、およびRelationshipモデルにおける`belongs_to`の記法は、モデル名と関係名が同じ場合とは異なります。

## 1対多の1側において、多側のモデル名と関係名が異なる場合の`has_many`の書き方

まずはUserモデルにおける`has_many`の書き方についてです。

```diff:
- has_many :active_relationships
```

上記のような書き方では、`active_relationships`という関係性を正しく定義できません。「ActiveRelationshipモデルを参照しようとしてしまい、Relationshipモデルを参照できない」ためです。「Relationshipモデルを参照する」ということを、`has_many`に明確に渡さなければなりません。

「特定のモデルを参照する」ということを`has_many`に渡すためには、`class_name`というオプションハッシュに、当該モデルのクラス名を文字列として渡せばOKです。Relationshipモデルのクラス名は`"Relationship"`なので、今回の事例の場合、`has_many`の書き方は以下のようになります。

```ruby:
has_many :active_relationships, class_name: "Relationship"
```

## 1対多の多側において、外部キー名と対応するモデル名が異なる場合の`belongs_to`の書き方

続いてはRelathionshipモデルにおける`belongs_to`の書き方についてです。前提条件は以下です。

* `active_relationship`という関係性は、`relationships`テーブルの`followed_id`カラムに紐付けしたい
* `followed_id`は外部キーであり、その参照先はUserモデルの`id`カラムである

このような関係性をRelationshipモデルに定義したい場合、`belongs_to`の書き方は以下のようになります。

```ruby:
belongs_to :followed, class_name: "User"
```

Relationshipモデルの`followed_id`に関係性を紐付けるので、第1引数に与えるシンボルは`:followed`となります。

オプションハッシュ`class_name`に、参照先モデルのクラス名を文字列として与えています。Userモデルのクラス名は`User`であるため、今回だと`"User"`という文字列である…という次第ですね。

# 上記を踏まえ、UserモデルおよびRelationshipモデルに必要な変更の全体像はどうなるか

## Userモデルに必要な変更の全体像

```diff:app/models/user.rb
  class User < ApplicationRecord
    has_many :microposts, dependent: :destroy
+   has_many :active_relationships, class_name: "Relationship", foreign_key: "follower_id", dependent: :destroy
    ...略
  end
```

第1引数の`:active_relationships`と`class_name`オプション、`foreign_key`オプションの説明は上記のとおりです。ユーザーが削除されたら関連するリレーションシップも削除されるべきであるので、`dependent: :destroy`というオプションを与えています。

## Relationshipモデルに必要な変更の全体像

```diff:
  class Relationship < ApplicationRecord
+   belongs_to :follower, class_name: "User"
+   belongs_to :followed, class_name: "User"
  end
```

`belongs_to :follower`のほうは、あとで実装する「受動的関係(`passive_relationship`)で用いる準備としての実装であり、現時点で直ちに使うものではありません。

# これらの実装により使えるようになるメソッド

ここまでの実装により、`active_relationships`に関する以下のメソッドを使えるようになります。

メソッド|用途
------|------
`active_relationship.follower`|フォロワーを返す
`active_relationship.followed`|フォローしているユーザーを返す
`user.active_relationships.create(followed_id: other_id)`|`user`と紐付いた能動的関係を作成し、RDBに保存する（失敗時に`nil`を返す）
`user.active_relationships.create!(followed_id: other_id)`|`user`と紐付いた能動的関係を作成し、RDBに保存する（失敗時にエラーを返す）
`user.active_relationships.build(followed_id: other_id)`|`user`と紐付いた新しいRelationshipオブジェクトを返す（この時点ではRDBには保存されない）
超かどうかは別としてpythonかなり初級編。ファイル操作が嫌いすぎる件。

#記事の目的
pythonに限らないが、**ファイル操作が嫌いすぎる**ため、ファイル操作を少しやってみる。
ここでのファイル操作は、ファイルを開く、書く、閉じる、のレベル。

とりあえず、
第三者がみて意味のある記事になるには、少し、時間がかかると思う。

#ファイル操作をやってみる。

## step1

以下のようなコードを実行した。

```file_step1.py
f1 = open('testfile1.txt')
f1.write(123)
f1.write(456)
f1.close


```

以下のように、叱られた。

```python
C:\_temp_work\fileA>python file_step1.py
Traceback (most recent call last):
  File "file_step1.py", line 2, in <module>
    f1.write(123)
TypeError: write() argument must be str, not int

C:\_temp_work\fileA>
```

上記は、余計な誤りだが、誤りを修正。

```file_step1a.py
f1 = open('testfile1.txt')
f1.write('123')
f1.write('456')
f1.close
```

また、叱られた。

```python
C:\_temp_work\fileA>python file_step1a.py
Traceback (most recent call last):
  File "file_step1a.py", line 2, in <module>
    f1.write('123')
io.UnsupportedOperation: not writable

C:\_temp_work\fileA>


```

修正した。

```file_step1b.py
f1 = open('testfile1.txt', mode='w')
f1.write('123')
f1.write('456')
f1.close

```

今度は、問題なし。

```python
C:\_temp_work\fileA>python file_step1b.py

C:\_temp_work\fileA>

```

testfile1.txt
ができて。

その中身は、

```testfile1.txt
123456
```

問題なし。

では、バイナリに興味があるので、
**mode='wb'としてみた。**

```file_step2.py
f1 = open('testfile1.txt', mode='wb')
f1.write('123')
f1.write('456')
f1.close


```

また、叱られた。

```python
C:\_temp_work\fileA>python file_step2.py
Traceback (most recent call last):
  File "file_step2.py", line 2, in <module>
    f1.write('123')
TypeError: a bytes-like object is required, not 'str'

C:\_temp_work\fileA>
```

#今後
つづく。
platformioでesp-idfを使おうとしたらapp_main()がないって怒られた話

PlatformIOは、多くのマイコンと多くのフレームワークを、同じようなインターフェースで扱うことができる環境であり、IDEだけでなくコマンドラインからでも使えるので、、なかなか便利なツールである。さて、これを使ってESP32で開発を行っているわけだが、ちょっとした問題に行き当たったのでシェアしてみよう。

## I like C++ language

いろいろなプログラミング言語はあるけれど、私が一番手になじんでいるのはC++である。できることならいつもC++を使って遺体、そうも言ってられない局面は多いけど。ということで、今回も無意識にC++を使い始めていた。これが今回の問題なのである。

## やったこと

コマンドラインから以下のように操作した。

```
$ platformio init -b esp32dev
$ sed s/arduino/espidf/g < platformio.ini > platformio.tmp
$ mv platformio.tmp platformio.ini
```

ようするに、esp-idfで新しいプロジェクトを作ったわけである。

続いて、srcディレクトリいかにmain.cppというファイルを置いた。

```` main.cpp
#include <iostream>

int app_main()
{
std::cout << "Hello ESP32 world" << std::endl;
return 0;
}
```` 

これをコンパイルするとエラーになる。

```
Linking .pio/build/esp32dev/firmware.elf
.pio/build/esp32dev/libesp32.a(cpu_start.o):(.literal.main_task+0x18): undefined reference to `app_main'
.pio/build/esp32dev/libesp32.a(cpu_start.o): In function `main_task':
cpu_start.c:(.text.main_task+0x5f): undefined reference to `app_main'
collect2: error: ld returned 1 exit status
*** [.pio/build/esp32dev/firmware.elf] Error 1
```

## なぜエラーになるのか？

esp-idfのスタートアップであるcpu_start.cは、名前が示すようにCで書かれている。ということは、このプログラムからはC++で書かれているapp_main()が見つけられない。シンボル名が違うのだ。CとC++の混在環境を作ろうとすると起こる問題。ならば、

```
extern "C"
```

してやればよい。

```` main.cpp
#include <iostream>

extern "C" {
int app_main()
{
std::cout << "Hello ESP32 world" << std::endl;
return 0;
}
}
```` 

めでたくコンパイルできるはず！
## 追記

platformioを使ってのサンプルであるが、もちろんESP-IDFをそのまま使ってももちろん結果は同じである。
pythonをストレスなく使う！（generatorに詳しくなる2。defで定義できるのは。。。ちょっと。)

#目的
　**pythonをストレスなく使う！**
そのためには、少しでも、理解のレベルを上げる必要あり。
なんでも、こだわって、、、、理解を深める。
ここで記載しているのは、
**generatorに詳しくなる2。defで定義できるのは。。。ちょっと。**です。

pythonを少し勉強はじめて、1年弱、経過。
ほとんど、コードを書いていないので、あまり、レベルアップしていない。
いまだ、
generatorの理解が浅い。

以前、

[pythonをストレスなく使う！（generatorに詳しくなる。since1975らしい。)](https://qiita.com/enoughspacefor/items/524a76fcde2610b9da8a)

に、

>関数内に、「yield」があるだけで、generator関数になる。
なんという、、、定義のされ方、処理方法の変化の大きさ！

と自分で記載しているが、すっかり、忘れていた。

## 今回、記事を書くきっかけ

どこかのサイトで、generatorは、**クラスに近い**という記載をみかけた。
**確かに。。。。**
と思ったので。


#defで定義できるのは。。。ちょっと。


「入門 Python3」オライリー・ジャパン 
に以下のような説明のコードがある。

（出典： 「入門 Python3」オライリー・ジャパン )

```python
>>> def my_range(first=0, last=10, step=1):
...    number = first
...    while number < last:
...        yield number
...        number += step
...
>>> my_range
<function my_range at 0x00000242D74720D0>
>>> ranger = my_range(1, 5)
>>> ranger
<generator object my_range at 0x00000242D70D19A8>
>>>
>>> for x in ranger:
...     print(x)
...
1
2
3
4
>>>

```


以下のあたりが、パンチが強すぎですね。。。
yieldを見落としたら、混乱しますね。。。。

**defで定義できるのは。。。**
**確かに、クラスに近い** <--これが、今回の記事記載の目的

```python
>>> ranger = my_range(1, 5)
>>> ranger
<generator object my_range at 0x00000242D70D19A8>
>>>
```


#まとめ
generatorをうまく使おうと思います。


#関連（本人）
## 直接関係するもの
[pythonをストレスなく使う！（generatorに詳しくなる。since1975らしい。)](https://qiita.com/enoughspacefor/items/524a76fcde2610b9da8a)

## 直接はあまり関係ないもの
[pythonをストレスなく使う！（Pythonでは、すべてがオブジェクトとして実装されている)](https://qiita.com/enoughspacefor/items/0c6118da4c228226a65f)
[pythonをストレスなく使う！（Pylintに寄り添う)](https://qiita.com/enoughspacefor/items/df692b27bb58ca1ffa1d)
[pythonをストレスなく使う！（ExpressionとStatement)](https://qiita.com/enoughspacefor/items/1a11f553c265a2c703f2)
[英語と日本語、両方使ってPythonを丁寧に学ぶ。](https://qiita.com/enoughspacefor/items/d4b49747773e2d0285f9)

#今後
コメントなどあれば、お願いします。:candy:
勉強します、、、、
（勉強というより、コードを書くスキルを身に着けたほうがいい気がしてます。）
続Raspberry Pi 4B Rev 1.2 は USB Type-C電源問題の夢を見るか?

## 【前文】
[Raspberry Pi 4B Rev 1.2 は USB Type-C電源問題の夢を見るか?](https://qiita.com/god19/items/c327f6d94ac84eff7003 "Raspberry Pi 4B Rev 1.2 は USB Type-C電源問題の夢を見るか_ - Qiita") の続き。

相変わらず公式からの発表はないけど、Rev 1.2 = USB Type-C電源問題対応版で FA っぽい。実際に検証した情報も上がってきているし。
そんな訳で自分も PowerDelivery対応 USB電源で起動を確認してみた。
問題なし。

## 【確認した電源】
| 種別 | 型番 | URL |
| ---- | ---- | ---- |
| ACアダプタ | 0602PQA | http://onlineshop.au.com/disp/CSfLastGoodsPage_001.jsp?GOODS_NO=7462 |
| モバイルバッテリ | L-M20CP-W | https://www.lmt-inc.jp/products/lazos_37.html |
Spring Fox+Swagger UIでAPI仕様書を表示した時に出る警告を消す

# 環境

Spring Boot 2.2.3.RELEASE - 2.2.4.RELEASE
Spring Fox 2.9.2
Kotlin 1.3.61
Gradle

環境は以下の記事のまんま

https://qiita.com/ShassBeleth/items/3f3afca83b8ef0b98ede

# 状況

こんな感じにControllerにswaggerのアノテーションをバリバリつけてAPI仕様書に必要なコメントをつらつら書いていく

```WarningSampleController.kt
package com.example.spring.boot.web.controller.spring.fox.example

import io.swagger.annotations.*
import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.PathVariable
import org.springframework.web.bind.annotation.RestController

@Api(
        tags = ["API仕様書表示時の警告確認用API"] ,
        description = "デフォのままだと警告が出る／対応の確認用API"
)
@RestController
class WarningSampleController {

    @ApiOperation(
            value = "サンプル文字列取得API" ,
            notes = "パスパラメータから文字列を受け取ってそれを出力するサンプルAPI"
    )
    @ApiResponses(
            ApiResponse( code = 200 , message = "サンプル文字列" , response = String::class )
    )
    @GetMapping( "/warning-sample/{param}")
    fun getSample(
            @ApiParam( value = "パスパラメータから受け取る数値" , required = true )
            @PathVariable( "param" )
            param : Int
    ) = "Hello Sample$param"

}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/195499/7d08ce5a-55a4-1f39-df96-b91eb590ba58.png)

出力されたページもいい感じ

# 問題点

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/195499/bb0a8076-5bef-df19-05f6-4362ff315f1f.png)

ページを開いた段階でエラーが出る

どうやらURLにある文字列をIntに変換できてない様子

# 解決策

Spring FoxのGitHubにもIssueが上がってた
https://github.com/springfox/springfox/issues/2265

Spring Foxが依存してるライブラリの問題っぽい

だから、GradleでSpring Foxのライブラリを入れるときに、
勝手に入ってくる依存ライブラリを取り除いて、別バージョンを追加する

```build.gradle.kt
dependencies {
	implementation("io.springfox:springfox-swagger2:2.9.2") {
		exclude(module = "swagger-annotations")
		exclude(module = "swagger-models")
	}
	implementation("io.swagger:swagger-annotations:1.5.21")
	implementation("io.swagger:swagger-models:1.5.21")
	implementation( "io.springfox:springfox-swagger-ui:2.9.2" )
}
```

これで警告も出なくてスッキリ！！！
RailsでFormオブジェクトを使おう

# MVCを学んだ初心者にありがちな悩み

## コントローラーに全ての処理を書くことでコードが読みづらくなる
## モデルのメソッドが複雑になりすぎてしまう(Fat Model)

# Formオブジェクトを使うメリット
## Controllerがすっきりする
## Form内で複数のモデルがあっても大丈夫
JavaScriptで既存のメソッドの呼び出しをフックする

デバッグやアドオン開発において、
> 「既存のメソッドが呼ばれたタイミングで何かをしたい。ただし、イベントは実装されていない。」
> 「既存のメソッドの処理内容を置き換えたい。」

というケースはあるがと思います。

JSはメソッドもオブジェクトのメンバでしかないので、入れ替えたいメソッドを代入するだけで実現できます。
また、元のオブジェクトのメソッドも呼び出したい場合には、一旦退避させ、メソッドオブジェクトのapplyメソッドを叩くことでコンテキスト（`this`）を指定して実行できます。

```js
let injectAction = function(_this)
{
    console.log(`CONTEXT: ${_this}`);
    console.log(`URL: ${aegments[3]}`); 
}

let base_open = XMLHttpRequest.prototype.open;
XMLHttpRequest.prototype.open = function(method, url, async, user, password)
{
    injectAction(this, arguments);
    base_open.apply(this, arguments);
}
```

上記の例では、XHRによってリクエストされたURLをロギングします。
たとえば、特定のパターンのURLをダウンロードしたときに他のURLに差し替えることで広告ブロッカのようなものが作れそうです。
自分のSpring Boot記事まとめ

# 環境

* Kotlin 1.3.61
* Spring Boot 2.2.2.RELEASE - 2.2.4.RELEASE
* Spring Fox 2.9.2
* Gradle
* IntelliJ

## Spring Boot

開始バージョン2.2.2.RELEASE
そこからバージョン上がるたびに一通り記事に書いたロジックが動くかは確認してるけど
たまに確認できてないバージョンがある
基本RELEASEバージョンしか見てない

### 確認してるバージョン
* 2.2.2.RELEASE
* 2.2.3.RELEASE
* 2.2.4.RELEASE

## Spring Fox

開始バージョン2.9.2
そこから動かしてない


# 目次

## Spring Boot 
#### [Spring BootでWebプロジェクトを作ったりバージョンを変えたり](https://qiita.com/ShassBeleth/items/3f3afca83b8ef0b98ede)
#### [Spring Initializrで作ったWebアプリケーションをJARファイルからやっぱりWARファイルに変えたい](https://qiita.com/ShassBeleth/items/4361f62aab5066a9d6d8)
#### [Spring起動時のロゴをどうにかこうにかする](https://qiita.com/ShassBeleth/items/53eba6f5f984ef53e559)
#### [Spring Bootで作ったアプリの起動時イベント等が書けるらしい](https://qiita.com/ShassBeleth/items/387cdc812d8a0c0d7746)
#### [build.gradle.ktsでdevelopmentOnlyが使えなかった・・・](https://qiita.com/ShassBeleth/items/febbc5d5e613b287d804)
#### [Spring Boot起動させようと思ったらCannotGetJdbcConnectionException](https://qiita.com/ShassBeleth/items/476436b7c81fe81ddbb2)
#### [Spring Boot起動中に出た例外をFailureAnalyzerでつかむ](https://qiita.com/ShassBeleth/items/113e1a2b5703d86d21b5)
#### [【Spring Boot】Getリクエストでも配列受け取りたい](https://qiita.com/ShassBeleth/items/0b8c30cd8e9fe121e86f)
Spring Boot 2.2.4.RELEASEでのみ確認
#### [【Spring Boot】例外とレスポンスを紐づけてエラー処理を簡単にやる](https://qiita.com/ShassBeleth/items/7643aa709b217c40e566)
Spring Boot 2.2.4.RELEASEでのみ確認
## Spring Fox
#### [Spring Fox＋SwaggerでAPI仕様書作成](https://qiita.com/ShassBeleth/items/93edb027648adb80364e)
Spring Boot 2.2.3.RELEASEより確認
#### [Spring Foxの設定を別ファイルに書きたい](https://qiita.com/ShassBeleth/items/40249cba33835710a96c)
Spring Boot 2.2.3.RELEASEより確認
#### [Spring Foxで作ったAPI仕様書に載せたくない非公開APIがあるんだよ](https://qiita.com/ShassBeleth/items/6e8692fbbf718fcf8bef)
Spring Boot 2.2.3.RELEASEより確認
#### [Spring Foxで作ったAPI仕様書にコンテキストパスつけたかったけどついてた](https://qiita.com/ShassBeleth/items/06a6a91669b611c76ffe)
Spring Boot 2.2.3.RELEASEより確認
#### [Spring Fox+Swagger UIでAPI仕様書を表示した時に出る警告を消す](https://qiita.com/ShassBeleth/items/12a0ffd53d54abb27b9e)
Spring Boot 2.2.3.RELEASEより確認
Spring Foxで作ったAPI仕様書にコンテキストパスつけたかったけどついてた

リファレンスにあったからやってみたけどやり方違ったって話

# 環境

Spring Boot 2.2.3.RELEASE - 2.2.4.RELEASE
Spring Fox 2.9.2
Kotlin 1.3.61
Gradle

環境は以下の記事のまんま

https://qiita.com/ShassBeleth/items/3f3afca83b8ef0b98ede

# pathMapping使えばええやんって思ってた

コンテキストパスはapplication.propertiesで指定してるんですよ

```application.properties
server.servlet.context-path=/test
```

`@Value`で拾ってきたプロパティを`pathMapping`に入れればOK

```SwaggerConfig.kt

@Configuration
@EnableSwagger2
class SwaggerConfig {

    @Value("\${server.servlet.context-path:/}")
    private val contextPath : String? = null

    @Bean
    fun configurateApiDocument(): Docket = Docket(DocumentationType.SWAGGER_2)
            .select()
            .apis(RequestHandlerSelectors.any())
            .paths(PathSelectors.any())
            .build()
            .pathMapping(contextPath)
            .
            .
            .
```

`application.properties`からパラメータをとってくるときは`@ConfigurationProperties`を使ったほうがいいっぽいけど、
パラメータ1つしかとってこないから`@Value`でも問題ないかと

`pathMapping`に`null`が入ってくるとまずいから、`@Value`のデフォルト値に`/`を指定しとく

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/195499/b25eb29e-f63f-67bc-b18d-988db532ae5f.png)

いいね

... と思っていたんだけどダメっぽい


### 誤解していたところ

`server.servlet.context-path`の記載があれば、
実は特に何も設定しなくてもコンテキストパスの反映はやってくれてる

よく見るとちゃんとBaseUrlにはコンテキストパスがついてる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/195499/7ae563eb-a9e6-954c-1807-b55499c78359.png)

テスト用のURLが、それぞれのAPIにもコンテキストパスをつけたせいで2つかぶったURLになっちゃってる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/195499/2adde17e-6dcf-94a0-5f7b-731d429a6b52.png)

っていうこともできるよってくらいにしといたほうがいいかも

pathMappingは何に使うんだろう・・・
Spring Foxの設定を別ファイルに書きたい

Spring Foxのリファレンスだとmainに書いてるけど
エントリポイントになるクラス／メソッドにごちゃごちゃ書きたくない！

# 環境
Spring Boot 2.2.3.RELEASE - 2.2.4.RELEASE
Spring Fox 2.9.2
Kotlin 1.3.61
Gradle

環境は以下の記事のまんま

https://qiita.com/ShassBeleth/items/3f3afca83b8ef0b98ede

# アノテーションつければええんやで

```SpringBootExampleApplication.kt
@SpringBootApplication
class SpringBootExampleApplication

fun main(args: Array<String>) {
	SpringApplication(SpringBootExampleApplication::class.java).run(*args)
}
```

エントリポイントじゃなくて

```SwaggerConfig.kt

@Configuration
@EnableSwagger2
class SwaggerConfig {

    @Bean
    fun configurateApiDocument(): Docket = Docket(DocumentationType.SWAGGER_2)
            .select()
            .apis(RequestHandlerSelectors.any())
            .paths( PathSelectors.any() )
            .
            .
            .
}
```

`@Configuration`と`EnableSwagger2`のアノテーションがつけば大丈夫っぽい！
Gulpとは？使う環境を整える

# はじめに
未経験のWeb中級者です。
効率的なWeb制作を実現するために、Gulpを使ったフロントエンドの開発環境の構築方法について学びました。

開発環境：Macでターミナルを使いました。

## Gulpとは
さまざまな処理を自動で行なってくれるタスク自動化ツールで、一度設定しておくと開発の作業効率が図れます。

Gulpはタスクランナーと呼ばれていて、決められたタスクをJavaScripを用いてプログラムすることができます。

### メリット
導入が簡単でプラグインが豊富
タスクランナーはGulpが人気！！


## Gulpでどんな事ができるか
1.JavaScriptのES6+からES5へのトランスパイルが自動化（ESLint連携）
2.SassファイルをCSSファイルに自動でプリコンパイル（node-sass連携）
3.画像のリサイズや圧縮を自動化（GraphicsMagick連携）
4.JavaScriptファイル、CSSファイルのminifyを自動で行える

他、さまざまなプラグインがあるので、やりたいことに合わせてインストールができます。

## 実行する環境を整える
### 1.node.jsをインストール
Gulpが動作する環境はnode.jsがありインストールするとターミナルからJavaScriptを実行できるようになります。使うにはnode.jsにさまざまなモジュール(部品)をインストールして繋ぎ合わせて実行します。
[node.js](　https://nodejs.org/ja/ "https://nodejs.org/ja/")

![screencapture-nodejs-org-ja-2020-01-30-00_28_53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/451241/b5969a2f-5e1b-385e-d168-26f019d3a3f8.png)
LTS(長期間サポートが保証されているバージョン)を選び


```terminal:Tarmnar
npm -v
```

↑ターミナルで入力してインストール。


```terminal:Tarmnar
npm -v
v6.9.0
```
↑こちらが出たらOK。

私は、エラーが出てしまい...こちらを参考にして解決しました！
[npmでpermission deniedになった時の対処法](　https://qiita.com/okohs/items/ced3c3de30af1035242d"npmでpermission deniedになった時の対処法")

###2.yarnをインストール
yarnはパッケージ管理ツールでnode.jsにインストールするモジュールの管理を行います。
![screencapture-legacy-yarnpkg-ja-docs-install-2020-01-30-00_47_20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/451241/aea4d969-2e05-f5a2-20df-2eef467913c1.png)

```terminal:Tarmnar
npm install -g yarn
```

↑ターミナルで入力してインストール。

```terminal:Tarmnar
yarn -h
```
↑インストールできているか確認。
インストールした内容が出ればOK。

###3.Gulpをインストール
Gulpをインストールするにはターミナルを使います。
node.jsをインストールした時にnpmというパッケージ管理ツールが一緒にインストールされていますが、yarnの方が高速なのでこちらを使っていきます。


![screencapture-gulpjs-2020-01-30-01_24_31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/451241/11c285d1-d717-a555-0908-3d63b49c350c.png)

####1.プロジェクトフォルダーを用意
私の場合はtestフォルダの中に以下のファイルを準備しました。
<img width="199" alt="スクリーンショット 2020-01-30 1.46.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/451241/ef7d75c8-2a7b-db4b-e94c-9821ff8cf12f.png">

####2.globalをインスストール


```terminal:Tarmnar
yarn global add gulp-cli
```
globalをターミナルに付けることによって、このプロジェクト以外からでも使えるようになりnode.jsで使うモジュールをインストールする事ができます。

※ターミナルでフォルダ内に移動していないとエラーが出てしまいます。
cdと打ってからファイルごとドラック&ドロップして移動すると簡単です。

####３.プロジェクト内の設定・初期化・確認

```terminal:Tarmnar
yarn init -y
```
↑ターミナルで打つと、package.jsonというnode.jsの設定ファイルがtestフォルダ内に作成されます。こちらにモジュールが追加されて情報が管理されます。

<img width="418" alt="スクリーンショット 2020-01-30 2.11.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/451241/69d38df4-b0bf-bcdf-e6cd-e214684bd210.png">

```terminal:Tarmnar
yarn add gulp --dev
```
↑ターミナルで打つとgulpのインストールが完了！
package.jsonの中身に"devDependencies": {"gulp": "^4.0.2"と追加されていればOK。

また、testフォルダ内にyarn.lock（ファイル）とnode_modules（フォルダ）もインストールされているかを確認してください。

yarn.lock→インストールされた状況を記載
node_modules→沢山のモジュール達が格納されている

```terminal:Tarmnar
 gulp --help
```
↑インストールされていいるかを確認できます！


##最後に
無事に環境を整えられました！
次回は、基本的な文法を学ぼうと思います。

Gulpについては、こちらの記事も参考になります。
[https://flex-box.net/gulp/](　https://flex-box.net/gulp/ "https://flex-box.net/gulp/")
Vim scriptの変数にスコープ別の色を付けるプラグインを作成した

# はじめに

Vim9 scriptが本体にマージされてスコープ事情がややこしくなって来ましたので、視覚的な判別をしやすくするためにスコープ別に色を付けるプラグインを作成しました。

[wordijp/vim-vimscript-scope-syntax](https://github.com/wordijp/vim-vimscript-scope-syntax)

vim-plugをお使いの方は以下をvimrcに追加して:PlugInstallでインストールするだけで動きます。

```vimscript
Plug 'wordijp/vim-vimscript-scope-syntax'
```

# デモ

カラースキーム slate での比較です。
適用前はすべての変数が同じ色になっているため、Vim scriptへの慣れが必要です。
![demo_desert_before.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51728/d7e777a2-59f3-70c0-0e8d-1d51078b2d3e.png)

こちらが、下のようにスコープ別に色が付きます。
![demo_desert_after.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51728/a068a4b3-1cd0-5900-57c5-4566cec69f92.png)

Vim9 scriptでは文法が若干変わったため、それらへの対応がまだとなっています。
少し触ったところまだバグがあるようでしたので[^1]、落ち着いたころに対応しようかと思います。

[^1]: インクリメント・デクリメントがREADME.mdには追加されたが出来なかったり、変数 i を使うとエラーが発生したり。

# Vim9 script登場によるスコープ事情について

Vim9 scriptでは、ローカルスコープの変数に接頭辞 `l:` が不要になっていたり、演算・代入の際に `let` が不要になっています。
その為すべての変数にスコープ別の接頭辞を付けるわけにはいかなくなり、現在のスコープから変数がどのスコープに属しているかを意識する必要が若干出てきました。
関数の外で `s:` を付けずにグローバルスコープにしてしまうのは初心者の頃によくやりがちですが[^2]、今後は接頭辞付きで統一するわけにはいかなくなり、接頭辞無し変数を使う機会が増えてくるかと思います。

[^2]: すぐに慣れるとは思います。

# スコープ別の色付けについて

色は、グローバル(g:)、スクリプト(s:)、ローカル(l:)、引数(a:)の4種類と、それ以外の特殊系(b:、 w:、 t:、 v:)を同じ色にした計5種類を設定していますが、それぞれの色は現在のカラースキームから自動生成をしています。
こだわりポイントとしては、4種類を寒暖色にして、グローバルとスクリプトは寒色、ローカルと引数を暖色にする事により、画面全体が暖色に近づくほど変数のスコープが狭くなっていると判断できるようにしてみました。

# おわりに

Vim9 scriptにはまだバグがあるようですので、仕様が落ち着いたら改めて修正しようかと思います。
超使いやすい掲示板を作りたい

Qiitaをいつものように見ていたら、次のような記事を見つけた。


超使いやすい掲示板を無料かつ一時間で作ってみた　（「東大生用のBBS」と「京大マップ掲示板」の避難所を作成しました）
https://qiita.com/utokyobbs/items/ab15ae39698475e0bac7


この記事を読んでて気が付いたのだが、ここで使ってる掲示板は昔に俺が作ったやつだった。
6年も前に作ったプログラム。もう放棄したもので、今となっては黒歴史的な恥ずかしさ。


自分の作品集として「掲示板」は必要なポートフォリオ。
それがあれでは納得がいかないと常々思っていましたが、最近になって一念発起して、新しい掲示板を作り始めた。

その成果がこれ。

![9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70356/ae61ce11-e85d-259f-cc80-ea36bc0deec6.png)

知っている人なら一目瞭然ですが「かちゅ～しゃ」です。

(自分にとって)超使いやすい掲示板を考えると、使い慣れた2chブラウザをそのままブラウザ上で再現すれば良いことに気付いたので、このデザインとなりました。

再現性を重視するあまり、フォントを``MSPゴシック``で決め打ちしてたりしてWindows以外は考えていないので、webアプリとしてはいかがなものと思いつつ、これ以上のものは作れないし、葛藤なのです。
LINQ使ったら勝手にインデクサが生える

#ElementAtOrDefaultは勝手にインデクサになるよ。
日々レガシーコードと戦いつつ、やっとLINQが普及しはじめたかという弊社。
先日レビューでこのようなコードに出くわしました。
For Each使えとかは言わないでください。

```vb
' stringsは適当な文字列コレクション。
Dim sorted = strings.OrderBy(Function(s) s.Length)

For i = 0 To sorted.Count - 1

    Dim item = sorted(i)
    ' 略

Next
```

初見で「HAHAHA、IOrderdEnumerableにDefaultプロパティは無いよ。せめてコンパイルの通るコードを出してくれたまえ。」と突き返そうとしました。
ところが聞くと、コンパイルどころかテストも通っているというではないですか。

この手の「なぜか動いてしまうVBコード」と戦うのも慣れたもので、まさかと思いつつ言語仕様に当たったところ、ありました。
[Visual Basic 言語仕様 | 式 | クエリ式](https://docs.microsoft.com/ja-jp/dotnet/visual-basic/reference/language-specification/expressions#query-expressions)
>**既定のクエリインデクサー**
>要素型が T で、既定のプロパティを持たないすべてのクエリ可能なコレクション型は、次の一般的な形式の既定のプロパティを持つと見なされます。

>```vb
Public ReadOnly Default Property Item(index As Integer) As T
    Get
        Return Me.ElementAtOrDefault(index)
    End Get
End Property
```

この仕様によって、すべてのIEnumerable(Of T)はElementAtOrDefaultをインデクサとみなしてアクセスできます。やったね!

いや$O(n)$のインデクサって。[^1] 場合によって副作用もありって。

LINQ慣れした皆さんならお察しの通り、先のコードはOrderByの遅延実行のため$n$によって指数的に重くなります。
いっそコンパイルエラーを出してくれた方がよい気もするのですが、既にリリースされてしまっている仕様なので諦めて注意しましょう。

#余談
この仕様はいわゆるダックタイピングとなっており、特定のインターフェースを要求しません。
要求されているのは以下の条件です。

- クエリ可能な型であること。(詳細は省略。)
- 既定の(Default)プロパティを持たないこと。
- Int32を引数とするElementAtOrDefaultメソッドを持つこと。

最小実装としてはこんな感じです。

```vb
Class Indexable(Of T)

    Function [Select](Of T, TResult)(selector As Func(Of T, TResult)) As Indexable(Of TResult)
    End Function

    Function ElementAtOrDefault(index As Int32) As T
    End Function

End Class
```
面白いのは拡張メソッドでもインデクサにできることでしょうか。おかげでIEnumerable(Of T)にも使えますし。
これで任意の型にインデクサが生やせます。やったね!

……~~この仕様、要る?~~

[^1]: IList実装型であれば通常のインデクサ呼び出しになるとはいえ。
統計検定2級に合格のためにやったこと

# 概要
統計検定2級 ( CBT方式 ) に合格することができたので、準備した内容をまとめておこうと思います。

# 準備開始前の状態
- 社会人3年目 ( インフラエンジニア )
  - 仕事で統計学 ( 数学 ) は使わない 
- 学生時代は情報系だったため数学に触れる機会は多々あったが専門に学んだわけでは無い

# 勉強方法 ( 使用した書籍など )
やったこととしては以下の3点

- まず統計検定2級に関連のありそうな書籍を読み込む
- 統計WEB の 統計学の時間 を読み込む
- 過去問を解きながらわからないところは調べて理解できるまで調べながら繰り返す

最初に思い立ってから2ヶ月程度 ( 十分に準備をしていた期間は1ヶ月程度 ) かけて合格することができた
ただ、年末年始をガッツリ統計検定に使っていたので、仕事のある時期だったらもう少し時間がかかっていたかもしれない。

## 教科書
教科書にはネットで紹介されていた 単位が取れる統計ノート を使用した
頭から丁寧めに読み込み、内容を理解していった

## 統計WEB
統計検定2級の勉強方法などを調べていると必ずと言っていいほど登場していたwebサイト
統計WEB の 統計学の時間 をまとめながら読み込んでいった。
上述の書籍を読んでから取り掛かったのである程度すんなり内容に入って行けた気がするが、
いきなりだったら調べながら読み進めていく感じになっていたかなと思う。
統計検定2級に合わせた内容になっていたり、過去問の解説も掲載されていたのでとてもお世話になった。

## 過去問
統計検定2級では公式問題集として過去問が販売されている
受験時には 2016-2018 の物が一般的(?) に販売されているようだった。
しかしながらこの一冊だと 3年 x 2 = 6年分しか問題がない。
上述の書籍やwebサイトにも問題はあったものの、試験当日の時間制限なども考慮するとより多くの問題を解いておきたかったため、
Amazonで販売されていた 2014-2015 と 2011-2013 ( ペーパーバック版 ) も使用した。
あと、統計検定の公式サイトからも直近の過去問がダウンロードできた。

# 勉強方法
まず、 単位が取れる統計ノートを読み込んでいき、その後統計学の時間をまとめつつ読み込んでいった。
この時点で過去問を解き始めた。( 合格基準には届いていなかった )
ただ、過去問は問題集としても使用する想定でたくさん用意していたので、試験直前に解こうと思った数回を残してどんどん手を付けていった。
過去問を 解く → 間違えたところや自信の無いところを調べて理解する → 調べた内容をまとめ直す
を何回か繰り返したところで試験の10日ほど前になったので、取っておいた初見の過去問をといてみた ( 合格基準を超えられるようになっていた )
あとは、自分でまとめたノートと過去問の苦手な範囲を繰り返し復習した。

# 使用した書籍やwebページなど
- 単位が取れる統計ノート : https://www.amazon.co.jp/dp/4061544578/
- 統計WEB : https://bellcurve.jp/statistics/
- 統計検定 2級 公式問題集 ( 過去問 )
  - 2016-2018 : https://www.amazon.co.jp/dp/4788925494/  
  - 2014-2015 : https://www.amazon.co.jp/dp/4788990687/  
  - 2011-2013 : https://www.amazon.co.jp/dp/4788990598/
vueのcomputedについて

# computedの動きについて

computedの動きがわからなかったので、自分用メモとして残すために簡単なvueのページを作成しました。
作成したのは入力された小文字を大文字に変換して出力されるといった簡単なものになります。

まずは、全体のソースです。

```vue:top.vue
<template>
  <div class="hello">
    <h1>小文字→大文字</h1>
    <input v-model="lowerCase"/>→
    <input :value="upperCase" readonly/>

  </div>
</template>

<script>
export default {
  //要素を定義しないと要素をいじれないから定義した方が良いよ
  data() {
    return {
      //stringにnullはやめよう
      //nullは文字ではないから
      lowerCase: '',
    }
  },
  //要素いじりたいときに使うといいよ。ベタ書きすると可読性が落ちちゃうからね
  computed: {
    //今回のページの命のファンクションだよ
    //要素lowerCaseを大文字に変換してくれいるよ。
    upperCase() {
      return this.lowerCase.toUpperCase();
    }
  }
}
</script>

<style scoped>
h3 {
  margin: 40px 0 0;
}
ul {
  list-style-type: none;
  padding: 0;
}
li {
  display: inline-block;
  margin: 0 10px;
}
a {
  color: #42b983;
}
</style>
```

##プログラムの説明をします。

```js:script
<script>
export default {
  //要素を定義しないと要素をいじれないから定義した方が良いよ
  data() {
    return {
      //stringにnullはやめよう
      //nullは文字ではないから
      lowerCase: '',
    }
  },
  //要素いじりたいときに使うといいよ。ベタ書きすると可読性が落ちちゃうからね
  computed: {
    //今回のページの命のファンクションだよ
    //要素lowerCaseを大文字に変換してくれいるよ。
    upperCase() {
      return this.lowerCase.toUpperCase();
    }
  }
}
</script>
```


説明を終わります。


##作ったもの
[大](https://github.com/akai1256/dai)

[公開大](https://akai1256.github.io/dai/)


##参考資料
toUpperCaseの使い方
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String/toUpperCase

vue.js公式サイト
https://jp.vuejs.org/index.html


##終わり
GitHub Actionsを使ってmasterへのプルリクマージでタグを付ける

## TL;DR;
- masterへのマージをリリースとしたので、このタイミングでタグを付けたくなった。
- 手動でやるのは面倒なので、GitHub Actionsで実現した。

## 前提
- 機能開発をfeature、開発時の統合をdevelop、リリースをmasterブランチで管理している(GitFlowをイメージして貰えれば良い)。
- マージにはGitHubのプルリクエストでを利用
    - developからmasterへプルリクエスト

## 作業フロー
1. リリースのタイミングでdevelopからmasterへプルリクエストを生成する
    - プルリクのタイトルをバージョン名にする
    - 「プルリクのタイトル」=「バージョン名」=「タグ名」となる
2. プリリクをマージする
3. マージのタイミングで先頭のコミットにタグが付けられる

## 実現方法
GitHub Actionsを動かすために、以下の2ファイルを配置する。

```.github/workflows/tag-version.yml
name: add version tag
on:
  pull_request:
    branches:
      - master
    types: [closed]
jobs:
  release:
    name: add tag
    runs-on: ubuntu-latest
    if: github.event.pull_request.merged == true
    steps:
      - name: checkout
        uses: actions/checkout@v1
      - name: add tag
        env:
          GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}}
          TAG: ${{github.event.pull_request.title}}
          REPO: ${{github.repository}}
          COMMIT: ${{github.sha}}
        run: ./.github/scripts/add-tag.sh
```

※2020/2/4修正
タグを付けるコミットを `${{github.sha}}l` としていましたが、これだとマージコミットが指定され、マージ元(developブランチ)でタグが見えないので、 `${{github.event.pull_request.head.sha}}` に変更。
参照: [Event Types & Payloads # PullRequestEvent](https://developer.github.com/v3/activity/events/types/#pullrequestevent)

```.github/scripts/add-tag.sh
# Add tag to GitHub
curl -s -X POST "https://api.github.com/repos/${REPO}/git/refs" \
  -H "Authorization: token $GITHUB_TOKEN" \
  -d @- << EOS
{
  "ref": "refs/tags/${TAG}",
  "sha": "${COMMIT}"
}
EOS
```

## 解説
いくつかポイントになる部分の説明を書いておきます。
コード(というか設定ファイル)を見て理解した人は読む必要ありません。

まず、tag-version.ymlはGitHub Actionsのジョブを定義したファイルです。
この部分でmasterブランチへのプルリクがcloseされたタイミングで動くように指定します。

```yaml
on:
  pull_request:
    branches:
      - master
    types: [closed]
```

ただし、これだとマージ以外の理由でcloseされた場合にも動いてしまうので、このようにしてマージされた場合だけに限定しておきます。
[GitHubのCommunity Forumの投稿](https://github.community/t5/GitHub-Actions/pull-request-action-does-not-run-on-merge/td-p/29284)を参考にしました。

```yaml
    if: github.event.pull_request.merged == true
```

ここでは、タグを付けるのに使う情報を環境変数にセットします。
`secrets.GITHUB_TOKEN` はデフォルトで入っているsecrets情報で、後でタグを付けるGitHub APIを呼び出すのに使います。
`github.event.pull_request.title` でプルリクのタイトルを取得し、これをタグ名として使います。

```yaml
        env:
          GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}}
          TAG: ${{github.event.pull_request.title}}
          REPO: ${{github.repository}}
          COMMIT: ${{github.sha}}
```

最終的に、ここでadd-tag.shを実行します。

```yaml
        run: ./.github/scripts/add-tag.sh
```

`add-tag.sh` ではGitHub APIのCreate a referenceを使ってタグを付けています。
[GitHub APIドキュメント(Create a reference)](https://developer.github.com/v3/git/refs/#create-a-reference)

なお、軽量タグではなく、メッセージ付きのタグを付けたい場合はCreate a tag objectを使うと良さそうです。
[GitHub APIドキュメント(Create a tag object)](https://developer.github.com/v3/git/tags/#create-a-tag-object)

>  If you want to create a lightweight tag, you only have to create the tag reference - this call would be unnecessary.

とある通り、軽量タグの場合はCreate a Referenceで完結します。
CentOS8でIdeapad S540(14 ryzen)の内蔵無線LAN（RTL8822BE）を使えるようにする

とりあえずこれでUSB無線アダプタを外せるようになった。

## ◆参考
https://forums.ubuntulinux.jp/viewtopic.php?id=19826
https://askubuntu.com/questions/1082335/bluetooth-and-wifi-not-working-on-ubuntu-14-04-rtl8822be-pcie/1082938

## ◆背景

```
[hoge@localhost ~]$ lspci -nn
〜省略〜
01:00.0 SD Host controller [0805]: O2 Micro, Inc. SD/MMC Card Reader Controller [1217:8621] (rev 01)
## ↓これを使いたい
02:00.0 Network controller [0280]: Realtek Semiconductor Co., Ltd. RTL8822BE 802.11a/b/g/n/ac WiFi adapter [10ec:b822]
03:00.0 Non-Volatile memory controller [0108]: Samsung Electronics Co Ltd NVMe SSD Controller SM981/PM981 [144d:a808]
〜〜省略
```

## ◆パッケージのインストール

```
sudo yum install git
sudo yum install elfutils-libelf-devel
```

## ◆ドライバのインストール

```
git clone https://github.com/lwfinger/rtlwifi_new.git
cd cd rtlwifi_new
git checkout -b extended origin/extended
make
sudo make install
sudo modprobe rtl8822be
sudo shutdown -r now
PC再起動
```

## ◆ファームウェアの導入

```
wget https://github.com/wkennington/linux-firmware/raw/master/rtlwifi/rtl8822befw.bin
sudo cp rtl8822befw.bin /lib/firmware/rtlwifi/
sudo shutdown -r now
PC再起動
```
InoreaderからRaindrop.ioにブックマークを追加する方法

![httpakogipc.up_.n.seesaa.netakogipcimageinoreader01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/10525/cb4674d9-4cf0-3b67-07b2-4bcc53c579e4.png)![ダウンロード (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/10525/948c8232-48b5-0288-c0fd-6ac475bacd24.png)



# 概要

InoreaderからRaindrop.ioにブックマークを追加する方法について、設定と手順を記載しています。

iOS版のRaindop.ioの場合は、Raindrop.ioのアプリ版を入れると特に設定なく連携ができますが、Web版のRaindrop.ioの場合はひと手間入ります。その手順を記載しています。

# 手順

## Inoreaderを開く

まず、何か記事を選択します。

<img width="1107" alt="1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/10525/923c0e0c-c19c-dda5-5d29-8300aa964490.png">

## カスタムサイトの登録

記事の右下に「Configure（設定）」というのがあるので、それを選択します。
※「Configure（設定）」が表示されない場合は、画面をリロードしてみてください。


<img width="1094" alt="2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/10525/c13949cb-48f2-24fa-3903-a5d4f14a0541.png">

下記のダイアログが開くので、**「Shorten URLs before sharing」のチェックを外して**、「Add custom site」のリンクを押します。

<img width="866" alt="3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/10525/7d5c93b1-daf7-8a29-4220-1cbc64021b99.png">

テキストボックスに下記の通り入力し、「Save custom site」を押します。

|Name:|
|---|
|（任意の文字列）|

|URL|
|---|
|```https://extension.raindrop.io/bookmarklet/1.0/#/?link=[URL]```|

<img width="1097" alt="4.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/10525/06ddb85d-0015-404c-1638-5784fa55e068.png">

一番下の「Save」を押します。

<img width="1097" alt="5.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/10525/912dbcd6-95ef-bf39-f76b-6dfbd65b4b3b.png">

## Raindrop.ioへのブックマーク登録

記事の画面に戻ると、Twitterのアイコンがあった場所に新たなアイコンが追加されています！
これを押すと、Raindrop.ioへブックマークする画面が現れます。

<img width="1103" alt="6.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/10525/0a20e27b-754d-2f69-6b9d-f4439c63dce4.png">

Raindrop.ioの登録したいカテゴリを選んで、登録完了です！

<img width="1097" alt="7.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/10525/27b779ca-221b-e9b2-5868-baec89f6191c.png">


おつかれさまでした！

Inoreade x Instapaper x Raindrop.io の組み合わせは、とてもしあわせになれます😊

# 参考

[Inoreader \- Raindrop\.io Help](https://help.raindrop.io/article/47-inoreader)
sudoするたびに可愛い女の子に罵られたい！！

どうも、おのかちおです。  
突然ですが、これを読んでいるそこのあなたは、sudoコマンドを使用した経験はありますか。聞くまでもなく、経験があるかと思います。

そんな皆様なら、sudoをしているときに、よくこう思ったりしませんか？

![](https://blog.katio.net/resource/image/sudo-prompt.png)


プロンプトが‥

![](https://blog.katio.net/resource/image/sudo-prompt-2.png)

味気ない‥

![](https://blog.katio.net/resource/image/sudo-prompt-1.png)

寂しい…！！

**そうだ、可愛い女の子に罵ってもらおう！！！！！！！！！！！**

# sudoのmanページを読む

こういうときはですね、大体相場は決まっていて、manページ読めば良いんですよ‥

ふむふむ…

![](https://blog.katio.net/resource/image/sudo-prompt-man.png)

![](https://blog.katio.net/resource/image/sudo-prompt-man-1.png)

あった！！！！！！

# 環境変数を指定する

zshrc/zprofileに以下を追記します

```zsh
export SUDO_PROMPT="[sudo] さっさとパスワード入れなさいよ、このバカ！ > "
```

# sudoする

あとは打つだけ！！！！

![](https://blog.katio.net/resource/image/sudo-prompt-echo-sd.png)
RANGE関数を拡張する。

 Range関数は、テーブル名、範囲、スピル範囲演算子等の文字列を引数として使えるので、なにかと便利です。
しかし、Range("M01N_[番号,O,W]")というように、列を抜き出してテーブルを作成することは出来ません。
Range("M01N_[番号]")　のような一列や、Range("M01N_[[番号]:[O]]")のように列の並びが連続している必要があります。
それなので、関数Range_として再定義しました。

```vb
Function Range_(R, Optional S = "")
    On Error Resume Next
    
    If TS_(R) Then
        If InStr(R, ",") > 0 And InStr(R, "[") > 0 And InStr(R, "]") = Len(R) Then
            A = Split(Left(R, Len(R) - 1), "[")
            B = Split(A(1), ",")
            A = A(0)
            
            M = Range(A).Rows.Count
            N = UBound(B) + 1
            
            ReDim S(0 To M, 1 To N)
            
            For J = 1 To N
                S(0, J) = B(J - 1)　　　　　　　　　
                R = CC(A, "[", B(J - 1), "]")
                For I = 1 To M
                    S(I, J) = DI(R, I)
                Next I
            Next J
        Else
            S = Range(R)
        End If
    Else
        S = R
    End If
    Range_ = S
End Function
```

(A1) =Range_("M01N_[番号,O,W]") の結果は下記。書式は適当に変えています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184069/2a17822a-6c17-fa93-f6c3-2f5cb3ffefa6.png)
OCamlの組(tuple)とパターンマッチ

初心者がわかったことを書いていきます。
環境
macOS Mojave 10.14.6
Ocaml 4.08.1

###組(tuple)

値を順序をつけて並べたもの。

```ocaml
    (* ３つの文字列をもつ tuple *)
    ("a", "b","c")
```

値の型は揃ってなくてもよいし、ネストしてもよい。

```ocaml
    (* 違う型の値をもつ tuple *)
    ("a", 12345, 1.34, true)
    
    (* tuple を要素のひとつとする tuple *)
    (("a", "b", "c"), 1, 2, 3)
```

もちろん変数に束縛できる。

```ocaml
    let tuple = (1, 2, 3)
```
### パターンマッチ
パターンマッチを使って tuple から値を取り出す。 Ruby で見たことある感じですね。

```ocaml
    (* ２つの tuple を持つ tuple を定義 *)
    let tpl = (("a", 1), ("Hello", 12.3, true)) 
    val tpl : (string * int) * (string * float * bool) =　(("a", 1), ("Hello", 12.3, true)) *)
    
    (* 2つの tuple をそれぞれ別の変数に取り出す *)
    let (tuple1, tuple2) = tpl (* (tuple1, tuple2) がパターン *)
    tuple1 : string * int = ("a", 1)
    tuple2 : string * float * bool = ("Hello", 12.3, true)
    
    (* tuple のすべての要素を分解して変数に取り出す *)
    let ((str1, int1), (string2, float1, bool1)) = tpl
    str1 : string = "a"
    int1 : int = 1
    string2 : string = "Hello"
    float1 : float = 12.3
    bool1 : bool = true
```

パターンマッチを使って一部の要素を取り出したい。

```ocaml
    let tpl = ("a", 1, 3.14)
    
    (* "a" と 1 だけほしい 3.14はいらない *)
    
    (* 悪い例: いらない要素を省略している *)
    let (str1, int1) = tpl
    # let (str1,int1) = tpl;;
    Error: This expression has type string * int * float
           but an expression was expected of type 'a * 'b
    (* (string型, int型, float型)の tuple が必要なところに('a, 'b)のtupleが与えられたというようなエラーメッセージ *)
    
    (* よい例: いらない要素に "_" （ワイルドカードパターン)を入れる *)
    let(str1, int1, _) = tuple
    str1 : string = "a"
    int1 : int = 1
```

間違ってたら優しく指摘してください