OmniAICreator/Qiita-1.07M huggingface dataset:
Pythonで書くフーリエ級数の検算用コード

理工系の学部生にとって厄介なのはフーリエ級数の手計算である。
一通り計算したはいいものの、結果が汚すぎて自信がないということはよくある。
そこでPythonで検算できるコードを書いたので備忘録も兼ねて掲載する。

例えば

```math
f(x)=x \ \ \ \ (-\pi \le x \le \pi)
```

をフーリエ級数展開すると

```math
f(x)=-\Sigma_{n=1}^{\infty}\frac{(-1)^n}{n}\sin(nx)
```

となる。これを検算してみよう。

```python
import numpy as np
import matplotlib.pyplot as plt

#x軸を定義する
x = np.arange(-np.pi,np.pi,0.01)

#シグマの中身の関数
def func(k):
    return -1*(((-1)**k)/k)*np.sin(k*x)

#シグマ演算の関数. 引数で和の範囲を指定.
def sigma(func,frm,to):
    ret = np.zeros_like(x)
    for i in range(frm,to):
        ret += func(i)
    return ret

#フーリエ級数展開の関数
f = sigma(func,1,100)

#結果の表示
fig, ax = plt.subplots(1,1)
ax.set_aspect('equal')
ax.plot(x,f)
plt.show()

#こっちは足されていく過程をみるためのグラフ
#この設定では高々9回まで
"""
fig, axes = plt.subplots(3,3,figsize=(7,7))
for i,ax in enumerate(axes.ravel()):
    ax.set_aspect('equal')
    ax.set_title('n={}'.format(i))
    f = sigma(func,1,i)
    ax.plot(x,f)
plt.show()
"""
```
結果はこのようになる。
![Figure_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613651/157f9811-e324-e2aa-3d75-bdfdd97c46b2.png)
100個の項を足し合わせたものだが、そこそこ再現できている。

ついでにコード中でコメントアウトしている部分を実行すると結果は次のようになる。
![Figure_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613651/d3ade672-5f78-1c09-d8b5-703201c5f090.png)
n=0,1についてはfor文の関係で表示されないが、ここは各々変更して欲しい。

### 参考文献
https://qiita.com/weedslayer/items/25c38c928ad59ba61071
『プリンシプル オブ プログラミング』読書記録　第５章

