OmniAICreator/Qiita-1.07M huggingface dataset:
Kubernetes ターゲットマシンが接続を拒否した時の対処法

# 環境
Windows10 Home
Docker Desktop for Windows 3.4.0
Docker v20.10.7

# 発生した問題
`kubectl get nodes`を実行すると以下のエラーが発生

```
Unable to connect to the server: dial tcp [::1]:8080: connectex: No connection could be made because the target machine actively refused it.
```

# 対処法
結論、kubernetesが起動していないだけでした。Docker Desktopからkubernetesを起動してあげれば解決です。

Docker Desktopを起動 > `Settings` > `Kubernetes`
<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344018/0d4fc8cd-b5a5-37a4-a9ac-33570cb4f03b.png' width=600 />
`Enable Kubernetes`にチェックを入れて、右下の`Apply & Reset`ボタンを選択
<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344018/1f6c1d50-e510-d783-c855-74d76e0601f4.png' width=600 />
%runで実行するノートブックではセル数を少なくすべきという話

## 概要
Databricksにて開発を行う際に、効率的なコードが開発を行うためにコンポーネント化したノートブックを%runにより呼び出す方法がベストプラクティスの１つなのですが、そのノートブックにおけるセル数を少なくする方がよさそうです。

%runにより実行するノートブックにてセル数を増やすことで、実行時間も長くなり、下記により謎のスペースが生成されてしまうためです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/9e65e20e-418e-6383-1592-c56ef3f8563a.png)

謎のスペースを削除する方法を、現時点では、確認できておりません。

## 確認方法
includes配置にて、下記のノートブックを%runで実行しました。

| #    | ノートブック           | 内容                          |
| ---- | ---------------------- | ----------------------------- |
| 1    | %run ./includes/def_10 | 1セルに1関数を保持            |
| 2    | def_10                 | 10セルにそれぞれ１関数を保持  |
| 3    | def_100_in_one_cell    | 1セルに100関数を保持          |
| 4    | def_100                | 100セルにそれぞれ１関数を保持 |

その結果が、下記となります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/9e65e20e-418e-6383-1592-c56ef3f8563a.png)


## サンプルノートブック
下記のパスに配置してありますので、インポートしてmainのノートブックを実行してご確認ください。

```url
https://github.com/manabian-/databricks_tecks_for_qiita/blob/main/tecks/whte_space_created_when_run/dbc/space_test.dbc
```
Rails ActiveRecord Transactionで例外発生時、Rollbackされない問題

# 概要
ActiveRecord Transactionであれば、処理途中で例外が発生した場合は
それまでのinsert、updateをロールバックしてくれると思っていましたが、
書き方によってはロールバックされないことがあるので、
ロールバックされる・されないパターンを整理してみました。

# 開発環境
* Ruby 2.6.5
* Rails 5.2.6

# ActiveRecord::Base.transaction
## ロールバックされない書き方
```ruby
  ActiveRecord::Base.transaction do
    user = User.find_by!(name: 'テスト太郎')

　　　　　　　　# nameカラムを更新
    user.update!(name: 'テスト太郎更新')

    # Integer型のageカラムにStringを設定
    user.update!(age: 'Invalid Value')
  end
  rescue StandardError => e
    puts '例外エラーが発生しました。'
  end
```
Integer型のageカラムに 文字列を入れてupdateしたことで例外が発生、
`例外エラーが発生しました。` メッセージが出力されるが、
User nameのupdateはロールバックされず、　nameは`テスト太郎更新`　に更新される。


## ロールバックされる書き方
```ruby
begin
  ActiveRecord::Base.transaction do
    user = User.find_by!(name: 'テスト太郎')

　　　　　　　　# nameカラムを更新
    user.update!(name: 'テスト太郎更新')

    # Integer型のageカラムにStringを設定
    user.update!(age: 'Invalid Value')
  end
rescue StandardError => e
  puts '例外エラーが発生しました。'
end
```
Integer型のageカラムに 文字列を入れてupdateしたことで例外が発生、
`例外エラーが発生しました。` メッセージが出力される。
user nameのupdateはロールバックされ、　Userテーブル.nameカラムは更新されず、`テスト太郎`　のままになる。


# 感想
Railsを使い始めた頃、これにハマって
ロールバックのテストが通らず、何時間も無駄にしてしまったことがありましたが、
同じチームメンバーがこれにハマっていたのを見て
簡単に書いてみました。
【ざっくり解説】CapistranoでプライベートなGemをインストールする

## 問題点
Capistranoを使ってRailsアプリケーションをデプロイしていたところ、
プライベートリポジトリのGemをインストールしようとした際にエラーが発生。

