OmniAICreator/Qiita-1.07M huggingface dataset:
【Ruby】ifが式であることを知るともう少しコードが綺麗になるかもしれないという話

## はじめに
Rubyのifが**式**であることを知ることで、もう少しコードを綺麗に書けることを知った。
もし、下記の例題のようなRubyのコードを書いていれば、もう少しコードを綺麗にできるかもしれない。

それでは、はじめよう。

## 例題
下記のような点数と難易度を渡すと難易度に応じて調整された点数が返ってくるメソッドがあるとしよう。

```rb:example.rb
# 点数を調整する
# @param score [Integer] 点数
# @param mode [Integer] 難易度
# @return [Integer] 調整した点数
def adjust_score(score, mode)
  if mode == 'easy'
    collection_score = 10
  elsif mode == 'hard'
    collection_score = -10
  else
    collection_score = 0
  end
  score + collection_score
end

adjust_score(100, 'easy') #=> 110
adjust_score(100, 'normal') #=> 100
adjust_score(100, 'hard') #=> 90
```

特に挙動としては何も問題はない。
このままでも動くため、このままでもいいと言われればそれまでだが、このコードにはもう少し改善の余地がある。

## ifが式だと知っていればこう書ける
Rubyのifは文じゃない**式**だ。
つまり**値を返す**ということだ。 
これを知っていると先程の例題は以下のように書ける。

```rb:example.rb
# 点数を調整する
# @param score [Integer] 点数
# @param mode [Integer] 難易度
# @return [Integer] 調整した点数
def adjust_score(score, mode)
  collection_score = 
    if mode == 'easy'
      10
    elsif mode == 'hard'
      -10
    else
      0
    end
  score + collection_score
end

adjust_score(100, 'easy') #=> 110
adjust_score(100, 'normal') #=> 100
adjust_score(100, 'hard') #=> 90
```

ifの中にあった3つの`collection_score`という記述を一つに集約できた。
この書き方にすることで、何が嬉しいのか考えてみると、

**1. 変数名を変更するときに変更する箇所が少なくなる**
**2. ifの中で代入されているかどうかを意識する必要がなくなる**

この2つが考えられると思う。
2に関しては今回の例題のようにifの中が多くなければ、それほど問題ではない。
しかし、ifの中が膨大な場合、代入されているのか、されていないのかを探し出すのは手間になるだろう。

## まとめ
Rubyのifが**式**であることを知ることで、少しコードが綺麗になる例を紹介した。
Rubyを使っている人に少しでも参考になれば幸いだ。

それではまた。
TomoProg
jTinderについて

# jTinderとは
人物、製品、画像の評価を非常に簡単かつ高速にするJavaScriptライブラリ。
モバイルタッチデバイス用に最適化されていますが、デスクトップのフォールバックも備えています。
評価を素早く行いたい場合等に役立ちます！

## 使い方
1.HEADタグの前にcssファイルを追加します。

```application.html.erb

<link rel="stylesheet" type="text/css" href="css/jTinder.css">
```

2.HTMLファイルのBODYタグの前に次を追加します。

```application.html.erb

<!-- jQuery lib -->
<script type="text/javascript" src="js/jquery.min.js"></script>

<!-- transform2d lib -->
<script type="text/javascript" src="js/jquery.transform2d.js"></script>

<!-- jTinder lib -->
<script type="text/javascript" src="js/jquery.jTinder.js"></script>

<!-- jTinder initialization script -->
<script>$("#tinderslide").jTinder();</script>
```

3.次のHTMLコードをjTinderコンテンツの本文に追加します。

```
<div id="tinderslide">
    <ul>
        <li class="pane1"><div class="img"></div><div>Miami Beach</div><div class="like"></div><div class="dislike"></div></li>
        <li class="pane2"><div class="img"></div><div>San Francisco</div><div class="like"></div><div class="dislike"></div></li>
        <li class="pane3"><div class="img"></div><div>Chicago</div><div class="like"></div><div class="dislike"></div></li>
        <li class="pane4"><div class="img"></div><div>New York</div><div class="like"></div><div class="dislike"></div></li>
        <li class="pane5"><div class="img"></div><div>Beach</div><div class="like"></div><div class="dislike"></div></li>
    </ul>
</div>
```

4.画像のCSS（jTinder.css）を変更します。

※公式ドキュメントを見ればほぼコピペするだけで大丈夫だと思います。。
## 参考
jTinderの公式ドキュメント
https://github.com/do-web/jTinder
vagrantで管理しているアプリをGItHubに連携をさせる。

# vagrantとGitHubの連携方法
###1. GitHubの準備

<img width="800" alt="スクリーンショット 2020-04-25 16.29.20.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520383/056cc1fe-f71a-3477-edef-8af55afd5507.png">

<img width="791" alt="スクリーンショット 2020-04-25 16.32.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520383/eb1c8696-3d55-ba50-4eaf-9a0c49c7b704.png">

<img width="807" alt="スクリーンショット 2020-04-25 16.33.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520383/beb4b346-f092-c08b-01e5-3fe776542a45.png">

##2. Gitの導入
・vagrantのｓｓh接続して入り、アプリディレクトリ下でリポジトリの作成

```ruby:vagrant内
$ git init
```
・Gitの変更点をコミットする。

```ruby:vagrant内
$ git add .
$ git commit -m"コミットメッセージ"
```

### 3.GitHubの連携

```ruby:vagrant内
$ git remote add origin git@github.com:GitHubの名前(ユーザ名)/リポジトリ名.git
```

これで紐づいたので、git remoteコマンドで確認。（originと表示されれば紐づいている。）

```ruby:vagrant内
$ git remote 
origin
```
これでプッシュしたら完成

```ruby:vagrant内
$ git push origin master
```

### 4.その他
・vagrant環境内では下記の方法で連携してもうまく行かないので注意が必要です。
<img width="801" alt="スクリーンショット 2020-04-25 16.51.03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520383/00e849e0-f706-0fe3-c1ff-be53e3c8ab75.png">

・間違えて上記をした場合の対応

```ruby:vagrant内
$ git remote rm origin
```
これで紐付きを解除

そして3.のGitHubの連携から行えばOK！！
ERBで'<%='の前にある空白文字を取り除くシンプルな方法は用意されていない...のか?

