OmniAICreator/Qiita-1.07M huggingface dataset:
mockk でのエラー対処  io.mockk.MockKException: no answer found for: Observer(observer#2).onChanged

# 発生した問題
Test に Success と表示されるもののエラーが大量に表示される。
どうやら onChanged で怒られているらしい。

```
 io.mockk.MockKException: no answer found for: Observer(observer#2).onChanged
```

# 解決策
mockk している observser の振る舞いをしていしていなかったのが問題らしい。
下記のように @RelaxedMockK を指定してあげると動作を定義しなくてもエラーを出さなくなる。

``` Kotlin:MainViewModelTest
    @RelaxedMockK
    private lateinit var observer: Observer<List<UserRepoResponse>>
```

ViewModel のテストのソースコード : https://github.com/higuuu/higuuu-github-api/blob/test/mockk-viewmodel/app/src/test/java/com/example/higuuugithubapi/MainViewModelTest.kt
空気抵抗を受けながら落下する小球の速さをPythonとSympyで計算したお話し


#はじめに
　大学の研究室に転がっていたMathematicaで遊んだ記憶があります。それから数十年の年月が流れる間に，研究生活の中で何度となく微分方程式が目の前に現れ，数式処理ソフトがあったらなあと思うことがあったものの，いざとなったら数値積分すりゃあいいやと堕落したまま還暦目前まできてしまいました老技術者です。今宵もよろしく。
　ところが最近，変態仲間の田中さんという数学者がSympyを紹介してくれて，これを使っているうちに若き日の思い出がよみがえり，飛田新地に繰り出した，いやこの数式処理ライブラリを使って高校物理の問題でも解いてみようと思った次第でございます。
##環境
Windows10 pro
Anaconda + Python 3.7.6 (64bit) + Sympy 1.5.1
Visual Studio Code 1.44.2

#基本式
　高校時代，老技術者が初めて微分方程式の威力を知ったのが，空気抵抗中の落下問題。

<b>質量$m$(kg)の小球が,鉛直下方に落下している。小球は時刻$0$(s)に初速$0$で落下を開始し，落下の途中，小球には速さ$v$(m/s)に比例する空気抵抗$kv$(N)が速度の向きと逆向きに作用するものとして，時刻$t$(s)における小球の速さを求めよ。</b>

　昔，駿台には坂間師という偉大な物理の先生がいらっしゃって，微分方程式をきたねえ字でささっと書いてくださる。高校1年生で午前部に潜っていた私は一瞬ひるむわけです。でも何とかノートに書き写して，という日々が続き晴れて現役で理科一類へ，と苔むす自慢も入れつつ，まずは運動方程式を立てましょう。時刻$t$(s)の小球の速さを$v(t)$(m/s)として，

<b>運動方程式</b>

$$ m \\frac{dv\\left(t \\right)}{d t} {} = mg-kv{\\left(t \\right)}$$
これを解いて
$$v{\\left(t \\right)} = \\frac{mg}{k} + \\frac{e^{\\frac{C_{1} k}{m}} }{k}e^{- \\frac{k t}{m}}$$
定数を
$$A=\\frac{e^{\\frac{C_{1} k}{m}} }{k}$$
とまとめると
$$v{\\left(t \\right)} = \\frac{mg}{k} + A e^{- \\frac{k t}{m}}$$
という一般解になります。初期条件 $t=0(s) で v{\\left(t \\right)}=0$ を入れて$A$を求めると，
$$A=-\\frac{mg}{k}$$
となり，
$$v{\\left(t \\right)} = \\frac{mg}{k} (1- e^{- \\frac{k t}{m}})$$
を得られます。速さ$v{\\left(t \\right)} $の$t→\\infty$の極限，すなわち終端速度は
$$\lim_{t \to \infty} v(t)=\\frac{mg}{k}$$
となります。
#これをSympyで解きグラフも描く

```Python:
#%%
import sympy as sym
from IPython.display import Math, display
from sympy.solvers import ode
from sympy import oo
import matplotlib.pyplot as plt

# 変数を定義
t, v, k, m, g = sym.symbols("t v k m g")
v = sym.Function('v')

# 運動方程式（常微分方程式）
eq = sym.Eq(m * v(t).diff(t,1) - m * g + k * v(t), 0)

# 一般解
ans = sym.expand(sym.dsolve(eq))
display(Math(f"一般解: {sym.latex(ans)}"))

# 特殊解(文字式)
ans2 = sym.expand(sym.dsolve(eq, ics={v(0):0}))
display(Math(f"特殊解(文字式）: {sym.latex(ans2)}"))

# 特殊解（数値）
m1 = 0.4
k1 = 0.2
g1 = 9.8
eq2 = eq.subs([(m, m1), (k, k1), (g, g1)])
ans3 = sym.dsolve(eq2, ics={v(0):0})
p1 = sym.plot(ans3.rhs, (t, 0, 10), show=False) # rhs は右辺のこと
display(Math(f"特殊解(m={m1}, k={k1}, g={g1}): {sym.latex(ans3)}"))

# 終端速度
voo = sym.limit(ans3.rhs, t, oo)
display(Math(r"終端速度：\lim_{t \to \infty} v(t)" \
    f"={voo:.2f}"))
p2 = sym.plot(voo, (t, 0, 10), show=False)
p1.extend(p2)
p1[1].line_color = "0.8"
p1.show()
fig = p1._backend.fig
fig.legend([f"f(t)={ans3.rhs}", f"f(t)={voo:.1f}"], loc='center')
fig

```
これを実行すると，
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202911/28bd897d-6a4d-be2a-cd2f-41887656d29f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202911/a774eeba-2c9b-8c0c-2dbe-5b4434a2dfc6.png)

特殊解を求められるのがSympyの良いところです。
さらにその特殊解の式をsympy.plotに渡してやるとグラフも描けてしまいます。さらに極限を求めて漸近線を引くことができます。
【備忘録】AWSにMariaDBを利用してデータベースサーバーを立てる

#目的
AWSにRDSを利用してデータベースサーバーを立てる。今回使用するデータベースは「MariaDB」です。
「MySQL」と同じだと考えてもOK。

※MariaDBとは
MariaDB(マリアディービー)とは、「MySQL」から派生したオープンソースリレーショナルデータベースシステムです。「拡張性」「処理性能」「高品質」が評価され、世界中で急速にシェアを拡大しています。


#EC2ユーザーでログインしておく
```
ssh ec2-user@<グローバルIPアドレス> -i /Users/~/○○.pem
```

#MariaDBをインストールする
```
yum install mariadb-server.x86_64
```

#MariaDBを起動する。
```
systemctl start mariadb
```

#mysql_secure_installationを実行して、rootユーザーのパスワードを設定する。
MariaDBのrootユーザーのパスワードを設定する。

```
mysql_secure_installation
```

以下のように対話形式で色々聞かれるので、一旦全部「Yes」でOK。

```
NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!

In order to log into MariaDB to secure it, we'll need the current
password for the root user.  If you've just installed MariaDB, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.

Enter current password for root (enter for none): 
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
Enter current password for root (enter for none): 
OK, successfully used password, moving on...

Setting the root password ensures that nobody can log into the MariaDB
root user without the proper authorisation.

Set root password? [Y/n] Y      
New password: 
Re-enter new password: 
Password updated successfully!
Reloading privilege tables..
 ... Success!


By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB without having to have a user account created for
them.  This is intended only for testing, and to make the installation
go a bit smoother.  You should remove them before moving into a
production environment.

Remove anonymous users? [Y/n] Y
 ... Success!

Normally, root should only be allowed to connect from 'localhost'.  This
ensures that someone cannot guess at the root password from the network.

Disallow root login remotely? [Y/n] Y
 ... Success!

By default, MariaDB comes with a database named 'test' that anyone can
access.  This is also intended only for testing, and should be removed
before moving into a production environment.

Remove test database and access to it? [Y/n] Y
 - Dropping test database...
 ... Success!
 - Removing privileges on test database...
 ... Success!

Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.

Reload privilege tables now? [Y/n] Y
 ... Success!

Cleaning up...

All done!  If you've completed all of the above steps, your MariaDB
installation should now be secure.

Thanks for using MariaDB!
```


#「mydb」という名前でDBを作成する
```
create database mydb;
```

以下のコマンドでテーブルがあるか確認する。
※テーブルはまだ作成していないから何も無いはず。

