OmniAICreator/Qiita-1.07M huggingface dataset:
【Python】データサイエンス100本ノック（構造化データ加工編） 029 解説

- データサイエンス100本ノックをやりきる会を作りました🎉
- こちらの[Slack招待URL](https://join.slack.com/t/data-science-100nocks/shared_invite/zt-gfncg9vm-8W8b3UrDg8R~TKaqUkQpgw)からご参加ください！！
- ぜひ一緒に励まし合いながら、データサイエンス100本ノックをやり切りたいと思っています！

##Youtube
[動画解説](https://youtu.be/BtGFrGy_wyg)もしています。

##問題
P-029: レシート明細データフレーム（df_receipt）に対し、店舗コード（store_cd）ごとに商品コード（product_cd）の最頻値を求めよ。

##解答
```:コード
df_receipt.groupby('store_cd').product_cd.apply(lambda x: x.mode()).reset_index() \
.set_index(['store_cd','level_1','product_cd'])
```

##出力
| store_cd | level_1 | product_cd |
|:-----------|------------:|:------------:|
| S12007 | 0 | P060303001 |
| S12013 | 0 | P060303001 |
| S12014 | 0 | P060303001 |
| S12029 | 0 | P060303001 |
| S12030 | 0 | P060303001 |
| S13001 | 0 | P060303001 |
| S13002 | 0 | P060303001 |
| S13003 | 0 | P071401001 |
| S13004 | 0 | P060303001 |
| S13005 | 0 | P040503001
| S13008 | 0 | P060303001
| S13009 | 0 | P060303001
| S13015 | 0 | P071401001
| S13016 | 0 | P071102001
| S13017 | 0 | P060101002
| S13018 | 0 | P071401001
| S13019 | 0 | P071401001
| S13020 | 0 | P071401001
| S13031 | 0 | P060303001
| S13032 | 0 | P060303001
| S13035 | 0 | P040503001
| S13037 | 0 | P060303001
| S13038 | 0 | P060303001
| S13039 | 0 | P071401001
| S13041 | 0 | P071401001
| S13043 | 0 | P060303001
| S13044 | 0 | P060303001
| S13051 | 0 | P050102001
| 	 | 1 | P071003001
| 	 | 2 | P080804001
| S13052 | 0 | P050101001
| S14006 | 0 | P060303001
| S14010 | 0 | P060303001
| S14011 | 0 | P060101001
| S14012 | 0 | P060303001
| S14021 | 0 | P060101001
| S14022 | 0 | P060303001
| S14023 | 0 | P071401001
| S14024 | 0 | P060303001
| S14025 | 0 | P060303001
| S14026 | 0 | P071401001
| S14027 | 0 | P060303001
| S14028 | 0 | P060303001
| S14033 | 0 | P071401001
| S14034 | 0 | P060303001
| S14036 | 0 | P040503001
| 	 | 1 | P060101001
| S14040 | 0 | P060303001
| S14042 | 0 | P050101001
| S14045 | 0 | P060303001
| S14046 | 0 | P060303001
| S14047 | 0 | P060303001
| S14048 | 0 | P050101001
| S14049 | 0 | P060303001
| S14050 | 0 | P060303001

##解説
・PandasのDataFrame/Seriesです。
・同じ値を持つデータをまとめて処理し、同じ値を持つデータの合計や平均などを確認したい時に使用します。
・**'groupby'は、同じ値や文字列を持つデータをまとめて、それぞれの同じ値や文字列に対して、共通の操作（合計や平均など）を行いたい時に使います。**
・**'.apply(lambda x : <適用したい関数>)'は、直前で指定した列に関数を適用（=apply）するメソッド**です。'lambda x : <適用したい関数>'とすることで、引数 x を applyメソッド へ引き渡します。**lambda は無名関数と呼ばれており、関数に名前を付けずに簡潔に宣言するラムダ式という方法に用いられます**。(applyメソッドの詳細は[こちら](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.apply.html)、modeメソッドの詳細は[こちら](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.mode.html)をご覧ください)
・自動的に生成された'level_1'列は、store_cd ごとの product_cd の最頻値が複数ある場合に、インデックス番号を'0'から振り直しています。
・**'.reset_index()'は、'groupby'によってバラバラになったインデックス番号を0始まりの連番に振り直す操作を行いたい時に使います。**
・'.set_index()'は、なくても問題ないですが、'store_cd'をMulti-indexにする（複数行に渡ってindexとして表示する）際に使用します。
※Multi-indexの詳細は[こちら](https://qiita.com/ryskchy/items/59028f1a3ed1d433b1a8)をご覧ください**

※今までの問題の流れだと、こちらのコードで解答したくなりますが、エラーを返します。'.agg'では'mode'を計算することはできませんので、ご注意ください。

```:コード
df_receipt.groupby('store_cd').agg({'product_cd':'mode'}).reset_index()
```
OpenGL触ってみた

在宅勤務で時間に余裕が出来たので以前から興味があったOpenGLを勉強してみました。
# APIが分かりにくい
XにYを設定するような場合、普通のライブラリだと
initXY(x, y);
みたいな感じになってて引数と戻り値から機能が推測できるんですが、OpenGLはそうじゃなくって
setX(x);
setY(y);
みたいな感じでXをカレント◯◯に設定してカレント◯◯にYを設定することが多いです。
デバドラ書いてるみたいな感じというか、そもそもGPUのデバドラだからそういうもんなのでしょう。
ドキュメントをちゃんと読んで理解すべきなのでしょうけど、そっちはそっちでOpenGL特有の用語が山盛り出て来るのでこれまた分かりにくいです。
#というわけででデモを書きました
チュートリアルやらなんやらをざっと眺めただけではピンとこない部分が多かったので、結局コードを書きました（[3S-in-OpenGL](https://github.com/tshibata/3S-in-OpenGL)）。
## 影はシャドウマッピングで
影を扱う方法はいろいろやり方はあるらしいですがシャドウマッピング法を使ってみました。
##アルファブレンディングは鬼門
結局リアルタイムではアルファブレンディングは「なるべつ使わないのが吉」という気がします。
Zバッファ法と相性悪いですし。
##なるほど今のゲーム作りってのは大変だ
デモだけ作っても面白くないしゲームでも作ってみようかなと思ったんですが、一人で全部やろうとしたらキツいですね。
kotlinとjavaの基礎をまとめてみた

# はじめに…

この記事は[1個前の記事](https://qiita.com/sato-na/items/cc23f9b1db9c948dc00e)で書いた、

**7日間毎日記事投稿の2日目**

になってます

使うコードは下に貼りますが、このアプリの詳しい機能はその1個前の記事をご覧ください！

- java版 : https://github.com/sato-na/guruwake_java

- kotlin版 : https://github.com/sato-na/guruwake_kotlin

↓ここからが今回の記事の本題です↓

# それぞれの言語の基礎を比べると…

-- 目次 --

1. 変数定義の方法

2. if文の書き方

3. for文の書き方

4. String→Intにする方法

## 変数定義の方法

- javaの場合

```java
型 変数名 = 初期値;
```

型の指定が必要

例)

```java:ResultActivty.java
String rTxt = "";                // 31行目
int memberNum = memberL.size();  // 33行目
```

- kotlinの場合

```kotlin
val/var 変数名 = 初期値
```

val(不変)かvar(可変)かの指定が必要

例)

```kotlin:ResultActivity.kt
var rTxt = ""                 // 22行目
val memberNum = memberL.size  // 24行目
```

## if文の書き方

- javaの場合

```java
if (条件) {
    //条件がtrueだった時の処理
}
```

例)

```java:ResultActivity.java
if (n <= memberNum % groupNumI) {  // 39行目
    p++;
}
```

- kotlinの場合

```kotlin
if (条件) {
    //条件がtrueだった時の処理
}
```

例)

```kotlin:ResultActivity.kt
if (n <= memberNum % groupNumI) {  // 30行目
    p++
}
```

書き方同じ

## for文の書き方

- javaの場合

```java
for (for文を回すときに使う変数; 変数の条件; 処理後の変数の処理) {
    //for文に入った時の処理
}
```

例)

```java:ResultActivity.java
for (int q = 0; q < p; q++) {              // 43行目
    rTxt += "  " + memberL.get(0) + "\n";
    memberL.remove(0);
}
```

- kotlinの場合

```kotlin
for (forで使う変数 in 変数の初期値..最終値){
     //for文に入った時の処理
}
```

例)

```kotlin:ResultActivity.kt
for (q in 0..p-1) {                    // 34行目
    rTxt += "   " + memberL[0] + "\n"
    memberL.remove(memberL[0])
}
```

for文を回数の指定方法が違う

