OmniAICreator/Qiita-1.07M huggingface dataset:
iPhoneアプリにログイン機能をつけてもappleログインがないと審査が通らない


firebaseを使って、TwitterログインとGoogleログインはつけたけれど、
appleログインができないと、リジェクトされる。
知らなかった😥
審査メッセージ↓
![スクリーンショット 2021-01-11 12.11.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280131/55b6ad4f-24c8-9b9e-45af-b71485e640c5.png)
FlutterでstatelessなTextFieldを作ったので宣伝したい

# はじめに
FlutterやReactにおいて、大きな関心ごとの一つに状態管理がある。
TextFieldはその性質上、自ら状態を持つ設計になりやすい。
しかし、TextFieldの入力情報をcallbackで返し、TextFieldの引数に現在値を与えることでTextFieldが状態を持たないようにできる。
ユースケースは`Provider`などの状態管理ツールを入れているプロジェクトに限定されると思うが、私が欲しいと思ったので、今回作成した。
ついでに勉強がてら公開してみた。

## メリット
- TextFiledの状態を自前で管理できるようになる(Provider, redux, Reverpod, BLoc, etc...)
- 他のwidgetの状態と連動させやすい

## デメリット
- 自前で状態管理するコードを書く必要がある
- rebuildのタイミングを把握していないと、文字列入力中にwidgetがrebuildされ、文字が消えることがある

## 先行記事
Flutterにおける状態管理は様々な手法がある。[こちらの記事](https://medium.com/flutter-jp/state-1daa7fd66b94)が非常によくまとまっていると感じた。
この記事では状態管理方法については言及せず、外側で状態管理をしやすいTextFieldについて記述する。

[こちらの記事](https://qiita.com/fathy000/items/54f3eea579f03d73b45a)と全く目的が同じである。
しかし、こちらの記事では状態管理を完全に外だししているわけではなく、Stateに状態を持たせてしまっているため、外からTextFieldに表示したい文字列を与えても変化しない課題がある。
WidgetとStateの関係については[こちらの記事](https://qiita.com/kurun_pan/items/f91228cf5c793ec3f3cc)がとても参考になった。

# 使い方
[こちらのリポジトリ](https://github.com/Urotea/stateless_textfield)に公開している。
また、[pub.devにも公開](https://pub.dev/packages/stateless_textfield)している。

[example](https://pub.dev/packages/stateless_textfield/example)を見てもらうのが一番早いが、こちらにもコードを載せておく。
githubやpub.devが最新版となるため、そこはご了承を...

```dart
class _MyHomePageState extends State<MyHomePage> {
  String _message = "";

  void _setMessage(String str) =>
      setState(() => _message = str);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            StatelessTextField(
              initialValue: _message,
              style: Theme.of(context).textTheme.headline4,
              decoration: InputDecoration(hintText: "first message field"),
              onSubmitted: _setMessage,
            ),
            StatelessTextField(
              initialValue: _message,
              style: Theme.of(context).textTheme.headline6,
              decoration: InputDecoration(hintText: "second message field"),
              onSubmitted: _setMessage,
            )
          ],
        ),
      ),
    );
  }
}
```

簡単に説明すると、縦に並ぶ二つの`StatelessTextField`の`initialVlaue`に`_message`を与えて、`onSubmitted`で`_message`を更新してrebuildするexampleである。
このように`StatelessTextField`は外側で状態管理をしたいときに有効である。

## 実装(使うだけなら知らなくてもOK)
TextFieldに初期値を与えるためには、`TextEditController`を保持しなければならないため、やむなくStatefulWidgetをextendsして作成した。
が、使用感はStatelessWidgetなので、`stateless_textfield`と命名した。

exampleのような構成ではkeyを正しく与えないとWidgetとStateの組み合わせがずれてしまう場合があると思うが、Stateに状態を持たない構成なので、ずれてしまっても問題ない。
なんとなく気持ち悪いと思うが、悪影響はなさそうなので、このような実装にした。

### TextEditControllerが曲者
TextFieldに初期値を与えるためには`TextEditController`を用意しなければならない。
また、これはちゃんと`dispose()`を呼ばないとメモリリークする危険物であるため、そのハンドリングのためにStateで保持している。
逆に言えば、Stateで保持しているのはこれだけである。(たまにちゃんとdisposeしていないサンプルを見かけるが、大丈夫なのだろうか...)

# 最後に
Flutterの勉強を初めて半月くらいですが、WidgetとElementの関係や、公式の提供するWidgetの豊富さが面白く、「Flutter凄いー」となっています。
フロントエンドを例えに出すとReact + Material-UIといった感じですね。サクサク作れます。
Flutterの勉強がてら、自分用の[flutter_template](https://github.com/Urotea/flutter_template)を作っていたところ、状態を持たないTextFieldが欲しくなったので作りました。
開発が進んだ親branchの内容を現在のbranchに取り込む(Source Tree)

# 概要

gitでは、最初にbranchを切って、子branchで作業を始めると思います。

その際、チームでgitを使って開発していると、親branchのコードが先に進んでしまっているケースがよくあると思います。

つまり、他のbranchがmergeされて、最初にbranchを切った時とはコードが変わっているケースです。

基本、子branchでそのまま開発して実装完了後に親branchにmergeすればいいのですが、
今回は、mergeする前に現在の親branchの内容を取り込んで、子branchで開発した後にmergeしたかっったので
どうすればいいか勉強した内容のメモです。

# 前提

ここでは親branchをmaster、その子branchをfeatureとします。

最近SourceTreeを使い始めたので、そこでのやり方です。

# 方法

結論、masterをfeatureにmergeする。

featureで開発完了後、masterにmergeすることは日常でしたが、
なるほどその反対をすればいいわけですね！

1. featureブランチに`checkout`する
2. マージをクリック
3. ログからマージのタブにて、マージさせたいブランチ(master)の`commit`をクリック
4. OKをクリック
5. 全ての変更を`commit`
    6. コミットメッセージが自動的に作成されるのでそのまま使用すればOK (`Merge branch 'master' into feature`)
    7. `conflict`が発生していた場合はテキストエディタなどで解消してから`commit`


# 最後に

最初勉強する前は、`rebase`だと思っていたのですが、`merge`が基本みたいですね。

たぶん`rebase`でもできるんでしょうが。。。。

私はそもそも`rebase`した後にハードコミットするのが怖いので、
とりあえず見にくくなっても`merge`でいいかなと思いました。

チームで開発するようになってから、
こうやって毎日四苦八苦しながら、びびりながら、gitに向き合っています・・・汗
機械学習 評価指標

話者人数推定の精度評価の際に，機械学習における評価指標を調べた．
参考：[Kaggleで勝つデータ分析の技術 \| 門脇 大輔, 阪田 隆司, 保坂 桂佑, 平松 雄司 \|本 \| 通販 \| Amazon](https://www.amazon.co.jp/Kaggle%E3%81%A7%E5%8B%9D%E3%81%A4%E3%83%87%E3%83%BC%E3%82%BF%E5%88%86%E6%9E%90%E3%81%AE%E6%8A%80%E8%A1%93-%E9%96%80%E8%84%87-%E5%A4%A7%E8%BC%94/dp/4297108437)
内容は[機械学習の評価指標（まとめ）｜juki｜note](https://note.com/jukinonote/n/n4156c1c7334b) によくまとまっている．
目的に応じて最適な評価指標が異なることに注意．

# 回帰における評価指標
## RMSE
より大きな誤差を重要視する．外れ値の影響を受けやすいので，あらかじめ外れ値を除く．大きな誤差を許容したくないときに用いる．

## MAE
外れ値の影響を低減できる．

## RMSLE
正解ラベルと予測値の比率に着目．対数をとるにあたっては，真の値が０のときに値が負になるのを避けるため，１を加えてから対数を取る

## 決定係数
RMSEの最小化と同じ

# 二値分類における評価指標（正負）
## 混同行列
- accuracy
- error rate
- precision（適合率）
- recall（再現率）
- F値

# 二値分類における評価指標（正である確率値）
## logloss
自信を持った予測が外れたときにペナルティが大きくなる．予測値が正負ではなく，正である確率値のときに用いる．
## AUC
ROC曲線の下側の面積. 正と予測する閾値を徐々に低くする．

# 多クラス分類における評価指標
基本は二値分類のときの評価指標で，それを多クラス用に拡張する．
- multi-class accuracy
- multi-class logloss
- mean-F1, macro-F1, micro-F1: マルチラベル分類用
- quadratic weighted kappa: クラス間に順序関係があるときに用いる．映画の評価を1~5のレーティングで表すなど．

# 教師なし学習における評価指標
※まだよく分かっていないです．

## クラスタリングの場合
- 人手で正解データを作り，教師あり学習と同じような評価を行う

## 正解データが存在しない場合
- 学習結果をサンプリングして，人手で評価する．

# 話者人数推定における評価指標
- 教師なし学習であるため，人手で正解データを作り評価する．
- タスクとしてはクラスタリングだが，通常のクラスタリングとは違い，クラスタ数を自分で決めるのではなく，クラスタ数も機械学習に決めてもらう．
- また，結果も主観的なカテゴリなどではなく，1人や2人といった客観的なものである．
- 本タスクでは，1人を3人と予測した場合よりも，1人を2人と予測した場合の方がより高い精度と言いたいため，大きく予測を外した場合にはより大きなペナルティを課したい
- 以上より，評価のためには，quadratic weighted kappaを用いるのが良いのではないだろうか．自分も詳しくないので，本手法に関しては今度調べてみたい．
[参戦記] ABC188

**パフォーマンス**
問題なし

**A**
問題なし

**B**
問題なし

**C**
二分探索木を構築せよという問題かと勘違い。本とネットの調査によって、そういう趣旨の問題ではないかもと迷う。この状態で進めると、時間ロス過多を招くと判断し、難しくなさそうと判断した**D**に移行。
**D**ACに成功し、残り３０分。始めの迷いが解決していなかったので、引き続き考察した所、二分探索木問題ではないと結論。頭を冷やし再考察すると、単純に問題を実装することが難しくないと気付く。残り１０分余り。落ち着いてコード設計したいが、時間の関係から直実装するも、思考力も低下しており単純なミスでバグが治せない。時間切れ。

**D**
一見部分和問題かと思ったが、全体解の形が明らかなので、貪欲法と判断。結果的に、公式解答と同形の解答を作った。前回この迷いから間違ったことを反省し、判断基準を明確にしたことが生かされ、再発防止策が功を奏した。

**反省**
冬休みに整備した競技プログラミング対応フローと、その際に行った知識整理が功を奏し、問題選択判断は最適解であった。A,B,DのACプレイヤーの中ではほぼトップである。
二分探索の理解が浅く、中途半端に知っていることで、そのアルゴリズムを過大評価して、それを適用する問題ではないかとバイアスがかかる。対策としては、アルゴリズムを勉強するときはきちんと理解することだ。思考訓練に偏っており、手を動かす設計・実装力の不足がかなり時間消費につながっている。あと１５分程度あれば、CについてもAC出来たと予想する。自分の強みは抽象的思考力だと思うので、このような訓練選択は間違いではないが、次の課題として実装力かと思う。
時間一杯でA,B,C,Dの4完をした緑コーダーのレートが少し上昇していた。とりあえずの目標は緑色なので、十分に射程圏内に捉えていると言えるだろう。
【CentOS 8】サポート短縮！RHEL互換のRocky Linuxが新リリースされるらしい

#解説

CentOS Linux 8のサポートが従来の2029年5月31日から2021年12月31日に短縮され、Cent OS創設者のGregory Kurtzer(グレゴリー・クルツァー)により新RHEL（Red Hat Enterprise Linux）互換ディストリビューション**” Rocky Linux ”**が2021年中にはリリースされるらしいです。それから**” Rocky Linux Project ”**は新コミュニティが主導で開発が行われて居るようです。かなり大幅にサポート期間が短縮されたので、Cent OSを導入している企業等は新RHEL互換のLinuxディストリビューションに乗り換えて行くのではないでしょうか。
#概要（Rocky Linux）
RHEL（Red Hat Enterprise Linux）プラットフォーム
商用環境、本番環境共に対応しているディストリビューションである。
Amazon Web Services（AWS）にも対応予定であるらしい。
GCP （Google Cloud Platform）Azure（Microsoft Azure）等は不明。

開発：新コミュニティ
パッケージマネージャー：RPM DNF
デフォルトユーザーインターフェース：GNOME *
ライセンス：TBA *
プラットフォーム：x86-64
対応言語：多言語

![1200px-Rocky_Linux_wordmark.svg.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/989394/d0ab22bd-6c78-ca02-3a0f-91fdf0e9c84e.png)


参考：
https://rockylinux.org/ja/ （コミュニティに参加できます）
https://ja.m.wikipedia.org/wiki/Red_Hat_Enterprise_Linux
https://www.google.com/amp/s/www.debugpoint.com/2020/12/rocky-linux/amp/
CentOS Stream 8 を Hyper-V環境にインストールする

#1. ISOイメージをダウンロードする

以下からISOイメージをダウンロードします。私の環境は Windows 10 なので、`x86_64` 版をダウンロードしました。
https://www.centos.org/download/

#2. 起動時の設定

セキュアブートが有効になっていると ISO を認識しないので無効にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99425/51abc96c-d7c0-55b6-c4db-81490c0584cf.png)

#3. インストール

後は普通にインストールしていくだけです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99425/e4c9f980-6445-14cc-554d-550dd8818016.png)

日本語を選びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99425/7a933af4-0cda-5950-0bc1-f269fbb817af.png)

一つ一つクリックして設定していきます。警告マークが出ている所は、最低でもクリックして確認する必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99425/ba515907-07e2-0166-bb84-e5242336b0b3.png)

ディスクは確認するだけでデフォルトを使用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99425/d1edfaf6-93b0-9b57-c518-d5d75605f256.png)

root のパスワードを設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99425/91099810-9335-ee47-151a-f2de9fcc4bba.png)

ユーザーを作成します。管理者にしておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99425/34a7df35-d1ce-bb21-6382-fa6998f0710c.png)

ネットワーク接続はデフォルトでONにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99425/e6a13f55-5a61-8ffe-c1a7-66c4c4531dec.png)

インストールソースには、
`mirror.centos.org/centos/8-stream/BaseOS/x86%5f64/os/`
を指定します。(%5f(アスキーのアンダーバー(_)でした。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99425/bce188ee-e46d-eb4d-a474-b8060d508240.png)

ソフトウェアの選択はお好みです。ここではデフォルトの「サーバー(GUI使用)」を選択しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99425/0b17c46c-838d-0468-9831-5f2c93353ee2.png)

時刻はデフォルトアメリカなので、日本に設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99425/7092ecd5-0e11-041b-d864-19c4b9226b48.png)


