OmniAICreator/Qiita-1.07M huggingface dataset:
gitリポジトリのオブジェクトデータベースをさくっとリストしてみる

## オブジェクトデータベースとは？
[いいかげんgitのことをちゃんと知りたいというあなたへ（内部構造編）](https://qiita.com/atchy/items/6fad25597f48025f7b24)をご参照ください

## .git/objectsの中身をさくっとみたい
`.git/objects`にあるgitオブジェクトの
*種類*、*サイズ*、*内容* を表示します。
gitリポジトリに置いて実行してみてください

```ls-git-obj.sh
#!/bin/sh

GITOBJ_DIR="./.git/objects"

for path in ${GITOBJ_DIR}/*; do
    dir=`basename ${path}`
    # ディレクトリ名が2文字のものの内容を表示
    if [ ${#dir} -eq 2 ]; then
      obj_name=`find ${GITOBJ_DIR}/${dir} -type f | xargs basename`
      echo '------------------------'
      echo '- object-id:'
      echo ${dir}${obj_name}
      echo '- type:'
      git cat-file -t ${dir}${obj_name}
      echo '- size:'
      git cat-file -s ${dir}${obj_name}
      echo '- contents:'
      git cat-file -p ${dir}${obj_name}
    fi
done
```

実行結果はこちら

```
$ ./ls-git-obj.sh
------------------------
20c8a040010b6ca65a4c9d75873da6b86aff7447
- type:
commit
- size:
178
- contents:
tree a760aa994bbdd615f7ecb442be6bab636e11eba6
author: atchy <atchy@example.com> 1610805112 +0900
committer atchy <atchy@example.com> 1610805112 1610805112 +0900

add aaa.txt
------------------------
72943a16fb2c8f38f9dde202b7a70ccc19c52f34
- type:
blob
- size:
4
- contents:
aaa
------------------------
a760aa994bbdd615f7ecb442be6bab636e11eba6
- type:
tree
- size:
35
- contents:
100644 blob 72943a16fb2c8f38f9dde202b7a70ccc19c52f34	aaa.txt
```

もうちょっときれいに表示できんもんかなあ
【Apple】ITP対策の終着地点！衝撃の「DNSの委任・委譲」


# ITPの歴史について
2017年9月頃から開始したAppleが唱える「ITP」
これまでブラウザを利用した広告（トラッキング）業界と熾烈の争いが繰り広げられてきました。
歴史については[「別記事まとめております」](https://qiita.com/emacs_hhkb/items/d42a45eecc2d4de2f516)ので興味がある方はどうぞ。

# 「ITP2.3」と「CNAME対策」

すみません。ほんの少しだけ話を戻させてください。
ITP2.3の対策において広告業界のエンジニアは素晴らしい対策を打ち出しました。

それが**「DNSのCNAMEレコードを利用したCNAME計測方式」**です。

計測を行いたいサイトのドメインとトラッキングシステムのドメインとを紐づける手法です。
それにより継続して 1st Party Cookie を利用した計測が行えるという素晴らしい知恵です。😄👈

しかし、これには少し難点があります。
計測を行いたいサイトが保持するドメインに対してCNAME設定を行うという事は**「計測サイトのドメインの管理者にCNAME設定をお願いしなければいけない」**というポイントです。例えば以下のようなパターンの時が難点かと思われます。

- そもそもDNS設定を変えたくない。
- サイトのソースコードは修正できるが、DNS設定の変更とかはちょっとわからない。

このように「CNAME対策」は少し難点がありそうです。
しかし、一度設定してしまえば、しっかりと計測が行えるという安心感が素晴らしく数多くのトラッキング企業が提供しております。

## CNAME対策提供企業の一部紹介

- [CNAMEを利用したトラッキング方式のご提供 | AD EBiS](https://support.ebis.ne.jp/s/article/29550)
- [ITP2.3に対するKARTEの対応や影響について | KARTE](https://support.karte.io/post/1N6RpkqOCDt9QenDg7HAd6)
- [DNS-TrackingGuide-latest-ja | A8.net EC](DNS設定による簡易トラッキング方式への切替方法について)
- [データ収集 CNAME およびクロスドメイントラッキング | Adobe](https://experienceleague.adobe.com/docs/id-service/using/reference/analytics-reference/cname.html?lang=ja-JP#section-48fd186d376a48079769d12c4bd9f317)

# そして（iOS14.2）リリースがやってきた。

素晴らしいと感激していた上記のCNAME対策も思いのほか早く次のリリースにてターゲットとされてしまいました。実質的には計測できなくなるわけではなく「Cookieの有効期限が７日間に制限される」という結果です。

<font color="Red">**世はまさに「トラッキング企業とAppleのいたちごっこ時代」**</font>

<img width="400px" alt="戦争" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26033/5f772473-a303-7fe6-3a68-6539598cfee8.png">


# どうなる

筆者もこのいたちごっこ戦争は大好きでしたので毎日のようにTwitterを眺めながら、日本問わず世界のアドテク業界の手法に目を凝らしておりました。そしてやってくれました。やっぱり広告業界を引っ張るあの企業が提供してくれました。

# 出ました新対策！その名も「NS方式」

日本の計測（広告）業界を牽引する「アドエビス様」がやってくれました。
**「NS方式」**という名前です。NS...２文字でかなりシンプルな対策名ですね！

前回はCNAME...今回はNS...

## そうです！ネームサーバーなんです！

すごい。なるほど。なんかもうここまでやるか！？すごいです！もうお分かりですね。計測サイトのドメインの一部をトラッキングシステム企業に委任・委譲するのです！🎉🎉🎉🎉🎉

<img width="300px" alt="present" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26033/a40b7f23-0611-166a-450a-88868c7d0507.png">
*「信頼しているからこのサブドメインの権限をあ〜げるっ！🎁」*

これにより、CNAME対策の「サイトドメインと計測ドメインが一致しない」という問題とか関係なく、広告会社が計測サイトのドメイン管理者※1になれる！というわけです。

*※1計測する用ののサブドメインの切ってもらいそのサブドメインのNSレコードを委譲してもらう仕組み*

## もちろん懸念点も

本記事のCNAME対策でも触れましたが、「計測サイトのドメインの管理者にDNS設定を変更してもらう」という点は引き続き変わりません。それに加えて今回はNSレコードの委譲・委任となりますから**トラッキングシステム企業に絶大なる信頼を置いた上で設定を行う**ことになるのではないかと思われます。もちろん「さすがにNSレコードの変更はできません」というような話がでても全く変ではありません。

このあたりの懸念点についてはさすがにポリシーを設けないとマズイのではないか？と思っていたところやっぱり説明ページ下部にありました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26033/a6581e04-5cac-76c6-2298-05584599c1e7.png)

そうですよね。**DNSの委譲ですから権限を貰った側はなんでもできちゃいますからね...**

# 総括

**さてとうとうここまで来たか感**がありますが、引き続き今後もこの戦いを注視しながら見守っていきたいと思います。しかしもうこの今回のNS手法をAppleが制限するのは難しいかと思われます。だってDNSの委譲ですもん。笑

だが、Cookieを利用した計測自体がもう隅に追いやられているような状態ですのでどうなるかはわかりません。

もちろん業界においてはCookieを利用しない計測方法についても議論されているはずですので、こういった熾烈な争いなどせずに爽やかな計測が行えることが一番かなと思っております。

最後に一言「NSレコード方式」おったまげた〜。

# 参考記事

- [CNAME Cloaking and Bounce Tracking Defense | WebKit](https://webkit.org/blog/11338/cname-cloaking-and-bounce-tracking-defense/)
- [NSレコードを利用したトラッキング方式のご提供について | AD EBiS サポートサイト](https://support.ebis.ne.jp/s/article/000004681)
投稿テスト6(Pandasを使ったPostgreSQL書き込み)


## 技術メモ

DataFrameの中身をPostgreSQLに書き込むには、pandas.DataFrameのメソッドto_sqlを使用
ただし、to_sqlのデフォルトのデータベースはSQLiteのため、PostgreSQLに変更して使用する
replaceを使用する場合は。もともとのテーブルを削除しないといけないので注意

## サンプルコード
```Python
from sqlalchemy import create_engine

# データベースの接続情報
postgres_config = {
    'user': 'postgres',
    'pass': '123qwe!',
    'host': 'localhost',
    'port': '5432',
    'db':   'postgres'
}
# PostgreSQLへの接続設定
engine = create_engine('postgresql://{user}:{pass}@{host}:{port}/{db}'.format(**postgres_config))
        
# PostgreSQLへの書き込み
df.to_sql('データベース名', con=engine, if_exists='appendまたはreplace', index=False)
```

## サンプルコード
```Python
import os
import glob
import pandas as pd
from sqlalchemy import create_engine

# =============================================================================
# parameters
# =============================================================================

# 投入するCSVのファイルパス
CSV_DIRPATH = '/XXX/'

# INSERTするデータの日付YYYYMMDD
tgt_date = ['20210115','20210116']

# データベースの接続情報
postgres_config = {
    'user': 'postgres',
    'pass': '123qwe!',
    'host': 'localhost',
    'port': '5432',
    'db':   'postgres'
}

# =============================================================================
# function
# =============================================================================


# =============================================================================
# main
# =============================================================================

for date in tgt_date:
    
    # CSVファイルのファイル名リストを作成
    csvfile = []
    os.chdir(CSV_DIRPATH + date)
    csvfile.extend(glob.glob('*.csv'))
    
    
    for i in csvfile:
        # ファイル名から書き込みテーブル名を取得
        table_name = i[:8] + i[10:-4]
        print(table_name)
        
        df = pd.read_csv(CSV_DIRPATH + date +'/'+ i, sep=',',encoding = "shift-jis")
        print(df.head(3))
        
        # PostgreSQLへの接続設定
        engine = create_engine('postgresql://{user}:{pass}@{host}:{port}/{db}'.format(**postgres_config))
        
        # PostgreSQLに書き込む
        df.to_sql(table_name, con=engine, if_exists='append', index=False)
```
投稿テスト5(psycopg2を使用したTable作成)

## 技術メモ

```Python
# postgreSQLの接続情報
postgres_config = {
    'user': 'postgres',
    'pass': '123qwe!',
    'host': 'localhost',
    'port': '5432',
    'db':   'postgres'
}

# postgreSQLへ接続
config = ' user={user} dbname={db} password={pass}'.format(**postgres_config)

# with構文でclose()がいらない形で記述  
with psycopg2.connect(config) as conn:
    conn.autocommit = True  #commit()不要で実行できるよう設定
    with conn.cursor() as cur:
        # SQL文を実行
        cur.execute('SELECT * FROM hoge')

        # 実行結果の確認
        results = cur.fetchall()
        for r in results:
             print(r)
```

## CSVからTableを作成するサンプルコード

```Python
import psycopg2
import csv
import os
import glob

# =============================================================================
# parameters
# =============================================================================

# テーブル定義CSVのファイルパス
DDL_DIRPATH = '/table定義/'

# postgreSQLの接続情報
postgres_config = {
    'user': 'postgres',
    'pass': '123qwe!',
    'host': 'localhost',
    'port': '5432',
    'db':   'postgres'
}

# =============================================================================
# function
# =============================================================================


# =============================================================================
# main
# =============================================================================

# テーブル定義CSVが入ったフォルダからCSVファイルのファイル名リストを作成
ddlfile = []
os.chdir(DDL_DIRPATH)
ddlfile.extend(glob.glob('*.csv'))

# 1テーブル定義CSVにつき、1テーブルを新規作成
for i in ddlfile:
    print(i)

    csv_file = open("/Users/KODAI/Desktop/table定義/"+i, "r", encoding="ms932", errors="", newline="" )
    ddl_file = csv.reader(csv_file, delimiter=",", doublequote=True, lineterminator="\r\n", quotechar='"', skipinitialspace=True)
    
    
    # テーブル名を取ってくるところは既存コードを流用する　※編集
    head = next(ddl_file)
    print(head)
    table_name = head[1]
    
    next(ddl_file)
    next(ddl_file)
    
    ### CREATE TABLE 文を作成開始
    sql_create_table='CREATE TABLE '+table_name+' ('
    
    # CSVファイルから各カラムの設定を記述
    for row in ddl_file:
        # CSVに短縮して書かれている定義は、正しい型名に修正する
        if row[1]=='DOUBLE':
            row[1] = 'DOUBLE PRECISION'
        # 各カラムの定義作成
        sql_create_table += '\"' + row[0] +'\"' + ' ' +row[1] + ','
    
    # 末尾のカンマを削除して、括弧を閉じる
    sql_create_table = sql_create_table[:-1]
    sql_create_table += ')'
    ### CREATE TABLE 文を作成完了
    
    # postgreSQLへ接続
    config = ' user={user} dbname={db} password={pass}'.format(**postgres_config)
    
    # with構文でclose()がいらない形で記述  
    with psycopg2.connect(config) as conn:
        conn.autocommit = True  #commit()不要で実行できるよう設定
        with conn.cursor() as cur:
            # 作成したCREATE TABLE 文を実行
            cur.execute(sql_create_table)
```
【Python】in 検索した結果のカラムのみ表示させる

# 経緯
先日試しで作った関数が結構便利かなっと思いましたのでメモ ✍️
250カラムほどある中から、"賞味期限xx"のようなカラムだけ抽出した

## やりたいこと
* `df[["賞味期限1", "賞味期限2",:...]]` のような手打ちが減る 👈 ここを改善したかった
* "賞味期限1", "賞味期限2" :... のようなカラムがある場合一度に検索抽出できる


# 作成した関数

```python
# in 検索した結果のカラムのみ表示させる

def in_search_col_list(df, cols="賞味期限", head=2) -> List:
    """ in search した colの結果を返す
    
    params
    ----------
    df(DataFrame): 取り込みデータ
    cols(str): 検索にかけたいグローバルの値
    head(int): 先頭から抽出するレコード数
    
    return
    ----------
    df(IndexList) in search したカラムリスト結果を返す
    """
    return df[[for col in list(df.columns) if cols in col]].head(head)
```

## 使用例

```python
# 必要package
import pandas as pd
import numpy as np
from typing import List

# サンプルデータ（実際は, *tabファイルを読み込んでいたりします。）
df = pd.DataFrame({ '賞味期限A' : 1.,
                    '保管場所B' : pd.Timestamp('20130102'),
                    '保管場所C' : pd.Series(1,index=list(range(5)),dtype='float32'),
                    '賞味期限D' : np.array([3] * 5,dtype='int32'),
                    'E賞味期限' : pd.Categorical(["test","train","test","train", "test"]),
                    '食品個F' : 'foo',
                    '期間限定G' : ['1000', np.nan, '123', '1234', '']})


def in_search_col_list(df, cols="賞味期限", head=2) -> List:
    return df[[ col for col in list(df.columns) if cols in col]].head(head)

# 関数呼び出し
in_search_col_list(df, cols="賞味期限", head=2)
```

# 出力結果

![result.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/898763/ef4ed4b4-7d23-f7f0-df8b-a2b7ea2b196d.png)


# まとめ

- `cols` の引数名に検索したい文字列を入れれば、**一発で検索できるので便利**
PowerAutomateで繰り返し処理の回数を指定する方法

###はじめに
PowerAutomateを使用していて操作対象の項目数分通し番号を取得したい！という時はどんなフローにしたらよいのだろう？そんな時はrange関数を使用して、繰り返し処理の回数分通し番号を取り出すことができます！

# 実現しようとしているフローの概要

トリガーでフローが実行されたら、range関数で何回繰り返すか指定し、一つずつ数字を取り出す。

以上！

# フローの作成
1. トリガーの作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322371/96c4be69-aeb0-f9be-7929-85c6e7306fbc.png)
　
2. 繰り返し処理で回数を指定

「Apply_to_each」を追加して、式にrange関数を設定します。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322371/ea8d30fd-cfd0-b4b0-9a85-997397b120ff.png)
ここでは、「1」から始まり、カウント数を「3」に設定しました。
これで、1から1、2、3と繰り返し処理時に出力されます。

3. 通し番号を取り出す。
「データ操作」から「作成」のアクションを追加して、前述のアクションの出力値を取り出します。
前述のアクションからの出力ちを取り出すには、参照関数を使用して取り出します。items('取り出す対象のアクション名')で取り出せます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322371/d6dd48c1-d9e3-cd76-9bd0-c6dae9341a2d.png)

完成！
#テスト実行
range関数で指定した回数分、通し番号が取り出せました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322371/a94ff98c-5853-b03e-c9c9-8d5c147ea518.png)

例えば、配列の数分繰り返し処理を行いたい場合は、「Apply_to_each」で設定したrange関数のカウントを設定する引数に、length関数で配列の数を指定し設定することができます。
指定したリポジトリに貢献してる人全員のメアドで勝手にコミットするワンライナー

## メアドを変えるだけで偽装ができる
Gitの偽装はとても簡単なので、GPGでしっかりと署名をしましょう。

## 怖さを表す
Repo1に貢献してる人全員のメアドを取得して空コミットを行います。

```bash
git -C /path/to/Repo1 log | grep Author | sort | uniq | grep "@" | cut -d '<' -f 2 | sed "s|>$||g" | xargs -I%s bash -c "git config user.email %s; git commit --allow-empty -m 'Fake commit'"
```
Azure Front Door 経由のみで App Service にアクセスさせる方法

Azure の App Service でサービスを起動させた場合、セキュリティ対策などで前面に Front Door を配置することがあると思います。

この場合、カスタムドメインは Front Door 側で設定するのですが、App Service は固有のアクセス URL（https://xxxxx.azurewebsites.net）を持っていて、この URL でも直接アクセスできるので、このままだと Front Door を介さずに直接 App Service にアクセスできてしまいます。

Azureポータルで該当の App Service を選択し
**ネットワーク** → **アクセス制限を構成する** → **+規則の追加** 
で以下のような画面が表示されますので

| 項目 | 値 |
|:-----------|:------------|
|名前|好きな名前を入力|
|アクション|**許可**を選択|
|優先度|優先度を数値で入力|
|説明|なしでも可、必要なら入力|
|種類|**サービスタグ**を選択|
|サービスタグ|**AzureFrontDoor.Backend**を選択|

と指定して**規則の追加**を実行します。

![frontdoor.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/946371/b15733af-24e7-659c-861b-04863fc4d771.png)

注意点ですが、Front Door のアクセス制限のみとしてしまうと、VisualStudio から App Service への発行などもできなくなります。
その場合は、VisualStudio で発行を指示するアクセス元を、同様にアクセス制限の追加で追加する必要があります（グローバル IP が特定できる場合は種類で IPv4 を選択しグローバル IP を指定する）。
RubyなリポジトリのGitHub ActionsでCoverallsを使う

## はじめに
Travis CIからGitHub Actionsに移行する際に、GitHub ActionsでSimpleCovの結果をCoverallsに送信する方法を調べました。simplecov-lcovを使用して、code coverageをlcov形式で出力し、それをCoverallsに送るという感じでした。

## SimpleCovとsimplecov-lcovのインストール
Gemfileに以下の二行を追加して、`bundle install` しました。

```ruby
gem 'simplecov', '~> 0.21'
gem 'simplecov-lcov', '~> 0.8'
```

`spec/spec_helper.rb` の先頭に以下を追加します。Coverallsにcoverageを送る場合に重要になるのは、`SimpleCov::Formatter::LcovFormatter` に関係する部分です。

```ruby
require 'simplecov'
require 'simplecov-lcov'

SimpleCov::Formatter::LcovFormatter.config do |config|
  # Coverallsはデフォルトではcoverage/lcov.infoの結果を送信する
  config.report_with_single_file = true
  config.single_report_path = 'coverage/lcov.info'
end

SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter.new([
  SimpleCov::Formatter::HTMLFormatter, 
  # formatterにSimpleCov::Formatter::LcovFormatterを加える
  SimpleCov::Formatter::LcovFormatter
])

SimpleCov.start
```

## Coveralls GitHub Actions
https://github.com/marketplace/actions/coveralls-github-action に、CoverallsのGitHub Actionsがあります。
![coveralls_github_actions-fs8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212625/5276e2f9-0f36-be1b-53e0-4510f851aa53.png)

`Use latent version` ボタンを押すと表示されるモーダルの二行をコピーして、Workflowのymlに追記します。

![coveralls_github_actions_code-fs8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212625/169ac23c-bf6a-6589-a9fe-ce789717a808.png)

## Workflowの例
code coverageをCoverallsに送信するために `.github/workflows/coverage.yml` というworkflowファイルを用意しました。重要なのは、前節でコピーした最後の `- name: Coveralls GitHub Action` からの部分です。`github-token` は必須のオプションになりますが `${{ secrets.GITHUB_TOKEN }}` としておけばOKです。

```yml
name: coverage

on: [push, pull_request]

jobs:
  coverage:
    runs-on: ubuntu-20.04
    steps:
      - uses: actions/checkout@v2
      - name: Set up Ruby 2.7
        uses: actions/setup-ruby@v1
        with:
          ruby-version: '2.7'
      - name: Build and test with Rake
        run: |
          gem install bundler
          bundle install
          bundle exec rake
      - name: Coveralls GitHub Action
        uses: coverallsapp/github-action@v1.1.2
        with:
          github-token: ${{ secrets.GITHUB_TOKEN }}
```

必要かどうかちょっと謎ですが、一行だけの `.coveralls.yml` を用意しました。

```yml
service_name: github-ci
```

あとはこれらをcommitしてpushすれば、workflowが動きだして、Coverallsに結果が送られます。あらかじめ、Coveralls側でリポジトリの連携をONにしておいてください。

## おわりに
CoverallsのGitHub Actionのexampleが、Node.jsのものだったので、Rubyは対応してないのかな〜と思っていたのですが、ちゃんと調べたら簡単でした。Travis CIの頃は、[coveralls gem](https://rubygems.org/gems/coveralls)を使っていました。coveralls gemでは、SimpleCovのバージョンにしばりがあるので、今回の様なsimplecov-lcovを使った方法の方が自由で良いですね。
ABC188 C問題　with python3

#[ABC188 C問題 ABC Tournament](https://atcoder.jp/contests/abc188/tasks/abc188_c)

###ひとこと
リストでremove()を使ったせいでtleで不正解になってしまった。C問題からは計算量オーダーを意識したい。


###正解コード

```py
N=int(input())
A=list(map(int,input().split()))
survive=list(range(1,2**N+1))

    
for j in range(N-1):
    winner=[]
    for k in range(0, len(survive), 2):
        first=survive[k]
        second=survive[k+1]
        if A[first-1]>A[second-1]:
            winner.append(first)
        else:
            winner.append(second)
    survive=winner
    
first=survive[0]
second=survive[1]
if A[first-1]>A[second-1]:
    print(second)
else:
    print(first)
```
###解説
まず全員分のデータを入れたリストを作る。そこからトーナメントで負けた人をリストから削除していき、残った二人のうちレートの低い方の番号を出力すれば良い。
ここで負けた人のデータを削除していくリストの作り方は２通り考えられる。
レートのデータを格納したリストを作るか番号のデータを格納したリストを作るかだ。

前者の場合出力したいデータが番号なのに対して残ったデータがレートになってしまうので番号順にレートを格納したリストを別にとっておいてレートのインデックスを調べる必要があり手間がかかる。
後者の場合残った番号をそのまま出力すればいいだけなので番号のデータを格納したリストを作ることにする。

リストから敗者の番号を消していく方法は単純にremove()を使うと消えた分データのインデックスがずれて面倒なので残っている人の番号を格納するsurviveリストと勝った人の番号を格納する空のwinnerリストを作り、surviveリストの内から勝った方だけwinnerリストに追加していく。処理が一周終わったらsurvive=winnerとする。これを繰り返すことで実装する。

この方法はリストから特定の条件を満たす要素を削除したい　かつ　削除する条件にインデックスが絡んでくる時に使うと上手くいく。

##簡単な類題
リストA=[2,3,1,5,6,7,3]からインデックスが奇数の要素を削除したものを出力せよ
##回答
```py
A=[2,3,1,5,6,7,3]
ans=[]
for i in range(len(A)):
    if i%2==0:
        ans.append(A[i])
print(ans)
#ちゃんと答えが[2,1,6,3]になるはずです。
```

###まとめ
・実装方法が２つ考えられるときはある程度先までシュミレートして楽な方を選ぶ
・リストから特定の条件を満たす要素を削除したい　かつ　削除する条件にインデックスが絡んでくる時は空のリストを用意してそこに生き残った要素を入れていけば良い
TwitterOAuthでCa-Bundleが見つからないエラー

# 概要
PHPでTwitterOAuthを使おうとしたのだが、次のようなエラーが出てしまった。
`Fatal error: Uncaught Error: Class 'Composer\CaBundle\CaBundle' not found `
Ca-Bundleもautoloadするようにしたところ解決した。

#エラーの内容
まず、TwitterOAuthをComposerでインストールするために、`php composer.phar require abraham/twitteroauth`とコマンドを実行した。これは[twitteroauthのインストール方法](https://qiita.com/Tcandy/items/af8097a6a355e3b28ce4)を参考にしている。

これを実行すると、カレントディレクトリに`abraham`というフォルダが作成され、この中にtwitteruoauthのライブラリが入っている。
このフォルダを、phpファイルと同じディレクトリに置いた。

次のようなコードで、twitteroauthをphp内でrequireする。

```php:twitter_api._sample.php
require_once __DIR__ . '/abraham/twitteroauth/autoload.php';
```

すると、このようなエラーが出てきてTwitterAPIを実行できなかった。
`Fatal error: Uncaught Error: Class 'Composer\CaBundle\CaBundle' not found `


#同様のエラー報告
TwitterOAuthのGitHubのissue(https://github.com/abraham/twitteroauth/issues/892 )には同様のエラーが報告されている。ただ、状況の説明がされておらず、再現ができなさそうだった。

#解決方法
`abraham/twitteroauth/autoload.php`を実行してライブラリを呼び出すと、Composerの新しいライブラリである`CaBundle`をロードできないのが原因だった。
そこで、次のようにca-bundleとtwitteroauthをautoloadできるようにする。

1\. composer.jsonを次のように書く

```json:composer.json
{
    "require": {
        "abraham/twitteroauth": "^2.0",
        "composer/ca-bundle": "^1.2"
    }
}
```


2\. `php composer.phar install`を`composer.json`のあるディレクトリで実行する
3. `vender`というフォルダが作成されるので、このフォルダをphpファイルと同じディレクトリに置く
4. phpファイルで次のようにrequireする

```php:twitter_api._sample.php
require_once __DIR__ . '/vender/autoload.php';
```

これで、ca-bundleとtwitteroauthをロードすることができる。twitterAPIも使えるようになる。

TwitterOAuthの公式ドキュメントhttps://packagist.org/packages/abraham/twitteroauth によると、バージョン1.2.0以降でca-bundleをrequireするようになっている。これ以降のバージョンではca-bundleがないとエラーが出る。これは2020年9月のリリースなので、エラーとしてはあまり報告されていない。

#まとめ
Ca-Bundleがなくて怒られるエラーが出た場合、twitteroauth内のautoload.phpを実行していることがある。その際は、composer.jsonで作成したautoload.phpを読み込む必要がある。
それでもうまくいかない場合は、twitteroauthのバージョンを1.1.0に下げて試すこともした方がいい。
https://github.com/abraham/twitteroauth/issues/892#issuecomment-760157284 でこの件を報告したので、解決しなかったらこちらにコメントください。
Chromebookを買ったのはよいが、Windowsとの差で困ったことメモ（書き足していく）

最初めちゃくちゃ操作にストレス感じたのでメモっておく。
今も色々ストレス感じてるけどね！

#基本操作

・__delete__がねえぞ！
　⇒alt＋バックスペース（←のマーク）

・そもそもどんな__ショートカット__があるのかわかんねー！
　⇒ctrl + alt + ?

・Spreadsheetのセルの中身を編集したい！　F2にあたるやつ！
　⇒検索（虫眼鏡のマーク）＋ くるりと回る矢印（更新のマーク）

・日本語入力モードで英語を打ち込んで英語に変換するときにF10を使ってたけど、、、
　⇒検索（虫眼鏡のマーク）＋ 日の出みたいなマーク

・そもそもキーボードの上のところファンクションキーのやつにしたい！
　⇒画面右下の設定→デバイス→キーボード→「キーボードの最上段のキーをファンクションキーとして使用する」をオンにする

・マウスが勝手に加速するな！　たぶんChromeだからというわけではないが
　⇒「マウスのアクセラレーションを有効にする」　をオフにする

#かゆいところ
・マウスのスクロールが遅くなったり速くなったりして自分が止めたいところで止めにくい。スクロールのアクセラレーションを切りたい。

・指紋認証を登録したのに、再起動とかシャットダウンしたときだと指紋認証でログインできない。

・Chromeだけログインしたアカウントと別アカウントのお気に入りも使いたい！
　Windowsだったら「ユーザを切り替えてタスクバーに貼り付ける」ができたけど、切り替えるところがそもそもないな。

・電子書籍を読むのに使っていた「楽天kobo」がサービス対象外だぞ！
　Androidアプリを入れて使うのだが、__ページが3ページごとに映らない現象__が発生。
　問い合わせたら「ChromeOSですよね？サービス対象外だから我慢してね」とのこと。
　しまったー。
[ruby]ヒアドキュメントについて

＊追記
”実はputsやprint意外にも文字列を出力する方法があります
それがヒアドキュメントです
しかもただ単に出力するのではなく、空白や改行も含める長い文章が出力できる様になります
rubyだと改行した瞬間文の終了とみなされますがヒアドキュメントを利用すると・・・”
とご指摘があり、間違った解釈をしておりました
ありがとうございます

##ヒアドキュメント

長文を識別子で囲む事によって長文も保存できる様になれる

```
irb(main):033:0> puts = <<hia
irb(main):034:0" ruby
irb(main):035:0" most like
irb(main):036:0" Programming language
irb(main):037:0" hia
=> "ruby\nmost like\nProgramming language\n"
```


解説しますとまず
１行目にputsと言う変数にhiaと言う識別子で開始ラベル
4行目で終了ラベルである識別子を入れてあげると2~3行目の内容を変数putsに格納してくれる
６行目には格納された内容が表示される

```
irb(main):038:0> puts puts
ruby
most like
Programming language
=> nil
```
もちろんputs 変数（puts)とすると先ほど変数に格納された文字列を出力できる

ちなみに変数に文字列や数字を前もって代入した状態でもヒアドキュメントは式展開で出力できる

```
irb(main):059:0> name = "タケシ"
=> "タケシ"
irb(main):060:0> age = 12
=> 12
irb(main):062:0> city = "神奈川"
=> "神奈川"
irb(main):063:0> text = <<EOF
irb(main):064:0" 私の名前は#{name}です
irb(main):065:0" 年齢は#{age}
irb(main):066:0" 出身は#{city}
irb(main):067:0" EOF
=> "私の名前はタケシです\n年齢は12\n出身は神奈川\n"
irb(main):069:0> puts text
私の名前はタケシです
年齢は12
出身は神奈川
```



と今回はヒアドキュメントについて勉強しアウトプットしました
Dockerとは

### ◯Dockerとは？
　コンテナという技術を使いコンテナの中に環境構築し、コンテナの中で開発をするこの一連の流れを簡単に実装できるもの。

### ◯Dockerに関するコマンド
#### ①docker login
　Dockerにログインするときに使用するコマンド

#### ②docker pull [image]
　docker-imageをHostにpullするときに使用コマンド

#### ③docker images
　Hostにあるdoker-imageの一覧を表示させるときに使用するコマンド

#### ④docker run [image]
　Hostにあるdocker-imageからコンテナを作成するときに使用するコマンド

#### ⑤docker ps -a
　コンテナの一覧を表示させるときに使用するコマンド
【PostgreSQL】トリガーを使用して回数チェックし例外エラーとする

# はじめに
ユーザーからとあるシステムの実績を登録するテーブルに回数を保持する列があり数値型3桁になっているが、これを数値型1桁にしたいという依頼があった。システム上10回を超えるのは作業者が間違って操作している可能性があるとのこと。
データを調べると過去にも10回を超えるデータはそれなりに存在しており、数値型を1桁にするとなると現在のテーブルのデータはバックアップして、データを初期化することになる。

全国で同じ形式で統一してやっているのに1拠点だけ桁数を変更するのは管理的にどうかと思い、トリガーを使えばチェックできるのではないかと調査した。

# 調査
もともとレプリケーション用にトリガーを作成しており、これを一部変更して登録時に回数の値をチェックして例外エラーにすればいい。
INSERTトリガーで新しい値の回数をチェックして10回以上なら例外エラーにする。試してみるとあっさり出来たので上長に報告すると下記の返答がきた。
>レプリケーション用のトリガーは作成ツールの仕様を気にしないといけないので、別のトリガーを付ける対応にしたいですが、不都合ありますか？

PostgreSQLって複数トリガー可能だったっけ？

>同一イベントに同じ種類の複数のトリガが定義された場合、名前のアルファベット順で実行されます。
https://www.postgresql.jp/document/9.6/html/sql-createtrigger.html

複数トリガー可能でした、ただ名前だけは気をつける必要があります。
すでに付いているレプリケーション用のトリガーより前に実行されるような名前で作成します。

# 対応
testテーブルを例とします。例外エラーは埋め込みです。

```sql:トリガーから呼ばれるファンクション
CREATE OR REPLACE FUNCTION trg_fnc_check_test() RETURNS trigger AS
$BODY$
DECLARE
BEGIN
IF (TG_OP = 'INSERT') THEN
  IF NEW."no" > 9 THEN
    RAISE EXCEPTION '回数オーバー ';
  END IF;

  RETURN NULL;
END IF;
END;
$BODY$
LANGUAGE 'plpgsql'
```

```sql:トリガー本体
CREATE TRIGGER trg_check_test
AFTER INSERT ON test FOR EACH ROW
  EXECUTE PROCEDURE trg_fnc_check_test()
```

```sql:トリガーの無効/有効と確認
-- トリガーの無効
alter table RESH003050 disable trigger trg_check_test
-- トリガーの有効
alter table RESH003050 enable trigger trg_check_test

-- トリガーの有効/無効の確認 「D」が無効、「O」が有効
SELECT * FROM pg_trigger
WHERE tgrelid = 'test'::regclass
```

# 最後に
テーブルの数値型を1桁にすると10回のみしかチェックできませんが、このトリガー方式にすればチェックする回数を変更することができるわけです。
ユーザーの言われるまま受け入れるわけではなく、よりよい提案をするのがお仕事です。
Django＋Vue.js の開発環境を docker-compose で構築する（２）

# この記事は前回からの続きです
前回：[Django＋Vue.js の開発環境を docker-compose で構築する（１）](https://qiita.com/hajime-f/items/b1e48dc547566b8c82a8)

前回は、Vue のコンテナを立ち上げてプロジェクトを作成し、GitHub でのレポジトリ管理をフロントエンド（Vue）とバックエンド（Django）に分けました。

# 今回やりたいこと
今回は、nginx のリバースプロキシを設定し、Vue のスタート画面を見るところまでやっていきます。

- ディレクトリ構造は、[前回の記事](https://qiita.com/hajime-f/items/b1e48dc547566b8c82a8)を見てください。
- ```docker-compose.dev.yml``` の全文は、[もう少し前の記事](https://qiita.com/hajime-f/items/c40571647135df327aa7)を見てください。

# 手順

1. Vue のプロジェクトをビルドする
2. ```docker-compose.dev.yml``` を編集する
3. ```app_nginx.conf``` を編集する

## 1. Vue のプロジェクトをビルドする

まずは Vue のプロジェクトをビルドします。まだなんにも作ってないけどね。

```bash
$ docker-compose -f docker-compose.dev.yml run vue npm run build
```

正しくビルドされれば、Vue のディレクトリに ```dist``` というディレクトリができます。

## 2. ```docker-compose.dev.yml``` を編集する

次に、コンテナの ```/frontend``` に ```./src/frontend``` をマウントさせるように、```docker-compose.dev.yml``` の nginx セクションを編集します。

```yaml:docker-compose.dev.yml（抜粋）
nginx:
  image: nginx:1.17
  restart: unless-stopped
  container_name: nginx
  networks:
    - django_net
  ports:
    - "80:80"
  volumes:
    - ./nginx/conf:/etc/nginx/conf.d
    - ./nginx/uwsgi_params:/etc/nginx/uwsgi_params
    - ./static:/static
    - ./src/frontend:/frontend   # 追加
  depends_on:
    - python
```

## 3. ```app_nginx.conf``` を編集する

最後に、nginx を次のとおりに設定します。

```conf:./nginx/conf/app_nginx.conf
upstream django {
  ip_hash;
  server python:8001;  # uWSGI で Django と nginx とが通信するためのポート
  server vue:3000;     # Vue と nginx とが通信するためのポート  # 追加
}

server {
  listen      80;      # 待ち受けポート
  server_name 127.0.0.1;
  charset     utf-8;

  location /static {
    alias /static;
  }
  
  client_max_body_size 75M;

  location / {            # 追加
    root /frontend/dist;  # 追加
  }                       # 追加
  
  location /apiv1/ {                      # 追加
    uwsgi_pass  django;                   # 追加
    include     /etc/nginx/uwsgi_params;  # 追加
  }

  location /admin/ {                      # 追加
    uwsgi_pass  django;                   # 追加
    include     /etc/nginx/uwsgi_params;  # 追加
  }                                       # 追加
}                                         # 追加

server_tokens off;
```

要するに、
- ```/``` へのアクセスは、```/frontend/dist``` にルーティング
- ```/static``` へのアクセスは、```./static``` にルーティング
- ```/apiv1``` と ```/admin``` へのアクセスは、uwsgi 経由で Django にルーティング
とします。

ちなみに、ngnix の待ち受けポートが 80 番になっているのは、私が Mac 上の VirtualBox で Ubuntu Server を動かしており、ホストの 8081 番とゲストの 80 番を接続しているからです。だから、Mac のブラウザで http://127.0.0.1:8081/ にアクセスすれば、開発中の画面が見られるってワケ。
関連：[もう VirtualBox の設定で悩まない。そう、Vagrant ならね😏](https://qiita.com/hajime-f/items/5d3373e98985776b4240)

# 動作確認

以上を設定し、コンテナを再起動してトップページにアクセスすると、無事に Vue のスタート画面を見ることができました。

![スクリーンショット 2021-01-16 21.51.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/667942/9d797577-4116-4793-1a14-2be999773d7d.png)
Nuxt.js + Storybook導入で詰まった点の覚え書き

## 概要
既存のnuxt.jsにstorybookを導入しようとして、詰まった点をまとめます。
基本は[公式ドキュメント](https://storybook.js.org/docs/vue/get-started/introduction)の手順を参照

## 環境
storybook : 6.1.14
nuxt.js: 2.9.2

## scssを読み込みたい
遭遇したのは2パターンでvueファイル上の`<style lang="scss">`内にあるscssと全体のscssファイルの読み込みである。

大体全体のscssが読み込まれていない場合,vueファイル内で参照している変数がうまく読み取れず以下のようなエラーが出る。

```
SassError: Undefined variable: "$変数名".
```

これを解決するためには`.storybook/main.js`で以下のようにwebpackの設定をしてあげると解決する。

``` .storybook/main.js
const path = require('path');
const rootPath = path.resolve(__dirname, '../');
module.exports = {
  webpackFinal: async (config, { configType }) => {
    config.module.rules.push({
      test: /\.scss$/,
      use: ['style-loader', 'css-loader',
        {
          loader: 'sass-loader',
          options: {
            // scssファイル読み込み
            prependData: `
              @import "~/assets/scss/<scssファイル1>";
              @import "~/assets/scss/<scssファイル2>";
            `
          }
        }
      ],
      include: rootPath
    });
    return config;
  },
  "stories": [
    "../stories/**/*.stories.mdx",
    "../stories/**/*.stories.@(js|jsx|ts|tsx)"
  ],
  "addons": [
    "@storybook/addon-links",
    "@storybook/addon-essentials"
  ]
}

```

[webpackのドキュメントだ](https://webpack.js.org/loaders/sass-loader/#additionaldata)とadditionalDataになってるけどバージョンの問題だろうか?

## 参照しているvueのpathが~/xxxx.vueになっており、ファイルが見つからない。
```
Module not found: Error: Can't resolve '~xxxx`
```

みたいなエラーが出てくる

これは`.storybook/main.js`に以下のような設定を追加追加することで解決できる。

```.storybook/main.js
const path = require('path');
const rootPath = path.resolve(__dirname, '../');
module.exports = {
  webpackFinal: async (config, { configType }) => {

    config.module.rules.push({
      test: /\.scss$/,
      use: ['style-loader', 'css-loader',
        {
          loader: 'sass-loader',
          options: {
            prependData: `
              @import "~/assets/scss/<scssファイル1>";
              @import "~/assets/scss/mixins/<scssファイル2>";
            `
          }
        }
      ],
      include: rootPath
    });
    config.resolve.alias['~'] = rootPath;
    return config;
  },
  "stories": [
    "../stories/**/*.stories.mdx",
    "../stories/**/*.stories.@(js|jsx|ts|tsx)"
  ],
  "addons": [
    "@storybook/addon-links",
    "@storybook/addon-essentials"
  ]
}

```

`@`の場合は

```
config.resolve.alias['@'] = rootPath;
```
とすれば良い。

## 解決できなかった問題

Nuxtにはpluginとして任意のjsコードをインジェクトする機構が存在する。[参考](https://ja.nuxtjs.org/docs/2.x/directory-structure/plugins/)

これをstorybook上だと以下のようなエラーが出てinjectしてくれなかった。

```
_vm.<pluginでinjectされるはずの> is not a function
```

良い方法があれば教えてもらえるとうれしい。

scssの対応を除いて概ねすんなりと導入できた。
nuxtと言いつつ大体webpackの設定周りだった。webpackは触りたくないなぁ。。。
VBE のイミディエイトをクリアする方法

Excel VBA を利用している時によく利用するイミディエイト。
デバッグ時に、MsgBoxか、Debug.Printを使うと思います。

Debug.Printの出力結果を表示するイミディエイトウィンドウ。
実行の度にクリアする方法を探してみました。
しかし、見つからなかったため、独自の研究で発見した方法を書き残しておきたいと思います。

```vb:vbe.bas
Private Sub VBE_ImidiateClear()
    Call Excel.Application.SendKeys("^g^a^g{DEL}")
    Call Excel.Application.SendKeys("%(w1)")
    Stop
End Sub
```
基本は、VBEにショートカットキーを送信して削除です。
ミソは「Stop」命令に有りました。
実行の度に、一時停止するのでF5など必要ですが
毎回選択、クリアするよりは楽だと思います。
アーカイブページ（archive.php）にハマった。。。件

#アーカイブページ（archive.php）にハマった。。。件

archive.phpはどんな役割かというと、一覧ページを表示するための最もベースになるテンプレートです。

階層はこんな感じ⬇️
http://wpdocs.sourceforge.jp/wiki/images/wp-template-hierarchy.jpg

左に行くほど、優先度は高い？のかな？
そこのところは曖昧だけど。

##今回のハマり所

投稿のカテゴリーを作成したのだけど、表示できないこと原因不明なことが起こりました。

『投稿 > カテゴリー』から、名前・スラッグ・説明を入力してカテゴリーを作りました。。


![カテゴリs.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/993438/a120360c-147d-a761-661f-cc87a0c27bf2.png)

ですが、真っ白に、、

![Item.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/993438/a49961dd-5656-64ea-660c-0753fcd5ec7a.png)



##結果

結果的には映るようになりました。
その理由は、category.phpを先に作成したからです。
一旦、category.phpファイルを削除してみたら、以下のように反映ができました。
これは通常とおりにテンプレート階層順になっていため、真っ白になっていたということです。
category.php⇨archive.php⇨index.phpのように階層になっているため、
ということですね。あまり、具体的にわかっていません、、、、すいません！


![全画面.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/993438/8b6c41cb-2da8-7101-0d45-12f7124cf48b.png)


なぜ、この方法をいたったかというと、エンジニアメンターに聞きました。。。
まだまだ、一人では解決できないので、頑張ります！

以上、ありがとうございました。
Gitのユーザー名とメールアドレスを設定する方法

# はじめに

現在会社ではGitLab、個人開発ではGitHubを使用しています。それぞれユーザー名やメールアドレスが異なるため、プロジェクト毎に設定する方法を記載します。

# Gitのユーザー名とメールアドレスを設定する方法

### 全体(global)の設定を行う

コンピュータ内のGit全体のユーザー名/メールアドレスの設定です。
最も使用頻度の高いものをこちらで設定しておきます。

ユーザー名を設定

```
git config --global [user.name](http://user.name/) "ユーザー名"
```

メールアドレスを設定

```
git config --global user.email メールアドレス
```

## プロジェクト毎に設定を行う

まずcdコマンドを使用して設定したいプロジェクトのディレクトリに移動しておきます。
その後、下記コマンドで設定します。

ユーザー名を設定

```
git config --local user.name "ユーザー名"
```

メールアドレスを設定

```
git config --local user.email メールアドレス
```

# 最後に

以上、Gitのユーザー名とメールアドレスを設定する方法でした。見ていただきありがとうございました。
RubyOnRails、Authentication plugin 'caching_sha2_password' cannot be loadedエラーの解決法

# RubyOnRails、Authentication plugin 'caching_sha2_password' cannot be loadedエラーの解決法
**Ruby on rails** 開発時に、databaseをmysql 8.0に設定してしたく、database.ymlをmysql設定の上で、rails db:migrate　を実行したところ、**エラー「Authentication plugin ‘caching_sha2_password’ cannot be loaded」**となった時の解決法を共有します。
＊laravelにも同様のエラーが発生するとの。

## 環境の整理
- 開発環境：Windows10 Home　64ビットオペレーティングシステム、x64ベースプロセッサ
- Rails version 5系
- Mysql
    - **version 8.0**
    - **user: root**
    - **password: root（＝今回の例）**
- RubyOnRailsのdatabase.yml設定状況
![スクリーンショット 2021-01-16 213315.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676239/efe81511-0afa-cd05-314e-e61171e35439.png)

## 原因
mysql 8.0以降に、認証方式がcaching_sha2_passwordを使うようになったこと。
しかし、Railsはこれに対応していなかったこと。

## 方法
**対象のユーザーの認証方式を「caching_sha2_password」から「mysql_native_password」に変更する。**
今回をuserがrootの認証方式を変更する。

1. ```mysql -u root -p ```　でmysqlにアクセスする
2. ```root ```　（今回のpassword）を入力、Enterする。
3. ```SELECT user, host, plugin FROM mysql.user;```　でユーザー一覧を表示させ、確認する。
    * root の認証方式が「caching_sha2_password」だ
![111.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676239/706826bd-1c14-a5bf-ffb3-0ab93111bdd6.png)


4. ```ALTER USER root IDENTIFIED WITH mysql_native_password BY 'root';```　を実行する。
    * 構文：```ALTER USER ユーザー名 IDENTIFIED WITH mysql_native_password BY 'password';```

5. ```SELECT user, host, plugin FROM mysql.user;```　でrootの認証方式が変更されていることを確認する。
![222.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676239/f0f1a895-b0e0-827d-29ec-358607ef534d.png)

6. ```exit``` でmysqlから抜ける

7. ```rails db:migrate```　で本題のrailsのmigrateコマンドを実行する。

8. エラーなく完了された。
![333.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676239/abd12122-3de5-022b-81bb-53127672161c.png)


＊補足：
my.ini（macだとmy.cnf）にて、
default_authentication_plugin=caching_sha2_password
を
default_authentication_plugin=mysql_native_password
に変更すると、エラーが消えるとの話もあったが、
変更したあとでmysqlを再起動しても変更されなかった。
ちなみに、my.iniの場所は「C:\ProgramData\MySQL\MySQL Server 8.0」である。
Reactで作成したアプリを起動させようと"npm start"したらエラーが出た

##はじめに
個人の忘備録として記載しております。
**※右も左も分からない 初学者が記載した内容となります。**

##経緯
参考書をもとにReactのアプリを実行しようとしたら
エラーが発生しました。

いままでエラーが発生したことがなかったので
「むむむ？」と思い調べた次第でございます。

##事象
Reactアプリをwebブラウザ画面で確認するため

```
$ npm start
```
を実行したところ

```
npm ERR! code ENOENT
npm ERR! syscall open
npm ERR! path /var/www/html/~省略~/package.json
npm ERR! errno -2
npm ERR! enoent ENOENT: no such file or directory, open '/var/www/html/~省略~/package.json'
npm ERR! enoent This is related to npm not being able to find a file.
npm ERR! enoent 

npm ERR! A complete log of this run can be found in:
npm ERR!     /home/[ユーザー名]/.npm/_logs/~debug.log
```
といったエラーが発生しました。

どうやら`package.json`さんが不在とおっしゃっているようです。

**「package.jsonさんどこ？」**

ちょっと探してみたらいました。

**Reactのプロジェクトフォルダの中にいました。**
(ったく…、あまり心配させんなよな。)


>※ちなみにReactのプロジェクトフォルダは

>```
npx create-react-app [プロジェクトフォルダの名前]
```
で作成したやつです。


##原因と対策

ということでなんでnpmが"package.json"さんを
見つけられなかったかというと

**`$ npm start`を実行した際のカレントディレクトリに
`package.json`さんがいなかったからです。**

`package.json`さんがいるディレクトリにて
`$ npm start`を実行すると万事解決しました。
(めでたしめでたし。)
vuetifyで「[Vue warn]: The .native modifier for v-on is only valid on components but it was used on <div>.」


# 起きたこと

私の場合は[カレンダー・コンポーネント](https://vuetifyjs.com/ja/components/calendars/)を使った時に発生しました。

起動はしますが、ブラウザ上でwarningが出ます。

```html
[Vue warn]: The .native modifier for v-on is only valid on components but it was used on <div>.
```


# 解決方法



## その1 vuetifyのバージョンをあげる

このwarningについてはGitHubでissueがあがっていて、解決済です。（v-iconでも発生するようです）

[\[Bug Report\] warning with VueJS 2\.6\.11 · Issue \#9999 · vuetifyjs/vuetify](https://github.com/vuetifyjs/vuetify/issues/9999)
[\[Bug Report\] Button wrapper missing for faSvg clickable v\-icons · Issue \#10623 · vuetifyjs/vuetify](https://github.com/vuetifyjs/vuetify/issues/10623)

修正のPRは↓で、[v2.3.14](https://github.com/vuetifyjs/vuetify/releases/tag/v2.3.14)でリリース済です。

[fix\(VIcon\): render a button element around clickable component icons by KaelWD · Pull Request \#12148 · vuetifyjs/vuetify](https://github.com/vuetifyjs/vuetify/pull/12148)

というわけで、v2.3.14に上げれば発生しなくなります。


## その2 warningを無視するコードを入れる

様々な事情でバージョンをあげるのが難しい場合、無理やり無視する事も可能です。（warningなので動作に影響は無いようです）

該当のコードは[こちら](https://github.com/vuetifyjs/vuetify/issues/9999#issuecomment-569932219)。


Nuxtの場合は、pluginとして書いてあげるとわかりやすいです。

```typeScript:ignore-warning.ts

const ignoreWarnMessage = 'The .native modifier for v-on is only valid on components but it was used on <div>.';
Vue.config.warnHandler = function (msg, vm, trace) {
  // `trace` is the component hierarchy trace
  if (msg === ignoreWarnMessage) {
    msg = null;
    vm = null;
    trace = null;
  }
```

該当のwarningメッセージを握りつぶします。
[Tips]Kotlinで使うかもしれない記法

備忘録。
今後使うかもしれない記法。
随時更新予定。


### コレクションを複数のフィールドを使ってソートする

```kotlin
data class User(
    val id: Long, // ID
    val name: String, // 名前
    val age: Int // 年齢
)
```

のようなクラスがあったとして、

- コレクションを「年齢」昇順、「ID」昇順にしたい場合

```kotlin
userList.sortedWith(compareBy({ it.age }, { it.id }))
```

- コレクションを「年齢」降順、「ID」降順にしたい場合

```kotlin
userList.sortedWith(compareByDescending<User> { it.age }.thenByDescending { it.id })
```


### 空のリストを `all()` `any()` などの結果が異なる

- **all()** すべての要素がラムダ式で一致するのであればtrue
- **any()** いずれかの要素がラムダ式で一致するのであればtrue
- **none()** すべての要素がラムダ式で一致しないのであればtrue 

リストの中身が空の場合、挙動が異なるので注意。
例えばリストをfilterしたあとに、allなどを実行したい場合、想定と異なる場合があるかもしれない。

```kotlin
    val empty = emptyList<Int>()
    empty.all { it == 1 } // true
    empty.any { it == 1 } // false
    empty.none { it == 1 } // true
```
Herokuのチュートリアルやってたら、PostgreSQLとの接続でちょっと詰まった話

# 公式チュートリアル
[Heroku スターターガイド(Node.js)](https://devcenter.heroku.com/ja/articles/getting-started-with-nodejs)

# 詰まった点
Herokuチュートリアルを進めていて、最後のデータベースをプロビジョニングする
部分で少し引っかかりました。

> この後、アプリの /db​ ルートにアクセスすると、次のように表示されます。
<cite>https://devcenter.heroku.com/ja/articles/getting-started-with-nodejs#-13</cite>

試しにHeroku CLIで /db にアクセスしてみる

```
heroku open db
```


するとブラウザでエラー発生。

```
self signed certificate Error: self signed certificate
```

[英語版ドキュメント](https://devcenter.heroku.com/articles/getting-started-with-nodejs#provision-a-database)を読んだ結果、SSLの指定方法が変わったとのこと。

```javascript:index.js
const pool = new Pool({
  connectionString: process.env.DATABASE_URL,
  // ssl:true
  ssl: { rejectUnauthorized: false }
});

```
ssl: true => ssl: { rejectUnauthorized: false }
と変更して再デプロイ。


```shell:デプロイ手順
git add . 
git commit
git push heroku main
heroku open db
```

ブラウザを確認してみる。

![スクリーンショット 2021-01-16 21.14.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229696/2231a601-4afe-c6d1-b2df-63b835089d46.png)

データベース内のデータが表示されました。
めでたしめでたし。

# Herokuを初めて触った感想
今回Node.jsの学習と兼ねてHerokuを初めて触りましたが、

- ローカルサーバを簡単に立ち上げられる点
- gitにpushするだけでHerokuへのデプロイが完了する点

が素晴らしいと思いました。
個人開発だったら十分に使えそうです。


以上、お読みいただきありがとうございました。
M1チップ搭載 Rails 環境構築 

※この記事は学習開始してまもない者が書いたものなので、
信憑性は保証できません。あらかじめご了承ください。
数ある記事の中で、１人でも私の記事を参考にしてくれるとありがたいです。



この記事で伝えたいことは、
MacBook　M1の使用者が立ちはだかる壁、Railsの環境構築において、
100回ぐらいLGTMしたいくらい役に立った記事を紹介したいと思います。 

<h1>背景</h1>
先日、windowsPCからMacBookに買い替えました。
以前からRailsにて開発をしていたので
新PCも環境構築しました。

以前スクールで配布されていたMacbook用の環境構築のマニュアルをやってみたのですが、
全くうまくいかず...
この時、M1じゃなくて、Intelの旧型のものを買っておけばと少し後悔していたのを覚えています。
<br>
色々とググってみると、
M1搭載のものは<a href="https://brew.sh/index_ja">Homebrew</a>がネイティブで機能しないことや、
RubyがRailsで管理できないことがわかりました。
<br>

しかし、2021年1月5日現在、<a href="https://qiita.com/aiorange19/items/5ffaefc85f912f60c2fa">@aiorange19</a>様の記事を参照にして環境構築を行なった結果、一発で完了しましたのでここで共有させていただきます。

<h1>参考にさせていただいた記事</h1>

<a>https://qiita.com/aiorange19/items/5ffaefc85f912f60c2fa></a>
<a>https://www.youtube.com/watch?v=EuNvbyBsTZM&t=179s</a>
[MySQL] 型を変更する方法

#MySQLにログインする
以下で詳しく説明しています。
https://qiita.com/momo1010/items/d72d2d567c0768ce2d0d

#データベースを選択する

```
USE データベース名;
```

#型を変更する

```
ALTER TABLE テーブル名 MODIFY カラム名 新しい型
```

`NOT NULL` の場合は以下です。

```
ALTER TABLE テーブル名 MODIFY カラム名 新しい型 NOT NULL;
```

#変更できたか確認する

```
DESCRIBE　テーブル名;
```
アジャイルサムライの個人的まとめ

# おことわり
書籍『[アジャイルサムライ](https://www.amazon.co.jp/%E3%82%A2%E3%82%B8%E3%83%A3%E3%82%A4%E3%83%AB%E3%82%B5%E3%83%A0%E3%83%A9%E3%82%A4%E2%88%92%E9%81%94%E4%BA%BA%E9%96%8B%E7%99%BA%E8%80%85%E3%81%B8%E3%81%AE%E9%81%93%E2%88%92-Jonathan-Rasmusson/dp/4274068560/ref=sr_1_1?dchild=1&keywords=%E3%82%A2%E3%82%B8%E3%83%A3%E3%82%A4%E3%83%AB%E3%82%B5%E3%83%A0%E3%83%A9%E3%82%A4&qid=1610798808&sr=8-1)』を読んで、自身の理解を補足するために書いた要約(しようと思った)記事になります。概ね自分用です。

# 本記事について
著作権的にどうなんだと思ったので、一度内容は削除しました。
本を読んだ場合と同等の情報が得られる場合は、著作権法に違反している可能性があるためです。
Rubyメモ

#Ruby‐ハッシュについて‐

変数名＝｛シンボル：値１,シンボル：値２｝
puts 変数名［：シンボル］

```ruby:qiita.rb
cat = {name: "siro", age: 23}
put cat[:name]
```

jsと似ているが出力の表記が違うので注意！:smile:
[JavaScript] たのしいタグ付きテンプレート文字列

# これはなに？

[タグ付きテンプレート文字列](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Template_literals#tagged_templates)で色々遊んでみる記事です。

# タグ付きテンプレート文字列とは？

文字列と言っていますが、文字列と言うよりは、関数の呼び出しかたです。

例えば、ある関数があったとしまして

```js
function myFunc(){}
```

普通はこのように呼び出しますが、

```js
myFunc();
```
このように呼び出すことを、タグ付きテンプレート文字列と言います。

```js
myFunc``
```

ここで使用した関数を特別にタグ関数と言います。

# タグ関数に渡される引数

タグ関数に渡される引数は、文字列をパースした結果になります。

第1引数は配列です。式以外の部分文字列が入っています。
第2引数以降は可変長です。式を評価した結果になります。

実際にどのような引数が渡されるのか確認するために、このような関数を定義しました。

```js
function myTag(strings, ...keys) {
  console.log('strings = ', strings);
  console.log('keys = ', keys);
}
```

呼び出してみます。

```js
myTag`abc`;
/* 結果 :
strings = (1)["abc"]
keys = (0)[]
*/
```

```js
myTag`Java${100}Script`;
/* 結果 :
strings = (2)["Java" ,"Script"]
keys = (1)[100]
*/
```

```js
myTag`pl ${1 + 1} mu ${2 * 2} di ${3 / 3}`;
/* 結果 :
strings = (4)["pl " ," mu " ," di " ,""]
keys = (3)[2 ,4 ,1] 
*/
```

# 組み込み関数をタグ関数として使ってみる

こんなこともできますが、意味はないですねww

```js
parseInt`abc`
// 結果 : NaN

parseInt`010`
// 結果 : 10

encodeURI`\n`
// 結果 : '%0A'
```

# 色々な値を返すタグ関数

タグ関数はただの関数なので、Promiseを返したり、関数を返したりもできますね。


意味なくPromise返してみたり。

```js:
function myTag(strings) {
  return new Promise((resolv) => {
    resolv(strings.join('|');
  })
}
```

```js
myTag`a${0}${1}b`.then(console.log);
// 結果 : 'a||b'
```

関数を返してみたり。

```js
function myTag(strings) {
  return function(d) {
    return strings.join(d);
  }
}
```

```js
console.log(myTag`a${0}${1}b`('---'));
// 結果 : 'a------b'
```

# おまけ : TypeScriptでタグ関数を定義する

引数を`TemplateStringsArray`にします。

```ts
function myTag(strings: TemplateStringsArray, ...keys: Array<any>): any {
  // (snip)
}
```
【初心者向け】heightに%が効かない時に確認するポイント

# どうも7noteです。heightに%を使っても効かない理由


heightに%（相対値）を使用しても効かない原因、それは・・・

***「基準となる要素の高さが絶対指定設定されていないから」***


「%」は相対指定となります。そのため**基準となる高さがなければ指定しても効かないのです。


## 「height」に%を使う方法

```index.html
<div class="oya">
   <p>高さに%を使うよ</p>
</div>
```

```style.css
.oya {
  height: 100px;         /* 高さを指定 */
  border: solid 1px #000;/* 1pxの線を引く */
}

p {
  height: 50%;           /* 高さを指定 */
  background: #CCC;      /* 背景色を入れる */
}
```
![sample.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661092/a8bfb641-6dc4-5787-80d2-0f98851ba0c2.png)

親要素のdivが100px。
それに対しての50%なので、50px分がp要素の高さになります。

## 基準になる高ささえあれば親要素に高さが指定されてなくてもよい

```index.html
<ul>
  <li>
    あああああああああああああああああああああああああああああああああああああああああああああ
  </li>
  <li>
    あああああああああああああああああああああああああああああああああああああああああ
  </li>
  <li>
    <p>高さに%を使うよ</p>
  </li>
</ul>
```

```style.css
ul {
  display: flex;         /* フレックス要素にする */
  border: solid 1px #000;/* 1pxの線を引く */
}

ul li {
  width: 200px;          /* 横幅を指定 */
}

p {
  height: 50%;           /* 高さを指定 */
  background: #CCC;      /*  */
}
```

![sample2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661092/314a4612-22d6-b4b5-0c52-75dc1f60b680.png)

この例だと、pタグの親には何も高さを指定するものがないですが、**flexboxは横並びにしたものの高さを揃える**特徴があるので、他の要素で高さを指定していなくても、heightに%を指定することができます。

## 100vhで画面高さいっぱいを指定できる

もし画面全面に出したい時などは100vhを使えば%を使わなくても可能です。

```style.css
/* 画面いっぱいのサイズにする */
div {
  width: 100vw; /* ウィンドウ幅いっぱい */
  height: 100vh /* ウィンドウ高さいっぱい */
}
```

## まとめ

widthと同じ要領でheightを指定しがちなのですが、実際には効かない場合があります。
「おや？効いてるかな？」と思ったら、背景色を一時的に入れる等でチェックすることをおすすめします！

#### おそまつ！
~ Qiitaで毎日投稿中!! ~
[【初心者向け】WEB制作のちょいテク詰め合わせ](https://qiita.com/7note)
【Android】CLEARTEXT communication to xxxxxx.com not permittedが出た時

APIをRetrofitを使い取得しようとしたときにエラーになったのでメモ

>CLEARTEXT communication to xxxxxxx.com not permitted by network security policy

http通信が許可されていないことからこのエラーになる。

## Manifestにandroid:usesCleartextTraffic="true"を足す

 ```xml
 <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.SimpleRetrofit"
        //下記を足す
        android:usesCleartextTraffic="true"
        >
 ```

これで通信許可ができるはず。
Web APIの種類を解説

Web APIについて勉強したことを書いていくpart1
今日はWeb APIの種類について

# Web APIの種類
Web APIには大きく分けて３つの種類（パブリック、プライベート、パートナー）がある
この３つのWeb APIについて解説する

## パブリックAPI
パブリックAPIは、書いて字のごとく公に公開され問い合わせできるAPIのこと
自身でロジックなどを考えずに一定の機能が使えてとても便利！！！
例
[Twitter API](https://developer.twitter.com/en/docs/twitter-api)
[Google Sheets API](https://developers.google.com/sheets/api/reference/rest/)

## プライベートAPI
プライベートAPIは、各個人、企業などが構築したAPIで公に公開されていないAPIのこと
特定のWebアプリケーション専用のAPIなどがプライベートAPIに当てはまる
公に公開されていないので例が出せない。。。。

## パートナーAPI
パートナーAPIは、一応プライベートAPIだけど、ほぼパブリックAPIなAPIのこと
業務経験がある人は想像しやすいと思うが、提携企業のみに公開しているAPIがパートナーAPIに当てはまる
こちらも公に公開されていないので例が出せない


# 参考
- [Web APIの設計](https://www.amazon.co.jp/API%E3%81%AE%E8%A8%AD%E8%A8%88-Programmers-SELECTION-Arnaud-Lauret/dp/4798167010)
- https://hisaichi5518.hatenablog.jp/entry/2014/12/11/124811
- Qiita記事：[個人でも使える！おすすめAPI一覧](https://qiita.com/mikan3rd/items/ba4737023f08bb2ca161)
GCPでubuntuを使えるように設定する方法

スマホでubuntu使えたらなーと思い調べたらできるようになったのでメモです。
・GCEでubuntuを選んでSSHで起動する
・リンク先の方法でデスクトップGUIを構築していく
https://medium.com/anti-pattern-engineering/gcp%E3%81%A7ubuntu-desktop%E3%81%AE%E7%92%B0%E5%A2%83%E3%82%92%E4%BD%9C%E3%82%8A-%E5%BE%93%E9%87%8F%E8%AA%B2%E9%87%91%E5%88%B6%E3%81%AEgui-pc%E3%82%92%E4%BD%9C%E3%82%8D%E3%81%86-fda25fefd845
・スマホアプリでMicrosoft Remote Desktopをインストール
・GCEの外部IPを入力して接続
・ログインしてうubuntu画面が出ると何か聞かれるけどキャンセル

これで使える。
ただ、回線速度によっては凄く使いづらい。。。
termuxアプリでlinux

# 最初に
アンドロイドアプリtermuxを使うとlinuxコマンドが打てるので使ってみた。
まず最初にこれ打っておくと使いやすくなる。
termux-setup-storage
# できたこと
- apt get update
- apt get upgrade
- pip install --upgrade pip
- pip install pandas
- pip install numpy
- pip install matplotlib
# できなかったこと
- pip install tkinter
下記が参考になる。
https://www.google.com/amp/s/www.lisz-works.com/entry/termux-init%3famp=1

# アップデートでエラーが出る（2021年5月以降）
以下の記事が参考になる。
- https://hack.gpl.jp/2021/06/01/termux-pkg-update-error/
- https://qiita.com/jan_pali_1212/items/8658cab554b619a32371
動きながら動画を再生するPGM(python版)

以前JavaScriptで作った動いているとyoutube上の動画をコマ送りで動かす
もののpython版を作りました。これはすでにダウンロードされた動画を動いている間だけコマ送りで再生します。(オフライン上で動作)

<hr>
サンプルPGM
githubURL:https://github.com/NanjoMiyako/WalkingAndMovie_python

<hr>
使い方

コマンドプロンプトから当該PGM(WalkingAndMovie.py)に以下のコマンドライン引数を
入力して実行します。
コマンドライン引数1: 再生する動画ファイルパス
コマンドライン引数2: 動画変化を判定する際の差分率(例:5%の時'5.0')

<hr>
スクリーンショット
![shot1.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412430/fef9375e-9855-0994-1f3d-988ab8562d17.jpeg)
[新歓時期大活躍・API不使用]コードで書かないGoogleSpreadSheet（Twitterの特定の言葉を自動で一覧化する方法）

いよいよ、新歓時期というものがやってきますね🌞

新歓時期になると１回生がこぞって『#春から〇〇』と呟きますよね！
これを毎回毎回検索して、**いいね**するのがめんどくさいと思う皆さんのために、
今回はコードを使用しない方法でQiitaを書いていきたいと思います！

####`今回すること`
<img width="600"alt="pic1" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407730/bf19d2c0-0a4b-192a-45d3-592619017e79.png">

いくつかの**#（ハッシュタグ）**のものを１つのスプレッドシートに自動で記入する方法を
API不使用でやっていきます


##準備編
・スプレッドシートを作成
##実践編

<img width="500"alt="pic1" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407730/7e36fa9d-2456-83cd-d081-9502206174c8.png">

1.**[アドオン]**　→　**[アドオンを取得]**　→　**["Tweet Archiver"と検索]**

<img width="500"alt="pic1" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407730/867838ef-94a5-fd03-bf4c-0d6a1292e379.png">

2.**[アドオン]**　→　**[Twitter Archiver]** → **[Create Rule]**

<img width="500"alt="pic1" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407730/05af439e-6ced-be6e-28c7-591bbcb1e442.png">
 #hashtag　の所にいくつか#を入れる　（ex;#春から〇〇大学 #春から〇〇学部)

３.Twitterと連携する

４.完成✨
<img width="600"alt="pic1" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407730/bf19d2c0-0a4b-192a-45d3-592619017e79.png">

後はツイートIDの所を押すとツイートに飛びます👍

##最後に
A欄を増やして、**　[挿入]**　→**　[チェックボックス]**　でチェックスボックスの欄を設けると、何回も同じツイートに覗きに行くことを避けれます🙆‍♀️

また、『none of these words』に特定の不要な言葉（宣伝文句等）を入れると自動で引っ張って来られないので使ってみてください！

＊無料版は1h事に更新されます。
超初心者のプログラミング by Unity part0

##はじめに
Unityというものでゲームがつくれるらしいと知った俺。
「神ゲーつくってやるぜー!!!」と意気込む俺。
そんなに簡単なことではないと知る俺
Unityのプログラミングはここからはじまった…

##Part0
Unityをインストールしました。
unityダウンロードページ
https://unity3d.com/jp/get-unity/download

##次回
適当にチュートリアルをする