## String→Intにする方法

- javaの場合

```java
int 変数 = Integer.parseInt(変更する文字列)
```

例)

```java:ResultActivity.java
final String groupNum = intent.getStringExtra("GROUP_NUM");  // 26行目
int groupNumI = Integer.parseInt(groupNum);                  // 32行目
```

- kotlinの場合

```kotlin
val/var 変数名 : Int = 変更する値.toInt()
```

例)

```kotlin:ResultActivity.kt
val groupNum = intent.getStringExtra("GROUP_NUM")  // 18行目
val groupNumI : Int = groupNum.toInt()             // 23行目
```

構文が大きく違う

# 最後に…

今回はjavaとkotlinの基礎をまとめてみました。
githubにあげたコードにあることしか使っていないので、
変数名などがわかりにくかったり、今回の内容で触れていない機能も多く、
もしかしたらわかりにくかったかもしれません…
ですが、コードだけよりも少しでもわかりやすくなっていればいいなと思います。

このような感じで明日も記事を投稿するので、引き続き温かく見守ってください。
GLUEレコードについて

昔のメモ帳にGLUEレコードについてまとめていたので、Qiitaにも投稿する。

## GLUEレコードとは?

委任元DNSサーバ (上位DNS)に委任先DNSサーバのAレコードを登録しておく。
特に変わった書式ではなく、普通のAレコードと同じ書式らしい。
委任先DNSのIPアドレスが分からなければ、そもそも問い合わせできないからね。
【SpringBoot】ConfigurationPropertiesアノテーションを付与したクラスのbeanが見当たらなかった話

## ConfigurationPropertiesとは
SpringBootにおいて設定ファイルの値をアプリケーションで取り扱う方法の一つ。


#### application.yaml
```yaml
sample:
  hoge: hogeValue
  huga: hugaValue
  piyo: piyoValue
```

のような設定値が存在する場合に

```kotlin
package com.wakye.property

import ........

@ConstructorBinding
@ConfigurationProperties("sample")
data class SampleProperty(
        val hoge: String,
        val huga: String,
        val piyo: String
)
```

このように設定値に対応するフィールドを持つクラスにConfigurationPropertiesアノテーションを付与することで値のバインドを行った後にbeanとして登録してくれる、というもの。

なお、ConstructorBindingアノテーションは本筋と関係ありませんがkotlinでSpringBootアプリケーションを開発している場合、dataクラスにConfigurationPropertiesアノテーションを付与するため使用しています。

さて、問題はこのbeanを取得する際です。

## bean名がわからない
通常SpringBootによる機能に乗っかってコンストラクタなりにインジェクションしてもらう分には問題がないです。

ところが、bean名を指定して登録されたbeanを取得する必要があったのですがそこで問題が発生。
ApplicationContextで定義されているgetBeanメソッドを使用することで、bean名から登録されたbeanを取得することが可能です。

SpringBootではBean名のデフォルトはクラス名のローワーキャメルケースとなっています。
（アッパーキャメルケースでしかクラス名を定義していないのでもしかしたら戦闘が小文字になっているだけかもしれません）

ので

```kotlin
applicationContext.getBean("sampleProperty")
```

こんな感じで取得を試みるも例外発生、何やらsamplePropertyと定義されたbeanが存在しない模様。

## 調べてみる
ググること2,3時間。。。。。。。

ドキュメントでそれらしき記述を見つける！！！

> @ConfigurationProperties Bean がそのように登録されると、Bean は従来の名前 \<prefix>-\<fqn> を持ちます。<prefix> は @ConfigurationProperties アノテーションで指定された環境キープレフィックスで、<fqn> は Bean の完全修飾名です。アノテーションが接頭部を提供しない場合、Bean の完全修飾名のみが使用されます。