一通り設定が終わるとこんな感じです。少なくても警告アイコンは全て消えているはずです。「インストールの開始」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99425/6a8ffaef-2f44-1887-6af6-9488f1351340.png)

インストール完了まで待ちます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99425/25b301dd-47d2-8bb9-d589-2e9c07e91705.png)

完了したら再起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99425/0b6907ea-5b39-de9b-b87f-a75190c2e8fe.png)

再起動後、ライセンスに同意するように言われるので同意します。(現時点で表示は`CentOS`のままのようです)
以上でインストールは完了です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99425/407836d0-d0ea-306d-e2c9-1859d6caeec7.png)
rails チュートリアル10章まとめ（自己学習用）

#seeds.rbとは
初期データを生成してくれるファイルのこと。
このファイルにデータを生成するコードを書いておくだけで、アプリにデータを備えさせることができます。
簡単にテストデータを作ったりできます。

使い方
##1.自分が用意したいデータをファイル内でcreateする。

db/seed.rb
###通常の場合
User.create(name: "tanaka")
User.create(name: "sato")

###配列の場合
users = User.create([{name: "tanaka"}, {name: "sato"}])

###大量のテストデータの場合
100.times do |n|
  User.create(title: "test{n}人目", content:"test！#{n}回目")
end

##2.seedファイルを実行する

$ rails db:seed
おまけ
実際に存在しそうなデータを生成してくるgem(Faker)があるので一応載せておきます。

1.Gemfileに以下を追記

gem 'faker'
こちらも忘れず実行してください。

$ bundle install
2.seeds.rbを以下のように記述する。

db/seed.rb
100.times do |n|
  name = Faker::Name.name
  email = Faker::Internet.email
  content = "test"

  User.create(
    name: name,
    email: email,
    content: content
  )
end
3.seedファイルを実行する。

$ rails db:seed
※Fakerの使い方一覧は以下の表参照。

種類	役割
Faker::Name.name	名前
Faker::Internet.email	メールアドレス
Faker::Address.city	都市の名前
Faker::Food.ingredient	食べ物の名前
___
#paginationとは

Railsには豊富なページネーションメソッドがあります。今回はその中で最もシンプルかつ堅牢なwill_paginateメソッドを使ってみましょう。これを使うためには、Gemfileにwill_paginate gem とbootstrap-will_paginate gemを両方含め、Bootstrapのページネーションスタイルを使ってwill_paginateを構成する必要があります。まずは各gemをGemfileに追加してみましょう

①Gemfileにwill_paginateを追加する
②bundle install

____

#render @**

renderはパーシャルの読み込みだけでなく、＠userのような変数を与えると、railsは自動的にUserオブジェクトのコレクションを呼び出し、リストアップしその後、_userのパーシャルにデータを代入し、出力する。

___
#beforeメソッド（controllerで使用）
before_actionメソッドを使用することで、コントローラー内の特定のアクションを行う前に、before_actionメソッドを実施できる。（デフォルトは全アクション、：onlyで特定のアクションを指定できる）
使用例：ユーザー情報の更新、削除など

書き方
```before_action :logged_in_user, only: [:index, :edit, :update, :destroy]```
____
#Strong Parameters
Strong Parametersを使うことで、必須のパラメータと許可されたパラメータを指定することができます。さらに、上のようにparamsハッシュをまるごと渡すとエラーが発生するので、Railsはデフォルトでマスアサインメントの脆弱性から守られるようになりました。

この場合、paramsハッシュでは:user属性を必須とし、名前、メールアドレス、パスワード、パスワードの確認の属性をそれぞれ許可し、それ以外を許可しないようにしたいと考えています。これを行うには、次のように記述します。

```params.require(:user).permit(:name, :email, :password, :password_confirmation)```
このコードの戻り値は、許可された属性のみが含まれたparamsのハッシュです（:user属性がない場合はエラーになります）。

