OmniAICreator/Qiita-1.07M huggingface dataset:
1分でできる初めてのPython（Google Colaboratory）

# Google ColaboratoryでPythonを簡単実行

**「Pythonのプログラムを書いてみたい！」**

と思った場合、まず問題になるのが**Pythonを実行する環境の構築**です。
手軽に始めたいのであれば**「Google Colaboratory」**を利用するのが最も簡単です。

必要なものは**Googleアカウント**だけ。面倒な設定も不要で、しかも**無料**です。
初めてでも1分もあればPythonの実行ができてしまいます。さっそくやってみましょう！

# Google Colaboratoryを使ってみよう

事前準備としてGoogleのアカウントを用意しておいてくださいね。

まず、[Google Colaboratory](https://colab.research.google.com/)にアクセスします。

こんな画面が表示されましたか？

![colabo_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634673/e4a7d8fc-59f0-413b-40b7-caaed8a7dc08.png)

この画面にはGoogle Colaboratoryの紹介や使い方が書いてありますがとりあえず置いておいて、Pythonを書くための新しいノートブックを作成していきましょう。

**画面左上の「ファイル」メニューから、「ノートブックを新規作成」を選択します。**
すると下↓のように新しいノートブックが作成できます。

![colabo_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634673/c4bd5874-d9ff-4347-7abd-f3c39354f23b.png)


ここにPythonのコードを書いていくわけです。
とりあえずお試しとして、こんなコードを書いてみましょうか。

```
a = 1
b = 2

print(a+b)
```

![colabo_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634673/13409205-529e-c187-93ef-e624ab33fb69.png)


このコードを実行するには、コードを書いたセル内で**「Shiftキーを押しながらEnter」**です。（セルの左端にある三角マークの再生ボタンを押してもいいです）

セルのすぐ下に実行結果(=3)が表示されました。
これだけです！

![colabo_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634673/e43c1216-ca37-3384-a8f8-5237f98d6cc0.png)



ちなみに、ノートブックの名前は自由に変えられます。
画面上の方に「Untitled0.ipynb」と表示されていますが、このUntitled0の部分がファイル名なので好きな名前に変えてください。
このipynbファイルはGoogle Driveに保存されます。  

それではよいPythonライフを！
[Rails]検索フォームでの検索機能/アソシエーション先のテーブルから検索する

# 記事の概要

　[前回の記事](URL="https://qiita.com/kei-kun1960/items/6f82d3ede76031dc7795")の続きで検索シリーズ第３弾。今回はアソシエーションしたテーブルから検索できるようにする。　
　例えばarticlesテーブルがあり、一つのarticleにはタグ付けができるとする。タグはtagsテーブルにあり、中間テーブルを介してarticlesテーブルとtagsテーブルは多対多のアソシエーションであった時、articleをtag名で検索したい。


# 準備
　まず、Articleモデル。

```ruby:models/article.rb
class Article < ApplicationRecord
  has_many :article_tag_relations
  has_many :tags, through: :article_tag_relations
end
```
　Tagモデル。tagsテーブルにはタグ名が入るtagnameカラムがあるとする。

```ruby:models/tag.rb
class Tag < ApplicationRecord 
  has_many :article_tag_relations
  has_many :articles, through: :article_tag_relations 
end
```
　ArticleTagRelationモデルで中間テーブルを作る。

```ruby:models/article_tag_relations.rb
class ArticleTagRelation < ApplicationRecord
  belongs_to :article
  belongs_to :tag
end
```

# 検索機能の実装
　ビューファイルで検索フォームを実装。

```search.html.erb
<%= form_with(url: tagsearch_articles_path, local: true, method: :get) do |form| %>
  <%= form.text_field :tag %>
  <%= form.submit "search" %>
<% end %>
```
　コントローラーの記述。検索時に、joinsメソッドで関連するテーブル同士、ここではarticlesテーブルとtagsメソッドを内部結合させるのがポイント。これにより、本来tagsテーブルのカラムであるtagnameで検索した結果としてのarticlesテーブルのレコードを取得できる。

```ruby:articles_controller.rb
def tagsearch
    # 検索フォームから送られてくるパラメータ
    @tag = params[:tag]   
    # joinsメソッドでテーブル同士を結合。検索は一致検索とする。
    @articles = Article.joins(:tags).where('tagname LIKE ?',"#{@tag}")              
end
```
Linuxの帯域制御をする

# tcとは？
[tc(8) - Linux manual page](https://man7.org/linux/man-pages/man8/tc.8.html)
Traffic Control(tc)と呼ばれるIPパケットの送信制御機構のこと。
特定のソフトウェア/セッションの帯域を制限したりできる。（その他にも色々できるらしい）

# TCのコンセプト

- Traffic Controlは送信したいパケットをschedulerと呼ばれるものに通すことで行われる。
  - schedulerはキューイング規則(Queueing discipline: qdisc)とも呼ばれる。
        - パケットを一時的に格納して、以下のことができる。
            - 順番を並べ替え
            - 遅延させる
            - 破棄する
    - qdiscの操作は主に２つ
        - enqueue
            - 送信される予定のパケットをqdiscに格納しようとする処理
        - dequeue
            - 格納されたパケットを取り出し、デバイスドライバに渡す処理
![スクリーンショット 2021-02-25 18.46.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323051/51a899e0-6eef-d688-fd2b-edec62b5b225.png)
    - classful qdisc

![スクリーンショット 2021-02-26 10.35.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323051/5c95b525-9b1e-1c92-e6d7-dc0e02b34f67.png)

### class(階層を持った分類）構造を持ったqdisc
  - classful qdiscは内部に複数のqdiscを持っている
  - classful qdiscにおいては内部でのenqueue処理が2つに分かれる
     - classify    : 内部にあるqdiscのどこに振り分けるかの処理
     - 内部qdisc: 決めたqdiscにパケットを格納する処理
  - classify
    - classifyはfilterからどの内部qdiscに格納するべきかを決定する処理
  - 内部qdisc
    - classfulなqdiscの内部で使用されるqdisc
        - class構造の葉(leaf)となる要素にはかならずqdiscが1つ付属

### Class構造
- クラスの作り方
- クラスはidを `majorid:minorid`という書式で割り当てる。

以下のようなコマンドを打つと図のような設定がされたclassが作成される

```bash
tc qdisc del dev eth0 root
# qdiscを作成し1:にハンドルするよう設定
tc qdisc add dev eth0 root handle 1: htb default 20 # qdisc A
# 最低1000Mbit/最高1000Mbitの帯域を持つクラスを1:の子として1というclassidをつけて作成
tc class add dev eth0 parent 1: classid 1:1 htb rate 1000Mbit ceil 1000Mbit burst 10Mb cburst 10Mb # class A
# 最低200Mbit/最高200Mbitの帯域を持つクラスを1:1の子として10というclassidをつけて作成
tc class add dev eth0 parent 1:1 classid 1:10 htb rate 200Mbit ceil 200Mbit burst 10Mb cburst 10Mb # class B
 # 最低200Mbit/最高200Mbitの帯域を持つクラスを1:1の子として20というclassidをつけて作成
tc class add dev eth0 parent 1:1 classid 1:20 htb rate 800Mbit ceil 1000Mbit burst 10Mb cburst 10Mb # # class C
# qdiscを作成し1:10にハンドルするよう設定
tc qdisc add dev eth0 parent 1:10 handle 100: pfifo limit 1000 # inner qdisc B
# qdiscを作成し1:20にハンドルするよう設定
tc qdisc add dev eth0 parent 1:20 handle 200: pfifo limit 1000 # inner qdisc C
# IPパケットがTCP、UDPなどでsource portが6379である場合1:10（ClassB）に分類する
tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip sport 6379 0xffff flowid 1:10
```


- classifyではこの中で最も小さな番号から分類に利用しようとする
- qdisc bなどで新たなmajorid 100:と200:を与えているが大きな意味はないので、他と被らなそうな値を入れておく
- burstとcburstはそれぞれrateとceilに対応するtoken bucketのsize→計算法は以下
- 上記設定のパケットが来た際の処理の流れ
  1. 1:0を確認する
  2. 1:0はフィルターなので、設定されたルールに従ってパケットを分類する.
     この場合は、IPパケットがTCP、UDPなどでsource portが6379である場合1:10（ClassB）に分類する
     なので、もし条件に合うパケットが来た場合は1:10（ClassB）のqdiscにパケットをスタックする
  2. フィルターに該当しなかった場合は他にフィルターがないため、defaultで設定された1:20に分類して終了

# 参考

[GREE Engineering](https://labs.gree.jp/blog/2014/10/11266/)

[Linux TC (帯域制御、帯域保証) 設定ガイドライン](https://labs.gree.jp/blog/2014/10/11288/)
doctrine Undefined index on doctrine m:n relation

# はじめに

doctrineを使っていて、以下のエラーがでてきた。

```
[2021-06-02 12:02:44] request.CRITICAL: Uncaught PHP Exception ErrorException: "Notice: Undefined index: <クラス名>" at /var/www/html/vendor/doctrine/orm/lib/Doctrine/ORM/Internal/Hydration/ObjectHydrator.php line 122 {"exception":"[object] (ErrorException(code: 0): Notice: Undefined index: <クラス名> at /var/www/html/vendor/doctrine/orm/lib/Doctrine/ORM/Internal/Hydration/ObjectHydrator.php:122)"} []
```

# TL;DR

以下のコマンドでdoctrineのスキーマ定義を確認する

```bash
php bin/console doctrine:schema:validate
```

以下のようなエラーが出てきました。

```
root@2043c465e73b:/var/www/html # php bin/console doctrine:schema:validate
Cannot load Xdebug - it was already loaded
Xdebug: [Step Debug] Time-out connecting to debugging client, waited: 200 ms. Tried: host.docker.internal:9003 (through xdebug.client_host/xdebug.client_port) :-(

Mapping
-------

 [FAIL] The entity-class App\Entity\NoticeLog mapping is invalid:
 * The association App\Entity\NoticeLog#user refers to the inverse side field App\Entity\User#NoticeLog which does not exist.


 [FAIL] The entity-class App\Entity\User mapping is invalid:
 * The mappings App\Entity\User#noticeLogs and App\Entity\NoticeLog#user are inconsistent with each other.


Database
--------

                                                                                                                        
 [ERROR] The database schema is not in sync with the current mapping file.                                              
                                                                                                                        
```

そういえば、`make:entity`で作成した後、作り直したプロパティがあって、そのために不整合が起きた模様。

修正することで不具合がでなくなりました。


# 参考文献

https://stackoverflow.com/questions/7388017/undefined-index-on-doctrine-mn-relation
C# PDFをHTMLに変換

<p><strong>今回はSpire.PDFという無料で使いやすいライブラリを利用して、PDFをHTMLに変換する方法を紹介します。</strong></p>
<h4><strong>下準備</strong></h4>
<p><strong>1.E-iceblueの公式サイトから<a href="https://www.e-iceblue.com/Download/download-pdf-for-net-free.html">Free Spire.PDF</a>無料版をダウンロードしてください。</strong></p>
<p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/l/lendoris/20210602/20210602155356.png" alt="f:id:lendoris:20210602155356p:plain" title="" class="hatena-fotolife" itemprop="image" /></p>
<p><strong>2.Visual Studioを起動して新規プロジェクトを作成してから、インストールされたファイルにあった相応しいSpire. PDF.dllを参照に追加してください。</strong></p>
<p><strong>（Net 4.0を例としたら、デフォルトパスは“Bin→NET4.0→PDF.dll”というようです。）</strong></p>
<h4><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/l/lendoris/20210602/20210602155409.png" alt="f:id:lendoris:20210602155409p:plain" title="" class="hatena-fotolife" itemprop="image" /><strong><br />PDFファイル</strong></h4>
<p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/l/lendoris/20210602/20210602155438.png" alt="f:id:lendoris:20210602155438p:plain" title="" class="hatena-fotolife" itemprop="image" /></p>
```c#
using Spire.Pdf;

namespace PDFtoHtml
{
    class Program
    {
        static void Main(string[] args)
        {
            //PDFをロードします。
            PdfDocument pdf = new PdfDocument();
            pdf.LoadFromFile("sample.pdf");

            //htmlで保存します。
            pdf.SaveToFile("ToHtml.html", FileFormat.HTML);
            System.Diagnostics.Process.Start("ToHtml.html");
        }
    }
```
<h4><strong>実行結果</strong></h4>
<p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/l/lendoris/20210602/20210602155523.png" alt="f:id:lendoris:20210602155523p:plain" title="" class="hatena-fotolife" itemprop="image" /></p>
<p> </p>
VPNとインターネットのハイブリッド接続

#概要
VPNに接続するとネットワークの通信は、VPN側に流れるため、Web会議やチャットへの接続が出来なくなります。
通常の環境では、VPN接続とインターネット接続を同時に利用することは出来ません。
可能とするためには、「スプリットトンネリング」 の設定をします。

#設定方法
PowerShellを管理者権限で実行します。

```
PS C:\WINDOWS\system32> get-vpnconnection


Name                  : VPN 接続
ServerAddress         : 121.215.155.132
AllUserConnection     : False
Guid                  : {A600F474-0176-4C8A-B7A8-BE87AB3E2549}
TunnelType            : L2tp
AuthenticationMethod  : {MsChapv2}
EncryptionLevel       : Optional
L2tpIPsecAuth         : Psk
UseWinlogonCredential : False
EapConfigXmlStream    :
ConnectionStatus      : Connected
RememberCredential    : True
SplitTunneling        : False
DnsSuffix             :
IdleDisconnectSeconds : 0
```

Name                  : <font color="Red">VPN 接続</font>
SplitTunneling        : <font color="Red">False</font>
NameとSplitTunnelingを確認します。

SplitTunneling を True にします。
接続名を指定して、設定します。

```
PS C:\WINDOWS\system32> set-vpnConnection -Name "VPN 接続" -SplitTunneling $true
```
SplitTunneling        : <font color="Red">True</font> を確認します。

```
PS C:\WINDOWS\system32> get-vpnconnection


Name                  : VPN 接続
ServerAddress         : 121.215.155.132
AllUserConnection     : False
Guid                  : {A600F474-0176-4C8A-B7A8-BE87AB3E2549}
TunnelType            : L2tp
AuthenticationMethod  : {MsChapv2}
EncryptionLevel       : Optional
L2tpIPsecAuth         : Psk
UseWinlogonCredential : False
EapConfigXmlStream    :
ConnectionStatus      : Connected
RememberCredential    : True
SplitTunneling        : True
DnsSuffix             :
IdleDisconnectSeconds : 0
```
# <font color="Red">VPN名</font>を指定してルーティングを設定します。
2つ方法があります。
## Add-VpnConnectionRoute
https://docs.microsoft.com/ja-jp/powershell/module/vpnclient/?view=windowsserver2019-ps&viewFallbackFrom=win10-ps
VPNに接続していなくても設定できます。

```
Add-VpnConnectionRoute "VPN 接続" -DestinationPrefix "10.0.0.0/8" -PassThru
Add-VpnConnectionRoute "VPN 接続" -DestinationPrefix "172.16.0.0/12" -PassThru
Add-VpnConnectionRoute "VPN 接続" -DestinationPrefix "192.168.0.0/16" -PassThru
```
## netsh interface
このコマンド実行するには、VPNに接続している必要があります。

```
PS C:\WINDOWS\system32> netsh interface ipv4 add route 10.0.0.0/8 "VPN 接続"
OK

PS C:\WINDOWS\system32> netsh interface ipv4 add route 172.16.0.0/12 "VPN 接続"
OK

PS C:\WINDOWS\system32> netsh interface ipv4 add route 192.168.0.0/16 "VPN 接続"
OK
```

指定したVPNが接続されると、ルーティング有効になります。
ルーティングは、VPN先のネットワークに必要な物だけ、設定すればOKです。
これで、VPNとインターネットのハイブリット接続になりました。
VPNを切断すれば、ルーティングは無効になり、再び、VPNを接続すれば、ルーティングが有効になります。
【Kotlin】インターフェイス

#■インターフェイス
インターフェイスは継承ではなく実装すると呼ばれている。
意味はほとんど同じ。

インターフェイスは個別で抽象メソッドを渡す事ができる。
継承は基本単一継承と呼ばれ一つまでしか継承できないが,
インターフェイスは複数実装できる。
ここでは実装と言っているが意味は継承と変わらない。

インターフェイスの能力は抽象クラスを用意し抽象メソッドを使用するabstractと同じ能力である。

###■abstractでできない事ができる。
例えばabstractにメソッドが3つ用意されている。
その中の2つだけのメソッドを継承してoverrideして使いたい
しかしabstractは全てのメソッドをoverrideさせないとエラーになる。

そんな時に個別でメソッドを管理できしかも単一継承ではないのでいくらでも
実装できます。

♪イメージ
■abstract
ディナーをコースで注文(これ以上注文できない単一継承)

■インターフェイス(欲しい物だけ注文いくらでも注文できる。)
単品で注文　

コースで注文した時食べれないものがあったらもったいないよね
それなら単品で注文しよって言う事です。

書き方

■インターフェイスにはclassを書かない代わりにinterfaceと書く

``` kotlin
//中身は抽象メソッドとなる。
interface Hoge1 {
  fun hoge1()
}
```

#■実際の実装方法
下記のように実装すれば
欲しいメソッドだけ取り寄せる事ができる。


``` kotlin

interface Hoge1 {
 fun hoge1()
}

interface Hoge2 {
 fun hoge2()
}

interface Hoge3 {
  fun hoge3()
}

class HogeA: Hoge1,Hoge2 {
 override fun hoge1() {}
 override fun hoge2() {}
}

class HogeB: Hoge2,Hoge3 {
 override fun hoge2() {}
 override fun hoge3() {}
}
```

#■インターフェイスの特徴

■コンストラクタを持てない
■abstractやopenなどの修飾子はいらない(あってもエラーにはならない)
■カスタマーアクセサーを使う(最後に説明)

###■継承と実装を同時に行う事ができる。

``` kotlin
//継承AAA()クラスと実装インターフェイスBBB{}同時に行っている。
class Child : AAA(), BBB{}
```

###■インターフェイスのメソッドに元から能力をもつ場合(基本ただの入れ物)
オーバーライドは強制されない!!!!!!
オーバーライドを強制はされないが実装先のインスタンスでinterface先のメソッドを呼び出す事ができる。

``` kotlin
interface A{
 fun bar()
 //fooはメソッドの中身を実装しているので抽象メソッドにならない 任意
 fun foo() = println("こんにちわ")
}

class B: A {
   override fun bar() = println("さようなら")
}

val b = B()
//interface先のメソッドを呼び出している。
b.foo()
//結果:こんにちわ
```

###■異なるインターフェイスでメソッド名が同じ問題

問題が起こる
■異なるインターフェイス
■同じ名前のメソッド
■能力は異なる(デフォルトで実装をもっていてとする。)

classで実装する際えっこれどっちのメソッドですか？となる。

■解決策
<インターフェイス名>.メソッド名()
と書けばどのインターフェイスのメソッドか判断できるようになる。

``` kotlin
interface Hoge1 {
 fun hoge() = println("こんにちわ")
}

interface Hoge2 {
 fun hoge() = println("さようなら")
}

//解決策
class MyHoge: Hoge1, Hoge2 {
 overridefun hoge() {
 super<Hoge1>.hoge()
 super<Hoge2>.hoge()
  }
}
```

###■プロパティも定義できる。抽象プロパティとなる。

``` kotlin
interface Hoge1 {
 var a: String
}

class MyHoge: Hoge1 {
 override var a = "こんにちわ"
}
```

###■インターフェイスの中のプロパティはバッキングフィールドを持てない

■カスタマーアクセサー
基本プロパティでgetを使う際fieldに値が代入され変数に入る
だがfieldが使えないので代わりに新たにプロパティを作りgetterの中身に書く


``` kotlin
interface Hoge {
 //fieldの代わりにプロパティを用意
 var price: Int

 val taxIncLudePrice: Int 
 //fieldの代わりにpriceを書く
  get() = (this.price * 1.1).toInt()

  fun checkPrice() {
    println("税込${taxIncLudePrice}円")
  } 
}

class MyHoge: Hoge {
 override var price = 200
}

fun main() {
 var myHoge = MyHoge() 
 //hogeのメソッドを呼び出す。
 myHoge.checkPrice()
}
//結果:税込220円です。
```
Python勉強記録 #1 モジュール

# モジュールとは

Pythonにはモジュールという便利なものがあります。
モジュールというのは、「py」という拡張子が付けられたテキストファイルのことで、この中にPythonを使って書かれた関数などを格納するものらしい。
例えるなら、「米」と「水」を与えたら「炊き立てのご飯」が作れる「炊飯器」のことをモジュールという…ような感じ？

# モジュールの読み込み
- Numpy 数値計算を高速に処理するモジュール
- Pandas テーブル（表）データのデータ操作を行うモジュール
- Matplotlib.pyplot データの可視化を行うためのモジュール

モジュールはいくつもありますが、AIではこれらを多用します。
実際に読み込む時は、

```Python
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
```

のように書きます。
as np と書いているのは、あとでモジュールを呼び出す時に短い方が書きやすいかららしい。
np と書くのは通例で、他もどのように略すかは通例で決まっているようです。
連続型確率分布における確率密度関数を用いた尤度の計算

連続型確率分布で、確率密度関数が$f(x)$で表されるようなものに対して尤度を求めたい場合、ある点$x_i$をとる確率$P(x)$を求めることはできないので、代わりに$f(x)$の値を用いて尤度を計算する。式は
$L=f(x_1)\ f(x_2)...f(x_n)$
のようになる。

(参考)
http://sysplan.nams.kyushu-u.ac.jp/gen/edu/MarineStatistics/2018/kougi07/kougi07.pdf
中間テーブル　throughオプション

#throughオプションとは？
has_manyメソッドのthroughオプションは、モデルに多対多の関連を定義するときに利用します。
throughオプションを使用し、多対多のアソシエーションを定義する場合は、それぞれのモデルに以下のような記述をします。

```app/models/tweet.rb
class Tweet < ApplicationRecord
  has_many :tweet_tag_relations
  has_many :tags, through: :tweet_tag_relations
end
```

```app/models/tag.rb
class Tag < ApplicationRecord
  has_many :tweet_tag_relations
  has_many :tweets, through: :tweet_tag_relations
end
```

```app/models/tweet_tag_relation.rb
class TweetTagRelation < ApplicationRecord
  belongs_to :tweet
  belongs_to :tag
end
```
多対多の関係にある2つのテーブルのモデルでは、has_manyメソッドによる1対多のアソシエーションを互いに定義するのと合わせて、throughオプションによって経由する中間テーブルを指定します。
一方、中間テーブルのモデルでは、belongs_toメソッドで多対多の関係にある2つのテーブルを指定します。
WordPress 絶対パスを相対パスにする方法4つ

WordPressは絶対パスが推奨とされていますが、様々な理由で相対パスを検討する方もいらっしゃると思います。
<br>


```
http://ドメイン名/WordPressインストールフォルダ/wp-content/uploads/2021/06/sample.jpg
```
これを、、
<br>

```
/wp-content/uploads/2021/06/sample.jpg
```
こうするイメージです
<br>
調べると分かりますが、WordPressには`get_permalink`関数や`the_permalink`, `home_url`などの絶対パスを取得する関数はあるんですが、相対パスを取得する関数がありません。

相対パスを出力するには主に function.php に記述してコードを変換することになりますが、
その情報は様々なエンジニアのブログに点在していて最良な方法を検討しにくいのが現状。

そこで、ここでは相対パスを出力する方法として、代表的な以下の4つの方法をご紹介します。

<a href="i-1">1. コード全体を相対パスにする方法</a>
<a href="i-2">2. 画像を相対パスにする方法</a>
<a href="i-3">3. リンクを相対パスにする方法</a>
<a href="i-4">4. 個別のコードを相対パスにする方法</a>

それぞれのコードについての詳細解説はブロガーの方に任せ、この記事ではどのような手法があるのかをザックリ掴むことを目的としています。
<br>
<br>

<h2 id="i-1">1. コード全体を相対パスにする方法</h2>

<h3>できること</h3>
・出力されているすべてのパスを相対パスに変更することができます。


<h3>コード</h3>

```php:function.php
class relative_URI {
    function relative_URI() {
        add_action('get_header', array(&$this, 'get_header'), 1);
        add_action('wp_footer', array(&$this, 'wp_footer'), 99999);
    }
    function replace_relative_URI($content) {
        $home_url = trailingslashit(get_home_url('/'));
        return str_replace($home_url, '/', $content);
    }
    function get_header(){
        ob_start(array(&$this, 'replace_relative_URI'));
    }
    function wp_footer(){
        ob_end_flush();
    }
}
new relative_URI();
```
<h3>参考記事</h3>

https://wp-technique.com/wp-link-path/

<h3>注意事項</h3>
・このコードはAll in One SEOと競合するため、不具合が発生しました。（バージョン 4.1.0.1）
・All in One SEOを導入する場合は他の方法の検討をおすすめします。
<br>
<h2 id="i-2">2. 画像を相対パスにする方法</h2>

<h3>できること</h3>
・出力されているimgタグのURLを相対パスにできます。
・［メディア追加］でimgタグを挿入したときのURLを相対パスにできます。

<h3>コード</h3>

```php:function.php
function del_domain_from_image_url( $url ) {
    if ( preg_match( '/^http(s)?:\/\/[^\/\s]+(.*)$/', $url, $match ) ) {
        $url = $match[2];
    }
    return $url;
}
add_filter( 'wp_get_attachment_url', 'del_domain_from_image_url' );
add_filter( 'attachment_link', 'del_domain_from_image_url' );
```
<h3>参考記事</h3>
https://100webdesign.jp/services/wordpress/wp_result/wp_result-658/

https://worpreya.com/change-to-image-link-relative-path/

<br>
<h2 id="i-3">3. リンクを相対パスにする方法</h2>

<h3>できること</h3>
・aタグのリンクURLを相対パスに変更できます。

<h3>コード</h3>

```php:function.php
//リンクを相対パス化
function make_href_root_relative($input) {
    return preg_replace('!http(s)?://' . $_SERVER['SERVER_NAME'] . '/!', '/', $input);
}
//パーマリンクを相対パス化
function root_relative_permalinks($input) {
    return make_href_root_relative($input);
}
add_filter( 'the_permalink', 'root_relative_permalinks' );
```
<h3>参考記事</h3>
https://www.will-hp.com/wpblog/wordpress/191/
<h3>注意事項</h3>
・`<?php bloginfo('url'); ?>` を使うと相対パスへの変更ができません。（この記述はWordPressで非推奨とされています。）
・使っていた場合は、`<?php get_home_url('url'); ?>` 等に適宜置き換えてご利用ください。

<br>
<h2 id="i-4">4. 個別のコードを相対パスにする方法</h2>

<h3>できること</h3>
・関数で個別に出力していた絶対パスを、相対パスに変更できます。

<h3>コード</h3>

```php:
<?php echo wp_make_link_relative() ; ?>
```
<h3>参考記事</h3>
https://marycore.jp/prog/php/absolute-to-relative-url/

※ 記事内の「wp_make_link_relative関数による相対URLの抽出」を参考にしてください。

https://phono.co.jp/note/wp-url%E3%82%92%E7%9B%B8%E5%AF%BE%E3%83%91%E3%82%B9%E3%81%AB%E3%81%99%E3%82%8B%E3%80%82_1839/

<br>
<br>
以上、参考になれば幸いです！
Library not loaded: /usr/local/opt/openssl/lib/libssl.1.0.0.dylib (LoadError)のエラー解決方法

# 起きた事象

Rails newしようとしたら、エラーが出ました。

```
/Users/hoge/.rbenv/versions/2.5.1/lib/ruby/2.5.0/rubygems/core_ext/kernel_require.rb:59:in `require': dlopen(/Users/hoge/.rbenv/versions/2.5.1/lib/ruby/2.5.0/x86_64-darwin17/digest/md5.bundle, 9): Library not loaded: /usr/local/opt/openssl/lib/libssl.1.0.0.dylib (LoadError)
```

# 行うこと

こちらのstackoverflowの記事を参考に進めたら無事解決したので、備忘録として残しておきます。
https://stackoverflow.com/questions/44125147/dyld-library-not-loaded-usr-local-opt-openssl-lib-libcrypto-1-0-0-dylib

以下3つのコマンドを実行します。

```
brew update && brew upgrade
brew uninstall openssl
brew install https://github.com/tebelorg/Tump/releases/download/v1.0.0/openssl.rb
```
3行目のbrew installのところで以下の様なエラーが出てしまったので、

```
Traceback (most recent call last):
`brew extract` or `brew create` and `brew tap-new` to create a formula file in a tap on GitHub instead.: Invalid usage: Non-checksummed download of openssl formula file from an arbitrary URL is unsupported!  (UsageError)
`brew extract` or `brew create` and `brew tap-new` to create a formula file in a tap on GitHub instead.: Invalid usage: Non-checksummed download of openssl formula file from an arbitrary URL is unsupported!  (UsageError)
```

以下の通り行えば問題なくインストールできました。

① https://github.com/tebelorg/Tump/releases/download/v1.0.0/openssl.rb をダウンロードする
② ```brew install -s openssl.rb```
Qiitaの投稿方法

# 見出しは#をつけるだけ `*`
## #の数を増やすと見出し2,3,4,5,6となる。　`**`
### 見出し3 `***`
#### 見出し4 `****`
##### 見出し5 `*****`
###### 見出し6 `******`


```python:how_to_write_code.py
コードは "shiht + @" で出てくる "`"を3つ上下に並べる。
```

コードの上のファイル名は、
![スクリーンショット 2021-06-02 15.24.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1456950/495db83e-3e60-541a-ac8f-dad29389ec3a.png)
のように書くと表示できる。

画像はデスクトップからドラッグ＆ドロップですぐに貼れる。


`**太字**`**で太字**
`*斜字*`*で斜字*


-----
@shiracamus さんより教わりました。
-----
![スクリーンショット 2021-06-02 17.59.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1456950/82964443-53a4-9614-2ef9-25559c0c8764.png)
この？マークから詳しくかいてあるページに飛べます。情報ありがとうございました。

[こちらのページに飛びます。](https://qiita.com/Qiita/items/c686397e4a0f4f11683d)
スイフト勉強 _ データタイプ深化

この前勉強した基本データタイプのほかに何があるのか調べてみよう。 
データタイプの安心とは何か、タイプの別称は何か、列挙型、チュープル、コレクション型などについて勉強したいと思いますが、 
今日はデータタイプ安心と、タイプ別称とチュープルについて紹介する。

###データタイプ 安心
appleでswiftを発表時に強調した特徴の一つである安定性が最も明確に表れる部分である。 
swift はタイプに敏感で厳格であるが、異なるタイプの間でデータ交換をする場合には、必ず型変換をしなければならない。 

swiftはデータタイプを安心して使用できる言語であるため、その分ミスを減らすことができる。 
すなわち、IntタイプにCharを割り当てるとコンパイルエラーが発生するが、これらのエラーはプログラミング中に発見することが難しく、後でコンパイラが知らせなければエラーを見つけるのに時間がかかることになる。 
だが、swift はコンパイルエラーを知らせてくれるため、異なるタイプの値を割り当てるミスを減らすことができる。 
これをタイプ確認というが、タイプ確認により複数のタイプを混ぜて使用する際に発生する不具合を避けることができる。 

タイプ推論
swift は変数や定数を宣言する際、特定のタイプを明示しなくてもコンパイラが割り当てられた値を基準に変数や定数のタイプを決定する。 
したがって、コーディングをする際に楽な部分と見ることができる。

###タイプ 別称 (Typealias)

swift で基本的に提供するデータタイプでも、ユーザが任意に作ったデータタイプでも、既に存在するデータタイプに任意に別称をつけることができる。 それ以降は、元の名前と別称のいずれでも当該データタイプを活用できる。 

```swift
typealias num = Int
typealias number = Int
typealias decimalNum = Double

var year1 : num = 100
let year2 : number = 200

year1 = year2

let year3: Int = 300
let point : decimalNum = 3.141592 
```

タイプ別称を全域的に使うためならプロトコルを生成し、当該プロトコルをクラスが継承すれば全般的に同じように使用できる。 その他、2つのタイプを1つのタイプで同時に使用することも可能なので、うまく使えばより効率的なコーディングが可能になると考えられる。

###チュープル(Tupple)
チュープルはタイプの名前が特に指定されていない、プログラマーを勝手に作るタイプだ。 C言語の構造体の形態に類似している。 
swiftのチュープルはpythonのチュープルとも似ているが、チュープルは特にタイプの名前がなく、一定タイプの羅列だけでチュープルタイプを生成することができる。 チュープルに含まれるデータの個数は任意に指定でき、1個から数多くの個数が可能である。 

```swift
var a : (Int, Int, String) = (1,2,"3")
print(a.0) //1
print(a.1) //2
print(a.2) //"3"
print(a.3) //error

a.1 = 22
print(a.1) //22
a.3 = 77 //error => not exist
a.2 = 44 //error => different type

let (b,c,d) = a
print(b) //1
print(c) //22
print(d) //3

var person : (name: String, age: Int) = ("abc", 23)
print(person.name) // abc
print(person.age) // 23
print(person.1) // 23
```

チュープルの各要素を名前の代わりに数字で表現するために簡単に見えるが、今後の各要素がどのような意味、どのようなデータタイプなのか確認することが難しいため、使用に注意しなければならない点がある。 なので名前をつけることも可能である。
チュープルの場合、上で説明したタイプ別称と一緒に使えば、さらに良い効果を見せてくれる。
LinuxでPICTを使う

<h2>Excelがない</h2>

Macを使っている。
JSTQBの勉強でPICTを使いたいが、Excelが入ってないので、Linuxで実施する方法を調べてみた。


<h2>PICTのダウンロード</h2>

<p>
1.「https://github.com/Microsoft/pict」にオープンリソースとして公開されているので、ZIPからファイルダウンロード、解凍。もしくはcloneしてくる。
<br>
2.DLしたディレクトリに入り、「make」コマンドを実行する。
→ディレクトリ内にバイナリpictが作成される。
</p>



```パーティ.txt
僧侶: 攻撃,回復魔法,防御
魔法使い: 攻撃,攻撃魔法,防御
```


上記のようなカンマ区切りのファイルに対して

```
./pict パーティ.txt
```
を実行すると以下のように組み合わせ一覧が出力される

```
僧侶　魔法使い
攻撃　攻撃
攻撃　攻撃魔法
攻撃　防御
回復魔法　攻撃
回復魔法　攻撃魔法
回復魔法　防御
防御　攻撃
防御　攻撃魔法
防御　防御
```
[PHP]PDOでデータベースと接続する方法

#はじめに
UdemyでPDOでデータベースへ接続する方法を学んだのですが、いまいち自分の中でまとまってないのでこちらでまとめてみようと思います！

#前提

phpMyAdminにてすでに、DBと特権ユーザが用紙されていることを大前提にしています。
今回は、udemy_phpというDBとphp_userというユーザを用意しています

#実装

まずは全体を見てみます。

```php
<?php

const DB_HOST = 'mysql:dbname=udemy_php;host=127.0.0.1;charset=utf8';
const DB_USER = 'php_user';
const DB_PASSWORD = 'password123';


//例外 exception

try{
  $pdo = new PDO(DB_HOST, DB_USER, DB_PASSWORD, [
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, //連想配列
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, //例外
    PDO::ATTR_EMULATE_PREPARES => false, //SQLインジェクション対策
  ]);
  echo '接続成功';

} catch(PDOException $e){
  echo '接続失敗' . $e->getMessage() . "\n";
  exit();
}


```

まず最初は、変数にそれぞれ情報を入れています。
このへんはもおうお決まりみたいなものなので、こういうものかああでいいと思います。

```php
const DB_HOST = 'mysql:dbname=udemy_php;host=127.0.0.1;charset=utf8';
//mysql:dbname=[データベース名]:host=[データベースサーバーのホスト名]で記述します

const DB_USER = 'php_user';
const DB_PASSWORD = 'password123';

```

つぎにPDOを使用して、DBへアクセスしていきます。
そもそもPDOってなんだよって思いますよね、、、、PDOとは、PHP Data Objectsの略称で、一言で言い表すならば、PHPからデータベースのアクセスを抽象的にしてくれるものです。

抽象的とはどういうことでしょうか。データベースにMySQLやPostgreSQLなど複数種類があります。PHPではmysqliクラスやPostgreSQL関数を使用したりとデータベースごとに関数を使い分けなければなりません。どのデータベースでも、同じ書き方で使用できるようにしたのがPDOです。各データベースのPDOドライバにアクセスしてデータベースを操作します。PHPではPDOドライバを直接呼ぶのではなく、データベース共通のインスタンスを作ります。

[参考記事](https://blog.codecamp.jp/programming-php-pdo-mysql-1)

まあ、要するにPDOによって色々あるDBを一元的に使えるようにした！って感じなのかな？
そして、DBアクセスには次の一文でできるみたい！

```php
 $pdo = new PDO(DB_HOST, DB_USER, DB_PASSWORD);
```

めっちゃ簡単！！引数にDBの情報とユーザ名、パスワードをもってくるだけ。
ただし、このままでは色々危険があるみたいなんでオプションを4つ目の引数つけてやります！

```php
  $pdo = new PDO(DB_HOST, DB_USER, DB_PASSWORD, [
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, //連想配列
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, //例外
    PDO::ATTR_EMULATE_PREPARES => false, //SQLインジェクション対策
  ]);
```

このへんもほとんどお決まりらしいので、こういったものがあるという感じでいいんですが、、、、、
私は気になります笑

|オプション  |内容  |
|---|---|
|PDO::FETCH_ASSOC  |カラム名をキーとする連想配列で取得する．これが一番ポピュラーな設定． |
|PDO::ERRMODE_EXCEPTION  |設定すると例外をスローしてくれる．これを選択しておくのが一番無難．例外|
|PDO::ATTR_EMULATE_PREPARES => false|SQLインジェクション対策|

###（参考）SQLインジェクション
不正な「SQL」の命令を攻撃対象のウェブサイトに「注入する（インジェクションする）」のが、SQLインジェクション
![スクリーンショット 2021-06-01 18.33.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1128031/198aebbb-5937-23cf-731c-e29f0b919aae.png)

参考URL：https://www.kagoya.jp/howto/network/sql-injection/



だんだん見えてきました！
というかもお分かりですね。あとは例外処理を行うことで接続成功の場合と、接続失敗の場合で分けてあげればOKです！

#おわりに
以上、ざっくりPDOでのDB接続についてまとめてみました！
日々少しづつ進歩していく！
DynamoDBのパーティションキーについてあれこれ

AWS DVAの勉強でまとめました。

# パーティションキーとは？

RDBMSでいうプライマリキー
もしソートキーを追加する場合はパーティションキーとソートキーの組み合わせがプライマリキーになる

↓の例で言うと、user_idをパーティションキーにするみたいな感じ


| user_id | email | phone_number |
|:-----------|------------:|:------------:|
| 1       | a@gmail.com        | xxx-xxxx-xxxx         |
| 2     | b@gmail.com     | xxx-xxxx-xxxx      |
| 3      | c@gmail.com      | xxx-xxxx-xxxx     |
| 4         | d@gmail.com     | xxx-xxxx-xxxx       |
| 5     | e@gmail.com | xxx-xxxx-xxxx     |
| 6    | f@gmail.com  | xxx-xxxx-xxxx     |

# パーティションキーの設計
テーブルは物理的にはパーティションに分割されているらしい。
そしてキャパシティはテーブルごとに割り当てられるから、パーティションキーが↓のようになっていたら特定のテーブルにアクセスが偏ってしまう。

`user_rank`が パーティションキーとする

|user_rank| user_id | email | phone_number |
|:----------|:-----------|------------:|:------------:|
|A| 1       | a@gmail.com        | xxx-xxxx-xxxx         |
|A| 2     | b@gmail.com     | xxx-xxxx-xxxx      |
|A| 3      | c@gmail.com      | xxx-xxxx-xxxx     |
|A| 4         | d@gmail.com     | xxx-xxxx-xxxx       |
|B| 5     | e@gmail.com | xxx-xxxx-xxxx     |
|C| 6    | f@gmail.com  | xxx-xxxx-xxxx     |

user_rankがAのテーブルに偏る、、！

だからパーティションキーにする値は、なるべく分散されるような値にしたほうが良い。user_idとか、、

それか、パーティションキーの値にランダムなサフィックスを追加する

`A` じゃなくて `A_001〜A_200`

的な。
[スプレッドシート] 条件付き書式で行全体の色を変更する

この記事では、業務で使えるテクニックを備忘録として記載しています。

#今回やりたいこと

Google Spreadsheet で `条件付き書式`を使用し、状態が「完了」のときだけ行全体を灰色にしたい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1544790/acf86e9f-0972-e9c6-a694-db5ebdfee226.png)


####1.範囲を選択して 「表示形式」→「条件付き書式」

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1544790/6c42dbf3-ff78-53f9-5a51-1f40e00d5a10.png)

####2.条件付き書式設定ルールを追加する
 「条件を追加」→ セルの書式設定の条件...「カスタム数式」

```
=$C2="完了"
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1544790/a48a57f8-3a2f-297c-28ec-ffd361691421.png)

####3.完了を押せば適応される

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1544790/acf86e9f-0972-e9c6-a694-db5ebdfee226.png)


#参考にしたサイト


https://boxil.jp/beyond/a5195/#5195-13
C言語でハローワールド（hello world）を表示させる【備忘録】

C言語を学び始めた初心者ですが、まずは基本としてハローワールド（Hello World）を出力させるプログラムを組んでみようと思います。

環境はwindows＆Visual Studio Codeです。

以下がC言語でのハローワールドの基本の書き方のよう。

```c:qiita.rb

#include <stdio.h>

main()
{
  printf("Hello World");
  return 0;
}

```

なお、プログラム開始の合図のmain()の部分は
int mainと書く方がより丁寧とのこと。

```c:qiita.rb

#include <stdio.h>

int main()
{
  printf("Hello World");
  return 0;
}

```

これをメモ帳などに貼り付ける。

さらに.cファイルとして保存。

これをVScodeにて読み込ませる（ドラッグ＆ドロップでＯＫ）。

実行すると、.exeファイルもできる。

ファイル名をVScodeのターミナルの部分にて打ち込むと
上手くハローワールド（hello world）が表示されるのを
確認。

とりあえず手を動かして、確認していくのが大切そうですね(^^)

参考url：

https://life-freedom888.com/c-lang-hello/
LaTeXで日本語のコメントアウトが入ったソースコードをきれいに挿入する

$\LaTeX$ でソースコードとかを挿入するとき、listings パッケージを使う人も多いかと思います。
そのとき、日本語のコメントアウトとかがあると崩れてしまったなんて人も多いのではないでしょうか。
その解決策として、jlisting パッケージというものを Windows10/Mac 環境で導入してみたので、メモ書き程度に残しておきます。Linux 使っている人でも適宜読み替えればいけると思います。

# 応急措置

ひとまず、最初から入っている jvlisting パッケージを使用することで、この問題は解決します。

```tex:hoge.tex
\usepackage{listings, jvlisting}
```

・・・が、日本語の部分にはコメントアウトの色がついていなかったり、結局順番が崩れてしまったりします。

# jlistingパッケージを導入する

本題です。
まず以下の場所からjlisting.styをダウンロードします。
[https://osdn.net/projects/mytexpert/downloads/26068/jlisting.sty.bz2/](https://osdn.net/projects/mytexpert/downloads/26068/jlisting.sty.bz2/)

<br>
bz2形式で圧縮されているみたいなのでこれを解凍します。
Downloadsフォルダにダウンロードされたjlisting.sty.bz2があると思うので、コマンドプロンプト上でDownloadsフォルダに移動し、以下のコマンドでこれを展開します。

```shell-session:コマンドプロンプト/ターミナル
>bzip2 -d jlisting.sty.bz2
```

圧縮されたファイルも残したい場合は、以下のコマンドを代わりに実行します。

```shell-session:コマンドプロンプト/ターミナル
>bzip2 -dc jlisting.sty.bz2 > jlisting.sty
```

<br>
圧縮ファイルを展開できたら、jlisting.styをあるべき位置に置きます。
まずは、コマンドプロンプト上で次のコマンドを打って、listingsパッケージがどこにあるか確認します。
私の場合は、2行目の c:/texlive/2020/texmf-dist/tex/latex/listings というフォルダに入っているみたいです。

```shell-session:コマンドプロンプト/ターミナル
>kpsewhich listings.sty
c:/texlive/2020/texmf-dist/tex/latex/listings/listings.sty
```

このフォルダの位置が分かったら、CUIなりGUIなりなんでもいいのですが、とにかくjlisting.styファイルを、listingsパッケージが入っているフォルダに入れます。（私の場合でいうところの c:/texlive/2020/texmf-dist/tex/latex/listings）
MacのGUIで/usr/localの場所が分からない場合は、Finderを開いて画面上部左側にある「移動」タブを開いて、下のほうにあるフォルダへ移動という部分を選択し（もしくは command + shift + G を押し）、フォルダの場所を入力というところに/usr/localと打ち込むと出てくると思うので試してみてください。

<br>
最後に、以下のコマンドをコマンドプロンプト上で実行して、ファイルの一覧表（ls-R）を更新すれば、jlistingパッケージが使えるようになります。

```shell-session:コマンドプロンプト
mktexlsr
```

Macとかの場合はsudoしないとダメみたいです。実行するとパスワードが求められると思うので、打ち込んであげてください。

```shell-session:ターミナル
sudo mktexlsr
```

<br>
実際に、texファイルでパッケージを読み込む部分を以下のように変えてあげれば、日本語のコメントアウトもきれいに表示されるようになっているはずです。

```tex:hoge.tex
\usepackage{listings, jlisting}
```

では良い$\LaTeX$ライフを。

# 参考文献
- [https://texwiki.texjp.org/?LaTeX入門%2F各種パッケージの利用](https://texwiki.texjp.org/?LaTeX%E5%85%A5%E9%96%80%2F%E5%90%84%E7%A8%AE%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E3%81%AE%E5%88%A9%E7%94%A8)
- [https://mildtech.hatenablog.com/entry/2017/07/24/160324](https://mildtech.hatenablog.com/entry/2017/07/24/160324)
- [https://qiita.com/wnoguchi/items/cb0fa7c11b119e96f1e5](https://qiita.com/wnoguchi/items/cb0fa7c11b119e96f1e5)
git push heroku masterで起きたエラー

新しくアプリを作り、git push heroku masterをしたところ、下記のエラーが発生。

```
Failed to install gems via Bundler.
```

他のエラー文を見てみると、

```
Your bundle only supports platforms ["x86_64-darwin-17"] but your local platform
remote:        is x86_64-linux. Add the current platform to the lockfile with `bundle lock
remote:        --add-platform x86_64-linux` and try again.
remote:        Bundler Output: Your bundle only supports platforms ["x86_64-darwin-17"] but your local platform
remote:        is x86_64-linux. Add the current platform to the lockfile with `bundle lock
remote:        --add-platform x86_64-linux` and try again.
```

調べてみると、どうやら
「あなたのbundlerでは、あなたのPCのOSをサポートしてません。あなたのPCもサポートする設定をして、再度やり直してください。」
という意味らしい。

エラー文に書いてあるコマンドを実行。

①bundle lock --add-platform x86_64-linux
②Gemfile.lockの記述が追加されるので、その変更をリモートにpush
③再度git push heroku master


```
remote: Verifying deploy... done.
To https://git.heroku.com/xxxxxx.git
 * [new branch]      master -> master
 ```

うまくいった！
Angularにbootstrapでお手軽にhamburger menuを実装する

<h1>バージョン</h1>
Angular 11
Bootstrap 5

<h1>手順①npm install</h1>

```
npm install bootstrap jquery
```

<h1>手順②angular.jsonを編集</h1>
```angular.json
            "styles": [
              "./node_modules/bootstrap/dist/css/bootstrap.css",
              "src/styles.css"
            ],
            "scripts": [
              "./node_modules/jquery/dist/jquery.js",
              "./node_modules/bootstrap/dist/js/bootstrap.js"
            ]

```

<h1>手順③bootstrap公式ドキュメントからごっそりコピペ</h1>
https://getbootstrap.com/docs/5.0/components/navbar/

```app.component.html
<div class="collapse" id="navbarToggleExternalContent">
  <div class="bg-dark p-4">
    <h5 class="text-white h4">Collapsed content</h5>
    <span class="text-muted">Toggleable via the navbar brand.</span>
  </div>
</div>
<nav class="navbar navbar-dark bg-dark">
  <div class="container-fluid">
    <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarToggleExternalContent" aria-controls="navbarToggleExternalContent" aria-expanded="false" aria-label="Toggle navigation">
      <span class="navbar-toggler-icon"></span>
    </button>
  </div>
</nav>
```

<h1>デモ</h1>
![hamburger menu.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630191/20f9d584-75e6-d025-d8a5-61c2c8534178.gif)
web3jでイベントのフィルタリングを行う

[公式ドキュメント](http://docs.web3j.io/latest/advanced/filters_and_events/#topic-filters-and-evm-events) だけでは実装につまづいたので、備忘録も兼ねて実装手順を記録しておきます。

# この記事について

- EthFilterを生成し、トピックの追加によるイベントのフィルタリングを行えるようにする

# 環境

- Web3j 4.8.4
- Java 1.8

# コントラクトとフィルタリングの想定

以下のコントラクトのイベントにおいて、 `from` を特定のアドレスに絞りたい場合を考えます。

```solidity:SampleContract.sol
contract SampleContract {
    event StatusChange(
        string status,
        address indexed from
    );
}
```

# EthFilter の作成

以下の手順で EthFilter を作成します。

1. EthFilter のインスタンスを作成
1. イベント名と引数の型に関する情報を `addSingleTopic` を用いて追加
1. フィルタリングしたいデータを `addOptionalTopics` を用いて追加

フィルタリングを行わない引数に対しては `addOptionalTopics` の引数に nullを指定します。

```java
Event event = new Event(
    "SampleContract",
    Arrays.asList(
        new TypeReference<Utf8String>() {},
        new TypeReference<Address>(true) {}
    )
);
String topic = EventEncoder.encode(event);
System.out.println(Hash.sha3String("SampleContract(string,address)").equals(topic)); // => true
EthFilter filter = new EthFilter()
    .addSingleTopic(topic)
    .addOptionalTopics(
        null,
        new Address(256, fromAddress).toString() // Hex 256bit に正規化
    );

web3j.ethLogFlowable(filter).subscribe(log -> {
    ...
});
```

コード生成機能を用いると、event を以下の形式で取得できます。

- `ContractName.EVENTNAME_MESSAGE`

```java
Event event = SampleContract.STATUSCHANGE_MESSAGE;
...
```
lightsailで作成したインスタンスにVSCodeからSSH接続しようとしたら躓いた時の覚え書き

# lightsailで作成したインスタンスにVSCodeからSSH接続しようとしたら躓いた時の覚え書き

## 概要

AWSのlightsailでUbuntuのインスタンスを立ち上げて、新しくユーザーを追加したのでユーザにSSH接続をしようとしたら失敗したのでそのときの覚え書き。

## エラー内容

Permission denied (publickey).

## 原因

やり方としてはこちらを参考に。
[SSH用のユーザー追加手順と注意点のまとめ](https://qiita.com/tattn/items/a03cbf7c185d7efa6769)

しかしアクセスの時にパーミッションエラーが起こる。

ファイル名等や権限等いろいろ探していたところ、原因はauthorized_keysの所有権がなぜかrootになっていた。

## 解決法

ファイルの所有者を変更してあげて解決。  
ていうか上記記事にも所有者には言及があったのでちゃんと読んでやれっていう話でした。

```
chown [username]:[group] authorized_keys
```
SMBとNTFSセキュリティの基礎の備忘

##必要な情報の取得
`Get-Acl パス |Select-Object -Property *`

##アクセス権だけ表示
`Get-Acl $Path |Select-Object -Property AccessToString|fl`

`(Get-Item $Path).GetAccessControl()|fl`

##NTFS（でも動くけど）じゃなくてSMBのディレクトリ（フォルダー）にアクセス権を追加する時

やっと動くものができた。
ずっと [Set-Acl], UnauthorizedAccessException出て困ってた。


```
#ファイルやディレクトリ名
$Path = "\\NAS\share\dir"
#ユーザ名やグループ名（ドメイン名またはコンピュータ名から指定）
$userGroup = "domain users"

$acl = (Get-Item $Path).GetAccessControl("access")
$permission = ($userGroup,"FullControl","None","None","Allow")
$accessRule = New-Object -TypeName System.Security.AccessControl.FileSystemAccessRule $permission
$acl.AddAccessRule($AccessRule)
(Get-Item $Path).SetAccessControl($acl)
```

###参考文献
https://yomon.hatenablog.com/entry/2015/04/10/170518
https://cloudsteady.jp/post/24290/
https://qiita.com/kazuki-ma/items/34edd224043568555674
これが決め手でした。
https://ktltechnoblog.wordpress.com/2018/02/21/set-acl-attempted-to-perform-an-unauthorized-operation/
pyinstaller に関するメモ

#pyinstaller 起動オプション
```Python
pyinstaller xxxx.py --onedir --onefile --noconsole --clean
```

* --onedir or -D  
出力を1ディレクトリにまとめる
* --onefile or -F  
出力を1ファイルにまとめる
* --noconsole or -w  
コンソールを表示しない
* --clean  
ビルド前に前回のキャッシュと出力ディレクトリを削除

#pyinstallerで作ったモジュールでUnicodeEncodeErrorが出る対策
###標準出力の場合
```Python
import io, sys, logging
# 標準出力をUTF-8に設定
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
```
###loggingの場合、ファイルハンドラに「encoding='utf-8'」を追加する。
```Python
# ファイル出力用ハンドラ
handler = FileHandler(filename=filename, encoding='utf-8')
handler.setLevel(_logging_level)
handler.setFormatter(Formatter(formatter))
logger.addHandler(handler)
```
たまに使えるコマンドの紹介


~/bin あたりに

echo curl -s https://finance.yahoo.co.jp/quote/8888.T|sed 's/[&;"]/\n/g'|grep stock_price|uniq > 8888|chmod 777 8888

8888は、自分の銘柄


実行すると

% 8888
stock_price=2912

みたいなｗ
Docker CentOS8にnginxとNode.jsを入れてみた

## 概要
[Docker CentOS8にnginx入れてみた](https://qiita.com/A-Kira/items/93d56be0fec7bc9b279a)にNode.jsを追加した拡張版になります。

## 環境

### 前提
- maxOS BigSur 11.2.3
- Docker version 20.10.6
- docker-compose version 1.29.1

### 成果物
- CentOS 8
- nginx 1.14.1
- node 14.16.0

## 構成
```
.
├── docker
│   └── app
│       └── Dockerfile
└── docker-compose.yml
```

## 手順
### 1. docker-compose.yml作成
シンプルに`app`コンテナのみを作成します。

```docker-compose.yml
version: "3.9"
services:
  app:
    build:
      context: ./docker/app
    ports:
      - "80:80"
```

### 2. Dockerfile作成

```dockerfile:Dockerfile
FROM centos:centos8

RUN dnf -y update

# install nginx
RUN dnf install -y nginx
CMD ["nginx", "-g", "daemon off;"]

# install node
RUN dnf module reset nodejs
RUN dnf module enable -y nodejs:14
RUN dnf module install -y nodejs:14

WORKDIR /usr/share/nginx/html
```

ちなみに、デフォルトのドキュメントルートは`/usr/share/nginx/html`になりますー。

### 3. 確認

#### 3-1. 起動

```sh
docker-compose up -d
```

#### 3-2. nginx確認
http://localhost にアクセスしてみましょう。
nginxのテストページが表示されていたらOKです。

|![スクリーンショット 2021-06-02 12.15.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290840/248c774c-3eb7-177e-d6e9-097c9f80ed9e.png)|
|:--|

#### 3-3. node確認
コンテナにインスペクションします。

```sh
docker-compose exec app bash
```

nodeのバージョン確認して以下のようになればOKです。

```sh
node -v
v14.16.0
```

#### 3-4. 停止

```sh
docker-compose down
```

## 参考
- [Node.js 14 : インストール](https://www.server-world.info/query?os=CentOS_8&p=nodejs&f=3)
【メモ】

Private Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Long, ByVal lpFileName As String) As Long
Private Declare Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpString As Any, ByVal lpFileName As String) As Long

Sub GetValue()
 
    Dim section As String
    Dim fileName As String
     
    section = "CellColor"
    fileName = "C:\Users\s.kawano\Documents\conf.ini"
 
    Call WritePrivateProfileString(section, "R", "255", fileName)
    Call WritePrivateProfileString(section, "G", "20", fileName)
    Call WritePrivateProfileString(section, "B", "147", fileName)

End Sub
web cam画像を丸く切り出す

![tex_cord.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1582154/dea8c1c8-efe6-14fd-3bcd-0d71542af2b4.png)

### webcamを丸く切り出すマテリアルを作成します

・web camのmedia textureをTextureに設定します。
・web camの解像度は、1920x1080で、1080x1080の大きさで真ん中で切り出します。

##### サイズの設定
UVは0.0-1.0に正規化されてます。
例えば横の位置情報は、0.0のとき0.0で1920で1.0で表現されます。

SampleTextureのUVsにTextureCoordinateを設定します。
Utiling 0.5625 (1080/1920の計算結果)
Vtiling 1.0    (縦はmax)

##### 切り出し位置の設定
・Constant2Vectorを追加します。
(1920-1080)/2=420が左位置です。
その正規化は、
420/1920=0.21875

縦は一番上なので0です。

このオフセットをTexCoordianteに加算して、UVsに設定します。

##### マスク

・背景がアルファ抜きの白丸画像を読み込みます。
・切り出したwebcam画像を乗算して丸く切り出せました。


### webcam画像をマテリアルでミラーリングする
![tex_cord2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1582154/15ed21d2-ba87-1c9c-7ac0-42a6c8e54cf5.png)

右左逆でした。
ミラーリングにするためには画像をFLIPします。

ScaleUVsByCenterでU軸に-1かけます。

オフセットを足して真ん中表示にします。
お天気アプリの作成を通してAPI通信を学ぶ

##初めに
今回はアプリの作成を通じてAPI通信を行い、非同期処理の操作に慣れる事を学習目的としました。

##完成図
![Screen Shot 2021-05-27 at 21.03.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/825163/f9ec8975-5e4b-7ab1-981d-a2537a8d66cc.png)


##主に使用した技術
emotion
React
TypeScript
chart.js
Redux ToolKit

##使用したAPI
- Google-Maps-API
- OpenWeatherAPI

https://www.webdesignleaves.com/pr/plugins/googlemap_01.html

https://openweathermap.org/


##アプリの動作内容
1. Geolocationで現在地を取得しMapに反映
1. 検索フォームに入力された地名からお天気情報を取得
1. 取得したお天気情報を各コンポーネント上でビューに反映


##総括
####苦労した点
1. ドキュメントを読み込むという慣れない作業に、はじめはとても苦戦した。読んだり調べたりする事だけで時間が過ぎていき手を動かせずに少し焦りを感じるところもあったが、ここに関しては慣れの部分が大きいと思う。
1. API通信自体がほぼ初めてだった事に加え素人がReduxToolKitも使用していた為、関数を定義する際にasyncの部分はcreateAsyncThunkとういう関数の中で使用する事に後から気づいた。二つの新しい知識を同時に組み合わせなければならなかったのは学習効率が悪く少し作戦ミスだと思った。しかしながら、一旦ReduxToolKitの使い方を覚えるとやはりデータをグローバルに管理できたり、通信後の後処理が比較的簡単だという事を感じる事ができたので、とても役に立つ学習となった。
以下一部コード抜粋


```React:weatherSlice
export const fetchWeatherForecast = createAsyncThunk(
  'weather/fetchForecast',
  async (cityName: string) => {
    //まずは都市名の情報を取得
    try {
      const googleMapURL = 'https://maps.googleapis.com/maps/api/geocode/json';
      const key = process.env.REACT_APP_GOOGLE_MAP_API || '';
      const res = await axios.get(googleMapURL, {
        params: {
          address: cityName,
          key,
        },
      });
      // 上で取得した都市情報をもとに緯度経度の取得
      const { lat, lng } = res.data.results[0].geometry.location;
      // 緯度と軽度を元にその都市の天気情報を取得する
      const weatherAPIkey = process.env.REACT_APP_OPEN_WEATHER_MAP_API;
      const weatherData = await axios.get(
        // OpenWeatherのOne Call APIを使用する //
        `http://api.openweathermap.org/data/2.5/onecall?lat=${lat}&lon=${lng}&units=metric&lang=ja&exclude=minutely&APPID=${weatherAPIkey}`
      );
      //データの確認
      console.log(`天気情報`, weatherData);
      // 取得した情報をbuilderに送信
      const weatherInfo: WeatherData[] = weatherData.data;
      //必要なデータをPassDataにまとめて、ペーロードで取得できるようにする
      const passData: any = {
        cityName,
        lat,
        lng,
        weatherInfo,
      };
      console.log(passData);
      return passData;
    } catch (err) {
      console.log(err);
    }
  }
```

####成長した点
- 取得したデータを元に各コンポーネント上で必要なデータのみを表示する為に、sliceやmap、forといった基本的なJavascriptの文法を使用した事で、JavaScriptの理解が深まった。
- API通信では、まず一つ自分の「形」を持つ事で非同期処理に対して自信を持てるようになった。（下記参照）

>[初心者の非同期処理の覚え方](https://qiita.com/shumanbeing/items/2207102f79a21ae969e1)

- コンソール画面やReduxDevTools画面を使って、エラーの原因をうまくチェックできるようになってきた。
- 前回学んだamplifyでのデプロイを今回はスムーズに行う事ができた。




####今後の課題
- まだTypeScriptに慣れていない為どうしても型関係でエラーが出てしまうので、anyを多用してしまった事が課題。今後のアプリ作成や、リファクタリングを通して少しずつ理解度を上げていきたい。
既存のrailsプロジェクトにwebpackerを使ってvue.jsを導入する方法 

#はじめに
web開発では、jqueryの代わりにvue、react、angularが利用されていることが多くなっています。
今回は学習コストが低いと言われているvue.jsを利用してアニメーションを用いたrailsアプリを作ろうと思い、
既存のrailsプロジェクトにvueを導入しようと思いましたが、結構手こずったので記録を残しておきます。
#手順
①nvm(Node Version Manager)をインストール
nvmとは、Node.jsのバージョンを管理するツールです。
nvmのバージョンは「[Node.js リリース一覧](https://nodejs.org/ja/download/releases/)」で確認できます。

```
nvm install 16.20
```

②Node.jsをインストール
Node.jsとは、javascriptの実行環境のことです。
詳しくは「[Node.jsとはなにか？なぜみんな使っているのか？](https://qiita.com/non_cal/items/a8fee0b7ad96e67713eb)」の記事が非常に参考になります。

```
nvm install node
```

③npm(Node Package Manager)をアップデート
npmはNode.jsをインストール際に同時にインストルされます。
npmとは、Node.jsで使える色々な機能がつまったものを管理するツールです。
詳しくは「[便利なパッケージ管理ツール！npmとは【初心者向け】](https://techacademy.jp/magazine/16105)」の記事が参考になります。

```
npm update -g npm
```

④webpackerをインストール
webpackerとは、ruby on rails上でwebpackを使用し、javascriptやcss、画像およびフォントを管理することができるものです。
Sprocketsと同様、アセットパッケージングツールです。
詳しくは「[Railsガイド Webpackerの概要](https://railsguides.jp/webpacker.html)」が参考になります。

```:Gemfile
gem ‘webpacker’, ‘~> 4.0’
```

注）はじめは、githubのバージョンに頼るように以下のようにgemファイルに記入していましたが、
エラーが出てしまいました。なので、バージョン指定をするようにgemファイルに記入する方が
良いかと思います。

```:Gemfile
gem 'webpacker', github: "rails/webpacker"
```
⑤Yarnのインストール
Yarnとは、javascriptのパッケージを管理するツールです。
npmとYarnの違いについては「[npmとは　yarnとは](https://qiita.com/Hai-dozo/items/90b852ac29b79a7ea02b)」が非常に参考になります。

```
npm install -g yarnd
```
⑥webpackerのインストール

```
rails webpacker:install
```
⑦Vue.jsのインストール

```
rails webpacker:install:vue
```
これで完了です。
#最後に
まだ、どのようにrailsアプリにvue.jsがどうやって反映されていくか、仕組みが分からないので、
rails×vue.jsのアプリを作成できるように、勉強していきます。
これからの気づきやつまづいたところについては、今後記事にしていきます。

参考:[既存のRailsプロジェクトにVue.jsを導入する](https://kenny27.hatenablog.com/entry/vueonrubyonrails)
容量の大きいCSVファイルの扱い (Shift-JIS)

## 概要
大きなCSVファイルを扱う際に、調べたことをメモしておく。

## 文字コード問題
CSVファイルは、だいたいShift-JISのエンコードで渡されてくることが多いです。
そのため、文字コードをUTF8に変換するなどの処理が必要になったりします。

しかし、Shift-JISのエンコードには、「5C問題」というものがあるようです。
※ [5C問題](https://www.wdic.org/w/WDIC/5C%E5%95%8F%E9%A1%8C)

そのため、shift-jisエンコードのCSVファイルをそのまま扱おうとすると問題が発生します。

```
例)下記のようなCSVの行が合った場合、「ソ」がC5問題に引っかかります
"ほげ","ミソ","1","2"

　　　↓↓↓　※「ソ」の後の「"」がエスケープされる

"ほげ","ミソ\",\"1","2"  （ 行がずれる... ）
```

## エンコード変換
CSVパーズする前に文字コードを変換する。

下記のようにエンコード変換したファイルを作成してみました。

```php
$str = file_get_contents('sjis.csv');
$str = mb_convert_encoding($str, 'UTF-8', 'ASCII,JIS,UTF-8,SJIS-win');
file_put_contents('utf8.csv', $str);
```

しかし、このやり方だと、CSVファイルの容量が大きくなるとPHPの消費メモリーが増えます。

そのため、頻繁にメモリーオーバーのエラーを起こします。

```
Allowed memory size of 536870912 bytes exhausted (tried to allocate 483345347 bytes)
```

このやり方は、駄目でした...

## 対応方法
`fopen`でも`SplFileObject`などで、１行ごと読んで処理する方式だと、メモリーの消費を抑えられそう。

そこで、「 `SplFileObject` 」を使いました。
( ただし、CSVとしてパーズせず、１行ごとにエンコード変換するようにする )

```php
DB::beginTransaction();
try {
    // ファイルの読み込み
    $file = new SplFileObject($file);
    $file->setFlags(
        // SplFileObjectでCSVパーズしない (Shift-JISの5C問題)
        // SplFileObject::READ_CSV |  // CSV解析(パーズ)する
        SplFileObject::READ_AHEAD |   // 先読み/巻き戻しで読み出す
        SplFileObject::SKIP_EMPTY |   // 空行は読み飛ばす
        SplFileObject::DROP_NEW_LINE  // 行末の改行を読み飛ばす
    );

    foreach ($file as $line) {
        // 文字エンコード変換
        // ※ Shift-JISの5C問題があるため、CSVパーズ前にエンコードを変換する
        $line = mb_convert_encoding($line, 'UTF-8', 'ASCII, JIS, UTF-8, SJIS-win');
        $row = str_getcsv($line);

        // 何かしら処理を実装する

        DB::commit();
    }
} catch (Exception $e) {
    DB::rollback();

    // Laravelのエラーハンドリングに渡すため、スローする
    // Throw to pass to error handling of Laravel.
    throw $e;
}
```

とりあえず、このやり方で、30万件のデータの処理ができました。

`fgetcsv`関数のストリームフィルタでも対応できそうですが、実装が複雑になりそうだったので断念。

文字コードの問題は、毎回面倒になりますね（＾＾；）

## 参考サイト
* [shift_jisでの5C問題回避法（PHPのみ）](http://1jaum.blogspot.com/2008/09/shift-jis5cphp.html)
* [PHP: fgetcsvでもSJISのCSVをUTF-8として《安全》に読む方法(ストリームフィルタ使用)](https://qiita.com/suin/items/3edfb9cb15e26bffba11)
* [SplFileObjectでのCSVファイル読み込みでの文字化け対策](https://yk0807.com/larablog/posts/22)
* [Laravelで大容量CSVファイルをSplFileObjectクラスで確実に処理する](https://www.ritolab.com/entry/63)

以上
Laravel6.20でログイン認証機能をつけようとしたら失敗したので、まとめた

Laravel 6.20でログイン認証機能をつける際に、Laravel 5.8と実装方法が違ったので学習記録としてまとめます。


## 環境
- Laravel 6.20.27
- Composer 2.0.12
- npm 7.13.0

## エラー
- 認証機能を下記のコマンドで実装しようとした

```
php artisan make:auth
```

- しかし、エラーが発生して実装できず

```
 Command "make:auth" is not defined.
```

- その後に、別のコマンドを試してみた

```
composer require laravel/ui
```

- しかし、こちらもエラーでどうにもならず

```
Problem 1
    - laravel/ui[v3.3.0, ..., 3.x-dev] require illuminate/console ^8.42 -> found illuminate/console[v8.42.0, ..., 8.x-dev] but these were not loaded, likely because it conflicts with another require.
    - Root composer.json requires laravel/ui ^3.3 -> satisfiable by laravel/ui[v3.3.0, 3.x-dev].
```

## なぜエラーが出たのか
- Laravel 6.0 以降ではサポートしていないコマンドだった

```
php artisan make:auth
```

- LaravelとLaravel/uiのバージョンが合っていない

```
composer require laravel/ui
```

## 上記を考慮したログイン認証機能の実装手順
- Laravel 6系までは`laravel/ui 1.*`にバージョンを指定する必要がある(※Laravel 7系は `laravel/ui 2.*`にする)ので、下記のコマンドを順番に入力する。

```
composer require laravel/ui 1.*
```


```
php artisan ui vue --auth
```

```
npm install
npm run dev
```
【Ruby】フィボナッチ数列の偶数の和を出してみた

##はじめに
Pukiwikiで問題が難しかったので、備忘録として投稿します。

## 問題
フィボナッチ数列の項は前の2つの項の和である. 最初の2項を 1, 2 とすれば, 最初の10項は以下の通りである.
1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...
数列の項の値が20以下のとき, 値が偶数の項の総和を求めよ.
※実際の問題は400万以下の時


##解答
```
# フィボナッチ数列
def fib(n)
  if n <= 2
    return n
  else
    return fib(n - 2) + fib(n -1)
  end
end

array = []

20.times do |n|
  array << fib(n)
end

even_num = []

array.each do |num|
  if num % 2 == 0
    even_num << num
  end
end

puts even_num.sum
```
##おわりに
冗長に書きすぎている気もしますが、うまく処理が行えました！
もっと良い記述方法を思いつきましたら更新したいと思います。