OmniAICreator/Qiita-1.07M huggingface dataset:
pythonでcsvファイルの読み込み/書き出し/分析

今回はjupyternotebookで実行した結果に基づいて書きます。

#読み込み
例えばワークディレクトリにあるsample.csvを読み込んでdata1とする場合、

```py:untitled.py
import pandas as pd
data1 = pd.read_csv('sample.csv')
```
`read_csv()`を使うためにあらかじめパッケージ`pandas`を`import`している必要があります。`pd`として`import`するのが慣例です。

#書き出し
例えばワークディレクトリに`data1`を`sample.csv`として書き出す場合、

```py:untitled.py
data1.to_csv('sample.csv)
```

これでワークディレクトリに`sample.csv`が新たに保存されます。

#分析
ロードしたデータの分析にはこれまた`pandas`の関数`groupby()`が役に立ちます。私が大学の課題などで使った時は[こちら](https://qiita.com/propella/items/a9a32b878c77222630ae)のサイトを参照しました。とてもわかりやすく書いてあります。

記事は以上です、ありがとうございました。

---
#python で 特定の年月日・時分秒・マイクロ秒指定で datetime オブジェクトを作成し、それを文字列にパースする簡単な例

`datetime.datetime()` を使う。

```py
>>> import datetime
>>> datetime.datetime(2016,1,2, 10,20,5, 100).strftime('%Y-%m-%d %H:%M:%S %a %f')
'2016-01-02 10:20:05 Sat 000100'
```

# ref
[Python strftime() - datetime to string](https://www.programiz.com/python-programming/datetime/strftime)

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/1237








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
H2 database でCSVデータをロードする。

H2データベースでCSVファイルをロードする。
末尾に,を付けないといけないという謎仕様はやめてほしい。
javaの配列でも末尾を,にしないとcheckstyleで怒られるのもほんと嫌い。

■テスト用テーブル生成
CREATE TABLE TEST_T (
   ID      CHAR (5)
   , NAME  VARCHAR(5)
   , VAL   NUMBER(5, 0)
   , D1    DATE
   , D2    DATE
   , T1    TIMESTAMP
   , T2    TIMESTAMP(3)
   , T3    TIMESTAMP(6)
)

■CSVファイルの中身を確認する。
TEST_T SELECT * FROM CSVREAD('{CSVへのフルパス}')

■CSVファイルの中身をDBに登録する。
INSERT INTO TEST_T SELECT * FROM CSVREAD('{CSVへのフルパス}')

■データなし編
①末尾に「,」なし
[データ]
  ID,NAME,VAL,D1,D2,T1,T2,T3
[結果]
  列番号が一致しません。21002-199
  

②末尾に「,」あり
[データ]
  ID,NAME,VAL,D1,D2,T1,T2,T3,
[結果]
  正常終了 (ただしデータは入らず。)

③行を増やしてみる。
  ID,NAME,VAL,D1,D2,T1,T2,T3,
  ,,,,,,,,
  ⇒すべてnullの状態で1件挿入された。



■データあり編
①末尾の「,」なし
[データ]
  ID,NAME,VAL,D1,D2,T1,T2,T3,
  ID,NAME,300,2019-04-01,2019-04-30,2019-04-01 23:59:59,2019-04-01 23:59:59,2019-04-01 23:59:59
[結果]
    ⇒正常終了

②末尾の「,」あり
[データ]
  ID,NAME,VAL,D1,D2,T1,T2,T3,
  ID,NAME,300,2019-04-01,2019-04-30,2019-04-01 23:59:59,2019-04-01 23:59:59,2019-04-01 23:59:59,
[結果]
    ⇒正常終了

③末尾に「,」いっぱいつける
[データ]
  ID,NAME,VAL,D1,D2,T1,T2,T3,
  ID,NAME,300,2019-04-01,2019-04-30,2019-04-01 23:59:59,2019-04-01 23:59:59,2019-04-01 23:59:59,,,,,
[結果]
    ⇒正常終了

■データ記載確認
①「"」で囲っても問題ないか。
[データ]
  "ID","NAME","VAL","D1","D2","T1","T2","T3",""
  "ID","NAME","300","2019-04-01","2019-04-30","2019-04-01 23:59:59","2019-04-01 23:59:59","2019-04-01 23:59:59"
[結果]
  列番号が一致しません。
  
②ヘッダの最後の「""」を消してみる。
[データ]
  "ID","NAME","VAL","D1","D2","T1","T2","T3",
  "ID","NAME","300","2019-04-01","2019-04-30","2019-04-01 23:59:59","2019-04-01 23:59:59","2019-04-01 23:59:59"
[結果]
    ⇒正常終了

■CSVファイルの文字コード，改行コードの確認。
①SJIS, UTF-8
  ⇒ SJISはOK, UTF-8で文字化け
②CRLF, LF
  ⇒ どちらも問題なし。  

■■■まとめ■■■
・1行目はヘッダ行としてスキップされる。
・1行目は末尾に「,」を付けないといけない。(★重要★)

・データ行には末尾の「,」の有無はどちらでも可
・データ行はいずれの型でも「"」の有無はどちらでも可。

・文字コードは「SJIS」にすること
・改行コードはどちらもよい。
【自分用】フロントエンド技術色々勉強しなおしてみた。

## Node.jsとは
- サーバーサイドでJavascriptを実行できるようにしてくれる
- チャットサービスなどリアルタイムな機能が得意
- クライアントサイドとサーバーサイドで同じ言語が使えるという利点がある


## gulpとは
- タスク自動化ツール
- ファイル圧縮、Sassコンパイルの自動化・・・
- CSSプリプロセッサのコンパイルや、ファイルのminify化を自動化することで、開発をサポートする役目がある

## webpackとは
- モジュールバンドラーツール
- JSファイルをモジュール毎に管理可能になる
- バンドル元（開発環境）dir構造と出力先構造の設定はentryに設定する
    - entry: { ' 出力先( js/edit/pc  ) ' : ［ ' 参照元のpath ' ］}
    - 機能モジュールをrequireで参照する
    - requireはnode.jsでサポートしている機能
- babelを介すことで、es6以降を使用可能になる
- <蛇足>: windowsとmacで、dir構造のpathの'/'を変更しないと参照できない

<img width="729" alt="スクリーンショット 2019-04-04 0.57.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/199554/31fb192e-1a04-02dc-9510-e834a135f77a.png">

## gulpとwebpackの違い
- 基本的には別物
- 同じことができる部分もあるため混合されやすいのかな？
- gulpは様々な便利機能を管理・自動化できる
- webpackはバンドルをメイン機能とする。node.jsのrequire機能で様々なファイルをまとめて出力できる
- 環境にもよるが、ケースバイケースで、併用 or どちらかでいいかもしれない。
- gulp-webpackもあるので、gulpでwebpackを動かすこともできる。

## CSS設計
**なぜ？**

- ルールを設けることでメンテナンス性を高める
- クラス名で悩む時間が減少する
- 再利用性を高める
- 上書きの上書きやimportant祭りを防ぐ（カオスにならないための管理方法）

**BEM（Block、Element、Modifier）：ベム**

- Block：自身を構成する部品（フォーム、ヘッダー、キービジュアル）
- Element：Blockを構成している要素（見出し、ボタン、画像）
- Modifier：状態を表す。KeyとValueで構成する。Block、Elementそれぞれに対するModifierがある。
    - 例：Block_key_value ： form_submit_done、header_state_fixed、kv_slidetype_loop
    - 例：Element_key_value ： btn_state_disable・・・

**OOCSS（Object Oriented CSS） ：オーオーシーエスエス**

- 共通スタイルと固有スタイルをclassで分けて当てる
- .btn （共通クラス） .red-btn（固有クラス）

**SMACSS（Scalable and Modular Architecture for CSS）：スマックス**

- Base
    - サイト全体のデフォルトスタイルを定義する（reset.cssなど）
- Layout
    - Moduleの配置を決める
    - プレフィックスに「l-」をつける（例: .l-main、.l-sub）
- Module
    - 再利用可能なパーツ
    - 親モジュールの名前をプレフィックスにつける（例: 親: .item、子: .item-box）
- State
    - LayoutやModuleの変化した状態
    - プレフィックスに「is-」をつける（例: .is-active、.is-error）
- Theme
    - LayoutやModuleのTheme（色を管理する）
    - プレフィックスに「theme-」をつける（例: .theme-color）

## Webブラウザとは
- インターネット（World Wide Web（略称：WWW））上で提供されているシステムを利用するためのソフトウェア

## URL
- URLの文法
    - スキーム名（http（https））
        - どんな約束事（プロトコル）でデータを送受信すればよいかを決める
        - http（https）：Webページ
        - https：そのページは、「SSL/TLS」によって通信が暗号化されていることを明示
        - mailto：メールの宛先
    - ホスト名・ドメイン名
        - ホスト名：ネットワーク上にある機器を識別するため個別に割り振られた名前
        - ドメイン名：ホストが所属するホスト、ホストが所属するネットワークの名前
        - ホストはドメイン名の一種
        - ネットワーク上の住所（IPアドレス）
    - パス
        - 参照先ファイルの場所

- DNSサーバ（Domain Name Systemサーバー）による名前解決
    - URLのみではデータに辿り着けない
    - なぜURLやDNSが必要なのか？
        - IPアドレスは人間には分かりにくい
        - IPアドレスは変更される可能性があるため

- Webサーバー
    - クライアント側にwepページを表示させるために必要なファイルを返す
    - Perlやphpなど、サーバー側でプログラムを実行し、実行結果を返す

<img width="701" alt="スクリーンショット 2019-04-05 1.39.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/199554/e5f74868-5bc8-d977-9c73-b4c1e051ce74.png">

- https
    - セキュアな通信方式
    - 公開鍵と秘密鍵、証明書を用い、お互いを認証することで安全な通信を確立
Tableauファイルが自分のPCだけ文字や数字がつぶれる。

誰かからもらったタブローファイルが自分のＰＣだけ数字がつぶれる（###とか）場合、下記のディスプレイ設定でなおるかも。
ノートパソコンとかで結構あるけど、原因がわからなくて結構ハマった。
A4サイズ固定で作ってるのにつぶれるとかバグかよと・・・。

デスクトップ上を右クリック
　→ディスプレイ設定
　→テキスト、アプリ、その他の項目サイズを変更する
　→150%とかになってたら100%に変更

<img width="515" alt="ディスプレイ設定.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139176/021de9b4-6a6e-37df-c2ba-338d19e1619e.jpeg">
UserDefaults で Struct を扱う

Swift 4 から `Codable` が使えるようになったので活用しましょう。

`UserDefaults` に `struct` は保存できませんが `String` は保存できるので、
`Codable` を適用することで、
`struct` から `JSON(String)` に変換(エンコード)して保存
`JSON(String)` から `struct` に変換(デコード)して取得
というイメージです。

# コード

## 扱う Struct

`Codable` を適用します。

```swift
struct Person: Codable {
    let name: String
    let age: Int
}
```

## 用意した Extension

直で書いてもいいですが、少し便利になるよう用意しました。
`try?` とかで適当に書いちゃってるのでエラーハンドリングなどどうぞ。

```swift
extension Encodable {
    
    var json: Data? {
        let encoder = JSONEncoder()
        return try? encoder.encode(self)
    }
}

extension Decodable {
    
    static func decode(json data: Data?) -> Self? {
        guard let data = data else { return nil }
        let decoder = JSONDecoder()
        return try? decoder.decode(Self.self, from: data)
    }
}

extension UserDefaults {
    
    /// - Warning:
    /// 2020.11.30追記) setCodable ではなく set という関数名にすると、String をセットしたいときに Codable と衝突して Codable 扱いとなってしまうため注意。
    func setCodable(_ value: Codable?, forKey key: String) {
        guard let json: Any = value?.json else { return } // 2020.02.23 追記参照
        self.set(json, forKey: key)
        synchronize()
    }
    
    func codable<T: Codable>(forKey key: String) -> T? {
        let data = self.data(forKey: key)
        let object = T.decode(json: data)
        return object
    }
}
```

### 2020.02.23 追記
@nak435 @p_x9 さんのコメントより、ループするとのご指摘をいただき、コードを修正いたしました。
詳しくは[コメント](#comment-04777ef0adc6b9cad86d)をご参照ください。お二方ありがとうございます！

### 2020.11.30 追記
`set(_ value: Codable?, forKey key: String)` → `setCodable(_ value: Codable?, forKey key: String)` へと変更しました。
コードコメントをご確認ください。



## UserDefaults に保存 / から取得

```swift
let persons = [Person(name: "Sato Taro", age: 20), Person(name: "Ito Hanako", age: 10)]

// 保存
UserDefaults.standard.set(persons, forKey: "person")

// 取得
let restoredPersons: [Person]? = UserDefaults.standard.codable(forKey: "person")

// 出力  
print(restoredPersons!)
// [TempProject.Person(name: "Sato Taro", age: 20), TempProject.Person(name: "Ito Hanako", age: 10)]
```

# 環境

- Swift 5
【学習アウトプット2】離脱率を下げる！かんたんログイン機能の実装

新規登録、ログインというのはめんどくさいものです。Facebookログインがあると何処となく安心するのも、偏にこの入力の手間が省けるからです。

我々初学者は良いWeb企業に入るためにポートフォリオを作成します。しかし全力で作ったポートフォリオも、中身を見てもらえなければ悲しいですよね。

この記事では、これからRailsでポートフォリオを作成する人向けに、ボタン一押しでログインできる「かんたんログイン」機能の実装方法について述べます。

# 方法1 : htmlに隠しパラメータで忍ばせる

まずは結論から。ログインボタンを表示したい場所に以下のコードを記載すればOKです。

```erb:top.rb
<%= form_for(User.new, url:login_path) do |f| %>
  <%= f.hidden_field :email, value: "xxx@example.com" %>
  <%= f.hidden_field :password, value: "password" %>
  <%= f.submit "かんたんログイン", class:"btn btn-lg center-block btn-success"%> 
<% end %>
```
params[:user][:email]とparams[:user][:password]にテストユーザ用の情報をいれてlogin_path(sessions#create)に送ります。hidden_fieldの中身は表示されないので、見た目的にもスッキリします。（ソースには載っちゃいますが）

# 方法2 : サーバ側で処理する

まずtestsessionsコントローラーを作ります

```console
$ rails g controller testsessions
```
ルーティングを追加します。使うアクションはcreateだけです。

```routes.rb
resources :testsessions, only: :create
```

createアクションを追加します。

```testsessions_controller.rb
class TestsessionsController < ApplicationController
  def create
    user=User.find_by(email:"test@example.com")
    session[:user_id] = user.id
    flash[:success] = "テストユーザとしてログインしました。"
    redirect_to user
  end
end
```
コントローラーの中で情報をいれていく感じです。これでサーバ側はOKです。あとはログインボタンを表示したい場所に以下のコードを記載すればOKです。classはお好みで。

```erb:top.rb
<%= link_to 'かんたんログイン', testsessions_path, method: :post, class:"btn btn-lg btn-success center-block" %>
```
こちらのやり方ではテストユーザの情報がソースに載りません。テストユーザのときはflashを変えたい、というときにもこちらの方が良いかと思います。
(普通に既存のsessions_controllerにif user.email=="xxx@example.com"...などして分岐させてもいいかもですが、ちょっとごちゃごちゃします。)

# 実際の画面

方法2で実装しました。
![ezgif-4-225391ddeacd (1).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326593/4f12cc73-7548-8f5e-1da1-2dfb097bdb46.gif)

# 注意
ログイン後にemailやpasswordを変えられたり退会されてしまうと機能しなくなります！これらを変更する機能はビューに表示させないようにして、かつ念の為テストユーザー専用のフィルターをつけておきましょう。
<img width="286" alt="スクリーンショット 2019-04-13 20.10.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326593/1f79ee9d-a068-1702-05ba-76b8e2966b1a.png">

みなさんのポートフォリオがより多くの方に見てもらえますように！
#docker で #ruby に色々と gem を入れたイメージやコンテナを作成するごく簡単な Dockerfile の例

# Dockerfile

```
FROM ruby

RUN gem install reverse_markdown redcarpet

```

# exe

```
$ docker build . -t ruby-gems
```

```
$ docker run -it ruby-gems /bin/bash
```

```
root@dd130726b871:/# echo "<h1>Hello</h1>" | reverse_markdown
# Hello
root@dd130726b871:/# echo "<h1>Hello</h1>" | reverse_markdown | redcarpet
<h1>Hello</h1>
```

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/1235








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
QiitaのMarkdown記法まとめ



#見出し
```:入力
#midashi_1
##midashi_2
###midashi_3
```
に対して、出力
![スクリーンショット 2019-04-13 18.15.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396624/05a4150a-20bc-7ba2-f9ff-c33f62517675.png)


#強調、取り消し、コード記法
```:入力
**EMPHASIS**
*emphasis*
~~deleted~~
'i_am_code'



'''java:sample.java
System.out.println("sample text");
'''

'''py:sample.py
pandas.groupby("TENPO_CD").size()
'''
```


（**注意**上の入力例においてシングルクオートの位置にはバッククオートを入力してください。macでは「shift+@」。）
に対して、出力




![スクリーンショット 2019-04-13 18.35.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396624/4bdd9993-f4d9-5ed9-1e72-92d153873bbc.png)


#リスト、水平線、番号付きリスト
```:入力

- dir1
    - dir1/subdir1
        - dir1/subdir1/file1
- dir2
    - dir2/file1
    - dir2/file2
    - dir2/file3
    
---
1. いろはに
2. ほへと
    3. ちりぬるを
    4. わかよ
        5. たれそ
    679. つねならむ
    680. うゐの
3213413545. おくやま
```
に対して、出力は
![スクリーンショット 2019-04-13 19.32.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396624/ca72e797-1229-9570-ccdb-90f90a9e7bdf.png)


#引用
```:入力
> citation text

>citaion
text

>citation

text

>ciTx
>>ciTx in ciTx

```


に対して、出力は
![スクリーンショット 2019-04-13 19.37.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396624/399b308f-47e8-5491-9bf5-fc1c37f9ce69.png)


#チェックボックス、リンク、表
```:入力

- [ ] チェックボックス1
- [x] チェックボックス2




[東京大学のホームページ](https://www.u-tokyo.ac.jp/ja/index.html)




| Left align       |       Right align |    Center align    |
|:-----------------|------------------:|:------------------:|
| This             |              This |        This        |
| column           |            column |       column       |
| will             |              will |        will        |
| be               |                be |         be         |
| left             |             right |       center       |
| aligned          |           aligned |      aligned       |

```
に対して、出力は
![スクリーンショット 2019-04-13 19.39.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396624/c1e655cb-37b3-c80b-2805-bc9da0fc9cb8.png)

#画像
ドラッグ&ドロップで可能
Goで世界にこんにちはする HelloWorld

## はじめに
気になってたGo言語で世界に挨拶してみる
以下公式サイトのGetting Startedに沿って進めた。
[Getting Started](https://golang.org/doc/install)

## 環境
macOS Mojave(v10.14.4)
homebrew v2.1.0
go v1.12.3

## インストール

まずはGoのインストールから
自分はHomebrewでインストールした。

```console
$ brew install go
```

インストール成功したら、Goのワークスペースを作成する

```console
$ cd $HOME && mkdir go
```

※Goはデフォルトワークスペースを`$HOME/go`としているので、他のディレクトリをワークスペースにしたい場合は以下のように`GOPATH`というパスを設定する必要がある
くれぐれも`source $HOME/.bash_profile`を忘れずに

```bash:.bash_profile
export GOPATH=$HOME/World/Japan/qiita/go
```

【参考】
[SettingGOPATH](https://github.com/golang/go/wiki/SettingGOPATH)


## 世界に挨拶してみる

ワークスペースを作成したらソース用ディレクトリを用意する。

```console
$ cd $HOME/go # もしくは $ cd $GOPATH
mkdir -p src/hello
```

ソースコードは以下を作成する。

```go:hello.go
package main

import "fmt"

func main() {
  fmt.Printf("こんにちは, 世界\n")
}
```

`package`は名前空間[^1]を示し、`import`で依存パッケージを取り込むための指定を行っている。
そして、`func`で関数の宣言を行い、`fmt.Printf`でコンソール出力を行うようだ。

ちなみに、Go言語はpackage mainのmain関数をエントリーポイント[^2]として扱うので、名前空間と関数宣言がそれぞれ`main`になっている。

実行するときは`go run ファイル名`
なお、ビルドして実行ファイルを作成したい場合は対象のファイル名を含んだディレクトリ内で`go build`を実行する。

```console
$ go run hello.go
こんにちは, 世界
```

世界に挨拶できたらこっちのもんだ
これで僕も君も今日からGo使い。

[^1]: [名前空間とは](http://d.hatena.ne.jp/keyword/%CC%BE%C1%B0%B6%F5%B4%D6)
[^2]: [エントリーポイントとは](http://e-words.jp/w/%E3%82%A8%E3%83%B3%E3%83%88%E3%83%AA%E3%83%9D%E3%82%A4%E3%83%B3%E3%83%88.html)
【Minecraft Forge 2768】アイテムがデスポーンしない処理setNoDespawnは実際はデスポーンする（バグ？）

# 環境

- Minecraft 1.12.2
- forgeBin-1.12.2-14.23.5.2768.jar

# 背景

アイテムをデスポーンさせないための処理は `EntityItem.setNoDespawn` に書かれている。
バニラでは唯一ウィザーのドロップアイテムにだけ適用されていて、それはこんな風に書かれている。

```java:net.minecraft.entity.boss.EntityWither
protected void dropFewItems(boolean p_dropFewItems_1_, int p_dropFewItems_2_) {
 EntityItem entityitem = this.dropItem(Items.NETHER_STAR, 1);
 if(entityitem != null) {
  entityitem.setNoDespawn();
 }
}
```

Wikiにもネザースターはデスポーンしないとある。

- 
https://minecraft-ja.gamepedia.com/%E3%82%A6%E3%82%A3%E3%82%B6%E3%83%BC#.E3.83.89.E3.83.AD.E3.83.83.E3.83.97

> このネザースターはデスポーンしたり爆発によって消滅したりはしない。

英語版にも

> The wither drops the nether star upon death which, until picked up, cannot despawn or be destroyed by explosions.

とある。

# 疑問

ところで、そのsetNoDespawnの中身に疑問がある。

```java:net.minecraft.entity.item.EntityItem
public void setNoDespawn() {
 this.age = -6000;
}
```

ageはアイテムエンティティが生成されてからの経過tick数で、0から始まり毎tickインクリメントされる。ただし-32768である場合はインクリメントされない（[ドラクエか](https://wikiwiki.jp/dqdic3rd/%E3%80%90HP%E7%84%A1%E9%99%90%E3%83%90%E3%82%B0%E3%80%91)）。 `EntityItem.setAgeToCreativeDespawnTime` を呼び出すと4800（4分）にセットされる。つまりクリエイティブ状態だと投げたアイテムが1分で消える。

また、別にlifespanという変数が存在し、これは6000で初期化される。ageがlifespan以上になるとデスポーンが発生する。

ageを-32768にすると不老になるわけだが、なぜかsetNoDespawnでは-6000にしている。これでは12000カウント（10分）経過したらデスポーンするように見える。

# 実験結果

ウィザーを倒してみた。ところ、確かにネザースターよりも先に壊れたネザーラックが消え、その後5分くらいしてネザースターも消えた。

![2019-04-13_19.11.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280627/f841ab17-938e-2990-9d69-cc7a87dcece3.png)

# 結論

setNoDespawnを呼び出すと、現在の年齢が-5分になり、結果的にデスポーンまでの待機時間が10分になる。lifespanに非常に大きな数を入れでもしない限りデスポーンはする。ウィザーを倒してもネザースターが消える（Forge14.23.5.2768現在）。

----

この現象はたまに知られている。

- https://github.com/MinecraftForge/MinecraftForge/issues/5628
- https://github.com/ModCoderPack/MCPBot-Issues/issues/607

----

これを呼び出しているMODがあった。

- https://github.com/BluSunrize/ImmersiveEngineering/blob/3f111fcb1965c64d7dad98f14a709cbcdc270b0f/src/main/java/blusunrize/immersiveengineering/common/blocks/metal/TileEntityConveyorVertical.java#L77

しかし、実際には働かないためなのかは知らないが、別の場所では触れている間だけ常に年齢を4分で固定するという戦法を取っていた。

- https://github.com/BluSunrize/ImmersiveEngineering/blob/34750c830469f61dd0caed4b8a010eff1be29cea/src/main/java/blusunrize/immersiveengineering/common/blocks/metal/conveyors/ConveyorVertical.java#L224
Lumen のjsonレスポンスを拡張する

Laravelではレスポンスマクロというものがある。

> いろいろなルートやコントローラで、再利用するためのカスタムレスポンスを定義したい場合はResponseファサードのmacroメソッドが使用できます。

https://readouble.com/laravel/5.5/ja/responses.html


しかしLumenで試すとエラーが出る。そんなものなどないらしい。

```
Uncaught BadMethodCallException: Method error does not exist. in /var/www/html/src/vendor/illuminate/support/Traits/Macroable.php:74
```

この記事にかいてある通りResponseファサードがLaravelとは違うみたいですね。
> Responseファサードがありません。
Responseファサードのクラス自体はあるのですが、getFacadeAccessor()が返すResponseFactoryContractクラスがDIコンテナに登録されていないので使えません。

https://qiita.com/crhg/items/2ca642904955a2846de7


けどなんとか拡張したいので下記のようにresponseヘルパーのjsonメソッドを追ってみる。
/vendor/laravel/lumen-framework/src/Http/ResponseFactory.php
→ /vendor/illuminate/http/JsonResponse.php

お、何かMacroableトレイトを使てるっぽい。JsonResponseに追加すればよさそう。

```/vendor/illuminate/http/JsonResponse.php
class JsonResponse extends BaseJsonResponse
{
    use ResponseTrait, Macroable {
        Macroable::__call as macroCall;
    }
```

### 試す

サービスプロバイダを作成

```app/Providers/ResponseMacroServiceProvider.php
    public function boot()
    {
        JsonResponse::macro('success', function ($data) {
            $rows = [
                'message' => 'success',
                'option_params' => '',
                'data' => $data,
            ];
            return JsonResponse::create($rows);
        });
    }
    
    public function register()
    {
```

サービスプロバイダーを登録。

```bootstrap/app.php
$app->register(App\Providers\ResponseMacroServiceProvider::class);
```

あとはルーティングやコントローラーを追加する。

```app/Http/Controllers/BlogContloer.php
    /**
     * ブログ一覧取得
     * @return JsonResponse
     */
    public function getBlogList(): JsonResponse
    {
        $data = [
            'id' => 1,
            'title' => '楽しいゆるふわPHPer'
        ];
        return JsonResponse::success($data);
    }

```

curlで確認。

```
curl -s "http://localhost:8080/api/blog" | jq

{
  "message": "success",
  "option_params": "",
  "data": {
    "id": 1,
    "title": "楽しいゆるふわPHPer"
  }
}

```

### まとめ
Lumenにはレスポンスマクロはない。しかし、再利用するためのカスタムレスポンスを定義したい場合はJsonResponseクラスのmacroメソッドが使用できるよって話。(MacroトレイトをuseしてるならResponseクラスとかでもできる)
クライアントによってはjsonを共通ヘッダーパターンに変更する場合も使ってます。


(参考)
https://qiita.com/crhg/items/2ca642904955a2846de7
ReactNativeでキャッシュを綺麗にするコマンド

```
 watchman watch-del-all && rm -rf $TMPDIR/react-native-packager-cache-* && rm -rf $TMPDIR/metro-bundler-cache-* && rm -rf node_modules/ && yarn cache clean
```


```
react-native start --reset-cache
```


追記：

```
watchman watch-del-all && lsof -n -P -i :8081 -t | xargs kill && 
rm -rf $TMPDIR/metro-bundler-cache-* &&
rm -rf ~/Library/Developer/Xcode/DerivedData && 
sudo rm -rf '~/Library/Developer/Xcode/iOS\ DeviceSupport/*' && 
cd android && 
./gradlew clean cleanBuildCache && ./gradlew --stop &&
cd .. &&
rm -rf ios/build android/app/build ios/Pods node_modules
```
数字を通貨表示にする

数字を通貨表示（コンマをつける）とかってどうするんやろう？と思い
調べてみたら簡単だったので覚書です。

#課題:skull:

下記の記載だとコンマが入らず数字が大きくなった時に読みづらい

```ruby
.individual__items__item__middle__price
  ¥
  =@item.price
%span.individual__items__item__middle__price__tax
 (税込)
%span.individual__items__item__middle__price__text
  =@item.fee_side
```
<img width="1240" alt="スクリーンショット 2019-04-13 18.26.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325594/66d8c443-9b4e-6645-66d2-1a629aeec7df.png">

#解決:angel:

rubyのヘルパーメソッド、number_to_currencyを使用して解決！


```ruby
.individual__items__item__middle__price
  = number_to_currency(@item.price, unit: "￥", strip_insignificant_zeros: true)
%span.individual__items__item__middle__price__tax
  (税込)
%span.individual__items__item__middle__price__text
  =@item.fee_side
```
<img width="1342" alt="スクリーンショット 2019-04-13 18.27.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325594/37b6b130-b49a-a7fa-75b9-8faa462168c6.png">

①ヘルパーメソッドの記述
=@item.price
↓
= number_to_currency(@item.price）
コンマがつくが、小数点まで表示される（9,768.00となる）

②小数点以下を消す
= number_to_currency(@item.price, strip_insignificant_zeros: true)

③通貨マークを表示させる
= number_to_currency(@item.price, unit: "￥", strip_insignificant_zeros: true)


#参考記事
http://railsdoc.com/references/number_to_currency
http://railsdoc.com/references/number_to_rounded
（公式）
https://qiita.com/noriaki/items/d6c0503e7d25c7329bf7
(他にもやり方色々あるようです！）
#python で 複数の #JSON 配列をフラットに結合する簡単なスクリプトの例 

# script

```py
#!/usr/bin/env python3

import sys, json

results = []

for input_data in sys.argv[1:]:
  results += json.loads(input_data)

print(json.dumps(results))

```

# exe
```
$ ./concat-array.py '[1,2,3]' '[{"a":"b","c":"d"}]' '["e","f"]' | jq .
[
  1,
  2,
  3,
  {
    "a": "b",
    "c": "d"
  },
  "e",
  "f"
]
```

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/1234








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
ターミナルからコマンドでGithubのレポジトリページを開く

たまにターミナル使ってるときに、レポジトリをその流れで開きたいなってときがあったので、しらべたらhubをインストールしてれば、コマンドで開けることがわかったのでメモ。

# hubとは
hubはGitHubでの作業を容易にする追加の機能やコマンドでgitを拡張するためにgitをラップするコマンドラインツールです。（ https://github.com/github/hub )

コマンドでプルリクエストを作ったりできます。

# ターミナルから指定したレポジトリを開くコマンド

`hub browse` でいまいるレポジトリのgithubページを開く
`hub browse Githubユーザ名/リポジトリ名` みたいにレポジトリ指定もできる

```
$ hub browse Githubユーザ名/リポジトリ名
```

# エイリアス化する

browseは打ちにくいので、エイリアスにしておくとよいみたい。

```
$ git config --global alias.see browse
```

参考：[GitHubユーザーのためのhubコマンド](https://qiita.com/yaotti/items/a4a7f3f9a38d7d3415e3#%E3%82%88%E3%81%8F%E4%BD%BF%E3%81%86%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89)
Swift 用語説明編


用語や概念の理解の際に役立てばと思います。

###オブジェクト志向
オブジェクト間の相互作用でシステムの機能を考える方法を指す。

###静的型付き言語
コンパイル時など実行前の段階で、変数や定数の型の情報を決定するプログラミング言語のことを指す。静的型付き言語では誤った型の値の代入などがコンパイルエラーとして検出されるため、プログラムの誤りに起因する実行時エラーの一部を未然に防げる。

###標準ライブラリ
言語仕様の一部となるライブラリ。プログラムを書く上で基本となる機能を提供するライブラリを指す。数値や文字列などの基本的なデータ型や配列や辞書などのデータ構造を表す型などがあげられる。標準ライブラリに含まれているものは常に利用可能であり、インポートなどの手続きは不要である。

###コアライブラリ
非同期処理や通信、ファイル操作といった、標準ライブラリと比べてより高いレベルの機能を提供するライブラリ。コアライブラリとしては、主に以下に示す３つのライブラリが提供されている。Swiftには、モジュールというプログラムのパッケージ化の仕組みがあり、コアライブラリはモジュールとしてインポートすることによって利用可能となる。

●Foundation
多くのアプリケーションに必要となる機能を提供するライブラリ。
●libdispatch
マルチコアハードウェア上の並列処理を抽象化するライブラリ。
●XCTest
ユニットテストのためのライブラリ。

###スコープ
変数、定数、関数、型の名前の有効範囲を表すもの。局所的に定義されるローカルスコープとプログラム全体から参照できるグローバルスコープに大別される。

###関数
入力として引数、出力として戻り値を持つ、名前を持ったひとまとまりの処理のこと。

###クロージャ
スコープ内の変数や定数を保持した(再利用可能な)ひとまとまりの処理のこと。クロージャを利用すると、処理を変数や定数に代入したり、関数に渡したりすることができる。

###モジュール
複数のソースコードを含む配布可能なプログラムの単位を指す。

###フレームワーク
モジュールやリソースやコード署名といったプログラムを配布して再利用するために必要なものを、1つのパッケージとしてまとめたもの。

###アプリケーション
モジュールやリソースを含む実行可能なパッケージ。

###非同期処理
実行中に別の処理を止めない処理のことを非同期処理という。非同期処理では、複数の処理を並列化することで効率の良いプログラムを実現できるため、アプリケーションの応答性を高める上で欠かせない手法。一方で、適切に実装しなければ、保守性が低いコードになりやすく、また、バグの温床となりがちなので、注意が必要である。Swiftでは、スレッド(CPU利用の仮想的な実行の単位)を利用して非同期処理を実現する。

###エラー処理の使い分け
参照URL
https://qiita.com/koishi/items/67cf4d0f51c4d79f1d22

###Optional<wrapped>型
エラーの詳細情報が不要で、結果の成否のみによってエラーを扱える場合。

###Result<T,Error>型
非同期処理の場合に用いる。型引数Errorと同じ型のエラーしか扱えない。使うメリットは、処理の結果が成功か失敗かのいずれかに絞られること。

###do-catch文
同期処理の場合に用いる。do節内にエラーが発生する可能性のある処理を記述し、エラーが発生すると、catch節にプログラムの制御が移り、catch節内でエラーの詳細を受け取り、エラーの詳細に応じて処理を切り替えることができる。Errorプロトコルに準拠した型であればどのような型も扱うことができる。
throw文を用いると、エラーを発生させることができる。Errorプロトコルに準拠した値を使って「throw エラー値」のように書く。
Tryキーワードを用いると、エラーを発生させる可能性のある処理を実行することができる。
使うメリットは、上記と同様に、処理の結果が成功か失敗かのいずれかに絞られること。

###fatalError(_:)関数
エラー発生時にプログラムの実行を終了したい場合。

###アサーション
デバッグ時のみ、エラー発生時にプログラムの実行を終了したい場合。
ABC - 041- A&B&C

#AtCoder ABC 041 A&B&C
[AtCoder - 041](https://atcoder.jp/contests/abc041)

#A問題

 - 文字列切り出し

```java
	private void solveA() {
		String wk = next();
		int numI = nextInt();

		out.println(wk.substring(numI - 1, numI));
	}
```

#B問題

 - 剰余の性質
    - $(A × B) \; mod \; M = ((A \; mod \; M) × (B \; mod \; M)) \; mod \; M$


```java
	private void solveB() {
		long numA = nextLong();
		long numB = nextLong();
		long numC = nextLong();

		long CONST_MOD = (long) (Math.pow(10, 9) + 7);

		long res = numA * numB % CONST_MOD * numC % CONST_MOD;

		out.println(res);
	}
```

#C問題

 - 二次元配列をソートするだけなのでjavaだとすごく簡単
 - 次はGOでこの実装を試す

```java
	private void solveC() {
		int numN = nextInt();
		int[][] wk = IntStream.range(0, numN).collect(() -> new int[numN][2],
				(t, i) -> {
					t[i][0] = i + 1;
					t[i][1] = nextInt();
				}, (t, u) -> {
					Stream.concat(Arrays.stream(t), Arrays.stream(u));
				});

		Arrays.sort(wk, (x, y) -> {
			if (x[1] < y[1]) {
				return 1;
			} else if (x[1] > y[1]) {
				return -1;
			} else {
				if (x[0] < y[0]) {
					return -1;
				} else if (x[0] > y[0]) {
					return 1;
				} else {
					return 0;
				}
			}
		});

		for (int j = 0; j < wk.length; j++) {
			out.println(wk[j][0]);
		}
	}
```
Rubyメソッド

#メソッド一覧

+ length

##ターミナルでRubyを起動する

```
$ irb
```
終了する場合

```
$ exit
```
##文字の数をカウントする .length

```
"Hello World".length
```
返り値

```
11
```
##数値を文字列に変換する .to_s
```
100.to_s
```
返り値

```
"100"
```
##ターミナルから文字を入力できるようにする
.rbファイル

```
変数 = gets
```
##改行を取り除いて新しい文字列を返す

```
変数 = "値"
puts 変数.chomp
```
command phasescriptexecution failed with a nonzero exit code エラーとの戦い

Xcode 10.2にしたらなぜか以上のエラーに襲われるように
ググった感じの下記対応は全滅でした。。

・PC再起動
・Xcode再インストール
・clean
・DerivedData削除
・keychainを開く->左メニューの `ログイン` を右クリック -> `キーチェーンログインをロック` -> `キーチェーンログインのロックを解除`

## 最終的な解決方
gawkとreadlineのバージョンが関係していたみたい

```
brew uninstall readline
brew uninstall gawk
brew install readline
brew install gawk
```

で解決
f.hiddel_fieldを使ったテストユーザーログイン機能

サンプルアプリを覗いた時、正直ユーザーの新規作成 → ログインはちょっと面倒...
というわけで、以前作成したオリジナルアプリにテストユーザーとしてポチッとログインできる機能を追加しました。

<br>

オリジナルアプリはこちらです。
**MemoMa**
https://memoma-yyc.herokuapp.com/

**過去記事**
[初めてのオリジナルWebサービス](https://qiita.com/V_PG_N/items/1542fcdbbd8df5c82706)

## 結論

```html:users/new.html.erb
<%= form_for(:session, url: login_path) do |f| %>
    <%= f.hidden_field :email, value: 'テストログイン用email' %>
    <%= f.hidden_field :password, value: 'テストログイン用password' %>
    <%= f.submit 'テストログイン', class: 'btn btn-default' %>
<% end %>
```
これだけです。

`f.hidden_field`で隠しフィールドを生成できます。

`テストログイン用email`、`テストログイン用password`に、テストログインユーザーとして登録した emila とpassword を入力してください。

入力する際は`value:`で指定します。

<img width="758" alt="スクリーンショット 2019-04-13 17.38.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329827/546d4a3c-58c9-e2cf-ca8e-a21a85379d7c.png">

## 装飾
ちょっと見た目がわかりにくいので説明を追加。

```html:users/new.html.erb
<%= form_for(:session, url: login_path) do |f| %>
      <div class="test-user">
        <i class="fas fa-user"></i>
        <p>テストユーザーとしてログインできます</p>
        <p>⬇︎</p>
        <%= f.hidden_field :email, value: 'test@example.com' %>
        <%= f.hidden_field :password, value: '123456' %>
        <%= f.submit 'テストログイン', class: 'btn btn-default' %>
      </div>
<% end %>
```
<img width="746" alt="スクリーンショット 2019-04-13 17.48.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329827/68b8486a-56ea-91b8-360d-2f64bec72e30.png">

## ログインページ
いきなりログインページに行く人もいるかもしれないので、一応ログインページにも同じものを追加。

<img width="709" alt="スクリーンショット 2019-04-13 17.50.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329827/23343c5c-2d4b-a5d4-16fd-4333a91f7821.png">

## 動作確認

![Apr-13-2019 18-12-24.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329827/4a34197d-37fa-1bc1-9feb-09a5e5759161.gif)

できました！！
最後までお読みいただきありがとうございました(_ _)

## 参考サイト
[Railsドキュメント:hidden_field](http://railsdoc.com/references/hidden_field)
「String does not have #dig method」AWS S3とのねちっこい戦い【初心者の場合】


こんにちは、けんぞうです。
Railsでアプリを作ってHerokuでデプロイすると「画像保存できねーじゃん！」というのは、皆が通る道ですよね。

その「画像保存できない問題」については[【Rails】AWS S3を使ってHerokuで画像を投稿できるようにする方法](https://qiita.com/hmmrjn/items/479c9e9ce82771f1b6d7)で解決できるんですが、これをやっている中で以下のエラーに出くわしました。

```
String does not have #dig method
```
こいつの解決策を書きます、初心者ならではのミスという感じです、、、苦笑

##そもそも、#digてどこのことやねん

```ruby:storage.yml
access_key_id: <%= Rails.application.credentials.dig(:aws, :access_key_id) %>
secret_access_key: <%= Rails.application.credentials.dig(:aws, :secret_access_key) %>
```

これに含まれるdigでエラーが出てしまってます。

## 原因①：`credentials`のコメントアウト外した？

[【Rails】AWS S3を使ってHerokuで画像を投稿できるようにする方法](https://qiita.com/hmmrjn/items/479c9e9ce82771f1b6d7)の流れの中で

```
$ EDITOR=vim rails credentials:edit
```
```
aws:
 access_key_id: #ここに自分のアクセスキーIDをコピペ
 secret_access_key: #ここに自分のシークレットアクセスキーをコピペ
```

この手順を踏むのですが、`aws`以下の３行はもともとコメントアウトされてるんですよね。これに気がつかず、２時間くらい消耗、、、

```
#aws:
# access_key_id: #ここに自分のアクセスキーIDをコピペ
# secret_access_key: #ここに自分のシークレットアクセスキーをコピペ
```
**⬆︎コメントアウトを外そう**


## 原因②：半角スペース開けた？

```
aws:
   access_key_id: #これを消してアクセスキーIDをペースト
   secret_access_key: #これを消してシークレットアクセスキーをコピペ
```

**上記の`access_key_id:`と`secret_access_key:`の後ろには、それぞれ半角スペースが必要。**
僕の場合はスペースが相手いなかったので、うまく読み取れず出力できなかった。

上記の原因をつぶせば、問題なくdig君のエラーはいなくなりました。おしまい！
Vue.js+axiosでNetlifyのFormsを使ってハマった話

# Netlifyとは

ホスティングサービスです。Firebaseなども流行っていますが、
今回はwebホスティングサービスが目的だったためNetlifyにのせました。
Githubと連携してRepositoryをそのままdeployできるのが魅力的です。
https://www.netlify.com/


# NetlifyのForms

フォームのバック側の処理をしてくれます。
なので側だけ作れば簡単にフォーム機能がつかえるものです。
Slackやメールに通知するのも簡単なのでとても便利です。
https://www.netlify.com/docs/form-handling/


# Formsの機能の使い方

最初に読ませていただいたのは、[こちら](https://qiita.com/NaokiIshimura/items/bce2f0b865ec1bc16a53)。

> Forms機能を利用するのは非常に簡単で、<form>タグ内にnetlifyと記述するだけです。
> 
```html
<form name="contact" method="POST" netlify>
  <!-- 省略 -->
</form>
```

そうホントにこれだけで、フォーム機能がつかえます。楽ちんです！

<h4>がしかし、</h4>
Formsの機能を使ったページだということをNetlifyに認識してもらう必要があってそこでハマりました。


# Formsの機能をを使ったページだとNetlifyに認識してもらう必要がある
参考にさせていただいたのは[こちら](https://qiita.com/nanaki14/items/007eae905d6305f75f6a)、そして[こちら](https://qiita.com/tatane616/items/f646e84fe4cdd9eac0de)。
vue-routerなどで実装するSPAでは、静的にこちらをおいてあげなければNetlifyに認識されないということでした。

なるほど。。

**つまり、`public/index.html`などに、**

```html:index.html
    <!-- A little help for the Netlify post-processing bots -->
    <form name="contact" netlify netlify-honeypot="bot-field" hidden>
      <input type="text" name="name" />
      <input type="email" name="email" />
      <textarea name="message"></textarea>
    </form>
```
**をおいてあげれば解決できました〜！🎉🎉🎉** ひえぇ〜

`hidden`要素でおけとNetlifyのblogにガイドがちゃんとかいてありました〜TT
https://www.netlify.com/blog/2018/09/07/how-to-integrate-netlify-forms-in-a-vue-app/

そのほか、フォームのデータを**postするときは`form-name`というものを一緒に送ってあげる**必要があるのでそこも注意です。
https://www.netlify.com/docs/form-handling/#ajax-form-submissions

# 【まとめ】Vue.js+axiosでNetlifyのFormsを使うのに必要なこと

長く書きましたので、つまりまとめると以下2点。

- `public/index.html`など静的に`hidden`要素でNetlifyに認識してもらうためのタグをおく。
- データをpostするときに`form-name`も一緒に送ってあげる。

<h4>以上！</h4>

---
_参考：_
https://qiita.com/NaokiIshimura/items/bce2f0b865ec1bc16a53
https://qiita.com/nanaki14/items/007eae905d6305f75f6a
https://qiita.com/tatane616/items/f646e84fe4cdd9eac0de
https://www.netlify.com/blog/2018/09/07/how-to-integrate-netlify-forms-in-a-vue-app/
https://www.netlify.com/docs/form-handling/#ajax-form-submissions
https://www.netlify.com/docs/form-handling/

_私の拙いコードで作ったポートフォリオ：_
https://mainichi-chocolate.tokyo
現在WIPですよ＾０＾
A Tour of Go の sync.Mutex サンプルは絶対に壊れない？

みんなだいすきTour of Go。Concurrencyの章に、よくある並行カウントアップのサンプルもあります。
https://tour.golang.org/concurrency/9
どの言語でもよくある Lock/Unlock の話。「ロックしないとカウンタが壊れて変な値になっちゃうね！だからロックするよ！ほら期待通りの値になっただろう？」ってやつ。

このページの説明、最初から正しく Lock / Unlock されたバージョンが提示されていて、実行すれば当然成功します。そうなるとつい壊して失敗したバージョンを見てみたくなるもの。ですが、**Lock / Unlock を全部削除してみても成功します**。何度実行してもきっちり1000とprintされます。どういうことだよ…。goroutineの中身が一瞬で終わってしまうのが原因か？と中で10000回ループしてみても同じ。

どうやら、2019年4月現在では**tour.golang.orgの実行環境ではプロセッサ数が1**のため、goroutineをいくら生成しようが同時には実行されないようです。`fmt.Println(runtime.NumCPU())` を入れてみたら `1` と出ました。

手元のマルチプロセッサ環境で `go get golang.org/x/tour` を用いてローカル実行した場合、Lock / Unlock を外したら期待通り失敗してくれました。 ただ `fatal error: concurrent map writes` で終わってしまって、結局壊れたカウンタを見ることはできません。こういうのは、学習過程では壊れたものを見せてくれたほうがわかりやすいです。普通に int のカウンタにしなかった理由はなんだろう。

### シングルプロセッサでも壊れるはずなのでは？
OSのスケジューラがプロセスに対して行うのと同様に、goroutineでも無慈悲なコンテキストスイッチが起きうるのであれば、カウンタの読み→書きの隙間にスイッチされて死ぬパターンがあるはずです。ですが、ユーザー空間で自前スイッチングを行う場合は中身がわかるので、無駄の少ないタイミングを狙ってスイッチングをしてくれるようです。
https://qiita.com/niconegoto/items/3952d3c53d00fccc363b より基本的な切り替えタイミングは:
>アンバッファなチャネルへの読み書きが行われる
>システムコールが呼ばれる
>メモリの割り当てが行われる
>time.Sleep()が呼ばれる
>runtime.Gosched()が呼ばれる

なので、ループでインクリメントするだけのgoroutineでは…

```
func (c *SafeCounter) Inc(key string) {
	for i := 0; i < 10000; i++ {
		c.v[key]++
	}
	fmt.Printf("%d\n", c.v[key])
}
// 以下呼び出し側
for i := 0; i < 100; i++ {
	go c.Inc("somekey")
}
```
などとすると…

```
10000
20000
30000
40000
50000
(以下略)
```
生成した順に、直列に走り切っています。

まとめると、「Web環境ではプロセッサ数が1で並列実行されない」かつ「このgoroutineでは内部で再スケジューリングも起きない」という2点により、tour.golang.org環境でカウンタが壊れることはないようです。
プログラミングでテストをする大切さについて

# テストをする必要性
・本番環境にアプリケーションをデプロイする際、
バグがないかを確認するために必要。
サービスがうまく動かないことによって
起きる損害を防ぐためにも大切なこと

##テストコードを書く
・テストをしないと大変になることはわかりました、
実際テストをするわけですが、テストコードを書くgem
RSpecとminitestについて調べました。

##Rspec
・railsで「rspec-rails」というGemをインストールして、
RSpecを使ってテストコードを書いていきます。
モデルのバリデージョンのテストやコントローラーのテストができ、
実際に登録できるのか、
ページが遷移できるのかをダミーデータを使って
テストできます。

※テストコードを書く際の用語概要
・describe
（テストコードのまとまりを作る）
describe "hogehoge" do
end

・itとexample
（itの中にどんなテストをするかのまとまりを作る）
it "1 + 1は2になること" do
    expect(1 + 1).to eq 2
end

・エクスペクテーション（it　〜　do endの中に書くテストする内容のこと）

・expectメソッド（エクスペクテーションの文法）

・マッチャ（エクスペクテーションの中で、テストが成功する条件を示します）


##Minitest
Minitest とは, Ruby に始めから導入されているテストフレームワークで, 特にセットアップの必要なく利用できます。Minitestがrspecと違う所は、それぞれのgemが小さな機能を提供しあって全体を構成する最小主義なので、カスタマイズをかけていくのが良いそうです。
def add(a, b)
  a + b
end

class CalcTest < Minitest::Test
  def test_add
    assert_equal 3, add(1, 2)
end

※テストコードを書く際の用語概要
test_
Minitestは「test_」で始まるメソッドを順次実行する

##まとめ
Rspecは機能がたくさん詰まっていて、色々なテストができる、
Minitestはカスタマイズして自分の使い勝手がいいようにして使うもの
とゆう印象でした。スクール仲間の話ですと、
Rspecを使いこなしてテストできると、
それだけで履歴書にかけるぐらい需要があるみたいです。
WIP: 仕組みから理解するGit

# この記事のねらい

Gitが難しいという印象を持たれがちな理由は色々あると思いますが、そもそも**Gitが管理しているデータが何なのか**さえ理解してしまえば、後の理解は芋づる式についてくる気がします。
なので、Gitのリポジトリを構成する最低限の要素を解説し、よく使うコマンドがどう作用するのかをまとめてみます。
次のような人におすすめです。

- Gitがいいらしいのは良く聞くけど難しそうで二の足踏んでる人
- Git使ってはいるけど分からないことが多くていつ事故を起こすか不安な人
- 中身がどうなってるか把握しないとスッキリしない人

# 最低限の要素は2つだけ

Gitのリポジトリは**コミット**と**ブランチ**でできています。これが分かればもうGitは8割方理解したも同然です。残りの2割はそれをどう操作するかという応用や組み合わせの話でしかありません。

## コミット

次の3つの情報を持ちます。

- 変更内容(差分とログ・変更者の情報など)
- そのコミットであることを表すユニークなID(ハッシュコード)
- 親コミットのID

このコミットがたくさん積み上がることによってリポジトリは大きくなっていきます。

## ブランチ

Gitにおいてブランチが持つ重要な情報はただ1つです。

- **リポジトリの現在位置となるコミットのID**

名前が付けられたりといった要素もありますが、本質的にはこれだけです。いわば**コミットへのポインタ**です。

ブランチは必要に応じて自由に作成でき、1つのリポジトリ内に複数のブランチを持つことができます。その場合は、どれか1つのブランチを選択することでそのブランチが指し示すコミットが現在位置となります。

先に述べたように、個々のコミットは自分の親しか知りません。ブランチが現在位置となるコミットを指し示し、親コミットを再帰的に辿っていくことによって、そのブランチの系譜における全ての変更内容が把握できる仕組みになっています。

![git0.png](https://qiita-image-store.s3.amazonaws.com/0/58083/f5b0077d-be39-0e9c-ce0e-c62a057c5ec0.png)

運用上は「ブランチの系譜に属するコミット全体」をブランチと呼ぶことも多く、それが混乱の一因となっている気がします。あくまでGitの管理上ではブランチはコミットへのポインタでしかないことを意識してみてください。

# コマンドの作用をコミットとブランチの動きだけで解説

Gitのリポジトリに対する操作とは、突き詰めれば「コミットをどう増やして、ブランチをどう動かすか」でしかありません。名前が付いている操作も分解すれば粒度の小さい操作の集合だったりするので、実はそれほど覚えるべき事は多くないのです。
というわけで、よく使う＆粒度が小さめの操作から解説していきます。

## commit

現在のブランチが指すコミットを親とする新たなコミットを追加します。
ブランチは新たに追加したコミットを指します。

![git1.png](https://qiita-image-store.s3.amazonaws.com/0/58083/230bae96-90a2-aaed-912d-d841e32a6b87.png)

図ではコミットから伸びている矢印が下方向を指していますが、これはコミットが親方向への参照しか持っていないことを示しているためです。変更の時系列としては逆方向になります。

## branch

新しいブランチを作成します。
デフォルトではリポジトリの現在位置を指す状態で作成されますが、既存のブランチ名やコミットIDを指定して作成することもできます。masterという名前のブランチは最初から存在しており、多くの場合はリポジトリの安定した状態を保持するために使われます。

![git2.png](https://qiita-image-store.s3.amazonaws.com/0/58083/b852f4fb-77de-a3b5-8f6f-091b380f4e05.png)

branchコマンドでは作成のみを行い、ブランチの選択状態までは変更しません。
上図は、hogeブランチを新たに作成していますが、現在のブランチはmasterのままであることを表しています。選択状態を切り替えるには、後述するcheckoutコマンドを使用します。

## checkout

現在のブランチを切り替えます。
切り替えるのと同時に、リポジトリ内の作業コピー（バージョン管理対象となっているファイル）の状態も変更されます。

![git3.png](https://qiita-image-store.s3.amazonaws.com/0/58083/264d64a6-9279-8c39-bccd-ffb3c18f4218.png)

ブランチを切り替えてコミットすることで、ツリーの分岐が発生します。コミットは現在のブランチが指すコミットを親とするからです。

(以下書きかけ)

このノリで書いてたら手間が大変なので挫折したのですが、この時点でもまぁまぁ価値がありそうなのでWIPで公開します。続きの需要がありそうだったら頑張ります。
Craft CMS で任意の環境変数を追加する

Google アナリティクスの API キーなど、サーバー環境ごとにセットする値が異なる変数は `.env` で管理すると効率的なため、その手順について簡単にメモ。

# .env ファイルの編集

はじめに `.env` ファイルに環境ごとの値をセットする。

```bash:.env
GOOGLE_ANALYTICS_API_KEY="XXXXXXXXXXXXXXXXXX"
```

`dev` や `production` など異なる値をセットする場合は、この `.env` ファイルだけを調整すればよい。

## config/general.php の編集

次に `config/general.php` 内で `getenv` ファンクションを利用し任意の変数にセットする。

```php:config/general.php
<?php

return [
    // Global settings
    '*' => [
        // Google API キーを .env から読み込み
        'gaApiKey' => getenv('GOOGLE_ANALYTICS_API_KEY'),
    ],

    // Dev environment settings
    'dev' => [
        // （中略）
    ],
];
```

なお、ここでセットする値を整数値として扱う前提であれば `intval(getenv('FOO_BAR'))` のように記述する。

あとは、テンプレートやプラグインなどの利用先で呼び出せば完了。

# テンプレートからの参照

`config/general.php` に定義済みであれば、テンプレートからは次のように参照できる。

```twig
{% set gaApiKey = craft.app.config.general.gaApiKey %}
```

# プラグインからの参照

`config/general.php` に定義済みであれば、プラグインからは次のように参照できる。

```php
$gaApiKey = Craft::$app->config->general->gaApiKey;
```

テンプレートから呼び出す場合とほぼ同じ書き方なので、覚えやすいと思われる。
ターミナルとしてFish Shellを使う際のPython3のPATH設定

# 背景
MacでPython3系をインストールした際に、呼び出すには`python`ではなく`python3`コマンドを打たないといけない事にじれったさを感じた

# 環境
- MacOS Mojave
- Fish Shell 3.0.2
- Homebrew 2.1.0

# 解決方法
- bashと同様にPATHを設定すれば良い

# 手順
1. `brew info python`でpython3のパスを探す（私の場合は`/usr/local/opt/python/libexec/bin`でした）
2. `~/.config/fish/config.fish`を開く（無い場合は新規作成する）
3. `set PATH /usr/local/opt/python/libexec/bin /usr/local/bin /usr/sbin $PATH`を追記する

1の参考：https://codeday.me/jp/qa/20190403/510812.html
2の参考：https://qiita.com/ledsun/items/8ca1a450b21c8ebc9670
Firebase の functions で async/await しようと思ったら怒られた件


# ちょっと困った症状
- Firebase の functions で `async/await` を使ったらデプロイが error になってしまう
- ローカルで`firebase functions:shell`で、直接関数を動かすと問題ない（ローカルでは問題ない）

# 原因と対策

うまくいかない原因は二つ。

## 原因1 - デプロイ時にESLintが怒ってる

### エラーはこんな感じ

`async`の入ってるところでエラーになる

```
61:9  error  Parsing error: Unexpected token function
✖ 1 problem (1 error, 0 warnings)
```

### 対策1

`.eslintrc.json`を以下のように`"ecmaVersion": 2017`とする。Firebaseがつくるデフォルト設定 `"ecmaVersion": 6` だと、`ESLint`は`async/await`を解釈しない模様

```
  "parserOptions": {
    // Required for certain syntax usages
    //"ecmaVersion": 6
    "ecmaVersion": 2017
  },
```

[関連するstackoverflowのQ&A](https://stackoverflow.com/questions/53735009/including-async-function-within-firebase-cloud-functions-eslint-parsing-error?noredirect=1&lq=1)

## 原因2 - `node` のバージョンが `async/await` に対応していない


### エラーはこんな感じ

`async`の入ってるところでエラーになる

```
⚠  functions[getSentiment2(us-central1)]: Deployment error.
Function failed on loading user code. Error message: Code in file index.js can't be loaded.
Is there a syntax error in your code?
Detailed stack trace: /user_code/index.js:61
  async function quickstart() {
        ^^^^^^^^
```

### 対策2


`packeges.json` に `"engines": { "node": "8" }`を追加して、`node` のバージョン8を指定する。FireBaseの `node` ってデフォルトが`6`らしいのですが、`8`以降じゃないと `async/await` がつかえないみたいです。この状態でデプロイすると

```
i  functions: updating Node.js 8 function func1(your-region)...
i  functions: updating Node.js 8 function func2(your-region)...
```

と表示されて、デプロイできました。

[関連するstackoverflowのQ&A](https://stackoverflow.com/questions/53735009/including-async-function-within-firebase-cloud-functions-eslint-parsing-error?noredirect=1&lq=1) 

# 参考にさせていただきました

- [ESLint をグローバルにインストールせずに使う](https://qiita.com/mysticatea/items/6bd56ff691d3a1577321)
- [【Firebase】Cloud Functionsで学ぶPromiseとasync/await](https://qiita.com/samuraikun/items/40f1ce951931d1b26b62)

# おわりに

誰かの時間の節約になれば。

Cheers,
データベースの名前を配列として取得するシェルスクリプト

# PostgreSQLのデータベースの名前をshellコマンドから取得する

```bash
#! /bin/bash 

db_host="hoge_host"
db_user="hoge_user"

#
# hogeという名前がついたdbの配列を取得する
# psql -l でdb一覧表示 -x で拡張表示　その際xmlのように表示され NAMEと共にdb名が表示される
# grep Name でdbの名前がある行のみ取得
# awk '/company/{print $3}'でcompanyという文字　print $3で3文字目をprint
# xargsは改行を含む文字列を配列化する
#
db_list=(`psql -h $db_host -U $db_user -d postgres -l -x | grep Name | awk '/hoge/{print $3}'|xargs`)
```

無理矢理感がすごい。正規表現の部分をワイルドカードなどすれば全てのdbに一致します。もっとスマートな方法があれば教えてください。
Linux のコンソールでも Caps_Lock と Ctrl(Control) を入れ替える

## この記事は何？

コンソールにおける、キーマップの変更方法の解説になります。
Ctrl は常に A の左の位置にあって欲しいという人向けの記事になります。

## 私の環境について

私は、Thinkpad x100e というラップトップPCに ArchLinux をインストールし、この設定を行っています。
また、このマシンには、usキーボードが搭載されています。

## keycode の確認

標準的な keymap は下記のように配置されています（ディストリによって異なるかも？）。

```
/usr/share/kbd/keymaps/　環境に応じたディレクトリ　/　キー配列　/　キーボードの種類.map.gz
```

下記のコマンドで一度、中身を確認しましょう。
**※パスは適宜変更してください。**

```bash
$ sudo zcat /usr/share/kbd/keymaps/i386/qwerty/us.map.gz | less -i
```

今回の目的は Caps_lock を Ctrl に変更する事なので、この2つの keycode を調べておきます。
**※パスは適宜変更してください。**

```bash
$ sudo zcat /usr/share/kbd/keymaps/i386/qwerty/us.map.gz | grep -iE '^keycode' | grep -iE 'control$|caps\_lock$'
keycode  29 = Control
keycode  58 = Caps_lock
keycode  97 = Control
```

## Caps_Lock を Ctrl に変更する

### loadkeys で読み込む keymaps の作成

```bash:loadkeysで読み込むkeymapsファイルの作成手順
$ sudo mkdir -p /usr/local/share/kbd/keymaps
$ sudo echo 'keymaps 0-127' >> /usr/local/share/kbd/keymaps/ctrl2caps.map
$ sudo echo 'keycode 29 = Caps_Lock' >> /usr/local/share/kbd/keymaps/ctrl2caps.map
$ sudo echo 'keycode 58 = Control' >> /usr/local/share/kbd/keymaps/ctrl2caps.map
$ sudo chmod 755 /usr/local/share/kbd/keymaps/ctrl2caps.map
```

```:/usr/local/share/kbd/keymaps/ctrl2caps.map
keymaps 0-127
keycode 29 = Caps_Lock
keycode 58 = Control
```
※左のCtrlをCaps_Lockにしたくなければ、"keycode 29 = Caps_Lock" は不要です。

### .bash_profile に loadkeys を追加

```bash:~/.bash_profile
#
# ~/.bash_profile
#

### ↓この行を追記しました。
sudo loadkeys /usr/local/share/kbd/keymaps/ctrl2caps.map

[[ -f ~/.bashrc ]] && . ~/.bashrc
```

※ログイン時に loadkeys で読み込むのが、無難そうだったので私はそうしましたが、お好みの方法でよいと思います。

より良い方法などご存知の方は、ご教示いただけると幸いです。

# 参考URL
How to change console keymap in Linux?
https://superuser.com/questions/290115/how-to-change-console-keymap-in-linux
Python3でinputとsplitを使用し、複数の値を受け取る

#Python3でinputとsplitを使用し、複数の値を受け取る
inputで複数の値を取得する際に、複数の値を取得する方法をまとめます。

###指定された数の文字列を格納する
```
a,b=input().split()
```
split関数は半角スペース、タブ、改行で文字列を分割する。
区切り文字は引数で指定することも可能。
※変数の数を指定するので、入力される文字列の数は事前に決まっていなければならない。

###指定された数の数値を格納する
```
a,b=(int(x) for x in input().split())
```
input().split()で取得したstr型リストの要素「x」を順番にint型にキャストしています。
※変数の数を指定するので、入力される数値の数は事前に決まっていなければならない。

###任意の数の文字列を受け取り区切り文字ごとにリストに格納
```
a=[]   #リスト初期化(やらなくてもいい)
a=input().split()
```

###任意の数の数値を受け取り区切り文字ごとにリストに格納
```
a=[]   #リスト初期化(やらなくてもいい)
a=[int(x) for x in input().split()]
```
リスト内包表記です。
[式 for 任意の変数名 in イテラブルオブジェクト]
※イテラブルオブジェクトは辞書とかlistとか反復処理が可能なもの。
イテラブルオブジェクトの要素を任意の変数に格納し式で処理した値にしてリストの要素とする。

###多重配列で格納
[参照](http://uni8inu.hatenablog.com/entry/2016/11/02/124916)

```
N
s1 t1 u1
s2 t2 u2
s3 t3 u3
...
sn tn un
```
こういうのがきたらこれ

```
a=[ list(map(int,input().split(" "))) for i in range(N)]
```

##出力について

###配列をスペース区切りで出力
[参考](https://teratail.com/questions/32563)


```
L = [10,20,30,40]
print(' '.join(map(str, L)))
```


以上です。
【GAS】大量のCSVファイルを処理してスプレッドシートにまとめる

#動機
40個くらいのCSVを何回か処理しなくてはならなくなったため。
GASでは遅いのでPythonとかでやった方が明らかに良い。とは言いつつ日頃からGAS触ってるのとファイルのデータを扱えるとGASでできることが広がると思ったので書きました。
#イメージ
たくさんあるCSVファイルの内容を読み取って全てに同じ処理を適用して一つのファイルにまとめる
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242971/b8826c09-3a77-1ff9-a465-aba9e33bc8d4.png)
#GAS
CSVしか入っていない特定のフォルダからファイルをすべて読みこんで配列に変換。適当に処理して書き出す。

```javascript
function main() {
  const id ='フォルダーID'
  const folder = DriveApp.getFolderById(id);
  const files = iteratorToArray(folder.getFiles()).sort();
  const arrs = files.map(csvToArray)
  
  const results = arrs.map(function(arr,id) {
    //ここに処理を書く
  });
    
  const result = results.reduce(function(pre, cur) {
    return pre.concat(cur);
  },[]);
  
  setDataToTempSheet(result)
}

//CSVファイルを2次元配列に変換する、文字コートは要調整
function csvToArray(file) {
  const csv = file.getBlob().getDataAsString("Shift_JIS"); 
  return Utilities.parseCsv(csv);
}

//イテレータを1次元配列にする
function iteratorToArray (iterator) {
  var result = [];
  while (iterator.hasNext()) {
    result.push(iterator.next());
  }
  return result;
}

//テスト用のスプレッドシートに結果を吐き出す。
function setDataToTempSheet(data) {
  const id = 'スプレッドシートID';
  const ss = SpreadsheetApp.openById(id);
  const sheet = ss.getSheets()[0];
  sheet.getRange(1,1,data.length,data[0].length).setValues(data);
}
```
#処理例

```javascript
  const results = arrs.map(function(arr,id) {
    //5列目にデータがある
    const data = arr.map(function(a) { 
      return Number(a[4]);
    });
    //実効値を求めるすべての要素を2乗してそれらを平均して0.5乗する。avg,squareは自前の関数
    const result = Math.pow(avg(data.map(square)),0.5);
    
    return [[files[id].getName()],[result]]
  });
```
最初の画像のような結果が出る。CSVの5列目のデータを取り出して全体の実効値を求める。ファイル名がわからないと判別できなかったので最後にファイル名を実行値と一緒に返す。
数値は文字列として読み込まれるので数字に変換しとくこと。
インドのASATのデブリの軌道を確認してみた

#方法
- celestrackからASATのTLEをダウンロード
- (TLEの1行目が同じ名前なので、60個別々に名前をつける）
- tle2czmlでczmlに変換
- ceciumで表示

#結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60225/6e8a654f-640e-2ee0-6077-986948977f39.png)


うーん。日本上空にもくるんだなあ、ちょうど14時ぐらいだけど、この時間ってUTCですね？まあ、時間を変えると


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60225/04fbbf67-ec86-32ae-d054-b434137d9be1.png)

こんな感じなんですよねえ・・

なかなかopen sourceって凄いなあ
【爆速】静的ページを無料で独自ドメインでSSL(HTTPS)で公開する方法（Github => CircleCI => AWS S3 / Firebase Hosting / Netlify）

# はじめに
- 静的ページを爆速で公開したい！！（React）
- 独自ドメインを使いたい！！（Route53）
- SSL(HTTPS)対応にしたい！！
- masterマージしたら、自動でデプロイしたい！！（Github）

今回無知ゆえ、3回もアーキテクチャを変えたので備忘録として残します。

```
① Github => CircleCI => AWS S3
② Github => CircleCI => Firebase Hosting
③ Github => Netlify
```

# ① Github => CircleCI => AWS S3
以下、リンクを参考にわりと簡単に構築できました。
ただCircleCI設定ファイルの記述方法のキャッチアップは必要でした。
DockerやVM環境による差異や、CircleCI自体のバージョンによる差異があります。
ちなみにバージョン1.0でもCircleCIのGUI上で、credentialをベタ書きすればWarning出ますが動きます。

- [静的HTML公開フローをサーバレスでDevOps！(Github,CircleCI,AWS S3)　前編](https://qiita.com/toguma/items/a3c833e42c2469142ca4)
- [CircleCIからAWS S3にアップロードする](https://qiita.com/fkymnbkz/items/55998497620498f1a59d)
- [はじめてのCircleCI2.0](https://qiita.com/sawadashota/items/09b37b303e63f3b897a9)
- [まだ間に合う！CircleCI 2.0へ移行する](https://qiita.com/hitsuji-haneta/items/821c91619b3ddb9981d8)

またLet's EncryptのSSL証明書をcronか、Lambdaなどで自動化する構成にしようと考えていました。

- [無料のSSL証明書 Let's EncryptのSSL証明書（ワイルドカード）を利用する（自動更新）](https://qiita.com/IZUMIRU/items/230c4c9de6b51b58b000)

＿人人人人人人人人人人人人人人人人人人人人人人人人＿
＞　Firebase Hostingだと、よしなにSSLできるよ🤗　＜
￣Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y￣


# ② Github => CircleCI => Firebase Hosting
こちらも以下、リンクを参考にわりと簡単に構築できました。
世の中便利ですね本当に。。。

- [（初心者向け）Firebase HostingへReactプロジェクトを公開する手順](https://qiita.com/junara/items/74801923ca108b328b26)
- [AWS Route53のドメインをFirebase Hostingのカスタムドメインに割り当てる](https://qiita.com/nkhrk/items/6706f27207f694049423)

＿人人人人人人人人人人人人人人人人人人人人人＿
＞　Netlifyだと、よしなにデプロイできるよ🤗　＜
￣Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y￣


# ③ Github => Netlify
こちらも以下、リンクを参考にわりと簡単に構築できました。
世の中便利ですね本当に。。。。。。

- [Netlifyで静的サイトのホスティングをする](https://qiita.com/sugo/items/2ee64887d682b0dae635)

# まとめ
とりあえずNetlifyで良いと思います。
今年の言語はRust その１１


# 今年の言語はRust その１１

Rustを学びます


Rustの日本語ドキュメント 2nd Edition
https://doc.rust-jp.rs/book/second-edition/

オリジナル(英語)
https://doc.rust-lang.org/book/



## 6. Enumとパターンマッチング

###6.3 if letで簡潔なフロー制御

if let ????

matchした場合に実行する構文

```rust
fn main(){
    
    let some_u8_value = Some(3u8);
    
    // paturn 1
    match some_u8_value {
        Some(3) => println!("three"),
        _ => (),
    }
    
    
    // paturn 2
    if let Some(3) = some_u8_value {
        println!("three");
    }
}

```

elseも使えるよ

```rust
fn main(){
    
    
    // paturn 1
    let mut count = 0;
    match coin {
        Coin::Quarter(state) => println!("State quarter from {:?}", state),
        _ => count += 1,
    }
    
    // paturn 2
    let mut count = 0;
    if let Coin::Quarter(state) = coin {
        println!("State quarter from {:?}", state);
    }else{
        count += 1;
    }
    
}

```

ほぼ理解した！

次回！


イエス！
MAMPのPHP7にssh2拡張を使えるようにする


なんか山ほどハマったんで、もしかしたら下記意外にも必用なのあったかも…

```
wget https://pecl.php.net/get/ssh2-1.1.2.tgz
tar zxvf ssh2-1.1.2.tgz
cd ssh2-1.1.2
/Applications/MAMP/bin/php/php7.2.14/bin/phpize 
./configure --with-php-config=/Applications/MAMP/bin/php/php7.2.14/bin/php-config
make 
sudo make install
```

- phpize をフルパスで実行しないとmacOSのphpizeが使われるのでフルパスで実行してます。
- ./configure でphp-configまでのパスを指定しないとダメ