OmniAICreator/Qiita-1.07M huggingface dataset:
二重ハッシュより値を取り出し、ゲッターにより出力致します。


```ruby
class Fruits 

  def initialize(name, color, variety) #仮引数（第一引数, 第二引数, 第三引数）　#initializeメソッドは新たな呼び出しは不要です。
    @name = name #インスタンス変数を定義
    @color = color
    @variety = variety
  end

  def  name #ゲッター(ゲッターメソッド名は、クラス外で出力する際に用いますので、重要です。)
    @name #インスタンスの値を取得している
  end

  def color #同じくゲッター
    @color 
  end

  def variety
    @variety
  end

end

class InfoFruits #呼び出しが必要です。

  def initialize(fruits) #インスタンス変数の定義
    @fruits = fruits
  end

  def fruits #ゲッター
    @fruits #インスタンス変数の値の取得 #実引数三つ分の配列です。
  end

  def info_fruits
    self.fruits.each do |fruit| #eachメソッドは配列の要素の数だけ、繰り返し処理を行います。
    #self.fruitsはインスタンスの値、実引数三つ分の配列です。
      puts "#{fruit.name}は#{fruit.color}です。品種は#{fruit.variety}です。" #ゲッターで取得しました値の出力の際は**インスタンス名.ゲッターメソッド名**と記述致します。
    end
  end

end

array = [{info:{info_fruit_name: "りんご", info_fruit_color: "赤色"}}, #配列の中に二重ハッシュが含まれています。
 {info:{info_fruit_name: "バナナ", info_fruit_color: "黄色"}},
 {info:{info_fruit_name: "ぶどう", info_fruit_color: "紫色"}}]

fruits = []

array.each do |double_hash| #eachメソッドは配列の要素の数だけ処理を繰り返し行います。
  fruit_name = double_hash[:info][:info_fruit_name] #二重ハッシュの場合、keyを二つ選択することにより、目的のvalueの取得に成功いたします。
  fruit_color = double_hash[:info][:info_fruit_color]

  puts "#{fruit_name}の品種はどちらになりますか？"
  double_hash[:info][:info_fruit_variety] = gets.chomp #ハッシュに新たなkeyを指定してあげることで、新たなvalueの追加が可能となります。
  fruit_variety = double_hash[:info][:info_fruit_variety]

    if fruit_variety == "シャインマスカット" #条件分岐
      fruit_color = "緑色"
    end

  fruits << Fruits.new(fruit_name, fruit_color, fruit_variety) #実引数をFruitsクラスに渡し、インスタンスを生成すると同時に、initializeメソッドが処理を行いインスタンス変数を定義し、その値をゲッターにより取得します。
                      #仮引数と実引数の数は合わせます。#値を取得することにより、クラスのスコープ外で出力が可能となります。出力の際は**インスタンス名.ゲッターメソッド名**と記述致します。

end


info_fruit = InfoFruits.new(fruits) #三つ分の実引数を持った、配列fruitsをInfoFruitsクラスに渡し、インスタンスを生成し、initializeメソッドが処理を行い、インスタンス変数を定義、ゲッターにより、その値を取得します。
info_fruit.info_fruits #info_fruitsインスタンスメソッドの呼び出しです。
```

```

#出力結果

りんごの品種はどちらになりますか？
ふじ
バナナの品種はどちらになりますか？
ジャイアント・キャベンディッシュ
ぶどうの品種はどちらになりますか？
巨峰
りんごは赤色です。品種はふじです。
バナナは黄色です。品種はジャイアント・キャベンディッシュです。
ぶどうは紫色です。品種は巨峰です。
```

```
#出力結果

りんごの品種はどちらになりますか？
ふじ
バナナの品種はどちらになりますか？
ジャイアント・キャベンディッシュ
ぶどうの品種はどちらになりますか？
シャインマスカット
りんごは赤色です。品種はふじです。
バナナは黄色です。品種はジャイアント・キャベンディッシュです。
ぶどうは緑色です。品種はシャインマスカットです。

```

誤っている箇所、認識が不足している部分について、ご指摘頂ければ幸いに存じます。
OpenWRT(LEDE)使いこなし : LINE Notify

# はじめに
OpenWRT/LEDEのNASサーバーにLINE Notify環境を構築して、
サーバーからの通知を受け取る様にした際のTipsです。

と言っても、例えばRaspberryPiの様な、新しくて安定している環境では発生しない、
古い環境でしか発生しない様なTipsです。

ちなみに、私が使っている環境は以下です。