```
01 fatal: could not read Username for 'https://github.com': No such device or address
01 fatal: could not read Username for 'https://github.com': No such device or address
01 fatal: could not read Username for 'https://github.com': No such device or address
01 fatal: could not read Username for 'https://github.com': No such device or address
```
ユーザー名・パスワードがないため、プライベートリポジトリを参照できない模様。
[こちらの記事](https://blog.hatappi.me/entry/2017/04/27/231357)や[bundlerのドキュメント](https://bundler.io/v1.14/man/bundle-config.1.html#CREDENTIALS-FOR-GEM-SOURCES)を参照するも、結果は変わらず。

## 解決法
### 手順①環境変数を設定する
```shell:bash_profile
export BUNDLE_GITHUB__COM=username:password
```
ここまでは[bundlerのドキュメント](https://bundler.io/v1.14/man/bundle-config.1.html#CREDENTIALS-FOR-GEM-SOURCES)を読めばOK。

### 手順②Capistranoに環境変数を持たせる
```ruby:deploy.rb
set :default_env, {
  BUNDLE_GITHUB__COM: ENV['BUNDLE_GITHUB__COM']
}
```
私の場合はここが抜けていた模様。
上記２点を記述することで、無事に**プライベートリポジトリのGemをインストール**できました。

## 余談

「なんでわざわざ環境変数渡さなきゃならんのだ…」とボヤいていると、Capistranoのドキュメントにこんな一文が。

**By default Capistrano always assigns a non-login, non-interactive shell.**
(直訳：Capistranoは常に非ログイン・非対話型シェルを割り当てます)

どうやら、Shellの起動方法には幾つかの種類があり、Capistranoはその中から`non-interactive`を割り当てるようです。
`non-interactive Shell`は`~/.bash_rc`や`~/.bash_profile`を読み込まないため、単に環境変数を記述したところで意味がない様子。

default_envに環境変数を渡すことで、SSHKitに環境変数を持たせているそう。SSHKitについてはよくわかっていないので、今後深堀ってみようと思います。

## 参考にした記事・ドキュメント
- [Why does something work in my SSH session, but not in Capistrano? - Capistrano](https://capistranorb.com/documentation/faq/why-does-something-work-in-my-ssh-session-but-not-in-capistrano/)
- [Credentials For Gem Sources - bundler docs](https://bundler.io/v1.14/man/bundle-config.1.html#CREDENTIALS-FOR-GEM-SOURCES)
- [Rails初心者がハマったCapistranoの環境変数](https://tech.dely.jp/entry/2019/12/16/070000)
- [PrivateGemをCapistranoでbundle installする](https://blog.hatappi.me/entry/2017/04/27/231357)
- [bashの.profileや.bashrc等を実行する動作仕様](https://blog.hatappi.me/entry/2017/04/27/231357)

問題解決にあたり上記の記事・ドキュメントを参考にさせていただきました。誠にありがとうございました。　
貴重なドキュメントを残してくださる先人の皆様に心より感謝と尊敬を。
ECSで今起動しているタスクを指定してコンテナにexecute-commandするシェル


### 内容

```bash
#!/bin/bash

ENV=$1
CONTAINER=$2
COMMAND=$3
TASKID=$(aws ecs list-tasks --cluster cluster-${ENV} --service-name ${ENV}-service | jq -r .[][0])
aws ecs execute-command --cluster cluster-${ENV} --task ${TASKID} --container ${CONTAINER} --interactive --command ${COMMAND} 
```

### 利用方法

```bash
./bin/connect_container dev web /bin/sh
```
量子コンピュータの実力と過熱評価 - 組合せ最適化問題に関する水面の上と下

**この記事は令和3年7月に書いています。あくまで執筆現在の業界周辺事情ですのでお含み置きください。**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/e881c731-8612-ce3c-acad-18df9c6f5301.png)


近年、と言ってもここ1,2年ほど、世界中で量子コンピュータ関連のニュースが躍動し、まるで量子コンピュータは神、これまでのコンピュータ(古典コンピュータと呼びます)は全く歯が立たずお払い箱、というような捉え方をされている場面を見ることがあります。

ところが、実際のところはそうではありません。
水面上の景色はとても美しく描かれていますが、水面下に潜ってみると、水面上の世界とは事情が異なる世界が見えてきます。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/f841824f-3972-c48d-7956-1d81dc25d198.png)


組合せ最適化問題を専門に研究されている、tasusuさんという方が興味深い記事を書かれていましたので、ぜひご紹介したいと思います。

**「量子」と組合せ最適化に関する怪しい言説 〜とある研究者の小言〜**
https://tasusu.hatenablog.com/entry/2021/07/03/131243

この記事の内容は、技術の進歩や周辺情勢変化により、実情と内容が合わなくなる可能性があります。
また、リンク先の紹介記事が必ず閲覧できる保証も致しませんので、ご了解頂けますようお願い申し上げます。
MacのSQL DeveloperからDockerのMySQLサーバへ接続する。

目的
mac上でのSQLのテスト環境を構築する際に参照したwebサイトのリンク集。


#MacにDocker インストール

次のリンクを参考に、brewでインストールした。

https://qiita.com/normalsalt/items/9c10b2e046a5c103f626


#DockerにMySQLインストール

https://qiita.com/TAMIYAN/items/ed9ec892d91e5af962c6#docker-compose-使用

上記リンクの手順をそのまま実施したがmac側から接続できなかったため、次の設定を実施した。


https://qiita.com/nakaji0210/items/85297d8a0fac9cac4f33


クライアントからはrootで接続できないとのことなので、Docker-Compose.ymlを少し変更し、ユーザ"user"を作成するようにした。
(xxxxにはパスワードを指定する)

```Docker-Compose.yml
version: "3"
services:
  mysql:
    build: ./mysql/    #Dockerfileからビルドすることを示す
    ports:
      - 3306
    volumes:
      - ./mysql/db:/docker-entrypoint-initdb.d  #初期データをマウントする場所
    image: original_mysql_world # イメージの名前
    environment:
        MYSQL_DATABASE: test_db
        MYSQL_USER: user
        MYSQL_PASSWORD: xxxx
        MYSQL_ROOT_PASSWORD: xxxx
```


#MacにJavaインストール


brewでopenjdk@11をインストールした。

https://qiita.com/ponsuke0531/items/9be8dee67a91c6c78d4f#java11をインストールする


#MacにSQL Developerインストール

SQL DeveloperをOracleからダウンロード。

https://www.oracle.com/jp/tools/downloads/sqldev-downloads.html

SQLDeveloper.appは署名がなくそのままでは起動できないため、システム環境設定から"セキュリティとプライバシー"を起動し、実行を許可した。


MySQLのJDBCドライバをダウンロード。Select Operating System:には"Platform Independent"を指定。

https://dev.mysql.com/downloads/connector/j/

ダウンロードしたZIPファイルを"~/Applications/mysql-connector-java-8.0.25"に展開した。



SQL Developerを起動し、"Preferences..."からデータベース: サード・パーティJDBCドライバを開く。
エントリの追加から"~/Applications/mysql-connector-java-8.0.25/mysql-connector-java-8.0.25.jar"をフルパスで指定する。



#SQL DeveloperからMySQLに接続

SQL Developerで、データベース接続の作成/選択で次の設定を入力しテストボタンをクリックする。

```
Name: mysqlserver
データベースのタイプ: MySQL
ユーザー名: user
パスワード: xxxx
ホスト名: localhost
ポート: (Docker Desktopに表示されているポート番号を入力)
データベースの選択: test_db
```

エラーが表示されなければ接続ボタンをクリックする。
Next.js での画像の取扱について(背景に画像を設定する方法や外部 URL から画像を引用する方法にも触れています)






# 初めに~~~~

自分の学習メモです
随分と時間がかかったので同じ内容で検索している方ように載せておきます
他でもこの文章は使い回しするかもしれません
間違えなどあればご指摘いただけると幸いです

# img タグではなく Image タグを使う

Next.js には next/image というツールがあり  
これを使うことで画像を自動でリサイズしてくれる  
画像自体のサイズが大幅に下がるのでレンダリングも早くなる

# 事前準備

```js
import Image from 'next/image';
```

Image タグを使うページで宣言する

# public フォルダから画像を引用する

public フォルダに sample.jpeg というファイルを置き参照する  
尚、public フォルダを参照するのは next.js が`Static File Serving`という機能を持っているからである  
next.js では public フォルダ下にあるデータは'/'で参照できるようになるということ

[参考サイト](https://nextjs.org/docs/basic-features/static-file-serving)  
[日本語版](https://nextjs-ja-translation-docs.vercel.app/docs/basic-features/static-file-serving)

```js
// index.js
<Image
  src="/sample.jpeg"
  layout="fill"
  // width={500}
  // height={500}
/>
```

- src 属性（プロパティ）は必須
- layout 属性は width と height 属性でも可能（どちらか片方は必須）

# 外部 URL から画像引用する場合

next.config.js を設定し、関数で呼ぶ必要がある

```js
// next.config.js
module.exports = {
  images: {
    domains: ['example.com'],
  },
};
```

と、設定する  
外部 URL 画像は[こちら](https://jungle-time.com/fox-picture-2126/)のフリー素材から借りた  
今回は

> https://jungle-time.com/wp-content/uploads/2018/03/red-fox-2230730_1280.jpg

という URL 画像を参照して解説する

```js
// index.js
const foxImage = () => {
  return `https://jungle-time.com/wp-content/uploads/2018/03/red-fox-2230730_1280.jpg`;
};
```

と、画像を引っぱてきて

```js
// index.js
<Image
  loader={foxImage}
  src="fox"
  layout="fill"
  // objectFit="cover"
  // width={500}
  // height={500}
/>
```

とすると反映される  
なお、

- loader 属性(プロパティ)は必須
- src 属性は必須
- layout 属性の代わりに width と height 属性でも可能
- object-fit 属性は任意

[object-fit とは？](https://developer.mozilla.org/ja/docs/Web/CSS/object-fit)

# 背景画像を設定する場合

上記で既に示しているが

```js
// index.js
<Image
  loader={foxImage}
  src="fox"
  layout="fill"
  objectFit="cover"
  //
/>
```

または

```js
<Image
  src="/sample.jpeg"
  layout="fill"
  objectFit="cover"
  //
/>
```

外部 URL で引いてくる場合でも public フォルダ参照でも  
上記のようにすると背景になる

参考サイト
https://nextjs.org/docs/api-reference/next/image
https://www.forcia.com/blog/001561.html
https://dev.to/dolearning/importing-svgs-to-next-js-nna
https://medium.com/eincode/how-to-use-next-js-image-component-dfbf3725b12
https://nextjs.org/docs/api-reference/next/image
社内SEで必要なスキル一覧


#社内SEで必要とされる知識

大手企業の社内SE枠に新卒として入社して3年目になり、会社の全体像が見えてきました。
「何か記事を書きたいなー」と思ったのと、キーワードプランナーで社内SEの概要があるにもかかわらず、
実体験の執筆はなかなか少ないように感じたので記事を作成しました。
（個人のブログに移す日が来るかもしれない）
個人の経験に基づいて社内SEで必要とされる知識について11項目選定いたしました。


#企業のスペック
企業名：言えない
場所：東京某所
主な業種：言えない
開発あるなし：あり
社員の人数：いっぱい
エンジニアの人数：いっぱい

色々言えないこと多いけど、要はデカめな企業のシステム部門ということです。
企業のスペックについては以上。
（質問してくれたら答える。かもしれない。）


それではマイル。


##ブラインドタッチ:star::star::star::star:
ブラインドタッチについて、多くのプログラマー・エンジニアが必要か、必要でないかの論争はいまだに存在し、決着がついていないのは事実です。

ですが、社内SEの現場においてはおそらくほとんど決着はついてます。
答えは、__必要あり__です。

なぜ必要かと言いますと、
__周りが全員ブラインドタッチができる__からです。
全員ブラインドタッチで高速タイピングをしているところで人差し指オンリーでタイピングしているとかなり目立ちます。
また、多くの情報が飛び交い、社内の人間の要望に素早く応える環境に適応するためにはチャットでの高速タイピングは必要不可欠です。

早めに練習しておきましょう。


##プログラミング:star::star::star:
プログラミングが必要かどうかは会社の方針によることが多いと思います。
ちなみに私が勤めている会社はプログラミング能力必須です。

おそらく読者の中には開発は全て外部に任せて、その開発過程がうまくいっているかどうか確認する会社に勤めている人もいます。
また、サポートデスクのように、開発を行うというよりは社内のPCの困りごと解決のような部署で働いている人もいるでしょう。

そういった方々であればプログラミング能力が必要でない可能性もありますが、ここでは自社の話に焦点を絞っておきます。（他社はどうなんだろう？教えて詳しい人）

さて、自社はプログラミング能力は求められておりますが、__実際に書いているわけではないです__
コードを書いている割合は1/4程度であとは外部の人たちに任せることが多いです。

なぜ書けるのに書かない人がいるのかというと、
それは単に__時間がない__からです。
なぜ時間がないかというと、たくさんのプロジェクトを同時並行で推進しているからです。

優秀な人たちの一つのプロジェクトにかける時間をなるべく少なくし、同時並行で別のプロジェクトに時間を割く方が会社の効率は良いということでしょうか。（3年目のちんちくりんにはわからない教えて詳し人）

じゃあプログラミング能力いらないじゃんってことになりそうですが、
かける人がマネジメントした方が、プロジェクトを推進する上で協力会社の信用を得やすいので、
その方が結果的に有利なことが多いです。

ちなみに自分はガリガリコードを書いている方の人です。
ハヤクマネージャーナリタイ

どんな言語が必要かは別の記事を作成しようと思います。
(主にJavaですけども)


##コミュニケーション能力:star::star::star::star::star:

言わずもがな。
エンジニア業界に限らず、全ての業界に言えることですが、
特にこの業界でさらに社内SEとなると、
__一般人(社内の非SE)の言いたいことを察する理解力・洞察力__と
__システムについて一般人(社内の非SE)に説明できる能力__が必要とされると思われます。

この能力はとても重要で、
一般人はよく「このシステム一日で作れないの？」とか平気な顔で言ってきます。
それを__なぜ一日で作って欲しいのか__を察した上で、__なぜできないのか__を説明しなければなりません。



#以下は、ハードスキルについて

##エクセル:star::star::star::star:
はい、めちゃくちゃ必要です。
弊社ではアホみたいに使用します。
「そのタイプの資料なら、パワーポイントの方が表現力豊かだしその方が良くね？」なんて言ってはいけません。

例えばマニュアルの作成ならエクセルよりもパワーポイントの方が表現力が豊かですし、読み物としての能力も高いです。
ですが__頑なにエクセルで通そうとします__。
（理由は不明です...教えて詳しい人）

まぁ普通のIT企業でも設計書とかはExcelで書きますし、
慣れている人が多いからかな...?

vlookupとかsumなどの基本的な関数は必要ですし、
グラフの作成までできると安泰です。

ちなみに__Excel VBAができるとめちゃくちゃ重宝されます__


##パワーポイント:star::star::star:
先ほどエクセルの方がパワーポイントよりも使われると記述しましたが、パワーポイントも同様に使われます。

というか、会社での会議では基本的にオンラインミーティングで行っており、その際の画面の表示には必ずパワーポイントで作成された資料が映し出されています。

パワポでできると良いのは以下の通り
・図形の書式設定
・フォントのサイズ変更
・整った配置
・__デザインセンス__（意外と重要）


##メール作成能力:star::star::star:

これも必要です。
他部署の一般人との会話は社内のチャットなどではなく、主にメールを使います。
（まるで別の会社の人と話をする気分）

また、上司に対して正式な書類を送るときもチャットではなくメールです。
日本の律儀な文化はなかなかメールを捨てきれないようです。

メールで必要なスキルは以下の通り
・敬語を素早く錬成する能力（レスポンス速度が必要）
・各位、敬称略などのメール特有の語彙力

CCで入ってきたメールで上司が「五月雨式（さみだれしき）」なんて言葉を使っている文面を見た時には
「かっこいい...」なんて思ってしまいました。笑


#その他のスキル

・ショートカットキー(あるとスピードが上がる。excelで使うと驚かれる)
・teams,zoomのオンラインミーティングアプリの操作能力

#いらない能力

・英語（誰も使わない。ここにほんですから。）
・飲み会での粋な計らい（そもそも飲み会がない）
ブロック要素の高さ

####現状
  HTMLとCSSを始めたばかり。懸命に見本サイト模倣中

-------------------------------
####問題点
  インライン要素／ブロック要素の区別が曖昧で、高さにつまづきがち

-------------------------------
####覚えるべきこと

・ブロック要素（height:auto)
　　heightの指定がない限り”高さは内包する要素に依存する”
　　※中身の要素に合わせるプロパティ

・display:block／inline-block／table
　　高さ指定可能

・```<ul>```タグはデフォルトで余白がつくので取り除く

　　```ul {
  margin: 0;
  padding: 0;
}```

-------------------------------

参考にしたサイト（https://saruwakakun.com/html-css/basic/width-height）
Docker Desktop、VirtualBox、VMware Workstation Playerを共存させる。

# はじめに
`Windows`でも`Docker`が使用できる`Docker Desktop`が登場して久しいですが、以前は`Hyper-V`機能を使用しないといけないことから`Windows 10 Home`では使用できなかったり、`VirtualBox`等の仮想環境と共存できない等、色々と問題があり以前はインストールを断念した記憶があります。

ただ、最近は`Hyper-V`を有効化しなくてもよくなったことで、`VirtualBox`等と共存ができるようになったようなので、`Windows 10 Home 21H1`に`Docker Desktop`と`VirtualBox`、`VMware Workstation Player`をインストールしたいと思います。

# WSL2のインストール
GUIで設定、確認を行う場合は**[アプリと機能] → [オプション機能] → [Windows のその他の機能]**で表示される以下画面から確認できます。

![capture_30062021_083310.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/8ac72e8a-e213-af99-607f-914707554493.jpeg)

上記の**[Windows のその他の機能]**から選択してインストールすることもできますが、以下インストールガイドの通り、`PowerShell`からインストールしていきます。

手順はほぼ以下の通りです。

- [Windows 10 用 Windows Subsystem for Linux のインストール ガイド](https://docs.microsoft.com/ja-jp/windows/wsl/install-win10)

尚、`PowerShell`は管理者権限で起動するようにしてください。

```powershell:Windows_Subsystem_for_Linux有効化
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
```

```powershell:Virtual_Machine_Platform有効化
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
```

有効化が完了したら上記リンクの[手順 4 - Linux カーネル更新プログラム パッケージをダウンロードする](https://docs.microsoft.com/ja-jp/windows/wsl/install-win10#step-4---download-the-linux-kernel-update-package)に記載されている通り、Linuxカーネル更新プログラムパッケージをインストールします。

上記までで`WSL2`のインストールは完了していますが、再起動が必要となるため、再起動します。

再起動後、以下コマンドで`WSL2`を既定のバージョンとするようにしておきます。

```powershell:WSL2を既定のバージョンとして設定
wsl --set-default-version 2
```

# Docker Desktopインストール
以下のページを参考に、インストーラをダウンロード＆インストールします。

- [Docker Desktop WSL 2 バックエンド](https://docs.docker.jp/docker-for-windows/wsl.html)

# 仮想マシンの起動確認
`VirtualBox`や`VMware Workstation Player`で作成した仮想マシンが起動できるかを確認します。

問題なく起動して操作できればOKです。

# おわりに
`VirtualBox`等の仮想環境と共存できるようになったことからようやく`Linux`機を別に準備しなくてもコンテナ開発ができるようになりました。

私のように`VirtualBox`等と共存ができないため躊躇していた方は、試してみることをお勧めします。
fishを最新にしたらUnknown colorが出るようになった話

3.3.0に上げたら
`set_color: Unknown color '^/dev/null'`
こんなのが出るようになった...

まだ解決策は不明ですがなんとか直したい！
もし同じ現象で悩まされている人いたら情報共有しましょう！
wrong number of arguments (given 0, expected 1..2)のエラーについて

#はじめに

![スクリーンショット 2021-07-05 19.11.26（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1264460/2fb15458-988d-c512-c2ea-cb6823df1bb9.png)

オリジナルアプリ作成中にエラーが出ました。

はじめてみたエラーだったので記録しておきたいと思います。

#エラーについて

投稿系のアプリを作成しており、投稿内容を全て入力した後、投稿するボタンをクリックした時にエラーが発生しました。


### ArgumentError

~~メソッドの引数の数が合っていないときや、引数が空であるときに発生するエラーです。~~

ご指摘頂き訂正させて頂きます。

https://docs.ruby-lang.org/ja/3.0.0/class/ArgumentError.html

>引数の数があっていないときや、数は合っていて、期待される振る舞いを持ってはいるが、期待される値ではないときに発生します。

### wrong number of arguments

引数の数が誤ってますよ！との事です。
1..2か来ると期待されているのに0でしたよ。間違ってますよと問いかけられています。



問題だと思った箇所

```review_controller.rb
params.require(:review).permit(:faclity_name, :hotel_type_id, :grade_id, :season_id, :region_id, :student_count_id, :price, :text, :safety, :images).merge(user_id: current_user.id)
```


![スクリーンショット 2021-07-05 19.26.25（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1264460/a8d52f5c-e848-63ff-ba31-2091feeff0bc.png)

parameterの所を確認した所、imagesがありませんでした。
記述はしっかりされているのに。。。

#結論

ストロングパラメーターの書き方に問題がありました。

```.rb
images: []
```

画像の配列を受け取れるようにしないといけませんでした。
GitLab(オムニバス版)でPlantUMLを有効化する方法

なぜかGitLab公式の通りに設定してもうまくいかなかったので、試行錯誤してうまくいった方法です。

### 実行環境

私の環境は以下の通りです。

- Ubuntu 18.04.5
- GitLab-ce 14.0.1 (Omnibus版) 
  ※Dockerを使わず直接`apt install`しています。

## PlantUML ServerをDockerで起動

まずPlantUMLは描画用のWebサーバーを立てないといけないので今回はDockerを使用します。
コマンドは以下です。

`sudo docker run --restart=on-failure:10 -d --name plantuml -p 8085:8080 plantuml/plantuml-server:tomcat`

`--restart=on-failure:10`としているのは、うちのサーバーは定期的に落としているので、再起動時にDockerサービスが上がったタイミングで一緒にコンテナも起動してもらう様にする為です。

ポート番号`8085`は好きな番号で構いません。

## GitLabの設定ファイル

オムニバスパッケージ版ではおなじみの`/etc/gitlab/gitlab.rb`に追記を行います。
以下を追記してください。

`nginx['custom_gitlab_server_config'] = "location /-/plantuml { \n rewrite ^/-/plantuml/(.*) /$1 break;\n proxy_cache off; \n proxy_pass http://localhost:8085; \n}\n"`

その後忘れずに`sudo gitlab-ctl reconfigure`を実行します。

### 解説

公式では以下となっています。

```
# Docker deployment
nginx['custom_gitlab_server_config'] = "location /-/plantuml/ { \n    proxy_cache off; \n    proxy_pass  http://plantuml:8080/; \n}\n"

# Built from source
nginx['custom_gitlab_server_config'] = "location /-/plantuml { \n rewrite ^/-/(plantuml.*) /$1 break;\n proxy_cache off; \n proxy_pass http://localhost:8080/plantuml; \n}\n"
```

Dockerだから上だろと思って設定したら、GitLabにアクセス出来なくなるという罠が待っていました・・・
`plantuml`の部分が悪いと思い`localhost`に変えると、今度はちゃんと接続はできるけど、Docker内のtomcatにアクセス拒否を喰らいます。

というわけで下をベースに一部修正を行います。
公式と異なる部分は２点です。
`plantuml/(.*)`
`http://localhost:8085`

何をしているかざっくり説明しますと、
指定した条件にマッチするURLでアクセスした時にDocker内のwebサーバーにプロキシする様にしています。
例えば`https://mygitlab.com/-/plantuml`にアクセスすると、`http://localhost:8085`にプロキシします。
この時、URLパラメータを正規表現で`^/-/plantuml/(.*)`から`/$1`に置き換えています。$1は置換前文字列の括弧の中を意味するので、`^/-/plantuml/`の部分を消しているんですね。
`https://mygitlab.com/-/plantuml/png/ABCDE`というURLは`http://localhost:8085/png/ABCDE`になります。

`plantuml/`がいらないというところがミソです。

## GitLab Admin AreaでPlantUMLを有効化

GitLabからAdminエリアに入って、（日本語の場合）設定→一般→PlantUMLからURLに、`https://mygitlab.com/-/plantuml/`を設定します。
（`mygitlab.com`はご自身のサーバーURLを入れる）

これで、GitLab内でPlantUMLが描画される様になります。
doxygen

doxygenについて調べたときに参考になった記事

#第1位
https://qiita.com/t13801206/items/a411af33475af36d2a14
#第2位
https://qiita.com/yuta-yoshinaga/items/84887a89f6a21a7dcfd5
#第3位
https://qiita.com/harumo11/items/c51228fba7879144e12c
#その他
https://qiita.com/wakiguchi/items/ae81ddd15d2dbb18d12c
https://qiita.com/wakaba130/items/faa6671bd5c954cb2d02
https://qiita.com/shu1rou/items/e1aff8ad98efb5f2f775
https://qiita.com/kazto/items/8775f457e66643660a53

いつもわかりやすい記事ありがとうございます。
Ruby 　クラスとインスタンス学習まとめ

# クラスとインスタンス
Rubyにはあらかじめ決まった値が設定されています。
例えば、文字列や配列、ハッシュ等のことですが、独自に値を作ることができ、そのために必要な概念がクラスとインスタンスです。
値は種類ごとに使用できるメソッドが異なっており、文字列に対しては、このメソッド、数値に対してはこのメソッドといった具合にルールが決められています。
このような共通のルールを作成するのに「クラス」を使用します。
この共通したルールを元にして実体（値、データ）を作成していく、つまりはこの実体がインスタンスと呼ばれるものです。

なぜ、クラスが必要なのか
それは、共通の部分を再利用していくことができるからです。

####クラスとインスタンスの生成

```ruby
class Takoyaki

end

hokuhoku = Takoyaki.new
```

Takoyakiというクラスを定義し、Takoyakiの実体（インスタンス名:hokuhoku）をnewメソッドで作成しています。
Takoyakiという設計図の中身は何も有りませんが、これに様々なルールを追加してやることで、実体のhokuhokuに味を加えていくことができるのです。

# クラスメソッドとインスタンスメソッド

独自に作成した値（データ）にはそれぞれ、動作（メソッド）を定義することができます。
メソッドにはクラスメソッドとインスタンスメソッドの２種類が存在します。

まず、インスタンスメソッドですが、クラスの中に普通のメソッドのように定義してやります。

```ruby
class Takoyaki

def takoyaki_create
end

end

hokuhoku = Takoyaki.new
hokuhoku.takoyaki_create

```

これで、Takoyakiクラスの中に、takoyaki_createというインスタンスメソッドが作成できました。
これで、hokuhoku.takoyaki_createと記載することで、インスタンスメソッドを呼び出すことができるようになります。

# インスタンス変数
クラス内のインスタンスメソッドに属性値をもたせるために使う変数名で、変数の前に「@」をつける。

```ruby
class Takoyaki

def takoyaki_create(num)
  @num = num
end

end

hokuhoku = Takoyaki.new
hokuhoku.takoyaki_create(5)

```

インスタンス変数@numは、クラス内のすべてのインスタンスメソッド内で使用することができます。
つまり、インスタンス変数のスコープ（変数が使用できる範囲）はクラス内のすべてのインスタンスメソッド内ということになります。

#クラスメソッド
インスタンスメソッドが個別の情報を元に行う動作（メソッド）で、インスタンス名から呼び出すことができるメソッドであったのに対して、個別の情報によらず（インスタンス名によらず）に、どこからでも呼び出すことができるのがクラスメソッドです。

```ruby
class Takoyaki

def self.eat
 puts"食べると、ほくほくしちゃう" 
end

def takoyaki_create(num)
  @num = num
end

end

hokuhoku = Takoyaki.new
hokuhoku.takoyaki_create(5)

Takoyaki.eat

```
これで、クラスメソッドを定義することができます。
クラスメソッドを定義する際は、クラスメソッド名の前に`self.`を記載します。
インスタンスメソッドと違って、メソッドの呼び出し方が異なっており、クラス名で呼び出すようになります。
クラスメソッドは、インスタンスを作成する必要がない（newメソッド不要）ので、そのままクラスから呼び出すことができます。


# インスタンスを作成と同時にインスタンスが実行されるメソッド（initializeメソッド）
インスタンスをnewメソッドで生成した後に、インスタンスメソッドを呼び出さずに直ちに実行されるようにするメソッドをinitializeメソッドと言います。

```ruby
class Takoyaki

def initialize(takoyaki_name, takoyaki_price)
 @name = takoyaki_name
 @price = takoyaki_price
end

def self.eat
 puts"食べると、ほくほくしちゃう" 
end

def takoyaki_create(num)
  @num = num
end

end

hokuhoku = Takoyaki.new("醤油たこ焼き", 400)
hokuhoku.takoyaki_create(5)

Takoyaki.eat

```
newメソッドでインスタンスを生成したと同時にinitializeメソッドが実行され、実引数（"醤油たこ焼き", 400）がinitializeメソッドの仮引数に代入され、インスタンス名、「hokuhoku」に@name(="醤油たこ焼き")と@price(=400)という属性値が生成されました。

# まとめ
- クラスとインスタンスは独自の値（データ）を作成するために必要な概念である。
- クラスを設計することで、共通のルールを使い回すことができるメリットがある。
- 動作（メソッド）の種類としてクラスメソッドとインスタンスメソッドがあり、呼び出し方が異なる。
- インスタンスとは、クラスの実体のことで、newメソッドを使用して生成することができ、クラス内のインスタンスメソッドをインスタンス名から呼び出すことができるようになる。
- インスタンスの生成と同時にインスタンスを実行するメソッドをinitializeメソッドといい、インスタンスの生成とともに、属性値を与えることができる。
いろんな乱数を試してみる（覚え書きとして）


よく分かっていないのだけれど、とにかく Juypter notebook で動かして確認してみます。
いずれ深く理解する必要があるときに見た目で確認できるように。

# 表示のしかけを用意しておく
```python  
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(0)

def hist(array):
    fig, ax = plt.subplots()
    n, bins, patches = ax.hist(array, bins=25)
    plt.xlabel('x')
    plt.ylabel('frequency')
    plt.show()
```

# 一様分布（0.0以上、1.0未満）の乱数を1,000,000個
```python 
x = random.rand(1000000)
hist(x)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225878/15886a1f-6a49-8ce1-1798-81641747636b.png)

# 一様分布（0.0以上、1.0未満）の乱数を1,000,000個
```python 
x = random.random_sample(1000000)
hist(x)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225878/64f4f352-0210-c02a-6b26-9d6c16d5149e.png)

# 一様分布（任意の範囲の整数）の乱数を1,000,000個
```python
x = random.randint(-100, 100, 1000000)
hist(x)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225878/9dc76914-6f91-8159-9dbe-0197f03c27aa.png)

# 正規分布（平均=0, 分散=1）の乱数を1,000,000個
```python 
x = random.randn(1000000)
hist(x)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225878/6bb3def3-e5aa-c2aa-f33a-d459a805ab5d.png)

# 正規分布（任意の平均、標準偏差）の乱数を1,000,000個
```python 
x = random.normal(0, 5, 1000000)
hist(x)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225878/0bad7587-af84-dd04-779f-cc900736c9be.png)

# 二項分布の乱数を1,000,000個
```python 
x = random.binomial(10, 0.25, 1000000)
hist(x)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225878/304a0c38-039f-10f6-90bc-339e309a3fda.png)


# ベータ分布の乱数を1,000,000個
```python 
x = random.beta(2, 2, 1000000)
hist(x)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225878/b08ddaa2-94ea-2b47-c28b-1f92df3abe38.png)

# ガンマ分布の乱数を1,000,000個
```python 
x = random.gamma(5, 1, 1000000)
hist(x)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225878/c071fb09-2e8a-b9ee-8778-ab74eb034fb5.png)

# カイ二乗分布の乱数を1,000,000個
```python 
x = random.chisquare(3, 1000000)
hist(x)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225878/ee29ef07-dd25-2e70-1c59-1db429658be2.png)
家のデータを表示するポータルを作る

家の中のデータが色々取れるようになってきたので、見やすいポータルを作りました。

![portal2_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/849198/e2a0e958-5360-9d3c-5d32-d5080bd000ae.png)



#### 前提
* データのあるGoogle SpreadSheetを準備していること

#### Google Data Portalを作成
* 以下のリンクにアクセスし、レポートを新規作成

https://datastudio.google.com/u/0/navigation/reporting

* google spread sheetから取り込みたいデータが入っているファイルを選択
* ワークシートを選択
* 追加ボタン
* レポートに追加をクリック
* 自動で表が1個作成されたはずです

私は、テーマとレイアウトから"エッジ"を選択しています

----------------

上記のポータル画面へのそれぞれのデータの入力方法はこちらに記載しました

https://qiita.com/tosshie/items/82dcc6405925b12d2fd1
Laravel Routingの基本形（メモ用）

コントローラを介し、routingを利用する際の基本形をメモ。
随時更新中(2021/7/5現在)

基本形
Route::get('/[route先]/','[コントローラ名]@[メソッド名]')



一覧画面の表示・・・@index
`Route::get('/[route先]/','[コントローラ名]@index')`

項目の詳細画面へ遷移したいとき・・・@detail
`Route::get('/[route先]/{id}','[コントローラ名]'@detail');`

項目の編集をしたいとき・・・@update
`Route::post('/[route先]/{id}','[コントローラ名]'@update');`

項目の削除をしたいとき・・・@destroy
`Route::delete('/[route先]/{id}','[コントローラ名]'@destroy');`

画面遷移時にidに紐づけられた名前を取得したい場合・・・後ろに->nameをつける
`Route::get('/[route先]/','[コントローラ名]@index')->name('/[route先]/.index');`
Mac/vagrantインストール

# 概要
Macに仮想環境を構築するためにvagrantをインストールします

# 環境
PC: Macbook Pro
OS: MacOS Catalina

# vagrantをインストール
- 下記の公式サイトからダウンロードします

https://www.vagrantup.com/

- 画面に従ってインストールします

![スクリーンショット 2021-07-05 18.49.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146636/cd37386a-8137-0d76-7ef3-547d7df09445.png)
![スクリーンショット 2021-07-05 18.50.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146636/882cfad6-e829-116a-8229-8fef2ebab4f5.png)
![スクリーンショット 2021-07-05 18.50.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146636/13331c29-2beb-f30c-dfed-b52c34cc73c1.png)
![スクリーンショット 2021-07-05 18.50.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146636/1d560657-bd58-242d-a945-519558ff8f6c.png)


# 確認
ターミナルで以下のコマンドを実行して、バージョンが表示されればOK

```
$ vagrant -v
Vagrant 2.2.16
```
とにかくPythonでインポートできるようにしたい

#Pythonでインポートできなくて困っている
Pythonで開発していてパッケージを分けていると、少しディレクトリ構成を変更するとインポートできなくなって困ることがあります。
そんな時「モジュール探索パスを追加して絶対インポート」することで、カレントディレクトリがどこであっても正しくインポートできます。

既存のインポート文の前に以下を記述しましょう。

```python
import os
import sys

sys.path.append(os.path.join(os.path.dirname(__file__), '..'))
```


#参考
[Pythonの相対インポートで上位ディレクトリ・サブディレクトリを指定](https://note.nkmk.me/python-relative-import/)
Mac/VirtualBoxインストール

# 環境
PC: MacBook Pro
OS: MacOS Catalina（10.15.7）

# VirutalBoxのインストール
以下のサイトからMac用のインストールファイルをダウンロードする
https://www.virtualbox.org/wiki/Downloads
※今回は、version6.1をダウンロード

# インストール
- ダウンロードしたファイルをクリックしてインストールを実行する
![スクリーンショット 2021-07-05 12.43.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146636/8aa2e0cf-8c1b-833f-2212-e9c098774ae0.png)

- **VirtualBox.pkg**をダブルクリックする
![スクリーンショット 2021-07-05 12.44.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146636/1b87e184-271e-1b2a-4d9f-7d9204f8ee11.png)
![スクリーンショット 2021-07-05 12.47.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146636/5b7f2bbb-40bd-fca4-abe5-e624e845b7d3.png)
![スクリーンショット 2021-07-05 12.47.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146636/2acedcdf-ae44-d8ca-4044-633774dd5396.png)

- セキュリティ制限でインストールが正常に完了しない場合があるので、その場合は【システム環境設定】ー【セキュリティとプライバシー】の**ダウンロードしたアプリケーションの実行許可**から許可する
![スクリーンショット 2021-07-05 12.48.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146636/e2677f43-b1a5-6c64-9078-51dbb8b4a050.png)
![スクリーンショット 2021-07-05 12.51.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146636/357e90d6-c887-25dc-06b7-daf8478482d2.png)

- インストール完了！
![スクリーンショット 2021-07-05 12.51.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146636/0f4f9e6c-0e31-5fd1-3382-4ecdcf194b92.png)
Syntax Error

え、、、エラーかよーーーーー！！！って思ったけど!


Syntax Error![スクリーンショット 2021-07-05 18.30.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1724474/6f7adf46-b494-7db2-5174-e09a31f19c6c.png)




凄く優しくエラーを教えてくれた。
ここの文法がおかしいんじゃないですか〜？？的なニュアンスで明確な位置も....

確認してみると
[スクリーンショット 2021-07-05 18.30.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1724474/2df715d7-3169-324f-beeb-a0bb209106ef.png)

 

def edit

@blog = Blog.find(params)[:id])

変なところかっこしちゃってますね....

凄く分かりやすいエラーの説明有難うって感動したので
他のエラーもこんな感じで分かりやすく指摘してくれればいいのに！！！！
Monit で Ubuntu 20.0.4 の nginx を監視・自動復旧

# はじめに
## 対象読者
* Ubuntu で nginx サーバを運用している人
* 気づいたら nginx がお亡くなりになっていて対応しないとならない、という事態に陥ったことのある人
* あるいは上記のような事態に陥りたくない人

## 動作環境
* Ubuntu 20.0.4

# インストール
## Monit
* [Monit](https://mmonit.com/monit/)
* 以下の通りインストール

```sh
apt install monit
```

# 設定
## /etc/monit/monitrc
* 初期値は 120 秒ごとにチェックするようになっている。運用に応じて変更するべし

```:/etc/monit/monitrc
  set daemon 120            # check services at 2-minute intervals
```

* ログは以下のところに出力されるようになっている。ここも含め、他の設定も特に変更する必要はないと思われる

```:/etc/monit/monitrc
  set log /var/log/monit.log
```

## /etc/monit/conf-available/nginx
* 今回は nginx を監視するので監視対象用のコンフィグファイルは `/etc/monit/conf-available/nginx`
* 最近の monit はインストールした時点でコンフィグファイルが用意されている
* 中身は以下のようになっているので、自身の環境で要変更箇所があれば変更すべし

```:/etc/monit/conf-available/nginx
 check process nginx with pidfile /var/run/nginx.pid
   group www
   group nginx
   start program = "/etc/init.d/nginx start"
   stop program = "/etc/init.d/nginx stop"
#  if failed port 80 protocol http request "/" then restart
   if 5 restarts with 5 cycles then timeout
   depend nginx_bin
   depend nginx_rc

 check file nginx_bin with path /usr/sbin/nginx
   group nginx
   include /etc/monit/templates/rootbin

 check file nginx_rc with path /etc/init.d/nginx
   group nginx
   include /etc/monit/templates/rootbin
```

* 上記コンフィグを適用したいので、シンボリックリンクを作成

```sh
ln -s /etc/monit/conf-available/nginx /etc/monit/conf-enabled/
```

* 設定を再読込

```sh
systemctl reload monit
```

# 動作確認
## 
* 試しに `nginx -s stop` を実行して nginx プロセスを止めてみると、自動復旧してくれるようになる
* ログは以下のように出力される

```:/var/log/monit.log
[JST Jul  5 18:35:19] error    : 'nginx' process is not running
[JST Jul  5 18:35:19] info     : 'nginx' trying to restart
[JST Jul  5 18:35:19] info     : 'nginx' start: '/etc/init.d/nginx start'
```


# おわりに
## 感想
* 日本語で、最近の Ubuntu 環境での monit + nginx 記事が見当たらなかったので、まとめました
* これで知らない間に nginx が沈黙していた……という状況のときに自動復活してくれるので精神衛生面で助かる

## 参考記事
* [Qiita - プロセス監視のためのmonitを設定してみる](https://qiita.com/kawasakiatsushi/items/1b9e77b4bee0619e8f9b)
* [Tutorials24x7 - Configure Monit For MySQL, Apache, NGINX On Ubuntu 20.04 LTS](https://ubuntu.tutorials24x7.com/blog/configure-monit-for-mysql-apache-nginx-on-ubuntu-20-04-lts)
作業ログ｜GoogleWorkspaceのカレンダーについて、ドメインをまたいだ共有を、なるべく便利に（じぶんのイメージと合うように）した

## はじめに（この記事の背景）

GoogleWorkspace（旧称G Suite）で、ドメインをまたいでカレンダーを共有して使いたい。

こういった個別具体的なケースのマニュアルやガイドは見当たらなかった（見つけられなかった）ので、試行錯誤した。

しばらくしたら忘れそうなので、要点を記録。

副業など、マルチドメインで仕事をすることが増えるだろうから、先進的な事例記録になる……であろう……（ほんまかいな）。

## 環境

ここで書いていることは、下記のバージョンで実施しました。

- GoogleWorkspace バージョンの調べ方がわからない。2021-07-05
- Chrome バージョン: 91.0.4472.114（Official Build） （x86_64）
- Safari バージョン14.1.1 (16611.2.7.1.4)
- FireFox バージョン: バージョン14.1.1 (16611.2.7.1.4)
- macOS BigSur 11.4

## 設定を方向づける前提

- ドメインAからドメインBに移行している
- 急な切り替えではなく、じわじわ比率が（Bが高くなるように）変わる予定
- AとBの予定を一箇所で一覧したい（漏れや転記ミスはいやだ）

## 総論

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184128/80d9e148-aad2-6660-ca0d-977dc48a7f0a.png" width=80%>

### 設定の方向性

- ドメインレベルおよび、カレンダーレベルで設定をする。
- 予定レベルでいじらない。
- （ユーザレベルでは、いじることがない）

### ドメインレベルでの設定

ドメインAでの最高権限を「閲覧」にする（というか管理者権限がないので、「閲覧であった」が正しい）。

ドメインBでの最高権限を「変更」にする。

場所は、`管理コンソール > Google Workspace > カレンダーの設定 > 共有設定> メイン カレンダーの外部共有オプション`で、`xxx 外 - メイン カレンダーに対するユーザーの機能の設定 > すべての情報を共有する（外部ユーザーにカレンダーの変更を許可する）`を選ぶ。

### カレンダーレベルでの設定

これはよくある設定なので、詳細を省く。

場所は、`カレンダーの設定 > 特定のユーザとの共有`

## 補足（モバイル環境）

- iPhone(iOS) ⇔ カレンダー.app（標準） ⇔ 同期設定 ⇔ ユーザAMIでカレンダー選択

- `WeekCal.app`は`カレンダー.app`のデータを見に行っている
- `Googleカレンダー.app`はユーザAMIでログインしてカレンダーの予定を拾っている

## リソース

[カレンダーの公開および共有オプションを設定する](https://support.google.com/a/answer/60765?hl=ja&ref_topic=9201)

[Googleカレンダー同期設定](https://calendar.google.com/calendar/u/0/syncselect)
　→　[Apple カレンダーに Google カレンダーの予定を表示する](https://support.google.com/calendar/answer/99358?co=GENIE.Platform%3DDesktop&hl=ja)の「同期するカレンダーを変更する」ご参照
【新卒3年目】良いコードとは何か考えてみた

# はじめに
実際にプロジェクトに入ってから約２年が経つこのタイミングでこれまでのコードレビューを受けて感じたことや、自身がコードレビューを行ってきて考えた良いコードとは何かということについて述べていきます。

# ①他人が見ても理解できる
まずはこれが１番大切なことだと思います。基本的には開発はチームで取り組むものだと思うので、他人が理解できないコードは書くべきではないでしょう。他人が理解することに時間が掛かることや、誤った理解をして進めてしまうことで無駄な時間が発生してしまいます。他人が見ても理解できるのだろうかということを意識してコーディングを進めることがよいでしょう。また、自分が2週間後に見ても理解できるようコードを書くことを意識することも大事だと思います。これは先輩から言われたお言葉です。2週間後には自分が書いたコードは忘れてしまうことがあるので、忘れないように書きましょうと教えていただきました。そのためにはコメントを残すことが大事です。処理がより複雑になってしまうと、3日後くらいでも内容が理解できないことがあります。コメントが残っていることで他人だけでなく自分のことも助けることになります。また、日本人なのでやはり日本語でコメントがあると視覚的にすぐ理解できます。
まとめると、「コメントを残しましょう」ということです:point_up_tone1:

# ②パフォーマンスが高い
パファーマンスは意識するところですね。Webサイトなどはやはり速度が求められます。私も遅いのは嫌です。。Javaの場合だと特にDBへの接続回数を考慮してコーディングを行っています。JavaScriptだと特に同じ要素は変数に置き換えるようにしています。特にJavaScriptは同じ要素の取得をよく行うことがあると思うので、変数に置き換えた方が自分も楽に書くことができるので意識すると良いでしょう:point_up_tone1:

# ③シンプル
これは私も理想とするところです。処理が難しくなるとついつい長くて汚いコードを書いてしまうことがあります。長ったらしいコードは見栄えも悪く他の人が見るのがかわいそうです。それぞれの言語には便利なメソッドが用意されているので活用していきシンプルにきれいに書いてあげるとよいと思います:point_up_tone1:

# ④保守性が高い
不具合が発生し修正をする必要がある場合にいかに楽に修正ができるかということが保守性を高くすることに繋がると考えています。修正箇所が多いと影響範囲が大きくなり、その分テストを行う必要があります。修正箇所が多いとテストで漏れてしまう可能性もありますし、他に本当に影響が出ていないかなと不安になるので修正が楽にできるように考慮してあげることが大事です。そのためには同じような処理は１つにまとめるだとか、同じような内容は定数に置き換えるということをしてあげることで修正箇所が少なくなります。不具合が発生した際に自分ではない他人が修正をするかもしれないので、その面も考慮してあげてコードを書くべきでしょう:point_up_tone1:

# さいごに
良いコードとは何かということを考えることにより、より良いコードを書くことに繋がると思います。より良いコードを書くことができるとシステムも仲間も幸せになることができると思うので、皆さんも考えてみてください。今後はより知識を身に着けていきコーディングのできる幅を広げていきたいと思います。
最後まで読んでいただきありがとうございます:pray_tone1::sparkles:
[Mac]Node.js環境準備（VSCode、Homebrew、nodebrew、Node.js）

PCを変えたときにやること忘れてしまうのでメモ。

#Visual Studio Code
https://azure.microsoft.com/ja-jp/products/visual-studio-code/

##日本語設定
https://code.visualstudio.com/docs/getstarted/locales
1. [⇧⌘P]　でコマンドパレットを開く
2. "display"と入力し、[Configure Display Language]を選択する
3. ［Install additional laugages］を選択
4. Japaneseを選択
5. 再起動

## 設定の同期（Settings sync）
※2021/7現在Preview機能
https://code.visualstudio.com/docs/editor/settings-sync
1. 左下のユーザーアイコンをクリック
2. GitHubまたはMicrosoftアカウントでログイン
3. （２台目以降の場合）ローカルの設定をオンライン上の設定で置換する

# Homebrewのインストール
### [公式サイト](https://brew.sh/ "Homebrew")にアクセスする
https://brew.sh/

### "Install Homebrew" に記載されているコマンドでインストール
インストールに成功すると

``` shell:
==> Installation successful!
```

というような表示が出ます。


インストール結果に "Next steps" の表示があったら、記載の通りコマンドを実行する。
（実行すべきコマンドがそのまま表示されるので、コピペでOK）

私が実行したときの表示（2021/7）：

``` zsh:
==> Next steps:
- Add Homebrew to your PATH in /Users/a000959/.zprofile:
    echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> /Users/（ユーザー名）/.zprofile
    eval "$(/opt/homebrew/bin/brew shellenv)"
```

ということで、まずはzshでbrewコマンドを使えるようにする。

``` zsh:
% echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> /Users/（ユーザー名）/.zprofile
```

今開いているターミナルに反映する。

``` zsh:
% eval "$(/opt/homebrew/bin/brew shellenv)"
```

#### Homebrewのバージョン確認
インストールに成功したら、brewコマンドが使えるか確認する。

``` zsh:
% brew -v
```

# nodebrew をインストール
https://github.com/hokaccha/nodebrew

``` zsh:
% brew install nodebrew
% nodebrew -v
```

安定板をインストール

``` zsh:
nodebrew install stable
```

もしディレクトリがないというエラーが出たら、ディレクトリを作成する。

``` zsh:
% mkdir -p ~/.nodebrew/src
```

## nodebrewの利用するバージョンを選択
利用できるバージョンを調べる。

``` zsh:
% nodebrew list
v16.4.1
```
使うバージョンを設定する。（例の場合はv16.4.1）

``` zsh:
% nodebrew use v16.4.1
```

## パスを通す
``` zsh:
% echo 'export PATH=$HOME/.nodebrew/current/bin:$PATH' >> ~/.zprofile
```

設定を今開いているターミナルに反映

``` zsh:
% source ~/.zprofile
```

nodeコマンドが使えるか確認する

``` zsh:
% node -v
```

Node.jsの公式サイト（推奨版、最新版のバージョンはここで確認する）
https://nodejs.org/ja/
未経験からCCNA取得までの道のり　ver４

CCNA アプリケーション　プロトコルの代表的なやーつ！

⭐︎UDP
🚩DNS（Domai Name System）
ポート番号[53]/UDP
インターネット上のドメイン名（ホスト名）とIPアドレスを対応させる仕組みを提供する

🚩DNCP（Dynamic Host Configuration Protocol）
ポート番号[67.68]/UDP
ユーザのコンピュータにIPアドレスなどの情報を自動で割り当てる！

🚩TFTP（Trivial　Text Transfer Protocol）
ポート番号[69]/UDP
UDPを用いて簡易的にファイルを転送するための機能を提供する

🚩SNMP（Simple Network Management Protocol）
ポート番号[161.162]/UDP
ネットワーク機器やサーバをネットワーク経由で監視し管理するための機能の提供

🚩NTP（Network Time Protocol）
ポート番号[123]/UDP
ネットワーク経由でコンピュータ内部のシステムクロックを同期し正確な時刻を提供
＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿
⭐︎TCP
🚩DNS（Domai Name System）
ポート番号[53]/TCP
インターネット上のドメイン名（ホスト名）とIPアドレスを対応させる仕組みを提供する

🚩HTTP（HyperText Transfer Protocol）
ポート番号[80]/TCP
webページを閲覧する際にサーバとクライアント間で通信で利用する

🚩HTTPS（HyperText Transfer Protocol Secure）
ポート番号[443]/TCP
HTTP通信を安全にするために、SSL/TLSプロトコルを用いてセキュリティ機能（暗号化・認証）を提供する

🚩FTP（File Transfer Protocol）
ポート番号[20.21]/TCP
ネットワーク経由でファイルを転送するための機能を提供

🚩SMTP（Simple Mail Transfer Protocol）
ポート番号[25]/TCP
電子メールを送信するための機能を提供する

🚩POP3（Post Office Protocol Version3）
ポート番号[110]/TCP
電子メールを受信するための機能を提供する

🚩Telnet（Telecommunication network）
ポート番号[23]/TCP
リモートからネットワーク機器やサーバにログインし、遠隔操作するための機能を提供

🚩SSH（Secure Shell）
ポート番号[22]/TCP
Telnetと同様に、リモートから遠隔操作する機能を提供する。
ネットワーク上でやりとりされるデータは全て暗号化されるため、一連の操作を安全に行える。
【Nativefier】LINEMUSICをアプリとして動かしたい

#前提
最近ファミリープランに加入し、サブスク料を払わなくていいのでSpotifyから移行した。
だが、現状LINE MUSICはPC版アプリがない。
WebAppはあるので開けはするものの、Ear Trumpetで細かく調整する身としては少し厳しい。
そこでLINE MUSICのアプリを作ればいいと思った。
#考えた手法
はよ教えろや、と思うかもしれないが、ちょっとまってほしい。
私がしたいことへの理解を深めるためにも、私の心の葛藤を見てほしい。
##Step 1 : LINE MUSIC開く用ブラウザを入れよう
至って安直な考え。実際これで2週間くらい過ごしたが、あまり不便はなかった。
ただ、タスクバーに来るアイコンが使用したブラウザ(Chrome Canary)だったため、わかりにくかった。
##Step 2 : Chromeのショートカット機能を使おう
続いて思いついたのがChromeのショートカット。
普通は.lnkファイルが生成されるだけだが、Chromeのショートカットには「ウィンドウとして表示」がある。
>Chrome 91での画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1558394/92712f89-1a3b-9053-0913-22a9297a30bf.png)

これを使うことによって、あたかもネイティブアプリとして動作しているように見えた。
...見た目は完璧。そう、見た目は。
実はこれ、内部的にはChromeのタブのような形で動作するので、単体での音量操作が効かないのである。
これでは意味がない。
##Step 3 : Electron
そこで次に思いついたのはElectron。Discordで Ctrl + Shift + I を押すとChromiumのデベロッパーツールが出てくるのは皆さんご存知であろう(最も、Qiitaを見るような人はDiscordよりSlackだろうが)。
ならばLINE MUSICも同じ手法で行けるのではないか...?
そう思った。....がしかし、HTML,CSS,PHP系はかろうじてかけるものの、JavaScriptなんてonclickくらいしか使ったことがなかった。それにJSができたとしてもすることはiframeくらいだろう。
もっと簡単にElectronの技術を使って作れないものか...
##Answer : Nativefier
ネットの海にダイブして、呼吸困難になりながらたどり着いた答え、Nativefier。
Nativefierは簡単に説明すると、URLを打つだけでElectronのコードも全部書いてくれてパッケージ化までしてくれるいわば神アプリである。早速Nativefierで作ってみることにした。
#Nativefierの使い方
詳しい説明は各自調べていただくとして、とりあえずまずはNode.jsを入れる。(yarn等でも可)
https://nodejs.org/ja/download/
ここらへんからインストールする。
インストールが終わったら、アプリを作っていく。
作ると言ってもコマンド一つで完成する。

まずは作業ディレクトリに移動する。
その後下記のコマンドを実行する。

```:Nativefier
npx nativefier -n "LINEMUSIC"  --single-instance --tray "https://music.line.me/webapp" --internal-urls "access\.line\.me.*"
```

一応説明としては、
```npx nativefier -n "アプリの名前"  --single-instance --tray "URL" --internal-urls "他に内部でアクセスするURL(殆どの場合はログイン時のもの)*"```

出来上がったフォルダの中に```LINEMUSIC.exe```ができているので、それを実行して完成。
あとは煮るなり焼くなり好きにしよう。

※アイコンをLINEMUSICのものにする場合

```:Nativefier
npx nativefier -n "LINEMUSIC"  --single-instance --tray "https://music.line.me/webapp" --internal-urls "access\.line\.me.*"　--icon=アイコンのパス(例 : C:\Users\Nishly\Works\linemusic-icon.png)
```

#最後に
今回はNativefierを紹介した。
他にも様々なアプリをデスクトップアプリ化できるので、是非チャレンジしてみてほしい。

#参考サイト
[GitHub](https://github.com/nativefier/nativefier)
DelayedJobのhandlerをRubyオブジェクトに変換する

# 背景

DelayedJobを利用して定期実行しているタスクがあるのですが、処理時間が長いと全く同じタスクが並列して走ってしまうことがありました。
（cronを利用しないのはサーバーのリソースが枯れてしまわないように数を制限しているため）

既に実行されている(locked_atに時間が入っているもの)のhandlerから何のタスクが実行されているか分かれば後からキューイングされたジョブの実行をスキップする処理ができるなと思い調べたのですが変換方法が調べても出てこなかったので記事にしました。

# handlerの取り出し
まずは結論から書きたいと思います。

```ruby:
handler = Delayed::Job.first
YAML.load_dj(handler)
```
上記のように`YAML#load_dj`を利用することでDelayed::Jobを使ってenqueueしたジョブのhandlerをRubyのオブジェクトに変換することができます。
できたオブジェクトはenqueuしたときのクラスなので、例のようにクラス変数のnameなどを取り出したい場合は元のクラスで参照できるようにattr_readerなどの設定をする必要があります。

```ruby:class.rb
class A
  attr_reader :name
  def initialize
    @id = 'id'
    @name = 'name'
  end

  def enqueue
    Delayed::Job.enqueue~~~
  end
end

A.new.enqueue
handler = Delayed::Job.first
task = YAML.load_dj(handler)
=> #<A ~~~~~>
task.name
=> name
```

# load_djの実装
ちなみにこの取り出し方はDelayed::Jobでワーカーが取り出す際に利用しているもので[こちら](https://github.com/collectiveidea/delayed_job/blob/master/lib/delayed/backend/base.rb#L72)から確認できます。

```ruby:delayed_job/base.rb
def payload_object
  @payload_object ||= YAML.load_dj(handler)
rescue TypeError, LoadError, NameError, ArgumentError, SyntaxError, Psych::SyntaxError => e
  raise DeserializationError, "Job failed to load: #{e.message}. Handler: #{handler.inspect}"
end
```

また、YAMLモジュールをオーバライドしている箇所は[こちら](https://github.com/collectiveidea/delayed_job/blob/master/lib/delayed/psych_ext.rb#L14-L19)になります

```ruby:delayed_job/psych_ext.rb
module Psych
  def self.load_dj(yaml)
    result = parse(yaml)
    result ? Delayed::PsychExt::ToRuby.create.accept(result) : result
  end
end
```

# 最後に
もう少し実装を抽象化できればDelayed::Jobに実装しても良い機能なきもするので実装を考えてみたいと思います。
本記事が誰かの役に立てれ立てれば嬉しいです
デーモン化したgunicornのプロセスの起動、停止、確認をするBashスクリプト

![image.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1083912/d8809f06-3f1a-075e-594f-99ffca49b1f8.gif)

# 環境

- Ubuntu 20.04.2 LTS
- GNU bash, version 5.0.17(1)-release (x86_64-pc-linux-gnu)
- Python 3.8.10 (venv)

```
fastapi==0.65.2
gunicorn==20.1.0
setproctitle==1.2.2
uvicorn==0.14.0
```

## パッケージのインストール

```
pip install fastapi
pip install gunicorn
pip install setproctitle
pip install uvicorn
```

# 使い方

## ファイルの設定

- gunicornの設定ファイル単位で、起動、停止が行える構成

```
├── gunicorn_config            <-- gunicorn設定ファイル
│   ├── guni_conf_prod.py
│   └── guni_conf_staging.py
├── gunidaemonctl              <-- Bash script
├── main.py                    <-- Python Web app for prod
└── main_fast_api.py           <-- Python Web app for staging
```

## 開始

- 以下はステージングを起動する例

```
./gunidaemonctl start guni_conf_staging
```


## 停止

```
./gunidaemonctl stop guni_conf_staging
```

### プロセス一覧

- masterプロセスとworkerプロセスの一覧を確認した例

```
./gunidaemonctl ps guni_conf_staging

ubuntu 1001 0.8 2.2 0 0 ? S 12:10 0:00 gunicorn: master [guni_conf_staging]
ubuntu 1002 2.4 3.3 0 0 ? S 12:10 0:00 gunicorn: worker [guni_conf_staging]
ubuntu 1003 2.4 3.3 0 0 ? S 12:10 0:00 gunicorn: worker [guni_conf_staging]
```

## マスタープロセスIDの確認

```
./gunidaemonctl pid guni_conf_staging

master pid:
1001
```

# Bash スクリプト (github)

## 免責事項

- 細心の注意を払って作成していますが、
- 本スクリプトを使用して発生したいかなる損害に対して
- 作者は一切責任を追いません。

https://github.com/hachicomb/gunidaemonctl


# リンク

https://qiita.com/hachicomb/items/39c83252c10b05a421f1
[CSS] 孫セレクタってないの…？

CSSど初心者なのですが、孫セレクタってないのかな…と無意味に悩んだのでメモっておきます。

「CSS　孫セレクタ」「CSS　セレクタ　孫」的な検索をかけると、サジェストにワードが出るのに検索結果にそれっぽい内容の記事が一切ヒットしない！
子孫セレクタについてのページばっかりヒットします。
この記事がヒットするようになったらいいですね。


# 孫セレクタ＝子セレクタ＋全称セレクタ＋子セレクタ

全称セレクタ「*」を子セレクタふたつの間に挟むことで、孫セレクタ…ではないですが同じ働きをさせるセレクタを書くことができます。

https://developer.mozilla.org/ja/docs/Web/CSS/Universal_selectors

```HTML:html
<html>
  <head></head>
  <body>
    親要素
    <div>
      子要素
      <div class="youso">孫要素</div>
      <div><div class="youso">関係ない要素</div></div>
    </div>
  </body>
</html>
```

```CSS:css
/* ふつうの子セレクタ */
body > div {
  background-color: orange;
}

/* 孫セレクタ…と同じ意味のセレクタ */
body > * > div.youso {
  background-color: red;
}
```

以下のスクショのようになります。
ちょうど孫にだけスタイルが適用されていて狙い通り！
![screenshot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652113/77d349b6-61bc-b19f-6723-3f033c6d8745.png)


# まとめ
初心者はとんでもない発想をしがち


# 追記：`>`は正確にはセレクタではない
`">"`は「子結合子」、`" "`は「子孫結合子」と呼びます。
`">"` や `" "` 単体では何かをセレクトできる訳ではないので、セレクタではありません。
（そんな細かいところまでわからない時期に書いた記事なので…）

https://developer.mozilla.org/ja/docs/Web/CSS/CSS_selectors#%E7%B5%90%E5%90%88%E5%AD%90%E3%81%A8%E3%82%BB%E3%83%91%E3%83%AC%E3%83%BC%E3%82%BF%E3%83%BC

今回の場合、「孫結合子」って書くのが適切なのかも…？

とはいえ、セレクタって書いた方がわかりやすいので記事はこのままにしておきます。
初心者向けの記事ですし、初心者っぽいタイトルのままの方が目につきやすそう。
【GCP】IAMとIAPの制限対象の区別

備忘録程度のポイントまとめ記事です。

#IAP
https://cloud.google.com/iap?hl=ja
「ID とコンテキストを使用して、アプリケーションや VM へのアクセスを保護。」
とあるように、VMへのアクセス制限については、IAPで制限する。
コンテキストでcloud identityと連携して制御が可能になる。
なので、GWSやcloud identityが必要になる。

【ちょっとした疑問】
外部ドメインを制限したい場合は、どうしたらいいのか？という疑問がでてくる。。。
↓
これは、GCPではできないと思う。
シチュエーションにもよるが、「どのIDを使いたいのか？」とかあると思うし、Azure　ADとかと連携ししたいなら、そういう構成もできなくはないと思う。（やったことないけど）
これに加えて言うなら、IAMだってGWSやcloud identity必要だし、つまるところ、この記事で書いたような制限をやりたいならGoogleアカウントは必要だよってところに落ち着くと思う。

以下の記事も参考になったので記載させていただきました。
https://cloud-textbook.com/37/




#IAM
https://cloud.google.com/iam?hl=ja

IAMはコンソールでサーバを構築するときとかの権限を制御する。
Webアプリへのアクセスとかにはあまり関係ない。
といいつつ、IAPの権限は結構幅広く付与できるので表現が難しい。
https://cloud.google.com/iam/docs/understanding-roles?hl=ja#cloud-iap-roles

けど、IAPの機能だから、IAMで制御ってよりは、IAPで制御している感じ。
【Gatsby】サイドバーを実装する

# はじめに
こんにちは。Qiitaの記事を書いていると思うのが、ストックされるより、**LGTM**される方が遥かにうれしいですね、筆者です :smile: 

さて今回はほとんどチュートリアルそのままだったGatsbyのサイトにサイドバーを実装しました。
どなたかの参考になれば幸いです。

# 前提
## 1. 使用しているGatsbyのテーマ

https://github.com/ryanwiemer/gatsby-starter-gcn

このテーマにはサイドバーはついていないのでこちらに実装していきます。

## 2. サイドバーの要素
サイドバーには新着記事を20件表示します。

# いざサイドバーを実装する

## 1. 記事のItemコンポーネントを作成
以下のように**サムネ画像**と**記事タイトル**の2つの要素で作成しました。

styleはお好みでどうぞ！

```js:src/components/ArticleItem.js
import Img from 'gatsby-image'
import { Link } from 'gatsby'
import React from 'react'
import styled from '@emotion/styled'

const Wrapper = styled.div`
`

const ThumbnailWrapper = styled.div`
`

const TitleWrapper = styled.div`
`

const Title = styled.h3`
`

const ArticleItem = props => {
  return (
    <Wrapper>
      <ThumbnailWrapper>
        <Link to={`/${props.slug}`}>
          <Img fluid={props.heroImage.fluid} backgroundColor={'#eeeeee'} />
        </Link>
      </ThumbnailWrapper>
      <TitleWrapper>
        <Link to={`/${props.slug}`}>
          <Title>{props.title}</Title>
        </Link>
      </TitleWrapper>
    </Wrapper>
  )
}

export default ArticleItem
```

## 2. サイドバーのコンポーネントを作成
GraphQLで新着記事を取得し1で作成したコンポーネントに渡します。

こちらもstyleはお好みでどうぞ！

```js:src/components/Sidebar.js
import { graphql, useStaticQuery } from "gatsby"
import ArticleItem from './ArticleItem'
import React from 'react'
import styled from '@emotion/styled'

const Wrapper = styled.div`
`

const List = styled.div`
`

const SectionTitle = styled.h2`
`

const Sidebar = () => {
  const data = useStaticQuery(graphql`
    query {
      allContentfulPost(sort: { fields: [publishDate], order: DESC }, limit: 20) {
        edges {
          node {
            slug
            title
            publishDate
            heroImage {
              fluid(maxWidth: 1800) {
                ...GatsbyContentfulFluid_withWebp_noBase64
              }
            }
          }
        }
      }
    }
  `)

  const posts = data.allContentfulPost.edges
  return (
    <Wrapper>
      <SectionTitle>新着記事</SectionTitle>
      <List>
        {posts.map(({ node }) => {
          return (
            <ArticleItem
              key={node.slug}
              title={node.title}
              heroImage={node.heroImage}
              slug={node.slug}
            />
          )
        })}
      </List>
    </Wrapper>
  )
}

export default Sidebar
```

## 3. 記事ページのtemplateにサイドバーを挿入する
2で作成したコンポーネントを入れます:ok_hand:

こちらもstyleはお好みでどうぞ！
divでくくったりしてflexとか使うとサイドに配置できると思います:pray:


```js:src/templates/post.js
+ import Sidebar from '../components/Sidebar'

  return (
    <Layout>
      <Hero title={title} image={heroImage} height={'50vh'} />
      <Container>
        {tags && <TagList tags={tags} basePath={basePath} />}
        <PostDetails
          date={publishDate}
          timeToRead={body.childMarkdownRemark.timeToRead}
        />
        <PageBody body={body} />
+       <Sidebar />
      </Container>
      <PostLinks previous={previous} next={next} basePath={basePath} />
    </Layout>
  )
```

# おわりに
無事にサイドバーを実装できました。
css周りはお好みで調整をお願いします:pray:

それでは！
【Git】git fetch されないときに確認したいこと【fetch】


``git fetch``を実行してもリモートブランチの内容がローカルに反映されていないときは、
``.git/config``の``fetch``の設定が変わっているかもしれません。

``fetch``の部分が

```conf:.git/config
[remote "origin"]
	url = https://github.com/schacon/simplegit-progit
	fetch = refs/heads/develop:refs/remotes/origin/develop
```

みたいに``refs/heads/develop``なっていると、リモートのdevelopブランチのみをフェッチします。
デフォルトの設定では

```config:.git/config
[remote "origin"]
	url = git@github.com:your-account/your-repository.git
	fetch = +refs/heads/*:refs/remotes/origin/*
```

のようになっており、すべてのブランチをフェッチするようになっています。


## 参考

https://git-scm.com/book/ja/v2/Git%E3%81%AE%E5%86%85%E5%81%B4-Refspec