OmniAICreator/Qiita-1.07M huggingface dataset:
gemのransackで複数カラムを検索対象にする方法

##始めに
僕自身複数カラムを検索対象にするのは難しいと思っていたのですが、思っていたより簡単にできたので是非参考にしてもらえたらなと思い、書くことにしました。

##前提
僕はPostモデルのtitleとdescriptionを検索対象にやっていきます。

```ruby
class CreatePosts < ActiveRecord::Migration[5.2]
  def change
    create_table :posts do |t|
      t.string :title 　⬅️⬅️⬅️⬅️⬅️⬅️これ
      t.integer :recommended　　　　
      t.text :description　⬅️⬅️⬅️⬅️これ
      t.references :user, foreign_key: true

      t.timestamps
    end
    add_index :posts, [:user_id, :created_at]
  end
end
```

##やり方
始めにviewの一部を変えていきます。
titleだけを検索対象の場合は、

```ruby
<%= f.search_field :title_cont, placeholder: "キーワード検索", class: 'form-control font-awesome' %>
```
titleとdescriptionの複数を検索対象にする場合、

```ruby
<%= f.search_field :title_or_description_cont, placeholder: "キーワード検索", class: 'form-control font-awesome' %>
```
比較すると、titleだけ検索対象の方はtitle_contなのに対し、複数検索対象の方は<strong>title_or_description_cont</strong>となっています。orを入れるだけです！

次はcontrollerです。
僕の場合、titleだけ検索対象だと、

```ruby
def set_search
  if logged_in?
    @search_word = params[:q][:title_cont] if params[:q]
    @q = current_user.feed.page(params[:page]).per(10).ransack(params[:q])
    @feed_items = current_user.feed.page(params[:page]).per(10)
    @posts = @q.result(distinct: true)
  end
end
```
複数検索対象だと、ここも先ほどのviewと一緒で一部変更するだけです！

```ruby
@search_word = params[:q][:title_or_description_cont] if params[:q]
```

これで複数カラムを検索対象にできました！！！
[Python] Altairの凡例(legend)をプロットエリア内に表示させる

How To Place Legend Inside the Plot area in Altair
##この記事について
最近はpandas/dataframeと相性がいいAltairが気にいって使っています。
しかし、凡例の位置はmatplotlibだとプロット内に表示されるのに、Altairだと外になってしまい、位置の調節の仕方が分かりませんでした。英語でもなかなか資料が見つからなかったのですが、AltairがパースしているVega-Liteのドキュメントなどをみて解決しましたので、記事にします。


