OmniAICreator/Qiita-1.07M huggingface dataset:
StripeでRefund(払い戻し)する額が残高を上回る場合にやること

レアケースな気もしますが同じように困る方もいらっしゃるかもしれないので共有をば。

## そもそもRefundできるのか
結論から言うと「Refund の処理はできるが、Pendingとなり残高がPositiveになるまで実際の返金処理は行われない」です。

次のサポートページにはこう書かれています。
https://support.stripe.com/questions/pending-refunds-due-to-insufficient-funds-or-stripe-balance

> In the event you issue a refund to a customer that results in a negative Stripe balance, the refund will show as “pending.” The refund will not be sent to your customer until your balance is repaid and brought back into the positive and the full refund amount is available (either from new charges that increase the balance on your account, or from a wire transfer to Stripe).

なので `Refund` という処理自体は実行できるが、実際にユーザに返金はされずPendingのステータスになるだけというわけですね。

## どうやって解消するのか

まず日本では連携している銀行口座から自動で引き落としとかはしてくれません。
https://support.stripe.com/questions/negative-balances-in-stripe-handling-by-country

なのでできることと言うと一つに売り上げが上がるのを待つことです。
Pendingのステータスはいつまで待ってくれるのかは分かりませんが、Stripe的には実際には払い戻していないのでいつまでも待ってくれそうな気はします。あとは自演で支払ってもいいかもしれません(手数料の3.6%が失われますが)(でもこの状況発生してRefundすぐやらなきゃいけない場合はこれするしかなさそう)

ただ、Stripeの使い方によっては定常的な売り上げが見込めない場合もあるかもしれません(イベント用に単発的に使った場合とか)。
なので、そういった場合はStripeのサポートに問い合わせて、請求書を発行してもらい口座振り込みをする必要があります。

お問い合わせはこちらからできます。
https://support.stripe.com/contact/email

日本法人あるみたいなので多分日本語でもOKです。
https://stripe.com/jp/support-and-services
PEP-362 (Function Signature Object) を読んだよメモ