これらのパラメータを使いやすくするために、user_paramsという外部メソッドを使うのが慣習になっています。このメソッドは適切に初期化したハッシュを返し、params[:user]の代わりとして使われます。

___
#data:{confirm:   }
Railsではデータの削除時などに簡単に確認ダイアログを表示する仕組みが用意されています。
下に示すlink_to メソッドの引数に data: {confirm: 'メッセージ' } のように記述することにより、 リンクやボタンをクリックする際にブラウザに組み込まれている確認ダイアログを表示させることができます。
Web API入門#3 〜URIの基礎知識〜

## はじめに

タイトルについて記事にしました。
この記事で得る内容は以下の通りです。

・ URIの基礎について

■ Web API入門についての過去記事
・ [Web API入門#1 〜APIとWeb API、Webの概要〜](https://qiita.com/s79ns/items/8dd2f06145cbf9464b99)
・ [Web API入門#2 〜REST、アーキテクチャについて〜](https://qiita.com/s79ns/items/bd8b1f50c34ada016196)

## URIについて

前回、前々回でURIは、Web上にあるリソースを識別するIDであると説明をしました。

URIにアクセスをすることにより、リソースを使ってデータを加工し、Webページを表示したり
データを操作して、APIにリクエストを要求し、リソースを変更したりetc...色々なことができます。

また、URIはリソースを識別するIDなので、一意性（重複してはならない）である必要があり、構文が定められています。

## URIの構文

次に、URIの構文について説明をします。

```terminal
https://s79ns:pass@qiita.com:8000/posts?id=1&category=api#about
|  ①  |    ②    |    ③    | ④ |  ⑤  |       ⑥       |  ⑦  |
```


**① URIスキーム**・・・通信プロトコルを指すことが多く、大半はhttpかhttpsです。

**② ユーザー情報**・・・あまり使いませんが、username:passwordの形式で表現します。
　　　　　　　　　　 ※ herokuの自動デプロイ設定時にs79ns/portfolioのように指定した記憶があります。

**③ ドメイン名**・・・DNSで名前解決できるドメイン名 or IPアドレスで、大半はドメイン名が使われます。
　　　　　　　　　 ※ 指定したドメインを使ってアクセスできるかどうかで、名前解決できるか判断します。

**④ ポート番号**・・・プロトコルで用いるTCPポート番号です。
　　　　　　　　　 ※ ポート番号は、家があったとしたら、家のドアにあたります。

**⑤ パス**・・・階層を表す、一意なリソースを表します。
　　　　　　 ※ パスは、postsという部屋の中の、更に奥のことを指します。（押入れなど）

**⑥ クエリパラメータ**・・・名前＋値形式で情報を追加していきます。（&でつないで次のカテゴリー=値...）

**⑦ URIフラグメント**・・・ Webページの内部の位置を示します。
　　　　　　　　　　　　 ※ HTMLでid属性をつけて、特定の位置までスクロールするアレです。

## URIのパス指定方法

今回、3つご紹介します。

#### 絶対URI

先頭からの完全パスです。例えば下のような絶対URIは、editにアクセスする時は、先頭からアクセスをします。

```terminal
https://qiita.com/edit
```

#### 相対URI

起点から相対的なパスを指定します。絶対URIで指定すると冗長になってしまう時に使い、cdコマンドでディレクトリ間を移動する方法と考えは同じです。

#### ベースURI

相対URIの起点を決めるためのURIです。HTMLのheadタグ内にbaseタグを指定するやり方であったり
様々な手法があるようです。

## URIと文字

URIは使える文字が限られており、これらのASII文字を使うことができます。

・ アルファベット（大文字小文字問わず）：A〜Z

・ 数字：0〜9

・ 記号：-（ハイフン） .（ピリオド） 〜（ニョロ） ：（コロン）@（アットマーク）( )（かっこ開きと閉じ）
　　　　！（エクスクラメーション）$（ダラー）&（アンパサンド）'（シングルクォーテーション）

日本語などの文字はそのままだと使うことができず、表示する際は、<font color="red">%エンコーディング</font>が必要です。
実際のURIが左のように表示されていても、コンピュータでは%エンコーディングにより右のように処理します。

```terminal
https://qiita.com/あ　→　https://qiita.com/%E3%81%B2
```

UTF-8のような文字コードは、表示するコードやコンピュータが実際に扱う文字の対応表みたいな存在です。

## 次の記事はこちら

[Web API入門#4 〜クールなURIの設計方法について〜](https://qiita.com/s79ns/items/e2f3b6f66059c2917206)
Linux Mint20.1でNvidia GTX1650に換装した話

![1650.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33927/c03d1008-33f8-215c-5fc7-acc88096012a.jpeg)


#発端
先日、Linux Mint20.1にCUDAをインストールしてさあ、GPGPUを再開しましょうと意気込んでいると・・・動作しません。端末からnvidia-smiと入れるとエラーです。ドライバがうまく機能していないようです。使っていたのは古いGTX960です。もう対応してないのかも？とこの際、GTX1650に換装しました。試行錯誤の上、CUDAも動作するようになりました。後日のために記録します。


#ハード
もともとはドスパラ製のガレリアというゲームマシンです。GPGPUを試すのに買ったものでした。ドスパラの店員さんに相談してみたら、GTX1650への換装は特に問題なさそうです。msi製のAERO　ITX1650を購入しました。1万5千円程度でした。補助電源もGTX960と同じものでOKでした。サイズは1650の方が小ぶりで、余裕でボードに収まりました。


#ドライバのインストール
問題はソフトウェアの方でした。次の手順でやるとうまくいきます。


〇まず、普通にLinux Mint 20.1をUSBブートでインストールします。そして再起動して作業開始です。

〇最初にやることはインターネットへの接続です。これがないとドライバを取得できません。私の場合、有線接続なので以前の自分の記事を見ながらネットに接続しました。
https://qiita.com/sym_num/items/cfb32a3841721eed98e4

〇端末より  sudo apt update     sudo apt upgrade を実行します。
けっこう時間がかかります。20分くらいかかってました。
途中、次のような画面になります。セキュアブートのためにパスワードを2回、入力します。
![upgrade1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33927/a31f3c84-601a-7b44-fec2-06f9b7e052cf.jpeg)

![upgrade2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33927/bf5f7a48-121d-29a1-d270-d8bdd904d7ce.jpeg)



〇メニューからドライバマネージャを呼び出します。
当初は次のような状態です。
![driver1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33927/77a33831-5022-1f24-c801-3fbb11f78e20.jpeg)


〇再起動　
これを推奨である４６０に変更します。そして再起動です。ここからが重要です。セキュアブートです。次のように画面で矢印キーで選択して進みます。これをやらないで単に進んでしまうとドライバが正しくインストールされません。途中パスワードの入力を求められます。これはupgradeの時に入力したものを入力します。エコーは表示されません。
![driver2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33927/1b69e96c-9130-58f4-1eb3-8d1a6c8c2e59.jpeg)

![driver3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33927/4026aa1b-dfe6-0b4c-8e95-5b43230ca995.jpeg)

![driver4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33927/13ce0a12-56fc-0d7c-1649-6954364ff582.jpeg)

![driver5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33927/76ea386a-be60-9eb0-2b74-3f40dad49a47.jpeg)

![driver6.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33927/e069faf7-4166-1ea9-0952-5fbe91223519.jpeg)


〇確認
再起動したら再度ドライバマネージャで確認します。正しく推奨の４６０に変更されています。


〇換装
ここまで来たらいったん電源を落とします。GTX960のボードを外し、GTX1650のボードに入れ替えます。補助電源のプラグの接続を忘れないように。

〇電源投入
これで動くはず・・・が、画面が真っ黒のまま先に進みません。おかしいなぁ？　一度、電源を強制的に落として再起動させました。今度は正しく動作しました。

〇CUDAインストール
あとはひたすらCUDAのインストールです。下記の記事を参考にしてください。
https://qiita.com/sym_num/items/557f2a17eda5e2c90706

さあ、どうでしょうか？
![Screenshot at 2021-01-11 11-24-39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33927/2e1d4ca2-dbca-2a21-3ffe-ef186809ac35.png)

上手くいきました。
レジストリやグループポリシーのようなパスを含む設定情報をExcelでまとめる方法

レジストリやグループポリシーの設定を設計書にまとめるとき、どのように記載しているでしょうか。多くの会社でよく見かけるのは、以下のような形式です。
(入力されている値は適当です)
![Bad_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39277/1ac1365a-43b8-d723-5881-6e5671213130.jpeg)
私はこの形式をモザイクエクセルと呼んでいる。この形式で書くと、とにかく膨大な手間がかかる。難しく考えずに以下のようにリスト形式で書けば、驚くほど簡単にデータはまとまる。
(入力されている値は適当です)
![Good_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39277/3344b78f-6433-aa2f-4159-5d1e72b6ce3b.jpeg)
#なんでこうなったか？
![Bad_2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39277/b3c4c716-bd5c-8d6a-69d2-cdf60eeaccb9.jpeg)
たしかに、なんとなく纏まってる感が出せる。ただ、パスのデータでひとまとめにしたいなら、以下のような書き方でも十分分かりやすい。
![Good_2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39277/042316d3-746f-e15b-1725-e08ac55977ea.jpeg)
モザイクエクセルでまとめても、手間ばかりかかるので、ドキュメントを作成する工数を圧迫する。モザイクエクセルは単に手間がかかるだけではなく、様々なデメリットがあるので注意して欲しい。
#モザイクエクセルのデメリット
##ぱっと見で件数が分からない
![Bad_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39277/b1552466-e278-76e4-a747-80e3cdc8c68f.jpeg)
この表を見て、何件設定値があるかすぐにわかるでしょうか？数件程度であればすぐにかを得られるが、これが数十件、数百件となったらまず分からない。これをリスト式でまとめた場合、単純に行数をかぞえればいいので簡単に件数を把握することができる。
##フィルタの機能が使用できない
Excelのフィルタは、リスト形式でデータをまとめておかないと正確にデータをフィルタリングできません。モザイクエクセルでも範囲指定をしてフィルタをかけることは可能です。しかし、リスト形式になっていないので、意図しない作動をするリスクが高いです。
##更新するときの手間が膨大にかかる
パスの情報が複数行にわたっているのと、他の行のデータにも関連付けられているので、更新する際に確認する項目が非常に多くなり、工数がかかってしまう。データを追加しようと思えば、まずは表全体を見て同じパスのデータがあるかを確認しなければならない。データを削除するときは、階層を崩さないように細心の注意を払う必要がある。また、罫線を複雑に引いているので、罫線の引き忘れなどでフォーマットが崩れやすい。

##改ページした時にデータが欠ける
エクセルモザイクをそのまま印刷すると、改ページが入ったところが以下のように上のデータが欠けて印刷されてしまう。
![Bad_3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39277/979f75e4-e1f5-fa9b-d8d2-9c4094775896.jpeg)

これを避けるためには、改ページごとに上の階層データを張り付けたり、改ページの位置を調節する必要がある。自動化するにしてもロジックが複雑になりやすいうえに、意図しない形に出力された場合、手で修正するしかない。

##階層の深さで列が増減する
パスのデータ一階層につき一列を割り当てているので、パスの深さで列数が増減する。そのため、データによって表の大きさが変わってしまう。また、単純に列を挿入した時に罫線がずれてしまうこともあります。

#どう対処すればいいか？
お客さんの要求でこの形式を要求されることもあります。バッドノウハウであるのは分かっていても、それで対応しなければならない事態もあります。そういう事態の対応方法です。

##モザイクエクセルを作成する前にリスト形式の表を別に作っておく
本末転倒かもしれませんが、モザイクエクセルの表を作る前にリスト形式の表でデータをまとめておきましょう。リスト形式で作成した表のパス(モザイク化する部分)をソートすると、どういう構造でモザイクエクセルを書けばいいかがまとまります。

##モザイクエクセルを読み解くためにリスト形式の表に書き起こす
どんなデータがあるのかあらかじめ知っている状態であれば、モザイクエクセルの表でも見て理解することは可能になります。逆説的ですが、モザイクエクセルに記載されているデータを把握するために、リスト形式の表にデータの書き出しを行います。
##わざわざ別表をつくるのは二重管理にならないか？
二重管理になります。しかし、モザイクエクセルで一元管理するリスクに比べれば二重管理の方が安全で確実です。ただ、更新する際は必ずリスト形式の方をメインにしましょう。フローさえしっかり守れていれば、二重管理であってもデータの質を担保できまます。二重管理の非効率よりも、モザイクエクセルでデータを管理する方がはるかにリスクが高いです。

#結論
レジストリやグループポリシーのデータはリスト形式でまとめましょう。ドキュメントとして書き出す時には、以下のような表記も有効です。
![Good_3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39277/d396ab83-608e-ff0f-87ac-eaf6200e4acd.jpeg)
Excelのフィルタ機能は使えませんが、見出しをうまく振ることでカテゴライズがしやすいです。データが十数件程度でフィルタをかけるような必要が無い場合に有効な形式です。
自動的に作成される仮想NICのMACアドレスをイベントドリブンに変更する方法

# 概要

Linuxでは簡単にNICのMACアドレスを変更できる。
仮にベアメタルマシンに対して直接Linuxをインストールしているような状況であっても同様。
物理的なMACアドレスは変わらなくても、OSとして認識する論理部分としてMACアドレスを上書きできる。

一方で、現代のOpenStackやK8sなどでは、仮想的なNICが自動的に作成されるシーンが非常に多い。
こういったシーンで、仮想的なNICのMACアドレスをどーーしても変更したいときの方法について書きたい。

もちろん仮想NICが作成後に、手動でそれを変更することは簡単に可能。
だが作成後に瞬時に通信開始するようなシーンの場合、それでは間に合わないこともある。何より面倒くさい。
なので自動的にやりたい。そういったときの方法を簡単ではあるが記事として残しておく。

正直、そんな状況なんてなかなかないとは思うが・・・一応誰かの役に立てれば幸い。
※私の場合、OpenStack on OpenStackな環境を作っていて、こういう状況に見舞われた

そしてもっと良い方法があれば是非教えてください！

# 方法

udevさんを使って自動的に変更してもらう。マジでudevさん便利すぎ。

以下のようなルールファイルを作成し、/etc/udev/rules.d/配下に置いておく。配置しておくだけで自動的に機能してくれる。

* `KERNEL`による条件式で対象NICを判定する。
	* ここでは`*`なども使える。
	* しかし特定NICに特定MACアドレスを付与したいはずなので、多くはNIC名を直書きだと思う。
* `RUN`で任意のコマンドを実行可能。ここでipコマンドを叩いてMACアドレスを変更させる。
* `$name`にはNIC名が代入されている。RUNと組み合わせて使用することで特定のNICを狙い撃ちすることが出来る。
* `[macaddress]`には変更したいMACアドレスを指定する。

```
ACTION=="add", SUBSYSTEM=="net", KERNEL=="[nic_name]", RUN+="ip link set dev $name address [macaddress]"
```

上記は単一ルールファイルに複数行書いておくことも可能。MACアドレス変更系は1つのファイルにまとめて書いておいたほうが便利だと思う。

* 例

```/etc/udev/rules.d/75-mac-spoof.rules
ACTION=="add", SUBSYSTEM=="net", KERNEL=="vlan1000", RUN+="ip link set dev $name address 0a:1b:2c:3d:4e:5f"
ACTION=="add", SUBSYSTEM=="net", KERNEL=="vlan2000", RUN+="ip link set dev $name address 00:11:22:33:44:55"
ACTION=="add", SUBSYSTEM=="net", KERNEL=="vlan3000", RUN+="ip link set dev $name address aa:bb:cc:dd:ee:ff"
```
初めてRailsアプリをproductionモードで起動する（ローカル）

##環境
Ruby : 2.6.6
Rails : 6.0.3.4

##SECRET_KEY_BASE を設定する
まずターミナルで以下コマンドを打ち、keyをコピーします。

```terminal:ターミナル
% bundle exec rails secret
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
```

エディタを開いて、SECRET_KEY_BASE: xxxxxxxxxxxxxxxxxxxxxxxxxxxと言う様な感じで、先ほどのkeyをペーストします。

```terminal:ターミナル
% EDITOR="vi" bundle exec rails credentials:edit
```

```vim:vi
SECRET_KEY_BASE: xxxxxxxxxxxxxxxxxxxxxxxxxxx
```

##アセットプリコンパイル
```terminal:ターミナル
% RAILS_ENV=production bundle exec rails assets:precompile
```

##DBのセットアップ

production用のユーザーとデータベースを作成します。

```terminal:ターミナル
% bundle exec rails db

mysql> create user 'your_user'@'localhost' IDENTIFIED BY 'your_password';
mysql> select User,Host from mysql.user;
+------------------+-----------+
| User             | Host      |
+------------------+-----------+
| mysql.infoschema | localhost |
| mysql.session    | localhost |
| mysql.sys        | localhost |
| your_user        | localhost |
| root             | localhost |
+------------------+-----------+
5 rows in set (0.01 sec)


mysql> create database `your_database`;
mysql> use your_database;
mysql> grant all on * to 'your_database'@'localhost';
mysql> grant all privileges on your_database.* to 'your_user'@'localhost';
mysql> show grants for 'your_user'@'localhost';

+----------------------------------------------------------------------+
| Grants for your_user@localhost                                       |
+----------------------------------------------------------------------+
| GRANT USAGE ON *.* TO `your_user`@`localhost`                        |
| GRANT ALL PRIVILEGES ON `your_database`.* TO `your_user`@`localhost` |
+----------------------------------------------------------------------+
2 rows in set (0.00 sec)

mysql> exit
```



```yml:database.yml
production:
  # <<: *default
  adapter: mysql2
  encoding: utf8
  database: your_database
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  timeout: 5000
  username: your_user
  password: your_password
  socket: /tmp/mysql.sock
# abase: db/production.sqlite3
```
作成したデータベース名とユーザー名・パスワードをセットします。

##DBマイグレーションとRailsの起動

migrateとseedを読み込みます。

```terminal:ターミナル
% RAILS_ENV=production bundle exec rails db:migrate
% RAILS_ENV=production bundle exec rails db:seed
```

productionを指定してサーバーを起動します。

```terminal:ターミナル
bundle exec rails s -e production
```

##あれ？コンパイルができていない...
config/environments/production.rbを書き変えます。

```ruby:config/environments/production.rb
# config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present?
config.public_file_server.enabled = true
```


これでちゃんとpuroductionで起動できました！

##参考
参考にさせていただきました。ありがとうございます！
https://qiita.com/mokuo/items/b766ca36521530fd3084
https://qiita.com/at-946/items/b7d467bf25c40fcfca44
2021 slack絵文字、2分で一括登録

（2021年1月）
現在slack本体に、絵文字を一括で登録する機能はありませんが、一括登録させる補助ツールとしてGoogleChrome拡張「Neutral Slack Emoji Tools」が配布されています。
その使い方を説明します。
## 絵文字準備

 1. アイコン画像を用意(参考 [日本語絵文字セット](https://github.com/mash76/slack_emoji_japanese/archive/master.zip))
 2. GoogleChromeに拡張[Neutral Slack Emoji Tools](https://chrome.google.com/webstore/detail/neutral-face-emoji-tools/anchoacphlfbdomdlomnbbfhcmcdmjej?hl=ja&gl=JP)を適用

## Slackに登録


3.slackのの ```設定と管理 > 以下をカスタマイズ```と選択

- アプリ版を使っていてもWeb版を使っていても、設定画面はWebに飛びます。

![emoji1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31243/5f435cd4-4d34-bc87-d9b4-288f3a90d8d6.png)

4.準備として絵文字を1つ登録

  - ```カスタム絵文字を追加する > 画像をアップロードする```で画像を一つ登録。
  - まず１つ登録すると、以後一括登録欄がでてきます。

![emoji2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31243/d8504227-3998-0191-5cb1-a8d81978d6c4.png)

5.一括登録欄が出てくる

![emoji3_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31243/efb1cc89-de10-82ce-b28e-56eb57fcade5.png)

6.絵文字ファイルをフォルダごと登録欄に放り込めばOK。登録された絵文字が一覧で出ます。

![emoji4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31243/042f256e-54d3-2e93-7e9b-12b8a6a0b7a5.png)

## 補足

・登録した絵文字はsugoi.pngなら、そのまま名前になって:sugoiで呼び出せます。
・絵文字作成は[絵文字ジェネレーター](https://emoji-gen.ninja/)のサイトが便利です。
・記事を書いている私の環境は、MacbookPro2019、MacOS BigSur、GoogleChromeです。
mac miniでmountコマンドが見つからない(mount: command not found)

`sudo mount -uw /`を実行したら、`sudo: mount: command not found`って出た。

## 環境

- M1 Mac mini
- Big Sur 11.1

## 対応

`/sbin`を見ると`mount`が存在したので、`.zshrc`に以下の変更をした。

```bash
PATH=/bin:/usr/bin:/usr/local/bin:${PATH}
↓に変更
PATH=/bin:/usr/bin:/usr/local/bin:/sbin:${PATH}
```

## 雑談

うーん、この辺の知識の乏しさを感じる。。。
こんなのはlinuxの学習でどうにかなるのだろうか。

参考記事：https://www.reddit.com/r/MacOSBeta/comments/dg0mst/command_not_found_mount_since_update_to_catalina/
cloud9環境でgithubの初回pushができなかった話

#エラー内容

・cloud9でenvironmentsを作成。
・作成時にUbuntuを選択。
・rails newでrailsアプリケーションを作成
・git関連の以下を実行

```
$ git add -A

$ git commit -m "xxx"

$ git remote add origin "xxx(github上のリポジトリURL)"

$ git push -u origin main

error: src refspec main does not match any.
error: failed to push some refs to 'https://github.com/xxx/xxx.git'

```

このエラーでしばらく引っかかった。


#解決策
<strong>ローカルリポジトリのブランチ名をmasterからmainへ変更してからpushすると解決。</strong>


#なぜか？？

https://www.publickey1.jp/blog/20/githubmainmastermain.html
最近、githubのデフォルトブランチが「main」に変更されている。

だがcloud9でローカルリポジトリを作成（git init）するとブランチ名は（master）になっているため、エラーがでていた。

　
　

https://microayatron.com/cloud9-git/
> 
```
$ git push アップロード先のリモートリポジトリ名 ローカルブランチ名
$ git push -u origin main
```
Gitは上流リポジトリ(この場合GitHub上のリモートリポジトリ)のうち指定がなければ同名のブランチにプッシュするようです。 もし同名ブランチがなければ勝手にリモートリポジトリに作成されます。

この

```
$ git push origin main
```
はorigin(github上のリポジトリ名)にローカルブランチ（main）をpushするよ！

という意味だけど、そもそもcloud9上でのブランチは「master」なので「mainなんてローカルブランチないよ」とエラーを返されていただけでした。

試してないが、おそらく

```
$ git push origin master
```
にしていたらエラーはでず、github上に「main」と「master」の２つのブランチが作成されていたと思われる。


git,githubの基本がわかっていなかったことが原因でした。
Apex クラスの　isClone() について

以下に興味深い質問がありました。

[isClone() in Apex not working as expected](https://trailblazers.salesforce.com/answers?id=9064S000000DUjnQAG)


調べてみると

The isClone() method will only return true for SObject that are clones in memory.

どうも、isClone()はメモリー上だけの動作のようです。
よって、データベースに保存されたものを呼び出しても機能しません。

あんまり深く考えたことなかったです。


# フローから使う場合

+ [Record Cloneを使用してコピーレコードを作成し、そのコピーレコード内にある参照項目にコピー元のレコードを関連付けたいと考えています。](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000KfNc4)

:::note
Apexの[getCloneSourceId()](https://developer.salesforce.com/docs/atlas.en-us.apexref.meta/apexref/apex_methods_system_sobject.htm#apex_System_SObject_getCloneSourceId)を使えばクローン元のIDは取得できると思います。

アイデアを読むと ISCLONEはフローでも使えるようになったようですが、getCloneSourceId()と同じ機能はフローでは実装される予定はないみたいです。

これから考えるとgetCloneSourceId()を使ったApexのコードをフローから呼び出せるようにすれば可能だと思います。

https://ideas.salesforce.com/s/idea/a0B8W00000H4CrEUAV/flow-isclone-and-getclonesourceid-functions
:::
Haskell stackのダウンロードが遅い場合に清華大学のミラーサイトを使う

Haskell [stack](https://github.com/commercialhaskell/stack/)ではコンパイラ(GHC)やパッケージインデックスをダウンロードすることがあるが、これがとてつもなく遅くなることがあるようだ。

- [stack setup download incredibly slow · Issue #2240 · commercialhaskell/stack](https://github.com/commercialhaskell/stack/issues/2240)

先日久々に`stack setup`でGHCをインストールしようとしたが、10kB/sくらいしかスピードが出ず、結局ダウンロードに数時間かかった。また、パッケージインデックスの更新もとにかく時間がかかりそうな雰囲気で、途中で諦めてしまった。

代替手段として、清華大学が提供しているミラーサイトを使う手があるらしい。

- [hackage | 镜像站使用帮助 | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror](https://mirrors.tuna.tsinghua.edu.cn/help/hackage/)
- [stackage | 镜像站使用帮助 | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror](https://mirrors.tuna.tsinghua.edu.cn/help/stackage/)

上記2つのミラー設定を~/.stack/config.yamlに加えたところ、GHCとパッケージインデックスのダウンロードともにそれほど問題なく完了できた。
pyenv-winのversionsにSystemを追加する

#0. はじめに
Pythonのバージョンを管理するpyenv。Mac,Linuxでは従来のPythonバージョンを呼び出すパスがSystemとして搭載されているがWindowsにはない。Qiita等多数のサイトを検索したが出てこなかったため、WindowsのversionsにSystemとして従来のPythonパスを追加する方法を以下にまとめる。動画解説は[ここ](https://youtu.be/cX36e-Z12qw)をクリック。
#1. シンボリックリンク
シンボリックリンクとはディレクトリを参照するものであり、ショートカットと似たようなものである。これらの違いは種類がフォルダとなるかショートカットになるかの違いだ。
versionsに従来Pythonのフォルダショートカットを作成したが読み込むことができなかった。恐らくpyenvコマンドの`versions`はフォルダしか認識していないのだろう。管理者権限で開いたコマンドプロントで以下を叩くとシンボリックリンクが作成される。

```ruby:cmd.exe
mklink /D <作成するディレクトリのパス> <既存のディレクトリのパス>
```

#2. Systemとして追加
早速追加していこう。管理者権限で開いたコマンドプロントで以下を叩く。

```ruby:cmd.exe
mklink /D C:\Users\mai\.pyenv\pyenv-win\versions\System C:\Users\mai\AppData\Local\Programs\Python
```

Pythonやpyenv-winのインストール先を変更していなければ私と同じパスになっているだろう。
`versions`で確認してもらうとインストールしたバージョンと同じようにSystemが表示される。後はバージョン変更と同様に

```ruby:cmd.exe
pyenv global System
```

と叩けば従来Pythonのバージョンになる。
#3. まとめ
このやり方では追加したSystemと従来のPythonは同期している。そのためpyenv環境下でインストールしたライブラリはpyenv環境を消して本来のPythonに戻った時にも残っているため注意が必要である。
MTUを変えなければ通信できない環境下におけるSelf-Hosted GitHub Actionsのコンテナ実行

# 概要

Self-HostedなGitHub Actionsでコンテナ実行する際、毎回コンテナネットワークが作成される。
仮に、その環境がMTUを調整しなければいけないNW環境である場合、コンテナ内部から大きなパケット通信が不可能になる。
何故か？現状のSelf-Hosted GitHub Actionsにおいては、デフォのMTU:1500でコンテナネットワークが作成されてしまうから。
もちろんコンテナNWが作成後に手動でMTU変更させれば良いが面倒くさい。コンテナNWも毎回名前が異なるし。

ということで、一応自動的に適用させる方法があるので、そのメモ的な記事。
ただもっと良い方法がある気もするので、ご存知の方は是非教えてください！

# 前提

* 仮想環境やNW環境によりMTU1500ではIPフラグメントが発生する環境
	* つまりMTUを1400などに下げなければ、大きなパケットが発生する通信が不可能になってしまう
* Self-Hosted GitHub Actionsであること
* コンテナ実行アクションであること

# 注意

MTUを変更するときは、daemon.jsonに設定を書く方法がよく使われるが、あれが適用されるのはデフォルトのコンテナNWのみ。
つまり、今回のケースにおいてはこの方法は使えない。

```daemon.json
{
	mtu: 1400
}
```

# 方法1: ジョブの中でMTU変更

一番手軽。ただし、毎回指定しなければならないので、個人的には面倒くさいと思う。
自分1人で使っているならまだしも、チームとかで使っている環境だと、毎回これ指定してね、と徹底する必要がある。

* optionsで`--cap-add NET_ADMIN`を付与
* runで`ip link set eth0 mtu [mtu_num]`を付与

```
jobs:
  conversion:
    runs-on: example-runner
    container:
      image: hogehoge:latest
      options: --cap-add NET_ADMIN
    steps:
      - run: ip link set eth0 mtu 1400
```


# 方法2: コンテナNW作成時にudevで自動的にMTUを変更

個人的にはこちらのほうがオススメ。自分自身、この方法を使っている。
/etc/udev/rules.d配下にudevルールファイルを置いて、コンテナNW作成時に自動的にMTUを変更してもらう。
KERNELにはコンテナNWの識別するための文字列を指定。
コンテナNWの場合、`veth`というプリフィックスがつく。そこにさらに`*`つけてどんなコンテナNWであっても判定されるようにしておく。
`$name`にNICの名前が代入されている。そのNIC名を使ってコマンド叩いてMTUを変更させる。

```/etc/udev/rules.d/75-mtu-force-change.rules
ACTION=="add", SUBSYSTEM=="net", KERNEL=="veth*" , RUN+="/sbin/ifconfig $name mtu 1400"
```

# あとがき

この問題はアップストリーム側でも報告され、議論がされているよう。
daemon.jsonで指定したMTUが自動的に適用されるようになると、一番良いとは思う。
ConohaのVPSからAmazon LightSailにサーバを移動①

# ConohaのVPSからAmazon LightSailにサーバを移動①

> 世は大VPS時代。自由(root権限)を求めてさまようエンジニアがワールドワイドウェブ（死語）に散らばる数多のサービスを渡り歩き幻の秘宝「一生付き合っていけるVPSサービス」を探していく物語が今、始まる。

_本記事はAWSとぃうか、Amazonのサービスをほとんど使ったことが無いガラパゴス人間によるものです。AWSを完璧に理解し使いこなせている諸兄にはちょっと物足りないと思います。_

# 目次

1. [動機](#動機)
2. [とりあえず使ってみる](#とりあえず使ってみる)
3. [とりあえず使ってみた](#とりあえず使ってみた)
4. [結論](#結論)
5. [参考文献](#参考文献)

# 動機
- ConohaのVPSをお安く使うクーポンの期限が切れた。
- ConohaのVPSをお安く使う株主優待用のGMO株を（キャピタルゲイン目的で）売っちゃった。
- たまたまConohaのVPSで使ってたCentOSがRedhatに見捨てられそうで、作り直そうと思ってた。
- Amazonにも国内リージョンの定額のVPSサービスがあるのを知った（海外あるあるの従量課金が大嫌い）。
- Googleにはそもそも定額のVPSサービスがなかった。
- クラウドサービスは「みんなで使えば怖くない」。Amazonは世界中が使ってる。
- Amazon Linuxが使える。（一々VPS向けのカーネルチューニングとかクソ喰らえだ！）
- 事業なら国内法人を使いたいけどプライベートなら別にAWSでいいかなって。

# とりあえず使ってみる

無料枠の詳細は[公式HPのFreeTier](https://aws.amazon.com/jp/free/?all-free-tier.sort-by=item.additionalFields.SortRank&all-free-tier.sort-order=asc)を参照。本記事作成時点では以下のようなFree Tierになっている。

```
無料トライアル Amazon Lightsail 750 時間(1 か月間)無料
仮想プライベートサーバーを簡単に利用可能に! コンピューティング、ストレージ、ネットワークなど、AWS でプロジェクトを始めるために必要なあらゆるものが用意されています。
30 日間無料 (750 時間/月)
Linux/Unix を使用する場合は、3.50 USD の Lightsail プランを 1 か月間無料でお試しいただけます
Lightsail for Microsoft Windows Server を使用する場合は、8 USD のプランを 1 か月間無料でお試しいただけます
```

FreeTier枠以外も使いたい場合は[公式FAQの「請求」](https://aws.amazon.com/jp/lightsail/faq/#Billing_and_account_management)をよく読むこと。特にデータ伝送量に対する請求の考え方は要チェックだ。

_やり方_
1. AWSアカウント作成(クレカ登録)
2. 最小モデル(1CPU,512M,20GSSD)の3.5USD／monthの仮想サーバインスタンスを選択作成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123740/b4ad2169-02a1-b838-481d-783cc8523c63.png)

えっ超簡単！

# とりあえず使ってみた

- 管理UI
    - 超シンプル。果てしなく分かりやすい。WebSSHも楽。
    - なんか、めっちゃでかいフォントで挨拶してくれる！
- ネットワーキング
    - 静的グローバルIPv4アドレス
        - 5つまで無料で貰えるらしいが、LightSailサーバにアタッチしなければ課金されるらしいので実質一個しか使えない。
        - デフォルトでDHCPで半固定IPv4アドレスが付与される。サーバ用途でこのサービスを使う多くのケースでサーバ作成後すぐグローバルIPv4アドレスを割当する事になるだろう。
        - 仮想サーバ自体はローカルIPしか持たない。外からのアクセスは送信先NATっぽい感じなので、VPNやIAP等の用途でサーバを踏み台にする場合はNATを考慮しよう。
    - ファイアウォール
        - 管理UIで簡単なインバウンドファイアウォールが無料で使える。動的にポリシーは作れない。（出来たらいいな！！）
        - SSHでfail2ban使いたいならtcp wrapperをポリシー適用先に使うべし。
    - DNSゾーン
        - LightSailサーバに近いポイントにDNSレスポンダ機能を持たせる事が出来る。ドメインレジストラ側でAmazon LightSailのネームサーバの指定が必要。ドメインレジストラ側でもネームサーバ機能を持っているケースが多いが、LightSail付帯のDNSサーバを使うことで将来的にレジストラとの依存関係を薄くすることが出来る。
- コンテナ
    - プライベートではこの機能使わんなぁ。自分でDocker立てるわ。
- ロードバランサ
    - プライベートではこの機能使わんなぁ。自分でnginx立てるわ。
- データベース
    - プライベートではこの機能使わんなぁ。自分で外部サービス使うわ。

```
[ec2-user@ip-172-26-15-175 ~]$ cat /etc/resolv.conf
; generated by /usr/sbin/dhclient-script
search ap-northeast-1.compute.internal
options timeout:2 attempts:5
nameserver 172.26.0.2
```

# 結論
移行しますしますします！　つづく
[ConohaのVPSからAmazon LightSailにサーバを移動②](
https://qiita.com/syakesaba/items/375f0b5971c5ba7ad575)

# 参考文献

- Amazon LightSail：[https://aws.amazon.com/jp/lightsail-vps/](https://aws.amazon.com/jp/lightsail-vps/)
- Amazon LightSail FAQ:  [https://aws.amazon.com/jp/lightsail/faq/#Billing_and_account_management](https://aws.amazon.com/jp/lightsail/faq/#Billing_and_account_management)
【ruby on rails + Mysql】herokuからAWSに切り替える際のデータ移行手順メモ

##内容
ruby on railsで作成したアプリケーションの本番環境をherokuからAWSに移行する際のデータ移行について備忘録として書き残す。

実際には本番稼働後にサーバー環境を移すというのはリスクと手間ばかりかかって悪手だとは思うのですが、個人開発なのでお許しを・・。

##環境
・ruby 2.7.1
・Rails 6.0.3.2
・mysql 5.7

以下のような形でAWSインフラを構築していることを想定

![スクリーンショット 2021-01-11 10.27.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668547/b7f3a4dc-1af6-f1a5-5526-7b39b6460985.png)



##heroku側：clearDB（Mysql）からデータのエクスポート
※本番環境の場合は、タイムラグによるデータ欠落等を防ぐため、一時的にサーバーを停止する等の措置が必要かと。詳しくはチームの方針に従ってください。ここではタイトル通りデータ移行の手順についてのみ記載します。

###データベースURL取得

```
$heroku config --app アプリ名 | grep DATABASE_URL
CLEARDB_DATABASE_URL:     mysql://<USER_NAME>:<PASSWORD>@< HOST >/<DB_NAME>?reconnect=true
```

###データのエクスポート
データのエクスポートをします。おそらくしばらく時間がかかるため気長に待ちましょう。

カレントディレクトリにdump.sqlが出力されていれば成功です。

```
mysqldump -uUSER_NAME -p -h HOST -r dump.sql --single-transaction DB_NAME --skip-column-statistics
```

パスワードを聞かれると思うので、入力してください。

オプションの内容を軽く説明しておくと、

--single-transaction・・・ダンプ処理をトランザクションで囲む。データの整合性を保つのに有効。MyISAMテーブルが含まれるDBでは別オプションが必要らしい。

--skip-column-statistics・・・mysqldump 8以降でそれ以前 (5.7とか) のMySQLサーバに対してダンプをする際に起こるエラーを回避。詳しくは筆者もよくわからない。。

以下記事参考
https://blog.pinkumohikan.com/entry/mysqldump-disable-column-statistics

mysqldumpのよく使うオプションを書いてくれている記事もあったため、リンクを貼っておきます。

**よく使うmysqldumpのオプションと使用例**
https://qiita.com/ryounagaoka/items/7be0479a36c97618907f

##AWS側：EC2へsqlを転送

前提
・ssh接続ができている
・クライアントのssh/configは以下の場合

```
Host myapp
        HostName        IPAddress
        Port            22
        IdentityFile    ~/.ssh/myapp_rsa
        User            hoge
```

以下コマンドを叩く

```
scp 転送元ファイル myapp:/転送先ディレクトリ
```

転送できない場合以下サイト等を参照
http://gallardolp570.hatenablog.com/entry/2014/11/17/205325

##AWS側：RDSにsqlをインポート

事前に接続先のエンドポイント、ユーザー名、パスワードを確認しておく。

```
mysql -h エンドポイント -u ユーザー名 -p DB名> dump.sql
```

進捗状況を確認したい場合はパイプで繋ぎpvコマンドをつけると良き
https://qiita.com/hiroq/items/efd8c3580c9c9457c869

反映されていればインポート成功です。お疲れ様でした。
見よう見まねの部分も多いため、何か誤り等あればご指摘いただけますと幸いです。

##参考サイト
http://kayakuguri.github.io/blog/2015/09/10/mysql-postgres-import-export/

https://photo-tea.com/p/aws-ec2-to-rds-csv/

http://gallardolp570.hatenablog.com/entry/2014/11/17/205325

https://www.it-swarm-ja.tech/ja/mysql/mysqldump%E3%82%A8%E3%83%A9%E3%83%BC1045%E6%AD%A3%E3%81%97%E3%81%84%E3%83%91%E3%82%B9%E3%83%AF%E3%83%BC%E3%83%89%E3%81%AA%E3%81%A9%E3%81%AB%E3%82%82%E3%81%8B%E3%81%8B%E3%82%8F%E3%82%89%E3%81%9A%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%81%8C%E6%8B%92%E5%90%A6%E3%81%95%E3%82%8C%E3%81%BE%E3%81%97%E3%81%9F/1043190719/

https://qiita.com/hiroq/items/efd8c3580c9c9457c869

https://blog.pinkumohikan.com/entry/mysqldump-disable-column-statistics
RailsでSlick使ったらTurbolinksで競合した。

Slickを業務で使用したところ、
Turbolinksの影響で初回読み込み時にスライド全体が右に寄ってしまう。
という現象が起きていたので解消した方法を残しておきます。
## 環境

* Rails5

* jquery-slick-rails

jquery-slick-railsというgemを使用していますが、
これを入れる前に本家からダウンロード版入れて実装していました。
この時にも同じ現象が起きていたのでツールのせいではないと思われます。
## 状況

silickの設定で` centerMode: true`にしたところ、
ページの初回読み込み時（正確にはcookieにログが残っていない時）に、
スライド画像が全体的に右に寄ってしまう。というものです。

centerModeではない時にはきちんと表示されるので、
なぜこの時だけなのかはすみませんがわかりません。
もしわかる方いらっしゃいましたらぜひ教えてください。

色々調べた結果、Turbolinksが関係しているとわかりました。
## 対処法

まず最初に解決した方法を記述します。
対象ページをTurbolinksを使用しないようにします。

```
<%= link_to url, data: { 'turbolinks': false } %>
```
に飛ぶリンクに対して`data-turbolinks="false"`をつけて、
そのページだけTurblinksをオフにします。
link_toに直接属性を追加していますが、
リンクを囲むdivタグを設置してこちらに属性を追加しても良いようです。

Turbolinksとは相性が悪そうですね。
Railsで使用する時には対策打っておいた方が良さそうです。
## その他の試した方法

* require turbolinksを削除する

これは本当にTurbolinksのせいなのかを確認した時に使った方法です。
基本的にはこちらはやらない方が良いでしょう。

* turbolinks: loadを使う

```
$(document).on('turbolinks: load', () => {
    $('#selector').slick({
        centerMode: true
    });
})
```

これは基本だと思うんですが、
今回はこれをやってもダメでした。
書き方が間違ってたのかな. . .??
こういうとこちゃんとわかってないないところに勉強不足を感じます。

今回参考にさせて頂いた記事はこちらです。
[Rails Turbolinksをページ毎に無効化する方法](https://qiita.com/keitah/items/05f02efe4e11ab2473e8)
ありがとうございました。
【メモ】【自分用】Djangoコマンド

### Djnagoコマンドのメモ書き
Djangoを使用した時に使ったもの
忘れないように

## Djangoインストール

```
pip install django
```
## プロジェクト作成
プロジェクト作成したいディレクトリで実行

    django-admin startproject "プロジェクト名"


## スーパーユーザ作成

```
python manage.py createsuperuser
```
## アプリケーション作成
manage.pyが格納されているディレクトリで実行
※プロジェクト作成時に出来たフォルダ内にmanage.pyが格納されている

```
python manage.py startapp "アプリ名"
```
## サーバー起動
manage.pyが格納されているディレクトリで実行

    python manage.py runserver
    python manage.py runserver "ポート番号"

## マイグレーションの準備
manage.pyが格納されているディレクトリで実行

    python manage.py makemigrations "アプリ名"

## データベース反映
manage.pyが格納されているディレクトリで実行

    python manage.py migrate
0-01.Salesforce トレーニング紹介

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332907/7695d529-8e6f-e00f-a454-bae23ebac22f.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332907/b3f5db69-1855-6a7a-9af8-cbe9d1f4a8af.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332907/790eef92-0885-04ea-fb12-80c5d0ff0a5a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332907/1927fdf2-a5b9-cfd0-d0bb-5f7e453196b6.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332907/d7389529-990e-ba4d-1c98-4e76d2d2216e.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332907/79531347-1b87-480c-5ffb-c1eb184fd357.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332907/5ab7f1ed-28fe-c7dc-75bd-36c5f30da649.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332907/4680a415-fbdb-6bd9-3ab2-ec808da43567.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332907/39f66983-a20f-d01c-d825-8009b755957d.png)

#1.Administrator
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332907/bf567cdd-7739-4faf-83e9-fe076e90ca5c.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332907/1d40609f-6203-ba8f-cc94-488078ccc381.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332907/2c63207b-a48a-0609-7c75-8ebfe8fcabfc.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332907/c7252438-7de6-9d44-78c2-db116e5c900c.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332907/5c559e73-887d-a5bb-4a42-35e49d71b506.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332907/8363efc3-8489-5499-b37e-b6b05b7346f5.png)

#2.Developer
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332907/563b4084-c682-2716-e753-12a293a2b69a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332907/2828eaa5-da38-6ec7-a8c2-6a6bb4d65527.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332907/4d71c40b-0681-37f5-a4a8-18f6acebfb2a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332907/534a9b88-bc8d-7d2e-b145-27abb0c2b626.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332907/aeddca1e-1437-7ee9-2af3-18d398946345.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332907/8ba94b27-4925-2cf0-5a94-93eb6c23e1f8.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332907/dbda5531-6fb7-538d-692a-a043031b68e6.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332907/9a972b9d-679d-1462-f973-13f053e6476b.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332907/f0c6eef4-9490-c941-a14e-cbb5d44c8e11.png)
効率的にサイト作り！Buefyでアイコンを表示しよう！！

僕は今年二十歳の代なので、今日は成人式に行ってきます！

なので、今日は時間がないため少し短めの内容となっております。

タイトルの通り、Buefyでアイコンを表示していきます。

アイコンの表示は他にもVuefyで行うこともできます。そのやり方は僕が書いた記事[え、アイコンでまだFontAwesome使ってるの？？？](https://qiita.com/akki-memo/items/485c8ff0ae67196347a4)を参考にして頂くと分かりやすいかと。

また、Buefyなんて聞いたの初めてという方は、こちらの記事[初心者必見！サイト制作は楽してなんぼ。CSSフレームワークBuefyの紹介！！](https://qiita.com/akki-memo/items/278ff2982961274955c4)を見ていただくと分かると思います！

それでは、Buefyを使ってアイコンを表示してみましょう！

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

必要なパッケージをインストールします。

```
npm i buefy
npm i sass --save-dev
npm i sass-loader node-sass --save-dev
npm i --save @fortawesome/fontawesome-svg-core
npm i --save @fortawesome/free-solid-svg-icons
npm i --save @fortawesome/vue-fontawesome
npm i --save @fortawesome/free-brands-svg-icons
```

``sass-loader``のインストールに成功しない方は``npm i sass-loader@8.* --save-dev``としてバージョン``8.*``を指定して見て下さい。

#Buefyの設定#

次にBuefyを使うための設定を行います。

``src\assets``に``buefy.scss``を作成して以下をコピペ。

```src\assets\buefy.scss
@import '../../node_modules/bulma/sass/utilities/_all';
@import '../../node_modules/bulma';
@import '../../node_modules/buefy/src/scss/buefy';
```

そして、srcディレクトリの``main.js``にて今作成したscssファイルとFontAwesomeの設定を行います。

```src\main.js
import { library } from '@fortawesome/fontawesome-svg-core'
import { fab } from "@fortawesome/free-brands-svg-icons"
import { fas } from "@fortawesome/free-solid-svg-icons"
import { FontAwesomeIcon } from "@fortawesome/vue-fontawesome"
import Buefy from 'buefy'
import Vue from 'vue'
import './assets/buefy.scss'

Vue.config.productionTip = false

// ここから
library.add(fas, fab);
Vue.component('vue-fontawesome', FontAwesomeIcon);


Vue.use(Buefy, {
  defaultIconComponent: "vue-fontawesome",
  defaultIconPack: "fas",
  customIconPacks: {
    fas: {
      sizes: {
        default: "lg",
        "is-small": "1x",
        "is-medium": "2x",
        "is-large": "3x"
      },
      iconPrefix: ""
    }
  }
});
// ここまで

// 以下省略
```

これでBuefyでアイコンを楽々とアイコンを呼び出せます！

#使いたいアイコンを決める#

Fontawesomeの[公式サイト](https://fontawesome.com/)から使いたいアイコンを検索して決めてください。

今回はTwitterアイコンを例にします。

#b-iconタグで設定#

使いたいアイコンを決めたら、``<i class="fab fa-twitter"></i>``このような欄があると思います。一番最初に、「fab」の部分を``pack``で指定します。

ただし、``fas``の場合は``main.js``の設定でデフォルトとして指定しているので``pack="fas"``の記述は要りません

```App.vue
<b-icon pack="fab"></b-icon>
```

次に、「fa-twitter」の部分を``icon``で設定し、適当にサイズを決めます

```App.vue
<b-icon pack="fab" icon="twitter" size="medium"></b-icon>
```

めちゃ簡単♪

以上、「効率的にサイト作り！Buefyでアイコンを表示しよう！！」でした！

良ければ、LGTM、コメントお願いします。

また、何か間違っていることがあればご指摘頂けると幸いです。

他にも初心者さん向けに記事を投稿しているので、時間があれば他の記事も見て下さい！！

Thank you for reading
【GCP】Cloud DNSで名前をつけてGAEからGKEにアクセスする

# はじめに

昨晩、ＧＡＥからＧＫＥにアクセスできるようになったことは、記事に書きました。

[【GCP】GAEからGKEへHTTPアクセスできた動作確認メモ](https://qiita.com/XPT60/items/d1b9a7561bc4fc0d2f11)

その続きです。昨晩は、GKE cluster にＩＰを直書きでアクセスしましたが、ここではこれを名前を付けてアクセスします。

# 動作確認

### Cloud DNS の設定

ゾーン名を private として、DNS　*.testzone.name. ととして作りました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294040/c163af62-c4ab-41fe-b80b-9633909b6b3f.png)


さらに、そのゾーンの中に「レコードセットの追加」により、クラスタの外部アドレス 10.146.0.9 を追加しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294040/752e6105-2f11-464f-c34d-a327123741a5.png)


レコードタイプのＡは、[サポートされているレコードの型](https://cloud.google.com/dns/docs/overview#supported_dns_record_types)に書かれていますが、ＩＰv4のことのようです。

### アクセス用

あとは、ＧＡＥからアクセスできるはずです。先の記事で使ったGAEのmain.py を書き換えます。

```python:main.py
import requests
...
        r = requests.get('http://testdns.testprivate.testzone/')
        #r = requests.get('http://10.146.0.9:80/')
```

さてさて。。。

### 動作確認

これで、同じように http://PROJECT_ID.an.r.appspot.com/ に接続すると、、、、

Hello World! response: (OK!)Hello, world! Version: 2.0.0 Hostname: hello-app-7f46745f74-24ldc

が表示されました。最初、Cloud DNS の設定がおかしくてできませんでしたが、正しく、上記のようにすると動きました。（ゾーンのタイプは「非公開」にします！！）

# まとめ

動いたので、良かった。これで、ＩＰアドレスじかうちでなく、一度名前を登録すればよく、ＧＡＥ側のメンテナンスは不要になる。こちらのCloud DNSも概要を理解できていないが、必要とあればまたドキュメントを読むのでしょう。

- GCPの説明：[Cloud DNSの概要](https://cloud.google.com/dns/docs/overview)

今日は朝にこれが終えられてよかった。休日だけど。
(2021/1/11)
Githubにrbファイルをpushする

# はじめに

学習したもののアウトプットとして、出来上がったソースコードをgithubへpushしようと思います。
今回はその練習として単純なrbファイルをpushしてみたので、記録しておきます。

# GitHubでリポジトリを作成する
まずはリポジトリを作成します。
GitHubにログインした状態で、「Create repository」をクリック。
![E8B3739D-0373-4EC1-A224-FE14F5860799_4_5005_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/999125/dfe790f8-eb5d-4d97-3641-e6ab8e70777c.jpeg)
「Repository name」に任意の名前を入力し（今回はtestrubyと命名）、ポジトリの種類を「Public」にしておきます。
![3E8B7F4D-77F2-4349-9070-980D193BF3DC_1_105_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/999125/1a291d52-1d77-ae51-a0c1-8a760022bf70.jpeg)
「Create repository」をクリックし、リポジトリの作成は完了です。
次の画面でリモートリポジトリのアドレスが表示されますので、控えておきます。
# ターミナルを起動
ターミナルを起動し、以下のコマンドを入力します。

```
% mkdir test
% cd test
% git init
```

「mkdir」　コマンドは空のディレクトリ（ファイル）を作成するコマンドで、今回は「test」というディレクトリを作りました。
「cd」　コマンドはディレクトリを移動するコマンドで、testディレクトリに移動し作業に取り掛かります。
「git init」　コマンドはGitリポジトリを新たに作成するコマンドです。
このコマンドにより、ディレクトリ内に「.git」という隠しファイルが作成され、gitコマンドが使えるようになります。

※リポジトリ：ファイルやディレクトリの状態を保存する場所、自分のマシンにあるものをローカルリポジトリ、ネットワーク上にあるものをリモートリポジトリと呼ぶ。

# ファイルをインデックスに追加（git add）
事前に作成しておいた「index.rb」というファイルをインデックスに追加します。
以下のコマンドでインデックスに追加します。

※インデックス：リポジトリにコミットする準備をするために変更内容を一時的に保存する場所。ステージとも呼ぶ。
※コミット(commit) ：ファイルの追加や変更の履歴をリポジトリに保存すること。

```
%git add index.rb
```

ちなみに用意したrbファイルの内容は以下の通り。

```ruby:index.rb
puts "Hello,World!"
puts 1 + 2

```


# 変更結果をローカルリポジトリにコミットする（git commit）
次に、インデックスに追加されたファイルをコミットします。

※コミット：ファイルやディレクトリの追加や変更をリポジトリに記録する操作。


```
% git commit -m "add new file"
```

-m以降はコミットメッセージと呼ばれ、コミットの内容を端的に伝えるためのものです。

# リモートリポジトリへpushする（git push）
ローカルリポジトリの変更を、GitHub上にあるリモートリポジトリに反映させます。
その前に、リモートリポジトリの情報を追加します。

```
git remote add origin（リモート名） リモートリポジトリのアドレス
```
リモートを登録する際には名前を付ける必要があり、一般的には「origin」とすることが多いということです。
続いて、以下のコマンドを打ちます。

```
git push origin master
```

GitHubのユーザ名とパスワードを入力したら、プッシュの完了です！これで、リモートリポジトリへ反映させることができました。
![AA7B9492-3DA4-4FBC-991B-78D146204630.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/999125/8ffcf6fa-7f12-844b-dca2-4a1e5c89482e.png)


※プッシュ(push) ：ファイルの追加や変更の履歴をリモートリポジトリにアップロードするための操作
# 終わりに
CUI(Character User Interface; コマンドによる操作)で行うことにより、開発現場の状況に近づくことができました。
共有フォルダにﾎﾟｲｰでやってきた身としては大変でしたが。。。
しばらくは一人で開発することになりますが、いずれお世話になることでしょう。

今回が初の記事投稿です。また気づいたことがあれば投稿できたらいいなと思います。
WordpressでjQueryが動かない

#課題
WordpressでjQueryが動かなかった。


```html:動かなかったコード
<div>
  <script>
    $(document).ready(function(){
      console.log($("#element_id").val());
    });
  </script>
</div>
```

#結論
Wordpressではデフォルトで $ が動作しないらしい。
色々試してみて以下のような書き方で動いた。

```html:動いたコード
<div>
  <script>
    jQuery(function($) {
      $(document).ready(function(){
        console.log($("#element_id").val());
      });
    });
  </script>
</div>
```
要はjQuery(function($){})で囲めばいつも通りよと言う話らしい。
私のWordpress素人であるせいですが、記事に従っても素直に動作してくれることが少ない。

#参考情報
【すぐ解決】WordPressでjQueryが動かない原因と正しい使い方！jQueryプラグインを使う手順も解説
https://briarpatch.co.jp/wp-jquery