#はじめに
今回『プリンシプル オブ プログラミング』という本を読みましたので、自分なりにアウトプットしていく目的でまとめます。
リンク：[『プリンシプル オブ プログラミング ３年目までに身につけたい一生役立つ101の原理原則』](https://www.shuwasystem.co.jp/book/9784798046143.html)

#第５章　習慣〜プログラマのルーティーン〜

###プログラマの３大美徳
　プログラマの３大美徳として「怠慢」「短気」「傲慢」が挙げられる。

 - 「怠慢」
    - 何度も繰り返すような作業を自動化するなど全体の労力を減らすために手間を惜しまない気質。

 - 「短気」
    - コンピュータ効率の悪い動きや、思い通りで無い動きをしている時に我慢せずすぐに直す気質。

 - 「傲慢」
    - プロの意識を持ち、自分のコードについて責任を持って恥ずかしくないコードを書く気質。

　一般的な職業美徳に「一生懸命」「我武者羅」など、ハードワークを意味するものがあるが、これはプログラマには当てはまらない。むしろ、自分の仕事の中での「無駄」を常に観察し効率化していく姿勢が必要である。例えば、繰り返し作業の仕組み化(「怠慢」)や、要望や変更が出そうな部分の事前の見極めと対応（「短気」）、プロ意識を持った保守（「傲慢」）など、働く時間や労力を減らすことがプロジェクトへの貢献に繋がる。

###ボーイスカウトの規則
　Github等でコードをコミットする際には、コードをリポジトリからpullした時よりきれいにしてコミットをすることを心がける。小さな部分、例えば重複の排除や変数名の改良などでも、コードの腐敗を防ぐため積み重ねていくことが肝要である。コードは時間の経過に伴って品質が低下していく傾向にあるため、プロジェクトに関わる全プログラマがこのようなことを意識してコーディングすることが大切である。
　また、プログラミングは最短距離で目先の時間やコストを稼ごうとすると、あとで余計に時間やコストがかかることが往々にしてある。ユニットテストや、アーキテクチャ、ライブラリの選定などおろそかにしないことで、結果的に近道を取ることが出来る。

###パフォーマンスチューニングの箴言
　パフォーマンスチューニングとは速いコードを書くことであり「最適化」とも言われる。この「最適化」を早い段階で行うと、様々な弊害を生む。

 - 可読性の低下
    - 「最適化」を行うともとよりも直接的ではないロジックで組むことになるため、可読性が下がる。
 - 品質の低下
    - アルゴリズムの流れが明瞭でないコードは障害を見逃しやすくなるため品質も下がりやすくなる。
 - 複雑性の増大
    - モジュール間の依存性の強化や結合度の高いコードなど、複雑で移植性のないコードとなる。
 - 保守の阻害
    - 処理の流れを追いにくくなるため、保守もしづらくなる。
 - 環境間の競合
    - ある環境に特化した最適化を行うと別の環境でのパフォーマンスの低下を招く。
 - 作業量の増大
    - 最適化は大きなコストのかかる作業であり、また真の原因を特定して的を絞った作業を行う事は容易ではないため、労力の浪費になる場合もある。

　このような理由で、まずは良いコードを作成し、それから最適化について本当に行うべきか検討していく必要がある。最適化は割に合わないことも多々あるので、状況とよく照らして考える必要がある。

###エゴレスプログラミング
　プログラミングにおいては「エゴ」を捨てることが必要である。気をつけるべき点が「エゴレスプログラミングの十戒」という形で10個挙げられている。

 - 自分自身も間違いを犯すことを理解し、受け入れる
 - 書いたコードは、自分自身ではない
 - どれほど極めたと思っても、上には上がいる
 - 相談なしに、コードを書き直さない
 - 自分よりスキルが劣る人にも、尊敬と敬意と忍耐を持って接する
 - 世界で唯一変わらないのは、変わることである
 - 本当の権威は、地位ではなく、知識から生じる
 - 信じるもののために戦い、負けは潔く受け入れる
 - 部屋に籠りきりにならない
 - 「人に優しく、コードに厳しく」し、人ではなくコードを批評する

　上記を守りつつも、自分の仕事と自我を完全に切り離す事は難しいため、エゴのバランスを取ることが必要になってくる。

###１歩ずつ少しずつ
　コードを書く上で、一度に複数の関数や処理を記述せずに、１つずつ書いてコンパイルしていくほうがよい。何か不具合が起きた際、一つ一つ行っていれば前の状態に戻すことは容易である。また、テストもコードを一気に書いてからテストを実装するのではなく、どちらも少しずつ書いていくことが必要である。
　思考に関しても同じことが言える。頭のいい人というのは手順を飛ばして考えているのではなく、やらなければならない論理ステップを構築し、各ステップをそれぞれ早く正確に行う。手順をしっかり踏んでコツコツ考えることが必要である。また、論理的に考えるためには、瞬時に答えを得ようとしたり、すぐに結論に飛びついたりせず、考えたことをアウトプットしつつ、また直感で思ったことを試しつつ、考えていく姿勢が必要となる。

###TMTOWTDI
　ツール(APIなど)を設計する場合は、多くの選択肢を用意するべきである。「簡単なことは簡単に、難しいことは可能に」することを目指して取り組む。ツール自体は複雑になるが、ユーザーは多様な場面に置いてシンプルなコードを書けるようになる。様々な対象、複雑な対象をシンプルに記述するためには、ツール側である程度の複雑性・多様性を持っていたほうがよい。

　
##参考文献
『プリンシプル オブ プログラミング　３年目までに身につけたい一生役立つ１０１の原理原則』上田勲 著　株式会社秀和システム　2016年3月29日　p.214-232
レコードの新規追加時に登録データにMAX+1のIDを付与する方法

Railsでレコードの新規追加をする際に、自動的に独自IDの付与をしたいケースがあると思います。
例えば、my_idフィールドの最大値+1を付与するなど。

部屋(room)の名前を登録したときに、独自id = my_id を付与するサンプルを書いてみました。

## 成功例

```ruby
  def assign
    my_id = -1
    room = Room.find_by(room: params[:room])
    if !room.nil?
      my_id = room.my_id
    else
      Room.connection.execute(
        "INSERT INTO rooms (my_id, room, created_at, updated_at) SELECT COALESCE(max(my_id), 0)+1, '#{params[:room]}', '#{Time.now}', '#{Time.now}' from rooms"
      )
      my_id = Room.find_by(roomr: params[:room]).my_id
    end
    redirect_to("/rooms/#{my_id}")
  end
```

ポイントは

* my_idの最大値検索をINSERT文のサブクエリで行い、一回のクエリ発行になるようにすること (排他)
* created_at, update_atに現在時刻を設定すること
* COALESCEでnull対策をすること

## 失敗例

```ruby
  def assign
    my_id = -1
    room = Room.find_by(room: params[:room])
    if !room.nil?
      my_id = room.my_id
    else
      new_room = Room.create(
        my_id: Room.max(my_id) + 1,
        room: params[:room]
      )
      my_id = new_room.my_id
    end
    redirect_to("/rooms/#{my_id}")
  end
```

失敗例のほうでは、begin transaction ～ commit transaction の間に

1. SELECT文 --> Room.max(my_id)の検索のため
1. INSERT文 --> Room.createのため

が発行されるのですが、
複数のクライアントから同時にassignを呼ばれた際に排他が十分でなく
my_idが重複してしまいます

## 本当は

本当は生SQLは発行せずにActiveRecordで記述したいのですが、
いい方法ないですかね？

## 参考URL

[INSERT時にカラムの最大値+1を持ってくる](https://pumpkin.hatenablog.jp/entry/20080121/1200934115)
[INSERT文と同時にMAX+1を行いたいです。](https://teratail.com/questions/137823)
[INSERT時にデータ登録とmaxの発番がしたい](https://oshiete.goo.ne.jp/qa/8593237.html)
[ActiveRecord の find_or_create_by を確実に実行するには](https://qiita.com/kyrieleison/items/59d293594fbe3a139129)
bowling の physical simulation で Springhead を使ってみた C++ (4)

レーンコンディションを変更出来るようにした。
============================================

当初はレーンの板パーツ毎に 600 x 39 個程度の(レーン長さ方向は 0.1 feet 刻み。レーン幅方向は板パーツの枚数。) PHSolid を造ってオイルのパラメータを μ0 と μ で設定しようとしたが、パーツが多すぎて overflow するらしいのと、パーツ毎の位置を float で指定しているためかどうしても隙間が出来る様で現実的ではないと判明。
また simulation するにしても ball の軌道以外の場所は殆ど計算に無関係なのでパーツ全てを PHSolid にする意味が無さそうということで、レーンは一枚で simulation の Step() が呼ばれる直前にレーン全体の μ0 と μ を毎回変更するようにしてみた。 μ0 と μ は simulation 中のボールの位置に合わせて map から取得すれば良い。

所謂フックボールのような軌道で投げられるようになった。
======================================================

投球開始位置を「レーン手前 0 feet 中央 20 枚目」にしてそこから外に出す投球設定。
SetVelocity で右前方への初速。
SetAngularVelocity で適当な回転方向(多分今は AT=0 AR=90 に近いはず)
各種物理 parameter の選択は要注意。

![test_Springhead_bowling_1scene_20200630.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/537788/75036dbc-45e8-1b9c-1532-920688a95cb0.gif)

ロールアウトしている様にも観える。

補足
====

[前回](https://qiita.com/nomissbowling/items/662c08328d779e2432f2) ボールの軸が PHSolid と GRMesh で π/2 ずれていたようなので修正。(図柄を変更して texture を貼ると判明。特に回転中の表面の動きと転がる方向が一致していなくて不自然に観えた。)

[ソース](https://github.com/nomissbowling/Springhead_test)

まだまだ続く
オンラインセミナー「クラウドの基礎とAzureのすゝめ」を受講しての学習事項

## はじめに
本記事は6/11(木)にオンライン開催されたAzure初心者向けセミナーに参加した際の学習事項を整理してアウトプットすることを目的としています。 

## セミナー概要
Azureが提供するクラウドサービスを利用し始めてみたいと考えている人を対象とし、クラウドの基礎知識、Azureクラウドサービスでできること、Azureクラウドサービスの学習方法をテーマに3つのセッションがありました。
詳細は[こちら](https://a-c-e.connpass.com/event/177667/)を参照ください。
セミナーの資料は[こちら](https://a-c-e.connpass.com/event/177667/presentation/)を参照ください。

## セッションごとの学習事項
セッションごとに学習事項をまとめます。
### セッション名「クラウドの汎用的な基礎知識に自信はありますか？」
本セッションは、Azure、AWSなどの様々な種類があるクラウドサービスに共通するクラウドの汎用的な基礎知識について説明してくださっていました。

#### 学習事項

- アウトプットが大事
講演内容とは直接関係ありませんが、得た知識をアウトプットすることはとても重要とおっしゃっていました。私はこの記事でアウトプットしていますが、セミナーではTwitterなどを使ってのアウトプットが推奨されることも多いため、参加した際には積極的にアウトプットしたいですね。

- クラウドの定義
一言で表すと「抽象化されたITリソースやデータの集合」だそうです。具象化されていないので、リソース管理などの面倒がないことが特徴です。

- クラウドの特徴
大きく分けてクラウドには4つの特徴があるようですが、その中でも自分は以下の2つが大きな特徴と感じました。

  - 使いたいときに使いたいだけ使え、調達作業が必要ない
  - リソースを共用する

- サービスモデル
クラウドサービスが何を提供するかで分類したものです。大きくは、SaaS、PaaS、IaaSに分類されます。SaaSはソフトウェア、IaaSはインフラ、PaaSはプラットフォームを提供します。
講演者が○○aaSには注意が必要とおっしゃっていたので、そこには注意したいです。つまり、同じ用語(例えばCaaS)が複数の意味を持つことがあるので、他人と話す際には○○aaSの意味をしっかりと共有することが大切だそうです。

- 実装モデル
詳細は[こちら](https://home.jeita.or.jp/cgi-bin/page/detail.cgi?n=445&ca=1)を参照ください。最近よく耳にするマルチクラウドは、パブリッククラウドを複数利用して構成されているクラウドサービスのことをいうそうです。

- 効果的なクラウドの利用法
何にでもクラウドを使えばいいわけではなく、適材適所での利用が重要と講演者はおっしゃっていました。

### セッション名「いま改めて学ぶ Microsoft Azure 基礎知識」
セッション名の通り、Microsoft Azureの基礎知識と提供されるクラウドサービスの一部を紹介いただきました。

#### 学習事項

- クラウド利用が急増する背景
従来のIT業界のマーケティングでは、人のやっていることをツールで支援し効率を上げること(効率化)に重きを置かれていましたが、最近は効率化以上に付加価値が求められるようになっています。付加価値の有無を検証するためにはいろんな施策を試す必要があり、その試す活動を手軽に行うためにクラウドが有効活用されているとのことです。

- 目を引かれたAzureクラウドサービス
Windows Virtual Desktopという仮想デスクトップ環境を提供するクラウドサービスが特徴的であると思いました。具体的にはマルチセッションである点が特徴的であると思います。マルチセッションとは一つの仮想デスクトップ環境に同時に複数ユーザーがログインし作業できる仕組みのことをいいます。詳細は[こちら](https://docs.microsoft.com/ja-jp/azure/virtual-desktop/windows-10-multisession-faq)を参照ください。

### セッション名「無料学習 & Community のすゝめ」
Azureクラウドサービスについて学習するためのノウハウをご紹介いただきました。

#### 学習事項

- Microsoft Learn
Azureクラウドサービスについて学習するならMicrosoft Learnが最も効率が良いそうです。理由は、通常有料のサービスをSandbox環境上で利用&学習可能であるためです。学習コンテンツもかなり豊富であるため、Microsoft Learnを使うだけでどんなサービスも一通りは学習できるとのことでした。
詳細は[こちら](https://docs.microsoft.com/ja-jp/learn/)を参照ください。

- Cloud Developer Channel
国内クラウド技術者向けのYoutube Channelです。定期的にクラウドについての有識者のセミナーをライブ配信したりしているそうです。チャンネルは[こちら](https://www.youtube.com/channel/UCMmRHq3E_9Hc9noZeo3zDCw)を参照ください。

- コミュニティに参加する重要性
Azureに限らず、学習にはコミュニティへの参加が重要とおっしゃっていました。コミュニティに参加することで、Web上のコンテンツからは得られないTipsや世間から見た自身のレベルを把握することができます。加えて、そうしたコミュニティでのアウトプット(登壇など)を繰り返し、コミュニティ内や世間からの認知度を上げることで、自然と情報が自分に集まるようになってくるそうです。

## 最後に
本セミナーへの参加でクラウドとAzureについての基礎知識が習得できました。この知見を利用して、何かWebサービスを作ろうかなと思います。
PHP初心者がPHP7技術者認定初級試験を受けてみた。

2019年5月27日に開始された試験ということもあって、記事も少なかったので
自分の備忘録と今後取得される方へ参考になればと思い書かせていただきます！


#取得目的
業務では約1年ほどRubyに触れていましたが
就業先でPHPを使用することになるので日々の学習の継続とスキルアップのために
受けさせていただきました...!

#初級試験について
- 試験会場： 全国のオデッセイコミュニケーションズCBTテストセンター
- 試験日：試験会場にてほぼ一年中実施しています。
- 設問数：40問
- 試験時間：1時間
- 合格ライン：7割正解
- 出題形式：選択式（複数または単一選択）

公式ページの合格体験を見てる限りですと
初級試験に関しては独学で取得されている方が多い印象でした。

#勉強方法と期間
##[**初めてのPHP(PHP7版)（公式主教材）**](https://www.amazon.co.jp/%E5%88%9D%E3%82%81%E3%81%A6%E3%81%AEPHP-David-Sklar/dp/4873117933)
公式教材として挙がっている入門書ですが
他の言語の経験のない方だと少し堅苦しくて読みにくいかもしれません。
サンプルコードも豊富に掲載されており解説も丁寧なので
一通り読み終われば基礎的なPHPの知識が定着できる良書だと思います
ページ数的には400ページほど。
学習期間は3日ほど（15時間くらい)

##[**徹底攻略PHP7技術者認定［初級］試験問題集**](https://www.amazon.co.jp/dp/B07V2MK63C/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)

合格者の体験談を見ても大半の方が使用している問題集。
全14章あり、章ごとに問題が各８～１２問ほどありまして優しい構成になっています。
1周目は1日3～4章進めていき、4日で1周（10時間くらい）
2周目から1日7章ペースでさらっと読みこんで、試験当日までに4周ほどしてました。
模擬問題が最後にありますが、そこで9割以上とれるようになれば問題ないかなと感じます。

#受験を終えて
結果は1000点満点中の875点でした。(合格ラインは700点)
フレームワークの仕様に関する出題や、実際の実務における開発手法の問題（TDD テスト駆動開発)等
初心者の方からするととっつきにくい問題も所々見られました。
トータルの勉強時間としては大体40時間ほど。
これからPHPを始める方には程よい難易度でよいかもしれません。
Azure portalでNW構成図

# Azureビギナーのための便利なView - Diagram
1. 背景
2. Diagram
3. まとめ


## 背景
Azureを操作する中で今どんな構成でVMが立っているか視覚的に理解できる機能がないか探したが、意外と見つけるまでに時間がかかったので備忘のためにもアクセスの仕方をまとめておく

## Diagram
Virtual network（仮想ネットワーク）からMonitoringの下にある'Diagram'で以下のようなダイアグラムが出てくる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/627617/3de9f0fd-b2fd-67d2-3120-2a738c511ac6.png)

## まとめ
- Azure portalにあるNWダイアグラムを視覚的に確認できる機能についてアクセスの仕方をまとめた
- この機能を使うと、システム構成の概要を理解でき、消し忘れたEndpointやInterfaceも容易に見つけることができる
- 'Download topology'で.svg形式で出力できるので、Confluenceやパワポなど使い回しも簡単。（最新版は常にportalを参照する必要あり）
Alibaba Cloud OSS にカスタムドメインを設定してCloudflareと連携させてみた


#はじめに

本記事は[個人ブログ](https://blog.matsuda-yoshihiro.com/2020/06/alibaba-cloud-oss-cloudflare.html)からの複製記事です。

---

Alibaba Cloud Object Storage Service（oss） は基本的にはサービス側が提供するドメイン（aliyuncs.com）で静的コンテンツなどを展開可能ですが、やはり独自のドメインで展開したいと言う場合もあると思います。

Alibaba Cloud OSS も独自のドメインを利用することが可能なので、今回はカスタムドメインを割り当てる手順をご紹介します。

また、今回は Cloudflare で管理しているドメインがあったので Cloudflare と OSS を連携してアクセスが出来ることも一緒に確認してみようと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11547/0743205a-421d-2855-e04b-a8da0adcde62.png)


## OSS の CNAME 割り当て
Alibaba Cloud DNS を使用している場合、CNAMEの割り当ては自動で行われるのですが、外部DNSを使用する場合は手動での割り当てが必要になります。

まずは、Alibaba cloud の管理コンソールから対象のバケットを選択し、パブリックエンドポイント（Access Over Internet）を確認します。
基本的には`バケット名.リージョンID.aliyuncs.com`となります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11547/84a8b3f4-53bf-8737-4fba-16d79baa4419.png)

確認したパブリックエンドポイントを Cloudflare の DNS に登録します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11547/fd763ae6-2e6e-ce0e-c02a-4a28a306d2ca.png)

今回は`oss.xxx.com`と言うサブドメインに対して Alibaba Cloud OSS を割り当てます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11547/60ccebf3-496b-728f-863c-05edbfa303ed.png)

正常にレコードが追加されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11547/66907f7b-d2b0-eab4-642a-c6798a502002.png)


## カスタムドメインの設定

Alibaba cloud の管理コンソールから対象のバケットを選択し 「Transmission > Domain Names」 から `Bind Custom Domain Name`を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11547/8c077d64-90b9-6121-26de-3bb26e2e4db6.png)


`Custom Domain Name` に CNAME を割り当てたドメイン名を入力します。
※Alibaba Cloud DNS で管理している場合は、事前のCNAME割り当ては不要です。

今回は`oss.xxx.com`というサブドメインを使用してみます。
「Submit」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11547/6ddaba9f-bd22-43b5-aab0-c02cfc8b0a01.png)

設定が完了すると以下のような画面が表示されます。
Alibaba Cloud CDN を使用する設定や、設定したカスタムドメインで HTTPS を受けるための証明書のアップロードなどが必要ですが、今回は前段に Cloudflare が居るので不要です。
※Alibaba Cloud 内で完結する場合は設定が必要になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11547/74648761-8140-ea53-a028-03ce0984707e.png)

## Cloudflare 経由での Alibaba Cloud OSS へのアクセス

それでは設定も出来たので Cloudflare 経由で OSS のオブジェクトにアクセスしてみたいと思います。
以前作った静的ページがあるのでそれを流用してみます。

https://youtu.be/9baf0UmK_0k

`./webinar/index.html`にあるファイルにアクセスしてみたいと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11547/5d51750f-d8c6-6466-2767-900ccecb8ac8.png)

カスタムドメインに割り当てたドメインでアクセスすると問題なくコンテンツが表示されました！
SSL証明書の情報を確認すると`Cloudflare`の証明書が出てくることが確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11547/ac0aa0d7-1542-a7c0-00c8-2980a8ef503a.png)


設定も特に難しいところが無くドメインさえあれば適用できましたね！
今回は Cloudflare を使いましたので、CDN と SSL などもついてるのですが、他のDNSの場合はその辺が必要かな・・・
ソフトウェアテストとは

## ソフトウェアテストとは
ソフトウェアテストとは、欠陥を取り除いて、ユーザーの要求を満たす、品質のよいソフトウェアを作ること。

## 欠陥とは
誤動作の原因がソフトウェアにあることが特定されたもの。
原因が特定される前の欠陥と思われる現象のことを「不具合」と呼び、区別している。

## ソフトウェアの品質とは
ユーザーの要求を満たし、ユーザーに価値を提供するものが品質のよいソフトウェア。
品質は以下の6つの特性に分類される。

■品質の特性（ISO/IEC 912）
・機能性
　必要な機能が実装されていること
・信頼性
　機能が正しく動作し続けられること
・使用性
　利用者に使いやすく魅力的であること
・効率性
　資源の量に対して適切な性能であること
・保守性
　維持、変更がしやすいこと
・移植性
　別環境に移しやすいこと

## 参考
■【この1冊でよくわかる】ソフトウェアテストの教科書―品質を決定づけるテスト工程の基本と実践
https://www.amazon.co.jp/dp/B00U17809A
Chromeで表示したCSSが反映されないときの対処法 

Chrome上でWebデザインを調整している時、CSSを変更しても画面に反映されないときの対処法です。

## 反映させる方法

CSSのキャッシュが悪さをしている場合があります。なのでそのキャッシュを削除すればよいです。 以下の手順です。

- 画面上で右クリックを**検証**を押し、デベロッパーツールを開きます。
- 右上のリロードボタンを右クリックして、**キャッシュの消去とハードの読み込み**を押します。 

これでキャッシュが削除され、CSSが新たに適応されます。

![cache.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317705/dc342ff0-a651-443d-ec1c-7f4a56e8ff2a.png)
[事例報告]iOSアプリのデバッグ時に実機インストールが止まる

iOSアプリの実機デバッグをしていたときに実機へのインストールが途中で止まってしまい、XCode11がそのまま固まる現象にあいました。Deviceをみるとbusyになっています。XCodeを再起動させると実機との接続が切れた状態になっています。実機の再起動やつなぎ直し、XCodeの再起動をしましたがだめでした。

最終的にUSBハブを経由しないで直接Macに接続することで解決しました。
ご参考になれば幸いです。
読書要点「プリンシプルオブプログラミング」第5章

# 習慣

プログラマの習慣であり、行動指針である。
良いコードを書くプログラマが日頃意識していることを取り入れていきたい。

### プログラマの3大美徳

プログラマの3大美徳とは、「怠慢」「短気」「傲慢」のことである。
高度な知的作業を伴うプログラマが、効率よく仕事をこなすための美徳である。

- 怠慢

労力を減らすことに労力を割くことを厭わない姿勢である。
実際に作業をする中で、繰り返しが多かったりする部分などに自動化を行っていくと良い。
自動化の恩恵が大きそうな箇所を見極めるのがポイントである。
ドキュメントなども仕組みを作っておくことで再利用性が高まる。

- 短気

コンピュータが正常に、効率的に動作していないことに憤る姿勢である。
発生しうる問題に早い段階で手をうっておくことで、快適な時間を過ごすことができる。

- 傲慢

傲慢なほどのプロ意識で、人に見せても恥ずかしくないコードを書き続ける姿勢である。
きれいなコードは保守が容易である。
日頃からきれいなコードを書く意識は生産性の向上にもつながる。

### ボーイスカウトの規則

ボーイスカウトは訪れた場所をもとの状態よりきれいにしてから帰る。
プログラマも、自分が書いた部分だけでなく読んだコードもきれいにしてからコミットを行うべきである。

きれいなコードは保守性が高く望ましいものである。
改善の余地がある点を見つけた段階で、それを見つけた人が改善するのが最も手っ取り早い。
技術的負債の早期返済という側面もある。
チーム全体できれいなコードを書く習慣を保ちたい。

### パフォーマンスチューニングの箴言

パフォーマンスチューニングにより、コードは早いものになる。
しかし、最適化が及ぼす悪影響は開発の上で見過ごせない。
そのため、最適化には2つのルールがある。

- 行ってはならない。
- まだ行ってはならない。

早いコードを書くことの優先度は、良いコードを書く優先度を上回ることはない。
また、テストや他の箇所の実装、リリースなどやるべきことが山積している状況で最適化が優先されるケースはあまりないことも抑えておきたい。
過剰な最適化がもたらす悪影響として、可読性の低下、品質の低下、複雑性の増大、保守の阻害、環境間の競合、作業量の増大といったものがある。

良いコードと良いパフォーマンスは決して矛盾した概念ではない。
良いコードであれば最適化もそれほど大変にはならないことが多い。
速度を求めたあまり他をおろそかにすることがないようにしたい。

### エゴレスプログラミング

エゴ、すなわちうぬぼれやプライドを捨ててプログラミングに取り組む。
プログラミングの主眼は自己顕示ではなく、よいものを作ることに置かれるべきである。
そのため協力や指摘を積極的に求め、受け入れることが重要である。
そして、それを実現するための環境を構築する良い環境が重要である。

### 1歩ずつ少しずつ

プログラミングでは、一度に複数の問題を相手取るようなことはせず、1つ1つ問題を着実にクリアしていくことを意識する。
複数の問題を相手取ると、問題が混線して解決までに余計な時間がかかることが多い。
できるだけ1行1行書いては確認していったほうが、結果として品質も時間的な効率も良くなることが多い。
問題に取り組むときもコードを書くときも、小分けにしたものをクリアしていきたい。

### TMTOWTDI

他の人が利用するツールは、目的を達成するための手段を複数用意しておく。
ツール側は複雑になるが、利用する側は状況に応じて手段を選択することで、シンプルなコードを書くことができる。
ツールの実装では、簡単なことは簡単に、難しいことも実現できるように意識する。
ツール利用時の選択肢の多さは一見複雑性を増すだけに思われるが、ツールは実装にかかる時間より使われる時間のほうが長く、ツールの充実にはレバレッジがかかる。
ツールを作成する側は複雑さを受け入れ、ツール利用者にシンプルを提供できるようにしたい。
GoogleのCustom Search APIでORとAND検索する方法


# GoogleのCustom Search APIをWordPressで使う方法を覚えた
[WordPressにショートコードを使ってPHPを埋め込む方法 - Qiita](https://qiita.com/ponsuke0531/items/a4328cdd7ddd98579146)
を覚えたので
[WordPressでGoogleのCustom Search APIを使ってみる - ponsuke_tarou’s blog](https://ponsuke-tarou.hatenablog.com/entry/2020/06/29/184108)
をやってみたところで思た

## ORとAND検索したい
いくつもの検索ワードを検索したいけどAPIでは100検索/日という制限があるので何回も何回も検索したくない

> Custom Search JSON API provides 100 search queries per day for free. If you need more, you may sign up for billing in the API Console.
> [Custom Search JSON API &nbsp;|&nbsp; Google Developers](https://developers.google.com/custom-search/v1/overview)

そこで、普通のGoogle検索でも使える「OR」「AND」をAPIでやってみた。

> 【組み合わせ(優先)検索】(A AND B) OR C
> 「()」を使うと、「()」内が優先された結果を表示します。
> 上記検索(AND OR NOT)を、組み合わせて使うときに優先順位を付けられます。
> ex.) (google AND yahoo) OR MSN
> [Google検索を使いこなすためのテクニックまとめ | SONICMOOV LAB](https://lab.sonicmoov.com/know-how/google-search-technique/)

# Custom Search APIでORとAND検索する方法

- 環境
    - Windows 10 Pro 64bit バージョン1909
    - Local by Flywheel 5.6.1
        - PHP 7.4.1 / MySQL 8.0.16 / Apach / WordPress 5.4.2
        - テーマ : [Lightning](https://lightning.nagoya/ja/)

配列に検索ワードを入れてそれを繋げるだけ。
検索結果は、引用符をつけて表示してみた。

```php:google-search.php
<?php
// 検索ワード群1
$word_group1 = array('ponsuke','tarou','0531','ぽんすけ','たろう');
// 検索ワード群2
$word_group2 = array('Qiita','hatena');
// 検索ワード群1~2はOR条件で検索したい
$word_or1 = implode(' OR ', $word_group1); // >>> 'ponsuke OR tarou OR 0531 OR ぽんすけ OR たろう'
$word_or2 = implode(' OR ', $word_group2); // >>> 'Qiita OR hatena'
// 検索ワード群1と2のどちらの検索文言も含んで検索したい : (検索ワード群1) AND (検索ワード群2)
$search_words = '(' . $word_or1 . ') AND (' . $word_or2 . ')'; // >>> '(ponsuke OR tarou OR 0531 OR ぽんすけ OR たろう) AND (Qiita OR hatena)'
$param_ary = array(
    // 検索ワード
    'q' => $search_words,
    'key' => {APIキー},
    'cx' => {検索エンジンID},
    // JSON形式で取得する
    'alt' => 'json',
    // 取得開始順位(検索結果1~10位を取得するを取得する)
    'start' => 1
);
$param = http_build_query($param_ary);
$reqest_url = 'https://www.googleapis.com/customsearch/v1?' . $param;
$result_json = file_get_contents($reqest_url, true);
$result = json_decode($result_json, true);
$items = $result['items'];
?>

<h1>今日のぽんすけ検索</h1>
<?php if (count($items) === 0) : ?>
<p>ぽんすけ情報はありません。</p>
<?php else : ?>

<?php foreach ($items as $key => $item) : ?>
<blockquote class="wp-block-quote">
<a href="<?php echo $item['link']; ?>"><?php echo $item['title']; ?></a>
<p><?php echo $item['snippet']; ?></p>
</blockquote>
<br>
<?php endforeach; ?>

<?php endif; ?>
```

```php:functions.php
<?php
// ...省略...
function google_search() {
    // 出力バッファリングを有効化する
    ob_start();
    // 外部ファイルを読み込む
    get_template_part('google-search');
    // 出力バッファを削除する
    return ob_get_clean();
}
add_shortcode('google-search', 'google_search');
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159761/04497fac-ae6c-3988-7e76-5e9dfaa11242.png)
GithubActionsでのDocker BuildでCacheを効かせる方法メモ

はじめに
======
GitHub ActionsでDockerのコンテナをBuildするとデフォルトだとLayerのCache?がされないため、毎回Dockerfileの先頭から実行することになります（何も工夫をしないと）。
「LocalでBuildするときは(Cacheが効いて)速いんだけど、GitHub Actionsだと遅い」というのは、Buildに時間がかかる場合結構しんどいです(Twitterなどが捗ってしまう)。

色々方法があるようですが、Dockerのマルチステージビルドを使っていないなら、割と簡単にCacheを効かせられるようなので、そのメモです（主に自分用）。

Docker BuildでCacheを効かせる方法
==========================

ポイントは [docker buildコマンド](https://docs.docker.com/engine/reference/commandline/build/)の `--cache-from` と `--build-arg BUILDKIT_INLINE_CACHE=1` になります。また、このOptionを指定するには、BuildKitを有効にしないといけないので、環境変数 `DOCKER_BUILDKIT=1` を指定しておくことが必要になります(buildx でも良いようですが)。

上記リンクのドキュメントにも書いてありますが、それぞれ次のような意味になります。

- `--cache-from`: CacheSourceを指定するコマンドで、外部リポジトリを指定すると適宜アクセスしてくれるようです。
- `--build-arg BUILDKIT_INLINE_CACHE=1`: Build時にMeta情報を埋め込み、`--cache-from` で使えるようにします。これをリポジトリにPushしておけば、前回Build時のLayerを再利用できるようになります。
- 環境変数 `DOCKER_BUILDKIT=1`: こう設定しておくとBuildKitが有効になるようです。GitHub Actionsでも使えるようです。

サンプル
----------

例えば、AWSのECRにPushする場合は、以下のように書くことができます。


```yaml:aws.yml
on:
  push:
    tags: release-*  # トリガーは `release-****` というTagがPushされたとき

name: Push to Amazon ECR

jobs:
  push:
    name: BuildAndPush
    runs-on: ubuntu-latest

    steps:
    - name: Checkout
      uses: actions/checkout@v2

    - name: Configure AWS credentials
      uses: aws-actions/configure-aws-credentials@v1
      with:
        aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
        aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
        aws-region: ap-northeast-1

    - name: Login to Amazon ECR
      id: login-ecr
      uses: aws-actions/amazon-ecr-login@v1

    - name: Build, tag, and push image to Amazon ECR
      id: build-image
      env:
        DOCKER_BUILDKIT: 1  # これ大事
        ECR_REGISTRY: 999999999999.dkr.ecr.ap-northeast-1.amazonaws.com  # TODO: 要変更
        ECR_REPOSITORY: my-awesome-container  # TODO: 要変更
        IMAGE_TAG: ${{ github.sha }}
      run: |
        # latest と github.sha でタグをふる場合
        docker build \
            --cache-from=$ECR_REGISTRY/$ECR_REPOSITORY:latest --build-arg BUILDKIT_INLINE_CACHE=1 \
            -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG -t $ECR_REGISTRY/$ECR_REPOSITORY:latest .
        docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG
        docker push $ECR_REGISTRY/$ECR_REPOSITORY:latest
        echo "::set-output name=image::$ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG"
```

さいごに
=========

`actions/cache@v2` とか使うともっと良い(速い)のかもしれないですが、使わなくてもできるんだな、と思ったのでメモしておきます。
Cisco ASAをPrometheus + Grafanaでスループットを可視化したメモ

# この記事の目的
Cisco Catalystシリーズにおいて、snmp_exporterを利用したスループット計測を行う記事はよく見かけましたが
Cisco ASAシリーズにて、スループット計測を行おうとしたとき、少しだけハマったので備忘録としてメモを残しておきます。

なお、Grafana Labsで提供されている[こちら](https://grafana.com/grafana/dashboards/1124)をだいぶ改変させてもらっています。

# 結論
Grafanaのダッシュボード生成時、Variablesで定義した変数の中に特殊文字(空白やシングルクォート)が入っていると、グラフの描画に失敗します。
正しくデータを抜き出せるように正規表現を頑張る。

# 環境および前提
* Prometheus
* Grafana
* snmp_exporter

上記のアプリケーションはそれぞれ稼働しているものとします。
Grafanaでダッシュボードを作成する前に、Prometheus(snmp_expoter)で正しく値が取得できているかどうか確認しておきましょう。

また、一部私の環境に特化している箇所があるかもしれませんが、適宜読み替えていただけると助かります。

# ダッシュボード作成

## Prometheus側の設定
ここではわかりやすいように、Prometheus側の設定(prometheus.yml)で、新しくjob_nameを定義しておきます。
job_name名は`snmp_asa`としました。

## Variables
ダッシュボードのVariablesから以下のように定義しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56386/52752fc8-d29f-df6e-f685-165800bbe0c3.png)

具体的には以下のようなパラメータです。

```bash:$Host
* General
 * Name: Host
 * Type: Query
* Query Options
 * Query: query_result(sysName{job="snmp_asa"})
 * Regex: .*sysName="(.*?)".*
```

```bash:$Device
* General
 * Name: Device
 * Type: Query
* Query Options
 * Query: query_result(sysName{job="snmp_asa",sysName="$Host"})
 * Regex: .*instance="(.*?)".*
```

```bash:$Interface
* General
 * Name: Interface
 * Type: Query
* Query Options
 * Query: query_result(ifInOctets{job="snmp_asa",instance="$Device"})
 * Regex: .*ifDescr=.*'(.*?)'.*
* Selection Option
    * Multi-value
```

`$Interface`変数でインタフェース名の一部分を抜き出してあげる必要があります。
うまくインタフェース名が抜き出せると以下のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56386/c86a4c00-acf2-1b41-2ddf-4eb4764ed801.png)
あとは、この抜き出せたインタフェース名を使い正規表現で抽出したいデータを引っ掛けていきましょう。

## ダッシュボード側
Add Panelするか、最初に紹介した[こちら](https://grafana.com/grafana/dashboards/1124)のダッシュボードをインポートして、いじっていきましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56386/12bd60c9-5c99-d1f8-ec93-e75a7c8ab525.png)

Legendはそれぞれ、InとOutを付与してみましょう。

```
### Input側
irate(ifInOctets{job='snmp_asa',instance='$Device',ifDescr=~'.*$Interface.*'}[5m]) * 8 

### Output側
irate(ifOutOctets{job='snmp_asa',instance='$Device',ifDescr=~'.*$Interface.*'}[5m]) * 8 
```

また、GeneralタブでTitleを `Adaptive Security Appliance $Interface interface` のようにしてあげれば以下の図のようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56386/64ac8c52-0c41-7b6b-181c-bf0c26bd77f0.png)

また、GeneralタブのRepeating機能で複製すれば以下のようになるかと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56386/fd1ee8d2-929d-ca47-3cc7-50bf9e50dd8a.png)
BOT UIを使ってBOTを作成する

#BOT UIとは
BOTを簡単に作れるJavaScriptフレームワーク。
2019年1月にやってみたことを書いていきます。

ドキュメント:[docs.botui.org/index.html](https://docs.botui.org/index.html)

##例
[https://examples.botui.org/](https://examples.botui.org/)

###Git
- [https://github.com/botui/botui](https://github.com/botui/botui)
- [https://github.com/botui/botui-examples](https://github.com/botui/botui-examples)

###HTML
`<div class="botui-app-container" id="botui-app">
  <bot-ui></bot-ui>
</div>`

###js
Gitから抜粋

```
var botui = new BotUI('botui-app') // id of container

botui.message.bot({ // show first message
  delay: 200,
  content: 'hello'
}).then(() => {
  return botui.message.bot({ // second one
    delay: 1000, // wait 1 sec.
    content: 'how are you?'
  })
}).then(() => {
  return botui.action.button({ // let user do something
    delay: 1000,
    action: [
      {
        text: 'Good',
        value: 'good'
      },
      {
        text: 'Really Good',
        value: 'really_good'
      }
    ]
  })
}).then(res => {
  return botui.message.bot({
    delay: 1000,
    content: `You are feeling ${res.text}!`
  })
})

```
###ひっかかったところ
- 最新のVue.jsだと動かなかった
`<script src="https://cdn.jsdelivr.net/vue/latest/vue.min.js"></script>`

- fontawesomeはv4のアイコンから選ぶ。
【JavaScript】変数を定義するとき var, let, constの違いは？

## はじめに
JavaScriptを書く際に、変数定義する際にvarやletやconstを使うかと思います。
正直これの違いってよくわからないまま書いていたりしないでしょうか？

自分もなんとなくで使い分けてたりするわけですが、最低限エラーにはならないようにしたいものです。
そこでそれぞれの違いを少し丁寧に解説してみようと思います。

## 概要
まずはそれぞれの違いについて簡単に説明します。
一言で説明するとそれぞれ以下のような特徴があります。
#### var
再定義、再代入可能
#### let
再定義不可、再代入可能
#### const
再定義、再代入不可

## もう少しわかりやすく
再定義とか再代入とか言われてもよくわからんと思うかもしれないです。

■ 定義
　定義とは変数の宣言のことで、varとかletとかconst〜と記述することです。
■ 代入
　代入とは一度宣言した変数に値を入れることです。

具体的にコードでみてみましょう。（JQueryを使って書きます）

```js:jsファイル
$(function() {
  var varSample = "var1です"
  let letSample = "let1です"
  const constSample = "const1です"

  console.log(varSample) // var1です
  console.log(letSample) // let1です
  console.log(constSample) // const1です

  var varSample = "var2です" // 再定義可能
  let letSample = "let2です" // 再定義不可（エラーになります） 
  const constSample = "const2です" // 再定義不可（エラーになります）

  varSample = "var3です" // 再代入可能
  letSample = "let3です" // 再代入可能
  constSample = "const3です" // 再代入不可（エラーになります）
})
```
同じ変数名ではletは１回だけ使用可能、constは１回だけ使用可能で中身の変更は不可ということです。

## 補足
とりあえずvarを使っておけばエラーにはならないですが、letかconstのみで使い分けることが推奨されているようです。
確かに変数は再宣言する必要がないですし、上書きされたくない変数はconstを使って定数とすれば予期せぬエラーが起こりにくそうですね。
（以前書いた記事でvarを使ったことがあったので反省しておきます。）

変数にすべきか定数にすべきかの判断は、コードを書きながら「やっぱりこっち」みたいになるかと思いますが、その辺の感覚はだんだん鍛えていくしかなさそうです。

## 最後に
変数の違いが少し理解できたかと思うので、なるべくletとconstだけで使い分けて書けるようになりたいものです。ご意見あればコメントいただけると助かります。
Ruby on Railsでfont awesomeを使う方法

# gemfileに追記する
下記をgemfileに追加する。

```gemfile
# font awesome
gem 'font-awesome-rails'
```

```terminal
bundle install
```

# application.cssへ追記する
下記をapplication.cssのコメントの中に追記する。

```application.css
*= require font-awesome
```

sassのかたは、普通にコメント外のコードを書くところに下記のように記載。

```application.scss
@import "font-awesome";
```

# viewファイルにタグを追加

```viewファイル
<i class="fa fa-アイコン名"></i>
```


##参考記事
https://pikawaka.com/rails/font_awesome_rails
大学生がVue.jsを使って3日間でポートフォリオを作成してみた

Vue.jsでポートフォリオを作ったのでまとめました。

# 作ったサイト
https://mk-portfolio-site.netlify.app/

#動機
今回サイトを作った動機は「自分のポートフォリオサイト持ってるのってなんかかっこいいよなぁ」と思ったからです。ちょうどいいアウトプットにもなりそうだったので作ることにしました。かかった期間は3日間。時間でいうと20時間くらいです。

#1日目
## サイトの構成を練る
ネット上で他の方が作ったポートフォリオを色々見まくって考えました。
内容は以下の４項目に決めました。他の学生のポートフォリオを見ていると、インターンの開発経験や研究の内容を盛り込んでいる人も結構いましたが、自分は書くことがなかったのでその項目は外しました。悲しい。。。

1. Top(トップページ)
2. About(プロフィール)
3. Skills(使ってきた技術)
4. Works(制作物)

デザインに関しても色々な方のポートフォリオを参考にしました。色やレイアウトはなるべくシンプルなものを目指しました。

## 使用技術の選定
基本的なレイアウトやデザインはHTML/CSS、動きをつけたりコンポーネントをまとめる部分でVue.jsを中心に使おうと決めました。Vue.jsを選択した理由は大きく2つ。1つ目の理由は他のライブラリやフレームワーク(ReactやAngularなど)と比べてとっつきやすいから、2つ目は人気そうだから、です(笑)。実際触ってみてかなり使いやすかったのでポートフォリオ作成したい人はVue.jsオススメです！

## 環境構築 & 大枠の実装
[Vue.js を vue-cli を使ってシンプルにはじめてみる](https://qiita.com/567000/items/dde495d6a8ad1c25fa43) という記事を見ながらVue CLIを使ってプロジェクトを作成しました。
サイトの大まかなレイアウトやデザインを実装しました。細かいアニメーションやリンクの対応はまだできていない状態でした。

#2日目

## おしゃれなライブラリを導入
[Vue.jsでポートフォリオを書く](https://qiita.com/shoma3571/items/025a4e8aedeb62b1fed4)という記事に書かれていたvue-typerとsmoothScrollという2つのライブラリを導入しました。サイトに簡単な動作をつけたい人にはオススメです。

## hover時の動作
ボタンや画像のhoverに応じた色の変化や表示非表示の切り替えなどの動作をつけていきました。この辺ができてくると動きが出てきて楽しい。

# 3日目
## レスポンシブデザイン
今だとスマホで見る人が圧倒的に多いので、レスポンシブは必須かなと思い導入しました。レイアウトとフォントサイズの調整が主だったので割と簡単でした。1つ大変だったのがハンバーガーメニューです。ヘッダーにサイドバーを表示させるためのハンバーガーメニューを実装しました。Vue.jsのトランジションを取り入れて滑らかなアニメーションが実現できたかなと思います。(よかったらスマホで見てみてください...！)

## サイト公開
デプロイは[Netlify](https://www.netlify.com/)を利用しました。GitHubと連携させて自動デプロイができるので超便利です。[vue-cliとNetlifyで始めるお手軽サイトホスティング](https://qiita.com/mnuma/items/15f2e8a5f34a392bc604)という記事を見れば簡単にホスティングできます。[Github Pages](https://pages.github.com/)でもいいと思います。

# もう少しやりたかったこと

## ディレクトリ構成 & 単一ファイルコンポーネント
実際にプロジェクトを作成していく中でディレクトリ構成に悩みました。そこで [Vue.js ディレクトリ構成 色々試してみた](https://qiita.com/tockn/items/2ce68b99e0839df52200#modules--pages%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3) という記事を参考に`Modules & Pagesパターン`を採用してプロジェクトに反映させようとしました。Modulesに再利用可能なコンポーネント、Pagesに基本的なページ構成を書いていく、という考え方です。Vue.jsには単一ファイルコンポーネントという考え方があります。これは部品の再利用性や可読性を高めるために、レイアウトを部品ごとに分けて実装しようという考え方です。ディレクトリ構成は考えたもののうまくコンポーネントをまとめられなかったので、この辺はもう少し勉強して改善したいところです。

## アニメーション
CSSアニメーションやVue.jsのトランジションを絡ませてサイトに動きをつけようとしたのですが、結構大変でした。上の方でも触れているハンバーガーメニューの実装は頑張りましたが、他のアニメーションに関しては今回は諦めました。時間ができたらまた挑戦したいです。

# まとめ
思っていたより楽に良さげなサイトを作ることができました。「お手軽にポートフォリオ作ってみたい！」という方はぜひVue.js使ってみてください。では！

# 参考記事
- [Vue.js を vue-cli を使ってシンプルにはじめてみる](https://qiita.com/567000/items/dde495d6a8ad1c25fa43)
- [Vue.jsでポートフォリオを書く] (https://qiita.com/shoma3571/items/025a4e8aedeb62b1fed4)
- [フロント未学習の大学生が1週間でVue.jsを使ったポートフォリオを作った話](https://qiita.com/p1ass/items/a01578b782f17f573510)
- [vue-cliとNetlifyで始めるお手軽サイトホスティング](https://qiita.com/mnuma/items/15f2e8a5f34a392bc604)
- [Vue.js ディレクトリ構成 色々試してみた](https://qiita.com/tockn/items/2ce68b99e0839df52200#modules--pages%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3) 

その他様々なポートフォリオサイトを拝見し、参考にさせていただきました。
ブックマークレット作成でハマったこと一覧

if文の指定方法　= ではなく、==で動く

```
動かない
let a=window.prompt('好きな野菜を選択してください\rきゅうりなら【１】 / トマトなら【２】','');
if(a = 1){a='きゅうり'}else{a='トマト'};
```
```
動く
let a=window.prompt('好きな野菜\rきゅうりなら【１】 / トマトなら【２】','');
if(a == 1){a='きゅうり'}else{a='トマト'};
```
Module 'joystickView': platform 'android-28' not found. が出てきたとき

###Module 'joystickView': platform 'android-28' not found. が出てきたとき

Android Studioをインストールして開いたら、早速変なエラーが出てきたのでメモ。

右上の検索（虫メガネマーク）にSDK Managerと入力
↓
Android SDKが開くので、一覧にあるAndroid 10.0とか色々書かれているAndroidの各バージョンの一覧で、API Level欄が28のものを選択
↓
インストール

で直った。

Android Studioをインストールしたとき、API Level 30しかインストールされていなかったのが原因だった^_^;
WP_Queryでカスタムフィールド の画像URLが取得できなくてつまづいた

Wordpress案件中、そもそもの書き方が悪かったのかWP_Queryのループ内で
`Advanced Custom Fields`で作成した画像フィールドの`画像URL`が取得できなくて苦労した。
こういうときは大体たいしたことなくて解決方法すぐ忘れるからメモしとく。

### 困ったこと

```php
<?php while ($sample_query->have_posts()) : $sample_query->the_post(); ?>
  // なにかしらやる
<?php endwhile; ?>
```
こういうよくあるループで、カスタムフィールドの値（例えば`text_1`）を取得するときは

```php
$text_1 = get_field('text_1');
```
みたいな書き方で簡単にできるんだけど、画像で

```php
$image_1 = get_field('image_1');
```
って書くと`false`たら`null`だとかで、値が取得できない...。

はー困った。


### こういう書き方でなんとかした

`get_field()`以外の書き方を模索

```php
// 画像IDが返ってくる
$image_id = $sample_query->post->image_1;

// 画像IDを元にファイルURLを取得
$image_1 = wp_get_attachment_url($image_id);
```

いやー、一件落着。


## もっとスマートな書き方あるだろ
`$sample_query->post->image_1`でIDが返ってくるの知らなかった。勉強になった。2時間くらいかかった。

**でも全体的にもっと簡潔な書き方ありそうな気がしてる。**



あとは、ACFで画像の返り値に`画像ID`を設定しておけば
`get_field('image_1')`で問題なく画像IDを拾ってこれるんだけど
今回はどうしても返り値に画像URLを設定する必要があったから...。
Ionic & golangでリアルタイム大喜利アプリを作りました 

アプリのリリースまでなんとか漕ぎ着けたので、宣伝も兼ねて使ったフレームワークについて紹介します。


### どんなアプリか

写真で一言アプリです。
特徴的なのはリアルタイムで集まった人たちが、お互いに投稿し合ったボケを評価し合う部分です。

マッチングした最大10名が、制限時間内に一つのお題写真に対してボケを投稿します。
投稿はお互いに評価することができ、一定数イイネを集めると一本獲得になります。

こちらからダウンロード可能です。
よかったら遊んでみてください。

android
https://play.google.com/store/apps/details?id=jp.co.popbits.funnyapp

ios
https://apps.apple.com/jp/app/funny-one/id1515018792


## アプリ側

### ionic

アプリのベースはIonic Frameworkで作成しました。

https://ionicframework.com/

ざっくりいうと、
webview + Angular
にネイティブっぽいリッチな見た目のコンポーネントと、共通化されたプラグインが利用できます。
プラグインの例としてはSocial Sharingやdeeplink等があります。

Angularではなく、vueやreactで記載することも可能なようです。
※reactは最近入ったらしい。
<br>
android, ios同一のコードで記載できるので工数削減になりました。
環境構築やビルドなどもかなりスムーズにできました。
（多少のつまづきはありますが、ネイティブアプリの環境構築にはつきものです）

懸念点として、webviewベースであるためパフォーマンスがあまり良くないのではないか気になりましたが、
端末の性能も上がってきているからか、思ったよりサクサク動いてくれています。


### createjs

大喜利バトルの部分はcreatejsで作成しました。
https://createjs.com/

Adobe Animate
https://www.adobe.com/jp/products/animate.html
でcreatejs用にアニメーションを書き出しています。

アプリへのつなぎ込みには色々と試行錯誤が必要でしたが、細かい話になるので割愛します。

大喜利バトルでは後述するgolangサーバとwebsocketで接続し、イベント毎にアニメーションを変化させます。

<br>
## サーバ側

### golang

リアルタイムや並列処理に強そうなので採用しました。
pythonもよく書くのですが、golangは型があるのでバグが起きづらい、
パフォーマンスが良いなどのメリットがあります。

コードは誰が書いても同じ書き方になるよう矯正され、必然的に可読性が高くなります。

一方、リアルタイム部分(websoket接続)はgoroutine と channelを駆使して作るのですが、
正直自分以外理解できないコードになってしまったと思います。

並列処理そのものが難しいのもあると思います。
通常の処理とは違いコードの上から追っていくだけでは読み解くことができず、
どこからchannnelにアクセスが有るなど把握していないといけません。

並列処理は色々な書き方ができるので正解がない感じです。


#### gin
https://github.com/gin-gonic/gin

デファクトスタンダードっぽいので採用しました。
良さげです。


#### melody
https://github.com/olahol/melody

websocketを扱う際にいい感じの機能を提供してくれます。


#### sqlx + squirrel
https://github.com/jmoiron/sqlx
クエリ結果をstructsにマッピングしてくれます。

https://github.com/Masterminds/squirrel
SQLクエリビルダーです。
where句の検索条件をqueryオブジェクトに対して注入していく、
みたいなことがやりたい場合はこれでSQLを作ります。

最初はgormを使っていたのですが、最終的に上の構成に書き換えることにしました。
gormは人気があるようなので使っていたのですが、挙動が直感的でなかったのと、
思いも寄らない部分で大量のSQLを発行されていたことがあったりで、嫌になってやめました。



### まとめ

色々紹介しましたが、ionicはかなり気軽にアプリが作成できるので本当におすすめです。
【整理】render＆redirect_toが、ごっちゃになってしまうあなたへ

#対象者
なんかredirect_toとかrenderとかそれぞれどんな違いあるんだっけ？使い方は？と、知ってるけど頭の中で整理できていない方


#前提知識
Railsのコントローラにおけるアクションでは、最終的にrenderされてビューを返す仕組みになっている。
つまり、**1アクションにつき、1render**が必ず起こる。

```
def index
end
```


これは、render 'index'が発動していることと同じことである。


##エラー例
renderが2回処理されてしまう時

```
def show
  ~~
    if ~~
      ~~
      render 'index'
    end
  render 'show'
end
```

解決策としては、returnをしてあげる

```
def show
  ~~
    if ~~
      ~~
      render 'index'
      return
    end
  render 'show'
end
```

#render
アクション内で、呼び出すビューを指定するメソッド。
つまり、**デフォルトで呼び出されるビュー以外のものを呼び出すことができる。**
呼び出すビューの形式は、RHTML形式（.html / html.erb等）

- 同じコントローラの別アクションビューを呼び出す時

```microposts_controller.rb
def index
  render 'edit'
  render :edit
end
```

* 別コントローラのアクションビューを呼び出す時


```microposts_controller.rb
def index
  render "users/show"
  render template: "users/show"
end
```

* 別ディレクトリや別アプリのアクションビューを呼び出す時

```microposts_controller.rb
def index
  render "/warehouse_app/app/views/products/show"
  render file: "/warehouse_app/app/views/products/show"
end
```


#redirect_to
指定したURLへGETリクエストを送信するメソッド。
つまり、アクション内で発動すれば、**再度RCVを呼び出すことになる。**

* 指定のページに飛ばす

```microposts_controller.rb
def index
  redirect_to root_url
end
```

* 直前のページに戻す

```microposts_controller.rb
def index
  redirect_back(fallback_location: root_path)
end
```


#参考にさせていただきました

>Railsガイドライン
https://railsguides.jp/layouts_and_rendering.html#render%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8B


>@1ulce様
https://qiita.com/1ulce/items/282cccba1e44158489c8


>@morikuma709様
https://qiita.com/morikuma709/items/e9146465df2d8a094d78
ReactNaitiveの開発方法

脳死でExpo使ってReactNative開発していたけど、なんか他にも開発方法あるって事実を知ったので個人的にメモとしてまとめとく。

# 大前提としてReact is 何？

* `React`：UIに特化したJavaScriptのフレームワーク。Web開発とかで使用されている。
* `ReactNative`:Reactを使ってクロスプラットフォーム（ios,Android）アプリ開発することができるフレームワーク  


# ReactNaitveの開発方法について

ReactNativeの開発については２種類あって、`react-native-cli`、`Expo`の２種類に別れる. 
`(*他にも開発方法あるのかな・・・・・・？)`


## `cli`
`デメリット`
* react-native-cliは、開発時にXcodeやAndroidStudioを少し触ります。（設定が色々と必要でめんどくさい）
 学習コストが少し高いです。  

`メリット`
* ネイティブの機能を利用できる

## `Expo` 
`メリット`
* Expoは、開発中にXcodeなどを開かずにアプリケーションの完成まで開発を進めることが可能
* ビルドするのが非常に簡単
* 管理画面があって実機端末であれば表示されているバーコードを読み込ませるだけ。
* シュミレーターであれば管理画面に表示されているシュミレータ起動ボタンを押すだけ。

`デメリット`
* ネイティブの機能を利用することができない。
* 使用できないライブラリなどが存在する

# 結局どっちで開発したらいいの・・・・・
* ネイティブの機能を利用しないのであればExpoを使うといい。
* ネイティブの機能を利用するのであればreact-native-cliを使うといい。


# 最後に
私自身Expoでずーっと開発していましたが、Expoで困ったといえばアプデがちょっと遅いなーとか、このライブラリ使えないのかーってなる程度で、特に開発する上でヤバイ！とかまずいですよ！？とかにはなったことないですね。  

あとは、ReactNativeを勉強したりするのであればExpo使うといいですね。  
いや〜Expoって便利〜
Vue beforeEnter でルート単位のナビゲーションガード

# はじめに
vueのナビゲーションガードの`beforeEnter`について説明や使い所を記載しています。
実際の案件で使って頭を悩ませたので誰かの役に立てば嬉しいです☺️

# beforeEnterとは
beforeEnterとはVueのナビゲーションガード(画面遷移ガード)の一つです。beforeEnter意外にも`beforeEach `,
`beforeRouteEnter`などガードのパターンはありますが`beforeEnter`は**ルート単位でガードをかけられる**という特徴を持っています。

# ルート単位でナビゲーションガードをかけられるメリット
実際にどのような記述をするか見てみましょう。

```js:src/router/index.js
const routes = [
  {
    path: '/test',
    name: Test,
    component: Test,
    beforeEnter: (to, from, next) => {
      // ここに処理を記載します
      next(); // ガードを通過しページ遷移する場合はnext()を使用します
    }
  },
  {
    path: '/error',
    name: Error,
    component: Error,
    // こちらのルートには記載しない
  }
]
```
このようにrouterに記述された各ルートに対して個別で処理を記載できます。
そのため特定のページにのみ遷移前にバリデーションをかけたい場合に活用できます。
以下のようなイメージです。

```js:src/router/index.js
const routes = [
  {
    path: '/test',
    name: Test,
    component: Test,
    beforeEnter: (to, from, next) => {
      function validation() {
        if (to.params.id === 1) return true;
        return false;
      }
      if (validation()) {
        next(); // 正常に遷移
      } else {
        next({ path: 'notfound' }); // next()はpath等指定しそちらに飛ばすことも可能
      }
    }
  }
]
```
ただロジックをrouterに書きまくることで、みづらくなる感は否めません、、
とはいえ、次ページに遷移前にはじけるため重宝しております。

# 注意点
next()を忘れるとナビゲーションガードされたままで画面遷移が起きないため、beforeEnterを使うばあい必ず`next()`を記載しましょう!
HHKBメモ


# 1.基本操作

## 1-1. BT切替

Fn（右下）＋　Control　＋　１～４

## 1-2. 全角・半角切替

左下のAltキー＋右上の～キー

#2. キー削除
##2-1. 一文字削除(前の文字)
右下のFnキー + Deleteキー


##2-2/.一単語削除
左横のControl+右下のFnキー + Deleteキー

## 2-2.一行削除
行の先頭に移動(Fn + K)し、Ctrl + Shift + Del

#移動

## 単語の先頭に移動
Ctrl + Fn + ←


# 電源がすぐに切れる
デジットの激安ジャンクLCD16文字1行

#デジットで買ったジャンクLCD（16文字ｘ1行）をArduinoで使う方法

![IMG_2567.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/664748/7b0f26ee-a01f-4f3d-d955-13555824af3d.jpeg)

POPに書いてあるピンアサインから、コントローラICはHD44780（互換）と考えられる。
よって、arduinoのライブラリでLiquidCrystalが使用可能。

面倒なので、amazonで買ったシリアルインタフェースモジュールを使ってI2C接続する。
通常のLiquidCrystalでは16文字ｘ2行が標準で、1行には対応していない。
普通に書くと8文字しか表示しない。
調べたところスケッチに工夫が必要なことが判明。

```php

#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27,16,2); 
void setup() {
   lcd.init();
  // Print a message to the LCD.
    lcd.setCursor(0,0);
    lcd.print("First8ch");
    lcd.setCursor(40,0); 
    lcd.print("Last8ch.");
  }
void loop()
  {
  }
```
![IMG_3692.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/664748/e59a9c4e-2ee5-2c7d-6509-70540332ec6e.jpeg)
（FとLの縦線が上手く表示できないのはご愛敬）
三項演算子で条件式をスッキリさせる方法

# 三項演算子とは？
指定した条件で処理を分岐させる条件式の一種です。

条件式にはif文・switch文・三項演算子などがあり、私はいままでif文ばかりを使用してきましたが三項演算子を使うとコードをすっきりとみやすくできることがわかったので今回まとめることにしました。

# 書き方

```
条件式 ? 式１ : 式2
```

条件式を評価して真なら式１、偽なら式２を返します。
if文と違い、指定した処理を実行するのではなく値を返すだけなので注意しましょう。

## if文との比較
例としてif文と三項演算子でそれぞれ同じ条件分岐を記述してみたいと思います。

```php:if.php
if ($speed >= 60){
    echo ("スピード違反です！");
} else {
    echo ("制限速度内です");
}
```

```php:ternary_operator.php
$msg = $speed >= 60 ? "スピード違反です！" : "制限速度内です";
echo $msg;
```

いかがでしょうか？if文と比べて三項演算子は行数も少なく、みやすいコードになっているかと思います。
簡単な条件であれば三項演算子を積極的に使っていきたいですね。
[mysql,docker,ESET]Lost connection to MySQL server at 'reading initial communication packet', system error: 0の解決例


#どんなエラー？
接続者がデータベースに対して権限を持っていない状態で接続を試みると出るエラーのようです

<img width="419" alt="スクリーンショット 2020-06-30 8.49.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555157/550d0cb0-16a9-dc2d-e1bb-c5ba77734818.png">


#何をしたら出た？
`docker-compose up`で予め用意したdocker-compose.ymlに沿って正しく立ち上げで、ローカルでの接続で権限をいじった記憶もないのに出現しました


#試行錯誤

[この記事](http://next49.hatenadiary.jp/entry/20120112/p1)を見て関係ありそうな部分をすべて試すも空振りしました。

#原因

会社のPCということもありセキュリティに厳しくしているようで`ESET Endpoint Security`というファイアウォールをMacのデフォルト以外に取り入れており、そのセキュリティが、データベースへの直接の接続はローカルであっても妨げているようでした。（それだけ保存されたデータは取り扱い注意であるのだとわかりますね。）

#解決方法
ESETのパーソナルファイアーウォールをオフにすることで接続が可能になります

（手順は、画面左にある`保護の状態`をクリック→画面中央にある`パーソナルファイアーウォール`をクリック→画面中央の`パーソナルファイアーウォール`のオンオフスイッチをクリックしてオフにする）

いくら取り扱い注意とはいえ、ローカルでSQL文の挙動の実験などをする必要がある場合がありますので、必要に応じて操作できる・できないの状態を変更できる方法を覚えておけるといいと思います。
レスポンシブ対応するための書き方について

#レスポンシブ対応とは
タブレット画面やスマホ画面で大きさが違うとき、デバイスによって見やすい表示に自動的に切り替わる仕組みを持つデザインをレスポンシブといいます。

#メリット
###1 見やすい
現在webサイトはスマートフォンで見られることが遥かに多くなったのではないでしょうか。
その時に文字が切れてしまったりと見づらくなってしまいます。

###2 SEOで上位表示される（googleが推奨しているため）
SEO(検索エンジン最適化)とは、検索結果にて狙ったキーワードで自社サイトを上位表示させる対策のことです。

#書き方
##①Viewポートの設定
```HTML
<!DOCTYPE html>
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
```

この一行を付け加えます。

##②メディアクエリの設定　
メディアクエリとは、指定した画面のサイズの時にのみ使われるCSSの要素などを決めるものです。

```css

@media (max-width: px / min-width: px)
{
  適応させるCSS
}
```

max-widthが最大幅、min-widthが最小幅を表します。
また、パソコンは1001px以上、タブレットは671px~1000px、スマホは670px以下が画面のpxです。
この値をブレイクポイントといいます。


##③CSSの変更（％を使う）
%（パーセント）とは、親要素のサイズが100%としたとき子要素のサイズを親要素に対して何%で設定するか？を決められる指定方法です。
レスポンシブの時の要素の値は％で示します。
レスポンシブによって画面のサイズが変わった時、pxのまま値を固定していると画面の大きさに対応しないからです。
初めから意識していないと、後から直すのに苦労します、、（個人アプリの作成で今も苦労しています、、）
go修行14日目　ユニットテストとか


## testing

```
└── mylib
    ├── human.go
    ├── math.go
    ├── math_test.go
```

### testされるファイル

```golang
package mylib

func Average(s []int) int {
	total := 0
	for _, i := range s {
		total += i
	}
	return int(total / len(s))
}

```

### testするファイル

- `3`が期待される

```golang

package mylib

import "testing"

func TestAverage(t *testing.T) {
	v := Average([]int{1, 2, 3, 4, 5})
	if v != 3 {
		t.Error("Expected 3, got", v)
	}
}
```

### run test

- vscodeから

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293481/72ca288c-0c2c-4235-8d01-83a77baebc38.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293481/207cdc4a-bfe0-1fe0-e1b8-0685fd9a867c.png)

- コマンドラインから

```
PS C:\Users\yuta\go\src\awesomeProject> go test ./...
?       awesomeProject  [no test files]
ok      awesomeProject/mylib    (cached)
?       awesomeProject/mylib/under      [no test files]
```

- 数字変えるとFAILになる

```golang

package mylib

import "testing"

func TestAverage(t *testing.T) {
	v := Average([]int{1, 2, 3, 4, 5, 6,7})
	if v != 3 {
		t.Error("Expected 3, got", v)
	}
}
```

```
--- FAIL: TestAverage (0.00s)
    C:\Users\yuta\go\src\awesomeProject\mylib\math_test.go:8: Expected 3, got 4
FAIL
FAIL	awesomeProject/mylib	0.374s
FAIL
```

- Skip処理

```golang

package mylib

import "testing"

var Debug bool = true

func TestAverage(t *testing.T) {
	// Debugがtrueならスキップ
	if Debug {
		t.Skip("Skip reason")
	}
	v := Average([]int{1, 2, 3, 4, 5, 6, 7})
	if v != 3 {
		t.Error("Expected 3, got", v)
	}
}

```

```
PS C:\Users\yuta\go\src\awesomeProject> go test ./... -v
?       awesomeProject  [no test files]
=== RUN   TestAverage
    TestAverage: math_test.go:10: Skip reason
--- SKIP: TestAverage (0.00s)
PASS
ok      awesomeProject/mylib    0.368s
?       awesomeProject/mylib/under      [no test files]
```

<!-- 
## サードパーティパッケージのインストール

https://github.com/markcheno/go-talib

### インストール

```
go get github.com/markcheno/go-talib
```
-->
マンガの埋め込みをword2vecで実装してみる

## はじめに

『「近いマンガ」がわかるマンガ新検索』がバズっていました。
https://alu.jp/MangaNearestMap/

「行列分解などの機械学習」が使われているということですが、私はword2vec（スキップグラム）で実装してみます。いわゆるitem2vecとかprod2vecですね。

とりあえず速報です。もしかしたら大幅に改稿するかもしれません。
また、問題があれば公開を停止します。

## 実装

`#私を構成する5つのマンガ`のツイートを数十万件取得してcsvに保存しておきます。詳細は省略します。

実装はjupyter notebookを使って行いました。
qiitaに貼り付けるためpythonとして出力しているので実装は一部正確でないかもしれません。また、word2vecのパラメータは適当です。

```py
import pandas as pd
from gensim.models.word2vec import Word2Vec

df = pd.read_csv("tweets.csv")
manga = pd.DataFrame(df["tweet"].apply(lambda x: x.split("\n")[1:6]).to_list(), columns=["book1", "book2", "book3", "book4", "book5"])
docs = manga[['book1', 'book2', 'book3', 'book4', 'book5']].dropna().values.tolist()

model = Word2Vec(docs,
                 size=64,
                 window=5, 
                 min_count=10,
                 sg=1,
                 hs=0,
                 negative=20,
                 ns_exponent=-0.75,
                 alpha=0.01,
                 min_alpha=0.0001,
                 seed=999,
                 max_vocab_size=None,
                 max_final_vocab=None,
                 sample=0.0001,
                 iter=50,
                 trim_rule=None,
                 sorted_vocab=1,
                 batch_words=10000,
                 workers=4)

target = next(iter(model.wv.vocab))
print(target)
vector = model.wv[target]
print(vector)

def search(target, topn=30):
  print(target)
  for res in model.wv.most_similar_cosmul(target, topn= topn):
    print(res[0], res[1])

search(target)
```

前処理後、約244000件のツイートを対象にでき、ベクトル構築対象となった本は5500件くらいになりました。

## 近傍検索の結果

### 鋼の錬金術師

```
鋼の錬金術師
NARUTO-ナルト- 0.9372220635414124
バッカーノ！ 0.9294713139533997
ONE PIECE 0.9285544753074646
BLEACH 0.9271026849746704
SHAMAN KING ~シャーマンキング~ 0.9249312877655029
銀魂 0.9245919585227966
精霊の守り人 0.9226152896881104
ツバサ 0.9216974377632141
犬夜叉 0.9214634299278259
結界師 0.9198842644691467
```

### カードキャプターさくら

```
カードキャプターさくら
神風怪盗ジャンヌ 0.9418006539344788
かんしゃく玉のゆううつ 0.9364524483680725
魔法騎士レイアース 0.9364469647407532
フルーツバスケット 0.9352824687957764
すき。だからすき 0.9325258135795593
美少女戦士セーラームーン 0.9321167469024658
ツバサ －WoRLD CHRoNiCLE－ ニライカナイ編 0.9308517575263977
ルナ・ルナティック 0.9290527701377869
満月をさがして 0.9282151460647583
新白雪姫伝説プリーティア 0.9280235767364502
```

### 名探偵コナン

```
名探偵コナン
金田一少年の事件簿 短編集 0.9112197160720825
犬夜叉 0.910838782787323
金田一少年の事件簿File 0.9089392423629761
黒子のバスケ 0.9080468416213989
金田一少年の事件簿 0.9049121737480164
金田一少年の事件簿 File 0.903840959072113
金田一少年の事件簿 20周年記念シリーズ 0.9032795429229736
光とともに... 0.9022457003593445
放課後の王子様 0.901003897190094
探偵学園Q 0.8998096585273743
```

### らんま1/2

```
らんま1/2
GS美神 極楽大作戦!! 0.91542649269104
ナースエンジェルりりかSOS 0.9054598808288574
カンナさん大成功です! 0.9018240571022034
ガウガウわー太 0.897535502910614
魔女娘ViVian 0.8969653248786926
魔法の天使クリィミーマミ 不機嫌なお姫様 0.8968551158905029
るろうに剣心-明治剣客浪漫譚- 0.8968304395675659
幽遊白書 0.8964610695838928
赤ちゃんと僕 0.8963634967803955
スレイヤーズすぺしゃる 0.8961302042007446
```

## 最後に

若干外してますね。
前処理とパラメータチューニングをもっと行うべきですが、スキップグラムではなく行列分解で行うべきかもしれません。