OmniAICreator/Qiita-1.07M huggingface dataset:
【ruby】paizaのための覚えておくと便利なメソッド１(ruby編)

###１．読者対象

緊急事態宣言で外出禁止令が敷かれ切ない日々を送っている皆様が読者対象です。
三密を徹底的に排除するべく、飲食店関係や大好きなカラオケまでもが休業状態。
密かに楽しみにしていたフェスも、多分今年はいけないだろう。

私事で恐縮だが、暫く封印していたポケモンにも、ジュラシックワールドにも、__新しいキャラが増えすぎて何だかついていけない。__
そんなこともあって休日を持て余していた。

そんな時に目に入ったのが
##『paiza スキルチェック』
だった。

プログラマの実力を測れるという存在だ。
いきなり高レベルの問題に取り組んでも、くじけてしまうかもしれない。
中々イケイケの言語が並んでいる。
業務で使わない言語でDランクから試してみる。
足し算のプログラムができただけでも、__100点とか出るので気分は上がる__

__活きたプログラミング言語の勉強にいいかも！！__

###『緊急事態宣言でつまらない日々のお供にpaizaを』

有り余る暇な時間を問題によっては__『６時間近く格闘』__なんてこともざらだ。

このスキルチェックを進めるには、知っておく必要のある関数がいくつかある。
paizaスキルチェックでは、入力変数を受け取って、その内容を元に処理を記述していく
流れになる。
以下に役立ちそうなメソッドをピックアップした。(初級程度ならいけそうかも)

#２．役立つメソッド一覧

###(ⅰ)chompメソッド
getsで入力内容を受け取る時に、__文字列の最後に改行が入っていたり__する。
この改行を取り除いてくれるのがこのメソッド。

```ruby:paiza_memo1.rb
dino_name1=gets
puts dino_name1+"3"
#改行を削除
puts dino_name1.chomp+"5"

```

__実行結果__

```
c:\ruby_pg>ruby paiza_memo1.rb
Tyrannosaurus
Tyrannosaurus
3
Tyrannosaurus5

```
chompを使わないと、改行も出力されている事がお分かりだろう。
ここで最後の改行を削除することが第一歩となる。

###(ⅱ)countメソッド

これが素晴らしいメソッド。
ある文字列に含まれる特定の文字列の個数を数えることができるメソッド。
中々貴重。

```ruby:paiza_memo1.rb
#略

dino_name2='Tyrannosaurus'

#指定文字列の中に、nが含まれる個数
puts dino_name2.count('n')
#指定文字列の中に、oが含まれる個数
puts dino_name2.count('o')
#指定文字列の中に、xが含まれる個数
puts dino_name2.count('x')

```

####実行結果
```
c:\ruby_pg>ruby paiza_memo1.rb
・・・
2
1
0

c:\ruby_pg>
```

###(ⅲ)sliceメソッド
文字列を部分的に抽出するメソッド。
..と...で、処理が違うので注意
__slice(開始位置..終了位置)__
__slice(開始位置...終了位置)__
__⇒開始位置を含む終了位置-開始位置の長さの文字列が抽出__
__slice(位置)：指定した位置の文字列を抽出。__


```ruby:paiza_memo1.rb
#略
dino_name3='IndominusRex'

puts dino_name3.slice(3)
puts dino_name3.slice(0..dino_name3.length-3)
puts dino_name3.slice(0...dino_name3.length-3)
puts dino_name3.slice(2..5)
puts dino_name3.slice(2...5)

```

####実行結果

```
c:\ruby_pg>ruby paiza_memo1.rb
o
IndominusR
Indominus
domi
dom

c:\ruby_pg>
```

###(ⅳ)to_iメソッド

#####間違った例
```ruby:paiza_memo1.rb
#略
numstr=gets.chomp!
puts numstr+5
```
####実行結果

c:\ruby_pg>ruby paiza_memo1.rb
33
paiza_memo1.rb:36:in `+': no implicit conversion of Fixnum into String (TypeError)
        from paiza_memo1.rb:36:in `<main>'

c:\ruby_pg>

__自動的に型を認識してくれないので、加算ができないのである__

####修正後

```ruby:paiza_memo1.rb
numstr=gets.chomp!
puts numstr.to_i+5
```

####実行結果

```
c:\ruby_pg>ruby paiza_memo1.rb
33
38

c:\ruby_pg>
```

###(ⅴ)gsubメソッド

gsub(変換前文字列,返還後文字列)という文字列置換メソッド。
これも出番が多い関数。

####実行例

```ruby:paiza_memo1.rb
#略
dino_name5=gets.chomp!
tmpstr=dino_name5
puts tmpstr.gsub(dino_name5,"IndominusRex")

```

####実行結果
```
c:\ruby_pg>ruby paiza_memo1.rb
cat
IndominusRex

c:\ruby_pg>
```

猫がインドミナスレックスに変身してしまった。


###(ⅵ)splitメソッド

split(区切り文字)で区切り文字を指定すると、文字列を配列に変換できるメソッド。
これはもう超鉄板。

####実行例
```ruby:paiza_memo1.rb
dinostr="Tyrannosaurus Velociraptor Stegosaurus"

ar_dino=dinostr.split(' ')

puts ar_dino[0]
puts ar_dino[1]
```

####実行結果

```
c:\ruby_pg>ruby paiza_memo1.rb
Tyrannosaurus
Velociraptor

c:\ruby_pg>
```

###最後に

paizaにトライするのに最低限必要になりそうな関数をまとめてみました。
『ソースコードに恐竜を』をテーマに終えることが出来てよかった。。。
それでは皆様良き自粛ライフを！！
html 基礎・基本　フォーム作成編#3

今日も前回に引き続き第三回htmlの学習ノートをここにまとめていきます。
前回のurlも付けとくので前回のは見てないよという方はぜひ見てみてください。
<a href="https://qiita.com/nol_miryuu/items/ce8e427191d8b7afbbd8">前回のはこちら</a>
それでは、今回もやっていこうと思います。

##入力フォーム作成！
メールアドレス入力フォームを作るには、`input`を使用して、`type`属性を`type="email"`にします。
`<form> <input type="email" name="email"></form>`
こんな感じにフォームを作る際は`<form></form>`を忘れないようにつけよう。
ほかの例も下に記す
- 電話番号入力フォーム:`type="tel"`
- url入力フォーム:`type="url"`
- 数値入力フォーム:`type="number"`
- カラーピッカー:`type="color"`
- 日付入力フォーム:`type="date"`
- 時間入力フォーム:`type="time"`
- 日時入力フォーム:`type="datetime-local"`

##必須入力作成！
入力の際に必須入力にしたい際には、その要素に`required`属性を付ける。
`<input name="form" required>`
また、入力チェック処理は、送信前に実行が行われる。

##入力値に最大と最小を！
入力値に最大最小を設ける。
入れる数値において最小と最大を設けたいときにつけたいときに使う。
`<input type="number" name="maxn" min="1" max="12" value="0">`

##文字数制限！
数字同様に文字数にも制限をかけたいとき。
`<input name="len" minlength="1" maxlength="4" value="len">`

##入力制限！
今回紹介するのは`pattern`属性を使って、入力してほしい値にマッチした値を入力させるためのものです。先に例のコードを書くと
`<input name="op" patter="^o.*" title="oから始まる単語" value="op">`
今回入力した値で`^o`先頭の文字が一致するかをチェックしまうす。
また、`.*`これは後ろに続く値は任意とするものです。

##入力に応じて反応する色！
入力した結果に応じてチェックして色でエラーや正常を教えてくれると便利だよねってことで、今回使うのは`:vaild`と`:invalid`これはどちらも疑似的クラスを作成してcssで読み込む
`input :valid { background: "色を選択" } `これが正常時
こんな形で`:valid`も作れば設定したcssが状態に合わせて使用される。

##入力チェック機能を無効化する！
入力チェック機能を無効化させる際は`novalidate`属性を使用する
`<form novalidate>`と最初に着ければ適用される。

##入力する際の補助を適用させる!
名前などを入力する際にそれを補助する機能があります。それを追加する際には`autocomplete`属性を付けて、その値を`name`にします
`<input name="op" autocomplete="name">`
今回は名前でしたがメールなどの際は
`<input name="email" type="email" autocomplete="email">`
また、電話番号の場合は
`<input name="tel" autocomplete="tel">`
このように、属性の値を変更していけばできます。
これ以外にも、郵便番号なら`postal-code`などがあります。

##入力補助を無効化する!
その場合は,`autocomplete="off"`にすればいけます。
また、こうしない限りChromeでは、input要素内では自動で補助が付きます。

##読み取り専用のフォームを作成！
読み取り専用というのは、ユーザーが変鉱石内容にするものです。
これは、普通の入力フォーム同様に値は送信されます。
この際に使う属性は`readonly`です。

##プレースホルダーを作る!
プレースホルダーとは、入力する際にユーザーがなにを入力したらよいかを、入力フォーム内に後ろに表示するものです。
入力フォームにプレースホルダーを作るには`placeholder`属性を付与する。
`<input type="email" name="form" placeholder="ex) nekoneko@neko.com>`

##ページ読み込み時にフォーカスをあてる。
ページ読み込み時に入力フォームの一か所にフォーカスをあてることができる。
今回使う属性は、`autofocus`です。
ページの中の一つの要素だけにこの属性はあてることができる。