[リファレンス](https://docs.ruby-lang.org/ja/latest/class/ERB.html)

##### 基本形

```ruby
> ERB.new("<%= :hoge %>").result  # => "hoge"
> ERB.new("    <%= :hoge %>    \n").result  # => "    hoge    \n"
```

##### 後ろを消したい

リファレンスによれば、trim_modeを"-"にした場合、「行末が`-%>`のとき改行を出力しない」。

```ruby
> ERB.new("<%= :hoge %>\n", trim_mode: '-').result  # => "hoge\n"
> ERB.new("<%= :hoge -%>\n", trim_mode: '-').result  # => "hoge"
```

しかし、`-%>`が行末にない場合は後続のスペースも改行も消されない。

```ruby
> ERB.new("<%= :hoge -%>    \n", trim_mode: '-').result  # => "hoge    \n"
```

##### 前を消したい

リファレンスによると「行頭が`<%-`のとき行頭の空白文字を削除する」

```ruby
> ERB.new("    <%- nil %>hoge", trim_mode:  '-').result  # => "hoge"
```

`<%=`の前にある空白文字って消せないのかな？

`<%=-`, `<%-=`のように組み合わせてもダメ。

```ruby
> ERB.new("    <%=- :hoge %>", trim_mode:  '-').result
# => NoMethodError (undefined method `-@' for :hoge:Symbol)
> ERB.new("    <%-= :hoge %>", trim_mode:  '-').result
# => SyntaxError ((erb):1: syntax error, unexpected '=', expecting end-of-input)
```

どうやら`<%=`の前にある空白文字を取り除くシンプルな方法は用意されていないらしい。

[同じ疑問をもっている方](https://stackoverflow.com/questions/48985850/indentation-in-erb-templates:title)がいた。

ここで提示された解決策は以下。

```ruby
> ERB.new("    <%- %><%= :hoge %>", trim_mode:  '-').result  # => "hoge"
```

強引さが否めない...。

##### ちなみに

Railsでメールのテンプレートを"xx.text.erb"でつくっていて、

```ruby
<% @users.each do |user| %>
  <%= user.name %>
  <%= user.age %>
<% end %>
```

みたいな場合にブロック内の行頭の空白文字を消したくて方法を探してたのだけど、これってわりと一般的なニーズなのでは？

（メソッド化するとか、`<%`をインデントしないとか、やりようはいくらでもあるとおもうけど。）

githubのruby/rubyでissueを検索したけどなさそう。

issueを立てるに値する話だったらとっくに誰かがやってる気がするので、

- 実はこの問題は解決できる
- そもそもこの問題が生じるのがおかしい（やりたいことの設定がおかしい）

のどちらかな気がするけどどうなんでしょうか。
AutoHotKeyではじめてキーカスタマイズをした話

# はじめに
***ホームポジションから手を動かさずにタイピングしたい！***という文化を聞いた。
コーディングをしていて、矢印キーを押すのが面倒くさい。Backspaceキーを押そうとすると指がつりそう。という経験があったのでキーカスタマイズを行ってみることに。

# 環境
使用ソフト：AutoHotKey(ver 1.1.32.00)
キーボード：Majestouch 2(FKBN104M/EB2)

# 設定ファイル

```
; 左Altキー("無変換"の代わり) + h,j,k,l = 矢印キー(←↓↑→)
LAlt & h:: Send {Left}
LAlt & j:: Send {Down}
LAlt & k:: Send {Up}
LAlt & l:: Send {Right}

; 左Altキー("無変換"の代わり) + SPACE = Enter
LAlt & Space:: Send {Enter}

; 左Altキー("無変換"の代わり) + N or M = Backspace
LAlt & N:: Send {Backspace}
LAlt & M:: Send {Backspace}

; CapsLock = 半角/ローマ字切り替え (Alt + `)
sc03A:: 
    Send {Alt Down}
    Send {sc029 Down}
    Send {sc029 Up}
    Send {Alt Up}
    return
```

### 備忘録
* ``` #KeyHistory ``` を記入すると、キーボード入力のログが取れる
* ログの確認方法：exeファイルではなく、右下のメニューから開く -> view -> key history and script info
* 仮想キーコード(VK)を追加するとエラーを吐く
* スキャンコード(SC)のみなら成功する
* Alt + \` を```!sc029```と書くと切り替えは成功するが、カーソルが消える

### 感想
***スペースキーが大きい！！！***
半日でとりあえず動くものができた。

### 参考URL
[キーリスト](http://ahkwiki.net/KeyList#Key_CapsLock)
[Sendコマンド](http://ahkwiki.net/Send)
[enthumble Readme 【説明書】](https://qiita.com/mhara/items/d2d072592a4db9243c99)
tomcat8.5 では起動時に /WEB-INF/ 以下のTLDファイルを探索する

#現象
tomcat7 から tomcat8.5に移行した際、起動に時間がかかるようになった。

#原因
tomcat8.5 では起動時には、/WEB-INF/以下のTLDファイルを探索する。
/WEB-INF/以下に多くのファイルが存在している、または、シンボリックリンクでネットワーク上のファイルを参照しているような場合では起動に時間がかかってしまう。

#ソース
org.apache.jasper.servlet.TldScanner クラスの、220行目の、scanResourcePaths メソッドで、
サブディレクトリを再帰的に探索しているようです

```java

protected void scanResourcePaths(String startPath)
            throws IOException, SAXException {

　　　　boolean found = false;
　　　　if (dirList != null) {
            for (String path : dirList) {
                if (path.startsWith("/WEB-INF/classes/")) {
                    // Skip: JSP.7.3.1
                } else if (path.startsWith("/WEB-INF/lib/")) {
                    // Skip: JSP.7.3.1
                } else if (path.endsWith("/")) {
                    scanResourcePaths(path);
                } else if (path.startsWith("/WEB-INF/tags/")) {
                    // JSP 7.3.1: in /WEB-INF/tags only consider implicit.tld
                    if (path.endsWith("/implicit.tld")) {
                        found = true;
                        parseTld(path);
                    }
                } else if (path.endsWith(TLD_EXT)) {
                    found = true;
                    parseTld(path);
                }
            }
        }
```
【備忘録】CodeCommitでレポジトリ作った後、VSCodeでどうすんだっけ？のメモ【とっとと】

CodeCommit でレポジトリ作成した後、Cloneしろって出てくるが、Cloneしただけじゃダメなんで続きを書いておく

ローカルPCで、
git clone https://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/ppppppppp
cd できたディレクトリ（.gitフォルダがあるところ）

| |  |
| ---- | ---- |
| echo hoge > readme.md | 最初のファイルを作る |
|git add * | add する |
|git commit -m "first Commit" | コミットする |
|git push | PUSHする |
| |  |

で
VSCodeで対象フォルダを開く
Ubuntu 20.04にOpenJDK 11をインストール（OS標準）

# はじめに

Ubuntu20.04にOpenJDKを標準インストール
親記事：[OpenJDKの各種インストール方法とEOLまとめ](https://qiita.com/witchcraze/items/b179202216aab50b7090)

## サポート

[Java Is Still Free](https://docs.google.com/document/d/1nFGazvrCvHMZJgFstlbzoHjpAVwv5DEdnaBr_5pKuHo/edit?usp=sharing) ([日本語版](https://docs.google.com/document/d/1HtUnuAkUEDGL2gwUOkrDrmLe_zrD6wpAyqYBZxRmHv4/edit?usp=sharing))では、”At least through Sept 2025” という記載がある。
ただしOSのEOLが2025-04のため、本手法で導入した場合2025-04がEOLになると思われる。
それ以降に報告された脆弱性や不具合への対応は実施されない可能性がある。

Extended Security Maintenanceで保守されるか不明。（過去バージョンでは保守されなかった）
[SecurityTeam/ESM/20\.04 \- Ubuntu Wiki](https://wiki.ubuntu.com/SecurityTeam/ESM/20.04) に記載される見込み。


## LOG

### インストール

```shell-session
# cat /etc/os-release
NAME="Ubuntu"
VERSION="20.04 LTS (Focal Fossa)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 20.04 LTS"
VERSION_ID="20.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=focal
UBUNTU_CODENAME=focal

# apt update;apt install -y openjdk-11-jdk
... 略
```

### 各種確認

```shell-session
# which java
/usr/bin/java

# java -version
openjdk version "11.0.7" 2020-04-14
OpenJDK Runtime Environment (build 11.0.7+10-post-Ubuntu-3ubuntu1)
OpenJDK 64-Bit Server VM (build 11.0.7+10-post-Ubuntu-3ubuntu1, mixed mode, sharing)
```
[Rails]enumについて

# enumとは
ActiveRecordに定義されているメソッド。 enumを使うと、プログラムからは文字列でアクセスでき、データベースには整数値で保存される属性を作成できるメソッド。

##記述例
まず、「status」カラムをinteger型で作成する。

```20×××××××××××.rb
class CreateArticles < ActiveRecord::Migration
  def change
    create_table :articles do |t|
      t.integer :status, default: 0, null: false, limit: 1
      t.timestamps null: false
    end

    add_index :articles, :status
  end
end
```


次に、enum、属性名、属性の値（ハッシュ）で指定する。

```user.rb

class Article < ActiveRecord::Base
  enum status: { draft: 0, published: 1 }
end
```

##enumに使えるメソッド
enumで定義したハッシュのキー名+?とすることで、そのキーの値が設定されているか確認出来る。
また、キー名+!で新たに値を設定し、DBに保存出来る。

```ruby

# articre.status = draftとした場合
article.draft? 　　　　　# trueを返す

article.published!　　　# 新たに値を設定
```
【UE4】どこからでも呼び出せるクラスの実装方法【UnrealEngine】【Singleton】

今回はUE4でどこからでも呼びだし扱うことのできるクラスを実装したいと思います。
結論から言うとUE4のGameInstanceクラスの中に呼び出したいクラスを所有させます。

そもそもGameInstanceとはクラス
--------
UE4に備わっていて、ゲームの起動から終了までずっと情報を保持し続けるクラスで、
インスタンスを取得する関数を作れば何処からでも呼び出すことが出来ます。

(レベルをまたいでも使うパラメータなどによく使われる)

1.GameInstanceの中にゲーム中常に使用したいクラスをメンバに加える
---------------

####※UPROPERTYを頭に必ず書くこと
書き忘れるとUE4側でレベルを切り替える際にGCで勝手にメモリを消されてします
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497331/eff3cf88-6dcd-2c04-7f3d-265e8bb723cc.png)


2.初期化と削除時にクラスの生成と解放を行う　
---------------
GameInstance専用の仮想関数があるのでオーバーライドして
Initでクラスの生成を行い　Shutdownでクラスを解放を行う

![2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497331/0ad863b9-c849-a35b-c140-c67573d77023.png)

####これで後はGameInstanceを経由してクラスを参照すればどこでも呼び出せるクラスの完成

おわりに
---------------------------
自分でSingletonパターンでクラスを実装したり新機能のSubsytemなど使って色々試してみたのですが。
この方法が簡単で分かりやすく勧めれそうでした。
りばうしをリスペクトして一定時間ごとにシャッフルされるリバーシを作った時に得た知見について

###記事概要
制作過程を載せるのではなく、
制作にあたって得た知見を共有して欲しいという意見をツイッターで見たので、
制作過程については一切触れずに完成品と得た知見について書こうと思った。

###完成品
https://github.com/sakaku193/shuffleReverse


###得た知見
JavaScriptにおいて配列のswapを行う際は以下の書き方が出来る。
`[array[j], array[i]] = [array[i], array[j]];`

配列内のとある条件を満たす要素の数を数えたい場合以下の書き方が便利。
`array.filter((e=>{return e == hoge})).length`


以上。
Unityを使ってクリエィティブなゲームを作れるようになるまで。（1日目）

# 簡単な自己紹介
SIerに勤めるしがないエンジニア。

C#、python、java、node.js、javascript、typescript、coffeescriptで広く浅く開発経験あり。
自分で手を動かしたことがなく、何となく読めるが書けない。
ようするに自分から何かを生み出すことができない。

Qiitaを通じてUnityで学んだことを共有しようと思ったきっかけは、
自分の成果をアウトプットし、知識として物にしたいから。

そして何より、アウトプットできる人間が**カッコいい**と思えるから！！

# 何を作るのか
さあ何を作ろうかと思ってQiitaを調べてみたら、
[https://qiita.com/nmxi/items/7950fb12ef925efa276d](https://qiita.com/nmxi/items/7950fb12ef925efa276d)がかなり纏まっていたため参考にすることにしました。

こちらではブロック崩しゲームの作成手順が事細かに記載されており、
まずは手順をトレースし自分の環境でも実現できるかを試してみました。

# ブロック崩しゲーム作成
こんな感じのものができた！！！
すごい！！！
![brock=kuzushi.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625289/4d5c975b-b860-02cf-43a2-aed8b8e3830b.gif)

# 感想
こんなに簡単に動くものが作れるとは思わなかった。
継続的にゲームを作成し、クオリティを高めていきたい。
ゆくゆくはスマホ用にビルドしてリリースなんてことも、、🤔
Ubuntu 20.04にOpenJDK 8(1.8)をインストール（OS標準）

# はじめに

Ubuntu20.04にOpenJDKを標準インストール
親記事：[OpenJDKの各種インストール方法とEOLまとめ](https://qiita.com/witchcraze/items/b179202216aab50b7090)

## サポート

[Java Is Still Free](https://docs.google.com/document/d/1nFGazvrCvHMZJgFstlbzoHjpAVwv5DEdnaBr_5pKuHo/edit?usp=sharing) ([日本語版](https://docs.google.com/document/d/1HtUnuAkUEDGL2gwUOkrDrmLe_zrD6wpAyqYBZxRmHv4/edit?usp=sharing))では、”At least through Sept 2023” という記載がある。またOSのEOLは2025-04となる。
ただし[Announcing OpenJDK 11 packages in Ubuntu 18.04 LTS | Ubuntu](https://ubuntu.com/blog/announcing-openjdk-11-packages-in-ubuntu-18-04-lts)によると、Ubuntu18.04は2021-04までの保守になる模様。
Ubuntu20.04での保守期間がどうなるかは不明。

## LOG

### インストール

```shell-session
# cat /etc/os-release
NAME="Ubuntu"
VERSION="20.04 LTS (Focal Fossa)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 20.04 LTS"
VERSION_ID="20.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=focal
UBUNTU_CODENAME=focal

# apt update;apt install -y openjdk-8-jdk
... 略
```

### 各種確認

```shell-session
# which java
/usr/bin/java

# java -version
openjdk version "1.8.0_252"
OpenJDK Runtime Environment (build 1.8.0_252-8u252-b09-1ubuntu1-b09)
OpenJDK 64-Bit Server VM (build 25.252-b09, mixed mode)
```
dockerでよく使うコマンド(自分用)

##備忘録（完全自分用）

**ログインコマンド**

```
$ docker login -u (DockerのID) -p (Dockerのパスワード)
```

**稼働しているコンテナの確認**

```
$ docker ps 
or
$ docker container ls 
CONTAINER ID        IMAGE                       COMMAND                  CREATED             STATUS              PORTS                    NAMES
764ed8babe90        jun3030/dockerrepo:latest   "go run /echo/main.go"   37 minutes ago      Up 2 minutes        0.0.0.0:9000->8080/tcp   frosty_einstein
```

**稼働しているコンテナ含め全てのコンテナの確認**

```
$ docker ps -a
CONTAINER ID        IMAGE                       COMMAND                  CREATED             STATUS                     PORTS                    NAMES
764ed8babe90        jun3030/dockerrepo:latest   "go run /echo/main.go"   5 minutes ago       Up 5 minutes               0.0.0.0:9000->8080/tcp   frosty_einstein
33cb9e8d1d8b        first_docker:latest         "go run /echo/main.go"   19 hours ago        Exited (255) 2 hours ago   0.0.0.0:9000->8080/tcp   gracious_taussig
54c14f873d36        first_docker:latest         "go run /echo/main.go"   19 hours ago        Exited (2) 19 hours ago                             funny_moore

statusの欄に Up 5 minutes とあるのが稼働中のコンテナ
```

**コンテナの起動**

```
$ docker start コンテナのID
or
$ docker container run -d -p 9000:8080 jun3030/dockerrepo:latest

-d = バックグラウンドで実行
-p = ポートの指定 ホスト 9000 コンテナ = 8080
jun3030/dockerrepo = image
latest = タグ名
```

**コンテナの停止**

```
$ docker stop コンテナのID
```

**アプリが稼働しているか確認**
この場合-pオプションでホスト側の9000ポートからコンテナ側の8080ポートへポートフォワーディング出来るようにしている為、次のようにHTTPリクエストを発行できる。

```
$ curl http://localhost:9000/

Hello Docker!!
```

**イメージのビルド**

```
$ docker image build -t イメージ名:タグ名 Dockerfile配置ディレクトリのパス

-t = 名前をつけるときに使う
-f = docker image build コマンドはデフォルトでDockerFileというドッカーファイルを探しに行きます。そうでない名前のdouckerFileを利用する場合に-fを使用する。
Dockerfile配置ディレクトリのパス = ディレクトリにDockerfileがないと実行出来ない

```
【Excel】小数点以下がある時だけ表示する方法。


# やりたいこと
社内でこんな依頼を受けました。この記事はその時の設定方法を記録するためのものです。


> 小数点以下がある場合は小数点以下を表示したいが、小数点以下が0の場合は小数点以下を表示したくない。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342467/e2a01e16-d7e7-17f3-cc4f-1eae7950c8c8.png)
↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342467/d109eced-7168-523e-512b-d4c204cbf9f2.png)


# やり方　概要
上記だけを実現するのであれば、セルの”表示形式”をデフォルトの”標準”にしておけば要件通りになります。
しかし、標準の表示形式ですとカンマ区切りや、負の数のときに赤字表示にしたりが出来ません。

上記の要件を満たして、カンマ区切りもしたい場合は少し工夫しなければならないようです。
調べたところ下記のようにするのがよさそうでした。

```
1. 基本の書式設定[小数点以下表示・桁区切り]を、列全体に行う
2. 例外の書式設定[小数点以下0だったら小数点以下表示しない・桁区切り]を、条件付き書式を用いて、列全体に行う
```




# やり方　詳細

##1. 基本の書式設定を、列全体に行う

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342467/95ff6c4d-66ff-8a11-82da-8f141c31a097.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342467/08556936-9225-f512-6aef-8e14981cd759.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342467/13ba23c3-2fa6-d75f-ab1b-64bdd7aa9a2c.png)
↑小数点以下が表示されました。



##2. 例外の書式設定を、条件付き書式として、列全体に行う

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342467/88aff08b-0890-5152-8b7a-743f66d4d6ec.png)
条件付き書式を作成する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342467/aa9abd1c-3bfb-5b85-86ee-d2ce787294d5.png)
条件付き書式の数式を入力する。

小数点以下が0かどうかを判定する数式はいくつありますが、今回は下記を使用します。

```:1で割った時の余りが0かどうか
=MOD($E3,1)=0
```


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342467/6efd6c59-962a-ab10-55db-1ac1870f916d.png)
条件付き書式の書式を設定する

##3.おしまい

# 参考

下記サイトを参考にしました。

社内SEの徒然なる日記
http://harikofu.blog.fc2.com/blog-entry-792.html?sp
Mac OS Catalinaで、ISOファイルからDVDに書き込みしようとしたら、「ディスクイメージが無効です」になってもあきらめない

# Mac OS Catalinaで、ISOファイルからDVDに書き込みしようとしたら、「ディスクイメージが無効です」になる時どうするか

コマンドラインだと何故かうまくいく！

DVDをドライブに入れた状態で

hdiutil burn [ISOファイル]

こんな感じ！
動的にGoogle Mapを複数表示する機能を実装しました

作成した記事内に住所が記載されている場合には、その住所にピンを立ててGoogleMapを表示する機能を実装しました。
ページ内でいくつのGoogle Mapが表示されるかわからないので動的に対応できる必要があります。

#前提
- Google Maps Javascript APIを使用できる状態にある

#環境
Ruby 2.6.3
Rails 5.1.7

#実際のコード
```erb:_article.html.erb
<li id="article-<%= article.id %>">
  <% if article.address.present? %>
    <div>
      <span>
        住所：<span id="address-<%= article.id %>"><%= article.address %></span>
      </span>
    </div>
    <div id='map-<%= article.id %>'>
    </div>
    <script>
      $(document).on('turbolinks:load', function() {
        const geocoder = new google.maps.Geocoder();

        const map = new google.maps.Map(document.getElementById('map-<%= article.id %>'), {
          center: {lat: -34.397, lng: 150.644}, //任意の値
          zoom: 12 //任意の値
        });

        const inputAddress = document.getElementById('address-<%= article.id %>').textContent;

        geocoder.geocode( { 'address': inputAddress}, function(results, status) {
          if (status == 'OK') {
            map.setCenter(results[0].geometry.location);

            const marker = new google.maps.Marker({
              map: map,
              position: results[0].geometry.location
            });
          } else {
            alert('Geocode was not successful for the following reason: ' + status);
          }
        });
      });
    </script>
  <% end %>
</li>
```
```scss:application.css.scss
div[id^="map-"]{
    height: 300px; //任意の値
}
```
```erb:application.html.erb
<html>
  <head>
  ...
  </head>
  <body>
    <script src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY"></script>
    <%= yield %>
  </body>
</html>
```
#ポイント
##1. Google Mapや住所に一意のidを割り当てる
・_article.html.erb 8行目

```erb
<div id='map-<%= article.id %>'>
```
各Mapに一意のidを割り当てるために、記事のidを付随させました。
そしてそのidに対応するMapを作成します。

・_article.html.erb 14〜17行目

```javascript
const map = new google.maps.Map(document.getElementById('map-<%= article.id %>'), {
  center: {lat: -34.397, lng: 150.644}, //任意の値
  zoom: 12 //任意の値
});
```

同様に、記事の住所にも一意のidを付与し、その文字列を取得できるようにしています。

また、それらのidに対してそれぞれstyle(heightやwidth等)を適用させる必要があります。
調べてみると、cssでは前方一致等、簡単な正規表現が使用できるそうなので以下の設定としました。

```scss:application.css.scss
div[id^="map-"]{
    height: 300px; //任意の値
}
```
id^="map-" とすることで、"map-"から始まる任意のid（例：map-1, map-hoge等）が付与されたdivタグに対しstyleを適用できます。

参考：
[CSSでセレクターに正規表現を使うには？コード例で解説](https://pisuke-code.com/css-how-to-use-regexp/)

##2. GoogleMapsAPIを使用するためのスクリプトをMap生成コードより手前に置く
・application.html.erb 5〜8行目

```erb
<body>
  <script src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY"></script>
  <%= yield %>
</body>
```
ページ内で表示させるMapが1つである場合等は、scriptのsrcにコールバック関数を指定して実行するのが一般的なようです。
その場合はMapsAPIを使用するためのスクリプトをMap生成コードの下に置くことになると思いますが、今回のように、ある条件下ではMapが生成されるような、動的に表示数が変化する場合は1つのコールバック関数では対応できないのでMap生成コードより手前で、あらかじめGoogleMapsAPIを使用できる状態にしておきます。

##3. ページ読み込み時にMap生成を実行する
コールバック関数は使わないので、代わりに以下関数でページが読み込まれたら（turbolinksがロードされたら）即実行されるようにします。

```javascript
$(document).on('turbolinks:load', function() {
  //処理内容
});
```

#終わりに
最後までお読みくださりありがとうございました。
どなたかの参考になれば幸いです。
[Rails]画像のリサイズ方法について

# 背景
画像サイズが大きすぎたためリサイズする方法を探したものをまとめました。
(gemのcarrierwaveとMiniMagickを導入してます。)

## メソッド
####・ resize_to_fit(width, height)
[例]

```image_uploader.rb

  version :thumb do
    process resize_to_fit: [400, 400]
  end
```

####・ resize_to_limit(width, height)
resize_to_fitとほぼ同じなのですが、対象の画像のサイズが引数に指定した縦横サイズ以内だとリサイズされません。
それと、リサイズ後、ファイルの余白部分を指定した色で塗りつぶすことが出来る。
第３引数で塗りつぶしする色を指定し、第４引数で余白が発生した場合の画像の配置を指定する。

[例]

```image_uploader.rb

  version :thumb do
    process resize_to_limit: [400, 400, "#00eeff", "Center"]
  end
```


####・ resize_to_fill(width, height, gravity)
このメソッドは上記２つと違い、縦横比を維持せずに元画像から、 width〇〇px, height〇〇pxで切り抜きを行い、第３引数で切り抜きを行う際の中心点を指定する。

[例]

```image_uploader.rb

  version :thumb do
    process resize_to_fill: [150, 150, "Center"]
  end
```


他にもいくつかありましたがこれらを使いこなせれば、おそらくリサイズに関してはバッチリでしょう！！
【AWS】S3 SelectでS3のファイルから必要なデータを検索して取得する

##やりたいこと
S3 Selectを使用してS3のファイルにSQLクエリで検索をかけて必要なレコードを取得したい。
<img width="500" alt="Qiita logo" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328551/86d70114-0e59-db92-4978-089bdd04d32d.png"> 

##嬉しいこと
+ S3のファイルから対象データをサクッと調べたいときに便利。
+ クエリ検索するにはデータベースに入れる必要があったが、それが不要になる。
+ API GatewayやLambdaなどと組み合わせることによって、S3のデータに対してのサーバーレスなアプリケーションを構築できる。

##S3 Selectのポイント
+ S3上の1ファイルを対象にしている。
+ ファイル形式はCSV、JSON、Apache Parquet形式に対応している。
+ GZIP、BZIP2の圧縮形式に対応している。
+ AWS SDKやAWS CLIからのSQLクエリにも対応している。
+ 料金は「スキャンしたデータ量＋返却したデータ量」での課金となるため、対象となるファイルは圧縮しておいた方がよさげ。

## S3のコンソール画面から操作してみる
今回は以下の形式のサンプルファイルをS3に配置して検証します。

```:sample.tsv
male	14	student
female	26	employee
male	32	selfemployed
male	45	unemployed
female	11	student
male	24	employee
male	33	selfemployed
male	49	unemployed
female	57	unemployed
```

S3のコンソール画面から対象のファイルを選択し、S3 Selectのタブを選択。
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328551/3f3dd3b4-70fc-da39-982e-435c41b18746.png)


ファイル形式：CSV
区切り文字：タブ
圧縮：なし
「次へ」
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328551/9f0aec9b-4e3b-40f4-d4cd-5af725499200.png)


実行したいSQLを入力します。
1カラム目が「female」のレコード取得したいと思います。

```:SQL
select * from s3object s where s._1 = 'female'
```

![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328551/664d3d1d-ae4d-5210-3f43-1023a0d631d0.png)
ちゃんと取得できました。
「ダウンロード」をするとCSVファイルとしてダウンロードできます。

サンプルのSQLがいくつかあるので、試してみてください。
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328551/3c874794-3225-6fb3-747b-8eb148f4926f.png)


## EC2インスタンスからPythonでSQLクエリを実行する

EC2インスタンスからPythonでSQLクエリを実行するパターンも試してみます。
まずは、必要となるPythonのインストールを行います。

```
# Python3をインストール
$ sudo yum update -y
$ sudo yum install python3 -y

# 仮想環境の有効化
$ python3 -m venv ~/s3select_example/env
$ source ~/s3select_example/env/bin/activate

# boto3をインストール
$ pip install pip --upgrade
$ pip install boto3
```

次にPythonファイルを作成します。

```python:S3Select.py
import boto3

s3 = boto3.client('s3')

resp = s3.select_object_content(
    Bucket='my-bucket.01',
    Key='sample/sample.tsv',
    ExpressionType='SQL',
    Expression="SELECT * FROM s3object s where s._1 = 'female'",
    InputSerialization = {'CSV': {"FileHeaderInfo": "NONE", 'FieldDelimiter': '\t'}, 'CompressionType': 'NONE'},
    OutputSerialization = {'CSV': {}},
)

for event in resp['Payload']:
    if 'Records' in event:
        records = event['Records']['Payload'].decode('utf-8')
        print(records)

```

BucketとKeyはS3の読み込むファイルに合わせてください。
あと、今回の対象ファイルがタブ区切りなので、InputSerializationのFieldDelimiterには「'\t'」を指定しています。

それでは実行してみましょう。

```
$ python S3Select.py

female,26,employee
female,11,student
female,57,unemployed
```

コンソール画面から実行した結果と同じレコードが出力されました！

今回は、S3のファイルをSQLクエリで直接検索して、対象のレコードを取ってくることを行いました。
S3のファイルに対して調査を行うことがあったりするので、機会があれば使っていきたいと思います。

参考: https://aws.amazon.com/jp/blogs/news/querying-data-without-servers-or-databases-using-amazon-s3-select/
学生ならAWSを無料で使える！？ AWS Educateについて使いながら調べてみた

# はじめに
コロナの影響で家に幽閉されている大学生です。

みんな大好きAWS(Amazon Web Services)ですが、先日1年間の無料期間が終了してしまいました。何度かインスタンスの容量を超え、お財布からお金が勝手に消えていきましたが、それはいいとして、この手のサービスは学生用料金だとか、サービスがあるので調べてみたら「AWS Educate」なるものがありました。(もっと早く知りたかった...)

もしかしてあまり知られていないのでは...とも思ったので、実際に使ってみて、いろいろ記していきたいと思います。また何かあれば随時追記していきますね。(^▽^)

# AWS Educateってなんぞや
学生としてAWSのサービスを使うことのできる制度です。ホームページはこちら。
[AWS Educate](https://aws.amazon.com/jp/education/awseducate/)

ここで一つ大切なことがあります。__AWSのサービスを使い放題ということでは決してありません。__

AWS Educateの主なサービスというか、特典は、__AWSの学習コンテンツが使い放題__ということです。
AWS上には、それぞれのサービスの使い方を知ることのできる学習コンテンツが充実しています。普段は有料であるそれらのオンラインセミナーを無料で受けられるというのが主なサービスです。

その中で、実際にAWSのサービスを運用してみてね！といった意味合いでAWSの各種サービスを利用できるというわけです。

# とりあえず登録
AWS Educateの一つの利点。それは__クレジットカードの登録が不要__であることです。

まずはあなたの学校が加盟校にリストされているかを確認します。
[AWS Educate 加盟校リスト](https://s3.amazonaws.com/awseducate-list/AWS_Educate_Institutions.pdf)

[こちら](http://www.awseducate.com/registration)のサイトから登録手続きを行えます。

### 加盟校に登録されてない人
顔写真付きの学生証のコピーを送る必要があります。

### 加盟校に登録されている人
学校から支給されるメールアドレス ~@s.hoge-u.ac.jp などで登録してください。学生証などは必要ありません。


登録が終わったら、審査が入ります。よほどのことがない限り審査は通りますので安心してください。数日後に審査が通った旨のメールが登録メールアドレスに送信されます。

ここでもう一つ。__通常のAWSコンソールログイン画面からはログインできません。__

[AWS Educate専用サイト](https://www.awseducate.com/student/s/)からサインインする必要があります。

# AWS Educateの主要サービス
先ほども述べたように、主要サービスは学習です。サインインした画面から、Career Pathwayを選択することで、各種サービスの講習を受けることができます。それぞれ、解説=>理解度チェックの流れで10時間弱で習得することができます。日本語にも対応していますので、英語が苦手な私みたいな人でも安心です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275720/0f572070-bf2f-32d0-a5ea-22e8e2d669b1.png)

# AWSコンソールの使用

さて、~~ここからが本題です。~~__学習用に用意された__AWSのサービスを利用しましょう。サインインした画面から、AWS Accountsを選択することでAWSコンソールにアクセスすることができます。

まず、Vocareumの画面に遷移すると、自分の所有しているクレジットが表示されます。AWS Educateでは、通常支払うべきAWSサービスの使用料金をこちらのクレジットから支払うことができます。(もちろんAWSにしか使用することはできません。)

__加盟校の学生は年間100米ドル、非加盟校の学生は年間30米ドル受け取ることができます。__

ここで注意したいのが、__初めの1年間であっても、無料枠の利用はできません。__AWSの料金のページを見てもらうとわかるように、登録後12か月間のみ無料の枠があるサービス(EC2やRDSなど)と、常に無料枠があるサービス(Lambdaなど)があります。前者の無料枠は利用できないことに注意してください。後者の無料枠は利用することができます。そのため、EC2のインスタンスを起動しっぱなしにすればその分クレジットは減っていきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275720/e5a05cef-85e0-fd49-7b41-4f7f07fda68e.png)


# AWS Educateの制限
EducateからサインインしたAWSアカウントは通常のアカウントとは異なり、IAMユーザー(グループのメンバー)としてサインインされます。そのため、いくつかの制約があります。まず、すべてのAWSサービスにはアクセスできず、それぞれのサービスのインスタンスにも制約があります。
[こちら](https://awseducate-starter-account-services.s3.amazonaws.com/AWS_Educate_Starter_Account_Services_Supported.pdf)から確認することができます。

また、クレジットがどのように使用されたかを知ることができません。これには私も結構悩みました。ちなみにですが、__最安のEC2インスタンスであるt2.microでも、100ドルでは一年間動かし続けることはできません。__　
そのため、継続的な利用を考えるのであれば、AWS Educateの利用はお勧めしません。__あくまで学習用__ということを忘れないでください。

クレジットの使用内訳ですが、一応、サポートセンターにメールすることで確認することができます。

>$1.33 was deducted for using Linux t2.micro for 115.000 Hrs
>$0.12 was deducted for using General Purpose SSD (gp2) provisioned storage
>$2.09 was deducted for using RDS db.t2.micro instance for 123.154 Hrs
>$0.39 was deducted for using provisioned RDS GP2 storage

こんな感じで丁寧に教えてくれます。~~じゃあはじめからみれるようn~~

# 最後に
えっAWS無料で使えるの！！と思っていましたが、使ってみると案外そうでもありませんでした。しかし、学習コンテンツはとても充実しています。コロナの影響で暇を持て余している大学生の方は、これを機にAWSを触ってみるのもいいかもしれませんね。
Windows10：Hyper-VでCentOS8インストール

#はじめに
Windows10 Hyper-vにCentOS８のインストールをメモします。

#ダウンロード
URL: https://www.centos.org/download/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346425/63209482-e83e-1c24-0929-4e2a14ac54bc.png)

DVD　ISOをダウンロード

#Hyper-Vにて仮想マシンを新規作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346425/20487c06-964b-a44c-3ebe-8d4148de3f34.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346425/2d624e8f-11f4-d871-0177-f375f9553984.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346425/db43d7a2-f30f-cafc-af37-daefb2df0493.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346425/7673bb75-f99c-4950-a619-cada73e4fda5.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346425/897aa67f-c822-a684-d0e5-32f571c30f1a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346425/0ad6d247-88f3-ff66-b373-4b738fba34cf.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346425/91542592-15e2-b81c-1ecc-8707182badb7.png)


#インストール
１．「セキュアブートを有効にする」をOFFにする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346425/014074a4-93d1-9008-91f6-234153eddf80.png)


２．起動して、Install CentOS Linux8 を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346425/5147be4f-1ad2-8054-6f69-7d11bbfc2d82.png)

３、言語を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346425/664d5050-7aaa-3d00-387a-6116b9dcb03d.png)

４、設定変更
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346425/7af192aa-c5cd-7e5f-59ac-d2784ce398d8.png)

ネットワーク：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346425/d845c0d7-7864-f394-02b5-8491ca21250d.png)

ソフトウェア選択：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346425/d3cb2021-a44e-3663-c7d2-693df91c0ade.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346425/7c56d4c9-2987-456b-4435-d604d5f45ea4.png)

４、ユーザー設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346425/68c80e93-639c-a572-41db-874f3c38337b.png)

#インストール完了後再起動
ライセンス同意：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346425/815c8d06-b737-b953-92c2-c0eb59b8e5bd.png)

ログイン後：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346425/b2778bca-19d0-187f-ee02-ee36576687e7.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346425/84309327-ba4c-a75e-bd3b-f1ffdc64ebc3.png)

Firefoxでネットワークアクセス確認：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346425/5d012cb0-d791-4b67-72da-8a90fa3569e3.png)

ネットワークも正常なので一旦インストール成功です。

以上
Ubuntu 20.04にPHP-FPM 7.4をインストール（OS標準）

# はじめに

Ubuntu20.04にPHP-FPMを標準インストール
親記事：[PHP, PHP-FPMの各種インストール方法とEOLまとめ](https://qiita.com/witchcraze/items/dfe3823554b7caba6f6a)

## LOG

### インストール

```shell-session
# cat /etc/os-release
NAME="Ubuntu"
VERSION="20.04 LTS (Focal Fossa)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 20.04 LTS"
VERSION_ID="20.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=focal
UBUNTU_CODENAME=focal

# apt update;apt install -y php-fpm
... 略
```

### 各種確認

```shell-session
# which php
/usr/bin/php

# which php-fpm7.4
/usr/sbin/php-fpm7.4

# php -v
PHP 7.4.3 (cli) (built: Mar 26 2020 20:24:23) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
    with Zend OPcache v7.4.3, Copyright (c), by Zend Technologies

# php-fpm7.4 -v
PHP 7.4.3 (fpm-fcgi) (built: Mar 26 2020 20:24:23)
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
    with Zend OPcache v7.4.3, Copyright (c), by Zend Technologies

# apt show php-fpm
Package: php-fpm
Version: 2:7.4+75
Priority: optional
Section: universe/php
Source: php-defaults (75)
Origin: Ubuntu
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
Original-Maintainer: Debian PHP Maintainers <team+pkg-php@tracker.debian.org>
Bugs: https://bugs.launchpad.net/ubuntu/+filebug
Installed-Size: 13.3 kB
Depends: php7.4-fpm
Download-Size: 2792 B
APT-Manual-Installed: yes
APT-Sources: http://archive.ubuntu.com/ubuntu focal/universe amd64 Packages
Description: server-side, HTML-embedded scripting language (FPM-CGI binary) (default)
```
reactでawait axiosしてexpressでparameter取得する方法


## react

```js
      try {
        let res = await axios({
             url: `http://localhost:3000/get_user?token=${Cookies.get('your_token')}`,
             method: 'get',
             timeout: 8000,
             headers: {
                 'Content-Type': 'application/json',
             }
         })
         // eslint-disable-next-line eqeqeq
         if(res.status == 200){
             // test for status you want, etc
             console.log(res.status)
         }    
         // Don't forget to return something   
         return res.data
     }
```

## node | express 

```js
    app.get('/get_user', function(req, res) {
      console.log("ユーザーid取得");
      console.log(req.query.token);
      User.findOne({token: req.query.token}, function(err,obj) { 
        res.json(obj);
      });      
    });
```

## 参考

[How to access the GET parameters after “?” in Express?
](https://stackoverflow.com/questions/17007997/how-to-access-the-get-parameters-after-in-express)
[Get response from axios with await/async](https://stackoverflow.com/questions/49661209/get-response-from-axios-with-await-async)
[Ruby]%記法について

# 背景
アプリ制作時、調べ物をしている際に「%i~」という記述を見て何かと気になったため調べた。
その内容を簡単にまとめて備忘録として記載することにしました。

## ％記法とは
文字列リテラル、コマンド出力、正規表現リテラル、配列式、シンボルでは、 %で始まる形式の記法を用いることができ、それを「％記法」と言います。
文字列や正規表現では、`"', `/' など(通常のリテラルの区切り文字)を要素に含めたい場合にバックスラッシュの数をコードから減らす効果がある。また配列式では文字列の配列やシンボルの配列を簡単に表現できます。

###記法一覧

```ruby

%!STRING!  # ダブルクォート文字列
%Q!STRING! # 同上
%q!STRING! # シングルクォート文字列
%x!STRING! # コマンド出力
%r!STRING! # 正規表現
%w!STRING! # 要素が文字列の配列(空白区切り)
%W!STRING! # 要素が文字列の配列(空白区切り)。式展開、バックスラッシュ記法が有効
%s!STRING! # シンボル。式展開、バックスラッシュ記法は無効
%i!STRING! # 要素がシンボルの配列(空白区切り)
%I!STRING! # 要素がシンボルの配列(空白区切り)。式展開、バックスラッシュ記法が有効

```

!の部分には改行を含めた任意の非英数字を使うことができる (%w、%W、%i、%I は区切りに空白、改行を用いるため、!の部分には使うことができない)。
始まりの区切り文字が括弧(`(',`[',`{',`<')である時には、終りの区切り文字は対応する括弧になります。
括弧を区切り文字にした場合、対応が取れていれば区切り文字と同じ括弧を要素に含めることができます。


###記法実例

```ruby
%w(foo bar baz)               # 要素が文字列の配列(空白区切り)
['foo', 'bar', 'baz']

%w(foo\ bar baz)        　　　 # バックスラッシュを使って空白を要素に含める
=> ["foo bar", "baz"]

v = "c d"
%W(a\ b #{v}e\sf #{})         # 式展開、バックスラッシュ記法が使用できる
=> ["a b", "c de f", ""]

```

## 参考
Ruby 2.7.0 リファレンスマニュアル ＞ リテラル
https://docs.ruby-lang.org/ja/latest/doc/spec=2fliteral.html#percent
Ubuntu 20.04にPHP 7.4をインストール（OS標準）

# はじめに

Ubuntu20.04にPHPを標準インストール
親記事：[PHP, PHP-FPMの各種インストール方法とEOLまとめ](https://qiita.com/witchcraze/items/dfe3823554b7caba6f6a)

## LOG

### インストール

```shell-session
# cat /etc/os-release
NAME="Ubuntu"
VERSION="20.04 LTS (Focal Fossa)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 20.04 LTS"
VERSION_ID="20.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=focal
UBUNTU_CODENAME=focal

# apt update;apt install -y php
... 略
```

### 各種確認

```shell-session
# which php
/usr/bin/php

# php -v
PHP 7.4.3 (cli) (built: Mar 26 2020 20:24:23) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
    with Zend OPcache v7.4.3, Copyright (c), by Zend Technologies

# php -i | grep php.ini
Configuration File (php.ini) Path => /etc/php/7.4/cli
Loaded Configuration File => /etc/php/7.4/cli/php.ini

# apt show php
Package: php
Version: 2:7.4+75
Priority: optional
Section: php
Source: php-defaults (75)
Origin: Ubuntu
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
Original-Maintainer: Debian PHP Maintainers <team+pkg-php@tracker.debian.org>
Bugs: https://bugs.launchpad.net/ubuntu/+filebug
Installed-Size: 13.3 kB
Depends: php7.4
Download-Size: 2712 B
APT-Manual-Installed: yes
APT-Sources: http://archive.ubuntu.com/ubuntu focal/main amd64 Packages
Description: server-side, HTML-embedded scripting language (default)
```
「Precompiling assets failed.」というエラーが出て、Herokuにデプロイできない！

とあるアプリを開発し、Herokuにデプロイしようとしたところ、「Precompiling assets failed.というエラーが発生し、一部のファイルがHerokuにデプロイできない状態に陥りました。
そこで、このエラー文に対する解決策がネット上に上がっていたので、試してみました。
##試したこと
・production.rbに以下を追加

```ruby
config.assets.initialize_on_precompile = false
```
しかし、解決せず。
Herokuにpushした際にコンソール上のどこかにエラーメッセージが出てこないか確認してみたところ、、、

```console
NameError: undefined local variable or method `config' for main:Object
remote:        /tmp/build_195961d18dc6ff28fd22b2fa4b0dff81/config/environments/production.rb:31:in `<main>'
```
とあり、どうやら、production.rbの31行目の文にミスがあったようでした、、、。
この部分を修正し、

```console
$ git add -A
```

```console
$ git commit -m "init"
```
を行い、Herokuにpushしたら、見事にデプロイすることができました。
エラー文をよく見て、それに対するアプローチが大切だと学びました。
Railsチュートリアル備忘録 -HTML/CSS編-

# HTML
## 複数のクラスの設定
```
class="クラス1 クラス2"
```
## リンクの作り方
```
パターン1 : <%= link_to "名前", "リンク先",class:"クラス名" %>
パターン2 : <a href="リンク先" class="クラス名"> 名前 </a>
```
## 箇条書き
```
  <ul class="クラス名">
    <li>内容1</li>
    <li>内容2</li>
    <li>内容3</li>
    ...
  </ul>
```
## 画像の挿入
```
<%= link_to image_tag("画像ファイル名", alt:"名前"),'リンク先' %>
```
## 変数埋め込み
```
<%= @変数 %>
```
## フォーム
/userにpostリクエスト（@userを保持して）

```
<%= form_for(@user) do |f| %>
      <%= f.label :name %>
      <%= f.text_field :name %>

      <%= f.label :email %>
      <%= f.email_field :email %>

      <%= f.label :password %>
      <%= f.password_field :password %>

      <%= f.label :password_confirmation, "Confirmation" %>
      <%= f.password_field :password_confirmation %>

      <%= f.submit "Create my account", class: "btn btn-primary" %>
    <% end %>
```
/signupにポストリクエスト（@userを保持して）

```
    <%= form_for(@user,url:signup_path) do |f| %>
```

#### モデルが存在しないとき
リソースの名前とそれに対応するURLを具体的に指定する必要がある

```
form_for(:session, url: login_path)
```
params[:session][:email]とparams[:session][:password]

## HTMLの分割（パーシャル）
```
<%= render '読みだすHTML" %>

例: app/views/layouts/_shim.html.erbというファイルを探してその内容を評価し、結果をビューに挿入する場合
 <%= render 'layouts/shim' %>
```


# CSS
## 基本的な文法
### クラスの指定
```
.クラス名{
   内容;
}

例
.center {
  text-align: center;
}
```
### idの指定
```
#id名{
   内容;
}

例
#logo {
  float: left;
  margin-right: 10px;
  font-size: 1.7em;
  color: #fff;
  text-transform: uppercase;
  letter-spacing: -1px;
  padding-top: 9px;
  font-weight: bold;
}
```
## Bootstrap
Bootstrapを使うと、洗練されたWebデザインとユーザーインターフェイス要素を簡単にHTML5アプリケーションに追加することができる。最も大きな利点はレスポンシブデザインにできること。

### bootstrap-sassのインストール
```
gem 'bootstrap-sass', '3.3.7'
```
```
$ bundle install
```
### scssファイルの作成
```
$ touch app/assets/stylesheets/custom.scss
```
### Bootstrap CSSの追加
```app/assets/stylesheets/custom.scss
@import "bootstrap-sprockets";
@import "bootstrap";
```
# 追加中...
Ubuntu 20.04にMariaDB 10.3をインストール（OS標準）

# はじめに

Ubuntu20.04にMariaDB10.3をインストール
親記事：[MySQL, MariaDBの各種インストール方法とEOLまとめ \- Qiita](https://qiita.com/witchcraze/items/72291ee035437ec83273)

## LOG

### インストール

```shell-session
# cat /etc/os-release
NAME="Ubuntu"
VERSION="20.04 LTS (Focal Fossa)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 20.04 LTS"
VERSION_ID="20.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=focal
UBUNTU_CODENAME=focal

# apt update; apt install -y mariadb-server
... 略
```

### 各種確認

```shell-session
# service mysql start
# mysql -u root -e'select version();'
+--------------------------+
| version()                |
+--------------------------+
| 10.3.22-MariaDB-1ubuntu1 |
+--------------------------+
```
Ubuntu 20.04にMySQL 8.0をインストール（OS標準）

# はじめに

Ubuntu20.04にMySQL8.0をインストール
親記事：[MySQL, MariaDBの各種インストール方法とEOLまとめ \- Qiita](https://qiita.com/witchcraze/items/72291ee035437ec83273)

## LOG

### インストール

```shell-session
# cat /etc/os-release
NAME="Ubuntu"
VERSION="20.04 LTS (Focal Fossa)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 20.04 LTS"
VERSION_ID="20.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=focal
UBUNTU_CODENAME=focal

# apt update; apt install -y mysql-server
... 略
```

### 各種確認

```shell-session
# service mysql start
# mysql -u root -e'select version();'
+-----------------+
| version()       |
+-----------------+
| 8.0.19-0ubuntu5 |
+-----------------+
```
Atom Remote-FTP で接続できなかった時のメモ

「Atom」で使用できるパッケージ「Remote-FTP」を使用し、外部のディレクトリにアクセスしようとしたところ、
うまく接続できなくてハマったので、解決したときのメモを記事にしました。

この記事の動作環境
Windows10 64bit
Atom 1.45.0 x64
remote-ftp 2.2.4

#1「Remote-FTP」の導入方法
今回、「Remote-FTP」を導入するにあたって、以下のリンクを参考にさせていただきました。
https://qiita.com/t_rela/items/07f5f3bbe32745f9fa0d


#2 Packages > Remote FTP > Connect でエラーが発生

![remote-ftp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626788/02f38816-e194-114a-1d68-d4dcbd48ee17.png)

指定のパスにファイルを保存したり、プロジェクトを移動したりしても接続することができませんでした。

#3 Packages > Remote FTP > Toggle すると「Remote」タブ

「Remote」タブでは「Connection」も含めた以下のような操作ができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626788/8cc50e70-d96c-4477-ea6b-46878241166a.png)
#4 Remote タブから Connection すると節続できた

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626788/9dc00d71-bb06-b423-85b2-23d6478689e1.png)

Packages > Remote FTP > Connect でどうして接続できなかったのかは謎のまま（今のできない）ですが、ひとまず解決したのでよしとします。
[Ruby]バリデーションで正規表現を使う

# 正規表現とは
文字列に特定の文字が含まれているかを確認することや、特定の文字を取り除くなどの操作を行うための技術

# プログラミング中で正規表現を利用するケース

1. 文字列の一部分を置換する
2. 文字列が制約を満たしているか調べる
3. 文字列の一部分を抽出する

本記事は上記の2.についてです。

# モデル内にて特定の文字列の制約を設ける

以下のような例があったとします。

```ruby
class Impression < ActiveRecord::Base
  VALID_YOUTUBE_URL_REGEX = /\A.*youtube.*\z/
  validates :url, presence: true, format: { with: VALID_YOUTUBE_URL_REGEX }
end
```
ここでは、Impressionモデルにおいて、urlカラムに対するバリデーションを実施しています。

正規表現が使用されているのは、以下の部分です。

```ruby
/\A.*youtube.*\z/
```

上記のようにすることで、

**操作したい文字列に対して、その文字列の先頭・末尾以外に"youtube"という文字列が含まれていればマッチ**

という条件を設けることが出来ます。

## アンカー
ここでの\A及び\zはアンカーと呼ばれるもので、幅0の文字列にマッチするメタ文字列です。
幅0とは文字と文字の間、文字列の先頭、文字列の末尾、などを意味します。

以下の例があります。

```ruby
# 文字列中の real にマッチする
/real/.match("surrealist") # => #<MatchData "real">
# 先頭にrealがないとマッチしない
/\Areal/.match("surrealist") # => nil
# 末尾にrealがないとマッチしない
/real\z/.match("surrealist") # => nil
```
※後述しますが、今回の場合、このアンカーを除去しても(/.*youtube.*/)、同じような結果が得られます。

## 任意の1文字
\Aの後に.(ドット)があります。
これはメタ文字列で任意の1文字を表します。

## 量指定子
以下のメタ文字列は繰り返しを表現します。直前の部分式を何回繰り返すかを指定します。このような繰り返しを表すメタ文字列を量指定子(quantifier)と呼びます。

- * 0回以上
- + 1回以上
- ? 0回もしくは1回
- {n} ちょうどn回(nは数字)
- {n,} n回以上(nは数字)
- {,m} m回以下(mは数字)
- {n,m} n回以上m回以下(n,mは数字)

今回の場合、直前の部分式である . を　* 0回以上繰り返しOKという条件を加えています。

上記より今回の正規表現では
aaaaaaaaaaaaaayoutubeaaaaaaaaaaaaaaaaaa
でも制約をクリアします。

![alt](https://i.gyazo.com/2595d75c9d8f588ab42b247e154cae36.png)
[上記サイトへのリンク](https://rubular.com/)

因みにアンカー（\Aと\z）を外した場合は以下の通りです。
![alt](https://i.gyazo.com/0cd33835202af7e1ce2b7c7de709e2bd.png)

#参考記事
[Ruby 2.7.0 リファレンスマニュアル](https://docs.ruby-lang.org/ja/latest/doc/spec=2fregexp.html)
[]()

#最後に
本記事は備忘録として記載しております。
間違いございましたら、指摘いただけますと幸いですm(_ _)m
Ruby on Railsのチュートリアル ~第7章 ユーザー登録~

# はじめに
webアプリケーションを作るための学習記録
（マッチングアプリを作る予定）

こちらのチュートリアルを片っ端から進めていく
【Ruby on Rails チュートリアル】
https://railstutorial.jp/

# 第7章 ユーザー登録
## まとめ
 - debugメソッドを使うことで、役立つデバッグ情報を表示できる
 - Sassのmixin機能を使うと、CSSのルールをまとめたり他の場所で再利用できるようになる
 - Railsには標準で3つ環境が備わっており、それぞれ開発環境 (development)、テスト環境 (test)、本番環境 (production)と呼ぶ
 - 標準的なRESTfulなURLを通して、ユーザー情報をリソースとして扱えるようになった
 - Gravatarを使うと、ユーザーのプロフィール画像を簡単に表示できるようになる
 - form_forヘルパーは、Active Recordのオブジェクトに対応したフォームを生成する
 - ユーザー登録に失敗した場合はnewビューを再描画するようにした。その際、Active Recordが自動的に検知したエラーメッセージを表示できるようにした
 - flash変数を使うと、一時的なメッセージを表示できるようになる
 - ユーザー登録に成功すると、データベース上にユーザーが追加、プロフィールページにリダイレクト、ウェルカムメッセージの表示といった順で処理が進む
 - 統合テストを使うことで送信フォームの振る舞いを検証したり、バグの発生を検知したりできる
 - セキュアな通信と高いパフォーマンスを確保するために、本番環境ではSSLとPumaを導入した

## 所感
・RESTアーキテクチャを使うと、どのHTTPリクエストでどのURLに飛ぶと、どのコントローラのどのメソッドを呼び出すか、ということが標準的に定義される。
コントローラのメソッドは、どのテンプレートを呼びだすかデフォルトで定義してくれる。
よって、
１．あるHTTPリクエストで
２．あるURLにアクセスすると
３．あるコントローラの
４．あるメソッドを呼び出して
５．それに対応したテンプレートを返す

・paramsは画面遷移時に渡すパラメータのことか

## 途中参考にしたページ
・ビューの作成とデータの受け渡し
https://www.javadrive.jp/rails/ini/index5.html#section3
アクションと同名のテンプレートを呼び出すようにできてる

・【Railsメモ】assert_selectについて
https://qiita.com/TakahitoNakashima/items/b439126cd1ee302586d7

・【Rails】assert_notについて
https://teratail.com/questions/138763

・Rails チュートリアル　【初心者向け】　テストを10分でおさらいしよう！
https://qiita.com/duka/items/2d724ea2226984cb544f

・assert_selectの使い方
https://zariganitosh.hatenablog.jp/entry/20080405/1207455670


## 使用したコマンド
git checkout -b sign-up

rails console test
Rails.env
Rails.env.test?
rails server --environment production
rails db:migrate RAILS_ENV=production
heroku run rails console

puts user.attributes.to_yaml
y user.attributes

User.count
User.first

touch app/views/users/show.html.erb
user = User.first
user.update_attributes(name: "Example User",
                        email: "example@railstutorial.org",
                        password: "foobar",
                        password_confirmation: "foobar")

mkdir app/views/shared
touch app/views/shared/_error_messages.html.erb

rails generate integration_test users_signup

rails db:migrate:reset

git add -A
git commit -m "Finish user signup"
git checkout master
git merge sign-up

rails test
git add -A
git commit -m "Use SSL and the Puma webserver in production"
git push
git push heroku
heroku run rails db:migrate