OmniAICreator/Qiita-1.07M huggingface dataset:
PostgresSQL 使い方

###■接続
>psql -U postgres

####接続（CREATE ROLEで作成したロールで）
>psql -U role_sample -d postgras

ポイント：`-d postgres` でDB名を指定する

###■切断
>\q

###■ユーザー新規作成
>CREATE ROLE role_sample WITH LOGIN PASSWORD password;
>CREATE ROLE user01 WITH PASSWORD 'pass01'


###■ユーザー一覧を表示
>\du

  ロール名   |                                   属性                                   | 所属グループ
-------------+--------------------------------------------------------------------------+--------------
 postgres    | スーパユーザ, ロール作成可, DB作成可, レプリケーション可, RLS のバイパス | {}
 role_sample |                                                                          | {}
###■権限の付与

・role_sampleにpg_shadowテーブルアクセス権限を付与
>GRANT SELECT ON pg_shadow TO role_sample;


>>select * from pg_shadow;


   >>usename   | usesysid | usecreatedb | usesuper | userepl | usebypassrls |               passwd                | valuntil | useconfig
-------------+----------+-------------+----------+---------+--------------+-------------------------------------+----------+-----------
 postgres    |       10 | t           | t        | t       | t            | md53175bce1d3201d16594cebf9d7eb3f9d |          |
 role_sample |    16393 | f           | f        | f       | f            | md566db5a3e78c609bc2f01adcbab20850a |          |


・user01にログイン権限を付与
>ALTER ROLE user01 LOGIN;
【Ruby on Rails】CSV出力機能

# 目標
![CSV.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700999/f0a6520d-f89c-aec3-a27f-39ebda60086b.gif)

# 開発環境
ruby 2.5.7
Rails 5.2.4.3
OS: macOS Catalina

# 前提
※　▶◯◯　を選択すると、説明等が出てきますので、
　　よくわからない場合の参考にしていただければと思います。

- [deviseでログイン環境構築](https://qiita.com/japwork/items/275110b810965fbdf72f)
- [ログインユーザーのみができる投稿機能](https://qiita.com/japwork/items/8dfb52121036791ac4fb)
- [投稿の編集機能（更新、削除）](https://qiita.com/japwork/items/e258ccbbe4f48ea5a3b5)

postモデルにはtitle,bodyのカラムがあり、
userモデルとはN:１の関係です。
 
まずは完成形のコードを記述し、その後補足コードを記述します
# 完成コード
## controllerの編集
```rb:app/controllers/posts_controller.rb
class PostsController < ApplicationController
  require 'csv'

  def new
    @post = Post.new
    @posts = Post.all
    respond_to do |format|
      format.html
      format.csv do |csv|
        send_posts_csv(@posts)
      end
    end
  end

  private
  def send_posts_csv(posts)
    csv_data = CSV.generate do |csv|
      column_names = %w(投稿者名 タイトル 本文)
      csv << column_names
      posts.each do |post|
        column_values = [
          post.user.name,
          post.title,
          post.body,
        ]
        csv << column_values
      end
    end
    send_data(csv_data, filename: "投稿一覧.csv")
  end
end
```
## view
```erb:app/views/posts/new.html.erb
<%= link_to "csvで出力する",new_post_path(format: :csv) %>
```

# 補足コード
## controller
```rb:app/controllers/posts_controller.rb
class PostsController < ApplicationController
  require 'csv' # ←忘れがちのため要注意

  def new
    @post = Post.new
    @posts = Post.all
    # respond_to はリクエストに応じた処理を行うメソッドです。
    # 通常時はhtmlをリクエストしているので、処理は記述していません。
    # viewのlink_toでformatをcsvとして指定しているので、
    # リンクを押すとsend_posts_csv(@posts)の処理を行います。
    respond_to do |format|
      format.html
      format.csv do |csv|
        send_posts_csv(@posts)
      end
    end
  end

  private
  def send_posts_csv(posts)
    # CSV.generateとは、対象データを自動的にCSV形式に変換してくれるCSVライブラリの一種
    csv_data = CSV.generate do |csv|
      # %w()は、空白で区切って配列を返します
      column_names = %w(投稿者名 タイトル 本文)
      # csv << column_namesは表の列に入る名前を定義します。
      csv << column_names
      # column_valuesに代入するカラム値を定義します。
      posts.each do |post|
        column_values = [
          post.user.name,
          post.title,
          post.body,
				]
      # csv << column_valueshは表の行に入る値を定義します。
        csv << column_values
      end
    end
    # csv出力のファイル名を定義します。
    send_data(csv_data, filename: "投稿一覧.csv")
  end
end
```
## view
```erb:app/views/posts/new.html.erb
<!-- formatをcsvとして指定してcontrollerのrespond_toの処理を実行する -->
<%= link_to "csvで出力する",new_post_path(format: :csv) %>
```


# P.S.
TwitterではQiitaにはアップしていない技術や考え方もアップしていますので、
よければフォローして頂けると嬉しいです。
詳しくはこちら　https://twitter.com/japwork
VMwareにcentos入れようとしたらpane is dead

#プロローグ
vmwareにcenosを入れようとしたところ、途中で左下に「pane is dead」となり、進まなくなりました。
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538462/4a4e62b9-ce84-4a68-9fd1-de4135db2041.png)

#環境
ホストos : windows 10
vmware : 14.1.8
cenots : CentOS-8.2.2004-x86_64-dvd1.iso

#原因
isoが二つマウントされていました。
autoinst.isoがデフォルトでマウントされており、そちらと競合しています。

#対処
autoinst.isoを削除して、再度起動します。
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538462/48be6194-d32d-3726-b2c7-54071ce4a2d4.png)


#エピローグ
これで最後までうまくいきました。
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538462/2f07ada2-b4de-a9de-cbba-028b5533e9a5.png)
bundle installでエラーが出て、pumaがインストールできない。

# 発生するエラー

```
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

current directory:
/Users/yohei-yokota/.rbenv/versions/2.6.1/lib/ruby/gems/2.6.0/gems/puma-4.3.3/ext/puma_http11
/Users/yohei-yokota/.rbenv/versions/2.6.1/bin/ruby -I
/Users/yohei-yokota/.rbenv/versions/2.6.1/lib/ruby/2.6.0 -r
./siteconf20200920-91266-1229hke.rb extconf.rb
checking for BIO_read() in -lcrypto... yes
checking for SSL_CTX_new() in -lssl... yes
checking for openssl/bio.h... yes
checking for DTLS_method() in openssl/ssl.h... yes
checking for TLS_server_method() in openssl/ssl.h... yes
checking for SSL_CTX_set_min_proto_version in openssl/ssl.h... yes
creating Makefile

current directory:
/Users/yohei-yokota/.rbenv/versions/2.6.1/lib/ruby/gems/2.6.0/gems/puma-4.3.3/ext/puma_http11
make "DESTDIR=" clean

current directory:
/Users/yohei-yokota/.rbenv/versions/2.6.1/lib/ruby/gems/2.6.0/gems/puma-4.3.3/ext/puma_http11
make "DESTDIR="
compiling http11_parser.c
ext/puma_http11/http11_parser.c:44:18: warning: unused variable
'puma_parser_en_main' [-Wunused-const-variable]
static const int puma_parser_en_main = 1;
                 ^
1 warning generated.
compiling io_buffer.c
compiling mini_ssl.c
mini_ssl.c:145:7: warning: unused variable 'min' [-Wunused-variable]
  int min, ssl_options;
      ^
mini_ssl.c:299:40: warning: function 'raise_error' could be declared with
attribute 'noreturn' [-Wmissing-noreturn]
void raise_error(SSL* ssl, int result) {
                                       ^
2 warnings generated.
compiling puma_http11.c
puma_http11.c:203:22: error: implicitly declaring library function 'isspace'
with type 'int (int)' [-Werror,-Wimplicit-function-declaration]
  while (vlen > 0 && isspace(value[vlen - 1])) vlen--;
                     ^
puma_http11.c:203:22: note: include the header <ctype.h> or explicitly provide a
declaration for 'isspace'
1 error generated.
make: *** [puma_http11.o] Error 1

make failed, exit code 2

Gem files will remain installed in
/Users/yohei-yokota/.rbenv/versions/2.6.1/lib/ruby/gems/2.6.0/gems/puma-4.3.3
for inspection.
Results logged to
/Users/yohei-yokota/.rbenv/versions/2.6.1/lib/ruby/gems/2.6.0/extensions/x86_64-darwin-19/2.6.0/puma-4.3.3/gem_make.out

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

In Gemfile:
  puma
```

puma v4.2.1では発生せず、v4.3.0以降で発生するらしい。

下記のコマンドを実行したところいけました。

```
$ gem install puma:4.3.3 -- --with-cflags="-Wno-error=implicit-function-declaration"
```