非常に参考にさせていただいた、こちらのサイトよりIrisのデータのグラフにて説明したいと思います。
[Altairのすすめ！Pythonによるデータの可視化]
(https://qiita.com/dr666m1/items/b71bef31ba3a21868095)

BEFORE 　デフォルトでは右側に出てしまいます
![スクリーンショット 2021-01-19 100349.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/823476/1b7a7543-630f-d576-d99f-d91753658cd7.png)


```python
import altair as alt
from vega_datasets import data
iris = data.iris()

alt.Chart(iris).mark_point().encode(
    alt.X("sepalLength", scale=alt.Scale(zero=False)),
    alt.Y("sepalWidth", scale=alt.Scale(zero=False)),
    color="species"
).interactive()
```

AFTER 　　plot areaの任意の場所に移せます
![スクリーンショット 2021-01-19 101032.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/823476/a7f3369a-d100-71cc-08c4-a847a09a09fd.png)

```python

import altair as alt
from vega_datasets import data
iris = data.iris()

alt.Chart(iris).mark_point().encode(
    alt.X("sepalLength", scale=alt.Scale(zero=False)),
    alt.Y("sepalWidth", scale=alt.Scale(zero=False)),
    color=alt.Color("species", 
        legend=alt.Legend(orient='none', legendX=250, legendY=5,  ## orientをnoneに設定するとlegenX,legendYが指定できる
                strokeColor='blue', fillColor='white', padding=10))　## legendの四角の設定
)
```

##凡例設定のポイント
コードをみていただければ分かるかと思いますが、alt.Legendでいろいろと細かく調整できます。
LegendXとLegendYで位置を調整できますが、その際にoriend='none'としておくのがポイントです。なお、このxとyの数値は何なのか、ちょっと分かりません・・なんとなくできてしまいますが、誰かご存知でしたら教えてください

以下、参考にしたVeg-Liteのdocumentの大事なところをスクショして載せます。
Legend | Vega-Lite
https://vega.github.io/vega-lite/docs/legend.html

![スクリーンショット 2021-01-19 103539.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/823476/2c04d151-9891-9922-1a32-fbb14fcf9b10.png)
![スクリーンショット 2021-01-19 103610.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/823476/da62c7d4-6237-d827-348c-eafad14a09f2.png)
![スクリーンショット 2021-01-19 103720.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/823476/bfdcc780-d93b-7655-9b0e-988185445f2d.png)

----

こちらの記事とは関係ありませんが、この中国の方のサイトの例は充実していました。
Python Altair COVID-19疫情数据可视化实践经验分享
https://www.cnblogs.com/dotlink/archive/2004/01/13/covid-19.html
github webhook で slack通知を行う簡易アプリをgoogle cloud function(python)に実装する際のsecretsの認証周りメモ

# 背景
githubには発生したイベントをhookにリクエストを送信する[webhook](https://docs.github.com/ja/github/extending-github/about-webhooks)という機能がある。例えば、github webhook + googlo cloud function + slack などを組み合わせると、独自のgithub -> slackの通知機能を実装することができる。

github secretにはsecrets設定ができる。これを使うことでよりセキュアなwebhookアプリケーションが作れる。

[webhook のセキュリティ保護](https://docs.github.com/ja/developers/webhooks-and-events/securing-your-webhooks)

今回は、google cloud function で通知アプリを実装する際に、このセキュア実装をどうやるかをメモ。 

# 実装
```py
import hmac
import hashlib

def verify_github_secrets(req) -> bool:
    secret_value = "YOUR_SECRET"
    sigExpected = request.headers.get("X-Hub-Signature").split('sha1=')[-1].strip()
    sigCalculated = hmac.new(secret_value.encode(), request.data, hashlib.sha1).hexdigest()
    return hmac.compare_digest(sigCalculated, sigExpected)

def main(req):
    if not verify_github_secrets(req):
        return "fail github auth"
    # TODO 実装
    return "ok"
```


# 参考
- [How can I validate payloads from GitHub webhooks in Python 3?](https://stackoverflow.com/questions/59580376/how-can-i-validate-payloads-from-github-webhooks-in-python-3)
Windows10: ディスククリーンしても容量が減らない時の対処法

## 状況
- Windows10 バージョン2004のドライブ(222GB)の残りが数GB
- 日に日に圧迫される様子
- 意識的に使っている容量は60GBでどう考えても100GB行かないはず…

## 効果的だった対処法
- 原因: Windows Searchのインデックスファイル
- ファイルの場所: C:\ProgramData\Microsoft\Search\Data\Applications\Windows\Windows.edb
    - 初期設定ではアクセス権限がないので、C:\ProgramData\Microsoftあたりから順に辿って行き、途中で出てくる警告から「続行」する必要がある
    - Windows.edbファイルがなんと106GBあった
- 削除方法
    - Windowsマーク横の検索窓から「service」を検索
    - 名前欄で「Windows Search」を探し、右クリック > プロパティ
    - 「スタートアップの種類」を「無効」に変更
    - 適用 > OK
    - 「Windows Search」を右クリック > 停止
    - C:\ProgramData\Microsoft\Search\Data\Applications\Windows\Windows.edbを削除
    - これで100GB空きました！！
- 注意事項
    - インデックスファイルを停止するとどうなるか
        - ファイルエクスプローラーでの検索ができない
        - アプリ検索は可能
        - wordの全文検索も可能
        
今のところWindows searchを停止していて困らないので再開するつもりはなし。再開する場合は特定のフォルダのみ対象とすることでサイズを減らせるらしい。
参考サイト: http://office-qa.com/win/win183.htm


## 忘備録
### 試行錯誤したこと
- ウィルス対策ソフトのログファイルの大きさ確認
    - 前にひっかかったことがあったので確認したが今回は問題なし
- 巨大ファイルの検索
    - ファイルエクスプローラーで行ったがヒットせず
- Windows updateのやり直し
    - 最近updateをしたので更新ファイルのアンインストールや再インストールをしたが変化なし
- ドライブの使用状況の整理
    - 設定 > 記憶域 > 表示するカテゴリーを増やす
    - 「システムと予約済み」が100GB越え！
    - ダブルクリックして詳細表示するとシステムファイルが135GB！
    - システムファイルが原因と判明
- ディスクのクリーンアップ
    - Windows(C)のプロパティ > ディスクのクリーンアップ > システムファイルのクリーンアップ
    - 調べるとよくヒットしたので試したが数MB程度で効果が薄い

###  PowerShellで力技検索するときの覚書
```powershell
#下位フォルダ+ファイルの容量表示
ls | %{echo $_;ls $_ -Recurse |measure -Sum Length}
#下位フォルダの容量表示
ls -Directory | %{echo $_;ls $_ -Recurse |measure -Sum Length}
#現在いるフォルダ内のファイルの全容量合計
ls -Recurse -File | measure -Sum Length
#バイト表示をGBに(KB -> MB -> GBに変換するだけ)
(数字のコピペ)/1000/1000/1000
#エクスプローラーで開きたい時
ii .
```
PHP 配列が空かどうかを判定する

## 〜宣伝〜

:::note info
個人開発でエンジニア専門マッチングサービスを開発しましたので、是非未経験からエンジニア目指している人！現役エンジニアで教えたい人！使ってみてください！

β版リリース記念キャンペーン中です！

10名様限定、抽選でお好きな技術本1冊プレゼント！
🎉当選者にはメッセージ差し上げます(送付の際に住所はお聞きしません)
詳しくはこちらから↓

https://x.com/dokupro01/status/1796837336145436846
:::
https://dokupro.dev/

## 目的

- PHPで配列が空かどうか判定する方法をメモ的にまとめる

## 情報

- 下記サービスを用いて本記事の内容を検証した。
    - [https://paiza.io/ja](https://paiza.io/ja)

## 方法

- empty()関数を用いて配列が空かどうかを判定する。empty()関数は空の場合trueを返す。
- 「当該変数に配列が格納されており、かつ、その配列が空」であることをチェックしたいためempty()関数だけではなくis_array()関数も一緒に使用する。
- 下記を実行すると変数`$array`には空の配列が格納されているため「Empty data」の文字列が出力される。

    ```php
    <?php

    $array = [];

    if (is_array($array) && empty($array)) {
        echo 'Empty data';
    }
    ```

## 参考文献

- [https://www.php.net/manual/ja/function.empty.php](https://www.php.net/manual/ja/function.empty.php)
Kotlin ネストしたクラスを外に出してみる

　金田著「[はじめてのandroidプログラミング 第５版](https://www.sbcr.jp/product/4815607968/)」を使って、勉強しています。

　「第８章タイマーを使ってスライドショーを実装する」で使っているテクニックを解析してみます。
　今日のテーマは、ネストした(入れ子になった)クラスを外に出してみるです。初心者にとって、クラスの中にクラスが入れ子になって入っていると、違和感を感じませんか。そこでネストしたクラスを外に出してみます。
　
　以下、本書を持っている前提で説明します。本書を使って勉強中の方、一緒に勉強しましょう。

##0.前提
　p224まで写経が済んでいるとします。

##1.原型
　p224まで写経が済んでいる状態のコードを示します。説明に不要な部分は、著作権に配慮して省略しています。
　MainActivityクラスの中に、MyAdapterクラスがネスト（入れ子）になっています。これはMyAdapterクラスがMainActivityクラスでしか使わないためです。この説明は、本書には書かれていないようです。参考としてJosh Skeen著 吉川監訳 「[Kotlinプログラミング](https://www.shoeisha.co.jp/book/detail/9784798160191)」のp242に書かれています。


```MainActivity.kt
class MainActivity : AppCompatActivity() {

    // MainActivityクラスの中にMyAdapterクラスをネスト(入れ子にする）
    class MyAdapter(fa: FragmentActivity) : FragmentStateAdapter(fa) {
        // 省略
    }

    private lateinit var binding: ActivityMainBinding
    override fun onCreate(savedInstanceState: Bundle?) {
        // 省略
        binding.pager.adapter = MyAdapter(this)
    }
}
```

##2.入れ子になったクラスを外に出す
　初心者には、クラスの中にクラスがあると、ぱっと見、慣れていないと違和感を感じます。このため入れ子になったMyAdapterクラスを外に出してみます。また出されたMyAdapterクラスは、ファイルの外部から見える必要がないので可視性をprivateに変更しました。この説明は和訳版kotlinリファレンスの[可視性修飾子](https://dogwood008.github.io/kotlin-web-site-ja/docs/reference/visibility-modifiers.html#%E5%8F%AF%E8%A6%96%E6%80%A7%E4%BF%AE%E9%A3%BE%E5%AD%90)に書かれています。

```MainActivity.kt
class MainActivity : AppCompatActivity() {
    // ネストクラス
    // class MyAdapter(fa: FragmentActivity) : FragmentStateAdapter(fa) {
    //     // 省略
    // }

    private lateinit var binding: ActivityMainBinding
    override fun onCreate(savedInstanceState: Bundle?) {
        // 省略
        binding.pager.adapter = MyAdapter(this)
    }
}

// MyAdapterクラスをMainActivityクラスの外に出す
private class MyAdapter(fa: FragmentActivity) : FragmentStateAdapter(fa) {
    // 省略
}
```

　ネストクラスは、コードの可読性、クラスの可視性(カプセル化)を高める目的で使われますが、慣れていない人は、逆に、試しにネストしたクラスを外に出して、意味を確認しながらネストクラスに慣れていきましょう。
Cloud RunとPython（Flask）で爆速WEBサイト構築 

# Cloud RunとPython（Flask）で爆速WEBサイト構築 

[#週末ハッカソン](https://twitter.com/hashtag/%E9%80%B1%E6%9C%AB%E3%83%8F%E3%83%83%E3%82%AB%E3%82%BD%E3%83%B3)用のWEBサイトを作成したので公開することにした
AWSやレンタルサーバーなど選択肢は沢山あるが今回はサーバーレスでほぼ無料で運用可能なCloud Runを使うことにした

## Google Cloud SDKのインストール

[Google Cloud SDK](https://cloud.google.com/sdk/docs/install) よりダウンロード

ダウンロードディレクトリに移動しsh実行、基本yで進む
インストール後ターミナルを再起動

```
$ sh install.sh
```

バージョン確認

```
$ gcloud version
Google Cloud SDK 321.0.0
bq 2.0.64
core 2020.12.11
gsutil 4.57
```

## SDK設定

ブラウザが開くので操作アカウントでログイン
次に操作プロジェクトを選択

```
$ gcloud init
```

プロジェクト変更したい場合

```
$ gcloud config set project [プロジェクト名]
```

## ビルド

Cloud Build を使用して Docker イメージをビルド
Dockerfile を作成
※ ./app コードは[こちら](https://qiita.com/morita-toyscreation/items/8471a2ccc481a840c372) を参考

```Dockerfile
FROM python:3.7.4

WORKDIR /app
ADD . /app

RUN apt-get update && apt-get clean;

RUN pip install -r requirements.txt

ENV TZ = "Asia/Tokyo"
ENV FLASK_APP /app/app.py
ENV PYTHONPATH $PYTHONPATH:/app

ENV PORT 8080
EXPOSE 8080

CMD ["python", "app.py"]
```

ビルド実行

```
$ gcloud builds submit --tag gcr.io/weekend-hackathon/weekend-hackathon
```

![screencapture-console-cloud-google-cloud-build-builds-2021-01-19-10_01_43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59264/678ab09f-aeac-c9e0-f113-0e1bd6455905.png)


## デプロイ

Cloud Run を使いビルドしたコンテナをデプロイ

```
$ gcloud run deploy weekend-hackathon --project=weekend-hackathon --image=gcr.io/weekend-hackathon/weekend-hackathon --region=us-central1 --platform=managed --no-allow-unauthenticated

Deploying container to Cloud Run service [weekend-hackathon] in project [weekend-hackathon] region [us-central1]
✓ Deploying new service... Done.
  ✓ Creating Revision...
  ✓ Routing traffic...
Done.
Service [weekend-hackathon] revision [weekend-hackathon-00001-teq] has been deployed and is serving 100 percent of traffic.
Service URL: https://weekend-hackathon-leopsotyca-uc.a.run.app
```

権限を追加

```
$ gcloud run services add-iam-policy-binding weekend-hackathon --region=us-central1 --member="allUsers" --role="roles/run.invoker" --platform=managed
Updated IAM policy for service [weekend-hackathon].
bindings:
- members:
  - allUsers
  role: roles/run.invoker
etag: BwW5NtPWfrM=
version: 1
```

URLにアクセスしサイトが表示されれば完了
https://weekend-hackathon-leopsotyca-uc.a.run.app

![screencapture-localhost-8080-2021-01-15-2021-01-18-2021-01-19-10_36_10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59264/7aefc5d9-65dc-6517-239a-521fdadc7735.png)

## 補足

運用ではdeploy_run.shを作り一括してデプロイできるようにする
ローカルのDocker環境がそのまま公開できるので爆速で公開が可能
また　Cloud Runはアクセス単位の料金なので初期リリースには最適是非お試しあれ
クラスとインスタンス

#クラスとは？
設計図や料理のレシピのような物です。新しい物を作るのにその度に一から作るのは手間と時間がかかります。
それを避けるために、共通のルールを守った上で個別のデータを作ることが出来るようにする物です。
クラスは共通の処理と属性を決めるだけで、単体でデータを扱うことはできません。

```
class クラス名
  # 変数やメソッドの定義
end
```

今回はジャムを作るJamクラスを定義して見ましょう。

```
class Jam

end
```

##インスタンスとは
実際に作られる『もの』のことです。
クラスを定義しましたがクラスだけでは何のデータも持ちません。
データを持つインスタンスをクラスから生成します。
クラスは定義しなくてもnewというメソッドを始めから持っていてこれを実行することで
データを持つインスタンスが生成されます。

インスタンスを生成したあとからデータを追加したり、メソッドを実行できるようにするために
変数に代入して作ります。

```
変数名 = クラス名.new
```

実際にインスタンスを生成してみると

```
class Jam

end

strawberry_jum = Jam.new
```
今はレシピに何も書かれていないので空の状態です。

##インスタンスメソッド
名前の通りインスタンスが使用できるメソッドでクラスに記述します

```
class クラス名
  def メソッド名
    # 処理
  end
end
```



実際にインスタンスメソッドを定義してみましょう。

```
class Jam
  def make_jam
   #処理を記入
  end
end

strawberry_jum = Jam.new
strawberry_jum.make_jam
```
まだメソッドの中身を定義していないので何も起きません。（後ほど中身を記入して使います。）

#インスタンス変数
データの持つ属性を定義する物です。
定義しておくことで全てのインスタンスは同じ属性を持ちますが
それぞれ異なる値を設定することができます。
例えば同じ『ボール』という属性を定義したとしても値は『サッカーボール』や『バスケットボール』や『野球ボール』と様々な値がありますよね。

変数の頭に@をつけてこのように定義します。

```
class クラス名
  def メソッド名
    @変数名 = 値  # インスタンス変数
  end
end
```

インスタンス変数のスコープは、そのクラスのすべてのインスタンスメソッドなのでインスタンスの全ての動作に使用できます。

##initializeメソッド
インスタンスが生成されると同時に、定義した処理が実行されるインスタンスメソッドです。
今回の場合newメソッドでインスタンスが作られた時に同時に生成されます

インスタンス変数とinitializeメソッドを使ってみましょう。

```
class Jam
  def initialize(jam_taste,jam_color,jam_price)　#渡した引数が代入される
    @taste = jam_taste    #jam_tasteにstrawberryが代入されている
    @color = jam_color    #jam_colorにredが代入されている
    @price = jam_price    #jam_priceに300が代入されている
  end

  def make_jam
  end
end

strawberry_jum = Jam.new('イチゴ','赤',300)#引数を渡す
strawberry_jum.make_jam
```
インスタンスメソッドmake_jamに処理を記述して使ってみましょう。

```
class Jam
  def initialize(jam_taste,jam_color,jam_price)　
    @taste = jam_taste 
    @color = jam_color   
    @price = jam_price    
  end

  def make_jam
    puts "#{@taste}味のジャムを作ります。色は#{@color}色で値段は{@price}円です"
  end

    strawberry_jum = Jam.new('イチゴ','赤',300)
    strawberry_jum.make_jam  #イチゴ味のジャムを作ります。色は赤色で値段は３００円です　と出力される。
end
```

ちなみに、みかん味のジャムが作りたくなったらどうするかというと

```
class Jam
  def initialize(jam_taste,jam_color,jam_price)　
    @taste = jam_taste 
    @color = jam_color   
    @price = jam_price    
  end

  def make_jam
    puts "#{@taste}味のジャムを作ります。色は#{@color}色で値段は{@price}円です"
  end

    strawberry_jum = Jam.new('イチゴ','赤',300)
    strawberry_jum.make_jam  
    
    orange_jum = Jam.new('みかん','オレンジ','２５０')
    orange_jum.make_jum #みかん味のジャムを作ります。色はオレンジ色で値段は250円です　と出力される。

end
```

このようになります。

##クラスメソッド
クラスで共通した処理を定義したい時に使います。
メソッド名の頭に self をつけて定義します

```
class クラス名
  def self.メソッド名
    # 処理
  end
end
```

実際に使ってみましょう。

```
class Jam
  def self.use
   puts "パンに塗って使います"
  end

  def initialize(jam_taste,jam_color,jam_price)　
    @taste = jam_taste 
    @color = jam_color   
    @price = jam_price    
  end

  def make_jam
    puts "#{@taste}味のジャムを作ります。色は#{@color}色で値段は{@price}円です"
  end

    strawberry_jum = Jam.new('イチゴ','赤',300)
    strawberry_jum.make_jam  
    
    orange_jum = Jam.new('みかん','オレンジ','２５０')
    orange_jum.make_jum #みかん味のジャムを作ります。色はオレンジ色で値段は250円です　と出力される。
   
    Jam.use #パンに塗って使います　と出力される。
    
end
```

以上です。
server.xmlのContextのpathにSNAPSHOTがくっついてる！


# 事象 : アプリの画面でHTTPステータス404になる
- 環境
    - Windows10 Pro バージョン1909
    - Server version: Apache Tomcat/8.5.61
    - Eclipse IDE for Enterprise Java Developers Version: 2020-09 (4.17.0)

EclipseでTomcatを起動してアプリのURLをたたいたら404。しかし画面を見るにTomcatが動いてはいる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159761/4d6b8ce3-6eb2-2e68-b41c-a7105979b551.png)

server.xmlをみたらContextのpathに「##{バージョン}-SNAPSHOT」がくっついてる！

```xml:server.xml
<!-- 省略 -->
        <Context docBase="project-name" path="/project-name##2.20.0-SNAPSHOT"...省略.../>
      </Host>
    </Engine>
  </Service>
</Server>
```

## 原因 : pom.xmlのfinalNameでproject.versionをくっつけているから

```xml:pom.xml
<!-- 省略 -->
  <build>
    <finalName>${project.artifactId}##${project.version}</finalName>
<!-- 省略 -->
```

### 対応 : (プロジェクト設定したくない場合)server.xmlを修正する
直にserver.xmlのContextのpathから`##{バージョン}-SNAPSHOT`を削除してTomcatを再起動する。

Tomcatからプロジェクトを削除して再デプロイすると元に戻るのが難点。面倒くさい！

```xml:server.xml
<!-- 省略 -->
        <Context docBase="project-name" path="/project-name"...省略.../>
      </Host>
    </Engine>
  </Service>
</Server>
```

### 対応 : (pom.xmlを修正したくない場合)プロジェクトのContext rootを修正する
Mavenビルドすると設定が戻るのが難点:sob:

1. [Project Explorer] > 対象プロジェクト選択 > `Alt + Enter`でダイアログを開く
1. [Web Project Settings] > [Context root] > ここが`##{バージョン}-SNAPSHOT`がくっついた状態になっている![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159761/6c948707-290c-1f4b-c12e-ab23012bf20c.png)
1. `##{バージョン}-SNAPSHOT`を削除 > [Apply and Close]ボタンでダイアログを閉じる
1. [Servers]タブでTomcatからプロジェクトを削除
1. Tomcatを選択して右クリック > [Clean] > 今一度デプロイしてTomcatを起動

### 対応 : pom.xmlのfinalNameを修正する
1. pom.xmlのfinalNameから`##${project.version}`を削除
1. [Project Explorer] > 対象プロジェクト選択 > `Alt + F5`でダイアログを開いてMavenビルドする
1. [Servers]タブでTomcatからプロジェクトを削除
1. Tomcatを選択して右クリック > [Clean] > 今一度デプロイしてTomcatを起動

```xml:pom.xml
<!-- 省略 -->
  <build>
    <finalName>${project.artifactId}</finalName>
<!-- 省略 -->
```
中学3年生がコロナで暇なので本気で茶コーダーを目指す【競プロ】~3日目~

#シリーズ
**中学3年生がコロナで暇なので本気で茶コーダーを目指す**
[第一話(1/16)](https://qiita.com/hyugo/items/9d18552a3fe203272baa)
[第二話(1/17)](https://qiita.com/hyugo/items/2335f6e6fc12b1f3b305)
###宣伝とお願い
数学に関して色々自分だけではどうしてもわからない部分が出てきていて、、
僕が数学や技術知識を皆様にご教授いただきたいです

Qiitaのコメント欄だけではどうしても限界が出てくる
ということで、Atcorder専用のdiscordサーバーを作成しました。
[こちらの招待リンク](https://discord.gg/YEyxKxCAHq)から参加していただき、
`一言` というスレッドに一言いただけたら助かります。

皆さんの想像を超えるくらい数学ができないので、初歩的な質問をすることになりますが、温かい目で見守っていただけたら助かります。

#お礼
初日の記事がトレンド入りしたみたいで、自分のモチベがかなり上がりました。
本当にありがとうございます。

また、アドバイスもいただき
最速で茶コーダーを目指すならPythonがいいみたいです。

C++が強い点は早いところで、最初のうちは早さが問題になることは少ないみたいなので、
なんでC++で始めたのか少し余談を入れようと思います

##裏話(余談)
じつは自分、学校の担任から[情報科学の達人](https://www.nii.ac.jp/tatsujin/)というプログラムに誘われまして、、、募集要項を見たところ情報オリンピックによる推薦(情報オリンピック本選出場で)が受けられるみたいなのですが、本戦では、C言語しか扱えないみたいで
予選突破するからには本戦も勝ち抜きたいなと思ったわけでC++を始めました。

アドバイスめちゃくちゃ嬉しかったのでこれからも、色々とおすすめの本や、サイトなど教えてくれたら本当に助かります！



#1/18にやったこと
今日はAOJをお休みして数Ⅰのお勉強をしました。
それについて書いていこうと思います。
最初から読んでくれた方は知っていると思いますが、僕の数Ⅰの成績は10段階評価で1です、、、
現在学校では三角関数をやっていますが、僕は二次関数から取り組みました。
(これを機に数学の成績も一緒に上げたいです(願望))

#2次関数のグラフの式の求め方を理解するのに二時間(ガチ)
学校の授業中は基本的に支給されたiPadからGitHubをいじったり、サーバーをいじったりしているので、授業を聞いていませんが、この辺の内容は昨年の9月くらいにやってた気がします。
###関数って本当に使うの？
Atcorder Beginner Selection のC問題に内積っていういかにも数学っぽい課題があり、関数はやらなきゃな。。。って思ったわけです。

本当に使うのかはわからないですが、これもやって損はない理論でやりました。
※茶コーダーを目指すうえで必要な数学知識に関しても教えていただけると助かります。

#二次関数を理解したうえで少しPythonをいじってみる。
二次関数を理解したところでプログラムが実装できなかったら勉強した意味がないと思います。

かといって、C++を完璧に理解できたわけでもなく、、、

*a,,,numpyあるやん..*

C++ではないですが、numpyとmathplotlibを使ってグラフの生産をして、少しプログラミングに近づけました。

```python
import numpy as nmp
import matplotlib.pyplot as pl
x = nmp.linspace(-1, 1, 100)
pl.figure(0)
pl.plot(x, ((3*x)**2)+6*x+2)
pl.show()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/921821/6ad69ed8-ed65-8f0a-2a04-f4b9436283d5.png)

なんとなくイメージは掴めました。

これをC++でやらなきゃ意味ないんですけど、今の自分には満足です。

#今日の感想
自分が数学に手を付ける日が来るとは思ってもいませんでした。
Pythonでグラフの生産はできたのですが、C++ではそもそもできるのでしょうか？

因みに今日(1/19に執筆)はAOJをひたすらやるつもりです。

discord,Qiitaでのアドバイスよろしくお願いいたします。
fizz_buzz問題で使用された表現

# 前回投稿したfizz_buzz問題
記述を見ていると基礎的な表現が多い様に感じたので、
実際に使われたいた表現に関して整理してみる。

実際の[fizz_buzz問題解説](https://qiita.com/iamu_TECH_CAMP/items/8253c8b123c20b8343c6)はこちらから

```ruby:fizz_buzz問題
def fizz_buzz
  num = 1
  while (num <= 100) do
    if num % 15 == 0
      puts "FizzBuzz"
    elsif (num % 3) == 0
      puts "Fizz"
    elsif (num % 5) == 0
      puts "Buzz"
    else
      puts num
    end
    num = num + 1
  end
end

fizz_buzz
```


## 代入演算子
```ruby:代入演算子
num = 1 # 変数名 = 格納する値
```
- 上記の記述による作用
  - `代入`と呼ばれる記述を用いて`変数に値を格納`している。

- `代入`
  - 変数の後の`=`を記述することで`変数の箱の中に入れる事ができる。
  - `=`のことを代入演算子と呼ぶ。
Rubyに置いて = が１つの式は「右側の値を左の変数に代入する」という意味になる。


- 変数とは
  - `変数`とは値を入れる箱のようなもの
どの様な値が入っているのかをわかりやすい様に変数名を定義する。

## 再代入

```ruby:再代入
num = num + 1
```

- 1度値を代入したあとの変数に、別の値を再び代入すること
  - プログラム中に何度でも変更可能
- 以下の記述で簡潔にまとめる事も可能

```ruby:再代入の省略形(自己代入演算子を採用)
num += 1
```

## if文 + elsif

- if文とは
  - 「もし〇〇だったら△△をする」と処理を分けることができます。

- elsif
  - 条件式を追加できます。

```ruby:正しいときとそうでない時の条件分岐
if num % 15 == 0 # 条件式1
  puts "FizzBuzz" # 条件式1が真(true)のときに実行する処理

elsif (num % 3) == 0 # 条件式2
  puts "Fizz" # 条件式1が偽(false)+条件式2が真(true)のときに実行する処理

elsif (num % 5) == 0 # 条件式3
  puts "Buzz" # 条件式1と条件式2がどちらとも偽(false)+条件式3が真(true)のとき実行する処理

else # 当てはまらない時
  puts num # 上記の条件式に当てはまらなかった時に実行する処理
end

```

## 比較演算子 + 代数演算子

```ruby:比較演算子+代数演算子
while (num <= 100) do # numは100以下か

if num % 15 == 0 # 剰余（割った余り）は
                   # 0と等しいか
elsif (num % 3) == 0 # 剰余（割った余り）は
                       # 0と等しいか
elsif (num % 5) == 0 # 剰余（割った余り）は
                       # 0と等しいか
```
- **比較演算子**

  - `A > B`
AはBより大きいか

  - `A >= B`
AはB以上か

  - `A < B`
AはBより小さいか

  - `A <= B`
AはB以下か 

  - `A == B` 
AとBは等しいか

- **代数演算子**

  - `+`足し算

  - `-`引き算

  - `*`かけ算

  - `/`割り算

  - `%`剰余（割った余り）
Dagger 2.31のAssisted Inject

例えば、動画を再生しているアプリで、このVideoのIDの動画を再生したい！みたいなときにViewModelにidを渡したくなったりしますよね？そしてそのViewModelに**Repositoryとかのインスタンスをinjectしつつ、videoIdを渡してvideoIdがNullableであるとかlateinitであるとかを意識せずに簡単に使えるようにしたい**ですよね。これができるのがAssited Injectです。
これを使うとコンストラクタに自分で指定した引数を追加することができるのでNullableやlateinitにせずに引数を追加できます。
この用途に、これまでsquare/AssistedInjectを使っていましたが、Dagger 2.31でこの機能が追加されました。

# コード

基本的にinterfaceでFactoryを作ってそれに`@AssistedFactory`をつけて、そこに渡したい引数を追加したメソッドを追加し、作りたいクラスのコンストラクタに`@AssistedInject`をつけて、カスタマイズしたい引数に`@Assisted`をつけるだけです。

```kotlin
class VideoPlayerViewModel @AssistedInject constructor(
    private val videoPlayer: VideoPlayer,
    @Assisted private val videoId: String
) : ViewModel() {
    fun play() {
        videoPlayer.play()
    }

    @AssistedFactory
    interface Factory {
        fun create(videoId: String): VideoPlayerViewModel
    }
}
```

そして、FactoryをActivityやFragmentで以下のようにinjectさせてあげるだけです。

```kotlin
    @Inject
    lateinit var videoPlayerViewModelAssistedFactory: VideoPlayerViewModel.Factory
```

あとは**videoPlayerViewModelAssistedFactory.create(videoId)とかで呼び出せばViewModelが作れます。**
Assisted Injectの説明としてはこれで問題ないのですが、注意が必要な点として、ViewModelは自由にインスタンスを作っていいものではなく、画面回転でもViewModelStoreで保持されるようにする必要があるため、FragmentなどのProviderを利用して取得する必要があるということです。

# サンプル

square/AssistedInjetから移行する完全なサンプルは以下です。以下では`by viewModels{}`を使うことでViewModelStoreで保持させつつ、AssitedInjectを利用しています。
square/AssistedInjetと違う点として`AssistedModule` というのを作る必要がなくなったので非常にシンプルに利用できるようになったので、とても使いやすいです。
https://github.com/takahirom/hilt-sample-app/commit/f54e58d72057e8d81921fa0d4e3bcfe809e9c5b9
Pardot のリード生成 (Salesforce Classic) ⇒ Pardot キャンペーンの設定

１．Pardot でプロスペクトのグループにメールを送信する場合、送信先となるのはどれですか?
２．Pardot キャンペーンと Salesforce キャンペーンの違いは何ですか?
３．Lueng が「お問い合わせ」Pardot キャンペーンにコストを設定したのはなぜですか?
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634241/6ef29166-0998-0f87-171d-a485cc918490.png)
LPIC Lv1-101(Ver5.0)のメモ

#システムアーキテクチャ(主題101)
##ハードウェア設定の決定と設定
##システムの起動
###Systemd
[Systemdとは](https://qiita.com/bluesDD/items/eaf14408d635ffd55a18#systemd%E3%81%A8%E3%81%AF)
###MBR
[MBRとは](https://wa3.i-3-i.info/word15557.html)
###初期RAMディスク
[初期RAMディスクとは](https://my1cdlinux.eksd.jp/createbootablelivecd_aboutinitrd.html)
###udev
[udevとは](https://hogetech.info/2020/10/04/udev-%E5%85%A5%E9%96%80/)
###スワップ領域
[スワップ領域とは](https://wa3.i-3-i.info/word1721.html)
###リングバッファ
[リングバッファとは](https://wa3.i-3-i.info/word14292.html)
##ランレベル/ブートターゲットの変更
###NFS
[NFS](https://e-words.jp/w/NFS.html)
[NFSとは](https://www.designet.co.jp/faq/term/?id=TkZT)
[知っておきたいNFSの基本と活用法](https://baremetal.jp/blog/2018/04/17/541/)
###halt
[halt, shutdown, poweroffの違い](https://kuroeveryday.blogspot.com/2016/11/shutdown-vs-halt-vs-poweroff.html)
###ACPI
[ACPIとは](https://wa3.i-3-i.info/word14319.html)
[acpidとは](https://wa3.i-3-i.info/word14320.html)
#Linuxのインストールとパッケージ管理(主題102)
##ハードディスクのレイアウト設計
###
線形探索の番兵法を用いると何がいいのか？

## 線形探索について
線形探索は`先頭から順番に探す値が見つかるまで探していく`アルゴリズム
![名称未設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116887/b09bae8f-4c5a-4184-c82b-f1f5d8097c6b.png)

まずは上記の図をそのままプログラムにしてみます。

```c

#include <stdio.h>
int main(void){
    int n = 6;
    int a[6] = {5, 2, 1, 8, 6, 3};
    int i;
    int search = 8;
    printf("検索対象 = %d\n", search);
    
    for (i = 0; i < n; i++) {
        printf("%d\n", a[i]);
        if (a[i] == search) {
            puts("見つかりました");
            return 0;
        }
    }
    
    puts("見つかりませんでした");
    return 0;
}
```

### 出力結果
``` :terminal
5
2
1
8
見つかりました
```

## 番兵法
配列の末尾に探したい値を入れておき、必ず`条件式がTrueになるようにする`ことです。
![名称未設定 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116887/2915478b-8996-b896-3068-7564d53dbd56.png)

上記の図をそのままプログラムにしてみます。

```c

#include <stdio.h>
int main(void){
    int n = 6;
    int a[7] = {5, 2, 1, 8, 6, 3};
    int i = 0;
    int search = 9;
    printf("検索対象 = %d\n", search);
    
    a[n] = search;
    while (a[i] != search) {
        printf("%d\n", a[i]);
        i++;
    }
    
    if (i == n) {
        puts("見つかりませんでした");
        return 0;
    }
    
    printf("%d\n", a[i]);
    puts("見つかりました");
    return 0;
}
```

### 出力結果
``` :terminal
検索対象 = 9
5
2
1
8
6
3
見つかりませんでした
```

## まとめ

番兵使用することで、最後は必ず検索に引っかかるので、ループ条件と検索条件を組み合わせることができるようになります。
最初のfor文を使用した例だと、繰り返し条件`i < n`と検索マッチ条件`a[i] == search`が必要だったのに比べ、
番兵を使用すると、`a[i] != search`この条件だけで良くなります。

よって、番兵を使用することで、条件式の実行回数が減る（CPUの計算量が減る）のでその分処理が高速になります。


※c言語始めたばかりなので、もっといい書き方ありそう。
レベル変換ICの基礎　その1

## はじめに
ラズパイをはじめとする安価なマイコンボードの普及に伴い、一般の方もレベル変換ICを使用する機会が増えていると思います。
過去に失敗した経験から基礎的な事項についてまとめます。

##レベル変換ICの種類
レベル変換ICといっても内部回路の違いにより様々な種類があります。
大きくは以下の違い。
・バッファタイプ/BUSSWタイプ
・方向制御端子(Direction)の有無

##TXSシリーズ(BUSSWタイプ,方向制御端子なし)の動作解説
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695279/0d235097-b7bf-c8cd-4f69-da7e45c249c6.png)
ざっくり動作を説明すると、信号のTr/Tf時のみPx/NxのFETが動作しその後、信号がHの時はRpux(4kΩ Pull up)で論理を保持、Lの時はRpux(40kΩ Pull down)とR1+R2(300Ω pull down)で論理を保持する。このようにTr/Tf時のみバッファが動作する回路構造をセミバッファタイプと言うらしい。(通常のバッファはPx/Nxのどちらか一方が常にONしているのでそこが異なる)
　つまり急に信号の方向が変化してもTr/Tf時のみドライブしている為信号がぶつからないという事だと思う。

##動作不良となるケース
この部品が動作不良となるケースを考える。部品仕様の以下2つに着目する
・Px/Nxの動作時間が30ns
・Rpubの抵抗値が4/40kΩ
####Px/Nxの動作時間が30ns
Px/Nxの動作時間が30nsという事は30ns以内に所望の電圧へスイングできければならないという事です。
つまり時定数と動作周波数の関係に注意する必要があります。ノイズ対策としてコンデンサが接続されている場合は注意が必要です。
Px/RxがタイムアウトするとRPUBと容量の時定数によってオープンドレイン波形のように充電されます。
信号周波数が高速な場合、信号が電源電圧まで上昇しない/０Vまで落ちないことになります。
####Rpubの抵抗値が4/40kΩ
Px/Nxが動作終了した後はRpubによりH,Lを保持する。
つまり線路上Pullup/down抵抗がRpubに対して無視できない抵抗値であれば電圧が分圧,Lレベルが浮いてしまう事になる。

##参考文献
この記事は以下の情報を参考にして執筆しました。
-[TXS0108E-Q1データシート](https://www.tij.co.jp/document-viewer/TXS0108E-Q1/datasheet/features-sces1289655#SCES1289655)
-[Effects of External Pullup and Pulldown Resistors on TXS and TXB Devices](https://www.ti.com/lit/an/scea054a/scea054a.pdf)
-[A Guide to Voltage Translation With TXS-Type Translators
](https://www.ti.com/lit/an/scea044/scea044.pdf)
-[Factors Affecting VOL for TXS and LSF Auto-bidirectional
Translation Devices](https://www.ti.com/lit/an/scea056/scea056.pdf)
macOS と Linux は全くの別物？

※この文章はベータ版です。

# 本文

「Dockerとはどういったものなのか、めちゃ
くちゃ丁寧に説明してみる」を読んで、気に
なったので、書いています。

https://qiita.com/SatoshiSobue/items/a612ebbb3a9242c09db5

macOSとLinux(広義のLinux)は上層では全く別物と
いっても過言ではないくらい違いますが、下層の
カーネルレベルではUNIXというOSアーキテクチャに
則って実装されているレイヤを持つ血統?的には近い?
OSです。

macOSのXNUカーネルはカーネギーメロン大学
で開発されたmachマイクロカーネル派生の
カーネルです。

XNUカーネルはFreeBSDのコードをベースとして
実装されたBSDレイヤをもっています。
(XNUカーネルのBSDレイヤには、Linuxカーネル
のAPIを採用している部分があります。)

macOSは、XNUカーネルのBSDレイヤにより、
UNIX仕様に準拠した、UNIX互換のOS、と
なっています。

Linuxカーネル(狭義のLinux)は、POSIXに準拠し、
UNIX仕様に沿って実装されていて、UNIX仕様に
ほぼ準拠している、UNIX互換のOSです。

(UNIX仕様を管理しているThe Open Group
から認証されないとUNIXとは名乗れませんし、
UNIX仕様に準拠している、とも言え(書け)
ません。

UNIX認証には費用が掛かります。OSSである
Linuxの開発サイドは費用の掛かるUNIX認証の
必要性を感じていませんでしたし、今も
感じていないでしょう。)

UNIX互換レイヤが、Linuxでは、カーネルのコア機能に
組み込まれていて不可分となっていて、macOSのXNU
カーネルでは、カーネルのコア機能と分離されている、
点が違うものの、どちらもUNIX互換のレイヤをもって
います。

macOS上のターミナルで、bash等のシェルを
介して、BSDレイヤの機能を利用しているユース
ケースでは、Linuxとの差異を感じることは
ほとんど、ありません。

両者にネイティブコードレベルでの互換性は
皆無ではあるものの、macOSでの実装において、
BSDレイヤのAPIのうちLinuxと互換性のあるもの
を利用するか、両者の上で動作する両者の差異を
吸収するライブラリを利用している、タイプの
プログラムであれば、ネイティブアプリであって
もソースコードレベルでの互換性を実現することは
可能です。

macOSは、CoreFoundation(C)とそれをラップ
したFoundation(Objective-C → Swift)という
ライブラリを持ち、その上にAppKit、Mac Catalyst
etcのライブラリ群が実装されています。

これらのライブラリ群とその上に実装された
ツール群が、macOSをmacOSたらしめ、
Linuxとは全くの別物にしています。


#オマケ

WindowsとLinuxは、上層から下層に至るまで、
全くの別物です、互換部分はどこにもありません。

Windows上でLinuxアプリを動かすしくみに
WSLがあります。

WSL1はLinuxカーネルのシステムコールを
Windowsカーネルのシステムコールに置き換えて
実行する荒技的な実装となっていましたが、
WSL2では、Windows10以降に搭載された軽量仮想
マシン(のしくみ)を利用して、仮想マシン上でカスタマイズ
したLinuxカーネルを動かす形に変更されています。
VSCodeの「ソール管理」欄のアルファベットの意味

普段よく見る「M」や「U」ではなくてこのような感じで「A」のアルファベットのソース管理欄に出てきたので他にもないのか一応調べてみましたところ、見つかったのでメモとして残しておきます。
![スクリーンショット 2021-01-19 8.06.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637360/ddc3bb03-612a-2304-1ff0-a64ae72e1755.png)

- A : 追加
- M : 修正済み
- U : Gitで追跡されてない
- D : 削除済み
- C : 競合が起きている
- R : 名前変更済み
ウィジェットを有効化してサイドバーを作成方法

#ウィジェットを有効化してサイドバーを作る

##作業手順

###1:ウィジェットを有効化するためのコードをfunctions.phpに記述

```
/**
* ウィジェットの登録
*
* @codex http://wpdocs.osdn.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/register_sidebar
*/
function my_widget_init() {
register_sidebar(
array(
'name' => 'サイドバー', //表示するエリア名
'id' => 'sidebar', //id
'before_widget' => '<div id="%1$s" class="widget %2$s">',
'after_widget' => '</div>',
'before_title' => '<div class="widget-title">',
'after_title' => '</div>',
)
);
}
add_action( 'widgets_init', 'my_widget_init' );

```

WordPressの管理画面で、「外観」にウェジェットが表示されているはずです。


###2:ウィジェットエリア「サイドバー」をsidebar.phpに表示

```
<!-- secondary -->
<aside id="secondary">
<?php if ( is_active_sidebar( 'sidebar' ) ) : ?>
<?php dynamic_sidebar( 'sidebar' ); ?>
<?php endif; ?>
</aside><!-- secondary -->
```

>※わからない関数などは、ほって置かずググりましょー。

###3:「サイドバー」の中身の設定

サイドバーの中身としては以下のとおりにします。
・プロフィール
・人気記事
・サムネ付き新着記事




####まずプロフィールは**カスタムHTML**で作成しましょー。

![ウィジェット_‹_tkc-wordpress練習_—_WordPress_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/993438/2b6a5866-bd3c-cf19-9980-1a19d4892436.png)

![ウィジェット_‹_tkc-wordpress練習_—_WordPress.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/993438/17339df0-3ed0-9b01-ed86-b74a6cace624.png)


1点注意です。画像の入れ方です。
画像はWordPress管理画面のメディアで、入れたい画像を新規追加して、その新規追加した画像のURLを、カスタムHTMLに入れます。

＜例＞


```
<img src="http://localhost:8888/dev/wp-content/uploads/2021/01/profile.png" alt="">
```



####次に、「人気記事」と「サムネ付き新着記事」です。

この二つはぶっちゃけ、プラグインで入れて、作成した方が早いです。というよりみんなこの方法が有効的と言っております。

人気記事　⇨　WordPress Popular Posts
サムネ付き新着記事　⇨　Recent Posts Widget Extended


使い方は、以下のものを見てください。

WordPress Popular Postsの設定👇
https://kagesai.net/wordpress-popular-posts-manual/#WordPress_Popular_Posts%E3%83%84%E3%83%BC%E3%83%AB%E8%A8%AD%E5%AE%9A


Recent Posts Widget Extendedの設定👇
https://affilabo.com/wordpress/15187/



以上です。
わからないことやモヤモヤしたことはググりましょー。

ありがとうございました。
[Swift5].gitignoreファイルの作成方法とデフォルトで記述しておくべきコード

## .gitignoreとは
要約すると`.gitignore`とは、APIKeyなどの他者に知られることで問題が発生する恐れのあるコードをgit（Github）にアップしないファイルを設定するものです。

セキュリティの一環として扱われています。

## .gitignoreファイルの作成方法
ターミナルで対象プロジェクトのディレクトリに移動して以下コマンドでファイル作成

```
% touch .gitignore   
```

作成したファイルを以下コマンドで開く

```
% open .gitignore     
```

開いたファイルに以下コードを記述

```
# Xcode
build/
*.pbxuser
!default.pbxuser
*.mode1v3
!default.mode1v3
*.mode2v3
!default.mode2v3
*.perspectivev3
!default.perspectivev3
xcuserdata
*.xccheckout
*.moved-aside
DerivedData
*.hmap
*.ipa
*.xcuserstate

# CocoaPod
Pods/*

# others
*.swp
!.gitkeep
.DS_Store
```

また、開発の途中で（すでにgitにコミットしていた場合）`.gitignore`を作成する場合は、
以下コマンドで一度全てのファイルをgitの対象外に設定

```
 git rm -r --cached .
```

次に、改めてgitの対象に設定

```
git add . 
```

この二つのコマンドを実行することで開発途中からでも`.gitignore`に登録したファイルはアップされなくなる。

もっとも、プロジェクト作成直後に`.gitignore`ファイルを作成しておくにこしたことはない。

## 備考
Macのデフォルト設定として`.（ドット）`から始まるファイルは閲覧できなくなっていおるので、`.gitignore`ファイルを作成してもFinderなどでは表示されない。（なのでターミナルから開く）

Finder等できっちり確認したい方は[Mac の Finder で隠しファイルの表示/非表示を切り替える方法](https://gotohayato.com/content/93/)を参考にしてください。
【Rubyトリビア】elsif の条件式は省略可能！？

Rubyのif文ではelsifを使って複数の条件を書くことができます。

```ruby
def greet_to(name)
  if name == 'Alice'
    puts 'Hi, Alice!'
  elsif name == 'Bob'
    puts 'Hi, Bob!'
  end
end

greet_to('Alice')
#=> Hi, Alice!

greet_to('Bob')
#=> Hi, Bob!
```

それでは次のようにelsifの条件式を無くすとどうなるでしょうか？

```diff
 def greet_to(name)
   if name == 'Alice'
     puts 'Hi, Alice!'
-  elsif name == 'Bob'
+  elsif
     puts 'Hi, Bob!'
   end
 end
```

答えはこうです。（あれ、さっきと同じ！？）

```ruby
greet_to('Alice')
#=> Hi, Alice!

greet_to('Bob')
#=> Hi, Bob!
```

条件式なしのelsifは`elsif true`と同じ意味になるんでしょうか？🤔
ためしに今度はifの条件式もなくしてみましょう。

```diff
 def greet_to(name)
-  if name == 'Alice'
+  if
     puts 'Hi, Alice!'
   elsif
     puts 'Hi, Bob!'
   end
 end
```

これだと結果はどうなるんでしょうか？というか、そもそもこんなコード、動くんでしょうか？

```
greet_to('Alice')
#=> Hi, Alice!
#   Hi, Bob!

greet_to('Bob')
#=> Hi, Alice!
#   Hi, Bob!
```

動いた〜！けど、なんだこれ？AliceもBobも両方出力されてますね……。

## 種明かし

実はこれ、こう書いたのと同じ意味になっています。

```ruby
def greet_to(name)
  if puts 'Hi, Alice!'
    # Do nothing
  elsif puts 'Hi, Bob!'
    # Do nothing
  end
end
```

つまり、putsの呼び出しが条件式として扱われているわけですね。
で、putsの戻り値は`nil`なので`puts 'Hi, Alice!'`は偽として扱われ、続いてelsifの条件式 `puts 'Hi, Bob!'` が実行される、というわけです。

なので、たとえばputsの代わりにpメソッドを使うと結果が変わります。（pメソッド戻り値は引数として渡したオブジェクト自身になり、真と評価されるため）

```ruby
def greet_to(name)
  if
    p 'Hi, Alice!'
  elsif
    p 'Hi, Bob!'
  end
end

greet_to('Alice')
#=> "Hi, Alice!"

greet_to('Bob')
#=> "Hi, Alice!"
```

最初に見せたコードも条件式をわざと改行させるとこんなふうに書けます。（よい子はマネしちゃいけません）

```ruby
def greet_to(name)
  if
    name == 'Alice'
    puts 'Hi, Alice!'
  elsif
    name == 'Bob'
    puts 'Hi, Bob!'
  end
end

greet_to('Alice')
#=> Hi, Alice!

greet_to('Bob')
#=> Hi, Bob!
```

こんなコードをわざわざ書く人はいないでしょうし、書くべきでもないですが、if/elseと書くつもりがうっかりif/elsifと書いてしまうと、構文エラーにならない代わりに予期しない不具合を起こすかもしれないので気をつけましょう。

```ruby
def greet_to(name)
  if name == 'Alice'
    puts 'Hi, Alice!'
  elsif # ← 本当はelseと書くつもりが間違えた
    puts 'Hi, Bob!'
  end
end
```

なお、ifやelsifのうしろには条件式が必要なので、次のようなコードを書いたときは構文エラーになります。

```ruby
def greet_to(name)
  if name == 'Alice'
    puts 'Hi, Alice!'
  elsif
    # elsifに対応する条件式がない（構文エラー）
  end
end
#=> syntax error, unexpected `end'
#   syntax error, unexpected end-of-input, expecting `end'
```

## おまけ：case/whenだったら？

以下のようにcase/whenを使った条件分岐で、`when 'Bob'`を`when`だけにしてみるとどうなるでしょうか？

```ruby
def greet_to(name)
  case name
  when 'Alice'
    puts 'Hi, Alice!'
  when
    puts 'Hi, Bob!'
  end
end
#=> syntax error, unexpected string literal, expecting `do' or '{' or '('
#   puts 'Hi, Bob!'
```

むむむ、構文エラーが起きました。
が、次のように`()`付きでputsを呼び出すとエラーになりません。

```ruby
def greet_to(name)
  case name
  when 'Alice'
    puts 'Hi, Alice!'
  when
    puts('Hi, Bob!')
  end
end

greet_to('Alice')
#=> Hi, Alice!

greet_to('Bob')
#=> Hi, Bob!
```

とはいえ、これもif/elsifの場合と同じく、`puts('Hi, Bob!')`がwhen節の条件式になっているだけです。

```ruby
def greet_to(name)
  case name
  when 'Alice'
    puts 'Hi, Alice!'
  when puts('Hi, Bob!')
    # （こう書いてるのと同じ）
  end
end
```
Xdebugをextensionで設定してPHPブレイクポイントが動作しなかった件

IIS・PHP環境を作り、その環境でローカルでデバッグしようとしたらブレイクポイントが動作せず、コードのエラーがあった場合はデバッガーが動作するという状態になり、散々あれこれ悩んで調べたりした結果、php.iniのDLL読み込みの記述に誤りがあっただけでした。

間違い。

```ini
extension=php_xdebug-2.9.8-7.3-vc15-nts-x86_64.dll
```

zend_extensionで指定する。

```ini
zend_extension=php_xdebug-2.9.8-7.3-vc15-nts-x86_64.dll
```

phpinfoでXdebug表示されてたし、エラー時に止まったのでphp.iniは問題ないだろうと思って、pathMappings？とか色々いぢってました。(/・ω・)/
Laravel/UIでの簡単ログイン機能の実装

#準備
Laravel/uiをインストールしてとりあえず基本のログイン機能が使えることを確認しておく。
※php8では使えません。
#前提
セキリュティへの考慮はしていません。
ポートフォリオを作る際にできたらいいなと思ったので書いています。
コードを書くのには慣れていないので、あくまで参考程度でお願いします。

#実装
Laravel/UIの処理が全部はわかりませんが、インストールの際に```views/auth```に```login.blade.php```が作成されています。
この中を見てみると

```login.blade.php
<form action="{{ route('login') }}" method="POST">
...
</form>
```
と書かれており、このrouteに渡してあげればいいみたいです。

```login.blade.php
<form method="POST" action="{{ route('login') }}">
    @csrf //この記述がないとセッションエラーが起きる
    <button type="submit" >{{ __('Guest Login') }}</button>
    <input type="hidden" name="email" value="...">
    <input type="hidden" name="password" value="...">
</form>
//valueには自分が作成したいユーザの値をいれる。
```

次にlogin.blade.phpの表示を命令している部分が、少しややこしいですが、```vendor/laravel/ui/auth-backend/```を見れば大体処理がわかりそう。


#補足
web.php内でエラーが起きますが、Authファサードのネームスペースの問題なので

```web.php
use Illuminate\Support\Facades\Auth;
//これを追加すればいい

Auth::routes();
```

これで簡単ログインが実装できた。
#注意
本番では100%使いません。
ポートフォリオで見てもらう人の負担を減らすみたいな用途くらいかな？
再度、コードを書くのには慣れていないため、もしこうした方がいいよ！などありましたら是非教えていただきたいです。
Sprite_Characterに渡すオブジェクトに必要なメソッド

本日のマニアック過ぎる処理です。

ツクールMVでマップ上にいるキャラクターを表示するクラスは*Sprite_Character*です。
このクラスには*Game_CharacterBase*を継承したクラスを渡す必要があるのですが、このクラスはメンバ変数が多いので継承したくありません。
そこで、メソッドがそっくりのオブジェクトを渡して動かそうという話です。
調べた結果、以下のメソッドを実装していれば、動くようです。
また、数値はデフォルト値に近い物・継承してを返すようにしています。

```js
class I_CharacterLike 
{
    endAnimation(){}
    endBalloon(){}
    tileId(){ return 0;}
    isAnimationPlaing(){return false;}
    animationId(){return 0;}
    isTransparent(){return false; }
    balloonId(){ return 0; }
    bushDepth(){ return 0;}
    blendMode(){return 0;}
    opacity(){ return 255;}
    screenX(){ return 24;}
    pattern(){ return 2;}
    screenY(){ return 32;}
    screenZ(){ return 4;}
    direction(){ return 2;}
    characterName(){ return ""}
    characterIndex(){return 0;}
}


```

2021年最初の記事が一部のプラグイン作者にしか需要の無いマニアックな内容でいいの？
見出しテキストに蛍光マーカーを引いたデザインを作りたかったが、横全体にCSSが適用されてしまう

# はじめに

こちらは、[エンジニアの新たな学びキャンペーン](https://qiita.com/official-events/716dbcb617afc83e9555)に向けた記事となります。

[ざっくり理解するHTML5・CSS3　｜ HTML5とCSS3を使って、お店のホームページ（HP）を作ってみよう！](https://www.udemy.com/course/html5css3-n/)を含む、いくつかのコンテンツを参考にしながら、
ブロックレベルとインライン要素の違いについて、学習したことを記事にします。

# 今回、問題になったこと
次の画像で示すような、まるで蛍光マーカーを引いたかのようなデザインの見出しを作成しようとしました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549712/56956a5e-9e74-93cc-869a-a6811f1017e7.png)

しかし私が書いたHTMLとCSSでは、そうはいきませんでした。
テキスト部分だけ強調されるはず！という想定とは異なり、
次のように、横全体へと蛍光マーカーが飛び出てしまっていました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549712/e796db9d-3323-7322-4a2e-73557813343d.png)

こちらの問題を解決した様子を下記に示します。


# 実行環境
- Google Chrome 87.0.4280.141

# 解決への道のり

結論から述べると、**ブロックレベル**と**インライン要素**に対する理解が浅いために、
意図しない挙動が発生しました。

## ブロックレベルとインライン要素を考える


### ブロックレベルとは

> 一行全て（横幅いっぱい）のボックになるので、その後の要素は横並びにはできない。
ブロックレベル要素の中にブロックレベル要素を入れられる。

> [ざっくり理解するHTML5・CSS3　｜ HTML5とCSS3を使って、お店のホームページ（HP）を作ってみよう！](https://www.udemy.com/course/html5css3-n/)

### インライン要素とは

> 基本、文字の装飾などで使われる要素。文字幅分のボックスになるので、横並びにすることができる。
> インライン要素の中にブロックレベル要素は入れられない。
> 
> [ざっくり理解するHTML5・CSS3　｜ HTML5とCSS3を使って、お店のホームページ（HP）を作ってみよう！](https://www.udemy.com/course/html5css3-n/)

## 実行していたソースコードと原因の特定

まずは実行していたソースコードの一部を示します。

```index.html
<h1>
  <div class="lightup">
    アイデアブック（仮）
  <div/>
</h1>
```

```main.css

h1 {
  text-align: center;
  margin: 0;
  padding: 10px;
}

.lightup {
  background: linear-gradient(transparent 60%, yellow 40%);
}

```

『ブロックレベルは一行すべて』、『インライン要素は文字幅ぶんのボックスになる』とのことなので、
今回使われている要素はどちらにあたるのか調べてみます。

**ブロックレベル：h1, div
インライン要素：なし**

従ってインライン要素がないために、このテキストは"一行すべて"という**ブロックレベル**での実装となり、
横全体にマーカーが引かれてしまうのは当然の結果でした。


従って、テキストをインライン要素に変更する方法を考えます。

## CSS適用の優先順位を考えながら改善する

テキストに紐付けられている要素やクラス（`h1`, `div`, `lightup`）の**すべて**に、
インライン要素を付与(`display: inline;`)すれば、とりあえず解決しそうな気もします。
しかし、要素やクラスを使い回すことを想定すると、実用的ではありません。

従って、1つだけインライン要素を付与するだけで済むように、CSSの適用優先順位を調べます。

セレクタの種類によって優先順位が決定づけられるようなのですが、
今回はh1、divという要素セレクタに加え、lightupというクラスセレクタがあります。
次の引用から、クラスに対してインライン要素を適用すれば良いことがわかります。

> ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549712/41d3564e-a0de-6e82-46d5-f67dca006b84.png)
[CSSの適用優先度の考え方](http://mzgkworks.com/post/css-applying-priority/)


そこで、lightupクラスにインライン要素を付与しました。
次がソースコードと、その実行結果です。

```main.css
h1 {
  text-align: center;
  margin: 0;
  padding: 10px;
}

.lightup {
  background: linear-gradient(transparent 60%, yellow 40%);
  display:inline
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549712/196576e6-3da7-5a11-c87e-ea92972b8496.png)

**テキスト部分だけ蛍光マーカーで引いたようなデザインにしたい！**という意図が反映できました！


# 参考
- [ざっくり理解するHTML5・CSS3　｜ HTML5とCSS3を使って、お店のホームページ（HP）を作ってみよう！](https://www.udemy.com/course/html5css3-n/)
- [HTMLクイックリファレンス](http://www.htmq.com/htmlkihon/005.shtml)
- [CSSマーカー線（蛍光ペン風）の解説【４２色のサンプル付き】 | カゲサイ](https://kagesai.net/css-marker-design/)
EC-CUBE4　カスタマイズの俺的見解　脱初心者の一歩

#初めに
EC-CUBEは大きく分けて、プラグインを作成してストアで販売、もしくは野良プラグインとしてストア以外で販売するプラグイン作成者。
そして、EC-CUBEを利用してECを構築する会社、もしくはフリーランスエンジニアの２種類に分類できると思います。

ここでいうカスタマイズは、EC-CUBEを利用してECを構築する事を表します。
また、この記事の考え方は僕個人の意見になりますが、「ここはこうだろ」「こういう考え方の方が良い」「ここは違う」といった意見などあればコメント下さい。
僕が成長する糧とします。

この記事は、EC-CUBEの基本操作や基本構成を覚えた初心者の、次の一歩として書いています。

#プラグインとカスタマイズの違い
プラグインは不特定多数のサイトで利用される事が前提になります。
プラグインとサイトの完成は１対多の関係です。

カスタマイズは要求されたオリジナルの仕様に基づいて構築します。
カスタマイズの仕様とサイトは１対１の関係です。

ですので、**プラグインについて知りたいという方は、この記事は参考になりませんので、別の情報をお求め下さい。**
カスタマイズについて知りたいという方は、このまま引き続きお読みください。

#カスタマイズの方法
カスタマイズの方法は２種類あります。

1.app/Customize/にファイルを設置する方法
2.src/Eccube/の本体を直接編集する方法

僕は基本的に、１のCustomizeフォルダにファイルを設置する方法を選択します。
ちょっとしたカスタマイズであれば、ファイルを設置するだけですし、どの辺をカスタマイズしたのか分かり易いです。
バージョンアップする時も、本体を編集していなので、アップデートプラグインを利用する事が可能です。
(アップデートが正常に行かない場合もあります。しっかりテスト環境でお試ししましょう。)

２の本体を直接編集した場合は、カスタマイズ箇所が分かり難かったり、バージョンアップするにはgitを使ったバージョン管理をしなければ、難しいです。
本体をカスタマイズする場合は、「[EC-CUBEのバージョンアップを見据えたカスタマイズ方法2020年度版](https://qiita.com/nanasess/items/7ad3592073458adae09d)」の記事を参考にしてください。
玄人の方法になります。

どちらを選択するかは、開発環境（チームなのか、ソロなのか）やカスタマイズの規模など様々な要素が関係すると思います。
その辺の見極めは、経験がものを言うでしょう。

##フォルダ構成
Customizeフォルダにファイルを設置するといっても、適当に設置してはダメです。
じゃぁ、どんな設置方法がいいのか、それは・・・EC-CUBE本体を参考にして同じ構成にしましょう。
迷ったらEC-CUBE本体をよく参考にしてます。（プログラムなども）

[EC-CUBE本体のフォルダ構成](https://github.com/EC-CUBE/ec-cube/tree/4.0/src/Eccube)

よく使うフォルダは下記になります。

- Command
- Controller
- Doctrine
- Entity
- EventListener
- Form
- Repository
- Resource
- Service
- Twig

必ず設置しなければならない、といった事はないです。
必要な時に必要な物を設置しましょう。

##テンプレートの設置方法
本体のテンプレートは以下に設置されています。

**フロント**
`src/ECcube/Resource/template/default/`

**管理画面**
`src/ECcube/Resource/template/admin/`

**カスタマイズしたいテンプレートファイルを、以下のフォルダへ移動して編集します。
新しくページを作成したい場合も同様に、新しいテンプレートファイルを追加します。**

**フロント**
`app/template/default/`

デフォルトテンプレート以外を利用している場合。

`app/template/[テンプレートコード]/`

**管理画面**
`app/template/admin/`

フロントに新しいページを追加する場合は、データベースにデータを追加しなければならないのですが、それは別途説明記事を作ります。

##命名規則

プラグインの命名規則になりますが、カスタマイズでも同様の規則を利用した方が安全です。
僕はまんま、customizeを接頭辞として利用しています。

[プラグインで推奨の命名規則](https://doc4.ec-cube.net/plugin_naming_conventions)

#最後に
カスタマイズは唯一無二で、他の案件に流用しない事を前提で考えてください。
もちろん、使えそうな部分はコピペして流用すればよいのですが、プラグインのようにポン付け出来ない感じです。

マニアックで濃いカスタマイズの内容でない限り、大体の事はCustomizeフォルダで事足ります。
（僕の経験の中だけですが。。。）
Laravel 地理座標を文字と数字の文字列にエンコードするジオハッシュアルゴリズム

## saikiran/geohashライブラリをインストール
[saikiran/geohash](https://packagist.org/packages/saikiran/geohash)

```bash
composer require saikiran/geohash
```

## 地理的な位置を文字と数字の短い文字列にエンコードします。
```php
use Sk\Geohash\Geohash;
$g = new Geohash();

public function run(Faker $faker)
{  
 // 緯度,経度,文字数
'geohash' => $g->encode($faker->latitude(), $faker->longitude(), 12),
}
```

## 文字と数字の文字列を緯度と経度にデコードします。
```php
use Sk\Geohash\Geohash;
$g = new Geohash();

public function run(Faker $faker)
{  
'geohash' => $g-> decode('エンコードされた文字列', 12),
}
```

- テーブルに緯度・経度を文字列かしたレコードを保持しておけば色々使い回しが出来そう!
WSL2にROS導入メモ：Windowsファイアウォールの例外にVcXsrvを追加する

[こちらの記事](https://qiita.com/rkoyama1623/items/de467c6b954a6df638c8)を参考にしてWSL2にROSを導入しようとしたところ、xeyesを表示させるところで詰まったが(Error: Can't open display)、Windowsファイアウォールの例外にVcXsrvを追加することで解決したのでその方法をメモ

# Windowsファイアウォールの例外にVcXsrvを追加する
コントロールパネル -> システムとセキュリティ -> Windowsファイアウォールによるアプリケーションの許可 と進めていくと下図のようなディスプレイが表示される
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/696594/02bd9863-60fa-2d68-0219-9759eec122e9.png" width="400">
ここで右上の「設定の変更」をクリックし、右下の「別のアプリの許可」をクリック
すると次のような画面が出てくる
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/696594/1d3e053d-7772-11bb-3ee9-06e8c95d2672.png" width="400">

パスの欄に**vcxsrv.exe**のパスを入力する。もしくは参照を押し、**vcxsrv.exe**を探して選択する。(デフォルトだと`C:\Program Files\VcXsrv`配下に存在すると思われる。xlaunch.exeと同階層にあるのでXLaunchのショートカットのプロパティから容易に調べることができる)

すると以下のように追加される

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/696594/5e31cbf7-92c0-4ba5-51c3-05795bb19cd5.png" width="400">

これらの操作の後に、

```
xeyes
```
と打つと無事表示された
「統計的因果探索」（第1章：統計的因果探索の出発点）

# はじめに
[統計的因果探索（機械学習プロフェッショナルシリーズ）](https://www.kspub.co.jp/book/detail/1529250.html)を読み進めるにあたって、自分なりのメモを残す。

- 第1章：統計的因果探索の出発点（本記事）
- 第2章：統計的因果推論の基礎
    - [その1](https://qiita.com/Thought_Nibbler/items/55733c91bfa54a6e549c)

# 相関関係と因果関係
「ノーベル賞の受賞者数（100万人あたり）」と「チョコレートの消費量（1人あたり）」について、以下のような**相関関係**があるとする（正の相関）。

> 「チョコレートの消費量」が多ければ、「ノーベル賞の受賞者数」が多い。

このとき、以下のような**因果関係** $A$ があるように見える。

> 「チョコレートの消費量」を増やせば（原因）、「ノーベル賞の受賞者数」が増える（結果）。

しかし、実際はそうとは限らない。
代わりに、以下のような別の因果関係 $B$ がある可能性もある。

> 「国内総生産（GDP）」を増やせば（原因）、「チョコレートの消費量」「ノーベル賞の受賞者数」が増える（結果）。

このように、本来はない因果関係があるようにミスリードしてしまう状況を**疑似相関（spurious correlation）**とよぶ。

# 統計的因果推論（探索）でできること
通常の機械学習は、相関関係を導き出すことができるが、それがどのような因果関係によるものかは導き出すことができない。

- 「チョコレートの消費量」を**観測する**と「ノーベル賞の受賞者数」を予測できる
    - 相関関係が明らかであれば良い
- 「ノーベル賞の受賞者数」を変化させるにはどうすればいいかは分からない
    - 因果関係が明らかである必要がある

一方、**統計的因果推論（探索）は因果関係を導き出すことができる**。

- 「ノーベル賞の受賞者数」を変化させるにはどうすればいいかが分かる
    - 因果関係 $A$ $\Rightarrow$ 「チョコレートの消費量」を増やせば「ノーベル賞の受賞者数」が増える
    - 因果関係 $B$ $\Rightarrow$ 「国内総生産（GDP）」を増やせば「ノーベル賞の受賞者数」が増える

# 因果グラフ（causal graph）
定性的（※）な因果関係を表す以下のような図。矢印始点の事象が原因、矢印終点の事象が結果。
※具体的な値の求め方は与えていない。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36612/0f7c3bbc-b19c-f27e-f995-0af1dea6ce6f.png)

- **観測変数（observed variable）**
    - 観測（データ収集）されている事象
    - 上図の青四角「チョコレートの消費量」「ノーベル賞の受賞者数」
- **未観測変数（unobserved variable）**
    - 観測（データ収集）されていない事象
    - 上図の緑丸「国内総生産（GDP）」
- **共通原因（common cause）**
    - 複数の変数の原因となっている変数
- **未観測共通原因（hidden common cause）**
    - 複数の変数の原因となっている未観測変数
    - 上図の「国内総生産（GDP）」は「チョコレートの消費量」「ノーベル賞の受賞者数」の未観測共通原因

# データ生成過程（data generating process）
変数の値が決まる手順のこと。
データ生成過程（data generating process）の具体例は以降の章でも出てくるはずなので、詳細はそちらを参照。

「チョコレートの消費量」を $x$ 、「国内総生産（GDP）」を $z$ とし、両者には上図因果グラフのような因果関係があるとする。
このとき、「チョコレートの消費量」 $x$ のデータ生成過程は以下のように書ける（あくまで線形性を仮定した一例）。

```math
x = \lambda z + e
```

ここで $e$ を**誤差変数（error variable）**とよぶ。
これは「チョコレートの消費量」の決定に関わる変数が「国内総生産（GDP）」以外にも存在し得るために導入するものであり、そういった変数を全てひとまとめにした変数が誤差変数である。
Node.jsをWindows10にインストールして詰まったこと

#背景
AWSでNode.jsを触ってみようと思い立ち、まずはAWSの開発者ガイドに従って開発環境を構築してみた。
## 参考にしたURL
https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/nodejs-devenv.html
https://qiita.com/taiponrock/items/9001ae194571feb63a5e

#詰まったこと
　Node.js＆npmをインストールしたので、動作確認（npm start）するとエラーが出てしまった。

```
node:internal/modules/cjs/loader:928
  throw err;

Error: Cannot find module 'http-errors'
Require stack:
- hoge\app.js
- hoge\bin\www
```
##エラーの出た環境
　OS:Windows10 Pro（バージョン2004　OSビルド19041.746）
　node.jsインストーラ：node-v15.6.0-x64.msi
#調べてみた
どうも、Node.jsのインストールは一発目は失敗することが多い模様。（Windowsだから？）
## 参考にしたURL
https://github.com/nodejs/help/issues/2644
https://qiita.com/Sakuya_wd/questions/9d2af3b47047aad652fc

#確認してみた
同じようなトラブルに見舞われているところでは、node_modulesフォルダを消して再インストールするという解決策が提示されていた。
まず、インストールフォルダを確認したところ、自分の環境ではnode_modulesフォルダが存在していなかった。
#やってみた
node_modulesフォルダがもうないんだから、そのまま再インストールをやってみる。
>npm install

警告は出るけど、エラーは出てないっぽいから、改めて動作確認をした。
>npm start

```
> node-express@0.0.0 start
> node ./bin/www

GET / 200 1701.982 ms - 170
GET /stylesheets/style.css 200 9.003 ms - 111
GET /favicon.ico 404 33.771 ms - 1132
```
今度はちゃんとサンプルコードが動いた。
インストーラーからだとモジュール類がちゃんと入らないってことなのかな？
PowershellでExcelに出勤、退勤時間を記録する。

※2021/1/18 現在改良中。

#はじめに
客先常駐SEあるある、出勤の打刻は別でするけど作業工数は別シートで計算して提出する。
出勤時刻を計算するのが面倒&わざわざファイルを開いて記入するのも面倒だったのでPowershellで楽したいと思い作成。


#◆参考記事　
・PowerShell で Excel をどうのこうのすることに興味を持ってくれると嬉しい
<https://qiita.com/miyamiya/items/161372111b68bad0744a>

・Powershellで日付や時刻を取得するよ！ | Get-Time
<https://bgt-48.blogspot.com/2018/02/powershell-get-time.html>


作成の際に参考にした記事です。全力で感謝。

#◆環境
OS：Windows10 Pro 1909
Powershell:5.1

#◆状況
とりあえずExcelファイルを新規作成して、打刻するだけの状態。
色々間違いもあると思うので、少しずつ追記修正を加えて完成させたいところ。

```
#Excel起動
$excel = New-Object -ComObject Excel.Application

#Excelを表示
$excel.Visible = $true

#ファイルを追加
$book = $excel.Workbooks.Add()

#シート数を表示
$book.Sheets.Count


#ファイルを追加
$book.Sheets(1).Name


$book.ActiveSheet.Name

シート名を変更
$book.Sheets(1).Name = "hoge"

$sheet = $book.Sheets("hoge")

#シート名を表示
$sheet.Name

#書き込みシートを指定するため、日付を変数に設定
$day = (Get-Date).day

#出勤書き込み
$sheet.Cells.Item($day+3, 3) = 出
```

#◆理想
出勤用ファイルを開いて打刻。
月が変わったら新しいシートを作成して1日から再び打刻していけるようにしたい。
また、前月分の出勤時刻の合計を別シートへ転記出来れば…。