```
show tables from mydb;
```

#作成したmydbにアクセスする。

```
use mydb;
```

#「product」テーブルを作成する
以下のコマンドでproduct table

```
create table product (id int, name varchar(10), col varchar(10));
```

以下のコマンドでテーブルが作成できているか確認する。

```
show tables from mydb;
```

確認できたら完了！！
以下のコマンドで抜けてOK。

```
exit
```
オプショナルを分かりやすく一言で。。

###一言でオプショナルとは...

**オプショナル　＝　「空っぽ」の代入がokってこと**

(厳密には　「空っぽの状態＝nil」　）

```swift:オプショナルの操作
var a: String?
var b: Int!
//オプショナル型の変数宣言
var c: String
var d: Int
//非オプショナル型の変数宣言
a = nil
//実行できる
c = nil
//実行できない
```

##なぜnilが必要か

例えばLINEでは　登録に名前は必須でも写真は任意の項目。つまり写真は登録してもしなくてもいい。
つまり「空っぽ」が存在する。この時nilが必要になる
（オプショナルがないと絶対写真登録してね！！ってなってちょい不便）
以上、一言でオプショナルでした。
RailsのSTIで既存のカラム(外部キー)を使う

RailsのSTIではtypeカラムにstring型でサブクラス名を保存する。
これは新しく０から設計する場合は良いかもしれない。
しかし既に次に述べるようなテーブルがある場合はintegerで関連付けられるほうが嬉しい。

Productテーブルが存在し、Product.category_idなどのカラムを使ってCategoryテーブルと紐付いているとする。
Product belongs_to Categoryの状態である。

```ruby:product.rb
class Product < ApplicationRecord
  belongs_to :category, optional: true
end
```
```ruby:category.rb
class Category < ApplicationRecord
  has_many :products
end
```

ここでCategoryごとにProductのサブクラスを作りたくなるとする。
今回の場合はCategoryがcpuやgpuなどである。

```ruby:cpu.rb
class Cpu < Product
end
```

普通に新しく設計する場合、もしくは冗長性を許して新しくtypeカラムを作る場合は（typeカラムにcpuやgpuなどのstring型が保存され、category_idに1, 2などのint型が保存される）
単にtypeカラムを作ってあげるだけでよい。

今回は既存のcategory_idを利用してSTIを実現する。

```ruby:product.rb
class Product < ApplicationRecord
  self.inheritance_column = 'category_id'
  belongs_to :category, optional: true
  class << self
    def find_sti_class(category_id)
      type_name = category_names[category_id - 1]
      "#{type_name.to_s.camelize}".constantize
    end

    def sti_name
      category_names.index(name.demodulize) + 1
    end
  end

  def self.category_names
    ['Cpu', 'Gpu']
  end
end
```
`self.inheritance_column`にcategory_idを代入することで、今までrailsでtypeを用いてSTIを実現していたのが、category_idというカラムで実現できるようになる。
続いて子クラスの探索を行うActiveRecord::Inheritance(inheritance.rb)のfind_sti_classとsti_nameをオーバーライドする。
これにより①category_idというinteger型から必要なクラス名を取得することと②子クラス名からcategory_idを逆算することが可能になる。
実際にテストしてみると、

```ruby
product = Product.where(category_id: 1).limit(1)[0] # cpu
p product.category_id # 1
p product.category # #<Category id: 1, name: "CPU">
p product.class.name # Cpu
gpu = Gpu.limit(1)[0] # #<Gpu id: *, name:...>
```
というように既存のリレーションを維持したまま、既存のカラムを利用してSTIが可能となった。
P5.js 日本語リファレンス(endShape)


このページでは[「P5.js 日本語リファレンス」] (https://qiita.com/bit0101/items/91818244dc26c767a0fe) の endShape関数を説明します。

## endShape()

### 説明文

endShape() はbeginShape() とペアであり、beginShape() の後でのみ呼び出すことができます。 endShape() が呼び出されると、前回の beginShape() の呼び出し以降に定義されたすべての画像データが画像バッファに書き込まれます。定数 CLOSE は形状を閉じる(開始点と終了点を接続する)ための MODE パラメータ値である。

### 構文

endShape([mode])

### パラメタ

mode  
定数：CLOSE を使用して形状を閉じます(オプション)

### 著作権

p5.js was created by Lauren McCarthy and is developed by a community of collaborators, with support from the Processing Foundation and NYU ITP. Identity and graphic design by Jerel Johnson.

### ライセンス

Creative Commons(CC BY-NC-SA 4.0) に従います。
P5.js 日本語リファレンス(endContour)


このページでは[「P5.js 日本語リファレンス」] (https://qiita.com/bit0101/items/91818244dc26c767a0fe) の endContour関数を説明します。

## endContour()

### 説明文

beginContour() と endContour() を使用して、"O" のような中抜き形状の図形を描画します。 beginContour() は形状の頂点の記録を開始し、endContour() は記録を停止します。最初に外部形状を時計回りの順序で頂点を定義して、次に内部形状を反時計回りの順序で頂点を定義する必要があります。

これらの関数は beginShape() / endShape() ペア内でのみ使用でき、translate()、rotate()、scale() などの変換は beginContour() / endContour() ペア内では機能しません。また、内部で ellipse() や rect() などの他の形状を使用することもできません。

### 構文

endContour()

### 例1

```javascript
function draw() {
  background(255, 255, 130); // 背景を黄色に設定
  translate(50, 50);
  stroke(255, 0, 0); // ストロークを赤色に設定

  beginShape(); // 中抜形状の描画開始
    //形状の外側の部分、時計回り
    vertex(-40, -40);
    vertex(40, -40);
    vertex(40, 40);
    vertex(-40, 40);

    //形状の内部部分、反時計回り
    beginContour();
      vertex(-20, -20);
      vertex(-20, 20);
      vertex(20, 20);
      vertex(20, -20);
    endContour();
  
  endShape(CLOSE); // 中抜形状の描画終了
}
```

###実行結果
![beginContour.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43467/b488f6e4-81ab-25cb-769d-3a3edf30be3c.png)


### 著作権

p5.js was created by Lauren McCarthy and is developed by a community of collaborators, with support from the Processing Foundation and NYU ITP. Identity and graphic design by Jerel Johnson.

### ライセンス

Creative Commons(CC BY-NC-SA 4.0) に従います。
Delphi10 でTwilio apiを叩いてSMSメッセージを送る

#はじめに
Delphi10 お試しシリーズ第４弾
今回は Twilio のapiを使ってSMSメッセージを送ってみました。
全く同じソースでWindows、Android共に動作します。(FireMonkey万歳!)

#Twilioアカウント取得
事前にTwilioのアカウントを取得しておきます。
方法はググってください。無料トライアルのアカウントがありましたので
そちらを使っています。
アカウントをとると約1600円($15?)のトライアルバランスが付加されました。
電話番号をとると107円($1?) 　SMSを送ると1通につき9円掛かるようです。
SMS送信に必要なのはAccount SID,AUTH TOKEN,電話番号の3つです。

#画面作成
以下の画面イメージの様に必要なコンポーネントを配置します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625152/fae464de-abd5-2f54-2ada-01bfb14c16c9.png)

#ソースリスト
```Pascal
unit rest1;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, REST.Types,
  FMX.Controls.Presentation, FMX.StdCtrls, Data.Bind.Components,
  Data.Bind.ObjectScope, REST.Client, REST.Authenticator.Basic, FMX.ScrollBox,
  FMX.Memo, FMX.Edit;

type
  TForm1 = class(TForm)
    RESTClient1: TRESTClient;
    btn_send: TButton;
    HTTPBasicAuthenticator1: THTTPBasicAuthenticator;
    RESTRequest1: TRESTRequest;
    RESTResponse1: TRESTResponse;
    Memo1: TMemo;
    ed_message: TEdit;
    ed_account: TEdit;
    ed_token: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    ed_to: TEdit;
    Label5: TLabel;
    ed_from: TEdit;
    procedure btn_sendClick(Sender: TObject);
  private
    { private 宣言 }
  public
    { public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.fmx}

procedure TForm1.btn_sendClick(Sender: TObject);
begin
  HTTPBasicAuthenticator1.Username := ed_account.Text;
  HTTPBasicAuthenticator1.Password := ed_token.Text;

  RESTRequest1.Method := rmPost;
  RESTRequest1.Client := RESTClient1;
  RESTRequest1.Response := RESTResponse1;

  RESTClient1.BaseURL :=
      format('https://api.twilio.com/2010-04-01/Accounts/%s/Messages.json',[ed_account.text]);
  RESTClient1.Authenticator := HTTPBasicAuthenticator1;

  with RESTClient1.Params do
  begin
    Clear;
    AddItem('To',ed_to.Text);
    AddItem('From',ed_from.Text);
    AddItem('Body',ed_message.Text);
  end;

  RESTRequest1.Execute;
  memo1.lines.text := RESTResponse1.Content;
end;
end.
```

#実行
入力ボックスにパラメータを入れてSend SMSボタンを押すと、スマホにSMSメッセージが届きました。
めでたし　めでたし。

画面下のメモコンポーネントにレスポンス内容を表示しますので、上手くいかない場合は
エラー内容を頑張って読み解いてください。
To:には携帯番号の頭に+81（日本の国番号）をつけています。
便利！railsのscaffoldについて

#便利なコマンドscaffoldについて
railsの練習として、簡単なメモアプリを作っていた際にscaffoldを使って便利さに衝撃を受けましたのでまとめてみました。

##scaffoldとは？
railsでアプリを作る際にはルーティング、コントローラー、モデル、ビューを作成していく必要があります。
scaffoldはそれらを自動で作ってくれます。
また、コントローラーに自動でアクションの７つ(index・show・new・edit・create・update・destroy)が追加してくれます。

scaffoldを使用することでアプリとして機能するところまで作ってくれます。
とても便利ですね。
##scaffoldの使い方
次にscaffoldの使い方についてです。
rails newでアプリを作成した後に、

```
rails g scaffold モデル名　カラム名①:データの型① カラム名②:データの型②、、、
```
という風にコマンドをターミナルに打ち込むことで使用できます。

私はメモアプリを作っていたため、

```
rails g scaffold post title:string content:text
```

というコマンドになりました。
これで簡単に投稿機能のあるアプリが作れました。

簡単にアプリが作れますので、練習用アプリの雛形としても便利ですね。

scaffoldの説明は以上となります。

間違いなどがありましたらご指摘いただけると幸いです。
最後まで読んでいただきありがとうございました！
C++のSTLコンテナsetを用いてABC73 C問題を解く

競技プログラミングの備忘録用にメモ

今回はABC73 C問題をSTLコンテナのsetを用いて解く．

[C - Write and Erase](https://atcoder.jp/contests/abc073/tasks/abc073_c)

###問題文
あなたは、joisinoお姉ちゃんと以下のようなゲームをしています。

- 最初、何も書いていない紙がある。
- joisinoお姉ちゃんが一つの数字を言うので、その数字が紙に書いてあれば紙からその数字を消し、書いていなければその数字を紙に書く。これを 
$ N $
 回繰り返す。
- その後、紙に書かれている数字がいくつあるかを答える。

joisinoお姉ちゃんが言った数字が、言った順番に$ A_1,...,A_N $として与えられるので、ゲーム終了後に紙に書かれている数字がいくつあるか答えてください。

###制約

- $1≦N≦100000$
- $1≦A_i≦1000000000(=10^9)$
- 入力は全て整数である。

全探索ではもちろん間に合わないので今回はsetを用いて愚直にシミュレーションして最後の個数を求める．

本問題では奇数個出てきた数字が残り，偶数個出てきた数字が残らないことがわかる．
そこでsetで集合管理をし，入力された数字がすでに集合内に含まれるときはその数を集合から削除する．入力された数が集合内に含まれないときはその数を集合に追加する．
最後に集合内に含まれている数値の数をカウントする．

###setの宣言

```c++

set<long long> B;
```
今回は$ A_i $の最大値が$10^9$であることからlong long で宣言

###set内への要素の追加

```c++

B.insert(挿入したい数)
```

###set内からの要素の削除
```c++

B.erase(削除したい数)
```

###set内の要素の検索
```c++

B.find(検索したい数)
```

今回は数の集合内の有無を調べた．

検索した数が集合内に含まれないときB.end()が返却される．

###数値有無の判定部分
```c++

if(B.find(検索したい数)==B.end()){
    B.insert(検索したい数);
}
```

以上の処理で集合B内において入力された数の有無を確認し，集合内に数が存在しないとき集合に数を加えるという操作を行なっている．
###解法コード

```c++

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int N;
    cin >> N;
    vector<long long> A(N);
    set<long long> B;
    for(int i=0; i<N; i++){
        cin >> A.at(i);
        if(B.find(A.at(i))==B.end())
        {
            B.insert(A.at(i));
        }
        else
        {
            B.erase(A.at(i));
        }
    }
    cout << B.size() << endl;
}
```
Excel で解く AtCoder ABC 129 C

# はじめに
AtCoder さんの問題をお借りして ***Excel*** を使用した解法をご紹介すると共に、***Excel*** が優れた関数型プログラミングツールであることを提示したいと思います。
# 今回のお題
*[AtCoder Beginner Contest 129 C - Typical Stairs](https://atcoder.jp/contests/abc129/tasks/abc129_c)*
<font color="brown">Difficulty: 795</font>
# 下準備
最初にシートを準備し、`セルA4`に`=ROW()`と入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538241/f79682ba-3e4a-1052-2248-644b24546dfb.png)
`Enter`を押下すると`4`が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538241/24b7700b-f368-55ee-ad6e-6fe2c38df3e4.png)
`ROW()`は行番号を返すワークシート関数です。
このままでは、`0`や負の数が使えませんので、オフセットとして`=ROW()-4`と入力し`セルA10`までコピーしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538241/8f538c52-8345-237a-dbd1-98e49c3f145d.png)
次に`セルB5:B10`に`1`を入力しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538241/fceed189-194d-a358-02fa-cd7ed1709d8e.png)
# フィボナッチ数列
*[フィボナッチ数列 - wikipedia](https://ja.wikipedia.org/wiki/%E3%83%95%E3%82%A3%E3%83%9C%E3%83%8A%E3%83%83%E3%83%81%E6%95%B0)*と言えば、プログラミングの再帰的処理の例としてよく紹介されます。
まず、フィボナッチ数列の初期値として、`セルC4:C5`に`1`を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538241/ac822d28-8893-7d0a-06e4-4e678adc1ed8.png)
次に`セルC6`に`=C4+C5`若しくは`=SUM(C4:C5)`と入力し`セルC7:C10`へコピーします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538241/03a625df-6140-e980-a7c2-a3ad783e39b6.png)
**これにて、フィボナッチ数列の生成が完了しました。**
# ABC 129 C 入力例 1
*[AtCoder Beginner Contest 129 C - Typical Stairs](https://atcoder.jp/contests/abc129/tasks/abc129_c)* を動的計画法で解きたいと思います。
`B列`はその段の床の状態を表し、`1`はその段の床が壊れていないものとし`0`はその段の床が壊れているものとします。
まず、`セルC5`を`=MOD(B5*(C3+C4),1000000007)`と修正します。
`MOD(数値,除数)`は余りを求めるワークシート関数です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538241/e157cf9c-08d8-03c4-7050-029421ecff5f.png)
`=IF(B5=1,MOD(C3+C4,1000000007),0)`という式でもOKです。
次に、`セルC5`を`C6:C10`にコピーします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538241/43397041-a62a-086c-05d9-a97206a7d66b.png)
最後に、`セルB7`に`0`を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538241/27dc7251-6214-1bf6-e0a2-81492410b018.png)
**これにて、出力例 1 の移動方法の総数: 4を求めることができました。**
# ABC 129 C 入力例 2
`A:C列`を 14 行目までコピペし、`セルB8:B9`に`0`を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538241/3e40d738-1237-1500-d844-3f8c9ba21872.png)
`セルC14`の`0`が解答になります。