## 参考リンク
https://github.com/puma/puma/issues/2342
https://github.com/puma/puma/issues/2304
UIAlertActionを使ってダイアログを表示させる（備忘録）

##目的
UIAlertControllerを使う時、配置を混同しがちなので、その備忘録を作りました。

![スクリーンショット 2020-09-20 11.55.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657690/72d0affe-1955-14f1-5575-c468b065f639.png)


##動作環境
XcodeのバージョンはVersion 11.6 です。


##備忘録に使うサンプル
画像を保存するものです。



##コードの配置（概要）
基本の並びは下記の通りです。

①UIAlertControllerをインスタンス化

②UIAlertAction（UIAlertControllerに載せる選択肢）をインスタンス化

③UIAlertControllerを表示



![スクリーンショット 2020-09-20 12.05.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657690/7f5c1202-e674-c1e0-4b2d-dba40ac81bbe.png)

###①UIAlertControllerをインスタンス化
####引数の設定
#####title　・・・　名前の通り、タイトルの設定です。 String型で設定すると、メッセージの上に表示されます。

#####message　・・・　これも名前の通りです。表示させたい文をString型で設定します。

#####preferredStyle　・・・　これは表示の仕方です。.alert　か .actionSheet を選びます。.alertは上の画像のような形です。.actionSheet は下のような形です。
![スクリーンショット 2020-09-20 11.57.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657690/ee1594e2-18a2-260e-9fd4-9be4e0f87bba.png)


###②UIAlertAction（UIAlertControllerに載せる選択肢）をインスタンス化
表示させたい選択肢の分だけUIAlertActionを記述して、追加していきます。

###引数の設定

#####title　・・・　表示する文です。String型で設定します。

#####style ・・・ 選択した時の動きの表示を設定します。 .cancel .default .destructiveの３つから選びます。前からキャンセル、アクション、デリートとなります。あくまで表示の設定なので、例えばキャンセルに設定したからといって、キャンセルボタンみたいな動きにはなりません。.cancelは太字になり、.destructiveの表示は赤字になります。

#####handler　・・・　styleで、表示をタップした時に起こる行動をクロージャにて設定します。タップした後のコードをここに書き込むことで、UIAlertActionがようやく機能を持ちます。


サンプルでは.defaultの方に保存をタップした場合に画像が変数の中に入っていれば、画像を端末に保存するコードが記述されており、.cancelの方には画面を閉じて前の画面に戻るというコードが記述されています。クロージャ内の記述ではselfを忘れがちなので、気を付けましょう。

引数の設定およびクロージャ内のコード記述が終わったら、alertController.addAction()を記述して、alertControllerの選択肢として表示に追加します。

※alertController.preferredAction = alertActionの文はなくても動きます。これは、.defaultのスタイルで表示させた場合、文字を太字にできます。コードはalertController.addAction()の後に書きます。


###③UIAlertControllerを表示
present(UIAlertController,animated: Bool)を記述してUIAlertControllerを表示させます。

##サンプルに使ったコード

```swift

        let alertController = UIAlertController(title: nil, message: "保存しますか？", preferredStyle: .actionSheet)

        
        let alertAction = UIAlertAction(title: "保存", style: .default, handler: { (act) in
            if self.pictureImage.image == self.pictureImage.image{
                UIImageWriteToSavedPhotosAlbum(self.pictureImage.image!, self, nil, nil)
            }
        })
        alertController.addAction(alertAction)

        alertController.preferredAction = alertAction
        
        let cancelAction = UIAlertAction(title: "キャンセル", style: .cancel, handler: {(act) in
            self.dismiss(animated: true, completion: nil)
        })
        
        
        alertController.addAction(cancelAction)
        
        
        present(alertController,animated: true)

```
【Java】read()メソッドで取得するテキストファイルの文字の整数情報


#参考図書
Javaの絵本 第3版 Javaが好きになる新しい9つの扉 
https://www.amazon.co.jp/Java%E3%81%AE%E7%B5%B5%E6%9C%AC-%E7%AC%AC3%E7%89%88-Java%E3%81%8C%E5%A5%BD%E3%81%8D%E3%81%AB%E3%81%AA%E3%82%8B%E6%96%B0%E3%81%97%E3%81%849%E3%81%A4%E3%81%AE%E6%89%89-%E6%A0%AA%E5%BC%8F%E4%BC%9A%E7%A4%BE%E3%82%A2%E3%83%B3%E3%82%AF/dp/4798150371

※サンプルプログラムに手を加えて引用しています。


#文字情報を読み込むサンプルプログラム

```java:ReadText.java
import java.io.FileReader;
import java.io.IOException;

public class ReadText {

	public static void main(String[] args) {
		try {
			FileReader in = new FileReader(args[0]);
			int c;
			String s = new String();
			System.out.println("****文字整数のそのまま表示****");
			while((c = in.read()) != -1) {
				System.out.print(c); // 文字の整数情報を出力
				System.out.println();
				s = s + (char)c; // 整数情報を文字に変換
			}
			System.out.print(s); // 文字に変換して結合した文字列を出力
			in.close();
		} catch (IOException ie) { // 入出力時の例外を表す例外クラス
			System.out.println("ファイルがありません");
		} catch (Exception e) {
			System.out.println("ファイル指定がありません");
		}
	}
}

```

```:aiueo.txt
あいうえお
かきくけこ
さしすせそ
```

`最後の「そ」の後にも改行を入れています`


#実行結果

```:実行結果
****文字整数のそのまま表示****
12354
12356
12358
12360
12362
10
12363
12365
12367
12369
12371
10
12373
12375
12377
12379
12381
10
あいうえお
かきくけこ
さしすせそ
```

#ひらがな一つは5つ、改行は10で表す

10が3回出てきてます。aiueo.txtのそれぞれの行の最後に改行を入れているので改行は10のようですね。

#PHPより入出力がめんどくさい

多分PHPだけじゃなくてRubyももっと簡単に記述ができるのでしょう。

しかしテキストファイルとのデータのやりとりの方法などは、いちいち記述しないといけないが故に、中身も見えて理解が深まる気がします。
GL_TEXTURE_EXTERNAL_OESのサンプル


[環境]
OS : win10pro
IDE : AndroidStudio 4.0.1
確認した実機: Galaxys8

元ネタ　https://github.com/crossle/MediaPlayerSurface
AndroidStudioがうまくビルドしてくれなかったのでプロジェクト新規作成した。
AndroidManifest.xmlで起動Activityを指定する