`__signature__` という属性がどこからやってきたのを理解するために [PEP 362 -- Function Signature Object](https://www.python.org/dev/peps/pep-0362/) を読むことになったので、自分の理解をメモに残しておく。

## 概要

* これまで関数シグネチャの表現は複雑な形式で表現されていた
* PEP 362 では、関数シグネチャを表現する `Signature` というクラスを使って、関数シグネチャをシンプルに表現できるようにする
* また、 inspect.signature() という関数を使って、かんたんに関数オブジェクトから関数シグネチャを取り出せるようにする

## 感想

あとは細かい使い方なので説明は省きます。PEP 362 を読んでもいいし、Python のドキュメントの [inspect のページ](https://docs.python.org/ja/3/library/inspect.html#introspecting-callables-with-the-signature-object) を読んでもよいです。
かつて `inspect.getargspec()` やオブジェクトの属性を駆使して関数シグネチャを読み取っていた過去がありましたが、いまや `inspect.signature()` ひとつで大抵のことが事足りるようになりました。ビバ、Signature。

さて、最初の疑問であった `__signature__` についてもこの PEP で言及されていました。`Signature` オブジェクトを `func.__signature__` に保存しておくと `inspect.signature()` はその値を返してくれる、とのことです。つまりキャッシュみたいなものですね。

なお、PEP 362 では C拡張については対象外とされていましたが、[Argument Clinic How-To](https://docs.python.org/ja/3/howto/clinic.html) を流し読みした限りでは、C ファイルのプリプロセッサである Argument Clinic を使って(従って)C拡張を作ると Signature に対応したモジュールが作れるようです。便利ですね。

なかなか関数シグネチャを必要とする場面は少ないのですが、引数や関数の型について調べたいに活躍するので試してみてはどうでしょうか。
AtCoder パナソニックプログラミングコンテスト2020 参戦記

# AtCoder パナソニックプログラミングコンテスト2020 参戦記

## [panasonic2020A - Kth Term](https://atcoder.jp/contests/panasonic2020/tasks/panasonic2020_a)

2分半で突破. まあ、書くだけ.

```python
K = int(input())

t = [1, 1, 1, 2, 1, 2, 1, 5, 2, 2, 1, 5, 1, 2, 1, 14, 1, 5, 1, 5, 2, 2, 1, 15, 2, 2, 5, 4, 1, 4, 1, 51]
print(t[K - 1])
```

## [panasonic2020B - Bishop](https://atcoder.jp/contests/panasonic2020/tasks/panasonic2020_b)

6分くらい?で突破. 1WA. H と W が1の場合をすっかり忘れてました.

```python
H, W = map(int, input().split())

if H == 1 or W == 1:
    print(1)
elif W % 2 == 0:
    print(H * W // 2)
else:
    if H % 2 == 0:
        print(H * W // 2)
    else:
        print((W + 1) // 2 + (H - 1) * W // 2)
```

## [panasonic2020C - Sqrt Inequality](https://atcoder.jp/contests/panasonic2020/tasks/panasonic2020_c)

敗退. 整数で計算しないと駄目なんだろうとは分かっていても、整数の式に落とせなかった. 二回二乗すればいいじゃんと言われればあああーってすぐ分かるやつ. 何故かコンテスト中は分からない orz. 数学問題嫌いだー.

```python
a, b, c = map(int, input().split())

if c - a - b > 0 and (c - a - b) * (c - a - b) > 4 * a * b:
    print('Yes')
else:
    print('No')
```

## [panasonic2020D - String Equivalence](https://atcoder.jp/contests/panasonic2020/tasks/panasonic2020_d)

32分半で突破. 1WA. 何回読んでも、何回読んでも定義が頭に入ってこなくて困った. で、完全に定義を誤解して出して WA を食らい、その後に N = 4 くらいまで手で全部書いてようやく分かって AC. 要するに N - 1 までの文字列に、aからそれまでに出ている文字の一番辞書順で大きいやつの次のやつまでを追加したのが答え.

```python
N = int(input())

q = ['a']
for i in range(N - 1):
    nq = []
    for s in q:
        stop = ord(max(s)) + 2
        for i in range(ord('a'), stop):
            nq.append(s + chr(i))
    q = nq
for s in q:
    print(s)
```
ArduinoでAitendo ATD1602CPを使う

# ATD1602CPとは
aitendoで取り扱われている「I2CキャラクタLCDモジュール（16x2）」です。[(販売ページ)](https://www.aitendo.com/product/17458)
このLCDモジュールはコントローラICに「SPLC792A(ST7032互換)」を搭載しており、I2C通信で制御することができます。

特徴として、ピン間隔が2.54mmピッチのため変換基板等を必要としません。

# 回路図
![ATD1602CP.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/602898/f907665d-a638-ea83-0a10-eee41a92985d.jpeg)

LCDに対して上図の通り配線します。
SHL及びDIRCはLCD表示向きを決める端子で、VCC GNDのどちらかに接続します。
組み合わせによりLCD表示を左右・上下逆に変更することができます。
なお、図の結線では、ピンを手前にした場合に正しく表示される向きとなります。

# プログラム
## LCD_ST7032ライブラリの導入
ST7032用ライブラリにはいくつかの種類がありますが、ここでは「LCD_ST7032」を使用しました。
Arduino IDEのライブラリマネージャにて「LCD_7032」をインストールしておきます。

# プログラム
以下の通りとしました。(サンプル参照）

```C
#include <LCD_ST7032.h>

LCD_ST7032 lcd;

void setup() {
  lcd.begin();
  lcd.setcontrast(24); //コントラスト値を指定する(0-63) 推奨値:25@5V or 50@3.3V
}

void loop() {
  static int counter = 0;
  
  // 1行目を表示
  lcd.setCursor(0, 0);  //1行目 0文字目
  lcd.print("Hello World");

  // 2行目を表示
  lcd.setCursor(1, 0);
  lcd.print(counter/10, DEC);
  lcd.write('.');
  lcd.print(counter%10, DEC);
  lcd.write(' ');
  delay(500);
  counter++;
}
```


# 動作例

![2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/602898/f9ba2ae9-be41-6595-f52e-3c357a8d682a.png)

動作例では互換Arduino Nanoへ接続しています。
正常に動作した場合、1行目に「Hello World」、2行目に0.5秒ごとに0.1ずつカウントアップする数字が表示されます。

# トラブルシューティング

## 表示が真っ白のまま
RESETピンが未接続の場合、なにも表示されません。
VCCへ接続した後、Arduinoのリセットボタンを押してください。

## 参考
・[データシート(http://aitendo3.sakura.ne.jp/aitendo_data/product_img/lcd/fstn/16X2-SPLC792-I2C/SPLC792A_V03_HAOTIAN.pdf)](http://aitendo3.sakura.ne.jp/aitendo_data/product_img/lcd/fstn/16X2-SPLC792-I2C/SPLC792A_V03_HAOTIAN.pdf)
・[商品ページ(https://www.aitendo.com/product/17458)](https://www.aitendo.com/product/17458)
Pythonでパナソニックプログラミングコンテスト2020を解きたかった

### はじめに
今回はA,Bしか解けませんでした。ABC相当のコンテストでAとBしか解けないのは良くない。

### A問題
[問題](https://atcoder.jp/contests/panasonic2020/tasks/panasonic2020_a)

**考えたこと**
問題に書いてある数列をコピーして、kでindexを指定してprintしました。

```python
k = int(input())
l = [1, 1, 1, 2, 1, 2, 1, 5, 2, 2, 1, 5, 1, 2, 1, 14, 1, 5, 1, 5, 2, 2, 1, 15, 2, 2, 5, 4, 1, 4, 1, 51]
print(l[k-1])
```

### B問題
[問題](https://atcoder.jp/contests/panasonic2020/tasks/panasonic2020_b)
1WA
**考えたこと**
問題文の図を見ると、i行目とi+1行目を足すとWになると思ったのでhの偶奇で判別して計算しようとしたら1WAしました。WAの理由は、W,Hが1のときを考慮していなかったためです。ですので、どちらかが1のときを場合分けして書きました。

```python
import math
h, w = map(int,input().split())
if w == 1 or h == 1:
    print(1)
    quit()
if h % 2 != 0:
    ans = w * (h-1) / 2 + math.ceil(w / 2)
    print(int(ans))
else:
    ans = w * h / 2
    print(int(ans))
```

### C問題
[問題](https://atcoder.jp/contests/panasonic2020/tasks/panasonic2020_c)
12WA NoAC

**考えたこと**
やったー、数学の問題じゃんと思っていたら地獄を見ました。まずは、安直に全部sqrtにつっこんで計算して1WA付きたので、計算をうまく減らしてあげないといけないと思いました。ですので、紙とペンを用意して必死にゼロに近い数学力で計算していました。

```math
\sqrt(a) + \sqrt(b) < \sqrt(c)は両辺は0以上なので、両辺を二乗して \\
= a + b < c 
= a + b - c + 2\sqrt(ab)< 0 が成り立てば\sqrt(a) + \sqrt(b) < \sqrt(c)を満たす \\

a + b - cは整数だから計算的にあふれないと思ったので、\\
2\sqrt(ab)をどうやって処理するかを考えました。\\
相加相乗平均の関係より、 \\
a + b >= 2 \sqrt(ab) \\
が成り立つ。等号成立条件はa = bなので、そのときはifで分ければいいと考えてました。 \\ 
問題は、a != bのときで、自分の力ではどうしても根号を消すことができませんでした。 \\
```
それで、うまく工夫したつもりでしたがWAは消えず...結局ACできませんでした。
コンテスト終了した後に他のACした人のコードを見るとDecimalとかいうモジュールを使って小数をうまく計算していました。こんなに楽に計算できたら、楽勝問題だったのに...

<追記>

```python
from decimal import *

a, b, c = map(int, input().split())
if Decimal(a).sqrt() + Decimal(b).sqrt() < Decimal(c).sqrt():
    print("Yes")
else:
    print("No")
```
でACでました。
### まとめ
言語に対しての知識不足を再認識するコンテストでした。色々と悔しいし、悲しい。毎日AtCoderチャレンジをしているので、次回のコンテストこそは結果を残したいです。
では、おやすみなさい。
Vue.jsプロジェクトのセットアップ

Vue.jsのプロジェクトを最初から作る手順を紹介します。

### 前提条件
- npm、yarnがインストール済みであること

### @vue/cliのインストール
グローバルに@vue/cliをインストールしてvueコマンドを使用できるようにします。

```bash
$ npm install -g @vue/cli
```

### vueプロジェクトの作成
```bash
$ vue create project-name
```
```bash
? Please pick a preset: (Use arrow keys)
❯ default (babel, eslint) 
  Manually select features 
```

### 開発環境の起動
```bash
$ yarn serve
```
起動後、ブラウザからhttp://localhost:8080/で表示できます。

### production用build
```bash
$ yarn build
```
成功すると、distディレクトリにファイルが作られます。
Macでターミナルを再起動するとPATHを通したコマンドが使えなくなった

#自分の体験
1. 開発でMacを使うことになり、環境構築をしていた。
2. nvmをインストールし、下記のページ等を参考にし、~/.bash_profileにPATHを通すすための記述をした。
 https://photo-tea.com/p/17/hexo-start-kit-tools-4/
3. source ~/.bash_profileを実行　→　nvmコマンドが使えるようになった。
4. ターミナルを再起動すると再びnvmコマンドが使えなくなった(source ~/.bash_profileを実行すれば使えるという状態)。

#解決方法
・下記コマンドの実行
`ps -p $$`
psコマンドは、Linux上で動作しているプロセスを確認するためのコマンド。
-pというオプションは、指定したプロセス番号を表示するためのオプション？らしい。
$$はログインしているシェルのプロセス番号？を指すらしい。
表示されたのが-bashではなく-zshであれば、.zshrcファイルを編集する必要がある。

・~/.bash_profileファイルにPATHを通すための記載をしてある場合は、下記コマンドを.zshrcファイルに記載するだけでok
`source ~/.bash_profile`

#原因
使用しているMAcOSが"Catalina"の場合は、デフォルトシェルがzshになっているらしい。
https://news.mynavi.jp/article/osxhack-241/

#参考
https://eng-entrance.com/linux-command-ps#-pp--pidPID
https://qiita.com/soarflat/items/d5015bec37f8a8254380
https://raccoonico.com/nodebrew-nvm-zshrc/
https://kamotora.net/system/aix/shell-doubledolloar-mark/
https://wa3.i-3-i.info/word11032.html
Dash　実行はできるが表示されない問題 スペルミス編

# 初めに

原因は、スペルミスによう物でした

しかし、いつもならスペルミスがあると、実行できずエラーが出るはずだが、エラー分が出ず、データ情報だけが表示されなかったために、今回キータに記述しました



```common_lisp:hello.py

import dash 
import dash_core_components as dcc
import dash_html_components as html
import pandas as pd
import plotly.graph_objs as go
import datetime

external_stylesheets = ['https://codepen.io/chriddyp/pen/bWLwgP.css']

df = pd.read_csv('data_01.csv')

date = datetime.datetime.strptime(df['date'][0],'%Y/%m/%d').date()

dates = []
for _date in df['date']:
    date = datetime.datetime.strptime(_date,'%Y/%m/%d').date()
    dates.append(date)
    
n_subcribers = df['subscribers'].values
n_reviews = df['reviews'].values

diff_subcribers = df['subscribers'].diff().values
diff_reviews = df['reviews'].diff().values

app = dash.Dash(__name__, external_stylesheets=external_stylesheets)

app.layout=html.Div([
  html.Div(
    dcc.Graph(
      id='diff_sample',
      figure={
        'date':[
          go.Scatter(
            x = dates,
            y = n_subcribers,
            mode='lines+markers',
            name = '受講生の総数',
            opacity=0.7,
            yaxis='y1'
          )
        ]
      }
    )
  )
])

```

事項はできるがグラフに表示されない問題😩


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538355/00b1c7e8-eb22-f517-a403-d7a340932114.png)

##確認した事

①データの中身
②再度コードの確認


#結果

```
 'date’:[
```
になっていた

正しくは、

```
 ‘data:[
```

直すと正しく表示された
実行は、できるがデータが表示されない問題【 dash編 】

#dashで実行はできるがグラフが表示されない問題

###結論

実は用事されているが縦幅・横幅が合っていない事が表示されない理由でした


##エラー文・解決方法

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538355/ab98232a-3228-7ecf-4046-e4ea7c5164f6.png)

```common-lisp:hello.py
import dash 
import dash_core_components as dcc
import dash_html_components as html
import plotly.graph_objs as go
import pandas as pd
import datetime

external_stylesheets = ['https://codepen.io/chriddyp/pen/bWLwgP.css']

df = pd.read_csv('data_01.csv')

dates = []
for _date in df['date']:
    date = datetime.datetime.strptime(_date,'%Y/%m/%d').date()
    dates.append(date)
    
n_subcribers = df['subscribers'].values
n_reviews = df['reviews'].values

diff_subcribers = df['subscribers'].diff().values
diff_reviews = df['reviews'].diff().values

app = dash.Dash(__name__, external_stylesheets=external_stylesheets)



app.layout=html.Div(children=[
  html.H2(children='hello'),
  html.Div(children=[
    dcc.Graph(
      id='diff_sample',
      figure={
        'data':[
          go.Scatter(
            x = dates,
            y = n_subcribers,
            mode='lines+markers',
            name = '受講生の総数',
            opacity=0.7,
            yaxis='y1'
          ),
          go.Bar(
            x = dates,
            y = diff_subcribers,
            name="増加人数",
            yaxis='y2'
          )
        ]
      }
    )
  ])
])


if __name__ == '__main__':
  app.run_server(debug=True)
```

受講生の総数を現したラインが表示されていない


##解決方法

```
'layout':go.Layout(
  title="受講生総数",
  xaxis=dict(title="data"),
  yaxis=dict(title='受講生',side="left", showgrid=False,
  range=[2500, max(n_subcribers)+100]),
  yaxis2=dict(title='増加人数',side="right",overlaying='y', showgrid=False,
  range=[0, max(diff_subcribers[:1])])
)
```

xとyを指定するレイアウトを記述することにより解決しました


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538355/e6bc5786-5421-f29b-02dc-d91a5cbb5729.png)



#最後に

最近、dashでの学習を開始したが、データ分析に使うためなら、かなり簡単に使える模様
【Ruby】Unicorn で動かす一番小さいサンプルメモ

# メモ
- ほとんど参考サイトの写経
- ワーカープロセスを2つ動かす


## 事前準備
```ruby:Gemfile
source 'https://rubygems.org'

gem "unicorn"
gem "rack"
```

Rackアプリケーションの要件は以下とのこと。

- callというメソッドを持っていること
- callメソッドの引数としてWebサーバからのリクエストを受けること
- callメソッドは，次の要素を含むレスポンスを返すること
    - ステータスコード
    - レスポンスヘッダ（Hash）
    - レスポンスボディ（Array）

ちなみに以下変数 `env` の中身はリクエスト時に展開すると、以下のようにハッシュ構造でHTTPリクエストが渡される

```ruby
{"REMOTE_ADDR"=>"121.87.8.214",
 "REQUEST_METHOD"=>"GET",
 "REQUEST_PATH"=>"/",
 "PATH_INFO"=>"/",
 "REQUEST_URI"=>"/",
 "SERVER_PROTOCOL"=>"HTTP/1.1",
 "HTTP_VERSION"=>"HTTP/1.1",
 "HTTP_HOST"=>"18.182.112.198:8080",
```

```ruby:sample.rb
class SimpleApp
  def call(env)
     [
      200,
      { "Content-Type" => "text/html" },
      ["contents"],
    ]
  end
end
```

```ruby:config.ru
# coding: utf-8

require_relative 'simple_app.rb'
run SimpleApp.new
```

```unicorn.conf
worker_processes 2
```

## 実行
```zsh
% bundle install --path vendor/bundle
# config.ru は省略可能
# config.ru はアプリケーションのルートファイルとして読み込まれる
% bundle exec unicorn -c unicorn.conf config.ru
```


# 参考
第23回　Rackとは何か（1）Rackの生まれた背景：Ruby Freaks Lounge｜gihyo.jp … 技術評論社 http://gihyo.jp/dev/serial/01/ruby/0023

unicorn: Rack HTTP server for fast clients and Unix https://yhbt.net/unicorn/README.html
所有権・ムーブ・借用・参照

# 所有権
Rustの変数は束縛しているデータに対して以下のいずれかの権限を持っています。Rustがメモリ安全なのは、この権限によってメモリ破壊につながる操作を禁止しているからです。確保したメモリは開放を忘れてはいけないし、2度開放してもいけません。そのため、あるデータに対する所有者(変数)は常に一つであり、その変数がメモリを開放する責任を持っています。

||メモリの開放|値の変更|読み出し|
|:-:|:-:|:-:|:-:|
|所有(ミュータブル)|〇|〇|〇|
|所有(イミュータブル)|〇|×|〇|
|参照(ミュータブル)|×|〇|〇|
|参照(イミュータブル)|×|×|〇|
変数のデータを別の変数に代入する場合、古い変数から新しい変数に所有権が移ります。これをムーブといいます。
参照を作成し、それを他の変数が束縛すると所有権を移すことなく値にアクセスできます。これを借用といいます。

~~~rust
fn main() {
    let mut owner1 = 3; // owner1は3を所有しており、書き換えることもできる
    let owner2 = 5; // owner2は5を所有している
    println!("owner1 = {}, owner2 = {}", owner1, owner2);
    owner1 = 8; // 書き換え可能
    println!("owner1 = {}, owner2 = {}", owner1, owner2);

    // borrowerはowner1のデータを借用する
    // 可変な参照は１つしか作れない
    let borrower = &mut owner1;
    println!("borrower = {}", borrower);
    *borrower = 15; // 可変なので、借用しているデータは書き換えることが出来る　書き換えには*による参照外しが必要
    println!("borrower = {}", borrower);

    // 不変な参照はいくつあっても良い
    // 複数の変数がowner2のデータを借用する
    let borrower2 = &owner2;
    let borrower3 = &owner2;
    let borrower4 = &owner2;
    let borrower5 = &owner2;
    println!(
        "borrower2 = {}, borrower3 = {}, borrower4= {}, borrower5 = {}",
        borrower2, borrower3, borrower4, borrower5
    );
}
~~~

# 関数における所有権
引数に変数を渡すと所有権は引数に移ります。そして、関数のスコープを外れるときにメモリが解放されます。要するに、関数の引数に所有権を渡したデータは開放されます。
メモリを開放したくない場合は参照を渡します。

~~~rust
// この関数はdataの所有権を受け取り、関数の終了時にメモリを開放する。
fn take_ownership_and_delete(mut data:String){
    data.push_str("：データ1の所有権を得ました");
    println!("{}",data);
} // ここでdataのメモリは開放される

// この関数はdataを借用し、内容を変更する。
fn write_while_borrowing(data:&mut String){
    println!("{}",data);
    data.push_str("借用しました"); // 変更可能
} // dataは借用しているだけなのでここでメモリを開放しない。

// この関数はdataを借用する。
fn only_read_while_borrowing(data:&String){
    println!("{}",data);
    // data.push_str("参照しました"); //dataが持っているのは不変な参照なので変更できない。
} // dataは借用しているだけなのでここでメモリを開放しない。

fn main() {
    let data_main1 = String::from("データ1");
    take_ownership_and_delete(data_main1);  // 所有権は引数に移動する
    // println!("{}", data_main1); // data_main1所有権を失ったので使えない

    let mut data_main2 = String::from("データ2");
    write_while_borrowing(&mut data_main2); // 借用中に値は変更されるが所有権は渡さない
    println!("{}", data_main2);             // data_main2は所有権を持っているのでOK

    let data_main3 = String::from("データ3");
    only_read_while_borrowing(&data_main3); // 所有権の移動も値の変更もない
    println!("{}", data_main3);             // data_main3は所有権を持っているのでOK
}
~~~

# Copyトレイト
Copyトレイトを実装した型は動的なメモリを確保しておらず、shallow copyとdeep copyの違いがありません。そのため代入や関数呼び出しではデータがコピーされ、所有権の移動は起きません。

# 余談
借用と参照は制限付きポインタって感じですね。新しい概念というより、コーディング規約みたいなものかもしれません。メモリはプログラマが管理しています。コンパイラはミスを指摘するだけです。結局のところ、ポインタでも（注意すれば）メモリ破壊を起こさずコーディングできる能力が求められる気がします。

サンプルコードを書いていると、自分が思っていたより情報量が多いことに驚きました。コードが少ないので単純な処理に見えますが、メモリ管理のロジックも含まれており、見た目よりも複雑な処理です。要するに見た目からはメモリを管理していることが分かりずらく、Rustの難しさはこの辺からきているような気がします。

[目次](https://qiita.com/tonesuke/items/52e469f18e747c794376)
[PHP初学者向け]Laradockが便利だったのでPHPの動作確認できるプログラムを書いてみた

# はじめに・背景

最近、面接や書類選考でお祈りされる理由として、LAPRAS のページや Github を参考にして頂いたところ、

[参考: 当方の LAPRAS のページ](https://lapras.com/public/CA9WGDU)
[参考: 当方の Github ページ](https://github.com/cyross)

```
スキル的に Ruby に偏っているのでうちマッチするポジションを云々
```

というのが挙げられるのですが、いや、誤解ですから！
確かに 10 年前ぐらいは Ruby をしこたまやって、OSS で拡張ライブラリ作って Github に挙げまくって本まで書いていましたけど（絶版しちゃったけど）！　今は Ruby に全然こだわってませんから！　他が目立てないだけですから！

…という、本当にめっちゃもったいない目に 2 回ほど遭ったわけです。

ただ、他の言語もやってますよ！　と言っても、アウトプットと呼べるものは paiza の Python3 スキルチェックで S ランク取得したぐらいで確かにそう誤解されても仕方がないのも事実です。

そこで、最近案件としてめっちゃ上がっている PHP のアウトプットをしようということにしたわけです。

---

(補足)当方の個人サイトは、現在、PHP+Laravel で構築中して Github で管理しているのですが、さすがにプライベート領域な話ですので、プライベートリポジトリとしていまして…その点ではアウトプットにできないのです。

---

# 環境選び

では、PHP を勉強する際に環境を選ぼうというわけですが、当方のマイマシンに Docker を入れているのでこれを活用しましょうと。

以前、PHP の勉強用に Docker で遊び場用リポジトリを作ってみて、その記事を Qiita にも書いたのですが( [参考: 今度はPHP(LAMP)環境をDockerで再発明してみた](https://qiita.com/cyross4vocaloid/items/637704802514a74491ef) )、Laravel で色々遊んでみようとしたときに Laradock の存在を知り、最初から Laravel どころか nginx ・ Apache ・ MySQL ・ Redis ・ PHPMyAdmin ・ Beanstalk も入っているという、 「PHP 環境の宝石箱やー！」と叫びたくなったわけです。

[参考: PHPフレームワーク「Laradock」で、手軽にLaravel+Dockerな開発環境を構築する](https://liginc.co.jp/364089)

---

(補足)Homested も検討してましたが、 Vagrant 必須とのことで、VirtualBox が入っていない(以前は入れていましたが、ネットワークドライバ絡みで謎の青画面が頻発していたためアンインストールしました)こともあり、Docker が使えそうなものを探していました。

---

# プログラミングの勉強ついでにプログラムランチャも作った

こうして、「独習 PHP 第3版」片手に PHP の勉強をはじめました。実行結果はブラウザに出して、エラーは Docker のコンソールから確認します。テストスイートはどうするかは「これから考える」ですが、早くノウハウを取得できればなぁと。

これらのファイルは Guthub のリポジトリとして公開していますので、ご興味のある方はどうぞ。

[参考: PHP 勉強用 Github リポジトリ](https://github.com/cyross/PHPStudyRepo)

そのうち、動作確認にいちいちブラウザの URL 欄にファイル名を書くのは面倒ということで、ズボラな私は「それも PHP にやらせたらえーやん」と思いつき、 index.php にその機能をもたせてみました。

ブラウザの URL 欄に

```
http://localhost
```

と打ち込むと index.php が読み込まれてファイル・ディレクトリの一覧が現れます。リロードすれば追加したファイルも反映されます。
あとは、確かめてみたい .php ファイルをクリックすれば、プログラムが実行されて結果が出てくる仕掛けです。ほら、簡単でしょう？

他にも、CSS とかを使って見た目をより華やかにすれば PHP 習得のモチベーションも上がるかなとは思いますが、今の所必要ではないので「いつかやるリスト」に入れるのみにしています。

# 最後に

この機能を組み込むために require_once でのモジュール化といった PHP の基礎をがっつり楽しめたのは大収穫でした。やっぱり「ズボラしたい」は学習の源ですね。

おそらく、PHP を学ぶ上でまだ考慮すべき点も残っていると思いますし、Laravel でのサイト構築も進めたいです。とりあえず、区切りができたので今回はこの辺で御暇いたします。
【今日のアブストラクト】Sequence to Sequence Learning with Neural Networks【論文 ほぼ Google 翻訳 自分用】

1 日 1 回 (努力目標) 論文の Abstract を Google 翻訳の力を借りて読んでいきます.

この記事は自分用のメモみたいなものです.
ほぼ Google 翻訳でお送りします.
間違いがあれば指摘していだだけると嬉しいです.

翻訳元
[Sequence to Sequence Learning with Neural Networks](https://arxiv.org/abs/1409.3215v3)


# Abstract

### 訳文

ディープニューラルネットワーク (DNNs) は, 困難な学習タスクで優れたパフォーマンスを達成した強力なモデルです. しかし DNNs は, ラベル付きの大きなトレーニングセットが利用可能な場合は常に機能しますが, シーケンスにシーケンスをマッピングするために使用することはできません. この論文では, シーケンス構造に関する最小限の仮定を行う, シーケンス学習への一般的なエンドツーエンドのアプローチを示します. この方法では, 多層化された Long Short-Term Memory (LSTM) を使用して入力シーケンスを固定次元のベクターにマッピングし, 次に別のディープ LSTM を使用してベクターからターゲットシーケンスをデコードします. 私たちの主な結果は, WMT'14 データセットの英語からフランス語への翻訳タスクで, LSTM によって生成された翻訳は, テストセット全体で 34.8 の BLEU スコアを達成します. ここで, LSTM の BLEU スコアは語彙外の単語に対してペナルティが科されます. さらに, LSTM は長い文章でも問題はありませんでした. 比較のために, フレーズベースの SMT システムは, 同じデータセットで 33.3 の BLEU スコアを達成します. LSTM を使用して, 前述の SMT システムによって生成された 1000 の仮説を再ランク付けすると, その BLEU スコアは 36.5 に増加し, このタスクの以前の最良の結果に近くなります. LSTM はまた, 単語の順序に敏感であり, 能動的および受動的な音声に対して比較的不変である賢明なフレーズおよび文の表現を学習しました. 最後に, ソース文とターゲット文の間に短期間の依存関係が多く発生し, 最適化の問題が容易になるため, すべてのソース文 (ただしターゲット文ではしない) の単語の順序を逆にすることで, LSTM のパフォーマンスが著しく向上することがわかりました.


### 原文

Deep Neural Networks (DNNs) are powerful models that have achieved excellent performance on difficult learning tasks. Although DNNs work well whenever large labeled training sets are available, they cannot be used to map sequences to sequences. In this paper, we present a general end-to-end approach to sequence learning that makes minimal assumptions on the sequence structure. Our method uses a multilayered Long Short-Term Memory (LSTM) to map the input sequence to a vector of a fixed dimensionality, and then another deep LSTM to decode the target sequence from the vector. Our main result is that on an English to French translation task from the WMT'14 dataset, the translations produced by the LSTM achieve a BLEU score of 34.8 on the entire test set, where the LSTM's BLEU score was penalized on out-of-vocabulary words. Additionally, the LSTM did not have difficulty on long sentences. For comparison, a phrase-based SMT system achieves a BLEU score of 33.3 on the same dataset. When we used the LSTM to rerank the 1000 hypotheses produced by the aforementioned SMT system, its BLEU score increases to 36.5, which is close to the previous best result on this task. The LSTM also learned sensible phrase and sentence representations that are sensitive to word order and are relatively invariant to the active and the passive voice. Finally, we found that reversing the order of the words in all source sentences (but not target sentences) improved the LSTM's performance markedly, because doing so introduced many short term dependencies between the source and the target sentence which made the optimization problem easier.
reglとReactでWebGLのシェーダを簡単に扱う

# reglとは
WebGLでお絵描きをしたいとき、大きく分けて以下の2つの方向性がある。[^1]

[^1]: three.jsでシェーダを扱う方法もあります

- [three.js](https://threejs.org/)などの高レベルなライブラリを使う
- GLSLでシェーダを記述し、WebGL APIをそのまま扱う

後者のようにGLSLを扱えると自由度が高い一方で、WebGL APIに関連して "おまじない" 的なコードが大量に必要になってしまうという問題があった。

この記事で扱う [regl](https://github.com/regl-project/regl) は、**WebGLのwrapper**に相当する。初見でもWebGL APIと1:1に対応づけられる程度には原型を維持することで自由度を担保しつつ、大量の "おまじない" や煩雑な状態管理を単純化し、コードの可読性を大幅に向上してくれる。

公式GitHubでは`Functional WebGL`と謳っているが、おそらく「変数を入れると（GLSLに基づいて）描画が得られる」ことを指して`Functional`と言っているのだと思われる。ReactでいうところのstatelessなFunction Componentみたいなイメージか。


# Reactでreglを扱う
[GitHub](https://github.com/regl-project/regl)にいくつかサンプルコードがあるものの、Reactで扱っている例はググってもあまり見当たらなかった。Reactでのシンプルなコードを以下に記載する。

このコードには基本的なシェーダの扱いとアニメーションの方法が含まれており、静止した三角形の色が時間とともに変化する。

```jsx:Samnple.js
import React, { useEffect } from "react";
import createRegl from "regl";


const Sample = () => {
  const regl = createRegl(); // No arguments: create a full screen canvas

  const drawTriangle = regl({
    frag: `
    precision mediump float;
    uniform vec4 color;
    void main() {
      gl_FragColor = color;
    }`,

    vert: `
    precision mediump float;
    attribute vec2 position;
    void main() {
      gl_Position = vec4(position, 0, 1);
    }`,

    attributes: {
      position: [[0, -1], [-1, 0.5], [1, 1]] // No need to flatten
    },

    uniforms: {
      color: regl.prop("color")
    },
    // Number of vertices to draw in this command
    count: 3
  });

  useEffect(() => {
    regl.frame(({ time }) => {
      regl.clear({
        color: [0, 0, 0, 0],
        depth: 1
      });
      drawTriangle({
        color: [
          Math.cos(time * 1.0),
          Math.sin(time * 0.8),
          Math.cos(time * 3.0),
          1
        ]
      });
    });

    return () => { regl.destroy() }; // Clean up when unmounted
  }, []);

  return <></>;
};


export default Sample;
```

## ポイント
**初期化**
`const regl = createRegl()`のところで引数をしていないため、全画面のcanvasが新たに作成される（reglの仕様）。
既存のcanvasを使用したい場合等は引数で指定できる（公式ドキュメント参照）

**描画**
`drawTriangle()`は、`frag`, `vert`に文字列として記載されたGLSLに基づいて三角形を描画する関数。ここで、

```javascript
color: regl.prop("color")
```
という部分に注目。`drawTriangle()`に引数`color`を渡すことで動的に描画内容を変えられるようになっている。

**副作用フック**
`useEffect`によって、Reactコンポーネントの副作用として描画を実行している。
`useEffect`の第二引数が`[]`なので副作用は一度だけ実行されるが、その中で`regl.frame()`が呼ばれることによりアニメーションが開始する。

**副作用のclean up**

```javascript
return () => { regl.destroy() };
```
`useEffect`のなかで上記のような`return`文がある。今回はcomponentと無関係に全画面のcanvasが作成されているので、このように[副作用のclean up](https://ja.reactjs.org/docs/hooks-effect.html#example-using-hooks-1)を行わないと、別コンポーネントに画面表示を切り替えた後にもcanvasが残ってしまう。

※ そもそもコンポーネント外にcanvasを作成するのは良くないので、component内に予め用意したcanvasをcreateReglに渡すのが良い気がする
【CSS】animation付きハンバーガーアイコン(🈪→×)の作り方

# ※udemy動画内容の備忘録です。

```index.html
<button class="mobile-menu-icon"
    onclick="document.querySelector('body').classList.toggle('menu-open');">
        <span></span>
        <span></span>
        <span></span>
    </button>
```
```scss:style.scss
$cBlack: #000;
$cWhite: #fff;
.mobile-menu-icon {
  background-color: transparent;
  border: none;
  outline: none;
  cursor: pointer;

  & > span {
    background-color: $cBlack;
    width: 35px;
    height: 2px;
    display: block;
    margin-bottom: 9px;
    transition: transform 0.3s;

    &:last-child {
      margin-bottom: 0;
    }
  }
}

.menu-open {
  background-color: $cBlack;

  & .mobile-menu-icon {
    & > span {
      background-color: $cWhite;

      &:nth-child(1) {
        transition-delay: 0.1s;
        transform: translateY(11px) rotate(135deg);
      }
      &:nth-child(2) {
        transform: translateX(-18px) scaleX(0);
      }
      &:nth-child(3) {
        transform: translateY(-11px) rotate(-135deg);
      }
    }
  }
}
```
Nuxt.jsとvue-awesome-swiperでスワイパーする

Nuxt.jsでスワイパーを作ります。

# 前提条件
- Nuxt.jsとPugとStylusがインストールされていること

# インストール
```shell
$ npm i --save vue-awesome-swiper
```

# 使い方
`touch`コマンドでプラグイン用ファイルを作成する

```shell
$ touch plugins/vue-awesome-swiper.js
```

```javascript:plugins/vue-awesome-swiper.js
import Vue from 'vue'
import VueAwesomeSwiper from 'vue-awesome-swiper'

// require styles
import 'swiper/dist/css/swiper.css'

Vue.use(VueAwesomeSwiper /* , { default global options } */)
```

`nuxt.config.js`でプラグインを読み込む

```javascript:nuxt.config.js
module.exports = {
  plugins: [
    { src: '~/plugins/vue-awesome-swiper', mode: 'client' }
  ]
}
```

`client-only`の中に`swiper`、その下に`swiper-slide`を欲しいスライド分だけ配置する。
`swiper`の`options`属性に渡しているオブジェクトで、スワイパーのオプションを設定する。
この例では1セットに3枚のスライドを表示し、スライドをループさせる状態にある。

```html:pages/test.vue
<template lang="pug">
.test
  client-only
    swiper(:options="swiperOption")
      swiper-slide(v-for="item in 10" :key="item")
        .test-item {{ `Slide ${item}` }}
</template>

<script>
export default {
  data: () => ({
    swiperOption: {
      slidesPerView: 3, // １セットに何枚のスライドを表示するか
      loop: true, // スライドをループさせるか
    }
  })
}
</script>

<style lang="stylus">
.test
  width 100vw
  height 100vh

.swiper-container
  width 100%
  height 100%

.test-item
  display flex
  justify-content center
  align-items center
  width 100%
  height 100%
</style>
```

その他のオプションは参考文献のgithubを参照してください。

# 参考文献
この記事は以下の情報を参考にして執筆しました。

- [vue-awesome-swiper - npm](https://www.npmjs.com/package/vue-awesome-swiper)
- [vue-awesome-swiper - github](https://github.surmon.me/vue-awesome-swiper/)
【CSS3】ローダーアニメーション2

### udemy動画内容の備忘録・メモです
- ５つの縦線を設置し、それぞれに遅延時間を設ける。
- timing-iteration-count: infiniteで永久にアニメーション。

```html:index.html
  <div class="rect-spinner">
    <div></div>
    <div></div>
    <div></div>
    <div></div>
    <div></div>
  </div>
```
*Scss記法*

```scss:style.scss
  .rect-spinner {
    margin: 100px auto;
    width: 50px;
    height: 40px;
    text-align: center;
    letter-spacing: -2px;

    & > div {
      background-color: #333;
      height: 100%;
      width: 6px;
      display: inline-block;
      @include animation(
        $name: sk-stretchdelay,
        $duration: 1.2s,
        $iteration-count: infinite,
        $timing-function: ease-in-out
      );
      @for $i from 1 through 5 {
        &:nth-child(#{$i}) {
          animation-delay: -1.3s + $i * 0.1s;
        }
      }
    }
  }

  @keyframes sk-stretchdelay {
    0%,
    40%,
    100% {
      transform: scaleY(0.4);
    }
    20% {
      transform: scaleY(1);
    }
  }
```
Terraformのfor_eachで配列を渡したときのインデックス取得

# 概要

Terraformのfor_eachでの配列のとりあつかい

- index関数を使い要素のインデックス取得

# 背景

Terraform 0.12から[for_each](https://www.hashicorp.com/blog/hashicorp-terraform-0-12-preview-for-and-for-each/)を使い、複数のresource、dataの作成が簡便にかつ簡潔にできるようになった。
[for_each](https://www.terraform.io/docs/configuration/resources.html#for_each-multiple-resource-instances-defined-by-a-map-or-set-of-strings)で渡せる型は、mapもしくはstringのセットになる。
以下のように定義することで、複数必要な定義が一括で定義が可能となる

## 例

- GCP上で複数のsource リポジトリの作成

``` source-repository.tf
locals {
  repositories = [
      "demo-1",
      "demo-2"
  ]
}

 resource "google_sourcerepo_repository" "repositories" { 
   depends_on = [google_project_service.google_project_service["sourcerepo"]] 
   for_each   = toset(local.repositories) 
   name       = each.value
 } 
```
上記の`google_sourcerepo_repository`リソースのようにnameのみ定義すればよい場合、配列を渡すことで簡便に複数のリソースを定義できる。しかし、リソースの要素を変えなければいけない場合、配列のみで定義するには工夫が必要である。

例えば、GCPのCloud Armorを定義する['compute_security_policy'](https://www.terraform.io/docs/providers/google/r/compute_security_policy.html) リソースのruleブロックのpriorityは、重複定義が許されない。そのため、IPアドレス範囲のみの配列を渡し上記のように実行した、重複エラーが発生する。
配列のインデックスを取得し、プライオリティに追加することでそれらの問題は解決する。
そこでインデックスの取得について記載する。

# 実施環境

- Terraform 0.12.21

## 実行方法

index関数を用いることで、要素と一致する[`index`](https://www.terraform.io/docs/configuration/functions/index.html)を取得できる。
indexを使い、下記のように定義することで、indexを取得し当該値を用い演算をすることでpriorityを変更することができる。

下記、uptime-source-ips.jsonは、GCPのGUI（Cloud Console）画面より取得されるCloud Monitoringエージェントの[IPアドレス一覧表](https://cloud.google.com/monitoring/uptime-checks/using-uptime-checks?hl=ja#monitoring_uptime_check_list_ips-console)となっている。

```clour_armor.tf
locals {    
     ips = jsondecode(file("./uptime-source-ips.json")) 
 } 
  
resource "google_compute_security_policy" "stackdriver-monitoring" { 
   name = "monitoring-rules" 
   dynamic "rule" { 
     for_each = toset(local.armor.ips) 
     content { 
       action   = "allow" 
       priority = 1000 + index(local.ips, rule.value) 
       match { 
         versioned_expr = "SRC_IPS_V1" 
         config { 
           src_ip_ranges = [rule.value.ipAddress] 
         } 
       } 
     } 
   } 

   rule { 
     action   = "deny(403)" 
     priority = "2147483647" 
     match { 
       versioned_expr = "SRC_IPS_V1" 
       config { 
         src_ip_ranges = ["*"] 
       } 
     } 
     description = "default rule" 
   } 

 } 
```

# まとめ

for_eachに配列を渡すときの操作は癖があるから注意が必要
Spring (STS)のpom.xmlに記述するためのio.spring.platformの最新バージョンの確認方法

# Spring の環境構築時に使用する依存ライブラリのバージョンを調べる方法

Springの環境を構築するときに、pom.xmlの中に依存ライブラリの指定をする必要がある。その際に使用するio.spring.platformの最新バージョンが何かを調べる方法である。
調べた結果は、下記に示すpom.xmlの
&lt;version&gt;???&lt;/version&gt;
のところに記述する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586772/e95085b6-827d-ac1b-0729-40850e5b14d9.png)

1. mvnrepository.comのサイトに行く。
https://mvnrepository.com/

2. 検索用のテキストボックスに「io.spring.platform」と入力してSearchボタンを押す。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586772/29963e65-c61e-a193-7d18-4f46cd108bad.png)

3.検索結果が表示される。
「Spring IO Platform Bill of Materials」をクリックする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586772/773d21e9-38ca-27b8-90d6-42493317dba1.png)

4.詳しい情報が表示される。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586772/664c8c66-5cb9-5e95-cbbb-d3e6aa3ebb18.png)

5. 2.x.x.RELEASEの最新のものを探す。この例では、2.0.8.RELEASEが最新ということが分かる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586772/12c46764-22ca-9f4e-ec68-49ebe21cdae7.png)

以上

# 補足
特になし

Written by Collab KM
PowerPointを使ってPower Apps作成で楽をする

# Power Appsって
よく言われる/聞くのが「PowerPointを使っているような感覚で」「Excelの数式で」とかだとおもいます。
でも実際使ってみると、PowerPointよりもいろいろできないことも多いですよね。
図形を回転させたりとか、日本語フォントが選べないとか。
標準で提供されているテーマもそれほどリッチではないです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/24484cb6-c27d-4c72-56a2-5dc8c5d108b0.png)


**じゃあもういっそ、PowerPointでほとんど作ってしまえばいいんじゃないだろうか？**

# PowerPointのデザインは優秀
このあたりです。圧倒的にテンプレートがおおい！しかも最近ではデザインアイデアがあるので、画像をいくつか貼り付けるといい具合にレイアウトを提案してくれたりします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/5ef188e4-2024-87b7-88d4-456133a34602.png)

ということでこれを使ってアプリの大枠を作っていったらどうでしょう？
![SetDesign.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/6f710bcf-0c33-b79b-19a2-d3d2affa8fbd.png)

ほとんどを背景にしてしまって、ボタンとか、入力エリアとか、あるいは画面下部のメニューエリアとか。そういったものをPowerPointで作ると、Power Apps側としては画像をインポートして、画像の上から必要なパーツを置くだけで"それっぽい"見た目に変えることができます。
![App.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/a6531816-44bb-ad80-e3bb-6fcdb5281a9f.png)

これのいい点は、見た目のメンテナンスをPowerPointの画像側にほとんど押し付けられるところかなと思います。
Power Appsとして担うのは、あくまでもアプリとしての動作部分にしてしまえば、綺麗なアプリを作るために余計なパーツを追加することなく、手軽にそれらしくできます。

# Power Apps側で気を付けること
見た目をPowerPoint側に任せるなら、基本的には各パーツを透過にしなければならないです。
ボタン系は特に、色の設定箇所がたくさんあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/42e22791-5d90-8d0b-4f50-fe6b6875ff39.png)
おすすめは、詳細設定にして、Colorと名の付く設定をいったん全部 ```Transparent``` にして、必要な部分を戻すという操作です。

![hover.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/72ccf1cf-78e3-54ee-20d8-058e2dfdb0ae.gif)
あとは、押した感を出したい とか ホバー時に少し色を変えたい ということであれば、PressedColorやHoverColorを少し透過した色(例: RGBA(255,255,255,0.2) )にしておけば、うっすら白っぽくなります。

# おわり
できないことも多いPower Appsですが、簡単にデータの入力・表示ができるという強みをうまく活かすために、あとは「いかにもPower Appsっぽい」アプリにならないように、PowerPointが活用できるかと思います。

PowerPointに限らず、きれいな背景画像(枠になる部分)が作れたら、一気にちゃんとしたアプリに見えてくるので、ぜひ試してみてください！

**[補足]**
スライドの設定は16:9で向きを縦(電話レイアウト),横(タブレットレイアウト)にすると、スライドのサイズ=画面サイズになります。
![SlideSetting.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/226c6068-5f4d-90b6-3970-bb65f330caa9.png)
railsチュートリアル　ハッシュ（連想配列について）

>> user = {}                          # {}は空のハッシュ
=> {}
>> user["first_name"] = "Michael"     # キーが "first_name" で値が "Michael"
=> "Michael"
>> user["last_name"] = "Hartl"        # キーが "last_name" で値が "Hartl"
=> "Hartl"
>> user["first_name"]                 # 要素へのアクセスは配列の場合と似ている
=> "Michael"
>> user                               # ハッシュのリテラル表記
=> {"last_name"=>"Hartl", "first_name"=>"Michael"}


>> user = { "first_name" => "Michael", "last_name" => "Hartl" }
=> {"last_name"=>"Hartl", "first_name"=>"Michael"}

--------------

>> user = { :name => "Michael Hartl", :email => "michael@example.com" }
=> {:name=>"Michael Hartl", :email=>"michael@example.com"}
>> user[:name]              # :name に対応する値にアクセスする
=> "Michael Hartl"
>> user[:password]          # 未定義のキーに対応する値にアクセスする
=> nil

:nameや:emailなどの前に「：」がついているのはシンボルという。ハッシュではシンボルをキーとして使うことが一般的

>> h1 = { :name => "Michael Hartl", :email => "michael@example.com" }
=> {:name=>"Michael Hartl", :email=>"michael@example.com"}
>> h2 = { name: "Michael Hartl", email: "michael@example.com" }
=> {:name=>"Michael Hartl", :email=>"michael@example.com"}
>> h1 == h2
=> true

:nameとname:は一緒の意味


--------------

ハッシュの中のハッシュ

>> params = {}        # 'params' というハッシュを定義する ('parameters' の略)。
=> {}
>> params[:user] = { name: "Michael Hartl", email: "mhartl@example.com" }
=> {:name=>"Michael Hartl", :email=>"mhartl@example.com"}
>> params
=> {:user=>{:name=>"Michael Hartl", :email=>"mhartl@example.com"}}
>>  params[:user][:email]
=> "mhartl@example.com"

--------------------

>> flash = { success: "It worked!", danger: "It failed." }
=> {:success=>"It worked!", :danger=>"It failed."}
>> flash.each do |key, value|
?>   puts "Key #{key.inspect} has value #{value.inspect}"
>> end
Key :success has value "It worked!"
Key :danger has value "It failed."

----------------

>> puts (1..5).to_a            # 配列を文字列として出力
1
2
3
4
5
>> puts (1..5).to_a.inspect    # 配列のリテラルを出力
[1, 2, 3, 4, 5]
>> puts :name, :name.inspect
name
:name
>> puts "It worked!", "It worked!".inspect
It worked!
"It worked!"
PostgreSQLをMacへインストールしてRails newする

##概要

ポートフォリオ作成時、今までずっとMySQLに慣れ親しんでいたので、
PostgreSQLとやらに挑戦しようと思い、とりあえずインストール方法〜新規Railsアプリ作成までをまとめてみました！

##条件
* macOS Mojave(ver 10.14.5)

##手順
* Homebrewを使用してPostgreSQLをインストール
* PostgreSQLの起動 / 起動確認 / 停止方法
* データベース一覧を表示
* Ruby on Railsのバージョンを変更
* アプリケーションを新しく作成
* GitHubに登録し、ローカルリポジトリを作成
* リモートリポジトリを作成

##Homebrewを使用してPostgreSQLをインストール

postgresqlをインストール

```
brew install postgresql
```

バージョン確認

```
psql -V
```

インストール場所を確認

```
which psql
```

##PostgreSQLの起動 / 起動確認 / 停止方法

起動

```
brew services start postgresql
```

起動状況の確認

```
brew services list
```

停止

```
brew services stop postgresql
```

##データベース一覧を表示

データベース一覧を表示

```
                                            List of databases
         Name          |     Owner      | Encoding | Collate | Ctype |         Access privileges         
-----------------------+----------------+----------+---------+-------+-----------------------------------
 postgres              | ************** | UTF8     | C       | C     | 
 test-app_development  | ************** | UTF8     | C       | C     | 
 test-app_test         | ************** | UTF8     | C       | C     | 
 template0             | ************** | UTF8     | C       | C     | =c/**************                +
                       |                |          |         |       | **************=CTc/**************
 template1             | ************** | UTF8     | C       | C     | =c/**************                +
                       |                |          |         |       | **************=CTc/**************

```

##Ruby on Railsのバージョンを変更

```
cd ~ #ホームディレクトリに移動
gem install rails --version="5.2.4.1" #今回はversion="5.2.4.1"を使用
rbenv rehash #gemの変更を反映
```

##アプリケーションを新しく作成

```
cd
rails new test-app -d postgresql #rails newコマンドを実行
cd test-app #test-appディレクトリに移動
rails db:create #データベースを作成
```

##GitHubに登録し、ローカルリポジトリを作成

GItHub Desktop から test-app のローカルリポジトリを作成。
左上の「Current Repository」→「Add」→「Add Existing Repository」を選択。

※「Add Repository」がクリックできない場合、事前に該当するアプリケーションのディレクトリで以下の作業を行う。

```
cd ~/git-app
git init #rails のバージョンによっては rails new 時に git init がされないケースがあるため
```

その後コミット。

##リモートリポジトリを作成
[Publish repository]ボタンをクリックすると GitHub のリモートリポジトリが作成できる。
GitHub の Your repositories の欄に作成したアプリがあれば上手くいっている。

##サーバー起動

```
rails s
```

##できた！制作スタート！
<a href="https://gyazo.com/e3827d05c0726ba150f9cd7c5cdfcaa5"><img src="https://i.gyazo.com/e3827d05c0726ba150f9cd7c5cdfcaa5.jpg" alt="Image from Gyazo" width="1440"/></a>
djangoとpostgresqlをDockerで接続しようとしたときに「django.db.utils.OperationalError: could not translate host name "db" to address: Name or service not known」というエラーが出る

#エラー
[Quickstart: Compose and Django](https://docs.docker.com/compose/django/)を見ながらdockerでDjangoの開発環境を構築しようとして、```docker-compose up```したときに以下のエラーが出た。

```
django.db.utils.OperationalError: could not translate host name "db" to address: Name or service not known
```
##setting.py

```python:setting.py
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'postgres',
        'USER': 'postgres',
        'PASSWORD': 'postgres',
        'HOST': 'db',
        'PORT': 5432,
    }
}
```

##修正前のdokcer-compose.yml
```Docker-compose.yml
version: '3'

services:
  web:
    build: .
    command: python manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/code
    ports:
      - "8000:8000"
    depends_on:
      - db
  db:
    image: postgres
```
##修正後のdocker-compose.yml

```docker-compose.yml
version: '3'

services:
    web:
        build: .
        command: python3 manage.py runserver 0.0.0.0:8000
        volumes:
            - .:/code
        ports:
            - "8000:8000"
        depends_on:
            - db
    db:
        image: postgres
        ports: 
            - "5432"
        environment:
          - POSTGRES_DB=postgres
          - POSTGRES_USER=postgres
          - POSTGRES_PASSWORD=postgres
```
これで、エラーが解消しました。
Docker内でpostgresを使用するには、データベースユーザー、パスワード、db-nameなどの情報を構成する必要があります。これは、修正後の```dokcer-compose.yml```にある```environment```においてコンテナの環境変数を設定することにより行うことができる。
Access以外からNz関数を使う場合の罠

#概要
Access以外でAccessを参照設定してNz関数を使うと不可視のAccessインスタンスができる、場合によっては正しく終了せずに見えないまま残る。

##Nz関数とは
[公式のリファレンス](https://support.office.com/ja-jp/article/nz-%E9%96%A2%E6%95%B0-8ef85549-cc9c-438b-860a-7fd9f4c69b6c)では普通の使い方の話だけ。
ここには書かれていないがNz関数はAccessの中に含まれる関数なので実行にはAccessのインスタンスが必要らしい。

```visualbasic
?Nz(Null, "ぬるぽ") 'ぬるぽと表示される
```
その関係でAccessを参照設定したExcelからイミディエイトで上記を実行してすぐに、cmd.exeでtasklistを行うとACCESS.EXEが起動している。
実行してしばらくすると消えているので基本的には実行後に終了するようになっているはずなのだが、何かのミスでAccessのインスタンスが残ることがある。

##対処法
この見えないAccessがあるときにaccdbファイルなどAccessのファイルを開くとその見えないインスタンスで開かれてしまって正常に開かれているにも関わらず見えないという状態が発生する。
こうなってしまった場合はcmdから「taskkill /f /im access.exe」で強制終了させるというのが一つ。

```visualbasic
GetObject(, "Access.Application").Visible = True
```
またはイミディエイトでGetObjectを使ってAccessを捕まえて見えるようにすることでも対応できる。

##代替手段
```visualbasic
Public Function Nz(ByVal Value_ As Variant, Optional IfNull_ As Variant) As Variant
    If IsNull(Value_) Then
        Nz = IfNull_
    Else
        Nz = Value_
    End If   
End Function
```
Access.Nzが呼び出されないように自作の関数で上書きしてしまう。
かなり雑な作りだがだいたいこれでなんとかなる。

##余談
逆もまた然りで、AccessからExcelを参照設定してWorksheetFunctionのメソッドを使った場合も同じように不可視のExcelインスタンスが立ち上がるかもしれない(未調査)。
railsチュートリアルブロックについて

{}のところがブロックという
配列.each do　{|変数|処理}

end
配列の要素を先頭から一つずつ||内の変数に入れて、{}に書いた処理をする

>> (1..5).each { |i| puts 2 * i }
2
4
6
8
10
=> 1..5

上のは下みたいにも書ける

>> (1..5).each do |i|
?>   puts 2 * i
>> end
2
4
6
8
10
=> 1..5

---------------------------------------------

>> (1..5).each do |number|
?>   puts 2 * number
>>   puts '--'
>> end
2

--
4

--
6

--
8

--
10

--
=> 1..5

---------------------------------------------

>> 3.times { puts "Betelgeuse!" }   # 3.timesではブロックに変数を使っていない
"Betelgeuse!"
"Betelgeuse!"
"Betelgeuse!"
=> 3

配列を一つずつ変数に入れて{}内の処理をするmapメソッドは配列で返されてくる
>> (1..5).map { |i| i**2 }          # 「**」記法は冪乗 (べき乗) 
=> [1, 4, 9, 16, 25]
>> %w[a b c]                        # %w で文字列の配列を作成
=> ["a", "b", "c"]
>> %w[a b c].map { |char| char.upcase }
=> ["A", "B", "C"]
>> %w[A B C].map { |char| char.downcase }
=> ["a", "b", "c"]

---------------------------------------------

shuffleメソッドについて
>> ('a'..'z').to_a                     # 英小文字を列挙した配列を作る
=> ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o",
"p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"]
>> ('a'..'z').to_a.shuffle             # シャッフルする
=> ["c", "g", "l", "k", "h", "z", "s", "i", "n", "d", "y", "u", "t", "j", "q",
"b", "r", "o", "f", "e", "w", "v", "m", "a", "x", "p"]
>> ('a'..'z').to_a.shuffle[0..7]       # 配列の冒頭8つの要素を取り出す
=> ["f", "w", "i", "a", "h", "p", "c", "x"]
>> ('a'..'z').to_a.shuffle[0..7].join  # 取り出した要素を結合して１つの文字列にする
=> "mznpybuj"
Rubyで手を動かしてやったことまとめ

書いた目的：いちいち探すのがめんどくさかったことをまとめてみた

詰まるたびに適宜更新する。

## 取得した文字列を１文字づつ分割して配列に入れたい

split関数で空文字を指定すると取得できる。
sample:

```split_char.rb
str = "tukapai"
array = str.split("")
puts array 
```
output:

```
ruby split_char.rb                                                             
["t", "u", "k", "a", "p", "a", "i"]
```

## その他自分でQiita記事で書いたリンク

[【Ruby】条件分岐内で標準出力を使う方法](https://qiita.com/tukapai/items/11e15aab32cff5494360)

#development/Ruby
railsチュートリアル配列で便利で使えそうなの

>>  "foo bar     baz".split     # 文字列を3つの要素を持つ配列に分割する
=> ["foo", "bar", "baz"]

-----------------------------------------------------------------------
>> "fooxbarxbaz".split('x') #xのところで区切る
=> ["foo", "bar", "baz"]

-----------------------------------------------------------------------
>> a = [42, 8, 17]
=> [42, 8, 17]
>> a[0]               # Rubyでは角カッコで配列にアクセスする
=> 42
>> a[1]
=> 8
>> a[2]
=> 17
>> a[-1]              # 配列の添字はマイナスにもなれる!
=> 17

-----------------------------------------------------------------------
>> a                  # 配列「a」の内容を確認する
=> [42, 8, 17]
>> a.first
=> 42
>> a.second
=> 8
>> a.last
=> 17
>> a.last == a[-1]    # == を使って比較する
=> true

-----------------------------------------------------------------------

>> x = a.length       # 配列も文字列と同様lengthメソッドに応答する
=> 3
>> x == 3
=> true
>> x == 1
=> false
>> x != 1
=> true
>> x >= 1
=> true
>> x < 1
=> false

-----------------------------------------------------------------------

>> a
=> [42, 8, 17]
>> a.empty?
=> false
>> a.include?(42)
=> true
>> a.sort
=> [8, 17, 42]
>> a.reverse
=> [17, 8, 42]
>> a.shuffle
=> [17, 42, 8]
>> a
=> [42, 8, 17]

-----------------------------------------------------------------------

>> a
=> [42, 8, 17]
>> a.sort!
=> [8, 17, 42]
>> a
=> [8, 17, 42]

-----------------------------------------------------------------------

>> a.push(6)                  # 6を配列に追加する
=> [42, 8, 17, 6]
>> a << 7                     # 7を配列に追加する
=> [42, 8, 17, 6, 7]
>> a << "foo" << "bar"        # 配列に連続して追加する
=> [42, 8, 17, 6, 7, "foo", "bar"]

-----------------------------------------------------------------------

>> a
=> [42, 8, 17, 6, 7, "foo", "bar"]
>> a.join                       # 単純に連結する
=> "4281767foobar"
>> a.join(', ')                 # カンマ+スペースを使って連結する
=> "42, 8, 17, 6, 7, foo, bar"

-----------------------------------------------------------------------
to_aメソッドで配列に変換する
>> 0..9
=> 0..9
>> 0..9.to_a              # おっと、9に対してto_aを呼んでしまっていますね
NoMethodError: undefined method `to_a' for 9:Fixnum
>> (0..9).to_a            # 丸カッコを使い、範囲オブジェクトに対してto_aを呼びましょう
=> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

-----------------------------------------------------------------------

>> a = %w[foo bar baz quux]         # %wを使って文字列の配列に変換
=> ["foo", "bar", "baz", "quux"]
>> a[0..2]
=> ["foo", "bar", "baz"]

-----------------------------------------------------------------------

>> a = (0..9).to_a
=> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>> a[2..(a.length-1)]               # 明示的に配列の長さを使って選択
=> [2, 3, 4, 5, 6, 7, 8, 9]
>> a[2..-1]                         # 添字に-1を使って選択a[-1]すれば配列の最後の要素が取れる
=> [2, 3, 4, 5, 6, 7, 8, 9]

-----------------------------------------------------------------------

>> ('a'..'e').to_a
=> ["a", "b", "c", "d", "e"]
WordPressテーマ作成法

# はじめに

WordPressのテーマ（テンプレート）作成方法について、ざっくりとまとめてみます。
今後、随時追記予定です。


# 最低限必要なファイル（ページ）

WordPressのテーマを作るにあたり、最低限必要となるのは以下のファイルです。

- index.php
- style.css

なお、`style.css`には、以下の情報を記入します。

```css:style.css
/*
Theme name: テーマの名称
Theme URI: テーマのURI（ダウンロードページなど）
Description: テーマの説明
Version: テーマのバージョン
Author: テーマ作成者の名前
Author URI: テーマ作成者のホームページのURI
*/
```


# 一般的なファイル構成

上で書いたのは、「最低限」必要なファイルで、一般的には以下のようなファイル構成になることが多いです。

- front-page.php：ブログのトップページ
- single.php：個別の記事ページ
- page.php：固定ページ
- category.php：カテゴリーページやタグページ
- search.php：検索結果ページ
- archive.php：記事一覧ページ
- 404.php：404エラーページ



# まとめ

ここでは、WordPressのテーマ作成法法についてざっくりとまとめてみました。
まだ書き切れていないところが多々あるので、今後も追記していきます。