ここで仮に`高橋君は一歩で 1段か 2段上ることができる`の条件を`高橋君は一歩で 1段か 2段か 3段上ることができる`に変更したとします。
この場合、`セルC5`の式を`=MOD(B5*(C3+C4),1000000007)`から`=MOD(B5*(C2+C3+C4),1000000007)`に修正しコピペすることにより対応可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538241/455186e4-50bb-6178-4dbf-ef731d675707.png)
一歩で 3段上ることができますので、連続した壊れた床をジャンプしています。
# 実装例
***C++*** による実装の例は、*[_editorial_](https://img.atcoder.jp/abc129/editorial.pdf)* や、***Ruby*** による実装の例は、*[＿こちら＿](https://qiita.com/superrino130/items/f51b027c52aca3f740c0#comment-a09d7b4cdac527ac9e4d)*をご覧ください。
# まとめ
+ 再帰や動的計画法は分かりづらい面もありますが、処理自体はシンプルです
+ ***Excel*** が優れた関数型プログラミングツールであることを提示しました
rails accepts_nested_attributes_for 使い方

関連付けしたモデルを一緒にデータ保存できる方法。
（例）propertyモデルとnearest_stationモデルが関連づいている。
*accepts_nested_attributes_forメソッドの実装に関連したコードのみ記述しています。

```ruby:property.rb
class Property < ApplicationRecord
  #アソシエーション設定,親モデルのデータを削除した時に子モデルも一緒に削除される。
  has_many :nearest_stations, dependent: :destroy, inverse_of: :property
  #reject_all_blank関数でtrueが出たパラメータは、送信データから除外させていく。
  accepts_nested_attributes_for :nearest_stations, allow_destroy: true, reject_if: :all_blank
end
```

```ruby:nearest_station.rb
class NearestStation < ApplicationRecord
  belongs_to :property, inverse_of: :nearest_stations
end
```

```ruby:properties_controller.rb
class PropertiesController < ApplicationController
  before_action :set_property, only: [:show, :edit, :update, :destroy]

  def index
    @properties = Property.all
  end

  def new
    #インスタンスをインスタンス変数に代入。ビューにデータを渡す
    @property = Property.new
    #buildメソッドを使用し、propertyモデルに属するnearest_stationモデルのインスタンスを新たに生成する。新規登録の時点で２駅保存できる
    2.times { @property.nearest_stations.build }
  end

  def create
    #paramsメソッドを使用し、送られてきたparameterを全て取得。モデルにDB操作の命令を出す。
    @property = Property.new(property_params)
    if @property.save
      #一覧画面へ遷移して、"物件を登録しました！"とメッセージを表示する。
      redirect_to properties_path, notice: "物件を登録しました！"
    else
    #入力フォーム(new.html.erb)を再描写
    render :new
    end
  end

  def show
    @nearest_stations = @property.nearest_stations
  end

  def edit
    @property.nearest_stations.build
  end

  def update
    if @property.update(property_params)
      redirect_to properties_path, notice: "物件を編集しました！"
    else
      render :edit
    end
  end

  private
  #paramsメソッドにより、parametersの値を取得。
  def property_params
    params.require(:property).permit(
      :property_name,
      :rent,
      :street_address,
      :age,
      :note,
      #attributesメソッドを使用し、インスタンスの属性（オブジェクトが持っている値）一覧を取得
      nearest_stations_attributes: [
        :route,
        :station,
        :minutes_walk,
        :property_id,
        :id,
        :_destroy,
      ],
    )
  end

  def set_property
    #parameterのidを利用して、データベースからデータを取得。
    @property = Property.find(params[:id])
  end
end
```

```ruby:_form.html.erb
<%= form_with(model: @property, local: true) do |form| %>
　　#formタグ省略
  <%= form.fields_for :nearest_stations do |nearest_station| %>
  　　<div class="route">
    　　<%= nearest_station.label :路線名 %><br>
    　　<%= nearest_station.text_field :route %>
  　　</div>
  　　<div class="station">
    　　<%= nearest_station.label :駅名 %><br>
    　　<%= nearest_station.text_field :station %>
  　　</div>
  　　<div class="minutes_walk">
    　　<%= nearest_station.label :徒歩分数 %><br>
   　　 <%= nearest_station.text_field :minutes_walk %>分<br>
  　　</div>
  　　<%= form.submit '登録する' %>
  <% end %>
<% end %>
```

```ruby:show.html.erb
<% @nearest_stations.each　do |nearest_station| %>
 <% if @property.nearest_stations.any? %>
    <%= nearest_station.route %>
    <%= nearest_station.station %>
    <%= nearest_station.minutes_walk %>
 <% end %>
```
【Laravel】local.ERROR: GD Library extension not available with this PHP installation. 

###エラー内容
```
local.ERROR: GD Library extension not available with this PHP installation. {"exception":"[object] (Intervention\\Image\\Exception\\NotSupportedException(code: 0): GD Library extension not available with this PHP installation.
```
###環境
Amazon Linux release 2
Laravel Framework 6.18.11
PHP 7.3.16

###やっていたこと
以下の内容はエラーがでる以前からやっていたことです。

```
$ composer require intervention/image
```
```config:config/app.php
Intervention\Image\ImageServiceProvider::class,

'Image' => Intervention\Image\Facades\Image::class,
```
###やったこと
エラー解決に至るまで。

まず画像処理に必要なPHPの拡張モジュールをインストールする。
#####利用できるパッケージの検索

```
$ sudo yum search "php-gd"
読み込んだプラグイン:extras_suggestions, langpacks, priorities, update-motd
============================ N/S matched: php-gd ============================
php-gd.x86_64 : A module for PHP applications for using the gd graphics library
```
#####パッケージのインストール

```
$ sudo yum install php-gd.x86_64
```
#####Nginxの再起動

```
$ sudo systemctl restart nginx
```
#####OSの再起動
```
$ sudo reboot
```
###注意
Nginxの再起動だけでは、エラーの解決には至りませんでした。オペレーティングシステムの再起動をすることでエラーが解決しました。

###参考
https://stackoverflow.com/questions/55263200/php-laravel-gd-library-extension-not-available-with-this-php-installation-but-is
ECHONET用電文のEDTを自動生成

# 目的

+ Pyhon3で書く
+ ECHONET用電文のEDTを自動生成する
+ EDTは0～99(0x00～0x63)まで
+ 電文はSET用とGET用を交互に生成する
+ qiitaに投稿してみる
 
# code

```python:MessageGenerator4ECHONET-Lite.py
#! /uer/bin/env python
# -*- coding: utf-8 -*-

import sys

#　初期値
setget_flag = True      #　True:set,False:getの時を表す、0or1のほうが判定速いのかは知らない。
i = 0                   # カウンタ
ipv6Addr = "AAAAAAAA"   # ダミー値。本当はもっと長いけど、今は特に関係ないのでこのまま。

GET_E2 = b"\x10\x81\x12\x34\x05\xFF\x01\x02\x88\x01\x62\x01\xE2\x00"
# 積算電力量計測値履歴1(正方向計測値)(EPC=0xE2)
SET_E5_base = "1081123405FF010288016201E501"
# 積算履歴収集日1(0:当日 1~99:前日の日数)(EPC=E5)

# 適用先の都合でwhile文にしています
while 1:
    if setget_flag == True:
        # set時の動作
        # E5の電文を作成
        SET_E5 = bytes.fromhex(SET_E5_base + '{:02X}'.format(i))
        command = "SKSENDTO 1 {0} 0E1A 1 {1:04X} {2}".format(ipv6Addr, len(SET_E5), SET_E5)
        setget_flag = False  # フラグをFalse:getに
        print(command)
    else :
        # get時の動作
        # E2の電文は毎回一緒なのでそのまま
        command = "SKSENDTO 1 {0} 0E1A 1 {1:04X} {2}".format(ipv6Addr, len(GET_E2), GET_E2)
        setget_flag = True   # フラグをTrue:setに
        i += 1               # 後に送る電文側でインクリメントする
        print(command)
    # 電文作成が100回になったら糸冬了
    if i == 100:
        print("100回糸冬了")
        sys.exit()  #### 糸冬了 ####
```

# 結果
```
SKSENDTO 1 AAAAAAAA 0E1A 1 000F b'\x10\x81\x124\x05\xff\x01\x02\x88\x01b\x01\xe5\x01\x00'
SKSENDTO 1 AAAAAAAA 0E1A 1 000E b'\x10\x81\x124\x05\xff\x01\x02\x88\x01b\x01\xe2\x00'
~省略~
SKSENDTO 1 AAAAAAAA 0E1A 1 000F b'\x10\x81\x124\x05\xff\x01\x02\x88\x01b\x01\xe5\x01c'
SKSENDTO 1 AAAAAAAA 0E1A 1 000E b'\x10\x81\x124\x05\xff\x01\x02\x88\x01b\x01\xe2\x00'
100回糸冬了

```

# 考察
+ ECHONET用電文のEDTを自動生成できた
+ EDTは0～99(0x00～0x63)まで対応した
+ 電文はSET用とGET用を交互に生成した
+ qiitaに投稿した
    + Markdown記法に少し慣れた
    + はてブよりもコードは見やすい
    + コメントの書き方がわからんかったので、資料を参考にしてみた

# 参考資料
[Pythonのコメント、コメントアウトの書き方](https://note.nkmk.me/python-comment/)

# 追記
+ 元のコードをPython3用に書き直したが動かず。
    + Python3はバイナリデータの扱いが下手なのか・・・？
P5.js 日本語リファレンス(bezierVertex)


このページでは[「P5.js 日本語リファレンス」] (https://qiita.com/bit0101/items/91818244dc26c767a0fe) の bezierVertex関数を説明します。

## bezierVertex()

### 説明文

ベジェ曲線の頂点座標を指定します。 bezierVertex() を呼び出すたびに、2つの制御点とベジェ曲線の1つのアンカー点の位置が定義され、新しいセグメントが線または形状に追加されます。 WebGL モードの場合、bezierVertex() は2Dおよび3Dモードで使用できます。 2Dモードは6つのパラメータを想定していますが、3Dモードは9つのパラメータ(z座標を含む)を想定しています。

beginShape() 呼び出し内で bezierVertex() を初めて使用するときは、最初のアンカーポイントを設定するために、その前に vertex() を呼び出す必要があります。この関数は beginShape() と endShape() の間で、beginShape() に MODE または POINTS パラメータが指定されていない場合にのみ使用する必要があります。

### 構文

bezierVertex(x2, y2, x3, y3, x4, y4)

bezierVertex(x2, y2, z2, x3, y3, z3, x4, y4, z4)

### パラメタ

x2  
Number：最初の制御点のx座標

y2  
Number：最初の制御点のy座標

x3  
Number：2番目の制御点のx座標

y3  
Number：2番目の制御点のy座標

x4  
Number：アンカーポイントのx座標

y4  
Number：アンカーポイントのy座標

z2  
Number：最初の制御点のz座標(WebGLモードの場合)

z3  
Number：2番目の制御点のz座標(WebGLモードの場合)

z4  
Number：アンカーポイントのz座標(WebGLモードの場合)


### 例1

```javascript
function draw() {
  noFill();
  beginShape();
  vertex(30, 20);
  bezierVertex(80, 5, 80, 75, 30, 75);
  endShape();

  strokeWeight(6);

  // 定義点を描画する
  stroke(255, 0, 0); // 赤色
  point(30, 20);
  stroke(0, 255, 0);  // 緑色
  point(80, 5);
  stroke(0, 0, 255); // 青色
  point(80, 75);
  stroke(255, 165, 0); // オレンジ色
  point(30, 75);

  strokeWeight(1);
  stroke(0);
}

```

### 実行結果
![bezierVertex.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43467/faf8f413-9be6-6e21-fb21-581b6067399c.png)



### 著作権

p5.js was created by Lauren McCarthy and is developed by a community of collaborators, with support from the Processing Foundation and NYU ITP. Identity and graphic design by Jerel Johnson.

### ライセンス

Creative Commons(CC BY-NC-SA 4.0) に従います。
100日後にエンジニアになるキミ - 44日目 - プログラミング - フレームワークについて

本日はフレームワークのついてのお話です。

昨日までのはこちら

[100日後にエンジニアになるキミ - 42日目 - クラウド - クラウドサービスについて](https://qiita.com/otupy/items/d1765f1541a104ed6133)

[100日後にエンジニアになるキミ - 36日目 - データベース - データベースについて](https://qiita.com/otupy/items/7af17635d576677606dc)

[100日後にエンジニアになるキミ - 24日目 - Python - Python言語の基礎1](https://qiita.com/otupy/items/6d1e5453f530e07b7aec)

[100日後にエンジニアになるキミ - 18日目 - Javascript - JavaScriptの基礎1](https://qiita.com/otupy/items/2f71d5f9c754b29d9555)

[100日後にエンジニアになるキミ - 14日目 - CSS - CSSの基礎1](https://qiita.com/otupy/items/61a97863f6df14171994)

[100日後にエンジニアになるキミ - 6日目 - HTML - HTMLの基礎1](https://qiita.com/otupy/items/cd2315dcb38671cfded0)

## フレームワーク

`フレームワーク`とはなんでしょうか？

`フレームワーク`はプログラミングにおいて目的に応じた一般的な機能が実装されたものです。
管理機構等を検討する時間を削減して、開発に置ける工数の削減や
品質の向上に役立つものです。

目的別では
`ソフトウェアフレームワーク`
`Web アプリケーションフレームワーク`
などが挙げられますが、よく用いられる用途としては
WEBサイトの構築です。

## ライブラリ

`ライブラリ`は汎用性の高い複数のプログラムを再利用可能な形でひとまとまりにしたものです。

目的別では
`機械学習`
`WEB開発`
`画像処理`
`音声加工`
など様々なものがありますが、これらを含めて
機能を実現したものが`フレームワーク`ということになります。

## 汎用フレームワーク

言語別に様々なフレームワークがあるので紹介していきます。

### Ruby on Rails

![download.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379626/f554343f-3b97-67aa-ca45-7f4b54f3144e.jpeg)


`Ruby on Rails`はオープンソースのWebアプリケーションフレームワークです。
単にRailsと呼ばれます。

Rubyで書かれており、`Model`,`View`,`Controller`のMVCアーキテクチャに基づいて構築されていて
アプリケーションの開発を他のフレームワークより少ないコードで簡単に開発できるよう考慮し設計されています。

## Spring Framework

![download.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379626/1b7391cf-46ed-2756-f9e4-641339729569.png)


Javaプラットフォーム向けのオープンソースアプリケーションフレームワークで
単に`Spring`とも呼ばれます。

`Model View Controller`
`データベースアクセス`
`テスト機能`
`バッチ処理`
`認証機能`
など様々な機能を提供します。

## Laravel

![download.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379626/54bfa41b-b121-69ba-a8bb-51d93f4cf232.png)

オープンソースのPHPで書かれたWebアプリケーションフレームワークです。

GitHubでのスター獲得数がPHP, Ruby, Python等のバックエンド系プログラミング言語の
フレームワーク中で最も多いなど、人気のフレームワークの1つとなっているようです。　

## Vue.js

![download-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379626/9d381147-c76e-a4b8-c9e2-9aebcbd959c7.png)

`Vue`はWebアプリケーションにおけるユーザーインターフェイスを構築するための
オープンソースのJavaScriptフレームワークです。

他のJavaScriptライブラリを使用するプロジェクトへの導入において
容易になるように設計されている一方で
高機能なシングルページアプリケーション`SPA`を構築することも可能で担っています。

## Django

![download.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379626/cad50ccc-6ff4-8325-eba7-dc37feb07044.png)

`Django`はPython言語で書かれたWEBアプリケーションフレームワークです。
`ジャンゴ`と呼びます(dは発音しない)

Pythonでは他にもWEBアプリケーションを作成するためのフレームワークがありますが
データベース周りの処理や認証機能などきめ細かな機能が備わっているので
開発工数の削減に貢献しますが、学習コストは高めです。

Ruby On Railsと似たようなチュートリアルが有るので、これを試してみて
進められるかどうかを判断するのが良いでしょう。





## まとめ

最近の開発ではほとんどがフレームワークを用いた開発です。
フレームワークの概念や種類などを押さえておきましょう。

初めからフレームワークをやろうとすると必ず挫折します。
フレームワークを覚えるのは言語になれ、アプリケーションの作り方などが
分かってきてから学習するのが良いでしょう。

君がエンジニアになるまであと56日

## 作者の情報
乙pyのHP：
http://www.otupy.net/

Youtube：
https://www.youtube.com/channel/UCaT7xpeq8n1G_HcJKKSOXMw

Twitter：
https://twitter.com/otupython
JavaScriptでＣＳＶダウンロードを実現する

タイトルの通り

``` Javascript
// ---------------------------------
// CSVダウンロード処理
// data : csvの中身(カンマ区切り、改行はセルフで)
// filaname : ダウンロードするファイル名
// ---------------------------------
const csvDownload = function(data, filename) {
    
    // UTF BOM
    var bom = new Uint8Array([0xEF, 0xBB, 0xBF]);
    // リンククリエイト
    var downloadLink = document.createElement("a");
    downloadLink.download = filename + ".csv";
    // ファイル情報設定
    downloadLink.href = URL.createObjectURL(new Blob([bom, data], { type: "text/csv" }));
    downloadLink.dataset.downloadurl = ["text/csv", downloadLink.download, downloadLink.href].join(":");
    // イベント実行
    downloadLink.click();
}
``` 

ajaxで書き込むデータ取得して、dataとして渡してあげる等で使ったり
gitコマンド（戻したい時編）

##はじめに
gitコマンド使っている時に「あ、やってしまった」「もどしたいな」そんなことはありませんか。
そんな時に便利なように戻れるgitコマンドをまとめました。

##実際に戻るgitコマンドを見てみる

###addする前に編集内容を取り消したい時

```:
git checkout [ファイル名]
```

ファイル名のところを`.`にすると、ステージング前の全ての変更内容がなくなります。

###ステージングを取り消したい時

```:
git reset [ファイル名]
```

編集内容は残ります。
全てのステージングを取り消したい時はファイル名を指定しないでください。

```:
git checkout HEAD -- [ファイル名]
```

ステージしたファイルを最後にコミットした状態に戻せます。
ここで注意しておきたいのは編集内容は残らないということです。

###コミットのバージョンを戻したい時

```:
git reset --hard [コミットid]
```

コミットidは`git log`コマンドでたたくと戻りたいコミットのidが分かります。
スペースで区切って複数指定することも可能です。

##おわりに
いかがでしたでしょうか。
戻すというのは基本的にはあまり奨励しませんのでミスの無いように集中して作業しましょう。
Rails path vs url

# 違いって何？

rails c からそれぞれの違いについて見てみる。
xxx_path は、 `/path/to/url` のルートパスを出力する
xxx_urlは、 `https://path/to/url` の絶対パスを出力する

```
[1] pry(main)> app.dashboards_path
=> "/dashboards"
[2] pry(main)> app.dashboards_url
=> "http://www.example.com/dashboards"
```

# どちらを使った方がいいの?
Rails Guideでは、xx_pathをつかようようにしている。Rails Guideにしたがって、xx_pathを使った方が良いと思う。

> Railsチュートリアルでは一般的な規約に従い、基本的には_path書式を使い、リダイレクトの場合のみ_url書式を使うようにします。これはHTTPの標準としては、リダイレクトのときに完全なURLが要求されるためです。

ref: [5.3.2 RailsのルートURL](https://railstutorial.jp/chapters/filling_in_the_layout?version=5.1#sec-rails_routes)

# redirect_toの時の処理
redirect_toで xx_path をした場合 xx_url に自動的に変換されるため、区別しなくても良い
具体的には、`redirect_to xx_path` を実行した際 `redirect_to '/dashboards'` として実行され、
`_compute_redirect_to_location` の中で protocol, portが追加され、絶対パスのURLに変換される。

```ruby
module ActionController
  module Redirecting
    def redirect_to(options = {}, response_options = {})
      ...
      self.location      = _compute_redirect_to_location(request, options)
      ...
    end    

    ...
    def _compute_redirect_to_location(request, options) #:nodoc:
      case options
      ...
      when String
        request.protocol + request.host_with_port + options
      ...
```
ref: [actionpack/lib/action_controller/metal/redirecting.rb](https://github.com/rails/rails/blob/d1d98f3a2404b61457403cc0220fe1a06f3e6acb/actionpack/lib/action_controller/metal/redirecting.rb)


# まとめ
- xx_pathはルートパス、xx_urlは絶対パス
- 絶対パスの方が信頼性は高い
- Railsでredirect_to をした時はどちらも絶対パスになる

# 参考文献
- [「絶対パス」「相対パス」「ルートパス」ってなに？](https://qiita.com/49497974m/items/919985f3a6f6a6b19ee8)
- [Rails Guide](https://railstutorial.jp/chapters/filling_in_the_layout?version=5.1#sec-rails_routes)
AWS YAML の JSON パーサー

## 動機
AWS の設定ファイルは JSON より YAML 派なんだけど、設定ファイルを Node.js (JSON) で処理したい。

AWS 独自の組み込み関数が使われていて、そのおかげで便利なんだけど、普通のYAMLパーサーだと読めない。
(組み込み関数のドキュメントは [こちら][1])

そこで、組み込み関数を出来る限りエミュレートした専用パーサーを用意した。


## ソースコード
https://github.com/exabugs/aws-yaml


## インストール

```
yarn add aws-yaml
```

## 使い方

```
import yaml from 'aws-yaml';
import fs from 'fs';

const buff = await fs.promises.readFile('template.yaml', 'utf8');
const json = yaml.load(buff);

const { Resources } = json;
```

## 使える関数

| full          | short      |
| ------------- | ---------- |
| Ref           | !Ref       |
| Fn::Join      | !Join      |
| Fn::Select    | !Select    |
| Fn::Split     | !Split     |
| Fn::GetAtt    | !GetAtt    |
| Fn::Sub       | !Sub       |
| Fn::FindInMap | !FindInMap |
| Fn::GetAZs    | !GetAZs    |
| Fn::If        | !If        |
| Fn::Equals    | !Equals    |
| Fn::And       | !And       |
| Fn::Or        | !Or        |
| Fn::Not       | !Not       |
| Fn::Base64    | !Base64    |
| Fn::Cidr      | !Cidr      |

## 使えない関数

| full            | short        |
| --------------- | ------------ |
| Fn::ImportValue | !ImportValue |
| Fn::Transform   | !Transform   |


[1]:https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference.html
Vue.js　ディレクティブの基礎２

#Vue.js　ディレクティブの基礎２

前回の記事はこちら
[Vue.js　ディレクティブの基礎１](https://qiita.com/fumiya0414/items/c8ba3edd71052fae018f)

##双方向データバインディング v-model
[jsfiddle](https://jsfiddle.net/)で実際に記述しながら読むことをおすすめします。

双方向データバインディングでは
Vue.jsとhtmlが双方向に同期します。

dataオブジェクトの値変更→テンプレートの値変更
テンプレートの値変更→dataオブジェクトの値変更

サンプルコードを書いてみます。

```html:index/html
<div id="app">
  <p>
    <input type="text" v-model="message">
  </p>
   <p>
    <input type="text" v-model="message">
  </p>
  
  <pre>{{ $data }}</pre> <!-デバッグ用-->
  
</div>



<script src ="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
```

```javascript:index.js
var app = new Vue({
  el:'#app',
  data:{
    message:'Hello Vue.js!'
  }
})
```
実行結果
[![Image from Gyazo](https://i.gyazo.com/463daae60d5ed6fa2ae5c56a66220ee9.gif)](https://gyazo.com/463daae60d5ed6fa2ae5c56a66220ee9)

上のinputタグで中身を書き換えると
Vue.jsのdataオブジェクトの中身が書き換わり
下のinputタグと同期するという流れです。

Vue.jsのdataオブジェクトを書き換えると
両方のinputタグの中身が同期して書き換わります。

##コンポーネントとは

コンポーネントはページを構成するUI部品です。
よく使う機能をコンポーネント化することで
コードの可読性が良くなります。

helloと表示するコンポーネントを作成して
３回繰り返して表示してみましょう。

```html:index/html
<div id="app">
  <hello-component></hello-component>
  <hello-component></hello-component>
  <hello-component></hello-component>
</div>

<script src ="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
```

```javascript:index.js
Vue.component('hello-component',{
	template:'<p>hello</p>'
})

var app = new Vue({
	el:'#app'
})
```
実行結果
[![Image from Gyazo](https://i.gyazo.com/87953a8d6e969a51fdb0a4e7e41e8d42.png)](https://gyazo.com/87953a8d6e969a51fdb0a4e7e41e8d42)

コンポーネントはvueインスタンス作成よりも上に記述します。

ここまでで基本のディレクティブは終了です。
次回はこれまでの内容を利用してtodoアプリを作成します。

[Vue.jsで作るtodoアプリ](https://qiita.com/fumiya0414/items/8d22c23dc0bff63dcc02)
kubernetesのWorker NodeでSwapを有効にする方法

一般的にkubernetesではswapを利用することができません。
クラウド環境では問題になるケースは少ないかと思いますが、オンプレ環境でメモリを動的に増やすことができない環境では厳しい制約になり得ます。

さらに言えば、メモリ容量が多い場合であっても、なおswapには利用価値があります。

> The casual reader may think that with a sufficient amount of memory, swap is unnecessary but this brings us to the second reason. A significant number of the pages referenced by a process early in its life may only be used for initialisation and then never used again. It is better to swap out those pages and create more disk buffers than leave them resident and unused.
https://www.kernel.org/doc/gorman/html/understand/understand014.html

```
＜拙訳＞
お気楽な読者の方は、メモリが充分にある状況ではswapは不要だと考えるかもしれませんが、私たちはこれに対して次の理由を提示します。
プロセス起動時に参照される膨大な量のページは初期化処理にのみ利用され、その後2度と利用されない、というケースがあり得ます。
この場合、これらのページをスワップアウトしてディスクバッファを作るほうが、メモリ内に留めて使わないままにして置くよりもベターです。
```

このような動機からkubernetesでswapを有効にする方法を調べたので、以下に記載します。

## 想定環境

環境起因な方法ではありませんが記載の都合上、以下の環境を想定します。

- kubeadmで環境構築を実施している
- Master Node、Worker Nodeが分離している

また説明の簡略化のため、Master Nodeは構築済みとの前提です。

## 手順

```
[Worker Node]
$ kubeadm join ...
```
※「...」部分はMaster Node起動時に出力された値を埋めてください。

kubeadmではkubeadm join実行時にSwapが無効になっていることをチェックし、有効になっている場合は処理を停止するようになっているため、まずはSwapを無効化した状態でWorker Nodeをクラスターに参加させます。

```
[Master Node]
$ kubectl get nodes
NAME     STATUS   ROLES    AGE   VERSION
master   Ready    master   11d   v1.18.2
worker   Ready    <None>   11d   v1.18.2
```
クラスターに参加できたことを確認します。上記のようにWorker Nodeの情報が出力されればOKです。

```
[Worker Node]
$ sudo echo "failSwapOn: false" >> /var/lib/kubelet/config.yaml
$ sudo systemctl daemon-reload
$ sudo swapon -a
$ sudo sed -i -e "s/#\/dev\/mapper\/vagrant--vg-swap_1/\/dev\/mapper\/vagrant--vg-swap_1/g" /etc/fstab
$ sudo systemctl restart kubelet
```

ここが肝です。
1) Swap有効化でも動作するようkubeletの設定に追記
2) Swap有効化
3) kubelet再起動
をしてやるとkubernetesのWroker NodeでSwapを利用できます。
JavaScriptにおける、formのループ

以下のようなformのHTMLがあったときに

``` HTML
  <form id="formdata">
    <input type="text" value="" name="text1">
    <input type="text" value="" name="text2">
    <select name="select1" >
      <option value="option1">option1</option>
      <option value="option2">option2</option>
      <option value="option3">option3</option>
    </select>
  </form>
```

form内でループするには

``` Javascript
// formタグを取得
var formdata = document.getElementById("formdata");
// データ分のループ
for (var idx = 0; idx < formdata.elements.length; idx++) {
    // 値を取りたいとき
    var formvalue = formdata.elements[idx].value;
    // nameを取りたいとき
    var formname = formdata.elements[idx].name;
    // console.log(formvalue);
    // console.log(formname);
}
```

同じnameがあるとき(nameが配列になる時は、考慮が必要なので注意)
JavaScriptのfunction命令は静的な構造を宣言することを確かめてみた

#はじめに
JavaScriptのfunction命令は、コードを解析/コンパイルするタイミングで、関数を登録しているらしい。
つまり、function命令は、実行時にはすでにコード内の構造の一部となっているので、同じかそれ以下のスクリプトブロック（`<script>`）内であれば、関数を宣言する行より前でも関数を呼び出すことができる。

##三角形の面積を求める関数を作成
まずは、普通に三角形を求める関数を作成する。


```main.html
<!--jsを読み込むためのhtml-->
<!DOCTYPE html>
<html lang="en" dir="ltr">
    <head>
        <meta charset="utf-8">
        <title></title>
    </head>
    <body>
        <script src=./triangle.js></script> <!--読み込むjs-->
    </body>
</html>

```

```triangle.js
        function getTriangle(base, height){
            return base*height/2;
        }

        console.log(getTriangle(5, 2));  //5
```

##function命令より前で関数を呼び出してみる

```triangle.js
        console.log(getTriangle(5, 2));  //5←呼び出せる。

        function getTriangle(base, height){
            return base*height/2;
        }

```
##異なるスクリプトブロックから呼び出してみる。

```main.html
<!--jsを読み込むためのhtml-->
<!DOCTYPE html>
<html lang="en" dir="ltr">
    <head>
        <meta charset="utf-8">
        <title></title>
    </head>
    <body>
        <script src="./test.js"></script><!--新しく読み込むjs-->
        <script src=./triangle.js></script>
    </body>
</html>

```

```triangle.js
       // console.log(getTriangle(5, 2));  コメントアウトします 

        function getTriangle(base, height){
            return base*height/2;
        }

```

```test.js
        console.log(getTriangle(5, 2)); //ここから呼び出します。
```
####結果
```
test.js:1 Uncaught ReferenceError: getTriangle is not defined
    at test.js:1
```
呼び出せなかった。なぜならブラウザは`<script>要素の単位で、順にスクリプトを処理していくためである。`※同じスクリプトかtriangle.jsより下の行であれば呼び出せる。

##function命令ではなく、関数リテラルやfunctionコンストラクタの場合はどうか

####関数リテラル

```Sankaku.js
    console.log("getSankaku:"+getSankaku(5, 2));

    var getSankaku = function(base, height){
        return base*height/2;
    };

//Uncaught TypeError: getSankaku is not a function
```
####frunctionコンストラクタ

```getDreieck.js
console.log("getDreieck:"+getDreieck(5, 2));

getDreieck = new Function('base', 'height', 'return base*height/2');

//Uncaught TypeError: getDreieck is not a function
```

両方ともエラーになる。理由はfunction命令とは異なり、`関数リテラルとFunctionコンストラクタは共に実行時に評価されるからである。`

##まとめ
**function命令**は静的な構造を宣言するため（解析の時点で関数を登録している）、同じかそれ以下のスクリプトブロック内であれば、どこからでも呼び出せる。

**関数リテラル**及び**Functionコンストラクタ**は動的に呼び出されるため、（実行時に評価される）必ず関数を宣言した後でなければ呼び出すことが出来ない。
###参考
JavaScript本格入門
java -jar をsystemdに登録する(systemctlで制御可能にする)

# 起動スクリプト

```start.bash
#!/bin/bash
cd jar配置パス # へ移動
java -jar server.jar
pid=$!
touch $pid.pid # PIDファイルを作成する
```

# 停止スクリプト

```stop.bash
#!/bin/bash
cd jar配置パス # へ移動
pidFile=`ls *.pid`
pid=${pidFile%.*}  # {pid}.pidファイルからpidを取得
echo $pid stop server 
kill $pid # kill
rm -rf $pidFile # pidファイル削除
```

# envファイル

```bash
printenv > /etc/system/env
```
実行するユーザで雑に。

# Unitファイル

```bash
vi /usr/lib/systemd/system/サービス名.service
```

Unitファイルの内容
[document](https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/system_administrators_guide/sect-managing_services_with_systemd-unit_files)

```bash
[Unit]
# サービスの説明文です。内容は自由です。
Description = server process

[Service]
User = root
EnvironmentFile = /etc/systemd/env
ExecStart = /?/start.sh
ExecStop = /?/stop.sh
Restart = on-abort
Type = forking # 上のsh構成なら、onceでも良さそう。

[Install]
WantedBy = multi-user.target

```
### WantedBy
> サービスを起動するターゲットを指定します。ターゲットは、従来のランレベル概念の代替と見なすことができます。詳細は「systemd ターゲットでの作業」を参照してください。

普通の用途では、`multi-user.target`か`graphical.target`。

* poweroff.target
* rescue.target
* multi-user.target
* graphical.target
* reboot.target

# コマンドメモ

## 反映
```bash
systemctl daemon-reload
```

## OS起動時、自動起動
```bash
systemctl enable サービス名.service
```

## 起動
```bash
systemctl start サービス名.service
```

## 停止
```bash
systemctl stop サービス名.service
```

## ログ
上記のsh構成だと、標準出力に何も出ないかも。
独自にロギングしていればそっちで管理するパターンもあるかと。

```bash
journalctl -f | grep サービス名
```

# 追記

## さらに簡単に
CPUAccounting=yes により、cpu time

```sh
[Unit]
Description = 説明
[Service]
CPUAccounting=yes
User = ユーザー
Group = グループ
EnvironmentFile = /etc/systemd/env
WorkingDirectory= 実行ディレクトリ
ExecStart= java -jar ****.jar
Restart = on-abort
Type = simple
[Install]
WantedBy = multi-user.target

```
Spring Boot+PostgreSQLのエラー解消方法


現在、Springの勉強を行っているので、躓いた箇所等を備忘録として、ここに記載することにしました。

#勉強教材
Spring徹底入門 Spring FrameworkによるJavaアプリケーション開発 
※Spring Bootのバージョン1.3の為、そのままでは上手くいきません。

#躓いた箇所：14章
対象ページ：p632～659
アプリ実行後、コンソールに以下のエラーが発生した。

```
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource 
[org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: 
Invocation of init method failed; nested exception is javax.persistence.PersistenceException: 
[PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is 
org.hibernate.tool.schema.spi.SchemaManagementException: Schema-validation: missing table [meeting_room]

Caused by: javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate 
SessionFactory; nested exception is org.hibernate.tool.schema.spi.SchemaManagementException: Schema-
validation: missing table [meeting_room]

Caused by: org.hibernate.tool.schema.spi.SchemaManagementException: 
Schema-validation: missing table [meeting_room]
```
#対処方法
下記2つのファイルの記述を追記して、エラーを解消することが出来た。

```java:application.properties
spring.datasource.initialization-mode=always
spring.jpa.open-in-view=true
```
以前のバージョンでは、schema.sqlとdata.sqlをsrc/main/resources直下に置いておけば、アプリケーション起動時に実行されるようになっていたらしい。
新バージョンでは、spring.datasource.initialization-modeのデフォルトはembeddedとなっており、H2でなければ実行されない設定になっている。
そこで、alwaysにすることで何でもOKに設定することが出来る。


```java:hibernate.properties
hibernate.jdbc.lob.non_contextual_creation=true
```
application.propertiesファイルと同じ場所に作成し、下記の行を記述する。
Djangoのアプリ全体で使える変数の設定方法〜テンプレートなどで便利〜

Djangoでアプリを作成するときサイト全体で使用できる定数（変数）があると便利なことが多いかと思います。

たとえば、アプリ名やバージョンなどサイト全体で表示させるテキストです。

Djangoでは、コンテキストプロセッサー(Context Processor）を使用して、定義した定数を取り出します。もちろん、複数設定可能です。

# 環境
| ソフト | バージョン |
|---|---|
| Nginx  | 1.16.1  |
| uWSGI  | 2.0.18  |
| Python | 3.8.2 |
| Django | 3.0.5 |

Django 3.0.x でのやり方になります。

# Templateで扱う変数は、通常viewを通じて渡すが…
Templateでは、`{{ 変数 }}`というようにして変数を取得して表示しますが、これは通常viewを通じて渡されます。このやり方だとアプリ毎に変数を渡す処理を記述する必要があり、非効率的です。

## 通常の参照方法
```python:test/view.py
def viewFunc(request):
  template_name = "template.html"
  context = {"variable" : "hello world!"}
  return render(request,template_name,context)
```
アプリのviewにview関数を作成し、contextとして値を渡します。

```html:template.html
<p>{{ 変数名 }}</p>
```
このような形でテンプレート内で表示します。

# アプリ全体で使用できる定数の設定
コンテキストプロセッサー（Context Processor）を作成することで、アプリ全体への値/オブジェクト渡しが可能になります。

```python:app/settings.py
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [
            os.path.join(BASE_DIR, 'templates'),
        ],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                …
                'mlapp.context_processors.constant_text',, #これを追加
            ],
        },
    },
]
```

これから追加するconstant_textという関数がテンプレートの値を取得するものになります。

```python:app/context_processors.py
def constant_text(request):
    return {
        'APP_NAME': 'TEST APP',
    }
```

`return`のところに`APP_NAME`というのを追加しています。`context_processors.py`は,`settings.py`と同じディレクトリ内に作成します。


```html:template.html
<p>{{ APP_NAME }}</p>
```
これで、アプリ全体から変数を取得し、テンプレートで表示することが可能になります。たったこれだけなので、簡単です。

# settings.pyに値を設定したい場合

```Python:settings.py
APP_DESCRIPTION='This is a test app.'
```
`settings.py`に変数を作り、値を代入します。

```python:app/context_processors.py
from django.conf import settings

def constant_text(request):
    return {
        'APP_NAME': 'TEST APP',
        'APP_DESCRIPTION': settings.APP_DESCRIPTION,
    }
```

`settings.py`から値を読み込みます。
```html:template.html
<h1>{{ APP_NAME }}</h2>
<p>{{ APP_DESCRIPTION }}</p>
```
このようにすることで、`settings.py`の値も扱えるようになります。

とっても簡単ですね。
Django Girls Tutorialの修正を提案する

# 概要

ブラウザだけで[Django Girls のチュートリアル](https://tutorial.djangogirls.org/ja/)の修正を[GitHub](https://github.com/)で提案する方法。 　例としてチュートリアルの最初のページのライセンスのリンク先を修正する。
翻訳は[crowdin.com](https://crowdin.com/project/django-girls-tutorial)で管理されていますがタイプミスや簡単な修正は[GitHub](https://github.com/)を使います。(と思ってましたがDjango Girls JapanのSlackで確認中です)

# 環境

多分、ほとんど関係ないです。

* macOS Catarina 
* Safari バージョン13.1

# 手順

1. Githubアカウントを持っていない人は[GitHub](https://github.com/)にアクセスし、Sign upをクリックして無料の新規アカウントを作成してください。
2. ブラウザで[https://github.com/DjangoGirls/tutorial](https://github.com/DjangoGirls/tutorial)を開く。
3. Forkボタンを押す。

	これでコピーを自分のGithubアカウントに作成します。
	<img width="547" alt="fork.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101760/6bccb2d8-fb3c-5a4d-7446-9bc8e202b5fc.png">

4. 言語別に分かれているのでjaをクリック
	<img width="373" alt="ja.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101760/3a5b879e-db3f-b974-8ae5-a5253ab68f2b.png">  
	各章ごとにフォルダが分かれています。  例えばコードエディタのページ https://tutorial.djangogirls.org/ja/code_editor/ は https://github.com/hitokuno/tutorial/tree/master/ja/code_editor のREADME.mdを修正します。  
	<img width="373" alt="codeEdtior.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101760/f04b541f-d944-faa3-79a1-0a485fb53cda.png">


5. 編集したいページを編集モードに切り替えます。

	<img width="995" alt="edit.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101760/09d2ce36-2f44-3601-5e4d-3524b7cd0411.png">  

6. 編集後にCommit changesを押してGithubに保存する。

	概略と詳細は英語にしましたが日本語でも良いかも知れません。  
	<img width="764" alt="commit.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101760/cde5f9c5-69ce-6328-22e9-19907a644d32.png">

7. New pull requestを押して作成画面に移動する。

	<img width="380" alt="pullRequest.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101760/1de34841-e140-0534-749f-49916fb49923.png">

8. 変更内容を確認して、Create pull requestを押す。
	<img width="859" alt="createPullRequest.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101760/4d82c20b-faa9-2d8c-d846-b4aca43c6cb4.png">


9. 変更点を箇条書きで書き、Create pull requestを押す。
	<img width="761" alt="createPullRequest.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101760/1beb5eda-512b-18ca-571a-81c3928faf68.png">


10. 完了！
	問題が無ければマージ(提案の取り込み)が行われます。  
	<img width="752" alt="onfirm.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101760/3bc3f830-e952-6eec-0fc7-63de5d326895.png">


# あとがき

同じ変更は[https://crowdin.com/](https://crowdin.com/)で修正されたので取り消し(Close)ました、、、