[GLSurface](https://1drv.ms/u/s!ApO4wsxFJBbVuUw7-W8rAjg9ku3s?e=SErsQv)
[EGL版](https://1drv.ms/u/s!ApO4wsxFJBbVuVYiewhJdMloERvb?e=umdTh7)
[OpenGLES](https://1drv.ms/u/s!ApO4wsxFJBbVuVefwGb0_7EOQJvV?e=11kbQb)


```
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MediaPlayerSurfaceStubActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>


```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555658/1f2384b0-1f59-ba73-6f86-15e7abdc8427.png)
DataFramesを用いたJuliaでのデータ分析(その1)



# Julia でのデータ分析
Juliaでのデータ分析を`DataFrmaes`を使用しながら使用方法について書いていきます．
なお`version`は`1.5.0`

#Pkgのインポート

```Julia:import
using Pkg;
Pkg.add("DataFrames")
Pkg.add("CSV")
using DataFrames
using CSV
```
# DataFrameの作成
`Julia`の`DataFrames`は`pandas`の`Dataframe`と同じくテーブル形式のエクセルのようなデータ構造を持ち，各列は数値型・文字列型・ブール型などの様々な型を保持できる．
作成方法は直接作成も出来るし，CSVなどから作成するなどの方法がある．

```Julia:DataFrame作成
# 直接作成する
df = DataFrame(A = 1:4, B = ["M", "F", "F", "M"])

#dictionaryから作成する
data = Dict("A" => 1:4, "B" => ["M", "F", "F", "M"])
df = DataFrame(data)
# 4×2 DataFrame
│ Row │ A     │ B      │
│     │ Int64 │ String │
├─────┼───────┼────────┤
│ 1   │ 1     │ M      │
│ 2   │ 2     │ F      │
│ 3   │ 3     │ F      │
│ 4   │ 4     │ M      │

#順番をソートして読み込みたい場合
df_BA = DataFrame(data) |> df_ -> permutecols!(df_, [:B,:A]) # B→Aの順
# 4×2 DataFrame
│ Row │ B      │ A     │
│     │ String │ Int64 │
├─────┼────────┼───────┤
│ 1   │ M      │ 1     │
│ 2   │ F      │ 2     │
│ 3   │ F      │ 3     │
│ 4   │ M      │ 4     │

#JuliaのPipe演算子とlambda関数は
5 |> x -> x*3 #15
#のように|>と->で書ける

#CSVファイルから読み込み
df =  CSV.read("path/to/data.csv")
```
#データの構造
### データへのアクセス
データへのアクセスは参照(データを直接参照するのでコピーしない)と
コピー(`DataFrame`内のデータをコピーする)する方法がある．
参照は`df.col`、`df."col"`、`df[!, :col]`,`df[!, "col"]`が
コピーは`df[:, :col]`, `df[:, "col"]`が該当する．
参照を使用する場合は参照値の変更がもとのDataframeに影響するので注意が必要．

```Julia:DataFrameアクセス
df.A
df."A"
df[!, :A]
#どれも同じ
[1, 2, 3, 4]

A = df.A #参照
A[1] = -1
df # 値が変わってしまう．

# 4×2 DataFrame
│ Row │ A     │ B      │
│     │ Int64 │ String │
├─────┼───────┼────────┤
│ 1   │ -1    │ M      │
│ 2   │ 2     │ F      │
│ 3   │ 3     │ F      │
│ 4   │ 4     │ M      │

# コピーを作成する場合
A = df[:, :A] #コピー
A[1] = 1 #もとに戻したつもり
df # コピーを作成しているので値はもとに戻らない

# 4×2 DataFrame
│ Row │ A     │ B      │
│     │ Int64 │ String │
├─────┼───────┼────────┤
│ 1   │ -1    │ M      │
│ 2   │ 2     │ F      │
│ 3   │ 3     │ F      │
│ 4   │ 4     │ M      │
```

###データの追加・削除
* 列データの追加

```Julia
c = 3:6 #3,4,5,6
df.C = c #長さが既存のデータと一致する必要あり
# 4×3 DataFrame
│ Row │ A     │ B      │ C     │
│     │ Int64 │ String │ Int64 │
├─────┼───────┼────────┼───────┤
│ 1   │ -1    │ M      │ 3     │
│ 2   │ 2     │ F      │ 4     │
│ 3   │ 3     │ F      │ 5     │
│ 4   │ 4     │ M      │ 6     │
```
* 列データの削除

```Julia 
select!(df, Not(:B)) # !は破壊演算子(dfを書き換える)
df
# 4×2 DataFrame
│ Row │ A     │ C     │
│     │ Int64 │ Int64 │
├─────┼───────┼───────┤
│ 1   │ -1    │ 3     │
│ 2   │ 2     │ 4     │
│ 3   │ 3     │ 5     │
│ 4   │ 4     │ 6     │
```
#5. 列名・サイズなどの確認
DataFrameの列名は`names`で
縦横の数は`size`で取得

```Julia:列名取得
names(df)
# ["A", "B"]

# 列名をSymbolとして取得する場合はpropertynamesを使用する
propertynames(df)
#[:A, :B]

# データの大きさを取得
size(df)
#(4, 2)
```
MVCフレームワークの備忘録

#MVCフレームワークとは
**プログラムをModel，View，Controllerの三つに役割分担する考え方**

##Modelの役割
データの処理や操作、データの検証や関連付けなどの細かい処理もModelが担当する。
**システムの本体部分。**

##Viewの役割
ModelやControllerから渡された**データを出力する処理**を担当する。

##Controllerの役割
ModelとViewを**つなぐ処理**を担当する。
**Modelから**渡されたデータを加工して**Viewに渡す。**

#MVCフレームワークを使うメリット
保守性が高い。
分業しやすい。
変化に強い。
フォルダ名に変な拡張子をつけた結果、Finderが固まるようになってしまった話。

いくつかのHDDに散らばっていたデータの居場所をひと処にしてやろうとNAS(QNAP TS-230)を買ったわけですが、あるフォルダを選択するとFinderが固まってしまう問題に遭遇しました。サポートにも問い合わせたり、あれやこれやと試したわけですが、結果的になぁ〜んだというような話でしたので、恥ずかしい経験をシェアします。

## 環境

Mac mini(Mid 2011)、MacOS 10.13をメインにしています。他に10.12のiMac、10.15のMacBook Air、どれでも現象は同じでした。

## 現象

Finderから、あるフォルダを選択するとグルグルが表示されたままになってしまいます。ただ時間がかかっているだけかと思い、暇つぶしにウェブブラウジングでもしようとしても、ネットワークのトラフィックがダメなようで、何もできません。Finderの強制終了はおろか、PCのシャットダウンもできなくなるので、control＋command＋電源ボタンで再起動が必要な状態になります。

## 原因

そのフォルダの中の、サブフォルダの名称に拡張子「.app」を使っていたことが原因でした。NAS側ではフォルダとして認識しているものの、Mac側ではアプリケーションパッケージとして認識してしまうようです。

こんなことで1か月以上、だましだまし使いながら悩んでいたのですが、フォルダ名を変更して一発解決でした。

もともと「xxx.netlify.com」という名前だったフォルダをNAS側で「xxx.netlify.app」と改名してしまったことが原因です。

## 反省点

フォルダにしてもファイルにしても、意味ありげな拡張子を不用意に使うべきではありませんでした。
勉強メモ1_eclipse(python)ダウンロード、python実行、OpenPyXLダウンロード



★1 eclipseダウンロード

　このURL（ https://www.sejuku.net/blog/73558 ）
　に添って開始

　だだ、
　https://mergedoc.osdn.jp/
　の中から「Eclipse 4.8 Photon」ダウンロードして、
　Eclipseを起動しないと動かない
　最新版のは現状起動時に、awt.dllがどうのこうのエラーが出て自分のＰＣでは利用不可。

　ダウンロードしたら
　上記のURL（ https://www.sejuku.net/blog/73558 ）
　「Pythonの実行」のところまでやってみる

★2 openxlpyインストール
　まずは、pipeをインストール
　このURL( https://se-log.blogspot.com/2018/11/python-windows-eclipse-pip.html )
　に添ってやればpipeインストールはできる。

　pipeインストール完了後、
　eclipseで上記のURL( https://se-log.blogspot.com/2018/11/python-windows-eclipse-pip.html )
　を参考に「install openpyxl」をすれば完了
僕なりのストーリーポイントのメリットとデメリット

ちょっと前に書いた[ひとりストーリーポイントのすゝめ](https://qiita.com/yube/items/bf39af29da12da8b0cf5)の続きです。

# ストーリーポイントを導入してわかった事実
- ポイントにすると課題の分離意識が生まれてミニマムで開発できる
 - 各ポイントの定義を書かなくても課題の分離は意識できた
- ポイント定義を書くことでどの作業が難しく感じているのかを見える化できた
 - [newsdict.io](https://newsdict.io)を作っている中での、自分なりの[定義](https://github.com/newsdict/newsdict.io#story-point)を書いてみた
- 当事者以外へのストーリーポイントの定義共有は難しい
 - 時間換算で見られるとか、それおいしいの？とかかなっている
- 初期の企画など不確定要素が大きいものはストーリーポイントでは扱えない

# 僕にとってのメリット
- 課題分離意識を育てるのに役立つ

# 僕にとってのデメリット
- 当事者以外へのストーリーポイントの定義共有はおすすめできない
 - 共有コストがかかりすぎる

# 僕の結論
ストーリーポイントは当事者間での導入には最適！

# 今後の展開
- newsdict.io のタスクをオープンにする
 - qiitaにリンクできる
- Velocityでなぜポイントが上がったか下がったかのKPTを考える
- Release reportで大きな課題を駆逐できるようにする
render と redirect_to の使い分け基準

【概要】
----------------------------------------
<b>1.結論</b>

<b>2.どのように使うか</b>

<b>3.なぜそのような違いが発生するのか</b>

<b>4.ここから学んだこと</b>


1.結論
----------------------------------------

<b>Controllerを挟みたくないか、一度挟みたいか</b>です
<br>
2.どのように使うか
----------------------------------------
❶**render**

>(i)ただViewファイルを指定して表示させたい

```ruby:controller.rb
def
 render '***(Viewファイル名).index(アクション名) #---"a"
end

or

def
 render :index(アクション名) #---"b"
end
```

"a"と"b"の違いは
a➡︎違うコントローラーのアクションを表示させたい
b➡︎renderを記載している同コントローラーのアクションを表示させたい
ということになります。

>(ii)複数のhtml.erbファイルで同じプログラムを使いたい

```ruby:
<%= render 'public/error_messages', model: f.object %> #---自分の記事から抜粋
```



上記の場合はindex,new,showアクションで空で入力した際に”必要事項が入力されていないよ！”メッセージを出しています。(<a href="https://qiita.com/taka_no_okapi/items/43e5f55cc2ffca1ee85f">エラーバンドリングの出し方</a>)
<br>

❷**redirect_to**
>(i)一度Controller処理を通したアクションを行いたい

```ruby:controller
def
 redirect_to("/app/(Viewフォルダ名)/(アクション名.html.erb)")
end

or

def
 redirect_to ****_****_path
end
```
つまりURL指定ということです。

3.なぜそのような違いが発生するのか
----------------------------------------
結論は"もう一度Controller"が間に入っているかの違いになります。

❶renderはController➡︎Viewの動きに対して
❷redirect_toはController➡︎routes.rb（URLに基づいたid)➡︎Controller➡︎View
という動きになります。
renderだけだと”ただ”ページを表示するだけなので、処理に困りエラーが起きることがありました。
redirect_toはControllerを一回挟むのでupdate/destoryアクションをエラーなしで行えます。


<br>
rails マイグレーションファイルの修正方法

# railsでマイグレーションファイルを戻す方法
スペルミスをしまった時によく使います。

例えばtitleカラムを、titeとスペルミスしました。

そしてすでにマイグレーションファイルはデータベースに反映されてしまっています。このような時にリカバリーする方法です。

マイグレーションファイルがデータベースに適応されている為、修正が出来ない状態になっています。

一度データベース側から「マイグレーションファイルの戻す」必要があり、そのためのコマンドがrails db:rollback（ロールバック）を使います。

## rails db:rollback コマンド
マイグレーションファイルを戻すためのコマンドです。ロールバック→修正→マイグレートで修復が可能になります。

```ターミナル

rails db:rollback
```
## rails db:migrate:status コマンド
マイグレーションファイルがデータベースに適用されているかどうかを調べるコマンドです。適用されているときはupと表示されるため、修正するためにはロールバックする必要があります。適用されていないときは、downと表示され、そのまま修正や削除が可能です。

```
rails db:migrate:status
```
## 手順

これらを踏まえて進めていきます。

```
＜ターミナル＞

rails db:rollback
```
rails db:rollbackコマンドを実行します。そのあと実行したロールバックが反映
されているか確認をします。

```
＜ターミナル＞

rails db:migrate:status
```
こちらのコマンドで確認をします。すると以下のようにdownに表示が変わったことがわかります。
これでマイグレーションファイルを修正することができます。

```
＜ターミナル＞

 Status   Migration ID    Migration Name
--------------------------------------------------
  down    20200919022451  Create calories
```

これでマイグレーションファイルの修正が可能になりました。該当のマイグレーションファイルを修正をしましょう。

```db/migrate/20XXXXXXXXXXXX_create_posts.rb

class CreatePosts < ActiveRecord::Migration[5.2]
  def change
    create_table :posts do |t|
      t.text :title   #ここを修正しました。　titles →　title
      t.text :content
      t.timestamps
    end
  end
end
```

修正が終わったら、マイグレーションファイルを実行します。

# マイグレーションファイル実行

```
rails db:migrate
```
これにてファイルが修正されたのが反映されます。
ローカルPCのDocker環境からAWS RDSに接続する


## 概要
- ローカルPCのDocker環境からRDSに接続する方法のメモ
- Dockerの開発では、DBのコンテナイメージを作成する場合が多いと思われるが、何かしらの理由でAWSのRDSを直接使用したい場合の方法

## 前提
- VPC環境を構築し、PrivateサブネットにEC2インスタンスおよび、Railsアプリケーションが接続する用のRDSを作成済
    - Nat gateway もしくは Endpointにより サービス 「com.amazonaws.us-east-1.ssm
」に接続が可能なこと
- EC2インスタンスにssm-agentがインストールされている
- EC２インスタンスへは踏み台サーバ等使用せずにSSMにて接続を行う

## ローカルPC環境
- Docker for mac  

## 参考
- https://dev.classmethod.jp/articles/session-manager-launches-tunneling-support-for-ssh-and-scp/#toc-10
- https://blog.serverworks.co.jp/tech/2019/09/11/ssm-portfowarding/
- https://qiita.com/lighttiger2505/items/ea33291639a8656d50b4
- https://dev.classmethod.jp/articles/ssm-session-manager-private/


## SSMの設定
- ssh config ファイルにSSM接続用の設定を追記する

```:config
Host EC2サーバのインスタンスID]
    User [ECインスタンス接続ユーザ]
    Port 22
    ServerAliveInterval 300
    IdentityFile ~/.ssh/id_rsa
    ProxyCommand sh -c "aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters 'portNumber=%p'"
```

- ssm ssmによるssh接続確認

```
$ ssh [EC2サーバのインスタンスID]
```

## ポートフォワーディングによるRDSへの接続
 
- aws profileの設定
    - ポートフォワーディングによるトンネル作成時に必要

```
$ aws configure --profile=ssm-test
```

- ssh-configに以下を設定

### 
```config
# SSH over Session Manager
host i-* mi-*
   ProxyCommand sh -c "aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters 'portNumber=%p' --profile=ssm-test"
```

- トンネルの作成

```
ssh -i ~/.ssh/id_rsa [ECインスタンス接続ユーザ]@[EC2サーバのインスタンスID] -L 13306:[RDSのエンドポイント]:3306
```

- rdsへの接続確認を実行

```
mysql -u [DB接続ユーザ] -h 127.0.0.1 -P 13306 -p
```

## Rails設定
### database.ymlの設定
- ポート番号にRDSへのポートフォワーディング時に指定しポート番号（13306）を指定する
- hostに「docker.for.mac.localhost」を指定する

```
default: &default
  adapter: mysql2
  encoding: utf8
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: [RDS接続ユーザ]
  password: [RDS接続パスワード]
  host: docker.for.mac.localhost
  port: 13306
```

以上の設定を行うことで、Dockerコンテナで起動するRailsアプリケーションから、RDSへの接続が可能になる。
SSM接続および、ポートフォワーディングに使用に際し、SGおよび、NACLのポート番号（22、13306）の解放等は特に不要。
【PHP】ajax処理でステータスコード200を返しているのに正常に動かないエラー

PHPについて学習内容を備忘録としてまとめます。
今回は実装中に起きたエラーについて解決法まで記載します。

#ステータスコード200を返しているのにajax処理が正常に動かない

下記はテキストボックスに文字を入力して`編集完了ボタン`をクリックすると、
`test`の部分が書き換わるajax機能を用いたものになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597913/60f55b04-17c4-0af7-baf6-e0e514fe7daa.png)
ただ`編集完了ボタン`をクリックしても文字が変わらないため、
jqueryのコードに`jqXHR.status`を追記してステータスコードを確認してみます。

```
    }).fail(function(jqXHR, textStatus, errorThrown){
       $("div.result").text("エラーが発生しました。ステータス：" + jqXHR.status);
    });
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597913/8f3c5dcd-8256-a3b9-7ec0-d3154dbd3b4f.png)
↓編集完了をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597913/8be68232-5875-f199-beb3-66a98b6d7987.png)

すると上記のようにステータスコードは200を返しており正常にレスポンスが取得できています。

##原因
下記のように`textstatus`を確認してみたところパースエラーと表示されていました。
`datatype`を`json`としていたためレスポンスが厳格な作法によってパースされるため、少しでも奇形の場合はパースエラーが返されてしまうとのことです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597913/e2e7cf65-21bd-c783-75be-bf2fba4f1ea4.png)
##解決方法
`datatype`を`text`で指定すると、正常に動きました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597913/8f3c5dcd-8256-a3b9-7ec0-d3154dbd3b4f.png)
↓編集完了をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597913/a8419f42-da63-3f32-a496-163acdc67935.png)

#参考URL
https://trialanderror.jp/ajax-fail/
socket.ioをwebsocketで実行するために、awsのclassicロードバランサに設定すること

# 問題の現象
socket.ioのクライアントからnode.js上で動作するsocket.ioのサーバに接続したときに、ブラウザのコンソールに、次のエラーが表示される。
WebSocket connection to 'wss://xxx' failed: Error during WebSocket handshake: Unexpected response code: 400

ただし、socket.ioの動作自体には問題がない。websocketでの接続に失敗したので、ポーリングによってsocket.ioが接続されたもよう。

# 環境
AWS EC2 ロードバランサ（Classic Load Balancer）
Node.js
Socket.io

# 修正方法

ロードバランサのリスナーで、通常は、HTTPS -> HTTPとしている転送を、以下のように、SSL -> TCP(80)とする。
<img width="820px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275020/c0395368-3507-c6b4-5f75-fa2ab19e23e9.png">

httpsと同じポートの433ではあるがプロトコルがwebsocketの場合はwssなので、ロードバランサが通してくれなかったと思われる。そこで、同じポートではあるがsslプロトコルにしてwssでも、httpsでも通してもらうようにする。
PMBOKガイドー定量的リスク分析

応用情報技術者平成29年春期 午前53

PMBOKガイド第5版によれば，定量的リスク分析で実施することはどれか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/13dd26fc-f8a2-d5e7-510b-059b5d40412e.png)


１、リスクマネジメント計画の策定
PMBOKガイド第5版によれば、リスクマネジメント計画の策定は、
　・「リスク特定」→
　・「定性的リスク分析」→
　・「定量的リスク分析」→
　・「リスク対応計画」
の手順で行われます。

定量的リスク分析は、
　・特定されたリスクを数量的に算定し、
　・プロジェクト全体に与える影響を分析するプロセスです。

分析ツールとして、
　・感度分析、
　・トルネード図、
　・期待金額価値分析、
　・モンテカルロ法
などが用いられます。

２、
・感度分析とは、
計画や予想を立てる際に、ある要素（変数・パラメータ）が現状あるいは予測値から変動したとき、最終的な利益やキャッシュフローなどにどの程度の影響を与えるかを見る分析。 

感度分析とは、「リスク事象の影響度を分析し、どのリスク事象が潜在的な影響を一番大きくかかえているかを判断するための定量化技法で、対象の要素以外の値を固定しておき、分析対象の要素の値を変化させたときにリスクがどのように変動するのかを見る手法」です。

簡単に言うと、プロジェクトにおいて、リスク（危険）となる事象、例えば要員のパフォーマンスだったり、ユーザの要望だったり、コスト超過だったりなどの中でインパクトがあるリスクを検知するための手段です。

インパクトがあるリスクは注意しながら見たり、必要に応じて対処していく必要があります。

この感度分析を分かり易く可視化したものが「トルネード図」となります。


・トルネード図とは？
前述「感度分析」のように、定量的なリスク分析とモデル化の手段（技法）が感度分析ですが、この感度分析の結果を示したものがトルネード図となります。

トルネード図と言われる所以は、見た通り竜巻のような形のグラフとなるからですね。

そしてトルネードの幅が大きいものはリスクのインパクトが大きいので、重要視していく必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/6249e482-709f-d5ca-b990-64319e192b72.png)

※トーネード（トルネードとも、Tornado）は、英語で竜巻のことである

・EMV(Expected Monetary Value，期待金額価値)は、
定量的リスク分析で用いられるリスクレベルの算定方法で、リスクが顕在化したときの影響金額に発生確率を乗じて求めます。 リスクは好機と脅威に分けられるため、プラスの結果をもたらすリスクは正の値、マイナスの結果をもたらすリスクは負の値で表します。

　EMV＝リスク事象発生時の影響金額×リスク事象の発生確率

・モンテカルロ法　Monte Carlo method、MC
モンテカルロ法は、数値解析の分野において、確率を近似的に求めるために使われる手法です。n回のシミュレーションを行い、ある事象がm回起これば、その事象の起こる確率は m/nで近似できます。試行回数nが大きくなるほど、よい近似値となります。

参照：
クラスタ分析法、指数平滑法、デルファイ法、モンテカルロ法、クロスセクション法
https://qiita.com/lymansouka2017/items/90652f1013b4a1818c62


https://www.ap-siken.com/kakomon/29_haru/q53.html


感度分析
https://mba.globis.ac.jp/about_mba/glossary/detail-12126.html#:~:text=%E6%84%9F%E5%BA%A6%E5%88%86%E6%9E%90%E3%81%A8%E3%81%AF%E3%80%81%E8%A8%88%E7%94%BB,%E6%80%A7%E3%81%AE%E6%99%82%E4%BB%A3%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82


https://itmanabi.com/tornado-view/


EMV(期待金額価値)の算出方法
https://www.pm-siken.com/kakomon/21_haru/am2_8.html#:~:text=EMV(Expected%20Monetary%20Value%EF%BC%8C%E6%9C%9F%E5%BE%85,%E3%81%AE%E5%80%A4%E3%81%A7%E8%A1%A8%E3%81%97%E3%81%BE%E3%81%99%E3%80%82
Elastic Beanstalk ワーカー環境の定期的なタスクとFIFOキューを併用する

## :information_desk_person: 概要

https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/using-features-managing-env-tiers.html#worker-periodictasks

> If you configure your worker environment with an existing SQS queue and choose an Amazon SQS FIFO queue, periodic tasks aren't supported.

FIFOキューと定期的なタスクが併用できない旨が記載されています。

## :writing_hand: 対策方針
オートスケールによって台数が増減しても、`ワーカー環境の定期的なタスク` は重複実行されないようになっています。
その仕組みとしては、DynamoDBの `AWSEBWorkerCronLeaderRegistry` に書き込みできたインスタンスをリーダー(Leader)として、そのリーダーインスタンスのみで実行することでそれを実現しています。

そのリーダーの選出を流用し、ワーカー環境のEC2でcron実行をさせることで表題の併用を実現してみます。

## :computer: 検証環境
`Ruby 2.6 running on 64bit Amazon Linux 2/3.1.1`

:warning: `Amazon Linux 2` なので注意してください。

## ステップ :one: : ダミーのcron.yamlを作成し、 `AWSEBWorkerCronLeaderRegistry` を書き込みさせる

```yaml:cron.yaml
version: 1
cron: # UTC
  - name: "dummy-job"  # 何でもよい
    url: "/health"  # 何でもよい
    schedule: "7 7 7 7 7" # 何でもよい
```

## ステップ:two: : 自身がLeaderか判定するスクリプトを用意

```bash:bin/eb_is_worker_leader
#!/usr/bin/env bash

# EC2でないときはexit
if [[ ! -f /var/lib/cloud/data/instance-id ]]; then
  exit
fi
instance_id=$(cat /var/lib/cloud/data/instance-id)

# AWSEBWorkerCronLeaderRegistry のテーブル名を取得
table_name=$(awk -F': ' '$1=="registry_table" {printf $2}' /etc/aws-sqsd.d/default.yaml)
# 定期的に更新されている、leader_idを取得する (ex: i-XXXXX.${registration-record.worker_id})
leader_id=$(aws dynamodb get-item --region ${AWS_REGION} --table-name ${table_name} --key '{"id": {"S": "leader-election-record"} }' | jq -r .Item.leader_id.S)

echo ${leader_id} | grep -q ${instance_id}
exit $?
```

## ステップ:three: : cronをセット

ステップ2で作成した `bin/eb_is_worker_leader` が成功したら、処理を実行するようにcronをセットします。
例えば、Rubyでcronをセットする :gem: [whenever](https://github.com/javan/whenever) を使う場合、下記のようになります。

```ruby:schedule.rb
job_type :leader_runner, "cd :path && bin/eb_is_worker_leader && bin/rails runner -e :environment ':task' :output"

every :hour do
  leader_runner "SomeModel.ladeeda"
end
```

なお、[whenever](https://github.com/javan/whenever) で用意されている `runner` は下記のとおりです。
比べると `bin/eb_is_worker_leader` が追加されているだけなのがわかるかと思います。

```ruby
job_type :runner,  "cd :path && bin/rails runner -e :environment ':task' :output"
```

<details>
<summary>おまけ: wheneverでcronを更新する</summary>
<div>

```bash:.platform/hooks/postdeploy/XX_update_cron.sh
#!/usr/bin/env bash

# Workerでなければ何もしない
env_name=$(jq -r .Name /opt/elasticbeanstalk/config/ebenvinfo/envtier.json)
if [[ ! ${env_name} = 'Worker' ]]; then
  exit
fi

/opt/elasticbeanstalk/.rbenv/shims/bundle exec whenever --user webapp --update-crontab
```

</div>
</details>

## :punch: まとめ
これらによって、すべてのワーカーインスタンスでcronが実行されます。
cronではリーダーのみ処理が継続されるため、定期的なタスクの重複した実行が防げます。

## :books: 似たような解決策
- https://github.com/awsdocs/elastic-beanstalk-samples/blob/main/configuration-files/aws-provided/instance-configuration/cron-leaderonly-linux.config
- https://github.com/dignoe/whenever-elasticbeanstalk

:warning: どちらも `Amazon Linux 1` が対象です

これらはインスタンス数でLeaderを判断しています。
この記事のやり方では、 `AWSEBWorkerCronLeaderRegistry` を流用することで、シンプルな実装になるかなと思っています。
awkの便利な使い方まとめ

# 経緯

仕事で割とcsvからデータ抽出したり、ログ調査とかでawk使うけど、あれってどうやるんだっけ的備忘録
特定フィールド抜き出すようなよくある使い方は載せない

## 特定フィールドが一致する行を抽出

第７フィールドが５の行を表示
$0は一行(フィールド)全ての意味

```bash
cat hoge.csv | awk -F',' '$7==5 {print $0}'
```

## 列集計(特定フィールド集計)

第１フィールドを集計して表示

```bash
cat hoge.csv|awk -F',' '{a+=$1}END{print a}'
```
MacBookPro初期設定（2020.9）

新しくPC買ったので、最速初期設定。
前回記事は[こちら](https://qiita.com/mazeltov7/items/366b4084c333a00caa2f)。
前回とそんなに変わらないが、今回はbrew file使ってやったところが差分。


- キーボード
  - CapsLockをCtrに。（キーボード→修飾キー）
  - cmd + spaceで言語切替、ctr + spaceでspotlight
  - ショートカットの入力ソースの「前の入力ソースを選択」をcmd + space
  - 切り替えると、かぶってアラート出るので、それをctr + spaceに。
  - option + tabで同じアプリ内ウィンドウ切り替えを可能にする（[参考](https://qiita.com/Yinaura/items/10fe5fe0cb0a795a0f58)）
- トラックパッド
  - タップクリックはしない
  - 軌跡の速さは早めに
- Dock
  - 画面上の位置を左に変更
  - Dockを自動的に隠す/表示にチェック
- Finder
  - サイドバーで、マイファイル消して、その他適宜入れる
  - 詳細で、「すべてのファイル名拡張子を表示」にチェック
- 日付と時刻
  - 「日付を表示」にチェック
- .sshなどのドットファイル系を入れる
    - dropboxに入れてるのでそこから引っ張る。


ここからコマンドで。ターミナルで、brew入れる。

```
# brewのインストール
$ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"

# brew file インストール
$ brew install rcmdnk/file/brew-file
```
brew fileについてはこちらのdocument参照。
https://homebrew-file.readthedocs.io/en/latest/getting_started.html

githubと連携させてよしなに対応。
ぼくのBrewfileはこちら。
https://github.com/mazeltov7/Brewfile

今回からzshからfishに変えてみたけどわりと良い。
https://github.com/fish-shell/fish-shell
EC-CUBE4×Stripe　決済プラグインを作ったお話（実装内容）

EC-CUBEのStripe決済プラグインを作成しました。

まだまだ実装したい機能があるので、完全完成はまだ先ですが、カートから決済が完了するまでの機能は実装できたので、Stripeの機能をどの様に実装したのかをまとめます。

#参考先

**EC-CUBE/sample-payment-plugin**
https://github.com/EC-CUBE/sample-payment-plugin
根本的な物はこちらを利用しました。
これをカスタマイズして作成したと言っても過言ではない。

**kurozumi/Stripe4**
https://github.com/kurozumi/Stripe4
クレジットカード情報の保存に関する動きを、参考にさせて頂きました。
EC-CUBEのStripe決済プラグインはほぼ無いので悲しい。。。

**StripeのドキュメントとAPIリファレンス**
https://stripe.com/docs
https://stripe.com/docs/api
https://stripe.com/docs/js
ここを読み込めば読み込むほど、新しい発見があります。

#実装内容
EC-CUBEのカートから決済のフローは５ステップあります。

1. **カートの商品**
2. **お客様情報**（会員ログインしてない時に表示される）
3. **ご注文手続き**
4. **ご注文内容確認**
5. **完了**

この中で関わってくるのが**3～5の手順**になります。

##ご注文手続きのページ
ttps://examole.com/shopping

確認するボタンを押したとき、以下の順で動作しています。

###新しいカード情報を利用する場合の動作

1. 入力されたカード情報から**PaymentMethod**を作成。
2. EC-CUBEに会員ログインしていれば、**StripeのCustomer**を作成。（すでに作成済の場合は作成しない。）
3. 上記２つを利用して**PaymentIntents**を作成。
4. PaymentMethod・Customer・PaymentIntentsのidを保存します。

![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117915/d0c894fb-b3f1-0037-8434-36f960cb3aac.png)

###保存されているカードを利用する場合の動作

新しいカード情報を利用する場合との違いは、PaymentIntentsを作成する時に、保存されているPaymentMethodのIDを使うだけです。
それ以外の動作は同じです。

![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117915/d22086db-f41e-f45e-d1b3-28d2f75977d0.png)

##ご注文内容確認
ttps://examole.com/shopping/confirm

注文するボタンを押したとき、下記の順で動作しています。

1. PaymentIntentsの情報から**client_secretを取得**。
2. **stripe.confirmCardPayment**でPaymentIntentsの決済を完了させます。

![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117915/fdc68311-57cc-5a34-3105-4841da28c3c2.png)

confirmCardPaymentは3Dセキュアが必要だった場合、ポップアップで認証画面を出してくれます。

![04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117915/67907de4-429e-424c-1db1-b208b772bc13.png)

**カード保存する場合**は、stripe.confirmCardPaymentのオプションsetup_future_usageにoff_sessionを設定します。
決済完了後にPaymentMethodをCustomerへアタッチできないので、決済前にアタッチするか、決済時にoff_sessionを設定するかになると思います。

###決済に問題があった場合

3Dセキュアをキャンセルした場合、新しくPaymentMethodを作成しなければ決済ができません。
このように、新しいカード情報が必要になった場合は、カード情報入力フォームを表示します。
前のページに戻ることなく、新しいカード情報を入力できるようにしています。

![05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117915/6f3930b9-f4c5-9622-56c9-0643623f29cc.png)

###その他のエラーの場合

一例ですが、**stripe.confirmCardPayment**が動いた時に決済が完了しますが、503エラーや通信エラーなどでEC-CUBE側で注文処理が完了しないといった事が起こります。
そのような事が起こった場合、決済が進まないようにしています。
（支払い方法がクレジット決済を選択されている場合に限る。）

この辺は、webhookを使って対応出来ればと思ってます。

##完了
ttps://examole.com/shopping/checkout
↓
ttps://examole.com/shopping/complete

基本的には、EC-CUBEの注文処理のみ行ってます。
カード保存が有効であれば、カード保存処理を行ってます。
Stripeに対しての処理は行ってないです。

##EC-CUBEとStripeの関係性

EC-CUBE１Customerに対してStripe１Customer
EC-CUBEに会員ログインしていない場合は、StripeのCustomerは作成しない。
EC-CUBE１Orderに対してStripe１PaymentIntents

PaymentMethodは必要に応じていくつも作成します。


##最後に

なかなか読みにくい内容かもしれないですが、少しづつアップデートはしていこうと思います。

実装方法はいくつかあって、いくつかUIが違いサンプルを作ってみましたが、上記の方法が一番良い動作かなと一人で勝手に思ってます。

でもまぁ、ほぼほぼStripeの動作を理解して作成できたと思います。
Enum.min(enumerable)でenumerableが空の時に値を返したい(Elixir)

# はじめに
- [Elixir](https://elixir-lang.org/)で整数のリストがあって最小値を求めたいときには[Enum.min](https://hexdocs.pm/elixir/Enum.html#min/3)を使います
- 第一引数のenumerableが空の場合に特別な値を返したいときにはどうすればよいでしょうか
- 公式ドキュメントに書いてある通りのことそのままではありますが調べたことを書いておきます

```elixir
iex> [1,2,3,4,5] |> Enum.min
1

iex> [] |> Enum.min
** (Enum.EmptyError) empty error
    (elixir 1.10.4) lib/enum.ex:1746: anonymous fn/0 in Enum.min/1
```

- 第一引数のenumerableが空の場合に`Enum.min([])`というような呼び出し方をすると[Enum.EmptyError](https://hexdocs.pm/elixir/Enum.EmptyError.html#content)が発生します
- 「最小のものを出力しなさい。ただし最小のものがない場合には-1を出力しなさい」みたいなことを言われた時にたとえばこんなふうには書きたくありません

```elixir
if Enum.empty?(enumerable), do: IO.puts(-1), else: Enum.min(enumerable) |> IO.puts()
```

# enumerableが空の場合に特別な値を返したい

- きっと第●引数に指定するやり方があるだろうと、`IEx`で`h Enum.min`と聞いてみるわけです
- やはり、ありました :tada::tada::tada: 

```elixir
iex> enumerable = []
[]

iex> Enum.min(enumerable, fn -> -1 end)
-1

iex> Enum.min(enumerable, fn -> -1 end) |> IO.puts()
-1
:ok
```

- [Enum.min/2](https://github.com/elixir-lang/elixir/blob/v1.10.4/lib/elixir/lib/enum.ex#L1696-L1698)

# Wrapping Up
- [Elixir](https://elixir-lang.org/)でわからないことがでてきたときは`IEx`に教えてもらう
    - それでも答えたが見つからない場合は？
    - [elixir.jp Slack](https://elixirjp.slack.com/join/shared_invite/enQtODE0NjM3NTIyNTMzLTU5NmViZDE4N2Q3MGUyMmI5YTdlNmQ2ZDI4ZDgxZGZiYTVlYmJjOTMzYzk2NGUyMjBhMTBiNDdjYTg3ZjhmYWI)で聞いてみる
    - 私は以下のコミュニティによく参加させてもらっています
        - [fukuoka.ex](https://fukuokaex.connpass.com/)
        - [kokura.ex](https://fukuokaex.connpass.com/)
        - [OkazaKirin.beam](https://okazakirin-beam.connpass.com/)
        - [Sapporo.beam](https://sapporo-beam.connpass.com/)
- [Enum](https://hexdocs.pm/elixir/Enum.html#content)モジュールはよく使うものだとおもわれますので仲良くなっておくとよいです
- Enjoy [Elixir](https://elixir-lang.org/)!!!
特許の実施許諾

応用情報技術者平成29年春期 午前50

日本において特許Aを取得した特許権者から，実施許諾を受けることが必要になり得るのはどれか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/78768158-7eca-3b1f-1b7a-da21e058bf30.png)

実施許諾については、いろいろな場面があります、下記は例（本質問の選択肢）です：
１、特許権の存続期間　（期間超えると、実施許諾不要）
出願日から25年を超えた特許Aと同じ技術を新たに事業化する場合
⇒特許権の存続期間は出願から20年なので、25年を超えた特許は特許権者から実施許諾を受ける必要はありません。

２、出願日より前から同じ技術を独自に開発した場合　（独自開発した技術の場合、実施許諾不要）
特許Aの出願日より前から特許Aと同じ技術を独自に開発して，特許Aの出願日に日本国内でその技術を用いた製品を製造し，市場で販売していたことが証明できる場合
⇒このケースで説明されている条件を満たせば先使用権が認められるため、特許権者から実施許諾を受ける必要はありません。

３、家庭内で利用する場合　（業務用ではない場合、実施許諾不要）
特許Aを家庭内で個人的に利用するだけの場合
⇒事業でない個人的な使用や家庭内での使用であれば特許権者から実施許諾を受ける必要はありません。

４、輸出する場合（生産、使用、譲渡、輸出、輸入など場合、実施許諾が要）
日本国内で製造し，米国に輸出する製品に特許Aを利用する場合
⇒特許法では発明の「実施」を「生産」「使用」「譲渡等」「輸出」「輸入又は譲渡等の申出」をする行為と定義しています。輸出を行うには特許権者から実施許諾を受けなければなりません。

参照：
https://www.ap-siken.com/kakomon/29_haru/q50.html
「チラ裏」 RANSACKのURL Query strings

# この記事は

URLパラメータでransackの検索結果を表示するためのリスト。
（気が付いたところで増やすかもしれやせん）

# やりたかったこと

Railsのプロジェクトで、ransackを使用していないcontrollerから直接検索結果を手っ取り早く表示したかった。

# やり方

## foo に等しい
```
?q[name_equals]=foo
```
## foo が含まれている
```
?q[name_contains]=foo
```
## foo で始まる
```
?q[name_starts_with]=foo
```
## foo で終わる
```
?q[name_ends_with]=foo
```
## 90 より大きい
```
?q[age_greater_than]=90
```
## 99 より小さい
```
?q[age_less_than]=99
```
## 1 に等しい
```
?q[id_eq]=1
```
## foo から bar の範囲
```
?q[name_in][]=foo&q[name_in][]=bar
```
# 技術的ポイント

✅　他の人のシステムでは試さない
kubernetesでPod起動時にコマンドを実行する


## lifecycle.poststart

- `spec.containers.lifecycle.postStart`を利用することで、コマンド実行可能
- Podの起動、ENTRYPOINT、COMMANDなどと同時タイミング（非同期処理）で実行される
    - 順番がある処理があるとまずい

### yamlファイル

```
        lifecycle:
          postStart:
            exec:
              command:
                - sh
                - -c
                - "echo test > /tmp/test.txt"
```


```app.yaml
    spec:
      containers:
        image: apline:latest
        imagePullPolicy: Always
        tty: true
        lifecycle:
          postStart:
            exec:
              command:
                - sh
                - -c
                - "echo test > /tmp/test.txt"
```

出力

```
[root@sample-app-bc5b49978-4sr5j /]# cat /tmp/test.txt 
test
[root@sample-app-bc5b49978-4sr5j /]# 
```

## 参考
https://qiita.com/petitviolet/items/41aa9abe106a29ba4667
Vivado v2019.1 > Vivado Simulator > Relaunch Simulation > ソース変更が有効にならない

```txt:動作環境
PYNQ-Z1
Windows 10 Pro v1909
Vivado v2019.1
```

### UG937

UG937 Vivado Design Suite チュートリアル
ロジックシミュレーション

上記にてVivado Simulatorの使用を学習していた。


### singen.vhdの変更が有効にならない

チュートリアルにはsine_lの実装に不具合があるものを修正する部分がある。

```sinegen.vhd
--  sine_l <= m_axis_data_tdata_sine_low;
```

上記をアンコメントしても、その左にブレークポイントが表示されない。

```sinegen.vhd
    sine_l <= m_axis_data_tdata_sine_low;
```


### 失敗する状況: メニューバーのアイコンを使う

![スクリーンショット 2020-09-20 113158.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32870/38cc7a6d-49d8-c216-09c2-1e1169c4a17b.png)

こちらを使うと「ソースの変更が反映されない」。

### 成功する状況: Run > Relaunch Simulation

![スクリーンショット 2020-09-20 113158.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32870/ee72f498-8bfd-97e8-fb6c-82ce3c100b15.png)

こちらを使うと「ソースの変更が反映される」。


これで数時間溶けた。
LaravelでURLをHTTPS化させるメモ (Heroku)

LaravelでURLを強制httpsかさせる方法で、よくある対策ではうまくいかなかったのでメモ。

#APP_ENVをproductionに
Herokuの場合、`heroku config:set`で環境変数を設定。

```
heroku config:set APP_ENV=production
```

#AppServiceProviderのboot()にforceSchemeを
AppServiceProviderのboot()に下記を追加

```AppServiceProvider.php
public function boot()
{
    if (\App::environment(['production'])) {
        \URL::forceScheme('https');
    }
}
```

#HttpをHttpsにリダイレクト
Middlewareでhttpによるアクセスをhttpsにリダイレクトする
ForceHttpsという名前のmiddlewareを作成
`php artisan make:middleware ForceHttps`
handle()のところに下記を追加

```ForceHttps.php
public function handle($request, Closure $next)
{
  if (\App::environment(['production']) && $_SERVER["HTTP_X_FORWARDED_PROTO"] != 'https') {
    return redirect()->secure($request->getRequestUri());
  }
  return $next($request);
}
```

#Kernel.phpにForceHttpsを追加
Kernel.phpに先ほど作成したForceHttps.php middlewareを追加

```Kernel.php
protected $middleware = [
  \App\Http\Middleware\ForceHttps::class, // 追加
];
```

[![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172313/d6ad10bc-75ba-8124-14d4-f144657c6473.png)](https://twitter.com/ghibi)
分岐網羅、条件網羅

応用情報技術者平成29年春期 午前48

流れ図において，分岐網羅を満たし，かつ，条件網羅を満たすテストデータの組はどれか。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/08409cb7-443b-3cb4-9e08-f51074218e25.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/9b9ad338-ac3d-c57c-a141-11640fc5b192.png)


１、「分岐網羅」と「条件網羅」はホワイトボックステストにおける網羅性のレベルで、テストケースは以下のように設計されます。
・分岐網羅
　判定条件の真偽を少なくとも1回は実行するテストケースを設計する。
　仮に、分岐条件は複数条件とすると、全て組み合わせを満たすのは必要：
　　例：x≧1 or y=1は、下記二つが網羅する必要です：
　　・x≧1が真で、y＝1が偽
　　・x≧1が偽で、y＝1が真

・条件網羅
　判定条件が複数ある場合に、それぞれの条件が真・偽の場合を組み合わせたテストケースを設計する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/852934c4-45a4-aab0-a18d-fc37c6d8a89b.png)



参照：
RubyのArray#combination(n)相当をElixirで書いてみる

# はじめに
- [Ruby](https://www.ruby-lang.org/ja/)の[Array#combination](https://docs.ruby-lang.org/ja/latest/method/Array/i/combination.html)相当のことを[Elixir](https://elixir-lang.org/)でやってみたいのであります
    - [オートレース](https://autorace.jp/)、競馬、競艇、競輪の賭式で言うところの二連複や三連複です
- permutationについては手前味噌の[RubyのArray#permutation(n)相当をElixirで書いてみる](https://qiita.com/torifukukaiou/items/0881555558387c66c5c4)をご参照ください
- `elixir: 1.10.4-otp-23`を使っています
- [Elixir built-in combinations method?](https://stackoverflow.com/questions/55894349/elixir-built-in-combinations-method)
    - こちらの記事を多いに参考にさせていただきました

# ソースコード

```elixir
defmodule Awesome do
  def combination(_, 0), do: [[]]
  def combination([], _), do: []

  def combination([x | xs], n) do
    for(y <- combination(xs, n - 1), do: [x | y]) ++ combination(xs, n)
  end
end
```

```elixir
iex> IEx.configure(inspect: [limit: :infinity])
:ok

iex> Awesome.combination([1, 2, 3, 4, 5, 6, 7, 8], 3)
[
  [1, 2, 3],
  [1, 2, 4],
  [1, 2, 5],
  [1, 2, 6],
  [1, 2, 7],
  [1, 2, 8],
  [1, 3, 4],
  [1, 3, 5],
  [1, 3, 6],
  [1, 3, 7],
  [1, 3, 8],
  [1, 4, 5],
  [1, 4, 6],
  [1, 4, 7],
  [1, 4, 8],
  [1, 5, 6],
  [1, 5, 7],
  [1, 5, 8],
  [1, 6, 7],
  [1, 6, 8],
  [1, 7, 8],
  [2, 3, 4],
  [2, 3, 5],
  [2, 3, 6],
  [2, 3, 7],
  [2, 3, 8],
  [2, 4, 5],
  [2, 4, 6],
  [2, 4, 7],
  [2, 4, 8], 
  [2, 5, 6],
  [2, 5, 7],
  [2, 5, 8],
  [2, 6, 7],
  [2, 6, 8],
  [2, 7, 8],
  [3, 4, 5],
  [3, 4, 6],
  [3, 4, 7],
  [3, 4, 8],
  [3, 5, 6],
  [3, 5, 7],
  [3, 5, 8],
  [3, 6, 7],
  [3, 6, 8],
  [3, 7, 8],
  [4, 5, 6],
  [4, 5, 7],
  [4, 5, 8],
  [4, 6, 7],
  [4, 6, 8],
  [4, 7, 8],
  [5, 6, 7],
  [5, 6, 8],
  [5, 7, 8],
  [6, 7, 8]
]

iex> Awesome.combination([1, 2, 3, 4, 5, 6, 7, 8], 3) |> Enum.count
56
```

うん、良さそうです :tada::lgtm::tada::lgtm::tada::rocket:
ARRaycastを飛ばして、ねらった平面の位置を取得する

ARKitでは、画面のタッチ位置に対応する平面の、物理空間の3D位置を取得できます。

###１、View内の関心のあるポイントで、RaycastQueryを初期化する。

RealityKit(ARView)の場合

```swift
let query = arView.makeRaycastQuery(from point: CGPoint, allowing target: ARRaycastQuery.Target, alignment: ARRaycastQuery.TargetAlignment)
```

SceneKit(ARSCNView)の場合（以下SceneKitの例で進めます）

```swift
let query = sceneView.raycastQuery(from: CGPoint, allowing: ARRaycastQuery.Target, alignment: ARRaycastQuery.TargetAlignment)
```
queryの引数：

```swift
from: CGPoint //関心のある物体のView内のポイント

allowing: ARRaycastQuery.Target //どの程度の平面を検出するか
    case estimatedPlane //ARKitが推定できる非平面のサーフェスまたは平面
    case existingPlaneGeometry //平面が決定的なサイズと形状を持つことを必要とする
    case existingPlaneInfinite //サイズや形状に関係なく、検出された平面を指定する

alignment: ARRaycastQuery.TargetAlignment //平面が縦か横か両方か
    case any
    case horizontal
    case vertical
```

###2、Sessionに「１、」のqueryを発射（raycast）してもらう

```swift
let results = sceneView.session.raycast(query)
```

###３、結果を取得する

```swift
let position = results.first.worldTransform.translation
```

###４、raycast追跡して平面の位置を更新する

```swift
var tracking:ARTrackedRaycast = sceneView.session.trackedRaycast(query) { (results) in
        // 結果が更新されると呼ばれる
    }
```

###５、不要になった追跡を破棄する
追跡し続けるとリソースを消費します。

```swift
raycast.stopTracking()
raycast = nil
```

****
Core MLを使ったアプリを作っています。
機械学習関連の情報を発信しています。

contact:
rockyshikoku@gmail.com

[Twitter](https://twitter.com/JackdeS11)
[MLBoysチャンネル]
(https://www.youtube.com/channel/UCbHff-wfjTnB3rtXIP6y0xg)
[Medium](https://medium.com/@rockyshikoku)

[相棒](https://twitter.com/oka_yuuji)
[note](https://note.com/oka_yuuji)
2020-09-20 onlineTool > 8bitworkshop.com > Verilog-HDLや6502などのシミュレーター

```txt:動作環境
Windows 10 Pro v1909
Firefox v80.0.1(64ビット)
```

### book

- [Designing Video Game Hardware in Verilog (英語) ペーパーバック – 2018/12/15 ](https://www.amazon.co.jp/Designing-Video-Game-Hardware-Verilog/dp/1728619440/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&dchild=1&keywords=designing+hardware+verilog&qid=1600568733&sr=8-1)

Verilog-HDLの勉強に上記の本を少しずつ読んでいる。
その中でVerilog-HDLの勉強になるツールとサンプルが紹介されていた。

## 8bitworkshop IDE

### サイト

https://8bitworkshop.com

上記のサイトで「Continue to 8bitworkshop IDE」をクリックする。
クッキーに前回の処理などを保持するのでそのあたりを許可する。

最初はAtari 2600のサンプルになっている。

![スクリーンショット 2020-09-20 110958.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32870/35b5b716-7ad4-1973-b743-eaab3a8f25be.png)

### Verilog-HDL

1. Atari 2600のところを選択する
2. Hardware > Verilog を選択する
3. ExamplesにClock Dividerなどがあるので気になるものを選択する

![スクリーンショット 2020-09-20 113038.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32870/ff4aec53-3114-ec52-aec2-6ff8418b1ae7.png)


### Examples

![スクリーンショット 2020-09-20 113158.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32870/261902b0-3454-2105-c882-d039e2a89eac.png)

Verilog-HDLに関しては上記のようなサンプルがある。
勉強にはいいかもしれない。

### 備考

クッキーに作業が残るので、あるPCで作業したものを別のPCで継続することはできないだろう。
ソースを共有するようなことをする必要がある。
iOSDC 2020 前夜祭に参加しました。

# 概要

iOSDCに参加しました。
前夜祭の内容になっています。

少し遅れてしまい2つしか見ていないですがメモ程度に残します。

見たトークは

* Call Directory Extension詳解
* あなたの知らない連絡先の世界

です。

## Call Directory Extension詳解

プロポーザルは[こちら](https://fortee.jp/iosdc-japan-2020/proposal/3b9498ea-3cf2-43ab-89a0-f14ae07794de)

* Call Directory Extensionとは発信者名表示とか出せる機能
* 黎明期の時はすごい発展したのに、最近はバグなどがあってもAppleが対応しないという悲壮感が面白い発表でした笑
* Call Directory Extensionの利用の際に**ユーザー許可してもらうところの説明は丁寧にやるように気を付ける**など、実践者ならではの具体的なアドバイスがよかったです。
* 息をするようにバグが出るみたいです

初めての情報がいっぱいで、実際に商用開発されている方ならではの話が聞けて面白かったです！



## あなたの知らない連絡先の世界

プロポーザルは[こちら](https://fortee.jp/iosdc-japan-2020/proposal/a33cfac2-ee95-4daa-99cc-bd8960bf514a)
スライドは[こちら](https://speakerdeck.com/coe/anatafalsezhi-ranailian-luo-xian-falseshi-jie)

* ミドルネームや3世などどういう風に連絡先に入るのか。サーバーに姓名だけ入れといて大丈夫?笑
* 電話番号のバリデーションを数字だけにするとダメ！記号とか英語も使えるし、記号の使い方はiphoneユーザとしてもすごく勉強になったし面白かったです。
* iOSはvCard形式で、連絡先の情報の構造の話がよかった
* PersonNameComponentsFormatterを使うと人の名前の姓名の分割などができる。**Foundation**に入っているので気楽に使えると#askthespeakerでおっしゃってました。
* 連絡先の履歴がiOS13から取得できるようになったとのこと、この機能はobjective-Cでしか使えず。裏番組もobjective-Cの話題だったので、iOSDCではなくobjective-C-DCだ！


発表がユーモアがあってすごく面白かったです Day2でも登壇されるとのことで期待！

# まとめ
iOSちょっとかじったくらいでも面白かったです。
DAY1、DAY2も楽しみたい。
初級Dart (var)

# var
 Javaユーザを想定したDART言語の特徴として、型指定にvarを使うことができ、変数の型宣言を簡略化できる。

```dart

void main() {
// 整数の型宣言
  int aa = 100;
  
// varによる型推論の記述
  var bb = 123;
}
```

変数の型が決まった後は、別の型へ変更することはできない
たとえば、int型と推論された変数に、double型やString型を入力することはできない
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626074/f3316f46-20d3-0f32-8b6d-96c0412c74e9.png)


# 参照
 1) [javaのvarについて](https://qiita.com/sawayakasan/items/f0424dd4439bc2ab7ce4)