- [中華ファンレスNASをOpenWRT(LEDE)で使う](https://qiita.com/yo-he/items/74793b33c4761f9529f3)

LEDE 17.01.4　/ linux kernel 4.4.92 ですので、
それなりに古い・チープな環境です。

# 環境構築
基本的に curl が有ればLINE Notifyは使えますが、
ca-bundleも必要となります。

```
root@LEDE:~# opkg update
root@LEDE:~# opkg install curl
root@LEDE:~# opkg install ca-bundle
```

# エラー1
```
curl: (27) PRNG seeding failed
```
どうも、curlのバージョンが古い事にに依存するバグの様です。
LEDE 17.01.4 としてinstallされる curl_7.52.1-10 では解決しない為、
openwrt 18.06 まで該当するパッケージのみをアップデートする事にします。

http://downloads.openwrt.org/releases/18.06.8/packages/mipsel_24kc/base/curl_7.60.0-4_mipsel_24kc.ipk
http://downloads.openwrt.org/releases/18.06.8/packages/mipsel_24kc/base/libcurl_7.60.0-4_mipsel_24kc.ipk

上記を opkg install で直接指定するか、
ローカルにダウンロードしてきて、ファイル指定でinstallすればOKです。


# エラー2
```
Error loading shared library libmbedcrypto.so.1: No such file or directory
```
上手くリンクが作られていない様です。
エラー1の対策で、本来のディストリビューションパッケージ外のバージョンを導入した為、
整合性が取れなくなっているのかもしれません。

取り敢えず、該当しそうなライブラリを探してみます。

```
root@LEDE:/overlay/upper/usr/lib/opkg# ls -all /usr/lib/ | grep libmbedcrypto
lrwxrwxrwx    1 root     root            18 Feb 24 11:49 libmbedcrypto.so -> libmbedcrypto.so.0
lrwxrwxrwx    1 root     root            23 Feb 24 11:49 libmbedcrypto.so.0 -> libmbedcrypto.so.2.7.10
-rwxr-xr-x    1 root     root        222455 Jun 19  2019 libmbedcrypto.so.2.7.10
```

古いバージョンのリンクで大丈夫か不安ですが、
リンクを貼ってみます。

```
ln -s /usr/lib/libmbedcrypto.so.2.7.10 /usr/lib/libmbedcrypto.so.1
```

# 結果
```
root@LEDE:/overlay/upper/usr/lib/opkg# curl -X POST -H 'Authorization: Bearer XXXX' -F "message=test" https://notify-api.line.me/api/notify
{"status":200,"message":"ok"}

```

上手く動きました。
依存関係の問題を無理やり解決して動いたので、運が良かった様に思います。
[備忘録]Cookie(クッキー)の仕組みについて

#Cookie(クッキー)とは
クライアント(ユーザー)側のブラウザに保持することができるWebサーバーから送られる情報のことです。

身近な例でイメージすると、ECサイト利用時に一度サイトを離れてもユーザーのログインや買い物カゴに入れた商品保持されているあれです。
これにクッキーが利用されています。
クッキーを利用する事で、ユーザーが一度サイトを離れて再度訪問した時に同じブラウザ（ユーザー）であると認識してくれます。


#Cookie(クッキー)の仕組みについて
あるWebサーバーに初めて接続した時に、Webサーバーがクライアント側のコンピュータの中に
そのWebサーバー専用のCookieファイルを作成し、保存します。
するとクライアントが同じWebサーバーに再度接続した時に、WebブラウザがそのCookieをWebサーバーに送信します。
この仕組みによって、クライアントコンピュータとWebサーバーの情報を紐付けさせています。

#まとめ
Cookieには、Webサーバーによってどのような情報でも格納できます。
身近な例で多いのは先ほど挙げたECサイトで、ユーザー名などの接続情報、購入する商品を一時的に保管する買い物カゴの情報、氏名や住所、電話番号などの一度登録した会員情報といった管理に利用されています。

今回は自分でイメージしやすくバキバキに噛み砕いた備忘録ですが、
以下参考URLを読み込めばより理解が深まりますのでどうぞ。
https://digitalidentity.co.jp/blog/creative/what-is-cookie.html
https://www.soumu.go.jp/main_sosiki/joho_tsusin/security_previous/kiso/k01_cookie.htm
 [https://digital-marketing.jp/](https://digital-marketing.jp/seo/what-is-cookie/#:~:text=Cookie%E3%81%A8%E3%81%AF%E3%80%81%E7%89%B9%E5%AE%9A%E3%81%AE,%E3%81%99%E3%82%8B%E4%BB%95%E7%B5%84%E3%81%BF%E3%81%AE%E3%81%93%E3%81%A8%E3%81%A7%E3%81%99%E3%80%82&text=%E3%81%BE%E3%81%9A%E3%80%81Web%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%81%8B%E3%82%89%E3%83%96%E3%83%A9%E3%82%A6%E3%82%B6,%E5%90%88%E3%82%8F%E3%81%9B%E3%81%A6%E3%81%B2%E3%82%82%E4%BB%98%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82 "https://digital-marketing.jp/")
importを使ってみる

環境
初書：2020/09/10

# 前書き
javascriptにも名前空間というのがないのか調べていたところ、importというのを見つけたので、
名前空間ではないがそれっぽい動作になりそうなので使ってみる。

# 前提条件
・import / exportはES6以降でしか対応していない。そのため、IE対応のHPを作成しようと考えている場合は使えない。
・import / exportを使用した場合、宣言に関わらず[strict モード](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Strict_mode)になる。
・ローカル環境では動作しない。（httpもしくはhttpsから始まれば使える。Finderなどでhtmlファイルダブルクリックで開くようなものは動かない、らしい）

# 記述方法
## ライブラリ側
ライブラリとして提供したいものにexport関数を付ける

```js:lib.js
export function id(val){
    return document.getElementById(val);
}
export var pi = 3.14;
```
ちなみにエクスポート可能なものは、var, let, const, function, class
また、他にもexportする方法はいくつかあるので、詳細は[MDN export](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/export)で

## 利用側
使う方は何ていうのが正解なのだろうか。。？
まぁとりあえず、こちらの方は上記のライブラリをインポートする必要がある
今回は上記のlib.jsと、使う側のmain.jsは同じフォルダにあると仮定する。

```js:main.js
import {id, pi} from "./lib.js";
console.log(id("aa").innerHTML);
console.log(pi);
```
もしくは

```js:main.js
import * as lib from "./lib.js";
console.log(lib.id("aa"));
console.log(lib.pi);
```

上の場合は、宣言された名前の通りに使用する事が可能かつ必要なもののみインポート可能で、下の場合は、複数のライブラリを読み込む際に名前の競合を避ける事ができる。
ちなみに*は"全ての"という意味。ここを`{id, pi}`に置き換えることは出来ない。
こちらも他にimportする方法はいくつかあるので、詳細は[MDN import](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/import)

# 使ってみる
使う際は、main.jsのみ読み込めばいい。また`type="module"`を付ける必要がある。
で、このmoduleというのが普通のjavascriptと少し異なる箇所になる。

詳細は、[JavaScript モジュール](https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Modules)を読んでいただくとして、普通のscriptを読み込むのと異なり、
・ローカルで実行出来ない（前提条件に記述したもの）
・自動的にstrictモードになる（前提条件に記述したもの）
・defer属性を付けなくても遅延実行される
・__グローバル環境からアクセス出来ない__
という制約が出来ます。[^aa]

ということでhtmlの記述

```html:index.html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="utf-8">
</head>
<body>
<div id="aa">aaaaaa</div>
<script type="module" src="main.js"></script>
</body>
</html>
```
[^aa]: [モジュールの通常のスクリプトの間のその他の違い](https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Modules#Other_differences_between_modules_and_standard_scripts)

これで、コンソール上には`<div id="aa">aaaaaa</div>`と`3.14`が表示されているはず。

# 注意点
"使ってみる"の箇所の太字欄にも記載してある通り、グローバル環境からアクセス出来なくなる。
そのため、例えばデバッグのためにコンソールから変数にアクセスしようとしても失敗する。
また、`main.js`と`main2.js`のように複数読み込んでも、import/exportの関係では無い場合はお互いの変数や関数にアクセスすることは出来ない。
逆にいうと、ファイルの全体を`(() => {})()`で囲わなくてもグローバル変数を荒らさない。
また、main.js内からグローバル変数にアクセスすることは可能。

# 参考サイト
・[JavaScriptのimport文を使ってみた](https://qiita.com/TakamiChie/items/4d92c7e80a9d4cce0178)
・[JavaScript 別ファイルからクラスをインポートしたい](https://teratail.com/questions/216443)
・[import](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/import)
・[export](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/export)
Fortran 言語について

###Fortran言語について
Fortran は1950年代に誕生した、世界初の高級プログラミング言語です。
Fortran は "FORmula TRANslation" の略です。
数値計算プログラム作成に適しています。
Fortran がなぜ数値計算プログラム作成に特に適しているかを以下に述べます。

Fortran はその名の通りもともと数値計算用プログラミング言語として設計されています。 そのため、各種組込み関数や複素数、そして強力な配列操作など、数値計算に便利な機能があらかじめ組み込まれています。
他の高級言語（C/C++, Java など）と比較して、数値計算プログラムを簡潔に記述することができます。
他の高級言語（C 言語など）と比較しても、一般的にパフォーマンスに優れています。
Fortran はその言語仕様上、コンパイラにとって最適化しやすい言語です。（→ パフォーマンス面で有利です）
優れた数値計算ライブラリ（NAG ライブラリ、LAPACK など）が豊富に利用可能です。
移植性に優れているため、作成したプログラムを変更することなく（あるいは最小限の変更で）PC からスパコンまで様々な環境で利用可能です。
（正しく記述した場合）プログラミングにおいての誤りをおかしにくい言語です。
oracleの共有プール(shared pool)

#共有プール(shared pool)とは

##SGA（システムグローバル領域＝共有メモリ領域）の一つ

SGAは下記の要素で構成されている。

+ データベースバッファキャッシュ
+ REDOログバッファ（データの変更履歴を保持する）
+ ラージプール
+ javaプール
+ ストリームプール
+ ★共有プール★


##共有プール(shared pool)の中身
下記の要素で構成されている。
共有プールのキャッシュ上に一度アクセス、解析した内容をおいておくことで
複数回のSQL実行時の処理削減を行なっている。


+ ライブラリキャッシュ
　　共有SQL領域、PL/SQP領域を含むメモリ構造、実行計画の結果など
　　複数回実行時の解析作業をメモリに置き、処理を削減している領域

+ ディクショナリキャッシュ (行キャッシュ）
　　表列の定義、ユーザ名、パスワード、アクセス権限などを記録している

+ その他



##共有プール(shared pool)の開放
共有プールがあることで、SQLは一度目の実行と二度目の実行で
性能に大きな差が出てしまう。
そのため共有プールの開放を行い性能測定をするのがベター。
また、共有プールの断面化によりORA-04031の発生
（ORA-04031: 共有メモリーのXXXXバイトを割当てできません）
時にも有効

```ALTER SYSTEM FLUSH SHARED_POOL;
```

##共有プールのサイズ確認
```SELECT * FROM v$sgastat WHERE name = 'free memory' AND pool = 'shared pool';```


参考
V$表（動的パフォーマンスビュー）　oracleの動的なステータスが確認できる名称の規則
sga=system global area 
stat=状態

###参考にしたサイト
https://oracle-chokotto.com/ora_vtable.html


http://itsoldier0901.hatenablog.com/entry/2016/11/22/020500

https://docs.oracle.com/cd/E16338_01/server.112/b56306/memory.htm

https://kuronekojima.hatenadiary.org/entry/20090805/1249623130
コピペツールClipyでテンプレ化した入力を

slckでのテンプレ化したやり取り、
ターミナルで@docker-compose`でコンテナの出入り、
お決まりの入力をするだけなのに、イチイチタイピングするのは面倒ですね。

普通に文字を打つだけなのに面倒って・・・、という声が聞こえてきそうですが、
エディターの自動補完が働く環境でコーディングをしているエンジニアにとっては、やっぱり気になる。

そこで、よく使う入力は**Clipy**に登録しちゃいましょう!

### Clipyとは
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420171/2056ac90-2d21-5d73-0fd2-9035fb331197.png)

コピペ文を登録&ショートカットで使えるようになるアプリです。
開発者の方のQiita記事もあります!
[クリップボード拡張Macアプリ「Clipy」を公開しました](https://qiita.com/econa77/items/1848bf3fdfb7127ca9b8)
・無料
・対応OSはMacのみ
### 導入手順

#### 公式HPへアクセス
公式(mac): [Clipy for Mac](https://clipy-app.com/)
#### ダウンロード
ボタンを押してDL。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420171/ab4146a0-f64f-14f9-9117-be77d1ac7854.png)
ちなみに、clipyでググって一番上にくるHPは公式じゃありません。
ここからDLもできますが、バージョンが遅れてることがあったり、avast広告が出たりするので上記の公式からのDLをオススメします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420171/ad67cf48-46e6-def1-a873-299daf70e562.png)


#### アプリケーションディレクトリへ移動
DLしたファイルをクリックすると↓のようなウィンドウが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420171/da3e5fcb-6a32-7208-d10f-e9a417838c9a.png)
ドラッグ&ドロップした後、アプリケーションメニューからClipyアイコンを選択すると、Clipyが起動します。
画面の右上にアイコンが常駐するので、ここからスニペットを登録できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420171/aa19b698-2829-2a22-074c-e996cce7e937.png)

### スニペットの登録
アイコンをクリックして編集を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420171/1d4a310f-cb72-764a-a089-dddca2244a55.png)

### おすすめスニペット10選

参考:[Dockerコマンド よく使うやつ](https://qiita.com/Esfahan/items/52141a2ad741933d7d4c)

参考:[【git】マージしたけどやっぱりやめたい時のやり方4種類](https://qiita.com/chihiro/items/5dd671aa6f1c332986a7)


### まとめ
これでタイポによる打ち直しからも開放されますね。
みなさんも、コレ便利だよ!っていうスニペットがあったら教えてくださると嬉しいです。
【備忘】 IntelliJでbuild.gradleを修正したのに、External Librariesが反映されない場合は「.idea」を削除する

タイトルの通りです。
build.gradleを修正して、任意のバージョンにしたつもりが、External Librariesは昔のバージョンのままだった。ということが時たまあるので、備忘として残しておきます。

IntelliJを一旦終了させて、.ideaを削除。
もう一度、当該プロジェクトを開けば、gradleさんがちゃんと仕事する。

今回は以上です。
オリジナルアプリ　DB



フリマアプリを完成させて、オリジナルアプリに入ります！:hotdog:
作ろうと思っているものは、foodアプリです:corn:
好きな食べ物を検索すると　投稿されている食べ物の画像がすぐに出てきて
詳細をみたり、いいねを押してマイページに記録したりできる機能を作ろうと思っています。

このアプリを作りたいと思った背景は、私はよく画像をみてから美味しそうだなと思ったものを検索することが多いので、
好きな食べ物を検索して画像が出てきて、食べたいものをおすと、すぐに詳細がみれるアプリが欲しいと思ったからです（一旦既存のアプリがあることは無視ですw)
食べログなどは多機能であるがゆえ、使いにくかったり、見にくかったりすると思います。
私はもっと簡易的な操作で食べたいものを検索して詳細をしれたらいいなと思いました。
（簡易的な操作とは　悪く捉えれば多機能という戦場から降りたとも取れますが。。汗）


あと技術的にtechchampでは学んでいないいいね機能や画像のスワイプ等を実装してみたいという理由から
オリジナルアプリを作ることにしました！

#ER図

まず今日、ER図を作成しました
furimaアプリ
ちょっと簡易的すぎるように思えますね。。w
今まだコメント機能つけるか迷っています:confounded:


![c0f40201e578ebb605b7cfa70d0406ee.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682942/30326a53-5352-6d23-d960-065ed93d1eb5.png)


少し余裕が出てきたのでこれから随時進歩状況を投稿したいと思います:sunglasses:
自分のツイートどこいったー？


はじめまして。

投資実績公開している「[しゅんすけ](https://namonakiblog.com/)」です。

ブログ書いてます。よかったらお願いします。

「[名もなきブログ(子持ちSE)](https://namonakiblog.com/)」

　
　



さて、本題です。

Twitterやって、毎日ツイートするのって結構大変。

前ツイートしたやつを流用しよう！

そんなこと思って、自分のプロフィールから探しても他の人リツイートやなんやらで埋もれて見つからない。。。


　
　
　
そんなときは、ブックマークです。

自分のツイートは、ツイートしたら、ブックマークするくせをつけましょう。

そうすれば、他のツイートに埋もれずに自分のツイートをすぐに探すことができる。


　
　
　

ということやっていたのですが、

調べてみると、ちゃんと検索の方法がありました。

参考までにURLを記載させていただきます。

Twitter（ツイッター）で自分のツイートを検索する4つの方法とは。検索しても出てこない場合の対処法まで解説
https://social-dog.net/trend/p158


　
　
ツイッターは奥が深いです。

いろいろやり始めると、古くからSNS運用している人にも会えて刺激的です。

だから、やり続けることが大事なんですね。

やり続けることで、きっとマネタイズできるものだと信じて継続します。

やりすぎると時間取られていくので、ご注意を。
　
　


いいツイッターライフを(^^♪
DockerでのRails環境構築(個人的黙示録)

## Dockerfileの作成
```haml
-# ビルドコンテキスト
% mkdir product-register
% cd product-register
-# GemfileとGemfile.lockの作成
% touch Gemfile Gemfile.lock
-# Gemfileの編集
% vim Gemfile
```
```:product-register/Gemfile
source 'https://rubygems.org'
gem 'rails', '~>5.2'
```
```haml
-# Dockerfileの編集
% vim Dockerfile
```
```dockerfile:product-register/Dockerfile
FROM ruby:2.5
RUN apt-get update && apt-get install -y && \
    buile-essential \
    libpq-dev \
    nodejs \
    postgresql-client \
    yarn
WORKDIR /product-register
COPY Gemfile Gemfile.lock /product-register/
RUN bundle install
```
```haml
-# コンテナの作成
% docker build .
```

##docker-compose.ymlの記述
```haml
-# docker-compose.ymlの編集
% vim docker-compose.yml
```
```yml:docker-compose.yml

version: '3'

services:
  web:
    build: .
    ports:
      - '3000:3000'
    volumes:
      - '.:/product-register'
    tty: true
    stdin_open: true
```
```haml
-# コンテナの立ち上げ
% docker-compose up -d
-# コンテナ内に入って作業をする場合 
% docker-compose exec web bash
```

##Railsのセットアップ
```haml
-# アプリの作成、DBの設定、bundleはDockerfileで行うので—skip
# rails new . —force —database=postgresql —skip-bundle
-# ホスト側でGemfileの内容が変わっていることを確認する
% cat Gemfile
-# bundle installする必要があるので一度停止する
# exit
$ docker-compose down
-# docker-compose upをすると前のイメージが使われるので再度buildを行う
$ docker-compose up —build -d
% docker-compose exec web bash
-# railsのサーバを起動
$ rails s -b 0.0.0.0
```
localhost:3000で接続できるがDBの設定を行っていないのでエラーページとなる。

##DBのセットアップ

```yml:config/database.yml
default: &default
  adapter: postgresql
  encoding: unicode
  host: db
  user: postgres
  port: 5432
  password: <%= ENV.fetch("DATABASE_PASSWORD") %>
  # For details on connection pooling, see Rails configuration guide
  # http://guides.rubyonrails.org/configuring.html#database-pooling
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
```
Passwordはセキュリティ的に直接書くのは望ましくないので環境変数で呼び出すようにする。

##docker-compose.ymlの変更
```yml:docker-compose.yml
version: '3'
# dockervolumeここにデータが保存される
volumes: 
  db-data:

services:
  web:
    build: .
    ports:
      - '3000:3000'
    volumes:
      - '.:/product-register'
# コンテナの環境変数設定、本来は直接パスワードを書いてはいけない。
    environment:
      - 'DATABASE_PASSWORD=postgres'
    tty: true
    stdin_open: true
# dbサービスが作られたら作成される
    depends_on:
      - db
# webからdbにアクセスできる
    links:
      - db
# postgresのコンテナ
  db:
    image: postgres
# ホストのdb-dataにデータを保管
    volumes:
      - 'db-data:/var/lib/postgresql/data'
    environment:
      - 'POSTGRES_USER=postgres'
      - 'POSTGRES_PASSWORD=postgres'
```

##docker-composeで起動
```haml
% docker-compose up -d
-# 2つのサービスが起動しているのが確認できる
Creating product-register_db_1 ... done
Recreating product-register_web_1 ... done
% docker-compose exec web bash
-# DBの作成
# rails db:create
Created database 'product-register_development'
Created database 'product-register_test'
```
データベースが作られているのが確認できる。
ここからRailsのアプリを作成することができる。

##アプリを作り動作を確認する
```haml
-# scaffoldで簡単なアプリを作る
# rails g scaffold product name:string price:integer vender:string
-# 作成したテーブルを定義する
# rails db:migrate
-# サーバを立ち上げる
# rails s -b 0.0.0.0
```
localhost:3000で接続でき、railsのページが表示されていることが確認できる。
localhost:3000/productsで作られたアプリに接続できる。
git pull実行時にNot possible to fast-forwardエラーが発生した場合の対応

## Contents
`git pull`を実行したときに`Not possible to fast-forward, aborting.`と表示され、ローカルをリモートリポジトリと同期できなくなった場合の対応方法です。


## 原因
リモートリポジトリの更新後、`git pull`(= `git fetch; git merge`)の前にローカルリポジトリを編集してcommitした場合などに発生するようです。

- Continuous integration (CI) toolを使った自動コミットが含まれる場合は要注意！
- Pull requestをmergeした直後は要注意！


## 解決方法
落ち着いて、次の通り`git fetch`と`git rebase`を実行すれば副作用を抑えて解決できます[^1]。

[^1]: [stack overflow: Fatal: Not possible to fast-forward, aborting](https://stackoverflow.com/questions/13106179/fatal-not-possible-to-fast-forward-aborting)

main branchの場合：

```Bash
git pull origin main --rebase
```

Output:

```
From (remote repositoryのURL)
 * branch            main     -> FETCH_HEAD
Successfully rebased and updated refs/heads/main.
```


## コマンドのイメージ
リモートの変更内容をdiff-A, ローカルの変更内容をdiff-Bとしたとき[^2] [^3]、

[^2]: [git pull --rebaseをpushする前にやろうという話。](https://qiita.com/makua/items/7aa1f4fa02ef9ab1f9d9)
[^3]: [git pull と git pull –rebase の違いって？図を交えて説明します！](https://kray.jp/blog/git-pull-rebase/)

ローカル側：
1. diff-Bをローカルから取り除く
2. diff-Aをローカルに反映させる
3. diff-Bをローカルに反映させる

リモート側：
1. diff-Bをリモートに反映させる

ローカル側もリモート側もdiff-A, diff-Bの順にcommitが設定されます。


## あとがき
「一時退避」などでがんばる方法もあると思いますが、履歴が複雑になります（経験談）。履歴を振り返りにくくなるのでrebaseすることをおすすめします。

またリモートとローカルで同じ場所を編集した場合はconflictが発生しますので、そちらも落ち着いて解決しましょう。

お疲れさまでした！
localStrageで複数データを保存する


データを保存する前に、文字列に一旦変換する必要があります。
JSON形式のデータを文字列に変換するために、JSON.stringify()メソッドを利用します。

データをセットする

```
localStorage.setItem("datalist", JSON.stringify(datalist));
```

データを引き出す

```
JSON.parse(localStorage.getItem("datalist"))  // -> {"data1":"hoge1", "data2":"hoge2"}

```

引用サイト
[localStorageで複数のデータを保存する](https://www.tam-tam.co.jp/tipsnote/javascript/post5978.html)
文字コードによるバイト数の違い

##1文字当たりのバイト数

・文字の種類とコードによって使用するバイト数が異なる。
　その一覧を表記

| 文字種類 | 文字コード | 1文字あたりのバイト数 |
|:--------------|-------------:|:------------:|
| ASCII                | EUC_JP        | 1    |
| 半角カナ              | EUC_JP      | 2       |
| JIS X 0208漢字        | EUC_JP        | 2         |
| JIS X 0212漢字        | EUC_JP          | 3           |
| ASCII                | UTF8        | 1         |
| 半角カナ              | UTF8      | 3       |
| JIS X 0208漢字       | UTF8        | 3         |
| JIS X 0212漢字      |  UTF8       | 3
【Laravel】バッチでユーザーにメール送信

継続は力なり。めげずに今日も備忘録。
バッチの理解を深める為、簡単な処理を実装してみた。

## 環境
PHP 7.3.8
Laravel 6.18.35

## 本日のお題
バッチでメールを送ってみる。
今回は実装するアプリケーションの登録ユーザーに一括送信するもの。

## メールの環境設定
[mailtrap.io](https://mailtrap.io/inboxes)というSMTPのダミーサーバーを利用する。
mailtrap.ioを利用する事で送信したメールは指定したアドレス宛てには送信されずに、mailtrap.ioの画面で結果を確認する事が出来るので、非常に便利です。会員登録したら直ぐに使えます。

mailtrap.ioの` Inboxes` から` Demo inbox` に遷移して、SMTP情報を確認します。
その情報を元に.envを編集します。

```php:.env
MAIL_DRIVER=smtp
MAIL_HOST=smtp.mailtrap.io
MAIL_PORT=587
MAIL_USERNAME=mailtrap.ioのSMTP情報を参照
MAIL_PASSWORD=mailtrap.ioのSMTP情報を参照
MAIL_ENCRYPTION=null
MAIL_FROM_ADDRESS=test@example.com
MAIL_FROM_NAME="Example"
```

## バッチ処理を書く
バッチコマンドクラスを生成する。

```
$ php artisan make:command SendMailCommand
```

```php:SendMailCommand.php
<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;
use App\User;
//メール送信用ファサード
use Illuminate\Support\Facades\Mail;


class SendMailCommand extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    //コマンドの名前
    protected $signature = 'users:send_mail';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'バッチの説明';

    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle()
    {
        //モデルからユーザー情報を取り出して
        $users = User::all();
        //メールアドレスで繰り返し
        foreach ($users as $user) {
            echo $user['email']."\n";

            Mail::raw("これバッチでメールしているよ", function($message) use ($user)
            {
                //toで送信先、subjectで件名
                $message->to($user->email)->subject('test');
            });
        }
    }
}
```

## これでバッチが完成
ですが〜
このままバッチコマンドを実行しても失敗する事があります。

```
 Swift_TransportException  : Expected response code 250 but got code "530", with message "530 5.7.1 Authentication required
```
これが出た時はキャッシュをクリアしてあげましょう。

```
$ php artisan cache:clear
$ php artisan config:cache
```
改めてバッチコマンドを実行

```
php artisan users:send_mail
```

mailtrap.ioで正しく受信出来ているか確認してみましょう。
![スクリーンショット 2020-09-09 23.36.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531606/4a7f2871-e716-f28e-8c97-ae12a5d65847.png)
上手くいっていますね！

## 参考
[Laravel5で送信メールサーバー設定](https://saba.omnioo.com/note/2734/laravel5%E3%81%A7%E9%80%81%E4%BF%A1%E3%83%A1%E3%83%BC%E3%83%AB%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E8%A8%AD%E5%AE%9A/)
HTTPメソッドの種類とその役割（REST API学習編）

##　HTTPメソッドの種類とその役割
１．`HTTPとは何ぞや？`
２．`HTTPメソッドの種類とその役割`


*REST APIを叩いて、自社システム外部システムとの連携をとってカスタマイズしていくために先ずはREST APIを勉強しています。そこでクライアントとサーバーとの間でどんな処理が行われているかをざっくりと復習がてら記事にします*\:kissing_closed_eyes: chu☆


##　HTTPとは？
HTTP（Hypertext Transfer Protocol)とはHTMLなどで書かれたファイルをクライアントとサーバー間でやり取りする決まり事（規約）

要はHTTPによってクライアントとサーバー間に円滑な意思疎通が生まれているということ。

例えば`http:/www.yahoo.co.jp`のように入力するとyahoo japanのトップページをこちら側がリクエストしたことになる。宣言文？のようなものかという認識。

##　HTTPメソッドの種類とその役割

REST APIを使っていく中で登場するメソッドは主に４つ

| メソッド | 意味 |
|:-:|:------------:|
| GET  | リソース情報の取得  |
|POST   | リソース新規作成  |
|PUT   |  リソース変更・更新 |
|DELETE   |  リソース削除 |

同じURLにアクセスしたとしてもHTTPメソッドによって操作を変えることができる！

#####　リソース(資源)＝作成したり変更したりするモノ。user item など



```html:HTML

<form method="POST" action="http:/www.test.co.jp">
    <p>お名前：<input type="text" name="NAME"></p>
    <p>メールアドレス：<input type="text" name="email"></p>
    <p><input type="submit" value="送信する"></p>
    <p><input type="reset" value="取消する"></p>
</form>

```

例えば↑だとformタグの中のメソッドがPOSTになっている。

ここのフォームを入力して送信するとPOSTをリクエストすることになる。
GETなどに置き換えていくことでサーバーが受け取る仕組みが変わっていく。

ざっくりとこんな感じですかね。。
誤った認識等があればご教授願います。


以上備忘録でした。ぐっない。
Expo x React Native DebuggerでUIデバッグ

## 概要

SimulatorでWeb開発でやるようなInspectを出来るようにする方法を書いておきます。

## React Native Debuggerをインストール

caskで`react-native-debugger`をインストールします。

```
$ brew update && brew cask install react-native-debugger
```

## React Native Debuggerの設定をExpo用に変更

React Native Debuggerを開いて、`Debugger` > `Open Config File`を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19716/58f2e15f-7b61-9cec-7281-dfa4b8b98241.png)

`.rndebuggerrc`という設定ファイルが開かれるので、`defaultRNPackagerPorts`をExpo用に`19001`に変更します。

```diff
- defaultRNPackagerPorts: [8080]
+ defaultRNPackagerPorts: [19001],
```

## デバッグ方法

上記までが終わったら、一度expoを再起動します。
> これしなくてエラーが出た

再起動したら、Simulatorを立ち上げます。
以下はiOS Simulatorで進めます。

### SimulatorでDebug JS RemotelyをONに

Simulator上で`Cmd + D`でメニューを開きます。
すると以下のようにメニューが出るので、`Debug Remote JS`をタップします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19716/4be6f9ce-8724-14db-8788-7b621cc69b61.png)

### React Native Debuggerを起動

React Native Debuggerを起動して、iOS Simulatorをリフレッシュすると以下のような小さいメニューが出るので、`Inspect`をタップするとWeb開発のようなInspectが出来るようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19716/7034aa3e-2d6e-779a-66c4-1b14b76f8963.png)
MacBookにWindowsのみを入れる

#はじめに
初めての投稿になります．
少し前にイキってMacBookを買ったものの，8年程度Windowsしか使ってない僕にとっては
使いやすいものではなく，しばらく文鎮化してました．
だからと新しいlaptopを買うかと言われればNoなわけでありまして．

結論MacBookにWindowsをいれようというわけであります．
貧乏性な僕は少しでも容量を浮かせるためにBootcampは使いたくないというわけであります．

#用意するもの
###ハード
・MacBook本機（MacOSインストール済みのもの）
・USBメモリ：8G程度

###要ダウンロード
・[Windows iso](https://www.microsoft.com/ja-jp/software-download/windows10)：Windows10でのみ動作確認
・[AutoUnattend.xml](https://twocanoes.com/wp-content/uploads/2018/09/AutoUnattend.xml_.zip)
・インストールドライバ（後述）
※全部Macbookでのダウンロードで構いません
※Windowsのライセンスは後から（成功してから）買いましょう

#OSインストールディスクの準備
###インストールドライバのダウンロード
1.⌘command + スペース でSpotlight検索
2.Bootcampと検索，Bootcampアシスタントを開く
3.メニューバーのアクション>windowsインストールドライバうんたらかんたらを選択
4.ダウンロード先はディスクトップにでもしておきましょう

###USBメモリにぶち込む
1.USBメモリをexFATでフォーマットしておく
2.isoファイルを展開，中身をUSBメモリに入れる
3.BootChampアシスタントからダウンロードしたヤツの中身のBootCamp, \$WinPEDriver\$も入れる
　この時，2018年以降のMacBookの場合は\$WinPEDriver\$の中身のIntelMEIってやつを消しておく
4.AutoUnattend.xmlもいれる これで完成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/705535/831c6c2e-a06f-11f1-6b19-ab7ed780c30e.png)
こんな感じになる

#OSのインストール
###外部メディアからの起動を許可する
1.MacBookを再起動，⌘command + R をおしっぱなしにする
2.メニューバーから起動セキュリティユーティリティを選択
3.「外部メディアからの起動を許可」に変更しておく
<img src ="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/705535/fcf6f21e-6f88-f0d4-94fe-635d5f28b8c4.png" width=42%>

###USBからブートする
1.MacBookを再起動，Optionをおしっぱなしにする
2.どのデバイスから起動するか聞かれるので，USBを選択
3.IMEだのライセンス聞かれるけど適宜選択
4.セットアップ中です が長い，(私は1回ここで敗北)
5.インストールの種類を選択は「カスタム」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/705535/5fe1cca2-19ef-aa45-1713-cc03dafaca3c.png)

6.Windowsのインストールの場所を選択 はとりあえず見えるドライブ全部削除する
　これでMacOSとはお別れ
<img src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/705535/f23d3c01-6953-581f-f5b9-758a2afdadc4.png" width=42%>
こんな感じになるはず
ここでドライバどうのこうの怒られたら**USBメモリにぶち込む**のとこが間違ってるはず

7.あとは待っていれば初回セットアップに自動的に切り替わる．設定が完了したらWindowsUpdateをしましょう．

#あとがき
結構大変だった…
キー配列が違くて使いずらいですが，これはそのうち慣れるでしょう…

##参考
[Create a Windows 10 Bootable USB Flash Drive on a Mac](https://twocanoes.com/create-a-windows-10-bootable-usb-flash-drive-on-a-mac/)
[起動セキュリティユーティリティについて](https://support.apple.com/ja-jp/HT208198)
[MacbookをWindowsだけにする](https://qiita.com/koumaza/items/91d6c2c12083c73bbe91)
Ajaxの非同期通信の考察

<h1>Ajaxの非同期通信の考察</h1>

同期通信では一度のデータ通信で全てのデータが更新されていた。
非同期通信では一部のデータのみでデータ処理を行なっている。

何が違うのか。。。？

<h4>◆Railsの同期通信</h4>
URIもしくはPermitを元に、MVCでactionによる処理を行い、データ通信をしている。全体の更新を必要とする。

<h4>◆非同期通信</h4>
DOMでHTML（←階層構造）から作ったDOMツリー（←も階層構造）の先っちょにあるURLパラメーターを元に、XMLHttpRequestにより設定したリクエストとレスポンスの方法により、必要な一部分だけでデータ通信している。

<b>全体を更新しなくても一部の処理を一部だけで行えるようになる！


<h4>◆ URIパラメーター達</h4>
<h5>・queryパラメーター</h5>
http://sample.jp/?name=kii
の?以降の情報。
HTMLの要素のことを表してる？

<h5>・pathパラメーター</h5>
http://tweets.jp/tweets/1
のようなパラメーターで、「リソースを識別する場合」に使用する。
データベースでidとかをつけると使えるのかなってゆう感じ

まだはっきり理解してないので曖昧表現使ってます。（違ったら指摘お願いします。）

↑のやつをElementsかqueryのselectorで指定して、その部分のHTML要素のデータを単独でデータ通信していく。

<h4>◆XMLHttpRequest（以降XML）</h4>
これを使ってMVCで行なっていたようなデータ通信を作っていく。
ユーザーが見ている非同期通信の行えるwebサイトにはすでこれが組み込まれている？

<h5>・open</h5>
非同期通信のリクエストを何のHTTPメソッドでどんなパスでどの方式で行うのかを決める。

```Javascript
XML.open(“HTTPメソッド, `パス`, true);
```
trueだと非同期通信。

<h5>・responseType</h5>
レスポンスをどんなデータの形でしてもらうか決める。

```Javascript
XML.responseType = "json";
```
これだとjsonの形式で返してくれる。

<h5>・send</h5>
この記述によって、この内容が組み込まれたwebサイトを見ているユーザー側から、リクエストの送信を実行する。


<h4>・・・最後に</h4>
まだはっきりと理解できてないので、今のところの認識で書いています。
言い回しの違いや、認識の間違いなどあれば指摘してくださると幸いです。
【Laravel】マイグレーション

[Laravel公式ドキュメント-マイグレーション](https://readouble.com/laravel/7.x/ja/migrations.html)の私的アウトプット

#準備
マイグレーションを試すためDBも用意した

|項目|名前|
|---|---|
|DBユーザ名|testuser|
|DB|test|


#マイグレーション
マイグレーションとはDBのバージョンコントロール
##マイグレ−ション作成
```:構文
php artisan make:migration create_テーブル名_table
```
テーブル名は複数形にする
2つの`--create`と`--table`オプションがある。
公式によればこう説明されている
>`--table`と`--create`オプションも、テーブル名とマイグレーションで新しいテーブルを生成するかを指定するために使用できます。これらのオプションは生成するマイグレーションスタブの中へ指定したテーブルをあらかじめ埋め込みます。
参考
[Laravel 7.x データベース：マイグレーション](https://readouble.com/laravel/7.x/ja/migrations.html)

何言ってるかわかんないから以下コマンドを実行

```bash
php artisan make:migration create_users1_table
php artisan make:migration create_users2_table --table=users
php artisan make:migration create_users3_table --create=users
php artisan make:migration add_votes_to_users_table --table=users
```
そうしてわかったことはupメソッドの中でSchemaクラスの静的メソッドが変わる

|オプション|説明|
|---|---|
|--create|オプションなしと変わらない|
|--table|すでに存在するテーブルを更新する|

##マイグレーション構造
|メソッド|説明|
|---|---|
|up|新しいテーブル、カラム、インデックスを追加|
|down|upメソッドの処理をもとに戻す|
##マイグレーション実行
```
php artisan migrate[オプション1] [オプション2]
```
####オプション
|オプション|説明|
|---|---|
|:rollback|最後のマイグレーション操作にロールバック|
|:refresh|最初似ロールバックして`migrate`コマンドを実行。**つまりデータベース全体を作り直すのに適してる**|
|:fresh|全テーブル削除後に`migrate`コマンドを実行|

####オプション2
|オプション|説明|
|---|---|
|--seed|シード実行|
##テーブル
###テーブル作成
```php5:例
Schema::create('users', function (Blueprint $table) {
    $table->id();
});
```
###テーブル名変更
`Schema::create`を使う

```php5
Schema::rename($from, $to);
```
###テーブル削除
```php5
Schema::drop('users');

Schema::dropIfExists('users');
```
`drop`か`dropIfExists`メソッドを使う
`dropIfExists`を使っていったほうが良さげかな
##カラム
###カラム作成
`Schema::table`を使う

```php5:例
Schema::table('users', function (Blueprint $table) {
    $table->string('email');
});
```
テーブル作成のマイグレーションでオプションなしで作成されたファイルに書かれている`$table->id();`の意味が載っていた↓

|カラムタイプ|意味|
|---|---|
|`$table->id();`|`$table->bigIncrements('id')`のエイリアス|
###カラム修飾子
NULLを許さない定義にするときとかは`nullable`メソッドを使う

```php5
Schema::table('users', function (Blueprint $table) {
    $table->string('email')->nullable();
});
```

###カラム変更

まずは準備

```
composer require doctrine/dbal
```
---
####カラム属性の変更
`change`メソッドを使う

```php5:stringカラムの文字長を変更する例
//文字長を25から50に変更
Schema::table('users', function (Blueprint $table) {
    $table->string('name', 50)->change();
});
```
```php5:NULL値設定可能に変更する例
Schema::table('users', function (Blueprint $table) {
    $table->string('name', 50)->nullable()->change();
});
```
---
####カラム名変更
`renameColumn`メソッドを使う
ここで先のcomposerで追加したものを使う

```php5:例
Schema::table('users', function (Blueprint $table) {
    $table->renameColumn('from', 'to');
});
```
####カラム削除
`dropColumn `メソッドを使う

```php:votesカラムを削除
Schema::table('users', function (Blueprint $table) {
    $table->dropColumn('votes');
});
```
この引数に配列を渡すと複数カラムを削除できる

```php:複数カラムを削除
Schema::table('users', function (Blueprint $table) {
    $table->dropColumn(['votes', 'avatar', 'location']);
});
```
Xib で View を生成する時に知っておくといいこと

先日、うっかり `ViewClass` で指定した `Xib` で作成したカスタムビューのプロパティにアクセスし下記のように Error を出してしまいました。初心者の頃はよく分からずググったものコピペ なりで回避していましたが、そもそも何故これが Error になるのかを今回は紹介したいと思います。

```swift
    override func viewDidLoad() {
        super.viewDidLoad()
        hogeView.label.text = "hogehoge"
    }
    // Thread 1: Fatal error: Unexpectedly found nil while implicitly unwrapping an Optional value
```

## Xib で View を生成する方法

Xib で View を生成する方法は、大きく分けて `View Class` と `File's Owner` を指定する2通りの方法があります。

### View Class

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/292456/1978a30b-999a-5738-4238-54a283bae9ca.png)


`View Class` は xib上の View に対してクラスを指定することで直接的に xib と参照を作ることができます。この方法は UINib を使用して View をコードから初期化する場合は、全てのオブジェクトが使用できる状態になっていることが担保されますが、`Storyboard` ・`xib` などで直接 View を生成する場合は基本的には `nib-loading`ではない(`init(decode: NSCoder)`)ため、全ての View が初期化されていることは担保されません。(これが、`View Class` で作成したカスタムビューなどを Xib 上で生成した時に、プロパティへの参照が nil でクラッシュする原因と考えられます)

>The order in which the nib-loading code calls the awakeFromNib methods of objects is not guaranteed. In OS X, Cocoa tries to call the awakeFromNib method of File’s Owner last but does not guarantee that behavior. If you need to configure the objects in your nib file further at load time, the most appropriate time to do so is after your nib-loading call returns. At that point, all of the objects are created, initialized, and ready for use.


https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/LoadingResources/CocoaNibs/CocoaNibs.html#//apple_ref/doc/uid/10000051i-CH4-SW24



つまり、基本的に `View Class` を指定した View を使用する場合には、コードでインスタンスを生成して使用する必要があります。例えば、`UITableViewCell` などは再利用性がありコードから生成するのが適切なので、 Xcode のテンプレートなどでも用意されていると考えられます。



### File's Owner


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/292456/1c39c3f6-9a4b-b1ad-d36a-85d8d61fd3d4.png)


`File's Owner` は名前の通り Xib 上の View の保持先を指定することで、`@IBOutlet` などでクラスに View の参照を付けることができます。つまり、クラスと Xib で作成された View のインスタンスは別なので、`nib-loading` を適切なタイミングで呼ぶことで View の全てのオブジェクトが使用可能になっていることが担保されます。これによって、コードから生成される時は、`init(frame: CGRect)` で、`Storyboard`・`Xib` から生成される時は `init?(coder aDecoder: NSCoder)` から View を生成することができるようになります。


### 参考


- https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/LoadingResources/CocoaNibs/CocoaNibs.html#//apple_ref/doc/uid/10000051i-CH4-SW24


- https://qiita.com/marty-suzuki/items/7c7ecdcb1f16c21b0051


- https://qiita.com/takasek/items/3bc284149dcd8aecbf7c
Juliaで複数Arrayの全組み合わせを持つDataFrameを作成

# 複数Arrayの全組み合わせをDataFrameに変換

JuliaでDataFrameを扱う時に
leftjoinするためのベースとして
複数キーの全組み合わせを持つDataFrameが必要だったので備忘として記録

## 環境

Julia: 1.5

## やりたいこと

AというカラムとBというカラムをキーとするDataFrameがあったとします。
Aには、["a", "b", "c"]という値が入りうるとし
Bには、["d", "e", "f"]という値が入るとした時、
以下のような、A、B列の全組み合わせを持つDataFrameを作ります。

<img width="100" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136146/6339e901-de45-3cbe-ae71-3ca53aff85b9.png">

## コード

```julia
using DataFrames

arr1 = ["a", "b", "c"]
arr2 = ["d", "e", "f"]

v = vec(collect(Base.product(arr1, arr2)))

columns = (:A, :B)
data = NamedTuple{columns}.(v)

df = DataFrame(data)
```

## 解説

```julia
arr1 = ["a", "b", "c"]
arr2 = ["d", "e", "f"]

v = vec(collect(Base.product(arr1, arr2)))
```
まずは、２つのArrayの全組み合わせを取得します。
collectまで実行した時点では、Matrixの形式になっているため、vecでタプルの１次元配列にします。

<img width="100" alt="image2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136146/e06b57f0-2e5f-f3eb-03a2-d8a66c98ffd5.png">

```julia
columns = (:A, :B)
data = NamedTuple{columns}.(v)
```
先ほど作成したタプル配列を、ネームドタプルの配列に変換します。
配列なので　.　を忘れずに。

```julia
df = DataFrame(data)
```

`methods(DataFrame)`の実行結果を見れば分かりますが、DataFrameはネームドタプルの配列を引数に取って初期化することが出来ますので、上記のプログラムで所望の結果が得られます。

## 参考

[Iteration utilities](https://docs.julialang.org/en/v1/base/iterators/#Base.Iterators.product)
[DataFrame construction from array of tuples](https://discourse.julialang.org/t/dataframe-construction-from-array-of-tuples/11426)
身に覚えのない"invalid character 'ã' looking for beginning of value"の原因

# TL;DR
`json.Unmarshal`で

```
invalid character 'ã' looking for beginning of value
```

というエラーが出た時は、JSON文字列に全角スペースが紛れている可能性大！！

```json:スペースが全角になっている
{"name":　"Taro"}
```

# 背景
APIサーバ実装中に上記のエラー発生。「`a`がなんで不正やねん」と思いがっつりハマったので備忘録として書きました。
（※実際にはチルダのついた`ã`です）

## 環境

- Go 1.14

# サンプルコード

```go:main.go
package main

import (
	"encoding/json"
	"fmt"
)

type Person struct {
    Name string `json:"name"`
}

func main() {
	// コロンの直後に全角が！
	jsonStr := `{"name":　"Taro"}`
	person := Person{}
	err := json.Unmarshal([]byte(jsonStr), &person)
	if err != nil {
	    fmt.Println(err.Error()) // invalid character 'ã' looking for beginning of value
	}
}
```

# なぜエラーに'ã'が出てくるのか

全角文字の先頭バイト`227`に対応するutf-8の文字が`ã`だからです。
`Unmarshal`には`[]byte`を渡しているので、全角文字の先頭バイト`ã`を読み込んだ時点でパースエラーになったというのが原因でした。

```go:
fmt.Println([]byte("　")) // [227 128 128]
fmt.Println(string(227)) // ã
```

`encoding/json`の実装を見ても、1バイトずつ読み込んで、スキャナが解釈できないバイトが見つかった時点でエラーを吐いていることが分かります。
[Unmarshalの定義](https://github.com/golang/go/blob/5de90d33c837af4d9a375a0a36811c7033655596/src/encoding/json/decode.go#L96)
[checkValid(Unmarshal内部でJSON形式チェックに使用)の定義](https://github.com/golang/go/blob/a1103dcc27b9c85800624367ebb89ef46d4307af/src/encoding/json/scanner.go#L30)

# 最後に
**全角スペースはちゃんとハイライトしよう！**
実務で出てきて少し混乱したPHPの文法

#はじめに
2020年の8月から都内の企業でWebエンジニアとして働いています。

開発環境はいわゆるフルスクラッチPHPなのですが、
私はRubyをメインで学習するプログラミングスクール出身でしたので、入社前はほとんどPHPに触ったことがありませんでした。

入社から1ヶ月ほど経った今では基礎文法も大体理解し、新しく出会った関数などをその都度調べながら
既存システムの改修業務を行っています。

そんな業務中、特に違和感のある記述を見かけたので
すぐに忘れないよう、Qiita上に残しておこうと思います。



#問題のコード
```php
isset($_REQUEST['search']) && $var = $_REQUEST['search'];
```
なんの変哲もないコードですが、人目見たときに混乱しました。

<br />
今までisset()を使う際は

```php
if(isset($_REQUEST['search'])){
  $var = $_REQUEST['search'];
}
```
↑のようなパターンを見慣れていたので
論理演算子 && はANDの条件として使われているイメージしか持っていませんでした。
<br />
そんな中、出会った問題のコード

```php
isset($_REQUEST['search']) && $var = $_REQUEST['search'];
```

初見時ワイ「何がANDやねん」
と、心の中でツッコミまくりました。

どういう動きをするのか調べて見ましたが、if文で条件分岐の例ばかり。
結局クリティカルな回答がすぐに見つからなかったので、先輩に質問させてもらいました。


#結局のところ
左辺のisset()がtrueの場合に、右辺の代入が行われると教えていただきました。
if文とやってることはほとんど変わらないような気がしますが、今回のように単純な条件下ではワンライナーで読みやすくなる書き方ですね。

試しに[paiza.io](https://paiza.io/ja)を使用して
以下のコードを実行してみました

```php
$str = 'Hello!';
isset($str) && $var = $str;

echo $var;
```
<br />
**結果**
[![Image from Gyazo](https://i.gyazo.com/6ddb71b19eeeb490e770eaa47469c6ce.png)](https://gyazo.com/6ddb71b19eeeb490e770eaa47469c6ce)
**や↑ったぜ**

この手の書き方はPHP以外の言語でもたまに見かけるらしいです。


#まとめ
可読性が上がる場合は今回のようなワンライナーによる記述を
自分も積極的に使っていこうと思います。

まだ入社間もないですが、実務で触るコードは楽しいですね。
しばらくはPHP漬けの日々を送ろうと思います。
デザインパターンのお勉強

#デザインパターンのお勉強をしたい

このサイトの例を参考にしてちょっとづつデザインパターンを勉強しながらオブジェクト指向の設計を覚えていきたいと思います。
https://www.techscore.com/tech/DesignPattern/index.html/

まだまだ始めたばかりなので、解釈のおかしなところあると思うのでコメントいただけますと助かります。
また普段PHPを使用しているのですが、こんなところでよく使うよというようなアドバイスありましたらいただけますと大変助かります。

#コマンドパターン
下記引用
>22.1 Commandパターンとは
第22章ではCommandパターンを学びます。あるオブジェクトに対して要求を送るということは、そのオブジェクトのメソッドを呼び出すことと同じです。 そして、メソッドにどのような引数を渡すか、ということによって要求の内容は表現されます。さまざまな要求を送ろうとすると、引数の数や種類を増やさなければなりませんが、 それには限界があります。そこで要求自体をオブジェクトにしてしまい、そのオブジェクトを引数に渡すようにします。それがCommandパターンです。
Commandパターンは、要求をCommandオブジェクトにして、それらを複数組み合わせて使えるようにするパターンです。

#実装リポジトリ
https://github.com/TOnodera/Command
サイトの例に従って、まず機能を実装してリファクタリングしました。

#感想
「なぜオブジェクト指向でつくるのか？」を読んで疎結合で作ることやメイン処理部分にif文を使わないことでコードの可読性や保守性が上がるメリットは理解した気がしていました。
ただ、デザインパターンはそれぞれその良さをもっているのはわかるものの具体的にどういう部分で適用するのがやっぱり自分は理解していないなと感じました。

このパターンについてもリファクタリングの中では確かに読みやすい＆保守性もあがるのはわかるけどやっぱり実践で使わないとだめですね。
SQLの 分析関数（ウインドウ関数）でちょっと応用が利きそうな便利な使い方を思いついた

# 応用できそうなアイデア

テーブルの抽出条件に、ウィンドウ関数を使用すること

応用例の[こちら](https://qiita.com/takahasinaoki/items/c74e177577aa34b5520a)も参照ください。

# 例題

以下のような在庫テーブルのレコードのうち、各月ごとの最終営業日のレコードのみ抽出する

元のテーブル

| 日付       | 在庫 |
| ---------- | ---- |
| 2020-01-10 | 12   |
| 2020-01-29 | 10   |
| 2020-02-20 | 15   |
| 2020-02-28 | 13   |
| 2020-03-10 | 23   |
| 2020-03-20 | 20   |
| 2020-03-31 | 18   |

抽出結果

| 日付       | 在庫 |
| ---------- | ---- |
| 2020-01-29 | 10   |
| 2020-02-28 | 13   |
| 2020-03-31 | 18   |



# テストデータ作成

テーブルを作成して、データを投入します。

```sql
CREATE TABLE 在庫テーブル(日付 CHAR(10),在庫 INT);  

INSERT INTO 在庫テーブル VALUES('2020-01-10', 12);
INSERT INTO 在庫テーブル VALUES('2020-01-29', 10);
INSERT INTO 在庫テーブル VALUES('2020-02-20', 15);
INSERT INTO 在庫テーブル VALUES('2020-02-28', 13);
INSERT INTO 在庫テーブル VALUES('2020-03-10', 23);
INSERT INTO 在庫テーブル VALUES('2020-03-20', 20);
INSERT INTO 在庫テーブル VALUES('2020-03-31', 18);
```



# SQLの実行

以下のSQLを実行します

```sql
SELECT 日付 , 在庫
  FROM (SELECT 日付 , 在庫
             , MAX(日付) OVER (PARTITION BY LEFT(日付,7)) AS 月末日
          FROM 在庫テーブル) AS Z
 WHERE 日付 = 月末日
```

サブクエリ部分の実行結果

| 日付       | 在庫 | 月末日     |
| ---------- | ---- | ---------- |
| 2020-01-10 | 12   | 2020-01-29 |
| 2020-01-29 | 10   | 2020-01-29 |
| 2020-02-20 | 15   | 2020-02-28 |
| 2020-02-28 | 13   | 2020-02-28 |
| 2020-03-10 | 23   | 2020-03-31 |
| 2020-03-20 | 20   | 2020-03-31 |
| 2020-03-31 | 18   | 2020-03-31 |


SQL全体の実行結果

| 日付       | 在庫 |
| ---------- | ---- |
| 2020-01-29 | 10   |
| 2020-02-28 | 13   |
| 2020-03-31 | 18   |

# こちらでお試しできます
https://paiza.io/projects/E-mk6Wg5NMkygtf0Zor93A?language=mysql
Automation360 のデータ入力速度アップの方法

#アプリケーションやWebへの入力の速度を上げる

##考えられる方法
色々方法は考えられるかと思います。
Webやアプリの入力としては、レコーダーでキャプチャして入力内容を変えるのが一般的でしょうか。
下記の１とか２。
ただ、ファイルを保存しようとしたりして長いパスを指定しようとすると、結構待たされたりする。

1. キャプチャでオブジェクトを選択し、テキスト設定で入力
2. キャプチャでオブジェクトを選択し、テキスト設定で**変数を指定して**入力
3. クリップボードにコピーしておき、キーストロークシミュレーションでCtrl-vで入力
4. キーストロークシミュレーションで変数を指定して入力

##ということで、実測

作ったボットはこちら。
上記4つの方法で、開始・終了を記録しながら50回入力を繰り返しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/615564/2cb4019d-6eba-fcae-07b4-0a8e115fb239.png)

キャプチャのプロパティ設定はこちら。遅延は無しです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/615564/626df145-4afc-69fe-96eb-febb4cefefc0.png)

それでもって、キーストロークの方はこちら。遅延10ミリ秒です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/615564/0af404f5-e6b8-2818-1956-daac28ba2246.png)

##計測結果
実測してみた結果はこちら。
まず、キーストロークシミュレーションを使った方法2つが良い結果でした。
オブジェクトをキャプチャするのに時間がかかるんでしょうかね。

|方法|かかった秒数|
|:-:|:-:|
| キャプチャでテキスト入力  | 13秒  |
| キャプチャで変数入力  | 11秒  |
| **クリップボード**  | 3秒  |
| **キーストロークで変数入力** | 17秒  |


##では、もう少し違った条件では？

Windwosのエクスプローラーに、より長ーいパスを指定してみました。回数は少し減らして20回。
その結果はこちら！
文字列の長さが影響したのか、今度はクリップボードを使った方法がダントツに！！

|方法|かかった秒数|
|:-:|:-:|
| キャプチャでテキスト入力  | 30秒  |
| キャプチャで変数入力  | 30秒  |
| **クリップボード**  | **2秒**  |
| **キーストロークで変数入力** | 27秒  |

##まとめ
ちょっと面倒ですが、高速化したいという事であれば、クリップボード利用は有効そうな感じです。
勿論、最初はオブジェクトを掴みに必要があると思いますので、
最初の項目をキャプチャーで掴みに行き、そこからはキーボードシミュレーションで、ショートカットを使いながらというのが早そうですね。
勉強日誌4日目

今日もBGMはポポロクロイス
今日の仕事はだいぶ覚えてきたこともあり、割と順調であった。
Linuxを少し触る可能性が出てきたので早く覚えて触らせてもらう予定。


正答率　71%

groupmod -g 000 GA
既存の「グループアカウント」GAのグループIDを000へ変更

/etc/default/useradd
useraddコマンドでオプション指定せずにユーザーを作成する際、
使用されるデフォルトの値が格納されているファイル

useradd -D
useraddコマンドでデフォルトで使用される値

passwd -l user1
ユーザーアカウント　user1 をロックする

useradd -d /home/aaa user1
ホームディレクトリ　/home/aaaを指定して、新規ユーザー　user1を作成しなさい。

usermod -d /home/aaa user1
ユーザー　user1　のホームディレクトリを　/home/aaa に変更しなさい。

usermod -g root user1
ユーザ　user1　のプライマリグループを　root　に変更しなさい。

useradd -s /bin/csh user1
ログインシェル　/bin/csh を指定して、新規ユーザ　user1の作成

正答率　68％

getent passwd
ローカルやLDAサーバで管理しているユーザー情報の一覧表示

id -G user1
ユーザー user1　の所属する全てのグループIDのみを表示

/etc/shadow
ユーザアカウントの暗号化されたパスワードや、パスワードの有効期限に関する情報が収められているファイル

/etc/passwd
ユーザのアカウント情報

/etc/nologin
一般ユーザーのログインを禁止したい場合に作成

groups hoge
ユーザhogeが所属するグループを確認できるコマンド

正答率70％

/etc/locale.conf
systemdにおける、システム全体のロケール設定ファイル

systemd-run 
timerユニットの作成

at -rm ,atd
予約されている1回限りのジョブを削除

/var/spool/cron
ユーザのcron設定ファイルが置かれるディレクトリ

systemctl list-timers
systemdにおいて、全ての有効なtimerユニットの表示

ISO-8859
8ビットで表現。256種の文字で構成される文字コード

export TZ=Asia/Tokyo
環境変数を設定して、タイムゾーン　Asia/Tokyoを使用する為のコマンド

timer
systemdのユニットで、cronのようにジョブスケジューラとして使用

cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
あるバイナリファイルをコピーする事で、システムのタイムゾーンをAsia/Tokyo とする。

LANG
全てのカテゴリに対しロケールのデフォルトの値を設定する環境変数名

LC_TIME
ロケールの設定で、日付や時刻の書式を定義するための環境変数名

tzselect
環境変数　TZ　や/etc/timezone　ファイルで使用できるタイムゾーンの値を表示するコマンド

locale -a
ロケールの環境変数に設定できる値

locale
現在のロケールの設定確認

crontab -r
ユーザのcronの設定を全て削除するコマンド
【Rails】副問い合わせをする場合の書き方

#副問い合わせ（入れ子）でSQLを流したい
重複したデータを確認する例で確かめる。
##副問い合わせの形を作る
**usersテーブル**

| id | name | address |
|:-:|:-:|:-:|
| 1  | sasaki | tokyo  |
| 2 | itou  | fukuoka  |
| 3 | fujita  | nagasaki  |
| 4 | sasaki  | osaka  |
| 5 | itou  | nagano  |

例えば上のようなテーブルがあったとする。
nameが重複するレコードを取り出し、addressを確認したい。

```SQL:sql1：nameが重複しているものを選択
SELECT name FROM users GROUP BY name HAVING  count(name) > 1
```

**結果**

| name |
|:-:|
| itou |
| sasaki  |

これだとそれぞれのaddressがわからないため、この結果を踏まえて次のようにSQLを実行する。

```SQL:sql2：重複結果を踏まえて
SELECT * FROM users WHERE name IN ('itou', 'sasaki') ORDER BY name
```
**結果**

| id | name | address |
|:-:|:-:|:-:|
| 2 | itou  | fukuoka  |
| 5 | itou  | nagano  |
| 1  | sasaki | tokyo  |
| 4 | sasaki  | osaka  |

上記のようになりこれでそれぞれのaddressも取得できる。

ということでsql1とsql2を合わせて副問い合わせの形にする。

```SQL:sql3：副問い合わせ（sql1,sql2）
SELECT * FROM users WHERE name IN (
  SELECT name FROM users GROUP BY name HAVING  count(name) > 1
  ) 
ORDER BY name
```

##Railsで実装##
###結論###
以下のように書くことができる

```ruby:任意のコントローラ
duplicates = User.select(:name).group(:name).having("count(name) > 1")
@users = User.where(name: duplicates)
```
実行されるSQL

```SQL:Railsにて実行されるSQL
 SELECT "users".* FROM "users" WHERE "users"."name" IN (
   SELECT "users"."name" FROM "users" GROUP BY "users"."name" 
   HAVING (count(name) > 1)
 )
```
びっくりすることに発行されるSQLは1回になっている。

参考(かなり解りやすいです！)
[ActiveRecord の IN 演算子でサブクエリを扱う(Oakbow様)](https://qiita.com/Oakbow/items/f7d87ed69910f0cb6cfc)
Oracle CloudのVMインスタンスへインターネットから接続可能にするポイント

備忘録として。

- インスタンス に関連付けられている 仮想クラウド・ネットワーク の セキュリティ・リスト の イングレス・ルール を追加
  - ソース・タイプ: CIDR
  - ソースCIDR: 0.0.0.0/0
  - IPプロトコル: TCP
  - ソース・ポート範囲: 指定なし
  - 宛先ポート範囲: 80,443（スペースを入れると無効になるのでカンマの間は空けない）
- ファイア・ウォールのルールに上記サービスの許可を追加（http, https）
- OS: CentOS7, Webサーバー: NGINX を使用したが、SELinuxの関係で`setsebool httpd_can_network_connect on -P`の実行が必要だった。
超初心者のReact(create-react-app)基礎学習覚え書き③(Hooks)

##ReactHooksでstateを扱う
###Hook（フック）とは
・クラスの機能(stateやライフサイクル)をFunctional Componentでも使えるというもの
・１００％後方互換で、古い書き方のコンポーネントにReactHooksを使用したとしても影響を与えない

###Hook使用のメリット
####シンプルさを保てる為
**クラスコンポーネントが複雑（難しい）**
１．this.が入ることで他言語と違った挙動で使いづらい為、トレンド的に排除されようとしている
２．stateのロジックが複雑（stateだらけだと意味不明になる）
３．複数のライフサイクルメソッドにまたがる処理をまとめて記述できる

###Functional Componentでstateを使ってみる
・ステートフックと呼ばれる
・クラスコンポーネントでの
　this.stateとthis.setstate()の役割
・複数のstateを扱うときはstate毎に宣言する必要がある

####useState()の使い方例
#####１．関数のインポート

```.js
import React, {useState} from 'react';
```

#####２．宣言

```.js
const [state変数名, state変更関数名] = usestate(state初期値);
//実際には↓
const [isHoge, setIsHoge] = useState(false);
```

#####３．JSX内で使う

```.js
<input /**中略　*/ onClick={() => setIsHoge(!isHoge)} />
```

###Functional Componentでstateが使えると何がいいのか？
classコンポーネントを減らす為に上の階層がclassコンポーネントになることが多かった。それによりpropsをどんどん渡していかなければいけなかった為にコードが複雑化しやすかった。
Hookにより末端のコンポーネントでstateを持つことにより管理がしやすくなった。

##ReactHooks 関数コンポーネントでライフサイクルを扱う
###useEffect()を使用する
####メリット
・ライフサイクルの代替が可能
・Functional Componentでライフサイクルを使える（記述が減らせる）
・コードを（classComponentよりも分かりやすく）まとめれる
　→時系列ベースではなく機能ベースでまとめが可能

###useEffect()の仕組み
・レンダーごとにuseEffect()内の処理が走るようになる
・メソッドの代替が可能
　compnentDidMount()
　compnentDidUpdate()
　compnentWillUnmount()

###基本的な使い方
####①レンダーごと
・基本形でuseEffect()内にCallback関数で書く
・Callbackはレンダーごとに呼ばれる
・returnするCallback関数はアンマウント時に呼ばれる
　（クリーンアップ関数とも言う）

```.js
useEffect(() => {
  console.log('Render!')
  return () => { //アンマウント時のみ
    console.log('Unmounting!')
  }
})
```

####②マウント時のみ実行させる
・compnentDidMount()の時にだけ書いていた処理を実行するパターン
・第２引数に空の配列を渡すとマウント時（最初の一回）だのみ実行される
　→前回レンダーと今回レンダーで比較している
　（変更があった場合のみCallback関数を実行）

```.js
useEffect(() => {
  console.log('Render!')
}, [])
```

####③マウント、アンマウント時に実行する
・①と②の複合系

```.jsx
useEffect(() => {
  console.log('Render!') //マウント時のみ実行される
  return () => { //アンマウント時はクリーンアップ関数として実行される
    console.log('Unmounting!')
  }
}, []) //Updatingの期間は配列が空の為、実行されない
```

####④特定のレンダー時
・useState()と使われることが多い

```.jsx
const [limit, release] = useState(true);

useEffect(() => {
  console.log('Render!') //limitの値を変更（true→false）時に実行される
}, [limit])
```

##いいねボタンの実装

```LikeButton.jsx
import React, {useState, useEffect } from 'react';

const LikeButton = () => {
  const [count, counter] = useState(0);
  const [limit, release] = useState(true);

  const countUp = () => {
    counter(count + 1)
  }

  useEffect(() => {
    document.getElementById('counter').addEventListener('click', countUp)
    if (count >= 1000) {
      counter (0)
    }
    return () => {
      document.getElementById('counter').removeEventListener('click', countUp)
    }
  }, [limit]);

  return(
    <>
      <button id={"counter"}> 👍 {count}</button>
      <button onClick={() => release(!limit)}>もっと！！</button> {/*limitを解除するためのボタン*/}
    </>
  )
}

export default LikeButton
```
GitHub備忘録

## はじめに
・この記事はGitHubの備忘録です
・対象読者：自身・ある程度Gitの操作を知っている方向き（雑に書いているため）

##GitHubの基本操作
1. GitHubに登録（対応メールアドレスでID・PWを取得)
2. Profile画面からRepositoriesを選択
3. 右上のNewを押下してRepositoryを作成
4. 最初はReadMeもこの時チェックボックスで追加してしまう良い
5. リンクをコピーしてgit clone <リンク>

##GitHub：ローカル to リモートリポジトリの操作
git add <対象ファイル>
git commit -m 'comment'
git push origin master 
or
git push origin feature/XX

##GitHubにpushしたいのにproxyが超えられない場合の対処法
$git config --global http.proxy http://xxx.com:8080
$git config --global https.proxy http://xxx.com:8080
でgit_configファイルに書き込みを行う。
https:が必要かはproxyの設定に依存する。

##GitConfigの設定をリセットしたい場合
$git config --unset http.proxy　
$git config --unset https.proxy

##GitConfigの設定を一時的に退避したい場合
anothergitconfigというファイルを作る
$touch ~/.anothergitconfig
Alias設定を行う (Alias設定は短縮呪文みたいなもん）
$alias disableconfig='mv ~/.gitconfig ~/.anothergitconfig'
$alias enableconfig='mv ~/.anothergitconfig ~/.gitconfig'

config設定を外して使いたい場合は、
$disableconfig
その後、git add, git commit, git pushすれば良い

##設定したaliasを外したい場合
unalias diableconfigなど