## スペルや文法をチェックし制御する。
ブラウザにはスペルチェック機能が備わっている。そのためスペルを間違うと下線に赤色の線ができる。それを無効にするには、`spellcheck`属性を`false`にすればよい
`<input name="nao" valuse="neko" spellcheck="false">`


今回はこんなところになります。
今回も何か所もわかりにくいところができてしまったかもしれません。
ここおかしいよというのがあればぜひ教えてくれると助かります。
エラー解決　GitHub error “fatal: bad config file line 74 in .git/config”

macOS Mojave
バージョン10.14.6（18G2022）

Cloud9でgitのaliathの設定をし終えた時

```unix
gakkie:~/environment/rails_tutorial/sample_app $ git config -e                                                                                                                                                                                                                   
fatal: bad config line 76 in file .git/config
```
.git/configの76行目にエラーがある。

```
gakkie:~/environment/rails_tutorial/sample_app $ vim .git/config
#76行目を修正

gakkie:~/environment/rails_tutorial/sample_app (hogehoge) $ vim .git/config
#ブランチ名が表示される、エラー表示もなくなった。
```
[Android][Kotlin]背景をタップしてキーボードを非表示にする

## 画面側
```xml
    <!-- 背景がフォーカスされる用のTextView -->
    <TextView
        android:id="@+id/focusView"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:focusable="true"
        android:focusableInTouchMode="true"
        app:layout_constraintBottom_toTopOf="parent"
        app:layout_constraintEnd_toStartOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <EditText
        android:id="@+id/editText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:ems="10"
        android:inputType="text"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
```
`EditText`以外にLayoutに背景をタップした時に背景がフォーカスされるために`TextView`を追加します。
この`TextView`は、実際に画面に表示する訳ではないため幅と高さは`0dp`にしておきます。

さらに、`focusable`と`focusableInTouchMode`は`true`にしておきます。
これで、タッチモードによらずフォーカスが当たるようになります。

## Activity側
```kotlin
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        editText.setOnFocusChangeListener { v, hasFocus ->
            if (!hasFocus) {
                val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
                imm.hideSoftInputFromWindow(v.windowToken, 0)
            }
        }
    }

    override fun dispatchTouchEvent(ev: MotionEvent?): Boolean {
        focusView.requestFocus()
        return super.dispatchTouchEvent(ev)
    }
```
`editText`の`setOnFocusChangeListener`でフォーカスが外れたときにキーボードを非表示にする処理を実行するようリスナーを設定します。
`setOnFocusChangeListener`は、フォーカスを取得したり消失したりした時にリスナーが実行されるためフォーカスが外れたときだけキーボードを非表示にするようにしています。