[公式ドキュメント引用](https://spring.pleiades.io/spring-boot/docs/2.1.3.RELEASE/reference/html/boot-features-external-config.html#boot-features-external-config-typesafe-configuration-properties)

どうやら通常のbean名で登録されないようです。

今回の場合だと

prefixが `sample`
fqnが `com.wakye.property`

となるのでbean名は

`sample-com.wakye.property.SampleProperty`

となるようです。

```kotlin
applicationContext.getBean("sample-com.wakye.property.SampleProperty")
```

こちらで無事取得成功。

なかなかわかりづらい落とし穴でした。
ESP32 - MicroPythonを使い、Discord-Webhooksへのリクエスト

# はじめに

ESP32 - MicroPythonを使い、Discord-Webhooksへのリクエスト方法について記載します。<br>
※Discordの紹介や設定手順は割愛します。

![d004.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559938/022a998a-0cd4-b792-d54a-9546ad44cef1.png)


# 開発環境

以下が確認した環境となります。

- ホストPC
  - windows10 64bit Home
  - VSCode - 1.48.0
     - Pymakr 1.1.5
  - NodeJS - 12.14.1 LTS
- ターゲット
    - MicroPython v1.12 on 2019-12-20; ESP32 module with ESP32

※MicroPythonの環境構築は、「[ESP32-VSCode-microPythonでの開発環境の構築](https://qiita.com/kotaproj/items/b53006aef9d04053a5ee)」を参照願います。



# 機材

|項目  |型名|備考  |
|---|---|---|
| ESP32-WROOM-32 開発ボード  |[NodeMCU-32S ESP32-WROOM-32]

# コード

動作確認したコードは以下となります。

|コード  |説明|備考  |
|---|---|---|
| SSID  |アクセスポイントのSSID | - |
| PASS  |アクセスポイントのパスワード | - |
| URL　 |Discord - webhook URL | - |




```python:discord.py
import network
import time
import urequests as requests

# AP
SSID = "XXXXXXXXXXXXX"
PASS = "YYYYYYYYYYYYY"

# discord webhook url
URL = "https://discord.com/api/webhooks/aaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"

def do_connect():

    wlan = network.WLAN(network.STA_IF)
    wlan.active(True)
    if not wlan.isconnected():
        print('connecting to network...')
        wlan.connect(SSID, PASS)
        while not wlan.isconnected():
            time.sleep(1)
    print('network config:', wlan.ifconfig())

    return


def main():
    do_connect()
    payload = """content=This message is sent by "ESP32"."""
    response = requests.post(URL, headers={"Content-Type": "application/x-www-form-urlencoded"}, data=payload)
    response.close()


main()

```

# 実行方法

```
>>> import discord
```

# 結果

![d004.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559938/022a998a-0cd4-b792-d54a-9546ad44cef1.png)


# メモリの問題

上記のコード自体は動作しますが、
いろんな機能を入れていくと、OSエラー（MemoryError）が発生します。

HTTPS通信が必要なため、ここにメモリを多く使用するようです。
いろいろと試してみましたが、以下の方法で回避できるかなと思われます。

- シングルスレッドで作成する
- 能動的にガベレージコレクションを実施する
- C言語で実装する
- デバイスを変更する


## シングルスレッドで作成する

各処理をスレッドにするだけでも、メモリをかなり消費します。
また、MicroPythonでは、Queueなどを使うことはできません。
仮に、socket通信でスレッド間の通信を行うとこれもメモリを使います。
全処理をメインループで行うように作ってあげた方がよさそうです。


## 能動的にガベレージコレクションを実施する

MicroPythonのガベレージコレクションが走る条件は、メモリの空きがある一定値より小さくなった場合です。
※空き容量は設定はできます。

HTTPS通信で、大きなメモリ取得が発生するため、その直前で能動的にガベレージコレクションを実施するほうが無難です。
以下のコードで実施することができます。

```
import gc

gc.collect()
```

## C言語で実装する

MicroPythonはファイルを読んで実行しているため、フリーズコードにしない限り、メモリ的には不利です。
C言語であれば、もうすこしメモリを抑えれる気がします。
以前、同じデバイスで、FreeRTOSで今回のようなコードを書いたことがありますが、
特に問題は起きなかったと記憶しています。



## デバイスを変更する

そもそも512KByte上で、実施することに問題があります。
ESP32-WROVERシリーズであれば、4MByteのRAMがあります。
手軽ですが、値段が上がってしまうため悩ましいところです。



# 参考

* [micropython docment](https://micropython-docs-ja.readthedocs.io/ja/latest/library/)
* [github - urequests](https://github.com/micropython/micropython-lib/tree/master/urequests)
Apache 2.2 Order, Allow, Deny チートシート

Apache 2.2はアクセス制御が煩雑なので、Order, Allow, Denyの書き方をまとめてみた。
Apache 2.2はmod_access_compatが使われている。
まだApache 2.2で動いているwwwサーバが少なからずあるのです...

## 接続元IPベースでのアクセス制御

Apache 2.2のルールはファーストマッチではなく、Orderによって優先順位が変わるので注意。
一部の接続元からのみアクセスを許可したい/拒否したいというケースで考慮が必要になるかと。
（分かりづらいためかApache 2.4やNginxではこのスタイルは継承されていない模様）

|   | Order Deny, Allow (全て許可) | Order Allow, Deny (全て拒否) |
|:-:|:-:|:-:|
| 一部アクセス許可  | Deny from all | Allow from \<IP\>  |
|                | Allow from \<IP\> |   |
| 一部アクセス拒否  | Deny from \<IP\>  | Allow from all  |
|                |                  | Deny from \<IP\>  |
| 全て許可  |  Allow from all |  Allow from all |
| 全て拒否  |  Deny form all | Deny from all  |

## Satisfyの設定について

接続元IPベースでのアクセス制御とBasic認証でのアクセス制御、AND条件、OR条件の指定はSatisfyを設定する。

```
Satisfy All | Any
```

デフォルトはALLが適用されている。何もしなければAND条件でルールに対する評価を行う。

Satisfy Anyの設定例↓

```
Satisfy Any
Require Valid-user
Allow from 192.168.1
```

192.168.1のIPレンジのネットワークからは認証不要でアクセスできる。
それ以外の接続元はBasic認証が必要。
メッソドのオーバーライド、superによる親のメソッドの呼び出し

#メソッドのオーバーライド
継承後、メソッドを再定義（上書き）すること

```python:qiita.py
class Car(object):
    def run(self):
        print("run")

class ToyotaCar(Car):
    def run(self):
        print("toyta_run")

class TeslaCar(Car):
    def run(self):
        print("tesla_run")

car = Car()
car.run()
#実行結果：run

toyota_car = ToyotaCar()
toyota_car.run()
#実行結果：toyota_run

tesla_car = TeslaCar()
tesla_car.run()
#実行結果：tesla_run
```



```python:qiita.py
class Car(object):
    def __init__(self,model=None):
        #ベースクラスは何も設定しない
        self.model = model

    def run(self):
        print("run")

class ToyotaCar(Car):
    def run(self):
        print("toyta_run")

class TeslaCar(Car):
    def run(self):
        print("tesla_run")

toyota_car = ToyotaCar("Lexus")
print(toyota_car.model)
#メソッドだけでなくクラス変数も.で呼び出せる
#実行結果：Lexus

tesla_car = TeslaCar("modelS")
print(tesla_car.model)
#実行結果：modelS
```

#superによる親のメソッドの呼び出し
親クラスの要請

##使い所
class TeslaCar(Car)の__init__がclass Car(object)の__init__を上書きしてしまう為、同じコードを書く必要がある

```python:qiita.py
class Car(object):
    def __init__(self,model=None):
        #ベースクラスは何も設定しない
        self.model = model

    def run(self):
        print("run")

class ToyotaCar(Car):
    def run(self):
        print("toyta_run")

class TeslaCar(Car):
    def __init__(self, model= "ModelS", enable_auto_run=False):
        self.model = model
        self.enable_auto_run=enable_auto_run

    def run(self):
        print("tesla_run")
```

##使用例
sueperを用いることで親クラスの__init__を呼び出すことが可能になる

```python:qiita.py
class Car(object):
    def __init__(self,model=None):
        #ベースクラスは何も設定しない
        self.model = model

    def run(self):
        print("run")

class ToyotaCar(Car):
    def run(self):
        print("toyta_run")

class TeslaCar(Car):
    def __init__(self, model= "ModelS", enable_auto_run=False):
        # self.model = model
        # 同じ処理を避ける
        super().__init__(model)
        self.enable_auto_run=enable_auto_run

    def run(self):
        print("tesla_run")
```
Onkyo のタブレットにUbuntuをインストールする

grubを自前でインストールし、設定が必要になります。

この辺の流れは先日投稿した

Diginnos Stick DG-STK1 に Ubuntu20をインストール - Qiita 
https://qiita.com/mugimugi/items/91c5c93a1720efdf6bb4

ページと同じになります。

ブータブルなUSBメモリの作成

unetbootin をインストールし、ubuntu 20 を書き込む。

32bit用efiのダウンロードと保存
https://github.com/jfwells/linux-asus-t100ta/blob/master/boot/bootia32.efi

bootia32.efi ファイルを /boot/efi に配置します。

ubuntu20をliveモードから起動（Ubuntuを試すをクリック）し、端末（Terminal）から以下のコマンドを実行します。

~~~~
sudo ubiquity -b
~~~~

インストールが完了し、USBメモリは指したまま再起動後、grubの設定を行います。

起動すると grub メニューが表示されるので c キーを押してコマンドラインモードにします。

~~~~
grub> set root=(hd1,gpt2)
grub> linux /boot/vmlinuz root=/dev/mmcblk1p2
grub> initrd /boot/initrd.img
grub> boot
~~~~

これで ubuntu が手動で boot されます。

次に起動した ubuntu の端末（Terminal）から grub を設定更新します。

~~~~
sudo apt-get update
sudo apt-get install grub2-common grub-efi-ia32
sudo grub-install --efi-directory=/boot/efi
sudo update-grub
~~~~

これで再起動すると普通に ubuntu が起動するようになります。

nomodesetでの起動

ビデオドライバがおかしいのか、何秒かすると自動でログアウトがされます。
起動オプションにnomodesetを付与して、余計なドライバを読まないようにすることにより回避することができます。

一旦再起動（電源長押しで電源オフ→電源オン）します。

ESCキーを連打すると最初に BIOS が表示されますので Continue を選択してまた ESCキーを連打します。
すると、grub メニューが出ますので、e キーを押して編集モードに入ります。

quiet splash のあとに nomodeset を追加して ctrl + x キーを押して起動させます。

これは一時的な操作なので、ubuntu 側で、設定を反映する必要があります。

~~~~
sudo gedit /etc/default/grub
~~~~

~~~~
GRUB_CMDLINE_LINUX_DEFAULT=”quiet splash”
↓
GRUB_CMDLINE_LINUX_DEFAULT=”quiet splash nomodeset”
~~~~

~~~~
sudo update-grub2
~~~~

これで次回から nomodeset が付与された状態で起動が行われます。

ちょっと画面が縦表示なので、xrandr コマンドでなんとかならないかそのうちやるかと思います。

参考ページ

Linux起動用の手動「nomodeset」カーネル ブート ライン オプション | Dell 日本 
https://www.dell.com/support/article/ja-jp/sln306327/linux%E8%B5%B7%E5%8B%95%E7%94%A8%E3%81%AE%E6%89%8B%E5%8B%95-nomodeset-%E3%82%AB%E3%83%BC%E3%83%8D%E3%83%AB-%E3%83%96%E3%83%BC%E3%83%88-%E3%83%A9%E3%82%A4%E3%83%B3-%E3%82%AA%E3%83%97%E3%82%B7%E3%83%A7%E3%83%B3?lang=ja

本の虫: Ubuntuでタブレットの画面回転について調べてみた 
https://cpplover.blogspot.com/2016/07/blog-post.html?m=1
配列に効率よく値を入れるにはどうすればいいんだ？

なんとなく投稿します。
rubyでプログラム書いてたんですが、今更ながら配列の理解が浅いことに気づいた。
例えばこれ

```ruby:qiita.rb
xc,yc,r_1,r_2 = gets.chomp.split(' ').map{|i| i.to_i}
n = gets.to_i
x = []
y = []
n.times do
  a,b = gets.chomp.split(' ').map{|i| i.to_i}
  x.push a
  y.push b
end
c = 0

while n > 0 do
  if r_1**2 <= ((x[c] - xc)**2 + (y[c] - yc)**2) && (x[c] - xc)**2 + ((y[c] - yc)**2) <= r_2**2
    puts "yes"
  else
    puts "no"
  end
  n = n - 1
  c = c + 1
end
```

処理の中身(while)は今回どうでも良いのですが

それに至るまでに、
xとyの配列の定義
a,bの変数を定義
a,bの変数を順番に配列に格納

を繰り返してます。
書いててめっちゃアホみたいなコード書いてるなぁと思いつつも
これ以上の手段が思い浮かばず。

本来ならばa,bなど使わず

```ruby:qiita.rb
x,y = gets.chomp.split(' ').map{|i| i.to_i}
```

はじめからこの形で格納できれば良いのになと思いました。
また手段を探っていきたいと思っております。
html.erbファイルでコメントアウトする(備忘録)

#プログラミングの勉強日記
2020年8月16日　Progate Lv.226

#複数行コメントアウトしたいとき
　`<%#  %>`中に書かれた文章を全てコメントアウトすることができる。

```erb:html.erbファイル
　<%#　コメント　%>

  <%#　
       コメント　
  %>
```

#1行コメントアウトしたいとき
　1行だけコメントアウトしたいときは`#`を使える。`#`でコメントアウトするときは、Rubyのコメントアウト機能なので`<%  %>`の中でのみに使える

```erb:html.erbファイル
<%=
    表示される。
    #コメント
%>
```

#コメントアウトしてる内容が見えてしまう
　HTMLで使われているコメントアウト(`<!-- コメント -->`)の方法。クライアント側からコメントアウトしている内容が見えてしまう。

```erb:html.erbファイル
<!-– <%= 'ブラウザの画面には表示されない' %> -–>
```
PHP ページにアクセスした時間の秒数で判定

ページにアクセスした時間の秒が

00だった場合は「ジャストタイム!!」
00を除くゾロ目だった場合は「ゾロ目!」
上記以外の場合は「外れ」
という文字と秒を表示するプログラムを作成

```php
<?php
$second = date("s");
?>
<!doctype html>
<html lang="ja">
    <head>
        <meta charset='utf-8'>
        <title>訪問時刻でif</title>
    </head>
    <body>
        <h1><?php echo date("Y/m/d H:i:s"); ?></h1>
<?php if($second === "00"){?>
        <h2>ジャストタイム！！</h2>
        <p>アクセスした瞬間の秒は00秒でした！！</p>
<?php } else if ($second === "11" || $second === "22" ||$second === "33" 
        || $second === "44" || $second === "55"){ ?>
        <h2>ゾロ目！</h2>
        <p>アクセスした瞬間の秒はゾロ目でした！</p>
<?php } else { ?>
        <h2>外れ</h2>
        <p>アクセスした瞬間の秒は<?php print $second; ?></p>  
s<?php } ?>
    </body>
</html>


```

ゾロ目の判定は他にやり方ないものですかね…
.gitignoreのテンプレートが欲しい時に参照するサイトの紹介


# 記事の要約

`.gitignore` のテンプレートが欲しい時

- [github/gitignore (GitHub)](https://github.com/github/gitignore) を参照する
- [gitignore.io](https://www.toptal.com/developers/gitignore) で生成する

### この記事に書いてあること

- `.gitignore`のテンプレートをまとめているサイトの紹介

### この記事に書いてないこと

- `Git`や`.gitignore`とは何か
- `.gitignore`の書き方、設定方法

# きっかけ

先日、慣れない環境で開発する機会があり、
「一時ファイルがたくさんある。.gitignoreには何を書けばよいのだろう？」
と悩んだことがありました。

ここでは、その際に知った便利なサイトを紹介します。

# github/gitignore

![scr1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/231426/020cf620-3551-de97-b527-fc2bbfa7a3b6.png)

[github/gitignore (GitHub)](https://github.com/github/gitignore)

GitHubの公式リポジトリです。
主要な環境の`.gitignore`が揃っているので、マイナーな環境でなければ目当てのものが見つかると思います。

GitHubの公式リポジトリで、Starの数や更新頻度も文句なし。
安心して参照できる印象でした。

## 使い方

必要なファイルを探して、規定の場所に配置していきます。

なお、ここでは配置先については解説しません。
`gitignore`や`gitignore global`などで検索してみてください。

### 例1: macOSでNode.jsを使用した開発をする場合

- global用の.gitignore
  - [Global/macOS.gitignore](https://github.com/github/gitignore/blob/master/Global/macOS.gitignore)
- リポジトリ用の.gitignore
  - [Node.gitignore](https://github.com/github/gitignore/blob/master/Node.gitignore)

### 例2: Linux、VimでC言語の開発をする場合

- global用の.gitignore (2ファイルを手動でマージしてから配置する)
  - [Global/Linux.gitignore](https://github.com/github/gitignore/blob/master/Global/Linux.gitignore)
  - [Global/Vim.gitignore](https://github.com/github/gitignore/blob/master/Global/Vim.gitignore)
- リポジトリ用の.gitignore
  - [C.gitignore](https://github.com/github/gitignore/blob/master/C.gitignore)

# gitignore.io

続いてgitignore.ioの紹介です。
![scr2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/231426/1f1c3a3b-73e6-6990-7bbe-b1b2ad5c59d4.png)
[gitignore.io](https://www.toptal.com/developers/gitignore)

指定した環境に合わせた.gitignoreを自動生成してくれるサービスです。
複数のOS、エディタ、言語などの設定を一つのファイルに自動でまとめてくれます。

## ドキュメント

[gitignore.ioのドキュメント](https://docs.gitignore.io/)

使い方はドキュメント内のVideo tutorialを見てもらうのが一番早いと思います。
また、Webから生成する方法の他、コマンドやAPIによって生成する方法も用意されています。

## 提供されているテンプレート

仕組みの解説やテンプレート一覧は以下にあります。
[toptal/gitignore (GitHub)](https://github.com/toptal/gitignore)

> The source for some of the template files on dvcs/gitignore come from github/gitignore

とREADMEにあるので、いくつかのファイルは前述のGitHub公式のgitignoreを参照しているようです。
(恐らくREADMEの更新がされてなく、以前のリポジトリ名は`dvcs/gitignore`で、その後`toptal/gitignore`に変更された模様)


# 所感

頻繁には使用しませんが、時々必要になってくるサイトと思いました。
`.gitignore` に悩むことなくメインの開発に専念できるのが嬉しかったです。
DataGridViewの行の高さを内容に合わせて変更し、なおかつ最小の高さも決めておきたい。

## やりたいこと
DataGridViewの行の高さを内容に合わせて変更し、なおかつ最小の高さも決めておきたい。

## 困ったこと
dataGridView.AutoResizeRowsをAllCellsにすると、コラムの中の一番大きいコラムに合わせて行が変更されるが、最小の高さまでは決められない。MinimumHeightというプロパティもあるけど、これは逆に最大の高さになる感じ(名前が紛らわしい)。


## 解決方法
各行のセルで一番大きい行の高さを取得する。
以下の例では、行の最小値は50で、一番大きい行がそれ以下なら、50になる。

```c#:
foreach(DataGridViewRow row in dataGridView.Rows)
{
    var cells = row.Cells.Cast<DataGridViewCell>();
    int maxHeight = cells.Max(n => n.PreferredSize.Height);

    row.Height = maxHeight > row.Height ? maxHeight : 50;
}
```

Heightではなく、PreferredSize.Heightにしている。heightだと内容に合わせたサイズではなくて、もともと行として決まっているHeightが取得されるのか。
ActiveRecord::RecordInvalid:Validation failed: Account has already been taken

###エラーの内容
既にAccountというデータがあるから、ダメだよ。バリデーションで問題が起きてますよという内容

###解決策
```rb
rake db:migrate:reset
```

これでテーブルの内容の削除とshemaからの再作成ができるので解消できました。
Javaをより快適にするために移行しよう

これはJavaからKotlinへの移行してみたら、とてもよかったということを伝えるための記事です。
# Javaの欠点
私は少し前までJavaでプログラミングをしていました。しかしJavaには欠点があります。これは例えば次のようなものです。

:warning:これはJavaからの移行についての記事です。JavaScriptは全く別の言語です。ご注意ください。
## NullPointerException
APIから戻り値としてnullが返される場合や引数にnullを渡されたりします。前者についてはJava 8で追加されたOptional<T>クラスを使うことで回避できますが、後者はどうにもできません。実行時エラーはできますがコンパイルエラーが出ないことは残念なことです。
## 冗長な記述
### 型の記述
変数を宣言する場合、`List<String> words`など型を記述します。しかし、それを推論できればいいですよね。いまでは`var`が使えますが、インスタンスフィールドなどにはそれはできません。
### オブジェクト指向について
Javaではいちいちカプセル化をするためにgetter/setterを記述する必要があり、それらは少し冗長です。クラスのコンストラクタ、そしてオーバーロードなど、かなり面倒なものです。
### 関数型プログラミングについて
Javaでは関数を受け取るメソッド（高階関数）を作成する場合、Function<T,R>といった
すこし長い型を記述する必要があります。これは決まった命名規則がありますが、それでも読みにくいです。
# 移行する点で考慮しなければならないこと
## 覚えることが少ないこと
言語を移行した時にまったく文法が違っていた場合、それはなじみにくいでしょう。動的付けであったり、関数型プログラミングが中心だったりなどです。
## 少しづつ移行できること
新しく移行先のプログラミング言語の互換性がまったくなかったりしては、膨大な時間を使います。できればいままでのJavaプログラムを使えてほしいものです。
# そうだKotlinだ！
## null安全
Kotlinはnullが入れれる型とそうでない型を分けています。`String?`はnullが入ることがあります。`String`はnullを入れれません。
## 簡潔な記述
Javaでは、下記のようなクラスを

```java
public class Pen {
    private int ink;
    
    public Pen(int ink) {
        setInk(ink);
    }

    public int getInk() {return ink;}
    public void setInk(int ink) {
        if (ink < 0)
            throw new IllegalArgumentException("引数が0以下です。指定値：" + ink);
        this.ink = ink;
    }
}
```
Kotlinでは、

```Kotlin 
class Pen(ink: Int = 0) {
    var ink:Int = ink
       set(value) {
            if (ink < 0)
                throw IllegalArgumentException("引数が0以下です。指定値：${value}")
            field = value
        }
}
```
とシンプルにかけます。もし、setterにチェックがなければ、

```java
class Pen(var ink:Int)
```
のみです。getXXX、setXXXという命名規則に従っていれば、`pen.ink`のようにフィールドのようにアクセスできます。ちなみにKotlinで先ほど定義したフィールドはコンパイル時にgetter/setterが生成されます。

変数の型は、一緒に初期化すれば`:Int`の部分を省略できます。関数型プログラミングに関しては`String -> Int`でHaskellのように簡単にかけます。

## KotlinはJavaと共存できる
実はKotlinはコンパイルするとclassファイルに変換されます。つまりは、Javaと同じくJVMで走ります。KotlinとJavaは共存でき、KotlinがJavaのライブラリを使用したり、継承したり、その逆をしたりできます。

# 終わりに
私はIntelliJというIDEを使っています。それは、JavaをKotlinに変換する機能(すでにあるファイルや、コピペ時)がついており、とても助かっております。JVMで走る言語にはScalaやGroovy、Ruby(jRuby)などがありますがRubyなどではあまり構文になじめず、Scalaはコンパイル速度が遅く、Groovyは動的付けという理由でKotlinを選びました。
さぁみなさんもKotlinに**移行**しに**行こう**（ダジャレ）。
【Rails6】rails sでサーバーを起動したまま、コードの書き換え、動作確認をしたい 

ハードはMacBook Air, 開発環境はVScodeを用いています。
ruby2.6.5
rails6.0.3.2

#発生している問題 

###rails s でサーバーを起動させた状態でコードを変更しても、サーバーを再起動しなければ変更が反映されない

#原因

config/environments/development.rbの記述が原因です。


```:config/environments/development.rb
Rails.application.configure do
〜省略〜

  config.file_watcher = ActiveSupport::EventedFileUpdateChecker

end
```

#対処法

次のように書き換えます。

```:config/environments/development.rb
Rails.application.configure do
〜省略〜

  config.file_watcher = ActiveSupport::FileUpdateChecker

end
```

これで解決します。

---

役に立ったら是非LGTMボタンをポチッと押していただけると嬉しいです:raised_hand_tone1:
OneNoteの見出しジャンプが不便なときは、サブベージを使うと便利


Wordでは、ナビゲーションウィンドウという機能で、見出しの一覧を表示して見出しジャンプできる。OneNote でもナビゲーションウインドウのような機能を使えなくはないがあまり便利ではない。
**そこで、情報の粒度を小さくして、１つの節を１ページでまとめると良い。** そして、章の中の各節をサブページでまとめる。
こんな感じ。
![img](https://lh3.googleusercontent.com/y8GOX-kGO0s7r-G_uF80S1G87jin9hLDx0egP7P0k2o6bN0C78ROyDPLiQhnvE-nxE4LzB0OcbkR3DM5dWKB6ZDpWqo093UFJOF4u_VW7_mROw4KN7KbMWcOV7sCeiDgxM7WYU5d)

ただし、OneNote のサブページは、一番上の階層以外はツリーを折りたたむことができない。 階層を深くしすぎると逆に使いにくくなるので注意。

# OneNoteで見出しジャンプする方法

見出しを設定するショートカット： Ctrl+Alt+1 (or 2 or 3…)
![img](https://lh4.googleusercontent.com/wa5bn2ovKM8pNCBtK78BRcN9iGDybNSu5kU5TM56KHCsij0CbiTXeWxaHnW3jh45n0oYRIe-5nGWTZDWID_xJSGJmX4xIJ2uBlDrz0qjpf4HSOoSTbCpVuoTHn_4upcpYSBfbi2_)

しかし、OneNoteではナビゲーションウィンドウの機能はない。そこで、 見出しにノートシールをつける。
⭐のノートシールのショートカット：Ctrl＋2 
![img](https://lh5.googleusercontent.com/6ixMMNxsoa8ymQGrnbbU07NQVc7-uhK4ZI7eJX7P4vAA2hg8LUJPjFma6FWkO4msNq5XVjtsVJXd8DINDSewOe2HU-NaJPVFKUJCQ7gxgw5XA8Tpg0Z7rZlWEKxmDG8CfgCOHY9a)

ノートシールを検索すれば、検索結果をクリックしてシールの位置までジャンプできる
ページ内検索のショートカット：Ctrl＋F
![img](https://lh5.googleusercontent.com/Wq3ODMkxqKwFH-vW5sORGDa55W4ino9FQOnjo-PtuIotA__4kGv5h9__vh12AkSuOuh3Qa0uNOLTL2dq9Ns-HAE4uMlwp4U5Irla3v0R7xPShV4u1lrHY7_hruFsgeCLXEHZN6gk)

しかし、ページを表示するたびに、検索画面を表示して、ノートシールを指定して検索するのは面倒だったので、結局この方法は定着しなかった。
pandasのdescribeについて


メモです。

## describeの見方

| | 説明|
|:-----------|------------:|
| count       | データの個数        |
| unique     | ユニークな（一意な）値の個数      |
| top       | 最も出現頻度の高い値（最頻値）        |
| freq         | 最頻値の出現回数          |
| mean       | 平均値       |
| std    | 標準偏差     |
| min    | 最小値     |
| 25%       | 1/4分位数       |
| 50%    | 中央値     |
| 75%    | 3/4分位数      |
| max    | 最大値     |

上記の値を出力する為には、

```test.py

DateFrame型のデータが格納されている変数.describe(include='all')
```
クラスの継承

一番上で宣言したCarを次に宣言したトヨタカーに引継ぎ拡張するイメージ


```python:qiita.py
class Car(object):
    pass
#passは何もしないという意味

class ToyotaCar(Car):
    pass
```

機能を受け継ぐことが可能
メソッドを持っていなくても継承されていれば使える

```python:qiita.py
class Car(object):
    def run(self):
        print("run")

class ToyotaCar(Car):
    pass

car = Car()
car.run()
#実行結果：run

toyota_car = ToyotaCar()
toyota_car.run()
#実行結果：run
```
【CloudWatch】請求アラートの設定

## なぜ設定するのか？
使用状況の監視・使用料金の上限設定等に基づいたアラート設定を行うことで予期せぬ課金を防止するため

## 1. IAMユーザーに請求情報へのアクセス権限を付与する
<img width="300" alt="スクリーンショット 2020-08-02 23.48.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379501/a2d0b3ee-b07e-9b40-32bf-977b0073b416.png">
<img width="1034" alt="スクリーンショット 2020-08-02 23.49.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379501/81fe75c9-555e-d709-bf6b-64226d49cacd.png">

## 2. Billingの設定を行う
<img width="1439" alt="スクリーンショット 2020-08-02 23.56.09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379501/93ec84c0-ef5a-e1e4-2c00-031675a037b5.png">

## 3. アラームを作成する
<img width="1440" alt="スクリーンショット 2020-08-03 0.00.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379501/f720f66f-7b8a-ca5d-929b-db133fda6d7d.png">

## 4. メトリクスと条件を指定する
**Currency** は **JP**（日本円）を選択する
<img width="1440" alt="スクリーンショット 2020-08-03 9.27.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379501/c2b71b80-cacb-5fc4-3f84-c30cb82d0118.png">
<img width="1440" alt="スクリーンショット 2020-08-03 9.27.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379501/41bb5a4c-ab17-fe6d-27de-c2c5aa758ea9.png">

## 5. アクションを設定する
<img width="1440" alt="スクリーンショット 2020-08-03 9.34.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379501/0697b800-e318-b0fe-787c-a380b4717a2c.png">
<img width="1440" alt="スクリーンショット 2020-08-03 9.36.34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379501/23872269-1542-3e2a-ac07-fab8dbb9dcfd.png">

## 6. 名前と説明を追加する
<img width="1440" alt="スクリーンショット 2020-08-03 9.37.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379501/ad735764-091e-b4a2-77e4-3e432aeaa18d.png">

### アラーム作成完了
<img width="1440" alt="スクリーンショット 2020-08-03 9.40.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379501/5271ecc1-eab7-29c6-5c86-8df7e50cc6dd.png">
コンストラクタとデストラクタ

#コンストラクタ
オブジェクトを作る初めのときに呼ばれるもの

```python:qiita.py
class Person(object):
    def __init__(self,name):
        self.name = name
```

#デストラクタ
オブジェクトがなくなるときに呼ぶ物
使われなくなったときに呼び出される

```python:qiita.py
class Person(object):
    def __init__(self,name):
        self.name = name

    def say_something(self):
        print("I am {}. hello".format(self.name))
        self.run()

    def run(self):
        print("run")

    #ここがデストラクタ
    def __del__(self):
        print("good bye")
```
実行結果
![スクリーンショット 2020-08-16 20.37.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527694/8127f914-bab2-d44a-2d7e-b24da9ab891f.png)

全てのコードが使われた時点で呼び出される
![スクリーンショット 2020-08-16 20.39.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527694/48c6e927-fd22-6815-7446-14900592d7ad.png)

##明示的に使いたい場合

```python:qiita.py
del person
```

実行結果
![スクリーンショット 2020-08-16 20.42.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527694/a0e644d0-f2e1-3699-899f-d796184b730e.png)
AnsibleからTerraformのモジュールを実行する

# はじめに
Infrastructure as Code(以下IaC)、便利ですよね。この便利さに一度慣れてしまうと、GUIでちまちまやるのが面倒になります。
IaCツール、皆さん何をお使いでしょうか？Ansible、Puppet、Chefや、Terraform、CloudFormationなどいろいろありますよね。
今回は、クラウドリソース操作が得意なTerraformと、OSの構成管理が得意なAnsibleを組み合わせ、クラウドリソース払い出しからEC2の構成変更までの一連の処理を、Ansibleで一本化してみようと思います。

この記事は、以下個人ブログ記事をQiita用に編集したものになります。
https://tagfa.wpx.jp/archives/312

# 実装
Ansibleコマンド一発で、クラウドリソースデプロイ、EC2設定変更を行います。
処理の流れとしては、AnsibleでTerraform実行し、VPC、EC2、ELBを作成します。次に、Ansibleで共通処理、nginxのインストールを行います。
モジュール構成はこんな感じです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181466/b40d4dba-a901-d9b2-e5f7-0f3d6d2bd822.png)

AnsibleにはTerraformのコードを実行できる[Terraformモジュール](https://docs.ansible.com/ansible/latest/modules/terraform_module.html)がありますので、こちらを使います。

ここで1つ問題があって、TerraformでEC2を払い出した後、そのEC2に対してAnsibleで共通処理、nginxインストールするのですが、処理をAnsibleに一本化するので、実行前ではEC2のIPアドレスがわからないという問題があります。

そこで出てくるのが[DynamicInventory](https://docs.ansible.com/ansible/latest/user_guide/intro_dynamic_inventory.html)というAnsibleの機能です。これを使うことで、動的にインベントリファイルを変更できます。

処理の流れとしては、

- Terraformでクラウドリソースデプロイ
- DynamicInventory更新
- Ansibleで共通処理、nginxインストール

といった流れとなります。

具体的な実装については、以下のリポジトリをご覧ください。
https://github.com/tagfa/ansible-terraform

# おわりに
いかがでしょうか。Ansibleで一本化するとコマンド一発でいろいろできるのでとても楽です。

同じ土俵のIaCツールたち、ついつい、「どちらを使おうか」と悩むことがあるかと思いますが、使い分けるのではなく組み合わせることでよりよくなることもあるのだなーと思いました。

よかったら試してみてください。
[CSS] BEMによるCSS設計

マークアップをはじめて一番最初に悩んでしまったこと
それは　**クラスの命名** でした。

CSS設計手法はいくつかありますが、今回は **BEM** を採用したので記事にまとめてみます。

# BEMとは
**B**lock（塊）、**E**lement（要素）、**M**odifier（修飾）の略

```html:xxx.html
このように表します
<div class = "Block__Element--Modifier">
```

Blockってなに？
Elementってなに？
Modifierってなに？
 __ (アンダーバー)の意味は？
 --（ハイフン)の意味は？

それぞれの意味を理解するために順を追って私なりに解説します。

# Block / Element / Modifier を理解する思考手順
### 1. WEBページはBlock(塊)の集合体であることを理解する

WEBページはヘッダーやメインコンテンツ、サイドバー、フッターなどのBlockが
集まって構成されています。

header , aside , section , nav , footer , div (main, contents) など

これらは全て**Block**として扱います。

### 2. Block(塊)の中には機能や役割を持ったElement(要素)があることを理解する

ヘッダー、メイン、フッターなど大きな塊が **Block**。
しかしBlockだけではWEBページは成り立たない。

Qiitaのヘッダーを見てみよう
<img width="548" alt="スクリーンショット 2020-08-05 23.41.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686617/825e0384-4054-5fd9-fc32-cca556e03ea2.png">
サイトロゴや検索バーなど、Block(ヘッダー)を構成するElement(要素)があります。

input , button , img , svg , h , p , ul , li , a など

これらは**Element**として扱われます

### 3. Block(塊)やElement(要素)を強調したり、状態を表すためにModifier(修飾)があることを理解する

「(複数タブがあって)現在のタブの位置を表す」
「一番上に表示されている記事(article)を区別する」

「このタイトルは大きく」
「このテキスト部分は赤く」
「ここだけ太字に」


これらは **Modifiler** として扱います

# BEMの書き方

### BlockとBlock / BlockとElementを繋ぐ際はアンダーバー２つで繋ぐ　（使用頻度：高）
```
.block__block
.block__element
.block__block__element
```

### Modifierはハイフン２つで繋ぎ、修飾を表す（使用頻度：少）

```
%h2.content__title--big  　　　　# 大きいタイトル
%p.content__text--alert   　　　　 # 赤いテキスト(警告)
%span.content__text--emphasis  # 強調
```
文字の強調部分や、ここだけ大きく！、ここだけ赤く！ってときに使います。
なのであまり登場しないかも。

### 単語の区切りはハイフンを一つ表現してOK（使用頻度：少〜中）

```
.top-banner 　# 上に配置するバナー。
.corporate-logo　　# 企業ロゴ
```

多用は避けよう。原則、一つの単語にするように努力しよう。
どうしても「このブロックは２単語じゃないと表せない…」というときのみ使用します。


---

### SCSSの記述はこんな感じになる

```haml:xxx.html.haml
.main
  .contents
    .contents__content
      %h2.contents__content__title
        タイトル
      %p.contents__content__text
        ネストが深いほどclass名が長くなるのは仕方ない
```

```scss:xxx.scss
.main {
  .contents {
    &__content{    
      &__title {
      }
      &__text {
      }
    }
  }
}
```
入れ子構造がHTMLと同じになるのでわかりやすい

---

## 例　：私がヘッダー作ったときの思考手順
### 実際のコードを眺めてどんな感じなのかを見てみよう
 ↓ヘッダー。これを目指す↓
![](https://i.imgur.com/ae9keR3.png)

↓ブロックを細分化するときには、まず大枠をイメージすると取り掛かりやすい
![](https://i.imgur.com/zeBEkzP.png)
1.  "ヘッダー"コンポーネントで一番でかい枠は
**→"header"**
2.  両サイドにpaddingを設けたいから"inner"を作る
**→"header__inner"**
3.  "top"[ロゴと検索フォーム]、"nav"[ナビゲーションバー]がある
**→"header__inner__top" / "header__inner__nav"(.nav)**
4. "top"には[ロゴ]、[検索フォーム]がある
**→"header__inner__top__logo" / "header__inner__top__search"**
5. [検索フォーム]にはフォームタグがある
**→"header__inner__top__search__form"**
6. [フォーム]にはinputとbuttonがある
**→"header__inner__top__search__form__input"**
**→"header__inner__top__search__form__button"**
7. [ナビゲーションバー]部分も同じようにブロックを細分化

 ↓ 以下、実際のコード↓ 　※画像はHTMLですが、実際のコーディングはHamlです
![](https://i.imgur.com/AbDCHFJ.png)

↓ SCSS (入れ子の関係がわかるので、構造が把握しやすい)
![](https://i.imgur.com/VkvDCcR.png)


## 余談
blockをひたすら __ で連結させていくのは本当のBEMではないそうです。
ただし、今回課題として「SCSSを見ただけでHTMLの構造をわかるようにする」という指定があるので、この条件をクリアするためにガンガン要素を__で繋げました。
【加筆中】DBに関して何も分かっていないことが判明したので、勉強してみた

CircleCIを勉強中、DBのエラーを処理しようとした時に、DBの接続関係やら用語やらを理解していないことに気づいて勉強しているので、そのまとめとして。同じような状況の人に役に立てば嬉しいです。

＊加筆中

# host
hostとは、
hostとよく見る、「localhost」は「127.0.0.1」を表してるみたいです。これは、ループバックアドレスと呼ばれ、自分自身を表す特別なIPアドレスです。つまり、

localhost = 127.0.0.1 = 自分自身を表すIPアドレス

です！

# socket
socketとは、

# config/database.ymlのRAILS_MAX_THREADSってどこに書いてある？？

# pool
poolってコネクションの上限値らしい。けど、コネクションって１個じゃないですか？ww

# port




あと、プログラマーになりたいと思っています。自社開発企業のインターンや就職（2020/08現在、大学院１回生ですが、研究そんなに楽しくないので就職できるのであれば大学院は辞めるつもりです。）の話があればノリノリで聞かせていただきますので、メッセージください。

### 参考サイト
https://qiita.com/1ain2/items/194a9372798eaef6c5ab#localhost
Boost Functionについての個人的解釈

デバイスドライバをやっていると、Boost Function → コールバックという連想になる。
個人的には、Linuxのシステムコールの印象に近い。起動時に関数（システムコール）の表を作っておいてその都度使うなど。

     1#include <iostream>
     2#include <iomanip>
     3#include <functional>
     4#include <string>
     5#include <boost/bind.hpp>
     6#include <boost/function.hpp>
     7using namespace std;
     8using namespace boost;
     9
    10
    11bool is_substr_of( const string& sub, const string& all )
    12{
    13    return all.find( sub ) != string::npos;
    14}
    15
    16int main()
    17{
    18    cout << boolalpha;
    19
    20    boost::function<bool (const string&, const string&)> f;
    21
    22    f = &is_substr_of;
    23    cout << f( "x", "xyz" )  << endl;
    24    cout << f( "x", "yyy" )  << endl;
    25    cout << f( "zzz", "ww" ) << endl;
    26    cout << "###" << endl;
    27
    28    f = bind( less<size_t>(),
    29            bind(&string::length,_1),
    30            bind(&string::length,_2) );
    31    cout << f( "x", "yyy" )  << endl;
    32    cout << f( "x", "xyz" )  << endl;
    33    cout << f( "zzz", "ww" ) << endl;
    34
    35    return 0;
    36}

後半部分はbindを使って、文字列の長さを比較している。

<pre>
# ./a.out 
true
false
false
###
true
true
false
</pre>

どうやら、コールバックによってシグナル/スロットの実装、ビジネスロジックとGUIの分離などができるらしい。(個人的には経験がないので、思い当たるフシがないが。。(ノД`) ）
BoostのFunctionの作者はDouglas Gregor氏である。
Jetpack ComposeのConstraintLayoutなどがどのようにModifierクラスだけで様々なレイアウトを処理するか

こんなKotlin DSLの使い方あるんだと思って知らなかったのでメモしておきます。

Jetpack ComposeのConstraintLayoutは現状では、以下のように書きます。

https://android-review.googlesource.com/c/platform/frameworks/support/+/1321040/8/ui/ui-layout/integration-tests/layout-demos/src/main/java/androidx/ui/layout/demos/ConstraintLayoutDemo.kt より

```kotlin
    ConstraintLayout {
        val (text1, text2, text3) = createRefs()

        Text("Text1", Modifier.constrainAs(text1) {
            start.linkTo(text2.end, margin = 20.dp)
        })
        Text("Text2", Modifier.constrainAs(text2) {
            centerTo(parent)
        })

        val barrier = createBottomBarrier(text1, text2)
        Text("This is a very long text", Modifier.constrainAs(text3) {
            top.linkTo(barrier, margin = 20.dp)
            centerHorizontallyTo(parent)
            width = Dimension.preferredWrapContent.atMost(40.dp)
        })
    }
```

以下のように `Modifier.constrainAs()` を使うことができていますが、これがConstraintLayout以外のレイアウトでも見えてしまうと全く関係ないレイアウトでConstraintLayoutのプロパティが使えてカオスになってしまいます。しかもModifierはただのinterfaceです。どのようにしているのでしょうか？

```kotlin
    ConstraintLayout {
        val (text1, text2, text3) = createRefs()

        Text("Text1", Modifier.constrainAs(text1) {
            start.linkTo(text2.end, margin = 20.dp)
        })
```

最初にコードで結論を書くと以下のように、スコープを作って、**interfaceを継承したcompanion objectを実装して、companion objectとインスタンス両方に対しての拡張関数を定義**して、そのスコープから呼び出してあげることで、スコープ内のみでしかCompanion objectのメソッドも使えないようにすることができます。

```kotlin
interface MyModifier {
    companion object : MyModifier
}

class MyLayoutScope {
    fun MyModifier.myCustomMethod() {
    }
}

fun myLayout() {
    MyLayoutScope().apply {
        MyModifier.myCustomMethod()
    }
}
```

# 以下どうやっているかのメモ
`ConstraintLayout{}`で ConstraintLayoutScopeのブロックを渡させる。

```
@Composable
fun ConstraintLayout(
    modifier: Modifier = Modifier,
    children: @Composable ConstraintLayoutScope.() -> Unit
) {
```

ConstraintLayoutScopeにはModifier.constrainAs()という拡張関数がある。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27388/2fe1ebff-d8a6-efa5-c1c6-f5b8b2b4db94.png)


拡張関数だけでは`Modifier.constrainAs()`のようにstatic methodの呼び出しのようにすることはできないのを以下のようにinterfaceを継承したcompanion objectを実装することで可能にしている。

```kotlin
@Stable
interface Modifier {
...
    companion object : Modifier {
```
AtCoder Beginner Contest 175

##[A - Rainy Season](https://atcoder.jp/contests/abc175/tasks/abc175_a)

```C++:C++
#include<iostream>
#include<vector>
#include<algorithm>
#include<iomanip>
#include<utility>
#include<iomanip>
#include<map>
#include<queue>
#include<cmath>
#include<cstdio>
 
#define rep(i,n) for(int i=0; i<(n); ++i)
#define pai 3.1415926535897932384
 
using namespace std;
using ll =long long;
using P = pair<int,int>;
 
int main(int argc, const char * argv[]) {
    string s;
    int c=0;
    int Ans=0;
    cin >> s;
    
    for(int i=0; i<3; i++){
        if(s[i] == 'R') c++;
        else c=0;
        
        if(c > Ans) Ans=c;
    }
    
    cout << Ans << endl;
    
    return 0;
}
```

##[B - Making Triangle](https://atcoder.jp/contests/abc175/tasks/abc175_b)

- 100 * 100 * 100 = 1000000 計算量は全探索で間に合います
- 最初にソートを行い、３重ループにて計測

```C++:C++
#include<iostream>
#include<vector>
#include<algorithm>
#include<iomanip>
#include<utility>
#include<iomanip>
#include<map>
#include<queue>
#include<cmath>
#include<cstdio>
 
#define rep(i,n) for(int i=0; i<(n); ++i)
#define pai 3.1415926535897932384
 
using namespace std;
using ll =long long;
using P = pair<int,int>;
 
int main(int argc, const char * argv[]) {
    int N=0;
    int L[101];
    int Ans=0;
    
    cin >> N;
    
    for(int i=0; i<N; i++){
        cin >> L[i];
    }
    
    sort(L, L+N);
    
    for(int i=0; i<N-2; i++){
        for(int j=i+1; j<N-1; j++){
            for(int k=j+1; k<N; k++){
                
                if(L[i]<L[j] && L[j]<L[k]){
                    int l = L[i] + L[j] + L[k];
                    int r = max(L[k], max(L[j], L[i]));
                    
                    if(r<l-r) Ans++;
                }
                
            }
        }
    }
    
    cout << Ans << endl;
    
    return 0;
}
```

##[C - Walking Takahashi](https://atcoder.jp/contests/abc175/tasks/abc175_c)

- 10^15は全探索できません。よって計算式を使います。
- 10^15 * 10^15はオーバーフローが発生します。
- X < K * D は X / D < K　と表す事ができます
- XはK＊D以下とそれ以外はパターンわけします。


```C++:C++
#include<iostream>
#include<vector>
#include<algorithm>
#include<iomanip>
#include<utility>
#include<iomanip>
#include<map>
#include<queue>
#include<cmath>
#include<cstdio>
 
#define rep(i,n) for(int i=0; i<(n); ++i)
#define pai 3.1415926535897932384
 
using namespace std;
using ll =long long;
using P = pair<int,int>;
 
int main(int argc, const char * argv[]) {
    ll X=0;
    ll K=0;
    ll D=0;
    ll Ans=0;
    
    cin >> X >> K >> D;
    
    X = abs(X);
    
    ll M = X / D;
 
    if(M>K){
        Ans = X - (K * D);
    }else{
        K -= M;
        X -= M*D;
        
        if(K%2==1) X = X-D;
        Ans = abs(X);
    }
    
    cout << Ans << endl;
    
    return 0;
}
```
フロント未経験者がNuxt.js触ってみた

# はじめに
ゴミみたいな画面のアプリを量産するSIerに所属しており、画面を作るのはプロジェクトに代々伝わるExcelマクロでhtmlとCSSを吐き出してJSPに変換みたいな経験しかない私です。
フロント経験０の人間がいきなりNuxt.jsを使うことになったのでお勉強を兼ねて投稿。
現代の文明に触れた人間のメモみたいなノリです。

# 現在の知識
JavaScript：JavaでWebシステム作る中でどうしても触るので一応知っている。最近はアロー関数使えるのを知った
jQuery：前職でわずかに触った。フロントといえばこれ
Vue.js：Udemyの動画講座を少し視聴した
Nuxt.js：ぬ…なくすとじぇーえす

こんな状態だったので最近のフロントの進化に初めて触れます。
Vueの知識を勉強しつつも、プレーンなVueをお勉強する時間もないのでいきなりNuxtから入りたいと思います。
ちなみに、前職で扱っていたシステムは「技術的問題で画面にグラフを表示させることができません」とか平然と言うようなシステムだったのですが、最近のWebシステムは本当にリッチになりましたね。

# 導入
公式を参考に導入していきます。
https://ja.nuxtjs.org/guide/installation

### 環境
macOS　Mojava 10.14.4
エディタ VisualStudioCode
npx 6.14.7
node ~~8.1.4~~ →14.8.0

#### npxでアプリ作成
私の環境にはすでにnpxがインストールされていたため、いきなりコマンド実行します。

```terminal:terminal
npx create-nuxt-app vue_todolist
```

Unexpected token…　が返ってきました。
どうやらNodeのバージョンが古すぎるみたいです。
Version10以上が必要なようなので、nodebrew use latestコマンドを実行して最新版のNodeに切り替えました。

気を取り直して最新版のNodeで実行するとうまくいきました。
今回は以下の設定でいきます。
###設定
Project name：vuetodolist
Programming language:JavaScript(TypeScriptも選べるがわからないのでやめときます）
Package manager: Npm（Yarmは使ったことないので）
UI framework:Bootstrap Vue(Bootstrapは聞いたことあるのでこれにします）
Nuxt.js modules:選択なし（Axiosとかここで入れられるみたいなのですがわからないのでなし）
Linting tools:ESLint（有名らしいのでこれにしておきます）　
Testing framework: None(お試しでテストしないので）
Rendering mode:Universal (SSR / SSG) （ここでSPAに切り替えもできるみたい）
Deployment target: Static (Static/JAMStack hosting) 
Development tools:選択なし

地味に選択する項目が多いですね…設定項目については公式ドキュメントに詳しく書かれているので参考にしてください。

正常に終了すると以下の表示になります。Terminalに絵文字出るとちょっとうれしいですね。

```terminal:terminal
🎉  Successfully created project vuetodolist
```


### VSCodeで読むこむ
VSCodeのフォルダを開くから生成されたプロジェクトフォルダを開きます。
.gitがすでに作成されていたのですが私だけ？

###npm runする
ターミナルを開いてビルドします（ビルドであっているのだろうか？）

```terminal:terminal
npm run dev
```
私の環境では以下ポートで起動しました。
http://localhost:3000/  

Chromeでアクセスすると以下の画面が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455756/cccc136f-12a5-55d0-5c19-b3734b03da2e.png)

とりあえずの環境構築はこれで完了です。
ScriptタグでjQuery読み込んでだ頃とは随分違うんですね…
JavaScript: ["1", "2", "3"].map(parseInt) は正しく動かない

JavaScriptで下記のようなコードを書いた際に下記のような結果になりました。

```js
> ['1', '2', '3'].map(parseInt)
[ 1, NaN, NaN ]
```

## なんでこうなるのか
ドキュメントの [トリッキーな使用例](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/map#Tricky_use_case) に全く同じことが記載されていました。

parseIntには第二引数に基数を指定するオプションがあり、mapで繰り返し処理を行う際のindexが第二引数となっているため、上記の結果になります。
実際の挙動としては下記のようになっているとのこと。

```js
// parseInt(string, radix) -> map(parseInt(value, index))
/*  first iteration  (index is 0): */ parseInt("1", 0)  // 1
/*  second iteration (index is 1): */ parseInt("2", 1)  // NaN
/*  third iteration  (index is 2): */ parseInt("3", 2)  // NaN
```

## どうすれば良いのか
省略せずに下記のように書いておくのが安全です。
今回はparseIntがオプション引数を受け取るようになっていたということですが、念のため毎回このように書いておいた方が無難そう。

```js
['1', '2', '3'].map(value => parseInt(value))
```

## ついでにparseIntのドキュメントも確認
NaNが返される場合と第二引数が0の場合についての記載も[解説](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/parseInt)にありました。

> また、下記の場合は NaN が返されます。
radix が 2 よりも小さいか 36 よりも大きい、またはr
最初のホワイトスペース以外の文字が数値に変換できない。



> radix が undefined, 0, または指定されなかった場合、 JavaScript 以下のように仮定します。
> 1. 入力した string が "0x" または "0X" (ゼロに続いて小文字または大文字の X) で始まった場合は、 radix は 16 と仮定され、残りの文字列が16進数として解釈されます。
2. 入力した string が "0" (ゼロ) で始まった場合は、 radix は 8 (8進数) または 10 (10進数) と仮定されます。厳密にどちらの基数が選択されるかは実装に依存します。 ECMAScript 5 では 10 (10進数) を使用するべきだと明示していますが、まだすべてのブラウザーが対応している訳ではありません。したがって、parseInt関数を使うときは radix を常に指定してください。
3. 入力した string がその他の値で始まるときは、基数は 10 (10進数) となります。
クラスの定義

#クラスの作り方
personというクラスを作る

```python:qiita.py
class Person(object):
    def say_something(self):
        print("hello")

person = Person()
person.say_something()
```
python3以降では以下のように書いても同様の結果が得られる

```python:qiita.py
class Person:
    def say_something(self):
        print("hello")

class Person():
    def say_something(self):
        print("hello")

```

#クラスの初期化
クラスが作られた時点で実行される
この中で初期設定をしていく

```python:qiita.py
class Person(object):
    def __init__(self):
        print("first")

    def say_something(self):
        print("hello")

person = Person()
# person.say_something()
```


![スクリーンショット 2020-08-16 19.21.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527694/cc06b7b0-7d5c-06ec-a30c-da54ec4d69f2.png)

#クラス変数
personというオブジェクトに値を保持させたいとき
selfを使う　

```python:qiita.py
class Person(object):
    def __init__(self,name):
        self.name = name
        print(self.name)

    def say_something(self):
        print("hello")

person = Person("kirin")
```
関数と同様に引数を必要としているため、与えないとエラーが起きる

```python:qiita.py
 def __init__(self,name):
        self.name = name
        print(self.name)
```
実行結果
![スクリーンショット 2020-08-16 19.32.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527694/4382f367-938b-2d37-35e9-2922b0a4b64f.png)

クラスのメソッドはselfを用いて値を引き継いでいく
一度selfで値保持すると同じクラス内の関数で使える


```python:qiita.py
class Person(object):
    def __init__(self,name):
        self.name = name
        print(self.name)

    def say_something(self):
        print("I am {}. hello".format(self.name))

person = Person("kirin")
person.say_something()
```
実行結果
![スクリーンショット 2020-08-16 19.36.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527694/986ea0e4-7dd7-2fd7-156b-9cd2b7509459.png)
自分自身のメソッドを読み込む事も可能

```python:qiita.py
class Person(object):
    def __init__(self,name):
        self.name = name

    def say_something(self):
        print("I am {}. hello".format(self.name))
        self.run()#自分自身のメソッドにアクセス


    def run(self):
        print("run")

person = Person("kirin")
person.say_something()
#say_somethingを呼び出す
```

実行結果
![スクリーンショット 2020-08-16 19.41.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527694/61f3881b-fcfa-ac3d-17c7-c7a753673def.png)