`dispatchTouchEvent`では、`focusView`にフォーカスを強制的に当てるように`requestFocus`を実行しています。
これがないと背景をタップしてもフォーカスが移動せずキーボードが表示されたままになってしまいます。
`dispatchTouchEvent`は、タップイベントが起こった時に実行されます。`onTouchEvent`だと、レイアウトによっては子でタッチイベントの伝搬が終了してしまい親で`onTouchEvent`が実行されないことがあるため必ず実行される`dispatchTouchEvent`にしました。
`dispatchTouchEvent`と`onTouchEvent`について、詳しくは、[Android のタッチイベントを理解する(その1) - Unmotivated](http://blog.lciel.jp/blog/2013/12/03/android-touch-event/)が参考になります。

# 起動した時の挙動
起動した時は、`editText`にフォーカスは当たりません。
`focusView`で`focusable`と`focusableInTouchMode`を`true`にしているため、起動時には`focusView`にフォーカスが当たります。

`editText`にフォーカスした状態でキーボードを非表示にするために、`AndroidManifest.xml`に`windowSoftInputMode`を指定しても`focusView`にフォーカスが当たってしまい上手くいかないようです。
[AndroidアプリのEditTextを含む画面でキーボードを非表示にする - Qiita](https://qiita.com/hishida/items/8bf1aa28ef62ef22a7f9#edittext%E3%81%8B%E3%82%89%E3%83%95%E3%82%A9%E3%83%BC%E3%82%AB%E3%82%B9%E3%82%92%E3%81%AF%E3%81%9A%E3%81%99)の「EditTextからフォーカスをはずす」が今回の対応にあたります。

# 参考
[[Android]画面タップでキーボードを閉じる - ワークレ](https://reftec.work/posts/2019/6/22/)  
[入力イベントの概要  |  Android デベロッパー  |  Android Developers](https://developer.android.com/guide/topics/ui/ui-events?hl=ja)  
[表示| Androidデベロッパー| Android開発者](https://developer.android.com/reference/android/view/View)
shellscript内で変数を使いまわすための記載方法

<!-- wp:heading {"level":1} -->
<h1>はじめに</h1>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>社内でRocket.Chatを使用しているが、ubuntuサーバーのcron処理の結果をチャットボットとして通知させたい。<br>
Webhookの仕組みでRocket.Chatからcurlコマンドが発行されるが、cronで実行したシェル内で作成した変数をcurlコマンドでチャットに送信する方法につまづいたので、解決方法を残す</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":1} -->
<h1>ゴール</h1>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>curlコマンドで変数を受け取り、状況により違う結果を出せるようにする</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":1} -->
<h1>curlの形</h1>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>まずはRocket.ChatにWebhookで発行した基本のcurlコマンドを確認する</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>curl -X POST -H 'Content-Type: application/json' --data '{"text":"Example message","attachments":[{"title":"Rocket.Chat","title_link":"https://rocket.chat","text":"Rocket.Chat, the best open source chat","image_url":"https://rocket.chat/images/mockup.png","color":"#764FA5"}]}' https://〜〜</code></pre>
<!-- /wp:code -->

<!-- wp:heading {"level":1} -->
<h1>テキストのみ飛ばす</h1>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>プレーンテキストのみ飛ばしたい場合は以下のように記述する</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>curl -X POST -H 'Content-Type: application/json' --data '{"text":"hogehoge"}' https://〜〜</code></pre>
<!-- /wp:code -->

<!-- wp:heading {"level":1} -->
<h1>変数を使う</h1>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>変数を使う場合は以下のよう</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>結論は<br>
['"+"']<br>
で囲む</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>curl -X POST -H 'Content-Type: application/json' --data '{"text":"'"$fuga"'"}' https://〜〜</code></pre>
<!-- /wp:code -->

<!-- wp:heading {"level":1} -->
<h1>テキスト＋変数</h1>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>固定文と変数を使いたい場合</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>curl -X POST -H 'Content-Type: application/json' --data '{"text":"hogehoge'"$fuga"'"}' https://〜〜</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p>こんな感じ</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":1} -->
<h1>終わりに</h1>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>見た目としては違和感が強いがこれで使えるようになる<br>
いつか使う時があれば参考にしてください</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>最初はこの方法はcurlで変数を使用するときだけだと思っていたが、<br>
実際はshellscriptを書くときなどに変数を使いまわしたいときに使う方法だったよう</p>
<!-- /wp:paragraph -->
CloudFrontのログ解析をAthenaで実施してみた

## はじめに
運用時にCloudFrontなどのアクセスログの調査を行うことはよくあると思います。 その場合は、ある特定の時間のログを確認することが多いと思います。

そんなとき、手っ取り早くアクセスログを確認したいときに便利かと思います。
今回は既にCloudFrontでログ取得設定をしている前提です

## Athna初期設定(query実行結果格納場所の作成)
※初期設定が完了しているなら無視してOK

何も設定していない状態でクエリ実行しようとするとエラーになってしまいます。

```
Your query has the following error(s):

No output location provided. An output location is required either through the Workgroup result configuration setting or as an API input. (Service: AmazonAthena; Status Code: 400; Error Code: InvalidRequestException; Request ID: XXXXXXXXXXXXXXXXXXX)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626780/0c425141-138b-92f1-9909-1b163b203461.png)


なので、上図の"set up a query result location in Amazon S3."から設定が可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626780/6f2a4b19-f2e6-1ea3-f7c0-bdeecbb1a504.png)



## CloudFront ログのテーブルの作成
(1)次の DDL ステートメントをコピーして Athena コンソール内に貼り付けます。ログを保存する Amazon S3 バケットの LOCATION を変更します。

```
CREATE EXTERNAL TABLE IF NOT EXISTS default.cloudfront_logs (　←ここがテーブル名になる
  `date` DATE,
  time STRING,
  location STRING,
  bytes BIGINT,
  request_ip STRING,
  method STRING,
  host STRING,
  uri STRING,
  status INT,
  referrer STRING,
  user_agent STRING,
  query_string STRING,
  cookie STRING,
  result_type STRING,
  request_id STRING,
  host_header STRING,
  request_protocol STRING,
  request_bytes BIGINT,
  time_taken FLOAT,
  xforwarded_for STRING,
  ssl_protocol STRING,
  ssl_cipher STRING,
  response_result_type STRING,
  http_version STRING,
  fle_status STRING,
  fle_encrypted_fields INT,
  c_port INT,
  time_to_first_byte FLOAT,
  x_edge_detailed_result_type STRING,
  sc_content_type STRING,
  sc_content_len BIGINT,
  sc_range_start BIGINT,
  sc_range_end BIGINT
)
ROW FORMAT DELIMITED 
FIELDS TERMINATED BY '\t'
LOCATION 's3://CloudFront_bucket_name/CloudFront/' ←ここを環境により変更する
TBLPROPERTIES ( 'skip.header.line.count'='2' )
```

## ログのクエリ例

(1)日付指定でログを見たい場合

```
select requestip,date,time,host,uri
from ys_cf_logs ←自分の環境のテーブル名を記載
where "date" BETWEEN DATE '2020-04-25' AND DATE '2020-04-26'
order by time desc
LIMIT 100;
```


(2)特定のIPを表示させる
${SouceIP}の部分は置き換えてください

```
select requestip,date,time,host,uri
from ys_cf_logs
where "date" BETWEEN DATE '2020-04-25' AND DATE '2020-04-26'
AND "requestip" IN ('${SouceIP}','${SouceIP}')
order by time desc
LIMIT 100;
```

(3)特定のIP以外を表示させる
${SouceIP}の部分は置き換えてください

```
select requestip,date,time,host,uri
from ys_cf_logs
where "date" BETWEEN DATE '2020-04-25' AND DATE '2020-04-26'
AND "requestip" IN NOT ('${SouceIP}','${SouceIP}')
order by time desc
LIMIT 100;
```

何パターンかすぐ使えるように記載しましたが、SQLの文法なので、
これ以外もいろいろ使えるので使ってみてください。
Sigfoxでprivatekeyエラーがでた時の対処法

##Sigfoxでprivatekeyエラーがでた時の対処法
SigfoxをATコマンドで動かしていたら突然
The device [デバイス名] has an invalid private key
と出てメッセージが受信できなくなった。

##解決法
ATS410=0
でパブリックモードからプライベートモード(※)に切り替える。

※
パブリックモード：Sigfox基地局及びクラウドに接続するモード。
プライベートモード：Sigfoxオペレータが運用する基地局には接続しないモード。

<br><br>
調べた感じネットに上がってなかったので自分用もかねて
Djangoの関数ベースビュー

# はじめに

ここでは、djangoの関数ベースビューの基本について解説していきます。
アプリケーションディレクトリ下の`views.py`に書いていきます。
モデルとして`models.py`の`SampleModel`を利用するものとします。


# リストページ用のビュー関数

ブログの記事一覧ページなど、複数のレコードを一覧表示するページに使える関数です。

```python:views.py
from django.shortcuts import render

from .models import SampleModel


def list_func(request):
    object_list = SampleModel.objects.all()
    context = {'object_list': object_list}
    return render(request, 'app/app_list.html', context)
```

`object_list`は、表示対象とするモデルに含まれる全てのレコードのリストです。
`context`では、テンプレートとなるHTMLファイルに変数を埋め込むときの変数名と、この関数内での変数名との対応関係を示す辞書です。
そして最後の`render`関数に、テンプレートとなるHTMLファイルと、上で触れた`context`を明示します（第一引数は`request`になります）。


# 新規作成ページ用のビュー関数

ブログの新規記事の作成など、新しいレコードを作成するページに使える関数です。

```python:views.py
from django.shortcuts import render, redirect

from .models import SampleModel


def create_func(request):
    if request.method == 'POST':
        object = SampleModel.objects.create(
                title = request.POST['title'],
                text = request.POST['text']
                )
        object.save()
        return redirect('app_list')
    else:
        return render(request, 'app/app_create.html')
```

まず、`if request.method == 'POST'`のところで、POST送信されたときの処理を記述しています。
`Model.objects.create`メソッドで、POST送信されたrequest内容に従って新しいレコード（ここでは`object`）を作成し、`save()`メソッドでデータベースに登録します。
データベースへの書き込みに成功したら、`redirect()`で指定したページへ遷移します。
`POST`ではなく`GET`でページが呼び出された場合（普通にURLを打ち込んでアクセスされた場合など）は、`render()`で指定したテンプレートHTMLファイルが呼び出されます。


# 詳細ページ用のビュー関数

ブログの記事の個別ページなど、レコードの詳細を表示するページに使える関数です。

```python:views.py
from django.shortcuts import render

from .models import SampleModel


def detail_func(request, pk):
    object = SampleModel.objects.get(pk=pk)
    context = {'object': object}
    return render(request, 'app/detail.html', context)
```

`object`は、モデルに登録されているレコードから、該当するレコードを抽出してきたものになります（`pk`はprimary key）。
`object`に関連する情報を、テンプレートHTMLファイルの変数に埋め込んで表示します。


# 編集ページ用のビュー関数

ブログの記事の編集画面など、一度作成したレコード内容を更新するページに使える関数です。

```python:views.py
from django.shortcuts import render, redirect

from .models import SampleModel


def update_func(request, pk):
    object = SampleModel.objects.get(pk=pk)
    context = {'object': object}
    if request.method == 'POST':
        object.title = request.POST['title']
        object.text = request.POST['text']
        object.save()
    else:
        return render(request, 'app/app_update.html', context)
```

上で紹介したビューと同様に、`object`で対象レコードを指定し、`context`でHTMLテンプレートファイルに埋め込む変数名を明示します。
更新内容がPOST送信されたときは、各フィールドの内容をデータベースに上書きします。


# 削除ページ用のビュー関数

ブログの記事の削除画面など、作成したレコードを削除するページに使える関数です。

```python:views.py
from django.shortcuts import render, redirect

from .models import SampleModel


def delete_func(request, pk):
    object = SampleModel.objects.filter(pk=pk)
    context = {'object': object}
    if request.method == 'POST':
        object.delete()
        return redirect('app:app_list')
    else:
        return render(request, 'app/app_delete.html', context)
```

`object`と`context`は、上で紹介したビューと同様です。
`delete`メソッドで、データベースからレコードを消去します。


# まとめ

ここでは、djangoの関数ベースビューの基本について紹介しました。
次回は、urls.pyについて解説する予定です。
HTML Rubyに絵文字を追加する

HTMLとRubyに&#x1f600;の様な絵文字を入れる方法をご紹介いたします。

絵文字の表示にはunicordを使います。


絵文字の検索はこちらで行いました。
https://lets-emoji.com/emojilist/


## HTML

HTMLは<font color="Red">丸</font>で囲っている部分をそのまま貼り付けるだけです！
<img width="1071" alt="d2d340cbb605e7c2faeea96f0781a7f8.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606154/7ecd312d-40a3-7f90-f8a8-4b74cfcacbf5.png">


```html
&#x1f600;
```

## Ruby

Rubyには画像の<font color="Red">下線部分</font>を使います。
<img width="1071" alt="48f06f0d5d61a375bfe444cf5d27d630.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606154/3e81510c-5d5a-2087-10d2-686a08a8e1de.png">

下線部分を\u{}で囲むことで表示できる様になります。

```rb
\u{1F600}
```

## 最後に
Line botを作った際にRubyへの絵文字挿入を行いました。
是非ご活用ください。
chmod 600 ←600ってなんやねん

##近況報告
とりあえずデプロイは完了しました。readmeを書いて，投稿物を揃え，エラー対応すれば見世物としての体裁はできあがるのかな。某雑食系さんのツイートに，ポートフォリオはサーバーサイドの実力はもちろんのこと，コンテンツ力，そして見た目も評価の対象になりうるとありましたね（めっちゃ噛み砕いた）。自分のはサーバーサイドの記述，実力はまだまだですけど，見た目は手を抜かなければよくできるので，今の自分の最善を尽くした作品を作っていこうと思います。

#今回の目的
chmodに続く数字を知る。

#結論
ファイルへの権限の種類だよ

##詳細
[参考](https://linuxfan.info/chmod)

chmodは「change　mode」の略で，桁数，数字の組み合わせによって編集の権限とかを設定しています。
これにより，第三者からの不正アクセスの予防に繋がります。

|桁数|意味|
|:-------:|:--------:|
|1桁目（百の位）|所有者のアクセス権限の範囲|
|2桁目（十の位）|グループのアクセス権限の範囲|
|3桁目（一の位）|その他のユーザーのアクセス権限の範囲|

|数字|意味|
|:--:|:--:|
|4|読み出し許可|
|2|書き込み許可|
|1|実行許可|
|0|権限なし|

数字の足し算で権限は増えていきます。例えば全ての権限なら
４＋２＋１＋０で７に
読み出しと書き込みだけなら４＋２で６になります。
このように編集できるユーザーを適宜設定できます。

##おわりに
Linuxのコマンドは他にもごっそりあるのでそれの一部と考えていただければ。

微量でも参考になったらLGTM，ご指導はコメント欄にお願いします！
AWS Cloud9でRuby on Railsを動かしてみた

こんにちは！モリタケンタロウです！
今回はAWSのCloud9で、Ruby on Railsを動かす方法について紹介します。

# AWS Cloud9とは
AWS Cloud9については↓をご参考にどうぞ

* [AWS Cloud9で開発環境を立ててみた](https://qiita.com/MORITAKENTARO/items/db791b8a45eda53259f2)

# Ruby on Railsとは
Ruby on RailsはRubyで動作するMVCモデルのフレームワークです。
Webアプリケーション開発に向いていて、世の中のあらゆるサービスがこのRuby on Railsでできています。
Railsはオワコンと言われていたりもしますが、僕が会社でRailsのWebアプリ開発をやっていたときに、勉強しやすくて書きやすかったので、とりあえず今回はRailsを使ってみようと思います。

# とにかくやってみよう！
AWS Cloud9では最初からRubyもRailsもインストールされています。
`ruby -v`と`rails -v`のコマンドで確認できます。
![rubyver.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612211/ef048207-2bd2-6675-6bcf-1a7f02165c68.png)
確認できたら早速アプリを作成してみましょう。
`rails new [アプリ名]`コマンドで作ります。
![newapp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612211/bd6fd8a6-24ba-5177-4e6d-f5f33f1cd2ab.png)
そうすると、指定した名前のアプリのディレクトリが作成されました！
作ったアプリのディレクトリの中に入って、`rails server`コマンドでアプリを動かしてみましょう。
![startapp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612211/88bd7eef-a127-ad47-17b8-fc034136cb4f.png)
動いている様子は、Preview > Preview Running Application で確認できます。
![previewapp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612211/d8527fc2-4755-8d18-d28c-accbe05ff4db.png)
上手くいくと、こんな画面が出てきます。めでたしめでたし！
![yayrails.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612211/f5d2fc4e-190a-58ed-d83c-bdc6405bdeae.png)
上手くいかないと、こんな画面が出てくるかもしれません。
![noconnection.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612211/7f086232-6a28-664d-9f22-76ab4be98f76.png)
そんなときは、↓を参考にしてみてください。

* [Railsで新しいアプリを作ったらActiveRecord::ConnectionNotEstablishedが出てきた](https://qiita.com/MORITAKENTARO/items/e8d5306a07715db6c4f2)

ちょっとつまづきながらも無事に「Yay!…」という画面が出せたので、これからコツコツRails開発を始めていきます！
それでは～
Railsで新しいアプリを作ったらActiveRecord::ConnectionNotEstablishedが出てきた

こんにちは！モリタケンタロウです！
今回はRailsでアプリを新規作成して動かしてみたら、「ActiveRecord::ConnectionNotEstablished」というエラーが出てきたので、それを解決する方法について紹介します。

# 開発環境
* ruby 2.6.3p62
* Rails 5.0.0

# エラー内容
`rails server`コマンドでアプリを動かすと、画面にはこんなエラーが出てきます。
![noconnection.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612211/b645e4d3-1eaa-5806-89ba-3aca7b060cee.png)
`ActiveRecord::ConnectionNotEstablished`
`No connection pool with id primary found`
なにこれ!?分からん…
ということでググると、RailsのORM機能であるActiveRecordが、`sqlite3`の新しいバージョンに対応してないことが原因らしい。（参考：[ActiveRecord::ConnectionNotEstablished No connection pool](https://programming-beginner-zeroichi.jp/articles/208)）

# 対処内容
ということで、Railsがインストールしているパッケージを管理しているGemfileを編集します。

```bash
gem 'sqlite3', '~> 1.3.6'
```

* 修正前
![oldgem.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612211/f889a76d-3e46-889c-542b-27a5f5899dac.png)
* 修正後
![newgem.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612211/029da795-14e3-1817-a79d-bacf3d550216.png)

Gemfileを編集したら、`bundle install`コマンドでインストールパッケージを更新します。
![bundleinstall.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612211/6d7dac07-cbbb-2864-564f-9570011b9adf.png)
そして`rails server`コマンドでアプリを起動すると…
![railsserver.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612211/0168d742-21e1-e1cc-32aa-fcec45e1e390.png)
![yayrails.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612211/d6abd622-bb4d-c5d0-d78f-49ea6c2315cc.png)
見事、アプリが正常に起動しました。めでたしめでたし！
ということで一件落着(^^)
それでは～
スマートアプリの脆弱性診断


#アプリの脆弱性診断サービスとは

「アプリケーション脆弱性診断サービス」は、お客様が開発したスマートフォンアプリケーションのセキュリティ対策が適切であるかを診断し、問題点の有無をご報告するサービスです。

インターネットを介した不正アクセス被害が日々報じられる昨今、 その手法を理解し攻撃からシステムを守る技術の重要性はかつてなく高まっています。


#脆弱性診断サービスの分類
自動ツールだけに頼らない手動診断と、リバースエンジニアリングによる高度な解析技術によりの手動診断があります。
1.Webアプリ脆弱性診断
2.スマホアプリ脆弱性診断IOS/Android
3.ペネトレーションテスト(侵入テスト)

#スマホアプリ脆弱性診断の項目
OWASP Mobile Top 10を基準とします
<img width="670" alt="1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176903/c279d1ae-3b8a-b0d4-a50d-91848aa1c177.png">

#報告書イメージ

<img width="179" alt="スクリーンショット 0002-04-26 13.27.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176903/68ca86f8-6695-f9be-1f2a-5d82a9754df4.png">

Msafe Technologyの脆弱性診断サービスはキャンペンで無料実施しております。
ご希望のお客様はコーポレートサイト問い合 わせフォームよりお問い合わせください。
[Msafe Technology株式会社](https://www.msafe.co.jp)
画像から枠を取り出す

準備

```
import cv2
import matplotlib.pyplot as plt
```
処理

```
#画像を読み込む
img = cv2.imread("〜〜〜.png")
#画像をグレースケール化
img_gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
#画像を表示
plt.imshow(img_gray)
plt.gray()
```

[OpenCVでの表のセルの認識方法](https://teratail.com/questions/151317)

 edge抽出の数字、minサイズの切り捨てのところをいじれば、使えるようになった。

[画像処理入門講座 : OpenCVとPythonで始める画像処理](https://postd.cc/image-processing-101/)

```
輪郭を抽出
image, contours, hierarchy = cv2.findContours(img_gray,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
#img2に描画
img2 = cv2.drawContours(img_gray, contours, -1, (0,255,0), 3)
#img2を表示、保存
plt.imshow(img2)
cv2.imwrite('img2.png', img2)
plt.gray()
```

contoursが輪郭、hierachyが輪郭の階層情報

cv2.findContours、cv2.drawContoursについての解説↓
[輪郭: 初めの一歩](http://labs.eecs.tottori-u.ac.jp/sd/Member/oyamada/OpenCV/html/py_tutorials/py_imgproc/py_contours/py_contours_begin/py_contours_begin.html)

[Python でグレースケール(grayscale)化](https://qiita.com/yoya/items/dba7c40b31f832e9bc2a)

[【Python入門】小数点の操作を切り上げからroundまで完全理解！](https://www.sejuku.net/blog/73255)

[[Python] リストの最大値、最小値とそのインデックスを取得する（max, min, index）](https://hibiki-press.tech/learn_prog/python/max_min_index/586)

[Python, OpenCVで画像を縦・横に連結 (hconcat, vconcat, np.tile)](https://note.nkmk.me/python-opencv-hconcat-vconcat-np-tile/)
Ubuntuで新型コロナウイルス(covid-19)撲滅のためのstay home解析をする

# 最初に
2020月4月現在、新型コロナが猛威を振るっています。
この脅威に対してさまざまな対策がされています。コンピュータ上で、私達でもstay homeで参加できるボランティアがあります。
知ってる方は知っているBOINCプロジェクト（のRosetta@home)ですね・・・。
[Boinc公式サイト](https://boinc.berkeley.edu)
[Rosetta@home公式サイト](http://boinc.bakerlab.org/rosetta/)

BOINCはさまざまな研究機関がグリッドコンピューティングを用いて解析するためのプラットフォームで、新型コロナウイルス(Covid-19)の解析をしているRosetta@home以外にも宇宙人から電波を解析したり、新しい素数を探索したりするなど個性的なプロジェクトが多くあります。


今回の新型コロナ関連のニュースでは、Folding@homeが話題になっています。
Folding@homeもBOINCのRosetta@homeもグリッドコンピューティングでウイルスの構造を分析して医療の発展に役立たせるものです。
Rosetta@homeでも新型コロナウイルスの解析できるようなので紹介します。
qiitaに投稿するのが初めてなので、不出来で誤りがあるかもしれません。
その際は、遠慮なくご指摘ください。

**注意事項**
 - Boincをインストール、稼働させた場合のリスクや損失は、こちらでは負いかねます。
 - 個人利用のコンピュータでのみ、インストール、稼働させてください。
団体、会社、学校などに無断でイントール、稼働させるのは禁止されているはずでし、トラブルの原因にもなります。

#なぜ、Windowsでないのか？
単に、up者がWindowsよりもubuntu系のLinuxディストリビューションを愛用しているためです。
もしかしたら、この記事のWindowsバージョンをつくるかもしれません。
また、MacOSでの参加方法は紹介できません。これは、金欠でお高いMacOSを変えないためです。。。

#Ubuntuでのインストール、導入方法

VirtualBox上で行っていますが、実機で行っても違いはありません。
1.**Ubuntuソフトウェアを開く**
![VirtualBox_ubuntu_25_04_2020_21_17_10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535888/de1131b2-5cc7-6257-8c81-bc61a9cb3beb.png)

2.**BoincManagerをインストール**
この方法が一番簡単にインストールする方法だと思います。
![VirtualBox_ubuntu_25_04_2020_21_18_10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535888/49351228-7c89-f343-9ed6-f32bceef7137.png)

3.**インストール後、BoincManagerを起動させる**
起動させた直後、BoincManagerでどのプロジェクトを選択するか問われます。
「Biology and Medicine」を選択し、
![VirtualBox_ubuntu_25_04_2020_21_22_00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535888/8522e89c-3c16-d5b4-5dec-f6e1f591001c.png)

そのなかのプロジェクトから、「Rosseta@home」を選択します。
![VirtualBox_ubuntu_25_04_2020_21_22_23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535888/43731ab0-2a8d-a158-7cf0-7df9fb427700.png)
4.**Rosetta@homeのアカウントを設定する**
メールアドレスとパスワード、パスワードの確認を設定するとRosetta@homeのアカウントが作成されます。
すでにBoincのアカウントを持っている方は、「はい、すでにアカウントがあります」からメールアドレスとパスワードを入力してください。
![VirtualBox_ubuntu_25_04_2020_21_22_44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535888/6b32fd52-e5df-d1dd-eda2-97e100f036a2.png)
5.**実際に稼働させてみる**
アカウントを設定すると、自動的にRosetta@homeのサーバに接続してタスクがダウンロードされます。
BoincManegerの「表示」メニューから「詳細表示」をクリックして開き、「タスク」タブを開くとタスクに関する詳細な情報が見れます。このときにタスクの「名前」の欄にCOVID-19があれば、そのタスクは新型コロナウイルスに関する解析を行っています。
新型コロナウイルスに関する解析だけを行うことはできないそうです。それが少し難点かもしれません。

「表示」メニューから「詳細表示」に切り替えた画面です。
![VirtualBox_ubuntu_26_04_2020_11_16_29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535888/5fc4ee6a-d164-6e5d-86ba-bd8b2e4ca017.png)

タスクの横にスライドさせると「名前」という欄があります。
その中に、赤い枠で囲ったように「COVID-19」があれば新型コロナウイルスの解析ができていることになります。（ない場合もありますが、それでも他の病気を撲滅するために役立ちます。）
![VirtualBox_ubuntu_26_04_2020_11_17_27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535888/30711a54-a77f-bcfc-6e7d-ff6e0177153e.png)

[Rosetta@home](http://boinc.bakerlab.org/rosetta/)のサイトにアクセスしてログインすれば、アカウント情報の確認、設定やBoincを稼働する際の細やかな設定（プレフレァンス）の調整が可能です。（プレファレンスの調整はBoinc Manager上でもできます。その場合、Boinc Manager上の設定が優先します。）
ImageMagickをJSから呼び出す

#概要
ImageMagickを使って画像生成をしようと思っていて、簡単な処理ならターミナル等でコマンドを打って実行するのだが複数の画像を順番に合成するなどシーケンシャルな処理をする場合にそれだとしんどいので何かスクリプトを使いたいなと思って検討した結果JavaScript(以下JS)にしようと思い検討理由と実行記録を残しておきました。

#なぜJSにしたのか
本当に簡単な処理ならShellscriptでもいいかなと思いますが今回はif文もいくつかケースがわかれたりJSONの読み込み等が発生するため除外。もちろんShellscriptでもできますが不慣れだし大抵の人にとっては見にくいケースもあるので。
次にPythonを検討した。PythonMagickなどのライブラリが用意されていて使いやすいということもあるし最近は画像処理で多く使われていたり人気の言語だったりするので。
迷った結果最終的には[Electron](https://www.electronjs.org/)でGUI作る必要があるかもしれないというのがあったのでJSにしました。

#実行環境
* macOS Mojave 10.14.6
* node v12.16.1
* シェルは bin/bash

#方法
上記で実行環境書いてますがやり方としてはnode.jsを使ってコマンドラインでJSを呼び出し、JS内でシェルコマンドを実行するものとなっています。JSにもnode-imagemagickなどの直接ImageMagickを使うライブラリがあるのですがライブラリ自体のバグがあった場合に追うのが面倒だなと思ったのと情報量は直接コマンド実行したものの方が多いだろうと思ったため今回はJS内から直接コマンドを実行するようにしています。
node.jsはその時の最新の安定板を使いました。nodeの最新版の入れ方は参考にある記事等を見ていただければと思います。
JSからシェルコマンドを実行する方法としては`exec`と`execSync`というものがあって前者は非同期実行で後者は同期実行です。今回の例では`execSync`を使います。
以下がプログラム。1行目でexecSyncを読み込み2行目でexecSyncを用いてImageMagickのコマンドを実行。
ちなみに今回のImageMagickのコマンドはconvertを用いて100x100の赤い画像を生成しています。

```javascript:convertExample.js
const {execSync} = require('child_process');

execSync('convert -size 100x100 xc:red red.jpg');
```
![red.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4541/60049552-ca8d-87b9-e969-4f53720f06cb.jpeg)

変数を用いて画像の大きさを変更したといった場合もあるのでその場合はutil.formatを使います。
以下は先ほどと同様に100x100の赤い画像を作成した後に青文字で"hoge"という文字を描いています。
また、util.formatを用いてフォントサイズや色や文字の内容を変数で渡すようにしています。

```javascript:convertUseUtilExample.js
const {execSync} = require('child_process');
const util = require('util');

const fontSize = 24;
const color = 'blue';
const content = 'hoge';

execSync('convert -size 100x100 xc:red red.jpg');
execSync(util.format(
  'convert -font Bookman-DemiItalic -gravity center -pointsize %d -fill %s -draw "text 0,0 %s" red.jpg red.jpg',
  fontSize, color, content));
```
![red.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4541/934237dd-d3b6-2ced-8dfb-0da224a78c0c.jpeg)

上記のようにutil.formatを使ってコマンドをプログラムによって柔軟に変更することができるので組み合わせることで複雑な画像も生成できるかと思います。
画像を使う業務をしている方は使いこなすと思わぬところで業務効率もあがると思うのでで色々試してみましょう！

#参考
[NodebrewでNodeをインストールする](https://qiita.com/mame_daifuku/items/373daf5f49ee585ea498)
[シェルコマンドを実行する方法(child_process)](https://www.wakuwakubank.com/posts/728-nodejs-child-process/)
基本情報技術者試験の用語をただただ並べたマインドマップ

## 基本情報技術者試験（午前問題）の用語
私は令和元年度秋期試験の基本情報技術者試験に合格しました。
午前問題は87.5/100点とそこそこの高得点がとれたと思います。
その時にメモ程度に作っていたマインドマップがあったので、どなたかの参考になりましたらと思い公開させていただきます。

※メモ程度ですので間違いはたくさんあるかと思いますが、ご了承ください。

# マインドマップ
![基本情報技術者.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539054/63daf9ed-0a52-26be-04e2-667d001a0372.png)
Unity コンポーネントの有無を調べる方法

ちょっと引っかかったのでメモ。

```c#
var component = object.GetComponent<Image>();

if(component == null)
{
   //メソッド
}

```


コンポーネントが無い場合にコンポーネントを追加する方法。

```C#
var component = object.GetComponent<Image>();

if(component == null)
{
   object.AddComponent<Image>();
}
```
【環境構築】Rails6をCloul9で環境構築する

# Rails6をCloud9で動かす

試行錯誤を繰り返したが構築できなかったため、cloud９の作成からやり直しました。
その経緯を着ていきます。

- 環境の作成

以下の記事を参考にしました。
https://skillhub.jp/courses/134/lessons/785

設定画面内の「Rails6ではこちら」が重要かと思います。


- サーバーが立ち上がらない
- 
以上の記事の通り進めましたが、以下のエラーメッセージが出て立ち上がらない。

```ruby:qiita.rb
Address already in use - bind(2) for "127.0.0.1" port 8080(Errno::EADDRINUSE)
```


色々と調べ、以下のように試行錯誤。

```ruby:qiita.rb
 $ lsof -i:8080
COMMAND  PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
ruby    8850 ubuntu   14u  IPv4  42953      0t0  TCP localhost:http-alt (LISTEN)
ruby    8850 ubuntu   15u  IPv6  42954      0t0  TCP ip6-localhost:http-alt (LISTEN)
```

と表示され、8850の部分をkillすればいいらしく、下記を実行。

```ruby:qiita.rb
$ kill -9 8850
$ lsof -i:8080
```

サーバーが立ち上がりました！！
【paizaスキルチェック】Rubyでの標準入力の受け取り方



# はじめに

プログラミングを始めた頃、paizaのスキルチェックを始めた時に標準入力で困ったので、同じような人のために、paizaの標準入力の受け取り方を書いていきます。

## 値が一つだけの場合の標準入力の受け取り方

一番シンプルなパターンですね。
例えば下図のような標準入力があったとします。

| 標準入力     |
|:-----------------|
| 5         |
getsメソッドで受け取れます。


~~~ruby
 input = gets
~~~

paizaの標準入力は文字列で与えられます、今回は数字ですのでこのままだと計算したり大小比較ができないので、文字列から数値に変換しましょう。to_iメソッドを使うと可能です。


~~~ruby
 input = gets.to_i
~~~



getsは複数回使うと次の標準入力を受け取ってしまうので、受け取った値を何回も使いたいときは変数に代入しておきましょう。今回はinputという名前の変数にしていますが、`a = gets` , `number = gets`とかでも大丈夫です。




## 複数の値が一行にある場合の標準入力の受け取り方

1行に複数の値があった場合です。

paizaだと複数の値に半角スペースを挟んだ文字列が渡されます。

| 標準入力     |
|:-----------------|
| 5 10 20     |

後ろに`.chomp!.split(" ")`をつけます

`.chomp!`が改行を消すメソッドです、これをつけないと末尾に改行の記号がくっついてしまいます。

`.split(" ")`が文字列を分解して配列に変換するメソッドです。引数に`" "`
を渡すことで半角スペースを区切りにして配列になります。

~~~ruby
 input = gets.chomp!.split(" ")
~~~

出力してみると

~~~
p input
 => ["5", "10", "20"]
~~~

文字列でなく数値として受け取りたい場合はさらにmapメソッドを使いましょう。配列の値を一個ずつ取り出して数値に変換していきます。

~~~ruby
 input = gets.chomp!.split(" ").map{|n| n.to_i}
~~~

出力してみると

~~~
p input
 => [5, 10, 20]
~~~




## 複数行にわたる値の標準入力を受け取り方

複数行に値があった場合です。

paizaの場合、大抵一つ目の標準入力にこの後の標準入力の行数を与えてくれるので、それを利用します。
今回で言うと3ですね。

| 標準入力     |
|:-----------------|
|3|
| 5    |
| 10     |
| 20     |

まず最初の標準入力を受け取りましょう。

~~~
N = gets.to_i
~~~

続いてこの値を用いて複数行の標準入力を受け取っていきます。

今回は5, 10, 20をそれぞれ配列に入れていく形で受け取っていきましょう。

timesメソッドを使います。

~~~ruby

numbers = []

N.times do
  numbers << gets.to_i
end

~~~

numbersと言う空の配列を用意して、N回標準入力を受け取ってnumbersに入れていくと言う流れです。

出力すると

~~~
p numbers
=> [5, 10, 20]
~~~

これで標準入力が受け取れるので、受け取った値を使って問題を解いていけますね!
Heroku+Rails+MySQLでデプロイする方法

Heroku+Rails+MySQLでデプロイした際の備忘録として作成いたしました。

## 環境
MacOS 10.15.4
Ruby 2.5.1
Rails 5.2.3
Mysql2 0.5.3

## Heroku上にアプリを作成
※Herokuの新規登録とクレジットカードの登録がまだの方は登録を済ませてから行ってください。

```
$ heroku login
```
上記のコマンドでブラウザにログインページが出てくるのでログインしてください。

```
$ heroku create <アプリ名>
```
```
$ git remote
```
herokuのgit URLが表示されることを確認してください。
下記の様に出力されます。

```
heroku  https://git.heroku.com/<アプリの名前>.git (fetch)
heroku  https://git.heroku.com/<アプリの名前>.git (push)
origin  git@github.com:shou1012/<アプリの名前>.git (fetch)
origin  git@github.com:shou1012/<アプリの名前>.git (push)
```
git remoteで表示されたherokuのgit URLをリモートリポジトリに追加します。

```
$ git remote add heroku https://git.heroku.com/xxxxx-xxxxx-xxxxx.git
```

## 環境設定
データベースと環境変数の設定を行なっていきます。
今回は無料のigniteプランで作成致します。

```
$ heroku addons:create cleardb:ignite
```
```
$ heroku config
```
下記の様にClearDBのURLが表示されますので、コピーしておきます。

```
CLEARDB_DATABASE_URL: mysql://<ユーザー名>:<パスワード>@<ホスト名>/<データベース名>?reconnect=true
```
上記のURLを参考に下記を登録していきます。

```
$ heroku config:add DB_NAME='<データベース名>'
$ heroku config:add DB_USERNAME='<ユーザー名>'
$ heroku config:add DB_PASSWORD='<パスワード>'
$ heroku config:add DB_HOSTNAME='<ホスト名>'
$ heroku config:add DB_PORT='3306'
```

続いて、DATABASE URLを登録します。
※今回はmysql2で登録しますが、Gemfileを確認して'mysql'を使用している場合は、mysql://で始めてください。

```
$ heroku config:add DATABASE_URL='mysql2://<ユーザー名>:<パスワード>@<ホスト名>/<データベース名>?reconnect=true'
```
Railsの環境変数にcredentials.yml.encを使っている場合は下記で登録できます。

```
$ heroku config:set RAILS_MASTER_KEY='cat config/master.key'
```

heroku configで登録内容が確認できます。

```
$ heroku config
```
## 本番環境のcompileの設定

config/environments/production.rbに下記を追加します。

config/environments/production.rb

```rb
config.assets.compile = true #falseからtrueへ
config.assets.initialize_on_precompile=false
```
## デプロイ

```
$ git add .
```
```
$ git commit -m "コミットメッセージ"
```
```
$ git push heroku master
```

これでうまくいけばデプロイは完了です!!
エラーが出る場合は<a href="https://qiita.com/shimpex/items/f8e1c5d79311719c3f57">こちら</a>をご確認ください。

最後にdbマイグレーションをします。

```
$ heroku run rake db:migrate
```

では、アプリを開いてみましょう！

```
$ heroku open
```
以上でHerokuによるデプロイが完了しました！

## 最後に
Herokuを使うことで非常に簡単にデプロイができました。
問題がなければこれからも使用していきたいです。

## 参考
https://kurose.me/heroku-deploy/
https://qiita.com/rainbow___0/items/1789920cf797b5e80a5e
https://qiita.com/daigou26/items/64d87d987652c4108ae6
https://qiita.com/terufumi1122/items/27bf288414569e13e050
以前やったことの棚卸し 1

大学生のときに書いたコードを整理して、セルフ解説して理解を深めようと思う。何かしてないと落ち着かないし。

卒論で機械学習について取り組んだ。「バンディット問題」というらしい。

むかしむかし、あるところに「バンディットマシン(以下、マシン)」と呼ばれるスロットマシンがあったとさ。

マシンを実行(以下、プレイ)するとパチンカス(以下、プレイヤー)は確率$p (0 \leq p < 1)$ でアタリを、確率$1-p$ でハズレの結果を返す。

乱数$x (0 \leq x < 1)$ の値を$p$ と比較する。

```python3:bernoulli.py
def bernoulli(self, x):
    if p < x:
        return 0
    else:
        return 1
```

アタリのときに報酬1 を、ハズレのときに報酬0 を与える関数である。
プレイが$n$ 回のときの総報酬を$reward_{(n)}$ として、
プレイを無限回続るときの様子を数式で表すと以下のような感じになる。しらんけど。

```math
\lim_{n→\infty} \frac{reward_{(n)}}{n} = p
```
30% の確率で大吉が出るおみくじを、100 回引いたら30 回くらい大吉が出る。おみくじを1,000 回, 100000 回 , 100000000 回, ... と引いて、おみくじ回数を無限に近づけると大吉確率は30% ピタリになる。

---
ここに、上記と同じ設定のマシンが$N$ 台あったとする。限られた予算でより良いマシンを選択し、より多くの報酬を積み重ねたい。

各マシンを無限回プレイするわけにはいかないので、あまりアタリが出ないマシンに見切りをつけて、よりアタリが出やすいマシンに投資をしたい。

この、マシンの良し悪しの判断基準をプレイごとに数学で計算して、(得を増やす or 損を減らす) ことを目指すのが「バンディット問題」である。しらんけど。

「ーーーーーー破産してまうから、ハイエナ先を探すねん。
　　　ーーーーーーー財布は無限とちゃいまんねん。ーーーーーーーー」

<----------------続く--------------------(飽きた)>
XP IE6でhttps閲覧できるのはOpenSSL 1.0.2まで ( DES-CBC3-SHA )

## Nginx のバージョン

* XP IE6で`https`で閲覧出来たもの

```nginx
ssl_ciphers	'DES-CBC3-SHA';
```

| Nginx | 結果 | XP |
|:--|:--|:--:|
| 1.7 | 見れる | o |
| 1.10 | 見れる | o |
| 1.11 | 見れる | o |
| 1.12 | 見れない | x |
| 1.13 | 見れない | x |
| 1.15 | 見れない | x |
| latest | 見れない | x |



## OpenSSLのバージョン

* Open SSLで TLS1.2に対応しているのは、openssl-1.0.1e以降。
    * CentOS 6 には入っている。

| oraclelinux |OpenSSL| XP |
|:--|:--|:--:|
| 5 | 0.9.8e | o |


| centos |OpenSSL| XP |
|:--|:--|:--:|
| 6 | 1.0.1e | o |


| alpine |OpenSSL| XP |
|:--|:--|:--:|
| 2.6 | 1.0.1m-r0 | o |
| 2.7 | 1.0.1q-r0 | o |
| 3.1 | 1.0.1u-r0 | o |
| 3.2 | 1.0.2k-r0 | x |
| 3.3 | 1.0.2q-r0 | x |
| 3.5 | 1.0.2q-r0 | x |
| 3.7 | 1.0.2t-r0 | x |
| 3.8 | 1.0.2u-r0 | x |
| 3.9 | 1.1.1g-r0 | x |
| 3.10 | 1.1.1g-r0 | x |
| 3.11 | 1.1.1g-r0 | x |


| debian |OpenSSL| XP |
|:--|:--|:--:|
| 8 | 1.0.1t-1+deb8u12 | o |
| 9 | 1.1.0f | x |



| ubuntu |OpenSSL| XP |
|:--|:--|:--:|
| 10.04 LTS | 0.9.8k | o |
| 12.04 LTS | 1.0.1 |  o |
| 16.04 LTS | 1.0.2g | o |
| 18.04 LTS | 1.1.0g | x |


## おまけ

* [Template:ウェブブラウザにおけるTLS/SSLの対応状況の変化 - Wikipedia](https://ja.wikipedia.org/wiki/Template:%E3%82%A6%E3%82%A7%E3%83%96%E3%83%96%E3%83%A9%E3%82%A6%E3%82%B6%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8BTLS/SSL%E3%81%AE%E5%AF%BE%E5%BF%9C%E7%8A%B6%E6%B3%81%E3%81%AE%E5%A4%89%E5%8C%96)
AWSを用いてrailsアプリをデプロイするプロセスを頑張って噛み砕いてみるvol.6

##近況報告
大海に糸を垂らして魚を釣るのと鱒がそこにいるとわかっている生簀で鱒を釣るの，どちらが先に釣れるでしょうか。価値があるから売れるのと，売れるから価値がある，どちらが始まりなのでしょうか。鶏と卵論争ではないけれども，考えていくべきことですよね。

ついに最後，**Nginx**ですね。
まだやりたいことはあって，予定ではCapistranoとベーシック認証があるのでvol.8以上あるのか笑
さあいってみようかぁ！

##今回の内容
・インフラ整備での各アクションの言語化
・コードを単に打っているだけでは理解しきれないし，他に応用できないので言語化して整理
・テックキャンプ受講生支援()

##大まかな流れ＆設定
Nginxインストール
##事前準備
[vol.1](https://qiita.com/aaabb6211/items/6194fa53f29061dc5444)
[vol.2](https://qiita.com/aaabb6211/items/2f8c5034b791767dee7a)
[vol.3](https://qiita.com/aaabb6211/items/ed338de73ec123851308)
[vol.4](https://qiita.com/aaabb6211/items/9a3577aa038546387887)
[vol.5](https://qiita.com/aaabb6211/items/a9d1c2910be1e74cd299)

###Nginxインストール＆設定

```EC2.
sudo yum -y install nginx
```
sudo yum の解説は前の項で触れています。
インストールできたら設定を編集していきます。むやみやたらにいじられたくないファイルなので権限も強いです。sudo権限でvim形式で編集していきます。

```EC2.
$ sudo vim /etc/nginx/conf.d/rails.conf
```

```rails.conf
upstream app_server {
  server unix:/var/www/<アプリケーション名>/tmp/sockets/unicorn.sock;
}
  ⇨Unicornと連携させるための設定。アプリケーション名を自身のアプリ名に書き換えることに注意。upstreamは上流の意。ここでunixが登場していることはよくわかんなかった。

server {
⇨ {}で囲った部分をブロックと呼ぶ。サーバの設定ができる
  listen 80;
⇨このプログラムが接続を受け付けるポート番号
  server_name <Elastic IP>;
⇨接続を受け付けるリクエストURL
  client_max_body_size 2g;
⇨クライアントからアップロードされてくるファイルの容量の上限を2ギガに設定。デフォルトは1メガ
  root /var/www/<アプリケーション名>/public;
⇨接続が来た際のrootディレクトリ
  location ^~ /assets/ {　←assetファイルはここに入っているのを参照するよ
    gzip_static on;　←圧縮状態のものを配信。容量が小さくなるのでメモリの負担減らせる
    expires max; ←キャッシュの有効期限。maxは限界までの意
    add_header Cache-Control public;　←キャッシュを受け取る範囲の選択
⇨assetsファイル(CSSやJavaScriptのファイルなど)にアクセスが来た際に適用される設定
  }

  try_files $uri/index.html $uri @unicorn;
⇨ファイルの選択，右の＄からアクセスされる

  location @unicorn {
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_redirect off;
    proxy_pass http://app_server;
⇨Nginxからユニコーンにむけた設定
  }

  error_page 500 502 503 504 /500.html;
⇨エラーが表示された時のページ
}
```
<Elastic IP>と<アプリケーション名>計三箇所直したら，脱出(:wq)

**補足**
プロキシ
ブラウザとウェブサーバーの中間役。ウェブサーバーの情報をブラウザで写すが，プロキシはウェブサーバーの代理としてウェブサーバーからの情報を写す。 ⇨[わかりやすかった説明](https://wa3.i-3-i.info/word1752.html)
location unicornではHTMLメソッドの受け取る方法とか表示の仕方とか設定してるっぽい。

権限変更を行ったあと，再起動をします。

```EC2.
$ cd /var/lib
$ sudo chmod -R 775 nginx ←-RはNginxに対してって意味 
$ cd ~
$ sudo service nginx restart
⇨初めにfailed出ても再起動でOKがでれば大丈夫
```
**カリキュラムで分からなかった点
POSTメソッドを用いるとエラーが発生する可能性があるから権限変更を行うらしいのですが，このコマンドが通信量の多いPOSTメソッドのエラーを防ぐのかまだ理解できていません。**

●補足[chmodについて](https://qiita.com/aaabb6211/items/30ddad48773f37affcb9)

UnicornをNginxに接続

```config/unicorn.rb
listen 3000

↓以下のように修正

listen "#{app_path}/tmp/sockets/unicorn.sock"
```

githubに反映後，EC2に読み込み。
unicorn再起動処理をして，ブラウザにElastic IPを直打ちしてアプリケーションのルートページが表示できれば成功。うまく表示できない場合はもう一回やり方を見直す。URLが見つからないことで表示されてない可能性があるので注意して見る。

###終わりに
**テックキャンプのカリキュラム，はしょりすぎぃ！！！**
まあ多分目的は完全理解というより大枠を捉えよ的な教科書みたいなアプローチですな。
１０週間でやれることなんてたかがしれてるし，Nginxひとつとっても理解しようとすれば数百ページの本を読まないとだから無難なのかな（しかもオープンソースだから今この瞬間にアップデートされているかもしれない...）。


微量でも参考になったらLGTM，ご指導はコメント欄にお願いします！
【Unity】シーンの事前ロード

#環境
Unity 2019.3.7f1

#はじめに
移動先のシーンが重くて遷移まで間が開いてしまう問題を解決するべく
シーンの事前ロードについて調べました。

#方法
事前ロードし、ボタンを押したらシーン移動するコード

```CSharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;//追加

public class SceneTest : MonoBehaviour

{
    AsyncOperation a;//AsyncOperation型の変数aを宣言
    void Start()
    {
        //SceneManager.LoadSceneAsync("GameScene")の返り値(型はAsyncOperation)を変数aに代入
        a = SceneManager.LoadSceneAsync("GameScene");

        //AsyncOperationの中の変数allowSceneActivationをfalseにする
        //これがtrueになるとシーン移動する
        a.allowSceneActivation = false;
    }

    //ボタンに割り当て
    public void Change_Scene_button()
    {       
        //trueにしてシーン移動
         a.allowSceneActivation = true;
    }
}
```

###解説
SceneManager.LoadSceneAsync("シーン名");のみを使ってシーン移動する場合、
下図のことが処理されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613985/016ff2e7-4cb1-cbee-3bc4-caa00054866e.png)

　
allowSceneActivationの情報を下図のように一旦falseにしておくことで
シーン読み込み後のシーン移動をストップします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613985/b38dd6d2-07ed-8eb9-4376-862de378cf9e.png)

#おわりに
ちょっとややこしいですが、定型文として覚えておく程度で良いと思います。
動けばOKの精神♪
bash memo



https://gist.github.com/mkottman/1936195

```:.bashrc


alias emacs='emacs -nw'


# A two-line colored Bash prompt (PS1) with Git branch and a line decoration
# which adjusts automatically to the width of the terminal.
# Recognizes and shows Git, SVN and Fossil branch/revision.
# Screenshot: http://img194.imageshack.us/img194/2154/twolineprompt.png
# Michal Kottman, 2012
 
RESET="\[\033[0m\]"
RED="\[\033[0;31m\]"
GREEN="\[\033[01;32m\]"
BLUE="\[\033[01;34m\]"
YELLOW="\[\033[0;33m\]"
 
PS_LINE=`printf -- '- %.0s' {1..200}`
function parse_git_branch {
  PS_BRANCH=''
  PS_FILL=${PS_LINE:0:$COLUMNS}
  if [ -d .svn ]; then
    PS_BRANCH="(svn r$(svn info|awk '/Revision/{print $2}'))"
    return
  elif [ -f _FOSSIL_ -o -f .fslckout ]; then
    PS_BRANCH="(fossil $(fossil status|awk '/tags/{print $2}')) "
    return
  fi
  ref=$(git symbolic-ref HEAD 2> /dev/null) || return
  PS_BRANCH="(git ${ref#refs/heads/}) "
}
PROMPT_COMMAND=parse_git_branch
PS_INFO="$GREEN\u@\h$RESET:$BLUE\w"
PS_GIT="$YELLOW\$PS_BRANCH"
PS_TIME="\[\033[\$((COLUMNS-10))G\] $RED[\t]"
export PS1="\${PS_FILL}\[\033[0G\]${PS_INFO} ${PS_GIT}${PS_TIME}\n${RESET}\$ "
```
【Rails】Could not find a JavaScript runtime　となる時の解決方法


【事象】
bundle exec rake db:create　すると下記のエラーが出る。

rake aborted!
ExecJS::RuntimeUnavailable: Could not find a JavaScript runtime.
 See https://github.com/rails/execjs for a list of available runtimes.


【解決策】
Gemfileに下記を追加し、bundle installすると解決した。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534469/978a2ce2-0c01-e7c6-7b94-120d5aa0a24d.png)
ExecJSとは、RubyからJavaScriptコードを実行できるもの。
エラーの原因は、RubyからJavaScriptを呼び出す役割を持つ
ExecJSのランタイムが見つからないためのようなのでランタイムを追加してあげれば良いと推測。

ExecJSのことを　https://github.com/rails/execjs
で見たが、gem therubyracerをインストールするとエラーになったので
また調べてgem mini_racerをインストールすると解決した。
【Linux】隔離された不正プログラムファイルをローカルへダウンロードしてベンダーに解析依頼したい【zipコマンド】

##隔離された不正プログラムをベンダーに調査してもらいたいと思ったときのTIPS
・サーバAに不正プログラムと思われるプログラムを設置された。
・セキュリティ製品によって、不正プログラムは隔離された。
・設置されたプログラムが不正プログラムだったかベンダーに調査を依頼したい。
・サーバAから不正プログラムをローカルPCに普通にダウンロードしてしまうとローカルPCのセキュリティ製品が不正プログラムと判定して隔離/削除してしまう。

そんなときのTIPSです。

##zipコマンドを利用し、不正プログラムを暗号化ダウンロードしよう

暗号化するには、-Pオプションを利用します。
`$ zip -P «パスワード» «ZIPファイル名» «不正プログラムファイル»`

例えば、
・パスワードはvirus
・ZIP暗号化後のファイル名はhusei_program_angouka
・不正プログラムファイルの名前はakuma
の場合に発行するコマンドは以下。

`$ zip -P virus husei_program_angouka akuma`

これで暗号化できたので、winscpなどを利用して、ローカルPCへダウンロードしましょう。
暗号化されたファイルの中身まではローカルPCのセキュリティ製品でSCANされませんので、そのままベンダーへ調査依頼のため暗号化ZIPファイルを提出します。

＜終わり＞
Firebase ML 備忘録（クイックスタート）

# はじめに
Firebase ML を試す機会があったので、
その時にやったこと・わかったことを備忘録に残します。

# 参考にしたサイト
[公式](https://firebase.google.com/docs/ml-kit?hl=ja)

一番手軽に始めるなら、
[クイックスタートサンプル](https://github.com/firebase/quickstart-android/tree/master/mlkit)をDL（ clone は一つ上の階層から他のPJも含めてになります）して、
Firebaseにパッケージを登録するのが一番早かったです。
（逆に、Firebase使ってる既存のPJのパッケージ名にアプリを寄せちゃうかですね...）

自分でコードを書いて、作ってみる場合は[コードラボ](https://codelabs.developers.google.com/codelabs/mlkit-android/#0)が一番いいです。
CameraXも使いながら、テキスト解析・顔認識・バーコード解析をやってみましたが、
ある程度APIのインタフェースは揃っていたので、一つの使い方を理解すれば展開ができそうでした。

# 詰まったところ
テキスト認識から始めたのですが、手元にある端末(OS8のHuwai端末）では動きませんでした。
[stackoverflow](https://stackoverflow.com/questions/50331999/google-ml-kit-waiting-for-the-text-recognition-model-to-be-downloaded)
（Google開発者サービスのデータ削除も何度もやったのだけど...）

同じコードで別端末では動いたので、端末の相性がある？のかもしれません...
顔認識とバーコード解析はできました..

# まとめ
自分でCustomモデル作らないと学習の効果や深さを得られないかなとも思いましたが、
既存の物を理解・使用するだけでもFirebase ML の外観がわかりました。
画像解析使用時のペアになるCameraXがβ版であり、
Firebase ML 自体もβ版なので商用投入はもう少し待ってからの方が良さそうです。
（2020年4月現在）
コンストラクタの勉強をした(java)

コンストラクタの勉強をしたかったので、ググって(ググる："Google で検索する" の意。Google で無くとも使う)コードを引っ張ってきた。

```java:ctest7.java
class ctest7{
  public static void main(String args[]){
    Television tv1 = new Television();

    tv1.dispChannel();
  }
}

class Television{
  private int channelNo;
  private String housouKyoku;

  public void setChannel(int newChannelNo){
    channelNo = newChannelNo;
    if (channelNo == 1){
      housouKyoku = "FujiTV";
    }else if (channelNo == 3){
      housouKyoku = "NHK";
    }
  }

  public void dispChannel(){
    System.out.println("現在のチャンネルは" + housouKyoku + "です");
  }
}
```
これをコンパイルして実行すると、
「現在のチャンネルはnullです」
と表示される。housouKyoku が格納されず、null になってしまっている。

これを修正すると以下のコードになるらしい。

```java.ctest8.java
class ctest8{
  public static void main(String args[]){
    Television tv1 = new Television();

    tv1.dispChannel();
  }
}

class Television{
  private int channelNo;
  private String housouKyoku;

  Television(){
    channelNo = 1;
    housouKyoku = "FujiTV";
  }

  public void setChannel(int newChannelNo){
    channelNo = newChannelNo;
    if (channelNo == 1){
      housouKyoku = "FujiTV";
    }else if (channelNo == 3){
      housouKyoku = "NHK";
    }
  }

  public void dispChannel(){
    System.out.println("現在のチャンネルは" + housouKyoku + "です");
  }
}
```
もとのctest7.java のコードに

```java
  Television(){
    channelNo = 1;
    housouKyoku = "FujiTV";
  }
```
を追加したものとなっている。

そうか、初期化ってそういうことか。
理屈はあってるけど初期値として中身がないと動作としてはうまく行かないんだ。
だから初期値を設定しておく必要があるんだ。
メソッドに直接記述して、呼び出すたびに上書きするってのもできるだろうけど、それじゃ大規模なコードを分担して作業するのには向いてないんだな。

ほー。

[参考]
「コンストラクタとは - コンストラクタ - Java入門 - Let'sプログラミング」
https://www.javadrive.jp/start/constructor/index1.html
我、scalaを使いて問題を解決す Q1

# 導入
4月より未経験エンジニアとして勤務しておりますが、
言語の理解度を上げるためにAtCoderに挑むことといたしました。

### 言語はscalaです。

とにもかくにも上達するためにはまずコードをことから始めようというわけであります。

まずはずっと気になっていた以下の記事の問題に挑んでみようではありませんか。
より良い解き方やメソッドがあればご教授いただけると幸いです。

## 問題
```
【問題概要】 

二つの正整数 aa, bb が与えられます。 aa と bb の積が偶数か奇数か判定してください。

【制約】

1≤a,b≤100001≤a,b≤10000
aa, bb は整数
【数値例】
1)
　a=3a=3
　b=4b=4
　答え: Even

3 × 4 = 12 でこれは偶数なので、"Even" を出力します。

2)
　a=1a=1
　b=21b=21
　答え: Odd

1 × 21 = 21 でこれは奇数なので、"Odd" を出力します。

【キーポイント】

四則演算
倍数判定
【解法】
まずは、Fizz Buzz でもおなじみの、倍数判定をする問題です！
素直に a * b を計算して、2 の倍数かどうかを判定すればよいでしょう。
```
[参考記事より引用](https://qiita.com/drken/items/fd4e5e3630d0f5859067#%E7%AC%AC-1-%E5%95%8F--abc-086-a---product-100-%E7%82%B9)

## 解答
```scala
object main extends App {
  oddOrEven(3, 4)

  def oddOrEven(x: Int, y: Int): Unit = {
    if ((x * y)%2 == 0) println("Even") else println("Odd")
  }
}
```
## 出力結果
```scala
Even
[success] Total time: 4 s, completed 2020/04/26 11:59:49
[info] 37. Monitoring source files for scala-training/run...
[info]     Press <enter> to interrupt or '?' for more options.
```
無事出力できました！
3 * 4 = 12で、12は偶数なのでEvenが出力されていれば正解ですね。

## 自己解説
```scala
object main extends App {
  oddOrEven(3, 4)

  def oddOrEven(x: Int, y: Int): Unit = {
    if ((x * y)%2 == 0) println("Even") else println("Odd")
  }
}
```
この問題では与えられた二つの整数を乗算が偶数か奇数かを判断することがキーになります。
判断する方法としては偶数は2で割り切れることができる点が重要だと考えます。
fizzBuzz問題でも使用する条件分岐を利用しました。
つまりもし(x * y)が2で割り切れるなら偶数なのでEvenを、それ以外は奇数なのでOddを出力するように条件を記述しています。

1問目は無事に解くことができて一安心です。

## 参考文献
[AtCoder に登録したら次にやること ～ これだけ解けば十分闘える！過去問精選 10 問 ～](https://qiita.com/drken/items/fd4e5e3630d0f5859067#5-%E9%81%8E%E5%8E%BB%E5%95%8F%E7%B2%BE%E9%81%B8-10-%E5%95%8F)